Как компьютеры справляются с задержкой оперативной памяти?

Такты ЦП стали быстрее, чем ОЗУ. Таким образом, компьютеры должны ждать определенное количество тактов между отправкой адреса и получением данных. Но откуда компьютер знает, сколько тактов ждать? Что делает компьютер в промежутках между тактовыми циклами? Кроме того, как ваш компьютер управляет временем, если вы измените тактовую частоту (разгон), не приведет ли изменение тактовой частоты к полному беспорядку в вашем компьютере, поскольку ОЗУ работает только с определенной скоростью?

Этот вопрос, по сути, является копией вопроса «Каково точное использование контроллера памяти и задержки оперативной памяти», на который уже был дан ответ. Это может ответить на большую часть этого вопроса.
en.wikipedia.org/wiki/Clock_domain_crossing Это главное, что вас беспокоит. Помимо этого, есть предварительная выборка и кэширование, которые пытаются ограничить задержку памяти ядрами. Тем временем ядра могут переключаться на что-то другое или переходить в спящий режим для экономии энергии.
часы процессора были быстрее, чем оперативная память ... почти ... когда-либо ... скорость оперативной памяти составляет около 133 МГц, когда я последний раз проверял (в то время она не становилась быстрее примерно 10 лет), 2133 МГц и т. Д. - это не скорость оперативной памяти , но скорость автобуса. время оборота по-прежнему вечность. Как работают компьютеры? с кешем, или они просто зависают на сотни тактов, пока ждут.
в мире x86 я думаю, что последний раз, когда часы совпадали, было 386 дней, когда вы купили чип sram, и вам пришлось купить его, чтобы соответствовать скорости процессора. после этого я думаю, что процессор был быстрее и всегда будет. мы всегда можем работать внутри пакета быстрее, чем может выдержать ввод-вывод. так что вам придется действительно сильно снизить частоту внутри пакета, чтобы даже иметь дело с вводом-выводом, а тем более с медлительностью dram.
шины уже давно не являются старомодным стилем данных адреса выбора микросхемы чтения/записи, доступ даже к кешам по-прежнему занимает определенное количество тактов, поэтому даже если кеш отвечает за один такт, в лучшем случае их все равно несколько. .
разгон просто означает, что вы настраиваете pll для тактовой частоты процессора, есть другие pll для других интерфейсов, если бы это была одна глобальная тактовая частота или множитель тактовой частоты, pcie не работал бы, что означает ничего другого, видео, USB, диски и т. д., а не только оперативную память.
У ЦП есть некоторый локальный кеш (L1, L2, L3), чтобы поддерживать работу процессора, пока не поступят данные. По мере того, как вы спускаетесь по уровням, кеш становится все меньше, но безумно быстрым (некоторые кеши L1 на больших процессорах кричат ​​со скоростью много терабайт в секунду). В любом случае, ЦП часто захватывает большие куски оперативной памяти одним ударом и сбрасывает их в свой собственный кеш, таким образом, у него достаточно данных, чтобы продержаться до следующего доступа к внешней памяти.
Следует учитывать одну вещь: оперативная память может быть такой же быстрой, как процессор, но ограничения ввода-вывода экономичных компонентов причиняют вам боль. Самые быстрые детали изготавливаются не на кремниевых подложках и не используют напряжение для ввода-вывода, а используют токовые ответвители типа ECL. Если вам нужны приложения с потоком данных, где кеш вам не поможет, вы бросаете 100k на проблему, и вы можете получить процессоры и работать на четности часов с памятью.

Ответы (4)

откуда компьютер знает, сколько тактов ждать?

Где-то жестко запрограммировано. На встроенном оборудовании это жестко запрограммировано в прошивке. На старых компьютерах это было жестко прописано в BIOS, потому что все модули DIMM вели себя одинаково. В какой-то момент его стало можно настраивать на некоторых компьютерах в каком-то неясном меню параметров в утилите настройки BIOS. Теперь модули DIMM содержат небольшое последовательное ПЗУ под названием Serial Presence Detect , поэтому BIOS может получить конфигурацию задержки от самого модуля DIMM. Так что теперь он динамический, но все еще жестко запрограммирован в модуле DIMM.

