自從Compaq Visual Fortran不再進行產品開發後, 由Intel研發團隊持續的維護產品, 但是這兩個產品是由不同的研發團隊所開發出來的, 因此在程式碼的相容性上有時就會出現問題, 近日台大機械系顏瑞和老師就遇到移植的問題, 顏老師將原先在CVF上開發的程式碼移植到IVF上後, 發現IVF編譯出來的程式執行速度慢了許多, 原先在CVF只需花費9.57秒, 移植到IVF後卻要花費85.39秒, 速度慢了將近9倍

接到這樣的問題後, 逸奇的工程師就開始進行測試, 一開始的測試結果和顏老師的狀況相符合, IVF慢了許多, 而且不論是用Debug或是Release模式下編譯的結果都一樣, 因此開始懷疑是否有用到其他的計算函式庫功能, 初步推測有可能是因為IMSL版本的關係

接著為了能夠明確的找出程式執行的瓶頸, 採用Intel VTune軟體來進行效能的測試, CVF和IVF都使用Debug模式來編譯程式, 產生兩組執行檔後, 使用VTune來執行程式, 經過測試後發現一個有趣的現象

首先從VTune的Sample結果來看, 在CVF這組的最花時間的是TRI_LAPLACIAN副程式, 而D_LIN_SOL_GEN只佔6%的計算時間
vtune_001.jpg

如果對照IVF的結果最花時間的仍然是TRI_LAPLACIAN副程式, 但是D_LIN_SOL_GEN佔了24%的計算時間
vtune_002.jpg

然後透過Call graph去追朔發現是在某個副程式有使用到.ix. .x. 這兩個operator, 造成D_LIN_SOL_GEN會被呼叫起來執行
vtune_003.jpg

再透過Google搜尋發現這個D_LIN_SOL_GEN就是IMSL用來解線性代數計算的函式

所以使用VTune的分析追蹤可以知道移植到IVF後, 可能因為新版IMSL在Operator這方面的處理出了問題, 所以計算效能大幅的降低, 最後顏老師將使用到IMSL的程式碼抽換掉後移植到IVF上就沒有計算速度慢很多的問題了