(Мой вопрос связан с компьютерной архитектурой и пониманием производительности. Не нашел соответствующего форума, поэтому опубликуйте его здесь как общий вопрос.)
У меня есть программа C
, которая обращается к словам памяти, которыерасположены на расстоянии X байтов в виртуальном адресном пространстве.Например, for (int i=0;<some stop condition>;i+=X){array[i]=4;}
.
Я измеряю время выполнения с переменным значением X
.Интересно, что когда X
является силой 2
и имеет размер страницы, например, X=1024,2048,4096,8192...
, я получаю огромное снижение производительности.Но на всех других значениях X
, таких как 1023
и 1025
, замедления нет.Результаты производительности приведены на рисунке ниже.
X and Y-axis is execution time in milliseconds">
Я тестирую свою программу на нескольких персональных компьютерах, все работают под управлением Linux с x86_64 на процессоре Intel.
Что может быть причиной этого замедления?Мы попробовали буфер строк в DRAM, кэш-памяти L3 и т. Д., Которые, кажется, не имеют смысла ...
Обновление (11 июля)
Мы провели небольшой тест, добавив инструкции NOPк исходному коду.И замедление все еще там.Это Сорта Вето 4k псевдоним.Причина, связанная с отсутствием кэша конфликтов, более вероятна.