Я использую асм dcbt
Команда для прикосновения к диапазону памяти, который, я знаю, потребуется для выполнения определенных вычислений. Мой профилировщик показывает шаблон пропусков кеша из-за спорадического доступа к элементам в этом диапазоне (4 касания, 5 пропущенных и т. Д. — при каждом 5-м действии кэш пропускается).
Есть функция A()
который имеет доступ к точному диапазону и его размеру. это A()
функция вызывается перед другим разделом, который также будет касаться и использовать данные из диапазона A()
использует. Могу ли я просто использовать dcbt
внутри A()
а затем ожидать улучшения в B()
, или же я должен использовать dcbt
на диапазон в той же функции, которая использует этот сбор данных?
Предполагая ВСЕ данные, используемые в A()
помещается в кэш, вы должны увидеть улучшение B()
тоже. Тем не менее, вы также можете закончить чтение данных в кеш, который не используется, который никому не нужен и просто заставляет шину памяти быть занятой, когда ее можно использовать для загрузки некоторых АКТУАЛЬНЫХ данных, которые необходимы, если ваш шаблон так же спорадичен, как вы говорите. Во что бы то ни стало, попробуйте, но не ожидайте, что он будет работать волшебным образом — часто требуется небольшая «настройка», особенно в том, что касается того, «насколько далеко вы сейчас находитесь, где вы читаете данные».
В зависимости от точного поведения A()
а также B()
Например, если вы переключаетесь между чтением и записью, чтением из одного раздела и записью в совершенно другой раздел, группирование записей в «область хранения», которая затем копируется в ОЗУ, часто является хорошим планом — сделайте удерживая область что-то вроде 1 / 8-1 / 4 кеша L1.
Других решений пока нет …