Jaka jest różnica między atomic a critical w OpenMP?

Jaka jest różnica między atomic a critical w OpenMP?

I can do this

#pragma omp atomic
g_qCount++;

Ale czy to nie to samo co

#pragma omp critical
g_qCount++;

?

Author: Benjamin Christoffersen, 2011-10-17

8 answers

Wpływ na g_qCount jest taki sam, ale to, co się robi, jest inne.

Sekcja krytyczna OpenMP jest całkowicie ogólna - może otaczać dowolny dowolny blok kodu. Płacisz jednak za tę ogólność, ponosząc znaczne koszty za każdym razem, gdy wątek wchodzi i wychodzi z sekcji krytycznej (oprócz nieodłącznego kosztu serializacji).

(DODATKOWO w OpenMP wszystkie nienazwane sekcje krytyczne są uważane za identyczne (jeśli wolisz, jest tylko jedna blokada dla wszystkich jeśli jeden wątek znajduje się w jednej [nienazwanej] sekcji krytycznej, jak powyżej, żaden wątek nie może wejść do żadnej [nienazwanej] sekcji krytycznej. Jak można się domyślić, można to obejść za pomocą nazwanych sekcji krytycznych).

Operacja atomowa ma znacznie niższe koszty. Jeśli jest dostępny, wykorzystuje sprzęt zapewniający (powiedzmy) operację przyrostu atomowego; w takim przypadku nie jest wymagana blokada/odblokowanie przy wprowadzaniu / wychodzeniu z linii kodu, po prostu robi atomową operację przyrost, którego sprzęt mówi, że nie można ingerować.

Upsides jest to, że narzut jest znacznie niższy, a jeden wątek będący w operacji atomowej nie blokuje żadnych (różnych) operacji atomowych, które mają się wydarzyć. Minusem jest ograniczony zestaw operacji, które Atomic obsługuje.

Oczywiście, w obu przypadkach ponosisz koszty serializacji.

 150
Author: Jonathan Dursi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 14:06:40

W OpenMP wszystkie nienazwane sekcje krytyczne wzajemnie się wykluczają.

Najważniejszą różnicą między critical a atomic jest to, że atomic może chronić tylko jedno zadanie i można go używać z określonymi operatorami.

 24
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 23:29:15

Sekcja krytyczna:

  • zapewnia serializację bloków kodu.
  • Można rozszerzyć o szeregowe grupy bloków z odpowiednim użyciem tagu "name".

  • Wolniej!

Operacja atomowa:

  • Jest o wiele szybszy!

  • Zapewnia jedynie serializację określonej operacji.

 14
Author: efarsarakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-23 02:41:51

Najszybsza droga nie jest ani krytyczna, ani atomowa. W przybliżeniu dodawanie z sekcją krytyczną jest 200 razy droższe niż dodawanie proste, dodawanie atomowe jest 25 razy droższe niż dodawanie proste.

Najszybszą opcją (nie zawsze obowiązującą) jest nadanie każdemu wątkowi własnego licznika i wykonanie operacji zmniejszania, gdy potrzebna jest suma całkowita.

 6
Author: Andrii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-26 14:39:29

Ograniczenia atomic są ważne. Powinny być wyszczególnione w specyfikacji OpenMP . MSDN oferuje szybki ściągacz, ponieważ nie zdziwiłbym się, gdyby to się nie zmieniło. (Visual Studio 2012 ma implementację OpenMP od marca 2002 roku. Cytuję MSDN:

Wyrażenie musi mieć jedną z następujących form:

xbinop=expr

x++

++x

x--

--x

W wyrażeniach poprzedzających: x jest wyrażeniem lvalue z typem skalarnym. {[2] } jest wyrażeniem typu scalar i nie odwołuje się do obiektu wyznaczonego przez x. binop nie jest operatorem przeciążonym i jest jednym z +, *, -, /, &, ^, |, <<, lub >>.

Zalecam użycie atomic, gdy możesz i nazwanych sekcji krytycznych inaczej. Nazywanie ich jest ważne, unikniesz debugowanie w ten sposób.

 4
Author: pelesl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 19:31:22

Już tutaj świetne wyjaśnienia. Możemy jednak zanurkować nieco głębiej. Aby zrozumieć podstawową różnicę pomiędzy koncepcjami atomic i critical section W OpenMP, musimy najpierw zrozumieć koncepcję lock . Przyjrzyjmy się dlaczego musimy używać zamków .

Program równoległy jest wykonywany przez wiele wątków. Deterministyczne wyniki będą miały miejsce wtedy i tylko wtedy, gdy wykonamy synchronizację pomiędzy tymi wątkami. Oczywiście., synchronizacja między wątkami nie zawsze jest wymagana. Odnosimy się do tych przypadków, któresynchronizacja jest konieczna.

Aby zsynchronizować wątki w programie wielowątkowym, użyjemy lock . Gdy dostęp musi być ograniczony tylko przez jeden wątek na raz, w grę wchodzą blokady. Implementacja koncepcji lock może się różnić w zależności od procesora. Przekonajmy się, jak może działać prosty zamek z algorytmicznego punktu widzenia.

1. Define a variable called lock.
2. For each thread:
   2.1. Read the lock.
   2.2. If lock == 0, lock = 1 and goto 3    // Try to grab the lock
       Else goto 2.1    // Wait until the lock is released
3. Do something...
4. lock = 0    // Release the lock

Dany algorytm może być zaimplementowany w języku sprzętowym w następujący sposób. Założymy pojedynczy procesor i przeanalizujemy zachowanie zamków w tym. Dla tej praktyki Załóżmy, że jeden z następujących procesorów: MIPS, Alfa, ARM lub Power.

try:    LW R1, lock
        BNEZ R1, try
        ADDI R1, R1, #1
        SW R1, lock

Ten program wydaje się być w porządku, ale tak nie jest. Powyższy kod cierpi na poprzedni problem; synchronizacja . Let ' s znajdź problem. Przyjmij wartość początkową lock na zero. Jeśli dwa wątki uruchamiają ten kod, jeden może dotrzeć do SW R1, lock, zanim drugi odczyta zmienną lock. Tak więc obaj myślą, że Blokada jest wolna. Aby rozwiązać ten problem, dostarczono inną instrukcję, a nie proste LW i SW . Jest to Instrukcja read-Modify-Write. Jest to złożona Instrukcja (składająca się z podinstrukcji), która zapewnia przejęcie blokady procedura jest wykonywana tylko przez pojedynczy wątek na raz. Răłĺźnica Read-Modify-Write w porăłwnaniu do prostych instrukcji Read i Write polega na tym, Ĺźe uĹźywa ona róşnego sposobu wczytywania i przechowywania. Używa LL(Load Linked) do załadowania zmiennej lock i SC(Store Conditional) do zapisu do zmiennej lock. Dodatkowy rejestr linków służy do zapewnienia procedury blokady akwizycja odbywa się za pomocą jednego wątku. Algorytm podano poniżej.

1. Define a variable called lock.
2. For each thread:
   2.1. Read the lock and put the address of lock variable inside the Link Register.
   2.2. If (lock == 0) and (&lock == Link Register), lock = 1 and reset the Link Register then goto 3    // Try to grab the lock
       Else goto 2.1    // Wait until the lock is released
3. Do something...
4. lock = 0    // Release the lock

Po zresetowaniu rejestru linków, jeśli inny wątek zakłada, że blokada jest wolna, nie będzie mógł ponownie zapisać zwiększonej wartości do blokady. W ten sposób uzyskuje się współbieżność dostępu do zmiennej lock .

Podstawowa różnica między krytycznym a atomowym wynika z idei, że:

Dlaczego używać locks (nowej zmiennej), gdy możemy użyć zmienna rzeczywista (którą wykonujemy na niej operację), jako zmienna lock?

Użycie nowej zmiennej dla locks doprowadzi do sekcji krytycznej, podczas gdy użycie rzeczywistej zmiennej jako blokady doprowadzi do atomowej koncepcji. Sekcja krytyczna jest przydatna, gdy wykonujemy wiele obliczeń (więcej niż jedną linię) na rzeczywistej zmiennej. To dlatego, że jeśli wynik tych obliczeń nie zostanie zapisany na zmienna rzeczywista, cała procedura powinna być powtórzona w celu obliczenia wyników. Może to prowadzić do słabej wydajności w porównaniu z oczekiwaniem na zwolnienie blokady przed wejściem do regionu o wysokiej wydajności obliczeniowej. Dlatego zaleca się stosowanie dyrektywy atomic , gdy chcemy wykonać pojedyncze obliczenia (x++, X--, ++x, --x, itd.) i używać dyrektywy critical, gdy w sekcji intensywnej wykonuje się bardziej skomplikowany obliczeniowo region.

 1
Author: hexpheus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 08:13:06

Atomic jest stosunkowo wydajny, gdy trzeba włączyć wzajemne wykluczenie tylko dla jednej instrukcji podobne nie jest prawda o OMP krytyczne.

 -4
Author: Mahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 07:54:24

Atomic jest sekcją krytyczną pojedynczej instrukcji, tzn. blokujesz wykonanie jednej instrukcji

Sekcja krytyczna to blokada na bloku kodu

Dobry kompilator przetłumaczy twój drugi kod tak samo jak pierwszy

 -4
Author: Wissam Y. Khalil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 17:17:04