以便捷的方式维护MPI版本和非MPI版本
问题描述:
最近,我使用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}
...
我希望它有帮助的人谁遇到同样的问题。
答
解决您的问题的一种方法是安装(如果尚未安装)可用的“虚拟MPI”库之一。只要你的代码在一个MPI过程中正确运行(我相信你已经写好了它),那么当链接到一个虚拟MPI库时,它应该正确运行。如果您不熟悉虚拟MPI库,Google。
通常预处理是用来达到这个目的的,对你来说这不是一个可行的选择吗? – haraldkl 2012-04-29 08:38:27
是否严格需要非平行版本的代码?将它编译或在没有MPI的机器上运行? – suszterpatt 2012-04-29 10:43:32
是的,我在一台没有特权安装MPI并在其他集群中运行任务的计算机上开发它。 – anecdote 2012-04-30 09:34:23