c ++ Jobqueue: есть ли эмпирическое правило для количества рабочих потоков? - PullRequest
3 голосов
/ 04 декабря 2010

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

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 04 декабря 2010

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

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

2 голосов
/ 04 декабря 2010

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

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

0 голосов
/ 04 декабря 2010

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

...