数据相关:指在流水线中执行的几条指令中,一条指令依赖于前面指令的执行结果。
- WAW: Write-After-Write(写后再写) ordering for requests to the same address. 假设指令Write1是在指令Write0后面执行的指令,WAW表示指令Write0将数据写入寄存器后,指令Write1才能将数据写入这个寄存器。如果指令Write1在指令Write0之前写该寄存器,将使得该寄存器的值不是最新值。
- RAR: Read-After-Read(读后再读) ordering for requests to the same address. 假设指令Read1是在指令Read0后面执行的指令,RAR表示指令Read0读出数据后,指令Read1才能从这个寄存器读取数据。如果指令Read1在指令Read0之前读该寄存器,将使得读到的寄存器值不是最新值。
- WAR: Write-After-Read(先读后写) ordering for requests to the same address. 假设指令Write是在指令Read后面执行的指令,WAR表示指令Read读出数据后,指令Write才能写这个寄存器。如果指令Write在指令Read读出数据前就写该寄存器,将使得指令Read读出的数据不正确。
- RAW: Read-After-Write(先写后读) ordering for requests to the same address. 假设指令Read是在指令Write后面执行的指令,RAW表示指令Write将数据写入寄存器后,指令Read才能从这个寄存器读取数据。如果指令Read在指令Write写入寄存器前尝试读出该寄存器的内容,将得到不正确的数据。
WAW,WAR,RAW很好理解。关于RAR:如果两条Read0/Read1指令之间没有相同地址的Write指令,那么Read0和Read1读出的数据是一样的,不存在数据相关;如果两条Read0/Read1指令之间有相同地址的Write指令,那么相当于对同一个地址执行Read0 -> Write -> Read1操作,这是WAR和RAW的组合,由于CPU是想读Read1指令的数据,因此Read0和Write的数据相关可以不考虑,只需要考虑Write和Read1的数据相关即可。所以RAR本质上是RAW。
如何解决数据相关的问题呢?
TBD...