Что делает компьютер в промежутках между тактовыми циклами?

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

Кроме того, как ваш компьютер управляет временем, если вы измените тактовую частоту (разгон), не приведет ли изменение тактовой частоты к полному беспорядку в вашем компьютере, поскольку ОЗУ работает только с определенной скоростью?

Я не очень разбираюсь в тонкостях разгона в мире ПК, поэтому постараюсь не говорить неправильные вещи. Но я думаю, что оперативная память и ядра процессора не имеют одинаковой тактовой частоты. Таким образом, когда вы разгоняете ядро, контроллер ОЗУ продолжает работать на своей первоначальной скорости, и проблем нет ( между ними есть асинхронные межсоединения , поэтому они могут работать с независимыми часами). Теперь, я думаю, вы также можете разогнать оперативную память. В этом случае, если вы достигнете определенного предела, вам, возможно, придется увеличить задержку, чтобы компенсировать это и при этом иметь достаточно времени для того, чтобы ОЗУ получало биты.

ЦП получает положительный ответ «вот данные, которые вы хотели ранее». Обычно он будет ждать довольно долго, прежде чем пометить ошибку, или даже бесконечно.

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

Многопоточность, например «HyperThreading» от Intel, означает, что ЦП будет выполнять две программы, используя одно ядро ​​ЦП, и когда одна застряла в ожидании памяти, другая может выполняться. Конечно, если оба работают на полной скорости, каждый из них получает только половину обычной скорости ЦП, но для рабочих нагрузок с большим количеством непредсказуемых обращений к ОЗУ это помогает увеличить загрузку ЦП.

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

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

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

Фактическая реализация будет содержать тысячи других небольших оптимизаций, чтобы эти процессы хорошо взаимодействовали друг с другом. Довольно часто существует специальная логика для эффективной обработки виртуальных таблиц C++ — здесь целевой адрес перехода считывается из памяти, поэтому логика предварительной выборки должна обработать это до того, как поток инструкций действительно достигнет ЦП.

Ответы на большинство обращений к памяти будут получены из кэшей L1/2/3.

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

BIOS ПК будет иметь подробные тайминги ОЗУ , которые он инициализирует, запрашивая небольшой чип I2C, подключенный к каждому модулю ОЗУ. Системы, отличные от ПК, работают аналогично, или, если ОЗУ припаяно к материнской плате, тайминги будут жестко прописаны в прошивке.

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

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

В вашей типичной системе x86 иерархия памяти выглядит примерно так:

   CPU
    |
   L1 Cache
    |
   L2 Cache
    |
   L3 Cache
    |
   Main RAM
    |
   Persistent Storage (HDD, SDD, etc)

L1-L3 — это ОЗУ физически на кристалле процессора, а его содержимое является копиями небольших разделов основной ОЗУ.

Существует отдельный аппаратный модуль, называемый блоком управления памятью, который, помимо прочего, копирует данные в различные кэши и ОЗУ и из них. Обычно MMU хорошо предсказывает, что ЦП будет запрашивать дальше, и когда ЦП запрашивает некоторый фрагмент данных, эти данные уже находятся в кэше L1 и могут быть немедленно считаны в нужный регистр.

Однако бывают случаи, когда MMU застигнут врасплох и не имеет правильных данных в правильном кэше. В этот момент MMU обычно вызывает прерывание, известное как «промах кэша». Это прерывание сообщает программному обеспечению/прошивке/операционной системе, что пройдет некоторое время, прежде чем данные для этого процесса станут доступны.

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

Кроме того, как ваш компьютер управляет временем, если вы измените тактовую частоту (разгон), не приведет ли изменение тактовой частоты к полному беспорядку в вашем компьютере, поскольку ОЗУ работает только с определенной скоростью?

Вроде. Оперативную память можно разгонять или понижать так же, как и процессор. Однако ОЗУ и ЦП (наряду с некоторыми другими частями) получают свои индивидуальные часы от основных часов. Это помогает гарантировать, что все части остаются синхронизированными. Это очень упрощенное объяснение.