我一直在寻找C++的库/扩展,它将允许基于GPU的高级处理.我不是GPU编程方面的专家,我不想深入挖掘.我有一个由具有虚函数的类组成的神经网络.我需要一个基本上为我分配GPU的库 - 在很高的层次上.有一个人在一个名为GPU ++的系统上写了一篇论文,它为你做了大部分的GPU工作.我找不到任何地方的代码,只是他的论文.
有没有人知道类似的库,或者有没有人有GPU ++的代码?像CUDA这样的库太低了,无法处理我的大多数操作(至少在没有重写我的所有进程和算法的情况下 - 我不想这样做).
有许多专门用于GPGPU编程的高级库.由于它们依赖于CUDA和/或OpenCL,因此必须明智地选择它们(基于CUDA的程序不会在AMD的GPU上运行,除非它通过诸如gpuocelot之类的项目进行预处理步骤).
您可以在NVIDIA 网站上找到一些CUDA库的示例.
推力:官方描述不言而喻
Thrust是一个类似于C++标准模板库(STL)的并行算法库.Thrust的高级接口极大地提高了程序员的工作效率,同时实现了GPU和多核CPU之间的性能可移植性.与已有技术(如CUDA,TBB和OpenMP)的互操作性有助于与现有软件集成.
正如@Ashwin指出的那样,Thrust的类似STL的语法使其成为开发CUDA程序时广泛选择的库.快速查看这些示例,可以看出如果您决定使用此库,您将编写的代码类型.NVIDIA的网站介绍了该库的主要功能.一个视频演示(从GTC 2012)也可用.
CUB:官方说明告诉我们:
CUB为CUDA编程模式的每一层提供最先进的可重用软件组件.它是一个灵活的协作线程块原语库和CUDA内核编程的其他实用程序.
它提供设备范围,块宽和整个经线的并行原语,如并行排序,前缀扫描,缩减,直方图等.
它是开源的,可在GitHub上获得.从实现的角度来看,它不是高级的(您在CUDA内核中开发),但提供了高级算法和例程.
mshadow:C++/CUDA中的轻量级CPU/GPU矩阵/张量模板库.
该库主要用于机器学习,并依赖于表达式模板.
Eigen:在版本3.3中添加了对具有新Tensor类的CUDA的支持.谷歌在 TensorFlow中使用它,并且仍处于试验阶段.
从Eigen 3.3开始,现在可以在CUDA内核中使用Eigen的对象和算法.但是,仅支持一部分功能,以确保在CUDA内核中不会触发动态分配.
请注意,OpenCL不仅仅是GPGPU计算,因为它支持异构平台(多核CPU,GPU等).
OpenACC:该项目为GPGPU提供类似OpenMP的支持.编程的很大一部分是由编译器和运行时API隐式完成的.您可以在他们的网站上找到示例代码.
OpenACC应用程序接口描述了一组编译器指令,用于指定标准C,C++和Fortran中的循环和代码区域,从主机CPU卸载到连接的加速器,提供跨操作系统,主机CPU和加速器的可移植性.
Bolt:具有类似STL接口的开源库.
Bolt是一个针对异构计算而优化的C++模板库.Bolt旨在为常见算法(如扫描,缩减,转换和排序)提供高性能库实现.Bolt接口是在C++标准模板库(STL)上建模的.熟悉STL的开发人员将认识到许多Bolt API和定制技术.
Boost.Compute:正如 @Kyle Lutz所说,Boost.Compute为OpenCL提供类似STL的接口.请注意,这不是官方的Boost库(尚未).
SkelCL "是一个提供高级抽象的库,用于缓解现代并行异构系统的编程".该库依赖于骨架编程,您可以在他们的研究论文中找到更多信息.
ArrayFire是一个开源(以前是专有的)GPGPU编程库.他们首先针对CUDA,但现在也支持OpenCL.您可以在线查看可用的示例.NVIDIA的网站提供了其主要功能的很好的总结.
虽然这不是这个问题的范围,但对其他编程语言也有同样的支持:
Python的:PyCUDA的CUDA,Clyther和PyOpenCL针对OpenCL.有一个专门的StackOverflow问题.
Java:JCuda for CUDA,对于OpenCL,你可以查看另一个问题.
如果您需要进行线性代数(例如)或其他特定操作,专用数学库也可用于CUDA和OpenCL(例如ViennaCL,CUBLAS,MAGMA等).
另请注意,如果需要执行一些非常具体的计算,使用这些库不会阻止您执行某些低级操作.
最后,我们可以提到C++标准库的未来.已经进行了大量工作来增加并行性支持.这仍然是一个技术规范,并没有明确提到GPU AFAIK(尽管NVIDIA的Thrust开发商Jared Hoberock直接参与其中),但是实现这一目标的意愿绝对存在.
的推力库提供容器,并行原语和算法.所有这些功能都很好地包含在类似STL的语法中.因此,如果您熟悉STL,您实际上可以使用Thrust编写整个CUDA程序,而无需编写单个CUDA内核.查看" 快速入门指南"中的简单示例,了解可以使用Thrust编写的高级程序.
看看Boost.Compute.它提供了一个高层次,STL类似的接口,包括类似容器vector
和类似的算法transform()
和sort()
.
它基于OpenCL,允许在大多数现代GPU和CPU上运行,包括NVIDIA,AMD和Intel的GPU.