Jak działa koligacja procesorów Windows w przypadku procesorów hyperthreaded?

27

Jak działa koligacja procesorów Windows w przypadku procesorów hyperthreaded? Użyjmy przykładu (na zdjęciu) systemu z czterema rdzeniami, z których każdy ma wirtualny rdzeń hiperwątkowy.

  1. Które rdzenie odpowiadają poszczególnym „procesorom” poniżej?
  2. Czy (powiedzmy) procesor 6 i procesor 7 poniżej stanowią jeden rdzeń; HT i prawdziwy rdzeń?
  3. Jeśli na przykład procesor 6 reprezentuje prawdziwy rdzeń, a procesor 7 rdzeń HT, czy wątek przypisany tylko do procesora CPU7 otrzyma tylko resztki zasobów prawdziwego rdzenia? (zakładając, że rdzeń wykonuje inne zadania)
  4. Czy hyperthreading jest zarządzany całkowicie w procesorze, tak że wątki są żonglowane wewnętrznie? Jeśli tak, to czy dotyczy to zakresu procesora, czy zakresu podstawowego? Przykład: jeśli CPU 6 i 7 reprezentują jeden rdzeń, czy nie ma znaczenia, do którego procesu jest przypisany, ponieważ CPU przypisze zasoby odpowiednio do działającego wątku?
  5. Zauważam, że długo działające procesy jednowątkowe są dość często odbijane wokół rdzeni, przynajmniej według menedżera zadań. Czy to oznacza, że ​​przypisanie procesu do jednego rdzenia nieco poprawi wydajność (unikając przełączników kontekstu i unieważnienia pamięci podręcznej itp.)? Jeśli tak, to czy mogę wiedzieć, że nie przypisuję do „tylko wirtualnego rdzenia”?

To wszystko jest dla mnie bardzo niejasne i mylące. HT jest świetny, ale z pewnością wydaje się zmniejszać przejrzystość alokacji zasobów.

Menu koligacji procesora

Charles Burns
źródło
Właśnie dlatego wiesz, że każdy rdzeń procesora jest „wirtualnym rdzeniem”. Każdy z nich ma fizyczne połączenie z procesorem, termin „wirtualny” pochodzi od sposobu, w jaki system Windows planuje procesy na tych procesorach, ze względu na sprzętową implementację hiperwątkowania. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Przełom
Ostatni komentarz dla ciebie. „HT jest świetny, ale z pewnością wydaje się zmniejszać przejrzystość przydziału zasobów”. Jest to 100% prawda, ale niewiele można zrobić, nie ma też wiele powód dla ciebie zrobić coś o tym. Wszystkie nowoczesne systemy operacyjne wiedzą, czym jest hyperthreading, większość ma zaawansowane harmonogramy procesorów, aby to zrekompensować, a oprócz kilku konkretnych przypadków (i mam na myśli kilka), prawie zawsze występuje korzyść z wydajności.
Przełom

Odpowiedzi:

18

Które rdzenie odpowiadają poszczególnym „procesorom” poniżej?

Zakładając, że mamy Core 1, 2, 3 i 4, CPU4 i CPU5 reprezentują rdzeń 3.

Czy (powiedzmy) procesor 6 i procesor 7 poniżej stanowią jeden rdzeń; HT i prawdziwy rdzeń?

Nie ma różnicy między nimi - oba mają fizyczny interfejs sprzętowy do procesora, interfejs logiczny jest zaimplementowany sprzętowo (więcej informacji znajduje się w arkuszu danych procesora Intel Core Processor, tom 1 ). Zasadniczo każdy rdzeń ma dwie oddzielne jednostki wykonawcze, ale dzieli między nimi niektóre wspólne zasoby. Dlatego w niektórych przypadkach hiperwątkowanie może faktycznie obniżyć wydajność.

Jeśli na przykład procesor 6 reprezentuje prawdziwy rdzeń, a procesor 7 rdzeń HT, czy wątek przypisany tylko do procesora CPU7 otrzyma tylko resztki zasobów prawdziwego rdzenia? (zakładając, że rdzeń wykonuje inne zadania)

