Как получить правильное время, используя clock_gettime - PullRequest
0 голосов
/ 21 апреля 2019

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

#include <stdio.h>
#include <stdlib.h>  // for exit(), rand(), strtol()
#include <pthread.h>
#include <time.h>    // for nanosleep()
#include <errno.h>   // for EINTR error check in millisleep()
#include <stddef.h>
#include <stdio.h>
#include <sys/sysinfo.h>
#include <math.h>


float stdsum , standardDeviation = 0.0;;

int timeSum = 0;

long diff_time(struct timespec *t1, struct timespec *t2)
{
return t2->tv_nsec - t1->tv_nsec + (t2->tv_sec - t1->tv_sec) * 1000000000L;
}

void sumTimes(float data){
       stdsum += data;
}


void floodCache(int* x,FILE * file){
  int z;
  for(int z = 0; z<10000;z++){
    fprintf(file,"%d",(*x)+z);
  }
}

int main(int argc, char *argv[])
{

FILE * fp , *xx;
   /* open the file for writing*/
   fp = fopen ("./output","w");
     xx = fopen ("./DUMP","w");



struct timespec t1, t2;
int nullTime;
int i , j ,k , r;
int d;
int sum;

int arr1[10000] = {0};
int arr2[10000] = {0};

int arrTimes[10] = {0};

for(i = 0;i<10000;i++){
  r = rand()%60;
  arr1[i] = r;
  arr2[i] = i;
}
for(i=0;i<1000000;i++){
    clock_gettime(CLOCK_MONOTONIC, &t1);
    clock_gettime(CLOCK_MONOTONIC, &t2);
    d = diff_time(&t1, &t2);
    timeSum += d;
}
nullTime = timeSum/1000000;
timeSum = 0;
printf("nullTime = %d\n",nullTime);

// return(0);

int spacing = 0;
int reps = 1000000;

// for (i = 1; i < 100; i*2) {

    floodCache(arr1,xx);

  for (j = 0; j < reps; j++) {
    fprintf(fp,"arr[ %d ] ",(0 +(j*spacing)%10000));

    clock_gettime(CLOCK_MONOTONIC, &t1);
    sum =+ arr1[(0 +(j*spacing)%10000)];
    clock_gettime(CLOCK_MONOTONIC, &t2);

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

    d = diff_time(&t1, &t2);
    timeSum += (d-nullTime);

    fprintf (fp, "%d\n",d);
// sleep(1);
}
 k=0;
  arrTimes[k] = (timeSum/reps);
  fprintf (fp, ">>>>>>>>>>>>>>>>spacing of %d, avg run time = %d \n",spacing,timeSum/reps);
  timeSum = 0;
  sum = 0;


floodCache(arr1,xx);

for (i = 1; i <= 128; i=i*2) {

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

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

    d = diff_time(&t1, &t2);
    timeSum += (d-nullTime);

    printf ( "%d\n",d);
// sleep(1);
}
  fprintf (fp, ">>>>>>>>>>>>>>>>spacing of %d, avg run time = %d \n",spacing,timeSum/reps);
  arrTimes[k] = (timeSum/reps);
  k++;
  timeSum = 0;
  sum = 0;

floodCache(arr1,xx);
  // }
}
for(i=0;i<10;i++){
  printf("spacing of %d = %d \n",i,arrTimes[i]);
}
fclose(xx);
fclose(fp);



}

, поэтому при окончательной распечатке указанный интервал увеличивается на 2 до этой степени.При вставке происходит скачок длины выполнения в интервале 4 (2 ^ 4 = 16, 16 * sizeof (int) = 64 ), который я и ожидал увидеть.Однако если я распечатываю эти данные в файл или не распечатываю их где-либо, это занимает гораздо меньше времени и не показывает шаблон, который указывает на изменение глубины кэша.

, поэтому 2 вопроса.1, правильно ли я подхожу к проблеме, и 2, почему существуют различия в зависимости от того, где я ее распечатываю.

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