【发布时间】:2013-06-10 13:13:37
【问题描述】:
使用 SSE,您可以使用内在的 _mm_load1_ps() 将单个浮点数从内存加载到 __m128 的所有 4 个插槽中
在 AVX 中使用 256 位宽 SIMD 时,似乎没有 _mm256_load1_ps() 将单个浮点数从内存加载到向量的所有 8 个插槽中。
为什么会出现这种遗漏,最好的解决方法是什么?
甚至更好:有没有办法将单个浮点数加载到向量的目标插槽 0..7?
【问题讨论】:
-
AVX 和 AVX2 仍然只允许您将元素插入低 128 位(
PINSRD/INSERTPS:元素编号 = 编译时间常数)。只有在非 VEX 编码的情况下才能在不将upper128 归零的情况下执行此操作,这会因混合VEX 和非VEX 指令而触发Intel 前Skylake 的大幅减速。你可以提取f128、insertps、insertf128。 -
_mm_load1_ps是movss+ shuffle 广播浮动的复合内在函数。如果您已经愿意让编译器做任何想做的事情来将常量放入寄存器,_mm256_set1_ps(*f)是一个不错的选择。智能编译器会在适当的地方发出VBROADCASTSS。
标签: simd intrinsics avx