228

Wiele rdzeni w procesorze. Też daliście się nabrać?

XXI wiek należy bezsprzecznie do procesorów wielordzeniowych, które całkowicie opanowały rynek. Mnożenie rdzeni okazuje się dla producentów najprostszym sposobem na zwiększenie wydajności procesorów. Niestety, ta wyłącznie katalogowa wydajność, okazuje się dla użytkownika nie do wykorzystania. W przytłaczającej większości scenariuszy, użyteczność kolejnych rdzeni szybko się zmniejsza, a ich opiewane przez marketingowców zalety są jednym z największych kłamstw branży technologicznej dzisiejszych czasów.
Gwoli jasności, swoje dywagacje pozwolę sobie zacząć od małego ostrzeżenia. Ponieważ temat jest mocno techniczny i obszerny, a ograniczona formuła bloga zdecydowanie nie sprzyja pisaniu elaboratów (nieszczęsne TL&DR), postanowiłem temat mocno zawęzić. Wywody z konieczności dotyczą konkretnego sprzętu na jakim pracuję (dwurdzeniowy i5-4300U), oraz bardzo konkretnych scenariuszy z jakimi mam do czynienia. Bez obaw jednak. Jestem typowym użytkownikiem technologii i szczerze wierzę, że moje wnioski można szeroko rozciągnąć na gros zwykłych śmiertelników.

 

Wychowałem się na procesorach jednordzeniowych. W czasach Pentiumów, Cyrixów czy K5-tek sprawa wydajności była bardzo prosta. Ponieważ programy komputerowe z założenia składają się z kolejno wykonywanych instrukcji, szybszy procesor był tym, który oferował wyższy zegar i wykonywał te instrukcje szybciej.

Liczyły się jeszcze inne czynniki, takie jak wielkości cache (L1 i L2) czy dodatkowe instrukcje multimedialne (SSE), jednak użytkownik dostawał dokładnie to, co wynikało z dokumentacji. Kupiłeś procesor szybszy o 20%? Stuprocentowa zajętość procesora przy wymagającym zadaniu trwała równo i zawsze 20% krócej.

Oczywiście jednordzeniowe procesory nie miały żadnych problemów z multitaskingiem, a ówcześni ich użytkownicy z pracą na kilku programach na raz. Instrukcje z różnych programów mogły się przeplatać w kolejce, a zawieszaniu się w pełni obciążonego systemu zapobiegało nadanie odpowiednich priorytetów zadaniom.

Wtedy także były systemy wieloprocesorowe. Niestety zadanie podzielenia instrukcji (zajmował się tym system operacyjny) okazywało się na tyle zasobożerne, że dodatkowy wydatek (drugi procek i serwerowa płyta główna) skutkował maksymalnie 60% przyrostem wydajności. Nic dziwnego, że poza serwerami komputery takie nie doczekały się wielkiej popularności.

Od zawsze koncepcja mnożenia rdzeni w procesorze wydawała mi się pójściem na łatwiznę. Sklejenie razem dwóch procesorów jest świetnym pomysłem na podwojenie surowej mocy obliczeniowej, ale takie pójście na skróty odbija się później czkawką. Co z tego, że taki zlepek kilku procesorów jest niemal nieużywalny bez przerobienia oprogramowania? Przecież to problem producentów software’u, to oni będą ponosić koszty dostosowania programów, lub zmagać się z konsekwencjami niskiej wydajności.

Dzisiaj producenci mnożą rdzenie, których ilość zaczynamy zapisywać dwucyfrowo. Pozornie sprawa jest prosta – 5 rdzeni taktowanych na 2 GHz, przy tej samej architekturze, ma taką samą wydajność co 10 rdzeni 1 GHz. I faktycznie, surowej mocy mamy tyle samo. Mało tego. Dziesięciordzeniowy procesor wykona aż 10 instrukcji na raz, czyli dwa razy więcej niż ten z 5 rdzeniami. A przecież więcej zawsze znaczy lepiej, prawda?

Niestety jest dokładnie na odwrót. Programy składają się z instrukcji wykonywanych po kolei i z zasady nie potrafią korzystać z większej ilości rdzeni niż jeden. Dostosowanie programu do pracy na wielu rdzeniach jest kosztowne, a czasami po prostu niemożliwe.

Inna sprawa, że programy optymalizuje się pod najpopularniejsze konstrukcje. O ile w stacjonarnych komputerach pojawiają się już procesory 8-rdzeniowe, o tyle w laptopach nadal królują 2 fizyczne rdzenie. Sami sobie odpowiedzcie na pytanie, jaki sens jest w optymalizowaniu kodu pod kosztujące majątek konstrukcje kilkunastordzeniowe.

