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

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

но я повторю это много, много раз (> 100,000). Таким образом, мне пришло в голову, что GPU значительно ускорит процесс.

у меня есть google вокруг, но не могу найти ничего конкретного. Как вы смешиваете MPI с графическими процессорами? Есть ли способ для программы запросить и проверить этой ранг-это GPU, все остальные-процессоры"? есть ли рекомендуемый учебник или что-то еще?

важно отметить, что я не хочу или не нужен полный набор графических процессоров. Мне действительно просто нужно много процессоров, а затем один 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 ответов


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

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

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

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


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

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