Что подразумевается под кешем данных и кэшем команд?

Из здесь:

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

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

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

Я знаю сборку ARM. Будет ли что-нибудь, требующее STR, LDR, LDMF или STMFD использовать кеш данных? Но технически говоря STR, LDR, LDMF и STMFD - все инструкции, поэтому я вот почему я смущен. Должны ли "данные" всегда существовать с "инструкцией"? Рассматриваются ли данные в разделе .data?

Например LDR R1, =myVar, тогда LDR перейдет в кэш команд, а содержимое myVar войдет в кеш данных? Или это не работает?

Инструкции и данные имеют разные шаблоны доступа Может кто-нибудь прокомментировать?

Этот комментарий, который я сделал на полезном сообщении, подчеркивает мое понимание проблемы:

"Идея состоит в том, что если инструкция загружена из памяти, это скорее всего, будет снова использован в ближайшее время", но единственный способ узнать следующий инструкция должна прочитать его. Это означает, что память читается (вы не можете сказать это уже в кеше, потому что новая инструкция красная). Так что я все еще не вижу смысла? Скажем, инструкция LDR только что произошла, так что теперь LDR находится в кеше данных. Может быть, другая инструкция LDR произойдет, возможно, этого не произойдет, мы не можем быть уверены, поэтому нам нужно действительно прочитать следующий инструкция - таким образом, побеждая цель кеша.

Ответы

Ответ 1

Выборы команд могут выполняться в кусках с предположением, что большую часть времени вы будете выполнять многие инструкции в строке. поэтому выборки команд могут быть более эффективными, вероятно, есть несколько или больше часов накладных расходов на транзакцию, тогда задержка для памяти будет иметь готовые данные, а также часы на ширину шины для размера транзакции. 8 слов или инструкций могут быть, например, 5 + n + 8 часов, что более эффективно, чем одна команда за раз (5 + 1 + 1) * 8.

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

В ARM я знаю, что кеш I1 я и D являются отдельными, L2 объединяются. L1 не находится на шине axi/amba и, скорее всего, более эффективен для доступа, чем L2, и за пределами которого находятся amba/axi (несколько циклов служебных данных плюс время плюс один такт на ширину шины данных для каждой транзакции).

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

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

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

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

ldr r1,=myvar

приведет к относительной нагрузке pc

ldr r1,something
...
something: .word myvar

инструкция ldr будет частью выборки строки кэша, выборки команд (вместе с несколькими инструкциями). они будут сохранены в я части кеша L1 на плече и совместно используемой части L2 (если включено и т.д.). Когда эта команда будет окончательно выполнена, адрес для чего-то будет испытывать чтение данных, которое, если кеширование включено в этой области для этого чтения, тогда оно также войдет в кеш L2 и L1 (часть D), если оно еще не существует. Если вы зацикливаетесь и снова запустите эту инструкцию сразу, тогда в идеале команда будет находиться в кеше L1, а время доступа для ее получения очень быстро составляет всего несколько часов. Данные также будут находиться в кеше L1, а также будут содержать несколько часов для чтения.

5 + n + 8, упомянутое выше, некоторое количество часов накладных расходов (5 - это просто возможность, он может меняться как по дизайну, так и по тому, что еще происходит параллельно). N зависит от более медленных скоростей памяти. что n достаточно велико для драм, поэтому кеши l2 и L1 намного быстрее, и поэтому кэш всегда существует, чтобы уменьшить большое количество тактовых циклов для каждого драм-доступа, эффективно или нет.

Ответ 2

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

Ответ 3

Кэш инструкций - это еще один уровень памяти для быстрого доступа к инструкциям. Это не часть логики процессора/внутренней части /fetch -decode-execute cpu, но вы бы назвали ее.

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

Процессоры внутри не кэшируют инструкции.

Инструкции и данные имеют разные шаблоны доступа. Может ли кто-то прокомментировать?

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

Ответ 4

Принимая во внимание, например, РУКА. Для простоты предположим, что

  • VA- > PA отображается 1:1.
  • Свойства MMU настроены на использование кэширования и совместного использования
  • есть только кеши L1I и L1D и L2D

Когда выполняется ядро, ПК имеет VA (далее именуемый PA). На данный момент никто не знает, есть ли PA данные или инструкция. А также, поскольку это первый раз, когда этот адрес попал, не будет никаких распределений кеша. Таким образом, аппаратное обеспечение будет выглядеть в кеш L1 I, L1D и L2D и ничего не находит.

Он проходит через хост MMU (MMU не может найти адрес в TLB) и, наконец, извлекает содержимое из последней памяти. Теперь у нас есть контент из PA, который может быть данными или инструкцией.

выделение в кеше I:

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

выделение в кеш-памяти D:

После того, как блок декодирования вычисляет нагрузку или сохраняет и передает управление в блок LoadStore, данные распределяются в/из кэша L1D.

Таким образом, в следующий раз, когда следующий адрес приходит на ПК, и он следует по той же цепочке, текущий адрес ссылается/проверяется с содержимым в L1I для инструкций и везде, где есть хит, текущий адрес содержимое извлекается из TLB