游侠NETSHOW论坛

标题: CPU/GPU运行机制和流水线(技术普及帖,计算机专业跳过) [打印本页]

作者: fengyeblade    时间: 2009-2-12 23:29:35     标题: CPU/GPU运行机制和流水线(技术普及帖,计算机专业跳过)

CPU运行机制和效率浅析(技术普及帖,计算机专业跳过)


主要针对CPU的运行机制和效率分析,目的是使对相关知识不熟悉的机油有一个初步的了解,有兴趣的都看看吧。
PS:为了大家能够更好的理解,下文尽量使用一些通俗的语气和比喻,避免使用太专业的术语,各位高手表笑偶

先说一下本文要说明的几个概念(看不懂不要紧,下面就会解释):

精简指令集,计算机CPU的一种设计模式,也被称为RISC(Reduced Instruction Set Computing 的缩写)。这种CPU指令集的特点是指令数目少,每条指令都采用标准字长、执行时间短、CPU的实现细节对于机器级程序是可见的等等。RISC设计的根本原则是针对流水线的优化。


复杂指令集,计算机CPU的一种设计模式,也被称为CISC(Complex Instruction Set Computer的缩写)。这种CPU指令集的特点是指令数目较多,每条指令专有功能、执行时间较长。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。

流水线:CPU的重要运行机制,把一个重复的过程分解为若干个子过程,每个子过程可以与其他子过程并行进行。在运行一个子过程的同时可以运行其他不相关的过程,达到提高运行效率的目的。

跳转:在流水线执行过程中遭遇同时间遇到相同子过程时,将其中一个后延以避免资源冲突。

好了,现在可以打比方了。CPU的运行机制就是解决某个任务的过程,我们挑一个简单的任务来打比方,大家都是要吃饭的,就用做饭作为我们的任务好了。这个任务有两种解决办法,分别叫做RISC和CISC。
RISC需要分三个步骤来做,每一步都很简单,它的过程时这样的:米=〉(淘米+放水+加热)=>饭,括号内就是我们的运行机制。
CISC一步就可以做完了,米=〉(煮饭)=>饭。
这样我们就可以分析它们的特点了,RISC需要更好的控制(好比是饭还是需要人去做的),而CISC则完全是自动的(好比是一台全自动的机器,把米放进去就行)。RISC的步骤相互独立,具有更好的灵活性,我们把淘米换成洗菜就能变成煮青菜了(青菜=〉(洗菜+放水+加热)=>煮青菜);而CISC功能单一,煮饭机只能煮饭,要煮青菜找青菜机去。反应在现实系统中,RISC功能更灵活,但是对编程要求很高(控制是由程序完成的),CISC指令数目更多(煮饭要有煮饭机,青菜要有青菜机,红烧肉要有...........),但是编程就很方便了。

接下来分析运行效率。假设RISC的每一个步骤都需要花费1个单位时间,而CISC的每个步骤需要花费2个单位时间(真人VS煮饭机,机器的单一效率总要比人快那么一点点吧 ),那么做一锅饭RISC需要3个单位时间,CISC需要2个单位时间。
但是游侠大家庭人气旺啊,一锅饭大家哪够吃呢?同志们,动手做饭吧!
问题出来了,锅只有一个(人穷啊,咱们买不起双核CPU),来不及喂饱这么多人啊。于是聪明人站出来了,我们应该充分利用资源,咱们人多啊,放水的同时我们可以淘第二锅米嘛,加热的时候也可以放第二锅水吗嘛,你你你,还有你,全部下去干活!于是,流水线正式登场!
流水线的原理,我们可以很容易的用下面的图来解释:

时间   1     2     3      4      5      6      
       淘米 放水 加热                         (路人甲友情操作)
               淘米 放水 加热                 (宋兵乙热情支持)
                       淘米 放水 加热         (看客丙倾情演绎)
                               淘米 放水 加热  (替补丁激情奉献)

同志们,群众的力量是无限的,在甲乙丙丁4位好同志的努力下,煮饭这一神圣而伟大的任务效率大大提高了。显而易见,参与工作的人员越多,工作的效率越高,在现实的系统中,这一参数称为流水线的级数,级数的多少决定了系统效率的高低,同时也决定了所付出的成本代价(雇人煮饭总要发工资吧)。
但是对于单一的CISC而言,流水线没有意义,没办法,煮饭机只有一个,人再多也是白搭,看下面:

时间  1    2    3    4    5    6   
        煮饭      煮饭      煮饭     

现在肯定有人要说了,6单位时间内,4位好同志已经煮完4锅饭了,煮饭机才干掉3锅,明显人力完胜机器,那我们还要CISC干吗?
对不起,兄弟,你太没追求了。现在都和谐奔小康了,几锅白米饭你就满足了?至少要做点菜吧,先简单点,就煮青菜好了,价格便宜量又足,我们一直都吃它。甲乙丙丁,开工了!

