Dlaczego pojedynczy wątek jest rozłożony na procesory?

24

Jestem tylko ciekawy, dlaczego planista ciągle przenosi aplikację między procesorami, zamiast utrzymywać ją na jednym. Trochę głupio wygląda na 4 rdzenie na 25% zamiast jednego na 100%.

Czy ma to związek z ciepłem, czy też jest bardziej wydajne? Czy inne systemy operacyjne robią to inaczej?

Przydałoby się spostrzeżenie lub linki do szczegółowych informacji. (Nie mogłem wiele znaleźć.)

Aktualizacja:

Przez „rozkładanie” nie mam na myśli, że działa na kilku procesorach naraz, ale jest przenoszony z jednej na drugą kilka razy na sekundę, co powoduje, że wygląda na rozłożony.

Macke
źródło
3
Nawet gdy „nic innego się nie wykonuje”, zawsze są wątki systemowe konkurujące o procesor. Na przykład system operacyjny ma wątek umożliwiający wyzerowanie odzyskanych stron pamięci, więc gdy pamięć jest potrzebna, niektóre strony będą gotowe. Gdy wątek zostanie ponownie uruchomiony, procesor, na którym byłeś, może być używany przez jeden z tych wątków. Co powinien zrobić OS? Poczekaj na to lub przenieś Cię do nowej jednostki centralnej? Cokolwiek to robi, w niektórych przypadkach kończy się to niepożądanym zachowaniem.
Tony Lee
To goomba. SMB, a nie LBP. :)
Macke,
W mojej „odpowiedzi” pokazałem, że program jednowątkowy zachowuje się dokładnie tak, jak to opisujesz, tzn. „Jest przenoszony z jednego do drugiego kilka razy na sekundę, co powoduje, że wygląda na rozłożony”.
Evan Rosica

Odpowiedzi:

8

Myślę, że wierobdość dobrze opisał tę kwestię.
Oto starszy artykuł omawiający processor affinityustawienia z czterordzeniowym QX6800 .
(link wskazuje na drugą stronę tego artykułu).

Jeśli nie narzucasz powinowactwa procesu do rdzenia, tracisz wydajność ?

  • Podczas gdy scheduler systemu Windows musi zdecydować takiego powinowactwa, aby uniknąć bicia ze skrytek, architektura procesora sama uważa również takie rzeczy.
  • Czterordzeniowy procesor Intel QX6800 (ponieważ odsyłam go wcześniej w tej odpowiedzi)
    ma 8 MB L3pamięci podręcznej współdzielonej przez 4 rdzenie .

Należy zauważyć, że chociaż być może zdecydowałeś się uruchomić tylko jeden proces jednowątkowy w systemie, sam system operacyjny miałby uruchomionych kilka innych zadań, które również należy zaplanować. Program planujący równoważy całą tę aktywność w dostępnej puli procesorów (lub rdzeniach).


Idąc dalej, dzięki architekturze Nehalem i NUMA ,
procesory w wielu gniazdach będą również w stanie lepiej rozwiązać problem z dostępem do przepustowości.
Oto krótkie zdjęcie ze strony ArsTechnica na NUMA .

wprowadź opis zdjęcia tutaj

Jeśli Nehalem i7cię interesuje, mam więcej linków do tej odpowiedzi .

nik
źródło
Co sprawia, że ​​myślisz, że „Idąc naprzód, dzięki architekturze Nehalem i NUMA, procesory na wielu gniazdach będą również w stanie lepiej rozwiązać problem thrash dostępu”. ? Moim zdaniem, NUMA sprawia, że ​​pamięć jest jeszcze bardziej związana z lokalnym i konkretnym procesorem, co pogarsza efekty śmieci.
Roland Pihlakas
@RolandPihlakas, minęło trochę czasu od tej odpowiedzi, ale patrząc na artykuł na temat arstechnicy i te kwestie, myślę, że liczyłem na zdolność nowych platform do lepszej łączności z pamięcią i oprogramowania do korzystania z tego (ponad brak tej opcji z wiele konfiguracji gniazd w tym czasie, tj. przed Nehalem).
nik
6

Program planujący po prostu wykonuje następny wątek, który jest gotowy do wykonania na „wolnym” rdzeniu / procesorze.

