1

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

谢谢,本

4

3 回答 3

5

与 Pentium 2 不同,XScale 架构没有本地浮点指令。这意味着必须使用整数指令来模拟浮点数学 - 10 到 20 倍的减速听起来是正确的。

为了提高性能,您可以尝试以下方法:

  • 在可能的情况下,尽量减少浮点的使用——在某些地方,您可能可以用纯整数或定点计算代替;
  • 通过在可能的情况下预先计算值表来权衡内存以换取速度;
  • 在不需要后者精度的计算中使用floats 而不是s(包括使用 C99版本的函数);doublefloatmath.h
  • 最小化整数和浮点类型之间的转换。
于 2010-01-21T04:58:23.650 回答
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>让制表符通过您的外壳。

如果它使用 FPA insns,则需要使用 -msoft-float 编译整个用户空间。

关于这些问题的最全面的进一步阅读是http://wiki.debian.org/ArmEabiPort主要关注第三种选择:使用arm-linux-gnueabi编译器,从 gcc-4.1.1 开始提供的更新的替代 ABI 并且具有不同的特点。有关详细信息,请参阅文档。

于 2010-01-21T14:56:48.980 回答
2

“其他 xscale 编译器”

开源:llvm 和 pcc,其中 llvm 对 linux 最友好,功能最强大,同时还有 gcc 前端;pcc 是古老的 Portable C Compiler 的后代,似乎更面向 bsd。

商业:Keil 编译器(由 ARM Ltd 拥有)似乎生成的代码比 GCC 更快,但不会显着影响您缺少 FPU。

于 2010-01-21T15:08:52.773 回答