Pull to refresh

Даунклокинг Ice Lake AVX-512

Reading time 6 min
Views 4.9K
Original author: Travis Downs
image

Это короткий пост об исследовании поведения AVX2 и AVX-512 в связи с лицензионным даунклокингом новых чипов Intel Ice Lake.

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

Подробности о подобном виде даунклокинга можно прочитать в этом ответе на StackOverflow, и мы уже довольно детально объясняли низкоуровневую механику подобных переходов. Также можно найти инструкции о том, как воспользоваться широкими SIMD (Single Instruction Multiple Data: тип или расширение архитектуры набора команд, например, Intel AVX или ARM NEON, способные выполнять множественные идентичные операции с элементами, упакованными в SIMD-регистр) с учётом этой проблемы2.

Информация по ссылкам написана в контексте Skylake-SP (SKX, серверной архитектуры Intel Skylake, включающей в себя Skylake-SP, Skylake-X и Skylake-W), которые стали первым поколением чипов с поддержкой AVX-512.

Какова же ситуация с Ice Lake — с самыми новыми чипами, поддерживающими как инструкции AVX-512 из SKX, так и имеющими совершенно новый набор инструкций AVX-512? Нам придётся смотреть на эти новые инструкции издалека, и мы никогда не сможем воспользоваться ими из-за даунклокинга?

Прочитайте статью, чтобы разобраться, или просто перейдите к разделу «Итоги».

AVX-Turbo


Мы будем использовать утилиту avx-turbo для измерения зависимости частот от количества ядер и набора инструкций. Этот инструмент работает просто: выполняет заданный набор инструкций на заданном количестве ядер, измеряя частоту, достигнутую во время теста.

Например, тест avx256_fma_t, измеряющий затраты на тяжёлые 256-битные инструкции с высокой ILP (Instruction level parallelism: величина параллелизма на межинструкционном уровне суперскалярного процессора), выполняет следующую последовательность FMA:

	vfmadd132pd ymm0,ymm10,ymm11
	vfmadd132pd ymm1,ymm10,ymm11
	vfmadd132pd ymm2,ymm10,ymm11
	vfmadd132pd ymm3,ymm10,ymm11
	vfmadd132pd ymm4,ymm10,ymm11
	vfmadd132pd ymm5,ymm10,ymm11
	vfmadd132pd ymm6,ymm10,ymm11
	vfmadd132pd ymm7,ymm10,ymm11
	vfmadd132pd ymm8,ymm10,ymm11
	vfmadd132pd ymm9,ymm10,ymm11
	; repeat 10x for a total of 100 FMAs

Суммарно мы используем пять тестов для проверки каждого сочетания лёгких и тяжёлых 256-битных и 512-битных инструкций, а также скалярных инструкций (128-битный SIMD ведёт себя так же, как и скалярные инструкции), введя в командной строке:

./avx-turbo --test=scalar_iadd,avx256_iadd,avx512_iadd,avx256_fma_t,avx512_fma_t

Результаты Ice Lake


Я запускал avx-turbo описанным выше образом на Ice Lake i5-1035G4 — клиентском процессоре Ice Lake среднего диапазона мощности, работающего с частотой до 3,7 ГГц. Полные результаты скрыты в gist, а здесь я представлю самые важные результаты по полученным частотам (все значения указаны в ГГц):

Набор инструкций Активные ядра
1 2 3 4
Скалярные/128-битные 3,7 3,6 3,3 3,3
Лёгкие 256-битные 3,7 3,6 3,3 3,3
Тяжёлые 256-битные 3,7 3,6 3,3 3,3
Лёгкие 512-битные 3,6 3,6 3,3 3,3
Тяжёлые 512-битные 3,6 3,6 3,3 3,3

Как и ожидалось, максимальное падение частоты происходит при увеличении количества активных ядер, но просмотрите вниз каждый столбец, чтобы оценить влияние на категории инструкций. Вдоль этой оси почти никакого даунклокинга не происходит! Только при одном активном ядре возникает снижение при широких инструкциях, и всего лишь на жалкие 100 МГц: с 3 700 МГц до 3 600 МГц при использовании любых 512-битных инструкций.

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

Виды лицензий


Здесь существует и ещё одно изменение. В архитектуре SKX есть три лицензии, или категории инструкций, относящихся к даунклокингу: L0, L1 и L2. Здесь, в клиентском ICL, их всего две3 и они неточно соответствуют трём категориям в SKX.

Лицензии в SKX соответствуют ширине и тяжести инструкций следующим образом:

