天天看点

CUDA实践指南(十三)

设备内存空间:

CUDA设备使用多个内存空间,这些内存空间具有不同的特性,这些特性反映了它们在CUDA应用程序中的不同用法 这些内存空间包括全局,本地,共享,纹理和寄存器,如图2所示

CUDA实践指南(十三)

合并的访问要求取决于设备的计算能力,可以查阅CUDA C编程指南中。

在这些不同的记忆空间中,全局记忆是最丰富的; 请参阅CUDA C编程指南的功能和技术规格,以了解每个计算功能级别上每个内存空间的可用内存量。 全局,本地和纹理内存的访问延迟最大,其次是常量内存,共享内存和寄存器文件。

存储器类型的各种主要特征如表1所示:

CUDA实践指南(十三)

在纹理访问的情况下,如果纹理引用绑定到全局内存中的线性数组,则设备代码可以写入底层数组。 绑定到CUDA数组的纹理引用可以通过表面写入操作写入,方法是将表面绑定到相同的底层CUDA阵列存储)。 应该避免在同一内核启动时写入其底层全局内存阵列时从纹理中读取纹理,因为纹理缓存是只读的,并且在修改相关联的全局内存时不会失效。

对全局内存的合并访问:

编程支持CUDA的GPU架构的最重要的性能考虑因素可能是全局内存访问的合并。 当某些访问要求得到满足时,全局内存加载和通过一个warp线程存储被设备合并为少至一个事务。

高优先级:确保全局内存访问尽可能合并。

对于计算能力为2.x的设备,可以很容易地总结这些需求:对一个warp线程的并发访问将合并成许多事务处理,这些事务处理的数量等于为warp的所有线程提供服务所需的高速缓存行数。 默认情况下,所有访问都通过L1缓存,即128字节的行。 对于分散访问模式,为了减少过度访问,有时仅在L2中进行高速缓存是有用的,L2缓存了较短的32字节段。

对于计算能力3.x的设备,访问全局内存仅缓存在L2中; L1保留用于本地内存访问。 一些计算能力为3.5,3.7或5.2的设备也允许在L1中选择全局缓存。

在开启ECC时,以合并方式访问内存更为重要。 分散访问会增加ECC内存传输开销,特别是在将数据写入全局内存时。

以下简单示例说明了合并概念。 这些例子假设计算能力2.x. 这些示例假设访问通过L1进行缓存,这是这些设备的默认行为,除非另有说明,访问是针对4个字节的字。

继续阅读