2013-10-20 70 views

回答

2

如果您使用的機器具有連貫的緩存(大多數主流機器),則通常不需要緩存行刷新,並且flush指令不太可能對緩存做任何明確的操作。在一個連貫的系統中,任何寫入一個內核緩存的內容都可以立即被所有其他內核看到。

但是,FLUSH指令可能充當內存屏障或fence,並且它還會強制編譯器爲其可能已存儲在寄存器中的值生成存儲指令。

有指令here,包括本說明的一個很好的說明:

Q17:是對$ OMP沖水指令所必需的高速緩存一致性的系統上!?

A17:是的flush指令是必要的。查看OpenMP規範中的使用示例。該指示對於指示編譯器必須將該變量寫入存儲器系統/從存儲器系統讀取是必需的,即,該變量不能通過代碼中的刷新「語句」保存在本地CPU寄存器中。

緩存一致性確保瞭如果一個CPU執行從/到內存的讀取或寫入指令,則系統中的所有其他CPU在訪問時都會從該內存地址獲取相同的值。所有緩存都將顯示一個連貫的值。但是,在OpenMP標準中,必須有一種方法來指示編譯器實際插入讀/寫機器指令,而不是延遲它。爲循環生成高效的機器語言代碼時,將循環變量保存在寄存器中是非常常見的。

如果您使用的機器具有非一致性緩存,那麼您可能正在使用超級計算機,並應諮詢熟悉您的體系結構和工具集的本地專家。

+0

謝謝,這解釋了它。 – user2887306