Можно ли использовать объекты данных TBB с OpenMP?

У меня есть программа на 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);

person Richard    schedule 25.02.2012    source источник
comment
другая альтернатива - cilk++   -  person pyCthon    schedule 26.02.2012
comment
Спасибо @pyCthon. Кажется, его нет в моих репозиториях, поэтому я ненавижу его использовать. Но я буду иметь это в виду.   -  person Richard    schedule 26.02.2012


Ответы (3)


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

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

-

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

person Alexey Kukanov    schedule 27.02.2012

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

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

person 111111    schedule 25.02.2012

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

person Rick    schedule 26.02.2012
comment
Рик, твой ответ не содержит ни источников, ни ссылок. Я помню, как читал, что потоки TBB и OpenMP могут сосуществовать, но это может привести к перегрузке ядер. Что не просто глупо, а является плохой практикой. - person Richard; 26.02.2012
comment
Я участвовал в написании спецификаций для нескольких структур данных и хорошо с ними знаком, посмотрите мой профиль. Все структуры данных concurrent_foo являются потокобезопасными в tbb и openmp, также можно использовать блокировки и атомарные классы. Вы можете найти эту информацию в документации TBB, если решите ее поискать. - person Rick; 27.02.2012
comment
Я всегда думал, что одна из прекрасных особенностей stackoverflow — это то, как он собирает знания, разбросанные по многим источникам, в одно легко доступное для поиска место. Ваш профиль не является очевидным источником информации, и одного вашего утверждения недостаточно. Я просматривал документацию, но пока не нашел там четкого или краткого ответа. Если вы знаете, где это, я приглашаю вас опубликовать это здесь. - person Richard; 27.02.2012
comment
threadingbuildingblocks.org/features&benefits.php в разделе совместимости. Он также указан в разделе 12.2.8 справочного руководства. - person Rick; 27.02.2012