27 июля 2011 г.

Доступно о параллельных вычислениях во FlowVision


Эта статья будет интересна не только пользователям FlowVision, а вообще всем, кто занимается параллельными расчетами в научных и инженерных расчетных комплексах.

  Суперкомпьютер "Ломоносов" в МГУ. Источник изображения: http://www.parallel.ru

В статье постарался отразить несколько моментов:
1. Особенности решения CFD задач
2. Чем отличаются различные способы параллелизации
3. Как использовать различные железные конфигурации, чтобы максимально ускорить расчет
 

Глоссарий

Все весьма упрощенно в данном глоссарии.


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

Ядра – несколько независимых вычислительных узлов в составе одного чипа – многоядерного процессора. Каждое ядро может производить независимые вычисления одновременно с другими ядрами. Процессор с одним ядром называется одноядерным процессором.

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

Частота оперативной памяти – величина, в самом первом приближении характеризующая количество операций чтения/записи данных в единицу времени.

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

Кеш память процессора – память малого объема, располагающаяся непосредственно в чипе процессора, благодаря чему достигается еще более высокая скорость доступа к информации.

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

Параллельное вычисление – выполнение нескольких разных частей одного расчета на двух и более ядрах одновременно, т.е. параллельно.

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

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

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

Гипертрейдинг (hyper threading) – технология Intel, позволяющая хранить в процессоре одновременно состояние двух поступивших элементарных вычислительных задач (двух потоков). В случае, если для выполнения одной из задач нужно подождать, когда, например, придут новые данные из оперативной памяти, то на простаивающие вычислительные блоки поступит второй поток – вторая задача. Данная технология, как правило, дает преимущество только для задач не сильно зависящих от оперативной памяти, т.е. для задач CFD эта технология не вредна и не полезна. В операционной системе процессор с включенным гипертрейдингом выглядит как процессор с удвоенным числом ядер.

Что такое параллельные вычисления во FlowVision

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

Для того чтобы выполнять во FlowVision расчет в несколько потоков параллельно, необходимо разделить систему уравнений на части и запустить их решение на нескольких процессорах/ядрах одновременно. В теории, разделив систему уравнений на n равных частей и запустив их расчет параллельно, мы можем ускорить расчет в n раз. Однако решение системы уравнений не может быть разделено на n независимых частей, необходимо тратить время на обмен данными между частями системы уравнений в процессе расчета. Чем больше частей, тем больше времени требуется на обмен. При определенном соотношении количества задействованных ядер и числа уравнений в системе, время на обмен данными между процессорами (частями системы уравнений) может превысить время решения задачи на одном процессоре. Т.е. возможно не только не ускорить расчет, но и замедлить его.

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


Рис.1. Декомпозиция расчетной сетки на нескольких процессорах.

Если расчетная сетка слишком неравномерная (точечные участки с высоким уровнем адаптации), то эффективность автоматического разбиения падает, а значит и падает качество распараллеливания. На рисунке 2 представлено почти идеальное равномерное распределение сетки по процессорам.


Рис. 2. Декомпозиция расчетной сетки

Способы распараллеливания во FlowVision

Существует множество технологий для реализации параллельных вычислений. Во FlowVision применяются две технологии и их совместное использование:

