contributed by < uccuser159
>
由於 $ time
會報告程式從開始到結束的經歷時間,另外還會計算程式使用處理器的時間量。所以輸入time ./time_test_baseline
來看看:
real time : 表示程式從執行開始到結束所花費的時間。
user time : 程式在 user mode 佔用所有的 CPU time 總和。
sys time : 程式在 kernel mode 佔用所有的 CPU time 總和。
benchmark_clock_gettime.c
中用到 clock_gettime() 函式:int clock_gettime(clockid_t clk_id, struct timespec *tp);
The clk_id argument is the identifier of the particular clock on which to act.
關於clk_id
的選擇,會選擇 CLOCK_MONOTONIC_RAW 是因為不受 NTP 伺服器、時區、日光節約時間影響。
tp arguments is timespec struct
clock_gettime()
的精確度到 nerosecond
使用 的積分來實現
因為
若計算函數 在 x=0 到 x=1 底下的面積,利用黎曼積分, 即為在 x 軸上的一小等分,與函數相乘,一小塊一小塊去做加總,得到的面積即為,所以將 分的越細,計算 會越精準。
程式碼:
取樣從 N=1008 ~ N=1000000,間隔4000
baseline 效能最好的為 AVX+unroll
因為
又利用 power series來展開
對左右兩式做 0~1 的定積分
化簡後得到
=>
=>
程式碼:
取樣從 N=1008 ~ N=1000000,間隔4000
使用 Leibniz 方法來計算 比 baseline 方法在 N = 400000000時,快了大約 4.28/0.79=5.4 倍。
可以將 做週期為 全幅展開做產生 :
因為 為偶函數,所以 Fouier cosine series 的形式為
其中
根據傅立葉級數的收斂(Dirichlet 收斂定理),為均勻收斂,故傅立葉級數的收斂值即為帶入函數值
當 n 為正整數,其值為,計算得
程式碼:
取樣從 N=1008 ~ N=1000000,間隔4000,計算執行時間
使用 Eular 方法來計算 與 Leibniz 方法來計算 的時間幾乎相同。