Pthreads 与 OpenMP
Posted
技术标签:
【中文标题】Pthreads 与 OpenMP【英文标题】:Pthreads vs. OpenMP 【发布时间】:2011-04-26 09:08:23 【问题描述】:我正在使用 Linux 用 C 语言创建一个多线程应用程序。
我不确定我应该使用 POSIX 线程 API 还是 OpenMP API。
使用这两种方法的优缺点是什么?
编辑:
有人能澄清一下这两个 API 是创建 kernel-level 还是 user-level 线程吗?
【问题讨论】:
回复:您的编辑(内核级还是用户级?) - 这取决于实现! API 就是这样 - 接口。 OpenMP 不是实现 - but these are some implementations。 (this Wikipedia article, too 有一点信息)。 基本上,如果你可以在 OpenMP 中做你需要的,你应该在 OpenMP 中做。 OpenMP 应该用于必须在所有内核上计算的循环。 PThread 也可以做到这一点,但工作量很大而且很难维护,如果您需要启动不应阻塞主线程的单独进程,通常使用 PThread。例如:您有一个服务器,客户端连接并且必须保持与服务器的连接并与之交谈,您为每个客户端创建一个线程并在该线程中与客户端一起工作而不会阻塞主线程。这就像您创建一个新应用程序并让它在操作系统上运行而无需打扰主应用程序。 与***.com/questions/935467/…重复 【参考方案1】:Pthreads 和 OpenMP 代表两种完全不同的多处理范例。
Pthreads 是用于处理线程的非常低级的 API。因此,您可以对线程管理(创建/加入/等)、互斥锁等进行非常细粒度的控制。这是相当简单的。
另一方面,OpenMP 的级别很多,更便携,并且不会限制您使用 C。它也比 pthread 更容易扩展。这方面的一个具体示例是 OpenMP 的工作共享结构,它让您可以相对轻松地将工作分配到多个线程中。 (另见***的pros and cons list。)
也就是说,您确实没有提供有关您正在实施的特定程序的详细信息,或者您打算如何使用它,因此推荐一种 API 而非另一种 API 是相当不可能的。
【讨论】:
【参考方案2】:如果您使用 OpenMP,它可以像添加单个 pragma 一样简单,您将完成 90% 的正确多线程代码并实现线性加速。要使用 pthread 获得同样的性能提升,需要做更多的工作。
但像往常一样,使用 pthread 可以获得更大的灵活性。
基本上,这取决于您的应用程序是什么。你有一个平凡并行的算法吗?或者你只是有很多你想同时完成的任意任务?这些任务需要相互交谈多少?需要多少同步?
【讨论】:
用问题回答问题... tsk ;) 如果您能阐明这些问题的答案实际上如何影响使用 pthread 与 OpenMP 的决定,那就太好了。【参考方案3】:OpenMP 具有跨平台的优点,并且对某些操作更简单。它以不同的方式处理线程,因为它为您提供了更高级别的线程选项,例如循环的并行化,例如:
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
如果您对此感兴趣,并且可以选择 C++,我也推荐Threading Building Blocks。
Pthreads 是一个较低级别的 API,用于显式生成线程和同步。在这方面,它提供了更多的控制。
【讨论】:
POSIX 线程是 POSIX 标准的一部分,是跨平台的。 OpenMP 不存在于我所知道的任何操作系统或 C 语言标准中,它不是跨平台的,除非您对跨平台的含义有一个非常奇怪的想法。 @R. - OpenMP 确实是跨平台的,即使没有正式标准化,同时具有 C++ 和 C API。参看。提升 C++ 世界 - 不是法律标准,而是事实上的标准。 @R..:我不确定你的意思,OpenMP C API 标准在这个规范中可用 (openmp.org/mp-documents/cspec20.pdf)。除非你的意思是,没有被 IEEE/ANSI/ISO 标准化? 任何人都可以编写 API 规范并将其称为“标准”。这并不能成为一个。无论如何,我的评论语言很清楚地解释了这一点:“不存在于任何操作系统或 C 语言标准中”。 这就像说 OpenGL 不是跨平台的,因为它既不是 C 的一部分,也不是任何操作系统的一部分【参考方案4】:这取决于两件事——你的代码库和你在其中的位置。关键问题是 - 1)“您的代码库是否有线程、线程池和控制原语(锁、事件等)”和 2)“您是在开发可重用的库还是普通的应用程序?”
如果您的库有线程工具(几乎总是建立在某种 PThread 风格之上),请使用这些工具。如果您是库开发人员,请花时间(如果可能)构建它们。这是值得的 - 您可以将比 OpenMP 提供的更细粒度、更高级的线程组合在一起。
相反,如果您时间紧迫,或者只是开发应用程序或第三方工具,请使用 OpenMP。您可以将其包装在几个宏中,并获得所需的基本并行性。
一般来说,OpenMP 对于基本的多线程来说已经足够了。一旦您开始管理系统资源,直接用于构建高度异步的代码,其易用性优势就会被性能和接口问题所挤占。
【讨论】:
以上是关于Pthreads 与 OpenMP的主要内容,如果未能解决你的问题,请参考以下文章