Распараллеливание с использованием «Нитей» (http://ru.wikipedia.org/wiki/Tbb) . Эта технология позволяет решать параллельно уравнения в рамках общей оперативной памяти (каждый процессор имеет свою собственную независимую память; когда несколько ядер процессора имеют прямой доступ ко всей или части оперативной памяти процессора, говорят об общей памяти). Т.е. возможно раздать некий объем вычислений для всех ядер, которые имеют прямой доступ к блоку оперативной памяти. Главным преимуществом такого подхода является возможность автоматической передачи избыточного объема вычислений с одного ядра, на другое освободившееся. Кроме того, для использования этой технологии нет необходимости устанавливать сторонне ПО (например MPIСH), также не требуется никаких дополнительных настроек, достаточно лишь поставить галочку «Использовать все ядра» при запуске солвера.

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

Комбинирование «Нитей» и MPI.При запуске расчета на нескольких процессорах лучше всего комбинировать два этих подхода, т.е. запускать столько MPI процессов, сколько планируется использовать процессоров. А уже в рамках каждого процессора использовать «Нити» в количестве равном числу ядер.


Что такое масштабируемость

Масштабируемость – свойство программно-аппаратного комплекса, характеризующее качество распараллеливания программы на конкретном оборудовании с конкретными настройками программы. Если скорость получения результата растет с увеличением числа процессоров, то говорят о хорошей масштабируемости на данном числе процессоров. Если скорость не растет, падает или растет незначительно с увеличением числа процессоров, то говорят о плохой масштабируемости.


Рис. 3. Масштабируемость одной из задач FlowVision

Идеальная масштабируемость программно-аппаратного комплекса соответствует линейной зависимости скорости получения результата от числа процессоров (см. синюю линию на рис. 3), т.е. во сколько раз увеличится число процессоров, во столько раз ускорится расчет. Расходы времени на обмен данными между процессорами/ядрами приводит ко все большим потерям с увеличением числа процессоров. Зеленая линия на рис. 3 иллюстрирует масштабируемость одной реальной задачи, решаемой во FlowVision.

Говорить о масштабируемости FlowVision отдельно от параметров вычислительной техники или от особенности проекта нельзя, т.к. на масштабируемость влияет большое количество факторов.

На что тратится время в процессе расчета

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

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

Передача данных между ядрами процессора или процессорами на одной материнской плате
В многопроцессорном режиме возникает необходимость обмениваться данными между ядрами/процессорами. Современные процессоры имеют архитектуру с интегрированным контроллером памяти, что позволяет значительно быстрее выгружать данные в оперативную память и загружать их от туда. Т.е. время такого обмена зависит от архитектурных особенностей процессора. Кроме того, многоканальный режим работы оперативной памяти значительно увеличивает ее пропускную способность.

Передача данных между процессорами с разных материнских плат

Как правило, скорость обмена данными между ядрами и процессорами на одной материнской плате много выше, чем скорость обмена данными через Ethernet, Infiniband и т.п.
Необходимо обеспечить наиболее высокую производительность так называемого «интерконнекта» - сетевого интерфейса между процессорами разных узлов.

Построение слоев в процессе расчета
Если во время расчета к Солверу подключено средство просмотра (модуль визуализации или Пре-Постпроцессор), то Солвер тратит время с каждой новой итерацией на вычисление данных для построения стандартных и пользовательских слоев и характеристик. Для ускорения расчета иногда целесообразно не оставлять постоянно активной связь между Пре-Постпроцессором и Солвером, кроме того, какое-то время тратится на передачу данных с солвера на клиентский модуль по сети.

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

Оценка оптимального режима запуска Солвера

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

Основным критерием для приближенной оценки потребных ресурсов может служить размерность задачи (количество расчетных ячеек). Для современных процессоров и интерконнектов высокая масштабируемость достигается при распределении 20 000 – 100 000 ячеек на одно ядро. Можно оценить число потребных ядер по этой рекомендации, а затем запустить задачу на близких числах ядер, выбрав оптимальный вариант.
Очевидно, что слишком малое число ячеек также не выгодно параллелить на большое число ядер, т.к. время обмена снова будет выше времени расчета.

При соединении процессоров через медленную сеть (интерконнект), например 100Мб/с, оптимальное число ячеек на ядро будет большим. При меньшем числе ячеек распараллеливание просто нецелесообразно, т.к. обмен данными будет занимать много больше времени, чем будет выиграно времени за счет параллельного решения уравнений.

При запуске расчета на кластере с процессорами разной производительности важно понимать, что на каждой итерации наиболее быстрый процессор будет простаивать в ожидании окончания расчета наиболее медленного процессора. Мы крайне не рекомендуем создавать кластеры с неоднородной аппаратной конфигурацией.

Заключение

Масштабируемость расчета во FlowVision зависит от конфигурации аппаратной части, от режима запуска и от особенностей задачи.

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

Для расчета в рамках одного процессора используйте «Нитевой» (многоядерный, без использования MPI) режим запуска.Для расчета на нескольких процессорах используйте смешанный режим запуска (MPI процессы на процессорах; «Нити» внутри процессоров - на ядрах). Если пропускная способность оперативной памяти слишком низка, а интерконнект достаточно быстр, то становится целесообразно загружать лишь часть процессора в многопроцессорном режиме. Т.е. в таком случае попробуйте запускать на нескольких четырехядерных процессорах расчет таким образом, чтобы на каждом процессоре занимать только половину или меньше ядер. В этом случае объем данных для переброски между процессором и оперативной памятью заметно снизится.

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

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

Двумерные задачи и задачи с равномерной сеткой являются хорошо масштабируемыми. Такие задачи как правило удается запускать в режиме до 15 000 ячеек на ядро с масштабируемостью близкой к идеальной.

Комментариев нет:

Отправить комментарий