Запуск программ в кеше и регистрах

1975
tony_sid

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

0

4 ответа на вопрос

3
Rich Homolka

Это очень сложный вопрос, ожидайте несколько ответов, поскольку люди лучше, чем ответы других :)

Профессор сказал, что лучшее место для запуска программ - это кеш.

Помните, что кеш во много раз дороже обычной оперативной памяти. В те времена, когда «большой» компьютер занимал 8 МБ (не гигабайты, мегабайты), вы могли обнаружить, что все машины были «кэш-памятью» (технически это особый тип ОЗУ, называемый SRAM), но они были более дорогими. Теперь у вас есть домашние машины с 4 ГБ памяти, 4 ГБ SRAM, подключенного к чипу, будут ОЧЕНЬ дорогими. Кроме того, у вас есть много умных людей, играющих с программами и компиляторами, чтобы наилучшим образом использовать кеш. При правильном алгоритме кеширования вы получаете 95% кеша с небольшим процентом от стоимости. Конечно, догадки не всегда верны. Google 'прогноз ветви' для получения дополнительной информации.

Мне было интересно, почему программы не могут быть запущены в регистрах?

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

Я предполагаю, что вы спрашиваете, почему вы не можете просто запустить полностью из регистров. Одна из причин - их так мало. Классические Intel x86 регистры считаются в байтах, но программы в мегабайтах, гигабайтах. Вы были бы достаточно богатым человеком, чтобы иметь чип, который мог бы запускать MS-Word из регистров.

Кроме того, как программа может загрузить себя в кеш?

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

Разве кэш не управляется процессором и работает автоматически без программного контроля?

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

2
yhw42

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

Если все, что вы хотите, чтобы ваша программа, - это взять число и добавлять его к нему снова и снова, вы, вероятно, могли бы делать все это в регистрах. Регистры очень малы, в них хранится по одному числу, и у обычного процессора x86 их 16 (8 целых и 8 с плавающей запятой).

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

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

Вы можете прочитать больше о кешах и регистрах .

1
heavyd

Ваши программы запускаются из регистров! Они также работают из кеша. Все это помогает вашему компьютеру работать быстрее. Самый большой ограничивающий фактор - размер. Есть очень ограниченные регистры процессора. Типичная машина x86 имеет только 8 32-битных регистров, которые ЦПУ использует для хранения данных, с которыми работает. Как вы знаете, доступ к реестру очень быстрый, однако из-за ограниченного размера в регистрах может храниться небольшое количество данных.

Кеш похож на то, что он ограничен в размерах. Меньшие кеши (например, L1) сначала проверяются ЦП на наличие данных, если данные не обнаруживаются в этом кеше, затем они проверяют последующие кеши (L2, L3 и т. Д.). Каждый уровень кеша становится все больше и медленнее. Если к концу проверки все кэши все еще не найдены, процессор должен извлечь данные из ОЗУ.

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

1
Paul A. Clayton

I was wondering why programs can't be run in registers?

Most instruction set architectures (ISAs) do not support indirection in registers. I.e., the register addresses are encoded as constants in the instruction. (This limitation significantly simplifies pipelining.)

Caches also have the advantage of being microarchitectural features--i.e., the size and other characteristics are only visible to software in terms of performance. This allows different implementations of an ISA to use different sizes et al. without loss of binary compatibility, e.g., for different performance or application targets or to adjust for changes in the balance of tradeoffs from changes in manufacturing technology.

In addition, as the number of software visible registers grows, the benefit of compiler management tends to decrease relative to the cost in compiler complexity and compilation time, especially for programs with complex control flow. If multiple levels of registers are used (as in the Cray-1) to allow a fast small group of registers, compiler register allocation complexity is increased.

Furthermore, the size of a general purpose register is typically set by the size of the address space, whereas the size of a cache line (the comparable item for caches) involves tradeoffs of tag overhead, expected spatial locality of reference (larger cache lines can effectively prefetch nearby data but the bandwidth and storage is wasted if the data is not used while it is in the cache), bandwidth considerations (longer memory bursts are more bandwidth efficient--making larger cache lines more attractive--and cache coherence traffic is influenced by line size), false sharing (where one processor writes to a location near a location another processor will read; large cache lines introduce false communication dependencies), etc.

Also, how can a program load itself into cache? Isn't the cache something that's controlled by the CPU and works automatically without software control?

The cache is controlled by the CPU, but software can explicitly prefetch items into the cache (and the Itanium ISA supports non-temporal-at-cache-level_N hints to help hardware better manage cache allocation and replacement). Ordinary memory accesses will load into the L1 cache the requested item and items within the naturally aligned cache line and that cache line will usually--excluding coherence invalidations, e.g.--remain present until the CPU chooses to replace it with another another cache line of data requested by another--possibly speculative--memory access or hardware prefetch; so software does have some ability to manage cache contents.

Software can also exploit knowledge of specific characteristics of a cache system (cache-conscious algorithms and data structures) or the general characteristics shared by most cache systems (cache-oblivious algorithms) to reduce the frequency of cache misses (where items need to be retrieved from memory or a level of cache nearer memory).