Я работаю над асинхронной связью и планирую реализовать следующую подпрограмму: каждому процессу принадлежит вектор процессов, с которыми он должен взаимодействовать, в порядке возрастания. Он отправляет неблокирующее получение всем меньшим разрядам и неблокирующее получение всем большим разрядам Для всех процессов, кроме процесса 0, это работает. В чем моя проблема?
Я уже проверил через выходные данные командной строки, что каждый процесс публикует количество полученных и отправленных сообщений в правильном порядке и с правильной информацией. Также, используя unistd.h, я вызвал sleep (5), чтобы проверить, успешна ли связь через некоторое время. Я проверил (используя Probe и заблокировав MPI_Recv), что сообщение действительно в пути - кажется, оно никогда не приходит, если я использую MPI_Irecv.
Чтобы понять код: rank - это ранг текущего процесса, commRanks - это вектор процессов, с которыми необходимо взаимодействовать. recvRanks - это место, где будет храниться содержимое сообщения. reqsArray - это массив запросов того же размера, что и commRanks. rankIndex и индекс перебираются от commRanks.begin () к commRanks.end () и от 0 до commRanks.size () соответственно.
std::vector<int> recvRanks;
for ( rankIndex = commRanks.begin(); *rankIndex < rank && rankIndex != domain->commRanks.end() ; rankIndex++ ) {
//initialize recv buffer to -1 to see if communication works:
recvRanks.push_back(-1);
MPI_Irecv(&recvRanks.at(index),1,DT_RANK_MPI,*rankIndex,1,MPI_COMM_WORLD,&reqsArray[index]);
index++;
}
if (*rankIndex == rank) {
*rankIndex++;
index++;
}
for ( ; rankIndex != domain->commRanks.end() ; rankIndex++ ) {
MPI_Isend(&rank,1,DT_RANK_MPI,*rankIndex,1,MPI_COMM_WORLD,&reqsArray[index]);
index++;
}
sleep(5);
//check if communication was successful:
printf("process 0: [ ");
for (unsigned int i = 0; i < recvRanks.size(); i++){
printf("%d ", recvRanks.at(i));
}
printf("]\n");
Я ожидаю, что результат будет:
процесс 0: []
процесс 1: [0]
процесс 2: [0 1]
процесс 3: [0 1 2]
...
Фактический результат:
процесс 0: []
процесс 1: [-1]
процесс 2: [-1 1]
процесс 3: [-1 1 2]
...
То есть Isend процесса 0 никогда не завершается - что я сделал не так? Если вам нужна дополнительная информация, чтобы понять вопрос, пожалуйста, дайте мне знать! Я застрял в этой точке на одну неделю.