Хотя ваша основная ошибка - 12
вместо 4
, давайте сделаем это шаг за шагом.
// int size = 3; // number of processes/nodes
int size;
...
MPI_Comm_size(MPI_COMM_WORLD, &size); // initialize MPI
assert(size == 3);
Нет смысла устанавливать size
в 3
. Это значение будет перезаписано на MPI_Comm_size
фактическим количеством процессов. Это число определяется тем, как вы запускаете приложение MPI (например, mpirun -np 3
).
//unsigned char outData[12]; // buffer for receiving data
unsigned char outData[4];
У нас есть 12 элементов и 3 процесса, по 4 элемента на процессы. Итак, 4 элемента достаточно для outData
.
outData[i] = 0;
inData[i] = 0;
Нет смысла обнулять эти буферы, они будут перезаписаны.
// scatter the data to the processes
// I am not clear about the numbers sent in and out
MPI_Scatter(&testData, 4 /*12*/, MPI_UNSIGNED_CHAR, &outData,
4 /*12*/, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
У нас есть 4 элемента на процессы, поэтому число должно быть 4, а не 12.
MPI_Barrier(MPI_COMM_WORLD);
Вам здесь не нужны барьеры.
MPI_Gather(&outData, 4 /*12*/, MPI_UNSIGNED_CHAR, &inData,
4 /*12*/, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
Та же история, 4
вместо 12
.
MPI_Finalize();
Это должно вызываться всеми процессами.