簡體   English   中英

使用C ++查找L1和L2緩存的大小

[英]Find the size of L1 and L2 cache with C++

我需要使用Windows操作系統中的c ++簡單程序查找L1和L2緩存的大小以進行分配。 通過計算以遞增的方式訪問數組中的元素所花費的時間,我能夠在兩台不同的計算機中找到L3緩存的大小。 當時間跳躍很大時,我們從緩存級別轉到內存級別。

如何從這里算出L1和L2尺寸?

限制是我無法讀取config或使用內置函數來確定值。 我必須改為計時讀/寫操作。

我需要使用ac / c ++簡單程序查找L1和L2緩存的大小以進行分配。

通常, 您不能 (理論上)。

由於符合標准的C11實現(讀取為n1570 )甚至不需要在具有緩存的真實計算機上運行。 同樣適用於C ++ 11或C ++ 14(閱讀n3337 )。

它可以運行:

  • 與人在一起(使用一堆奴隸來運行C程序是不道德的,效率低下的,緩慢的,但是可能的;在教室里使用半小時的學生是教C或C ++的一種有趣的方式-整個課堂都變成了C或C ++實現)。

  • 在沒有任何緩存的計算機上。 今天,微控制器(如Arduino )可以用C或C ++編程(並且通常是),並且沒有任何緩存。

  • 在您最喜歡的x86-64筆記本電腦上。 您將更好地了解有關Intel和AMD處理器處理緩存的方式的更多信息。

  • 在其他設備上(例如某些Power9主板 ,某些Intel Edison ,一些Raspberry Pi您的瀏覽器中的模擬器等等)。 你可能會有驚喜!

如何從這里算出L1和L2尺寸?

您可以查看生成的匯編代碼(使用g++ -O1 -fverbose-asm -S進行GCC編譯,然后查看生成的.s文件),想象一下您擁有哪種處理器和ISA,並做出一些有根據的猜測(從計時)。 避免要求過於強大的優化 (因為您的程序可能具有未定義的行為 )。

在許多操作系統上,您可能使用特定於操作系統的API來查詢有關處理器的信息。 在Linux上,您可以使用proc(5)並使用/proc/cpuinfo

如果您確實運行了程序,對其進行了多次基准測試並給出了時間安排,則可以對緩存大小進行有根據的猜測(但是您需要假設您的進程沒有被安排得太頻繁;在負載非常大的系統上,並非如此;您應該避免顛簸 )。

順便說一句,我猜想在常規規則下, 您的程序可能已優化為您沒有想到的東西(請參閱參考資料 )。 注意,在new分配的數組中使用單元而不進行初始化是(原則上) 未定義的行為 (或至少是未指定的行為 )。 因此,我相信足夠明智的編譯器可以優化您的程序,使其等效於某些abort() (或僅保留printf )。

暫無
暫無

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

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