Попадания в кэш, промахи и предсказание — влияние на производительность

Я написал следующий игрушечный бенчмарк.

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 также верна для значений, превышающих это значение.

Спасибо!


person F. P.    schedule 23.12.2013    source источник
comment
Рассматривали ли вы большое влияние на кэширование вашего оператора печати?   -  person Bob Dalgleish    schedule 23.12.2013
comment
Может ли постоянное увеличение среднего времени быть связано с программными ошибками страницы?   -  person huseyin tugrul buyukisik    schedule 29.12.2013


Ответы (1)


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

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

person Roy Longbottom    schedule 23.12.2013
comment
Спасибо за Ваш ответ! Да, это код, который я использовал. На самом деле это 4MB, а не 16. Что меня смущает, так это то, почему падение почти до 0 при stride=128 сочетается с непрерывным увеличением после этого... - person F. P.; 24.12.2013
comment
Извините, я пропустил это, но 4 МБ все еще ОЗУ на ПК, который я использовал. На моем ПК нет падения на 128, но пакетное чтение из ОЗУ и некоторых кешей может быть 128 байт. Нужно посмотреть, какие инструкции используются для добавления к символам. - person Roy Longbottom; 24.12.2013