Jak działa współbieżna wielowątkowość (SMT – Simultaneous Multi-Threading) znana u Intela pod nazwą Hyper Threading i co oznaczają rdzenie fizyczne, rdzenie logiczne i wątki? Wielu ludzi często myli te pojęcia, dlatego nadszedł najwyższy czas, aby wyjaśnić najważniejsze kwestie, które je dotyczą.
Kluczowe pojęcia
Aby w lepszym stopniu opisać działanie technologii SMT (którą zaczęło stosować AMD w procesorach Ryzen), najpierw muszę wyjaśnić Wam najważniejsze pojęcia związane z procesorami.
- Rdzeń fizyczny (ang. core), to realnie istniejący element procesora, który posiada swój własny, indywidualny cykl działania i pamięć podręczną (L1). W większości przypadków wykonuje obliczenia niezależnie od pozostałych rdzeni, a jego parametrami są m.in:
- pojemność cache L1
- częstotliwość pracy w GHz
- Rdzeń logiczny (ang. logical core, thread) jest czymś zgoła innym. Możemy go określić jako programistyczne pojmowanie rdzenia fizycznego. Jest on uzależniony od wątku znajdującego się na tym samym rdzeniu fizycznym (ze względu na współdzielenie zasobów), ale pracuje niezależnie od wątków znajdujących się na innych rdzeniach fizycznych. Jego zastosowanie jest podobne do wątków uruchamianych przez aplikacje, dlatego nazywamy go zamiennie wątkiem oraz rdzeniem logicznym.
- Wątek (ang. thread), to najprościej mówiąc wymysł na potrzeby systemu operacyjnego w postaci szeregu zadań, którymi musi zająć się procesor. Każdy program składa się z jednego, kilku, a nawet setek wątków, a tych w systemie może pojawić się dowolna ilość. Jedyne co nas ogranicza, to moc naszego procesora, ponieważ możemy doprowadzić do momentu, w którym ten nie będzie w stanie obsługiwać wszystkich wątków równocześnie. To właśnie wtedy technologia Hyper Threading zbiera największe żniwa, pomagając fizycznym rdzeniom rozplanować pracę tak, aby te poradziły sobie ze stawianym przed nimi zadaniem.
Po takim wyjaśnieniu z pewnością większość z Was powoli zaczyna rozumieć, na czym polega mechanizm wielowątkowości współbieżnej, ale nie spoczywajmy na laurach i zajrzyjmy do samej genezy Hyper Threadingu. Warto mieć na uwadze, że jego wariacja u AMD Ryzen nosi po prostu miano SMT.
Dawka historii
Bazą dla opracowania tej technologii była architektura superscalar, która pozwalała na wykonywanie kilku instrukcji w jednym cyklu pracy procesora. W skrócie polegała na zwiększeniu niezależnych instrukcji w strumieniu (ang. pipeline) poprzez zwiększenie ścieżek wspomnianych instrukcji. Można więc powiedzieć, że zamieniła odseparowane jednostki wykonawcze (rdzenie) na zasoby wykonawcze, których liczba przypisana do wątku mogła być znacznie większa i odpowiedzialna za różne zadania.
W teorii takie rozwiązanie zwiększało wydajność, ale w praktyce większość z uzyskanych zasobów (nawet rejestr procesora!) była po prostu niewykorzystywana. Wtedy opracowano technologię Hyper Threading, która pozwala pojedynczemu rdzeniowi fizycznemu na pozostanie w dwóch stanach (wątkach) w trwającej w nieskończoność pętli. Sprowadza się to do tego, że jeden z nich jest przetwarzany, a drugi czeka (np. na dane z pamięci).
Działanie technologii SMT
W jednym momencie realny rdzeń może obsługiwać tylko jeden z podpiętych pod niego wątków, ponieważ współdzielą one jego zasoby. Nie wpływa to jednak na rdzenie logiczne znajdujące się na innym rdzeniu fizycznym, a prędkość, z jaką procesor przełącza obliczenia na każdym z nich, jest taka duża, że nie możemy jej zauważyć.
Ostatecznie technologię Hyper Threading (Intel) oraz SMT można porównać do pracownika (rdzeń fizyczny), który składa długopisy z dwóch części (wątki aplikacji). Ze względu na to, że pojedyncza taśma produkcyjna (rdzeń logiczny) nie jest w stanie dostarczyć na odpowiedni czas obu elementów, to pracownik musi chwilę poczekać i przez to traci cenny czas. Jego wydajność będzie najwyższa dopiero wtedy, gdy uruchomi się druga taśma, która umożliwi wysyłanie obu elementów w tym samym momencie. To właśnie taką praktykę nazywamy Hyper Threadingiem. Ta technologia umożliwia stawianie rdzeniowi fizycznemu takiej ilości zadań, aby ten nieustannie pracował i nigdy nie czekał na instrukcje.
Zastosowanie technologii SMT
Każdy program (włączając gry) angażuje do pracy rdzenie fizyczne i logiczne, ale nie w każdym przypadku wykorzystuje wszystkie z nich w stu procentach. Wyspecjalizowane oprogramowanie może zrobić użytek z mnogości wątków, ponieważ zadania, które stawia procesorowi, są jasno określone. CPU wie, jakiego typu obliczenia musi wykonać i pracuje nad nimi równolegle, ponieważ rozpoczęcie pracy nad zadaniem B nie wymaga rozwiązania wcześniejszego zadania A. W grach sprawa ma się nieco inaczej, ponieważ praca procesora jest zależna od gracza, którego ruchu i decyzji nie można przewidzieć. Ze względu na to procesor musi wykonać kilka zadań w stu procentach, zanim zajmie się kolejnymi. To tak jak ze składaniem komputera — najpierw musimy włożyć procesor do gniazda, a dopiero potem zamontować chłodzenie.
W grach procesor odpowiada m.in. za kierowanie sztuczną inteligencją, fizykę obiektów, reagowanie na sygnały ze strony gracza oraz częściowe sterowanie pracą karty graficznej. Ze względu na to większość obliczeń musi zostać wykonanych szeregowo, jedno po drugim, tak, aby zachować pewną kolejność i reagować odpowiednio na ruchy gracza. Ale zaraz, zaraz… pewnie nasunęło Wam się pytanie, dlaczego programiści nie planują pracy wszystkich rdzeni fizycznych i logicznych tak, aby część z nich zajmowała się głównymi zadaniami, a pozostałe (w tle) próbowały odgadnąć następny ruch gracza. Powód, jak zawsze w takich przypadkach, jest prosty — pieniądze. Zaprogramowanie silnika gry tak, aby ten rozkładał obciążenie równolegle na wszystkie rdzenie, jest niezwykle problematyczne. Ponadto pracowanie nad czymś, co zostanie wykorzystywane przez małą liczbę graczy (czyt. posiadających wielordzeniowych procesorów) to najzwyczajniejsze marnotrawstwo czasu i zasobów.
Kiedy mówimy o tym, że dana gra nie jest w stanie wykorzystać czterech rdzeni, to mamy tak naprawdę na myśli to, że zadania, jakie stawia procesorowi, zajmują maksymalnie cztery wątki (rdzenie logiczne = ciągi obliczeń) i nie istnieje możliwość ich podzielenia. Przykład takiej optymalizacji gier możemy zauważyć w przypadku procesorów Intela (Core i7) i AMD (Ryzen 5 i 7), które w większości przypadków nie wykorzystują swojej mocy w stu procentach. Dzieje się tak, ponieważ owe tytuły wymagają od CPU niemożliwych do podzielenia obliczeń, przez co wydajności układów nastawionych na wielozadaniowość wypada gorzej, niż tych, które stawiają na moc jednego rdzenia. Na rynku znajdziemy jednak wyjątki (najczęściej w postaci rozbudowanych gier strategicznych), które robią użytek z wielozadaniowości.
Podsumowanie
Rdzeń logiczny, czyli wątek, to ciąg obliczeń i instrukcji, wymyślony na potrzeby systemu operacyjnego. Każdy z nich przypisuje się do jednego z rdzeni fizycznych, którego zasoby pochłaniają. Rozwiązanie SMT nazwane u Intela mianem Hyper Threadingu (wcześniej u AMD występowało CMT) pozwoliło na przypisanie do jednego rdzenia fizycznego dwóch logicznych, które współdzielą zasoby tego pierwszego i nie mogą działać równolegle względem siebie. Ich działanie polega na rozplanowaniu harmonogramu pracy CPU, czyli można powiedzieć, że dbają o to, aby rdzenie fizyczne mogły nieustannie pracować, co w większości przypadków zwiększa wydajność ogólną procesora. Zdarzają się jednak sytuacje, w których wielozadaniowość nie znajduje użytku, ponieważ obliczenia muszą zostać wykonane jedno po drugim, w określonej kolejności. Ponadto zaimplementowanie SMT powoduje zwiększenie poboru energii i ilości wydzielanego ciepła przez układ, ale mówimy tutaj o naprawdę małych wartościach.