Руководство Intel Intrinsics - Задержка и пропускная способность

Может ли кто-нибудь объяснить значения задержки и пропускной способности, указанные в Intel Intrinsic Guide?

Правильно ли я понял, что латентность - это количество единиц времени, которое требуется выполнить команде, и пропускная способность - это количество команд, которые могут быть запущены за единицу времени?

Если мое определение правильное, почему латентность для некоторых инструкций выше на более новых версиях ЦП (например, mulps)?

Ответ 1

Отсутствует эта таблица: время ожидания MULPS на Broadwell: 3. На Skylake: 4.

Внутренняя задержка поиска в этом случае является точной, хотя иногда не соответствует экспериментальному тестированию Agner Fog. (Эта задержка VEXTRACTF128 может быть случай Intel, не включающей байпасную задержку в их таблице). См. мой ответ на этот связанный вопрос для получения более подробной информации о том, что делать с номерами пропускной способности и задержки, а также то, что они означают для современного процессора не по заказу.

Задержка MULPS увеличилась с 4 (Nehalem) до 5 (Sandybridge). Возможно, это было для экономии энергии или транзисторов, но, скорее всего, потому, что SandyBridge стандартизовал затухания uop только для нескольких разных значений, чтобы избежать конфликта обратной записи: то есть, когда один и тот же исполнительный блок выдаст два результата в одном цикле, например. начиная с 2c uop на один цикл, затем на 1c на следующий цикл.

Это упрощает планировщик uop, который отправляет uops из Станции резервирования в исполнительные блоки. Более или менее в старейшем первом порядке, но у него есть фильтр, с помощью которого у них есть готовый вход. Планировщик энергопотреблен, и это значительная часть энергозатрат исполнения вне порядка. (К сожалению, не представляется возможным сделать планировщик, который выбирает uops в первом порядке первого порядка, чтобы избежать когда независимые uops крадут циклы из критического пути с конфликтами ресурсов.)

Агнер Фог объясняет то же самое (в разделе SnB его микроархива PDF):

Смешение μops с разными задержками

Предыдущие процессоры имеют конфликт обратной записи, когда μops с разные задержки выдаются на тот же порт выполнения, что и описанной на стр. 114. Эта проблема в значительной степени решена на Сэнди Мост. Задержки выполнения стандартизированы так, что все μops с латентность 3 выдается порту 1, а все микросхемы с задержкой в ​​5 раз к порту 0. μops с латентностью 1 могут перейти в порт 0, 1 или 5. Нет другого допускаются задержки, за исключением разделения и квадратного корня.

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

Хм, я просто понял, что числа Агнера для VEXTRACTF128 xmm, ymm, imm8 странны. Agner перечисляет его как 1 uop 2c latency на SnB, но Intel перечисляет его как 1c latency (как описано здесь). Возможно, исполнительный блок имеет задержку 1 с, но есть встроенная задержка байпаса 1 с (для пересечения полосы?), Прежде чем вы сможете использовать результат. Это объясняет несоответствие между числами Intel и экспериментальным испытанием Agner.


Некоторые инструкции по-прежнему сохраняют задержку в 2 с, поскольку они декодируют до 2 зависимых uops, каждая из которых занимает 1 с. MULPS - это один uop, даже версия AVX 256b, потому что даже процессоры Intel первого поколения AVX имеют полноразмерные 256-битные исполнительные модули (кроме блока divide/sqrt). Необходимость в два раза больше копий схемы умножителей FP является хорошей причиной для оптимизации ее сохранения транзисторов за счет латентности.


Этот шаблон поддерживает и включает Broadwell, AFAICT из поиска таблиц Agner. (Используя LibreOffice, я выбрал всю таблицу и сделал стандартный фильтр data- > filter- > , и посмотрел строки со столбцом C = 1 и столбец F = 4. (И затем повторите для 2.) Ищите любые uops, которые aren 't загружает или сохраняет.

Haswell придерживается шаблона только 1, 3 и 5 циклов ALU uop latencies (за исключением AESENC/AESDEC, который составляет 1 мкп для порта 5 с задержкой 7 с. И, конечно, DIVPS и SQRTPS). Там также CVTPI2PS xmm, mm, при 1 uop 4c латентности, но, возможно, что 3c для p1 uop и 1c байпасной задержки, способ, которым Agner Fog измерял это или неизбежно. VMOVMSKPS r32, ymm также 2c (против 3c для версии r32, xmm).

Бродвелл снизил время ожидания MULPS до 3, то же, что и ADDPS, но сохранил FMA в 5c. Предположительно, они выяснили, как сокращать блок FMA, чтобы произвести просто умножение, когда не было необходимости добавления.


Skylake может обрабатывать uops с задержкой = 4, Задержка для FMA, ADDPS/D и MULPS/D = 4 цикла. (SKL сбрасывает выделенный блок вектор-FP и делает все с блоком FMA. Таким образом, пропускная способность ADDPS/D удваивается, чтобы соответствовать MULPS/D и FMA... PS/D. Я не уверен, какое изменение мотивировало то, и вне зависимости от того, представили ли они 4-секундные инструкции по задержке, если бы они не захотели сбросить сумматор vec-FP без ущерба для задержки ADDPS слишком плохо.)

Другие инструкции SKL с задержкой 4c: PHMINPOSUW (по сравнению с 5c), AESDEC/AESENC, CVTDQ2PS (от 3c, но это может быть 3c + байпас), RCPPS (от 5c), RSQRTPS, CMPPS/D (вверх из 3в). Хм, я думаю, что сравнение FP было сделано в сумматоре, и теперь нужно использовать FMA.

MOVD r32, xmm и MOVD xmm, r32 указаны как 2c, возможно, байпасная задержка от int-vec до int? Или сбой в тестировании Агнера? Для проверки латентности потребуются другие инструкции для создания обратного хода назад к xmm. Это 1c на HSW. Agner перечисляет SKL MOVQ r64, xmm как 2 цикла (port0), но MOVQ xmm, r64 как 1c (port5), и кажется чрезвычайно странным, что чтение 64-битного регистра выполняется быстрее, чем чтение 32-битного регистра. У Агнера были ошибки в его столе в прошлом; это может быть другое.