gpt4 book ai didi

performance - SSE2 : How To Load Data From Non-Contiguous Memory Locations?

转载 作者:行者123 更新时间:2023-12-03 15:53:53 24 4
gpt4 key购买 nike

我正在尝试向量化一些对性能极为关键的代码。在高层次上,每次循环迭代从一个小数组中的非连续位置读取六个浮点数,然后将这些值转换为 double 并将它们添加到六个不同的 double 累加器中。这些累加器在迭代中是相同的,因此它们可以存在于寄存器中。由于算法的性质,使内存访问模式连续是不可行的。不过,该阵列小到足以放入 L1 缓存,因此内存延迟/带宽不是瓶颈。

我愿意使用汇编语言或 SSE2 内在函数来并行化它。我知道我需要一次将两个浮点数加载到 XMM 寄存器的两个低位双字中,然后使用 cvtps2pd 将它们转换为两个 double 数。 ,然后使用 addpd 将它们一次添加到两个累加器中.

我的问题是,如果两个浮点数在内存中不相邻,如何将它们放入单个 XMM 寄存器的两个低位双字中?显然,任何速度太慢以至于违背并行化目的的技术都是没有用的。 ASM 或 Intel/GCC 内在函数的答案将不胜感激。

编辑:

  • 严格来说,浮点数组的大小在编译时是未知的,但它几乎总是 256,所以这可以是特殊情况。
  • 应该读取的浮点数组元素是通过从字节数组加载一个值来确定的。有六个字节数组,每个累加器一个。从字节数组读取是顺序的,每次循环迭代从每个数组读取一次,因此那里不应该有很多缓存未命中。
  • 浮点数组的访问模式实际上是随机的。
  • 最佳答案

    对于这种特定情况,请查看说明引用手册中的解包和交错说明。它会是这样的

    movss xmm0, <addr1>
    movss xmm1, <addr2>
    unpcklps xmm0, xmm1

    也看看 shufps ,每当您以错误的顺序获得所需的数据时,这都很方便。

    关于performance - SSE2 : How To Load Data From Non-Contiguous Memory Locations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850431/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com