Почему GCC, ICX и Clang не выполняют автоматическую векторизацию с использованием инструкций на основе AVX-512 на процесC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему GCC, ICX и Clang не выполняют автоматическую векторизацию с использованием инструкций на основе AVX-512 на процес

Сообщение Anonymous »

Мой код чрезвычайно прост

Код: Выделить всё

void x(float* array, float const LOW_THRESHOLD, float const HIGH_THRESHOLD) noexcept
{
for ( int index = 0; index < 16; ++index )
{
array[ index ] = LOW_THRESHOLD < array[ index ] && array[ index ] < HIGH_THRESHOLD ? 1.0f : 0.0f;
}
}
Код выглядит как образец векторизации на основе AVX-512.
Я решил использовать Godbolt для проверки
Похоже, что Clang, ICX и GCC векторизуют только для архитектур на базе AMD (и znver4, и znver5, но не znver3, который не поддерживает AVX512)
Однако я выбрал Intel проверить наличие:-
  • Skylake AVX512
  • Granite Rapids
  • Emerald Rapids
Для всех трех я старался использовать последнюю версию компилятора, представленную в Godbolt.
Clang Intel Emerald Пороги (-O3 -march=emeraldrapids)

Код: Выделить всё

.LCPI0_0:
.long   0x3f800000
x(float*, float, float):
vbroadcastss    ymm0, xmm0
vmovups ymm2, ymmword ptr [rdi]
vmovups ymm3, ymmword ptr [rdi + 32]
vcmpltps        k1, ymm0, ymm2
vbroadcastss    ymm1, xmm1
vcmpltps        k1 {k1}, ymm2, ymm1
vbroadcastss    ymm2, dword ptr [rip + .LCPI0_0]
vmovaps ymm4 {k1} {z}, ymm2
vmovups ymmword ptr [rdi], ymm4
vcmpltps        k1, ymm0, ymm3
vcmpltps        k1 {k1}, ymm3, ymm1
vmovaps ymm0 {k1} {z}, ymm2
vmovups ymmword ptr [rdi + 32], ymm0
vzeroupper
ret
Clang AMD Ryzen v5 (-O3 -march=znver5)

Код: Выделить всё

.LCPI0_0:
.long   0x3f800000
x(float*, float, float):
vmovups zmm2, zmmword ptr [rdi]
vbroadcastss    zmm0, xmm0
vbroadcastss    zmm1, xmm1
vcmpltps        k1, zmm0, zmm2
vcmpltps        k1 {k1}, zmm2, zmm1
vbroadcastss    zmm0 {k1} {z}, dword ptr [rip + .LCPI0_0]
vmovups zmmword ptr [rdi], zmm0
vzeroupper
ret
Мое первоначальное мнение заключалось в том, что оптимизация была упущена.

Но это не должно быть так, поскольку ICX — собственный компилятор Intel.

Сотрудники Intel и AMD вносят свой вклад в другие компиляторы с открытым исходным кодом, включая Clang и GCC.

Шансы пропустить это немного малы.
Использует AVX512 не рекомендуется для Intel архитектура?

Может быть поэтому оба компилятора не выполняют автоматическую векторизацию?
(Код взят из сравнения и маскировки с плавающей запятой AVX-512. Спасибо @Terrordrone )

Подробнее здесь: https://stackoverflow.com/questions/791 ... uctions-on
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ValueError: входной массив должен иметь размер 3 по `channel_axis`, получено (512, 512).
    Гость » » в форуме Python
    0 Ответы
    116 Просмотры
    Последнее сообщение Гость
  • Определить количество блоков AVX-512 FMA
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Найдите первый бит, установленную в регистре AVX 512
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как эффективно загружать и хранить данные для новых инструкций AVX-VNNI и Arm Neon MMLA?
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Как отключить векторизацию в Clang ++?
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»