Patrz wyżej. Wątek przypisany TYLKO CPU6 lub TYLKO CPU7 będzie działał z dokładnie taką samą prędkością (zakładając, że wątek działa tak samo, a pozostałe rdzenie procesora są w stanie bezczynności). System Windows wie o procesorach z obsługą HT, a harmonogram procesów uwzględnia te rzeczy.

Czy hyperthreaded jest zarządzany całkowicie w procesorze, tak że wątki są wewnętrznie żonglowane? Jeśli tak, to czy dotyczy to zakresu procesora, czy zakresu podstawowego? Przykład: jeśli CPU 6 i 7 reprezentują jeden rdzeń, czy nie ma znaczenia, do którego procesu jest przypisany, ponieważ CPU przypisze zasoby odpowiednio do działającego wątku?

Obie. Sam sprzęt nie planuje, na których rdzeniach uruchamiane są programy, takie jest zadanie systemu operacyjnego. Sam procesor jest jednak odpowiedzialny za współdzielenie zasobów między rzeczywistymi jednostkami wykonawczymi, a Intel decyduje, w jaki sposób można napisać kod, aby uczynić to tak wydajnym, jak to możliwe.

Zauważam, że długo działające procesy jednowątkowe są dość często odbijane wokół rdzeni, przynajmniej według menedżera zadań. Czy to oznacza, że ​​przypisanie procesu do jednego rdzenia nieco poprawi wydajność (unikając przełączników kontekstu i unieważnienia pamięci podręcznej itp.)? Jeśli tak, to czy mogę wiedzieć, że nie przypisuję do „tylko wirtualnego rdzenia”?

Jest to normalne zachowanie i nie, przypisanie go do jednego rdzenia nie poprawi wydajności. Biorąc to pod uwagę, jeśli z jakiegoś powodu chcesz upewnić się, że pojedynczy proces jest wykonywany tylko na jednym fizycznym rdzeniu, przypisz go do dowolnego pojedynczego procesora logicznego.

Powód, dla którego proces „odbija się”, wynika z harmonogramu procesu. Jest to normalne zachowanie i najprawdopodobniej zmniejszysz wydajność, ograniczając liczbę rdzeni, na których proces może być wykonywany (niezależnie od liczby wątków), ponieważ program planujący procesy musi teraz pracować ciężej, aby wszystko działało zgodnie z nałożonymi ograniczeniami. Tak, w większości przypadków kara ta może być nieistotna, ale najważniejsze jest, jeśli nie masz ku temu powodu, nie rób tego !

Przełom
źródło
5

Układ procesora powinien być tak zorganizowany, aby system operacyjny, który nie rozpoznaje wszystkich procesorów, uzyskał maksymalną możliwą wydajność. Oznacza to, że jeden wirtualny rdzeń z każdego fizycznego rdzenia zostanie wymieniony, zanim pojawi się drugi wirtualny rdzeń z dowolnego rdzenia fizycznego.

Załóżmy na przykład, że masz cztery rdzenie hiperwątkowe, zwane A, B, C i D. Jeśli założymy, że A i B współużytkują pamięć podręczną L2, a C i D współużytkują pamięć podręczną L2, kolejność powinna wyglądać następująco:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

W ten sposób system operacyjny, który pobiera tylko dwa procesory, może korzystać z całej pamięci podręcznej L2. Ponadto system operacyjny, który pobiera tylko cztery procesory, może korzystać ze wszystkich jednostek wykonawczych.

Znowu tak właśnie powinno być.

Oczywiście, jeśli używasz systemu operacyjnego, który rozumie topologię procesora, nie ma to znaczenia. BIOS wypełnia tabelę, która wyjaśnia, które rdzenie współużytkują jednostki wykonawcze, które współużytkują pamięć podręczną i tak dalej. Każdy nowoczesny system operacyjny, którego prawdopodobnie będziesz używać i który w pełni obsługuje procesor, rozumie pełną topologię procesora.

