2011-12-11 134 views

回答

1

我不確定這是不是你想要的,但是IIRC已經有一些架構存在弱存儲訪問的問題,因爲它們可以被任意指定,並且你必須插入內存屏障來確保特定的順序。

現代處理器使用所謂的「加載存儲隊列」來隱藏存儲器重新排序,使其看起來好像按照程序順序發生。讀取通常會被重新排序(但要謹慎),寫入操作可能不按順序進行,但按順序執行(儘管對同一位置的多次寫入進行了整合),讀取和寫入操作只是小心翼翼地和推測性地重新排序。後者被稱爲「提升」,其中在寫入之前進行推測(在指令序列中較早出現),並且如果前面的寫入會影響它,則可以取消(如錯誤預測的分支)。另外,如果內存被標記爲未高速緩存,則CPU通常推斷意味着它是I/O空間並且不執行訪問重新排序。 x86和SPARC是這樣的。但是,PowerPC仍然會將讀取次數重新排列到I/O內存空間,我們必須使用EIEIO(確保執行I/O)指令來強制執行特定的排序。 IIRC,我們還必須在PA-RISC和Alpha上使用內存屏障。此外,x86上有內存障礙,但我不熟悉它們的使用(可能確保訪問緩存內存空間的順序)。

你提到了多核系統。一般來說,採用精心設計的高速緩存一致性協議來使所有內存訪問看起來符合某些交織規則,這樣,如果沒有高速緩存,訪問將按照可能的順序來訪問最後一級高速緩存和主內存。

1

許多現代處理器現在使用亂序執行來隱藏內存延遲來提高性能。這與多個處理器/內核無關,可以使用單核處理器獨立完成。出於這個原因,你不應該依賴記憶順序。