Я закодировал следующий игровой тест.Кэш-хиты, промахи и прогнозы - влияние на производительность
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-кэш. Учитывая линейность доступа к будущим читателям, предположительно предсказано.
Мой вопрос: почему среднее время для чтения продолжает расти после этого? Мое рассуждение о шаге = ~ 128 также выполняется для значений, больших этого.
Спасибо!
Считаете ли вы большое влияние на кэширование вашего заявления на печать? –
Может ли постоянное увеличение среднего времени быть связано с ошибками софт-страницы? –