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?
12
Odpowiedzi:
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.
źródło
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.
źródło
nice
.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.
źródło
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.
źródło
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.
źródło