百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

英伟达的GPU(4)(英伟达的麻烦还在后头?)

wxin55 2024-10-30 04:37 21 浏览 0 评论

更第四篇,上周有点私事,恢复更新

上次的文章 英伟达的GPU(3) (qq.com)

书接前文,我们上章说要更新GPU的内存机制,本次就讲点这个


先做个定义,我们说内存(显存),也分物理内存(SRAM,DRAM.HBM)和逻辑内存(逻辑可访问地址,这个倒和物理不一定1:1对应),这个和处理CPU的项目的时候没啥区别。

我们之前讲过CUDA编程体系块和线程等逻辑概念。这块不熟悉的可以看第二章 英伟达的GPU(2) (qq.com)。

block,thread啥的各自有各自的工作范围,这些范围其实就是分配GPU逻辑内存和管理线程,block之类资源的一个标尺


  • Local Memory:每个线程都有本地内存,存储临时变量。范围最小因为就服务于每个单独的线程。
  • Shared Memory:同一个Block内的线程可以用共享内存共享数据。与访问全局内存相比,这允许同一块内的线程更快地通信和访问数据,因为近一阶。
  • Global Memory:这是GPU中最大的内存,可以被所有块上的所有线程访问。但是慢吗,离得远。
  • Texture and Constant Memory:GPU 中的特殊内存,针对访问特定数据类型(例如纹理或常量值)进行了优化。所有块中的所有线程都可以访问这些内存类型。

然后我们看实际的物理内存上半部分是CPU的维度,下半部分的On-chip才是GPU的维度,然而这里有一个小误区,HBM虽然是GPU上面的,然后被换分在了Off chip的领域。就是上面的绿色部分的Device memory。

绿色的HBM(Device memory),由于操作系统也不在CPU那边,所以比如你要是训练,或者推理时候读取数据,模型,还得从能掌管IO的CPU的内存那边拿数,CPU的内存和HBM显存之间想通信,一般是经过PCIE,这个图有点老,PCIE还显示6.4Gbps, 实际上现在的PCIE Gen5都15.6G了,下一代Gen6能到256。

另外我比较推崇的GH200,或者GB200架构


如图所示,Hopper也就是H100GPU,不光是用Nvlink链接到NVswitch上面,而且可以和Grace CPU之间有900GB/s的双向通信的C/2链接。

这个怎么理解?

NV虽然一直耍心眼总标双向带宽,比如900GB其实是单向450GB,但是毕竟是大B啊,所以合3.6T/s的单向传输速度。

贵肯定是贵,但是你要比PCIE的呢?H100标准的Gen5 PCIE 的CPU和GPU之间应该是2根PCIE GEN5, 编码是128b/130b的,传输速度能跑到128Gbps已经是极限。

差28倍!

当然有"懂"的兄弟这时候会实时的抛来一个challenge ,例如“你到底懂不懂啊?Nvlink也就链接GPU的时候有用,负责做本机箱内的GPU联合通讯源语的时候有用,跟CPU有啥关系",其实如果能喷出来到这个级别的哥们还是挺专业的,但是我的补充一下,在现在NVlink5一根都1.8TB/s的情况下,其实压力不特别在机箱这侧,因为满打满算8个。至于为什么在CPU这,懂的兄弟就不解释了,也没什么可解释的,做个train的都懂。不懂的我卖个关子,后面讲(其实看我原来的一些文章都有解释...)。


然后比如拿H100举例,从HBM把模型和tokens读上来之后,就进入到缓存体系了,GPU目前主流设计还是以2级缓存为主。你们经常玩的flash-attention也主要工作在这个部分。

NVIDIA A100 GPU 的缓存架构包括两级缓存:

  1. 一级缓存(L1 Cache):每个流式多处理器(SM)都有自己的一级缓存。A100 的一级缓存为每个 SM 提供 192KB 的缓存。一级缓存在 A100 中被实现为共享内存/缓存组合,提供低延迟访问每个 SM 中经常使用的数据和指令。
  2. 二级缓存(L2 Cache):A100 GPU 具有一个全球二级缓存,所有 SM 共享这个缓存。二级缓存的大小为 40MB,显著大于一级缓存。二级缓存有助于减少跨 SM 数据访问的延迟,并减少对高带宽内存(HBM)的需求。

一级缓存(L1 Cache)位于每个 SM 内部,由于其需要低延迟操作,通常使用 SRAM(静态随机存取存储器)实现。二级缓存(L2 Cache)也通常使用 SRAM 实现,以满足高速度访问的需求。

一级在SM内部,纯粹的片上片,所以虽然两个缓存都是SRAM,但是大小区别很大,因为就近的和tensor core或者cuda core通信,所以L1那边也是速度起飞

这两级缓存协同工作,提高了 A100 GPU 的整体效率和性能,减少了对 HBM 内存的延迟和带宽需求

从下到上,速度的和延迟也是成线性的递增状态,延迟呈现线性递减(图上左边有标准)

再往上就是寄存器了,那也不能和这些标准存储来相比,也没啥可谈的。

下面这个表是在不同传输存储介质里面A100的延迟,带宽,计算密度,线程的一些对比

今天内存,缓存就讲到这里,后面deepdive一下,tensor core和显存,cache的合作机制,workflow,然后讲Nvlink,再后面讲讲A,H,B和R的架构,然后基本这个系列就结束了。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: