Код: Выделить всё
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;
}
}
Я решил использовать Godbolt для проверки
Похоже, что Clang, ICX и GCC векторизуют только для архитектур на базе AMD (и znver4, и znver5, но не znver3, который не поддерживает AVX512)
Однако я выбрал Intel проверить наличие:-
- Skylake AVX512
- Granite Rapids
- Emerald Rapids
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
Код: Выделить всё
.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