1

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

4

2 回答 2

5

这三个是完全不同的东西。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 这样的并行处理库/扩展。

于 2013-11-06T10:47:24.853 回答
3

借助C++11标准,C++ 现在可以原生支持多线程,无需任何外部库。它已经在 Visual Studio 2012、Gcc 4.7+ 和 Clang 上可用。

关于您的其他问题:

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

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

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

于 2013-11-06T09:54:31.903 回答