大多数设备端数据访问都是从全局内存开始的,并且多数GPU应用程序容易受内存带宽的限制。因此,最大限度地利用全局内存带宽是调控核函数性能的根本。如果不能正确地调控全局内存的使用,其他优化方案很可能也收效甚微。
为了在读写数据时达到最佳的性能,内存访问操作必须满足一定的条件。CUDA 执行模型的显著特征之一就是指令必须以线程束为单位进行发布和执行。存储操作也是同样。在执行内存指令时,线程束中的每个线程都提供了一个正在加载或存储的内存地址。在线程束的32个线程中,每个线程都提出了一个包含请求地址的单一内存访问请求,它并由一个或多个设备内存传输提供服务。根据线程束中内存地址的分布,内存访问被分成不同的模式。
核函数的内存请求通常是在DRAM设备和片上内存之间以128字节或32字节内存事务来实现的,因此在优化应用程序时,需要注意设备内存访问的两个特性:对齐内存访问、合并内存访问。当设备内存事务的第一个地址是用于事务服务的缓存粒度的偶数被时(32字节的二级缓存或128字节的一级缓存)就会出现对齐内存访问。当一个线程束中全部的32个线程访问一个连续的内存块时,就会出现合并内存访问。
请登录后评论~