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

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

Спасибо.

16
задан Andrew 30 March 2010 в 18:16
поделиться

4 ответа

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

  1. Библиотека многопоточных шаблонов OpenMP
  2. libstdc ++ parallel
  3. Библиотека стандартных параллельных шаблонов HPC ++
  4. Библиотека параллельных шаблонов ( бесстыдно заимствовано из ответа AshleysBrain)
16
ответ дан 30 November 2019 в 21:53
поделиться

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

Редактировать:

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

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

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

А вот расширение GCC для параллельного режима .

2
ответ дан 30 November 2019 в 21:53
поделиться

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

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

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

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

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

3
ответ дан 30 November 2019 в 21:53
поделиться

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

2
ответ дан 30 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: