В каких приложениях кеширование не дает никаких преимуществ? - PullRequest
2 голосов
/ 03 октября 2011

Наш профессор попросил нас подумать о разработке встроенной системы, в которой кэши не могут быть использованы в полной мере. Я пытался найти такой дизайн, но пока не смог его найти. Если вы знаете такой дизайн, можете ли вы дать несколько советов?

Ответы [ 5 ]

5 голосов
/ 04 октября 2011

Кэши используют данные (и код) фактов locality .

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

Пример:

Встроенная система имеет 1 МБ памяти и 1 КБ кэша. Если эта встроенная система обращается к памяти с помощью коротких переходов, она будет долго оставаться в той же области памяти размером 1 КБ, которая может быть успешно кэширована. Если эта встроенная система прыгает в разных удаленных местах в пределах этого 1 МБ и делает это часто, то нет никакого местоположения, и кэш будет использоваться плохо.

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

Более конкретный пример:

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

Другой, но странный пример

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

1 голос
/ 04 октября 2011

Подумайте, как работает кеш.Например, если вы хотите победить кеш, в зависимости от кеша, вы можете попробовать, чтобы ваши часто используемые данные имели значения 0x10000000, 0x20000000, 0x30000000, 0x40000000 и т. Д. В каждом месте требуется очень мало данных, чтобы вызвать переполнение кэша и значительную производительность.Утрата.

Еще одна причина заключается в том, что кэши обычно извлекают «строку кэша». Из-за одной выборки команд может быть прочитано 8 или 16 или более байтов или слов.Любая ситуация, когда в среднем вы используете небольшой процент строки кэша, прежде чем ее вытеснят, чтобы ввести другую строку кэша, снизит вашу производительность при включенном кэше.

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

РЕДАКТИРОВАТЬ:

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

1 голос
/ 04 октября 2011

Я не знаю, что у вас за основу, но предлагаю прочитать о том, что делает ключевое слово "volatile" на языке c.

0 голосов
/ 04 октября 2011

В дополнение к почти полному ответу Хальста, я хотел бы упомянуть еще один случай, когда кэши могут быть далеко не преимуществом. Если у вас есть многоядерный SoC, где все ядра, конечно, имеют собственный кэш (ы) и в зависимости от того, как программный код использует эти ядра - кеши могут быть очень неэффективными. Это может произойти, если, например, из-за неправильной конструкции или конкретной программы (например, многоядерная связь) некоторый блок данных в ОЗУ одновременно используется двумя или более ядрами.

0 голосов
/ 04 октября 2011

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

Кэш-память вызывает проблемы для этих устройств, потому что, когда программное обеспечение записывает на них, периферийное устройство не сразу видит запись.Если строка кэша никогда не очищается, периферийное устройство может фактически никогда не получить команду даже после того, как процессор отправил сотни из них.Если запись от 0xf0 до 0x5432 должна была вызвать срабатывание свечи зажигания # 3 или отклонение правого элерона на 2 градуса, то кэш задержит или остановит этот сигнал и приведет к сбою системы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...