На многоядерном x86 нужен ли LOCK в качестве префикса для XCHG?

Если mem является общей памятью, мне нужно:

XCHG EAX,mem

or:

LOCK XCHG EAX,mem

сделать обмен атомарно?

Поиск в гугле дает ответы как да, так и нет. Кто-нибудь знает это окончательно?


person Walter Bright    schedule 29.06.2010    source источник


Ответы (3)


Документация Intel кажется довольно ясной, что она избыточна.

IA-32 Руководство разработчика программного обеспечения для архитектуры Intel®, том 3A: Руководство по системному программированию, часть 1

7.1.2.1 говорит:

Операции, в которых процессор автоматически следует семантике LOCK, следующие:

  • При выполнении инструкции XCHG, которая ссылается на память.

Так же,

Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 2B: Справочник по набору инструкций, N-Z

XCHG:

При обращении к операнду памяти протокол блокировки процессора автоматически реализуется на время операции обмена, независимо от наличия или отсутствия префикса LOCK или значения IOPL.

Обратите внимание, что на самом деле это не означает, что сигнал LOCK# устанавливается независимо от того, используется префикс LOCK или нет, 7.1.4 описывает, как на более поздних процессорах семантика блокировки сохраняется без LOCK#, если ячейка памяти кэшируется. Умно, и определенно над моей головой.

person CB Bailey    schedule 29.06.2010
comment
Параметр PrintAssembly на JVM Oracle Hotspot также, похоже, согласуется с этим. При создании сборки у нее нет префикса блокировки в инструкции xchg на x86-64. - person Kedar Mhaswade; 14.11.2013
comment
Раздел 8.1.2.1 Automatic Locking в текущей версии руководства, а не 7.1.2.1. - person Ruslan; 05.03.2019

Начиная с 386 дней, xchg будет утверждать сигнал блокировки независимо от того, поместите ли вы на него префикс блокировки. документация Intel довольно четко описывает это в справочнике по набору инструкций IA-32 N-Z.

person Yann Vernier    schedule 29.06.2010

Согласно Руководству по эксплуатации 80386, BUS LOCK утверждается на время обмена. Префикс LOCK не имеет приоритета для этой операции, равно как и значение Уровень привилегий ввода/вывода.

Мое предложение состоит в том, что, поскольку в документации указано, что BUS LOCK утверждается независимо от наличия префикса LOCK, в остальном LOCK XCHG EAX, mem безопасен. Если сомневаетесь, добавьте LOCK.

person Scott S. McCoy    schedule 29.06.2010