2012-04-13 16 views
6

Kiedy różne zmienne są wewnątrz tej samej linii pamięci podręcznej, można doświadczyć False Sharing, co oznacza, że ​​nawet jeśli dwa różne wątki (działających na różnych rdzeni) uzyskują dostęp do dwóch różnych zmiennych, jeśli te dwie zmienne przebywania w ta sama linia pamięci podręcznej, osiągniesz wydajność, ponieważ za każdym razem, gdy zostanie uruchomiona koherencja pamięci podręcznej.Fałsz Udostępnianie i Zmienne atomowe

Teraz powiedzmy, że zmienne są zmiennymi atomowymi (według atomów mam na myśli zmienne, które wprowadzają ogrodzenie pamięci, takie jak atomic<t> C++), będzie tam fałszywe dzielenie się materią, lub nie ma znaczenia, czy zmienne atomowe są w tej samej pamięci podręcznej linia, czy nie, jakkolwiek podobno i tak wprowadzą koherencję pamięci podręcznej. Innymi słowy, czy umieszczenie zmiennych atomowych w tej samej linii pamięci podręcznej spowoduje, że aplikacja będzie wolniejsza niż nie umieszczanie ich w tej samej linii pamięci podręcznej?

Odpowiedz

5

Wyjaśnienie: na negatywne konsekwencje przynajmniej niektóre dostęp do „fałszywie” współdzielone zmienne powinny być zapisy. Jeśli zapisy są rzadkie, wpływ fałszywego udostępniania na wydajność jest raczej znikomy; im więcej zapisów (i tym samym komunikatów unieważniających pamięć podręczną), tym gorsza wydajność.

Nawet atomistyki, dzielenie linii pamięci podręcznej (albo fałszywe lub prawdziwe) wciąż liczy. Poszukaj tutaj kilku dowodów: http://www.1024cores.net/home/lock-free-algorithms/first-things-first. Tak więc odpowiedź brzmi - tak, umieszczenie zmiennych atomowych używanych przez różne wątki na tej samej linii pamięci podręcznej może spowodować spowolnienie aplikacji w porównaniu do umieszczenia jej na dwóch różnych liniach. Myślę jednak, że będzie to w większości przypadków niezauważone, chyba że aplikacja poświęci znaczną część czasu na aktualizację tych zmiennych atomowych.

0

wprowadzenie zmiennych atomowych w tej samej linii pamięci podręcznej spowoduje, że aplikacja będzie wolniejsza niż nie umieszczanie jej w tej samej linii pamięci podręcznej?

Fałsz dzielenie „atomowych” zmiennych mógł prowadzą do problemów z wydajnością (czy to będzie prowadzić do takich problemów zależy od wielu rzeczy).

Załóżmy, że masz dwa rdzenie: A i B, a każdy z nich działa na własnej zmiennej. Nazwijmy te zmienne odpowiednio: a i b.

A ma a w pamięci podręcznej, a B ma b w pamięci podręcznej.

Zastanów się, co się dzieje, gdy A przyrosty a.

  • jeśli a i b dzielić linię pamięci podręcznej,B „s kopia b dostanie unieważnione, a jego następny dostęp do b poniosą miss cache.
  • jeśli a i b nie podzielają linię pamięci podręcznej, nie ma wpływu na B miarę jego buforowane kopia b jest zaniepokojony.

Dzieje się tak niezależnie od tego, czy a i b są "atomowe".

0

Jeśli użyjesz zmiennych atomowych o najsilniejszych wymaganiach co do spójności, pełna bariera pamięci, efekt fałszywego udostępniania prawdopodobnie nie będzie zauważalny.Dla takiego dostępu wydajność operacji atomowej jest zasadniczo ograniczona przez opóźnienie dostępu do pamięci. A więc i tak wszystko jest wolne, nie sądzę, że w obecności fałszywego współdzielenia byliby znacznie wolniejsi.

Jeśli masz inne, mniej inwazyjne uporządkowanie pamięci, wydajność osiągnięta przez samą atomikę może być mniejsza, więc wpływ fałszywego udostępniania może być znaczący.

W pierwszej kolejności najpierw przyjrzę się działaniu samej operacji atomowej, zanim zacznę się martwić o fałszywe udostępnianie dla takich operacji.

Powiązane problemy