Гибридные вычисления: Преимущества совместного использования общей и распределённой памяти

Jan-Philipp Weiss 06/03/2014
Share this on Facebook Share this on Twitter Share this on LinkedIn

В предыдущих постах блога мы описали базовые принципы параллельных вычислений с общей и распределённой памятью. Из этой статьи Вы узнаете, как совместно использовать эти два метода в гибридных вычислениях. Мы постараемся подробно разобрать различные аспекты гибридных вычислений, а также наглядно покажем, как можно повысить производительность в COMSOL Multiphysics, используя параллельные расчёты.

Введение в гибридные вычисления

В последнее время кластерные системы становятся всё более и более мощными благодаря многоядерным технологиям. Распараллеливание теперь доступно сразу на несколько уровнях. Огромные системы распараллеливают задачи между узлами, сокетами, ядрами и даже векторными единицами (для выполнения вычислений на векторах и одномерных массивах данных, а не на скалярных величинах).

Кроме того, системы памяти имеют многоуровневую организацию. Их структура становится более комплексной и глубокой. Это необходимо учитывать при программировании. Оказывается, недостаточно обойтись лишь одной программой и моделью выполнения. Поэтому вычисления становятся всё более «гибридными».

Кластеры и ядра

На данный момент компьютеры с большим количеством вычислительных ядер используются повсеместно и практически каждый пользователь сталкивается с технологиями распараллеливания. Современные тактовые частоты достигли своего предела на значении 2-5 ГГц. Следовательно, единственный способ повышения вычислительной мощности — увеличение количества ядер. Из известного закона Мура логически вытекает закон ядер, в котором говорится, что количество ядер на доступной площади увеличивается экспоненциально.

Прямым следствием из этого закона является уменьшение вычислительной нагрузки на ядро (например, кэш-памяти и количества каналов памяти). Современные многоядерные компьютеры имеют до 16 ядер, но только 4 канала памяти.

Как правило, их объединяют в узлы с общей памятью, чтобы повысить производительность и получить впечатляющую вычислительную мощность в Гфлоп/с (то есть в миллиардах операций с плавающей точкой в секунду). Некоторые из этих узлов затем интегрируются в кластеры с помощью высокоскоростных соединений. Таким образом можно обеспечить почти неограниченные объёмы памяти и вычислительные ресурсы в (Гига, Тера, Пета)флоп/с. Единственным ограничением будет ваш бюджет и площадь помещения.

В наши дни кластерная система должна иметь минимум 100 000 ядер, чтобы попасть в рейтинг TOP500 list.

Достижение пределов

Кластер представляет собой систему с распределённой памятью, в которой взаимодействие между узлами осуществляется путём передачи «сообщений». В системах с распределённой памятью стандартом является Интерфейс передачи сообщений (MPI — Message Passing Interface). В настоящее время есть как бесплатные, так и коммерческие реализации данного стандарта. С другой стороны, стандарт OpenMP (Open Multi-Processing) используется в системах с общей памятью.

Необходимо заметить, что при численном моделировании сразу видны ограничения многоядерных платформ. В реальных системах очень сложно сразу передать большие объёмы информации, чтобы загрузить расчётами все ядра. Также необходимо учитывать вычислительную интенсивность. Это — характеристика алгоритма, которая выражается в количестве флоп на каждый вычислительный элемент. Она показывает максимально достижимую производительность.

Если вычислительная интенсивность увеличивается линейно с размером задачи, ширина полосы пропускания не будет ограничивать производительность. Решение разреженной векторной матрицы — это типовая задача моделирования МКЭ (методом конечных элементов), которая связана с пропускной способностью, ширина которой обычно пропорциональна количеству каналов памяти в многоядерной системе. После достижения максимума пропускной способности, добавление дополнительных ядер не принесёт прироста в производительности. Из-за этого ускорение на многоядерных процессорах с общей памятью часто достигает предела, хотя ещё не все ядра задействованы в вычислениях. С другой стороны, кластерные системы имеют преимущество в виде увеличения пропускной способности при достижении максимума и, следовательно, повышения производительности. (Подробнее о ограничениях пропускной способности в синтетических тестах можно посмотреть здесь.)

