Можно ли использовать объекты данных TBB с OpenMP? - PullRequest
1 голос
/ 26 февраля 2012

У меня есть программа на C ++, которая работает достаточно хорошо, используя OpenMP для распараллеливания циклов.

Однако есть некоторые фрагменты кода - те, которые используют очереди и приоритетные очереди и т. П. - которые будут работать параллельно, только если я объявлю доступ к ним критическим.

Альтернативным вариантом будет использование объектов данных TBB, таких как concurrent_queue. Но могу ли я использовать эти объекты данных с OpenMP и без остальной части TBB?

Источники и ссылки приветствуются.

Спасибо!

Обновление

Например, разрешен ли следующий вид сочетания TBB и OpenMP?

concurrent_queue<int> queue;
#pragma omp parallel for
for( int i=0; i<1000; i++ )
    queue.push(i);

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

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

Intel® Threading Building Blocks совместим с другими пакетами потоков.Поскольку библиотека не предназначена для решения всех проблем с потоками, она может беспрепятственно сосуществовать с другими пакетами потоков.

-

Intel® Threading Building Blocks предоставляет высококонкурентные классы контейнеров,Эти контейнеры могут использоваться с необработанными потоками Windows * или Linux * или в сочетании с программированием на основе задач.

1 голос
/ 26 февраля 2012

TBB предназначен для работы с openMP, в руководстве программиста перечислено, что работает.

Вы всегда можете изменить критические секции на мьютекс TBB или std :: mutex с scoped_locks.

0 голосов
/ 26 февраля 2012

Все параллельные структуры данных и объекты синхронизации в tbb будут прекрасно работать с OpenMP (задача тоже будет работать, но это может быть немного глупо).

...