Алгоритмы STL и параллельное программирование

может ли любой из алгоритмов STL / контейнерных операций, таких как std:: fill, std:: transform будет выполняться параллельно, если я включу OpenMP для моего компилятора? На данный момент я работаю с MSVC 2008. Или может есть другие способы сделать это одновременно?

спасибо.

4 ответов


существует ряд проектов, направленных на наличие параллельных библиотек типов STL:

  1. Многопоточная Библиотека Шаблонов OpenMP
  2. libstdc++ parallel
  3. HPC++ параллельная стандартная библиотека шаблонов
  4. Библиотека Параллельных Шаблонов (беззастенчиво заимствовали из ответа AshleysBrain х)

гарантии std::transform и std::fill чтобы быть параллельным, вам придется написать свою собственную версию. Общая реализация этих функций предназначена для последовательного выполнения.

давайте std::fill в качестве простого примера. При преобразовании в parallel вам нужно будет разбить функцию на меньшие функции, которые могут выполняться асинхронно без каких-либо взаимозависимостей. Например, одна подфункция может заполнить первую половину, а вторая подфункция может заполнить вторая половина. Родительская функция должна была бы делегировать (форк) две подфункции и ждать их завершения (соединения).

больший вопрос заключается в том, могут ли накладные расходы, затраченные на подготовку к параллельному выполнению, компенсировать фактическое время параллельного выполнения. Большие заливки будут иметь более высокое обоснование, чем меньшие заливки.

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

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


текущие стандарты C++ вообще не говорят о потоках, поэтому нет. здесь является более или менее оригинальным заявлением о безопасности потока STL.

Edit:

посмотрите на одну общую (GCC) реализацию std::fill:

template<typename _ForwardIter, typename _Tp>
  void
  fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
  {
      for ( ; __first != __last; ++__first)
          *__first = __value; 
  }

очевидно, что это небезопасно для параллельного выполнения (что потребует специализированной реализации.)

и вот расширение GCC для Параллельном Режиме.


Visual Studio 2010 предоставляет Библиотека Параллельных Шаблонов который имеет алгоритмы стиля STL, которые выполняются параллельно. Конечно, это специфично для Microsoft для VS2010 (и, я думаю, выше).