W efekcie przeciętny użytkownik płacący za procesor i moc jaką powinien dysponować fizycznie nie jest w stanie jej wykorzystać. Nawet jeśli postawimy przed naszym pecetem trudne zadanie i widać, że ten męczy się i poci, nadal w Task Menadżerze nie zobaczymy 100% wykorzystania mocy, za jaką słono przecież zapłaciliśmy.

Żeby nie być gołosłownym przyjrzyjmy się kilku dużym, profesjonalnym i wymagającym, programom dla zawodowców. Można chyba śmiało zakładać, że armie programistów i ogromne pieniądze za nimi stojące spowodują, że programy te będą błyszczeć na firmamencie oprogramowania najlepiej wykorzystującego liczne rdzenie kosztujących fortunę procków.

Photoshop

Ten kombajn graficzny często instalowany jest na potężnych stacjach roboczych. O ile jednak potrafi korzystać z karty graficznej, o tyle wykorzystanie większości rdzeni po prostu leży i kwiczy. Wydaliście fortunę na procesor z 10 rdzeniami pod Photoshopa? Macie pecha – na tym potworze program działa tak samo jak na czterordzeniowym.

Oczywiście wszystko zależy od tego co konkretnie chcemy wykonać. Obrót obrazu na 2 rdzeniach działa 2x szybciej niż na jednym. Ale już na 5 tylko niecałe 3x niż na jednym. Na 10 rdzeniach jest to równe 3x. Przy zmianie rozmiaru jest jeszcze gorzej. Użycie drugiego rdzenia przyspiesza operację o 25%, niestety włączenia żadnego więcej nie skutkuje już poprawą. Dokładnie tak. 10 rdzeni działa tylko 25% szybciej niż 1.

Podobnie jest z filtrami Blur – niektóre potrafią użyć więcej niż parę rdzeni (choć daleko tu do zachwytów) – są jednak takie, które używają wyłącznie jednego.

Reszty testów nie będę przytaczał – dodam tylko, że dalej jest jeszcze gorzej i odeślę do oryginalnego testu: https://www.pugetsystems.com/labs/articles/Adobe-Photoshop-CC-Multi-Core-Performance-625/.

Autocad

To drugi z najczęściej używanych przeze mnie programów. Nawet wielogodzinne renderingi na wersji 2017 nie pozwoliły na obciążenie procesora w stopni większym niż 50%. Poszukałem wiec informacji u źródła. Jak wygląda działanie na wielu rdzeniach najpopularniejszego oprogramowania CAD od Autodesku? Wcale.

Jak możemy wyczytać Autocad jest programem jednowątkowym i na procesorze dwurdzeniowym działa identycznie jak na jedno. Są tylko dwie operacje, które podobno korzystają z dodatkowego rdzenia. Regeneracja obrazu 2D i MentalRay Rendering. Jednak rendery z oświetleniem robiłem ostatnio i nadal na 2 rdzeniach zajętość procesora wynosiła marne 50%.

Autocad

Adobe After Effects

Jestem, co prawda jedyną znaną mi osobą, która montuje filmy o tak wielkiej komplikacji na tablecie i jedyne co mnie usprawiedliwia to skupianie się wyłącznie na krótkich, parominutowych formach. Jeśli jednak sekunda materiały potrafi renderować się pół godziny (100 scen w jednym kadrze) tym bardziej chciałbym zobaczyć 100% zajętości procesora. Kolejne marzenia ściętej głowy.

A przecież, ten program do filmowych efektów specjalnych, wydaje się po prostu stworzony do pracy wielowątkowej. Teoretycznie, wystarczy ciężkie zadanie renderowania kolejnych klatek podzielić na ilość paczek odpowiadających ilości rdzeni (program i tak „liczy” każdą klatkę osobno).

Adobe After Effects

Nie wdając się w szczegóły (na przestrzeni lat używałem kilku różnych wersji, na różnych komputerach), nigdy nie zobaczyłem 100% „na zegarze”. Podczas gdy prosty reneder (montaż niemal liniowy) obciąża procesor w 45-50%, ten złożony i oparty na wielu efektach, potrafił wykorzystać „aż” 80%. To swoisty rekord na moim komputerze, ja jednak ciągle oczekuję, że będę mógł wykorzystać całą moc za jaką zapłaciłem!

Jeśli nawet duże, wysokobudżetowe programy nie radzą sobie z podziałem mocy na więcej rdzeni, to jak to wygląda przy mniejszych programach? Cóż, nie wygląda. Świetnie to widać na przykładzie Photoshopa – sam program jakoś sobie na wielu rdzeniach radzi, jednak wtyczki, pisane przez mniejsze zespoły programistów, z zasady pracy wielordzeniowej nie wspierają.

