【讨论】探讨CPU字长【16位,32位,64位CPU】对CPU性能的影响!
gpu吧
全部回复
仅看楼主
level 12
pengzhenxx 楼主
楼主看到不少人对CPU字长没有了解,只知道64位CPU要好些,还可以装64位系统,上大内存,也知道一般64位CPU好于32位,,但很少有概念,今天楼主就来探讨一下吧,字长究竟是如何影响CPU的
首先是概念-----CPU字长
一般而言主要通过以下几个方面判断CPU字长:
1.主要的寄存器长度,这里主要指通用寄存器,其他控制寄存器,分支相关寄存器,浮点寄存器可能比通用寄存器更长,达到48bit,128bit,256bit甚至更长,但这些寄存器,你无法直接调用,也无法通过这些寄存器寻址,编程绝大部分调用通用寄存器,所以不能看这些特殊寄存器
2.主要ALU的长度
3.数据总线的长度(内部的)
比如8086,它的主要寄存器,数据总线,ALU宽度,内部的寄存器与寄存器,寄存器与ALU之间的通道全部都是16bit长,所以他是16位CPU,,8088虽然外部只有8bit的总线,但内部和8086完全一样,所以它也是16位CPU,,
下图为8086的所有寄存器(ax,bx,cx,dx,sp,cs等等),全部是16bit长
Intel 80386开始支持32位CPU技术,也增加了几个32bit的寄存器,主要是eax,ebx,ecx,edx,esp,edp,sei,edi等等,其ALU和数据总线全部翻倍至32bit长,也就是说32位CPU相对16位CPU一次可以运算32位的数据了,但这究竟有什么优势呢?下面结合16位CPU和32位CPU来具体对比
(PS:80386虽然采用了32位CPU技术,也增加了保护模式和虚拟8086模式,但核心指令集依然是8086的扩充,本质并没有变化,现在的CPU依然继承了8086的核心指令集,所以有了x86系列CPU,现在的i7,AMD 8核的核心指令集依然继承了8086,所以学8086并不会过时)
2015年01月06日 14点01分 1
level 12
pengzhenxx 楼主
下面举个例子:
计算70000
+3
0000的结果,,虽然对于人们来看,70000+30000明显等于10万,但对于16位CPU和32位CPU,确是大相径庭
对于16位CPU,最本能的想法:不就是70000+30000吗,一条add指令不就搞定了
那么好,我们开始汇编:
mov ax,70000 //ax=70000
add ax,30000 //ax=ax+30000=70000+30000=100000
这样结果10万不就保存在ax,寄存器了吗
实际情况是大错特错,实际是ax并不会等于10万,,,程序从一开始就错了,因为ax寄存器是16位寄存器,而70000这个数据得用24位来保存,所以mov ax,70000,并不会将70000写入ax寄存器,口说无凭,我们看图说话
虽然程序写了mov ax,70000
但实际却是mov ax,1170h
1170h是16进制表示的,通过转换1170其实表示4464的十进制数,,,其实70000的16进制是11170h,也即是说ax只能保存16位长的数据,所以多出的部分直接被忽略了(16位寄存器只能表示小于65536的无符号整数),这么算当然结果是错误的。。。。。。。既然16位CPU无法一次运算大于16位的数据那么我非要计算70000+30000那不是没办法了??答案是否定的,16位CPU当然可以计算,这时候既然寄存器无法保存这么大的数据,那我可以使用内存啊,内存可是很大的,保存个70000那是搓搓有余
于是有了如下写法
寄存器保存不到,那么我将70000写入内存,00011170正是70000的16进制,,,那么我们只需要将70000分成两部分,0000+0000和7+3分别进行两次运算,并用两个寄存器保存结果就可以得到
正确的
结果了,也即是10万,,,将程序运行完成后
总结:如图所示的001086A0,正是100000的16进制数据,,如此用16位CPU ALU实际上进行了2次加法运算才得到结果,,,由于寄存器是16位保存不了运算数据和结果还要借助内存保存
2015年01月06日 14点01分 2
level 12
pengzhenxx 楼主
再来看32位CPU是如何处理的,,,32位CPU的主要寄存器和ALU都是32bit,,当然可以直接用最本能的想法:
mov eax,70000
add eax,30000
我们来看具体过程
看起来好像很复杂,但实际有用的只有红框框里的2条指令和结果,,,其他的都是为了在windows保护模式下,输出的对话框的指令,完全无意义
总结:32位CPU的ALU和寄存器一次可以运算32位的数据,因此70000+30000,一次加法运算就完了,效率当然高不少
2015年01月06日 15点01分 3
level 12
pengzhenxx 楼主
大总结:
16位的CPU一次只能处理16位长的数据,但数据大于16位呢,,那么必须经过多次运算,并要借助内存方可得到正确结果,,,从上诉例子看进行同样的运算,32位CPU只用了2条指令,进行了一次运算,,,而16位CPU则要进行2次运算,指令也多执行了不少,当然32位CPU相对16位CPU更有效率,,类比32位CPU和64位CPU也是同样的道理
这只是一个例子而已,实际32位CPU相对16位CPU的便利和效率还有很多,体现在底层的方方面面,我就不举例了,真要对比得写很多很多很多很多了,类比64位CPU也是如此
2015年01月06日 15点01分 4
level 12
pengzhenxx 楼主
2015年01月06日 15点01分 5
1