大多数设备端数据访问都是从全局内存开始的,并且多数GPU应用程序容易受内存带宽的限制。因此,最大限度的利用全局内存带宽是调控核函数性能的基本。
对齐与合并访问
如图,所有的应用程序数据最初存在于DRAM上,也就是物理设备内存上。核函数的内存请求通常是在DRAM设备和片上内存间以128字节或32字节内存事务来实现的。
所有对全局内存的访问都会通过二级缓存,也有许多访问会通过一级缓存,这取决于访问类型和GPU架构。如果都用到,就是128字节内存事务;如果只用了二级缓存,那么该内存访问是由一个32字节的内存事务实现的。
内存事务(Memory Transaction)指的是对内存进行的读取或写入操作。在GPU编程中,内存事务通常指的是对全局内存或共享内存的读取或写入操作,这些操作可以由单个线程或线程组(线程束)执行。
对齐的概念与C++类中的内存对齐概念相似,为了避免重复的读取数据,需要将数据在内存中对齐。
合并是指将多个内存事务合并为一个事务,合并通常发生在多个线程或线程束同时访问连续内存地址时。如果这些访问可以被合并为一个更大的内存事务,GPU可以更有效地利用内存系统的带宽和并行性。合并通常由GPU自动完成。
全局内存读取
在SM中,数据通过以下3种缓存/缓冲路径进行传输,具体使用哪种方式取决于引用了哪种类型的设备内存
- 一级和二级缓存
- 常量缓存
- 只读缓存
一级和二级缓存是默认路径。
CPU一级缓存和GPU一级缓存的差异
CPU一级缓存优化了时间和空间局部