Матрица разделения MPI на блоки

Я хочу разбить матрицу на блоки (не полосы), а затем распределить эти блоки с помощью MPI_Scatter.

Я нашел решение, которое работает, но я думаю, что оно далеко от «лучшей практики». У меня есть матрица 8x8, заполненная числами от 0 до 63. Затем я делю ее на 4 блока 4x4, используя MPI_Type_vector, и распределяю через MPI_Send, но это требует дополнительных вычислений, поскольку мне нужно вычислять смещения для каждого блока в большой матрице.

Если я использую разброс, первый (верхний левый) блок передается нормально, а другие блоки - нет (неправильное смещение для начала блока).

Так можно ли передавать блоки матрицы с помощью MPI_Scatter, или как лучше всего выполнить требуемую декомпозицию?

Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

#define SIZE 8


int main(void) {

        MPI_Init(NULL, NULL);
        int p, rank;
        MPI_Comm_size(MPI_COMM_WORLD, &p);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        char i;

        char a[SIZE*SIZE];
        char b[(SIZE/2)*(SIZE/2)];

        MPI_Datatype columntype;
        MPI_Datatype columntype2;

        MPI_Type_vector(4, 4, SIZE, MPI_CHAR, &columntype2);
        MPI_Type_create_resized( columntype2, 0, sizeof(MPI_CHAR), &columntype );
        MPI_Type_commit(&columntype);

        if(rank == 0) {
                for( i = 0; i < SIZE*SIZE; i++) {
                        a[i] = i;
                }

                for(int rec=0; rec < p; rec++) {
                        int offset = (rec%2)*4 + (rec/2)*32;
                      MPI_Send (a+offset, 1, columntype, rec, 0, MPI_COMM_WORLD);
                }
        }
        MPI_Recv (b, 16, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        //MPI_Scatter(&a, 1, boki, &b, 16, MPI_CHAR , 0, MPI_COMM_WORLD);

        printf("rank= %d  b= \n%d %d %d %d\n%d %d %d %d\n%d %d %d %d\n%d %d %d %d\n", rank, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]);

        MPI_Finalize();

        return 0;
}
13
задан Andraz 25 September 2011 в 23:26
поделиться