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筆資料之結果:

以下為250筆資料之結果

以下為500筆資料之結果

:::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%以上的正確資料會出現在此信賴區間內。
公式:
* 標準差:

* 信賴區間上下界
upperbound: μ+2\*SD
lowerbound: μ-2\*SD
:::
以下為50筆資料之結果

以下為250筆資料之結果

以下為500筆資料之結果

由這幾張圖可以發現資料跳動已經不如未修正之前了
### 誤差
* 在這裡我使用math.h中內建的函式作為π的標準值,搭配實驗數據計算error rate
以下為50筆資料之結果

以下為250筆資料之結果

以下為500筆資料之結果

* 這邊我參考了[王紹華的共筆](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)