2021-05-12 14:32:11
Ubuntu環境下測試Cache大小併校驗
Cache記憶體:電腦中為高速緩衝記憶體,是位於CPU和主記憶體儲器DRAM(Dynamic Random Access Memory)之間,規模較小,但速度很高的記憶體,通常由SRAM(Static Random Access Memory 靜態記憶體)組成。它是位於CPU與記憶體間的一種容量較小但速度很高的記憶體。CPU的速度遠高於記憶體,當CPU直接從記憶體中存取資料時要等待一定時間週期,而Cache則可以儲存CPU剛用過或迴圈使用的一部分資料,如果CPU需要再次使用該部分資料時可從Cache中直接呼叫,這樣就避免了重複存取資料,減少了CPU的等待時間,因而提高了系統的效率。Cache又分為L1Cache(一級快取)和L2Cache(二級快取),L1Cache主要是整合在CPU內部,而L2Cache整合在主機板上或是CPU上。
C++測試cache大小
程式碼
/*
* 程式碼思路:建立一個連續記憶體塊,進行連貫、大量、隨機的有意義存取,要保證整塊記憶體盡可能全部放入cache。當
* 記憶體被整塊放入cache中時,存取速度會明顯加快,直到有一個時間跳躍點,消耗時間增多,則這個跳躍點的儲存容* 量大小即為cache大小
*/
#include <iostream>
#include <random>
#include <ctime>
#include <algorithm>
#define KB(x) ((size_t)(x) << 10)
using namespace std;
int main()
{
// 需要測試的陣列的大小
vector<size_t> sizes_KB;
for (int i = 1; i < 18; i++)
{
sizes_KB.push_back(1 << i);
}
random_device rd;
// 偽亂數演算法,計算更快,佔用記憶體更少
mt19937 gen(rd());
for (size_t size : sizes_KB)
{
// 離散均勻分布類
uniform_int_distribution<> dis(0, KB(size) - 1);
// 建立連續記憶體塊
vector<char> memory(KB(size));
// 在記憶體中填入內容
fill(memory.begin(), memory.end(), 1);
int dummy = 0;
// 在記憶體上進行大量的隨機存取並計時
clock_t begin = clock();
// 1<<25:將1左移25位,進行大量隨機存取
for (int i = 0; i < (1 << 25); i++)
{
dummy += memory[dis(gen)];
}
clock_t end = clock();
// 輸出
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << size << " KB, " << elapsed_secs << "secs, dummy:" << dummy << endl;
}
}
執行結果
解析
由執行結果可以看出,記憶體存取時間在 8192KB 的時候發生了跳躍,由此推測cache的大小在 8192KB 左右,即8M左右,下面會進行驗證。
Ubuntu檢視cahce大小
在命令列中輸入如下程式碼:
getconf -a | grep CACHE
在本機環境中得到如下測試結果:
6291456/1024/1024 = 6M,所以本機chche大小為6M,與程式碼測試結果大體相符
相關文章