根据CUDA 5.0编程指南,如果我同时使用L1和L2缓存(在Fermi或Kepler上),则所有全局内存操作都是使用128字节内存事务完成的。但是,如果我只使用L2,则使用32字节内存事务(第F.4.2章)。
让我们假设所有缓存都是空的。如果我有一个warp,每个线程以完全对齐的方式访问一个4字节字,这将导致L1 + L2情况下的1x128B事务,以及仅L2情况下的4x32B事务。是吗?
我的问题是 - 4个32B交易是否比单个128B交易慢? 我对前费米硬件的直觉表明它会更慢,但也许在新硬件上不再是这样吗?或者我可以只看一下带宽利用率来判断我的内存访问效率?
答案 0 :(得分:6)
是的,在缓存模式下,将生成一个128字节的事务(从L1缓存级别看)。在未缓存模式下,将生成四个32字节的事务(从L2缓存级别看 - 它仍然是一个128字节)由于合并而来自warp的请求。)在您描述的情况下,对于完全合并的访问,无论缓存模式还是未缓存模式,四个32byte事务都不会慢。在任何一种情况下,内存控制器(在给定的GPU上)都应生成相同的事务以满足warp的请求。由于内存控制器由一个(最多6个)“分区”组成,每个分区都有一个64位宽的路径,最终可能会使用多个内存事务(可能跨越多个分区)来满足任一请求(4x32byte或1x128byte)。跨越分区的特定事务和组织数量可能因GPU而异(并且不是您的问题的一部分,但具有DDR泵浦内存的GPU将为每个内存事务每个分区返回16字节,并且具有QDR泵浦内存,每个内存事务将返回每个分区32字节)。这也不是CUDA 5特有的。您可能希望查看NVIDIA的webinars之一,了解此材料,特别是“CUDA优化:内存带宽限制内核”。即使您不想观看video,快速查看slides也会提醒您所谓的“缓存”和“未缓存”访问之间的各种差异(这是指L1),并且还为您提供了尝试每种情况所需的编译器开关。
审核幻灯片的另一个原因是它会提醒您在什么情况下可能想要尝试“未缓存”模式。特别是,如果您的warp中存在分散(未合并)访问模式,则未缓存模式访问可能会产生改进,因为与128byte相比,从内存请求32byte数量以满足单个线程的请求时,“浪费”更少数量。但是,在回答您的最终问题时,要对其进行分析是相当困难的,因为可能您的代码是有序和无序访问模式的混合。由于通过编译器开关打开了未缓存模式,因此幻灯片中给出的建议只是“双向尝试代码”并查看哪些运行速度更快。根据我的经验,在非缓存模式下运行很少会产生性能提升。
编辑:抱歉,我有错误演示文稿的链接和标题。修复了幻灯片/视频链接和网络研讨会标题。