簡體   English   中英

MPI 點對點通信到集體通信

[英]MPI Point to Point Communication to Collective Communication

我正在學習 MPI 並且我正在嘗試將我的 MPI 程序從點對點通信轉換為 MPI 集合 ..

下面是我使用 MPI 點對點通信進行矩陣乘法的代碼片段......

int i;
    if(rank == 0) {
        for(i = 1; i < size; i++){
            MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            MPI_Send(&columns, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
    } else {
        MPI_Recv(&rows, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
        MPI_Recv(&columns, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
    }   

    int local_block_size = rows / size;
    int process, column_pivot;

    if(rank == 0) {
        for(i = 1; i < size; i++){
            MPI_Send((matrix_1D_mapped + (i * (local_block_size * rows))), (local_block_size * rows), MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
            MPI_Send((rhs + (i * local_block_size)), local_block_size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
        }
        for(i = 0; i < local_block_size * rows; i++){
            matrix_local_block[i] = matrix_1D_mapped[i];
        }
        for(i = 0; i < local_block_size; i++){
            rhs_local_block[i] = rhs[i];
        }
    } else {
        MPI_Recv(matrix_local_block, local_block_size * rows, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
        MPI_Recv(rhs_local_block, local_block_size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
    }

我正在考慮用 MPI_Bcast 替換 MPI_Send ...這是正確的方法嗎?

對於第一次通信,發送到所有接收器的數據實際上是相同的,因此MPI_Bcast是正確的方法。 第二次通信將更大數組的不同塊分發給接收者,這是作為一個集合與MPI_Scatter一起MPI_Scatter 請注意,scatter 包括通信中的根等級,因此您可以省略手動本地復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM