Jus*_*cle 25 iphone performance arm thumb
我想知道是否有人在iPhone 3GS上有ARM与Thumb代码性能有任何硬数据.特别是对于非浮点(VFP或NEON)代码 - 我知道Thumb模式下浮点性能的问题.
是否存在大型ARM指令的额外代码大小成为性能危害的程度?换句话说,如果我的可执行代码与可用内存相比相对较小,那么打开Thumb模式是否有任何测量的性能差异?
我问的原因是虽然我可以使用"-marm"选项为Xcode中的NEON特定源文件启用ARM,但这会破坏模拟器构建,因为GCC正在构建x86.我想知道我是否应该关闭"以拇指编译"并完成它.
old*_*mer 13
我不知道iPhone,但拇指比ARM慢的一揽子声明根本不正确.给定32位宽的零等待状态存储器,拇指会慢一点,数字为5%或10%.现在,如果它是一个不同的故事thumb2,据说thumb2可以运行得更快,我不知道iPhone有什么我的猜测是它不是thumb2.
如果没有耗尽零等待状态的32位内存,那么结果会有所不同.一个重要的是32位宽的内存.如果您在像GameBoy Advance系列这样的16位宽总线上运行,并且该内存或ROM上有一些等待状态,那么即使需要更多的拇指指令来执行相同的任务,拇指也可以轻松地运行ARM以获得性能.
测试你的代码!发明一个提供您感兴趣或不感兴趣的结果的测试并不难.很容易显示手臂吹掉拇指,因为拇指吹走了手臂.谁在乎dhrystones是什么,它运行你的代码有多快,今天重要.
多年来我在测试ARM代码性能时发现的是你的代码和编译器是最重要的因素.所以拇指在理论上要慢一些,因为它使用了几个百分点的指令来执行相同的任务.但是你知道你最喜欢的编译器可能很糟糕吗,只需切换编译器就可以运行几倍(gcc属于那个类别)?或者使用相同的编译器并混合优化选项.无论哪种方式,你都可以通过聪明地使用工具来遮蔽手臂/拇指的差异.您可能知道这一点,但您会惊讶地发现有多少人认为他们知道如何编译代码的唯一方法是获得更好性能的唯一方法是在问题上投入更多内存或其他硬件.
如果你在iPhone上我听说那些人正在使用LLVM?我在许多方面都喜欢llvm概念,并且渴望在它成熟时将它用作我的日常驱动程序,但发现它为我正在执行的特定任务生成的代码速度要慢10-20%(或者更多).我处于手臂模式,我没有尝试拇指模式,我有一个l1和l2缓存.如果我在没有缓存的情况下进行测试以真正比较拇指和手臂,我可能会看到拇指慢几个百分点,但是如果你想到它(我当时并不感兴趣)你可以缓存两倍的拇指代码而不是手臂代码可能暗示即使整个任务的代码总数增加了几个百分点,通过缓存更多的代码并减少平均获取时间,拇指可以明显更快.我可能要去尝试一下.
如果您正在使用llvm,则还有其他问题需要多个位置来执行优化.从C到字节码你可以优化,然后你可以优化字节码本身,然后你可以合并你的所有字节码并优化它作为一个整体,然后从字节代码到汇编程序,你可以优化.如果您只有3个源文件,并假设每个机会只有两个优化级别,那些不优化或优化,使用gcc你将有8个组合进行测试,使用llvm实验的数量几乎高出一个数量级.超过你真正可以运行,数百到数千.对于我正在运行的一个测试,没有选择C到字节码的步骤,然后在分离时不优化字节码,而是在将字节码文件合并为一个大(ger)之后进行优化.拥有有限公司优化的手臂产生了最好的结果.
底线...测试,测试,测试.
编辑:
我一直在使用字节码这个词,我认为正确的术语是LLVM世界中的bitcode..bc文件中的代码就是我的意思......
如果您使用LLVM从C转到ARM,则中间有bitcode(bc).有一些命令行选项可用于优化C到bc步骤.一旦bc你可以优化每个文件,bc到bc.如果您选择,您可以将两个或更多bc文件合并为更大的bc文件,或者只是将所有文件转换为一个大的bc文件.然后,还可以优化这些组合文件中的每一个.
我的理论,到目前为止只有几个测试用例,如果你没有做任何优化,直到你把整个程序/项目放在一个大的bc文件中,优化器有最大的数量,如果信息与做好自己的工作.所以这意味着没有优化从C到bc.然后将所有bc文件合并为一个大的bc文件.一旦你将整个事件作为一个大的bc文件,然后让优化器执行其优化步骤,最大化信息并希望优化的质量.然后从优化的bc文件转到ARM汇编程序.llc的默认设置是启用优化,您确实希望允许该优化,因为它是知道如何优化目标的唯一步骤.bc到bc优化是通用的,而不是特定于目标的(AFAIK).
你还需要测试,测试,测试.继续尝试各步骤之间的优化,看看它是否使程序运行得更快或更慢.
归档时间: |
|
查看次数: |
8278 次 |
最近记录: |