首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方便维护MPI版本和非MPI版本

方便维护MPI版本和非MPI版本
EN

Stack Overflow用户
提问于 2012-04-29 09:05:23
回答 1查看 329关注 0票数 3

最近,我使用MPI来并行化我的模拟程序以提高速度。我采用的方法是重写一个非常耗时但容易并行化的函数。

非MPI程序的简化模型如下:

代码语言:javascript
复制
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版本是,

代码语言:javascript
复制
#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接口的所有函数,如下所示:

代码语言:javascript
复制
#ifdef USE_MPI
void Some_OBJ::Parallel_Function_2(){
  // ...
}
#endif

为了自动初始化MPI,我定义了一个名为MPI_plugin的单例:

代码语言:javascript
复制
#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“:

代码语言:javascript
复制
CPP := mpic++
OTHER_FLAGS := -DUSE_MPI
.PHONY: mpi
mpi: ${MPI_TARGET}
...

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

EN

回答 1

Stack Overflow用户

发布于 2012-04-30 01:10:06

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10368891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档