MPI + GPU: как смешать два метода
моя программа хорошо подходит для MPI. Каждый процессор выполняет свою собственную, специфическую (сложную) работу, производит одно double
, а затем я использую MPI_Reduce
умножить результат от каждого процессора.
но я повторю это много, много раз (> 100,000). Таким образом, мне пришло в голову, что GPU значительно ускорит процесс.
у меня есть google вокруг, но не могу найти ничего конкретного. Как вы смешиваете MPI с графическими процессорами? Есть ли способ для программы запросить и проверить "о этой ранг-это GPU, все остальные-процессоры"? есть ли рекомендуемый учебник или что-то еще?
важно отметить, что я не хочу или не нужен полный набор графических процессоров. Мне действительно просто нужно много процессоров, а затем один GPU для ускорения часто используемого MPI_Reduce
операции.
вот схематический пример того, о чем я говорю:
Предположим, у меня 500 процессоров. Каждый процессор как-то производит, скажем, 50 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 между задачами (для которых узлы 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 работает, почему он эффективен и как вы можете его использовать."