Я строю распределенный веб-сервер в C/MPI, и кажется, что связь «точка-точка» полностью прекращает работу после первого MPI_BARRIER в моем коде. Стандартный код C работает после барьера, поэтому я знаю, что каждая из нитей проходит через барьер. Коммуникация точка-точка также отлично работает перед барьером. Однако, когда я копирую-вставляю тот же код, который работал над линией до барьера в линию после того, как барьер полностью перестает работать. SEND будет просто ждать вечно. Когда я пытаюсь использовать ISEND вместо этого, он делает это через строку, но сообщение так и не получено. Я много разбираюсь в этой проблеме, и всем, у кого есть проблемы с MPI_BARRIER, говорят, что барьер работает правильно, а их код неправильный, но я не могу в жизни понять, почему мой код неправильный. Что может вызвать такое поведение?MPI_SEND перестает работать после MPI_BARRIER
Вот пример программы, которая демонстрирует это:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int procID;
int val;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &procID);
MPI_Barrier(MPI_COMM_WORLD);
if (procID == 0)
{
val = 4;
printf("Before send\n");
MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
printf("after send\n");
}
if (procID == 1)
{
val = 1;
printf("before: val = %d\n", val);
MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("after: val = %d\n", val);
}
MPI_Finalize();
return 0;
}
Перемещение двух if
заявления до барьера вызывает эту программу, чтобы правильно работать.
EDIT - Похоже, что первое сообщение, независимо от типа, работы и всех будущих сообщений, не срабатывает. Это гораздо более общее, что я думал сначала. Не имеет значения, является ли первое сообщение барьером или каким-либо другим сообщением, никакие будущие коммуникации не работают должным образом.
Код, который вы отправили, выглядит хорошо для меня. Какую версию MPI вы используете? – suszterpatt
С openmpi 1.5.5 отлично работает для меня. – chemeng
Я знаю, что это openmpi, но я не могу понять, какой номер версии. Есть ли команда, которая вам говорит? – TEOUltimus