Я узнал о программировании MPI и наткнулся на следующий stackoverflow question. Я использую этот самый «ответный» пример, чтобы вычислить сумму каждой строки таким образом, чтобы она увеличивала перекрытие. Это массив 2 на 3, и я хочу рассчитать сумму, как только эти элементы массива достигнут MPI_Irecv
. Я редактировал свой код между MPI_Irecv
и MPI_Wait
, чтобы начать вычислять, как только элементы массива станут доступными. Но когда я запускаю код, мне кажется, что я неправильно звонил MPI_Test
. Если вы можете решить это с помощью примера, я бы очень признателен.MPI Overlapping с использованием языка C для создания суммирования массива
Использование mpirun -np 3 test
0-й ранг будет генерировать элементы массива. 1 и 2 рангов рассчитают сумму
#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[2][3];
MPI_Request request;
MPI_Status status;
int source = 0;
int dest;
int flag;
printf ("\n--Current Rank: %d\n", world_rank);
//To handle the number of process received by the user will be handled here later
if (world_rank == 0)
{
int i = 1;
int a, b, x, y;
printf("* Rank 0 excecuting\n");
for(x=0; x<2; x++)//Generating the whole 2 by 3 2D array
{
i++;
for (y = 0; y < 3; y++)
{
arr[x][y] = i;//first row contain all 2
} //second row contain all 3
}
int subarray_index;
for(subarray_index=0; subarray_index < 2; subarray_index++)
{
dest = subarray_index%(world_size - 1) + 1;
tag = subarray_index;
MPI_Isend(&arr[subarray_index][0], 3, MPI_INT, dest, tag, MPI_COMM_WORLD, &request);
}
}
else
{
int a, b;
for(b=0; b<2/(world_size-1); b++)
{
int sum = 0;
int i;
int my_offset = world_rank-1;
tag = b*(world_size-1) + my_offset;
int subarray = b;
MPI_Irecv(&arr[subarray][0], 3, MPI_INT, source, tag, MPI_COMM_WORLD, &request);
MPI_Test(&request, &flag, &status);//I think there may be an error at MPI_Test too
while (flag != 1)
{
MPI_Test(&request, &flag, &status);
for(i = 0; i<3; i++)
{
//if(!arr[subarray][i])//want to wait till I recive actual array elements
//{//This need to start calculating as soon as array element become avilable
printf("%d) arr[subarray][i]:%d at rank %d\n", tag, arr[subarray][i], world_rank);
sum = arr[subarray][i]+sum;
//}
}
}
printf("\nSum is: %d at rank: %d and tag is:%d\n", sum, world_rank, tag);
MPI_Wait (&request, &status);
}
}
MPI_Finalize();
}
Когда я набираю в mpirun -np 3 test
Ответе должен быть «Сумма в 6» и «Сумма составляет 9»
--Current Rank: 2
1) arr[subarray][i]:40896 at rank 2
1) arr[subarray][i]:32767 at rank 2
1) arr[subarray][i]:617513272 at rank 2
1) arr[subarray][i]:40896 at rank 2
1) arr[subarray][i]:32767 at rank 2
1) arr[subarray][i]:617513272 at rank 2
1) arr[subarray][i]:40896 at rank 2
1) arr[subarray][i]:32767 at rank 2
1) arr[subarray][i]:617513272 at rank 2 //all above arr element shows it's empty
1) arr[subarray][i]:3 at rank 2 //following three values are correct and these
1) arr[subarray][i]:3 at rank 2 //are the only three that need to use for summing
1) arr[subarray][i]:3 at rank 2
Sum is: 1909043312 at rank: 2 and tag is:1
--Current Rank: 0
* Rank 0 excecuting
--Current Rank: 1 //here I don't get arr element values as above
Sum is: 0 at rank: 1 and tag is:0
Спасибо большое за такой подробный ответ и объяснить все в деталях. Ты лучший –
@ Learner_51 Рад, что это тебе помогло. Повеселись. – haraldkl