Всегда ли лучше использовать новый синтаксис AVX, если это возможно?
Я думаю, что первый вопрос заключается в том, чтобы спросить, являются ли инструкции папок лучше, чем пара инструкций, отличных от папки. Складной занимает пару прочитанных и модифицируют инструкции, как этот
vmovdqa %xmm0, %xmm2
vpunpckhbw %xmm2, %xmm1, %xmm1
и «сворачивает» их в один комбинированный инструкции
vpunpckhbw %xmm0, %xmm1, %xmm2
С Ivy Bridge регистровой зарегистрировать команду перемещения может иметь нулевую задержку и может использовать нулевые порты исполнения. Однако пара развернутых команд по-прежнему считается двумя инструкциями на интерфейсе и, следовательно, может влиять на общую пропускную способность. Однако сложенная инструкция учитывает только одну инструкцию в интерфейсе, которая снижает давление на интерфейс без каких-либо побочных эффектов. Это может увеличить общую пропускную способность.
Однако для памяти, чтобы зарегистрировать движения складной может может иметь побочный эффект (в настоящее время some debate об этом), даже если он снижает давление на переднем конце. Причина заключается в том, что механизм внешнего порядка с точки зрения переднего плана видит только свернутую инструкцию (при условии, что this answer верен), и если по какой-то причине было бы более оптимальным изменить порядок чтения в памяти (поскольку это делает требуют выполнения портов и имеет латентность) независимо от других операций в сложенной инструкции, механизм отказа от заказа не сможет воспользоваться этим. Я наблюдал это впервые here.
Для вашей конкретной операции синтаксис AVX всегда лучше, так как он складывает регистр для регистрации перемещения. Однако, если у вас есть память для регистрации перемещения, то команда AVX в некоторых случаях может работать хуже, чем разворачиваемая пара инструкций SSE.
Обратите внимание, что в целом все же лучше использовать инструкции, закодированные в Vex. Но я думаю, что большинство компиляторов, если не все, теперь считают, что складывание всегда лучше, поэтому у вас нет возможности контролировать складку, кроме как с помощью сборки (даже не с внутренними функциями), а в некоторых случаях сообщая компилятору не компилироваться с помощью AVX.
Несколько дней, не так ли, просто для старых дней * mov al, 8 * :-) – Neil
@Neil Ах да, я жажду дней, когда 'rep movsb' считался SIMD. – fuz
Если вам необходимо поддерживать AVX, то ответ на ваш вопрос, скорее всего, будет спорным, поскольку существует высокая производительность для переключения между SSE-инструкциями старого типа (не-VEX) и инструкциями SSE/AVX, закодированными в VEX во время выполнения , Следовательно, это «все или ничего». –