Транспонирование матрицы с использованием разделения строк в MPI - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь выполнить Matrix Transpose для матрицы 4x4, используя технику разделения строк в MPI.

У меня есть две матрицы. Matrix A имеет входную матрицу, где, как и в Matrix BI, необходимо сохранить результирующую матрицу после транспонирования.

Я выполняю следующие шаги:

1.) Initializing Apart[N/P][N] (To partition rows of Matrix A among P processes)
2.) Initializing Bpart[N][N/p] (To partition Column of Matrix B among P processes)
3.) Computation (Bpart[i][j]=Apart[j][i])
4.) Gather the result in process 0.

Хотя все работает нормально, кроме моего последнего звонка.Я выполняю свой результат среди 4 процессов.Конечный результат такой же, как входная матрица.Я мог бы хотеть использовать сбор отдельно для каждой строки Bpart, но мне нужна помощь, как я могу достичь этогоНиже мой код,

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

int main(int argc, char *argv[])
{
    int myrank, procs, n = 4;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    MPI_Comm_size(MPI_COMM_WORLD, &procs);
    int aPart[n/procs][n];
    int bPart[n][n/procs];
    int a[n][n];
    int b[n][n];
    if(myrank == 0) 
    {
        int temp = 0;        
        for(int i=0; i<n; i++) {
            for(int j=0;j<n;j++) {
                a[i][j] = temp;
                temp++;
            }            
        }       
        /*
        printf("Two Dimensional array elements:\n");
        for(int i=0; i<n; i++) {
            for(int j=0;j<n;j++) {
                printf("%d ", a[i][j]);
            }
            printf("\n");
        }*/               
    }
    MPI_Scatter(&a,(n * (n/procs)),MPI_INT,&aPart,(n * (n/procs)),MPI_INT,0,MPI_COMM_WORLD); 

printf("%d \n",myrank); 
 for(int i=0; i<n; i++) {
        for(int j=0;j< n/procs ;j++) {
            bPart[i][j] = aPart[j][i];
        }        
    }
printf("\n");
for(int i=0; i<n/procs; i++) {
            for(int j=0;j<n;j++) {
                printf("%d ", bPart[i][j]);
            }            
        }   
printf("\n");
MPI_Gather(bPart,(n * (n/procs)),MPI_INT,b,(n * (n/procs)),MPI_INT,0,MPI_COMM_WORLD);
if(myrank == 0)
{
printf("B \n");
for(int i=0; i<n; i++) {
            for(int j=0;j<n;j++) {
                printf("%d ", b[i][j]);
            }
            printf("\n");
        }
}
    MPI_Finalize();

    return 0;
}
...