2009-09-22 23 views
7

Po uruchomieniu mojego wielowątkowego kodu system (linux) czasami przenosi wątki z jednego procesora na drugi. Ponieważ mam tyle wątków, ile mam procesorów, unieważnia pamięci podręczne bez żadnych dobrych powodów i myli moje działania śledzenia.Powiąż wątki z procesorami

Czy wiesz, jak powiązać wątki z procesorami i dlaczego system to zrobił?

+1

Pamiętaj, że atrybut wątku "do_not_migrate" również działałby ... – Ben

+0

Zbieranie zadań na jednym procesorze i pozostawianie drugiego procesora bez pracy może dać lepszą oszczędność energii. – sambowry

+0

@sambowry: działa na maszynie 24 procesora, byłbym dość marnowaniem energii, aby użyć tylko 1 rdzeń z 24 i utrzymywać maszynę w górze przez 24 czas dłuższy:/ – Ben

Odpowiedz

16

Użyj sched_setaffinity (this is Linux-specific).

Dlaczego program planujący zmieniałby wątki między różnymi procesorami? Cóż, wyobraź sobie, że twój wątek ostatnio działał na procesorze 1 i obecnie oczekuje na zaplanowane wykonanie ponownie. W międzyczasie inny wątek jest aktualnie uruchomiony na procesorze 1, ale procesor 2 jest bezpłatny. W tej sytuacji rozsądne jest, aby program planujący przełączał wątek na procesor 2. Jednak zaawansowany program planujący będzie starał się unikać "odrzucania" wątku między procesorami bardziej niż to konieczne.

+0

Spodziewałbym się, że planista uniknie tego, jeśli istnieje jest mniej wątków niż procesorów ... – Ben

+1

To prawda ... Powiedziałeś w swoim pytaniu, że masz "o wiele więcej wątków niż procesorów" - czy miało to być na odwrót? –

+0

Nie dlatego, że knittl edytuje moje pytanie, nie wiedząc, o czym mówiłem, mam tyle wątków, ile mam procesorów. – Ben

8

Możesz to zrobić z bash. Istnieje cudowne polecenie taskset, które znałem w pytaniu this (możesz również znaleźć cenną dyskusję na temat działania programu planującego). Komenda pobiera pid procesu i łączy go z określonym procesorem (procesorami).

taskset -c 0 -p PID 

wiąże proces z PID do procesora (Core) numer 0.

co to ma wspólnego z wątków? Do każdego wątku przypisany jest identyfikator o takich samych uprawnieniach jak pid, znany również jako "tid". Możesz go pobrać z gettid syscall. Lub możesz go obejrzeć, na przykład, w programie top, naciskając H (niektóre procesy zostaną podzielone na wiele pozornie równych wpisów z różnymi pidami --- to są wątki).

Powiązane problemy