Característica de cache L1 ausente

2

Escrevi um programa simples (com a ajuda do artigo de Igor Ostrovsky 'Galeria de efeitos de cache do processador'), que deveria examinar os níveis de cache no meu processador. De acordo com o Coreinfo fornecido pela Microsoft, meu processador possui os seguintes níveis de cache:

+------------------------+---------------+----------+-------------+
| *- Data Cache 0        | Level 1 32 KB | Assoc 8  | LineSize 64 |
| *- Instruction Cache 0 | Level 1 32 KB | Assoc 8  | LineSize 64 |
| -* Data Cache 1        | Level 1 32 KB | Assoc 8  | LineSize 64 |
| -* Instruction Cache 1 | Level 1 32 KB | Assoc 8  | LineSize 64 |
| ** Unified Cache 0     | Level 2 3 MB  | Assoc 12 | LineSize 64 |
+------------------------+---------------+----------+-------------+

mas se eu correr:

#include <vector>
#include <iostream>
#include <omp.h>

int main(int argc, char* argv[])
{
    int sz = 256;
    for (size_t s = 0; s < 18; s++)
    {
        std::vector<int> arr(sz, sz);
        int steps = 64 * 1024 * 1024;
        double start = omp_get_wtime();
        for (int i = 0; i < steps; i++)
        {
            arr[(i * 16) % arr.size()]++;
        }
        double end = omp_get_wtime();
        std::cout << "size: " << (4 * sz) / 1024 << "KB\t\t";
        std::cout << "avg time: " << (end - start)*1000000000 / steps << "ns" << std::endl;
        sz *= 2;
    }
}

Recebo a seguinte saída:

size: 1KB               avg time: 4.36752ns
size: 2KB               avg time: 4.27807ns
size: 4KB               avg time: 4.19745ns
size: 8KB               avg time: 3.93159ns
size: 16KB              avg time: 3.95425ns
size: 32KB              avg time: 3.88134ns
size: 64KB              avg time: 3.8112ns
size: 128KB             avg time: 3.60893ns
size: 256KB             avg time: 3.61895ns
size: 512KB             avg time: 3.62264ns
size: 1024KB            avg time: 3.63614ns
size: 2048KB            avg time: 4.34382ns
size: 4096KB            avg time: 24.5113ns
size: 8192KB            avg time: 28.271ns
size: 16384KB           avg time: 28.1093ns
size: 32768KB           avg time: 28.3462ns
size: 65536KB           avg time: 28.2305ns
size: 131072KB          avg time: 28.4871ns

Um aumento repentino no tempo de acesso entre 2048 KB e 4096 KB é aparente devido ao cache L2 de 3 MB. Mas por que não vejo aumento semelhante entre 32 KB e 64 KB por causa do cache L1 de 32 KB? Minha especificação de processador: link

user2551229
fonte
Como você parece estar usando apenas uma passada constante de 64B, o pré-buscador de hardware deve ser treinado rapidamente e pré-buscar com precisão os blocos de cache.
Paul A. Clayton