C Pthreads与OpenMP

C Pthreads与OpenMP,c,pthreads,openmp,C,Pthreads,Openmp,我正在使用Linux用C创建一个多线程应用程序 我不确定是应该使用POSIX线程API还是OpenMP API 使用这两种方法的优缺点是什么 编辑: 有人能澄清一下这两个API是创建内核级线程还是创建用户级线程吗?如果您使用OpenMP,它可以像添加单个pragma一样简单,并且您将有90%的能力使用线性加速正确地处理多线程代码。要使用pthreads获得相同的性能提升,需要做更多的工作 但和往常一样,pthread具有更大的灵活性 基本上,这取决于您的应用程序是什么。你有一个简单的可并行算法吗

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

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

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

编辑:

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

如果您使用OpenMP,它可以像添加单个pragma一样简单,并且您将有90%的能力使用线性加速正确地处理多线程代码。要使用pthreads获得相同的性能提升,需要做更多的工作

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


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

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

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

如果你感兴趣,如果C++是一个选项,我也会推荐。


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

Pthreads和OpenMP代表了两种完全不同的多处理范式

是用于处理线程的非常低级的API。因此,您对线程管理(create/join/etc)、互斥体等具有极细粒度的控制。这完全是赤裸裸的

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


也就是说,您实际上没有提供有关正在实现的特定程序的详细信息,也没有提供计划如何使用该程序的详细信息,因此不可能推荐一种API而不是另一种API。

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

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

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


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

POSIX线程作为POSIX标准的一部分,是跨平台的。OpenMP,不存在于任何操作系统或C语言标准,我知道,不是跨平台,除非您有一个真正奇怪的想法是什么跨平台的意思。@ R.OpenMP确实是跨平台,即使没有正式标准化,同时具有C++和C API。C.Boost在C++世界中不是阿德JORE标准,而是阿德FastoSturn.R..:我不确定你的意思,OpenMP C API标准在这个规范中是可用的()。除非你的意思是,没有IEEE/ANSI/ISO标准化?任何人都可以编写API规范并称之为“标准”。但这并不意味着它是一个。尽管如此,我的评论中的语言还是非常清楚地解释了这一点:“不存在于任何操作系统或C语言标准中”。这就像说OpenGL不是跨平台的,因为它既不是C的一部分,也不是任何操作系统。re:您的编辑(内核级或用户级?),这取决于实现!API只是一个接口。OpenMP不是实现-。(中有一些信息)。基本上,如果您可以在OpenMP中执行您需要的操作,您应该在OpenMP中执行。OpenMP应该用于必须在所有内核上计算的循环。PThread也可以做到这一点,但这需要大量的工作,而且很难维护,如果需要启动一个不应该阻塞主线程的单独进程,通常可以使用PThread。例如:您有一个服务器,客户端连接,并且必须保持与服务器的连接并与之对话,您为每个客户端创建一个线程,并在该线程中与客户端协作,而不阻塞主线程。这就像你创建了一个新的应用程序,让它在操作系统上运行,而不影响主应用程序。重复用问题回答问题。。。tsk;)如果您能澄清这些问题的答案实际上是如何影响使用pthreads vs OpenMP的决策的,那就太好了。