【发布时间】:2015-03-19 00:23:50
【问题描述】:
我尝试将矩阵的第二列和第三列从排名为 1 的进程和 MPI 为 2 的进程发送到排名为 0 的进程。
在网上找到了这个例子http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node70.htm#Figure4并写了一段代码:
#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char *argv[]) {
int id;
int matrix[3][3];
int matrixB[9];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
if(id == 0)
matrix[i][j] = 0;
else
matrix[i][j] = j+1;
MPI_Datatype matrixSpalte;
MPI_Type_vector(3, 1, 3, MPI_INT, &matrixSpalte);
MPI_Type_commit(&matrixSpalte);
MPI_Gather(&matrix[0][id], 1, matrixSpalte, &matrixB[0], 1, matrixSpalte, 0, MPI_COMM_WORLD);
if(id == 0)
for(int i=0; i<9; i++) {
if(i % 3 == 0)
cout << endl;
cout << matrixB[i] << " (" << i << ") ";
}
MPI_Finalize();
return 0;
}
但输出是:
0 (0) 0 (1) 1351992736 (2)
0 (3) 254423040 (4) 1 (5)
0 (6) 2 (7) 1351992752 (8)
应该是:
1 (0) 2 (1) 3 (2)
1 (3) 2 (4) 3 (5)
1 (6) 2 (7) 3 (8)
我不知道为什么这不起作用。希望有人能帮我找出代码中的错误。
您的真诚,
亨氏
解决方案(感谢 Jonathan Dursi):
#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char *argv[]) {
int id;
int matrix[3][3];
int matrixB[9];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
if(id == 0)
matrix[i][j] = 0;
else
matrix[i][j] = j+1;
MPI_Datatype matrixSpalte, tmp;
MPI_Type_vector(3, 1, 3, MPI_INT, &tmp);
MPI_Type_create_resized(tmp, 0, sizeof(int), &matrixSpalte); // !!!
MPI_Type_commit(&matrixSpalte);
MPI_Gather(&matrix[0][id], 1, matrixSpalte, matrixB, 1, matrixSpalte, 0, MPI_COMM_WORLD);
if(id == 0)
for(int i=0; i<9; i++) {
if(i % 3 == 0)
cout << endl;
cout << matrixB[i] << " (" << i << ") ";
}
MPI_Finalize();
return 0;
}
【问题讨论】:
-
您需要调整矢量类型的大小以在这样的集合中使用它 - 例如,
MPI_Type_vector(3, 1, 3, MPI_INT, &tmp); MPI_Type_create_resized(tmp, 0, sizeof(int), &matrixSpalte); MPI_Type_commit(&matrixSpalte);。有关原因的解释,请参阅this answer。 -
如果你确实有解决方案,你应该回答你自己的问题并相应地标记它,而不是把答案放在问题中。