作者gwliao (gwliao)
看板NTUGIEE_EDA
標題Re: [研究] short int
時間Wed Nov 2 16:49:29 2005
※ 引述《moonshade (我家很大︿( ̄︶ ̄)︿)》之銘言:
: 跟機器好像有關
: 我們主管有說過現在64跑32的程式會比較慢也是因為
: 4 byte unit的原因...
: 詳細原因請GW 回答XD
^^^^^^^^^ Orz
簡單地說, CPU內部會有幾種size的Functional unit (FU) ?
現代的CPU大概是2種, 一個是GPR的大小,一個是double的size.
先說FPU為何只有一種size!
因為float不常用, 且又浪費chip area,
所以當你read/write一個float時, CPU內部就會幫你轉成double.
(因為所有的FPU的FU/Reg都是為了double設計,
假如是64-bit的機器就更好玩了, 因為double剛好是64 bits)
再來說FU的size應該要能應付int/short/char.....等data type,
但是FU只有int的size. 因為跟上面一樣, read/write會轉換.
我沒說Long int (or long long)可以用於這類的FU,
通常都是compile去應付這些Hardware不支援的東西.
為何會變慢?
因為所有FU的設計都是為了原本的size而做,
當你要用不同的size來做的話, 當然不在設計者當初的構想當中.
(會變快的話, 要感謝cache的幫忙)
我不確定CISC的memory read的方式.....Orz (我沒做過)
但是RISC就有經驗了 :)
以下都是byte addressing.
假如我們要read一個int(32 bit),其address為M[X],
那(M[X],M[X+1],M[X+2],M[X+3])就會被放入Bus, 然後讀入.
但是....X假如不是4的倍數的話....Orz
要分兩次讀入, 然後在read buffer中merge為你要的int,
寫入也一樣.......一樣簡單(不alignment的話,一樣麻煩)
假如我們要read一個short int(16 bit),其address為M[X+1],
那(M[X],M[X+1],M[X+2],M[X+3])就會被放入Bus,
然後CPU由讀入的時候, 會用mask和shift一下,
Reg=(M[X]&0x0ff0)>>16; 這樣寫大家比較好懂!
所以可以看的出來, short不論如何一定要做masking和shifting,
假如不是address不是4的倍數的話, 還要在玩合併的遊戲 Orz
現在的CPU因為cache的關係, 所以這部份的差距變小了,
以前.....還是很多人用short! 為何用?
因為memory不夠,又沒有VMM, 誰想讓程式跑不起來. XD
用short是沒有好處, 除了省memory之外,
就是期望cache能讓你的program變快. (大部分的情況下是....變慢 XD )
不過有個題外話, 現在的OS都不對overflow/underflow做出處理?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.125
推 moonshade:不知道能不能生event 然後catch ? 11/02 17:40
這麼.....我相信應該是OS的問題,
因為x86的CPU都有這功能, 只要有overflow/underflow, CPU就會發出中斷,
只是以前的DOS是直接kill掉, 現在的OS就不曉得是如何處理.
( 或者....我們一直忽略那個訊息 XD )
※ 編輯: gwliao 來自: 140.112.230.125 (11/02 22:22)
推 moonshade:XD 11/03 10:28
→ moonshade:我查standard signal..沒有這個Orz 11/03 10:28