全局内存通过缓存实现加载和存储过程。其中,L1为一级缓存,每个SM都有自己的L1;L2为二级缓存,L2则被所有SM共有。
数据从全局内存到SM的传输过程中,会去L1和L2中查询是否有缓存。对全局内存的访问将经过L1;如果未命中,则会接着从L2中查找;如果再次未命中,则会从全局内存DRAM中读取。
CUDA允许通过编译选项控制是否启用L1。当L1被禁用时,对全局内存的加载请求将直接进入L2;如果L2未命中,将由DRAM完成请求。
核函数从全局内存DRAM中读取数据有两种粒度,使用L1时,每次按照128字节进行缓存;不使用L1时,每次按照32字节进行缓存。
# 禁用一级缓存
-Xptxas -dlcm=cg
# 启用一级缓存
-Xptxas -dlcm=ca
全局内存的访问模式,有合并和非合并之分。
合并访问指的是一个线程束对全局内存的一次访问请求(读或者写)导致最少数量的数据传输;否则称访问是非合并的。
合并度:线程束请求的字节数 / 由该次请求导致的所有数据传输的字节数。
以仅使用L2缓存为例,一次数据传输或者一次内存事务是将32字节的数据从全局内存(cache sector)传输到SM。考虑一个线程束(32个线程)访问单精度浮点数(4字节)的全局变量,该线程束请求128字节的数据。
https://zhuanlan.zhihu.com/p/641639133
Memory Workload Analysis
内存图表以图形化、逻辑化的方式,展现 GPU 上和 GPU 外内存子单元的性能数据。性能数据包括传输大小、命中率、指令或请求数量等。
逻辑单元显示为绿色(活动)或者灰色(非活动),包括在GPU的SM上执行的CUDA Kernel、全局内存、本地内存、纹理内存、表面内存、共享内存和加载全局存储共享(指令直接从全局加载到共享内存中,无需中间寄存器文件访问)。
物理单元显示为蓝色(活动)或者灰色(非活动),包括
(1)L1/TEX Cache:L1缓存和纹理缓存
(2)Shared Memory:共享内存
(3)L2 Cache:L2缓存
(4)L2 Compression:L2 Cache的内存压缩单元
(5)System Memory:CPU内存
(6)Device Memory:GPU显存
(7)Peer Memory:其他CUDA设备的GPU显存
内核与其他逻辑单元之间的链接表示针对相应单元执行的指令 ( Inst ) 数量。例如, 内核与全局之间的链接表示从全局内存空间加载或存储的指令。
逻辑单元与蓝色物理单元之间的链接表示其各自指令产生的请求 ( Req ) 数量。例如,从 L1/TEX Cache 到 Global 的链接显示了全局加载指令产生的请求数量。
每条链路的颜色代表相应通信路径的峰值利用率百分比。图表右侧的颜色图例显示了从未使用 (0%) 到峰值性能运行 (100%) 所应用的颜色渐变。如果链路处于非活动状态,则显示为灰色。图例左侧的三角形标记对应于图表中的链路。与单独的颜色渐变相比,这些标记可以更准确地估算已实现的峰值性能值。
(1)Instructions
对于每种访问类型,每个 Warp 中实际执行的汇编 (SASS) 指令总数。不包括预测指令。
(2)Requests
每种指令类型生成的所有 L1 请求总数。在 SM 7.0 (Volta) 及更新的架构上,每条指令只会为 LSU 流量(全局、本地等)生成一个请求。对于纹理 (TEX) 流量,可能会生成多个请求。