我想学习 C++ 中的多核编程,你能给我推荐一些笔记吗?和pthread
之间有什么区别?哪个库可以更有效地使用?谢谢。Intel TBB
openmp
Intel CPU
2 回答
这三个是完全不同的东西。Pthreads 是许多符合 POSIX 规范的现代 Unix 操作系统的原生线程 API,包括但不限于 Linux、OS X、FreeBSD 和 Solaris。Windows 也有一个受到严重支持且运行不佳的 Pthreads 实现(Windows 有自己的本机 Win32 线程 API)。Pthreads 旨在支持一般线程场景并使用它构建并行处理应用程序,其价格非常高(以代码行数计)。
英特尔 TBB 是一个可移植的开源 C++ 模板库,用于在共享内存架构上进行并行数据处理并实现任务和任务流。这与新的 C++ lambdas(匿名代码块)结合使用特别好。该库可以使用许多不同的编译器和不同的体系结构构建。在 POSIX 系统上,TBB 建立在 Pthreads 作为底层线程 API 之上。
OpenMP 是 C/C++ 和 Fortran 的基于指令的扩展,支持共享内存架构上的数据和任务并行。它不是库,而是语言扩展,需要支持 OpenMP 的编译器。几乎所有现代 C++ 编译器(Clang 除外)都支持 OpenMP,包括 PGI、Oracle 和 MSVC++ 编译器以及 GCC。在 POSIX 系统上,OpenMP 运行时构建在 Pthread 之上。4.0 版支持加速器设备,例如 GPU 和英特尔至强融核等协处理器。
在这三者中,英特尔 TBB 是最灵活的,而 OpenMP 是最容易学习的。Pthreads 既不便携(例如在 Windows 上的支持很差),也不易于学习。正如 Claudio 已经提到的,C++11 包含自己的线程原语,在使用 Pthreads 的 POSIX 系统上实现。但这些更像是围绕线程 API 的语言抽象,而不是像 ITBB 和 OpenMP 这样的并行处理库/扩展。
借助C++11标准,C++ 现在可以原生支持多线程,无需任何外部库。它已经在 Visual Studio 2012、Gcc 4.7+ 和 Clang 上可用。
关于您的其他问题: