我的问题是如何用MPI创建一个动态的工作池。
存在大的(NNN = 10 ^ 6-7个元素)1D阵列/向量。我应该对每个细胞进行一些计算。这个问题非常令人尴尬地平行。
这个想法是(它工作正常):每个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);
}
答案 0 :(得分:0)
This question是一个类似的问题,但回顾一下:拥有一个指定的主进程,向其他人发布大量工作。所有工作人员需要做的是阻止接收工作项,执行他们的计算,然后阻止将结果发送给主人并重复。主人可以通过为每个工作人员发布非阻止接收并在其中任何一个工作完成时进行轮询,或者通过发布以MPI_ANY_SOURCE
作为来源的阻止接收来管理工作项。