Со стороны аппаратного обеспечения были попытки уменьшить ограничения пропускной способности путём многоуровневого кэширования. Существует несколько уровней кэша, начиная с первого с одним ядром и килобайтами памяти, заканчивая кэшами 3 уровня, которые имеют совместно используемую память между несколькими ядрами и память в десятки мегабайт. Кэш — это промежуточный буфер хранения данных, которые могут потребоваться повторно, как можно ближе к ядрам. Таким образом, они не будут переноситься из основной памяти снова и снова. Это снимает некоторую нагрузку с каналов памяти.

Даже на одном многоядерном процессоре можно осуществить многоуровневое кэширование. Однако, добавление многоядерных процессоров на каждый сокет может привести к созданию узла совместной памяти с неоднородным доступом к памяти (НОДП). Другими словами, некоторые данные хранятся в локальной памяти близко к ядру, а некоторые — в удалённых местах. Поэтому к некоторым данным доступ осуществляется очень быстро, а к другим — с большими задержками. Из этого можно сделать вывод, что правильное размещение данных и их распределение играют важную роль в производительности.

Пару слов про иерархию памяти и производительность

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

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

Если задача становится всё трудней и трудней, менеджер может попросить помочь дополнительные локации. Предположим, что конференц-залы расположены в Бостоне, Москве, Лондоне, Париже и Мюнхене. Эти удалённые местоположения представляют собой распределённую память. Теперь менеджер может добавлять новые локации по мере необходимости, к примеру, он может подключить к общей работе конференц-зал из Стокгольма. Или, с точки зрения гибридных вычислений, он (менеджер) может добавлять дополнительные процессы (то есть конференц-залы) на каждый узел общей памяти (то есть локацию).

В каждом конференц-зале (процесс) на большом столе лежит телефон, по которому сотрудники могут связаться с другими конференц-залами (другие процессы) и запросить необходимые данные (передача сообщений). Местный персонал (ограниченные ресурсы) сидит вокруг каждого конференц-стола в определённом месте. В этой аналогии каждого сотрудника можно представить, как поток, который помогает решать задачи за конференц-столом.

На столе локальные данные доступны в виде отчётов (кэш первого уровня), папок (кэш второго уровня), папок, лежащих в кабинетах, (кэш третьего уровня) в библиотеке на этаже (главная память) и в архиве на нижнем этаже (жёсткий диск). Несколько помощников (каналов памяти) работают в здании, чтобы доставлять запрошенную информацию из библиотеки или архива. Число таких помощников, равно как и количество информации и папок, которые они могут доставить одновременно, ограничено (полоса пропускания).

Наличие дополнительных людей за столом не принесёт никакой пользы, если нет необходимого количества ассистентов, которые будут приносить папки с данными. Естественно, менеджер должен убедиться, что необходимые данные доступны на столе, и все сотрудники могут эффективно работать, решая задачу. Также необходимо следить за тем, чтобы количество звонков в другие конференц-залы сводилось к минимуму. Проще говоря: реализация должна быть иерархично-ориентирована, данные — как можно более локализованы, а количество сообщений — минимально.

Телефонные звонки представляют интерфейс передачи сообщений (стандарт MPI) между процессами. Локация с конференц-залом — это узел с общей памятью. Для быстрой работы требуется идеальное взаимодействие распределённой (стандарт MPI) и совместной памяти (стандарт OpenMP).

Пример конфигурации гибридного кластера

Давайте подробно рассмотрим некоторые возможные конфигурации кластера и ядра. В нашей учебной модели ниже мы рассмотрели небольшой кластер, который состоит из трёх разделяемых узлов памяти. Каждый узел имеет два сокета с четырёх-ядерным процессором в каждом. Общее число ядер — 24. У каждого процессора есть локальная и основная память с архитектурой NUMA (англ. Non Uniform Memory Access — неоднородный доступ к памяти).

Рассмотрим случаи, когда на этом кластере используются три, шесть, двенадцать и двадцать четыре процесса по стандарту MPI. В первом случае мы имеем один процесс на узел и 8 потоков на процесс, которые могут взаимодействовать через общую память по стандарту OpenMP внутри узла и через два сокета узла. С шестью процессами у нас будет один процесс на сокет, то есть один на каждый процессор. Каждому процессу необходимо четыре потока. Для двенадцати процессов мы получаем по два процесса на процессор с двумя потоками каждый. Наконец, мы получаем один процесс на ядро, используя систему с 24 процессами. В последнем случае гибридные вычисления не нужны, так как вся связь происходит через распределённую память.

Какая наилучшая конфигурация на Ваш взгляд?

