2016-07-04 4 views
4

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

AVX:

vpunpckhbw %xmm0, %xmm1, %xmm2 

SSSE3:

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

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

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

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

+5

Несколько дней, не так ли, просто для старых дней * mov al, 8 * :-) – Neil

+2

@Neil Ах да, я жажду дней, когда 'rep movsb' считался SIMD. – fuz

+1

Если вам необходимо поддерживать AVX, то ответ на ваш вопрос, скорее всего, будет спорным, поскольку существует высокая производительность для переключения между SSE-инструкциями старого типа (не-VEX) и инструкциями SSE/AVX, закодированными в VEX во время выполнения , Следовательно, это «все или ничего». –

ответ

4

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

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

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

и «сворачивает» их в один комбинированный инструкции

vpunpckhbw %xmm0, %xmm1, %xmm2 

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

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

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

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

+1

Да, всегда лучше использовать функцию неразрушающего назначения кодировки VEX, чтобы избежать инструкций reg-reg 'mov'. Я не думаю, что слово «сгиб» - это правильное слово для этого, хотя: размышление об этом как об объединении команды «movdqa» с операцией ALU - неправильная ментальная картина, IMO. Это не похоже на складывание нагрузки в инструкцию ALU, так как переименование регистра означает, что результат «punpckhbw% xmm1,% xmm2» уже записывался в другой физический регистр, чем любой из входов. Для терминологии уже принято «отключение mov»:/ –

+2

Не уверен, что вы имеете в виду «на процессоре Sandy Bridge ...команда [3 операнда] может работать хуже », даже в случае reg-reg. Это просто неправильно, если только« movdqa », с которой вы избавились, занял нужное пространство, чтобы выровнять что-то позже. Поскольку« movqda »все еще принимает порт выполнения на SnB (не IvB или более поздней версии), кодировку VEX, чтобы избежать еще большего выигрыша. –

+0

@PeterCordes, вы совершенно правы в своем комментарии к Sandy Bridge. Я вижу, что вы говорите о терминологии с момента складывания подразумевает слияние микроопераций, которое применяется к чтению/записи в памяти, но я думаю, что по аналогии сгибание в порядке. Складывание с помощью reg reg move эквивалентно перемещению mem reg, за исключением того, что оно не требует микроопераций и не использует порты. –

Смежные вопросы