$ make gencsv
以外的輸出機制,預期執行 $ make plot
後,可透過 gnuplot 產生前述多種實做的效能分析比較圖表L1d 快取: 32K
L1i 快取: 32K
L2 快取: 256K
L3 快取: 4096K
指令:
$ uname -a
$ lscpu
$ cat /proc/cpuinfo
先照著跑跑看~
一執行就有computepi五種版本花的時間。time顯示了三種時間, 分別是user time, system time和elapsed time。這邊花了一些時間搞懂各別的意義。
我的理解如下:
User time: 程式在User mode的CPU time總和。程式被blokcked的時間(比如I/O)和其他程式的時間不會被算進去。
System time: 程式在 kernel mode 的 CPU time 總和 ( 直接或間接的系統呼叫 )。
Elapsed time: 這裡的elapsed time就是在Wall-clock time vs. CPU time裡面介紹的real time或是 Wall-clock time。Elapsed意思是開始到結束,在這裡就是呼叫程式到結束的時間。包含程式被bloked, 需要等待I/O,其他程式或是作業系統的時間。
所以user+system的時間就是整個程式的CPU Time。
還有multithread程式在多核電腦上, user time和system time會是在不同CPU上的時間總和,會和child process的時間相加。
回頭看程式的輸出,在openmp2的 user+system是elpapsed time 的兩倍, openmp4的user+system是elapsed time的四倍左右, 可以看出多個執行序的效果。
參考Wall-clock time vs. CPU time TempoJiJi同學筆記 和 What do 'real', 'user' and 'sys' mean in the output of time(1)
再來看benchmark,
用gnuplot製圖:
這裡卡了很久, 撰寫注意事項有:
參考Petermouse同學 因為資料是以逗號分隔, 所以需要加上
set datafile separator ","
\後面不要有空隔
gnuplot:
跑出來的圖:
參考TempoJiJi理解Makefile
起始值為100, 之後每5000取一點, 取值要小於25000
在Makefile中加上
方便繪製圖。
再把間隔調小一點,也把範圍調大:
100 2500 400000 >> 每5000點取20個點
可以發現在這樣的設定下openmp4的變動很大, 我觀察某些同學的數據也有類似的情形。我的processor是physical 2 core logical 4 cores, 不知道是不是跟當中的運算有關係, 之前跑出來的CPU使用量openmp4也是最低的。
在繼續下去以前,因為一度被數據弄的頭昏眼花~.~,想先釐清這個實驗的目的。分析改善computepi程式, 而因為要分析所以我們必須取得正確的資訊,包含分析我們時間的函式和信賴區間。
先從源頭時間的取得開始,因為這會從一開始影響整個實驗。老師介紹作業的頁面:
寫時間量測程式前,先評估情況,問問自己幾個問題:
使用什麼 clock 測量?(Real, User, System, Wall-clock…?)
clock 的精確度?(s, ms, µs, or faster ?)
需要多久時間你的 clock 會 wrap around?有什麼方法可以避免或處理?
clock 是不是 monotonic (單調遞增)?還是會隨著系統時間改變 (NTP, time zone, daylight savings time, by the user…?)
使用的函式使否已經過時、或不是標準函式庫?
下去搜尋後發現的資料:Measure time in Linux - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
我的理解如下:
我在想clock_gettime雖然有monotonic而且精度比較高(nano),可是他包含了程式以外的時間; getrusage 則是比較精準的提供我們實驗所需的user time和system time相加, 不確定哪一個較好。在這裡先用getrusage試試看。
先修正原本的圖, 看到王紹華同學的筆記才發現在benchmark_clock_gettime.c中的clock_gettime包含了整個loop。
現在還不是很懂為什麼要把他寫進去for loop中, 先把loop設為1。順便把range再調大, 100 5000 2000000
再執行一次:
瘋狂的data
來看看getrusage, 從我們剛執行的make check我發現只有user time(沒解讀錯的話),所以這裡直接用ru_utime。
使用時要include:
#include <sys/time.h>
#include <sys/resource.h>
程式描述:
int getrusage(int who, struct rusage *usage);
這裡int who使用RUSAGE_SELF, 被呼叫程式使用資源總和, 包含threads。
寫的程式如下:
跑出了悲劇的結果:
orz
不是很懂為什麼…
先回去做clock_gettime的信賴區間
突然發現自己對於thread觀念還是很不了解, 我的電腦只有四核, 用openmp4可以跑出四個thread的結果,可是在pthread或是raytracing把thread number設很高的話, 那概念似乎就不太一樣。
我好像把core還有processor的觀念搞混了,目前理解是:
參考:Difference Between Cores and ProcessorsWhat are threads, and what do they do in the processor?
Ruby
2016_Autumn
HW1
computepi