如何以編程方式測量(不查詢操作系統)L1和L2高速緩存(數據高速緩存)的關聯大小和順序?測量L1和L2高速緩存的大小和順序
假設有關係統:
- 它L1和L2高速緩衝存儲器(可以是L3也可以是高速緩存共享),
- 它可以具有硬件預提取單元(就像P4 +),
- 它有一個穩定的clocksource(ticktime或gettimeofday的好HPET)。
對操作系統(可以是Linux,Windows或其他)沒有任何假設,我們也不能使用POSIX查詢。
語言是C,並且編譯器優化可能被禁用。
如何以編程方式測量(不查詢操作系統)L1和L2高速緩存(數據高速緩存)的關聯大小和順序?測量L1和L2高速緩存的大小和順序
假設有關係統:
對操作系統(可以是Linux,Windows或其他)沒有任何假設,我們也不能使用POSIX查詢。
語言是C,並且編譯器優化可能被禁用。
我認爲你所需要做的就是重複訪問內存不斷增加的塊(以確定緩存大小),我認爲你可以改變步幅來確定關聯性。
所以你會開始嘗試訪問非常短的內存段,並保持倍增的大小,直到訪問速度減慢。每次訪問速度變慢時,都會確定另一級緩存的大小。
但我怎樣才能打開硬件預取,這會掩蓋一些尺寸? – osgx 2010-04-05 11:33:22
這是ATLAS的代碼。這是L1緩存大小
ATLAS /調整/ SYSINFO/L1CacheSize.c
(https://github.com/vtjnash/atlas-3.10.0/blob/master/tune/sysinfo/L1CacheSize.c)
int GetL1Size(int MaxSize, double tol)
{
int L1Size, tmp, correct=1;
fprintf(stderr, "\n Calculating L1 cache size:\n");
但它僅僅是L1高速緩存和它只有大小,沒有辦法的辦法計數。
您可能會發現STREAM benchmark有用或有趣或兩者兼而有之。
馬克,請看看http://stackoverflow.com/questions/2517694/can-the-stream-and-gups-single-cpu-benchmark-use-non-local-memory-in-numa-machi – osgx 2010-04-05 17:02:42
非常有趣的問題。 +1 – 2010-04-05 03:26:00
有一個庫可以在構建時測量緩存大小。它叫ATLAS http://math-atlas.sourceforge.net/我想你也可以在那裏找到一些信息。 – 2010-04-05 03:26:52
處理器識別與查找? (或者是作弊?) – 2010-04-05 03:51:18