cpu执行指令是不是一条一条执行??

asdasfww 2011-08-04 02:07:23
看书上写的超标量流水线说每个时钟周期(每个机器周期)最多可以执行3条指令,看到这我晕了。如果真的是这样那
nop
mov al,1
mov bh,al
这3条指令可不是乱了(都还执行把1送到al就把al的值送给bh了),到底cpu是不是在同一时刻只能执行1条指令
还有多分支预判断是什么意思?
...全文
713 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
亮______亮 2011-08-26
  • 打赏
  • 举报
回复
支持
...
用户 昵称 2011-08-07
  • 打赏
  • 举报
回复
是一条一条的,无相关性的多条指令,从意义上就不是顺序的,所以无论先执行哪一条,都可以说成 没有乱序,有相关性的指令,肯定要顺序执行。

所以是一条一条执行的。
guangmingdeshenju 2011-08-07
  • 打赏
  • 举报
回复
不会乱,并行处理都有流水线结构,取址,访存,执行,写回,
每一条指令在同一个时间处在这个流水线得不同阶段
如果前后两条指令有相关性,则不会并行执行
aeolianliu 2011-08-06
  • 打赏
  • 举报
回复
..........1.......2......3......4.....5......6......7......8......9
指令5 ..............................取指令-读内存-读端口-写内存-退出
指令4 .......................取指令-读内存-读端口-写内存-退出
指令3 ................取指令-读内存-读端口-写内存-退出
指令2 .........取指令-读内存-读端口-写内存-退出
指令1 ..取指令-读内存-读端口-写内存-退出

这样总行了把
aeolianliu 2011-08-06
  • 打赏
  • 举报
回复
我晕,帖子里的空格怎么给删了?!

lz参考这个图片。
http://211.69.144.40:8080/include/htmleditor/uploadfile/20091214001326114.jpg
aeolianliu 2011-08-06
  • 打赏
  • 举报
回复
每个机器指令都含有多个微指令,每个微指令占用一个机器周期(一个cpu滴答)。
假设每个指令都有如下微指令构成:取指令-读内存-读端口-写内存-退出,共需5个机器周期。
那么流水线就像以下结构


1 2 3 4 5 6 7 8 9

指令5 取指令-读内存-读端口-写内存-退出
指令4 取指令-读内存-读端口-写内存-退出
指令3 取指令-读内存-读端口-写内存-退出
指令2 取指令-读内存-读端口-写内存-退出
指令1 取指令-读内存-读端口-写内存-退出

假设上面表中垂直方向的不同指令的微指令不冲突,那么这些垂直方向微指令可以在一个机器周期中完成。

如果cpu没有超标量流水线,那么执行5个指令需要耗费5x5=25个机器周期。
如果cpu有超标量流水线,那么执行5个指令需要9个机器周期。

以上只是理论上的效率提升,实际情况下,有些微指令不能再一个机器周期中完成,因为有可能有冲突。
比如读端口,如果两个微指令同时读一个端口,那么cpu只能顺序执行,不能并发执行。
skyworth98 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 haojiahuo50401 的回复:]
怎么要考虑那么多东西啊?什么指令分支预测,什么多核的,什么流水线,对这些我都听说过一点点,不太明白。我就当作CPU是一条条顺利执行指令了,这样理解多简单。
[/Quote]

可以去研究一下计算机系统结构。
canmeng 2011-08-04
  • 打赏
  • 举报
回复
怎么要考虑那么多东西啊?什么指令分支预测,什么多核的,什么流水线,对这些我都听说过一点点,不太明白。我就当作CPU是一条条顺利执行指令了,这样理解多简单。
pro_or_gram 2011-08-04
  • 打赏
  • 举报
回复
每个周期执行几条指令,个人理解是一个平均的说法,
每一个指令都细化为 取指,解码,执行,保存等阶段
当流水线建立起来之后,每一个指令都会处于不同的阶段,占据流水线中不同的位置,
所以,看起来有几条指令都在执行,只是处于不同阶段而已

流水线 正常运行的时候,会被认为是很爽的事情。

core内部的 指令预取队列,instructioin cache,都是基于时间性和空间性的概念来使用的。
以下是引用:
"引 入Cache 的理论基础是程序局部性原理,包括时间局部性和空间局部性。即最近被CPU 访问的数据,短期 内CPU 还要访问(时间 );被CPU 访问的数据附近的数据,CPU也会访问"

在指令中出现跳转指令之前,流水线也一直在跑,假设碰到了跳转指令,对其解码之后,CPU才能决定要不要进行跳转,万一要跳转的话,流水线中后边的数据就没用了,会被flush掉,在进行中的指令经过的那些stage白费了,指令预取单元,instruction cache中的指令可能也就白白缓存了,如果这样的话,就会出现 instruction cache的填充,替换,虽然这个过程可能使用sdram的 burst mode,但是也是要花时间的。

跳转,也就是碰见了分支。
一个T字路口,路口边有一个指示牌,天堂向左,地狱向右。
一个人想去天堂,直到走到十字路口之前,这个人都是很爽的,路上不塞车,一路狂飙,
车到了这个T字路口,虽然没有红灯,但是他不知道该往哪个方向走,他就看指示牌,看了指示牌之后,他就采了油门向左边的方向冲了下去,接下来又是一路狂飙。

有另外一个人,想去地狱。 在到达这个T字路口之前,他也很爽,一路狂飙,他的车上有一个GPS,虽然他没法在GPS上顶一个目的地址,但是他可以看到前面的路况,那么他就发现,前面有一个T字路口,往左是天堂,往右是地狱,他知道,他该从右边走,那么,他就没有像之前那个人那样停下来,他直接一个漂移,向着右边的方向就冲了下去。

所以为了尽量减少跳转指令导致的一些开销,就有了一个指令预测这么个东西,处理器架构师们希望能尽早的发现有没有跳转指令,要不要跳转,而不是像上面那样,指令都在流水线里边了,才去决定。

所以,在最初的时候出现的是个流水线使用的最差的情况,有了指令的分支预测,可能就爽了很多了

mooxin 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zara 的回复:]

下载的 cpu,预测、分析和执行能力都比较强的,如果后一指令不依赖于前一指令的执行结果的话,就会并发执行的,比如楼主的第二条和第一条指令;但第三和第二条指令就不是了,它们具有相干性,后面的指令就必须等前面的指令执行完了才能继续。
再一个比较意外的例子吧,看个优化的书上说,对 sum = i1 + i2 +i3 + 4; 这样的语句,这样写法的执行效果就不如 sum = (i1 + i2) + ……
[/Quote]

对的
大熊猫侯佩 2011-08-04
  • 打赏
  • 举报
回复
双核的机子,除去竞争条件,你说是不是一条条执行。
zara 2011-08-04
  • 打赏
  • 举报
回复
下载的 cpu,预测、分析和执行能力都比较强的,如果后一指令不依赖于前一指令的执行结果的话,就会并发执行的,比如楼主的第二条和第一条指令;但第三和第二条指令就不是了,它们具有相干性,后面的指令就必须等前面的指令执行完了才能继续。
再一个比较意外的例子吧,看个优化的书上说,对 sum = i1 + i2 +i3 + 4; 这样的语句,这样写法的执行效果就不如 sum = (i1 + i2) + (i3 + i4);!这个就是基于指令相干性对并发执行的影响。
竞择 2011-08-04
  • 打赏
  • 举报
回复
这三个指令会顺序执行,所谓的并行处理,是不同程序的指令可以同时执行,没个程序占一条流水线,所以不会混乱。而CPU需要把不同程序指令加以标记,使得同一程序得以顺序执行。

个人理解.

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