2014-04-06 50 views
0

我用MPI寫了一個排序算法。它是遞歸mergesort,左側的孩子在父進程的相同進程內對數組的一半進行排序,而右側的孩子獲得一個新進程並從父進程接收半數,然後將排序後的數組發送回父進程。現在我需要對一堆整數文件進行排序。這是我目前的設計:我可以在C++中重置MPI實例嗎?

int main() 
{ 
    MPI_init(); 
    if(my_rank == 0) 
    { 
    foreach data file 
    { 
     sort_mpi(array); 
    } 
    } 
    else 
    { 
    MPI_Recv(right_array...); 
    sort_mpi(right_array); 
    MPI_Finalize(); 
    } 
    MPI_Finalize(); 
} 

使用此代碼,第一個文件被排序並移動到下一個文件。然而,在for循環的第二個intera中,它只保留在rank 0中,永遠不會進入rank 1。如果我可以在轉到下一個文件之前重置MPI實例,那應該是理想的。有沒有辦法做到這一點?

回答

1

你並不需要重置MPI - 你需要有一個地步,所有實例都在「凍結」,並繼續僅在所有的情況下走到這一步......

由於它的功課 - 我不會告訴你方法的名稱,但我希望它有幫助。
想想這種排序的設計,以及您需要什麼狀態,所有節點在什麼時間以及如何執行。

這個例子可能會有所幫助(希望這不會解決你的功課,但只是導致你在正確的方向)Bitonic Sorting with MPI

+0

我應該使用MPI_Isend和MPI_WAIT當我送數組排序回從右孩子家長嗎? – ddd

+0

看看它http://stackoverflow.com/questions/7004068/mpi-process-synchronization – evenro

+0

看起來像我需要一個MPI_Barrier。我應該在進入任何等級之前添加它(在等級== 0之前)嗎? – ddd

相關問題