Я новичок, который вставляет в параллельное программирование. Для моего понимания я пытаюсь кодировать сам. Тогда я обнаружил, что я не понимаю в MPI_Gather. Давайте сначала посмотрим код, а потом объясню.
#include "mpi.h"
#include <stdio.h>
int main (int argc, char *argv[]) {
int size;
int rank;
int a[12];
int i;
int start,end;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank==0)
{
for(i=0;i<12;i++)
{
a[i] = 100;
}
}
start = 12/size*rank;
end = 12/size*(rank+1);
for(i=start;i<end;i++)
{
a[i] = rank;
printf("rank %d set a[%d] equal to %d\n",rank,i,rank);
}
MPI_Gather(&a[start],12/size*rank,MPI_INT,a,12/size*rank,MPI_INT,0,MPI_COMM_WORLD);
if(rank==0)
{
for(i=0;i<12;i++)
{
printf("%d %d\n",i,a[i]);
}
}
MPI_Finalize();
return 0;
}
Для этого кода моя цель - собрать значение в подмассиве, который генерируется в каждом процессе, и сохранить его в массиве a. Затем дайте процессу 0 распечатать его.
Прежде всего, я инициализирую все значение в массиве до 100
Затем я вычисляю начальный индекс и конечный индекс для каждого процесса (в этом случае номер процесса должен быть кратным 12)
Далее я присваиваю массиву значение, равное ему рангу
Далее я собираю это
Наконец, я печатаю его на экране
Вот выход для 3 процесса размером = 3
ранг 2 установить [8] равным 2
ранг 2 установить [9] равным 2
ранг 2 установить [10] равным 2
ранг 2 установить [11] равным 2
ранг 1 установить [4] равным 1
ранг 1 установить [5] равным 1
ранг 1 установить [6] равным 1
ранг 1 установить [7] равным 1
ранг 0 установить [0] равным 0
ранг 0 установить [1] равным 0
ранг 0 установить [2] равным 0
ранг 0 установить [3] равным 0
0 0
1 0
2 0
3 0
4 100
5 100
6 100
7 100
8 100
9 100
10 100
11 100
Как вы видите, сбор собирает только первую длину данных, как я могу это исправить.
Заранее спасибо.