С++ Jobqueue: существует ли правило для числа рабочих потоков?

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

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

Спасибо

3 ответа

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

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


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

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


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

licensed under cc by-sa 3.0 with attribution.