gpt4 book ai didi

mpi - 如何使用automake编译同一程序的MPI和非MPI版本?

转载 作者:行者123 更新时间:2023-12-01 19:53:17 25 4
gpt4 key购买 nike

我有一个 C++ 代码,可以根据 MPI 支持进行编译某些预处理器标志;缺少适当的标志,来源编译为非并行版本。

我想设置 Makefile.am,以便它编译两者MPI 并行顺序版本(如果有选项)给出了./configure

这里有一个问题:MPI 有自己的 C++ 编译器包装器,并且坚持使用它而不是标准来编译和链接源C++编译器。如果我自己写Makefile,我必须做这样的事情:

myprog.seq: myprog.cxx
$(CXX) ... myprog.cxx

myprog.mpi: myprog.cxx
$(MPICXX) -DWITH_MPI ... myprog.cxx

有没有办法告诉 automake 它必须使用 $(MPICXX) 代替编译启用 MPI 的程序版本时的 $(CXX) ?

最佳答案

我也有同样的问题,并且我发现没有真正好的方法让自动工具有条件针对特定目标使用 MPI 编译器。 Autotools 擅长根据源代码编写的语言确定要使用的编译器(CCCXXFC F77 等),但它确实不擅长确定是否对特定目标使用 MPI 编译器。您可以设置 MPICC、MPICXX 等,但如果您以这种方式使用编译器,则实际上必须为目标重写所有 Makefile 规则(如上面所做的那样)。如果这样做,编写 automake 文件有什么意义?

其他人建议像外部库一样使用 MPI,这是我提倡的方法,但您不应该手动执行此操作,因为不同的 MPI 安装具有传递给编译器的不同标志集,并且它们可能取决于您正在编译的语言。

好的一点是,我所知道的所有当前发布的 MPI 编译器都支持内省(introspection)参数,例如 -show-show-compile-show -链接。您可以自动从脚本中提取参数。

因此,我处理这个问题的方法是制作一个 m4 脚本,从 MPI 编译器中提取定义、包含、库路径、库和链接器标志,然后将它们分配给变量您可以在 Makefile.am 中使用。这是脚本:

lx_find_mpi.m4

这使得 MPI 按照 automake 期望的方式工作。顺便说一句,这是 CMake 在其 FindMPI 中使用的方法。模块,我发现它在那里工作得很好。它使构建更加方便,因为您可以为您的目标执行类似的操作:

bin_PROGRAMS = mpi_exe seq_exe

# This is all you need for a sequential program
seq_exe_SOURCES = seq_exe.C

# For an MPI program you need special LDFLAGS and INCLUDES
mpi_exe_SOURCES = mpi_exe.C
mpi_exe_LDFLAGS = $(MPI_CXXLDFLAGS)

INCLUDES = $(MPI_CXXFLAGS)

其他语言也有类似的标志,因为正如我所说,特定的标志和库可能会根据您使用的语言的 MPI 编译器而有所不同。

lx_find_mpi.m4 还设置一些 shell 变量,以便您可以在 configure.ac 文件中测试是否找到 MPI。例如,如果您正在寻找 MPI C++ 支持,您可以测试 $have_CXX_mpi 以查看宏是否找到它。

我已经用 mvapich 测试了这个宏和 OpenMPI ,以及定制 MPICH2 BlueGene 上的实现机器(尽管它并没有解决您将在那里看到的所有交叉编译问题)。如果有问题请告诉我。我希望宏尽可能保持健壮。

关于mpi - 如何使用automake编译同一程序的MPI和非MPI版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com