使用GPUs的好处
在相同的价格和功耗范围内,图形处理器 GPU 比 CPU 提供了更高的指令吞吐量和内存带宽, 许多应用程序利用这些更高的功能在 GPU 上比在 CPU 上运行得更快。相比较其他计算设备,如 FPGA,也是非常节能的,但其提供了比 GPU 少得多的编程灵活性。
GPU 和 CPU 之间的这种性能差异之所以存在,是因为它们在设计时考虑到了不同的目标。CPU 被设计成能够尽可能快地执行一系列操作(称为线程) ,并且能够并行地执行几十个这样的线程。GPU 被设计成能够并行执行数以千计的线程(缓冲较慢的单线程性能以获得更大的吞吐量)。
作为一个并行数据计算设备的图形处理器单元仅仅几年的时间,可编程的图形处理器单元演变成为了一匹绝对的计算悍马,正如图所示。
当极高的内存带宽驱动多核处理器时,GPU 为图型和非图型处理提供了难以置信的计算资源
这个演变背后的主要原因是由于GPU 被设计用于高密度和并行计算,更确切地说是用于图形渲染
因此更多的晶体管被投入到数据处理而不是数据缓存和流量控制
示图显示了 CPU 芯片资源与 GPU 芯片资源的示例分布
将更多的晶体管用于数据处理,例如浮点运算,有利于高度并行的计算;GPU 可以通过计算隐藏存储器访问延迟,而不需要依赖大型数据缓存和复杂的流控制来避免长的存储器访问延迟,因为这两者在晶体管方面都很昂贵。
一般来说,应用程序具有并行部分和顺序部分的混合,因此系统设计采用 GPU 和 CPU 的混合,以最大限度地提高整体性能。具有高度并行性的应用程序可以利用图形处理器的这种大规模并行处理机特性来获得比 CPU 更高的性能。
更加具体地看,GPU 是特别适合于并行数据运算的问题-同一个程序在许多并行数据元素,并带有高运算密度(算术运算与内存操作的比例)。由于同一个程序要执行每个数据元素,降低了对复杂的流量控制要求; 并且,因为它执行许多数据元素并且据有高运算密度,内存访问的延迟可以被忽略
并行数据处理,意味着数据元素以并行线程处理。处理大量数据集,例如数组的应用程序可以使用一个并行数据的编程模型来加速计算。
在3D 渲染上,大的像素集和顶点被映射到并行线程。同样,图像和媒体处理的应用程序例如图像处理,录像编码和解码,图像缩放比例,立体视觉,以及图像识别也可以映射图像块和像素到并行处理线程。
实际上,在图像领域外,许多算法同样可以通过并行数据处理得到加速、物理模拟到金融计算或者生物计算均可。
然而直到今天,尽管强大的计算能力包装进了GPU,而它对非图形应用的有效支持依然有限
- GPU 只能通过图型API 来编程,导致新手很难学习和非图形API 上很不充分的应用
- GPU 程序可以从DRAM 收集数据元素。但GPU 程序不能写入信息到DRAM 的任何部分,相比CPU 丧失了很多编程的灵活性
- 有些应用是由于DRAM 内存带宽而形成的瓶颈,未能充分利用GPU 的计算能力
CUDA: 一个通用的并行计算平台和编程模型
2006年11月,NVIDIA 推出了 CUDA,这是一个通用的并行计算平台和编程模型,利用 NVIDIA 图形处理器中的并行计算引擎
比 CPU 更有效的方式解决许多复杂的计算问题。
CUDA: 一个在GPU 上计算的新架构CUDA(Compute Unified Device Architecture) 统一计算设备架构,在GPU 上发布的一个新的硬件和软件架构,它不需要映射到一个图型API 便可在GPU 上管理和进行并行数据计算。从G80 系列和以后的型号都可以支持。操作系统的多任务机制通过几个CUDA 和图型应用程序协调运行来管理访问GPU。
CUDA 软件堆栈由几层组成,如图所示:一个硬件驱动程序,一个应用程序编程接口(API)和它的Runtime, 还有二个高级的通用数学库,CUFFT 和CUBLAS。硬件被设计成支持轻量级的驱动和Runtime 层面,因而提高性能。
CUDA API 更像是C 语言的扩展,以便最小化学习的时间
CUDA 提供一般DRAM 内存寻址方式:“发散” 和“聚集”内存操作
从而提供最大的编程灵活性。从编程的观点来看,它可以在DRAM的任何区域进行读写数据的操作,就像在CPU 上一样
CUDA 允许并行数据缓冲或者在On-chip 内存共享,可以进行快速的常规读写存取,在线程之间共享数据。
应用程序可以最小化数据到DRAM 的overfetch 和round-trips ,从而减少对DRAM 内存带宽的依赖