在pthread,Intel TBB,openmp上哪个库更通用,更灵活?

时间:2013-11-06 09:48:41

标签: multithreading pthreads openmp multicore tbb

我想学习c ++中的多核编程,你能给我推荐一些笔记吗? pthreadIntel TBBopenmp之间有什么区别?哪个库可以更有效地使用Intel CPU?感谢。

2 个答案:

答案 0 :(得分:5)

这三个是完全不同的东西。 Pthreads是许多符合POSIX规范的现代Unix操作系统的本机线程API,包括但不限于Linux,OS X,FreeBSD和Solaris。对于Windows,还有一个支持严重且不太好的Pthreads实现(Windows有自己的本机Win32线程API)。 Pthreads旨在支持通用线程场景,并以非常高的代价(代码行数)构建并行处理应用程序。

Intel TBB是一个可移植的开源C ++模板库,用于在共享内存架构上进行并行数据处理,并实现任务和任务流。这与新的C ++ lambdas(匿名代码块)结合使用效果特别好。可以使用许多不同的编译器和不同的体系结构构建库。在POSIX系统上,TBB构建在Pthreads上作为底层线程API。

OpenMP是C / C ++和Fortran的基于指令的扩展,支持共享内存架构上的数据和任务并行。它不是库,而是语言扩展,需要启用OpenMP的编译器。事实上,所有现代C ++编译器 - 除了Clang之外 - 都支持OpenMP,包括PGI,Oracle和MSVC ++编译器以及GCC。在POSIX系统上,OpenMP运行时构建在Pthreads之上。版本4.0支持加速器设备,例如GPU和协处理器,如Intel Xeon Phi。

在这三者中,英特尔TBB是最灵活的,而OpenMP是最容易学习的。 Pthreads既不可移植(例如Windows上支持不当),也不容易学习。正如Claudio已经提到的,C ++ 11包含了自己的线程原语,使用Pthreads在POSIX系统上实现。但这些更像是线程API的语言抽象,而不是像ITBB和OpenMP这样的并行处理库/扩展。

答案 1 :(得分:3)

使用C++11标准,C ++现在支持多线程,无需任何外部库。它已经在Visual Studio 2012,Gcc 4.7+和Clang上提供。

关于您的其他问题:

  • pthread(代表“POSIX线程”)是POSIX(即Unix / Linux)系统的多线程库。它只进行多线程,因为POSIX已经支持多任务处理(即通过 fork 原语)。它适用于运行POSIX OS的所有硬件平台(例如,台式机,嵌入式Linux等)。

  • OpenMP是一个可移植的库,用于C / C ++和Fortran中的多核编程。最新版本是4.0,它也支持异步调用。

  • Intel TBB支持英特尔架构上的Windows和Linux。在不同于英特尔(例如ARM)的平台上运行TBB非常复杂(参见here