Arm 手臂拇指/拇指-2性能

Arm 手臂拇指/拇指-2性能,arm,cortex-m3,Arm,Cortex M3,我在一个ARM Cortex-M3控制器上工作,它有Thumb-2指令集 Thumb模式用于将指令压缩为16位大小。 这样代码的大小就减小了。但在正常拇指模式下,为什么会说性能降低 在Thumb-2的情况下,可以通过以下两个链接来提高性能: 在单个16位指令限制编译器可用函数的情况下提高性能 Thumb-2的一个既定目标是实现与Thumb类似的代码密度,性能类似于32位内存上的ARM指令集 这场演出到底是什么?有人能举几个与之相关的例子吗?与ARM 32位指令集相比,thumb 16位指

我在一个ARM Cortex-M3控制器上工作,它有Thumb-2指令集

Thumb模式用于将指令压缩为16位大小。 这样代码的大小就减小了。但在正常拇指模式下,为什么会说性能降低

在Thumb-2的情况下,可以通过以下两个链接来提高性能:

在单个16位指令限制编译器可用函数的情况下提高性能

Thumb-2的一个既定目标是实现与Thumb类似的代码密度,性能类似于32位内存上的ARM指令集


这场演出到底是什么?有人能举几个与之相关的例子吗?

与ARM 32位指令集相比,thumb 16位指令集(还没有谈到thumb2扩展)占用的空间更少,因为指令的大小只有ARM 32位指令集的一半,但总体而言,性能有所下降,因为在手臂上做同样的事情需要更多的指令。指令集的功能较少,大多数指令仅在寄存器r0-r7上运行。苹果对苹果的比较说明越多,做同样的事情就越慢

现在,thumb2扩展采用以前未定义的thumb指令并创建32位thumb指令。了解thumb2扩展有多个集合。ARMv6m可能会增加几十个。ARMv7m向thumb指令集添加了大约150条指令,我不知道ARMv8或未来会支持什么。因此,假设ARMv7m,它们弥补了拇指和手臂之间的差距。因此,thumb2是一个精简的ARM指令集,与thumb一样,但没有精简。因此,与ARM做同样的事情相比,在thumb2(假设加上thumb)中做同样的事情可能需要更多的指令

这让我们尝到了这个问题的味道,arm中的一条指令和thumb中的等效指令

ARM

and r8,r9,r10

THUMB

push {r0,r1}
mov r0,r8
mov r1,r9
and r0,r1
mov r1,r10
and r0,r1
mov r8,r0
pop {r0,r1}
现在编译器不会这样做,编译器会知道它是针对thumb的,并通过选择其他寄存器来做不同的事情。每个指令的寄存器和功能仍然较少:

mov r0,r1
and r0,r2
在不修改操作数的情况下,仍然将两条指令/执行周期与两个寄存器合并,并将结果放入第三个寄存器。Thumb2有三个寄存器,因此您可以使用Thumb2扩展返回到单个指令。thumb2指令允许在thumb限制为r0-r7的三个寄存器中的任何一个寄存器上使用r0-r15


请参阅《ARMv5体系结构参考手册》,在每个thumb指令下,它都显示了等效的ARM指令。然后转到那个ARM指令,比较你们能做什么和那个ARM指令做什么,你们不能用thumb指令做什么。这是一个单向路径,thumb指令(不是thumb2)与ARM指令有一对一的关系。所有thumb指令都具有等效的arm指令。但并非所有arm指令都具有等效的thumb指令。您应该能够从本练习中看到使用thumb指令集时编译器的限制。然后获取ARMv7m架构参考手册并查看说明集,比较“所有thumb变体”编码(包括ARMv4T的编码)和仅限于ARMv6和/或v7的编码,并查看thumb和thumb2之间功能的扩展,以及没有thumb对应项的仅thumb2指令。这应该澄清编译器必须在thumb和thumb2之间使用什么。然后,您可以将thumb+thumb2与完整的ARM指令进行比较(ARMV7AR就是它的名称?)。thumb2更接近ARM,但每个指令都会失去条件,因此thumb中的条件执行与代码上的分支比较,在ARM中,有时可以使用if-then-else而不进行分支…

thumb-2将变长指令引入原始thumb;现在,指令可以是16位和32位的混合。这意味着您在日常代码中保留了原始Thumb的尺寸优势,但现在可以在更复杂的代码中访问几乎完整的ARM功能集,但没有Thumb以前产生的ARM互通开销

除了上述通过所有寄存器操作访问完整寄存器集之外,Thumb-2还以IF-THEN(IT)块的形式添加了无分支条件执行。最初的Thumb去掉了ARM的商标特征,即几乎所有指令都有条件执行;现在,在Thumb-2中,可以通过在IT指令前加上最多四条后续指令的条件来实现这一点


此外,指令集本身也得到了极大的扩展;例如,Cortex-M4F实现了DSP扩展和FPv4 SP浮点扩展。事实上,我相信即使是NEON也可以用Thumb2编码。

性能总是相对的。在许多情况下,
thumb
代码比
arm
运行得更好。主要是如果内存总线是一个瓶颈。通常
thumb
没有那么多的寄存器,因此即使指令集更紧凑,使用一些算法,它将不得不更频繁地访问内存以溢出寄存器。如果我有一辆运货卡车a和一辆运货卡车B,其大小为a的一半。如果运送的货物数量适合卡车a,但对于卡车B来说是两个大的数量,则卡车B需要两倍的行程才能完成相同的工作。Thumb的效率不及ARM的一半,它比ARM多了10-15%的指令来做同样的事情。另请参见:Stackoverflow,以及Thumb和ARM引导编译。还要非常小心,cortex-m3和cortex-m4是ARMv7m,cortex-m0和-m1是ARMv6m,这些指令集上的thumb2扩展之间存在很大差异,此外,编撰者还与大脑皮层一起前进