Подтвердить что ты не робот

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

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

Спасибо.

4b9b3361

Ответ 2

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

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

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

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

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

Ответ 3

Существующие стандарты С++ вообще не говорят о потоках, так что нет. Здесь является более или менее оригинальным выражением о безопасности потоков 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 для Параллельный режим.

Ответ 4

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