时间   1    2    3      4      5      6    7      8     9    10
      淘米 放水 加热 洗菜 放水 加热      
              淘米 放水 加热 洗菜 放水 加热  
                      淘米 放水 加热 洗菜 放水 加热
                              淘米 放水 加热 洗菜 放水 加热
                  
问题出现了,水池只有一个,水龙头只有一个,锅子也只有一个;淘米的同时就不能洗菜,两者不可能同时加水和加热。没办法,只有先把青菜放回冰箱,等到资源有空余的时候再继续流水。在现实系统中,资源无法共用的情况称作资源冲突,判断资源冲突和流水线等待的过程称为跳转,跳转的时间耗费取决于流水线的级数(人越多锅子越抢手)和任务的繁复程度(煮的东西越多锅子使用越紧张)。采用跳转的流水线如下:

时间   1    2    3    4    5    6    7    8    9    10
       淘米 放水 加热 洗菜 放水 加热  
               淘米 放水 加热 洗菜 放水 加热
                       淘米 放水 加热 洗菜 放水 加热
                       跳转=========>淘米 放水 加热 洗菜 放水 加热

对于CISC而言,因为两个任务相互独立(煮饭机+煮菜机),不存在系统冲突,流水线如下:

时间   1    2    3    4    5    6    7    8    9    10
          煮饭      煮菜      
                       煮饭      煮菜           
                                    煮饭      煮菜
                                                 煮饭      煮菜

OK,在这种情况下,10个单位时间内,RISC完成3个任务,CISC完成了4个,复杂指令集的优势体现出来了。
接下来我们再把任务扩大,我们要吃红烧肉,再来份清蒸鱼,再来份.......................直到满汉全席被干出来为止。这里不推演了,有兴趣的自己排流水线看看。最后的结论就是,对于繁复度和流水线级数较低的系统,采用RISC指令效率较快,反之则CISC具有更大的优势。

好了,相信看到这里,大家应该对以上的概念有所了解了。接下来沿着上文的思路,对其他一些概念进行解释::

中断:青菜洗好了,突然发现饭不够了,先停止煮菜,先把饭做好再回去煮菜。
顺序冲突:做饭团子必须先要有米饭,所以在流水线中必须先煮好饭再做饭团子,如果遇到没有多余的饭的时候,做饭团子的任务必须跳转等待。
混合指令机制,在使用煮饭机的同时也带动甲乙丙丁一起工作,充分利用空余的时间,具有较高的效率,但是必须有人进行调度控制(也就是需要专门的资源和设备进行管理)。


以上看出 流水线级越多似乎性能也是越好。大概是如此的,但是凡事必有利有弊。
比如流水线如果无限的增大,那么管理和调度起来就越困难。当遇到资源冲突的时候需要等待的步骤和时间也越久。流水线的状态也越混乱。一旦出现错误,需要处理的资源和数据也越多。
所以要根据流水的管理技术,电路的承载能力来搭配流水线的数量。

目前在CPU技术中 还有一向能力叫代码预处理。就是在代码执行之前,先预先优化和准备一下资源,或者编排一些不会冲突资源的并行代码。比如我们要准备做饭了,无论我们从库存(缓存,内存)中运输米或者菜到厨房都是需要时间和动作的。那么我们如果预先审视一下菜单,在厨房(CPU寄存器)控件允许的情况下一次性多拿米菜出来,那么我们以后的流水线就可以省去一些取材料的时间。高级的预处理还可以判断米菜的比例。或者可以预见在什么时候流水线会出现空闲,此时让这个流水线去继续搬运米和菜。越高级的架构,这个预处理的能力也越好,当然也需要编译的程序遵循一个预处理的规则。比如我们要作的菜叫“青椒尖椒伴香菜”,我们可以预先准备青椒尖椒和香菜。但是如果叫“老虎菜”可能就会出现预处理失败,到了运行的时候才发现老虎没用,再去取青椒尖椒和香菜。还有就是比如做菜和温酒并不冲突。在程序里做菜和温酒可能是有前后顺序的,但是CPU的预处理能力可以改变它们,使做菜的同时去温酒。
所以相当多的游戏和一些高性能的程序在开发完成后并不是使用通用的编译器去编译。而是使用针对性的编译器去处理,这样出来的程序会更快的执行。所以我们可以在很多游戏的LOGO见到 NV is mean the way。

[ 本帖最后由 fengyeblade 于 2009-2-12 23:49 编辑 ]
作者: fengyeblade    时间: 2009-2-12 23:51:11

