Dynamic 具有MPI的大型阵列C+的动态工作池+;

Dynamic 具有MPI的大型阵列C+的动态工作池+;,dynamic,scheduled-tasks,mpi,Dynamic,Scheduled Tasks,Mpi,我的问题是如何使用MPI创建一个动态的工作人员池 有一个大的(NNN=10^6-7个元素)1D数组/向量。我应该对每个单元格进行一些计算。这个问题是极其令人尴尬的平行问题 其思想是(工作正常):每个MPI进程(并行运行时)读取common.dat文件,将值放入大小为NNN的本地(每个秩)大向量中,并在大数组的适当部分上执行计算,此“部分”的长度为NNN/nprocs,其中“nprocs”是MPI进程的数量 问题是:此阵列的某些“部分”(NNN/NPROC)完成得非常快,因此一些CPU未使用(它们

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

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

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

问题是:此阵列的某些“部分”(NNN/NPROC)完成得非常快,因此一些CPU未使用(它们等待其他CPU完成运行)

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

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

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

{
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和NPROC);
MPI通信等级(MPI通信世界和等级);
MPI_偏移量;
MPI_文件;
MPI_状态;
int Pstart=(NNN/nprocs)*秩+((NNN%nprocs)排名);
偏移量=sizeof(双)*Pstart;
MPI_文件打开(MPI_COMM_WORLD,“shared.dat”、MPI_MODE_CREATE、MPI_MODE_WRONLY、MPI_INFO_NULL和文件);
双*本地_数组;
本地_数组=新的双精度[NNN/nprocs];
对于(int i=0;i是关于一个类似的问题,但只是简单地重述一下:有一个指定的主进程,向其他进程发布工作块。所有工作人员需要做的就是阻塞接收一个工作项,执行他们的计算,然后阻塞将结果发送给主进程并重复。主进程可以通过发布一个非阻塞接收来管理工作项为每个工作人员进行ive,并在其中任何工作人员完成时进行轮询,或者通过发布一个阻止接收,并将MPI\u any\u源作为源

{  
  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);


}