Когда я оптимизировал многие вещи с помощью SIMD инструкций, всегда вставал вопрос о том, почему версии с AVX (как SSE, только операции с регистрами по 256 бит вместо 128) не так уж и классно работают. Тогда я узнал о такой вещи, как CPU downclocking: процессоры начинают понижать свою частоту при "сложных" (или как говорят в английских гайдлайнах, "heavy") инструкций, например FMA инструкции, которые умеют делать c += a * b для векторов по 8-16 чисeл с плавающей точкой одновременно, что можно использовать в dot product алгоритмах. Первые процессоры с AVX вообще понижали частоту даже при лёгких инструкциях. Доходило до смешного — на микробенчмарках я получал +25-30% ускорения, в проде всего 7-10% или вообще в минус, расстраивался, конечно, что не так хорошо и классно получалось.
Когда вышел AVX-512, ситуация была ещё хуже, понижение частоты было совсем грустным, например, см. картинку на stackoverflow.
Со временем процессоры развивались и вот Ice Lake и Rocket Lake семейства у Intel уже хорошо работают с 256 битными регистрами (AVX/AVX2/FMA), а Rocket Lake так и вообще не понижает ничего при AVX-512. Лично для меня это маленькая победа и очень недооцененная новость
Пруф: https://travisdowns.github.io/blog/2020/08/19/icl-avx512-freq.html
Можно начинать безболезненно пользоваться...
Но если уж говорить серьёзно, на самом деле нет. Так получается, что везде, где я работал, да и в принципе везде с облаком в 100-200+ машин достаточно сложно гарантировать даже процессоры c AVX. Хоть AVX и был представлен ~10 лет назад, мажорные облака и датацентры всё ещё хранят старенькие процессоры только с поддержкой SSE4.2. И даже если уже каким-то чудом нет, то у них AVX процессоры будут понижать частоту, что делает не очень рентабельным оптимизации.
Поэтому я советую всем, кто пишет на SIMD, иметь версию кода с SSE4.2, а если хочется AVX и AVX-512, то только при определённых обстоятельствах (например, супер критичность вашего приложения), только при определённых семействах процессоров и только если Вы не мешаете другим, так как понижение частоты прям аффектит всё вокруг. Иначе выстрелите себе в ногу. У больших компаний пока нет выбора и приходится всё собирать с 128 битными регистрами.
Через 5-10 лет будем стабильно собирать с AVX. Если ARM не выиграет к тому моменту 😏
Когда вышел AVX-512, ситуация была ещё хуже, понижение частоты было совсем грустным, например, см. картинку на stackoverflow.
Со временем процессоры развивались и вот Ice Lake и Rocket Lake семейства у Intel уже хорошо работают с 256 битными регистрами (AVX/AVX2/FMA), а Rocket Lake так и вообще не понижает ничего при AVX-512. Лично для меня это маленькая победа и очень недооцененная новость
Пруф: https://travisdowns.github.io/blog/2020/08/19/icl-avx512-freq.html
Можно начинать безболезненно пользоваться...
Но если уж говорить серьёзно, на самом деле нет. Так получается, что везде, где я работал, да и в принципе везде с облаком в 100-200+ машин достаточно сложно гарантировать даже процессоры c AVX. Хоть AVX и был представлен ~10 лет назад, мажорные облака и датацентры всё ещё хранят старенькие процессоры только с поддержкой SSE4.2. И даже если уже каким-то чудом нет, то у них AVX процессоры будут понижать частоту, что делает не очень рентабельным оптимизации.
Поэтому я советую всем, кто пишет на SIMD, иметь версию кода с SSE4.2, а если хочется AVX и AVX-512, то только при определённых обстоятельствах (например, супер критичность вашего приложения), только при определённых семействах процессоров и только если Вы не мешаете другим, так как понижение частоты прям аффектит всё вокруг. Иначе выстрелите себе в ногу. У больших компаний пока нет выбора и приходится всё собирать с 128 битными регистрами.
Через 5-10 лет будем стабильно собирать с AVX. Если ARM не выиграет к тому моменту 😏