2009-07-26 11 views

Odpowiedz

5

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.

+0

Nie jestem zbyt obeznany z tym tematem. Czy jest to funkcja specyficzna dla procesora? (Ponieważ twój przykład to Itanium ...) –

+0

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). –

+0

@Michael, Całkowicie zgadzam się z twoją opinią. To jest powód wyróżniania notatek specyficznych dla platformy. – nik

7

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.

+1

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. –

+2

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. –

2

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

+0

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. –

+0

Więc czego chcesz? Nie podoba ci się rozwiązanie przenośne i nie podoba ci się ten, który jest specyficzny dla procesora. –

0

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).

4

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.