Размер строки кэша — уровень 2 — C ++

Я пишу программу для определения размера строки кэша второго уровня, я использовал статью http://igoro.com/archive/gallery-of-processor-cache-effects/. Но у меня совершенно разные результаты. Благодаря программе Coreinfo я узнал, что размер строк первого и второго уровня составляет 64 байта. Пока я решил получить хотя бы размер линии первого уровня, но некоторые совершенно неадекватные результаты получены

#include "stdafx.h"#include <time.h>
#include <iostream>
#include <string>using namespace std;int main()
{
int t;
const int N = 8000;
volatile int arr[N];
unsigned int A;
char ask1 = 'y';

srand(time(NULL));

while (ask1 == 'y')
{
for (int j = 0; j < N; j++)
arr[j] = rand();

for (int i = 1; i <= 64; i++)
{
A = clock();
for (int k = 0; k < 100000; k++)
for (int j = 0; j < N; j += i)
{
t = arr[j];
}
//cout << i << "\tstep, time\t" << clock() - A << '\t' << t << endl;
arr[i] = (clock() - A); //Instead of printing, so as not to destroy the cache, I decided to write the execution time in the same array, and then output it
}
for (int i = 1; i <= 64; i++)
cout << i << "\tstep, time\t" << arr[i] << endl;
cout << "Repeat?(y/n): ";
cin >> ask1;
cout << endl;
}
/**/const int n = 1600000000;

int l;

unsigned int a;
char ask = 'y';
srand(time(NULL)); //it's just for random filling, so it's always been different, although here it's not really necessary for me
while (ask == 'y')
{
volatile int byte8[2];

for (int j = 0; j < 2; j++)
byte8[j] = rand();

a = clock();//write the time before reading array cycles
for (int k = 0; k < n / 2; k++) /*divide n by the number of
repetitions of the inner cycle, so that everywhere in
the same number of repetitions */
for (int i = 0; i < 2; i++)
l = byte8[i];
cout << size(byte8) * 4 << "\tbytes\t" << clock() - a << endl;
//output the number of ms needed for reading
// we repeat the same for arrays of longer lengthvolatile int byte16[4];
for (int j = 0; j < 4; j++)
byte16[j] = rand();

a = clock();
for (int k = 0; k < n / 4; k++)
for (int i = 0; i < 4; i++)
l = byte16[i];
cout << size(byte16) * 4 << "\tbytes\t" << clock() - a << endl;

volatile int byte32[8];
for (int j = 0; j < 8; j++)
byte32[j] = rand();

a = clock();
for (int k = 0; k < n / 8; k++)
for (int i = 0; i < 8; i++)
l = byte32[i];
cout << size(byte32) * 4 << "\tbytes\t" << clock() - a << endl;
/*
int byte60[15];
for (int j = 0; j < 15; j++)
byte60[j] = rand();

a = clock();
for (int k = 0; k < n / 15; k++)
for (int i = 0; i < 15; i++)
l = byte60[i];
cout << size(byte60) * 4 << "\tbytes\t" << clock() - a << endl;
*/
volatile int byte64[16];
for (int j = 0; j < 16; j++)
byte64[j] = rand();

a = clock();
for (int k = 0; k < n / 16; k++)
for (int i = 0; i < 16; i++)
l = byte64[i];
cout << size(byte64) * 4 << "\tbytes\t" << clock() - a << endl;
/*
int byte68[17];
for (int j = 0; j < 17; j++)
byte68[j] = rand();

a = clock();
for (int k = 0; k < n / 17; k++)
for (int i = 0; i < 17; i++)
l = byte68[i];
cout << size(byte68) * 4 << "\tbytes\t" << clock() - a << endl;
*/
volatile int byte96[24];
for (int j = 0; j < 24; j++)
byte96[j] = rand();

a = clock();
for (int k = 0; k < n / 24; k++)
for (int i = 0; i < 24; i++)
l = byte96[i];
cout << size(byte96) * 4 << "\tbytes\t" << clock() - a << endl;

volatile int byte128[32];
for (int j = 0; j < 32; j++)
byte128[j] = rand();

a = clock();
for (int k = 0; k < n / 32; k++)
for (int i = 0; i < 32; i++)
l = byte128[i];
cout << size(byte128) * 4 << "\tbytes\t" << clock() - a << endl;

volatile int byte192[48];
for (int j = 0; j < 48; j++)
byte192[j] = rand();

a = clock();
for (int k = 0; k < n / 48; k++)
for (int i = 0; i < 48; i++)
l = byte192[i];
cout << size(byte192) * 4 << "\tbytes\t" << clock() - a << endl;

volatile int byte256[64];
for (int j = 0; j < 64; j++)
byte256[j] = rand();

a = clock();
for (int k = 0; k < n / 64; k++)
for (int i = 0; i < 64; i++)
l = byte256[i];
cout << size(byte256) * 4 << "\tbytes\t" << clock() - a << endl;

volatile int byte512[128];
for (int j = 0; j < 128; j++)
byte512[j] = rand();

a = clock();
for (int k = 0; k < n / 128; k++)
for (int i = 0; i < 128; i++)
l = byte512[i];
cout << size(byte512) * 4 << "\tbytes\t" << clock() - a << endl;cout << "Repeat?(y/n): ";
cin >> ask;
cout << endl;
}
system("pause");
return 0;
}
  • 1 шаг, время 369
  • 2 шага, время 184
  • 3 шага, время 123
  • 4 шага, время 101
  • 5 шаг, время 77
  • 6 шаг, время 60
  • 7 шаг, время 52
  • 8 шаг, время 45
  • 9 шаг, время 44
  • 10 шаг, время 38
  • 11 шаг, время 33
  • 12 шаг, время 32
  • 13 шаг, время 29
  • 14 шаг, время 26
  • 15 шаг, время 31
  • 16 шаг, время 26
  • 17 шаг, время 22
  • 18 шаг, время 21
  • 19 шаг, время 20
  • 20 шаг, время 18
  • 21 шаг, время 18
  • 22 шага, время 18
  • 23 шаг, время 16
  • 24 шага, время 16
  • 25 шаг, время 15
  • 26 шаг, время 16
  • 27 шаг, время 15
  • 28 шаг, время 21
  • 29 шаг, время 14
  • 30 шаг, время 13
  • 31 шаг, время 12
  • 32 шага, время 12
  • 33 шага, время 12
  • 34 шаг, время 13
  • 35 шаг, время 11
  • 36 шаг, время 12
  • 37 шаг, время 11
  • 38 шаг, время 10
  • 39 шаг, время 11
  • 40 шаг, время 18
  • 41 шаг, время 10
  • 42 шага, время 10
  • 43 шаг, время 10
  • 44 шаг, время 26
  • 45 шаг, время 9
  • 46 шаг, время 9
  • 47 шаг, время 9
  • 48 шаг, время 8
  • 49 шаг, время 9
  • 50 шаг, время 8
  • 51 шаг, время 9
  • 52 шага, время 8
  • 53 шаг, время 8
  • 54 шаг, время 8
  • 55 шаг, время 8
  • 56 шаг, время 7
  • 57 шаг, время 7
  • 58 шаг, время 8
  • 59 шаг, время 7
  • 60 шаг, время 7
  • 61 шаг, время 7
  • 62 шага, время 7
  • 63 шаг, время 6
  • 64 шага, время 7
  • Повторите? (Да / нет): n

  • 8 байт 1227

  • 16 байт 1736
  • 32 байта 951
  • 64 байта 862
  • 96 байт 805
  • 128 байтов 805
  • 192 байта 769
  • 256 байт 1232
  • 512 байт 909
  • Повторите? (Y / n): y

  • 8 байт 1220

  • 16 байт 1739
  • 32 байта 944
  • 64 байта 842
  • 96 байт 815
  • 128 байтов 804
  • 192 байта 781
  • 256 байт 1220
  • 512 байт 905
  • Повторите (Y / N):

Дело в том, что я не могу использовать такие функции, как GetLogicalProcessorInformation, мне нужно определить тест. Запускаю в Visual Studio 2017 с конфигурацией на Release. Извините за мой английский

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]