3

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

以前我使用 AVX 128 xmm 寄存器将单个浮点数加载到 4 个压缩浮点数中。

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

    add eax, 0x4;
4

2 回答 2

13

这种操作有时被称为“广播”。AVX 有一堆指令可以做到这一点,它们是vbroadcast128,vbroadcastsdvbroadcastss. 由于您要广播单个单精度浮点值,因此您需要以下最后一个:

vbroadcastss ymm7, [eax]
于 2012-05-19T14:15:21.147 回答
5

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

shufps      xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1

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

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

于 2012-06-02T00:28:22.830 回答