0

我一直在使用 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();

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

p / s /我在stackoverflow中看到了类似的问题,但没有明确的答案是否可能。

4

1 回答 1

0

您是否可以控制 exe,即您可以更改其代码吗?如果是这样,我建议重新开发它,以便 exe 只是您需要的行为的包装,然后您可以将实际操作链接到您的应用程序中。

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

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

你必须想办法等到命令完成,但根据系统mpirun的文档,它应该像检查返回值system(...)是否为零一样简单,然后继续(在障碍之后,如在你的例子中)。

于 2013-03-28T12:40:39.863 回答