管線化與危障
讀後寫相依(read-after-write dependence)
若一張便條寫著「填好總額,再把總額抄到收據上」,那麼抄寫真的不可能在總額存在之前發生。這個次序是真實的,烙進了任務的意義裡。讀後寫相依(RAW)就是兩條指令間這種無可避免的次序:第二條讀一個第一條會寫的暫存器,所以第二條必須排在第一條之後,否則就會讀到垃圾。
RAW 被稱為真相依,因為它反映了資料在程式中真正的流動——那個值真的得從生產者送到消費者。這使它有別於日後在亂序機器中出現的兩種假相依:寫後讀與寫後寫,那兩種只是重複使用同一暫存器名稱的產物,可以靠更名抹除。RAW 無法靠更名消除,因為消費者真的需要生產者算出的值;資料非在那裡不可。
在管線中,當消費者抵達它需要值的那一點、而生產者尚未把值備妥時,RAW 相依就成為資料危障。前饋處理多數 RAW 危障,靠在值一算出的瞬間就遞交,而非等到寫回。但 RAW 也是指令層級平行的根本限制:一長串指令,每條都讀前一條的結果,根本無法重疊——每一步都在等前一步。真相依是整個效能故事所立基的磐石,是任何巧妙花招都許願不掉的東西。
mul x1, x2, x3 接著 add x4, x1, x5 接著 sub x6, x4, x7。每條都讀前一條的結果:一條 RAW 鏈。無論有多少功能單元,它們的運算都無法重疊——每條都得等前一條。那條串列鏈是速度的硬下限。
一條 RAW(真)相依鏈強制嚴格的次序;不像假相依,沒有任何更名能打破它。
唯有讀後寫是真相依。寫後讀與寫後寫是「假的」——它們只因兩條指令恰好重用了一個暫存器名稱而存在,暫存器更名可移除它們。別把這三者搞混。
又稱
另見