以下是接下来讨论CUDA架构将要用到的一些关键术语:
(1)Host:宿主,指CPU,系统的CPU。
负责启动应用程序,运行程序的串行部分,将程序的并行的、计算密集的部分offload到GPU上运行,并最终返回程序的运行结果
(2)Device:设备,指GPU,CPU的协处理器。
负责程序的并行的、计算密集的部分的处理,并将处理结果返回给Host。
(3)Kernel:编译过后的函数或程序。
指为GPU设备编译的一个函数。也就是一个编译好的、在GPU上并行运行的函数。Kernel在GPU上以多个线程的方式被执行。
(4)Host Memory:宿主内存。
是指安装GPU产品的主机的主板板载内存。
(5)Device Memory:设备内存。
是指GPU设备的板载内存,是高性能的 GDDR5 内存,支持DMA访问。
(6)Block:线程块。
执行Kernel的一组线程组成一个线程块。一个线程块最多可包含512个并行执行的线程,线程之间通过共享内存有效地共享数据,并实现线程的通信和栅栏同步。
(7)线程ID:线程在线程块中的线程号。
基于线程ID的复杂寻址,应用程序可以将线程块指定为任意大小的二维或三维数组,并使用2个或3个索引来标识每个线程。对于大小是(Dx,Dy)的二维线程块,索引为(x,y)的线程的线程ID为(x+y*Dx),对于大小为(Dx,Dy,Dz)的三维线程块,索引为(x,y,z)的线程的线程ID为(x+y*Dx+z*Dx*Dy)。
(8)Grid:线程块组成的网格。
执行相同Kernel、具有相同维数和大小的线程块可以组合到一个网格中。这样单个Kernel调用中启动的线程数就可以很大。同一网格中的不同线程块中的线程不能互相通信和同步。Grid 是一个线程块阵列,执行相同的内核,从全局内存读取输入,将结果写入全局内存。
(9)Block ID:线程块ID。
线程块ID是线程块在Grid中的块号。实现基于块ID的复杂寻址,应用程序可以将Grid指定为任意大小的二维数组,并用2个索引来标识每个线程块。对于大小为(Dx,Dy)的二维线程块,索引为(x,y)的块的块ID为(x+yDx)。
(10)Wrap:一个线程块中连续的固定数量的线程组。
将线程块中的线程划分成wrap的方式是:每个wrap包含线程ID连续递增的32个线程,其中第一个wrap中的线程从线程0开始递增到线程31。