W jaki sposób rdzenie procesora są dystrybuowane do każdego jądra podczas obliczania równoległości?

Aug 16 2020

Chcę się tylko upewnić, że dobrze rozumiem, zanim zadam pytania. Widziałem, jak niektórzy mówią, że niektóre funkcje w Mathematica będą automatycznie używać wielu rdzeni (nie mówię o tych, które zrównoleglamy, ale NIntegrateodnoszę się do takich jak ), więc myślę, że jeśli mam 2 rdzenie, będzie szybszy niż pojedynczy rdzeń. Więc moje pytania są takie, czy mam kod podobny do następującego:ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]

Myślę, że zostaną uruchomione trzy jądra. Jeśli mam 4 rdzenie, w jaki sposób te cztery rdzenie są dystrybuowane do każdego jądra? (Ponieważ myślę, że każde jądro może używać wielu rdzeni w oparciu o właściwość integracji funkcji)

Odpowiedzi

4 AndreasLauschke Aug 16 2020 at 23:03

Witaj noo-b, m.se to świetna społeczność, w której można bez końca poznawać M!

Myślę, że masz kilka fałszywych założeń:

Po pierwsze, nawet operacje jednowątkowe mogą obejmować wiele rdzeni. Dobry system operacyjny stara się tego uniknąć, ale co kilka sekund może przełączyć się na inny rdzeń lub może rozdzielić obciążenie na wiele rdzeni - chociaż ten ostatni zwykle nie trwa przez dłuższy czas.

Po drugie, nie można zakładać, że NIntegrate będzie zawsze pracować równolegle dla wszystkich danych wejściowych, aw szczególności nie można zakładać, że NIntegrate będzie pracować równolegle przez cały czas obliczeń. Może być równoległy tylko dla inicjalizacji lub na końcu lub w wybranych zadaniach pomiędzy. Na przykład,

Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]

jeśli spojrzysz na wykorzystanie rdzenia (nie: wykorzystanie procesu, jak w prostym menedżerze zadań) - jeśli używasz Linuksa, możesz uruchomić od góry i nacisnąć 1 - zobaczysz, że spędza to 99% czasu na jeden rdzeń. Po pewnym czasie może zmienić rdzeń, ale wtedy widać 99% dla tego rdzenia. Więc nie widzę NIntegrate wątków w ogóle na wielu rdzeniach, przynajmniej nie przez cały czas (być może przez ułamki sekund). Może się to różnić w przypadku różnych wejść NIntegrate, ale ten prosty przykład pokazuje, że NIntegrate nie zawsze jest równoległy, a nie przez cały czas trwania obliczeń.

W przypadku struktury równoległości M to się nie zmienia, to naprawdę kwestia systemu operacyjnego. Dzięki ParallelTable (i braciom) po prostu dostarczasz zadania przetwarzania z większej liczby procesów, a sposób, w jaki system operacyjny planuje to do rdzeni, zależy wyłącznie od systemu operacyjnego. Nie można więc tak naprawdę „wycofać” przypisania rdzeniom ze zrozumienia równoległych procesów.

trochę styczna:

W Scali, Javie lub C # (lub wielu innych językach) możesz planować zadania na poziomie wątku. Ale nawet wtedy od operatorów zależy zaplanowanie rozmieszczenia bieżników do rdzeni. Dzięki vmstat w Javie masz wspaniałą wizualizację wątków (poziome paski, które rosną w czasie, jeden na wątek). Myślę, że naprawdę interesuje Cię to, jak działają rzeczy w wątkach, niekoniecznie jak wątki są przypisane do rdzeni . Mając to na uwadze, wątki są koncepcją oprogramowania, a nie sprzętem, rdzeń nie wie, co to jest wątek. Ale myślę, że analiza wątków powie ci więcej, aby zrozumieć współbieżność, ponieważ przypisanie do rdzeni i przełączanie rdzeni oraz procent obciążenia dla każdego rdzenia zależy całkowicie od systemu operacyjnego.

4 Szabolcs Aug 16 2020 at 23:51

Istnieją funkcje, które automatycznie używają wielu rdzeni. Liczba używanych rdzeni zależy od niektórych ustawień w programie SystemOptions["ParallelOptions"].

Jeśli użyjesz takich funkcji w jądrach podrzędnych, będą one używać tylko jednego rdzenia. Możesz to sprawdzić, patrząc na ParallelEvaluate@SystemOptions["ParallelOptions"]. Zauważ, że wszystkie liczby wątków są ustawione na 1 w jądrach podrzędnych.

Ogólnie rzecz biorąc, jawna równoległość (na przykład ParallelTable) nie jest tak wydajna, jak wbudowana równoległość niektórych funkcji. Tak więc, jeśli twoim wąskim gardłem jest funkcja, która już działa równolegle, to zaimplementowanie dodatkowej równoległości z ParallelTablefunkcjami pokrewnymi spowolni ją (lub przynajmniej spowolniło we wszystkich przypadkach, które sprawdziłem).