在AVR中,逻辑右移是否更快2倍?

问题描述 投票:7回答:8

我想知道,当以2的幂移位时,执行逻辑右移是否更快

例如,是

myUnsigned >> 4

比任何更快

myUnsigned >> 3

我很欣赏每个人的第一反应是告诉我,人们不应该担心像这样的小事,它使用正确的算法和集合来减少重要的数量级。我完全同意你的意见,但我真的想从嵌入式芯片(ATMega328)中挤出所有东西 - 我只是有一个值得'哇哇'的性能转变!通过用位移替换除法,所以我向你保证这很重要。

c++ optimization avr bit-shift atmega
8个回答
18
投票

我们来看看数据表:

http://atmel.com/dyn/resources/prod_documents/8271S.pdf

据我所知,ASR(算术右移)总是移位一位,不能取位数移位;执行需要一个周期。因此,向右移位n位将需要n个周期。两个人的行为与任何其他数字相同。


4
投票

AVR instruction set中,算术右移和左移一次发生一次。因此,对于这个特定的微控制器,移动>> n意味着编译器实际上制作了许多单独的asr操作,我猜>>3>>4快一个。

顺便说一句,这使AVR相当不合适。


4
投票

您必须查阅处理器的文档以获取此信息。即使对于给定的指令集,取决于模型也可能有不同的成本。例如,在一个非常小的处理器上,换一个可能比其他值更快(某些IA32处理器上的旋转指令就是这种情况,但这只是因为这个指令很少由编译器产生)。

根据http://atmel.com/dyn/resources/prod_documents/8271S.pdf,所有逻辑转换都在ATMega328的一个周期内完成。但是,正如评论中指出的那样,所有逻辑转变都是一点点。所以n转移的成本是n指令中的n周期。


2
投票

这取决于处理器的构建方式。如果处理器具有桶形旋转,则它可以在一次操作中移位任意数量的位,但这需要芯片空间和功率预算。最经济的硬件只能旋转一个,有关环绕钻头的选项。接下来是可以向左或向右旋转一个。我可以想象一个具有1个移位器,2个移位器,4个移位器等的结构,在这种情况下,4可能比3更快。


2
投票

先拆卸然后再编码。人们告诉你不要气馁,你在浪费你的时间。你获得的知识将使你成为公司解雇大公司的转​​折人。拥有真正幕后知识的人数在这个行业中以惊人的速度下降。

听起来像其他人解释了这里的真正答案,反汇编会显示,单位移位指令。因此,4班次需要133%的时间,3班次,或3班次是4班次的75%,取决于你如何比较数字。并且你的测量应该反映出这种差异,如果他们不继续这个实验,直到你完全理解执行时间。


2
投票

实际上,ATMega没有像大多数其他8位MCU一样具有桶形移位器。因此,它每次只能移动1而不是像强大的CPU那样的任意值。因此,理论上移位4比移位3慢

然而,ATMega确实有swap nibble instruction所以实际上x >> 4x >> 3更快

假设xuint8_t然后x >>= 3通过3个右移实现

x >>= 1;
x >>= 1;
x >>= 1;

x >>= 4只需要交换而且有点清楚

swap(x);    // swap the top and bottom nibbles AB <-> BA
x &= 0x0f;

要么

x &= 0xf0;
swap(x);

对于更大的交叉寄存器移位,还有各种方法来优化它

随着uint16_t变量y组成的低部分y0和高部分y1然后y >> 8简单

y0 = y1;
y1 = 0;

同样,y >> 9可以优化到

y0 = y1 >> 1;
y1 = 0;

总之,换档时间根据换档距离而变化,但对于更长或非2次幂值,它不一定更慢。通常,最多需要3条指令才能在8位字符内移位

这是some demos from compiler explorer

  • 通过如上所述的swapand实现右移4 swap r24 andi r24,lo8(15)
  • 必须使用3条指令右移3 lsr r24 lsr r24 lsr r24

Left shifts也以同样的方式进行了优化

另见Which is faster: x<<1 or x<<10?


1
投票

如果您的targer处理器有一个位移指令(这很可能),那么它取决于该指令的硬件实现,如果在移位2位功率或移位其他数字之间会有任何差异。但是,它不太可能有所作为。


0
投票

尽管如此,在开始测量之前,你甚至不应该开始谈论性能。用分区编译你的程序。跑。测量时间。转移重复。

© www.soinside.com 2019 - 2024. All rights reserved.