Есть ли штраф за смешивание целочисленных инструкций x86-64 с инструкциями AVX1/2/512?

Я видел много сборок с AVX (все три разновидности), и во всех случаях, которые я видел, наиболее концентрированная инструкция является лучшей, которую выполняет код. Но, например, такие вещи, как выполнение загрузки в 32-битный регистр, а затем широковещательная передача во все дорожки для AVX512 или AVX2, говорят... не лучше ли/быстрее просто загрузить регистр, а затем переставить?

В частности, есть ли наказание за смешивание инструкций x86_64 и семейства AVX? Я знаю, что есть такой штраф за смешивание SSE и AVX в целом.

Я знаю, что мог бы проверить это, но я бы лучше поделился знаниями с массами, прежде чем браться за этот мини-проект. Я уверен, что кто-то это уже знает.


person JLV    schedule 19.02.2018    source источник
comment
Как можно было не перепутать инструкции? Инструкции AVX работают только с регистрами AVX и их операциями. Все остальное (самое главное управление потоком, а также почти все остальное) не может быть сделано с помощью инструкций AVX.   -  person Some programmer dude    schedule 19.02.2018
comment
Вопрос в том, есть ли штраф. Другими словами, стоит ли тратить время на сокращение инструкций x64_32 в моем критическом пути или нет?   -  person JLV    schedule 19.02.2018
comment
Если вам не нужно перемещать данные из регистров AVX (или в такие регистры), штрафа быть не должно. И поскольку такие инструкции часто используются в циклах, возможность смешивания с инструкциями потока управления и другими инструкциями, не относящимися к AVX (для увеличения/уменьшения и сравнения со значениями, отличными от AVX), является своего рода требованием.   -  person Some programmer dude    schedule 19.02.2018
comment
И единственный способ убедиться в этом — измерить! И даже тогда вы не должны попасть в ловушку преждевременной оптимизации. Если вы не хотите писать сами на языке ассемблера, позвольте компилятору более высокого уровня (с включенной оптимизацией) справиться со всем этим. Используйте встроенные функции компилятора, если вам нужен именно AVX и компилятор не генерирует такой код автоматически. И если вам нужен высокий уровень параллелизма и SIMD-подобные инструкции, рассмотрите возможность использования специализированного для этого языка.   -  person Some programmer dude    schedule 19.02.2018
comment
Нет штрафа на уровне переключателя режимов SSE/AVX (который, кстати, удален в Skylake). Тем не менее, вы должны транслировать из памяти, где это возможно, это бесплатно (не хуже, чем обычная нагрузка), а все остальное - нет.   -  person harold    schedule 19.02.2018
comment
Связанный: Каков штраф за смешивание EVEX и Схема кодирования VEX?: ответ: штрафа нет.   -  person Peter Cordes    schedule 19.02.2018
comment
Вы пометили это [compiler-optimization], но из текста кажется, что вы говорите о написанном от руки ассемблере, а не о внутренних свойствах. В любом случае, прочитайте agner.org/optimize, чтобы узнать больше о настройке asm для современных процессоров. (Также другие ссылки на производительность в вики тега x86. vmovd / vmovq не бесплатны, но они не являются специальными или очень дорогой и имеет хорошую низкую задержку на процессорах Intel. vpextrd / vpinsrd между целым числом и xmm стоит movd + перетасовка, поэтому по возможности избегайте vpbroadcastd, безусловно, лучше всего, если данные начинаются в памяти   -  person Peter Cordes    schedule 19.02.2018
comment
@PeterCordes: Спасибо за ссылки. Я использую встроенные функции, я думал, что vpbroadcastd будет лучшим, но компилятор превращает мою встроенную функцию в move reg32, mem, за которым следует vpbroadcastd [reg256 или reg512] reg32... Я не знаю, как сказать ему просто выполнять трансляцию и пропустить загрузку в регистр x86 или x64.   -  person JLV    schedule 19.02.2018
comment
AVX512 все еще довольно новый; звучит как пропущенная оптимизация. Это просто ошибка, которая должна быть исправлена ​​в исходном коде компилятора, а не то, что вы можете контролировать с помощью опции. (Нет процессоров, где mem-›integer-›zmm лучше, так что не было бы смысла запрашивать это). Если вы используете старую версию компилятора, возможно, она уже исправлена. например gcc 6.4 или 7.3 являются текущими. Вы компилируете с включенной оптимизацией? лязг или gcc -O3 -march=skylake-avx512? Можете ли вы связать тестовый пример с gcc.godbolt.org?   -  person Peter Cordes    schedule 19.02.2018
comment
Кстати, только AVX512 имеет vpbroadcastd с источником GP-регистра. AVX2 имеет широковещательную передачу с источником регистра XMM, в то время как AVX1 только имеет vbroadcastss/sd с источником памяти. Обратите внимание, что версия vbroadcastss с исходным регистром предназначена только для AVX2.   -  person Peter Cordes    schedule 19.02.2018
comment
Случай, о котором я говорю, - это AVX512, я предполагал, что то же самое будет верно и для моих случаев для AVX2, но я не проверял разборку в них ... у меня было достаточно проблем с avx512. Я использую ICC 2017. И да, я компилирую с параметром -O3 и несколькими другими средствами оптимизации.   -  person JLV    schedule 19.02.2018