MPI configurations Гибридные вычисления: Преимущества совместного использования общей и распределённой памяти
Различные конфигурации кластера с тремя узлами общей памяти, двумя сокетами, содержащими 4-х ядерный процессор на каждый, и локальными блоками памяти.

Зачем использовать гибридные вычисления?

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

Так почему бы не использовать передачу сообщений глобально между всеми 24-мя процессами стандарта MPI, как в примере выше? Конечно, это, в принципе, возможно; вы можете передавать сообщения между ядрами в одном узле с общей памятью. По аналогии с конференц-залом это можно представить следующим образом: каждый сотрудник будет иметь собственный телефон и звонить другим сотрудникам по всему миру. Телефонная линия будет постоянно занята и люди не смогут нормально работать.

Фактически, в реальных системах всё ещё более сложно. Одним из недостатков стандарта MPI является то, что ресурсы памяти уменьшаются квадратично процессам, участвующим в вычислениях. Это происходит из-за того, что внутренние буферы настраиваются в местах хранения данных до того, как процессы начинают обмениваться сообщениями. Для 106 ядер потребуется 1012 внутренних буферов памяти для единичного глобального вызова связи (в случае, если мы игнорируем иерархию). В гибридных вычислениях количество процессов обычно меньше, чем число вычислительных ядер. Таким образом, сохраняются свободные ресурсы памяти и передачи данных.

Некоторые алгоритмы, такие как: размещение данных, настройка взаимодействия потоков, распределение нагрузки требуют специально-ориентированных знаний от программиста. Гибридная модель гораздо более универсальна. Она совмещает в себе преимущества как глобального, так и дискретного подхода к памяти. Таким образом, предпочтительней выбирать гибридный метод, совмещающий стандарты OpenMP и MPI, а также соответствующий гибридной структуре памяти и ядра, как показано на рисунке.

Самое главное, что гибридная модель легко адаптируема, что позволяет уменьшить накладные расходы и требования к ресурсам. Касательно конечно-элементного моделирования, иерархия в данных и задачах может получиться из физической модели, её геометрии, алгоритмов и используемых решателей. Затем их можно преобразовать в вычисления с общей и распределённой памятью.

Конечно, в итоге, гибридная модель — это гораздо более сложная система со всеми недостатками общей и распределённой памяти. Однако, конечный результат стоит того! COMSOL Multiphysics — это совокупность сложных структур данных и алгоритмов, которые в полной мере используют многоуровневое распараллеливание. Программа одновременно поддерживает как общую, так и распределённую память. Вы, как пользователь, можете настраивать их взаимодействие в параметрах для достижения наилучшей производительности.

Сравнительная оценка производительности моделей

После всех этих теоретических разъяснений, перейдём к реальным моделям и расчётам. Думаю, вам интересно узнать, как можно повысить производительность, увеличить ускорение и масштабируемость, используя COMSOL Multiphysics параллельно на вычислительных серверах и кластерах в вашем отделе.

В начале важно определиться с размером задачи. Размер подзадач в узле с общей памятью для каждого потока должен быть достаточно большим, также как и отношение вычислений на процесс к количеству данных, передаваемых в сообщениях между процессами. Это необходимо, чтобы обеспечивалось рациональное использование ресурсов. В одной из наших предыдущих статей блога мы рассмотрели основы распараллеливания задач. Например, вы настраиваете модель на решение нестационарных динамических рядов (которые могут решаться часами). Однако, размер задачи на каждом временном шаге небольшой. В таком случае вы не получите существенного прироста в скорости, добавив дополнительные узлы и ядра.

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

Исследование гибридной масштабируемости

В нашем тестовом примере давайте рассмотрим задачу на механику конструкций и модель 10-спицевого диска колеса, в котором рассчитывается давление в шинах и распределение нагрузки.

Model of a wheel rim Гибридные вычисления: Преимущества совместного использования общей и распределённой памяти
Модель диска колеса и соответствующая уточняющая подмодель.

При моделировании мы использовали три вычислительных узлах, о которых писали выше. Каждый узел имеет два сокета с четырёхядерным процессором Intel Xeon® E5-2609, 64 Гб ОЗУ, из которых 32 Гб — это локальная память процессора. Узлы соединены между собой довольно медленной Гигабитной сетью по стандарту ethernet. В целом, у нас есть 24 доступных ядра.

