作者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
1F:推 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)
2F:推 moonshade:XD 11/03 10:28
3F:→ moonshade:我查standard signal..没有这个Orz 11/03 10:28