Как оптимизировать производительность кеша? - PullRequest
0 голосов
/ 26 января 2019

Я написал код на C, используя массивы, чтобы понять поведение кэша на моем Intel i7 8750 с L1d = 32k, L2 = 258k, L3: 912k с размером строки 64 байта и установленным размером = 8. Тренд Iсм. мой код Я пытаюсь понять вывод, который я получаю из вывода моего кода.Что еще можно сделать в моем коде, чтобы гарантировать, что я получаю минимальное количество кеш-пропусков, если LRU является политикой замены кеша?

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<time.h>

#define BILLION 1000000000L

struct student
{
    char name[64];
};

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

     int m, i, p;
     char* n;
     char mn[64];
     u_int64_t diff; 
     struct timespec start, end; 
     m = strtol(argv[1], &n, 0);

    struct student* arr_student = malloc(m * sizeof(struct student));

    for(u_int64_t i = 0; i < m; i++ )
    {      
         strcpy(arr_student[i].name, "abc");
    }

     /* 100 runs to ensure cache warmup and linear access time calculation*/ 

    for (int j = 0; j<100; j++){        

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
        for(u_int64_t i = 0; i < m; i+=8){
            strcpy(mn,arr_student[i].name);
     if(i < (m-8)){
    strcpy(mn,arr_student[i+1].name);
    strcpy(mn,arr_student[i+2].name);
    strcpy(mn,arr_student[i+3].name);
    strcpy(mn,arr_student[i+4].name);
    strcpy(mn,arr_student[i+5].name);
    strcpy(mn,arr_student[i+6].name);
    strcpy(mn,arr_student[i+7].name);
    }
    }
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
} 

diff = BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec - start.tv_nsec;

printf("Time take for linear read operation only: %llu nanoseconds\n", (long long unsigned int) diff / 8 );

free(arr_student);

return 0;
}

Я вижу тенденцию, когда при увеличении размера массива время выполнения цикла выполняется по шагамиз 8, занимает все больше и больше времени.Я ожидаю, что он останется постоянным и увеличится только тогда, когда ЦП будет смотреть в L2, т. Е. Когда размер массива станет больше, чем может уместиться L1.Я ожидаю увидеть такой результат: https://www.google.com/search?q=cache+performance+trend+l1+l2&rlz=1C1GCEA_enUS831US831&source=lnms&tbm=isch&sa=X&ved=0ahUKEwi9jqqApYrgAhXYFjQIHR39BtwQ_AUIDygC&biw=1280&bih=913#imgrc=5JVNAazx3drZvM:

Почему я получаю обратную тенденцию, когда делю diff на m?Я не понимаю эту тенденцию.

Пожалуйста, помогите?

1 Ответ

0 голосов
/ 26 января 2019

Вот несколько полезных советов по выравниванию памяти и оптимизации кода:

и вообще, оптимизация кода - это вопрос времени и опыта.

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