Вопрос

Что подразумевается под использованием явного ограничения памяти?

Это было полезно?

Решение

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

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

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

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

Другие советы

Копирование моего ответа на другой вопрос, Какие уловки что процессор делает для оптимизации кода? :

  

Наиболее важным из них будет изменение порядка доступа к памяти.

     

При отсутствии ограждений памяти или инструкций сериализации процессор может свободно изменять порядок доступа к памяти. Некоторые архитектуры процессоров имеют ограничения на то, сколько они могут переупорядочить; Альфа известна тем, что она самая слабая (то есть та, которая может переупорядочить больше всего).

     

Очень хорошее описание этой темы можно найти в исходной документации ядра Linux по адресу Documentation / memory-barriers.txt .

     

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

По моему опыту, это относится к барьеру памяти , который является инструкцией (явной или неявно) для синхронизации доступа к памяти между несколькими потоками.

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

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

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

Википедия знает все ...

  

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

     

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

     

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top