MPI + GPU: как смешать эти два метода
Моя программа хорошо подходит для MPI. Каждый процессор выполняет свою собственную, специфическую (сложную) работу, производит один double
, а затем я использую MPI_Reduce
, чтобы умножить результат от каждого процессора.
Важно отметить, что я не хочу и не нуждаюсь в полном наборе графических процессоров. Мне просто нужно много процессоров, а затем один графический процессор, чтобы ускорить часто используемую операцию MPI_Reduce
.
double
s. мне нужно умножить все 250,00 из этих double
s вместе. потом я повторите это от 10 000 до 1 миллиона раз. Если бы у меня был один GPU (в дополнение к 500 процессорам), это могло бы быть действительно эффективным. Каждый процессор вычислит свои 50 double
s для всех ~1 миллиона "состояний". Затем все 500 процессоров отправят свои double
s на GPU. Затем GPU умножит 250 000 double
s вместе для каждого из 1 миллиона" состояний", производя 1 миллион doubles
.Эти цифры не являются точными. Вычисление действительно очень большое. Я просто пытаюсь донести до генерала проблема.
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, почему это является эффективным, и как вы можете его использовать. "