我正在研究一个以非传统方式使用SSE的项目。关于它的一个问题是,内存位置的地址在__m128i
变量中保持重复。
我的任务是使用此地址从内存中获取值,并尽快完成。我们想要从内存中获取的值也是128位长。我知道在__m128i
中保留地址是对SSE的滥用,但不能以其他方式进行。地址必须重复。
我目前的实施:
MOVQ
MOVAPS
从内存中获取值在装配中它看起来像这样:
MOVQ %xmm1, %rax
MOVAPS (%rax), %xmm2
问题:可以更快地完成吗?如果我们连续多次这样做,可以应用一些优化吗?
答案 0 :(得分:2)
如果您的地址存储在xmm寄存器中,那么movq
/解引用序列是您最好的选择。
Haswell的集合实现比手动加载更慢,因此使用VGATHERQPS
(qword indices - > float data)不太可能是胜利。也许未来的CPU设计可以更快地聚集。
但真正的问题是为什么你首先在XMM寄存器中有地址? ESP。复制到寄存器的两半。这似乎是一个糟糕的想法,需要额外的时间来设置,并花费额外的时间来使用。 (特别是在AMD硬件上,GP和向量寄存器之间的移动需要5或10个周期,而英特尔则需要1个。)最好将RAM中的地址直接加载到GP寄存器中。