Как кэш с прямым отображением возвращает данные? - PullRequest
0 голосов
/ 16 декабря 2018

Я учусь на первом курсе по компьютерной архитектуре и сборке по учебнику «Компьютерная организация и дизайн» Паттерсона и Хеннесси.В настоящее время я изучаю кеши.Я понимаю, что процессор проверит кэш на 1. индекс блока кеша, 2. действительный бит в этом блоке, 3. допустимый тег.Оттуда, если это действительно так, данные отправляются в процессор.

У меня проблемы с тем, чтобы представить это как реальную вещь.Например, может быть, мы хотим загрузить слово из $ x в $ y.Процессор получает адрес, скажем, 0x12345670 для представления $ x.Таким образом, «0» будет смещением, «67» будет индексом, а остальное будет тегом.Мы получили удар из кеша, но где данные?Является ли рассматриваемый адрес данными?Есть ли в кеше больше места для хранения данных, которые нам нужны?Он отправляет вас прямо в это место в памяти?Как мы получаем данные из $ x через кеш, если они там есть.

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

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

1 Ответ

0 голосов
/ 16 декабря 2018

Кеш - это не программирование, если вы хотите, чтобы некоторые реальные примеры были рассмотрены на openocores.org, есть хотя бы несколько ядер, в которых есть кеш.(Вы должны прочитать VHDL / Verilog).Это не то, что вы обязательно видите в программе MIPS.

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

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

Когда вы выполняете чтение байта в 0x12345670, и допустим, что строка кэша составляет 256 байтов, тогда чтение со стороны медленной / драмы будет эквивалентно 0x12345600, если выполучить мисс.Если вы получили ошибку, то кэш предназначен для определения, где в этом кеше будет храниться строка кеша с вашим байтом.Если там сидит кто-то еще на корточках, их данные должны быть выселены.Если эти данные новее, чем то, что находится в драхме (с ними произошла некоторая запись), то эти данные записываются в драм, прежде чем они прочитают вашу строку кэша в кэш, и в конечном итоге ваш байт будет отправлен вам (более вероятно, ширина шины, 32или вам отправляется 64 бита, и процессор изолирует байтовую дорожку от этого).Если строка кэша была пуста или если данные там не нужно было записывать обратно в драм, то кэш просто считывает строку с вашим байтом в ней со стороны памяти драм / медленная память и доставляет ваш байт.

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

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

Если бы у меня был кэш с 256-байтовыми строками, то младшие 8 битов - это смещение в строке кэша, и вы бы не использовали их для оставшейся адресации.если бы у меня был кеш 128 Кбайт с 256-байтовыми строками, это значит, что я могу хранить 512 штукМне нужно 9 бит, чтобы выбрать из 512 штук.Некоторые из этих битов поступают из оставшихся битов адреса (0x123456).Так что я точно знаю, какие 256 байтов находятся в пространстве памяти, какие бы биты адреса не были оставлены, должны храниться вместе с моей строкой кэша.Таким образом, супер простым битом будет младший бит 4, а 0x56 используется, чтобы найти, какая из 512 строк и оставшиеся 0x1234 минус, что lsbit 0b000100100011010 должен быть сохранен в кеше как часть поиска (фактический тег),Поэтому мне нужно 512 * 15 битов оперативной памяти для самих тегов плюс еще несколько битов, чтобы пометить действительный / недействительный и грязный / чистый.

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

Вы также можете использовать несколько способов вместо вышеуказанных, где в моем кеше 512 256-байтовых строк кэша.Я мог бы выбрать 7 адресных битов, а не 8 и иметь 4 способа.Если бы у меня была программа, которая перебрасывала 0x100 байт за чтение, то на одну строчку кеша давали бы толчок, а на другие 511 не слишком много привыкли.Но вместо этого я беру меньше битов (7) из адреса и имею несколько способов (ассоциативность?).Этот один адрес имеет одно из четырех возможных мест для приземления, и логика ищет попадания в этих четырех местах, и если все они пропускают, то есть какие-то из них неиспользованные, если нет, то есть алгоритм, чтобы определить, кого выселяют (последний вили рандомизатор, или круговой, и т. д.).Если я немного прыгну на 0x100, то будет использовано как минимум 4 строки, а не 1. Надеемся, что игра окупится, и программа вернется, чтобы использовать некоторые из этих строк.

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

