最近,我使用 MPI 来并行化我的仿真程序以加快速度。我采用的方式是重写一个非常耗时但易于并行化的函数。
非MPI程序的简化模型如下,
int main( int argc, char* argv[] ){
// some declaration here
Some_OBJ.Serial_Function_1();
Some_OBJ.Serial_Function_2();
Some_OBJ.Serial_Function_3();
return 0;
}
虽然我的 MPI 版本是,
#include "mpi.h"
int main( int argc, char* argv[] ){
// some declaration here
MPI_Init( NULL, NULL );
Some_OBJ.Serial_Function_1();
Some_OBJ.Parallel_Function_2(); // I rewrite this function to replace Some_OBJ.Serial_Function_2();
Some_OBJ.Serial_Function_3();
MPI_Finalize();
return 0;
}
我将我的非 MPI 代码复制到一个新文件夹,例如 mpi_simulation,并添加一个 mpi 函数,将主文件修改为 . 它可以工作,但非常不方便。如果我更新一些函数,比如 OBJ.Serial_Function_1(),即使我只是更改一个常量,我也需要谨慎地复制代码。这些版本的程序之间仍然存在一些细微差别。我感到筋疲力尽,无法让它们保持一致。
所以我想看看有没有什么办法可以让 MPI 程序依赖于非 MPI 版本,这样我的修改就可以安全方便地应用到他们两个上。
谢谢。
更新我终于采纳了 haraldkl 的建议。方法是定义一个宏来封装所有使用MPI接口的函数,像这样:
#ifdef USE_MPI
void Some_OBJ::Parallel_Function_2(){
// ...
}
#endif
为了自动初始化 MPI,我定义了一个名为 MPI_plugin 的单例:
#ifdef USE_MPI
class MPI_plugin{
private:
static MPI_plugin auto_MPI;
MPI_plugin(){
MPI_Init( NULL, NULL );
}
public:
~MPI_plugin(){
MPI_Finalize();
}
};
MPI_plugin::MPI_plugin auto_MPI;
#endif
在 main.cpp 中包含 MPI_plugin.h 可以避免在编译 MPI 版本时在 main.cpp 中添加 MPI_Init() 和 MPI_Finalize() 。最后一步是在 makefile 中添加一个 PHONY 目标“mpi”:
CPP := mpic++
OTHER_FLAGS := -DUSE_MPI
.PHONY: mpi
mpi: ${MPI_TARGET}
...
我希望它对遇到同样问题的人有所帮助。