【问题标题】:maintain MPI version and non MPI version in a convenient way方便地维护 MPI 版本和非 MPI 版本
【发布时间】:2012-05-09 06:42:32
【问题描述】:

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

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

【问题讨论】:

标签: parallel-processing mpi


【解决方案1】:

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

【讨论】:

  • 这可能有效,因为它可以在一个节点上正常运行。但是,我没有特权在我用来开发项目的机器(也是服务器)上安装 MPI。通常,我将我的源代码上传到集群,用mpic++修改和编译它,然后通过PBS提交任务。
  • 所以您问系统管理员是否安装了虚拟 MPI,他们说“没有”?
  • 不幸的是,是的。经理说因为他们没有集群支持,所以没必要安装MPI库。我想真正的原因是他不愿意为了我的程序的兼容性而陷入困境。
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2010-11-25
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多