【问题标题】:AVX 256-bit equivalent for _mm_load1_ps_mm_load1_ps 的 AVX 256 位等效项
【发布时间】: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_psmovss + shuffle 广播浮动的复合内在函数。如果您已经愿意让编译器做任何想做的事情来将常量放入寄存器,_mm256_set1_ps(*f) 是一个不错的选择。智能编译器会在适当的地方发出VBROADCASTSS

标签: simd intrinsics avx


【解决方案1】:

_mm256_broadcast_ss 就是你要找的。​​p>

【讨论】:

  • 也许我误解了什么,但为什么不做_mm256_set1_ps(*x)? stackoverflow.com/questions/13218391/…
  • _mm256_set1_ps(*x) 也可以,但它可以生成多条指令。 _mm256_broadcast_ss 保证只生成一条指令,VBROADCASTSS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2021-06-26
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多