2010-01-21 49 views
1

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

感谢, 本

+3

GCC 3.3!?你意识到这已经超过5年了?成为'真正的程序员'并编译你自己的GCC 4.4.2工具链! – LiraNuna

+0

我已经为它编译了一个4.1 GCC工具链,但它看起来非常糟糕,所以我回到了供应商提供给我的那个工具链。 – user21293

+0

不知道“真正的程序员”的东西,但如果你测量最近的GCC的操作,你会发现,至少对于ARM来说,4.2是编译时所用的本地最小时间,用于编译的内存,生成目标代码的大小并且目标代码需要运行的时间。从4.3开始,所有4组中的某种指数增长都在。 – martinwguy

回答

4

是的,你没有FPU所以浮点数需要在整数数学中完成。但是,这样做有两种机制,一种比另一种快11倍。

GCC目标ARM-Linux的GNU通常包括在ARM的第一FPU代码真正的浮点指令的“FPA”,现在这么难得的是不存在的。这些会导致非法指令陷阱,然后在内核中被捕获和模拟。由于上下文切换,这非常缓慢。

-msoft浮子代替插入到库函数调用(在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浮来编译你的整个用户空间。

最全面深入阅读对这些问题是http://wiki.debian.org/ArmEabiPort这主要关心的是第三种选择:使用arm-linux-gnueabi编译器,一个新的替代ABI,可从GCC-4.1.1开始并具有不同的特点。有关更多详细信息,请参阅文档

5

不同于奔腾2,使用XScale架构没有原生浮点指令。这意味着浮点数学必须使用整数指令进行模拟 - 10至20倍的减速度听起来正确。

为了提高性能,你可以尝试的几件事情:

  • 如果可能的话,尽量少用浮点的 - 在一些地方,你可以到替补多平原整数或定点计算;
  • 通过在可能的情况下预先计算值表的折衷内存来提高速度;
  • 使用float s而不是double s计算时,您不需要后者的精度(包括使用C99 float版本的math.h函数);
  • 最小化整数和浮点类型之间的转换。
+0

或者,如果设备具有GPU,请参阅是否可以使用它。 –

2

“的其他的XScale编译器”

开源:LLVM和PCC,其中LLVM是最Linux友好和功能,并且还具有一个gcc前端; pcc是历史悠久的便携式C编译器的后代,似乎更多是面向bsd的。商业:Keil编译器(由ARM有限公司拥有)似乎比GCC产生更快的代码,但不会显着影响你对FPU的缺乏。