c-Pthreads与OpenMP

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

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

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

编辑:

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

asked 2019-11-06T16:19:03Z
4个解决方案
70 votes

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

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

另一方面,OpenMP的级别更高,更具可移植性,并且不限制您使用C。与pthreads相比,它更易于扩展。 一个特定的示例是OpenMP的工作共享结构,它使您可以相对轻松地将工作划分到多个线程中。 (另请参阅维基百科的优缺点列表。)

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

Matt Ball answered 2019-11-06T16:19:43Z
19 votes

如果您使用OpenMP,它就像添加一个编译指示一样简单,并且您将以线性加速的方式完成90%的正确多线程代码。 要使用pthreads获得相同的性能提升,需要进行大量工作。

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

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

Oliver Charlesworth answered 2019-11-06T16:20:27Z
8 votes

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

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

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

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

Reed Copsey answered 2019-11-06T16:21:14Z
4 votes

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

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

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

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

Zack Yezek answered 2019-11-06T16:22:07Z
translate from https://stackoverflow.com:/questions/3949901/pthreads-vs-openmp