ile rdzeni powinienem wykorzystać do obliczeń? #cores czy #cores -1?

12

Mam duże obliczenia do zrobienia. Chociaż mogę wykorzystać wszystkie rdzenie, pomyślałem, że istnieje jakiś powód, aby zrezygnować z 1 rdzenia i go nie wykorzystywać? (procesor obliczeniowy tylko bez IO). Czy też nie doceniam systemu operacyjnego, którego nie wiedziałby, jak obsługiwać i dokonywać właściwego przełączania kontekstu, nawet jeśli wykorzystam wszystkie rdzenie?

Jas
źródło
8
Wykorzystanie wszystkich rdzeni jest dobrym początkiem, a niektóre przesądy o tym, że system operacyjny zachowuje się lepiej z „rdzeniami -1” jest prawdopodobnie po prostu - przesądem, ale powinieneś go profilować, jak zachowuje się w obliczeniach, twoim sprzęcie, systemie operacyjnym.
Doc Brown
W wielu przypadkach użycie # rdzeni + 1 ma sens. Jeśli użyjesz # rdzeni, każde nieoczekiwane zablokowanie (takie jak błąd strony) niepotrzebnie zmusza rdzeń do bezczynności.
David Schwartz

Odpowiedzi:

28

Główne systemy operacyjne są wystarczająco dojrzałe, aby wiedzieć, jak obsługiwać procesy wykorzystujące każdy dostępny rdzeń. Może to mieć wpływ (i często będzie) na inne procesy, ale obliczenia nie ulegną spowolnieniu, ponieważ wykorzystano każdy dostępny rdzeń.

Wybór liczby rdzeni zależy bardziej od zamiaru zrobienia czegoś innego podczas wykonywania obliczeń.

Jeśli na komputerze stacjonarnym chcesz mieć możliwość korzystania z przeglądarki internetowej lub oglądania wideo podczas obliczeń, lepiej pozostaw jeden rdzeń wolny. W ten sam sposób, jeśli serwer wykonuje dwie czynności (takie jak obliczenia, a jednocześnie przetwarzanie i raportowanie swoich metryk), dobrym pomysłem może być pozostawienie wolnego rdzenia dla zadania pobocznego.

Z drugiej strony, jeśli Twoim priorytetem jest jak najszybsze wykonanie obliczeń, musisz użyć wszystkich rdzeni.

Arseni Mourzenko
źródło
7
Współczesne programy planujące są w rzeczywistości całkiem dobre w utrzymywaniu interaktywności programów interaktywnych, gdy występuje duże użycie procesora, pod warunkiem, że programy interaktywne również nie zużywają dużej ilości procesora (co,
oczywiście
Uwaga: nawet na serwerach, jeśli chcesz móc ssh i uzyskać szybką odpowiedź, pozostawienie rdzenia 0 w spokoju może być przydatne.
Matthieu M.,
11

To zależy.

Jeśli maszyna jest przeznaczona do tego obliczenia, powinieneś użyć wszystkich rdzeni - nieużywane zasoby obliczeniowe nie przyspieszają .

Jeśli używasz harmonogramu w czasie rzeczywistym, harmonogramu zapobiegawczego lub powinowactwa procesora, powinieneś być nieco bardziej ostrożny, ponieważ łatwo jest przypadkowo zagłodzić inne procesy ze wszystkich zasobów obliczeniowych. Jednak musiałbyś ręcznie zmienić te ustawienia, aby coś poszło nie tak, więc domyślnie nie ma tutaj problemu w większości systemów operacyjnych.

Jeśli maszyna nie jest przeznaczona do obliczeń, podanie 100% obliczeń może nie być idealne. Na przykład, jeśli korzystasz z przeglądarki internetowej podczas obliczeń. Ponieważ obciążenie Twojej maszyny czasami osiąga wartość szczytową powyżej 100%, będzie się wydawać powolne. Zadania zorientowane na przepustowość, takie jak obliczenia, nie zostaną tak naprawdę spowolnione, ale zadania wrażliwe na opóźnienia, takie jak GUI, nie zareagują tak szybko. W takim przypadku sensowne jest uruchamianie tylko wątków / procesów NPROC-1 do obliczeń. Alternatywnie, jawne użycie niższego priorytetu dla obliczeń niż dla normalnych zadań może rozwiązać ten problem, w którym to przypadku obliczenia powinny wykorzystywać procesy NPROC, aby nie marnować żadnych zasobów.

amon
źródło
3
„jeśli korzystasz z przeglądarki internetowej, gdy obliczenia są uruchomione […], poczujesz się powolny. Zadania zorientowane na przepustowość, takie jak obliczenia, nie zostaną tak naprawdę spowolnione, ale zadania wrażliwe na opóźnienia, takie jak GUI, nie zareagują tak szybko. [ …] Jawne użycie niższego priorytetu do obliczeń niż do normalnych zadań może rozwiązać ten problem ”- dlatego wartość priorytetu procesu w Uniksie nazywa się„ niceness ”i jest konfigurowana za pomocą narzędzia o nazwie nice.
Jörg W Mittag
2
„niewykorzystane zasoby komputerowe nie przyspieszają” technicznie mogłyby. Korzystanie z mniejszej liczby rdzeni może pozwolić na wyższą częstotliwość taktowania i zmniejszyć synchronizację, co może, ale nie musi, przyspieszyć.
Davidmh,
2
Oprócz notatek @Davidmh zwykle po stronie procesora L1 $ i L2 $ są w pewnym stopniu współdzielone między wątkami, a L3 $ jest dzielone na wszystkie gniazda, więc użycie większej liczby wątków może spowodować, że więcej $ spowolni procesy. Zwłaszcza jeśli proces jest związany z pamięcią, a nie z procesorem.
Maciej Piechotka,
JEŚLI odpowiednio ustawisz poziomy priorytetów wątku / procesu, możesz złagodzić wpływ pracy w tle na procesy interaktywne. Od ponad dekady korzystam z rozproszonych aplikacji komputerowych na moim komputerze osobistym; a przy niewielkim priorytecie zadań obliczeniowych procesora moja zdolność do korzystania z przeglądarek i innych normalnych aplikacji komputerowych nie jest ograniczona. Współdzielenie zasobów na GPU nie jest tak zaawansowane, a od czasu do czasu napotykałem problemy z przyspieszonym przez GPU wideo HTML5 (nie mówiąc o grach) podczas uruchamiania obliczeń GPU w tle. Gry wielowątkowe mogą być problematyczne nawet przy lekkim GFX; wygrywaj głoduj w wątkach 2+
Dan Is Fiddling By Firelight
1

Jestem nieco ostrożny w zgodzie z poniższym @motoDrizzt, ze względu na jego negatywne głosy :), ale tak naprawdę było to moje rzeczywiste doświadczenie - więcej jest lepszych, nawet ponad rzeczywistą liczbę rdzeni (ale nie tysięcy). Na przykład spójrz na http://www.forkosh.com/images/avoronoi.gif, gdzie każdą płaszczyznę 2D tego 3D-voronoi_diagram można wygenerować niezależnie. A program pobiera atrybut nfork = n query_string, aby „wydzielić” obliczenia dla n płaszczyzn.

