Ответ 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 или основную память. Тем не менее, если вы тестируете кеш-память L2 или основную память, вам необходимо убедиться, что каждый доступ к памяти имеет кэш-строку, достаточно старую, чтобы она была удалена из более быстрых кешей к моменту ее повторного доступа. Некоторые кэши также поддерживают предварительную выборку, поэтому подход "заостренный" может также означать, что вы нажимаете более быстрый кеш для определенных шагов.

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