Как школьное задание, мне нужно найти способ получить размер строки кеша данных L1 без чтения файлов конфигурации или с помощью вызовов api. Предполагается использовать доступ к памяти для чтения/записи таймингов для анализа и получения этой информации. Так как я могу это сделать?
В неполной попытке выполнить другую часть задания, чтобы найти уровни и размер кеша, у меня есть:
for (i = 0; i < steps; i++) {
arr[(i * 4) & lengthMod]++;
}
Я думал, может быть, мне просто нужно изменить строку 2, (i * 4)
часть? Поэтому, если я превышу размер строки кеша, возможно, мне придется его заменить, что происходит когда-то? Но так ли это так просто? Требуемый блок уже может быть где-то в памяти? Или перпах я все еще могу рассчитывать на то, что, если у меня будет достаточно большой steps
, он все равно будет работать довольно точно?
UPDATE
Вот попытка GitHub... главная часть ниже
// repeatedly access/modify data, varying the STRIDE
for (int s = 4; s <= MAX_STRIDE/sizeof(int); s*=2) {
start = wall_clock_time();
for (unsigned int k = 0; k < REPS; k++) {
data[(k * s) & lengthMod]++;
}
end = wall_clock_time();
timeTaken = ((float)(end - start))/1000000000;
printf("%d, %1.2f \n", s * sizeof(int), timeTaken);
}
Проблема заключается в том, что не существует различий между сроками. FYI. так как он для кеша L1. У меня SIZE = 32 К (размер массива)