Ilość wątków a szybkość wykonywania programów

0

Cześć. Mam pytanie, czy ilość wątków na których wykonujemy program ma wpływ na szybkość jego wykonania?

0

To zależy od tego co tymi wątkami robisz.

4

czy ilość wątków na których wykonujemy program ma wpływ na szybkość jego wykonania?

Każdy wątek wymaga choćby odrobinę czasu CPU (context switching itd.), stąd prosta droga do tak: liczba uruchomionych wątków ma wpływ (musi mieć wpływ) na szybkość działania programu, ponieważ czas stracony na przetwarzanie wątków nie zostanie wykorzystany na przetwarzanie oryginalnego programu.

Wydaje mi się, że mamy jednak do czynienia z problemem X/Y - co próbujesz osiągnąć / skąd wzięło się Twoje pytanie?

2

Nie jest to taka prosta odpowiedź. Owszem, program da się napisać tak, aby pewne, najlepiej niezależne od siebie, operacje wykonywać równolegle (ot np. w czasie, kiedy użytkownik ogląda jakiś formularz GUI w tle może działać jakieś keszowanie bazy danych) i wówczas program będzie działać zdecydowanie szybciej, ale to trzeba uwzględnić już na etapie projektowania. Z 2 mańki, dopychanie do oporu wątków też nie jest sensownym pomysłem bo nie ma bata, w końcu trzeba będzie wprowadzić jakiś mechanizm synchronizacji i wymiany danych pomiędzy nimi, który to mechanizm może zeżreć więcej czasu, niż potrzebowałby program jednowątkowy; a jako wisienka na torcie - debugowanie programów wielowątkowych gdzie występują losowo wyścigi, zakleszczenia, zapisy/odczyty na huraa to sama "radość".

2
Sumekprog napisał(a):

Cześć. Mam pytanie, czy ilość wątków na których wykonujemy program ma wpływ na szybkość jego wykonania?

Tak, ma zasadniczy wpływ.
Zwykle szybkość ta jest inna dla jednego wątku a inna dla wielu.
Wpływ może być pozytywny lub negatywny.
Pozytywny najszybciej zauważysz gdy masz problem typu Embarrassingly parallel.
Negatywny gdy np. każdy z wątków walczy o ten sam (lub ograniczony) zasób - np. baza danych czy HDD.
Zobacz jeszcze: https://en.wikipedia.org/wiki/Amdahl%27s_law

0

Dzięki za odpowiedzi, sprecyzuje je jednak.
Chciałbym zbadać przy pomocy JMH szybkość uzupełniania tablicy elementami na 1 oraz 4 wątkach.

2

Wielowątkowość pomaga przy problemach, które są CPU-bound (np. raytracing) - podany przez Ciebie problem na 95% będzie memory-bound (tzn. bottleneckiem będzie RAM, a nie CPU), stąd więcej wątków prawdopodobnie pogorszy wydajność (w związku z koniecznością synchronizacji dostępu do pamięci).

Tym niemniej oczywiście jako eksperyment warto coś takiego przeprowadzić :-)

4

To jeszcze zależy, w jaki sposób podzielisz zadanie dla wątków ;)

Na CPU jeśli każdy wątek będzie operował na odrębnym bloku danych, to jeszcze istnieje szansa że coś ugrasz. Jak dane będą przypisane cyklicznie, to prawdopodobnie będziesz tylko tracił na zrównoleglaniu, bo nawet jeśli nie będzie wyścigu z punktu widzenia programu, to mogą wyniknąć problemy związane z utrzymaniem spójności cache poszczególnych procesorów/rdzeni - bo oba będą miały zmodyfikowaną linijkę cache, którą będą chciały przerzucić do RAM no i co wtedy? Procesory muszą jakoś się zabezpieczać przed takimi sytuacjami, a to kosztuje ;)

Żeby było śmieszniej, na GPU jest odwrotnie. Masz sprzęt masowo równoległy i najlepiej sobie radzi, gdy kolejne wątki w ramach jednego wavefront obrabiają kolejne dane - wtedy możliwe jest maksymalnie efektywne wykorzystanie pamięci, w przypadku podziału blokowego prawdopodobnie zamordowałbyś wydajność :)

0

@Sumekprog: przewaznie ma. Ale jaki to jest wplyw to juz zalezy od tego jak jest aplikacja zrobia, jak jest robiona synchronizacja, czy nie ma deadlockow/livelockow itp. W szczegolnych przypadkach aplikacja z wieloma watkami moze byc wolniejsza, ot. system do glosowania ktory sie zapchal bo ich bylo za duzo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1