- PVSM.RU - https://www.pvsm.ru -

Ускоряем трафаретные вычисления: сборка и запуск YASK на процессорах Intel

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

Высокопроизводительные вычисления (HPC, High Performance Computing), идёт ли речь о суперкомпьютере, или о системе, построенной на одном-двух многоядерных процессорах – это вычисления параллельные. Если алгоритм поддаётся разбивке на блоки, которые можно обрабатывать одновременно, это значит, что он способен будет эффективно исполняться в параллельной среде. Но не только это важно: не стоит забывать об оптимизации кода, учитывающей, кроме прочего, особенности работы с данными на уровне отдельных видов памяти, доступной процессорам. В частности, речь идёт об эффективной работе с кэш-памятью.

Ускоряем трафаретные вычисления: сборка и запуск YASK на процессорах Intel - 1 [1]

При прочих равных условиях, распараллеленный алгоритм, который лучше всего учитывает особенности кэш-памяти, будет работать быстрее других. И, естественно, если говорить о скорости вычислений, то код, который наиболее полно использует возможности конкретной платформы, на уровне инструкций и архитектуры процессора, окажется в выигрыше. Существуют специализированные программные пакеты для подготовки такого кода. Один из них – YASK.

Что такое YASK

YASK [2], или Yet Another Stencil Kernel – это набор инструментов для разработки приложений, использующих трафаретные вычисления, призванный облегчить исследование и проектирование вычислительных ядер HPC и их оптимизацию. YASK задействует такие техники, как свёртка векторов, разбиение циклов на блоки для повышения эффективности использования кэш-памяти, управление размещением данных в памяти, настройка структуры циклов, временное разбиение на блоки волн вычислений и другие.

YASK содержит специализированный транслятор, который конвертирует обычную трафаретную программу на C++ в SIMD-оптимизированный код.

Здесь мы поговорим о настройке вычислительных ядер для процессоров Intel Xeon Phi и Intel Xeon. А именно, такая настройка способна заставить код на Xeon Phi работать до 2.8 раз быстрее, чем на Intel Xeon.

Преимущества в производительности у Intel Xeon Phi можно отнести к более высокой пропускной способности его подсистемы памяти и 512-битным SIMD-инструкциям.

О трафаретных вычислениях

Очень важная сфера высокопроизводительных вычислений заключается в использовании трафаретных вычислений для работы с временными и пространственными значениями данных. Например, ядро типичного трёхмерного итеративного трафаретного алгоритма Якоби можно показать в следующем псевдокоде, который обходит точки в трёхмерной сетке:

for t = 1 to T do
  for i = 1 to Dx do
    for j = 1 to Dy do
       for k = 1 to Dz do
          u(t + 1, i, j, k) ← S(t, i, j, k)
      end for
    end for
  end for
end for

Здесь T – это количество шагов по параметру времени, Dx, Dy, и Dz – размерности пространства задачи а S(t, i, j, k) – трафаретная функция.

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

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

Вот, как выглядит типичная модель работы с YASK.

Ускоряем трафаретные вычисления: сборка и запуск YASK на процессорах Intel - 2

Высокоуровневая модель работы с YASK

Начало работы

Полное руководство по работе с YASK можно найти на сайте YASK [3]. Здесь мы рассмотрим сборку и запуск заданий YASK на Intel Xeon Phi и Intel Xeon, но сначала поговорим о некоторых методах оптимизации, применяемых в данном наборе инструментов.

Многомерная векторизация

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

Тонкая настройка структуры циклов

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

Есть три основных подхода к настройке циклов:

  • «Rank» – задача разбивается на области OpenMP.
  • «Region» – области OpenMP разбивают на блоки кэша.
  • «Block» – производится проход по каждому векторному кластеру в блоке кэша.

Исследование производительности вычислений

Здесь мы рассмотрим два примера сборки и запуска ядер YASK на процессорах Intel Xeon и Intel Xeon Phi.

В системе на Intel Xeon задействован процессор Dual Socket Intel Xeon E5-2697 v4 2.3 ГГц с включенным режимом Turbo. На один сокет приходится 18 ядер, всего в системе 36 ядер (72 потока, режим HT включён). Тестовая платформа оснащена 128 Гб DDR4-памяти (2400 МГц), на ней установлена ОС Red Hat Enterprise Linux Server 7.2.

