【问题标题】:How to load a single 32 bit floating-point into all eight positions within an AVX ymm register?如何将单个 32 位浮点加载到 AVX ymm 寄存器中的所有八个位置?
【发布时间】: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


    【解决方案1】:

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

    vbroadcastss ymm7, [eax]
    

    【讨论】:

      【解决方案2】:

      如果您不想使用临时内存位置来在所有寄存器位置广播值,您可以考虑这样做:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-11
        • 2019-11-16
        • 2011-11-04
        • 1970-01-01
        • 2011-01-14
        • 2015-01-21
        • 2012-06-28
        • 2020-11-21
        相关资源
        最近更新 更多