Reklama
aplikuj.pl

Tajemnice rdzeni i wątków procesorów

procesor opis, opis procesora, rdzenie w procesorze, rdzenie procesor, budowa procesora, wątek a rdzeń, rdzeń logiczny a fizyczny, rdzenie procesora, wątki procesora

Czy jesteście wśród tych użytkowników sprzętu, którzy nie tylko chcą, żeby ten działał, ale też chcą nieco na jego temat wiedzieć? Jeśli tak, to trafiliście świetnie, o ile interesuje Was kwestia wirtualnych rdzeni i pamięci podręcznej w procesorach.

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 albo odświeżyć tę wiedzę, albo dokładnie wyjaśnić najważniejsze kwestie, które je dotyczą.

Kluczowe pojęcia

Aby w lepszym stopniu opisać działanie technologii SMT (którą przed laty zaczęło oficjalnie stosować AMD w rewolucyjnych 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 na płytce PCB, 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 podana w GHz
  • Rdzeń logiczny (ang. logical core, thread) jest czymś zgoła innym. Możemy go określić jako programowe 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. Jako że 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 (patrzę na ciebie Threadripperze 3990X). 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 jeszcze na laurach i zajrzyjmy do samej genezy SMT. Warto mieć na uwadze, że jest to ta sama technologia, którą znamy pod nazwą Hyper-Threadingu u Intela. “Niebiescy” po prostu chcieli się jakoś wyróżnić.

Dawka historii

Bazą do opracowania tej technologii była niegdyś 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 umożliwiła 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 zajmuje się obliczeniami, podczas gdy drugi czeka (np. na dane z pamięci), aby dorzucić od siebie trzy grosze. 

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 na innym rdzeniu fizycznym, a jako że prędkość, z jaką procesor nieustannie przełącza obliczenia na każdym z nich, jest ogromnie duża, to nie możemy doświadczyć tego procesu. Co powiecie na małą alegorię? 

Ostatecznie technologię Hyper Threading (Intel) oraz SMT można porównać do pracownika (tu jest on rdzeniem fizycznym), 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ę możemy zauważyć w Hyper Threadingu. 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. Mając to na uwadzę należy wspomnieć, że 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 zachowanie 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. 

Przykład gry wykorzystującej wszystkie rdzenie

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 w grach 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. Jednak kiedy granie to nie jedyne, co robimy w jednym momencie (praca w tle/streamowanie) dodatkowe wątki są oczywiście przydatne. 

Wielowątkowość procesorów w skrócie

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.