Я использую Concurrency::parallel_for()
библиотеки параллельных шаблонов Visual Studio 2010 (PPL) для обработки индексированного набора задач (обычно набор индексов намного больше, чем число потоки, которые могут выполняться одновременно). Каждая задача, прежде чем делать длительный расчет, начинается с запроса отдельного рабочего ресурса хранения из общего диспетчера ресурсов (в случае: вид на файл с привязкой к конкретным задачам, но я думаю, что сюжетная линия будет одинаковой, если каждая задача запросил выделение частной памяти из общей кучи).Параллелизм :: parallel_for (PPL) создает слишком много потоков
Использование диспетчера разделяемых ресурсов синхронизируется с Concurrency::critical_section
, и здесь возникает проблема: если первый поток/задача находится в критическом разделе, а вторая задача выполняет запрос, ему приходится ждать запроса первой задачи обрабатывается. Очевидно, что PPL думает: эй этот поток ждет, и есть больше задач, поэтому создается другой поток, вызывающий до 870 потоков, которые в основном ждут того же менеджера ресурсов.
Теперь, когда обработка запроса ресурса является лишь малой частью всей задачи, я хотел бы сказать, что PPL в этой части удерживает своих лошадей, ни один из ожидающих или кооперативных блоков не должен заставлять новые потоки начинать с указанный раздел рабочей нити, и мой вопрос здесь: , если и как я могу предотвратить, чтобы определенная секция потока создавала новые потоки, даже если она взаимодействует с блоками. Я бы не прочь создать новые потоки на других блоках дальше по пути обработки потока, но не более чем на 2 * количество (гипер) ядер.
Альтернатива, которые я до сих пор считаюсь:
очередь вверх задача и обрабатывать очередь из ограниченного числа потоков. Проблема. Я надеялся, что PPL parallel_for сделает это сам по себе.
Определить
Concurrency::combinable<Resource> resourceSet
; за пределамиConcurrency::parallel_for
и инициализироватьresourceSet.local()
один раз, чтобы уменьшить количество запросов ресурсов (путем повторного использования ресурсов) до количества потоков (что должно быть меньше количества задач). Проблема: эта оптимизация не предотвращает создание лишней нити.Предварительно выделяйте необходимые ресурсы для каждой задачи вне цикла
parallel_for
. Проблема: это потребует слишком много системных ресурсов, тогда как ограничение количества ресурсов на количество потоков/ядер будет в порядке (если это не взорвалось).
Я прочитал http://msdn.microsoft.com/en-us/library/ff601930.aspx, раздел «Не блокируйте Многократно в параллельном цикле», но следуя советам здесь приведет не параллельных потоков вообще.
Я только что нашел HTTP : //stackoverflow.com/questions/9990363/thread-ids-with-ppl-and-parallel-memory-allocation? rq = 1, который очень похож на этот вопрос. –