我的問題是如何使用MPI創建動態工作人員池。具有MPI的大型C++工作人員動態池
有一個大的(NNN = 10^6-7元素)1D數組/矢量。我應該對每個單元格進行一些計算。這個問題是非常令人尷尬的並行。
這個想法是(它工作正常):每個MPI進程(當並行運行時)讀取常見的.dat文件,將值放入局部(每個級別)大小爲NNN的大型向量,並在大型數組中,此「部分」的長度爲NNN/nprocs,其中「nprocs」是MPI的進程數。
問題:這個數組的某些「部分」(NNN/nprocs)非常快速地完成,因此一些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);
}