2010-01-21 50 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的缺乏。