我想寫一個程序的MPI版本,該程序在n個隨機生成的元素上運行奇數/偶數比較拆分操作。MPI奇/偶比較分裂死鎖
進程0應該生成這些元素並將它們的nlocal發送給其他進程(保持其本身的第一個nlocal)。從這裏開始,進程0應該在運行CompareSplit算法後打印出結果。然後,從算法的其他進程運行中接收結果。最後,打印剛剛收到的結果。
我已經做了很大一部分,但我得到了一個我似乎無法修復的死鎖。我將不勝感激人們可以給我的任何提示。
這裏是我的代碼http://pastie.org/3742474
現在我敢肯定,僵局從發送/ RECV未來在線路134和151,我試圖改變發送到使用「標籤」,而不是myrank的標籤參數..但是當我這樣做,我只是不斷收到「MPI_ERR_TAG:無效標籤」出於某種原因。
顯然我也會在處理器> 0內運行算法,但現在我已經拿掉了那部分內容,直到我弄清楚什麼是錯誤的。
任何幫助表示讚賞。
編輯:我寫了一個較小的測試用例,它不包含任何CompareSplit操作,但仍處於死鎖狀態。 http://pastie.org/3744691
我修改了上述測試用例,將第83行的標籤從「myrank」更改爲「tag」。 那麼測試用例的作品,但是當我的程序中添加了實際的算法時,它會造成死鎖......
所以,我認爲我已經將死鎖範圍縮小到這段代碼。 它看起來是其他人的Sendrecv。
for (i = 1; i <= npes; i++) {
if (i % 2 == 1) // odd phase
MPI_Sendrecv(elmnts, nlocal, MPI_INT, oddrank, 1, relmnts,
nlocal, MPI_INT, oddrank, 1, MPI_COMM_WORLD, &status);
else
MPI_Sendrecv(elmnts, nlocal, MPI_INT, evenrank, 1, relmnts,
nlocal, MPI_INT, evenrank, 1, MPI_COMM_WORLD, &status);
CompareSplit(nlocal, elmnts, relmnts, wspace,
myrank < status.MPI_SOURCE);
}
好的,我希望Process 0也參與算法,這就是爲什麼我在if(rank == 0)中擁有該塊的原因。所以我希望每個進程在它們的nlocal元素上運行CompareSplit。我會試着像你說的那樣在if(rank == 0)測試之外移動算法,看看會發生什麼。謝謝。 – erebel55 2012-04-07 15:41:05
你是不是這個意思? http://pastie.org/3745277因爲這對我來說沒有意義,因爲在CompareSplit已經運行之後,我們應該將結果發回到進程0,所以進程0不應該自己發送/接收。 – erebel55 2012-04-07 16:06:11