Замедление при доступе к данным на границах страницы? - PullRequest
0 голосов
/ 06 июля 2019

(Мой вопрос связан с компьютерной архитектурой и пониманием производительности. Не нашел соответствующего форума, поэтому опубликуйте его здесь как общий вопрос.)

У меня есть программа 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, замедления нет.Результаты производительности приведены на рисунке ниже.

imageX and Y-axis is execution time in milliseconds">

Я тестирую свою программу на нескольких персональных компьютерах, все работают под управлением Linux с x86_64 на процессоре Intel.

Что может быть причиной этого замедления?Мы попробовали буфер строк в DRAM, кэш-памяти L3 и т. Д., Которые, кажется, не имеют смысла ...

Обновление (11 июля)

Мы провели небольшой тест, добавив инструкции NOPк исходному коду.И замедление все еще там.Это Сорта Вето 4k псевдоним.Причина, связанная с отсутствием кэша конфликтов, более вероятна.

1 Ответ

1 голос
/ 06 июля 2019

Здесь есть 2 вещи:

Любой из этих эффектов или оба эти фактора могут повлиять на Почему в 2048x2048 наблюдается огромное снижение производительности по сравнению с умножением массива 2047x2047?


Другим возможным фактором является то, что предварительная загрузка HW останавливается на границах физической страницы. Почему скорость memcpy () резко падает каждые 4 КБ? Но изменение шага с 1024 на 1023 не помогло бы этому в значительной степени. Предварительная выборка «следующей страницы» в IvyBridge и более поздних версиях - это только предварительная выборка TLB, а не данные со следующей страницы.


Я предположил x86 для большей части этого ответа, но в общем случае применяется псевдоним кэш-памяти / конфликтные пропуски. Ассоциативно-множественные кэши с простой индексацией универсально используются для кэшей L1d. (Или на старых процессорах с прямым отображением, где каждый «набор» имеет только 1 элемент). Псевдонимы 4k могут быть в основном для Intel.

Предварительная выборка за границы виртуальной страницы, вероятно, также является общей проблемой.

...