Я не совсем знаком с тем, как perf определяет эти события, но, учитывая общее определение, я считаю, что пропуски загрузки/хранения - это просто способ разбить общий подсчет пропущенных ставок, чтобы вы могли указать, какие обращения пропускают больше довольно часто. Обратите внимание, что нагрузки обычно выполняются спекулятивно (по крайней мере, в современном процессоре x86), а магазины выполняются намного позже вдоль конвейера, после точки фиксации, поэтому даже фрагмент кода с нагрузками и магазинами в один и тот же регион может иметь разные пропуски ставки.
В протоколах кэш-памяти на основе MESI загрузка попадет в кэш или пропустит линию из уровня памяти или следующего кеша, либо исключительно, если она не принадлежит кому-либо другому, или в общем состоянии, если она есть. Он будет записывать данные в кэши на этом пути. Магазин будет получать строку таким же образом, но использовать запрос RFO (чтение для владения), который предоставляет ему эксклюзивное право собственности и право на изменение строки. Линия все равно будет кэшироваться, но как только новые данные будут записаны на нее локально (обычно в вашем кеше L1), она будет изменена. Процесс хита/промаха будет выглядеть одинаково.
Что Саман упоминает в своем ответе, это прорыв между чтением и записью. Нагрузки и хранилища (и другие формы доступа, такие как чтение кода) образуют форму «read», а обратные записи (или преднамеренные записи через специальные команды или типы mem, такие как uncacheable) образуют «запись».
Отлично! Спасибо, я в основном не понял, что хранилище означает запись, загрузка означает чтение из памяти. –
Я считаю, что это неправильно, я не знаком с тем, как perf определяет эти события, но «хранить» и «загружать» обычно используют для обозначения фактические операции, выполняемые в коде. – Leeor