256-битный эквивалент AVX для _mm_load1_ps

С помощью SSE вы можете загрузить один float из памяти во все 4 слота __m128 с помощью встроенного _mm_load1_ps ()

При использовании SIMD шириной 256 бит с AVX, похоже, нет _mm256_load1_ps () для загрузки одного числа с плавающей запятой из памяти во все 8 слотов вектора.

Почему это упущение и как лучше всего этого избежать?

Или даже лучше: есть ли способ загрузить один плавающий объект в целевой слот 0..7 вектора?


person Bram    schedule 13.06.2013    source источник
comment
AVX и AVX2 по-прежнему позволяют вставлять элементы только в младшие 128 (PINSRD / INSERTPS: номер элемента = константа времени компиляции). Выполнение этого без обнуления верхнего128 возможно только с кодировкой, отличной от VEX, что вызывает значительное замедление на Intel pre-Skylake из-за смешивания инструкций VEX и не-VEX. Вы можете извлечь f128, insertps, insertf128.   -  person Peter Cordes    schedule 26.01.2016
comment
_mm_load1_ps - это составная внутренняя функция для movss + shuffle для широковещательной передачи числа с плавающей запятой. Если вы уже были готовы позволить компилятору делать все, что угодно, чтобы получить константу в регистре, _mm256_set1_ps(*f) - хороший выбор. Умные компиляторы при необходимости выдадут VBROADCASTSS.   -  person Peter Cordes    schedule 26.01.2016


Ответы (1)


_mm256_broadcast_ss a> это то, что вы ищете.

person Marat Dukhan    schedule 14.06.2013
comment
_mm256_set1_ps (* x) также будет работать, но он может генерировать несколько инструкций. _mm256_broadcast_ss гарантированно генерирует только одну инструкцию, VBROADCASTSS - person Marat Dukhan; 14.06.2013