2008年11月19日 星期三

孩子的成長: NO3 阿瑄

瑄瑄是個小小的意外...之所以有了瑄瑄大概只能解釋成因為我還來不及結紮所造成. 不過, 經過一點點小小的天人交戰後, 我和老婆仍然鼓足勇氣迎接著這個小小生命. (其實應該給她娶名叫欣怡?)


跟大姊姊一樣, ㄚ瑄出生時多了一隻大拇哥, 現在成為7個月大的她每天茶餘飯後的"小點心".
瑄也跟珮一樣由阿嬤(就My mother)照顧, 在彰化可是倍受長輩們的喜愛啊!

七個月大的ㄚ瑄已經是個愛玩的大嬰兒了. 她坐學步車居然可以往前衝刺, 會主動去逗弄兩個姐姐.兩個姐姐也很喜歡照顧她, 我想應該是個幸福的孩子吧!



More: 阿瑄

2008年11月18日 星期二

孩子的成長: NO2 庭庭

庭庭算是在我們擁有自己房子後, "刻意"製造的老二. 大概是刻意製造的, 所以很健康的在足月的時後出生 (3100g 健康寶寶)



因為庭不像姐姐有參加保溫箱團, 所以媽媽坐月子可不輕鬆啊... 加上庭比較"囉唆"一點, 老是半夜哭個不停, 她的爸爸-就是在下我, 又不在身邊. 所以她的媽媽-就是我老婆, 就很累... 不過還好白天有外婆幫忙, 讓媽媽至少可以補個眠. 無論如何, 這次媽媽雖然在娘家有上等雞和高級燉品伺候, 但庭庭晚上的哭鬧還是讓媽媽月子坐得不太好...

以下是庭6個月, 1歲, 和2歲的照片:




還是很可愛吧!
不過, 庭有個"不堪回首"的過去. 小時後的庭, 模樣其實有點"嚇人"呢! (點這裡)
看完是否覺得女大18變呢?

不過庭還是有些優缺點:
優點:
(1) 自理能力, 適應力超強, 很獨立
(2) 觀察力好, 腦筋動得快, 具備獨立思考的能力
(3) 重感情, 愛撒嬌

缺點:
(1) 霸道... (搶姐姐的東西是常有的. 卓小毅說: 所以她是大老二)
(2) 機車... (有話不直說,有屁不快放, 不爽時只會咿咿喔喔滴, 不然就攤在地上讓你火氣很大)
(3) 賴皮... (所有小孩的通病, 但她是完全沒有信用可言啊..哈哈)

2008年11月17日 星期一

孩子的成長: NO1 小珮

回想起孩子們的成長, 真的是點滴在心頭.
小珮已經六歲了, 成為小一的新生, 回顧她剛出生的模樣 (才1360g的早產兒, 一出生就參加保溫箱團 ... )


第一個孩子總是特別新奇, 所以當父母的自然就迫不及待地幫她穿上了不適年齡的服裝: (才滿月吧 ... 2kg ? 硬給她穿洋裝...)



小女孩漸漸長大, 個性也慢慢突顯出來. 小珮是個重感情的孩子. 最不可思議的是才5個月大的她居然每次都會因為爸媽要把她留在彰化而哭泣... 而每次我們回到彰化去看她時, 她也會用淚水抗議我們. 印象最深的一次是: 她本來和阿媽玩得很開心, 還笑嘻嘻的. 忽然看到我和老婆從新竹回來, 她便停下來緊緊抱著阿媽, 臉夾上還輕輕地流下兩行小眼淚... 看了真不捨... 那是我一輩子都忘不了的眼淚啊!

以下是珮2歲, 3歲, 4歲, 和5歲的照片. 時光飛逝, 彷若彈指之間!


真的很可愛耶. 不過, 珮現在有兩個很大的缺點一直讓我們很頭痛:
(1) 做事拖拉,糊塗. (2) 不愛吃三餐(長不高的小孩啊, 上國小還110公分.... )
(3) 逃避現實, 愛裝傻, 愛抓耙子

珮的優點呢?
(1) 對語言的學習很有興趣, 國文和英文算不錯了 (數學就不行 >_<~)
(2) 乖巧體貼, 活潑好動 (不過有時過度好動愛玩...)
(3) 還是有點上進心滴...

2008年11月16日 星期日

CPU 設計的藝術(III)

Pipe Line 簡介:

Pipe Line的觀念對CPU的運作相當重要. 因為指令Fetch進來之後, 其運作需要許多的時間, 如果每次都要等運作完一個指令, 再Fetch 新的指令進來, 似乎在效率上有所受限. 於是聰明的人類想到了Pipe Line 的方式: 把指令運作切分成幾個Stage, 每個Stage只做部份的工作, 就像工廠的生產線一樣. 當第一個指令從第一個stage運作到最後一個stage並結束後, 雖然其所花費的時間跟沒有切分stage是一樣的, 但是第二個指令卻可能已經跟著運作到最後一個stage了, 接著的每一個指令也都有機會緊密地跟著, 也就是說, 指令與指令的間隔時間被縮短了! 如果沒有切分stage, 則一個指令在運作時, 其它指令就只能等在外面. 若切成幾個stage來做, 則同一時間可以有好幾個指令在不同的stage運作, 其效率自然會大幅提升.

