
- •Нижегородский государственный университет им. Н.И.Лобачевского
- •Содержание
- •Введение
- •Введение…
- •Введение
- •Векторные расширения. Краткий обзор
- •Введение
- •Типы данных и регистровый пул
- •Обзор основных типов операций
- •Расширенная поддержка математических функций
- •Векторизация в программах на языке высокого уровня
- •Введение
- •Способы векторизации
- •Векторизация. Используем векторизованные библиотеки
- •Векторизация. Используем ключи
- •Векторизация. Используем ключи и директивы компилятора
- •Использование директивы SIMD…
- •Использование директивы SIMD…
- •Использование директивы SIMD…
- •Использование директивы SIMD
- •Векторизация. Array Notation и Elemental Function в рамках технологии Intel Cilk Plus
- •Технология Array Notation…
- •Технология Array Notation…
- •Технология Array Notation: поддерживаемые операции…
- •Технология Array Notation: поддерживаемые операции…
- •Технология Array Notation: поддерживаемые операции
- •Технология Array Notation: принципы работы
- •Технология Array Notation: скалярное произведение
- •Технология Array Notation: динамические массивы
- •Элементарные функции…
- •Элементарные функции: способы вызова
- •Элементарные функции: ограничения
- •Векторизация. Интринсики и ассемблер
- •Использование отчетов компилятора
- •Векторизация и математические функции
- •Введение
- •Пример
- •Реализации математических функций
- •Реализации математических функций
- •Реализации математических функций. Точность
- •Векторизация и выравнивание данных
- •Выравнивание данных…
- •Выравнивание данных…
- •Выравнивание данных…
- •Выравнивание данных…
- •Выравнивание данных: использование параллелизма…
- •Выравнивание данных: использование параллелизма
- •Векторизация внешних циклов…
- •Векторизация внешних циклов…
- •Векторизация внешних циклов

Введение
Отдельно необходимо обсудить важный вопрос о сочетании векторизации и математических функций, вызываемых в циклах, так как именно на вычисление этих функций приходится основное время работы значительного числа прикладных программ.
Ранее мы установили факт наличия в наборе команд Intel Xeon Phi специальных инструкций для вычисления четырех математических функций.
Как быть с остальными функциями?
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
41 |
|
|

Пример
void test(float * a, float * b, float * c, int n)
{
#pragma simd
#pragma vector aligned
for (int i = 0; i < n; i++)
c[i] = a[i] * b[i] + sinf(a[i]);
}
Отчет: цикл векторизован.
Вопрос: как векторизуется синус?
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
42 |
|
|

Реализации математических функций
LibM – модуль компилятора.
ICC содержит быстрый LibM, оптимизированный под современные архитектуры.
SVML (short vector math library) – модуль компилятора ICC.
Используется, если цикл векторизован.
Мат. функции реализованы с использованием SIMD, вычисляются для короткого вектора аргументов. Длина вектора соответствует длине xmm, ymm, zmm регистра.
VML (vector math library) – часть библиотеки MKL. Используется при явном вызове функций (vsSin, vdSin…). Вычисляет значение функции в N точках.
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
43 |
|
|

Реализации математических функций
LibM (см. math.h). Перекомпиляция ICC в программах, активно использующих мат. функции, часто приводит к ускорению расчетов.
SVML vs. VML
VML может выигрывать у SVML на больших длинах, но не всегда (эффект существенно зависит от архитектуры).
for (int i = 0; i < n; i++)
c[i] = a[i] * b[i] + sinf(a[i]);
Не векторизован: LibM Векторизован: SVML VML: vsSin(n, a, c);
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
44 |
|
|

Реализации математических функций. Точность
Настройки, влияющие на точность (ICC):
-fp-model
-fimf-domain-exclusion
-fimf-precision
Настройки, влияющие на точность (MKL/VML):
Режимы High Accuracy (HA), Low Accuracy (LA), Enhanced Performance (EP).
Могут быть настроены для конкретного вызова.
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
45 |
|
|

Векторизация и выравнивание данных
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
46 |
|
|

Выравнивание данных…
При работе с Intel Xeon Phi необходимо выравнивать данные по границе в 64 Б.
Выравнивание статических массивов:
Выравнивание динамических массивов:
Помимо выделения выровненных данных в программе, для эффектной векторизации вашего кода необходимо сообщить компилятору о выравнивании в том месте кода, где эти данные непосредственно используются.
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
47 |
|
|

Выравнивание данных…
Допустим, используется цикл, который обращается к массиву A как A[i], и к массиву B как B[i+n1]. Здесь i – это счетчик цикла.
Для того чтобы компилятор использовал команды работы
свыровненными данными, ему необходимо сообщить:
–Адрес начала массивов A и B кратен 64 байтам. Используется конструкция __assume_aligned(A, 64). В случае если массивы выделены статически, ничего дополнительно делать не надо.
–Величина n1 кратна 16 (при размере типа данных в 4
байта). Эта информация может быть указана с помощью конструкции __assume(n1%16==0).
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
48 |
|
|

Выравнивание данных…
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
49 |
|
|

Выравнивание данных…
В качестве альтернативы предложенным конструкциям можно использовать директиву #pragma vector align перед телом векторизуемого цикла:
Обратите внимание, что данная директива относится ко всем массивам, используемым в рамках цикла.
Нижний Новгород, 2015 г. |
Векторные расширения Intel Xeon Phi |
50 |
|
|