Вопросы по кешу - PullRequest
       27

Вопросы по кешу

1 голос
/ 10 августа 2011

Мне всегда было интересно, как я могу контролировать то, что кешируется в памяти.

Я всегда думал, что это невозможно сделать с по крайней мере c ++.

До одного дня, когда человек сказалмне не включать скрипты lua в приложение c ++, потому что оно "... печально известно тем, что полностью разрушило ваш кеш ..."что ваша программа кэширует в памяти. Так как если lua может изменить производительность моего кэша, то почему я не могу.

Если так,

i.Это зависит от архитектуры или ОС?

ii.Можете ли вы получить доступ к тому, что находится в кеше или что кешируется?.

Просто чтобы быть ясным, я говорю о кеше процессора.

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Процессор будет кэшировать все данные, которые ему нужны, и поскольку его размер ограничен, когда ему нужно загрузить что-то новое, он отбросит все, что использовалось меньше всего.

По сути, вы не имеете прямого контроля над ним, но косвенно у вас есть некоторые:

Что вам нужно знать, так это то, что процессоры используют строк кэша . Каждая строка кэша представляет собой небольшой блок памяти.

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

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

Работа кэша также может быть нарушена путем вызова некоторой внешней библиотеки, которая требует большого количества данных и / или кода, поэтому ваша основная программа + данные будут удалены из кэшей, и когда вызов завершится, ЦПУ должен загрузить его снова.

Если вы выполняете тяжелую оптимизацию и хотите знать, как вы используете кэш L1 / L2 / .., вы можете делать симуляции. Valgrind имеет отличный модуль под названием Cachegrind , который делает именно это.

1 голос
/ 10 августа 2011

Кэш CPU обычно используется для нескольких независимых кэшей. На большинстве современных процессоров обычно есть три кэша:

  • кеш инструкций
  • кеш данных
  • трансляционный поисковый буфер (TLB)

Как говорит yi_H: у вас нет прямого контроля над ним, но у вас есть косвенный контроль.

Таким образом, существует несколько причин плохой работы кэша. Общие из них:

  • Инструкция рабочий набор слишком велик, чтобы поместиться в кэш команд.
  • Данные рабочий набор слишком велик, чтобы поместиться в кэш данных.
  • Сочетание вышеперечисленного.

Обычно это приводит к перебоям , когда процессор в основном сидит идеально, ожидая обработки данных.

Если вы хотите повлиять на производительность своего кэша ЦП, вам нужно уменьшить как можно меньше рабочих наборов инструкций и данных для каждой критической области производительности вашего приложения, независимо от того, на какой ОС / языке написано ваше приложение.

Что касается ваших вопросов:

я. Это зависит от архитектуры или ОС?

Да

II. Можете ли вы получить доступ к тому, что находится в кеше или что кешируется?

нет

Нет

0 голосов
/ 10 августа 2011

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

Когда они говорят о «разрушении вашего кеша», на самом деле они имеют в виду «разрушение вашей производительности». Медленное чтение вне чиповой памяти (высокая задержка); кеш чтения быстрый (низкая задержка). Если вы обращаетесь к памяти по глупой схеме, вы будете постоянно перезаписывать содержимое кеша (т. Е. «Отсутствует кеш»), а не повторно использовать то, что уже находится в кеше (т. Е. «Попадания в кеш»), и минимизировать чтения из памяти вне кристалла. .

...