У меня есть матрица размером 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 без этих проблем.
Заранее спасибо за помощь!