簡體   English   中英

具有子矩陣的MPI Gatherv

[英]MPI Gatherv with submatrices

我在使MPI_Gatherv達到我的預期目標時遇到了麻煩,並且想知道你們中那些更有經驗的人可以看到我做錯了什么。

我有一個[N,M]的大矩陣(TEST)。 每個過程在子集[rows,M](WORK_MATRIX)上進行一些工作,然后每個過程(沿着行維)將這些子矩陣收集到完整的矩陣中。

似乎它沒有收集任何數據,我正在努力找出原因!

在這里,我使用Eigen包裝這些(連續的)矩陣。

輸出:

mpirun -np 5 ./pseudo.x
1 1 1 1 1
0 1 2 3 4
TEST: 5 10
0 0 2 0 0 0 0 0 0 0 
1 1 2 0 0 0 0 0 0 0 
2 2 2 0 0 0 0 0 0 0 
3 2 2 0 0 0 0 0 0 0 
4 2 0 0 0 0 0 0 0 0

我創建了以下代碼的簡單版本:

mpiicc -I /路徑/到/本征-o pseudo.x pseudo.cpp

#include <mpi.h>
#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;
using namespace std;

int main(int argc, char ** argv) {
int RSIZE = 5;
int CSIZE = 10;

int rank;
int num_tasks;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_tasks);

MatrixXd TEST_MATRIX = MatrixXd::Zero(RSIZE, CSIZE);

VectorXi recv = VectorXi::Zero(num_tasks);
VectorXi displs = VectorXi::Zero(num_tasks);

int nrows = (RSIZE + rank) / num_tasks;

MPI_Allgather(&nrows, 1, MPI_INT, recv.data(), 1, MPI_INT, MPI_COMM_WORLD);

int start = 0;
for (int i = 0; i < rank; i++)
    start += recv[i];

MPI_Allgather(&start, 1, MPI_INT, displs.data(), 1, MPI_INT, MPI_COMM_WORLD);

if (rank == 0) {
    cout << recv.transpose() << endl;
    cout << displs.transpose() << endl;
}

MatrixXd WORK_MATRIX = MatrixXd::Zero(nrows, CSIZE);

for (int row = 0; row < nrows; row++)
    for (int col = 0; col < CSIZE; col++)
        WORK_MATRIX(row, col) += rank;

MPI_Datatype rowsized, row;

int sizes[2] = { RSIZE, CSIZE };
int subsizes[2] = { nrows, CSIZE };
int starts[2] = { 0, 0 };
MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &rowsized);
MPI_Type_create_resized(rowsized, 0, sizeof(double), &row);
MPI_Type_commit(&row);

MPI_Allgatherv(WORK_MATRIX.data(), recv[rank], row, TEST_MATRIX.data(), recv.data(), displs.data(), row, MPI_COMM_WORLD);

if (rank == 0) {
    cout << "TEST: " << TEST_MATRIX.rows() << " " << TEST_MATRIX.cols() << endl;

    for (int i = 0; i < TEST_MATRIX.rows(); i++) {
        for (int j = 0; j < TEST_MATRIX.cols(); j++) {
            cout << TEST_MATRIX(i, j) << " ";
        }
        cout << endl;
    }
}

}

C ,二維矩陣按行存儲,我懷疑本征會改變這一點。

這意味着您無需調整數據類型的大小,並且應該調整位移

start += recv[i] * CSIZE;

MPI_Allgather()品味,您根本不需要兩個MPI_Allgather() ,因為nrowsstart可以在本地計算。 我寧願建議您只使用MPI_Type_contiguous()為一行創建一個派生數據類型(並且該類型不應調整大小),因為MPI_Type_create_subarray()實際上在這里是一個過大的殺傷力。

暫無
暫無

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

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