Режимы исполнения процессов на Blue Gene/P

Обратите внимание, что в 1-м издании книги «IBM System Blue Gene Solution: Blue Gene/P Application Development» в разделе 4.6, «Specifying a mode», неправильно указан режим исполнения по умолчанию, что противоречит как разделу 4.1 «Symmetrical Multiprocessing Node Mode», той же книги, так и ее 2-му изданию. В действительности, режимом исполнения по умолчанию на системе Blue Gene/P является SMP-режим. Тем не менее, мы рекомендуем явным образом специфицировать режим исполнения.

На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов:

В VN- и DUAL-режимах процессы в рамках вычислительного узла для обмена данными могут использовать

Выбор режима исполнения определяет пользователь, исходя из требований задачи и использованного механизма распараллеливания. Режимом по умолчанию является SMP. Если используется HPC-парадигма, то режима специфицируется в аргументах команды mpirun:

mpirun ... -mode SMP ...
mpirun ... -mode VN ...
mpirun ... -mode DUAL ...

Аналогично, используя HTC, режимы передаются команде submit:

submit ... -mode SMP ...
submit ... -mode VN ...
submit ... -mode DUAL ...

Если вы запускаете OpenMP-программу в VN- или DUAL-режиме, то в командном файле необходимо явным образом указать число нитей:

  • mpirun ... -env OMP_NUM_THREADS=1 ... — для VN-режима,
  • mpirun ... -env OMP_NUM_THREADS=2 ... — для DUAL-режима;

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

1587-120 SMP runtime library error. Memory allocation failed when creating thread number 2.

В каждом из режимов MPI-процессам доступен приблизительно следующий объем памяти:

  • VN — 472 МБ
  • DUAL — 978 МБ
  • SMP — 1992 МБ

Режим симметричного мультипроцессора

Режимом исполнения по умолчанию на системе Blue Gene/P является SMP-режим, когда на каждом вычислительном узле выполняется один (MPI-)процесс, который может породить до трех дополнительных нитей. Поддерживаются OpenMP- и pthreads-нити. Каждая нить ассоциирована с конкретным ядром, т.е. не происходит их миграции. Режим проиллюстрирован на рисунке (процессы обозначены буквой «П», нити — буквой «Н»):

SMP-режим работы IBM Blue Gene/P

Режим виртуальных вычислительных узлов

В VN-режиме на каждом вычислительном узле запущено четыре (MPI-)процесса, которые делят между собой доступные ресурсы (в первую очередь память и сеть трехмерного тора), причем за разделение ресурсов и возможность их независимого использования отвечает ядро вычислительного узла. Если используется HPC-парадигма (но не HTC-парадигма), то процессы, работающие в рамках одного вычислительного узла, могут обмениваться данными с помощью общей памяти.

MPI-коммуникации в рамках одного вычислительного узла реализованы с помощью механизма прямого доступа к памяти (direct memory access, DMA). Устройство DMA пересылает данные по сети трехмерного тора, когда необходимо отправить информацию удаленному вычислительному узлу, и выполняет локальное копирование данных, когда сообщение предназначено процессу, работающему на этом же вычислительном узле.

В VN-режиме на всех четырех ядрах вычислительного узла запущены независимые процессы. Каждый из них обладает обладает своим уникальным номером. Координаты в трехмерном торе теперь представляют собой «четверки» вместо «троек».

Режим проиллюстрирован на рисунке.

VN-режим работы IBM Blue Gene/P

Режим двухядерных вычислительных узлов

В DUAL-режиме на вычислительном узле запущено два (MPI-)процесса, которые могут породить еще по одной нити. Каждому процессу выделяется половина доступной памяти compute-карты. Поддерживаются OpenMP- и pthreads-нити, общая память между процессами. Как и в SMP-режиме, каждая нить закреплена за конкретным ядром, т.е. на этапе исполнения не происходит их миграции.

Режим проиллюстрирован на рисунке.

DUAL-режим работы IBM Blue Gene/P

Механизм общей памяти

Общая память поддерживается только в VN- и DUAL-режимах, а в SMP-режиме уже по определению память вычислительного узла является общей для всех нитей.

Общая память выделяется посредством стандартных вызовов Linux (shm_open() и mmap()). Однако, так как ядро вычислительного узла не поддерживает виртуальные страницы, то физическая память, которая отвечает виртуальной, должна быть выделена из области, специально отведенной для этой цели. Она имеет неизменяемый размер, который пользователь указывает при запуске задачи.

Резервируемый объем общей памяти определяется переменной окружения BG_SHAREDMEMPOOLSIZE. Например, если команде mpirun передать через флаг -env значение BG_SHAREDMEMPOOLSIZE=8, то система выделит под общую память область в 8 мегабайт (если используется команда mpisubmit.bg, то необходимо использовать ключ -e или --env). Рекомендуется использовать не менее 4 Мб общей памяти; опыт показывает, что при выделении менее 4 Мб приложение снимается еще при запуске с сообщением «Killed by signal 11».

Выделение общей памяти происходит примерно по следующей схеме:

fd = shm_open(shm_file_name, O_RDWR, 0600);
ftruncate(fds[0], MAX_SHARED_SIZE);
shmptr1 = mmap(NULL, MAX_SHARED_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

Для освобождения общей памяти необходимо выполнить:

munmap(shmptrl, MAX_SHARED_SIZE);
close(fd)
shm_unlink(SHM_FILE);

Вызовы shm_open() и shm_unlink() обращаются к псевдоустройству /dev/shm/file_name ядра. Выделениие и открепление общей памяти отслеживается с помощью внутреннего счетчика, поэтому процессам не нужно при этом координироваться.

Текст составлен на основе материала главы 4, «Execution process modes», 2-го издания книги «IBM System Blue Gene Solution: Blue Gene/P Application Development»