STL алгоритмы и параллельное программирование - PullRequest
16 голосов
/ 30 марта 2010

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

Спасибо.

Ответы [ 4 ]

16 голосов
/ 30 марта 2010

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

  1. Библиотека многопоточных шаблонов OpenMP
  2. libstdc ++ параллельно
  3. Библиотека параллельных стандартных шаблонов HPC ++
  4. Библиотека параллельных шаблонов (бесстыдно позаимствовано из ответа Эшли Брейна)
3 голосов
/ 30 марта 2010

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

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

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

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

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

2 голосов
/ 31 марта 2010

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

2 голосов
/ 30 марта 2010

Современные стандарты 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 для Параллельный режим .

...