Assembly 如何从“获取32位int”;eax";8倍于;ymm0";?

Assembly 如何从“获取32位int”;eax";8倍于;ymm0";?,assembly,simd,avx,avx2,Assembly,Simd,Avx,Avx2,我想执行一些SIMD/AVX指令,为此我需要一个256bit寄存器,用相同的数字填充8次。该数字位于通用32位寄存器中。 将值加载到寄存器中最有效的方法是什么?编译器使用vmovd+vpbroadcasted的方式。或者使用AVX512VL,使用VP广播的ymm0,eax@Peter的建议将是最直接的。在AVX512之前,在某些情况下,将eax移动到内存和vpbroadcasted从内存中移动会更好地考虑端口使用情况(这需要更多的上下文来回答…),谢谢@PeterCordes。我实现了你的建议(

我想执行一些SIMD/AVX指令,为此我需要一个256bit寄存器,用相同的数字填充8次。该数字位于通用32位寄存器中。
将值加载到寄存器中最有效的方法是什么?

编译器使用
vmovd
+
vpbroadcasted
的方式。或者使用AVX512VL,使用
VP广播的ymm0,eax
@Peter的建议将是最直接的。在AVX512之前,在某些情况下,将
eax
移动到内存和
vpbroadcasted
从内存中移动会更好地考虑端口使用情况(这需要更多的上下文来回答…),谢谢@PeterCordes。我实现了你的建议(首先进入xmm0,然后将xmm0广播到ymm0),效果非常好。是的,当然可以。唯一的问题是这是否是最有效的方法。在许多情况下是的,但chtz提出了一个有趣的观点,即用不同的端口压力换取延迟。如果您不能直接从内存中广播一个值,那么根据周围的代码,这是值得考虑的。不过不管怎样,我很高兴它帮助了我的猜测,不过,下一次还是要看看编译器输出中返回的函数
return\u mm256\u set1\u epi32(x)