Z czystej ciekawości sprawdziłem jeszcze WinRara, jeden z niewielu programów, który potrafi na dłużej zająć mój procesor. Teoretycznie, aplikacja ma wsparcie dla wielu rdzeni od bodajże 2007 r. Szkoda, że u mnie leci wyłącznie na jednym. Jak widać na screenie , na dwóch rdzeniach ciągle 50% max.

A co z telefonami i rdzeniami w procesorach mobilnych?

Nie chcę się zbyt mocno zagłębiać w tematykę procesorów mobilnych. W mojej jednak ocenie konstrukcje ARM borykają się z tymi samymi problemami co i386. Dlatego wyciągające świetne wyniki w wielordzeniowych, syntetycznych testach telefony dławią się i krztuszą przy codziennej pracy na zwykłych, jednowątkowych aplikacjach. Dlatego także urządzenia (i procesory) jedynego producenta, który nie dał się wciągnąć w marketingowy wyścig na ilość rdzeni pracują płynniej i sprawniej niż konkurencja. Domyślacie się pewnie, że chodzi o Apple. Wielka szkoda, że dzielnie broniący się swego czasu Qualcomm został zmuszony do kapitulacji i dołączył w wyścigu do Samsunga (Exynosy) i Mediateka (MTK).

Poniżej fajne wideo, będące odpowiedzią producenta Snapdragonów na 8 rdzeniowego MTK:

Podsumowanie

Cały świat sprzętu zgodnie pożeglował w stronę rozwiązań wielordzeniowych. Co z tego jednak, skoro oprogramowanie w swojej istocie pozostało jednowątkowe. Na swoich, kosztujących krocie urządzeniach z mnogością rdzeni, użytkownicy uruchamiają programy, które rzadko kiedy potrafią taką moc wykorzystać. Najnowsze premiery procesorów nie pozostawiają złudzeń – ich rozwój ciągle opiera się na nośnym marketingowo mnożeniu rdzeni, co z każdym rokiem pogłębia przepaść pomiędzy czysto katalogową wydajnością urządzeń, a tym, czym w rzeczywistości dysponuje użytkownik.

Efekt jest taki, że w praktyce liczy się tylko wydajność jednego lub maksymalnie kilku rdzeni – cała reszta, na którą naciągnęli nas sprytni marketingowcy, będzie po prostu leżała odłogiem. Nie zobaczycie tego oczywiście w syntetycznych benchmarkach. Te muszą być, z konieczności, najlepiej zoptymalizowanymi do wielu rdzeni programami. Wyników, jakie na nich uzyskacie, nigdy już nie uda się powtórzyć na żadnym, normalnym programie.

Wnioski?

Pierwszym wnioskiem praktycznym, jaki wyciągnąłem dla siebie, to podejmowanie decyzji zakupowych w oparciu o testy wydajności jednego rdzenia. To ten jeden rdzeń będzie musiał odwalać całą robotę – czasem pomoże mu  drugi, z rzadka kolejne.

Drugim wnioskiem jest większe zwracanie uwagi na tryb turbo procesorów. Muszę przyznać, że zawsze pomijałem tą wartość przy porównaniach, zdecydowanie jej nie doceniając. Tymczasem świadomość tego, jak duże znaczenie okazuje się mieć praca w trybie jednordzeniowym, rzuca na zagadnienie zupełnie inne światło. Za każdym razem, gdy wymagający program postanowi obciążyć tylko jeden rdzeń procesora, jego mocne przetaktowanie w trybie turbo pozwoli znacząco szybciej poradzić sobie z takim zadaniem.

Dla wielu z Was, problemy z wykorzystaniem większej ilości rdzeni wydają się oczywiste. Jednak przeciętny użytkownik komputerów nie ma o tym pojęcia i kupuje sprzęt w oparciu o wiarę w materiały marketingowe. A tam pojawiają się wyłącznie syntetyczne wyniki osiągane w specyficznych zadaniach. W materiałach prasowych, dwa rdzenie są zawsze dwa razy szybsze od jednego, podobnie jak 18 rdzeni od 9.

Tymczasem okazuje się to skrajnym zakłamywaniem rzeczywistości. Uzyskiwana wydajność wielordzeniowych konstrukcji to niewielki fragment ich katalogowych możliwości. To trochę tak, jakby kupić drogi samochód, osiągający katalogowe 350 km/h (tylko bez kierowcy, na Wielkim Słonym Jeziorze w Utah, w czasie koniunkcji 7 planet i z przerobionym silnikiem na paliwo uranowe). A potem jeździć tym cudem rozwijając maksymalnie 30 km/h.