GCC -mthumb反对-marm

时间:2012-06-16 11:18:27

标签: optimization gcc arm

我正在研究使用GCC编译的ARM C / C ++代码的性能优化。 CPU是Tegra 3。 据我所知,标志-mthumb表示生成旧的16位Thumb指令。在不同的测试中,我-marm-mthumb的性能提升了10-15%。

-mthumb仅用于兼容性和性能,而-marm通常更好吗? 我问,因为android-cmake在Release模式下使用-mthumb而在Debug中使用-marm。这对我来说非常困惑。

2 个答案:

答案 0 :(得分:25)

Thumb不是较旧的指令集,但实际上是较新的指令集。当前版本是Thumb-2,它是一个混合的16/32位指令集。 Thumb1指令集是原始ARM指令集的压缩版本。 CPU将获取指令,将其解压缩到ARM中然后处理它。目前(ARMv7及更高版本),Thumb-2是除性能关键或系统代码之外的所有内容的首选。例如,GCC默认会为ARMv7生成Thumb2(与Tegra3一样),因为16/32位ISA提供的更高代码密度可以更好地利用icache。但这在普通基准测试中很难衡量,因为无论如何大多数基准测试都适合L1 icache。

有关更多信息,请查看维基百科网站:http://en.wikipedia.org/wiki/ARM_architecture#Thumb

答案 1 :(得分:0)

ARM是32位指令,因此有更多位可以在一条指令中执行更多操作,而只有16位的THUMB可能必须在2条指令之间分配相同的功能。基于非内存指令或多或少花费相同时间的假设,更少的指令意味着更快的代码。还有一些东西是THUMB代码无法完成的。

当时的想法是将ARM用于性能至关重要的功能,而THUMB(将2条指令放入一个32位字中)将用于最小化程序的存储空间。

随着CPU内存缓存变得越来越关键,与每条指令的功能密度相比,在icache中拥有更多指令是速度的更大决定因素。这意味着THUMB代码变得比等效的ARM代码更快。因此,ARM(corp)创建了THUMB32,这是一种可变长度指令,其中包含了大多数ARM功能。由于更好的缓存,在大多数情况下,THUMB32应该为您提供更密集和更快的代码。