в котором рассматриваются проблемы, связанные с массивом структур и структурой массивов для трехмерных векторов, и почему часто бывает ошибкой всегда пытаться SIMD одной операции вместо использования SIMD для параллельного выполнения нескольких операций.

у, чтобы иметь возможность вручную предсказать, сколько именно произвольной арифметики (то есть без разветвления или памяти, хотя это было бы тоже неплохо), код сборки x86-64 будет принимать конкретную архитектуру с учетом переупорядочения команд, суперскалярности, задержки, ИПЦ и т. д.

Что / описать правила должны соблюдаться для достижения этой цели?

Я думаю, что у меня есть некоторые предварительные правила, но я не смог найти никаких ссылок на разбивку любого примера кода до этого уровня детализации, поэтому мне пришлось принять некоторые предположения. (Например, руководство по оптимизации Intel едваупоминает переупорядочение инструкций.)

Как минимум, я ищу (1) подтверждение того, что каждое правило является правильным, или же правильное изложение каждого правила, и (2) список любых правил, которые я, возможно, забыл.

В каждом цикле выдается как можно больше инструкций, начиная с текущего цикла и, возможно, настолько далеко вперед, как размер буфера переупорядочения.Инструкция может быть выдана для данного цикла, если:Никакие инструкции, которые влияют на его операнды, все еще не выполняются. А также:Если это инструкция с плавающей запятой, каждая инструкция с плавающей запятой до того, как она была выполнена (инструкции с плавающей запятой имеют статический порядок команд). А также:Для этой инструкции имеется функциональная единица в этом цикле. Каждая (?) Функциональная единица является конвейерной, что означает, что она может принимать 1 новую инструкцию за цикл, а общее количество функциональных единиц составляет 1 / CPI для CPI данного класса функций (здесь туманно: предположительно, например,addps а такжеsubps использовать тот же функциональный блок? Как мне это определить?). А также:Меньше, чем суперскалярная ширина (обычно4) количество инструкций уже было выдано в этом цикле.Если никакие инструкции не могут быть выданы, процессор просто не выдает никаких - состояние, называемое «остановка».

В качестве примера рассмотрим следующий пример кода (который вычисляет перекрестный продукт):

shufps   xmm3, xmm2, 210
shufps   xmm0, xmm1, 201
shufps   xmm2, xmm2, 201
mulps    xmm0, xmm3
shufps   xmm1, xmm1, 210
mulps    xmm1, xmm2
subps    xmm0, xmm1

Моя попытка предсказать задержку для Haswell выглядит примерно так:

; `mulps`  Haswell latency=5, CPI=0.5
; `shufps` Haswell latency=1, CPI=1
; `subps`  Haswell latency=3, CPI=1

shufps   xmm3, xmm2, 210   ; cycle  1
shufps   xmm0, xmm1, 201   ; cycle  2
shufps   xmm2, xmm2, 201   ; cycle  3
mulps    xmm0, xmm3        ;   (superscalar execution)
shufps   xmm1, xmm1, 210   ; cycle  4
mulps    xmm1, xmm2        ; cycle  5
                           ; cycle  6 (stall `xmm0` and `xmm1`)
                           ; cycle  7 (stall `xmm1`)
                           ; cycle  8 (stall `xmm1`)
subps    xmm0, xmm1        ; cycle  9
                           ; cycle 10 (stall `xmm0`)

Ответы на вопрос(1)

Ваш ответ на вопрос