23.07.2013 Views

Solutions Brief Title – 18pt - HP

Solutions Brief Title – 18pt - HP

Solutions Brief Title – 18pt - HP

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

[下一張投影片]<br />

我想要簡短講一下的下個主題,是在您執行最佳化當中排解疑難問題時,可以使用的幾個選項。 主動最佳化其<br />

實可能暴露出應用程式的瑕疵,我們也從一些案例看到過;因為以主動方式將程式碼最佳化的時候,等於是把運<br />

算重新排序以及執行其他轉換,這時沒有最佳化之前不曾有過的瑕疵就會忽然出現。 例如,對於主動最佳化,<br />

未初始化的變數造成問題的可能性會高出很多。<br />

所以,若發現應用程式開始作出不正確的行為,或者發出訊號,表示出現 NaT 耗用的錯誤,這時可以嘗試用<br />

+Oinitcheck 選項看看,這個選項會教編譯器偵測並且初始化所有可能未初始化的變數,於是會把編譯器無法證<br />

實已經初始化的變數全部初始化為零,在您最佳化的過程中,忽然發覺應用程式開始出現錯誤的時候,這麼做往<br />

往可以讓錯誤消失。<br />

我還想要談的另外一個領域就是溢位;依照預設,標準的帶正負號整數運算溢位,它的行為模式未定。 不過,<br />

有些應用程式其實必須倚賴預設會發生的行為。 所以根據預設,編譯器會認定帶正負號的整數運算不會溢位,<br />

如果真的發生溢位,就會執行可能使結果改變的轉換。 如果您的應用程式真的發生帶正負號整數運算的溢位,<br />

必須倚賴沒有最佳化時因這種溢位而有某種特定行為的話,可以使用 Ointeger_overflow=conservative 選項,它<br />

會告訴編譯器,如果溢位是發生在帶正負號的整數運算指令,就不要執行可能會使行為改變的轉換。 另一方面<br />

,如果有一些變數的數值龐大,可能會造成溢位,可以使用 +Ointeger_overflow 的 aggressive 選項,允許編譯<br />

器在迴圈最佳化的過程中執行變數的一些縮放,但如果知道應用程式運算使用的數值並非極為龐大,就可以用<br />

aggressive 選項來製造進一步的迴圈最佳化機會。<br />

[下一張投影片]<br />

我想要談的最後一個主題,是可以用來進行效能分析與調整的幾種工具。 2007 年 9 月發行的編譯器中,有個<br />

新的 +wperfadvice 選項,有了這個選項,編譯器就可以送出效能改善的意見。 可能也會有程式碼轉換方面的建<br />

議。 可能還會建議一些在指令行套用的選項,如果要為應用程式尋找最佳化的機會,不妨一試。 此外,<br />

Caliper 工具非常適合用來提供在 <strong>HP</strong>-UX 上編譯的應用程式的詳細效能側寫。<br />

Caliper 中也有效能顧問模式,提供的建議例如對原始碼進行變更,或根據它所收集的詳細側寫、與從側寫資料<br />

中所分析出來的作用點,建議在編譯期間提出的選項。 我想提到的另外一點是,協力廠商的程式庫效能對於應<br />

用程式效能來說可能非常重要,因此請確定所要連入的程式庫也經過良好的最佳化,尤其如果會經常使用到的話<br />

。<br />

最後,您可以使用 +Oinfo 選項,讓編譯器送出所執行最佳化屬於哪種類型的資訊,或許它能透露出編譯器所套<br />

用的最佳化類型,此外也可能指出一些實用的最佳化標幟,有助於更加主動地最佳化您的程式碼。 例如,若看<br />

到編譯器送出程式碼中的許多預讀,可能表示這個程式碼具有大量執行巢狀迴圈的傾向,這時如果您還在 +O2<br />

層級,就可以考慮把最佳化層級提高到 +O3。<br />

[下一張投影片]<br />

總之,請儘可能保持使用最新版本的編譯器。 剛才提過,編譯器所產生的效能會持續不斷地改良,所以只要改<br />

用最新版的編譯器,您的應用程式就能夠繼續提高效能。 另外,我也提過,當您建置應用程式的時候,從 +O2<br />

開始可以輕輕鬆鬆獲得非常不錯的效能,至於浮點數的應用程式,則請從 +O3 開始。 大力推薦您使用側寫最

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!