Możesz przypisać proces do konkretnego procesora za pomocą menedżera zadań Windows.

Posiadanie 4 rdzeni przy 25% oznacza, że ​​4 wątki są wykonywane jednocześnie. Natomiast jeden rdzeń przy x% oznacza, że ​​wykonywany jest tylko jeden wątek. Ten pierwszy jest więc w niektórych przypadkach bardziej wydajny.

Ale podczas jego wykonywania pamięć podręczna procesora jest zapełniana danymi dostępnymi przez wątek. Jeśli wątek zostanie wykonany na innym procesorze, wystąpi więcej braków w pamięci podręcznej, które są kosztowne, ponieważ dane nie znajdują się w pamięci podręcznej tego procesora.

Co robi twój wątek? Jeśli wątek „śpi” przez bardzo krótki czas, rdzeń, na którym był wykonywany, może zostać zajęty przez inne zagrożenie, a tym samym twój wątek zostanie wykonany na następnym dostępnym rdzeniu. Co się stanie, jeśli określisz tylko jeden rdzeń, który ma być używany przez proces (np. Menedżer zadań)?

wierob
źródło
3
afaik harmonogram systemu Windows wykonuje całkiem dobrą robotę utrzymując wątki na tym samym procesorze / rdzeniu przez cały czas jego trwania, aby uniknąć tego problemu.
Paxxi,
@ Pär: Wygląda na to, że mój wątek faktycznie działa na każdym rdzeniu.
Macke,
Tak, to prawdopodobnie procesory systemu operacyjnego podbijają mój wątek. Jak zaakceptować dwie odpowiedzi? :)
Macke,
@ PärBjörklund z mojego doświadczenia przynajmniej Windows XP nie. Myślę, że problem „podskakiwania pamięci podręcznej” został naprawiony w
systemie
1
„Posiadanie 4 rdzeni w 25% oznacza, że ​​4 wątki są wykonywane jednocześnie”. Nie, oznacza to, że jeden wątek jest wykonywany, trochę na jednym rdzeniu, a następnie o innym i tak dalej. Ponieważ Menedżer zadań pokazuje średnie użycie, pokaże 25% (w systemie 4-rdzeniowym, w przypadku dwóch rdzeni pokaże 50%) dla każdego rdzenia. Oznacza to, że rdzeń był w pełni wykorzystany przez ćwierć czasu i pozostawał bezczynny.
David Balažic,
0

To nie jest. Jeden wątek może działać tylko na jednym procesorze. Jednak niektóre procesy mają wiele wątków, które można rozłożyć.

Rozumowanie, wierz lub nie, nigdy nie zastanawiało się, jak to wygląda. System próbuje rozdzielić wątki, ponieważ nie ma sposobu, aby wiedzieć, kiedy nastąpi skok.

tsilb
źródło
1
Zobacz moje dodane wyjaśnienie. Jest to jeden wątek, który działa na pełnych obrotach, który szybko się przemieszcza, dzięki czemu z czasem każdy rdzeń (z przodu) jest zajęty w 25%. (Wszystkie inne procesy / wątki są nieistotne)
Macke,
0

System operacyjny migruje wątek między rdzeniami procesora (szybko, kilka razy na sekundę). Bardziej wydajne jest ciągłe uruchamianie tego samego rdzenia. Można to wymusić za pomocą pozycji menu kontekstowego „Ustaw koligację” w Menedżerze zadań.

Zauważ, że zwykle (typowe zastosowanie domowe) różnica mieści się w przedziale kilku procent.

„4 rdzenie każdy przy zużyciu 25%” oznaczają, jak Menedżer zadań pokazuje średnie użycie, że każdy rdzeń został w pełni wykorzystany przez jedną czwartą czasu i przez resztę czasu był wolny.

Opis dotyczy systemu Windows, ale jest podobny również w innych systemach operacyjnych.

David Balažic
źródło
-1

