Nvidia GPU不同架构L1 cahce的一些区别

按照经验来看,GPU通常使用两级的缓存机制,L2是所有SM/CU共用,L1一般是单个SM/CU独自享用,nvidia不同GPU架构在L1的设计上也有一些差异,太久没用容易忘记,这里简要记录下。

1、Kepler(开普勒架构)

1.1、通常情况下L1 CACHE主要用于对local内存进行缓存(寄存器溢出和栈的使用),如果寄存器溢出而local内存跟global内存一样是超级慢的,那简直就是灾难,所以用L1做缓存会有比较大的优势,不过应该很少出现这种情况,除非kernel比较复杂;global内存加载只能在L2进行缓存(或者放置到只读数据缓存)。

注:有通常情况就有例外:例外的情况就是global加载支持L1缓存,需要给nvcc传递一些参数:-Xptxas -dlcm=ca,不过需要额外注意的是只有部分GPU可以这么操作,例如以GK110B芯片设计的显卡

1.2、L1和shared memory是共用的,且可以做一定几种情况的配置,例如48K+16K,或者32K+32K等情况,部分芯片的L1/shared可能比较大,不过单个thread block仍然只能只用48K。超过kernel launch会失败。

1.3、使用L1做缓存的时候,如果启用-Xptxas -dlcm=ca编译模式,需要注意cache的粒度是128字节的,其他情况下是32字节的。

2、Maxwell(麦克斯韦架构)

2.1、该架构对L1和Texture Cache进行合并,而且跟开普勒架构也有较大差异,local内存加载和global内存加载仅仅只能利用L2做数据缓存(作为例外,global内存加载想使用L1,技巧跟开普勒架构一样),从这代开始,L1/Texture Cache对warp的内存请求进行合并访问。

3、Pascal(帕斯卡架构)

3.1、该架构对L1和Texture Cache也是进行合并的,对于GP100不过global内存的加载默认使用L1/Texture Cache。不过GP104跟麦克斯韦架构一样,需要做额外配置nvcc那些参数才能对global内存加载使用L1缓存。

3.2、对于L1缓存,该架构的粒度都是32字节的;与开普勒相同,local内存加载是在L1缓存。

4、Volta(伏打架构)

4.1、伏打架构的L1/Texture cache/shared memory是合并在一起的。

4.2、伏打架构的L1最大到128K。跟开普勒一样,L1和shared memory也是可以配置不同大小的。

5、turing(图灵架构)

5.1、图灵架构与伏打架构的L1 cache行为进行小幅优化,并没有太大差异。L1和shared memory同样可以进行一些不同大小的配置。

总之,对于L1,nvidia不同架构上还是有一些差异,但是对于优化这个事情从来都是没有止境的,有时候对L1的一些细节

理解可能对优化还是有一些帮助。

作者:Keepin
授权转自知乎,请勿二次转载。

推荐专栏文章

  • 快速评估算法对GPU性能需求(入门篇)
  • Arm mali gpu四大微架构概述

更多嵌入式AI算法部署等请关注极术嵌入式AI专栏

发表评论

邮箱地址不会被公开。 必填项已用*标注