Programowanie równoległe #1

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

# Programowanie równoległe #1

Sun
07
Dec 2008

Programowanie równoległe to w czasach wielordzeniowych procesorów ważna sprawa i warto zainwestować w naukę tej dziedziny. Jakich konkretnie rzeczy można użyć, żeby coś mogło się wykonywać równolegle do głównego kodu programu? Opcji jest bardzo wiele. Postanowiłem zebrać je do kupy.

Zacząć można od czegoś prostego, co nie wymaga od nas tworzenia nowych wątków. Równolegle pracują niektóre biblioteki, np. DirectX wykonując polecenia na karcie graficznej w swoim tempie albo FMOD odtwarzając muzykę w tle. Ponadto w sposób asynchroniczny (nieblokujący) mogą działać gniazda sieciowe (Socket) oraz systemowe wejście/wyjście, np. odczytywanie i zapisywanie plików (Overlapped I/O).

Wykonywać jakąś pracę równolegle mogą osobne procesy (Process). W WinAPI nie ma wprawdzie funkcji fork, ale można odpalić nowy proces funkcją CreateProcess. Procesy mogą komunikować się na różne sposoby, np. przez przechwytywanie swojego konsolowego wejścia-wyjścia, przez sockety, Named Pipe, RPC, Shared Memory albo przez specjalne biblioteki, jak MPI.

Najczęściej najlepszy sposób na zrównoleglenie programu to tworzenie nowych wątków (ang. Thread) w ramach jednego procesu. Wątki współdzielą pamięć programu i inne jego zasoby. Pozostaje problem synchronizacji, który rozwiązuje się za pomocą dostępnych w systemie obiektów synchronizujących. W Windows są to m.in.: sekcje krytyczne (Critical Section), muteksy (Mutex), semafory (Semaphore) i zdarzenia (Event).

Windows Vista dodaje nowe przydatne obiekty, jak zmienna warunkowa (Condition Variable), jednokrotna inicjalizacja (One-Time Initialization) czy Reader/Writer Lock (SRW) - ale kto ograniczałby dla nich swój program tylko do porażkowego Windowsa Vista? :)

Linuksowy interfejs pthreads ma inne obiekty synchronizujące - muteksy, zmienne warunkowe, semafory. Swoją drogą, nie wiem jak linuksowcy radzą sobie bez czekania na wiele obiektów na raz, tak jak w WinAPI robi się to funkcją WaitForMultipleObjects.

Do programowania wielowątkowego można też używać nie API systemowego, ale dodatkowych bibliotek. Wieloplatformową nakładką na interfejs wątków jest np. Boost.Thread. Programowanie równoległe na wyższym poziomie zapewnia darmowa biblioteka Intel Threading Building Blocks. Ciekawą opcją jest też OpenMP, którego stosowanie polega na wpisywaniu dykrektyw #pragma omp. Niestety, wspierają go tylko niektóre kompilatory, np. Visual C++ wyłącznie w wersji Professional i Team System.

Idąc dalej, ciekawe są też funkcje z grupy Interlocked, bariery pamięciowe (Memory Barrier) oraz algorytmy lock-free. Ale to już temat na osobną notkę... W komentarzach możecie wpisywać, czego jeszcze warto się uczyć w tej dziedzinie i skąd najlepiej się tego uczyć.

Comments | #algorithms Share

Comments

STAT NO AD
[Stat] [STAT NO AD] [Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2019