Posts

Showing posts from July, 2023

流水线处理器基础知识

 基础概念  1. 流水线的结构本质上是增加更多的寄存器来提高指令的吞吐率,并以此来提高处理器的性能。  2. 流水线带来的加速比约等于流水线级数,5级流水线带来的加速比接近5(指令足够多时)。  3. 经典流水线的五个阶段:IF(取指),ID(译码),EX(执行),MEM(访存(如有必要)),WB(写回(如有必要))。  4. 流水线时在顺序指令流中的指令间并行技术。   流水线冒险  1. 结构冒险:两个指令同时对一个资源进行使用时,容易出现结构冒险。     2. 数据冒险: 两个前后指令同时依赖一个数据,比如:                       add x19,x0,x1                      sub x2,x19,x3      此时,指令1的输出被指令2依赖,然后指令2进行译码阶段时,指令1还没有进行到WB阶段,寄存器的值还并没有刷新,指令2的计算结果就会出现问题。 3. 数据冒险解决办法: 增加旁路(bypassing)或前递(forwarding)。 这是指,在2的例子中,x19的新值是可以在EX阶段后将值直接传递给指令2的EX阶段之前(ID阶段之后),由于指令2比指令1慢一个阶段,bypassing可以刚刚好解决这个问题。 4. 流水线停顿(pipeline stall  俗称: bubble): 虽然bypassing是很好的解决方案,但是这并不能避免所有的冒险。比如 ld指令取指一个值,然后一个紧跟的算术指令依赖这个被ld取的值,那么前递就无法解决问题。因为ld指令需要访存(MEM)阶段才能成功取值,此时后面的算术指令已经过了EX阶段,我们无法使用bypassing传递此时的值给第二条指令的ID阶段后,因为这是时光回溯(不可能的)。所以我们必须停顿流水线一个节拍后,那么对应的,第二条指令就会慢一拍,那么指令就刚执行到ID阶段后,此时,再使用bypassing,就可以解决问题。 5. 控制冒险:控制冒险是当遇到分支指令会发生的情况,所以也被叫做分支冒险。因为指令在完成IF阶段后,就会对PC进行运算,此时PC中的下一条指令已经进入流水线,但是很可能因为分支指令,这条指令其实是不该被运算的,那么就会出现冒险的情况。处理分支冒险比较复杂,简单的思路是,我们需要在ID阶段计算分支目标地址以及更新PC,所以这需要额外的资源,并

ECC

 汉明码是通过奇偶校验的方式对编码是否有错进行判断并纠正。  对于任一数据,首先需要将其改造为汉明码,即,预留,第01,10,100,1000(二进制)位等的数据。    然后比如,第110位,因为其位可以同时含有010和100,那么对应的第01和100位就需要记录对应位的值,并对所有记录的值进行奇偶性计算。比如,如果所有含有最后一位为1的位的数里,含有1的数量为奇数,那么第01位需要补一个1,使所有含有最后一位为1的位的数里的1的个数保持为偶数。以此类推,计算所有特殊位的值。计算有多少个1的数量是偶数还是奇数的过程可以通过xor来实现。    经过传递编码之后,现在需要对数字进行校验。    首先校验所有含有最后一位为1的位的数里1的数量的奇偶性。由于我们人工已经确保了这个值一定是偶数,如果出现奇数,则代表一定出现了错误。 以此类推,不断计算所有特殊位,如第10,100,1000,即倒数第二位为1,倒数第三位为1...等等。    假如,最后计算的结果是,倒数第一位为1的位的所有1的数量为奇数,且倒数第三位为1的的所有1的数量为奇数,其他都是偶数,那么发生错误的坐标可以直接计算出来:     第101位,即,汉明码的第5位。     这是因为实际上,我们利用二进制的加法,对原始数据进行了特殊处理,从而保证了所有奇偶校验位可以表达所有的位。 比如第8,4,2,1位的奇偶校验位可以表示直到汉明码的第15位。比如,第1111位,它实际含有四个1,所以他被这四个奇偶校验位全部追踪,有且只有它发生错误时,才会导致所有四位出现问题。实际上可以理解为,比如第1010位发生错误,由于它含有倒数第二位和倒数第四位的1,所以它被第8和第4位所检验的奇偶性包含。那么反过来,当8 4 两个奇偶性出问题时,这代表着所出现问题的数字一定是包含了1000和0010,即1010。 由于汉明码采取了正好是对应二进制数字每位的编码方式,如果其他位不出现奇偶性不出现问题,那么也证明所出现问题的位数一定不包含那些位。     这样的方法使得汉明码拥有一位纠错能力。     而实际上,我们还会使用最后多加的一位奇偶校验位来多验证一位。最后一位作为奇偶校验位时,如果只发生一位数字出错,那么由于奇偶性,可以检测,但是如果两位同时翻转,就无能为力了。     所以,将最后的奇偶校验位和汉明码结合一起就是,设最后