#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 спасибо. Это очень важная информация.