У меня есть следующий фрагмент кода 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 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? На самом деле оно должно быть намного меньше, поскольку в этом случае упреждающая выборка очень поможет, верно?
У меня есть следующий фрагмент кода C, который я тестирую, чтобы понять производительность и кэширование. Он последовательно обращается к массиву двойников. [code] 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); [/code] Я компилирую код без оптимизации и запускаю perf. [code]$ 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 [/code] Меня озадачивают несколько вопросов. [list] [*]Во-первых, нагрузки LLC намного меньше, чем ожидалось. Должно ли оно быть близко к 10000000/8 (строка кэша: 64 байта)? Или возможно, что он не учитывает всю продолжительность выполнения?
[*]Во-вторых, что более важно, процент промахов слишком высок. Я ожидаю, что каждый промах чтения приведет к появлению строки кэша с 8 дублями. То есть в целом процент промахов должен приближаться к 1/8? На самом деле оно должно быть намного меньше, поскольку в этом случае упреждающая выборка очень поможет, верно?