Каким образом lmbench измеряет задержки L1 и L2 кэша с помощью C? (не может понять объяснение в руководстве)

Я пытаюсь понять, как lmbench измеряет задержку для L1, L2 и основной памяти.

man page для lat_mem_rd упоминает метод, но мне это не понятно:

Тест работает как два вложенных цикла. Внешний цикл - это шаг размер. Внутренний цикл - это размер массива. Для каждого размера массива benchmark создает кольцо указателей, указывающих вперед один шаг. Перемещение массива выполняется с помощью

p = (char **) * p;

в цикле for (верхняя часть цикла for не значительна; цикл - развернутый цикл 1000 нагрузок). Цикл прекращается после миллион нагрузок.

Как вы "создаете кольцо указателей, указывающих вперед один шаг"? Разве это не означает, что если размер шага составлял 128 байтов, вам нужно было бы создать связанный список с каждым node, разделенным ровно 128 байтами от него предыдущего? malloc просто возвращает некоторую случайную свободную часть памяти, поэтому я не вижу, как это возможно в C. И в куске кода я всегда получаю ошибку сегментации. (проверить его, и что такое p, который должен быть инициализирован?)

Существует аналогичный поток на SO (ссылка), и в первом ответе обсуждается это, но он не говорит о том, как можно использовать строгий подход со связанными списками. Я также посмотрел на исходный код (lat_mem_rd.c), но не мог понять это и из этого.

Любая помощь приветствуется.

Ответ 1

Вы можете выделить большой кусок памяти, а затем упорядочить элементы связанного списка в выделенном блоке на любой граничной границе.