Привязка потоков к процессорам - PullRequest
7 голосов
/ 22 сентября 2009

Когда я запускаю свой многопоточный код, система (linux) иногда перемещает потоки с одного процессора на другой. Поскольку у меня столько потоков, сколько у меня процессоров, он лишает законной силы кэши без веских причин и сбивает с толку мои операции трассировки.

Знаете ли вы, как связать потоки с процессорами, и почему система делает это?

Ответы [ 2 ]

17 голосов
/ 22 сентября 2009

Использование sched_setaffinity ( это специфично для Linux ).

Почему планировщик переключает потоки между разными процессорами? Что ж, представьте, что ваш поток в последний раз работал на процессоре 1 и в настоящее время ожидает повторного запуска. Тем временем на процессоре 1 работает другой поток, но процессор 2 свободен. В этой ситуации разумно, чтобы планировщик переключил ваш поток на процессор 2. Однако сложный планировщик будет стараться избегать «перепрыгивания» потока между процессорами более чем необходимо.

8 голосов
/ 22 сентября 2009

Вы можете сделать это из Bash. Есть замечательная команда taskset, с которой я познакомился в этом вопросе (вы также можете найти ценную дискуссию о том, как должен работать планировщик). Команда берет pid процесса и привязывает его к определенному процессору (процессорам).

taskset -c 0 -p PID

привязывает процесс с PID к процессору (ядру) с номером 0.

Какое отношение это имеет к темам? Каждому потоку присваивается идентификатор с теми же правами, что и у pid, также известный как «tid». Вы можете получить его с помощью gettid системного вызова. Или вы можете посмотреть его, например, в программе top, нажав H (некоторые процессы разделяются на множество, казалось бы, одинаковых записей с разными pids - это потоки).

...