簡體   English   中英

如何最輕松地預取存儲區域?

[英]How can I prefetch a memory region most easily?

背景:我實現了一種隨機算法,該算法需要隨機排序以實現最佳收斂。 但是,這樣做顯然會破壞內存局部性。 我發現通過預取下一個迭代的數據,可以將性能下降降至最低。

我可以使用_mm_prefetch以一種簡單的方式(主要是OS +編譯器可移植的方式)預取n條緩存行-但是緩存行的長度是多少? 現在,我正在使用64的硬編碼值,這在當今的x64處理器上似乎很正常-但是我不知道如何在運行時檢測到這一點,去年的一個問題沒有找到簡單的解決方案

我已經在Windows上看到了GetLogicalProcessorInformation ,但是我對使用如此復雜的API 來做這么簡單的事情並不滿意,無論如何在Mac或Linux上都無法使用。

也許還有其他一些API / intrinsic可以預取以字節(或字或其他形式)標識的內存區域,並允許我在不知道緩存行長的情況下進行預取?

基本上,是有一個合理的替代_mm_prefetch#define CACHE_LINE_LEN 64

這里有一個問題問的差不多 如果您想研究某些程序集,則可以從CPUID中讀取它。 當然,您必須為此編寫平台特定的代碼。

您可能已經熟悉Agner Fog的優化手冊,手冊提供了許多流行處理器的緩存信息。 如果您能夠確定預期的CPU數量,則可以對緩存行大小進行硬編碼,然后查找CPU供應商信息以設置行大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM