DoMPI и узлы, процессоры и ядра
Я хочу выполнить распределенное параллельное вычисление с кластером, к которому у меня есть доступ: 5 узлов ("компьютеров"); каждый узел имеет два процессора ("CPU"), а каждый процессор имеет 18 ядер.
Таким образом, число потоков, которые я мог бы использовать в смущающе параллельных вычислениях, равно 180 (5*2*18).
Я обнаружил, что не могу использовать стандартные параллельные функции R для кластера. Вместо этого мне нужно использовать MPI. doMPI кажется идеальным для этой задачи, так как он реализует foreach для MPI, как описано в виньетке:
https://cran.r-project.org/web/packages/doMPI/vignettes/doMPI.pdf
У меня есть вопрос о MPI: когда кто-то пишет, например:
cl <- startMPIcluster (count = 2)
что это значит 2? Количество узлов в кластере, которые будут использоваться? Количество ядер, которые будут использоваться?
Если 2 представляет количество используемых узлов, сможет ли doMPI использовать 2 процессора и 2 * 18 ядер, которые находятся в каждом узле? Или я должен сказать doMPI что-то еще, чтобы я мог использовать эти 36 ядер?
Если 2 представляет количество ядер, то все кажется проще. Но этот выбор был бы странным, потому что, если кластер на самом деле больше 5 узлов (и мне было выделено 5 узлов на пропорциональную квоту), нет четкого рецепта, если doMPI должен использовать как можно меньше узлов (и все ядра в этом узле) или использовать как можно больше узлов (и как можно меньше ядер в этом узле).
Итак, мой вопрос:
Если я хочу выполнить цикл из 180 смущающих параллельных задач (или 360, или 1800), должен ли я использовать cl <- startMPIcluster (count = 5) или cl <- startMPIcluster (count = 180) или что-то еще, например, что 180 доступные ядра используются?
Спасибо за помощь.
1 ответ
count
Параметр "количество рабочих для появления". Если вы хотите использовать все 180 ядер в вашем кластере, у вас есть два основных варианта:
- использование
startMPIcluster(count=180)
, Это породит 180 процессов. - использование
mpirun -np 180 R myscript.r
, Это запустит 180 экземпляров R с MPI, установленным с самого начала, а именно, "размер" MPI будет равен 180, а "ранг" процессов будет от 0 до 179.
Любой из этих вариантов в порядке. Вы можете смешать их тоже, например mpirun -np 10
тогда каждая работа будет порождена count=15
или что угодно. Но, учитывая то, что вы нам сказали, я бы сказал, что вам следует придерживаться более простых подходов, описанных выше.
Как общее примечание, всякий раз, когда MPI говорит о количестве процессов, рабочих или заданий, один из них выполняется на одном ядре. Обычно количество узлов или сокетов на узел - это не первое, о чем вам нужно беспокоиться (о них стоит подумать позже, как об оптимизации).