Try   HackMD

2016q3 Homework1 compute-pi

contributed by <finalallpass>

Reviewed bt RayPan

  • 尚未闡明openmp 4圖形何以抖動得如此劇烈。
  • 除了使用Leibniz外也可使用其他數學模型來比較效能,如蒙地卡羅法。

  • 將原始程式碼做make check,可以看到有4種優化的版本。
 benchmark_clock_gettime
time ./time_test_baseline
N = 400000000 , pi = 3.141593
7.31user 0.03system 0:07.34elapsed 100%CPU (0avgtext+0avgdata 1632maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
time ./time_test_openmp_2
N = 400000000 , pi = 3.141593
7.26user 0.02system 0:03.64elapsed 199%CPU (0avgtext+0avgdata 1624maxresident)k
0inputs+0outputs (0major+82minor)pagefaults 0swaps
time ./time_test_openmp_4
N = 400000000 , pi = 3.141593
7.13user 0.01system 0:02.17elapsed 328%CPU (0avgtext+0avgdata 1620maxresident)k
0inputs+0outputs (0major+90minor)pagefaults 0swaps
time ./time_test_avx
N = 400000000 , pi = 3.141593
2.90user 0.00system 0:02.90elapsed 100%CPU (0avgtext+0avgdata 1636maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
time ./time_test_avxunroll
N = 400000000 , pi = 3.141593
0.94user 0.00system 0:00.94elapsed 99%CPU (0avgtext+0avgdata 1624maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
  • baseline

    • 單獨執行基本的版本看一下所需時間 time ./time_test_baseline
N = 400000000 , pi = 3.141593

real	0m7.415s
user	0m7.404s
sys	0m0.012s
  • OpenMP

    • 再來是運用raytracing時有用到的openmp優化,那這裡提供了2個threads跟4個threads來測試, 當然4個threads同時的效能會比兩個好上一些。
time ./time_test_openmp_2
N = 400000000 , pi = 3.141593

real	0m3.677s
user	0m7.352s
sys	0m0.000s

time ./time_test_openmp_4
N = 400000000 , pi = 3.141593

real	0m2.210s
user	0m7.164s
sys	0m0.000s
  • AVX

    • AVX的部份由於不太熟悉先看看相關資料
    • 執行時間
time ./time_test_avx
N = 400000000 , pi = 3.141593

real	0m2.951s
user	0m2.944s
sys	0m0.000s
  • AVX with loop unrolling

    • 運用unroll loop的方式去展開avx中的迴圈來優化程式。
    • 執行時間
N = 400000000 , pi = 3.141593

real	0m0.802s
user	0m0.800s
sys	0m0.000s

  • 增加運用Leibniz formula for pi

double compute_pi_Leibniz(size_t N)
{
    double pi = 0.0;
        double x;
        for (size_t i = 0; i < N; i++) {    
        int tmp = (i%2) ? -1 : 1;    
            x = (double)tmp / (2*i +1);
            pi += x;
        }
    return pi * 4.0;
}


time ./time_test_Leibniz 
N = 400000000 , pi = 3.141593

real	0m3.662s
user	0m3.660s
sys	0m0.004s

用gnuplot做圖時出現錯誤訊息Skipping data file with no valid points。嘗試解決中。
覺得應該是表格換行造成,超過五筆資料他會自己換行,這樣對CSV來說已經是下一筆資料所以一定會出現錯誤。
%f後面的\n要改到最後一筆才行,修正後正常繪圖。