contributed by <xdennisx
>
PeterTing
gprof 可以讓你知道你的程式在哪些部份花了多久的時間,也可以知道
function 之間 call 來 call 去的關係,這些資訊可以讓你發現你的程式中哪些部份執行的速度比你預期中的慢,或是哪些 function call 的次數比想像中的多,這些都是開發者想要增進效能一個很好切入的點
使用前將編譯器加入 -pg
,這邊就打 make PROFILE=1
就好
執行他!
追蹤他!
結果
從上面那張圖發現 dot_product
花的時間最多,所以我們從這裡下手,把裡面的 for loop unrolling
再分析一次
時間成功下降!
dot_product
,成功從第一名變第二名
把所有的迴圈 unroll
inline
對 compiler 來說只是個建議的詞,不是說你打 inline
就一定會 inline
,所以如果要強制 inline
,就需要在 inline
後面加上 __attribute__ ((always_inline))
從6.45秒變成2.94秒是否有點誇張
把 raytracing()
裡面的 for loop
做平行化處理,這是把一張圖等分成四份,從上到下
大概下降 0.5 秒
有個奇妙的地方,我用一樣多的 thread 去做同樣的事,只是順序不太一樣,結果竟然有差!
跟上一種 thread 大概也差了 0.4 秒,這樣前後差了就快 1 秒
不知道怎樣的順序會是最快的?