2010-09-24 52 views
14

我正在處理一些代碼,其中包含一些(編譯器生成的)彙編代碼塊,我們已經確定它們是速度瓶頸。是否有任何優秀的現代在線指南來優化彙編代碼?

我有足夠的瞭解裝配矇混過關,尋找手工優化 - 我不知道,不過,如果有在手工優化彙編中使用任何好處,在線指南,提供可重複使用的技術。這不是我希望我經常這樣做的事情,所以我不得不每次都從頭開始再學習如何做。

+4

如果你心裏有一個特定的架構,請適當地標記(「86」或「臂」或其他)。 – 2010-09-24 22:26:00

回答

8

http://www.agner.org/optimize/optimizing_assembly.pdf

我會說「玩得開心」,但它很可能是真的小氣:(

我認爲您對在第9章,「優化速度」。

+1

這看起來像一本很棒的書。我還會推薦關於矢量編程的第13章。 – 2010-09-24 21:01:15

1

雖然這可能不需要說...

一般情況下,你會幫助編譯器(我使用GCC作爲一個例子,但是這應該是相關的其他編譯器太)進一步走了很多:

  • 播放與編譯器選項一會兒(-march =原始,-mfpmath = SSE,-msse3,-marm,-mthumb)
  • 時,你可以使用分析信息(-fprofile-產生,-fprofile使用)
  • 調整算法,看看什麼產生「更好」的代碼((x>>8)&0xFF(x&0xFF00)>>8?它是PPC上的一條指令,但編譯器可能會使用兩條指令)
  • 調整您的算法,使其更好地使用緩存。
  • 如果您的編譯器支持它們,則使用vector extensions。您的編譯器可能有其他target-specific builtinsx86,ARM NEON)。
  • 使用更好的編譯器(RVCT用於ARM,ICC用於x86)

我會感到驚訝,如果你能得到超過20%的增速更超過一個體面的C編譯器,除非有特殊說明/編譯器不使用的功能。除非它是你的所有應用程序,否則20%很少值得回憶。

+0

+ +1爲了一個好的答案,並取消了無理由的downvote - 這是一個非常重要的一點 - 當談到現代CPU的優化時,要打敗一個*好的編譯器是相當困難的 – 2010-09-27 07:37:57