【讨论】探讨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
level 13
受教受教[吐舌]
其实判断位数看这个CPU支持操作多少位的数据格式就行了
参考MIPS,印象当中MIPS是最早玩位数的,当时MIPS的CPU大多都分两个版本,一个32位版,一个64位版,最早应用到民用领域的64位CPU应该是N64游戏机的R4300i
MIPS的CPU有很多特点,超宽的寄存器和总线系统,即使是32位架构也支持128位寄存器,128位总线系统和128位FPU,所以索尼当时利用这一点第一个宣传出128位游戏机的概念,其实CPU核心是64位的,但是总线和矢量单元都是128位,所以索尼宣传是128位主机。
2015年01月08日 09点01分 7
现在x86的控制寄存器,分支相关寄存器,SSE指令集,AVX/2.0都有很宽的寄存器,但这和通常意义上的寄存器有很大不同,通用寄存器可以寻址,模拟数组,查表,分支指令等等,,我没学过SSE这些向量指令集,不过向量指令和x86指令集并不一样,怎么说。。。
2015年01月08日 18点01分
向量指令针对的主要还是计算吧,比如图形处理等等,,而x86的核心指令集是来写程序的,控制程序流程,变量,数组,链表,结构体,函数等等,这些高级语言汇编后都是调用的通用寄存器和x86指令,,所以我不觉得这些特殊寄存器能表示字长,
2015年01月08日 18点01分
而且这些向量指令,全部都可以用普通x86和通用寄存器指令模拟,只是没有硬件方法来得快,,,而且这些向量指令的算法可能是经过深度优化在设计成硬件的
2015年01月08日 18点01分
回复 pengzhenxx :我就是说不能代表位数撒,PS2是个反面例子
2015年01月09日 06点01分
level 14
CPU字长只取决于内部数据总线的宽度。
X86-64的CPU,字长64位,照样有支持矢量运算的指令集子集指令(软)和128bit的寄存器(硬)。所以x64的CPU也不会用64bit的GPR去参与存放和执行128bit的数据运算。
照现在的技术水平,CPU字长做到128bit或者更高的1M根本一点难度都没有。但做出来估计是没人敢买了。
2015年01月09日 16点01分 8
level 14
关于32bit和64bit的优劣差别,当年IEEE有相应的论文
http://ieeexplore.ieee.org/xpl/login.jsp?reload=true&tp=&arnumber=4086140&tag=1&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D4086140%26tag%3D1
上面这个是X86的,ARM和mips的还没有。ARM的估计要再等几年,毕竟64位CPU还没大量铺货。
2015年01月09日 16点01分 9
看不了全文啊[呼~]
2015年01月10日 09点01分
回复 crayon嘻哈小新 :全文要钱,直接看这个吧。[url]http://blog.sina.com.cn/s/blog_685fc2ec0101hz23.html#comment1 [/url]
2015年01月10日 10点01分
level 5
马克
2015年09月02日 01点09分 11
level 12
小吧能讲下各代gpu的调度方式么?比如几个周期,波次是如何分配的,怎么取warp或者wavefront的。来个总结,包括gcn,vliew时期的农企,g80/gt200,fermi,kelper,maxwell。
@crayon嘻哈小新 吧主也来说说。。。
2015年09月05日 16点09分 12
量不小啊,最近精力有限,有时间的话开贴整理这些资料吧,想写的东西还有不少,都还欠着,没有精力去写
2015年09月07日 17点09分
level 7
我手机的cpu是睾酮8084
2015年09月07日 09点09分 13
1