Что подразумевается под явным ограничением памяти?
источник
Что подразумевается под явным ограничением памяти?
Для повышения производительности современные процессоры часто выполняют инструкции не по порядку, чтобы максимально использовать доступную микросхему (включая чтение / запись в память). Поскольку оборудование обеспечивает целостность инструкций, вы никогда не заметите этого в одном потоке выполнения. Однако для нескольких потоков или сред с энергозависимой памятью (например, ввод-вывод с отображением памяти) это может привести к непредсказуемому поведению.
Забор / барьер памяти - это класс инструкций, которые означают, что чтение / запись в память происходят в ожидаемом вами порядке. Например, «полное ограждение» означает, что все операции чтения / записи до ограждения выполняются перед операциями после ограждения.
Обратите внимание, что ограждения памяти - это аппаратная концепция. В языках более высокого уровня мы привыкли иметь дело с мьютексами и семафорами - они вполне могут быть реализованы с использованием ограждений памяти на низком уровне, и явное использование барьеров памяти не требуется. Использование барьеров памяти требует тщательного изучения архитектуры оборудования и чаще встречается в драйверах устройств, чем в коде приложения.
Переупорядочивание ЦП отличается от оптимизации компилятора, хотя артефакты могут быть похожими. Вам необходимо принять отдельные меры, чтобы компилятор не переупорядочивал ваши инструкции, если это может вызвать нежелательное поведение (например, использование ключевого слова volatile в C).
Копирую ответ на другой вопрос : какие уловки использует процессор для оптимизации кода? :
источник
Alpha is known for being the weakest
, почемуweakest
? Не лучше ли переупорядочить больше, чтобы в результате выполнение было намного быстрее? (Я не альфа-пользователь, но спрашиваю о влиянииvery reordering
vsrestricted reordering
). Итак, каковы недостатки переупорядочения партий (за исключением риска неопределенного поведения, но я предполагаю, что большинство современных процессоров должны были решить хороший переупорядочение и реализовать только определенное переупорядочение, иначе это не имело бы смысла в принятом ими решении).По моему опыту, это относится к барьеру памяти , который представляет собой инструкцию (явную или неявную) для синхронизации доступа к памяти между несколькими потоками.
Проблема возникает в сочетании современных агрессивных компиляторов (они обладают удивительной свободой переупорядочивать инструкции, но обычно ничего не знают о ваших потоках) и современных многоядерных процессоров.
Хорошим введением к проблеме является « Декларация « Двойная проверка блокировки нарушена » ». Для многих это был тревожный сигнал о существовании драконов.
Неявные барьеры полной памяти обычно включаются в подпрограммы синхронизации потоков платформы, которые покрывают ее ядро. Однако для программирования без блокировок и реализации настраиваемых облегченных шаблонов синхронизации часто требуется только барьер или даже только односторонний барьер.
источник
Википедия знает все ...
источник