1

我的问题是如何使用 MPI 创建一个动态的工人池。

有一个大的(NNN = 10^6-7 个元素)一维数组/向量。我应该对每个单元格进行一些计算。这个问题是极其尴尬的并行。

这个想法是(它工作正常):每个 MPI 进程(当并行运行时)读取公共 .dat 文件,将值放入本地(每个等级)大小为 NNN 的大向量中,并在大数组的适当部分执行计算,长度这个“部分”是NNN/nprocs,其中“nprocs”是MPI的进程数。

问题:这个数组(NNN/nprocs)的一些“部分”完成得非常快,因此一些 CPU 未被使用(它们等待其他 CPU 完成运行)。

问题1:如何制定动态时间表。完成任务的 CPU 可以选择新任务并继续工作。

问题2:是否有 MPI 内置程序,可以自动安排“工人”和任务?

这是我的代码(静态时间表)

{  
  MPI_Init(&argc, &argv); 
  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  MPI_Offset offset;
  MPI_File file;
  MPI_Status status;

   int Pstart = (NNN / nprocs) * rank + ((NNN % nprocs) < rank ? (NNN % nprocs) : rank);
   int Pend   = Pstart + (NNN / nprocs) + ((NNN % nprocs) > rank);
   offset = sizeof(double)*Pstart;

  MPI_File_open(MPI_COMM_WORLD, "shared.dat", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file);


    double * local_array;
    local_array = new double [NNN/nprocs];

    for (int i=0;i<NNN/nprocs;i++)
       {
          /* next line calculates integral on each cell element of part NNN/nprocs of large array NNN */
          adapt_integrate(1, Integrand, par, 2, a, b, MaxEval, tol, tol, &val, &err);

          // putting result of integration to local array NNN/nprocs
          local_array[i] = val;
       }
 //  here, all local arrays are written to one shared file "shared.dat"    

 MPI_File_seek(file, offset, MPI_SEEK_SET);
 MPI_File_write(file, local_array, NNN/nprocs, MPI_DOUBLE, &status);
 MPI_File_close(&file);


}
4

1 回答 1

0

这个问题是关于一个类似的问题,但只是回顾一下:有一个指定的主进程,向其他人发布大量工作。所有工作人员需要做的就是阻塞接收一个工作项,执行他们的计算,然后阻塞将结果发送给主节点并重复。master 可以通过为每个 worker 发布非阻塞接收并轮询其中任何一个是否完成来管理工作项,或者通过发布阻塞接收MPI_ANY_SOURCE作为源来管理工作项。

于 2013-04-15T17:23:45.677 回答