" 发射" 作为计算机术语的时候,对应的是英文的 "issue"
龙芯2是"4发射"的意思就是龙芯2内部可以在一个时钟周期内"发射"出四个"内部指令"到执行机构. 这里的"内部指令"是指一些很基本的事情,比如"让寄存器A加上寄存器B,把结果放在寄存器C里"或者"从内存XXXX:XXXX读取4个字节放入寄存器 D"之类的. (Intel管这种"内部指令"叫做"微指令(Micro-Instruction)",而Intel的奔腾和扣肉实际执行的是x86指 令,所以,奔腾和扣肉实际上是先把x86指令翻译成微指令然后才执行的,通常由于x86是复杂指令集,有可能一条x86指令会翻译出几条甚至是一串微指令 (据说最BT的一条x86指令能翻译出上千条微指令.....果然是复杂指令集啊....), 所以,虽然扣肉是4发射(如果我没记错的话), 但是并不代表扣肉一个时钟周期能执行4条x86指令) 龙芯2使用类似MIPS的精简指令的,所以基本省去翻译的过程, 基本可以认为一条龙芯2指令就等同于一条内部指令. (也未必全是这种情况,听说龙芯2加入了多媒体指令,不知是如何处理的)
那么"发射"了半天,到底发射给谁了?
"发射"给执行机构了 (Execution unit), 所谓的执行机构就是一些能做加减乘除的(学名:算术逻辑单元,Arithmetic Logic Unit (ALU)),外带读内存(Load),写内存(Store)的电路而已. 既然是4发射的cpu, 那么执行机构必须够用才行, 不知龙芯2是如何设计的, 不过 相信ALU至少有4套, Load 应该有两套, Store有一套 (猜的......请龙芯的大侠指教....) . 也就是说, 在任何时刻,如果不管龙芯是几发射, 龙芯2应该能同时(未必是在一个时钟周期内完成)进行: 4个算术运算, 从内存读2个数, 向内存写1个数 (如果我上面的猜测是正确的话). 那么你要问了:如果一次"发射"4个向内存写数的内部指令如何处理? 答:一个一个慢慢来吧....这种情况本来就是极其少见的....多路Store的电路很复杂的,没必要为百万分之一的可能性费太大的劲....
然后说这个"乱序执行"(英文: out of order execution)的东东:
我们知道:程序里面有很多判断指令 (比如,如果寄存器A+寄存器B的结果是1, 那么就干这个, 否则就干那个) , 我们还要注意一点就是龙芯2有"管线"(也叫流水线)(Pipeline)的CPU,所谓"管线"就是把一条指令切成n份,一个时钟周期做一份 (如果是9级的管线/流水线,那么n=9, 就是把一条指令切成9个步骤.....),也就是说一条指令的完成实际需要n个时钟周期.
于是问题来了, 如果是下列的指令顺序, CPU该怎么办?
1:如果A=0, 就转去执行4
2:把B+1的结果放入C
3:转去执行5
4:把B+200的结果放入C
5:把C存入内存
当CPU执行1的时候,还不能知道A到底是不是0, 因为那是n个时钟周期后才能知道的事情(也就是说n个时钟周期后CPU才能完成A=0这个判断)...那么这n个时钟周期就这么闲着吗?当然不是, CPU会假设一个结果,然后继续执行下去, 当然这是冒风险的,如果猜错了, 那么就白干了, 而且还要把流水线清空(猜错了, 干错了, 当然要从头来了....)猜的这个过程就叫分支预测....(听着很耳熟吧...), 分支预测的越准,那么就效率越高.
因为这个执行过程并不是完全按照正常的程序应该走的顺序(正常顺序是等结果出来再看应该走哪一步)所以叫乱序执行.
还有一种可能就是如:
1:把A+B的结果放入C
2:把C+D的结果放入E
3:把F+J的结果放入H
CPU执行到2的时候, 会发先C的值还不确定,因为1正在执行,还需要n-1个时钟周期才能出结果.... CPU当然不能发呆,于是就先去执行3了, 等1的结果出来才执行2, 所以这3条指令的实际执行顺序是 1 3 2, 而不是正常的 1 2 3 (乱序了吧^_^)
乱序执行还有另一种情况:
我们知道,内存比CPU要慢差不多2个数量级.....(就是说,如果CPU的速度是100的话,内存的速度差不多是1,CPU如果要真要从内存读一个数 的话,CPU要等上n百个时钟周期....这就是我们为什么要给CPU加缓存的原因,L1缓存的速度基本上只比CPU慢一点...CPU一般只要等十个时 钟周期左右,数据就能从L1缓存送来,L2缓存要比L1慢一些,但是比L1大一些),这就造成 Load和Store的动作异常缓慢, 运气不好的,真的要从内存读数据的时候就要等上n百的时钟周期......如果这时其他的执行机构也在等的话,那是多么的浪费啊....所以,解决办法: 让那个Load或Store去干他的, CPU接着向下执行那些不依赖那个Load和Store的指令, 比如:
1: Load 内存0031:00312 到 A
2: 把 A+B 放入 C
3: 把 D+E 放入 F
CPU执行到1的时候就会让Load单元去慢慢干,然后先去执行 3 了, 等Load完了才去执行2