以方便的方式维护MPI版本和非MPI版本

时间:2012-04-29 01:05:23

标签: parallel-processing mpi

最近,我使用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}
...

我希望对遇到同样问题的人有所帮助。

1 个答案:

答案 0 :(得分:1)

解决问题的一种方法是安装(如果尚未安装)其中一个“虚拟MPI”库。只要你的代码在一个MPI进程上正确运行(我确定你已经编写它就可以了),那么它应该在链接到虚拟MPI库时正确运行。如果您不熟悉虚拟MPI库,Google。