Co oznacza użycie jawnego ogrodzenia pamięci?
źródło
Aby zwiększyć wydajność, nowoczesne procesory często wykonują instrukcje poza kolejnością, aby maksymalnie wykorzystać dostępny układ scalony (w tym odczyt / zapis pamięci). Ponieważ sprzęt wymusza integralność instrukcji, nigdy nie zauważysz tego w pojedynczym wątku wykonania. Jednak w przypadku wielu wątków lub środowisk z pamięcią ulotną (na przykład mapowane w pamięci operacje we / wy) może to prowadzić do nieprzewidywalnego zachowania.
Ogrodzenie / bariera pamięci to klasa instrukcji, które oznaczają, że odczytywanie / zapisywanie pamięci odbywa się w oczekiwanej kolejności. Na przykład „pełne ogrodzenie” oznacza, że wszystkie odczyty / zapisy przed ogrodzeniem są zakończone przed tymi za ogrodzeniem.
Uwaga: ogrodzenia pamięci to koncepcja sprzętowa. W językach wyższego poziomu jesteśmy przyzwyczajeni do radzenia sobie z muteksami i semaforami - można je z powodzeniem zaimplementować za pomocą ogniw pamięciowych na niskim poziomie i jawne stosowanie barier pamięci nie jest konieczne. Korzystanie z barier pamięci wymaga dokładnego zbadania architektury sprzętowej i częściej występuje w sterownikach urządzeń niż w kodzie aplikacji.
Zmiana kolejności procesora różni się od optymalizacji kompilatora - chociaż artefakty mogą być podobne. Musisz podjąć osobne kroki, aby zatrzymać zmianę kolejności twoich instrukcji przez kompilator, jeśli może to spowodować niepożądane zachowanie (np. Użycie słowa kluczowego volatile w C).
Kopiowanie mojej odpowiedzi na inne pytanie: Jakie sztuczki robi procesor, aby zoptymalizować kod? :
źródło
Alpha is known for being the weakest
, dlaczegoweakest
? Czy nie lepiej, że będzie zmieniał kolejność więcej, dzięki czemu będzie znacznie szybsza realizacja? (Nie jestem użytkownikiem alfa, ale pytam o efektvery reordering
vsrestricted reordering
). Jakie są więc wady zmiany kolejności partii (z wyjątkiem ryzyka nieokreślonego zachowania, ale myślę, że większość nowoczesnych procesorów powinna była rozwiązać dobry sposób zmiany kolejności i zaimplementować tylko zdefiniowaną zmianę kolejności, w przeciwnym razie nie miałoby to sensu).Z mojego doświadczenia wynika, że odnosi się to do bariery pamięci , która jest instrukcją (jawną lub niejawną) synchronizowania dostępu do pamięci między wieloma wątkami.
Problem występuje w połączeniu nowoczesnych, agresywnych kompilatorów (mają niesamowitą swobodę zmiany kolejności instrukcji, ale zwykle nic nie wiedzą o twoich wątkach) i nowoczesnych procesorów wielordzeniowych.
Dobrym wprowadzeniem do problemu jest „Deklaracja „ Podwójnie sprawdzone blokowanie jest uszkodzone ” ”. Dla wielu był to sygnał ostrzegawczy, że są smoki.
Niejawne bariery pełnej pamięci są zwykle zawarte w procedurach synchronizacji wątków platformy, które obejmują jej rdzeń. Jednak do programowania bez zamków i wdrażania niestandardowych, lekkich wzorców synchronizacji często potrzebujesz tylko bariery lub nawet bariery jednokierunkowej.
źródło
Wikipedia wie wszystko ...
źródło