CUDA会从全局内存缓存数据到统一缓存中,以便将它们存储到共享内存中吗?

3
据我所知,对于之前的NVIDIA GPU架构,GPU遵循以下步骤(全局内存-> L2 -> L1 -> 寄存器-> 共享内存)将数据存储到共享内存中。
然而,Maxwell GPU(GTX980)具有物理上分离的统一缓存和共享内存,并且我想知道这种架构是否也遵循相同的步骤将数据存储到共享内存中?还是它们支持全局内存和共享内存之间的直接通信?
启用统一缓存的选项为 -dlcm=ca

基于@greg-smith在链接中的回答,我发现Fermi和Kepler架构的共享内存存储请求由L1缓存处理。那么Maxwell架构呢? - hkim
1个回答

4
这可能回答了大部分关于Maxwell架构内存类型和步骤的问题:
与Kepler一样,除非使用Kepler引入的LDG只读数据缓存机制,否则Maxwell中的全局加载仅在L2中缓存。
类似于Kepler GK110B,GM204默认保留此行为,但也允许应用程序选择加入到其统一的L1 /纹理缓存中的全局加载缓存。加入机制与GK110B相同:在编译时将-Xptxas -dlcm = ca标志传递给nvcc。
本地加载也仅在L2中缓存,如果Kepler的L1本地加载命中率高,则可能增加寄存器溢出的成本。因此,应重新评估占用率与溢出之间的平衡,以确保最佳性能。特别是考虑到算术延迟的改进,为Maxwell构建的代码可能从稍低的占用率(由于每个线程的寄存器增加)中受益,以换取更低的溢出。
统一的L1 /纹理缓存作为内存访问的汇集缓冲区,将线程所请求的数据聚集到warp之前,然后将该数据传递给warp。这个功能以前由Fermi和Kepler中的单独的L1缓存提供。

来自Nvidia的Maxwell调整指南中第1.4.2节“内存吞吐量”,子节“1.4.2.1统一L1 /纹理缓存”。

这两个部分后面的其他部分和子部分也教授和/或明确有关共享内存大小/带宽、缓存等方面的有用细节。试试吧!


GPU在将数据存储到共享内存之前,它们是否会先将其加载到统一缓存中,然后再将其复制到共享内存中?还是直接绕过统一缓存? - hkim
@hkim 这是我真的不知道的事情,抱歉。 你应该在网上搜索,如果调整指南中没有,可能在Nvidia的其他文档中。 我记得很久以前,我从Nvidia找到了一份非常长的文件(一个.pdf文件),讨论了优化的一般性问题,并有几页专门讨论Kepler的特定优化(这在那个旧时代是最新的架构)。 他们也可能为Maxwell做过这样的事情。也许很快就会为Pascal做出来。 - Taro
你的回答和我预期的有些不同,但我很感谢你的回复。谢谢。 - hkim
我知道,很抱歉,我想更多地了解每种具体的架构,但现在不是这种情况。我希望你能尽快找到你想知道的答案。 - Taro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接