Jaki wpływ na wydajność ma programowanie współbieżne

Dzisiaj kilka rozważań na temat korzyści płynących z wielowątkowości. Zastanówmy się, jak  bardzo może nam pomóc albo zaszkodzić wprowadzenie nowych wątków w aplikacji.

Jeśli wykonanie danej pracy na jednym procesorze zajmuje T(1) a wykonanie jej na n procesorach zajmuje T(n) wtedy możemy oszacować korzyści płynące z nowych wątków.

W przypadku gdy T(1)/T(n) daje wynik <1 wtedy mamy do czynienia z powolnieniem – im więcej wątków wprowadzamy tym wolniejszy algorytm otrzymujemy. Oczywiście w takim scenariuszu nie ma sensu wprowadzać dodatkowych wątków. Niektóre rzeczy muszą zostać po prostu wykonane sekwencyjne ze względu na swoją specyfikę – np. dalsze obliczenia bazują na poprzednich.

Dużo częściej w praktyce mamy do czynienia gdy T(1)/T(n) < n. Oznacza to, że gdy praca na jednym rdzeniu zajęła 5 sekund, wtedy na 5 rdzeniach zajmie np. 1.2 sekundy. Czyli wydajność ma charakter subliniowy. Bardzo często spotykamy się z tym ponieważ musimy spędzić trochę czasu na synchronizację między wieloma wątkami. W sortowaniu przez scalanie, niektóre części muszą zostać wykonanie sekwencyjnie (scalanie). Wtedy, wprowadzając 5 nowych wątków, nie przyśpieszymy algorytmu dokładnie o 5 razy.

Jeśli np. problemy są kompletnie od siebie niezależne wtedy mamy szanse uzyskać przyśpieszenie liniowe. Chyba łatwo to zrozumieć. Jak tylko możliwe jest rozdzielenie problemu na kompletnie niezależne podproblemy, wtedy każdy z nich może zostać wykonany równolegle – nie potrzebujemy czasu na kod sekwencyjny. Sytuacja w praktyce dość rzadko spotykana.

Przyśpieszenie podliniowe i liniowe są łatwe w wyobrażeniu. Czy istnieje jednak grupa problemów, w której możemy zyskać nadliniowo? Innymi słowy, jeśli na jednym wątku zadanie zajęło 5 sekund to czy na 5 wątkach możemy to wykonać w mniej niż jedną sekundę?

Do rozwiązania niektórych problemów wątki mogą ze sobą współpracować, aby dostarczyć nadliniowe przyśpieszenie. Wyobraźmy sobie, że przeszukujemy tablicę aby znaleźć element spełniający podane kryteria. Jeśli podzielimy zadanie na kilka wątków to będziemy przeszukiwać różne rejony tablicy jednocześnie. Co jeśli taki element zajmuje się gdzieś na końcu tablicy? W podejściu sekwencyjnym musielibyśmy przeszukać wszystkie elementy a w równoległym ostatni wątek znajdzie wartość bardzo szybko.

Więcej procesorów to również więcej zasobów a konkretniej pamięci podręcznej. Pisałem kilka wpisów wcześniej, że dzisiaj bardzo wielką rolę odgrywa jak korzystamy z pamięci i ile mamy tzw. cache misses.  Wiadomo, że każdy procesor posiada pamięć podręczna a zatem gdy mamy ich więcej to mniej danych musimy przechowywać bezpośrednio w pamięci operacyjnej, która jest dużo wolniejsza.

Leave a Reply

Your email address will not be published.