Pthreads与OpenMP


69

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

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

使用这两种方法的利弊是什么?

编辑:

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

c  pthreads  openmp 

回复:您的编辑(内核级还是用户级?)-取决于实现!一个API就是一个接口。OpenMP不是实现-而是一些实现。(此Wikipedia文章中也有一些信息)。
马特·鲍尔

基本上,如果可以在OpenMP中执行所需的操作,则应该在OpenMP中执行。
乔纳森·杜尔西

OpenMP应该用于必须在所有内核上计算的循环。PThread也可以做到这一点,但是这需要很多工作,并且很难维护,如果需要启动一个单独的进程而不应该阻塞主线程,通常可以使用PThread。例如:您有一个服务器,客户端连接并且必须保持与服务器的连接并与之对话,您为每个客户端创建一个线程,并在该线程中与客户端一起使用而不会阻塞主线程。就像您创建一个新的应用程序并让它在操作系统上运行一样,而不会打扰主应用程序。
莉莲·莫拉鲁

Answers:


80

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

Pthreads是用于处理线程的非常底层的API。因此,您可以非常精细地控制线程管理(创建/连接/等),互斥锁等。这是很简单的。

在另一方面,OpenMP的更高水平,更便于携带,并且不限制你使用C.它也更容易比并行线程扩展。一个特定的示例是OpenMP的工作共享结构,它使您可以相对轻松地将工作划分到多个线程中。(另请参阅Wikipedia的利弊清单。)

就是说,您实际上没有提供有关所实现的特定程序或使用该程序的计划的详细信息,因此几乎不可能推荐一个API。


23

如果你使用OpenMP的,它可以是简单的添加单个编译,并且你会的方式90%与线性加速正确的多线程代码。要使用pthreads获得相同的性能提升,需要进行大量工作。

但是像往常一样,您可以使用pthread获得更大的灵活性。

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


13
用问题回答问题... tsk;)如果您弄清楚这些问题的答案实际上如何影响使用pthreads vs OpenMP的决定,那就太好了。
工程师

9

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

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

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


7
POSIX线程是POSIX标准的一部分,是跨平台的。据我所知,在任何操作系统或C语言标准中都不存在的OpenMP并不是跨平台的,除非您对跨平台的含义有一个非常奇怪的想法。
R .. GitHub停止帮助ICE,2010年

4
@R。-即使没有正式标准化,OpenMP确实是跨平台的,具有C ++和C API。cf. 在C ++世界中发展-不是法律上的标准,而是事实上的标准。
史蒂夫·汤森

@R ..:我不确定您的意思是,此规范中提供了OpenMP C API标准(openmp.org/mp-documents/cspec20.pdf)。除非您是不是要通过IEEE / ANSI / ISO进行标准化?
JM Becker 2013年

4
任何人都可以编写API规范并将其称为“标准”。那不是一个。尽管如此,我的评论语言还是很清楚地解释了这一点:“在任何操作系统或C语言标准中都不存在”。
R .. GitHub停止帮助ICE 2013年

这就像在说OpenGL不是跨平台的,因为它既不是C的一部分,也不是任何操作系统的一部分
Big Temp

4

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.