Jak zaprogramować przydział wątków na procesorach wielordzeniowych?

13

Chciałbym eksperymentować z wątkami na procesorze wielordzeniowym, np. Aby stworzyć program, który wykorzystuje dwa różne wątki, które są wykonywane przez dwa różne rdzenie procesora.

Jednak nie jest dla mnie jasne, na jakim poziomie wątki są przydzielane do różnych rdzeni. Mogę sobie wyobrazić następujące scenariusze (w zależności od systemu operacyjnego i implementacji języka programowania):

  1. Przydziałem wątków zarządza system operacyjny. Wątki są tworzone przy użyciu wywołań systemowych systemu operacyjnego, a jeśli proces zostanie uruchomiony na procesorze wielordzeniowym, system operacyjny automatycznie spróbuje przydzielić / zaplanować różne wątki na różnych rdzeniach.
  2. Przydziałem wątków zarządza implementacja języka programowania. Przydzielanie wątków do różnych rdzeni wymaga specjalnych wywołań systemowych, ale biblioteki wątków standardowych języków programowania automatycznie obsługują to, gdy używam standardowej implementacji wątków dla tego języka.
  3. Przydział wątków musi być wyraźnie zaprogramowany. W moim programie muszę napisać wyraźny kod, aby wykryć, ile rdzeni jest dostępnych, i przydzielić różne wątki do różnych rdzeni za pomocą np. Funkcji bibliotecznych.

Aby sprecyzować pytanie, wyobraź sobie, że napisałem moją wielowątkową aplikację w Javie lub C ++ na Windows lub Linux. Czy moja aplikacja w magiczny sposób zobaczy i użyje wielu rdzeni po uruchomieniu na procesorze wielordzeniowym (ponieważ wszystko jest zarządzane albo przez system operacyjny, albo przez standardową bibliotekę wątków), czy też muszę zmodyfikować kod, aby był świadomy wielu rdzeni ?

Giorgio
źródło

Odpowiedzi:

11

Czy moja aplikacja w magiczny sposób zobaczy i użyje wielu rdzeni po uruchomieniu na procesorze wielordzeniowym (ponieważ wszystko jest zarządzane albo przez system operacyjny, albo przez standardową bibliotekę wątków), czy też muszę zmodyfikować kod, aby był świadomy wielu rdzeni ?

Prosta odpowiedź: tak, zwykle będzie zarządzany przez system operacyjny lub bibliotekę wątków.

Podsystem wątków w systemie operacyjnym przydzieli wątki procesorom na zasadzie priorytetu (opcja 1). Innymi słowy, gdy wątek zakończy wykonywanie alokacji czasu lub bloków, program planujący szuka następnego wątku o najwyższym priorytecie i przypisuje go do procesora. Szczegóły różnią się w zależności od systemu operacyjnego.

To powiedziawszy, istnieją opcje 2 (zarządzane przez język programowania) i 3 (jawnie). Na przykład biblioteka Zadań i funkcja async / czekają w najnowszych wersjach .Net dają programistom znacznie łatwiejszy sposób na pisanie kodu równoległego (tzn. Który może być uruchamiany jednocześnie z samym sobą). Funkcjonalne języki programowania są z natury równoległe, a niektóre środowiska wykonawcze będą uruchamiały równolegle różne części programu, jeśli to możliwe.

Jeśli chodzi o opcję 3 (jawnie), system Windows pozwala ustawić koligację wątku (określając, na których procesorach wątek może działać). Jest to jednak zwykle niepotrzebne we wszystkich systemach z wyjątkiem najszybszych o krytycznym czasie odpowiedzi. Efektywny przydział wątków do procesorów zależy w dużym stopniu od sprzętu i jest bardzo wrażliwy na inne aplikacje działające jednocześnie.

Jeśli chcesz eksperymentować, utwórz długotrwałe, wymagające procesora zadanie, takie jak wygenerowanie listy liczb pierwszych lub utworzenie zestawu Mandelbrota. Teraz utwórz dwa wątki w swojej ulubionej bibliotece i uruchom oba wątki na komputerze wieloprocesorowym (innymi słowy, prawie wszystko, co wydano w ciągu ostatnich kilku lat). Oba zadania powinny zostać wykonane mniej więcej w tym samym czasie, ponieważ są uruchamiane równolegle.

akton
źródło
Dzięki za wyjaśnienie (+1). Mój program testowy jest implementacją sortowania według scalania. W fazie podziału chcę tworzyć różne wątki, o ile dostępne są rdzenie. Np. Przy dwóch rdzeniach każda połowa tablicy zostałaby posortowana według innego wątku / rdzenia. Podczas łączenia zbędne wątki byłyby następnie łączone / kończone.
Giorgio
Sortowanie jest trudne do zrównoleglenia w ten sposób, jeśli dane są dystrybuowane losowo. Tak, możesz to rozbić, a następnie posortować każdą porcję w innym wątku, ale ostatecznie i tak musisz scalić wszystkie porcje. Jeśli wątki współużytkują struktury danych, możesz również mieć problemy z rywalizacją lub blokowaniem. Nie twierdzę, że sortowanie nie może skorzystać z wątków, ale nie będzie to liniowa poprawa wydajności.
akton
Dwie połówki tablicy można sortować niezależnie, ponieważ żadne dane nie są udostępniane. Tylko pierwszy podział i ostatnie scalenie będą musiały zostać wykonane przez jeden wątek manipulujący całą tablicą lub listą zawierającą dane. Oznacza to, że jednego pełnego skanowania danych nie można wykonać równolegle; wszystkie pozostałe skany mogą.
Giorgio
Oczywiście uważam również twoje przykłady za dobrych kandydatów. W tej chwili jestem bardziej zaznajomiony z sortowaniem korespondencji seryjnej (i zaimplementowałem jego nierównoległą wersję), co (być może) sprawi, że sortowanie korespondencji seryjnej będzie dla mnie bardziej odpowiednie jako pierwsza próba.
Giorgio
2
Dodałbym do tej odpowiedzi, że dobre systemy operacyjne są wystarczająco inteligentne, aby zrównoważyć koszty przydzielenia zadaniu odcinka czasu na innym procesorze lub rdzeniu z krótkoterminowym głodem. W przypadku architektur, w których ma to znaczenie, wynik przypomina raczej powinowactwo automagiczne. System operacyjny został zbudowany w taki sposób, aby wszystkie zadania przebiegały tak szybko, jak to możliwe, i możesz strzelać sobie w stopę, wiążąc wątki z rdzeniami i ograniczając jego zdolność do podejmowania tych decyzji.
Blrfl
-1

Kiedyś miałem ogromne środowisko SGI IRIX. Na wszelki wypadek napisałem mały wielowątkowy program Java (który po prostu zużywał tylko cykle procesora) i utworzyłem w nim 12 wątków. Zadanie obejmowało 12 procesorów w architekturze NUMA. Być może sprawdzę program i uruchomię go na Dell R910s i sprawdzę ...

P. Prabhakar
źródło
3
Ta odpowiedź naprawdę nie dodaje wiele do istniejącej odpowiedzi. Być może, jeśli zastanowiłeś się, dlaczego JVM w systemie SGI przydzieliła wątki rdzeniu ...
Jay Elston