c ++ Очередь заданий:Существует ли эмпирическое правило для количества рабочих потоков?

StackOverflow https://stackoverflow.com/questions/4350889

Вопрос

Я только что реализовал самый первый простой многопоточный jobqueue на c ++, и я подумал (и прочитал), что было бы неплохо использовать один рабочий поток для каждого аппаратного потока (в моем случае это было бы 4).По сути, мое приложение просто загружает много изображений (одновременно) из Интернета прямо сейчас, и я замечаю, что получаю огромную скорость, если увеличиваю количество рабочих потоков до 8 или даже 16 вместо 4.

Существует ли общее правило о том, сколько потоков использовать в такой очереди заданий?Я предполагаю, что 4 было бы большим числом, если бы я создавал новые задания в каждом кадре, а рабочие потоки имели постоянную нагрузку в каждом кадре, в то время как, если я хочу обрабатывать много материала одновременно (например, загружать 50 изображений или около того), большее количество потоков, чем это, может значительно ускорить работу.Тем не менее, существует ли эмпирическое правило для правильного числа в разных сценариях?

Спасибо

Это было полезно?

Решение

Идеальное количество рабочих потоков равно количеству сердечников ЦП в системе. Однако в действительности это неоптимально, потому что иногда задачи могут заблокировать на сеть, диск ввода / вывода и т. Д. .. приводя к недоставлению. Это звучит как то, что здесь происходит.

Часто раз пустыми пулы «за график», чтобы компенсировать это. Иногда в поддержке ядра построено уведомление о том, чтобы уведомить вас, когда блок потоков, поэтому вы знаете, чтобы выяснить другой (порыты завершения в Win32) и до сих пор попадают на оптимальное количество активных потоков рабочей силы.

Другие советы

Microsoft решила предоставить реализацию ThreadPool (доступна из ОС, а также доступна в .NET) с количеством потоков, начиная с 1,5 раза больше процессоров. Идея состоит в том, что нить, которая блокирует (для диска ввода / вывода и т. Д.), может поменяться для другого потока, которая не заблокирована. Threadpool также настраивается так, чтобы вы могли требовать минимального количества потоков, если вы решите ли вы, имеющие 2x, 3x или больше потоков.

Я подозреваю, что все это относится к вашей ситуации.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top