我正在研究使用GCC编译的ARM C / C ++代码的性能优化。 CPU是Tegra 3.据我所知,标志-mthumb
意味着生成旧的16位Thumb指令。在不同的测试中,我使用-marm
对-mthumb
的性能提高了10-15%。
-mthumb
仅用于兼容性和性能,而-marm
通常更好吗?我问,因为android-cmake在Release模式下使用了-mthumb
,在Debug中使用了-marm
。这对我来说非常困惑。
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
ARM是一个32位指令,因此在单条指令中有更多的位可以执行更多操作,而只有16位的THUMB可能必须在2条指令之间分配相同的功能。基于非存储器指令或多或少同时花费的假设,更少的指令意味着更快的代码。还有一些使用THUMB代码无法完成的事情。
之后的想法是ARM将用于性能关键功能,而THUMB(将2条指令装入32位字)将用于最小化程序的存储空间。
随着CPU内存缓存变得越来越重要,在icache中拥有更多指令是速度的决定因素,而不是每条指令的功能密度。这意味着THUMB代码变得比等效的ARM代码更快。因此,ARM(corp)创建了THUMB32,这是一个包含大多数ARM功能的可变长度指令。在大多数情况下,由于更好的缓存,THUMB32应该为您提供更密集和更快的代码。