Опубликован: 30.05.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Нижегородский государственный университет им. Н.И.Лобачевского
Лекция 4:

Векторные расширения Intel Xeon Phi

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Векторизация и математические функции

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

Ранее мы установили факт наличия в наборе команд Intel Xeon Phi специальных инструкций для вычисления четырех математических функций. Как быть с остальными функциями?

Рассмотрим следующий фрагмент кода:

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]);
}

  

Казалось бы, мы видим вызов функции в теле цикла. Однако отчет векторизатора скажет нам о том, что цикл успешно векторизован. В чем же дело? Неужели в наборе команд все-таки есть векторный синус?

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

Во-первых, компилятор языка C имеет специальный модуль LibM, содержащий реализации основных математических функций. В случае если цикл не векторизовался или его не было вовсе, компилятор подставляет в машинный код вызовы функций LibM. Интересующиеся могут открыть файл math.h и обнаружить там значительное количество прототипов функций, удовлетворяющее потребностям многих прикладных программ. Указанные функции обычно присутствуют в редакции для одинарной и двойной точности.

Сравните производительность математических функций из LibM для разных компиляторов. Часто простая перекомпиляция программы с использованием Intel Compiler приводит к существенному сокращению времени работы.

Во-вторых, компиляторы Intel имеют в своем составе модуль SVML (short vector math library), содержащий реализации математических функций, подразумевающие их вычисление для короткого вектора аргументов. Возможные длины векторов определяются количеством чисел, которое может быть упаковано в xmm SSE), ymm (в AVX) и zmm (в векторных расширениях Intel Xeon Phi) регистр. Выясняется, что можно сократить время работы в расчете на вычисление значения функции в одной точке, если считать значения сразу в нескольких точках. Это обстоятельство обуславливает преимущество использования функций SVML против функций LibM. Компилятор автоматически использует функции SVML, если он может векторизовать цикл, а вызов математической функции – единственное, что ему мешает это сделать. В результате вычисления становятся векторными.

В-третьих, в некоторых случаях значение n в приведенном выше примере является достаточно большим, но при этом мы располагаем достаточными объемами памяти, чтобы сначала вычислить все n значений функции sinf(), а потом использовать их в расчетах. Это может быть сделано следующим образом с использованием функций модуля VML (vector math library), распространяемого в составе математической библиотеки Intel MKL (Math Kernel Library).

void test(float * a, float * b, float * c, int n)
{
  // В принципе, в данном примере можно обойтись без
  // использования дополнительной памяти, сохранив все
  // значения sin() в массиве c[] 
  float d[n];
  vsSin(n, a, d);
  #pragma simd
  #pragma vector aligned
  for (int i = 0; i < n; i++)
    c[i] = a[i] * b[i] + d[i];
}

На достаточно больших длинах использование VML способно привести к существенному выигрышу в производительности .

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

Заключение

В следующей лекции будут рассмотрены вопросы оптимизации приложений для Intel Xeon Phi, включая подробное изучение вопроса о векторизации вычислений в программах на языке C.

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Svetlana Svetlana
Svetlana Svetlana

Здравствуйие! Я хочу пройти курс Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi), в презентации самостоятельной работы №1 указаны логин и пароль для доступ на кластер и выполнения самостоятельных работ, но войти по такой паре логин-пароль не получается. Как предполагается выполнение самосоятельных работ в этом курсе?

Егор Кузьмин
Егор Кузьмин
Россия, г. Москва
Вера Борисова
Вера Борисова
Россия