Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Аппаратное обеспечение

Что каждый программист должен знать о памяти.

Часть 2: Кэш-память процессора

Оригинал: "Memory part 2: CPU caches"
Автор: Ulrich Drepper
Дата публикации: October 1, 2007
Перевод: Н.Ромоданов
Дата перевода: апрель 2012 г.
Назад Оглавление Вперед

3.4 Кэш-память инструкций

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

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

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

После того как частоты работы ядра процессоров резко возросли и увеличилась разница в скорости между кэш-памятью (даже кэш-памятью первого уровня), процессоры стали конвейерными. Это означает, что выполнение инструкций происходит в несколько этапов. Сначала инструкция декодируется, затем подготавливаются параметры и, наконец, инструкция выполняется. Такой конвейер может быть достаточно длинным (более 20 этапов для архитектуры Netburst фирмы Intel). Длинный конвейер означает, что если конвейер остановился (например, прерван проходящий через него поток инструкций), то требуется некоторое время, чтобы снова достичь требуемой скорости. Например, остановка конвейера происходит в случае, если место выполнения следующей инструкции предсказано неправильно, либо если для загрузки следующей инструкции потребуется слишком много времени (например, если она должна быть считана из памяти).

Разработчики процессоров потратили массу времени и состояние по предсказанию ветвлений сейчас таково, что остановка конвейера происходит настолько редко, насколько это возможно.

На процессорах CISC этап декодирования может занять некоторое время. Особенно это видно для процессоров X86 и x86-64. Поэтому в последние годы в этих процессорах последовательности необработанных байтов инструкций в кэш-память L1i не записываются, вместо этого в кэш-память L1i записываются декодированные инструкции. В этом случае кэш-память L1i называется "кэш трассы" ("trace cache"). Кэш трассы в случае попаданий в кэш-память позволяет процессору пропускать первые шаги конвейера, что особенно хорошо в случае, если конвейер останавливается.

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

Есть всего несколько правил, относящихся к кэш-памяти инструкций, которые позволяют достичь наилучшей производительности:

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

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


Назад Оглавление Вперед