9.2. 自定义包装编译器行为

Open MPI的包装器编译器由文本文件驱动,这些文件包含传递给底层编译器的标志等信息。这些文本文件由Open MPI自动生成,并根据配置Open MPI时选择的编译器集进行定制;不建议用户编辑这些文件。

然而,在某些情况下可能需要或希望编辑这些文件,并添加或删除Open MPI选择的标志。这些文件安装在$pkgdatadir中,默认为$prefix/share/openmpi/WRAPPER_NAME-wrapper-data.txt。还提供了几个环境变量,用于在运行时替换包装器的默认值(来自文本文件):

注意

您可能需要向右滚动查看以下表格。

包装器编译器

编译器

预处理器标志

编译器标志

链接器标志

链接器库标志

数据文件

mpicc

OMPI_CC

OMPI_CPPFLAGS

OMPI_CFLAGS

OMPI_LDFLAGS

OMPI_LIBS

mpicc-wrapper-data.txt

mpic++mpiCC

OMPI_CXX

OMPI_CPPFLAGS

OMPI_CXXFLAGS

OMPI_LDFLAGS

OMPI_LIBS

mpic++-wrapper-data.txtmpiCC-wrapper-data.txt, 分别对应

mpifort

OMPI_FC

OMPI_CPPFLAGS

OMPI_FCFLAGS

OMPI_LDFLAGS

OMPI_LIBS

mpifort-wrapper-data.txt

警告

请注意,更换底层编译器可能完全无效。

例如,C++和Fortran编译器之间以二进制不兼容而臭名昭著(有时甚至同一编译器的多个版本之间也存在此问题)。如果您使用C++编译器vX.Y.Z编译/安装Open MPI,然后通过OMPI_CXX环境变量将mpicxx包装器编译器更改为使用vA.B.C版本的C++编译器,您的应用程序代码可能无法编译和/或链接。传统上在Open MPI中使用多个不同编译器的方法是多次安装Open MPI;每次安装都应使用不同的编译器进行构建/安装。这很烦人,但超出了Open MPI能够解决的范围。

请注意,这些字段的值可以通过向Open MPI的configure脚本传递参数来直接修改。更多详情请参阅安装指南中的此章节

上表中引用的文件使用了相当简单的"key=value"数据格式。以下是终端用户可能感兴趣的若干字段:

  • project_short: 所有环境变量的前缀。详见下文。

  • compiler_env: 指定环境变量的基础名称,该变量可用于在运行时覆盖包装器底层编译器。环境变量的完整名称格式为_;请参阅上表。

  • compiler_flags_env: 指定环境变量的基础名称,该变量可用于在运行时覆盖包装器的编译器标志。环境变量的完整名称格式为_;请参阅上表。

  • compiler: 底层编译器的可执行文件名。

  • extra_includes: 相对于$installdir,这是一个目录列表,这些目录也会被包含在预处理器的标志中用于查找头文件。

  • preprocessor_flags: 传递给预处理器的标志列表。

  • compiler_flags: 传递给编译器的标志列表。

  • linker_flags: 传递给链接器的标志列表。

  • libs: 传递给链接器的库列表。

  • required_file: 如果非空,在继续之前检查该文件是否存在。如果文件不存在,包装器将中止并提示不支持该语言。

  • includedir: 包含Open MPI头文件的目录。正确的编译器"include"标志会被添加到此目录前,并加入到预处理器的标志中。

  • libdir: 包含Open MPI库文件的目录。正确的编译器"include"标志会被添加到此目录前,并加入链接器标志中。

  • module_option: 该字段仅出现在mpifort中。它是Fortran编译器用于声明模块文件所在位置所需的标志。