Я видел много сборок с AVX (все три разновидности), и во всех случаях, которые я видел, наиболее концентрированная инструкция является лучшей, которую выполняет код. Но, например, такие вещи, как выполнение загрузки в 32-битный регистр, а затем широковещательная передача во все дорожки для AVX512 или AVX2, говорят... не лучше ли/быстрее просто загрузить регистр, а затем переставить?
В частности, есть ли наказание за смешивание инструкций x86_64 и семейства AVX? Я знаю, что есть такой штраф за смешивание SSE и AVX в целом.
Я знаю, что мог бы проверить это, но я бы лучше поделился знаниями с массами, прежде чем браться за этот мини-проект. Я уверен, что кто-то это уже знает.
[compiler-optimization]
, но из текста кажется, что вы говорите о написанном от руки ассемблере, а не о внутренних свойствах. В любом случае, прочитайте agner.org/optimize, чтобы узнать больше о настройке asm для современных процессоров. (Также другие ссылки на производительность в вики тега x86.vmovd
/vmovq
не бесплатны, но они не являются специальными или очень дорогой и имеет хорошую низкую задержку на процессорах Intel.vpextrd
/vpinsrd
между целым числом и xmm стоитmovd
+ перетасовка, поэтому по возможности избегайтеvpbroadcastd
, безусловно, лучше всего, если данные начинаются в памяти - person Peter Cordes   schedule 19.02.2018-O3 -march=skylake-avx512
? Можете ли вы связать тестовый пример с gcc.godbolt.org? - person Peter Cordes   schedule 19.02.2018vpbroadcastd
с источником GP-регистра. AVX2 имеет широковещательную передачу с источником регистра XMM, в то время как AVX1 только имеетvbroadcastss/sd
с источником памяти. Обратите внимание, что версияvbroadcastss
с исходным регистром предназначена только для AVX2. - person Peter Cordes   schedule 19.02.2018