compute-pi === contributed by <`snoopy831002`> reviewed by <`janetwei`> - 可以試試運用其他方法算pi之後跟原本的程式比較,例如:Leibniz - 可以更深入研究AVX256 ### 流程 * `make check` 開使編繹分別產生5個執行檔 * `make gencsv` 將執行結果輸入至csv檔中 這邊參考 [王紹華](https://hackmd.io/KYQwjARgZgTArAZgLQgJwAYpICyoMYAmSAHJiEggGzzqQEIDsqYQA===?view) 的共筆 我們可以更改 Makefile中的gencsv標題來決定我們取樣的點個數(預設只取樣5個點也就是100 5100 10100 15100 20100 這五個點) ```clike= gencsv: default for i in `seq 100 5000 25000`; do \ printf "%d " $$i;\ ./benchmark_clock_gettime $$i; \ done > result_clock_gettime.csv ``` * 撰寫gnuplot的script 然後執行`make plot` 首先於Makefile中加入 ```clike= plot: result_clock_gettime.csv gunplot runtime.gp ``` * 撰寫runtime .gp file ```clike= set title "compute-pi" set xlabel "N" set ylabel "Time(second)" set term png enhanced font 'Verdana,10' set datafile separator "," set output 'runtime.png' plot "result_clock_gettime.csv" using 1:2 title 'baseline' with lines lt rgb 'blue' , \ "result_clock_gettime.csv" using 1:4 title 'openmp_2' with lines lt rgb 'red' , \ "result_clock_gettime.csv" using 1:6 title 'openmp_4' with lines lt rgb 'orange' , \ "result_clock_gettime.csv" using 1:8 title 'avx' with lines lt rgb 'green' , \ "result_clock_gettime.csv" using 1:10 title 'avxunroll' with lines lt rgb 'purple' ``` :::danger 如果此時出現Skipping data file with no valid points 請在runtime .gp檔案中增加 `set datafile separator","` (因為CSV檔案中![Uploading file..._37jaxz8jy]()以","區隔資料) ::: ### 分析 * 未修正輸出圖形(資料抖動很劇烈) 以下為50筆資料之結果: ![](https://i.imgur.com/RWx4yoD.png) 以下為250筆資料之結果 ![](https://i.imgur.com/F6mDJjo.png) 以下為500筆資料之結果 ![](https://i.imgur.com/PanZyYW.png) :::info 在benchmark_clock_gettime.c中意外發現所測之clock其實是疊代25次之結果(原執行時間之25倍),所以應將程式改為取25次運算時間之平均 ```clike= clock_gettime(CLOCK_ID, &start); for(i = 0; i < loop; i++){ compute_pi_baseline(N); } clock_gettime(CLOCK_ID, &end); printf("%lf",(double)((end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/ONE_SEC))/loop); ``` ::: * 搭配95信心水準 :::info 統計學上,我們可以預測在95%信心水準下,95%以上的正確資料會出現在此信賴區間內。 公式: * 標準差: ![](https://i.imgur.com/tLEWvzY.jpg) * 信賴區間上下界 upperbound: μ+2\*SD lowerbound: μ-2\*SD ::: 以下為50筆資料之結果 ![](https://i.imgur.com/tQbTc9t.png) 以下為250筆資料之結果 ![](https://i.imgur.com/4YaIVOC.png) 以下為500筆資料之結果 ![](https://i.imgur.com/7AxUBaL.png) 由這幾張圖可以發現資料跳動已經不如未修正之前了 ### 誤差 * 在這裡我使用math.h中內建的函式作為π的標準值,搭配實驗數據計算error rate 以下為50筆資料之結果 ![](https://i.imgur.com/Hnug286.png) 以下為250筆資料之結果 ![](https://i.imgur.com/EtFIwbj.png) 以下為500筆資料之結果 ![](https://i.imgur.com/iO18Wbb.png) * 這邊我參考了[王紹華的共筆](https://hackmd.io/KYQwjARgZgTArAZgLQgJwAYpICyoMYAmSAHJiEggGzzqQEIDsqYQA===)發現avxunroll的誤差這麼明顯應該是因為avxunroll的 loop 執行一次等同於 baseline 版本執行16次。舉例來說baseline版本20次,avxunroll只有執行16次,足足少了4次而產生誤差。(avx的部分我之後還要自己研究,還不太熟悉) ## 參考資料 [王紹華的共筆](https://hackmd.io/KYQwjARgZgTArAZgLQgJwAYpICyoMYAmSAHJiEggGzzqQEIDsqYQA===) [廖健富的共筆](https://hackpad.com/Hw1-Extcompute_pi-geXUeYjdv1I) [信賴區間](http://homepage.ntu.edu.tw/~clhsieh/biostatistic/5/5-4.htm)