Подтвердить что ты не робот

Pthreads против OpenMP

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

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

Каковы преимущества и недостатки использования?

Edit:

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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