Я недавно начал экспериментировать с псевдоусилом пула потоков (псевдо, потому что он еще не был официально принят).
В качестве простого упражнения я инициализировал пул потоков максимум с двумя потоками .
Каждое задание выполняет две вещи:
- интенсивная загрузка процессора
- записывает результат на диск
Вопрос
Как изменить модель в пул потоков , который:
- интенсивная загрузка процессора
и одиночный поток ввода-вывода , который ожидает завершения из пула потоков - берет результирующую память и просто:
- записывает результат на диск
Должен ли я просто попросить задачу связаться с потоком ввода-вывода (порожденный
как std :: thread) через std :: condition_variable (по существу, мьютексированную очередь результатов вычислений) или есть способ
сделать все это в библиотеке потоков пула?
Или реализация gcc 4.6.1 future
и promise
достаточно зрелая, чтобы я смог это осуществить?
Ответ
Выглядит как простая очередь мьютекса с условной переменной работает нормально.
Группируя доступ на чтение и запись, в дополнение к использованию пула потоков, я получил следующие улучшения:
- 2-х ядерная машина: 1 ч 14 м до 33 м (сокращение времени работы на 46%)
- 4 ядра vm: от 40 до 18 м (сокращение времени работы на 55%)
Благодарю Мартина Джеймса за вдумчивый ответ. Перед этим упражнением я думал, что мой следующий вычислительный сервер должен иметь два процессора и тонну памяти. Но теперь, когда многоядерность и гиперпоточность присущи такой большой вычислительной мощности, я понимаю, что, вероятно, лучше потратить деньги на устранение узких мест ввода-вывода.
Как упоминал Мартин, вероятно, поможет наличие нескольких дисков или конфигураций RAID. Я также рассмотрю настройку буфера ввода / вывода на уровне ядра.