Pthreads与OpenMP

我使用Linux在C中创build一个multithreading应用程序。

我不确定是否应该使用POSIX线程API或OpenMP API。

什么是使用两者的优点和缺点?

编辑:

有人可以澄清这两个API是创build内核级还是用户级线程?

Pthread和OpenMP代表了两种完全不同的多处理范例。

Pthreads是一个用于处理线程的非常低级的API。 因此,你对线程pipe理(create / join / etc),互斥锁等有非常细致的控制。 这是相当简单的。

另一方面, OpenMP更高级别,更便携,并不限制您使用C.它也比pthreads更容易缩放。 OpenMP的工作共享结构就是一个具体的例子,它使您能够相对容易地在多个线程之间划分工作。 (另请参阅维基百科的优点和缺点列表 。)

也就是说,你没有提供关于你正在实现的特定程序的细节,也没有提供如何使用它的计划,所以推荐一个API是不可能的。

如果您使用OpenMP, 可以像添加一个附注一样简单,而且您将以线性加速的方式正确执行multithreading代码的90%。 为了获得与pthread相同的性能提升需要更多的工作。

但像往常一样,你可以通过pthread获得更多的灵活性。

基本上,这取决于你的应用程序是什么。 你有一个trivially-parallelisablealgorithm? 或者你只是有很多你想同时执行的任务? 这些任务需要相互交stream多less? 需要多less同步?

OpenMP具有跨平台的优点,并且对于一些操作更简单。 它以不同的方式处理线程,因为它提供了更高级别的线程选项,比如循环的并行化,例如:

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

如果你感兴趣,如果C ++是一个选项,我也推荐线程构build模块 。

Pthreads是一个用于显式生成线程和同步的较低级别的API。 在这方面,它提供了更多的控制。

这取决于2件事 – 你的代码库和你的地方。 关键问题是:1)“你的代码库是否有线程,线程池和控制原语(锁,事件等)”和2)“你在开发可重用的库还是普通的应用程序?

如果你的图书馆有线程工具(几乎总是build立在一些PThread的味道),使用这些。 如果你是一个图书馆开发者,花时间(如果可能的话)来构build它们。 这是值得的 – 你可以放在一起更细粒度,先进的线程比OpenMP会给你。

相反,如果您按时间或只是开发应用程序或第三方工具,请使用OpenMP。 你可以用几个macros包装它,并获得你所需要的基本的并行性。

一般来说,OpenMP对于基本的multithreading来说已经足够了。 一旦开始接触到构build高度asynchronous代码的系统资源pipe理问题,易用性优势就会因为性能和接口问题而变得非常困难。