几个小时我试图通过MPI将2D数组发送到不同的线程。代码看起来像这样(我会留下评论来展示我已经尝试过的技巧):
类型定义:
// Define datatype
//MPI_Type_contiguous(N, MPI_INT, &mpi_vector);
//MPI_Type_vector(N, N, N, mpi_vector, &mpi_matrix);
//MPI_Type_vector(N, N, N, MPI_INT, &mpi_matrix);
//MPI_Type_contiguous(N, MPI_INTEGER, &mpi_vector);
//MPI_Type_contiguous(N, mpi_vector, &mpi_matrix);
MPI_Type_vector(N, N, 0, MPI_INTEGER, &mpi_matrix);
//MPI_Type_commit(&mpi_vector);
MPI_Type_commit(&mpi_matrix);
发送和接收:
int** tmp = new int*[N];
switch(r) {
case T1:
inputMatrix(tmp, 2);
MPI_Send(tmp, 1, mpi_matrix, T2, 0, MPI_COMM_WORLD);
//task_T1();
break;
case T2:
//task_T2();
inputMatrix(tmp, -1);
MPI_Recv(tmp, 1, mpi_matrix, T1, 0, MPI_COMM_WORLD, &s);
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++) {
cout << " " << tmp[i][j];
}
cout << endl;
}
break;
}
我需要这样做到早上(7小时),我希望smb能够帮助我。
答案 0 :(得分:6)
MPI 不支持矩阵,其中每行分别分配,a.k.a。指向行的指针数组。 MPI仅使用 平面数组,其中行连续存储在内存中。使用平面阵列:
int** tmp = ...
应该成为
int* tmp = new int[rows*cols];
然后tmp[row][col]
应该以{{1}}访问。
您可以从tmp[row*cols + col]
为单行构造连续类型,然后从整个矩阵的前一个连续类型构造一个连续类型。您还可以构造单个连续类型的MPI_INT
rows*cols
元素。第一种方法更灵活,因为您可能需要稍后发送单个行。