有谁知道是否可以用gcc
? 编译 MPI。我需要使用gcc
,没有mpicc
。
6 回答
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
自动获取选项)。
mpicc -compile_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
在Open MPI 文档中:
Open MPI 团队强烈建议您只使用 Open MPI 的“包装器”编译器来编译您的 MPI 应用程序。也就是说,不要使用(例如)gcc 来编译程序,而是使用 mpicc。
我们重复上述声明:Open MPI 团队强烈建议使用包装编译器来编译和链接 MPI 应用程序。如果您发现自己说,“但我不想使用包装编译器!”,请幽默并尝试它们。看看他们是否适合你。如果它们不适合您,请务必告知我们。许多人认为他们的“包装编译器很烂!” 对 1990 年代中期实施不佳的包装编译器的不良行为的心态。这些天情况好多了。包装编译器几乎可以处理任何情况,并且比您尝试手动对 Open MPI 特定编译器和链接器标志进行硬编码要可靠得多。话虽这么说,有一些 - 非常,很少——使用包装编译器可能会出现问题的情况——例如嵌套多个项目的多个包装编译器。因此,Open MPI 提供了一种解决方法来找出编译 MPI 应用程序所需的命令行标志。
在这里,这个答案对您有用。
对于 MPICH,根据 mpicc 手册页,mpicc -compile_info
显示用于编译程序mpicc -link_info
的标志,并显示用于链接程序的标志。
是的,您当然可以在不使用mpicc
包装器的情况下编译 MPI 程序。在大多数实现mpicc
中是一个 shell 脚本(或类似的脚本),它设置环境变量、查找和链接各种库,所有你可能会放入 Makefile 的东西。
我建议你找到一个mpicc
脚本实例并解构它。
mpicc
已经gcc
用作后端