2016-06-20 2 views
-2

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

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

Как распределить м задачу по п нитей в чистом, каноническом виде?

Моим решением было бы запустить «блоки» обрабатываемых процессов, то есть распределить первые n задач в списке на n потоков, доступных (тогда я думаю, что справедливо сделать предположение, что в моей конкретной программе все задачи будут выполняться примерно одинаково) после того, как этот блок будет завершен, распределите следующие n задач и так далее, и если количество задач не будет делиться на n, возьмите оставшиеся k < n задач и выполните их на k нити, в то время как остальные nk-нитки простаивают.

В C++ я уверен, что я мог бы выполнить это довольно легко с цикла for и оператора%. Я знаю, что это не самый эффективный способ сделать это, но я думаю, что ускорение от этого «правильно» (то есть без простоя без потоков) в моем конкретном случае незначительно.

Это правильный способ сделать это? Или, возможно, возможно, если у меня есть общие задачи, чтобы выделить m потоков для задания и позволить процессору справиться с распределением задач?

+2

Как правило: не имеют более активных задач (threds), чем доступные ядра процессора. –

+0

Что это за задачи? И как они распределяются? Просто некоторые идеи. Как только поток заканчивается, он может создать/выделить следующую задачу и продолжить. Или задачи могут быть помещены в очередь (std :: list/std :: deque), надлежащим образом защищенные от условий гонки, и как только поток завершает задачу, он берет следующий из очереди. – Aconcagua

+0

Если каждая задача занимает примерно такое же количество времени, то это прекрасный способ сделать это. Если длины taks меняются, вам может потребоваться задать меньшие блоки задач и дать поток больше, когда это будет сделано. – vu1p3n0x

ответ

1

Перед броском это вручную, если ваша проблема может воспользоваться объектами, найденных в <algorithm>:

http://en.cppreference.com/w/cpp/algorithm

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

+0

Предполагая, что ваша инструментальная цепочка выбора уже реализована, конечно :) – ZaldronGG

Смежные вопросы