如何将单个 32 位浮点数加载/转换为 AVX 256 ymm 寄存器,以便所有 8 个浮点数都来自单源浮点数?
以前我使用 AVX 128 xmm 寄存器将单个浮点数加载到 4 个压缩浮点数中。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
如何将单个 32 位浮点数加载/转换为 AVX 256 ymm 寄存器,以便所有 8 个浮点数都来自单源浮点数?
以前我使用 AVX 128 xmm 寄存器将单个浮点数加载到 4 个压缩浮点数中。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
这种操作有时被称为“广播”。AVX 有一堆指令可以做到这一点,它们是vbroadcast128
,vbroadcastsd
和vbroadcastss
. 由于您要广播单个单精度浮点值,因此您需要以下最后一个:
vbroadcastss ymm7, [eax]
如果您不想仅使用临时内存位置在所有寄存器位置广播值,则可以考虑执行以下操作:
shufps xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
假设xmm0
包含在寄存器的最低双字开头的标量值。shufps
,当与 0 一起用作立即操作数时,将最低 dword 复制到 XMM 寄存器的所有位置。vinsertf128
然后用较低的 xmmword 替换 YMM 寄存器的较高 xmmword。
我还没有检查哪个版本实际上更快。您最好在自己的应用程序中进行测试。如果您问我,没有vbroadcast
带有寄存器操作数的 a 真是太糟糕了。