В системе на Intel Xeon Phi используется процессор Intel Xeon Phi 7250 (68 ядер, 272 потока). Частота ядра составляет 1400 МГц, частота вспомогательных систем процессора – 1700 МГц. Здесь имеется 16 Гб MCDRAM, 7.2 Гт/с (используется режим Flat). В системе есть 96 Гб DDR4-памяти (2400 МГц), используется режим quad cluster. Версия BIOS – 86B.0010.R00, установленная ОС – Red Hat Enterprise Linux Server 6.7.

Код, инструкции по сборке и запуску которого мы рассмотрим ниже, можно загрузить отсюда [5].

Задача AWP-ODC

Одно из вычислительных трафаретных ядер, включённых в YASK – это awp-odc [6]. Здесь используется сетка с двойной системой узлов, ядро реализует метод конечных разностей, используемый для приближённого решения трёхмерных динамических уравнений теории упругости. Приложения, которые используют это ядро, моделируют эффект землетрясений, что помогает проектировать сооружения, находящиеся в зоне риска. Пространство задачи состоит из 1024*384*768 узлов сетки. Использование процессора Intel Xeon Phi 7250 для решения данной задачи даёт прирост в производительности до 2.8 раз по сравнению с процессором Intel Xeon E5-2697 v4.

Ускоряем трафаретные вычисления: сборка и запуск YASK на процессорах Intel - 3

Результаты тестирования на задаче AWP-ODC

Вот, как проведён этот тест.

В системе на Intel Xeon надо выполнить следующие команды:

make stencil=awp arch=hsw cluster=x=2,y=2,z=2 fold=y=8 omp_schedule=guided mpi=1
./stencil-run.sh -arch hsw -ranks 2 -bx 74 -by 192 -bz 20 -pz 2 -dx 512 -dy 384 -dz 768

В системе на Intel Xeon Phi это делается так:

make stencil=awp arch=knl INNER_BLOCK_LOOP_OPTS='prefetch(L1,L2)'
./stencil-run.sh -arch knl -bx 128 -by 32 -bz 32 -dx 1024 -dy 384 -dz 768

Задача ISO3DFD

Ещё одно трафаретное ядро, включённое в YASK – это iso3dfd. Оно занимается решением акустического изотропного волнового уравнения 16-го порядка дискретизации по пространству и 2-го порядка дискретизации по времени. Подобные вычисления используются в приложениях сейсмической визуализации, применяемыми компаниями, занимающимися сейсморазведкой, при поиске нефтяных и газовых месторождений. Пространство задачи состоит из 1536*1024*768 узлов сетки. Применение к этой задаче процессора Intel Xeon Phi 7250 позволяет улучшить производительность до 2.6 раз по сравнению с Intel Xeon E5-2697 v4.

Ускоряем трафаретные вычисления: сборка и запуск YASK на процессорах Intel - 4
Результаты тестирования на задаче ISO3DFD

Вот, как мы проводили это испытание.

В системе, построенной на базе Intel Xeon, используются следующие команды:

make stencil=iso3dfd arch=hsw mpi=1
./stencil-run.sh -arch hsw -ranks 2 -bx 256 -by 64 -bz 64 -dx 768 -dy 1024 -dz 768

На платформе, оснащённой Intel Xeon Phi, используется такая последовательность команд:

make stencil=iso3dfd arch=knl
./stencil-run.sh -arch knl -bx 192 -by 96 -bz 96 -dx 1536 -dy 1024 -dz 768

Итоги

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

Набор инструментов YASK и процессор Intel Xeon Phi 7250 способны дать науке и бизнесу всё необходимое для быстрого решения сложных практических задач.

Автор: Intel

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/hpc/184481

Ссылки в тексте:

[1] Image: https://habrahabr.ru/company/intel/blog/305128/

[2] YASK: https://01.org/yask

[3] на сайте YASK: https://github.com/01org/yask/blob/master/docs/YASK-intro.pdf

[4] материал: https://software.intel.com/sites/default/files/managed/3b/f4/vec-folding-hpcc15.pdf

[5] отсюда: https://github.com/01org/yask

[6] awp-odc: http://hpgeoc.sdsc.edu/AWPODC

[7] Источник: https://habrahabr.ru/post/305128/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best