Выдержка из справочной страницы MPI для MPI_Gather:
Каждый процесс (включая корневой процесс) отправляет содержимое своего буфера отправки в корневой процесс.
Таким образомпервые 15000 элементов буфера recv total
будут содержать элементы parcial
в корневом процессе.Это было оставлено в вашем коде унифицированным.
Редактировать: @Gilles прокомментировал, что MPI_IN_PLACE
можно использовать, чтобы избежать инициализации корневого процесса.Вот пример, показывающий его эффект:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int *in_place_total = calloc(sizeof(int), size);
int *total = calloc(sizeof(int), size);
int sendval = rank-5000;
MPI_Gather(&sendval, 1, MPI_INT,
total, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0)
assert(total[0] == -5000);
if (rank)
MPI_Gather(&sendval, 1, MPI_INT,
in_place_total, 1, MPI_INT, 0, MPI_COMM_WORLD);
else
MPI_Gather(MPI_IN_PLACE, 1, MPI_INT,
in_place_total, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0)
assert(in_place_total[0] == 0);
free(total);
free(in_place_total);
MPI_Finalize();
}