Sse 使用_m128i地址进行内存访问

Sse 使用_m128i地址进行内存访问,sse,simd,Sse,Simd,我正在从事一个项目,该项目以非传统方式使用SSE。它的一个特点是,内存位置的地址在\uuum128i变量中保持重复 我的任务是使用这个地址从内存中获取值,并尽可能快地完成。我们希望从内存中获取的值也是128位长的。我知道在\uuu m128i中保留地址是对SSE的滥用,但不能用其他方式。地址必须重复 我目前的执行情况: 使用MOVQ 有地址时,使用MOVAPS从内存中获取值 在汇编中,它如下所示: MOVQ %xmm1, %rax MOVAPS (%rax), %xmm2 问题:

我正在从事一个项目,该项目以非传统方式使用SSE。它的一个特点是,内存位置的地址在
\uuum128i
变量中保持重复

我的任务是使用这个地址从内存中获取值,并尽可能快地完成。我们希望从内存中获取的值也是128位长的。我知道在
\uuu m128i
中保留地址是对SSE的滥用,但不能用其他方式。地址必须重复

我目前的执行情况:

  • 使用
    MOVQ
  • 有地址时,使用
    MOVAPS
    从内存中获取值
  • 在汇编中,它如下所示:

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

    问题:能做得更快吗?如果我们连续多次执行此操作,可能会应用一些优化?

    如果您的地址存储在xmm寄存器中,那么
    movq
    /dereference sequence是最佳选择

    Haswell的gather实现比手动加载慢,因此使用
    VGATHERQPS
    (qword index->float data)不太可能成功。也许未来的CPU设计具有更快的聚集速度


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

    我知道这很慢,但正如我在问题中提到的,在我的情况下,无法避免重复。地址必须重复。@alexo_o:我很好奇这里的大局是什么,这怎么可能是最好的解决方案。这不是最好的解决方案,这是一个要求。这个问题是我们试图使用SSE实现容错的研究项目的一部分。我想我记得在某个地方读到,Intel CPU上的一级缓存没有ECC。(但L2和L3确实如此)。这是真的吗?祝你的研究项目好运,谢谢你满足了我对你为什么要这么做的好奇P那么,您是否存储复制的指针,并使用128b加载?然后比较寄存器的两部分?我认为加载到GP reg,然后
    测试8+我的指针%rdi/jne错误检测到
    会更有效。对数据进行混洗,以验证一个寄存器的两半是否相同。慢一点。好吧,我们的方式有点不同,快一点。但这已经是实施的细节了。我想,这对于stackoverflow评论来说太过分了:)