【问题标题】:Xscale compilers for Linux? (also Xscale compile flags question)适用于 Linux 的 Xscale 编译器? (也是 Xscale 编译标志问题)
【发布时间】:2011-01-07 14:20:16
【问题描述】:

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

谢谢, 本

【问题讨论】:

  • GCC 3.3!?你知道那已经超过5岁了吗?做一个“真正的程序员”,编译你自己的 GCC 4.4.2 工具链!
  • 我已经为它编译了一个 4.1 的 GCC 工具链,但它似乎很受欢迎或错过了,所以我回到了供应商提供给我的那个。
  • 不知道“真正的程序员”的东西,但如果你测量最近的 GCC 的操作,你会发现,至少对于 ARM,4.2 是编译时间的本地最小值,内存过去编译、生成的目标代码的大小和目标代码运行所需的时间。从 4.3 开始,所有 4 集都出现某种指数增长。

标签: linux gcc arm cross-compiling xscale


【解决方案1】:

“其他 xscale 编译器”

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

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

【讨论】:

    【解决方案2】:

    是的,您没有 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,它具有不同的特性.详情请参阅文档。

    【讨论】:

      【解决方案3】:

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

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

      • 在可能的情况下,尽量减少浮点的使用 - 在某些地方,您也许可以用普通整数或定点计算代替;
      • 通过在可能的情况下预先计算值表来权衡内存以换取速度;
      • 在不需要后者精度的计算中使用floats 而不是doubles(包括使用math.h 函数的C99 float 版本);
      • 尽量减少整数和浮点类型之间的转换。

      【讨论】:

      • 或者,如果设备有 GPU,看看你是否可以使用它。
      猜你喜欢
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多