如何用gcc编译MPI?

如何用gcc编译MPI?,gcc,mpi,Gcc,Mpi,有人知道是否可以使用gcc编译MPI吗?。我需要使用gcc,不mpiccmpicc已经使用gcc作为后端了是的,您当然可以不用mpicc包装器来编译MPI程序。在大多数实现中,mpicc是一个shell脚本(或类似脚本),用于设置环境变量、查找和链接各种库,所有这些都可以放在Makefile中 我建议您找到mpicc脚本的一个实例并对其进行解构。mpicc只是特定编译器集合的包装。大多数实现都有自己的mpicc包装器,它们理解一个特殊选项,如-showme(打开MPI)或-show(打开MPI、

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

mpicc
已经使用
gcc
作为后端了

是的,您当然可以不用
mpicc
包装器来编译MPI程序。在大多数实现中,
mpicc
是一个shell脚本(或类似脚本),用于设置环境变量、查找和链接各种库,所有这些都可以放在Makefile中


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

mpicc
只是特定编译器集合的包装。大多数实现都有自己的
mpicc
包装器,它们理解一个特殊选项,如
-showme
(打开MPI)或
-show
(打开MPI、MPICH和派生),该选项提供包装器传递给后端编译器的完整选项列表

例如,在开放MPI中,包装器是C++程序,它读取纯文本配置文件并生成进一步传递给编译器的命令行选项。代码>mpicc-showme显示此类选项的完整列表:

$mpicc-showme
国际商会
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-例外情况
-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
-低密度脂蛋白
-Wl,--导出动态
-lnsl
-卢蒂尔
(为了提高可读性,我在这里拆分了一行)

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

$mpicc-showme:compile
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-例外情况
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
以及需要通过
mpicc-showme:link
传递到链接器(称为
LDFLAGS
)的选项列表:

$mpicc-showme:link
-例外情况
-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
-低密度脂蛋白
-Wl,--导出动态
-lnsl
-卢蒂尔
例如,可以在
Makefile
中使用它们,如下所示:

。。。
CFLAGS+=$(shell mpicc-showme:compile)
LDFLAGS+=$(shell mpicc-showme:link)
...
据我所知,
-showme:compile
-showme:link
特定于打开MPI,其他实现仅在使用
-show
调用时提供完整的选项列表


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

mpicc-compile\u info
用于MPICH。

是的,您实际上可以使用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
在职期间:

OpenMPI团队强烈建议您只需使用OpenMPI的“包装器”编译器来编译MPI应用程序。也就是说,与其使用(例如)gcc来编译程序,不如使用mpicc

我们重复上面的陈述:OpenMPI团队强烈建议使用包装器编译器来编译和链接MPI应用程序。 如果您发现自己在说,“但我不想使用包装器编译器!”,请幽默地告诉我们并尝试它们。看看它们是否适合您。如果它们不适合您,请务必让我们知道。 许多人将他们的“包装器编译器糟糕透了!”心态建立在20世纪90年代中期实现糟糕的包装器编译器的不良行为上。现在情况好多了;包装器编译器几乎可以处理任何情况,而且比您试图手动硬编码打开的MPI特定编译器和链接器标志要可靠得多。 话虽如此,在某些情况下,使用包装器编译器可能会有问题,例如嵌套多个项目的多个包装器编译器。因此,OpenMPI提供了一种解决方法,可以找出编译MPI应用程序所需的命令行标志


这里这个答案对您很有用。

对于MPICH,根据mpicc手册页,
mpicc-compile\u info
显示编译程序的标志,
mpicc-link\u info
显示链接程序的标志。

这是可能的,但您为什么要这样做呢?通常情况下,包装编译器(这里是mpicc)更方便,并且将以某种方式进行优化。对于cmake,您不应该使用包装器,因为cmake知道如何在没有包装器的情况下编译MPI程序。)只需使用
find_package(需要MPI)
。它比仅仅设置链接/编译标志的包装要干净得多