使用_m128i地址访问内存

时间:2015-07-26 15:32:49

标签: sse simd

我正在研究一个以非传统方式使用SSE的项目。关于它的一个问题是,内存位置的地址在__m128i变量中保持重复。

我的任务是使用此地址从内存中获取值,并尽快完成。我们想要从内存中获取的值也是128位长。我知道在__m128i中保留地址是对SSE的滥用,但不能以其他方式进行。地址必须重复。

我目前的实施:

  1. 使用MOVQ
  2. 获取较低的64位重复地址
  3. 拥有地址,使用MOVAPS从内存中获取值
  4. 在装配中它看起来像这样:

    MOVQ     %xmm1,  %rax
    MOVAPS   (%rax), %xmm2
    

    问题:可以更快地完成吗?如果我们连续多次这样做,可以应用一些优化吗?

1 个答案:

答案 0 :(得分:2)

如果您的地址存储在xmm寄存器中,那么movq /解引用序列是您最好的选择。

Haswell的集合实现比手动加载更慢,因此使用VGATHERQPS(qword indices - > float data)不太可能是胜利。也许未来的CPU设计可以更快地聚集。

但真正的问题是为什么你首先在XMM寄存器中有地址? ESP。复制到寄存器的两半。这似乎是一个糟糕的想法,需要额外的时间来设置,并花费额外的时间来使用。 (特别是在AMD硬件上,GP和向量寄存器之间的移动需要5或10个周期,而英特尔则需要1个。)最好将RAM中的地址直接加载到GP寄存器中。