浮點操作活動明顯表示可能適用專門針對浮點演算法的優化方法。
在以下情況中,此細節具有實質性意義:
計數器的商(失效的浮點操作/失效的指令)較高。值 0.00 應視為較低,值 0.95 應視為較高。
考慮使用壓縮版的“數據流單指令多數據擴充套件指令集”(SSE) 或 SSE2 程式碼。由於使用標量 SSE 程式碼而不使用常規浮點程式碼可能會降低效能(具體取決於指令混合情況),因此請使用編譯器的 /QxW 標誌檢查效能影響。原因在於,熔合程式碼跟 x87 程式碼、標量 SSE 程式碼不同,它無法進行從記憶體到暫存器的操作。通常情況下,使用壓縮程式碼極有可能改善效能。
研究佔用大部分執行時間的循環巢狀的彙編程式碼,以瞭解編譯器執行了哪些型別的轉換,並考慮還可能執行其它哪些優化。
考慮將長延遲浮點算術運算替換成更快的運算。
設法將長延遲浮點算術運算(如除法)替換成更快的運算(如乘以倒數)。如果要頻繁執行除法,除非確有必要,否則請不要使用較高的精度。與雙精度(64 位)或擴充套件雙精度(80 位)相比,單精度(32 位)的除法速度更快,並且只消耗一半的記憶體空間。請注意,更改數據型別(例如,從 double 更改成 float)不會自動更改執行算術運算時的精度。精度可通過更改浮點狀態暫存器進行設定。降低除法開銷的另一種辦法是使用 SSE 標量或壓縮除法指令。如需有關詳細資訊,請參閱處理器的“程式設計師參考手冊”。
如果程式碼需要執行 float 到 int 轉換,請確保使用 float 到 int 快速轉換例程。許多函式庫所做的工作都超過必需做的工作,請確保 float 到 int 的轉換例程速度較快。請注意,由於 FORTRAN 與 C 語言的語義方面的原因,float 到 int 的轉換可能會暗中發生,因此可能不容易注意到發生了 float 到 int 的轉換。有時候,通過檢視“VTune™ 效能分析器”的輸出中是否出現例程 _ftol(),可以檢測出是否發生 float 到 int 轉換。對於某些編譯器(如英特爾(R) C++ 編譯器),由於例程是內嵌的,因此更難檢測此種轉換。使用 SSE 指令可以解決此問題,SSE 指令使用截斷轉換指令。
確保應用程式中的數據在正確的範圍內。數值超出範圍會導致非常高的開銷。如果使用“數據流單指令多數據擴充套件指令集”(SSE),並且在處理浮點值,請嘗試使用 SSE 的清除為零模式。
儘可能使用“英特爾(R) MKL”(數學內核庫)。這些庫包含許多常用的線性代數例程,如 BLAS3、LAPACK 等等。
考慮編譯器驅動的向量化。如需有關編譯器驅動的向量化的詳細資訊,請參閱編譯器文件。目前,對於英特爾(R) C++ 編譯器,向量化功能通過命令列開關 -QxW 啟用。