我的矩阵尺寸为8x8。我想使用MPI_Type_vector将偶数行(行数为0、2、4、8)发送到另一个进程。我想到了以下代码:
#include <mpi.h>
#define INITIATOR 0
#define SIZE 8
int main(int argc, char **argv) {
srand(time(NULL));
MPI_Init(&argc, &argv);
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Datatype MPI_EVEN_ROWS;
MPI_Type_vector(SIZE / 2, SIZE, SIZE * 2, MPI_INT, &MPI_EVEN_ROWS);
MPI_Type_commit(&MPI_EVEN_ROWS);
if (rank == INITIATOR) {
int a[SIZE][SIZE];
printf("Matrix: \n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
a[i][j] = rand() % 11;
printf("%d ", a[i][j]);
}
printf("\n");
}
MPI_Send(a, 1, MPI_EVEN_ROWS, 1, 0, MPI_COMM_WORLD);
} else {
int b[SIZE / 2][SIZE];
MPI_Recv(b, 1, MPI_EVEN_ROWS, INITIATOR, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Received matrix: \n");
for (int i = 0; i < SIZE / 2; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d ", b[i][j]);
}
printf("\n");
}
}
MPI_Finalize();
}
执行该程序后,我发现它未按预期运行。我收到相同的矩阵,但是不是数字1、3、5、7的行,而是随机的垃圾。 输出示例:
Matrix:
1 0 2 3 1 9 0 2
8 7 2 4 10 10 7 8
2 1 4 1 3 8 1 5
7 4 5 2 8 9 8 9
9 8 1 8 4 0 8 1
7 10 3 6 7 0 1 10
1 6 9 3 3 10 8 8
1 2 8 9 9 3 6 5
Received matrix:
1 0 2 3 1 9 0 2
1408046848 64 7 0 0 0 -81026544 21851
2 1 4 1 3 8 1 5
2 0 969750056 32581 972617984 32581 965895305 32581
我非常确定我只会收到偶数行。我是在做错什么还是我误解了MPI_Type_vector的工作原理?
哦,我需要使用MPI_Type_vector来完成此任务,我知道可以使用MPI_Type_struct来完成,而不会出现这些问题。
谢谢您的帮助!
答案 0 :(得分:1)
我知道有点晚了,但是
我遇到了同样的问题,并且得到了下一个建议-为接收创建第二种数据类型:
int size = 8; // Size of initial matrix 8x8
int sizeGet = 4; // for recieve even?odd rows matrix size 4x8
MPI_Datatype MPI_EVEN_ODD_ROWS;
MPI_Datatype MPI_EVEN_ODD_ROWS_RECIEVE;
MPI_Type_vector(sizeGet, size,size*2, MPI_DOUBLE, &MPI_EVEN_ODD_ROWS);
MPI_Type_vector(sizeGet, size, size , MPI_DOUBLE, &MPI_EVEN_ODD_ROWS_RECIEVE);
MPI_Type_commit(&MPI_EVEN_ODD_ROWS);
MPI_Type_commit(&MPI_EVEN_ODD_ROWS_RECIEVE);
从矩阵a(8x8)中,我们将在进程#0中将偶数和奇数行发送到b和c矩阵(4x8):
MPI_Send(a, 1, MPI_EVEN_ODD_ROWS,
1, 0, MPI_COMM_WORLD);
MPI_Send(a+8, 1, MPI_EVEN_ODD_ROWS, 1, 0, MPI_COMM_WORLD);
并以其他方式接收数据:
MPI_Recv(b, 1, MPI_EVEN_ODD_ROWS_RECIEVE, 0,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(c, 1, MPI_EVEN_ODD_ROWS_RECIEVE, 0,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
这对我有用,我希望对其他人也有用
欢呼