W przypadku czterordzeniowego procesora czas (użytkownika) na ukończenie schematu zmniejsza się prawie liniowo wraz z nfork, aż do około nfork = 8 (czterordzeniowy hyperthreaded). Ale po 8, czas wciąż maleje, choć wolniej. Ponad 16 lub więcej lat nie widać dalszej poprawy. W ogóle nie analizowałem tego zachowania, ale naiwnie przypisuję je do procesów żonglowania systemem operacyjnym os (w tym przypadku linux slackware 14.2x64), aby jeszcze bardziej skrócić ogólny czas bezczynności.

John Forkosh
źródło
0

Najlepszy wybór zależy od systemu. Więc co chcesz zrobić, to uruchomić obie wersje na prawdziwym systemie, a następnie sprawdzić, jak system zareaguje. Czy nadal możesz korzystać z przeglądarki, edytora tekstu i innych rzeczy w systemie? Czy wydajność jest lepsza przy użyciu n wątków, a nie n-1? Co się stanie, jeśli uruchomisz aplikację razem z inną aplikacją, która próbuje korzystać ze wszystkich procesorów?

A potem musisz rozważyć hiperwątkowanie. Dzięki czterem rdzeniom plus hyperthreading możesz użyć 8 rdzeni lub 7 rdzeni. Ponownie wypróbuj responsywność systemu i czas na zakończenie.

Wreszcie rozważ podzielenie pracy na więcej bloków niż wątków. Powodem jest to, że różne wątki zakończą zadanie w różnym czasie, a następnie chcesz pozostawić trochę pracy do szybszych wątków. W przeciwnym razie musisz poczekać, aż ostatni wątek zostanie zakończony.

PS. „Hyperthreading nie pomaga w intensywnym kodzie FPU, ponieważ jest tylko jeden FPU”. Zupełnie źle. Niezwykle trudne jest, nawet przy intensywnym kodzie FPU, pełne wykorzystanie FPU ze względu na opóźnienia. Hyperthreading pomaga, ponieważ istnieje dwa razy więcej niezależnych operacji dostępnych do planowania.

gnasher729
źródło
-4

Nie wiem, jak to napisać w sposób, który nie brzmi „źle”, więc weź to jako przyjazną uwagę, ok?

Biorąc pod uwagę, że przeciętny komputer ma już zwykle tysiące lub więcej wątków, co sprawia, że ​​myślisz, że użycie 8 vs 7 zrobi jakąkolwiek różnicę? :-)

Użyj jak największej liczby wątków. A jeśli nie musisz przejmować się odpowiedzią systemu operacyjnego, a twoje wątki działają przez dość długi czas (ponad sekundę), możesz nawet eksperymentować z użyciem dwukrotnie większej liczby rdzeni.

motoDrizzt
źródło
3
Ale większość z tych tysięcy wątków nie używa 100% procesora, prawda?
Andreas Rejbrand,
1
Użycie podwójnej liczby rdzeni zasadniczo nie skraca czasu obliczeń. W rzeczywistości użycie większej liczby rdzeni fizycznych nie jest generalnie korzystne, nawet jeśli masz więcej logicznych rdzeni (poprzez HyperThreading itp .; chociaż może to zależeć od dokładnego zadania, które wykonujesz). Źródło: doświadczenia z przeszłości, przy użyciu przetwarzania równoległego MATLAB.
Sanchises
1
@Sanchises Dzieje się tak, ponieważ hyperthreading wykorzystuje quasi-równoległe przeplatanie instrukcji - jest skuteczny dla rozgałęzionego i obciążającego pamięć kodu. Obliczenia macierzy są bardzo intensywne FPU, a na jeden rdzeń fizyczny przypada tylko jedna FPU, więc hiperwątkowanie nie może ci pomóc.
J ...