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