# 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要改到最後一筆才行,修正後正常繪圖。 ![](https://i.imgur.com/wPeV1yd.png)