6

Zgodnie z this pytanie odpowiedź wydaje się, że LOCK CMPXCHG na x86 faktycznie powoduje pełną barierę. Można przypuszczać, że to właśnie pod maską generuje się Unsafe.compareAndSwapInt(). Staram się dowiedzieć, dlaczego tak jest: z protokołem MESI, po aktualizacji linii pamięci podręcznej, czy procesor może po prostu unieważnić tylko tę linię pamięci podręcznej na innych rdzeniach, zamiast dezaktywować WSZYSTKIE bufory magazynu/obciążenia rdzenia, który wykonał CAS? Wydaje mi się, że jest to marnotrawstwem ...Porównaj i zamień na x86 - dlaczego jest to pełna bariera?

+0

Przy pełnej barierze wypłukasz wszystkie pominięte zmiany prognoz, zamiast jednej linii pamięci podręcznej, więc czy nie byłoby gorzej z pełną barierą? Ale oczywiście brakuje mi tutaj :) – Bober02

+0

[Porównaj i zamień] (https://en.wikipedia.org/wiki/Compare-and-swap) na Wikipedii to obejmuje, * Porównuje zawartość lokalizacji pamięci do podanej wartości i, tylko jeśli są takie same, modyfikuje zawartość tej lokalizacji pamięci na nową podaną wartość. Odbywa się to jako pojedyncza operacja atomowa. Atomowość gwarantuje, że nowa wartość jest obliczana na podstawie aktualnych informacji; jeżeli w międzyczasie wartość zostałaby zaktualizowana przez inny wątek, zapis byłby nieudany. * Bez pełnej bariery może zostać przerwana (lub w inny sposób zaktualizowana) i może to unieważnić atomikę. –

Odpowiedz

1

Twoja odpowiedź, o ile widzę, jest w komentarzach - pamięci podręczne aktualizacji MESI, a nie Store/Load buffers. Ale blokada LOCK CMPXCHG mówi: locked operations serialize all outstanding load and store operation - to dlatego należy opróżnić bufor Store/Load z tego CPU (a nie inne, jak szczegółowe here).

Obecny procesor musi wykonać operację atomową na najnowszej wartości - która może znajdować się w buforze Store/Load, dlatego konieczne jest ogrodzenie, aby faktycznie ją spuścić.

+0

Dostaję! musimy wyładować żartobliwie, że wymienimy linię pamięci podręcznej, fajnie! Jeszcze jedno - czy pełna bariera mem rzeczywiście powoduje, że inne bufory pamięci procesora mają być przepłukiwane w ? Lub tylko ten, na którym działa wątek? Innymi słowy, miałem wrażenie, że oczekujące zmiany z innych procesorów są w buforze obciążenia mojego procesora, więc bariera mem po prostu spuszcza te – Bober02

+0

@ Bober02 Naprawdę zaktualizowałem odpowiedź, aby uczynić to nieco jaśniejszym - zgodnie z moim rozumieniem. – Eugene