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

xzb*_*667 3 c++ optimization avx

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

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

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

    add eax, 0x4;
Run Code Online (Sandbox Code Playgroud)

小智 13

该操作有时被称为"广播".AVX有一堆指令就是这样做的,这些都是vbroadcast128,vbroadcastsdvbroadcastss.由于您要广播单个单精度浮点值,因此您需要最后一个:

vbroadcastss ymm7, [eax]
Run Code Online (Sandbox Code Playgroud)


Dan*_*zar 5

如果您不想仅使用临时存储位置来跨寄存器的所有位置广播值,则可以考虑执行以下操作:

shufps      xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
Run Code Online (Sandbox Code Playgroud)

假定xmm0在开始时在寄存器的最低dword中包含标量值。shufps,当与0作为立即操作数一起使用时,将最低的dword复制到XMM寄存器的所有位置。vinsertf128然后用较低的xmmword替换YMM寄存器的较高的xmmword。

我没有检查哪个版本实际上更快。最好在自己的应用程序中进行测试。如果您问我,那真是糟透了,没有vbroadcast一个寄存器操作数。