2013-08-23 4 views
2

Я использую perf как основной счетчик событий. Я работаю над программой, которая страдает от промахов в хранилищах данных. Который так же высок, как отношение% 80.производительность кэша процессора. магазин misses vs load misses

Я знаю, как кеши в принципе работают. Он загружается из памяти в различные случаи сбоя, удаляет данные из кеша, когда им это нравится. То, что я не понимаю, в чем разница между промахами в магазинах. Как он отличается загрузкой и хранением. Как вы можете хранить-пропустить?

ответ

1

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

Пропускная способность магазина связана с тем, когда процессор хочет записать вновь вычисленные данные в основную память. Когда он хочет записать данные в основную память, он должен убедиться, что содержимое кеш и основная память синхронизированы друг с другом. Это может произойти с двумя различными политиками, которые вы можете найти здесь: Writing Policies.

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

Вы можете проверить the applet here, чтобы лучше понять, что происходит в разных сценариях.

+0

Отлично! Спасибо, я в основном не понял, что хранилище означает запись, загрузка означает чтение из памяти. –

+0

Я считаю, что это неправильно, я не знаком с тем, как perf определяет эти события, но «хранить» и «загружать» обычно используют для обозначения фактические операции, выполняемые в коде. – Leeor

1

Я не совсем знаком с тем, как perf определяет эти события, но, учитывая общее определение, я считаю, что пропуски загрузки/хранения - это просто способ разбить общий подсчет пропущенных ставок, чтобы вы могли указать, какие обращения пропускают больше довольно часто. Обратите внимание, что нагрузки обычно выполняются спекулятивно (по крайней мере, в современном процессоре x86), а магазины выполняются намного позже вдоль конвейера, после точки фиксации, поэтому даже фрагмент кода с нагрузками и магазинами в один и тот же регион может иметь разные пропуски ставки.

В протоколах кэш-памяти на основе MESI загрузка попадет в кэш или пропустит линию из уровня памяти или следующего кеша, либо исключительно, если она не принадлежит кому-либо другому, или в общем состоянии, если она есть. Он будет записывать данные в кэши на этом пути. Магазин будет получать строку таким же образом, но использовать запрос RFO (чтение для владения), который предоставляет ему эксклюзивное право собственности и право на изменение строки. Линия все равно будет кэшироваться, но как только новые данные будут записаны на нее локально (обычно в вашем кеше L1), она будет изменена. Процесс хита/промаха будет выглядеть одинаково.

Что Саман упоминает в своем ответе, это прорыв между чтением и записью. Нагрузки и хранилища (и другие формы доступа, такие как чтение кода) образуют форму «read», а обратные записи (или преднамеренные записи через специальные команды или типы mem, такие как uncacheable) образуют «запись».

Смежные вопросы