Jeśli ktoś nadal to czyta, to też to zauważyłem i wykonałem sporo testów, aby sprawdzić, czy to nie tylko przypadek. Okazuje się, że nie! Uważam, że rozłożenie jednego wątku na wszystkie rdzenie jest bardziej wydajne z kilku powodów:

  1. Rozłożenie jednego gwintu na wszystkich rdzeniach pozwala na niższe zużycie energii. Większość procesorów obniża swoje częstotliwości i, co ważniejsze, napięcie w zależności od obciążenia, więc na przykład Quad 2 Core zużywa znacznie mniej energii i wytwarza mniej ciepła, rozprowadzając jeden wątek na wszystkich 4 rdzeniach zamiast używać jednego rdzenia (co by prowadzić do wzrostu napięcia na WSZYSTKICH rdzeniach, ponieważ jest tylko jeden regulator napięcia * - to dość nieskuteczne).
  2. Zapewnia to, że nić zawsze działa z maksymalną / stałą prędkością. Jeśli wątek nagle zażąda większej mocy obliczeniowej, jeden rdzeń może zostać przeciążony i nastąpi opóźnienie w wykonaniu. Dzięki rozłożeniu go na rdzenie, każdy nagły skok będzie obsługiwany płynnie, bez opóźnień i opóźnień.

Ponadto, z powodu powyższych dwóch obserwacji, doszedłem do wniosku, że Turbo Boost i IDA są nieskuteczne. Mogą być przydatne na starszych systemach operacyjnych, ale Linux i Windows 7 dość skutecznie rozkładają wszystko na wszystkie rdzenie. Tak więc Core 2 Quad q9100 @ 2,26 GHz będzie prawie (zawsze są wyjątki :-) zawsze będzie szybszy niż Core 2 Duo X9100 @ 3.06GHz, i rzadko widziałem, że używa IDA (w zasadzie poprzednika Turbo Boost, zwiększa częstotliwość na jednym lub dwóch rdzeniach tylko dla aplikacji jednowątkowych).

  • Core 2 Quad ma dwie domeny zegarowe dzięki temu, że istnieją dwa fizyczne matryce, więc dwa rdzenie mogą pracować na pełnej częstotliwości, podczas gdy dwa są na najniższej częstotliwości. Nie wiem jednak, czy są dwa regulatory napięcia - zauważyłem, że napięcie jest równomierne na wszystkich 4 rdzeniach, więc musi być tylko jeden regulator dla całego pakietu.
JakL
źródło
3
To brzmi wątpliwie z kilku powodów. Podaj odniesienia do swoich „faktów”. Po pierwsze, dlaczego obliczenia przy 25% na czterech rdzeniach zużywają mniej energii niż 100% na jednym? (Zgadzam się, że ciepło rozkłada się bardziej równomiernie, ale ...) Ponadto wątek w moim pytaniu działa z pełnym nachyleniem (100%), więc nie będzie „wymagał większej mocy obliczeniowej”, ponieważ już działa tak dużo jak to możliwe.
Macke
Cóż, to tylko z moich własnych obserwacji - byłem zaintrygowany IDA i TurboBoost, postanowiłem zrobić kilka testów. Minęło trochę czasu, ale doszedłem do powyższych wniosków. Procesor zużywa mniej energii, ponieważ wszystkie rdzenie pracują przy niższym napięciu - redukcja 0,1 V pozwala zaoszczędzić około 6-10 watów zużycia energii (jeśli jeden rdzeń jest obciążony w 100%, wszystkie rdzenie pracują przy wyższym napięciu, niezależnie od tego, czy pracują na biegu jałowym albo nie). Jest to szczególnie prawdziwe w Core2Duo z trybem SLFM. Masz rację, że wątek działający w pełnym tilt nie żąda więcej taktów procesora, ale istnieją aplikacje, które tak robią.
JakL
Nie ma czegoś takiego jak „szerzenie wątku” (nie, nawet 5 lat później). Istnieje jeden wątek wykonany na jednym rdzeniu. A potem kolejny. I tak dalej. W każdym momencie jeden rdzeń działa na 100%, a pozostałe są na biegu jałowym. Więc nie ma oszczędności. Zwłaszcza, jak wspominasz, kiedy wszystkie rdzenie i tak są przez cały czas pod napięciem (jak powiedziałeś, dzielą napięcie). Jak już wspomniano, znajdowanie się na tym samym rdzeniu gwarantuje, że wątek uzyska całą dostępną moc przetwarzania. Ponieważ ten rdzeń jest już w 100% wykorzystywany, system operacyjny planuje inne wątki na inne, rzadziej używane rdzenie.
David Balažic,