contributed by <HuangWenChen
>
可使用$ lscpu
and $ cat /etc/os-release
查看規格
$ make
$ ./raytracing
參考資料
Gprof 是GNU profiler工具,可以觀察程序運行中各個函數消耗的時間。
基本使用:
-pg
選項編譯和鏈接你的應用程序。編輯 Makefile 加上 -pg 參數 ,再進行編譯跟執行,就會產生一個gmon.out檔
$ make PROFILE=1
PROFILE=1
讓gcc加上 -pg
此參數。
$ make
$ ./raytracing
$ make PROFILE=1
$ ./raytracing
執行後產生 gmon.out 檔案
時間增加是因為中間而外增加了程式碼
gprof options executable-file gmon.out
如果已都了解統計圖表每個字段可以加 -b
省略詳細描述。
$ gprof raytracing gmon.out
從圖表可以看出花大部分時間前兩個分別為
subtract_vector, dot_product
所以先從兩個 function 開始改寫。
原先版本 dot_product
讓迴圈去減少比較,展開使沒有做比較動作。
清除重新編譯
$ ./raytracing
發現時間從 14.407905 -> 13.070825 秒下降了 1.33708 秒
再將 subtract_vector 修改
清除重新編譯
$ ./raytracing
發現時間又從 13.070825 -> 12.072921 秒下降 0.997904 秒
在程式碼裡看到 static inline ,inline 是提示編譯器做最佳化在 function call 轉成程式碼,減少呼叫的成本,但是 Makefile 一開始就把最佳化關掉。
在 static inline
後加上 __attribute__((always_inline))
,就建議gcc去開起最佳化。
在 dot_product subtract_vector 上使用,又減少執行時間。
OpenMP(Open Multi-Processing)是一套支持跨平台共享內存方式的多線程並發的編程API
修改raytracing.c中的raytracing() 參考共筆與 tutorials 實做
要將 for 迴圈平行化處理要加上次行
num_threads()
要開的執行緒數量
private()
需要獨立變數
在共筆提及到需要 #include<omp.h>
, 以及修改 MakeFile 在編譯選項中加上 -fopenmp
為了方便這裡不加上 -pg
去監控。
16個執行緒,時間明顯改善很多