有谁知道是否可以使用gcc
编译MPI?我需要使用gcc
,不需要mpicc
。
答案 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)
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团队强烈建议您只使用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
显示用于链接程序的标志。