3

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

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

4

1 回答 1

1

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

于 2012-04-29T17:10:05.567 回答