2012-04-29 103 views
3

最近,我使用MPI并行化我的仿真程序以加快速度。我采用的方式是重写一个非常耗时但易于并行化的函数。以便捷的方式维护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 

包含MPI_plugin.h在编译MPI版本时,在main.cpp中可以通过在main.cpp中添加MPI_Init()和MPI_Finalize()来存活。 最后一步是在生成文件中添加假目标“MPI”:

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

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

+3

通常预处理是用来达到这个目的的,对你来说这不是一个可行的选择吗? – haraldkl 2012-04-29 08:38:27

+0

是否严格需要非平行版本的代码?将它编译或在没有MPI的机器上运行? – suszterpatt 2012-04-29 10:43:32

+0

是的,我在一台没有特权安装MPI并在其他集群中运行任务的计算机上开发它。 – anecdote 2012-04-30 09:34:23

回答

1

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

+0

这可能有效,因为它可以在一个节点上正确运行。然而,我没有特权将MPI安装在我用来开发项目的机器上(也是服务器)。通常,我将源代码上传到群集,使用mpiC++进行修改和编译,并通过PBS提交任务。 – anecdote 2012-04-30 09:32:42

+0

所以你问系统经理是否有虚拟MPI安装,他们说'不'? – 2012-04-30 09:36:03

+0

不幸的是,是的。经理说,由于他们没有集群来支持它,所以没有必要安装MPI库。我想真正的原因是他不愿意为了我的程序的兼容性而陷入困境。 – anecdote 2012-04-30 11:13:24