MPI 发送矩阵列 (C++)
MPI send matrix columns (C++)
我尝试将矩阵的第二列和第三列从具有 MPI 的秩一和二的进程发送到秩为零的进程。
在互联网上,我找到了这个例子 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)
我不知道为什么这不起作用。我希望有人可以帮助我找到代码中的错误。
您的真诚,
亨
解决方案(感谢乔纳森·杜尔西):
#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_Gather
应该传递一个缓冲区,该缓冲区可以将所有元素存储在一个连续的数组中。看看这里的图片
也就是说rbuf
必须指向 9 int
s 的数组。这就是您收到Abort trap: 6
错误的原因,如此处所述。您正在尝试通过matrix[0][8]
matrix[0][3]
写作
此外,您的recv_type
必须MPI_INT
相关文章:
- OpenMP阵列性能较差
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- 从阵列C++中删除重复项
- 阵列的大小在C++中是否灵活?
- 反转阵列中的正序列
- 具有可变尺寸的 C++ 2D 阵列
- 二维阵列的动态分配
- 重新增长阵列时出错:写入时缓冲区溢出