Параллельные алгоритмы STL в OS X - PullRequest
7 голосов
/ 17 ноября 2011

Я работаю над преобразованием существующей программы, чтобы использовать некоторые параллельные функции STL.

В частности, я переписал большой цикл для работы с std :: накоплением. Это работает, приятно.

Теперь я хочу, чтобы эта операция накопления выполнялась параллельно.

Документация, которую я видел для GCC, описывает два конкретных шага.

  1. Включить флаг компилятора -D_GLIBCXX_PARALLEL
  2. Возможно добавить заголовок <parallel/algorithm>

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

При добавлении заголовка параллельного / алгоритма появляется ошибка. Я думал, что это будет включено в последнюю версию GCC (4.7).

Итак, несколько вопросов:

  1. Есть ли какой-то способ окончательно определить, работает ли код параллельно?
  2. Есть ли "лучшие практики" способ сделать это на OS X? (Идеальные флаги компилятора, заголовок и т. Д.?)

Любые предложения приветствуются.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

См. http://threadingbuildingblocks.org/

Если вы когда-либо распараллеливаете алгоритмы STL, вы будете разочарованы результатами в целом.Эти алгоритмы, как правило, начинают проявлять преимущество масштабируемости только при работе с очень большими наборами данных (например, N> 10 миллионов).

TBB (и другие подобные ему) работают на более высоком уровне, концентрируясь на общей структуре алгоритма,не только листовые функции (например, std :: collectulate ()).

0 голосов
/ 16 августа 2014
  • Второй альтернативой является использование OpenMP, который поддерживается как GCC, так и Clang, хотя он и не является STL, но кроссплатформенным.
  • Третий вариант - использование Grand Central Dispatch.- официальный многоядерный API в OSX, опять-таки вряд ли STL.
  • Четвертая альтернатива - ждать C ++ 17, он будет иметь модуль параллелизма.
...