# 2016q3 Homework1 (compute-pi) contributed by <`Claude51315`> ## 目標 * [ ]學習openmp的基本使用 * [ ] 學習AVX * [ ]用R來處理和呈現資料 * [ ]了解測量時間發生的jitter * [ ]觀察各個計算pi的方式其誤差降低的速率 # lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 Model name: Intel(R) Core(TM) i7-4702MQ CPU @ 2.20GHz Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 6144K # Performace Observation ### execution time ![orignal](https://i.imgur.com/Pu4Jh2R.png) 可以發現clock_gettime()會有抖動的情形發生 ![](https://i.imgur.com/rf0cWVW.png) 用R畫出回歸線可以較清楚比較每個實作方式的執行速度 ![](https://i.imgur.com/aF4TCMw.png) 對每個N做十次運算取平均,發現openmp with 4 threads的運算時間較不穩定。 ### error rate ![](https://i.imgur.com/Er2JHPd.png) > for i in `seq 1000 500 1000000`; N 的間隔為500 ![](https://i.imgur.com/6GW9CY0.png) > for i in `seq 1000 400 1000000`; N 的間隔為400 由於aux_unroll是展開4次,所以當N是4的倍數時,error rate 較穩定。但仍可以觀察到aux_unroll誤差降低的速率較其他的實作方式慢。 ![](https://i.imgur.com/EqmyuA7.png) > for i in `seq 1600 400 1600000`; 參考其他同學的筆記後(等等補連結),發現N要是16的倍數,誤差才會降低,因為一個avx暫存器可以存4次運算,再loop unroll 4次後,一次迴圈共可以算16次。