我目前正在使用基于GCC 3.3.3的交叉编译器来编译Xscale PXA270开发板。但是,我想知道是否有其他Xscale编译器在Linux(或Windows)上运行?我正在使用的交叉编译器设置在目标设备上具有可怕的性能,某些程序在Xscale处理器上执行相当数量的数学运算比在类似时钟的Pentium 2上执行10到20倍。编译器的任何其他选项我应该使用基于GCC的编译器设置特定的编译器标志,这可能对性能有帮助吗?
谢谢, 本
答案 0 :(得分:5)
与Pentium 2不同,XScale架构没有本机浮点指令。这意味着必须使用整数指令模拟浮点数学 - 关于正确的10到20倍减速声音。
为了提高性能,您可以尝试以下几点:
float
而不是double
s(包括使用C99 float
版本的math.h
个函数); 答案 1 :(得分:4)
是的,您没有FPU,因此需要在整数数学中完成浮点运算。但是,有两种机制可以做到这一点,其中一种机制比另一种快11倍。
GCC目标arm-linux-gnu通常在ARM的第一个FPU代码中包含实际浮点指令,即“FPA”,现在非常罕见,它不存在。这些会导致非法的指令陷阱,然后在内核中捕获并模拟。由于上下文切换,这非常慢。
-msoft-float反而插入对库函数的调用(在libgcc.a中)。这样可以避免切换到内核空间,并且比模拟FPA指令快11倍。
您没有说明您正在使用的浮点模型 - 可能您已经使用-msoft-float构建整个用户空间 - 但是可能值得检查您的目标文件是否包含FPA指令。您可以查看:
objdump -d file | grep '<space><tab>f' | less
其中file
是编译器输出的任何目标文件,可执行文件或库。所有FPA指令都以f
开头,而没有其他ARM指令。这些是实际的空格和制表符,您可能需要说<control-V><tab>
才能将制表符添加到shell之外。
如果它使用的是FPA insn,则需要使用-msoft-float编译整个用户区。
关于这些问题的最全面的进一步阅读是http://wiki.debian.org/ArmEabiPort,主要关注第三种选择:使用arm-linux-gnueabi
编译器,从gcc-4.1.1开始提供的新的替代ABI和它有不同的特点。有关详细信息,请参阅文档。
答案 2 :(得分:2)
“其他xscale编译器”
开源:llvm和pcc,其中llvm是最友好且功能最强大的,并且还有一个gcc前端; pcc是古老的Portable C Compiler的后代,似乎更像bsd。
商业:Keil编译器(由ARM Ltd拥有)似乎比GCC产生更快的代码,但不会显着影响您缺乏FPU。