Что означает несколько значений или диапазонов в качестве задержки для одной инструкции? - PullRequest
1 голос
/ 29 марта 2020

У меня есть вопрос о задержке инструкций для https://uops.info/.

Для некоторых инструкций, таких как PCMPEQB(XMM, M128), указана задержка в записи таблицы для Skylake как [1;≤8]

Я немного знаю о задержке, но я знаю, что это всего лишь одно число !!! например, 1 или 2 или 3 или ... но что это [1;≤8] !!! ??? Это означает, что задержка зависит от памяти и составляет от 1 до 8?

Если это правда, когда это 1 .. когда это 3, et c?

Например, что такое задержка для этого:

pcmpeqb xmm0, xword [.my_aligned_data]

....
....

align 16
.my_aligned_data db 5,6,7,2,5,6,7,2,5,6,7,2,5,6,7,2

вот каково точное значение задержки для этого pcmpeqb xmm0, xword [.my_aligned_data] ???

или, например,

PMOVMSKB (R32, XMM)

задержка для этой инструкции есть (≤3) !!! что это значит ?! это означает, что задержка составляет от 1 до 3? Если это так, эта инструкция только для регистров !!! Итак, когда равно это 1 против любого более высокого числа?

1 Ответ

4 голосов
/ 29 марта 2020

Почему 2 числа, : разделены?

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

Поэтому в значении задержки есть 2 отдельных поля.

Нажмите на ссылку с номером задержки в https://uops.info/, чтобы узнать, какой операнд к какому результату и какой задержке.

https://www.uops.info/html-lat/SKL/PCMPEQB_XMM_M128-Measurements.html разрывы это для этой специфической инструкции c для Skylake, которая имеет 2 входа и один выход (в том же операнде, что и один из входов, потому что это версия не VEX. (Забавный факт: это позволяет сохранить микро сливается даже с индексным режимом адресации в HSW и более поздних версиях, в отличие от версии VEX)):

операнд 1 (r / w): регистр XMM
операнд 2 (r): память

  • Операнд задержки 1 → 1: 1
  • Операнд задержки 2 → 1 (адрес, базовый регистр): ≤8
  • Операнд задержки 2 → 1 (память) : ≤5

и ниже, что есть инструкция speci c последовательности, которые использовались для проверки этой инструкции.

В этом подробном разборе результаты тестирования uops.info действительно блестят по сравнению с любыми другими результатами тестирования или опубликованными числами, особенно для многопользовательских инструкций, таких как mul или shr reg, cl , например, для сдвигов задержка от рег или счетчика сдвигов до выхода составляет всего 1 цикл; дополнительные мопы предназначены только для объединения FLAGS.


Переменная задержка: почему ≤8

Задержка пересылки в магазине равна переменная в SnB семейство и генерация адреса / L1d Задержка использования нагрузки также может быть ( Существует ли штраф, если база + смещение находятся на странице, отличной от базы? ). Обратите внимание, что у этого есть операнд источника памяти. Но это , а не , почему задержка указана как ≤ n.

Значения задержки ≤n являются верхним пределом, я думаю. не означает, что задержка от этого операнда может быть столь же низкой, как 1.

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

Инструкции типа PMOVMSKB (R32, XMM), которые производят свои выходные данные в другом домене, чем их ввод, очень трудно определить. Вам необходимо использовать другие инструкции для перенаправьте вывод обратно во вход, чтобы создать цепочку зависимостей, перенесенную в oop, и сложно спланировать эксперименты, чтобы возложить вину на одну часть цепочки против другой.

Но в отличие от InstLatx64 , люди, стоящие за https://uops.info/, не просто сдались в этих случаях. Их тесты намного лучше, чем ничего!

Например, у магазина / перезагрузки есть некоторая задержка, но как выбрать, какой из них винить магазин в сравнении с нагрузкой? (Разумным выбором было бы указать задержку загрузки в качестве задержки использования нагрузки L1d, но, к сожалению, это , а не , что выбрал Агнер Фог . Его задержки по сравнению с задержками хранилища абсолютно произвольны, например, делится пополам или около того, что приводит к безумно низкой задержке загрузки, которая не является задержкой загрузки: /)

Существуют различные способы получения данных из целочисленных регистров обратно в регистры XMM в качестве входной зависимости для pmovmskb: ALU через movd или pinsrb/w/d/q, или загрузку. Или на процессорах AVX512 через kmov и затем с использованием маскированной инструкции. Ничто из этого не является простым, и вы не можете предположить, что задержка использования нагрузки для нагрузки SIMD будет такой же, как целочисленная загрузка. (Мы знаем, что задержка пересылки в хранилище выше.)

Как и в комментариях @BeeOnRope, uops.info, как правило, повторяет передачу в оба конца, а отображаемая задержка - это значение всего цикла, за вычетом любых известных инструкций заполнения, минус 1 . Например, если вы рассчитываете круговую поездку GP -> SIMD -> GP в 4 цикла (без заполнения), обе эти инструкции будут отображаться как <= 3. </strong>

Получая верхнюю границу для каждого, вы, вероятно, можете предположить, что любая инструкция имеет как минимум 1 тактовую задержку. например, для цепочки pmovmskb -> movd можно предположить, что movd имеет как минимум 1 цикл задержки, поэтому задержка pmovmskb составляет самое большее задержка туда-обратно минус 1. Но на самом деле она, вероятно, меньше.

* Например, 1100 *

https://www.uops.info/html-lat/SKL/DIVPD_XMM_M128-Measurements.html показывает разные «задержки цепи» для разных экспериментов. например, для одного из тестов 1 -> 1, который запускает divpd, а ORPD и ANDPD создают цепочку dep с одним и тем же дивидендом, uops.info перечисляет известную задержку этих дополнительных инструкций в цепочке dep. Это перечисляет это как Задержка цепи: ≥10 . (Теоретически оно может быть выше, если конфликт ресурсов или какой-либо другой эффект приводят к тому, что он не всегда дает результат ровно через 10 циклов после того, как выходные данные divpd были готовы. Цель этих экспериментов состоит в том, чтобы поймать странные эффекты, которые мы, возможно, не ожидали.) «Базовые циклы: 44,0» минус задержка цепочки не менее 10, можно сказать, что задержка divpd составляет не более 34, а остальная часть цепи депо составляет остальные 10 (но, возможно, больше).

(34.0 кажется высоким; возможно, я что-то неправильно истолковываю. Входные данные содержат много значительных битов мантиссы, по сравнению с экспериментом 2, который, я думаю, выполняет 1.0 / 1.0, и ничего больше в l oop, измеряющем 6 задержка цикла от XMM -> XMM как лучший случай.)

Обратите внимание, что я просто говорю о случае xmm -> xmm здесь, а не об их более сложных тестах, которые возвращают вывод XMM как зависимость для адрес или содержимое памяти.

...