David Schwartz
źródło
1
  1. Ich zgodność zależy od tego, w jaki sposób procesor i płyta główna wyliczają i identyfikują rdzenie. To, co powinno się zdarzyć, to że najpierw zostaną policzone gniazda fizyczne, następnie rdzenie logiczne, a rdzenie wirtualne. W twoim przypadku rdzenie 0-3 powinny być rdzeniami fizycznymi, a 4-7 wirtualnymi rdzeniami HT. Głównym tego powodem jest to, że w przypadku uruchomienia systemu operacyjnego, który nie jest w stanie obsłużyć wszystkich dostępnych jednostek wykonawczych, najprawdopodobniej najpierw otrzymają najbardziej niezależne jednostki przed udostępnionymi. Nie byłoby dobrze, gdyby hipotetyczny 2-procesorowy system operacyjny znalazł parę HT w twoim systemie zamiast 2 różnych rdzeni. (Był to prawdziwy problem dla niektórych wczesnych systemów HT, zanim można było zaktualizować harmonogramy jądra dla nowych procesorów).
  2. Nie. Zobacz 1.
  3. Nie. HT jest bardziej skomplikowana. Pamiętaj, że 2 wirtualne rdzenie często dzielą niektóre zasoby, podczas gdy inne bity są oddzielone, ale tylko jeden lub drugi może być wykonywany jednocześnie.
  4. Raczej. Twój przykład (biorąc pod uwagę założenia) jest ogólnie poprawny. Jeśli jednak aplikacja może wiedzieć, jaki rodzaj obciążenia działa, może pomóc systemowi operacyjnemu odpowiednio zaplanować wątki.
  5. Jest bardzo dobry powód do przeskakiwania rdzenia: rozłożenie obciążenia termicznego. Biorąc pod uwagę, że w wielu przypadkach pamięci podręczne wyższego poziomu (L2, L3) są w każdym przypadku współużytkowane przez wszystkie rdzenie, przeskakiwanie rdzenia nie będzie miało znaczącego wpływu na wydajność, ale wpływ termiczny będzie znaczący, ponieważ nie będziesz mieć „gorącego punktu” na jeden rdzeń jest stale uruchomiony, podczas gdy inne siedzą bezczynnie. Teraz krzyżowanie gniazd w systemie z wieloma gniazdami (szczególnie w systemie NUMA) może mieć znaczący wpływ na wydajność. Większość harmonogramów jest tego świadoma i bierze to jednak pod uwagę.

Ostatecznie sprowadza się to do tego, że często niewiele (użytkownik końcowy) może zrobić z powinowactwem do wątku, aby znacząco wpłynąć na wydajność, poza upewnieniem się, że korzystasz z aktualnego systemu operacyjnego, który wie o różnych bitach w Twój system.

Jeśli znajdziesz obciążenia, w których ręczne przypisywanie koligacji ma znaczący wpływ, zgłoś to jako błąd twórcy aplikacji, aby program mógł zostać naprawiony.

afrazier
źródło
4
„rdzenie 0-3 powinny być rdzeniami fizycznymi, a 4-7 wirtualnymi rdzeniami HT” W rzeczywistości rdzeń 0 i rdzeń 1 odpowiadają temu samemu (pojedynczemu) rdzeniu fizycznemu. Każdy „hyperthreaded core” ma dwa fizyczne połączenia z procesorem, więc Windows dosłownie widzi 8 fizycznych rdzeni. Po prostu wie, że procesor ma hyperthreading. Zobacz arkusz danych Intel Core, aby uzyskać więcej informacji na ten temat, jeśli jesteś zainteresowany.
Przełom
@Breakthrough To nie byłaby dobra topologia, ponieważ oznaczałoby to, że naiwny system operacyjny, który obsługiwałby tylko 4 rdzenie, zakończyłby pracę tylko przy użyciu połowy rdzeni fizycznych. Jeden wirtualny rdzeń z każdego rdzenia fizycznego powinien pojawić się na liście wirtualnych rdzeni, zanim pojawi się drugi wirtualny rdzeń z dowolnego rdzenia fizycznego.
David Schwartz,
@DavidSchwartz Dobra topologia czy nie, tak liczą się logiczne procesory. Dlatego zaleca się wyłączenie hiperwątkowania we wczesnych systemach operacyjnych (np. Windows 2000 i wcześniejszych), które nie wyliczają poprawnie LP w stosunku do rdzeni w porównaniu z fizycznymi pakietami procesora.
Jamie Hanrahan