2012-01-27 22 views
7

Mam zestaw i test xchg oparty blokada zespołu. moje pytanie brzmi:Czy potrzebujemy mfence podczas korzystania z xchg

Czy potrzebujemy użyć ogrodzenia pamięci (mfence, sfence lub lfence) podczas korzystania z instrukcji xchg?

Edit:

64 Bit platforma: Intel Nehalem

+1

Jaka platforma/procesor? –

Odpowiedz

11

Tak jak powiedziano w innych odpowiedziach prefiks blokady jest domyślny, tutaj, więc nie ma problemu na poziomie asemblera. Problem może występować na poziomie C (lub C++), gdy używasz tego jako wbudowanego asemblera. Tutaj musisz upewnić się, że kompilator nie zmienia kolejności instrukcji w odniesieniu do Twojego xchg. Jeśli używasz gcc (lub kuzyni) byś zwykle zrobić coś takiego:

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

czyli zadeklarować dyspozycję jako lotny i dodać „pamięć” sprać.

+4

+1 za odbiór "pamięci". –

5

nr xchg jest gwarantowana do kompilacji w coś, że zapewni spójność na poziomie sprzętowym.

+0

Domyślam się, że przyszedł czas na użycie "kompilacji" zamiast "montażu" lub czegoś podobnego: Lekcja: polski po angielsku. Jednak stoję za treścią. –

+0

Zakładając, że używasz prefiksu LOCK, oczywiście. –

+8

@Daniel: Według [this] (http://stackoverflow.com/questions/3144335/on-a-multicore-x86-is-a-lock-necessa-as-a-prefix-to-xchg) ' przedrostek lock 'jest niejawny dla' xchg' i dlatego nie jest wyraźnie potrzebny dla x86. – Grizzly

12

Zgodnie z rozdziałem 8 Bus Blokowanie, z Intel 64 i IA-32 architektury oprogramowania programisty Manual Volume 3A

Model pamięci zamawiania zapobiega obciążeń i sklepów przed następującą kolejność zablokowana instrukcje, które są wykonywane wcześniej lub później.

Tak więc zablokowana instrukcja XCHG działa jak bariera pamięci i nie jest potrzebna żadna dodatkowa bariera.

+1

Tak, zgodnie z punktem 8.1.2.2 wspomnianego podręcznika, instrukcja "XCHG" jest zawsze zablokowana, jeśli odwołuje się do pamięci, nawet jeśli nie podano dla niej prefiksu LOCK. Tak więc, wspomniana wyżej zasada zamawiania pamięci powinna rzeczywiście obowiązywać i nie jest potrzebna żadna dodatkowa bariera. – Eugene

-1

Instrukcja xchg ma domyślny prefiks blokady zgodnie z instrukcjami Intel.

Powiązane problemy