Я использую неблокирующие сообщения MPI для связи между двумя задачами. Шаблон связи следующий: каждая задача имеет главный поток, который получает сообщения от других задач. Он имеет около 5 рабочих потоков, которые выполняют вычисления и отправляют сообщения другим задачам. Главный поток зацикливается, проверяя входящие сообщения. Это единственное, что он делает.
Моя проблема в том, что, хотя задача 0 мгновенно получает все, отправленное из задачи 1 (количество отправленных и полученных сообщений примерно совпадает), задача 1 получает только около 1/4 сообщений, отправленных задачей 0. После выполнения в течение минуты Есть сотни тысяч выдающихся сообщений.
Используя PAPI, я определил, что задача 1, кажется, блокируется при тестировании и irecv. Пропускная способность команды составляет всего 0,03 мкс / цикл, в отличие от> 0,2 для другой задачи, и остановка задачи в отладчике показывает, что она пытается получить блокировку. Однако блокировка приема и проверки не для «пропущенных» сообщений, а для другого класса гораздо более редких сообщений.
Я понимаю, что трудно сказать, что может вызвать это, фактически не пытаясь выполнить код, но я нахожу удивительным, что в производительности MPI существует такая асимметрия. Задача, которая не справляется с получением, не из-за отсутствия попыток, она действительно тратит все свое время на проверку входящих сообщений.
Я использую OpenMPI 1.5.3 с MPI_THREAD_MULTIPLE, и связь завершена через sm (две задачи находятся на одном узле).
Буду признателен за любые идеи, как это отследить.