Pthreads与OpenMP

时间:2010-10-16 17:16:33

标签: c pthreads openmp

我正在使用Linux在C中创建一个多线程应用程序。

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

有什么优点和优点;是否使用?

修改

有人可以澄清两个API是否创建内核级用户级线程?

4 个答案:

答案 0 :(得分:65)

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

Pthreads是一个用于处理线程的非常低级的API。因此,您对线程管理(创建/加入/等),互斥锁等具有极其细粒度的控制。它相当简陋。

另一方面,OpenMP 很多更高级别,更便携,并且不限制您使用C.它也比pthreads更容易缩放。一个具体的例子是OpenMP的工作共享结构,它允许您相对轻松地跨多个线程划分工作。 (另见维基百科的pros and cons list。)

也就是说,您确实没有提供有关您正在实施的具体计划的详细信息,或者您计划如何使用它,因此推荐使用另一个API是不可能的。

答案 1 :(得分:19)

如果您使用OpenMP,可以就像添加单个编译指示一样简单,并且您将有90%的方式使用线性加速来正确处理多线程代码。使用pthreads获得相同的性能提升需要做更多的工作。

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

基本上,这取决于您的应用程序。你有一个平凡的并行算法吗?或者你只是有很多你想要同时执行的任意任务?这些任务需要相互交谈多少钱?需要多少同步?

答案 2 :(得分:7)

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

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

如果您对此感兴趣,并且可以选择C ++,我还建议Threading Building Blocks

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

答案 3 :(得分:4)

这取决于两件事 - 您的代码库和您在其中的位置。关键问题是 - 1)&#34;您的代码库是否具有线程,线程池和控件原语(锁,事件等)&#34; 2)&#34;您是在开发可重用的库还是普通的应用程序?&#34;

如果你的库有线程工具(几乎总是建立在一些PThread的味道上​​),请使用它。如果您是图书馆开发人员,请花时间(如果可能)构建它们。值得一提的是,您可以将比OpenMP更精细,更先进的线程组合在一起。

相反,如果您需要时间或只是开发应用程序或第三方工具之外的东西,请使用OpenMP。您可以将其包装在几个宏中,并获得所需的基本并行度。

通常,OpenMP足以支持基本的多线程。一旦您开始直接在构建高度异步代码时管理系统资源,其易用性优势就会因性能和界面问题而变得非常容易。