Pthreads против OpenMP - PullRequest
       19

Pthreads против OpenMP

52 голосов
/ 16 октября 2010

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

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

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

Редактировать:

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

Ответы [ 4 ]

65 голосов
/ 16 октября 2010

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

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

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

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

19 голосов
/ 16 октября 2010

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

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

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

7 голосов
/ 16 октября 2010

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

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

Если вас это интересует, и если C ++ - вариант, я бы также рекомендовал Threading Building Blocks .

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

4 голосов
/ 07 августа 2013

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

Если в вашей библиотеке есть инструменты для работы с потоками (почти всегда основанные на какой-то разновидности PThread), используйте их. Если вы разработчик библиотеки, потратьте время (если возможно) на их создание. Это того стоит - вы можете собрать гораздо более тонкую, расширенную многопоточность, чем даст вам OpenMP.

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

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

...