我工作的ARM C / C ++代码的性能优化,使用GCC编译。 CPU是的Tegra 3,据我所知标志-mthumb
需要生成旧的16位Thumb指令。 在不同的测试,我有10-15%的性能提升-marm
对-mthumb
。
是-mthumb
仅用于兼容性和性能,同时-marm
一般是更好? 我问,因为Android的cmake的使用-mthumb
在Release模式和-marm
在调试。 这对我来说是非常混乱。
我工作的ARM C / C ++代码的性能优化,使用GCC编译。 CPU是的Tegra 3,据我所知标志-mthumb
需要生成旧的16位Thumb指令。 在不同的测试,我有10-15%的性能提升-marm
对-mthumb
。
是-mthumb
仅用于兼容性和性能,同时-marm
一般是更好? 我问,因为Android的cmake的使用-mthumb
在Release模式和-marm
在调试。 这对我来说是非常混乱。
拇指是不是上了年纪的指令集,但事实上较新的一个。 当前版本是拇指-2,这是一个混合的16位/ 32位指令集。 该Thumb1指令集是原来的ARM指令集的压缩版本。 该CPU将取指令,它解压缩到ARM,然后对其进行处理。 这些天(ARMv7及更高),拇指-2是优选的一切,但性能关键或系统代码。 例如,GCC将默认生成的Thumb2对ARMv7(像您的Tegra3),如由16位/ 32位ISA提供的较高的代码密度允许更好ICACHE利用率。 但是,这东西是很难在一个正常的基准来衡量,因为大部分测试将装配到L1 ICACHE反正。
欲了解更多信息,请查看维基百科网站: http://en.wikipedia.org/wiki/ARM_architecture#Thumb
ARM是一个32位的指令,以便有更多的比特做更多的事情在单个指令同时大拇指只有16位可能需要2个指令之间分裂相同的功能。 基于非存储器的指令了或多或少的同时假设,较少的指令意味着更快的代码。 也有一些事情,只是不能用大拇指代码来完成。
这个想法是然后ARM将用于性能关键的功能,同时拇指(其适合2个指令转换成一个32位的字)将被用于最小化的程序的存储空间。
作为CPU存储器缓存变得更加关键的,具有在ICACHE多个指令是速度的比每指令功能密度更大的决定因素。 这意味着拇指代码变得比同等ARM代码快。 因此ARM(CORP)中创建THUMB32这是一个可变长度指令并入最ARM功能。 THUMB32在大多数情况下,由于更好的缓存给你更密集,以及更快的代码。