Новый синтаксис инструкций AVX

У меня был C-код, написанный с некоторыми интеллектуальными процессорами. После того, как я скомпилировал его сначала с помощью avx, а затем с флагами ssse3, я получил два совершенно разных ассемблерных кода. Например:

AVX:

vpunpckhbw  %xmm0, %xmm1, %xmm2 

SSSE3:

movdqa %xmm0, %xmm2
punpckhbw %xmm1, %xmm2

Понятно, что vpunpckhbw - это просто punpckhbw, но с использованием синтаксиса ax трех операндов. Но является ли латентность и пропускная способность первой инструкции эквивалентной латентности и пропускной способности последних объединены? Или ответ зависит от архитектуры, которую я использую? Кстати, это IntelCore i5-6500.

Я попытался найти ответ в таблицах инструкций Agner Fog, но не смог найти ответ. Спецификации Intel также не помогли (однако, вероятно, я просто пропустил тот, который мне нужен).

Всегда ли лучше использовать новый синтаксис AVX, если это возможно?

Ответ 1

Всегда ли лучше использовать новый синтаксис AVX?

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

vmovdqa %xmm0, %xmm2
vpunpckhbw %xmm2, %xmm1, %xmm1

и "складывает" их в одну комбинированную инструкцию

vpunpckhbw  %xmm0, %xmm1, %xmm2

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

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

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


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