x86 LOCK вопрос о многоядерных процессорах - PullRequest
32 голосов
/ 27 июля 2010

Правда ли, что префикс команды x86 ASM "LOCK" вызывает зависание всех ядер во время выполнения инструкции, следующей за "LOCK"?

Я прочитал это в блоге, и это не имеет смысла. Я не могу найти ничего, что указывало бы, правда это или нет.

Ответы [ 2 ]

47 голосов
/ 27 июля 2010

Речь идет о блокировке шины памяти для этого адреса. Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32 - Том 3А: Руководство по системному программированию, часть 1 , сообщает нам:

7.1.4 Влияние операции LOCK на внутренние кэши процессора.

Для процессоров Intel486 и Pentium сигнал LOCK # всегда заявлено в автобусе во время блокировки операция, даже если область памяти будучи заблокированным, кэшируется в процессор.

Для P6 и более поздних процессоров семей, , если область памяти заблокирован во время операции блокировки кэшируется в процессоре, который выполняя операцию LOCK как обратная память и полностью содержится в строке кэша, процессор не может утверждать LOCK # сигнал на шине . Вместо этого это будет изменить внутреннюю память и разрешить [свою] когерентность кеша механизм для обеспечения того, чтобы операция осуществляется атомарно. это операция называется «блокировка кэша». Механизм когерентности кэша автоматически предотвращает два или более процессоры, имеющие одинаковую площадь память от одновременного изменения данные в этой области. (выделение добавлено)

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

Я обсуждал это подробнее в своем блоге " Как блокировка блокировки? "

6 голосов
/ 27 июля 2010

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

...