有许多专用于 GPGPU 编程的高级库。由于它们依赖于 CUDA 和/或 OpenCL,因此必须明智地选择它们(基于 CUDA 的程序不会在 AMD 的 GPU 上运行,除非它通过gpuocelot等项目的预处理步骤)。
CUDA
您可以在 NVIDIA网站上找到一些 CUDA 库示例。
Thrust 是一个类似于 C++ 标准模板库 (STL) 的并行算法库。Thrust 的高级接口极大地提高了程序员的工作效率,同时实现了 GPU 和多核 CPU 之间的性能可移植性。与现有技术(如 CUDA、TBB 和 OpenMP)的互操作性有助于与现有软件的集成。
正如@Ashwin 所指出的,在开发 CUDA 程序时,Thrust 的类似 STL 的语法使其成为广泛选择的库。如果您决定使用这个库,快速浏览这些示例会显示您将编写的代码类型。NVIDIA 的网站介绍了该库的主要功能。还提供视频演示(来自 GTC 2012)。
CUB 为 CUDA 编程模式的每一层提供最先进的、可重用的软件组件。它是用于 CUDA 内核编程的协作线程块原语和其他实用程序的灵活库。
它提供了设备范围、块范围和扭曲范围的并行原语,例如并行排序、前缀扫描、归约、直方图等。
它是开源的,可在GitHub上找到。从实现的角度来看,它不是高级的(您在 CUDA 内核中开发),但提供高级算法和例程。
- mshadow : C++/CUDA 中的轻量级 CPU/GPU 矩阵/张量模板库。
这个库主要用于机器学习,并且依赖于表达式模板。
从 Eigen 3.3 开始,现在可以在 CUDA 内核中使用 Eigen 的对象和算法。但是,仅支持一部分功能以确保不会在 CUDA 内核中触发动态分配。
开放式
请注意,OpenCL不仅仅支持 GPGPU 计算,因为它支持异构平台(多核 CPU、GPU 等)。
- OpenACC:该项目为 GPGPU 提供类似 OpenMP 的支持。大部分编程是由编译器和运行时 API 隐式完成的。您可以在他们的网站上找到示例代码。
OpenACC 应用程序接口描述了一组编译器指令,用于指定标准 C、C++ 和 Fortran 中的循环和代码区域,以便从主机 CPU 卸载到连接的加速器,从而提供跨操作系统、主机 CPU 和加速器的可移植性。
Bolt 是针对异构计算优化的 C++ 模板库。Bolt 旨在为扫描、归约、转换和排序等常见算法提供高性能库实现。Bolt 接口以 C++ 标准模板库 (STL) 为模型。熟悉 STL 的开发人员会认识许多 Bolt API 和定制技术。
CUDA + OpenCL
- ArrayFire是一个开源(曾经是专有的)GPGPU 编程库。他们首先针对 CUDA,但现在也支持 OpenCL。您可以查看在线提供的示例。NVIDIA 的网站对其主要功能进行了很好的总结。
补充资料
虽然这实际上不在这个问题的范围内,但对其他编程语言也有同样的支持:
如果您需要进行线性代数(例如)或其他特定运算,也可以使用 CUDA 和 OpenCL 的专用数学库(例如ViennaCL、CUBLAS、MAGMA等)。
另请注意,如果您需要进行一些非常具体的计算,使用这些库不会阻止您执行一些低级操作。
最后,我们可以提到 C++ 标准库的未来。已经进行了大量工作来添加并行性支持。这仍然是一个技术规范,并且没有明确提到 GPU AFAIK(尽管 Thrust 的开发者 NVIDIA 的 Jared Hoberock 直接参与其中),但实现这一目标的意愿是绝对存在的。