在NVIDIA的GPU中,内存(GPU的内存)被分为了全局内存(Global memory)、本地内存(Local memory)、共享内存(Shared memory)、寄存器内存(Register memory)、常量内存(Constant memory)、纹理内存(Texture memory)六大类。这六类内存都是分布在在RAM存储芯片或者GPU芯片上,他们物理上所在的位置,决定了他们的速度、大小以及访问规则。
先总体地看下一张显卡的硬件组成。用我电脑上的“Quadra K620”显卡举例,如下图,整张显卡PCB电路板上的芯片主要可以分为三类:
- GPU芯片,也是整张显卡的核心,负责执行计算任务。
- DDR3存储芯片,其在显卡中相对与GPU的地位相当于电脑中内存条对于CPU,只是放在了显卡上专供GPU使用。
- 时钟、电源等其他辅助功能的芯片。
显卡的内存可以分为GPU片内(On-Chip)存储体和位于DDR3存储芯片中的存储体。片内存储体的访问延迟(Latency)远低于片外存储体的访问延迟(Latency),当然片内存储体也有更快的传输速度。
全局内存(Global memory),位于片外存储体中。容量大、访问延迟高、传输速度较慢。在2.X计算力之后的GPU上,都会使用二级缓存(L2 cache)做缓冲,达到较快的传输速度,但这并不能减少访问的延迟(Latency)。
- 所有数据都必须先传入到这里,或者从这里传出。
- 用户通过调用CUDA函数控制全局内存的分配空间、传入数据、传出数据。例如:
函数名 功能 cuMemAlloc 内存分配 cuMemAllocPitch 内存分配,并将长度补全到 2