_mm256_broadcast_ss() 的 c++ AVX512 内在等价物?
c++ AVX512 intrinsic equivalent of _mm256_broadcast_ss()?
我正在将代码从 AVX2 重写为 AVX512。
我可以使用什么来将单个浮点数广播到 _mm512 向量?在 AVX2 中它是 _mm256_broadcast_ss() 但我找不到像 _mm512_broadcast_ss().
这样的东西
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 的方法。
我正在将代码从 AVX2 重写为 AVX512。
我可以使用什么来将单个浮点数广播到 _mm512 向量?在 AVX2 中它是 _mm256_broadcast_ss() 但我找不到像 _mm512_broadcast_ss().
这样的东西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 的方法。