x86指令集疑问
1.看了mik的指令格式介绍,发现x86竟然是变长编码?
最长码长是15byte,
现在有个问题,如果是这样,那么以内存位宽来说(不太了解是多少位,32bit?64?128?)
2.如果一次可以读取64bit,那么对这些长指令,读取就需要2次读取了?
3.不清楚ddr内存的读取位宽是多少,待会查下。
若如此,那么一次内存读取,对短指令来说,就是多条指令读取,
于是乎指令集并行就可以开始了。
惭愧,原来印象一直以为x86是定长指令集,一次读取一条指令。
恩,估计我还停留在当年8086的认识中
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
x86一开始是按照CISC设计的,变长指令很正常。
8086也是变长指令。
x86内存一次读取都是64bit的。不过有cache这东西。所以我感觉影响应该不大吧。
确实,x86是64位数据FSB.其单条指令执行最少也得10多个cycle吧。分两次读cache拼一条指令也可以理解。
以前版上有个x86指令cycle数的表,怎么撤下了
http://linux.chinaunix.net/bbs/thread-892236-1-1.html
随着CPU越来越复杂,架构越来越多样,周期数已经不太能说明问题了
8086从开始设计的时候就是标准的CISC样式,变长指令。
不过自从Pentium Pro之后,内部已经变成RISC化,由一个翻译模块把变长指令翻译成一条或多条定长的微指令,然后这些微指令再乱序执行。
其他就不说了,我就跟你说一说指令 fetch(取指过程)
AMD 方面:
AMD 的 L1 instrction cache 是 64K,2-way set 结构,cache line size 是 64 bytes,cache 的装载是以 cache line 为单位的,也就是每次 L1 instrction cache 会从 L2 cache 从加载 64 bytes 字节,如果 L2 cache miss 再到 L3 cache,L3 cache miss 最后到 main memory 加载。
那么:每次 L1 instrction cache line fill (装载),这就是一个 prefetch 预取指过程。 随之而来一系列的 pre 动作就会同时产生:predecode (预解码)、branch prediction(分支预测)等,这一系列动作都是在 cache line fill 时同时产生。
然后,到从 L1 instrction cache 真 fecth 、真decode(解码) 送到指令控制单元,分派指令执行。
Intel 方面:
Intel 的部件工作分工比较细,prefecth、predecode、branch predication 都有相应的部件进行。L1 instrction cache line 同样是 64 bytes。
从 L1 instrction cache 及 ITLB prefecth 到 prefecth buffer,作相应的 predecode 和 branch predication。结果送到指令队列 buffer(Instruction Queue)。再从 instrction Queue fetch 和 decode,经过指令融和操作后,送调度单元分派指令。
[ 本帖最后由 mik 于 2008-12-8 02:35 编辑 ]
这些CPU的流水线都搞的很长。
CPU的发展史不是很清楚,
既然X86属于CISC
当年那场CSIC与RISC,变长与定长指令集之争,演变到现在好像二者
之间已经开始互相融合了。
在以取指过程说明这个时,最好不涉及cache。
当CPU内的控制器部件从内存里取指令时,是一字节一字节(或一字一字)取的。
当取出指令的第一字节(字)放入控制器内的指令寄存器时,译码器就能判断出许多信息,其中肯定包括这条指令是由几个字节组成的。这就是变长指令的最基本机制。
除了最早期的计算机,后来的以及现在的所有种类的计算机,它们的内存存储单元都是八个bit。我们常说的“字节”,其真正的含义,就是内存存储单元的数据宽度。现在,早就统一为8个bit。
加上了cache,那就变成了“宏观的”取指了,它变成是一次提取几条、几十条、几百条指令。