前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大模型与AI底层技术揭秘(40)踩着书堆爬出坑

大模型与AI底层技术揭秘(40)踩着书堆爬出坑

作者头像
用户8289326
发布2024-07-01 15:09:30
550
发布2024-07-01 15:09:30
举报

在计算机系统中,如果想取的数据不在缓存中,就是所谓的cache line miss,需要去内存里面找。如果数据是新的(类似新书刚出版)则一定得从内存里面找,需要忍受较长的时延。

对于支持超线程的CPU,ALU在cache line miss期间,会被调度给其他硬件线程使用,而GPU呢?

这就是我们今天要讨论的话题。

我们在上一期提到,在NVidia的GPU中,介于寄存器列(register file)和GPU内存(也称为显存)之间,还有每个SM内部的shared cache,以及多个SM共享的L2 Cache。

当GPU需要访问内存的时候,首先会去L1缓存查找,找不到再去L2缓存找。当L2缓存也没有所需的数据的时候,才去全局内存(global memory,也可以称为显存)里面查找。

与CPU类似,GPU的缓存的基本组织单位也是缓存行(cache line)。NVidia的L1 Cache的缓存行是128 Byte,每个缓存行映射到Global memory上的128 Byte。如果一个Warp(线程束)中有32个线程,每个线程读取4Byte(如FP32)的内容,那么刚好就是1个Cache Line。类似地,每个线程读取一个FP64,则32个线程刚好可以读取2个Cache Line对齐的内存块。

如图,如果读取的内存地址是Cache line对齐的,比如可以被128整除,就可以得到较高的访问性能。

反过来,如果不遵守对齐和连续原则,有的thread从0开始取数据,有的thread从256开始取数据,还有的从128开始取数据,那么会发生三次cache line miss,造成严重浪费。

敲黑板:所以我们不要搞一个warp里面有33个线程这样别扭的分配方式,不仅是为了避免强迫症患者难受,更重要的是,访问cache line对齐的内存才能大大提升访问效率!!!

与CPU不同的是,GPU的L1缓存只遵守空间局部性原理,并没有按时间局部性进行设计。也就是说,在L1缓存中的内容,只要下一次没有用到过,就会被立即替换掉。这是我们需要注意的。

如图,L2缓存是全局共享的,所有的SM可以共享GPU芯片内部的L2缓存。L2缓存的分配单位也是cache line,每个cache line的大小为32Byte或64Byte(TU104或V100以后的版本),相当于8个或16个Float32单精度浮点数。

L2缓存可以分为不同的类型:

cudaAccessPropertyStreaming:流式缓存。这些缓存上的数据优先被逐出。

cudaAccessPropertyPersisting:持久缓存。这些缓存上的数据更有可能保留在 L2 缓存中。

cudaAccessPropertyNormal:删除缓存的持久化属性。

如果持久缓存过大,就有可能导致多个SM竞争流式缓存,造成彼此逐出对方的缓存行(也就是cache line ping-pong),导致性能急剧下降。但如果持久缓存不够,反而会导致高频使用的数据驱逐其他流式缓存中的数据,也会导致数据下降。这方面的调优往往要使用类似优选法的方式来尝试。

小H从方老师这里拿走了一堆书,抱着回去了。

小H学到了什么呢?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅云霓的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档