# 2017q1 Homework1(compute-pi)
contributed by<`yanang`>
###### tags: `yanang`
### Reviewed by `Cayonliow`
* 圖的顯現方式不容易讓人一眼看出各種實作方式的分別
* 可以改成線狀圖, 分辨線與線之間的高低
* 可以透過增加執行的次數,拉高線的斜率, 拉開線之間的距離
* openmp_4 因爲不穩定所以圖會有波動, 可以透過將執行的次數調高然後取平均來消除, 可以看看[我的共筆](https://hackmd.io/s/B1pNFkLql#)
### Reviewed by `ryanwang522`
* 可以嘗試不同計算圓周率 (e.g. Leibniz, Monte Carlo) 的方法,並觀察差異。
* OpenMP 之所以會有波動也有可能是執行序之前的執行速度不同所造成的 overhead。
## 初步測試
* $make gencsv
打開 result_clock_gettime.csv
```
100 0.000008 0.000073 0.016455 0.000008 0.000005
5100 0.000402 0.000288 0.000276 0.000345 0.00021
10100 0.001102 0.001289 0.002242 0.000682 0.000414
15100 0.001837 0.001743 0.001108 0.001024 0.000618
20100 0.001602 0.000949 0.000966 0.001355 0.000832
```
* 先試著將資料建表,[libre office 插入圖表](https://help.libreoffice.org/Common/Inserting_Charts/zh-TW)
( 因為還不確定資料名稱,先以欄B..F代稱 )

## 實驗
* 先試著將範圍拉大,並改動 loop 範圍


* 經過數次改動,發現 openmp_4 的波動仍然無法消除
( openmp_2 也有些微波動 )

* 時間優劣上 avx > openmp > baseline
* 穩定性優劣上 avx > baseline > openmp
## error rate
* 參考 [廖健富的詳盡分析](https://hackpad.com/Hw1-Extcompute_pi-geXUeYjdv1I) 當中計算 error rate 的方式
```c=
#define M_PI acos(-1.0)
double pi = compute_pi(n);
double diff = pi - M_PI > 0 ? pi - M_PI : M_PI - pi;
double error = diff / M_PI;
```
* error rate

* 將 baseline openmp_2 openmp_4 分開作圖,可以發現這三種方式的 error rate 皆極低,且差異不大

* 但是 avx 和 avx_unroll 這裡種方式的 error rate 明顯較高,尤其 avx_unroll 有明顯的波動
