Работая с различными элементами std :: vector параллельно - PullRequest
5 голосов
/ 14 сентября 2011

Скажите, у меня есть std::vector<Object*>.Вектор большой (> 1000 элементов), и для каждого Object* необходимо выполнить обширные вычисления.Цикл for, который затем выполняет каждое вычисление для каждого элемента, можно легко распараллелить.Фактически, я мог обрабатывать все 1000 элементов параллельно для максимального ускорения («смущающе параллельно»?)

Теперь мне интересно 2 вещи:

1) Безопасно ли читать и писать различных элементов из std::vector без блокировки?( не , изменяющий сам вектор!)

2) Существуют ли простые способы, соглашения или шаблоны, которым нужно следовать для вырезания цикла for и отправки в потоки?

Ответы [ 4 ]

4 голосов
/ 14 сентября 2011

1) Да

2) Вы можете использовать OpenMP для паралеллизации обработки векторов. Если вы работаете с Microsoft VC ++ 2010, библиотека параллелизма имеет алгоритмы parallel_for и parallel_for_each.

4 голосов
/ 14 сентября 2011

Для 1 см. Мой ответ здесь :

§ 23.2.2 Гонки контейнерных данных

2 / Несмотря на (17.6.5.9), реализации должны избегать гонок данных, когда содержимое содержимого объекта в различных элементах в одной и той же последовательности, за исключением vector<bool>, изменяется одновременно.

Очевидно, что это C ++ 11 (так как C ++ 98/03 не упоминал о потоках), однако большинство реализаций уже соответствует.

Боюсь, я не знаю никаких соглашений. OpenMP, вероятно, может автоматизировать это.

Чтобы сделать это вручную, я бы, вероятно, использовал систему, похожую на очередь, поскольку не всем объектам может потребоваться одно и то же время, вы могли бы закончить один поток намного быстрее, чем другие, если бы вы разделялись на «равные» части, тогда как очередь подача потоков облегчит эту проблему, увеличив параллелизм вплоть до самого конца.

0 голосов
/ 21 августа 2013

Если вы используете g ++, вы можете использовать параллельный режим gnu http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html, используя стандартные алгоритмы stl в сочетании с лямбда, которые автоматически распараллеливаются.

0 голосов
/ 14 сентября 2011

Если вы используете VS 2010, вы можете использовать библиотеку Parallel Patterns для достижения многопоточности.

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