Powiedzmy, że mam procesor serwera z 18 rdzeniami, z włączonym hyperthreading, co oznacza, że widzę 36 cpus w htopie.
Aby w pełni wykorzystać procesor i nie wpływać na wydajność jednego wątku, powinienem dążyć do tego, aby wszystkie 36 „rdzeni” działało na 100%, a rdzenie HT będą po prostu mniej pracowały i nadal zgłaszały 100%, czy też oznaczałoby to, że „pełne” rdzenie są już przerywane przez zadanie na „rdzeniu HT”, a tym samym wykonują mniej pracy jednowątkowej?
Zdaję sobie sprawę, że istnieje wiele zmiennych, które wpływają na wydajność HT, chcę tylko wiedzieć, co oznaczają procesory CPU podczas pracy z HT.
hyperthreading
Tassadar
źródło
źródło
Odpowiedzi:
Jeśli drugi wirtualny rdzeń może uczestniczyć, gdy pierwszy utknie w innym przypadku, będzie lepiej niż nie , więc dostaniesz (przynajmniej) odrobinę dodatkowej pracy.
Powstaje pytanie: kiedy posiadanie dwóch różnych wątków powoduje pogorszenie jednego? Prognozowanie gałęzi i zależności między instrukcjami nie ulegną zmianie. Oczekiwanie na dostęp do pamięci teraz ... dwa wątki konkurują o dostęp do pamięci, zarówno pod względem wykorzystania pamięci podręcznej, jak i przepustowości.
Jeśli masz niektóre procesory działające z HT, a inne nie, czy to oznacza również, że przypisujesz określone wątki do jednego lub drugiego typu? Nie sądzę: twoje programy będą uruchamiać swoje wątki na losowych wirtualnych rdzeniach. Jak zatem pomaga podział konfiguracji? Ponieważ każdy procesor ma własną pamięć podręczną, jedyny wpływ na to ma przepustowość pamięci i ciężar spójności pamięci podręcznej.
Ogólnie rzecz biorąc, osiągasz punkt, w którym posiadanie czegoś więcej, co możesz zrobić, jest droższe niż pozwalanie niektórym jednostkom wykonawczym CPU na bezczynność. Nie zależy to bezpośrednio od liczby wątków, ale od tego, co robią wątki oraz szczegółowej architektury pamięci i niuansów wydajności różnych komponentów.
Nie ma prostej odpowiedzi. Nawet mając na uwadze konkretny program, maszyna może różnić się od ludzi opowiadających o swoich doświadczeniach.
Musisz spróbować sam i zmierzyć, co jest najszybsze, dzięki tej konkretnej pracy na tej konkretnej maszynie. I nawet wtedy może się to zmieniać wraz z aktualizacjami oprogramowania i zmianami użytkowania w miarę upływu czasu.
Spójrz na tom 3 magnum opus Anger . Jeśli przyjrzysz się uważnie konkretnemu procesorowi, możesz znaleźć ograniczające zasoby wśród głębokiego potoku wielu kroków niezbędnych do wykonania kodu. Musisz znaleźć przypadek, w którym nadmierne zaangażowanie powoduje jego wolniejsze działanie, a nie podejmowanie większej ilości pracy. Ogólnie oznaczałoby to pewien rodzaj buforowania; i gdzie zasób jest współużytkowany przez wątki.
Co oznacza miernik procesora: raportuje cały czas, który nie jest spędzony na uruchomieniu wątku bezczynności. Oba wątki logiczne przypisane do rdzenia nie będą bezczynne, nawet jeśli rzeczywista praca wykonana na jednym z nich może być niewielka. Czas spędzony z rurociągiem utknął na kilka cykli, aż wyniki są gotowe, pamięć jest pobierana, operacje atomowe są ogrodzone itp. Podobnie nie powoduje, że wątek jest odkładany jako „nie gotowy”, więc nie będzie bezczynny, a czas nadal pokazuje się jako używany. Oczekiwanie na pamięć RAM nie będzie wyświetlane jako bezczynne. Tylko coś takiego jak We / Wy spowoduje zablokowanie wątku i zatrzymanie czasu ładowania w jego kierunku. Muteks systemu operacyjnego w ogóle to zrobi, ale wraz z rozwojem systemów wielordzeniowych nie jest to już pewne, ponieważ „spinlock” nie sprawi, że nić powróci na półkę.
Tak więc miernik procesora 100% nie oznacza, że wszystko płynnie płynie, jeśli procesor często utknął w oczekiwaniu na pamięć. Mniejsza liczba rdzeni logicznych pokazujących 90% mogłaby równie dobrze wykonywać więcej pracy, ponieważ kończy się chrupanie liczb i teraz czeka na dysku.
Więc nie martw się miernikiem procesora. Spójrz na rzeczywistych postępów, tylko .
źródło
Mierniki procesorów są bardzo kiepskie, jeśli chodzi o informowanie o tym, o ile więcej wydajności można wycisnąć z procesorów hyperthreaded. W tym celu należy uruchomić własne testy porównawcze przy różnych stawkach nadmiernej subskrypcji na rdzeń fizyczny. Niektóre obciążenia działają najlepiej przy całkowicie wyłączonym HT, więc uwzględnij ten przypadek również w testach. Może to być 1: 2 (36 równoległych pracowników), 1: 1,5 lub nawet 1: 2,5! To zależy od obciążenia pracą.
Bardziej szczegółowo, HT jest implementowany na krzemie w sposób, który skraca czas bezczynności procesora, gdy kontekst musi zostać przełączony lub przewidywanie gałęzi zawiedzie. Ułatwia to osiągnięcie 100% wykorzystania jednostki wykonawczej niż w przypadku sztuczek opartych wyłącznie na systemie operacyjnym. HT ewoluowała od czasu jej wprowadzenia, a współczesne układy scalone są bardziej równoległe niż te, których używaliśmy 10 lat temu.
Istnieją dwa profile wykonania, które będą miały wpływ na to, gdzie znajduje się twój optymalny punkt nadmiernej subskrypcji:
źródło
Powinieneś zobaczyć wszystkie 36 rdzeni działających na 100% - zakładając, że oprogramowanie to potrafi (co nie jest trywialne - planowanie może być trudne z tyloma rdzeniami, więc spadki poniżej 100% są dopuszczalne).
Oczywiście, gdy „podzielisz” rudę z hiperwątkiem, znaczenie tych 200% nie oznacza „2x100% - w wykonanej pracy. Jest to jednak niewidoczne dla żadnego pomiaru (który wynika z wykorzystania procesora i nie ma pojęcia o wykonanej pracy). To, ile pracy zostanie wykonane, zależy od tego, co to jest praca - gdzieś powyżej 1,5 x pracy bez hiperwątkowości należy się spodziewać przez większość czasu.
źródło
Sposób implementacji hyperthreading różni się w zależności od konkretnego procesora CPU. Od Nehalem do Skylake, Intel znacząco zmniejszył wspólne proporcje (tj. 50/50) wspólnych części rurociągu, kierując się do struktur dynamicznie wspólnych.
W każdym razie, ogólnie rzecz biorąc, włączenie HT doprowadziło do nieco wolniejszego wykonywania jednego wątku, ale ze względu na to, jak działa program planujący Linuksa, dzieje się tak tylko wtedy, gdy liczba lub działający wątek jest większa niż liczba rdzeni fizycznych. Ponieważ w takich sytuacjach (gdy wątki> rdzenie) zazwyczaj cenisz całkowitą przepustowość o najwyższym znaczeniu, hyperthreading pozostaje wygraną netto.
Jak to mozliwe Kluczową kwestią do zrozumienia jest to, że CPU nie prezentuje rdzeni fizycznych i wirtualnych jako równych rdzeni, a raczej odsłania te ostatnie w sposób, w jaki program planujący Linuksa może uniknąć planowania na nich, jeśli dostępne są jakiekolwiek inne rdzenie fizyczne. Innymi słowy, najpierw wykorzystuje wszystkie rdzenie fizyczne, a następnie zaczyna korzystać z wirtualnego.
Oznacza to, że generalnie HyperThreading jest bardzo cenną funkcją (inne procesory, podobnie jak Power8, wykorzystuje jeszcze głębsze techniki SMT) i że w celu maksymalizacji przepustowości należy ją włączyć, obciążając procesor co najmniej jednym wątkiem na rdzeń wirtualny lub fizyczny. Dla praktycznego przykładu, aby uzyskać pełną wydajność z 18-rdzeniowego procesora, powinieneś użyć co najmniej 36 wątków.
Istnieją dwa wyjątki:
źródło