6

Jeśli chodzi o to pytanie, interesują mnie tylko x86 i x86-64.

Na MSVC 2005, dokumentacja dla __faststorefence mówi: „gwarantuje, że każdy poprzedzający sklep jest globalnie widoczny przed każdym kolejnym sklepie”.

Na MSVC 2008 i 2010, to zmienione na: „gwarantuje, że każda poprzednia odniesienia pamięci, w tym zarówno obciążenia i sklep odniesień pamięci, jest globalnie widoczny przed każdym kolejnym odniesieniem pamięci”.

Sposób, w jaki jest napisane, implikuje, moim zdaniem, że to również zablokuje procesor zmieniający ładunek przed starszymi sklepami. Różni się to od pierwszej definicji, co implikuje, że samoistnie ma jedynie na celu zablokowanie lub zmianę kolejności nieczasowych sklepów ze starszymi sklepami (robi to tylko inny zamiennik x86 (-64)).

Jednak potem dokumentacja wydaje się zaprzeczać sobie: „Na platformie x64, to rutyna generuje dyspozycję, która jest szybsza sklep ogrodzenia niż sfence instrukcją Użyj tego nieodłącznym zamiast _mm_sfence na platformie x64. . "

Oznacza to, że nadal ma funkcjonalność podobną do sfery, w związku z czym ładunki mogą być ponownie zamieniane na starsze sklepy. Więc co to jest? Czy ktoś może wyjaśnić moje zamieszanie?
PS: szukam wersji GCC tej funkcji, natknąłem się na long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));, ale myślę, że pochodzi ona z 32-bitowego kodu; jaki byłby 64-bitowy analog?Jakie jest zachowanie __faststorefence?

+7

Czy możesz podać lepszy tytuł pytania niż "__faststorefence"? –

+1

@JaredFarrish: Lepiej późno niż wcale? :) – GManNickG

Odpowiedz

2

Cytowana wersja GCC jest odpowiednikiem kodu generowanego przez MSVC. Jest to uzależnione od tego, że dokumentacja architektury procesora x86/x86-64 określa, że ​​ładunki i magazyny nie są porządkowane zgodnie z instrukcją ed LOCK.

Nie wiem, czy dotyczy to magazynów czasowych, ponieważ ogólnie ograniczenia modelu pamięci nie mają zastosowania do tych instrukcji.

+0

Cześć Anthony, dzięki za odpowiedź. Pozostaje niejasne, dlaczego dokumentacja tego nieodłącznego określa, że ​​jest szybsza na platformie x64, a nie na 32 i 64. Czy oznacza to sugerowanie, że zablokowana instrukcja jest tańsza niż mfence tylko na x86-64? Co więcej, jeśli zapobiega to reorganizacji zarówno ładunków, jak i magazynów, czy jest to wystarczająca siatka zapewniająca sekwencyjną spójność (z wyłączeniem przypadku magazynów niebędących czasowymi)? –

+1

To nieodłączne jest dostępne tylko w MSVC na x86-64; Nie wiem dlaczego. Spodziewam się, że będzie miał taki sam koszt na x86-64 jak na x86 w odniesieniu do 'MFENCE', ponieważ architektura jest zasadniczo taka sama. Jeśli zignorujesz nie-czasowe zapasy, to jest to wystarczające ogrodzenie dla sekwencyjnej spójności. –