На гистограмме ниже мы сравнили количество циклов моделирования этой модели в день в зависимости от настройки гибридных вычислений. Мы рассмотрели случаи запуска 1, 2, 3, 6, 12 и 24 процессов по стандарту MPI. Соответственно, в зависимости от настройки, получается 1, 2, 3, 4, 6, 8, 12, 16 и 24 активных ядер. Над каждой колонкой вы видите обозначение конфигурации в формате nn*np, где nn — это количество процессов, np — количество потоков на процесс, а их произведение nn*np — это количество активных ядер. Для наглядности мы распределили колонки по блокам в зависимости от количества активных ядер.

В целом, по гистограмме видно, что производительность увеличивается с количеством активных ядер. Однако есть небольшие вариации этих конфигураций. Например, при использовании всех 24 активных ядер мы видим, что наиболее эффективно задать один процесс на сокет, то есть 6 процессов в общей сложности. А производительность трёхузловой системы с гибридной конфигурацией (случай 6×4) более чем в два раза выше производительности на одном узле с общей памятью (случай 1×8). При одинаковом количестве используемых ядер трёхузловая система также на 30% эффективней, чем полностью распределённая (случай 24×1).

Сравнивая полностью распределённые системы (случаи 12×1 и 24×1), мы видим, что реального увеличения производительности нет, несмотря на то, что количество ядер увеличилось в два раза. Всё дело в медленном соединении по стандарту ethernet. В данном случае увеличение количества процессов не эффективно. Однако, ситуация меняется при сравнении конфигураций 12×1 и 12×2. Количество активных ядер и потоков на процесс увеличивается вдвое, а выигрыш в производительности составляет примерно 15%. В этом случае количество переданных данных через сеть ethernet не увеличивается.

Benchmarking model using different configurations in a hybrid model Гибридные вычисления: Преимущества совместного использования общей и распределённой памяти
Сравнение различных конфигураций гибридных вычислений для модели диска колеса. По оси y отображена производительность в количестве циклов моделирований этой модели в день. Колонки отображают различные конфигурации в формате nn*np, где nn — это количество процессов, np — количество потоков на процесс.

Настройка гибридного режима в COMSOL Multiphysics

При запуске COMSOL Multiphysics в параллельном гибридном режиме вы можете настроить количество используемых процессов и потоков. Для этого перейдите во вкладку Preference (настройки), а затем в окно Multicoreand Cluster Computing. Либо в настройках Study откройте подузел Cluster Computing. Вы можете настроить модель в подузле Cluster Computing узла Job Configurations, где вы можете задать количество узлов на вычислительный кластер. В всплывающем меню узла настроек Settings можно настроить дополнительные параметры, например, количество процессов на узел.

Число используемых потоков на процесс устанавливается автоматически. Программное обеспечение COMSOL Multiphysics всегда использует максимальное количество доступных ядер. Количество ядер на процесс задаётся как число доступных ядер в узле, делённое на число процессов в узле. Чтобы настроить количество ядер на процесс, необходимо зайти в Preferences (настройки), открыть вкладку Multicore и в окне Number of processors задать требуемое значение.

В системах Linux в командной строке вы можете настроить количество процессов командой -nn, количество потоков на процесс — командой -np, командой -nnhost — количество процессов на узел. Nnhost определяется по умолчанию как единица, либо как число сокетов на узел.

Дальнейшие шаги

  • Обратитесь к документации COMSOL Multiphysics для настройки дополнительных параметров и примеров использования.
  • Наш последний блог серии по гибридному моделированию на тему расчета в пакетном (Batch) режиме.

Загрузка комментариев...

Темы публикаций


Теги

3D печать Cерия "Гибридное моделирование" Введение в среду разработки приложений Видео Волновые электромагнитные процессы Глазами пользователя Графен Интернет вещей Кластеры Моделирование высокочастотных электромагнитных явлений на различных пространственных масштабах Модуль AC/DC Модуль CFD Модуль MEMS Модуль Акустика Модуль Геометрическая оптика Модуль Механика конструкций Модуль Нелинейные конструкционные материалы Модуль Оптимизация Модуль Плазма Модуль Радиочастоты Модуль Роторная динамика Модуль Химические реакции Охлаждение испарением Пищевые технологии Рубрика Решатели Серия "Геотермальная энергия" Серия "Конструкционные материалы" Серия "Электрические машины" Серия “Моделирование зубчатых передач” Сертифицированные консультанты Термовязкостная акустика Технический контент Указания по применению модуле Теплопередача модуль Вычислительная гидродинамика физика спорта