【发布时间】:2018-04-02 15:39:37
【问题描述】:
有什么方法可以将有效地址加载到XMM 寄存器,就像普通寄存器的LEA 一样?如果不是,最快的解决方案是什么,需要多少个周期。
【问题讨论】:
-
很好奇为什么要将内存位置的地址加载到 XMM 寄存器中?闻起来像是可能的 XY 问题。
-
xmm寄存器是 128 位,而地址是 64 位。您是否正在寻找将 GPR 移动到xmm寄存器(即(v)movq)低位的指令?我不知道有任何lea之类的 XMM 指令,例如vgatherq之类的指令,但它不会加载,只是地址生成。 FMA 在概念上相似,但它们使用 FP e 而不是整数。 -
我正在做一个二进制转换,我试图滥用 XMM 寄存器来更快地实现我的目标,而不是保存寄存器或使用内存计算。
-
根据Intel Intrinsics Guide
movq的延迟为1,倒数吞吐量为1/3。我想这不太可能导致您的程序出现瓶颈。不过,您需要提供更多背景信息才能获得更明确的答案... -
@chtz:英特尔表中的条目对于 Sandybridge 之后的 CPU 来说是错误的,其中 Agner Fog 对 SnB 和 Nehalem 的测试确实显示 movd/movq 是每时钟 3 个。在 IvB/HSW/SKL 上,只有
movq xmm, xmm形式的movq是每个时钟 3 个,对向量寄存器的低 64 位进行零扩展。movq xmm, r64是 1 uop / 1 per clock,在 HSW/SKL 的端口 5 上运行。它在 AMD 上的延迟也更差,但吞吐量仍然不错(在 Bulldozer 系列上需要 2 微秒,其中 2 个整数内核共享一个 SIMD 单元)。但是,没有更好的解决方案;即使在 Bulldozer 系列上,存储/重新加载也不好;延迟也很高。