OpenMPI - MPI_Allreduce занимает слишком много времени - PullRequest
0 голосов
/ 04 мая 2020

[Примечание: я вроде как новичок ie, использующий MPI, поэтому аплодисменты, если я говорю что-то не так / делаю что-то не так]

У меня есть эти строки кода, чтобы Allreduce из двух массивов удваивается :

MPI_Allreduce (A, A_copy, size1, MPI_DOUBLE, MPI_SUM, rows_comm);
MPI_Allreduce (B, B_copy, size2, MPI_DOUBLE, MPI_SUM, cols_comm);

Коммуникаторы row_comm и cols_comm создаются с использованием распределения процессов по шахматной доске.

Пример с некоторыми данными: выполнение этих строк 10000 раз, с size1 = size2 = 2500bits и 2 процессов в строке и 2 в столбце.

Если я запускаю все на одной и той же машине, это нормально, это занимает совсем немного времени.

Как только я выполняю один процесс на машину, все подключены к сети Сочетание этих Allreduce займет около 20 секунд. Это примерно 2 миллисекунды за итерацию, что мне кажется слишком длинным для такого небольшого объема данных. Средняя пропускная способность сети превышает 500 Мбит / с. Если я попытаюсь масштабировать это до еще нескольких процессов, общее время All_reduce будет увеличиваться почти линейно с ним.

Я использую MPI_Barrier, чтобы убедиться, что все процессы, использующие один и тот же коммуникатор, достигают уменьшения на в то же время, поэтому я не учитываю никаких накладных расходов на балансировку нагрузки.

Это нормально для реализации Allreduce OpenMPI так долго? Я не могу использовать любую другую реализацию, и Allreduce становится узким местом в моем распределенном приложении. Есть ли лучшая альтернатива для этого? Обратите внимание, что я использовал этот пример с небольшими данными, но данные на итерацию могут достигать нескольких мегабайт, а число итераций может быть тысячами.

Редактировать: При отправке около 2 Мбит на итерацию, с 3000 итерациями я получаю в общей сложности 70 секунд, проведенных в Allreduce. Это около 23 миллисекунд на итерацию. Если есть 4 процесса, передающие эти данные во всем сокращении (2 Мбит / ~ 500 Мбит / с = 4 мс), то я думаю, что это время имеет смысл? Таким образом, кажется, что нет смысла делать это распределенным, так как он недостаточно хорошо масштабируется с количеством машин и размером данных, и так как у нас не так много доступных машин (таких как 90, но, по-видимому, активны только 10), параллельная реализация, использующая что-то вроде OpenMP, кажется более подходящей. Кто-нибудь может это подтвердить?

...