[英]Rotation or Shifting with x86/x64 Assembly
我有要在汇编中编写的函数,我想确定什么将使我获得最佳吞吐量。
我在RAX中有一个64位的值,我需要获取最高字节并对其执行一些操作,我想知道这样做的最佳方法是什么。
shr rax, 56 ; This will get me the most significant byte in al.
但是,这比...更有效吗?
rol rax, 8
and rax, r12 ; I already have the value 255 in r12
我问的原因是在某些体系结构上,变速速度是您执行变速次数的函数。 如果我还记得,在680x0芯片上,它是6 + 2n,其中n是移位计数。 我认为在x86架构上并非如此,但是我不确定...因此人们的启发会受到赞赏。 (我了解延迟)
还是有一种简单的方法可以将RAX的0-31位与32-64位交换而不是旋转或移位? 类似于680x0上的交换操作。
根据http://agner.org/optimize/上的指令表,具有立即计数的rol
是单uop / m-op指令,在Intel(奔腾M到Haswell)和AMD(K8到Steamroller)上具有1个周期的延迟)。 吞吐量范围从每个时钟一个到每个时钟三个。
在Intel上,可变计数( rol r, cl
)的旋转速度较慢,在AMD上则相同。
显然,如果您要问这种问题,请阅读Agner Fog的指南,因为对于高性能而言,比单独使用一条指令要重要得多。
如果要在多个数据项上执行此操作,则可以一次对16B(带有SSE的xmm寄存器)或32B(带有AVX的ymm寄存器)块使用向量重排。 pshufd xmm, xmm, imm
可让您为每个输出dword选择任何输入dword。 (因此,您可以播放和播放内容,也可以进行简单的随机播放。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.