Assembly 以时钟周期计算程序的运行时间

Assembly 以时钟周期计算程序的运行时间,assembly,x86,Assembly,X86,如果装配程序如下所示: 说有74个时钟周期是正确的吗? 我感到困惑的是,它说的是16个后退或4个前进时钟周期。在我的例子中,我是如何得到74个时钟周期的,我只是把每个时钟周期加起来。前后都有。很难找到关于这个主题的任何信息,因此任何输入都会有所帮助。在回答您的问题之前,我想说,这种方法不适用于任何现代流水线/超标量/无序处理器设计。有些指令的延迟为零,例如核心i7上的寄存器MOV指令 后退/前进注释是指分支机构是否后退。分支的延迟取决于它的方向 该计划将采取远远超过74个时钟周期。您应该对每个执

如果装配程序如下所示:

说有74个时钟周期是正确的吗?
我感到困惑的是,它说的是16个后退或4个前进时钟周期。在我的例子中,我是如何得到74个时钟周期的,我只是把每个时钟周期加起来。前后都有。很难找到关于这个主题的任何信息,因此任何输入都会有所帮助。

在回答您的问题之前,我想说,这种方法不适用于任何现代流水线/超标量/无序处理器设计。有些指令的延迟为零,例如核心i7上的寄存器MOV指令

后退/前进注释是指分支机构是否后退。分支的延迟取决于它的方向

该计划将采取远远超过74个时钟周期。您应该对每个执行指令的延迟进行求和,清单中的大多数指令将执行多次。例如,第一个DEC将执行65535*65535*65535次,大约为2^48

由于程序由循环组成,因此正确的分析方法是从最内层的循环开始,计算其延迟,然后继续到外层循环。最里面的循环从标签back1开始,包含两条指令,一条DEC指令和一条JNZ指令。因为它执行65535次迭代,所以这个循环的延迟是65535*2 DEC+65534*16 taked JNZ+1*4 not taked JNZ,这等于1179618


该循环嵌入从标签back2开始的外部循环中,包含MOV、内部循环、DEC和JNZ。您可以与前面的计算类似地计算此循环的运行时间。之后,您将计算从back3开始的循环的运行时间。最后,不要忘记第一条MOV指令,它不包含在任何循环中,只执行一次。

我不知道这里的“后退/前进”是什么意思。但在计算时钟周期时,还有许多其他因素需要考虑。有管道吗?这些跳跃是近还是远?是否有缓存?运行时间通常涉及总时间,因此如果执行mov ax,2 loopLabel:dec ax jnz loopLabel,将需要4+2+16+2+4个周期执行的指令有:mov,dec,jnzjumps,dec,jnzskips。如果你要在你的代码中一条接一条地使用指令,那么只需要几百年的时间就可以把它们全部计算出来,所以从今天开始吧。。。了解每个指令执行多少次以及为什么。但是使用jnz进行后退/前进有点愚蠢。。。它不是那样工作的,它可以前后跳跃,方向取决于编码的偏移量。在您的代码中,所有请求的跳转都指向代码的开头,但谈论已执行/跳过的条件跳转(无方向)更有意义。顺便说一句,当我在谷歌上搜索汇编周期计数时的第四个链接:看起来解释得足以帮助你,即使是不同的CPU,你可以计算的是执行的指令数,你不能确定的是时钟周期。我猜这个问题是基于上世纪80年代的CPU,可能是80x86,在分支预测、缓存、多个执行单元等出现之前,生命更具确定性……分支的延迟取决于它的方向。我想你错过了一个不在那里的机会。看见对于循环计数,方向并不重要,只影响是否执行分支。方向重要的唯一原因是当您有静态分支预测,而8088/8086没有任何类型的分支预测(静态或其他)时。重要的是分支清空了微小的预取队列。另外,当你像这样计算周期时,你是在计算吞吐量,特别是反向吞吐量,而不是延迟。当您有一个依赖链,并且后面的指令等待前面指令的结果时,延迟就开始发挥作用。这当然是现代处理器的一个问题,为什么在现实世界的性能评估中,延迟通常比吞吐量更重要,但在8088/8086上却无关紧要,因为它没有流水线,当然也没有无序的OOO执行!您在回答中多次误用延迟一词。OP没有指定哪个处理器。如果问题出在现有设计上(这似乎不太可能),那么它显然早于流水线80486,但也可能不是8086。对于大多数操作,8086的循环时间大约为10个时钟,而不是4个时钟。注释清楚地表明执行时间的差异取决于分支的方向。由于我们在注释中给出了每条指令的周期时间,我不想猜测。在非超标量/非OOO设计中,延迟和交互吞吐量是相等的;在当前指令完成之前,无法执行下一条指令。我同意你所说的一切
如果我们说的是现代处理器,那么OP的问题就没有意义了。由于这在过去25年中不适用于任何x86设计,我怀疑这是一种家庭作业。评论中给出的周期时间是针对8088/8086的。这些处理器上的循环时间正式相同。当然,在实际应用中,8088速度较慢,因为其8位总线有限,预取队列较小,但英特尔时代并未考虑这一点。OP的目标是8088/8086,这在一定程度上是合理的,因为这是许多仿真器仿真的对象,通常追求高度的循环精度。我理解你关于延迟和吞吐量相等的想法,但是延迟这个术语在当时没有被使用,所以我认为它仍然令人困惑。