Смешивание OpenMP с pthreads

мой вопрос в том, хорошо ли смешивать OpenMP с pthreads. Есть ли приложения, которые объединяют эти два. Это хорошая практика смешивать эти два? Или типичные приложения обычно просто используют один из двух.

6 ответов


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

наиболее распространенный случай, когда я делаю это, - это когда у меня есть библиотека нижнего уровня, которая продета с помощью pthreads, но я вызываю ее в пользовательском приложении, которое использует OpenMP.

есть несколько случаев, когда это небезопасно. Если, например, вы убиваете pthread перед выходом из всех областей OpenMP в этом потоке.


Я так не думаю..

Это не очень хорошая идея. Дело в том, что OpenMP в основном создан для переносимости. Теперь, если вы используете pthread, то вы теряете саму суть этого!

pthread может поддерживаться только совместимыми с POSIX ОС. Хотя OpenMP можно использовать практически на любой ОС при условии, что у них есть поддержка.

в любом случае, OpenMP дает вам абстракцию намного выше, чем то, что предоставляется pthead.


нет проблем.

назначение OpenMP и pthreads различны. OpenMP идеально подходит для написания параллелизма на уровне цикла. Однако OpenMP недостаточно для выражения сложных потоков связи и синхронизации. OpenMP не поддерживает все виды синхронизации, такие как переменные условия.

предостережение было бы, как указал Mystrical, обработкой и доступом к собственным потокам в параллельных конструкциях OpenMP.

FYI, TBB Intel и Cilk Plus также часто используются смешанным способом.


в Windows и Linux, похоже, работает нормально. Однако OpenMP не работает на Mac, если он запускается в новом потоке. Он работает только в основном потоке.

похоже, что поведение смешивания двух модулей потоков не определено. Некоторые платформы / компиляторы поддерживают его, другие-нет.


конечно. Я делаю это все время. Ты должен быть осторожен. Но зачем это делать? Потому что есть некоторые случаи, в которых вам нужно! В сложных моделях задач, таких как конвейерные функции, где вы хотите сохранить трубу, это может быть единственным способом, чтобы воспользоваться всей мощью.


Мне очень сложно, что вам нужно будет использовать pthreads, если вы уже используете OpenMP. Вы могли бы использовать раздел pragma для запуска процедур с различными функциями. Я лично использовал его для реализации параллелизма конвейера.

В настоящее время OpenMP делает гораздо больше, чем pthreads, поэтому, если вы используете OpenMP, вы охвачены. Например, GCC 5.0 forward реализует расширения OpenMP, экспортирующие код в GPU. : D