木头龙,开了个新专栏,收录些老回答 阅读原文 请问提高主频和流水线有什么样的关系? 流水线设计的步(级)越长,完成一条指令的速度就越快。 这两个问题一起回答好了。 既然是流水线,就用流水线举个例子好了。假设一条工厂的流水线,需要给零件拧 4 种不同规格的螺丝,每种螺丝 2 个,工人拧一个螺丝需要 5 秒(工人拧螺丝的时候流水线需要暂停等待),流水线移动一格需要 5 秒。 对比一下流水线分 4 级,每个工人拧 2 个同规格的螺丝,和流水线分 8 级,每个工人拧 1 个螺丝相比: 4 级流水:完成一个工件的总时间:(5+5+5)×4=60 秒;每 15 秒钟产出一个工件。 8 级流水:完成一个工件的总时间:(5+5)×8=80 秒;每 10 秒钟产出一个工件。 流水线的移动速度并没有加快,但是通过更多级的流水线,可以使得流水线的暂停等待时间更短,从 1/15 Hz 提高到 1/10 Hz,频率更高。 如果我们再假设一个机制,就是当产出的工件达到一定数量后,就马上改为生产另一种工件,4 级流水只要 60 秒就能产出第一个工件,而 8 级流水需要 80 秒。如果每种工件每生产 3 个就更换一种,那么 4 级流水生产一种工件需要 60+15×2=90 秒,8 级流水生产一种工件需要 80+10×2=100 秒,反而更慢。这就是过长的流水线带来的性能下降问题,Intel 的 Netburst 架构,AMD 的 Bulldozer 架构都存在这个问题。 文中还说“实质是以时间换取空间” 这个先看原文: 超标量(superscalar)是指在 CPU 中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 其实质是以空间换取时间。而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间。 在上面的例子中,设置 8 级流水的代价是每个工件的完成时间增加了 20 秒,这就是这段话中以时间换取空间的意思。 扩展指令集中指令的条数是否受到了制造工艺的限制,如果没有的话,为什么不集成更多的扩展指令集呢。 CPU 一直在集成更多的扩展指令。Intel 几乎每一代 CPU 都会增加一条或者多条指令;某一代甚至是增加整个指令集,例如大家经常听到的 x87,MMX,SSE,AVX 等。不过事实上,因为 CPU 里面都是二进制数据,因此理论上一个通用处理器,只要支持最基本的几种二进制运算就可以实现任何计算。当然,这样的处理速度会很慢,因为一个很常见的操作,就需要转换分解成很多步基本运算才能完成。所谓的扩展指令,就是把一些常见的基本指令组合用专用的硬件实现,达到一个或者几个时钟周期,就可以计算出需要几百上千步基本运算才能完成的计算。 但是这样的组合是无穷无尽的,每一条指令都需要用额外的晶体管来实现,虽然每一次工艺升级,都可以在同样大小的晶圆面积上摆放下更多的晶体管,但具体到某一代工艺,良率和成本限制所决定的可接受最大芯片面积,能容纳的晶体管数量总是有限的。只能由 CPU 厂商根据业界发展预测将来哪一些指令组合会更频繁的被使用,并把这些组合用硬件电路实现,固化为新的扩展指令。 举例来说,我写一个软件,经常要计算 A×B÷C 这样的组合,但 CPU 厂家觉得这只是我一个人的情况,所以不会做一个这样的扩展指令;但 A×B+C 因为是常见的矩阵运算,有很多人用,所以就做了一个 FMA 指令集。 指令是否就是指指令集中的指令, 是的 他们与终端的软件程序有什么关系? 软件程序就是一组按照特定顺序排列以完成某种特定任务的指令代码,以及运行这些指令所必须的数据,按照操作系统约定的某种结构所组成的一组二进制代码。 软件程序的运行是否全部转化为这些指令,随后让这些指令到处理器的流水线中进行执行? 是的,CPU 流水线的第一阶段就是 CPU 的取指单元从内存中载入一段程序,并且按照操作系统约定的格式,从中提取出按顺序排列的一串指令代码。第二阶段是 CPU 的译码单元把这些代码分解成具体的指令以及指令操作对象(寄存器、内存地址或者立即数),某些复杂指令可能还需要再进一步拆分成多条内部指令。 阅读原文