Измерение задержек памяти

Я шел по этой ссылке, где они имеют дело со статистическими данными о задержках основной памяти, кеша L1 и L2.

Мне было интересно, возможно ли вычислить то же самое с использованием кода C/ C++ без использования инструментов тестирования?

1 ответ

Инструменты тестирования, такие как LMBench, написаны на C. Поэтому, когда вы спрашиваете, можно ли это сделать на C, ответ будет довольно прост: "да".

LMBench проверяет латентность памяти (в lat_mem_rd.c), повторяя указатели. Это то же самое, что следовать за связанным списком, за исключением того, что в списке нет содержимого, только указатель на следующую ячейку.

struct cell { struct cell *next };

struct cell *ptr = ...;
for (i = 0; i < count; i++) {
    ptr = ptr->next;
    ptr = ptr->next;
    ... 100 of these, unrolled ...
    ptr = ptr->next;
    ptr = ptr->next;
}

Регулируя размер списка, вы можете контролировать, будет ли доступ к памяти попадать в кэш L1, кэш L2 или в основную память. Однако если вы тестируете кэш-память второго уровня или основную память, вам необходимо убедиться, что каждый доступ к памяти является достаточно старой строкой кеша, чтобы к тому времени, когда вы снова к ней обращаетесь, она была удалена из более быстрых кешей. Некоторые кэши также поддерживают предварительную выборку, поэтому "поэтапный" подход также может означать, что для определенных шагов вы используете более быстрый кэш.

Вам также необходимо включить оптимизацию (-O2, с GCC/Clang). Иначе ptr может храниться в стеке, увеличивая задержку. Наконец, вам нужно убедиться, что компилятор не учитывает ptr быть "мертвой" переменной. Сложный компилятор может заметить, что приведенный выше код на самом деле ничего не делает. Иногда при написании тестов компилятор является врагом. Код LMBench имеет функцию use_pointer() только для этого.

Другие вопросы по тегам