现代计算机的内存中往往存在一种组织结构(hierarchy)。在这种结构中,含有多种类型的内存,每种内存分别具有不同的容量和延迟(latency)。
一般来说,延迟低(速度高)的内存容量小,延迟高(速度低)的内存容量大。当前被处理的数据一般存放与低延迟、低容量的内存中;当前没有被处理但之后将要被处理的大量数据一般存放于高延迟、高容量的内存中。相对于不用分级的内存,用这种分级的内存可以降低延迟,提高计算效率。
和 CPU 一样,GPU 中也有内存分级的设计。相对于CPU编程来说,CUDA编程模型向程序员提供更多的控制权。
下面的表和图列出了 CUDA 中的几种内存和他们的主要特征:
这里“全局内存”(global memory)的含义是核函数中所有线程都能够访问其中的数据。在数组相加的例子中,指针d_x,d_y和d_z 都是指向全局内存的。由于全局内存没有存放在 GPU 芯片上,所以有较高的延迟和较低的访问速度。
全局内存的主要角色是为核函数提供数据,并在主机与设备、设备与设备之间传递数据。
我们用cudaMalloc() 函数为全局内存变量分配设备内存。然后,可以直接在核函数中访问分配的内存,改变其中的数据值。
以及全局内存的拷贝:
全局内存对整个网格的所有线程可见。也就是说,—个网格的所有线程都可以访问(读或写)传入核函数的设备指针所指向的全局内存中的全部数据。
全局内存的生命周期(lifetime)不是由核函数决定的,而是由主机端决定的。在数组相加的例子中,指针d_x,d_y和d_z 所指向的全局内存缓冲区的生命周期就是从主机端用cudaMalloc() 对它们分配内存开始,到主机端用 cudaFree() 释放他们的内存结束。
静态全局内存变量:
常量内存是有常量缓存的全局内存,数量有限,仅有 64KB。它的可见范围和生命周期与全局内存一样。不同的是,常量内存仅可读、不可写。由于有缓存,常量内存的访问速度比全局内存高,但得到高访问速度的前提是一个线程束中的线程(一个线程块中相邻的 32 个线程)要读取相同的常量内存数据。
纹理内存(texturememory)和表面内存(surfacememory)类似于常量内存,也是一种具有缓存的全局内存,有相同的可见范围和生命周期,而且一般仅可读 (表面内存也可写)。
在核函数中定义的不加任何限定符的变量一般来说就存放与寄存器(register)中。核函数中定义的不加任何限定符的数组有可能存放与寄存器中,但也有可能存放于局部内存中。另外,以前提到过的各种内建变量,如gridDim、blockDim、blockIdx、threadIdx 及 warpSize 都保存在特殊的寄存器中。在核函数中访问这些内建变量是很高效的。
寄存器变量仅仅被—个线程可见。也就是说,每一个线程都有一个变量 n 的副本。虽然在核函数的代码中用了同一个变量名,但是不同的线程中该寄存器变量的值是可以不同的。每个线程都只能对它的副本进行读写。寄存器的生命周期也与所属线程的生命周期一致,从定义它开始,到线程消失时结束。
寄存器内存在芯片上(on-chip),是所有内存中访问速度最高的,但是其数量很有限。下表是几个不同计算能力的 GPU 中与寄存器和后面要介绍的共享内存有关的技术指标:
我们还没有用过局部内存(local memory),但从用法上看,局部内存和寄存器几乎一样。核函数中定义的不加任何限定符的变量有可能在寄存器中,也有可能在局部内存中。寄存器中放不下的变量,以及索引值不能在编译时就确定的数组,都有可能放在局部内存中。这种判断是由编译器自动做的。
虽然局部内存在用法上类似于寄存器,但从硬件来看,局部内存只是全局内存的一部分。所以,局部内存的延迟也很高。每个线程最多能使用高达512KB的局部内存,但使用过多会降低程序的性能。
共享内存和寄存器类似,存在于芯片上,具有仅次于寄存器的读写速度,数量也有限。见上面那张图。
同于寄存器的是,共享内存对整个线程块可见,其生命周期也与整个线程块一致。
也就是说,每个线程块拥有一个共享内存变量的副本。共享内存变量的值在不同的线程块中可以不同。一个线程块中的所有线程都可以访问该线程块的共享内存变量副本,但是不能访问其他线程块的共享内存变量副本。共享内存的主要作用是减少对全局内存的访问,或者改善对全局内存的访问模式。
因为 SM 中的各种计算资源是有限的,那么有些情况下一个 SM 中驻留的线程数目就有可能达不到理想的最大值。此时,我们说该SM的占有率小于100%。获得100%的占有率并不是获得高性能的必要或充分条件,但一般来说,要尽量让 SM的占有率不小于某个值,如25%,才有可能获得较高的性能。
要分析 SM 的理论占有率(theoretical occupancy),还需要知道两个指标:
下面,在并行规模足够大(即核函数执行配置中定义的总线程数足够多)的前提下分几种情况来分析SM的理论占有率:
以上单独分析了三种情况。一般情况下,需要综合以上三点分析。
略