Каково поведение __faststorefence?

Что касается этого вопроса, меня интересуют только x86 и x86-64.

Для MSVC 2005 г. в документации для __faststorefence говорится: «Гарантирует, что каждое предыдущее хранилище глобально отображается перед любым последующим хранилищем ».

Для MSVC 2008 и 2010 это было изменено на : «Гарантирует, что каждая предыдущая ссылка на память, включая ссылки загрузки и сохранения памяти, будет глобально видима перед любой последующей ссылкой на память

Способ последней написано, на мой взгляд, это подразумевает, что это также заблокирует переупорядочение загрузок ЦП перед старыми хранилищами. Это отличается от первого определения, которое подразумевает, что внутреннее предназначено только для работы с блокировкой или переупорядочением невременных хранилищ с более старыми магазины (единственный другой переупорядочивание x86 (-64) делает).

Однако тогда документация, кажется, противоречит сама себе: «На платформе x64 эта процедура генерирует инструкцию, которая является более быстрой ограничением хранилища , чем sfence ] инструкция. Используйте эту встроенную функцию вместо _mm_sfence на платформе x64. "

Это означает, что он по-прежнему имеет функциональность, подобную sfence, и, таким образом, загрузки все еще можно переупорядочивать в старых магазинах. Так что же это? Может кто-нибудь прояснить мою путаницу?

PS: ища версию этой функции для GCC, я наткнулся на long local; __asm__ __volatile __ ("lock; orl $ 0,% 0;":: "m" (local)); но я думаю, это из 32-битного кода; что будет за 64-битный аналог?

6
задан GManNickG 6 September 2012 в 22:25
поделиться