c ++ AVX512 intrinsi c эквивалент _mm256_broadcast_ss ()? - PullRequest
4 голосов
/ 17 января 2020

Я переписываю код с AVX2 на AVX512.

Какой эквивалент я могу использовать для трансляции одного числа с плавающей точкой в ​​вектор _mm512? В AVX2 это _mm256_broadcast_ss (), но я не могу найти что-то вроде _mm512_broadcast_ss ().

1 Ответ

4 голосов
/ 17 января 2020

AVX512 не требует специального ввода c для версии источника памяти 1 . Вы можете просто использовать _mm512_set1_ps (что занимает float, а не float*). Компилятор должен использовать трансляцию источника памяти, если это эффективно. (Потенциально даже свернутый в источник широковещательной памяти для инструкции ALU вместо отдельной загрузки; AVX512 может сделать это для 512-битных векторов.)

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text = _ mm512_set1_ps & expand = 5236,4980


Сноска 1: Причина, по которой _mm256_broadcast_ss существует даже отдельно от _mm256_set1_ps, возможно, связана с AVX1 vbroadcastss ymm, [mem] против AVX2 vbroadcastss ymm, xmm. Некоторые компиляторы, такие как MSV C и I CC, позволяют использовать встроенные функции, не позволяя расширениям ISA, которые компилятор может использовать где-либо, поэтому необходимо было использовать intrinsi c только для версии с памятью AVX1.

С AVX512, формы памяти и регистров были представлены с AVX512F, так что нет необходимости предоставлять пользователям этих компиляторов способ микроуправления, какой asm разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...