2014-03-01 64 views
1

所以,問題是:優化函數入口/出口(GCC)

  • 如何使用GCC,純C優化函數入口&退出代碼在便攜方式速度?

我對相關選項等感興趣。我的目標是編寫一個CPU模擬器,其中指令集使用調用表進行解碼。我已經消除了可以合理消除的任何函數調用,但是由於指令集的結構,每個模擬指令需要執行2-3次這樣的調用(因此我無法在這裏消除任何更多的分支誤預測)。

在分析程序集(x86,32位)輸出的基礎上,選項似乎是值得的(一旦我不在意這裏丟失的調試能力)。否則一般情況下,如果我查看完整的仿真器,看起來總體寄存器和堆棧管理可能會更好(不要在每個條目中保存每一件東西),但我對生成的程序集的印象是,它會更多地篡改堆棧比它做多少有用的工作。

所以情況基本上是有很多很少被稱爲許多次的小函數,而且這些函數不能從代碼中消除。

我不想從解釋仿真切換,因爲這應該是最便攜的方法來做這件事(無論如何比任何解決方案,將重新編譯)。

回答

2

在x86-32上,常見操作系統的ABI具有標準調用約定,這些約定使用堆棧將參數傳遞給函數,因爲通用寄存器很少。改進函數調用的一種方法是隻使用少量參數(並且參數相對簡單),就是使用不同的調用約定(如fastcall),它們使用寄存器來傳遞參數。

如果轉移到x86-64是一個選項(它應該是,它已經存在了很長時間了......),ABI對於快速函數調用來說要好得多,因爲通用寄存器的數量增加了一倍。

+0

是的,x86-64是一個選項(真的,我認爲幾乎所有現有的64位機器實際上對我的目標來說實在是太過於強大),但是在這裏我(也)的目標是用這個產品回到「及時」即使在舊東西上也能很好地工作我正在測試這個方向,希望我能夠通過正確地爲現有代碼參數化GCC來達到(或者更近)。 – Jubatian

+0

那麼,在這種情況下,請嘗試在您的函數定義中預先掛起'__attribute __((fastcall))',看看它是否加快速度。 – EOF

+0

我篡改了一段時間的代碼,仔細分析程序集的輸出,看起來這些都是關於這個問題。 '-fomit-frame-pointer'對這些小函數有很大的幫助,否則使用你所提到的那些對於入口/返回沒有嚴格要求的東西進行刮擦。現在,這件事甚至可以運行在我尊敬的Pentium 233 MMX上。大會顯示了一些其他瓶頸,但如果我認爲合適,這些瓶頸可能是其他問題的主題。 – Jubatian