2013-04-15 62 views
1

我的問題是如何使用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); 


} 

回答

0

This question是有關類似問題,但只是爲了回顧一下:有一個指定的主進程問題的工作大塊給了別人。所有工作人員需要做的就是阻止接收工作項目,執行計算,然後阻止將結果發送給主服務器並重復。主人可以通過發佈每個工作人員的非阻塞接收和輪詢其中是否有任何人員完成,或通過張貼阻止接收作爲源來管理工作項目。