Упрощенный пример, который не охватывает всю реальность ситуации.Вы отвечаете на телефонные звонки в какой-то компании, босс сумасшедший и требует, чтобы вы не могли иметь более 16 сообщений / заметок за один раз, прежде чем принести их сотруднику.Вы принимаете звонок, записываете имя сотрудника и сообщение.повторение.В 16 или раньше вам нужно таскать это сообщение сотруднику.Если вы наберете 16, вы больше не сможете отвечать на звонки, пока не доставите хотя бы один и не освободите слот.Предположим, что это как в старые времена, и телефон продолжает звонить, пока вы не поднимете трубку (вы - автоответчик).Если вы получили второй звонок для этого сотрудника до того, как отправите ему заметку, вы МОЖЕТЕ записать это второе сообщение на той же заметке, оно не считается двумя.Примечание представляет собой строку кэша.Имя сотрудника - это тег, а сообщения - байты в строке кэша.А 16 - это общее количество строк кэша, которые я могу сохранить в этом кэше.Ваши глаза - это логика, которая смотрит на заметки, чтобы увидеть, есть ли попадание или промах, также вы определяете выселения, когда придет время.И вы можете доставить более одного за поездку со своего стола.Таким образом, вы можете спроектировать кэш телефона, чтобы определить, хотите ли вы всегда ждать, пока у вас будет 16 квитанций, прежде чем вы отправите один / несколько, надеясь совершить меньше поездок, если кто-то получит более одного сообщения, или если вы доставите их, как только получитеих.Или где-то посередине.Вы не можете предсказать, когда поступят вызовы, поэтому вы не можете идеально спроектировать решение, но цель состоит в том, чтобы увеличить количество звонков до того, как кто-то (вы) ответит, а также улучшить доставку сообщений сотрудникам.Обратите внимание, что в этой фантазии сотрудники не заботятся о том, какова задержка с момента звонка, когда они получают сообщение, до тех пор, пока все сообщения в конечном итоге доставляются.Не охватывает реальную проблему и решение кеша памяти, но, возможно, поможет вам подумать об этом, может, изменит ваше понимание, если так извините.

В общем, как программист, кеш - это только часть системы памяти, которая заставляет ваш компьютер работать, вы на самом деле не разговариваете с ним, вы обычно используете пространство памяти процессора, выделенное вашей программе, для выполнения каких-либо задач.Хотите иметь строку и манипулировать ею, вы делаете это.Скорее всего, ваша программа работает с кешем, обычно вам не нужно зацикливаться на том, где находятся циклы или как они выровнены.И вы, вероятно, не думаете о MMU, который может / делает то, что вы считаете линейным адресным пространством, предоставленным вам операционной системой, фактически фрагментированным по физической памяти, а затем то, как эти фрагменты попадают в кеш, не находится под вашим непосредственным контролем,Если вы обычно пишете программу для запуска на Windows или Linux, Mac, IOS или Android, вы не знаете, какая конфигурация MMU / кэша находится за вашей высокоуровневой программой.голый металл уверен, что вы контролируете, и вы можете повернуть ручки, которые вы можете повернуть (мм, код и выравнивание данных и чередование).В некоторых системах / микросхемах вы можете читать размеры кеша, в некоторых вы можете связываться с параметрами.И в этих / тех ситуациях вы можете повеселиться, либо показав, что кеш очень помогает, и / или покажите, что кеш замедляет работу кода.

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

'67' would be the index

Я бы сказал,Нет, но если вы считаете, что это правильно, тогда хорошо.

but where is the data?

Это в кеше, гуглите кеш слов или найдите его в диктонарке.В кеше хранятся данные.

Is the address in question the data?

Рассматриваемый адрес полностью или частично становится тегом.

Is there more space in the cache that holds the data we need? 

Данные находятся в кеше.

Does it send you directly to that location in memory?

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

Also assuming 32bit word length, you send the address to the cache and get a full word back or just the bits that are enough?

Определяется конструкцией шины иреализация.Нередко для чтения используется единица типа 32 или 64 бита, и процессор извлекает из них байт или все, что он искал.Это НЕ неэффективно, часто это более эффективно на современных процессорах, которые делают столько, сколько вы можете в таких блоках, использование байтовых переменных может снизить производительность, технически это может сэкономить память, но 1970-е годы давно закончились.иметь много памяти.Обычно записи - это те, где размер имеет значение, часто есть либо байтовая маска, указывающая, какие байты шины имеют реальные данные, которые должны быть сохранены, либо размер, и шина использует биты шины данных от 0 до N-1.

PS. it is most helpful for me to learn from real examples, so if You have resources on practice for this (and mips programming particularly non leaf functions) I would really appreciate that as well.

Opencores.org содержит несколько процессоров с кэшами.

...