Мне дали задание, определить длинну аппаратной предвыборки данных в кэш. Устроена предвыборка по следующей методике: после 2х последовательных кэш-промахов она определяет направление движения и начинает подружать данные в кэш строками неизвестной длины. Мне требуется экспериментально определить длину этой строки.
В моей программе, у меня есть один массив, который я передаю в функцию, которая уже делает 2 промаха а потом делает задержку для того чтобы предвыборка подгрузила данные в кэш, и измеряет время доступа к 3ему элемету. После чего она печатает результат в файл. Но у меня к сожалению в выходном файле никаких закономерностей не обнаруживается. Есть правда незначительные скачки через 30 элементов типа инт, но они не постоянны. Эта функция принимает на вход сам массив и смещение, которое задается в цикле от 1 до 1024 int что равно размеру окна, больше которого по определению аппаратная предвыборка работать не может. Промахи у меня на 0м элементе, на cache_string_size (64 b) * 2 и следующий доступ я делаю cache_string_size * 4 + i. 4 потому что после промаха возможно загрузятся 2 строки в кэш после второго промаха. (массив полностью заполнен нулями с помощью функции memset)
Кострукция промахов:
if (array[0] == 0){ // first cache miss
if (array[string_size * 2] == 0){ // second cache miss
usleep(100);
asm("rdtsc\n":"=a"(start.t32.th),"=d"(start.t32.tl));
if (array[string_size * 4 + offset] == 0){ // acess to the element
asm("rdtsc\n":"=a"(end.t32.th),"=d"(end.t32.tl));
}
}
}
Не могли бы Вы указать на возможные ошибки в моем алгоритме действий? И если что то не верно, подсказать способ которым точно получится это сделать?
ОС: Ubuntu 14.04
Камень: Intel® Core™2 Duo CPU P8400
Размер L2: 3mb, Ассоциативность: 12 Размер строки: 64 байт
Так же, прилагаю реализованную программу на с++ и выходной файл который я получаю. Помогите пожалуйста, мучаюсь уже недели 3 с этим. Заранее огромное спасибо за ответ.
Реализованная программаВыходной файл