9.3. 从包装器编译器中提取标志

如果由于某些原因无法使用包装器编译器,有多种支持的方法可以提取所需的编译器/链接器标志。

9.3.1. 使用 --showme 选项

包装器编译器都支持一个--showme命令行选项,该选项可以显示原本会被调用的命令。

# Show the flags necessary to compile MPI C applications
shell$ mpicc --showme:compile

# Show the flags necessary to link MPI C applications
shell$ mpicc --showme:link

# Show all the flags necessary to build MPI C applications
shell$ mpicc --showme

注意

如果在包装器编译器中传递--showme 以及其他命令行参数,请确保同时传入一个文件名。否则,--showme功能将无法按预期显示输出。

警告

Makefile(或其他构建系统)中硬编码这些结果几乎从来都不是一个好主意。通常最佳做法是以动态方式运行(例如)mpicc --showme:compile来获取所需信息。例如,GNU Make允许运行命令并将其结果赋值给变量:

MPI_COMPILE_FLAGS = $(shell mpicc --showme:compile)
MPI_LINK_FLAGS = $(shell mpicc --showme:link)

my_app: my_app.c
        $(CC) $(MPI_COMPILE_FLAGS) my_app.c $(MPI_LINK_FLAGS) -o my_app

9.3.2. 使用 pkg-config

另外,Open MPI 还会在 $libdir/pkgconfig 目录下安装 pkg-config(1) 配置文件。如果配置了 pkg-config 来查找这些文件(例如,将 $libdir/pkgconfig ——通常是 $prefix/lib/pkgconfig ——添加到 PKG_CONFIG_PATH 环境变量中),那么编译/链接 Open MPI 程序可以像这样进行:

shell$ export PKG_CONFIG_PATH=/opt/openmpi/lib/pkgconfig
shell$ gcc hello_world_mpi.c -o hello_world_mpi -g \
            `pkg-config ompi-c --cflags --libs`
shell$

Open MPI 提供了多个 pkg-config 配置文件;每种不同的包装器编译器(语言)对应一个:

  • ompi: ompi-c的同义词;使用C语言MPI绑定的Open MPI应用程序

  • ompi-c: 使用C语言MPI绑定的Open MPI应用程序

  • ompi-cxx: 使用C语言MPI绑定的Open MPI应用程序

  • ompi-fort: 使用Fortran MPI绑定的Open MPI应用程序

注意

Open MPI的pkg-config文件能正常工作,但从技术规范角度来看可能并不完全正确。

具体来说:Open MPI会列出链接MPI应用程序所需的所有依赖库,即使某个依赖项拥有.pc文件并因此本应被列为Open MPI的.pc文件中的Requires和/或Requires.private

例如,Open MPI在LibsLibs.private中都列出了-lpmix。但由于PMIx提供了自己的pmix.pc文件,Open MPI更正确的做法是不要Libs/Libs.private中列出-lpmix,而应该包含:

Requires: pmix
Requires.private: pmix

最终结果可能无关紧要,但我们仍记录在案,以防某天成为问题。

9.3.3. 使用 ompi_info

该方法并不直接适用于获取编译MPI应用程序所需的所有编译器/链接器标志,因为它未包含查找Open MPI头文件和库的相关标志。但它确实展示了所有其他标志的详细分类。

shell$ ompi_info --all | grep -i wrapper
   Wrapper extra CFLAGS:
 Wrapper extra CXXFLAGS:
   Wrapper extra FFLAGS:
  Wrapper extra FCFLAGS:
  Wrapper extra LDFLAGS:
     Wrapper extra LIBS: -lutil -lnsl -ldl -Wl,--export-dynamic -lm

此安装在包装器编译器的xLIBS区域添加选项;所有其他值均为空(请记住:-I-L是隐式的)。

请注意,可以使用--parsable选项来获取机器可解析格式的输出。例如:

shell$ ompi_info --all --parsable | grep wrapper:extra
option:wrapper:extra_cflags:
option:wrapper:extra_cxxflags:
option:wrapper:extra_fflags:
option:wrapper:extra_fcflags:
option:wrapper:extra_ldflags:
option:wrapper:extra_libs:-lutil -lnsl  -ldl  -Wl,--export-dynamic -lm