Łatwo jest ustawić barierę pamięci po stronie jądra: makra mb, wmb, rmb itp. Są zawsze na miejscu dzięki nagłówkom jądra systemu Linux.Bariery pamięci w przestrzeni użytkownika? (Linux, x86-64)
Jak to osiągnąć po stronie użytkownika?
Łatwo jest ustawić barierę pamięci po stronie jądra: makra mb, wmb, rmb itp. Są zawsze na miejscu dzięki nagłówkom jądra systemu Linux.Bariery pamięci w przestrzeni użytkownika? (Linux, x86-64)
Jak to osiągnąć po stronie użytkownika?
Szukacie atomowych wbudowanych gcc full memory barrier.
Uwaga szczegółów na odniesienie dałem tutaj mówi
[następującego] builtins mają być zgodne z zasadami opisanymi w Intel Itanium procesorowa konkretnego zastosowania Binary Interfejs sekcja 7.4 . W związku z tym odbiegają od normalnej praktyki GCC używania prefiksu "__builtin_", a ponadto są przeciążone, tak że działają na wielu typach.
Posix defines a number of functions działa jako bariera pamięci. Lokalizacja pamięci nie może być współbieżnie używana; Aby temu zapobiec, używaj synchronizacji - i ta synchronizacja będzie również działała jako bariera.
Synchronizacja nie jest potrzebna, gdy wszystko, czego potrzebujemy, to blokada i czekanie wolnej kolejki jednego pisarza/jednego czytnika. Biblioteki POSIX nie udostępniają operacji Mfence/lfence/sfence AFAIK. –
Nie prosiłeś o operację bez blokady; prosiłeś o bariery pamięci w przestrzeni użytkownika. POSIX je ma; nazywane są one "pthread_mutex_lock", "pthread_mutex_unlock" itp. Możesz nie lubić modelu za nimi, ale to * jest * oficjalną odpowiedzią na twoje pytanie. –
Linux x64 oznacza, że można używać instrukcji zapory pamięci Intel. Można owinąć je w makr podobnych do tych, w nagłówkach Linux, jeśli te makra nie są odpowiednie lub dostępne do kodu
Myślę, że to jest najlepsza opcja. Główną wadą jest wymagana konserwacja odrębnych kompilatorów i procesorów przeszłych/przyszłych/innych niż Intel. –
Więc czego chcesz? Nie podoba ci się rozwiązanie przenośne i nie podoba ci się ten, który jest specyficzny dla procesora. –
W include/arch/qatomic_*.h
nagłówki ostatnich dystrybucji Qt include (LGPL) kod na wielu architekturach i wszelkiego rodzaju bariery pamięciowe (nabycie, wydanie, oba).
__sync_synchronize()
w GCC 4.4+
Pamięć Intel zamawiania Białą Księgę, sekcję z 3A Volume Intel 64 i IA-32 ręcznej http://developer.intel.com/Assets/PDF/manual/253668.pdf
Qprof profilowania biblioteki (nic wspólnego z Qt) również zawiera w swoim kodzie źródłowym bibliotekę operacji atomowych, w tym barier pamięci. Pracują na wielu kompilatorach i architekturach. Używam go w moim projekcie.
Stosować libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
Nie jest to specyficzne dla kompilatora i mniej błędne niż rzeczy GCC. To nie jest gigantyczna biblioteka, która zapewnia mnóstwo funkcji, których nie obchodzi. Po prostu zapewnia operacje atomowe. Ponadto jest przenośny dla różnych architektur procesorów.
Po prostu zapożyczając bariery zdefiniowane dla jądra Linuksa, po prostu dodaj te makra do pliku nagłówkowego: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21. I oczywiście dać programistom Linuksa kredyt w twoim kodzie źródłowym.
Nie jestem zbyt obeznany z tym tematem. Czy jest to funkcja specyficzna dla procesora? (Ponieważ twój przykład to Itanium ...) –
Ogólnie rzecz biorąc, użytkownicy nie powinni korzystać z funkcji specyficznej dla platformy i kompilatora, gdy istnieją standardowe, międzyplatformowe mechanizmy osiągnięcia tego samego efektu. To, czego naprawdę potrzebuje emg-2, to użycie biblioteki wątków POSIX (pthreads). –
@Michael, Całkowicie zgadzam się z twoją opinią. To jest powód wyróżniania notatek specyficznych dla platformy. – nik