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