Рассчитать допустимый диапазон значений для переменных ранга и размера для программы MPI Intel i7 8-го поколения (6 ядер с 2 потоками на ядро) - PullRequest
0 голосов
/ 04 мая 2020

Подскажите, пожалуйста, как рассчитать действительный ранг и размер для mpi:

Приведенная ниже программа Hello World C -MPI должна быть скомпилирована в исполняемый файл с именем ./hello и выполнена на сервере с Intel i7 8-го поколения (6 ядер с 2 потоками на ядро) и 16 ГБ памяти с Linux Ubuntu 16 и полной библиотекой MPI.

#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}

Является ли mpirun -np 24 ./hello допустимым выполнением команда? Обоснуйте свой ответ и, если ваш ответ положительный, укажите допустимый диапазон значений для переменных ранга и размера.

1 Ответ

1 голос
/ 05 мая 2020

Это некорректный вопрос, поскольку максимальное количество рангов зависит от многих факторов, поэтому сложно дать короткий и / или полный ответ.

Прежде всего, выходные аргументы обоих MPI_Comm_size() и MPI_Comm_rank() равны int, что в настоящее время является 32-битным на большинстве платформ, поэтому накладывает жесткий верхний предел в 2 миллиарда (2 31 -1) рангов.

Затем наступает предел, который накладывает конкретная реализация MPI. К сожалению, MPI не определяет способ получения максимального числа рангов в задании MPI, и вам необходимо ознакомиться с документацией реализации, но, скажем, большинство используют int s для внутренней индексации, поэтому ограничение, вероятно, такое же - 2 млрд. рангов.

Затем возникает вопрос о том, как именно библиотека MPI реализует ранги MPI. С большинством готовых MPI на Linux это будут процессы ОС, поэтому нам нужно посмотреть, сколько процессов можно запустить одновременно.

Во-первых, существует максимальное количество процессов, которое Linux ядро ​​может справиться. По умолчанию идентификатор процесса (PID) оборачивается, когда достигает значения, указанного в /proc/sys/kernel/pid_max, который равен 32768 при загрузке системы. Это верхний предел для 32-разрядных Linux, а также предел по умолчанию для 64-разрядных Linux (для обратной совместимости), но его можно изменить до 2 22 * ​​1017 * для 64-разрядных Linux. PID для пользовательских процессов начинаются с 300, за исключением очень специального первого пользовательского процесса (почтенный init), который всегда равен 1. Таким образом, вы можете иметь до 2 22 * ​​1020 * -300 одновременно запущенных процессов, кроме init, около 4,2 миллиона, но обычно это меньше, поскольку потоки ядра тоже могут входить в это пространство PID.

Тогда существуют пользовательские ограничения, налагаемые механизмом ulimit. ulimit -u устанавливает или получает лимит запущенных процессов для пользователя. По умолчанию в Ubuntu 18.04 используется значение 483294, что также является максимально возможным значением для этого предела (т. Е. Жесткого предела). Поскольку задания MPI обычно выполняются под одним и тем же именем пользователя, это ограничение ограничивает число рангов, которое может иметь.

Типичные реализации MPI идут со специальным процессом запуска, поэтому вы не можете запустить задание MPI с более чем 483293 рангами в 64-битная Ubuntu 18.04. Но опять же, это всего лишь верхний предел. Существует больше.

Процессы ОС, каждый из которых имеет свои собственные таблицы страниц виртуального адресного пространства и соответствующие структуры ядра, и те, которые потребляют память. Кроме того, любые дополнительные выделения памяти выполняются процессом. Минимальная MPI-программа из вашего вопроса с добавленным вызовом sleep(3), чтобы дать время для выполнения команды ps до выхода из программы, скомпилированной с Open MPI на 64-битной Ubuntu 18.04 и лишенной символов отладки, имеет размер резидентного набора (RSS) 12 МБ за ранг. Пусковая установка mpiexec имеет немного больше, и ее использование памяти растет с числом рангов MPI, но давайте проигнорируем это. Игнорируя также использование памяти ядра и тот факт, что в типичной системе Linux существуют другие процессы, вы не можете запустить более (16 ГиБ + объем подкачки) / 12 МБ процессов. Размер свопа, как правило, варьируется от совсем не до удвоения объема ОЗУ, хотя на самом деле это может быть что угодно. Без обмена вы ограничены 1364 рангами. С размером подкачки в два раза больше оперативной памяти, вы можете иметь 4095 рангов. Предположим для простоты первый случай, т. Е. Без свопа, поэтому ограничение в 1364 ранга.

Простая программа не требует больших вычислительных ресурсов. Если бы он действительно что-то вычислял, то эти 1364 ранга конкурировали бы за 12 логических процессоров, за 114 процессов на локальный процессор, что немного абсурдно. Следовательно, более разумным пределом будет 12, если есть хорошие варианты скрытия задержки памяти с использованием гиперпоточности, или даже 6, если программа работает с очень узким l oop, который не всегда достигает данных за пределами core-private cache.

Итак, как вы можете видеть, ваш вопрос о допустимом диапазоне некорректен. Что касается работы на 12 логических процессорах в общей сложности 24 ранга MPI, которые просто выводят "Hello world", это нормально.

Что касается значений rank и size, которые могут быть при запуске 24- Для задания ранга MPI ответ заключается в том, что размер MPI_COMM_WORLD фиксирован глобально для задания MPI и равен числу рангов MPI, запрошенных изначально с параметром -np, тогда как фактическое число рангов варьируется от 0 до size - 1.

...