2013-06-12 68 views
1

在現代多核處理器中,我們通常擁有本地L1緩存但共享L2緩存。是否有可能繞過一部分內存的L1緩存,同時仍然使用L2緩存?我想要這樣做來提高時間可預測性,但這可能會降低性能。是否有可能在多核處理器中繞過L1緩存

+0

你使用實時操作系統嗎? –

+0

爲什麼我會得到低估? – MetallicPriest

+0

在讀取或寫入或兩者上繞過L1? – osgx

回答

0

據我所知,沒有辦法繞過主流CPU的L1緩存。但是,爲了實現您的目標(即避免可能導致時序測量變化的緩存未命中),您可以嘗試請求您的編譯器將數據預取到緩存中。

如果使用GCC或LLVM,請參閱__builtin_prefetch

但是,您的問題非常模糊,我不確定您的建議是否適合您的需求。

0

緩存

我強烈懷疑,你誤會緩存做什麼以及它是什麼。

從存儲器內容的角度來看,緩存是透明的。如果一個內核寫入內存位置,那麼其他緩存(L1,L2,L3等)共享或不共享的其他內核恰好被緩存,該位置也將被更新。

請注意,而不是表示核心無法競爭該值。你仍然可以有一個競爭條件,即一個核心在另一個核心地區讀取一個位置之前讀取一個位置「得到錯誤的值」。此外,無論您的CPU是否具有任何類型的緩存,都會發生。爲了解決這個'排序'問題,你必須在源代碼中使用信號燈或其他IPC原語。

一些緩存系統允許你給他們「提示」。 Matthieu Rouget以__builtin_prefetch爲例。這些東西允許程序員告訴緩存系統,提前獲取一些數據是值得的。某些系統(例如PowerPC 7450)允許程序員使用部分高速緩存作爲內存而不是高速緩存,這是程序員高速緩存控制中最終的一種。

但是,這些東西都不會對所有高速緩存所具有的內存視圖產生任何影響。如果一個緩存的內容得到更新,其餘的內容也會更新。

緩存和高性能的編程

最好的程序員都能夠通過周圍的高速緩存的行爲編碼從CPU中提取峯值性能。在那個領域,人們通常會發現自己希望緩存根本就不存在。這個最終的體現是PS3中的Cell處理器。數學上的核心根本沒有緩存。相反,您必須實際上完成所有自己的數據獲取操作,並將自己寫回源代碼中,而不是將其保留在某個緩存中,以便再次猜測程序將要請求的數據。說得對,表現仍然很好。

總線偵聽

某些CPU沒有緩存總線偵聽,編寫設備驅動程序時,它可以是一個特殊的問題。總線監聽是一種機制,通過這種機制,CPU高速緩存將被CPU核心以外的內容(例如,由DMA控制器讀取來自設備的數據)更新的內存內容發現。反過來也是如此 - 從內存中的DMA獲取當前停留在緩存中的值。 AFAIK現在幾乎所有的CPU都在進行總線監聽,所以這可能不成問題。

在具有IO以及內存地址空間的系統上(例如Intel),我認爲I/O地址空間不會被緩存。對於具有內存映射設備的系統,其內存通常也不會被緩存,操作系統會以這種方式設置CPU(請參閱this)。

時序可預測性

要回到你的問題的原因 - 定時可預測性。您可能會使用錯誤的技術。如果您的系統具有時序約束,因此問題在於主存儲器寫入時間的變化,那麼坦率地使用多核CPU聽起來像是錯誤的東西。 @Griwes在這一點上是完全正確的(甚至整個評論)。您更可能需要採用純粹的硬件設計,這與FPGA的一些方面有關(請不要評論固件是否真的是軟件!)。

如果我懷疑你實際上是在試圖避免使用信號量和其他IPC原語來同步系統中的兩個線程,那麼你不會成功,共享緩存或不。你需要使用信號量等來使你的代碼正常工作。

相關問題