30

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

4

6 回答 6

34

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

例如,在 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

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

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

据我所知-showme:compile并且-showme:link特定于 Open MPI 和其他实现仅在使用-show.

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

于 2012-07-04T12:48:29.313 回答
8

mpicc -compile_info对于 MPICH。

于 2013-06-03T03:42:19.140 回答
7

是的,您实际上可以使用 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 文档中:

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

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

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

于 2017-12-04T03:01:06.327 回答
3

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

于 2019-06-03T09:45:57.010 回答
1

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

我建议你找到一个mpicc脚本实例并解构它。

于 2012-07-03T14:55:06.650 回答
0

mpicc已经gcc用作后端

于 2012-07-03T14:14:23.537 回答