17

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

-mthumb仅用于兼容性和性能,而-marm通常更好?我问是因为 android-cmake-mthumb在发布模式和-marm调试中使用。这让我很困惑。

4

2 回答 2

27

Thumb 不是较旧的指令集,而是较新的指令集。当前版本是 Thumb-2,它是一个混合的 16/32 位指令集。Thumb1 指令集是原始 ARM 指令集的压缩版本。CPU 将获取指令,将其解压缩到 ARM 中,然后对其进行处理。如今(ARMv7 及更高版本),除了性能关键或系统代码之外,Thumb-2 是首选。例如,GCC 默认为 ARMv7 生成 Thumb2(就像您的 Tegra3),因为 16/32 位 ISA 提供的更高代码密度允许更好的 icache 利用率。但这是在普通基准测试中很难衡量的东西,因为大多数基准测试无论如何都适合 L1 icache。

有关更多信息,请查看 Wikipedia 站点:http ://en.wikipedia.org/wiki/ARM_architecture#Thumb

于 2012-06-16T17:58:01.203 回答
0

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

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

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

于 2019-04-16T10:41:41.693 回答