# 2016q3 Homework 1 (raytracing) contributed by <`ElfayR`> ### Reviewed by `Quexint` - 平行化的關鍵在於夠多的工作、單一工作夠久,才會有效果。原因在於要花多餘的時間去啟動。 - 因此,簡單的數學函式應全部寫出來(ex: 公式寫在同一行等),複雜的函式才用平行化去解。 ### 系統環境 * AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ * Core: 2 * Memory: 3GB ram * L1d cache: 64K * L1i cache: 64K * L2 cache: 512K ## 系統分析 * 參考作業使用`make PROFILE=1` 來產生`gmon.out` 參考說明網頁使用 `gprof -b raytracing gmon.out`來分析效能瓶頸主要是在`dot_product`和 `subtract_vector`兩個函數上面。 ![](https://i.imgur.com/n6uzHjp.png) 執行時間 `Execution time of raytracing() : 8.946531 sec` ## 改善效能 * 因之前並未使用過OpenMP 先嘗試使用此種方法來加速。 ### OpenMP * openMP是可以供平行運算的編成API。 * 先參考簡單的作法直接使用 `#pragma omp parallel for`來針對`dot_product`但跑出來結果竟然變差很多。 ```C static inline double dot_product(const double *v1, const double *v2) { double dp = 0.0; #pragma omp parallel for for (int i = 0; i < 3; i++) dp += v1[i] * v2[i]; return dp; } ``` `Execution time of raytracing() : 125.185435 sec` * 讓我有點嚇到,查詢一下`dot_product`效能有降低但是主程式花費時間大幅上升。應該是主機只有雙核心再做多執行序處理反而造成過多負擔。 ![](https://i.imgur.com/9uTSgpQ.png) >> 避免用圖片來表示程式的文字輸出 [name=jserv] >> 不太懂? 是指 gprof 的指令部分不要用圖片顯示而是直接用程式碼來說明? [name=Ping Chun Wang (ElfayR)] ### loop unrolling * 回頭來使用 loop unrolling的方法來處理。針對 `math-toolkit.h`內部使用到`for`迴圈的程式都使用loop unrolling拆開。效能有顯著提升。 `Execution time of raytracing() : 5.589559 sec` ![](https://i.imgur.com/JJbrXsD.png) ### 整體效能比較 * 對照編譯器最佳化的optimized 的版本 ![](https://i.imgur.com/GldU22H.png) ### 未來工作 * 採用 pthread API來加速並贏過編譯器最佳化版本。 >> 等你呀! [name=jserv] ``` main (void){ } ``` ### 參考資料 * [OpenMP](https://www.dartmouth.edu/~rc/classes/intro_openmp/compile_run.html) ###### tags: `ElfayR`