у меня есть Проблема MPI_Isend / MPI_Recv в многопотоковый программа.
В программе:
Первая машина имеет один поток делает некоторые вычисления и вызывает MPI_Isend
отправить буфер на второй компьютер, а другой поток всегда пытается MPI_Recv
данные со второй машины. И первая нить будет MPI_Wait
его последний MPI_Isend
завершить до вызова MPI_Isend
снова.
Вторая машина делает то же самое.
Тогда я получил результат, который:
Первая машина:
Нить 0: MPI_Isend
Данные на второй машине успешно. но заблокирован в MPI_Wait
потому что последний MPI_Isend
не завершено.
Нить 1: пробовать MPI_Recv
Данные со второй машины, но нет данных и она заблокирована.
Вторая машина:
Нить 0: MPI_Isend
Данные к первой машине успешно. но заблокирован в MPI_Wait
потому что последний MPI_Isend
не завершено.
Нить 1: пробовать MPI_Recv
данные с первой машины, но нет данных и она заблокирована.
У кого-нибудь есть какие-либо идеи? Я очень ценил это, потому что я отслеживал проблему в течение двух дней, но никакого прогресса.
Чтобы иметь возможность выполнять вызовы MPI одновременно, вы должны инициализировать библиотеку MPI с поддержкой потоков на уровне MPI_THREAD_MULTIPLE
, Для этого вы должны заменить звонок на MPI_Init
с:
int provided;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
printf("Sorry, this MPI implementation does not support multiple threads\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
Некоторые библиотеки MPI должны быть скомпилированы определенным (не по умолчанию) способом для поддержки вызовов из нескольких потоков. Например, Open MPI должен быть настроен во время сборки библиотеки. Другие поставщики предоставляют две версии своих библиотек — одну с поддержкой потоков, а другую без, и вам нужно выбрать правильную версию, когда вы связываете свой код. Это связано с тем, что добавление поддержки потоков увеличивает задержку многих вызовов MPI, и никто не хочет этого, если его программа не использует потоки.
Других решений пока нет …