Нужно ли использовать mfence при использовании xchg? - PullRequest
8 голосов
/ 27 января 2012

У меня есть набор и проверка xchg блокировка сборки. мой вопрос:

Нужно ли использовать ограждение памяти (mfence, sfence или lfence) при использовании инструкции xchg?

Редактировать:

64-битная платформа: с Intel Nehalem

Ответы [ 4 ]

13 голосов
/ 27 января 2012

В соответствии с главой 8 Блокировка шины из Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 3A

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

Таким образом, заблокированная инструкция XCHG действует как барьер памяти, и дополнительный барьер не требуется.

13 голосов
/ 27 января 2012

Как сказано в других ответах, префикс блокировки здесь неявный, поэтому на уровне ассемблера проблем нет.Проблема может лежать на уровне C (или C ++), когда вы используете его как встроенный ассемблер.Здесь вы должны убедиться, что компилятор не переупорядочивает инструкции относительно вашего xchg.Если вы используете gcc (или двоюродных братьев), вы обычно делаете что-то вроде:

  __asm__ __volatile__("xchgl %1, %0"
                       : "=r"(ret)
                       : "m"(*point), "0"(ret)
                       : "memory");

, который объявляет инструкцию как volatile , и добавляет «память» clobber.

5 голосов
/ 27 января 2012

Нет. xchg гарантированно скомпилируется во что-то, что обеспечит согласованность на аппаратном уровне.

0 голосов
/ 27 января 2012

Инструкция xchg имеет неявный префикс блокировки в соответствии с инструкциями Intel.

...