увеличить поток пула потоком, который обрабатывает очередь ввода-вывода - PullRequest
1 голос
/ 23 декабря 2011

Я недавно начал экспериментировать с псевдоусилом пула потоков (псевдо, потому что он еще не был официально принят).

В качестве простого упражнения я инициализировал пул потоков максимум с двумя потоками .

Каждое задание выполняет две вещи:

  • интенсивная загрузка процессора
  • записывает результат на диск

Вопрос

Как изменить модель в пул потоков , который:

  • интенсивная загрузка процессора

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

  • записывает результат на диск

Должен ли я просто попросить задачу связаться с потоком ввода-вывода (порожденный как std :: thread) через std :: condition_variable (по существу, мьютексированную очередь результатов вычислений) или есть способ сделать все это в библиотеке потоков пула?

Или реализация gcc 4.6.1 future и promise достаточно зрелая, чтобы я смог это осуществить?

Ответ

Выглядит как простая очередь мьютекса с условной переменной работает нормально.

Группируя доступ на чтение и запись, в дополнение к использованию пула потоков, я получил следующие улучшения:

  • 2-х ядерная машина: 1 ч 14 м до 33 м (сокращение времени работы на 46%)
  • 4 ядра vm: от 40 до 18 м (сокращение времени работы на 55%)

Благодарю Мартина Джеймса за вдумчивый ответ. Перед этим упражнением я думал, что мой следующий вычислительный сервер должен иметь два процессора и тонну памяти. Но теперь, когда многоядерность и гиперпоточность присущи такой большой вычислительной мощности, я понимаю, что, вероятно, лучше потратить деньги на устранение узких мест ввода-вывода.

Как упоминал Мартин, вероятно, поможет наличие нескольких дисков или конфигураций RAID. Я также рассмотрю настройку буфера ввода / вывода на уровне ядра.

1 Ответ

2 голосов
/ 23 декабря 2011

Если есть только один локальный диск, мой поток записи в конце очереди «производитель-потребитель» будет моим любимым.Поиски, задержки сетевого диска и другие сбои не оставят никаких объединенных потоков, которые завершили свои вычисления, застрявшими при попытке записи на диск.Другие операции с диском (например, выберите другое место / файл / папку) также проще / быстрее, если к нему обращается только один поток - очередь займет свободное место и разрешит непрерывный расчет во время задержки.Запись напрямую из задачи калькуляции или отправка записи результатов в виде отдельной задачи будет работать нормально, но вам потребуется больше потоков в пуле для выполнения операции без пауз.,Более чем один поток писателей стал бы полезным предложением из-за увеличения общей производительности.Тогда я бы, вероятно, пошел с массивом / списком очередей / потоков записи, по одному на каждый диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...