• 易儿易
    2019-06-15
    一路纵队,前边有人停下系鞋带,后边所有人都得原地踏步踏,不然就得踩着脑袋过去了……
     1
     15
  • -W.LI-
    2019-06-23
    先写后读:数据依赖,读依赖于之前的写正常的依赖关系所以叫数据依赖。
    先读后写:反依赖,要保证读到写之前的数据,与正常的相反叫反依赖。
    写完再写:输出依赖。两次写操作顺序反了的话输出就错了。所以叫输出依赖。
    记不住不晓得这么理解可以么
    
     4
  • 瀚海星尘
    2019-07-26
    因为如果前一个指令插入nop后一个指令不插,那么当前指令被延迟执行的阶段就会和下一个指令的统一阶段在同一个周期内一起执行,而这是电路结构不允许的,统一阶段同一周期只能有单一输入。
    
     1
  • Geek_54edc1
    2019-06-29
    在当前指令插入nop可能会对后续指令造成新的依赖,干脆后面的指令也加上nop操作,要等就一起等
    
     1
  • coder
    2019-06-14
    用了这么久的HHKB都不知道普通键盘还有锁键的问题🌚🌚🌚
    
     1
  • 南山
    2019-06-14
    如果内存地址 b 的指令在内存地址 4 的指令之后写入。
        老师这个是b在4之前才是先写在写有问题吧?对后续程序来说 a=2应该才是正确的吧
     1
     1
  • 程序水果宝
    2020-02-10
    为啥把内存拆成程序内存和数据内存这两部分以后就不能根据实际情况动态分配内存了?
    
    
  • feihui
    2020-01-08
    请问文中“我们在进行指令译码的时候,会拿到对应指令所需要访问的寄存器和内存地址。所以,在这个时候,我们能够判断出来,这个指令是否会触发数据冒险”,这个冒险是怎么判断出来的?

    作者回复: feihui同学,

    你好,实际的CPU硬件里面有专门的冒险检测电路。从逻辑层面,因为每条指令需要访问的地址都是知道的,前后指令的依赖关系能决定是否会触发数据冒险。

    
    
  • Hommin
    2019-11-25
    CPU虽然可以同时执行多条流水线,但需要保证在一个时钟周期中同一个阶段只能有一条流水线在执行(如,可以是执行流水线A的取值阶段和流水线B的译码阶段,但不能是A的取值阶段和B的取值阶段)。那么当前指令插入一个NOP操作后,该操作的后续阶段往后移,而后续指令的对应阶段也必须往后移动,防止出现在一个时刻执行两个相同的阶段。
    我的问题是,这种对应添加NOP操作,一定会后续某个时刻消除掉吧。是不是当某一条指令没有该阶段的时候消除掉的?
    
    
  • prader
    2019-09-22
    计算机里面,(为了快去处理数据,采用了一些设计方式),冒险分为,数据冒险和结构冒险和控制冒险。
      结构冒险的解决办法,是把高速缓存分为指令缓存和数据缓存。
      数据冒险(因为程序存在,数据依赖,读依赖,输出依赖),解决办法是,流水线冒泡。
    
    
  • 记忆犹存
    2019-09-10
    计算机硬件和软件最常用的思想:增加一个中间层。

    作者回复: 没错,不过这个思路其实也是软件架构慢慢容易“腐化”的原因。随着中间层变多,系统的复杂度和熵在增加,如果没有精心维护,容易最后变成一个难以维护的代码库。

    
    
  • 活的潇洒
    2019-09-01
    “现在终于知道公司的程序员同事人手一部不同规格的机械键盘了的原因了”

    day22 笔记:https://www.cnblogs.com/luoahong/p/11436264.html
    
    
  • J.D.
    2019-07-26
    这种插入“空操作”的思想,我觉得挺有意思,就像一些加密算法,限定了输入数据的长度,那么就可以使用填充 0 来补充长度。
    
    
  • -W.LI-
    2019-06-23
    老师好:高速缓存分两个了。取指令的寄存器等硬件都是两份了是么?
    
    
  • 焰火
    2019-06-16
    浩哥问您两个问题哈 ~~
    ①结构冒险的解决方案,采用高速缓存法的意思是:因为高缓的访问速度快,事先将内存中的指令读入高缓中,然后CPU可以在一个时钟周期内完成两个(或更多)的高缓中的指令,就相当于cpu在一个时钟周期内对原内存数据完成了多次的操作么?

    ②如果写的程序中有个循环一连串的读写读写数据操作,有可能造成流水线停顿过多,从而退化成一级流水线,如果真有这样的代码,我们该如何修改呢?
    
    
  • cc
    2019-06-16
    流水线模式下,一条指令被拆分成n个阶段。这样的好处是增加吞吐量,所谓吞吐量,简单理解就是我们程序中的并发,可以有多条指令同时在CPU里执行不同的阶段,不同阶段,不同阶段。
    但需要重点强调的是,不是并行:对于指令执行的某一具体的阶段,还是串行的。为什么?我的理解是针对单一阶段,比如解码,电路是唯一的,不同的指令输入不尽相同,为了不出错,串行是最保险的。
    回到老师的问题,如果后边的指令,不加NOP,那也就意味着有相同的指令准备执行相同阶段,因为串行,还是需要等待的。不如加NOP更简单明了。
    
    
  • Only now
    2019-06-15
    应该是为了维持指令执行的步调
    
    
  • humor
    2019-06-14
    因为在判断当前指令是否有数据冒险的判断依据里 并没有之前指令是否有NOP操作,只有后续指令插入了对应的NOP操作后判断才可能是正确的。
    
    
  • haer
    2019-06-14
    所有后续指令也要插入对应的 NOP 操作,这是为什么呢?

    我想是这样:就像两个人以相同的速度一前一后向前走,前面的人停下,后面的人也停下,两个人的距离保持不变,且前面的人一直在前面,后面的人一直在后面。这样的话指令一定是顺序执行的。
    
    
  • 云开
    2019-06-14
    老师:结构冒险的解决方案是把高速缓存拆分成指令缓存和数据缓存。是不是意味着同一个时钟周期两条指令同时都取内存的数据而不是一个取数据一个取指令就不会发生冲突?
    
    
我们在线,来聊聊吧