2013-06-13 37 views
1

我想用MPI結構編寫一個C++程序。我想從一個巨大的文件中讀取數據並將其存儲到數組中。我希望數組是本地的,即我不希望所有的線程都擁有整個數組,因爲數組非常龐大。每個線程執行本地計算並「發送」和「接收」以進一步計算。做這個的最好方式是什麼?我在線看到的所有代碼使用rand()函數生成本地數組,但我想從文件中讀取值。MPI分配數組

這可能是要我要:

int main() 
{ 
    // Read from a file 
    // store in array a[] temporarily 
    //MPI_init(); 
    //My thread should have an array b[] that is a subset of a[] 
    //MY code to do a numerical simulation 
    //MPI_finalise(); 
    return 0; 
} 

PS:我的數據結構比陣列更加複雜。我存儲了一個巨大的圖。它更像是一個鏈表或矢量數組。

+1

歡迎來到SO。要回答您的問題,我們需要您提供更多信息。請描述您想要分發的數據的格式。你還應該解釋這些數據應該在節點中分佈的方式。 – Nobody

回答

1

MPI是進程之間的消息傳遞系統而非線程。當進程在不同的機器上運行時,這是一個真正的區別。

如果你想要做的操作完全獨立於你的圖的每個部分,我會去平行讀。其他的原因,如果你想有一個讀和傳播數組,你會碰到這樣的:

int main(int argc, char * argv[]) 
{ 
    MPI_init(&argc, &argv); 
    int prank; MPI_Comm_rank(MPI_COMM_WORLD, &prank); 
    int psize; MPI_Comm_size(MPI_COMM_WORLD, &psize); 
    if(prank == 0) { 
     // Read from a file 
     // store in array a[] temporarily 

     MPI_Scatter(a, length(a)/psize, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD); 
     // this works only if length(a) is a multiple of psize, otherwhy you should go for MPI_Scatterv 
    } else { 
     MPI_Scatter(NULL, 0, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD); 
    } 
    //My thread should have an array b[] that is a subset of a[] 
    //MY code to do a numerical simulation 

    MPI_finalise(); 
    return 0; 
} 

但是,這是想法,如果你有數組,如果你有一個圖表,你應該給看一個圖表分區分割你的圖形,並將這些部分發送給不同的特效。我認爲Trilinos爲你做了一切。其他爲什麼您只需使用Scotch或Metis爲圖表着色,然後使用MPI將每種顏色發送到處理器。

+0

謝謝!這很有用。我打算使用par-Metis來分割圖表。我還將研究如何將圖的每個部分發送到單個進程。 – Shank