Отправка четных строк матрицы с использованием MPI_Type_vector - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть матрица размером 8х8. Я хочу отправить четные строки (строки с номерами 0, 2, 4, 8) другому процессу, используя MPI_Type_vector. Я придумал этот код:

#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 без этих проблем.

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...