Средства оптимизации производительности процессора - кеш
Чтобы повысить производительность программы, современные процессоры оптимизируют программу разными способами. Например: кеш ЦП, чтобы максимально избежать накладных расходов процессора на доступ к основной памяти, большинство процессоров будут использовать кеш для повышения производительности.
многоуровневый кэш
L1 Cache(Кэш уровня 1) - это кеш первого уровня ЦП, который делится на кеш данных и кеш инструкций.Как правило, емкость кеша L1 серверного ЦП обычно составляет 32-4096 КБ.L2 Cache(Кэш второго уровня) Из-за ограниченной емкости кэш-памяти L1, чтобы снова повысить скорость работы ЦП, кэш-память, кэш-память второго уровня, размещается вне ЦП.L3 Cache(кэш L3) теперь встроен, и его фактическая роль заключается в том, что применение кеша L3 может еще больше уменьшить задержку памяти и повысить производительность процессоров при обработке больших объемов данных.Процессоры с большим кешем L3 более эффективны. меньшая длина очереди сообщений и процессора.Обычно несколько ядер совместно используют кеш L3.
Когда ЦП считывает данные, он сначала ищет в L1, затем в L2, затем в L3, затем в памяти и, наконец, во внешней памяти.
Протокол синхронизации кэша
Несколько ЦП считывают одни и те же данные для кэширования, и после выполнения разных операций, какой ЦП в конечном итоге записывается в основную память? То есть протокол MESI, который предусматривает, что каждый кэш имеет бит состояния, и определяет следующие четыре состояния:
- Modified (Modified) Эта строка кэша была изменена (грязная строка), содержимое отличалось от основной памяти, этот кэш является эксклюзивным
- Эксклюзивное состояние (Exclusive) Эта строка кэша такая же, как и в основной памяти, но не отображается в других кэшах.
- Общее состояние (Shared) Эта строка кеша совпадает с основной памятью, но также появляется в других кешах.
- Неверное состояние (Invalid) Эта строка кэша недействительна (пустая строка)
Во время многопроцессорной обработки, когда один ЦП вносит изменения в данные в кеше, ему необходимо уведомить другие ЦП, что означает, что обработка ЦП должна управлять своими собственными операциями чтения и записи, а также отслеживать уведомления от других ЦП для обеспечения согласованности в конечном итоге.
Метод оптимизации производительности ЦП - перестановка инструкций во время выполнения
Сценарий перестановки инструкций: когда ЦП записывает в кеш и обнаруживает, что блок кеша занят другими ЦП, для повышения производительности обработки ЦП сначала могут выполняться последующие команды чтения из кеша. Конечно, это не случайная перестановка, она должна следовать как бы серийной семантике. Смысл семантики as-if-semantic означает: как бы ни переупорядочивалась, результат выполнения программы не может быть изменен Компилятор, среда выполнения и процессор должны подчиняться семантике как если бы последовательная, то есть компилятор и процессор не будут переупорядочивать операции, которые имеют зависимости от данных.
два вопроса
-
Есть проблема под кешем ЦП: Данные в кеше и данные в основной памяти не синхронизируются в реальном времени, а данные в кеше между процессорами не синхронизируются в реальном времени В один и тот же момент времени значения данных в одной и той же памяти адрес, видимый каждым процессором, может быть несогласованным.
-
Проблема с оптимизацией переупорядочения команд выполнения ЦП: Несмотря на то, что семантика "как если бы" соблюдается, правильный результат может быть гарантирован только тогда, когда один ЦП выполняет сам себя. может произойти выполнение, что приведет к неправильным результатам выполнения программы.
Обходной путь — барьер памяти
Процессор предоставляет две инструкции барьера памяти (Memory Barrier) для решения двух вышеуказанных проблем:Барьер записи памяти (барьер сохранения памяти): вставьте Store Barrier после инструкции, чтобы последнее обновление данных в кэше записи могло быть записано в основную память, делая его видимым для других потоков. Принудительная запись в основную память, этот вызов дисплея, ЦП не будет выполнять перестановку инструкций из-за соображений производительности.
Барьер загрузки памяти: Вставьте Load Barrier перед инструкцией, которая может сделать недействительными данные в кеше и заставить данные снова считываться из основной памяти Принудительное чтение содержимого основной памяти, поддержание согласованности кеша ЦП и основной памяти, избегая проблемы согласованности, вызванной кешем