MPI + GPU: как смешать эти два метода


Моя программа хорошо подходит для MPI. Каждый процессор выполняет свою собственную, специфическую (сложную) работу, производит один double, а затем я использую MPI_Reduce, чтобы умножить результат от каждого процессора.

Но я повторяю это много-много раз (> 100 000). Таким образом, мне пришло в голову, что графический процессор значительно ускорит процесс. У меня есть google, но я не могу найти ничего конкретного. Как вы собираетесь смешивать MPI с графическими процессорами? Есть ли способ для программы запрашивать и проверять " oh, Этот ранг-GPU, все остальные-процессоры" ? Есть ли рекомендуемый учебник или что-то в этом роде?

Важно отметить, что я не хочу и не нуждаюсь в полном наборе графических процессоров. Мне просто нужно много процессоров, а затем один графический процессор, чтобы ускорить часто используемую операцию MPI_Reduce.

Вот схематический пример того, о чем я говорю: Предположим, у меня есть 500 процессоров. Каждый процессор каким-то образом производит, скажем, 50 doubles. мне нужно умножить все 250,00 из этих doubles вместе. потом я повторите это от 10 000 до 1 миллиона раз. Если бы у меня был один GPU (в дополнение к 500 процессорам), это могло бы быть действительно эффективным. Каждый процессор вычислит свои 50 doubles для всех ~1 миллиона "состояний". Затем все 500 процессоров отправят свои doubles на GPU. Затем GPU умножит 250 000 doubles вместе для каждого из 1 миллиона" состояний", производя 1 миллион doubles.
Эти цифры не являются точными. Вычисление действительно очень большое. Я просто пытаюсь донести до генерала проблема.
2 6

2 ответа:

Это не тот способ думать об этих вещах.

Мне нравится говорить, что MPI и GPGPU вещи ортогональны(*). Вы используете MPI между задачами (для которых мыслите узлами, хотя у вас может быть несколько задач на узел), и каждая задача может или не может использовать ускоритель, такой как GPU, для ускорения вычислений внутри задачи. На GPU нет ранга MPI.

Несмотря на это, Talonmies прав; этот конкретный пример не звучит так, как будто он сильно выиграет от GPU. И этого не будет. если вы делаете только один или несколько флопов за дубль, стоимость отправки данных на GPU превысит выгоду от того, что все эти ядра работают на них.

(*) раньше это было более ясно; теперь, например, GPUDirect может копировать память на удаленные графические процессоры через infiniband, различие более размыто. Однако я утверждаю, что это все еще самый полезный способ думать о таких вещах, как RDMA для графических процессоров является важной оптимизацией, но концептуально незначительной настройкой.

Здесь я нашел некоторые новости по этой теме:

"MPI, интерфейс передачи сообщений, представляет собой стандартный API для передачи данных с помощью сообщений между распределенными процессами, который обычно используется в HPC для построения приложений, которые могут масштабироваться в многоузловые компьютерные кластеры. Таким образом, MPI полностью совместим с CUDA, который предназначен для параллельных вычислений на одном компьютере или узле. Есть много причин для того, чтобы объединить два подхода параллельного программирования из MPI и CUDA. Распространенная причина заключается в том, чтобы разрешить проблемы с размером данных, слишком большим, чтобы поместиться в памяти одного GPU, или которые потребовали бы неоправданно долгого вычислительного времени на одном узле. Другой причиной является ускорение существующего MPI-приложения с графическими процессорами или возможность масштабирования существующего одноузлового приложения с несколькими графическими процессорами на нескольких узлах. С помощью CUDA-aware MPI эти цели могут быть достигнуты легко и эффективно. В этом посте я объясню, как работает CUDA-aware MPI, почему это является эффективным, и как вы можете его использовать. "