Оптимальное количество потоков на ядро - PullRequest
256 голосов
/ 12 ноября 2009

Допустим, у меня есть 4-ядерный процессор, и я хочу запустить какой-то процесс за минимальное количество времени. Этот процесс идеально распараллеливается, поэтому я могу запускать его в бесконечном количестве потоков, и каждый поток занимает одинаковое количество времени.

Поскольку у меня 4 ядра, я не ожидаю ускорения, запустив больше потоков, чем ядер, поскольку одно ядро ​​способно запустить только один поток в данный момент. Я не очень разбираюсь в оборудовании, так что это только предположение.

Есть ли преимущество запуска параллельного процесса на большем количестве потоков, чем на ядрах? Другими словами, завершится ли мой процесс быстрее, медленнее или примерно за то же время, если я запустю его с использованием 4000 потоков, а не 4 потоков?

Ответы [ 13 ]

2 голосов
/ 12 ноября 2009

В идеале это 1 поток на ядро, если ни один из потоков не заблокирует.

Один случай, когда это может быть не так: на ядре работают другие потоки, и в этом случае большее количество потоков может дать вашей программе больший отрезок времени выполнения.

0 голосов
/ 12 марта 2015

Надеюсь, что это имеет смысл. Проверьте загрузку ЦП и памяти и установите пороговое значение. Если пороговое значение пересечено, не позволяйте создавать новый поток, иначе разрешите ...

0 голосов
/ 12 ноября 2009

Если говорить с точки зрения вычислений и памяти (научные вычисления), 4000 потоков сделают приложение действительно медленным. Частично проблема заключается в очень высоких затратах на переключение контекста и, скорее всего, в очень плохой локализации памяти.

Но это также зависит от вашей архитектуры. Из того, что я слышал, предполагается, что процессоры Niagara могут обрабатывать несколько потоков на одном ядре с использованием некоторой продвинутой техники конвейерной обработки. Однако у меня нет опыта работы с этими процессорами.

...