Почему последовательный доступ к массиву имеет высокий уровень промахов в кэше?Linux

Ответить
Anonymous
 Почему последовательный доступ к массиву имеет высокий уровень промахов в кэше?

Сообщение Anonymous »

У меня есть следующий фрагмент кода C, который я тестирую, чтобы понять производительность и кэширование. Он последовательно обращается к массиву двойников.

Код: Выделить всё

    size_t n = 10000000;

double* arr;
if (posix_memalign((void**)&arr, 64, n * sizeof(double)) != 0) {
fprintf(stderr, "posix_memalign failed\n");
exit(1);
}

for (size_t i = 0; i < n; i++) arr[i] = (double)i;

double sum = 0;
for (size_t i = 0; i < n; i++) sum += arr[i];

printf("Sum: %f\n", sum);
Я компилирую код без оптимизации и запускаю perf.

Код: Выделить всё

$ perf stat -e LLC-loads,LLC-loads-misses -- perf_cache_rw_miss_rate
Sum: 49999995000000.000000

Performance counter stats for 'perf_cache_rw_miss_rate':

94,978      LLC-loads:u
90,827      LLC-loads-misses:u        #   95.63% of all LL-cache accesses

0.081948891 seconds time elapsed

0.048803000 seconds user
0.032856000 seconds sys
Меня озадачивают несколько вопросов.
  • Во-первых, нагрузки LLC намного меньше, чем ожидалось. Должно ли оно быть близко к 10000000/8 (строка кэша: 64 байта)? Или возможно, что он не учитывает всю продолжительность выполнения?
  • Во-вторых, что более важно, процент промахов слишком высок. Я ожидаю, что каждый промах чтения приведет к появлению строки кэша с 8 дублями. То есть в целом процент промахов должен приближаться к 1/8? На самом деле оно должно быть намного меньше, поскольку в этом случае упреждающая выборка очень поможет, верно?


Подробнее здесь: https://stackoverflow.com/questions/798 ... -miss-rate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»