Промежуточная между MPI и OpenMP технология параллельного программирования.

Наиболее распространенными на сегодня базовыми технологиями параллельного программирования являются технологии MPI и OpenMP.

Технология MPI менее требовательна к аппаратуре связи между процессорами, на которой она может быть эффективно реализована, но гораздо более требовательна к программисту, труднее в применении, нежели технология OpenMP.

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

В последние годы специализированные сети вычислительных кластеров довольно быстро совершенствуются, оставаясь сравнительно дешевыми и хорошо масштабируемыми. Разрыв в показателях эффективности и качества межпроцессорного взаимодействия между SMP-серверами и специализированными сетями все еще велик, но он стал гораздо меньше, чем был несколько лет назад, за счет совершенствования специализированных сетей. Нынешние специализированные сети могут многое из того, чего сети не могли еще 5-10 лет назад.

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

Такая технология была разработана более 10 лет назад фирмой Cray, и первоначально на компьютерах других фирм почти не применялась. Сегодня тот уровень качества и эффективности коммуникационного оборудования, который когда-то был доступен лишь фирме Cray и ей подобным, уверенно достигнут и даже перекрыт в категории кластерных вычислительных систем. Настало время распространить наработки Cray по промежуточной технологии параллельного программирования, успешно прошедшие многолетнюю проверку практикой, на суперкомпьютеры кластерного типа.

Технология называется shmem (от shared memory – разделяемая память), и представляет собой, как и MPI, библиотеку функций (подпрограмм).

От MPI эта технология унаследовала статическое (во время запуска программы) порождение процессов, а также явное различие между «своей» и «чужой» для данного процесса памятью.

От OpenMP – наличие разделяемого, так или иначе доступного всем процессам пространства памяти, и барьерную синхронизацию как основной режим синхронизации процессов.

Пространство памяти в shmem устроено следующим образом.

Если в программе объявлен массив А, то этот массив у каждого процесса будет свой (как в MPI). Однако, каждый процесс может осуществить прямой доступ к массиву А любого другого процесса, обращаясь к функциям «положить» (put()) или «взять» (get()). В отличие от MPI, при доступе к «чужим» данным «ответной любезности» от «хозяина» данных не требуется.

Прямой доступ к «чужим» данным не подразумевает, в отличие от обмена сообщениями в MPI, принудительной синхронизации при каждом акте передачи данных от процесса к процессу. Поэтому в shmem, в отличие от MPI (и подобно OpenMP), необходимую по смыслу программы синхронизацию приходится организовывать отдельно от обменов данными. Для этого применяются барьеры. В MPI барьерная синхронизация предусмотрена, но имеет вспомогательный характер, применяется далеко не во всех программах. В shmem же, подобно OpenMP, этот способ синхронизации является основным.

Важной отличительной чертой shmem является высокая эффективность обмена короткими сообщениями (особенно при записи). В некоторых видах приложений, таких, например, как расчеты на неструктурированных сетках, процессы обмениваются данными, которые расположены в памяти не крупными сплошными кусками, а многочисленными мелкими порциями, разбросанными по памяти сложным образом. При использовании MPI в этих случаях приходится из соображений эффективности прибегать к запаковке данных в крупные пакеты при отправке и распаковке при приеме. При использовании shmem в этом нет нужды: мелкие порции данных (вплоть до отдельных чисел) можно отправлять отдельными операциями «put()» сразу в необходимое место. Эффективность от этого практически не страдает, а программа, как правило, заметно упрощается.

Библиотека shmem может быть использована тремя следующими способами:

  1. Как отдельная коммуникационная библиотека. В суперкомпьютере МВС-экспресс, например, библиотека shmem-экспресс на сегодня – единственное базовое средство коммуникации. Реализации MPI для этой машины пока нет, а когда и если будет, то надстроена она будет над shmem ¹.
  2. В сочетании с MPI. Именно этот способ в свое время был рекомендован пользователям суперкомпьютеров Cray и SGI. Программа пишется с использованием MPI, но те ее части, которые на MPI записываются плохо, например, работа с неструктурированными сетками, используют обращения к shmem. Такая реализация подмножества shmem, «погруженная» в MPI, доступна в настоящее время на кластерах ИПМ РАН.
  3. В сочетании с OpenMP. Сегодня практически все вычислительные кластеры строятся на базе многоядерных узлов, каждый из которых представляет собой SMP-сервер. Пока число процессорных ядер на узле кластера было невелико (2-4), программисты, как правило, игнорировали наличие памяти, общей для всех ядер в пределах узла, организуя взаимодействие между процессами на разных ядрах так, как если бы каждое ядро было связано с другими ядрами только сетью. Сегодня нормой становятся узлы кластеров, имеющие в своем составе 8, 16, 32 и более процессорных ядер. Это усиливает интерес к гибридным параллельным программам, в которых для организации совместной работы процессорных ядер внутри узла используется OpenMP, а для организации взаимодействия узлов между собой – какая-то другая технология. До сих пор считалось, что этой «другой технологией» может быть лишь технология MPI или ее производные. Как мы имели возможность убедиться только что, технология shmem в этом качестве предпочтительнее: она не только в большей степени соответствует возможностям современных сетей, но и ближе по стилю программирования к OpenMP, нежели MPI. Кроме того, shmem во многих отношениях элементарно проще, чем MPI. Все это позволяет рассматривать shmem как естественный набор расширений OpenMP при переходе от одиночного SMP-сервера к кластеру SMP-серверов.

Примечания:
¹ На сегодня такая реализация есть — SKIF-MPI
См. также
  • Руководство пользователя.
  • Руководство программиста.
  •  
     
     
     
     
     
     
     
      Тел. +7(499)220-79-72; E-mail: inform@kiam.ru