contributed by < laochanlam
>
laochanlam
yanglin5689446
Daichou
Billy4195
先是按照作業要求重現一次實驗,把專案 clone 下來後,打開 computepi.c 可以清楚看到各種計算 pi 的不同優化版本。
分別為 baseline 版本, AVX SIMD 版本, AVX SIMD + Unroll looping 版本及 OpenMP ( 2 threads & 4 threads) 版本。
接著開始輸入 $ makecheck
及 $ make gencsv
後,得到 result_clock_gettime.csv 這樣的數據,準備用 LibreOffice 繪圖。
在繪圖之前,先要搞懂資料的產生過程。
在Makefile中有這一段,看起來像是 Shell script 的東西,來研究一下。
這一段就是i初始為 100 ,每執行多一次增加 5000 ,到 25000 就停止,所以一共會執行 5 次分別為 100 , 5100 , 10100 , 15100 , 20100 。
然後我把實驗數據改為100~95100,並用 LibreOffice 繪出圖像如下。
然後嘗試寫 gnuplot 的 script 畫圖。
因為 result_clock_gettime.csv 中用逗號作間隔,再加上各種對 gnuplot 的不熟悉,畫個圖快畫了我半個小時Orz。
本來我是用 "%lf,%lf,%lf,%lf,%lf,%lf"
來實現逗號分隔的數據讀取,但後來找到petermouse學長的共筆有更好的方法,就是 set datafile separator ","
即可實現逗號分隔。
附上程式碼供參考:
參考shelly4132的共筆的証明方法,
先有以下分解:
對兩邊進行從 0 到 1 的積分,
當n趨向無限時,
得証
最後編寫程式並繪圖。
接下來等待有時間再進行其它優化。
Wall-clock time 顧名思義就是掛鐘時間,也就是現實世界中實際經過的時間,是由 kernel 裡的 xtime 來紀錄,系統每次啟動時會先從設備上的 RTC 上讀入 xtime。
通常來說並不建議用來量測程式時間。
CPU time 指的是程序在 CPU 上面運行消耗 (佔用) 的時間,clock() 就是很典型用來計算 CPU time 的時間函式,但要注意的是,如果有多條 threads,那 CPU time 算的是「每條 thread 的使用時間加總」。
當我們執行 $ time
時,會得出以下三個參數:
real time : Wall-clock time,注意這個時間會被執行中的其他程式所影響。
user time : 程式在 user mode 佔用所有的 CPU time 總和(若是多核計算時間會加總)
sys time : 程式在 kernel mode 佔用所有的 CPU time 總和。
在廖健富學長提供的詳盡分析中計算 error rate 的函式是這樣的。
裡面是用了 arccos -1 來求 pi ,然後算它跟每個版本的誤差值來求 error rate。