有谁知道是否可以使用gcc编译MPI?我需要使用gcc,没有mpicc

最佳答案

mpicc只是某些编译器的包装。大多数实现都有其mpicc包装器理解特殊的选项,例如-showme(Open MPI)或-show(Open MPI,MPICH和派生类),这些选项提供了包装器传递给后端编译器的完整选项列表。

例如,在Open MPI中,包装程序是C++程序,它们读取纯文本配置文件并构建命令行选项,这些选项进一步传递给编译器。 mpicc -showme显示这些选项的完整列表:

$ mpicc -showme
icc
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

(实际上,我在这里单行以提高可读性)

特殊情况下,英特尔C编译器icc被用作后端编译器,但我们也有使用GCC的变体。您还可以使用CFLAGS获得完成阶段所需的选项列表(通常称为mpicc -showme:compile):

$ mpicc -showme:compile
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib

以及需要使用LDFLAGS传递给链接器的选项列表(称为mpicc -showme:link):

$ mpicc -showme:link
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

这些可以被使用,例如在Makefile中,如下所示:

...
CFLAGS += $(shell mpicc -showme:compile)
LDFLAGS += $(shell mpicc -showme:link)
...

据我所知-showme:compile-showme:link是Open MPI特有的,其他实现仅在使用-show调用时给出完整的选项列表。

我仍然认为直接使用mpicc更好,因为如果MPI设置中的某些内容发生更改,它会立即反射(reflect)在包装中,而您必须手动更改构建脚本/ Makefile(除非您使用-showme:compile-showme:link来自动获取选项)。

关于gcc - 如何用gcc编译MPI?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11312719/

10-11 22:59