如何将单个32位浮点加载/转换为AVX 256 ymm寄存器,以便所有8个浮点数来自单个源浮点数?
以前我使用AVX 128 xmm寄存器将一个浮点数加载到4个打包浮点数中。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
答案 0 :(得分:12)
此操作有时称为“广播”。 AVX有很多指令,它们是vbroadcast128
,vbroadcastsd
和vbroadcastss
。由于您要广播单个单精度浮点值,因此您需要最后一个:
vbroadcastss ymm7, [eax]
答案 1 :(得分:4)
如果您不想仅使用临时内存位置在所有寄存器的位置广播值,您可以考虑这样做:
shufps xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
假设xmm0
包含开头寄存器最低dword中的标量值。 {0}作为立即操作数使用时,shufps
将最低dword复制到XMM寄存器的所有位置。 vinsertf128
然后用较低的xmmword替换YMM寄存器的较高xmmword。
我没有检查哪个版本实际上更快。您最好在自己的应用程序中自行测试。如果你问我,完全糟糕的是没有vbroadcast
带有寄存器操作数。