A想傳送"1"給B,但是怕bit-flip,這時候就是 Error-correcting codes (ECC) 登場的機會啦。
首先,先把"1"(稱作message)用 coding 加以保護 (方法有很多種,先用 Repetition Coding 當範例),經 Repetition Coding 之後 "1" 變成 "111" (稱為codewords) ,這樣當B收到101,就會猜想中間的"0"應該是bit-flip。
如果運氣很差,剛好flip兩個bits (變成100) 怎麼辦? 那就沒救了,將會判斷成收到 0's。
想要這種出錯率降底的話,就把"1" 變成 "1111111111111.....11111111"
越多越爽,但傳輸率(效能)就爛到哭。
總之,是有tradeoff的,Repetition Coding 很鳥,用來當範例方便而以。有機會(or never)再介紹其他比較威風的 ECC,像是BCH或是LDPC。
腦補-------------------------------------
A BCH code with a higher error-correcting capability (and higher overhead) is the [8360, 8192, 12] code, which can correct 5 errors or detect 11 errors.
8360是codewords
8192是message
所以redundancy的部份就是 8360 - 8192 = 168
多了這168 bits,傳輸變成原本的 8192/8360 = 0.979倍
2014年12月30日 星期二
2014年12月10日 星期三
2014年12月9日 星期二
ad sense
前不久,無聊想把自己的blog加ad sense,哈哈實驗看看
結果他說我的blog內容不夠豐富,都是垃圾 不給過…
原來…他有認真看的blog耶!!!
原來,不是隨便伸請都會過喔 哈哈
結果他說我的blog內容不夠豐富,都是垃圾 不給過…
原來…他有認真看的blog耶!!!
原來,不是隨便伸請都會過喔 哈哈
2014年12月2日 星期二
2014年10月29日 星期三
2014年10月21日 星期二
情況1:
原本板子上有SPI interface可以用,但因為某些原因,被佔用去,
所以解法就是『用GPIO模擬SPI』。
要先K一下SPI的spec,然後按他的規則,使用GPIO去『 下cmd,丟data』等…
例如: 先丟 xxx,過 20 ns之後才能丟 ooo
情況2:
所以解法就是『用GPIO模擬SPI』。
要先K一下SPI的spec,然後按他的規則,使用GPIO去『
例如: 先丟 xxx,過 20 ns之後才能丟 ooo
情況2:
承上,板子上沒支援 nanosecond等級的timer,但又必需要用。
解法就是: 先用cpu frequency去推出 1ns可以做幾個instruction (假設CPI為1)
假設算出來是 1 inst/ ns,那當我想要有20ns的delay, 我就用loop去做20道指令。
ps1: nanosecond timer, linux某個POSIX版本之後好像有support, 但猜測是library沒porting上板子, 所以才用此替代方案…,而且也還沒成功 XDDD。
解法就是: 先用cpu frequency去推出 1ns可以做幾個instruction (假設CPI為1)
假設算出來是 1 inst/ ns,那當我想要有20ns的delay,
ps1: nanosecond timer,
2014年9月2日 星期二
vCacheShare: Automated Server Flash Cache Space Management in a Virtualization Environment
當多個vm要share一個ssd cache時,平均分配cache space不是一個好方法,因為每個vm上的workload特性可能差很遠。
這篇,自動detect特性(1) reuse distance (2) read intensity,然後弄一個cache utility model (i.e., 給你x的空間,你可以得到y的好處)。
然後利用這個model去找到最佳的空間分配比例。
然後利用這個model去找到最佳的空間分配比例。
qNVRAM: quasi Non-Volatile RAM for Low Overhead Persistency Enforcement in Smartphones
qNVRAM: quasi Non-Volatile RAM for Low Overhead Persistency Enforcement in Smartphones
為了persistency,有些技術會造成額外的IO(e.g., logging, double write),原因是從RAM寫到primary storage時會出事。
作者認為…手機都有電池,所以覺得『電池+DRAM』就可以變成"假的"NVRAM。有了NV的特性,就可以砍掉一些為了persistency而生的手段(e.g., data不用先寫到log area)
後記:
最後的Q&A,很多人關心"電池沒電的問題","電池整個沒電會不會系統爆掉…",他一來是說可能是個issue,又說現在人的手機不太會沒電…
最後的Q&A,很多人關心"電池沒電的問題","電池整個沒電會不會系統爆掉…",他一來是說可能是個issue,又說現在人的手機不太會沒電…
2014年8月29日 星期五
2014年7月29日 星期二
3gpp supplementary service 閱讀順序
分享一下最近看 3gpp spec的心得(最主要是閱讀的順序)
一句話: top-down。
以supplementary service中的 communication waiting (TS24.615)為例:
1 先看最後面的signaling flow。 先了解全貌,top-down。例如下圖2a,你才會知道AS會做的事是: 『查看approaching NDUB,然後用猜的大概是: 『看看這通call會不會被擋,而進入call waiting狀態(例如: callee正在講電話)』。
再例如 6a. 你會知道有插播進來的時候,可能會做的事,e.g., 按下保留(HOLD),要不就是掛掉目前這通電話,然後接插播的這一通。
『approaching NDUB』這個暫時不知道怎麼做沒關系,再往下查就好。
2 整個整個全貌之後,再往前對應,像是下面這個case,是在說『接到插播時該怎麼辦』
2a stop timer → 話機不需要一直叫…
2b 停掉CW indication → 話機不需要一直叫…
2c 看你怎麼處置插播。
一句話: top-down。
以supplementary service中的 communication waiting (TS24.615)為例:
1 先看最後面的signaling flow。 先了解全貌,top-down。例如下圖2a,你才會知道AS會做的事是: 『查看approaching NDUB,然後用猜的大概是: 『看看這通call會不會被擋,而進入call waiting狀態(例如: callee正在講電話)』。
再例如 6a. 你會知道有插播進來的時候,可能會做的事,e.g., 按下保留(HOLD),要不就是掛掉目前這通電話,然後接插播的這一通。
『approaching NDUB』這個暫時不知道怎麼做沒關系,再往下查就好。
2a stop timer → 話機不需要一直叫…
2b 停掉CW indication → 話機不需要一直叫…
2c 看你怎麼處置插播。
2014年7月20日 星期日
IMS, 3GPP, VoLTE 徵友
-----------
最近在搞的東西關鍵字如下: IMS, VoLTE,3GPP、precondition、sip forking process、IMS supplementary service。
PO此文的一個目的有一個是想找可以一起討論的同好(或是同樣陷入spec地獄的人 哈)
如果你看到此文,有興趣可以聯絡我。
明天計劃: 搞定 SIP precondition。最後四天就有一個大報告囉,東西真的很多呢…
以為綽綽有餘,結果居然有點吃緊…,沒有再最一開始就弄清整個份量,真是一個失誤。
2014年6月26日 星期四
paper sharing
1 這是很好的conference喔
2 motivation: ECC要花點時間,他發現如果SSD是cache,好像可以不用每次都用那麼強的ECC (越強越慢),因為就算要讀的page整個壞,也可以去下一層拿 (i.e., primary storage)
3 solution: "有時候" 用 弱ECC
FlexECC: Partially Relaxing ECC of MLC SSD for Better Cache Performance
https://www.usenix.org/system/files/conference/atc14/atc14-paper-huang.pdf
2014年6月22日 星期日
2014年5月16日 星期五
C程式 面試題目整理
面試考題
ref1
ref2
簡單地說: compiler看到 它 就會停掉啦~
為什麼要停掉? ref3
struct → 所佔記憶體空間為 member 相加
union → 所佔記憶體空間由最大size member決定
note: 所以union的member同一時間只會最多出現一個
example:
最能幫我理解的就是舉 status register來當例子,如下:
"const volatile is used for defining Hardware Read-only Registers.example CPU status registers.
the value of these registers are read-only but the
value of these registers may change depend on the processor status. Thus const volatile variable can't be altered by the programmer but by the Hardware
" ref
中文版:
"volatile變數代表其所儲存的內容會不定時地被改變,宣告volatile變數用來告訴編譯器 (Compiler) 不要對該變數做任何最佳化操作,凡牽涉讀取該volatile變數的操作,保證會到該變數的實體位址讀取,而不會讀取CPU暫存器的內容 (提升效能) 。舉個例子,某一硬體狀態暫存器 (Status Register)就必須宣告volatile關鍵字,因為該狀態暫存器會隨時改變,宣告volatile便可確保每次讀取的內容都是最新的" cited from ref1
--------------------------------------------------
→ 何時可以用const?
1 co-work一個function時,有時會用傳參考的方式,但傳參考有點風險(別人可以不懂,就直接改了某個不該改的變數) ,要避免的 你可以給這種 prototype:
int foo(const int &bar)
------------------------------------------------------------
幾個用法: (規則 * 和 & 左邊形容指向的值,右邊是本身),for example
? 難道要先展開成二進位? 再慢慢算?
要考你 a+1 和 &a+1。
第一種的+1一次是跳一個int的大小(i.e., 4bytes in 32-bits cpu)
第二種的+1一次是跳一整個array的大小 (i.e., 4*5=20 bytes)
更清楚的說明在這 (see also this), 可以看到: a和&a值雖相同,但type不同。
所以 +1 時,要加的是 type的大小
所以*(a+1)是2,(*p-1)是garbage (unknown value)
答案: typedef void(*pf)(char *);
第一行那坨,眼睛只要看著 void (*)(char *)就好
它是一個function pointer的type
只要記得,function pointer的typedef 是把new type的name塞在第一個*後面
不要像我一開始還寫成:
typedef void(*)(char *) pf
先說: 我還看過規定 + - * /都不能用的。
解法1: 可以利用3的倍數的特性: 每個位數相加起來依舊是3的倍數。
例如: 369是3的倍數,那3+6+9=18也一定是3的倍數。
『每個位數相加』的動作一直做到只剩個位數為止,如上例 18還不是只剩個位數,所以繼續,1+8=9。最後的結果只要是3或6或9 那該數就是3的倍數。
9. explain lvalue and rvalue
1 explain #error
ref1
ref2
簡單地說: compiler看到 它 就會停掉啦~
為什麼要停掉? ref3
2. explain "struct" and "union"
struct → 所佔記憶體空間為 member 相加
union → 所佔記憶體空間由最大size member決定
note: 所以union的member同一時間只會最多出現一個
example:
3. 修飾字 (const, volatile, static......)
explain "volatile" and "const". can we use "volatile" and "const" in the same variable ? can we use "volatile" in a pointer?最能幫我理解的就是舉 status register來當例子,如下:
"const volatile is used for defining Hardware Read-only Registers.example CPU status registers.
the value of these registers are read-only but the
value of these registers may change depend on the processor status. Thus const volatile variable can't be altered by the programmer but by the Hardware
" ref
中文版:
"volatile變數代表其所儲存的內容會不定時地被改變,宣告volatile變數用來告訴編譯器 (Compiler) 不要對該變數做任何最佳化操作,凡牽涉讀取該volatile變數的操作,保證會到該變數的實體位址讀取,而不會讀取CPU暫存器的內容 (提升效能) 。舉個例子,某一硬體狀態暫存器 (Status Register)就必須宣告volatile關鍵字,因為該狀態暫存器會隨時改變,宣告volatile便可確保每次讀取的內容都是最新的" cited from ref1
--------------------------------------------------
→ 何時可以用const?
1 co-work一個function時,有時會用傳參考的方式,但傳參考有點風險(別人可以不懂,就直接改了某個不該改的變數) ,要避免的 你可以給這種 prototype:
int foo(const int &bar)
------------------------------------------------------------
幾個用法: (規則 * 和 & 左邊形容指向的值,右邊是本身),for example
- const int a=100; // 沒有*和&,所以簡單: const和int通通是形容a
- int const b=100; // 同上
- const int *a=&b; // 套規則: * 左邊的const和int是指向的值,所以a指標指向的值不能改,*右邊的是本身,所以a可以改(沒有const和int修飾到它)
- int const *a=&b; //同上
- int * const a = &b; //套規則: * 左邊的int是修飾a指向的值,所以,值可以改(因為沒const嘛),*右邊的是本身,已被const修飾到了,所以a不能改
- const int * const a = &b; // 也不用套三小規則了啦,都出現兩個const,就通通都不能改了啊!
- const int &a=100; ///套規則: & 左邊的int是修飾a指向的值,值可以改(因為沒const嘛),&右邊的是本身,所以a可以改(沒有const修飾到它)
note: 因為被const修飾到的東西未來都不能改了,所以宣告時要初始…不然就沒什用途了…(除非你希望該值是0?)
4. bit operation
example1:
可能是這樣解啦:
1 第四行和第五行 好像可以"約分"一下
→ 第5行會變成: v = (v1&(~v2)) |v2
再變成→ (V1|V2) & ((~V2) | v2)
→ &的右邊是1,所以V 就是V1|V2
example 2
? 難道要先展開成二進位? 再慢慢算?
5. ??
要考你 a+1 和 &a+1。
第一種的+1一次是跳一個int的大小(i.e., 4bytes in 32-bits cpu)
第二種的+1一次是跳一整個array的大小 (i.e., 4*5=20 bytes)
更清楚的說明在這 (see also this), 可以看到: a和&a值雖相同,但type不同。
所以 +1 時,要加的是 type的大小
所以*(a+1)是2,(*p-1)是garbage (unknown value)
答案: typedef void(*pf)(char *);
第一行那坨,眼睛只要看著 void (*)(char *)就好
它是一個function pointer的type
只要記得,function pointer的typedef 是把new type的name塞在第一個*後面
不要像我一開始還寫成:
先說: 我還看過規定 + - * /都不能用的。
解法1: 可以利用3的倍數的特性: 每個位數相加起來依舊是3的倍數。
例如: 369是3的倍數,那3+6+9=18也一定是3的倍數。
『每個位數相加』的動作一直做到只剩個位數為止,如上例 18還不是只剩個位數,所以繼續,1+8=9。最後的結果只要是3或6或9 那該數就是3的倍數。
9. explain lvalue and rvalue
2014年5月8日 星期四
how to add a new parameter into .parv file in disksim
1 add your parameter in ssdmodel/modules/ssd.modspec as below:
3 make
note: this will generate ssdmodel_ssd_param.c
ssdmodel_ssd_param.h
ssdmodel_ssd_param.tex
modules.h
-----------------
contributed by Wade in oslab of CSIE in NCKU
2014年4月29日 星期二
2014年3月19日 星期三
評估某段code的cpu overhead
1 把演算法寫成 code
2 cross compiler成 ARM binary (因為SSD controller中多半是用ARM)
3 用SimpleScaler來算指令數
------------------------------
目前的code(假設10個users)算出來如下:
1 dispatch request → 201 道 Inst. → 0.25 us
2 credits charging → 52 道 Inst. → 0.06 us
ps: 假設800Mhz的cpu, CPI = 1 (i.e., as BLAS), no cache。
0.25us 僅是完成一個page read 的 0.2% (i.e., 0.25/(25+100))
或僅是完成一個page write 的 0.08% (i.e., 0.25/(200+100))
2 cross compiler成 ARM binary (因為SSD controller中多半是用ARM)
3 用SimpleScaler來算指令數
------------------------------
目前的code(假設10個users)算出來如下:
1 dispatch request → 201 道 Inst. → 0.25 us
2 credits charging → 52 道 Inst. → 0.06 us
ps: 假設800Mhz的cpu, CPI = 1 (i.e., as BLAS), no cache。
0.25us 僅是完成一個page read 的 0.2% (i.e., 0.25/(25+100))
或僅是完成一個page write 的 0.08% (i.e., 0.25/(200+100))
2014年3月18日 星期二
libgcc_s.so.1 找不到 , error while loading shared libraries libgcc_s.so.1
為了裝 arm-elf-gcc 不知道為什麼把 shared library搞壞了
很多程式都說 error while loading shared libraries libgcc_s.so.1
用locate指令找了一下 libgcc_s.so.1 發現有三個地方有…
一開始單純的想法是直接把他copy到 /lib之下,但是事情那麼簡單…
為了不負爺爺的聲望,又做了一些check...最後很搞笑的發現 剛剛copy的libgcc_s.so.1
是ARM binanry... (我是用file cmd去看的)
最後解法: 抓別電腦的 libgcc_s.so.1過來 放進去 /lib中
最後解法: 抓別電腦的 libgcc_s.so.1過來 放進去 /lib中
2014年3月12日 星期三
profiling ARM binary code
先從這下載 ARM-DS5 (好像有試用版啦)
--------------------------
網友
Oprofile
可以裝一個在ARM機器上,然後跑你要profile的程式時,再同時run Oprofile去監控
和gprof不同的是:
因为gprof只是针对应用层的分析,而oprofile是通过硬件(CPU)本身支持的性能计数器进行的性能分析,贯穿内核到用户应用程序,很有参考价值 URL
--------------------------
網友
I don't know any free ARM profilers.
You can try ARM RVDS 4.0 Pro. It has a good profiler. And you can use emulator instead of real hardware with it. It simplifies some things, but you'll not receive information about cache-misses/memory-latency, and results may differ from tests on real hardware.
The price of RVDS is high enough. You can try trial for 30 or 45 days, maybe this will be enough to profile all you want.
---------------------------Oprofile
可以裝一個在ARM機器上,然後跑你要profile的程式時,再同時run Oprofile去監控
和gprof不同的是:
因为gprof只是针对应用层的分析,而oprofile是通过硬件(CPU)本身支持的性能计数器进行的性能分析,贯穿内核到用户应用程序,很有参考价值 URL
2014年3月11日 星期二
idea - prefetch in SSD
把read request所要的data從快gc的channel先prefetch出來…
好處: reduce latency
方法:1 prefetch 時 prefer 快 GC的 channel
→ 怎麼判斷 "快GC" (elem utilization, pended wt req)
→要prefetch 什麼 data ? (from history, seq ratio)
好處: reduce latency
方法:1 prefetch 時 prefer 快 GC的 channel
→ 怎麼判斷 "快GC" (elem utilization, pended wt req)
→要prefetch 什麼 data ? (from history, seq ratio)
2014年3月2日 星期日
實驗log IO trace的錄製 0223
模仿PVR (using intel open tool kit),以下是參數
1st try
s i cap qdep wr wrnd rrnd str wrsz rdsz warm test bw iops lat
0 0 4300 8 100 5 100 1 32 32 5.0 5000.5 17.61 564 14.19
sinhome-desktop: sample 0 iter 0: (test) 88059.59 MB in 5000.46 sec 17.61 MB/sec
- 95% seq
- 32KB
- address space 約4.5GB
2nd try
s i cap qdep wr wrnd rrnd str wrsz rdsz warm test bw iops lat
0 0 4500 8 100 0 100 1 32 32 5.0 3000.3 55.84 1787 4.47
sinhome-desktop: sample 0 iter 0: (test) 167530.88 MB in 3000.31 sec 55.84 MB/sec
post-processing to disksim format
cat inteltoolkit_trace.out | awk '{print ($1-1393167501.968118)*1000" ""0"" "$3" ""64"" ""0"}' > PVR_32KB_5GB.dis
note: output中的address單位是byte !!!
_________________________________________________________________________
postmark的參數
set size 65536 131072
set number 15000
set transactions 5000000
set location /media/benchmarkTarget2
set read 32768
set write 32768
set buffering false
set bias read -1
set bias create 5 // 設5會讓blktrace output長超快,而設10就超慢,待找問題
- 32KB
- address space 5GB
post-processing to disksim format
cat tmp3 | awk '{print ($4-6.474369353)*1000" ""0"" "$8" "$10*8" ""0"}' > pm2disksim
加速user1
cat PM_32KB_5GB+PVR_32KB_5GB.dis | awk '{if($6==1) {print $1/15" "$2" "$3" "$4" "$5" "$6} else print $0}' |sort -g -k 1 >PM_32KB_5GB_15m+PVR_32KB_5GB.dis
2014年2月19日 星期三
Exploiting workload dynamics to improve SSD read latency via differentiated error correction codes
goal: 加快 read page latency (如圖最下方)
方法:
如圖最下: 有點像切pipeline。一個pages分成多個segment,如最上方圖(b),如此,讀第二個 segment的時候就可以同時幫第一個pages做ECC解碼的動作。
concern:
ECC size 均分到各個segment之, ECC的能力會變弱…(e.g., 原本能允許整個pages發生16bit的error,現在每個segment最多承受4bit)。 所以要想辦法降低 error rate。 方法: 降低寫入的速度,來提高reliability (也就是減少error rate啦)
how about write latency ? 不就犧牲太多??
配套 1 加RAM當 write buffer
2 只在有idle time的時候做"慢速寫入"
ps: idle time指的是host沒發request來的時候,此處是用估計的…非即時偵測。
方法:
如圖最下: 有點像切pipeline。一個pages分成多個segment,如最上方圖(b),如此,讀第二個 segment的時候就可以同時幫第一個pages做ECC解碼的動作。
concern:
ECC size 均分到各個segment之, ECC的能力會變弱…(e.g., 原本能允許整個pages發生16bit的error,現在每個segment最多承受4bit)。 所以要想辦法降低 error rate。 方法: 降低寫入的速度,來提高reliability (也就是減少error rate啦)
how about write latency ? 不就犧牲太多??
配套 1 加RAM當 write buffer
2 只在有idle time的時候做"慢速寫入"
ps: idle time指的是host沒發request來的時候,此處是用估計的…非即時偵測。
2014年2月17日 星期一
用blktrace 錄 postmark
1 準備一個partition (就是讓postmark噴 request過去的啦)。
a. what size of partition
b. what filesystem
e.g., sudo postmark xx.conf
2 打開blktrace (準備攔截噴到那個partition的IO)
例如 blktrace -d /dev/sda3
note: 如果你硬要自己取 blktrace outputfile的名子,要小心…。e.g., 我取『pm_64- 128file_32rec_5000WTx_5GB.blktrace.out』 這個名子 blkparse 都失敗…
3 新開一個terminal來啟動 postmark →設參數 (看你想要什麼樣的workload) → run
這樣postmark就開始噴request了
note: 跑postmark前,最好先清空cache。參考網址
ps 每次設參數很煩 你就寫一個 .conf 檔,然後用 "load" 載入
note: 設定postmark file數時(e.g., set number)要確定沒超過 partition size,不然可能出現權限問題
4 等到噴完 用ctrl + c 終止 blktrace ,然後再同一個目錄下會出現很多log檔~
5 用 blkparse 去解碼,不然你是看不懂那一堆 log檔的
e.g., blkparse sdb4.blktrace* > pm64_128kbfile_32kbrec_5GB.dis.tmp
6 post-processing if needed.
像是後製成 disksim可以吃的格式。
---------
ref: http://www.cse.unsw.edu.au/~aaronc/iosched/doc/blktrace.html
a. what size of partition
b. what filesystem
e.g., sudo postmark xx.conf
2 打開blktrace (準備攔截噴到那個partition的IO)
例如 blktrace -d /dev/sda3
note: 如果你硬要自己取 blktrace outputfile的名子,要小心…。e.g., 我取『pm_64- 128file_32rec_5000WTx_5GB.blktrace.out』 這個名子 blkparse 都失敗…
3 新開一個terminal來啟動 postmark →設參數 (看你想要什麼樣的workload) → run
這樣postmark就開始噴request了
note: 跑postmark前,最好先清空cache。參考網址
ps 每次設參數很煩 你就寫一個 .conf 檔,然後用 "load" 載入
note: 設定postmark file數時(e.g., set number)要確定沒超過 partition size,不然可能出現權限問題
4 等到噴完 用ctrl + c 終止 blktrace ,然後再同一個目錄下會出現很多log檔~
5 用 blkparse 去解碼,不然你是看不懂那一堆 log檔的
e.g., blkparse sdb4.blktrace* > pm64_128kbfile_32kbrec_5GB.dis.tmp
6 post-processing if needed.
像是後製成 disksim可以吃的格式。
---------
ref: http://www.cse.unsw.edu.au/~aaronc/iosched/doc/blktrace.html
web2 +mp3 結果圖 分析
1 原本paper上的圖有開work-conserving,要把他改成新圖。
而且只放 前100sec (也就是有灌滿的期間)
2 在該段期間內,QDI差異約6~7倍 (當然,承受較多的user受到干擾)
3 無GC , so no GCI
而且只放 前100sec (也就是有灌滿的期間)
2 在該段期間內,QDI差異約6~7倍 (當然,承受較多的user受到干擾)
3 無GC , so no GCI
2014年2月10日 星期一
install linux
====partition plan=========
/ : 30G SSD
/boot : 1G SSD
/tmp: 50GB HDD
/home : 300 HDD
swap : 2G SSD
tool: http://www.junauza.com/2012/04/best-disk-partition-managers-for-linux.html
choose best server
apt-get update
@ 套件管理需知 (建議先看,搞懂dkpg, apt, yum 等term...)
bison/flex/geany/gnuplot/htop/virtualbox/filezilla/terminator/inteltoolkit/postmark/chrome
pae
sudo apt-get install linux-generic-pae linux-headers-generic-pae
prompt color style
keyboard hot key
安裝insight
http://outsidenote.blogspot.tw/2013/03/install-insight-debugger-on-ubuntu.html
ref: http://sleepingwolf.pixnet.net/blog/post/19509749-%E3%80%90%E8%BD%89%E8%BC%89%E3%80%91%E5%AE%8C%E5%85%A8%E7%94%A8-linux-%E4%BE%86%E7%94%9F%E6%B4%BB
2014年1月28日 星期二
『筆記』disksim在超急速trace下跑很慢,如何去加速
『筆記』disksim在超急速trace下跑很慢,如何去加速
1 先用gprof去查可能的bottleneck function
2 以title為例,bottleneck都在處理queue(大多是 insert,get或是delete )
3. 本次發現 logorg_addnewtooutstandq()是bottleneck。原因是裡面有個while loop的功能只為了找到某linked list的tail。解法是: 『維護一個pointer永遠指向outstandq的tail』。注意: outstandq有很多個(也就是有很多條linked lists)。
4. 注意: tail pointer指向的東西(假設是temp)可能會被移除,所以temp被移掉
時最好是將tail-pointer更新成 temp->prev,不然下次addnewtooutstandq時如果發現tail-pointer還是null,就必需重找…(就沒加速到了啦)
5. ps: gprof只有當程式全部跑完才會產生 gmon.out
1 先用gprof去查可能的bottleneck function
2 以title為例,bottleneck都在處理queue(大多是 insert,get或是delete )
3. 本次發現 logorg_addnewtooutstandq()是bottleneck。原因是裡面有個while loop的功能只為了找到某linked list的tail。解法是: 『維護一個pointer永遠指向outstandq的tail』。注意: outstandq有很多個(也就是有很多條linked lists)。
4. 注意: tail pointer指向的東西(假設是temp)可能會被移除,所以temp被移掉
時最好是將tail-pointer更新成 temp->prev,不然下次addnewtooutstandq時如果發現tail-pointer還是null,就必需重找…(就沒加速到了啦)
5. ps: gprof只有當程式全部跑完才會產生 gmon.out
2014年1月12日 星期日
訂閱:
文章 (Atom)