Я использую высокоуровневый API PAPI для проверки промахов TLB в простой программе, проходящей через массив, но вижу большие числа, чем ожидалось.
В других простых тестовых случаях результаты кажутся вполне разумными, что заставляет меня думать, что результаты реальны, а дополнительные промахи связаны с аппаратной предварительной выборкой или чем-то подобным.
Может ли кто-нибудь объяснить цифры или указать мне на ошибку в использовании PAPI?
int events[] = {PAPI_TLB_TL};
long long values[1];
char * databuf = (char *) malloc(4096 * 32);
if (PAPI_start_counters(events, 1) != PAPI_OK) exit(-1);
if (PAPI_read_counters(values, 1) != PAPI_OK) exit(-1); //Zeros the counters
for(int i=0; i < 32; ++i){
databuf[4096 * i] = 'a';
}
if (PAPI_read_counters(values, 1) != PAPI_OK) exit(-1); //Extracts the counters
printf("%llu\n", values[0]);
Я ожидал, что напечатанное число будет в районе 32 или, по крайней мере, несколько, но постоянно получаю результат 93 или выше (не всегда выше 96, т.е. не просто 3 промаха на каждую итерацию). Я работаю привязанным к ядру, на котором больше ничего нет (кроме прерываний таймера).
Я использую Nehalem и не использую огромные страницы, поэтому в DTLB 64 записи (512 в L2).
calloc()
вместоmalloc()
. - person Mysticial   schedule 19.02.2013