Pthreads与OpenMP

57 c pthreads openmp

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

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

使用任何一种的利弊是什么?

编辑:

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

Mat*_*all 70

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

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

在另一方面,OpenMP的更高水平,更便于携带,并且不限制你使用C.它也更容易比并行线程扩展.一个具体的例子是OpenMP的工作共享结构,它允许您相对轻松地跨多个线程划分工作.(另见维基百科的利弊列表.)

也就是说,您确实没有提供有关您正在实施的特定程序的详细信息,或者您计划如何使用它,因此推荐一个API相对于另一个API是相当不可能的.


Oli*_*rth 19

如果您使用OpenMP,它可以像添加单个编译指示一样简单,并且您可以通过线性加速实现90%的正确多线程代码.使用pthreads获得相同的性能提升需要更多的工作.

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

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

  • 用问题回答问题... tsk;)如果你澄清这些问题的答案实际上如何影响使用pthreads与OpenMP的决定,那将是很好的. (12认同)

Ree*_*sey 8

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

#pragma omp parallel for
for (i = 0; i < 500; i++)
    arr[i] = 2 * i;
Run Code Online (Sandbox Code Playgroud)

如果您对此感兴趣,并且如果C++是一个选项,我还建议使用Threading Building Blocks.

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

  • POSIX线程是POSIX标准的一部分,是跨平台的.OpenMP,不存在于我所知道的任何操作系统或C语言标准中,不是跨平台的,除非你对跨平台的含义有一个非常奇怪的想法. (6认同)
  • @R. - OpenMP确实是跨平台的,即使没有正式标准化,也包括C++和C API.比照 在C++世界中提升 - 不是法律上的标准,而是事实上的标准. (4认同)
  • 任何人都可以编写API规范并将其称为"标准".这不是一个.无论如何,我的评论的语言非常清楚地解释了这一点:"不存在于任何**操作系统或C语言标准**". (4认同)
  • 这就像说 OpenGL 不是跨平台的,因为它既不是 C 的一部分,也不是任何操作系统的一部分 (2认同)

小智 5

这取决于两件事——你的代码库和你在其中的位置。关键问题是 - 1)“您的代码库是否有线程、线程池和控制原语(锁、事件等)”和 2)“您是否正在开发可重用的库或普通应用程序?”

如果您的库有线程工具(几乎总是基于 PThread 的某种风格构建),请使用它们。如果您是库开发人员,请花时间(如果可能)来构建它们。这是值得的 - 您可以组合比 OpenMP 提供的更细粒度、更高级的线程。

相反,如果您时间紧迫或只是开发应用程序或第三方工具的某些内容,请使用 OpenMP。您可以将其包装在几个宏中并获得所需的基本并行性。

一般来说,OpenMP 对于基本的多线程处理来说已经足够了。一旦您开始直接管理系统资源来构建高度异步的代码,其易用性优势就会被性能和界面问题所取代。