К моему удовольствию, я обнаружил, что clang позволяет писать явный векторный код, не прибегая к встроенным функциям, используя расширенные векторы.
Например, этот код:
typedef float floatx16 __attribute__((ext_vector_type(16)));
floatx16 add( floatx16 a, floatx16 b )
{
return a+b;
}
...будет транслироваться непосредственно в одну инструкцию с вызовом clang -march=skylake-avx512
:
vaddps zmm0, zmm0, zmm1
Чтобы написать код без ветвлений, я хочу смешать векторы avx512. С внутренними функциями вы должны использовать встроенную функцию _mm512_mask_blend_ps
. (Кстати, почему в AVX512 используется маска, порядок a, b, а в AVX используется порядок a, b, маска?)
Попытка сделать смесь с тернарным оператором не работает:
typedef float floatx16 __attribute__((ext_vector_type(16)));
floatx16 minimum( floatx16 a, floatx16 b )
{
return a < b ? a : b;
}
...результат...
error: used type 'int __attribute__((ext_vector_type(16)))' (vector of 16 'int' values) where arithmetic or pointer type is required
Можно ли выполнить векторное смешивание, vblendmps zmm {k}, zmm, zmm
, используя переменные ext_vector_type(16) в C?
float16
— очень запутанное имя типа. Большинство людей ожидает, что это будет означать скалярное 16-битное число с плавающей запятой половинной точности. Возможноfloatx16
? Что касается вашего фактического вопроса, IDK, clang вполне может оптимизировать некоторое ручное сравнение + AND / ANDN / OR в инструкции сравнения + blend со скалярной автовекторизацией или с собственными векторами GNU C / clang. (Или лучше,vaddps
с маскированием слияния, в зависимости от того, с чем вы смешиваетесь.) - person Peter Cordes   schedule 25.11.2020vector_size
, вы бы получили красиво векторизованный код как для gcc, так и для clang: godbolt.org/z/a73TG3 - person chtz   schedule 25.11.2020a+b-c
намного разборчивее, чем_mm256_sub_ps( _mm256_add_ps(a,b), c)
, и чем меньше фреймворков, тем лучше. - person Bram   schedule 25.11.2020?:
в c++, а не c. Я не знаю, совместима ли в этом отношении реализация clang, потому что я отказываюсь ее использовать, так как она использует заведомо несовместимый синтаксис для перетасовок, поэтому для любого нетривиального векторного кода она полностью несовместима без всякой на то причины. . - person EOF   schedule 26.11.2020