我正在用 C 语言使用 Linux 创建一个多线程应用程序。
我不确定是否应该使用 POSIX 线程 API 或 OpenMPAPI。
使用这两种方法的优点和缺点是什么?
编辑:
有人能澄清一下这两个 API 是创建 内核级线程还是 用户层面线程吗?
如果您使用 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)、互斥锁等进行非常细粒度的控制。相当简陋。
另一方面,OpenMP是 much更高的级别,更具可移植性,并且不限制您使用 C。它也比 pthread 更容易扩展。这方面的一个具体例子是 OpenMP 的工作共享构造,它允许您相对轻松地跨多个线程分配工作。(参见维基百科的 利弊清单。)
也就是说,您实际上没有提供关于您正在实现的特定程序的详细信息,或者您打算如何使用它,所以相当不可能推荐一种 API 而不是另一种 API。
它取决于两件事情-您的代码基和您在其中的位置。关键问题是-1)“你的代码库是否有线程、线程池和控制原语(锁、事件等)”和2)“你是否在开发可重用的库或普通应用程序?”
如果您的库具有线程工具(几乎总是构建在某种风格的 PThread 上) ,请使用这些工具。如果您是一个库开发人员,花些时间(如果可能的话)来构建它们。这是值得的——您可以组合比 OpenMP 提供的更细粒度、更高级的线程。
相反,如果你时间紧迫,或者只是在开发应用程序或者第三方工具之外的东西,使用 OpenMP。您可以将它封装在几个宏中,并获得所需的基本并行性。
总的来说,OpenMP 对于基本的多线程来说已经足够好了。一旦您开始直接管理构建高度异步代码所需的系统资源,它的易用性优势就被性能和接口问题挤占了。
这么想吧。在 Linux 系统上,OpenMP API 本身很可能使用 pthreads来实现其特性,例如并行性、屏障和锁/互斥。尽管如此,还是有很好的理由直接使用 pthread API。
pthreads
我认为..
使用 OpenMP 时-
for
还有衣服
You don't have easy to parallelize loops.
您有不同的任务需要同时执行,您可能希望为每个任务分配不同的职责。
您希望在微观层次上控制线程执行的流程。
欢迎在评论中指正我。