2013-03-28 58 views
0

我一直在使用MPI一段时间,但我没有经历过。所以 我来这里要问关于以下实现的一般结构的建议。 说,我有并行运行在MPI内的可执行文件在C++

MPI_Init(&narg,&arg); 
int me,nprocs; 
MPI_Comm_rank(MPI_COMM_WORLD,&me); 
MPI_Comm_size(MPI_COMM_WORLD,&nprocs); 

int N = 10; 

for (int i=0;i<N;i++) { 
    //(1)do some stuff in parallel... 
    //(2)gather results and write an input file for executable 

    MPI_Barrier(MPI_COMM_WORLD); 
    //(3)run executable in parallel. 
    // which is usually run from command line as: 
    // 
    // mpirun -np 6 external.exe < input.file 
    // 
    MPI_Barrier(MPI_COMM_WORLD); 

    //(4)gather output from executable, distribute info among processors and keep running 
} 
MPI_Finalize(); 

主要的C++文件,它是(3)在那里我了解如何做到这一点,并告诉它多少个处理器可以使用一个问题。我的困惑还在于某种“运行”命令可能应该从单个处理器/实例中执行。那么如何让它工作并让并行可执行文件使用提供给主程序的所有处理器?如果可能。

p/s /我在这里看到类似的问题在stackoverflow,但没有明确的答案,如果可能与否。

回答

0

您是否可以控制exe文件,也就是说,您是否可以更改其代码?如果是这样,我会建议重新开发它,这样exe就只是你需要的行为的一个包装,然后你可以将实际行为链接到你的应用程序中。

如果这不是一个选项,我建议只从你的主(等级0)进程调用可执行文件,并让其他人等待。不是超级高效,但它会做的工作:

if (me == 0) { 
    system("mpirun -np 6 external.exe < input.file") 
} 

你必须想出一个办法,以等待命令完成,但根据systemmpirun的文档应该是简单检查system(...)的返回值是否为零,然后继续(在屏障后,如您的示例所示)。

+0

问题是,外部可执行文件能够使用这6个处理器吗?他的MPI_Init和主程序中调用的MPI_Init之间会不会有崩溃?或者从单个实例执行“mpirun”是否完全安全? – Denis 2013-03-28 13:03:57

+0

@Denis:从['mpirun'手册页](http://linux.die.net/man/1/mpirun)引用:*“mpirun”是一个shell脚本,它尝试隐藏各种启动作业的差异来自用户的设备*。鉴于此,我认为这样可以。 如果你不确定,我建议你写一个小型的试用版exe,然后自己去看看。如果遇到问题,首先为主程序创建一个新的通信器,以免与外部exe中使用的通信器发生冲突(如果这会造成问题 - 我不知道“MPI_Initialize”的细节等等)。 – 2013-03-28 14:07:55

+0

感谢您的回复,我会尝试在一个小程序中检查它,并标记答案,如果它工作... – Denis 2013-03-28 14:13:35