Печать в консоль против файла при измерении скорости доступа - PullRequest
0 голосов
/ 23 апреля 2019

Я работаю над заданием, чтобы программно определить размер строки кэша на нашем компьютере.Я знаю, что есть команды, чтобы это выяснить.Это не главное.

У меня есть рабочий пример (по крайней мере, он показывает ожидаемые результаты). По существу,

  1. инициализирует массив int из 10000 элементов, который, как я знаю, больше, чем мой кэш L1.

  2. доступ к 1000000 последовательных элементов этого массива с интервалом 1,2,4,8 ... 128 добавляет его к глобальной переменной.Я измеряю время с разницей в clock_gettime и добавляю в конце получить среднее время доступа для каждого интервала.

  3. после завершения цикла, кэш заполняется значениями из другого массива,таким образом, вы знаете, что в кэш-памяти нет никаких значений из основного массива, предварительно выбранных.

    , но это только правильно, когда я распечатываю время, которое каждый доступ занимает к терминалу.Не работает, если я печатаю в файл.

Я попытался создать файл дампа, в котором каждый целое число обращалось, каждый раз при расчете и сумме все печаталось по мере их появления.Я подумал, что это заставит компилятор не оптимизировать и выполнить вычисления.

Я попытался рандомизировать элементы массива элементов 10000, чтобы они не были оптимизированы.

Я попытался запустить каждыйинтервальный цикл в произвольном месте в массиве, чтобы уменьшить возможную предварительную выборку.

вот мясо и картофель полного кода программы можно найти @ https://gist.github.com/jamesamrundle/7142c2e4fbff1971a7308c771ea65b3f

for (i = 1; i <= 128; i=i*2) {
 spacing =  i;
 r = rand()%10000;

 printf("rand = %d",r);
  for (j = 0; j < reps; j++) {
    // printf("arr[ %d ] ",(0 +(j*i)%10000));
    clock_gettime(CLOCK_MONOTONIC, &t1);
    sum = sum +arr1[(r +(j*spacing)%10000)];
    clock_gettime(CLOCK_MONOTONIC, &t2);

    fprintf(xx,"\n\n%d\n",sum);

    d = diff_time(&t1, &t2);
    timeSum += (d-nullTime);
    // timeTotal += (d-nullTime);
    // fprintf ( xx,"%d\n",d);<<<<//UNCOMMENT
    printf ( "*%d*%d\n",p,d); <<<<//COMMENT OUT
// sleep(1);
}
  fprintf (fp, ">>>>>>>>>>>>>>>>spacing of %d, avg run time = %d \n",spacing,timeSum/reps);
  arrTimes[k] = (timeSum/reps);
  k++;
  timeSum = 0;
  // sum = 0;
randArray();
floodCache(arr1,xx);
  // }
}

Как ивыполнение кода выполняется вечно, потому что он выводит на консоль несколько миллионов строк.но по окончании вы всегда видите резкий скачок, когда на расстоянии 16 элементов

расстояние 1, среднее время пробега = 26

расстояние 2, среднее время пробега = 31

интервал 4, среднее время выполнения = 41

интервал 8, среднее время выполнения = 53

интервал 16, среднее время выполнения = 81 <<< - // 16* sizeof (int) = 64, размер строки моего кэша </p>

интервал 32, среднее время выполнения = 83

интервал 64, среднее время выполнения = 86

интервализ 128, среднее время выполнения = 91

Если вы закомментируете printf каждого доступа к массиву и заменяете на fprintf, среднее время выполнения всегда всегда где-то ниже 30.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...