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呼叫作爲發送者操作執行。我還打印了收到的臨時矩陣的內容,而這些並不是我所期望的。
除了試圖糾正這個混亂,我想看看我如何執行這個特定的通信問題。我覺得我正在從錯誤的方向接近這一點。請讓我知道,如果你有任何建議!
'mpi_bcast'是一個集體操作,在指定的通信器中的所有進程(在你的代碼中'MPI_COMM_WORLD')都會進行調用,它專爲從根進程到所有其他進程的廣播而設計,米不知道這是適合您的通信模式的正確的例程。我想我會以你想要的模式開始匹配'mpi_send'和'mpi_recv'。 –
雖然從理論上可以用'MPI_COMM_WORLD'中的'i'子通信器創建包含等級'0'到'i-1'的子通信器,這將允許你使用'MPI_BCAST',可能會有更多有效解決方案你究竟想要完成什麼? –
我試圖解決的問題是減少一個矩陣到它的行減少的梯隊形式。在我上面發佈的代碼之前,我使用行縮小的矩陣(對角線以下的元素爲0)。上面看到的步驟基本上是逆操作,將對角線上方的元素減少爲0. – macalaca