Я новичок в программировании MPI. У меня есть массив размером 8 на 10, который мне нужно использовать, чтобы найти суммирование каждой строки параллельно. В ранге 0 (процесс 0) он будет генерировать матрицу 8 на 10, используя 2-мерный массив. Затем я использовал бы номер tag
как первое значение индекса (номер строки) массива. Таким образом, я могу использовать уникальный буфер для отправки через Isend. Тем не менее, похоже, что мой метод генерации номера тега для Isend не работает. Не могли бы вы взглянуть на следующий код и сказать, правильно ли я передаю 2D-массив и номер тега. Когда я запускаю этот код, он останавливается сразу после запуска rannk 1 и ждет. Я использую 3 процесса для этого примера и использую команду mpirun -np 3 test
, пожалуйста, дайте мне знать, как решить эту проблему с примером, если это возможно.Как передать 2D-массив в MPI и создать динамическое значение тега с использованием языка C?
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int tag = 1;
int arr[8][10];
MPI_Request request;
MPI_Status status;
int source = 0;
int dest;
printf ("\n--Current Rank: %d\n", world_rank);
if (world_rank == 0)
{
int i = 0;
int a, b, x, y;
printf("* Rank 0 excecuting\n");
for(a=0; a<8/(world_size-1); a++)//if -np is 3, this will loop 4 times
{
for(b=0; b<(world_size-1); b++)//if -np is 3, this loops will loop 2 times
{//So, if -np is 3, due to both of these loops, Isend will be called 8 times
dest = b+1;
tag = a+b;//create a uniqe tag value each time, which can be use as first index value of array
//Error: This tag value passing to Isend doesn't seems to be workiing
MPI_Isend(&arr[tag][0], 10, MPI_INT, dest, tag, MPI_COMM_WORLD, &request);
}
}
for(x=0; x<8; x++)//Generating the whole 8 by 10 2D array
{
i++;
for (y = 0; y < 10; y++)
{
arr[x][y] = i;
}
}
}
else
{
int a, b;
for(b=1; b<=8/(world_size-1); b++)
{
int sum = 0;
int i;
MPI_Irecv(&arr[tag][0], 10, MPI_INT, source, tag, MPI_COMM_WORLD, &request);
MPI_Wait (&request, &status);
//Error: not getting the correct tag value
for(i = 0; i<10; i++)
{
sum = arr[tag][i]+sum;
}
printf("\nSum is: %d at rank: %d and tag is:%d\n", sum, world_rank, tag);
}
}
MPI_Finalize();
}
Большое спасибо за вашу помощь и показ с примером –