Ответ 1
Всегда ли лучше использовать новый синтаксис AVX?
Я думаю, что первый вопрос заключается в том, чтобы спросить, лучше ли инструкции папок, чем пара инструкций, отличных от папки. Складывание выполняет пару команд чтения и изменения, таких как
vmovdqa %xmm0, %xmm2
vpunpckhbw %xmm2, %xmm1, %xmm1
и "складывает" их в одну комбинированную инструкцию
vpunpckhbw %xmm0, %xmm1, %xmm2
Так как Ivy Bridge регистр для регистрации команды перемещения может иметь нулевую задержку и может использовать нулевые порты выполнения. Однако пара развернутых команд по-прежнему считается двумя инструкциями на интерфейсе и, следовательно, может влиять на общую пропускную способность. Однако сложенная инструкция учитывает только одну инструкцию в интерфейсе, которая снижает давление на интерфейс без каких-либо побочных эффектов. Это может увеличить общую пропускную способность.
Тем не менее, для того, чтобы память регистрировалась, сгибание может может иметь побочный эффект (в настоящее время некоторые обсуждения об этом), даже если он снижает давление на интерфейс. Причина в том, что механизм внешнего порядка с точки зрения переднего плана видит только свернутую инструкцию (предполагая этот ответ) и если по какой-то причине было бы более оптимальным переупорядочить операцию чтения памяти (поскольку она требует выполнения портов выполнения и имеет задержку) независимо от других операций в сложенной инструкции, механизм отставания не сможет воспользоваться этим. Я заметил это впервые здесь.
Для вашей конкретной операции синтаксис AVX всегда лучше, так как он складывает регистр для регистрации перемещения. Тем не менее, если у вас есть память для регистрации, папка с инструкцией AVX может работать хуже, чем разворачиваемая пара инструкций SSE в некоторых случаях.
Обратите внимание, что в целом все равно лучше использовать команды, закодированные в Vex. Но я думаю, что большинство компиляторов, если не все, теперь считают, что сворачивание всегда лучше, поэтому у вас нет возможности контролировать сворачивание, кроме как с помощью сборки (даже с внутренними функциями), а в некоторых случаях сообщая компилятору не компилировать с помощью AVX.