我的问题是如何使用 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);
}