使用MPI_Type_vector发送偶数矩阵行

时间:2018-11-17 13:22:43

标签: c++ mpi

我的矩阵尺寸为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来完成,而不会出现这些问题。

谢谢您的帮助!

1 个答案:

答案 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);

这对我有用,我希望对其他人也有用

欢呼