舉例來說, 如果一個指令的運作需要10ns的時間. 在不切Pipe-Line的CPU上運作, 就是每10ns執行完一道指令. 假如我們有100道指令,則需花費1000ns 才能運作完成. 但是, 如果我們將其執行的動作切成10個stage, 每一個stage只需要1ns的運作時間. 第一道指令雖然也要花10ns的時間才完成, 但是接著第二道指令卻只要再花1ns, 第三道指令跟著也是, 依此類推. 所以, 做完100道指令所要花的時間就等於: 10ns + 1ns *99 = 109ns. 這是多麼大的差距啊!

這時後肯定就有人會想, 那stage不就切愈多愈好了? 嗯, 似乎沒有這麼簡單而絕對的事情. 那是因為, 指令裡經常有"跳躍"的動作(branch or exception ...)這些"跳躍"會造成指令經常要停止Fetch或重新Fetch. 因為我們不會在程式要Fetch進來時, 就可以確切地知道它要跳到哪裡去執行. 所以, Pipe-Line 是不可能永遠地連續下去的. 當存在Pipe-Line裡面的指令要被Flush掉時, 切愈多stage的Pipe-Line反而需要花更多時間重新fetch code. 另外, 若stage的分工太細, 也會增加design的複雜度. 理想的Pipe-Line是每一個stage花的時間都一樣. 但是, 那是難以做到的事. 一定會有某一個stage是最花時間的. 以上面的例子來說, 若10ns切成10個stage來運作, 其中最花時間的stage可能是1.2ns, 不會剛好是1ns. 那麼, 整個Pipe-Line的運作就變成需要1.2ns * 10 = 12ns. 反而比原本的10ns 還多.

通常, Pipe-Line有兩種分析的方式, 我們以5級的Pipe-Line為例:

(1) 以時間為橫軸, 指令為縱軸:


uop123456789
uop1:FetchPDDecodeEXEWB
uop2: FetchPDDecodeEXEWB
uop3: FetchPDDecodeEXEWB
uop4: FetchPDDecodeEXEWB
uop5: FetchPDDecodeEXEWB


所以, 執行完5個指令需要9個cycle time, 而在第5個cycle時, 每一個stage就都有指令在運作: uop1在WB, uop2 在EXE, uop3在Decode, uop4在PD, uop5在Fetch....

(2) 以時間為橫軸, Pipe-Line Stage 為縱軸:

Stage123456789
Fetch:uop1uop2uop3uop4uop5
PD: uop1uop2uop3uop4uop5
Decode: uop1uop2uop3uop4uop5
EXE uop1uop2uop3uop4uop5
WBK uop1uop2uop3uop4uop5


How CPU works ?

CPU 設計的藝術(II)

一般的CPU設計大概都會分成 (1) Fetch Code (2) Decode (3) Execution (4) Write-Back 等Stages, 以下分別說明:

Fetch Code:
是把程式從Memory讀進來的動作, 通常會有Instruction Queue 儲存fetch 進來的code. 之所以需要Instruction Queue我想是因為code 有時從較慢的DRAM讀進來, 有時則從較快的Cache SRAM讀進來, 其速度是不定的. 當fetch code的速度較消耗的速度快時 (EX: from Cache SRAM), Queue 會漸漸被堆起來, 只要Queue沒有滿, 就可以繼續fetch code. 相反的, 當fetch code變得比code消耗地慢時, 假如Queue裡面正好有堆積了一些, 則會開始把Queue裡的code消耗掉.不至於沒有東西可以執行而造成浪費時間. 另外, CISC的CPU比RISC的CPU更需要Instruction Queu. 因為CISC的指令長度不定, 因此每次fetch進來的指令數量也不一定. 所以CISC的fetch code和consume code 的速度存在更多的差異. 當input和 output之間的速度有差異, 就需要 buffer幫忙: input 較快時, 先存些東西; 而當outout較快時, 因為平時可能有存些東西在buffer了, 所以也不至於沒東西可以處理. 如此可以有較多機會保持CPU不停地工作.

Decode:
Decode Stage 則是將Fetch進來的code "decode"成許多內部的control訊號, 根據code的要求做相對應的control. 而code需要做運算的部份, 則交給下一個Execution Stage處理. 在進入Execution Stage運算前, Decode stage則負責把需要切換或開啟的動作訊號準備好. 對CISC而言, Decode的動作更為複雜, 因為每一道指令長度都不固定, decoder就需從code的內容先decode出它的長度, 再根據其長度"align" 出指令. CISC的一個指令可能需要好幾個micro-op完成(如前篇所述), 此時通常需要一個所謂micro-rom的東西幫忙把後續的micro-op查出來, 一般稱做"micro rom sequence"

Execution:
大概就是處理加減乘除或邏輯運算等. 複雜一點的可能還有相量運算(多用於多媒體應用)以及符點運算(科學計算軟體)等. 此外, 對於記憶體的存取, 需要計算計憶體位址. 對x86 CPU而言, 更有複雜的保護模式需處理. (Task switch, Memory Limit check, priority check等). 此部份有機會以後再介紹囉!

Write-Back:
指令運作的結果通常會儲存到internal 的register, 以供後面的指令取用. 此動作就叫做write-back.