Try   HackMD

2016q3 Homework 1 (raytracing)

contributed by <ElfayR>

Reviewed by Quexint

  • 平行化的關鍵在於夠多的工作、單一工作夠久,才會有效果。原因在於要花多餘的時間去啟動。
  • 因此,簡單的數學函式應全部寫出來(ex: 公式寫在同一行等),複雜的函式才用平行化去解。

系統環境

  • AMD Athlon 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_productsubtract_vector兩個函數上面。

    執行時間 Execution time of raytracing() : 8.946531 sec

改善效能

  • 因之前並未使用過OpenMP 先嘗試使用此種方法來加速。

OpenMP

  • openMP是可以供平行運算的編成API。
  • 先參考簡單的作法直接使用 #pragma omp parallel for來針對dot_product但跑出來結果竟然變差很多。
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效能有降低但是主程式花費時間大幅上升。應該是主機只有雙核心再做多執行序處理反而造成過多負擔。

避免用圖片來表示程式的文字輸出 jserv
不太懂? 是指 gprof 的指令部分不要用圖片顯示而是直接用程式碼來說明? Ping Chun Wang (ElfayR)

loop unrolling

  • 回頭來使用 loop unrolling的方法來處理。針對
    math-toolkit.h內部使用到for迴圈的程式都使用loop unrolling拆開。效能有顯著提升。
    Execution time of raytracing() : 5.589559 sec

整體效能比較

  • 對照編譯器最佳化的optimized 的版本

未來工作

  • 採用 pthread API來加速並贏過編譯器最佳化版本。

等你呀! jserv

 main (void){
 
 }

參考資料

tags: ElfayR