Pthread 与 OpenMP

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

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

使用这两种方法的优点和缺点是什么?

编辑:

有人能澄清一下这两个 API 是创建 内核级线程还是 用户层面线程吗?

60126 次浏览

如果您使用 OpenMP,那么 可以就像添加一个杂注一样简单,并且您将成为具有线性加速的正确多线程代码的90% 。要获得与 pthread 相同的性能提升,需要做更多的工作。

但和往常一样,pthread 具有更大的灵活性。

基本上,这取决于您的应用程序是什么。你有一个微不足道的并行算法吗?或者你只是有很多随意的任务,你想同时进行?这些任务之间需要多少对话?需要多少同步?

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

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

如果您对此感兴趣,并且如果 C + + 是一个选项,我还建议使用 建筑构件的穿线

Pthreads is a lower level API for generating threads and synchronization explicitly. In that respect, it provides more control.

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

Pthread 是一个用于处理线程的非常低级的 API。因此,您可以对线程管理(create/join/etc)、互斥锁等进行非常细粒度的控制。相当简陋。

另一方面,OpenMPmuch更高的级别,更具可移植性,并且不限制您使用 C。它也比 pthread 更容易扩展。这方面的一个具体例子是 OpenMP 的工作共享构造,它允许您相对轻松地跨多个线程分配工作。(参见维基百科的 利弊清单。)

也就是说,您实际上没有提供关于您正在实现的特定程序的详细信息,或者您打算如何使用它,所以相当不可能推荐一种 API 而不是另一种 API。

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

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

相反,如果你时间紧迫,或者只是在开发应用程序或者第三方工具之外的东西,使用 OpenMP。您可以将它封装在几个宏中,并获得所需的基本并行性。

总的来说,OpenMP 对于基本的多线程来说已经足够好了。一旦您开始直接管理构建高度异步代码所需的系统资源,它的易用性优势就被性能和接口问题挤占了。

这么想吧。在 Linux 系统上,OpenMP API 本身很可能使用 pthreads来实现其特性,例如并行性、屏障和锁/互斥。尽管如此,还是有很好的理由直接使用 pthread API。

我认为..

使用 OpenMP 时-

  • 您的程序包含易于发现的 for循环,其中每个迭代都是独立于其他迭代的。
  • You want to retain the readability of the program. (Basically keep the parallelized program looking like the sequential version)
  • 您希望远离线程如何在微观级别产生和控制的实质细节。

还有衣服

  • You don't have easy to parallelize loops.

  • 您有不同的任务需要同时执行,您可能希望为每个任务分配不同的职责。

  • 您希望在微观层次上控制线程执行的流程。

欢迎在评论中指正我。