最近,我使用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}
...
我希望对遇到同样问题的人有所帮助。
答案 0 :(得分:1)
解决问题的一种方法是安装(如果尚未安装)其中一个“虚拟MPI”库。只要你的代码在一个MPI进程上正确运行(我确定你已经编写它就可以了),那么它应该在链接到虚拟MPI库时正确运行。如果您不熟悉虚拟MPI库,Google。