如何将一个32位浮点加载到AVX ymm寄存器中的所有八个位置?

时间:2012-05-19 13:24:54

标签: c++ optimization avx

如何将单个32位浮点加载/转换为AVX 256 ymm寄存器,以便所有8个浮点数来自单个源浮点数?

以前我使用AVX 128 xmm寄存器将一个浮点数加载到4个打包浮点数中。

    movss    xmm7,[eax];
    shufps   xmm7,xmm7,0;

    add eax, 0x4;

2 个答案:

答案 0 :(得分:12)

此操作有时称为“广播”。 AVX有很多指令,它们是vbroadcast128vbroadcastsdvbroadcastss。由于您要广播单个单精度浮点值,因此您需要最后一个:

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带有寄存器操作数。