2013-12-23 1 views
1

Я закодировал следующий игровой тест.Кэш-хиты, промахи и прогнозы - влияние на производительность

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); 
} 

В принципе, он выполняет итерацию по массиву различными шагами. Я тогда нанесены результаты:

enter image description here

(Результаты сглаженные)

Когда шаг составляет ~ 128, процессор может поместиться все данные, которые будут доступны в L1-кэш. Учитывая линейность доступа к будущим читателям, предположительно предсказано.

Мой вопрос: почему среднее время для чтения продолжает расти после этого? Мое рассуждение о шаге = ~ 128 также выполняется для значений, больших этого.

Спасибо!

+0

Считаете ли вы большое влияние на кэширование вашего заявления на печать? –

+0

Может ли постоянное увеличение среднего времени быть связано с ошибками софт-страницы? –

ответ

0

Это код, который вы использовали? Все, что он делает, это чтение данных с 16 МБ. Я запустил его на своем ПК, где 16 МБ - из ОЗУ, вычисляя МБ/секунду, что составило 993 на шаге 2, уменьшившись до 880 при шаге 999. Основываясь на измерении времени микросекунд, ваш расчет времени составил 0,0040 при шаге 2, увеличившись 0,0045 на шаге 999.

Существует множество причин для снижения скорости при увеличенных шагах, таких как всплеск, выравнивание кэш-памяти и различные банки памяти.

+0

Спасибо за ваш ответ! Да, это код, который я использовал. На самом деле это 4MByte, а не 16. Что меня смущает, почему падение до 0 при stride = 128 _combined с_ непрерывным увеличением после этого ... –

+0

К сожалению, я пропустил это, но 4 МБ по-прежнему является ОЗУ на ПК, который я использовал. На моем компьютере нет капли на 128, но вы можете считывать данные из ОЗУ, а некоторые кеши могут составлять 128 байт. Необходимо увидеть, какие инструкции используются для добавления символов. –

Смежные вопросы