如何用gcc编译MPI?

时间:2012-07-03 14:08:38

标签: gcc mpi

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

6 个答案:

答案 0 :(得分:24)

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设置中的某些内容发生了更改,它将立即反映在包装器中,而您必须更改构建脚本/ {{1手动(除非您使用Makefile-showme:compile自动获取选项)。

答案 1 :(得分:4)

MPICH的

mpicc -compile_info

答案 2 :(得分:2)

是的,你可以实际使用gcc。但在我的情况下(在Ubuntu上)mpicc只是gcc的包装器,这里是命令mpicc -showme的输出:

gcc -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi

Open MPI docs中:

  

Open MPI团队强烈建议您只使用Open MPI"包装"编译器来编译您的MPI应用程序。也就是说,不要使用(例如)gcc来编译你的程序,而是使用mpicc。

     

我们重复上述声明:Open MPI Team强烈建议使用包装编译器来编译和链接MPI应用程序。   如果你发现自己在说,"但我不想使用包装器编译器!",请幽默我们并尝试它们。看看它们是否适合您。如果它们不适合您,请务必告诉我们。   许多人基于他们的包装编译器很糟糕!" 1990年代中期糟糕实施的包装编译器对不良行为的心态。这些日子情况要好得多;包装器编译器几乎可以处理任何情况,并且比您尝试手动硬编码Open MPI特定的编译器和链接器标志更可靠。   话虽如此,有一些 - 非常非常少 - 使用包装器编译器可能会出现问题 - 例如嵌套多个项目的多个包装编译器。因此,Open MPI提供了一种解决方法,可以找出编译MPI应用程序所需的命令行标志。

这个答案对你有用。

答案 3 :(得分:0)

mpicc已使用gcc作为后端

答案 4 :(得分:0)

是的,你可以在没有mpicc包装器方便的情况下编译MPI程序。在大多数实现中,mpicc是一个shell脚本(或类似的),它设置环境变量,查找和链接各种库,以及您可能放入Makefile的所有类型的东西。

我建议您找到mpicc脚本的实例并对其进行解构。

答案 5 :(得分:0)

对于MPICH,根据mpicc手册页,mpicc -compile_info显示用于编译程序的标志,mpicc -link_info显示用于链接程序的标志。