2012-04-07 54 views
0

我想寫一個程序的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); 
} 

回答

1

標記錯誤是因爲標記必須是從1到某個實現相關的最大值的正整數,該最大值保證至少爲32k。

死鎖很容易理解;看看非等級零過程在做什麼:

else { 
    // The rest of the processes 
    // Receive nlocal randomly generated elements from process 0 
    MPI_Recv(elmnts, nlocal, MPI_INT, 0, tag, comm, &status); 

    qsort(elmnts, nlocal, sizeof(int), IncOrder); // does it matter where we sort at? 

    // Send results back to process 0 
    MPI_Send(elmnts, nlocal, MPI_INT, 0, myrank, comm); 
    } 

所以他們做一個接收,一個發回。但是處理器0比這做得更多;它向每個人發送他們的數據,然後執行一系列發送接收來處理1(evenrank)和MPI_NULL_PROC(oddrank)。但是發送 - 接收是偶然的,並且發送接收到進程1將永遠不會被回答,因爲進程1不會做同樣的事情。

我認爲你需要移動if (rank == 0)測試以外的算法部分。

+0

好的,我希望Process 0也參與算法,這就是爲什麼我在if(rank == 0)中擁有該塊的原因。所以我希望每個進程在它們的nlocal元素上運行CompareSplit。我會試着像你說的那樣在if(rank == 0)測試之外移動算法,看看會發生什麼。謝謝。 – erebel55 2012-04-07 15:41:05

+0

你是不是這個意思? http://pastie.org/3745277因爲這對我來說沒有意義,因爲在CompareSplit已經運行之後,我們應該將結果發回到進程0,所以進程0不應該自己發送/接收。 – erebel55 2012-04-07 16:06:11

0

它看起來像您所呼叫MPI_Sendrecv [線113],但也有與oddrank排名沒有進程回答這個問題,因爲oddrank eq -1

+0

感謝您花時間瀏覽我的程序。我知道oddrank會提前到-1處理器0,並且我已經在某個時間添加了來解決這個問題。看第109行,oddrank = MPI_PROC_NULL;這已經停止了你所指的問題。我很抱歉沒有評論這條線更好。 – erebel55 2012-04-07 13:23:45

+0

也看到編輯原始帖子 – erebel55 2012-04-07 13:46:33

+0

所以它看起來是evenrank MPI_Sendrecv,任何想法爲什麼? – erebel55 2012-04-07 14:30:40