使用RSI/RDI vs r8-r15(速度优化)

Alw*_*Nub 0 optimization assembly x86-64 masm micro-optimization

我想尽可能地优化我的函数,我做的一件事就是使用r8作为指针,因为这是指针在x64函数中被推入的寄存器.

但是推送RSI或RDI,将指针移动到它们并在循环中更快地使用它们?

例如,mov [RSI],DL;将编译为2个字节和:mov [r8],DL; 将编译为3个字节

所以,如果我做了100到200次循环,r8会因为要解码的额外字节而变慢吗?或推动RSI并移动指针消除任何可能的速度增加?显然push和mov会在循环外发生.

Pet*_*des 5

取决于CPU.通常平均指令大小为4可以避免前端瓶颈,即使在像Core2这样的旧CPU上也是如此.

像Sandybridge-family和Ryzen这样的现代CPU缓存已解码的uop,并且对内部循环中的代码大小(或对齐)不太敏感,只有大规模的L1i和uop-cache占用空间.

Nehalem有一个"循环缓冲区",适用于高达28微秒的小循环.(SnB家族也有这个,除了Skylake/Kaby Lake,它被微码更新禁用,因此它们从uop缓存中运行甚至是小循环).Core2具有最多64字节的预解码循环缓冲区.(参见Agner Fog的指南).


但是,是的,一般来说更高的代码密度更好,所以非REX寄存器支持指针和32位值,使用r8-r15用于总是需要REX.W的64位整数.但通常不值得花费额外的指示来实现这一目标.uop count通常比代码大小更大,特别是在循环内.

配置性能计数器以查明循环中是否存在任何前端瓶颈.如果是这样,确保保存/恢复一些更低的注册表,如RBP,并在你的函数中使用它们而不是R8是有用的.(但请记住,[rbp]实际上需要一个disp8 = 0 , [rbp+0].)

进一步阅读:


归档时间:

查看次数:

129 次

最近记录:

7 年,7 月 前