【问题标题】:c++ AVX512 intrinsic equivalent of _mm256_broadcast_ss()?c++ AVX512内在等效于_mm256_broadcast_ss()?
【发布时间】:2020-05-04 10:52:48
【问题描述】:

我正在将代码从 AVX2 重写为 AVX512。

我可以使用什么等价物将单个浮点数广播到 _mm512 向量?在 AVX2 中是 _mm256_broadcast_ss() 但我找不到像 _mm512_broadcast_ss() 这样的东西。

【问题讨论】:

  • 这就是你想要的吗? stackoverflow.com/questions/59128802/…
  • @Carlos 是的!谢谢。对于 _mm256_broadcast_ss() 我读它比 set1 快一点,但在这个应用程序中我并不关心这里的性能。
  • 我会添加它作为答案以使其更清楚,也许您可​​以让人们知道它是正确的
  • 同时考虑:_mm512_broadcastss_ps
  • @PaulR 该函数采用“__m128”类型的输入,我没有精力进行输入类型的额外转换

标签: c++ intel intrinsics avx2 avx512


【解决方案1】:

AVX512 不需要内存源版本的特殊内在函数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。一些编译器(如 MSVC 和 ICC)允许您使用内在函数,而无需启用 ISA 扩展以供编译器在任何地方使用,因此需要专门针对 AVX1 内存源版本的内在函数。

对于 AVX512,AVX512F 引入了内存和寄存器源形式,因此无需为这些编译器的用户提供一种方法来微观管理允许使用的 asm。

【讨论】:

  • 我刚刚注意到另一个区别:_mm512_set1_ps() 采用浮点值,而 _mm256_broadcast_ss() 采用浮点指针。我绝对可以使用 _mm512_set1_ps() 虽然它们并不完全相同。
  • 也许您可以在英特尔链接上找到更正确的内容?
  • 没有。我猜他们忘记实施了。
  • @Noob:您也可以将_mm256_set1_ps( *ptr ) 与AVX1 一起使用;我不确定为什么_mm256_broadcast_ss 甚至存在。可能是因为某些编译器(如 MSVC)从不优化内在函数并且不允许您避免使用命令行选项的 AVX2 指令?因此,您可以使用_mm256_broadcast_ss 确保获得AVX1 内存源版本,并使用_mm256_set1_ps 也允许AVX2 寄存器源vbroadcastss ymm, xmm 版本,以方便编译器为准?无论如何,幸运的是 AVX512 引入了具有相同扩展名的 mem 和 reg 源版本。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多