所以说新的架构优势可能胜过频率的优势。。。。。也许当时出现的时候并不明显。但是当经过时间发展之后,新架构的优势会逐渐显现。
作者: -[黒白蓜]    时间: 2009-2-13 00:24:11

对了
朋友
我想起件事情

  那就是保镖MOD有个弱点

   也就是当你选择保镖可以开车、抢车和自动刷车这项功能以后
         再去应约且到那个NPC面前时
   它不会上主角的车 碰巧刚好周围没车的时候
  系统会自动刷出车体 然后它会坐上去

   但是这时无法控制游戏了 虽然说游戏没有崩溃 依然是照常规的方式来运行
      不过就是无法去移动鼠标 以及输入常规的操作指令——WASD或是F这一些列的操控
按Shift+F5 所约出来的NPC和保镖一样 会死掉
           我遇到过一次以后 就不敢再用开车了 怕了 呵呵
     所以不知道是不是因为偶然  希望是 要不又要麻烦你去修正了

    因为记得有一个任务我是和JACOB一起去仓库杀人  不过那时候用的是2.01老版MOD
         保镖刷太多 导致jacob傻呆呆的站在那 什么也不动 后来Shift+F4(因为是老版MOD的按键)只是保镖死 而NPC无事

  呵呵  打扰你咯
作者: -[黒白蓜]    时间: 2009-2-13 00:27:47

看完之后受益匪浅啊 谢谢了                 .
作者: -[黒白蓜]    时间: 2009-2-13 00:43:49

为了探究是否偶然 我又去试了一次
   的确是那么会事
  不过这次NIKO又和以前一样依旧无法操控
       但是NPC则没有刷出车来 也没上我的车
    只是呆站在原位 好像我还没出现一样的在那等待
         感觉它都快成望夫石了 悲哀啊
    然后Shift+F5 它却没事  呵呵

         现在我弄明白一点就是
  什么情况下系统才会认定它为NPC而非保镖
     应该是在不自动刷出车且不上车的时候
       若是满足这个条件 那么它依然是NPC 所以Shift+F5对它无效
    若是不满足 那么系统就会认定它为保镖
        
          呵呵  看来要麻烦兄弟你了
   我等待2.6的到来 呵呵

[ 本帖最后由 -[黒白蓜] 于 2009-2-13 00:45 编辑 ]
作者: fengyeblade    时间: 2009-2-13 01:14:32     标题: 回复 #5 -[黒白蓜] 的帖子

NPC死不死 是游戏剧情脚本的设计问题 有些剧情是把NPC当做组员了。。那样啥保镖就一起杀了。 有些时候是NPC只是朋友 那就不会杀死。。这个问题我也想过。。。不过还没有好的想法如何区别。

0.26我想可能意义不大了 目前想不出什么好想法了。即使出也是进行一些小调整。
可能这个周末开始作一个新结构的MOD。  争取全面托管化游戏对象。

但是 ARU的SCRIPTHOOK 一直没有新版本更新(其实目前的SCRIPTHOOK 只做出来SCRIPT的55%左右)还有N多东西没有整理出来。其实难度对ARU没有了,就是琐碎的整理工作,但是他一直没做。也没有公开如何导出和完善这些东西。从SCRIPT的结构就可以看出 其实还有将近一半的东西空置着。。

如果SCRIPT最近可以更新一个比较完整的版本。。。那么以后的MOD制作将是非常强大的。
我敢说 那时候我们作的MOD将和现在的MOD是两个时代的。 如同 WIN XP和WIN 3.2的区别
作者: -[黒白蓜]    时间: 2009-2-13 01:25:24     标题: 回复 #6 fengyeblade 的帖子

呵呵 这点多少还明白的
   不过麻烦你咯
  期待你更多的好作品
睡了 晚安
作者: 机佬    时间: 2009-2-13 03:19:35

这么多字也应该顶一下~~有时间再看
作者: fengyeblade    时间: 2009-2-13 11:10:49     标题: 回复 #8 机佬 的帖子

原来字多 也可以换回帖 哈好
作者: heifeng    时间: 2009-2-13 12:07:44

看完了,表扬一下楼主打的比方。

支持原创?是原创的吗
作者: leonskenidy    时间: 2009-2-13 12:22:18

呵呵,学过,但是都忘了
不过都知道是什么意思,比喻嘛很生动
要是当时上课的时候这么比喻的话估计就会记的很牢了
作者: sleepsheep36    时间: 2009-2-13 12:25:34

哈哈,俺虽然是学计算机的,但是看完了还是觉得写的不错啦~~~~~

支持LZ


作者: zl9521    时间: 2009-2-13 13:13:33

图文并茂 更好些 所以软件的优化才是正道 硬件一味追求功耗是不归路




欢迎光临 游侠NETSHOW论坛 (https://game.ali213.net/) Powered by Discuz! X2