MPI: распределенная 3D-матрица и объединенная 2D-матрица

#c #matrix #mpi

#c #матрица #mpi

Вопрос:

Я должен решить следующее упражнение:

Напишите программу MPI, в которой на узле 0 создается трехмерная матрица (xyz), матрица распределяется равномерно по всем узлам. Каждый узел определяет максимальное значение z для каждой координаты xy и сохраняет это в 2-мерной матрице. Отдельные частичные решения, наконец, должны быть объединены в узле 0

Я работаю с 3 процессами.

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

#define N 3

 

int maxValue(int* array, int _size);

int main(int argc, char** argv)
{   
    int rank;
    int size;
    
    MPI_Init (amp;argc, amp;argv);
    MPI_Comm_rank(MPI_COMM_WORLD, amp;rank);
    MPI_Comm_size(MPI_COMM_WORLD, amp;size);
    
    int matrix2D[N][N];
    int xy[N][N];
    int c[N][N];
    
    int matrix3D[N][N][N] =   {
                    {
                        {1, 1, 1}, 
                        {2, 2, 2}, 
                        {3, 3, 3}
                    },
                    
                    {
                        {4, 4, 4}, 
                        {5, 5, 5}, 
                        {6, 6, 6}
                    },
                    
                    {
                        {7, 7, 7}, 
                        {8, 8, 8}, 
                        {9, 16, 9}
                    }
                };
                

    

    

    MPI_Scatter(matrix3D, N*N*N/size, MPI_INT, xy, N*N*N/size, MPI_INT, 0,MPI_COMM_WORLD);

    for (int x = 0; x < N; x  )
    {
        for (int y = 0; y < N; y  )
        {

            matrix2D[x][y] = maxValue(xy[x], N);

            
        }
        printf("n");
    }

    MPI_Gather(matrix2D, N*N, MPI_INT, c, N*N, MPI_INT,0,MPI_COMM_WORLD);
    

    

    if (rank == 0)
    {
        for (int x = 0; x < N; x  )
        {
            for (int y = 0; y < N; y  )
            {

                    printf("%d, ", matrix2D[x][y]);
            
            }
            printf("n");
        }
    }
    
    MPI_Finalize();
    

}


int maxValue(int* array, int _size)
{
    int v = 0;
    
    for (int i = 0; i < _size; i  )
    {
        if (array[i] >= v)
        {
            v = array[i];
        }   
    }
    
    return v;
} 
  

Как вы можете видеть, матрица имеет некоторые максимальные значения. Я не удовлетворен своим результатом, потому что мой результат:

 1, 1, 1, 
2, 2, 2, 
3, 3, 3, 
  

и у меня такое чувство, что мое упражнение не завершено.
Если я создам матрицу внутри предложения if (rank == 0), значения будут повреждены.
Я понятия не имею, какие размеры отправки и получения я должен присвоить функциям scatter и gather.

Комментарии:

1. У меня такое чувство, что мое упражнение не завершено… Почему у вас такое чувство. Можете ли вы выразить это в более конкретных терминах? Если вы не можете, тогда необходимы разъяснения из вашей книги или инструктора.

2. В упражнении говорится, что матрица должна быть создана процессом (узлом) 0. Я не уверен, нужно ли мне помещать создание матрицы в if-предложение с rank == 0. И вывод должен содержать 16, потому что это максимальное значение из z-координаты.

3. MPI_Scatter() может привести к некоторому переполнению буфера, если вы не делаете некоторых предположений о количестве задач MPI (и в этом случае добавьте некоторые if или assert() , чтобы прояснить их). MPI_Gather() вызывает переполнение буфера, если выполняется более одной задачи MPI.

4. @GillesGouaillardet спасибо. Это очень важная информация.