Подтвердить что ты не робот

Имеет ли Intel SFENCE семантику выпуска?

Похоже, что принятое определение семантики получения и выпуска выглядит примерно так: (Цитируется из http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).aspx)

Операция приобретает семантику, если другие процессоры всегда будут видеть его эффект перед любым последующим действием. Операция релиз, если другие процессоры будут видеть все предыдущие Эффект работы до эффекта самой операции.

Я кратко прочитал о существовании барьеров с половинной памятью и, предположительно, они приходят в аромат приобретать барьеры и барьеры выпуска, следуя той же семантике, описанной выше.

В поисках реального примера аппаратных инструкций я столкнулся с SFENCE. И этот блог (http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/) говорит, что это форма забора/барьера релиза:

Intel предоставляет двунаправленную инструкцию по заграждению MFENCE, приобретает забор LFENCE и освободительную ограду SFENCE.

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

4b9b3361

Ответ 1

LFENCE не имеет семантики получения; У SFENCE нет семантики выпуска. Для этого есть веская причина: наличие самостоятельной команды забора с семантикой приобретения или семантикой выпуска оказывается почти совершенно бесполезной. Для получения/освобождения для любой пользы он должен быть привязан к операции с памятью.

Например, рассмотрим общую идиому для отправки данных между двумя потоками:

  • Процессор A записывает в буфер.
  • Процессор A записывает "true" в флаг.
  • Процессор B ожидает, что флаг будет прав.
  • Процессор B считывает буфер.

Обратите внимание, что процессор A должен убедиться, что его запись в флаг отображается после записи в буфер. Теперь предположим, что у нас есть инструкция "RFENCE", которая является заборной решеткой. Если мы поместим инструкцию сразу после шага (1), это не принесет пользы, потому что запись на шаге 2 может отображаться для перехода через RFENCE и вверх по шагу 1.

Аналогичный аргумент показывает, что инструкция "AFENCE", которая делает покупку, одинаково бесполезна для обеспечения того, чтобы считывание флага на шаге 3 не отображалось для перехода вниз по шагу 4.

Itanium решила проблему элегантно, предоставив инструкции write-with-release и load-with-receive, которые привязывают ограждение к операции с памятью.

Вернуться к IA-32 и Intel64: Если программа не использует "невременные" инструкции, то остальные инструкции ведут себя так, как если бы каждая загрузка выполняла "приобретать", и каждый магазин делает "выпуск". См. Раздел 8.2.3 (и подразделы) Руководство разработчика Intel® 64 и IA-32. 3A. Если есть "невременные" магазины, у вас есть несколько способов обеспечить ограждение:

  • Использовать SFENCE
  • Использовать MFENCE - несколько overkill
  • Используйте команду LOCK-prefixed (например, "LOCK INC" ) для записи флага. Инструкции LOCK-prefixed неявно имеют MFENCE.
  • Используйте XCHG, который действует так, как будто он имеет неявный префикс LOCK, для записи флага.

Например, если в более ранней идиоме буфер записывается с использованием невременных хранилищ, у процессора А возникает СФЕРА или СЛУЖБА между шагами 1 и 2. Или используйте XCHG для записи флага.

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