1简介
1.1从图形图像处理到并行运算
近年CPU与GPU之间浮点计算能力的比较:
近年CPU与GPU之间带宽之间的比较:
CPU与GPU之间浮点计算能力的差异主要原因是GPU主要用于计算密集型和高度并行的计算,设计更多晶体管进行数据处理,而不是数据缓存和流量控制如下图:
更加具体地时说,GPU更加适合解决数据并行计算的问题,即在许多数据上并行执行相同程序,具有高算术强度(算术运算与存储器比率高)。 由于每个数据元素都执行相同的程序,因此对复杂的流程控制的要求较低,而且由于程序在多个数据元素上执行,并且算术强度较高,所以可以隐藏存储器访问延迟,而不用计算大数据缓存。
数据并行将各个元素映射到线程并行。处理大数据集的应用可以使用数据并行编程模型来加速计算。在3D渲染中将各个像素和顶点的操作映射到线程操作中。除了图像渲染之外,像信号处理,物理模拟到计算金融和计算生物学都用到了数据并行来实现处理加速。
CUDA通用并行计算和编程平台:
NVIDIA于2006年11月推出了CUDA,这是一种通用并行计算平台和编程模型,利用NVIDIA GPU中的并行计算引擎,以比CPU更高效的方式解决许多复杂的计算问题。
CUDA带有一个软件环境,允许开发人员使用C语言作为高级编程语言。 如图所示,支持应用程序编程接口或基于指令的方法,如FORTRAN,DirectCompute,OpenACC。
一个可扩展的编程模型:
多核CPU和许多GPU的出现意味着主流处理器芯片现在是并行系统。 而且,它们的平行性也随着摩尔定律的不断扩大。 面临的挑战是开发能够透明地扩展其并行性的应用软件,以利用越来越多的处理器内核,就像3D图形应用程序透明地将其并行性扩展到核心数量众多的许多GPU一样。
它的核心是三个关键的抽象 - 线程组的层次结构(a hierarchy of thread groups),共享内存(shared memories)和屏障同步(barrier synchronization) - 这些只是作为一个最小的语言扩展集被暴露给程序员。
这些抽象提供了嵌套在粗粒度的数据并行和任务并行中的细粒度的数据并行和线程并行。需要将问题划分成可由线程块并行独立解决的粗子问题,并将每个子问题分解成可由块内所有线程并行解决的更精细的部分。
这种分解通过允许线程在解决每个子问题时进行协作来保持语言的表达性,并且同时实现自动可伸缩性。 事实上,每个线程块都可以在GPU内的任何可用多处理器上按任意顺序同时或顺序地进行调度,以便编译的CUDA程序可以在任何数量的多处理器上执行,如图所示,并且只有运行时 系统需要知道物理多处理器数量。
GPU是围绕一系列流式多处理器(SM)构建的(更多详细信息,请参阅硬件实现)。 多线程程序被划分为彼此独立执行的线程块,以便具有更多多处理器的GPU将以比具有更少多处理器的GPU更少的时间自动执行程序