首頁 > 軟體

Ubuntu環境下測試Cache大小併校驗

2020-06-16 16:34:27

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,與程式碼測試結果大體相符


IT145.com E-mail:sddin#qq.com