Почему виснет программа на MPI?
Потому что процесс с rank = 0 хочет послать VEC_SIZE сообщений, а процессы с rank > 0 обрабатывают каждый только по одному сообщению, после чего завершаются. Тебе нужно как-то объяснить исполнителям, сколько запросов они должны обработать перед завершением. Например так:
if(rank == 0){
for(int i = 0; i < VEC_SIZE; i++){
…
}
for (int i = 1; i < size; ++i) {
int q = -1;
MPI_Send(&q, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}else{
for (;;) {
int index;
MPI_Status status;
MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
if (index < 0)
break;
…
}
};
Отдельно стоит сказать о том, что цикл который посылает задачу процессу и тут же ждёт результата от этого же самого процесса не имеет смысла с точки зрения улучшения производительности. Имеет смысл сначала разослать задания свободным исполнителям, а только после этого начинать ждать от них ответов.
И ещё по мелочи:
for(size_t i = 0; i < VEC_SIZE; i++){
size_t num_process = (i % (size - 1)) + 1;
MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);
размер
size_t i
может отличаться от размера
int
, подразумеваемого типом
MPI_INT
. Этот код точно будет работать неправильно на big-endian архитектурах с LP64 ABI.