适用于Linux的Xscale编译器? (也是Xscale编译标志问题)

时间:2010-01-21 04:44:31

标签: linux gcc arm cross-compiling xscale

我目前正在使用基于GCC 3.3.3的交叉编译器来编译Xscale PXA270开发板。但是,我想知道是否有其他Xscale编译器在Linux(或Windows)上运行?我正在使用的交叉编译器设置在目标设备上具有可怕的性能,某些程序在Xscale处理器上执行相当数量的数学运算比在类似时钟的Pentium 2上执行10到20倍。编译器的任何其他选项我应该使用基于GCC的编译器设置特定的编译器标志,这可能对性能有帮助吗?

谢谢, 本

3 个答案:

答案 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。