Я написал следующий игрушечный бенчмарк.
int N = 1024*4096;
unsigned char *ary = malloc(N);
ary[0] = 1;
int stride, i;
double start, end;
int sum;
for(stride = 1; stride < N; ++stride) {
start = getCPUTime();
sum = 0;
for(i = 0; i < N; i+=stride) {
sum += ary[i];
}
end = getCPUTime();
printf("stride %d time %f sum %d\n", stride, (end - start)/(N/stride), sum);
}
По сути, он перебирает массив с разной скоростью. Затем я нарисовал результаты:
(Результаты сглажены)
Когда шаг равен ~128, ЦП может разместить все данные, к которым нужно получить доступ, в кэше L1. Учитывая линейность доступа, будущие чтения предположительно предсказываются.
Мой вопрос в том, почему после этого среднее время чтения продолжает расти? Моя аргументация в пользу stride=~128 также верна для значений, превышающих это значение.
Спасибо!