7

我正在研究具有 Thumb-2 指令集的 ARM Cortex-M3 控制器。

Thumb 模式用于将指令压缩为 16 位大小。所以代码的大小减少了。但是在正常的Thumb模式下,为什么说性能降低了?

在 Thumb-2 的情况下,据说根据这两个链接提高了性能:

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

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

这种表现究竟是什么?有人可以举一些与之相关的例子吗?

4

2 回答 2

10

与 ARM 32 位指令集相比,thumb 16 位指令集(还没有讨论 thumb2 扩展)占用的空间更少,因为指令大小只有一半,但通常会出现性能下降,因为它需要更多指令做与手臂相同的事情。指令集的功能较少,大多数指令仅在寄存器 r0-r7 上运行。Apples to Apples比较更多的指令来做同样的事情更慢。

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

这给出了问题的味道,手臂中的单个指令和拇指中的等效指令。

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}

现在编译器不会这样做,编译器会知道它的目标是拇指,并通过选择其他寄存器来做不同的事情。每条指令仍然有更少的寄存器和更少的功能:

mov r0,r1
and r0,r2

仍然需要两个指令/执行周期和两个寄存器在一起,而不修改操作数,并将结果放在第三个寄存器中。Thumb2 有一个三个寄存器,因此您返回到使用 thumb2 扩展的单个指令。并且该 thumb2 指令允许在拇指限制为 r0-r7 的三个寄存器中的任何一个上使用 r0-r15。

查看 ARMv5 Architectural Reference Manual,在每个 thumb 指令下,它会显示等效的 ARM 指令。然后转到那个 ARM 指令并比较你可以用那个 arm 指令做什么,而你不能用 thumb 指令做。这是一条单向路径,拇指指令(不是拇指 2)与 ARM 指令具有一对一的关系。所有拇指指令都有一个等效的手臂指令。但并非所有手臂指令都有等效的拇指指令。您应该能够从这个练习中看到使用 thumb 指令集时对编译器的限制。然后拿到 ARMv7m Architectural Reference Manual 看指令集,对比一下“all thumb variant” 编码(包括 ARMv4T 的编码)和仅限于 ARMv6 和/或 v7 的编码,并查看 thumb 和 thumb2 之间的功能扩展以及没有 thumb 对应的仅 thumb2 指令。这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. . 这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. . 这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. .

于 2013-04-06T04:01:40.017 回答
8

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 中编码。

于 2013-04-25T00:29:16.560 回答