Pthreads против OpenMP

Я создаю многопоточное приложение на C с использованием Linux.

Я не уверен, следует ли мне использовать API потока POSIX или API OpenMP.

Каковы плюсы и минусы их использования?

Изменить:

Может ли кто-нибудь уточнить, создают ли оба API-интерфейса потоки уровня ядра или уровня пользователя?


person Community    schedule 16.10.2010    source источник
comment
Re: ваше редактирование (на уровне ядра или на уровне пользователя?) - это зависит от реализации! API - это всего лишь интерфейс. OpenMP не является реализацией - но это некоторые реализации. (Немного информации можно найти в этой статье в Википедии).   -  person Matt Ball    schedule 17.10.2010
comment
По сути, если вы можете делать то, что вам нужно в OpenMP, вы должны делать это в OpenMP.   -  person Jonathan Dursi    schedule 02.11.2011
comment
OpenMP следует использовать для циклов, которые должны вычисляться на всех ядрах. PThread тоже может это сделать, но это много работы и очень сложно поддерживать, вы обычно используете PThread, если вам нужно запустить отдельный процесс, который не должен блокировать основной поток. Например: у вас есть сервер, клиенты подключаются и должны поддерживать соединение с сервером и разговаривать с ним, вы создаете поток для каждого клиента и работаете с клиентом в этом потоке, не блокируя основной поток. Это как если бы вы создали новое приложение и позволили ему работать в операционной системе, не беспокоя главное приложение.   -  person Lilian A. Moraru    schedule 17.03.2012
comment
дубликат stackoverflow.com/questions/935467/   -  person steffen    schedule 22.07.2012


Ответы (4)


Pthreads и OpenMP представляют две совершенно разные парадигмы многопроцессорной обработки.

Pthreads - это API очень низкого уровня для работы с потоками. Таким образом, у вас есть чрезвычайно точный контроль над управлением потоками (создание / соединение / и т. Д.), Мьютексами и т. Д. Это довольно просто.

С другой стороны, OpenMP намного более высокого уровня, более портативен и не ограничивает вас использованием C. Он также намного легче масштабируется, чем pthreads. Одним из конкретных примеров этого являются конструкции разделения работы OpenMP, которые позволяют с относительной легкостью разделять работу между несколькими потоками. (См. Также список плюсов и минусов в Википедии.)

Тем не менее, вы действительно не предоставили подробностей о конкретной программе, которую вы реализуете, или о том, как вы планируете ее использовать, поэтому практически невозможно рекомендовать один API другому.

person Matt Ball    schedule 16.10.2010

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

Но, как обычно, вы получаете больше гибкости с pthreads.

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

person Oliver Charlesworth    schedule 16.10.2010
comment
Отвечая на вопросы вопросами ... tsk;) Было бы здорово, если бы вы пояснили, как ответы на эти вопросы на самом деле влияют на решение использовать pthreads против OpenMP. - person Engineer; 18.03.2015

OpenMP имеет преимущества кроссплатформенности и простоты для некоторых операций. Он обрабатывает многопоточность по-другому, так как предоставляет вам параметры многопоточности более высокого уровня, такие как распараллеливание циклов, например:

#pragma omp parallel for
for (i = 0; i < 500; i++)
    arr[i] = 2 * i;

Если вас это интересует и если можно использовать C ++, я бы также порекомендовал стандартные блоки потоков.

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

person Reed Copsey    schedule 16.10.2010
comment
Потоки POSIX, являющиеся частью стандарта POSIX, являются кроссплатформенными. OpenMP, которого нет ни в одной из известных мне операционных систем или стандартов языка C, не является кроссплатформенным, если у вас нет действительно странного представления о том, что такое кроссплатформенность. - person R.. GitHub STOP HELPING ICE; 16.10.2010
comment
@Р. - OpenMP действительно кроссплатформенный, даже если формально не стандартизирован, с API C ++ и C. ср. Boost в мире C ++ - не стандарт де-юре, а стандарт де-факто. - person Steve Townsend; 16.10.2010
comment
@R ..: Я не уверен, что вы имеете в виду, стандарт OpenMP C API доступен в этой спецификации (openmp.org/mp-documents/cspec20.pdf). Разве вы не имели в виду, не стандартизированный IEEE / ANSI / ISO? - person J. M. Becker; 09.06.2013
comment
Кто угодно может написать спецификацию API и назвать ее стандартом. Это не делает его одним. В любом случае, язык моего комментария был довольно ясным, чтобы объяснить это: он не присутствует ни в какой операционной системе или стандарте языка C. - person R.. GitHub STOP HELPING ICE; 09.06.2013
comment
Это все равно, что сказать, что OpenGL не является кроссплатформенным, потому что он не является частью C или какой-либо операционной системы. - person Big Temp; 13.11.2020

Это зависит от двух вещей - вашей кодовой базы и вашего места в ней. Ключевые вопросы: 1) «Есть ли у вашей кодовой базы потоки, пулы потоков и примитивы управления (блокировки, события и т. Д.)» И 2) «Вы разрабатываете повторно используемые библиотеки или обычные приложения?»

Если в вашей библиотеке есть инструменты для работы с потоками (почти всегда построенные на некоторой разновидности PThread), ИСПОЛЬЗУЙТЕ ЭТИ. Если вы разработчик библиотек, потратьте время (если возможно) на их создание. Это того стоит - вы можете собрать гораздо более мелкозернистую расширенную многопоточную обработку, чем OpenMP дает вам.

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

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

person Zack Yezek    schedule 07.08.2013