MPI_Isend корневого процесса никогда не приходит - PullRequest
1 голос
/ 23 марта 2019

Я работаю над асинхронной связью и планирую реализовать следующую подпрограмму: каждому процессу принадлежит вектор процессов, с которыми он должен взаимодействовать, в порядке возрастания. Он отправляет неблокирующее получение всем меньшим разрядам и неблокирующее получение всем большим разрядам Для всех процессов, кроме процесса 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 никогда не завершается - что я сделал не так? Если вам нужна дополнительная информация, чтобы понять вопрос, пожалуйста, дайте мне знать! Я застрял в этой точке на одну неделю.

1 Ответ

0 голосов
/ 23 марта 2019

После публикации некоторых ваших MPI_Irecv s, recvRanks перераспределяет на push_back, аннулируя указатели на его элементы, уже предоставленные в качестве буферов. Сначала используйте reserve, чтобы предотвратить перераспределение.

...