2015-10-12 55 views
1

想象一下,每個進程有n個進程,每個進程擁有2行8個元素的矩陣(線性存儲,而不是2D)。我希望每個進程都將其行傳遞給所有低級別的進程。例如,級別爲2的進程將其行與級別爲1和0的進程進行通信;級別爲0的進程不會將其行傳遞給任何進程。接收者和發送者之間的MPI_Bcast同步

我有問題決定如何解決這個問題。使用MPI_Bcast是一種可能的解決方案,但我似乎無法使操作按預期工作。您可以在下面看到我正在執行的代碼示例。

// npes is the number of processes obtained from MPI_INIT 
// The value for i below is used to specify the number of 
// rows that will be received 
for (i = (npes - rank - 1) * rowsPerProcess; i > 0; i--) { 
    // Receive 
    MPI_Bcast(temp, columns, MPI_DOUBLE, i/rowsPerProcess, MPI_COMM_WORLD); 
    printf("I'm %d and I received from %d\n", rank, i/rowsPerProcess); 
} 

if (rank != 0) { // rank 0 does not send data 
    for (row = rowsPerProcess - 1; row >= 0; row--) { 
    for (j = 0; j < columns; j++) { 
     //matrix_chunk is the per process matrix of 2 rows 
     temp[j] = matrix_chunk[row*columns + j]; 
    } 
    // Send 
    printf("I'm sender %d\n", rank); 
    MPI_Bcast(temp, columns, MPI_DOUBLE, rank, MPI_COMM_WORLD); 
    } 
} 

我接收的輸出是下面的:

I'm 1 and I received from 1 
I'm sender 2 
I'm sender 2 
I'm 0 and I received from 2 
I'm 0 and I received from 1 
I'm 0 and I received from 1 
I'm 0 and I received from 0 
I'm 1 and I received from 0 
I'm sender 1 
I'm sender 1 

看來,第一接收MPI_Bcast呼叫作爲發送者操作執行。我還打印了收到的臨時矩陣的內容,而這些並不是我所期望的。

除了試圖糾正這個混亂,我想看看我如何執行這個特定的通信問題。我覺得我正在從錯誤的方向接近這一點。請讓我知道,如果你有任何建議!

+3

'mpi_bcast'是一個集體操作,在指定的通信器中的所有進程(在你的代碼中'MPI_COMM_WORLD')都會進行調用,它專爲從根進程到所有其他進程的廣播而設計,米不知道這是適合您的通信模式的正確的例程。我想我會以你想要的模式開始匹配'mpi_send'和'mpi_recv'。 –

+0

雖然從理論上可以用'MPI_COMM_WORLD'中的'i'子通信器創建包含等級'0'到'i-1'的子通信器,這將允許你使用'MPI_BCAST',可能會有更多有效解決方案你究竟想要完成什麼? –

+1

我試圖解決的問題是減少一個矩陣到它的行減少的梯隊形式。在我上面發佈的代碼之前,我使用行縮小的矩陣(對角線以下的元素爲0)。上面看到的步驟基本上是逆操作,將對角線上方的元素減少爲0. – macalaca

回答

0

我按照高性能標記的建議實現了匹配的mpi_send和mpi_recv。當我通過這種方法想到這個問題時,問題立即就變得有意義了。

相關問題