Что делает - префикс URL moz-документа () делает?

Модель памяти TSO в x86 является последовательной последовательностью + буфер хранилища, поэтому только хранилищам seq-cst требуется специальное ограждение. (Остановка после хранилища до тех пор, пока буфер хранилища не опустеет, до последующей загрузки - это все, что нам нужно для восстановления последовательной согласованности). Более слабая модель acq / rel совместима с переупорядочением StoreLoad, вызванным буфером хранилища.

(См. Обсуждение в комментариях относительно того, является ли «разрешение переупорядочения StoreLoad» точным и достаточным описанием того, что позволяет x86. Ядро всегда видит свои собственные хранилища в программном порядке, поскольку загружает отслеживание буфера хранилища, так что вы можете сказать, что хранилище Переадресация также переупорядочивает загрузки недавно сохраненных данных. За исключением случаев, когда вы не всегда можете: Инструкции загрузки невидимого на глобальном уровне )

(И, кстати, компиляторы, отличные от gcc, используют xchg для выполнения seq-cst store. На самом деле это более эффективно на современных процессорах. GCC mov + mfence в прошлом могли быть дешевле, но в настоящее время обычно хуже, даже если вы не заботитесь о старое значение. См. Почему хранилище std :: atomic с последовательной последовательностью использует XCHG? для сравнения между GCC mov+mfence и xchg. Также мой ответ на Что лучше написать барьер на x86: lock + addl или xchgl? )

Интересный факт: вы можете добиться последовательной согласованности, вместо этого ограждая seq-cst , загружая вместо stor эс. Но для большинства случаев дешевые грузы гораздо ценнее, чем дешевые магазины, поэтому каждый использует ABI, где в магазинах есть полный барьер.

См. https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html для получения подробной информации о том, как атомарные операции C ++ 11 отображаются в последовательности команд asm для x86, PowerPC, ARMv7, ARMv8 и Itanium. Также Когда требуются инструкции x86 LFENCE, SFENCE и MFENCE?


, когда я использую std :: memory_order_release / acqu без оптимизации, также используется инструкция MFENCE

blockquote>

Это потому, что flag.store(true, std::memory_order_release); не встроен, потому что вы отключили оптимизацию. Это включает в себя встраивание очень простых функций-членов, таких как `` atomic :: store (T, std :: memory_order = std :: memory_order_seq_cst) `

Когда параметр упорядочения для встроенной функции __atomic_store_n() GCC равен переменная времени выполнения (в реализации библиотеки atomic::store()), GCC воспроизводит ее консервативно и переводит ее в seq_cst. На самом деле это может стоить того, чтобы gcc разветвлялся mfence, потому что это так дорого, но это не то, что мы получаем.

80
задан Charles Roper 14 November 2019 в 16:10
поделиться