Ширина Лёгкие Тяжёлые
Скалярные/128 L0 L0
256 L0 L1
512 L1 L2

В частности, обратите внимание на то, что тяжёлые 256-битные инструкции имеют ту же лицензию, что и лёгкие 512-битные.

В клиентских ICL схема такова:

Ширина Лёгкие Тяжёлые
Скалярные/128 L0 L0
256 L0 L0
512 L1 L1

Здесь тяжёлые 256-битные и лёгкие 512-битные инструкции находятся в разных категориях! На самом деле, похоже, здесь не применяется концепция противопоставления лёгких и тяжёлых инструкций: разбивка на категории целиком зависит от ширины4.

Ну и что?


Ну и что же из этого?

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

Однако это смена наших ожиданий имеет важный изъян: лицензионный даунклокинг не является единственным источником даунклокинга. Мы также можем столкнуться с ограничениями мощности, тепловыделения или тока. Некоторые конфигурации способны выполнять широкие SIMD-инструкции на всех ядрах только в течение короткого времени, а затем превышают пределы рабочей мощности. В моём случае ноутбук за 250 долларов, на котором проводилось тестирование, имел чрезвычайно плохое охлаждение, и вместо ограничений мощности я столкнулся с пределом тепловыделения (100°C) всего спустя несколько секунд после запуска тяжёлых инструкций на всех ядрах.

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

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

Итоги


Вот, какие выводы я сделал.

  • Процессор Ice Lake i5-1035 демонстрирует всего 100 МГц лицензионного даунклокинга с одним активным ядром при выполнении 512-битных инструкций.
  • Во всех прочих случаях даунклокинг отсутствует.
  • Турбочастота выполнения 512-битных инструкций на всех ядрах равна 3,3 ГГц, что составляет 89% от максимума частоты выполнения скалярных операций на одном ядре (3,7 ГГц), поэтому в рамках ограничений мощности и тепловыделения этот чип имеет очень «плоскую» частотную зависимость.
  • В отличие от архитектуры SKX, этот чип Ice Lake не использует разделение на «лёгкие»
    и «тяжёлые» инструкции для масштабирования частот: FMA-операции выполняются так же, как и более лёгкие операции.

То есть на клиентских ICL бояться даунклокинга не нужно. Только будущее покажет нам, относится ли это и к серверным ICL.

Обсуждения и общение


Этот пост можно обсудить на on Hacker News.

Если у вас есть вопросы или другая обратная связь, то можете оставить комментарий к оригиналу поста. Мне были бы также интересны результаты на других чипах ICL, например, на версиях i3 и i7: дайте мне знать, если у вас они есть, и мы сможем получить результаты.



Примечания


  1. Мне уже надоедает постоянно повторять лицензионный даунклокинг, поэтому я часто буду просто использовать термин «даунклокинг», но должно быть понятно, что подразумевается его лицензионная разновидность, а не прочие виды частотного троттлинга
  2. Обратите внимание, что Дэниел писал об этом гораздо больше, чем один раз.
  3. Видимы только две: возможно, по-прежнему существует три (или более) категорий, но они вызывают изменения только напряжений, а не частот.
  4. Можно было бы предположить, что это следствие того, что клиентские ICL имеют только один блок FMA во всех моделях: очень тяжёлые 512-битные операции с плавающей запятой невозможны. Однако это не согласуется с тем, что тяжёлые 256-битные инструкции всё равно остаются быстрыми: по-прежнему можно выполнять по 2x256-битных FMA на такт, и это точно такая же нагрузка с плавающей запятой, что и 1x512-битная FMA на такт. Скорее всего, на этом чипе операции с плавающей запятой не требуют лицензионной защиты от других операций с той же шириной, и основные затраты возникают при 512-битной ширине.
  5. Мне приходится говорить здесь в основном потому что, даже при отсутствии изменения частоты может присутствовать изменение напряжения, что вызывает период останова, когда ничего не выполняется, а также повышает мощность для выполнения последующих инструкций, которым может и не требоваться повышенное напряжения. Кроме того, существует нерассмотренная ещё нами концепция косвенного расширения, которая может позже расширять узкие операции до максимальной ширины, если старшие части регистров не обнулены инструкциями vzeroupper или vzeroall.
  6. Например, одно 512-битное целочисленное сложение обычно будет менее энергозатратным, чем две 256-битные операции, необходимые для вычисления того же результата, потому что избыточные затраты при выполнении растут с увеличением ширины нелинейно (в них входит почти всё, кроме самого выполнения).
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+13
Comments 5
Comments Comments 5

Articles