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

Parallel processing 以方便的方式维护MPI版本和非MPI版本,parallel-processing,mpi,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来并行化我的模拟程序以提高速度。我采用的方法是重写一个非常耗时但易于并行化的函数

非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版本,这样我的修订版就可以安全方便地应用于这两个版本

谢谢

更新 我终于采纳了哈拉尔德的建议。 方法是定义一个宏来封装所有使用MPI接口的函数,如下所示:

#ifdef USE_MPI
void Some_OBJ::Parallel_Function_2(){
  // ...
}
#endif
为了自动初始化MPI,我定义了一个名为MPI_插件的单例:

#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中添加虚假目标“mpi”:

CPP := mpic++
OTHER_FLAGS := -DUSE_MPI
.PHONY: mpi
mpi: ${MPI_TARGET}
...

我希望它对遇到相同问题的任何人都有帮助。

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

通常使用预处理来实现这一点,这对您来说不是一个可行的选择吗?您的代码是否严格需要非并行版本?它会在没有MPI的机器上编译或运行吗?是的,我在一台没有特权安装MPI并在其他集群中运行任务的机器上开发它。@haraldkl,你的意思是
#ifdef XXX Some_OBJ::Parallel_Function_2(){//do something}
是的,另请参见示例:和中的:应该有示例。这可能有效,因为它只在一个节点上正确运行。但是,我没有特权在我用来开发项目的机器(也是服务器)上安装MPI。通常,我会将源代码上传到集群,用mpic++进行修改和编译,然后通过PBS提交任务。因此,你问系统经理是否有虚拟MPI安装,他们说“没有”?很遗憾,是的。经理说,因为他们没有支持它的集群,所以没有必要安装MPI库。我想真正的原因是他不愿意仅仅为了我的程序的兼容性而陷入麻烦。