Задать вопрос
@alienstone

Верен ли такой метод измерения длинны аппаратной предвыборки данных в кэш?

Мне дали задание, определить длинну аппаратной предвыборки данных в кэш. Устроена предвыборка по следующей методике: после 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 с этим. Заранее огромное спасибо за ответ.
Реализованная программа
Выходной файл
  • Вопрос задан
  • 2579 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
к сожалению в выходном файле никаких закономерностей не обнаруживается

А что вы ожидали там увидеть? Я бы понял, если бы вы собирались сравнить время второго доступа со временем третьего.
Для уверенности в том, что доступ к памяти происходит где написано, не мешало бы указатели по которым вы ходите сделать volatile int *, а asm сделать asm volatile.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Посмотрите исходники ATLAS, она автоматически определяет ширину кэша и оптимизируется под нее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы