如何用gcc编译MPI?

use*_*391 22 gcc mpi

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

Hri*_*iev 28

mpicc只是某些编译器的包装器.大多数实现都让它们的mpicc包装器理解一个特殊的选项,如-showme(Open MPI)或-show(Open MPI,MPICH和derived),它提供了包装器传递给后端编译器的完整选项列表.

例如,在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
Run Code Online (Sandbox Code Playgroud)

(这是我在这里拆分以提高可读性的单行)

在特定情况下,英特尔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
Run Code Online (Sandbox Code Playgroud)

以及需要传递给链接器的选项列表(称为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
Run Code Online (Sandbox Code Playgroud)

这些可以用于,例如在a中Makefile,像这样:

...
CFLAGS += $(shell mpicc -showme:compile)
LDFLAGS += $(shell mpicc -showme:link)
...
Run Code Online (Sandbox Code Playgroud)

据我所知-showme:compile并且-showme:link特定于Open MPI和其他实现仅在调用时给出完整的选项列表-show.

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


Kad*_*dir 7

mpicc -compile_info 为 MPICH。


Keh*_*CAI 6

是的,您实际上可以使用 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
Run Code Online (Sandbox Code Playgroud)

Open MPI 文档中

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

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

在这里,这个答案对您有用。


non*_*one 0

mpicc已经用作gcc后端