英伟达的GPU(3)

news2024/11/20 0:45:06

  上节内容:英伟达的GPU(2) (qq.com)

      书接上文,上文我们讲到CUDA编程体系和硬件的关系,也留了一个小问题CUDA core以外的矩阵计算能力是咋提供的

      本节介绍一下Tensor Core 

      上节我们介绍了CUDA core,或者一般NPU,CPU执行矩阵运算的逻辑,基本就是矩阵的一条横向量*另一个矩阵的列向量(逻辑上可以这么认为)

     

    如上面的图所示,左边代表了Pascal架构就是P架构的时候 CUDA core 来处理矩阵运算的逻辑,蓝色的矩阵和紫色的矩阵分别代表两个矩阵,然后他俩做点积的时候,基本就是一个横向量*一个列向量。

      我们把这个过程细化一下:

      两个矩阵A和B,他俩点乘等于一个C,写出来其实就是这样的

      

图片

       I和J代表行和列的角标,k就是算到第几轮计算了。

       这个好理解吧。

      虽然宏观上我们说是向量点乘向量,但是微观上,其实还是一个格子对一个格子的算。

     

CUDA Core 实现矩阵乘法

  1. 矩阵分块:将大矩阵划分成适合 CUDA 核心处理的小块(block)。通常每个 block 是一个二维块,其中包含多个线程(thread)。例如,16x16 或 32x32 的 block 大小是常见的选择。

  2. 线程分配:每个线程块中的线程负责计算结果矩阵 C 中一个小块的元素。例如,一个 16x16 的 block 会有 256 个线程,每个线程计算 C 中一个 16x16 小块中的一个元素。

  3. 并行计算:每个线程独立执行矩阵乘法的部分计算。具体来说,每个线程计算一个元素Cij,它需要遍历矩阵 A 的第 i 行和矩阵 B 的第 j 列,进行乘法和累加操作。

  4. 共享内存:为了提高性能,CUDA 核心利用共享内存。共享内存是一种高速缓存,允许同一个 block 内的线程共享数据。(这我后面讲Cache和显存那块会细讲)矩阵的分块计算过程中,子矩阵会被加载到共享内存中,减少全局内存访问次数,提高计算效率。

具体计算步骤

用代码表示:

  1. 分配线程和块:

    • 定义网格(grid)和块(block)的尺寸。(这块看不懂的,去看我上一节讲的CUDA编程线程分级体系)

    • 将计算任务分配给每个块和线程。

  2. 加载数据到共享内存:

    • 每个线程块加载一小块矩阵 A 和 B 到共享内存中。

    • 这些小块矩阵被多次重复使用,减少对全局内存的访问。

  3. 计算并累加结果:

    • 每个线程计算其负责的结果矩阵 C 中一个元素。

    • 进行多次小块矩阵乘法的累加,直到完成整个矩阵乘法运算。

  4. 写回结果:

    • 计算完成后,将结果写回全局内存中的结果矩阵 C。

图片

     

     上面对比图右边那个操作就是Tensor Core的矩阵计算操作,先不解释,就光看就比左边猛很多,对吧?它就不是行列级别了,就是直接矩阵和矩阵运算了,其实当时V系列第一次出Tensor core的时候是很让人惊艳的,但是到了现在,大多数NPU都支持MXM(matrix 乘模块),但是当年V系列推出的时候还是很惊艳的,现在其实也很猛,但是主要是连年的性能提高。

    Tensor Core除了对比图中展示的,直接矩阵*矩阵,在一个单位的时钟里面能提供尽可能多的计算能力以外,还有就是可以支持16和32的混合精度能力

图片

      如上图所示,在V100刚出的时候就推出了这个功能。

      每个 Tensor Core 一个计算周期能执行 4x4x4 GEMM,就相当于64 个 FMA。

     比如对于运算D=A*B+C,其中A、B、C 和 D 是 4×4矩阵。矩阵乘法输入 A 和 B 是 FP16矩阵,而累加矩阵 C 和 D我就不非得要求是 FP16,我是FP16还是FP32 矩阵都行。

     这个对于CUDA Core来讲,也不是做不到的,你可以手动实现可以通过 CUDA 代码手动实现混合精度计算,例如使用 FP16 数据类型进行部分计算,然后转换为 FP32 进行累加等。但是这么做,第一是墨迹,多出一步增加复杂度和延迟,第二是没专门硬件给你优化啊,因为CUDA Core我们第一章讲过,固定的精度,多少就是多少。

      所以对于混合精度,现在也是LLM训练必备的能力了,从某种意义上讲,在NV上想支持,Tensor Core就是必须的了。

     

图片

    再就是A100和后面的型号的sparse matrix的压缩

    

图片

    说白了就是 稀疏矩阵,NV的Tensor core给你做的话,能把0给压没了,你矩阵变小了,算的不就快了吗,这也是为什么大家看NV的datasheet总看不懂的原因

图片

      比如上图,看着这么猛,实际上都是按稀疏矩阵算的,所以我们正常算的时候都按1半算,这也就是大家一聊H100就说900多的原因。

      Tensor Core是怎么处理矩阵计算的呢?

Tensor Core 矩阵乘法运算

    还是假设有两个矩阵 A 和 B,它们的乘积是矩阵 C。Tensor Core 的主要特点是支持 WMMA(Warp Matrix Multiply-Accumulate)操作,这是一个特定的 CUDA 函数,用于执行矩阵乘法和累加。

Tensor Core 计算步骤

  1. 分配线程和块:

    • 使用 Warp(通常是 32 个线程)来分配计算任务。

    • 一个 Warp 负责计算结果矩阵 C 的一个 16x16 子矩阵。

  2. 加载数据到共享内存:

    • 将矩阵 A 和 B 的子矩阵块加载到共享内存中。

    • 这些子矩阵块在共享内存中进行矩阵乘法运算。

  3. 执行矩阵乘法和累加操作:

    • 使用 WMMA API 来执行矩阵乘法和累加操作。

    • Tensor Core 在一个时钟周期内执行多个浮点运算。

  4. 写回结果:

    • 计算完成后,将结果写回全局内存中的结果矩阵 C。

   

这里就得提一嘴WMMA了

WMMA(Warp Matrix Multiply-Accumulate)是 NVIDIA 为 Tensor Core 提供的专用 API,用于在 CUDA 中执行高效的矩阵乘法和累加操作。WMMA API 主要特点和工作原理如下:

WMMA API 的主要特点

  1. 高效的矩阵运算:

    • WMMA API 专门优化了矩阵乘法和累加操作,能够在一个时钟周期内执行多个浮点运算,从而显著提高性能。

    • 利用 Tensor Core 的硬件支持,实现高吞吐量的计算。

  2. 支持混合精度计算:

    • WMMA API 支持混合精度计算,即输入矩阵可以使用半精度浮点数(FP16),而计算和输出可以使用单精度浮点数(FP32)。

    • 这种方式不仅提高了计算速度,还在一定程度上保持了计算精度。

  3. Warp级别的操作:

    • WMMA API 在 Warp 级别(通常是 32 个线程)进行操作。每个 Warp 负责计算结果矩阵中的一个 16x16 子矩阵。

    • 通过并行执行多个 Warp,实现大规模并行计算。

  4. 片段操作:

    • WMMA API 引入了片段(fragment)的概念,用于存储子矩阵和累加器。

    • 片段在寄存器中进行存储和操作,减少了对全局内存的访问,从而提高了性能。

WMMA API 的工作流程

  1. 声明和初始化片段:

    • 使用 wmma::fragment 声明用于存储矩阵块和累加器的片段。

    • 使用 fill_fragment 对累加器片段进行初始化。

  2. 加载矩阵数据到片段:

    • 使用 load_matrix_sync 将全局内存中的矩阵数据加载到片段中。

    • 这些数据将被加载到共享内存或寄存器中,以便快速访问和计算。

  3. 执行矩阵乘法和累加操作:

    • 使用 mma_sync 执行矩阵乘法和累加操作。

    • 该函数将两个输入矩阵片段相乘,并将结果累加到累加器片段中。

  4. 存储结果到全局内存:

    • 使用 store_matrix_sync 将计算结果从累加器片段存储回全局内存。

    • 结果矩阵的子块被写回到指定的内存位置。

    代码样例:

图片

      最后值得一说的就是CUDA core 和Tensor Core支持的精度不一样,不是啥下游任务两个都可以做,还是得看具体支持。

  

图片

     本节完,下一章写缓存结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1691945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android中华为手机三态位置权限申请理解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家&#xff0c; &#x1f449;点击跳转到教程 前言&#xff1a; 使用的华为MATE 20,Android10的系统。 <!--精准定位权限&#xff0c;如&#xff1a;…

建议收藏 | 2023年生物学类SCI期刊影响因子最新预测,Molecular Plant遥遥领先

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 建议收藏 | 2023年生物学类SCI期刊影响因子最新预测&#xff0c;Molecular Plant遥遥领先https://mp.weixin.qq.com/s/tFINUzZ1l4H9x1HWTq1kFg 2023年生物学类SCI期刊影响因子最新预测&#xff0c;Molecu…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统&#xff0c;数据库为mysql&#xff0c;可用于日常学习和毕设&#xff0c;系统分为管理员、房东、用户&#xff0c;部分截图如下所示&#xff1a; 部分界面截图 用户 管理员 联系我 微信&#xff1a;Zzllh_

linux父进程fork出子进程后,子进程为何首先需要close文件描述符。

在linux c/c编程时&#xff0c;父进程fork出子进程后&#xff0c;子进程经常第一件事就是close掉所有的文件描述符&#xff1b;为何需要这样做&#xff0c;本文用一个例子进行简单说明。 考虑到一种情况&#xff0c;父进程创建了tcp服务端套接字&#xff0c;并且listen&#x…

6.中断管理

一、简介 中断是 CPU 的一种常见特性&#xff0c;中断一般由硬件产生&#xff0c;当中断发生后&#xff0c;会中断 CPU 当前正 在执行的程序而跳转到中断对应的服务程序种去执行&#xff0c;ARM Cortex-M 内核的 MCU 具有一个 用于中断管理的嵌套向量中断控制器&#xff08;NV…

Qt 在windows下显示中文

Qt在windows平台上显示中文&#xff0c;简直是一门玄学&#xff0c;经过测试&#xff0c;有如下发现&#xff1a; 1&#xff0c; 环境&#xff1a;Qt 5.15.2 vs2019 64位 win11系统 默认用Qt 创建的文件使用utf-8编码格式&#xff0c;此环境下 中文没有问题 ui->textE…

运用HTML、CSS设计Web网页——“西式甜品网”图例及代码

目录 一、效果展示图 二、设计分析 1.整体效果分析 2.头部header模块效果分析 3.导航及banner模块效果分析 4.分类classify模块效果分析 5.产品展示show模块效果分析 6.版权banquan模块效果分析 三、HTML、CSS代码分模块展示 1. 头部header模块代码 2.导航及bann…

一条命令安装Metasploit Framework

做安全渗透的人都或多或少的使用kali-Linux系统中msfconsole命令启动工具&#xff0c;然而也经常会有人遇到这样那样的问题无法启动 今天我们就用一条命令来重新安装这个工具 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/met…

Proteus仿真小技巧(隔空连线)

用了好几天Proteus了.总结一下使用的小技巧. 目录 一.隔空连线 1.打开添加网络标号 2.输入网络标号 二.常用元件 三.运行仿真 四.总结 一.隔空连线 引出一条线,并在末尾点一下. 1.打开添加网络标号 选择添加网络标号, 也可以先点击按钮,再去选择线(注意不要点端口) 2.…

PTT票据传递攻击

一. PTT票据传递攻击原理 1.PTT介绍 PTT(Pass The Ticket)&#xff0c;中文叫票据传递攻击&#xff0c;PTT 攻击只能用于kerberos认证中,NTLM认证中没有&#xff0c; PTT是通过票据进行认证的。 进行票据传递&#xff0c;不需要提权&#xff0c;域用户或者system用户就可以 …

2024上海初中生古诗文大会倒计时4个月:单选题真题解析(持续)

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

【JS】并发控制

需求 控制网络请求并发数控制并发按顺序返回结果 码 /** * 控制并发 * param {Function} fn 逻辑处理函数 * param {Array} arr 发送的数据 * param {Number} [max3] 并发数 默认3 * param {Number} [orderfalse] 按顺序返回执行结果 默认false * param {Number} [retry1] 重试…

javaAPI文档中文版(JDK11在线版)java帮助文档,掌握文档java学习事半功倍。

&#x1f320;个人主页 : 赶路人- - &#x1f30c;个人格言 : 要努力成为梧桐&#xff0c;让喜鹊在这里栖息。 要努力成为大海&#xff0c;让百川在这里聚积。 11.by,prep.凭&#xff0c;靠&#xff0c;沿 [baɪ] 12.press,v.按&#xff0c;压 [prɛs] 菜鸟教程javaAPI文档中文…

python水果分类字典构建指南

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、理解需求 三、构建字典 1. 数据结构选择 2. 代码实现 3. 结果展示 四、总…

深入编程逻辑:从分支到循环的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、编程逻辑的基石&#xff1a;分支与循环 分支逻辑详解 代码案例&#xff1a;判断整数是…

速卖通测评揭秘:如何选择安全的渠道操作

许多商家对测评存在误解&#xff0c;认为只需进行几次测评就能迅速打造爆款。实际上&#xff0c;测评是一个需要计划和持久性的过程&#xff0c;以便让平台检测到产品的受众程度并提高产品的曝光和权重。 在进行测评时&#xff0c;安全是首要考虑的问题。平台可以通过设备、网…

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

二叉树——进阶(递归创建,非递归,广度优先,翻转,深度,对称)

二叉树——进阶 二叉树的递归创建非递归前中后序遍历非递归前序遍历非递归中序遍历非递归后序遍历 广度优先遍历二叉树&#xff08;层序遍历&#xff09;翻转二叉树 二叉树深度最大深度最小深度 对称二叉树 二叉树的递归创建 1&#xff0c;二叉树是一种结构相对固定的数据&…

SpringBoot接入Knife4j接口文档

0.介绍 1&#xff09; Knife4j是什么 Knife4j是Java MVC框架集成Swagger生成Api文档的增强解决方案&#xff0c;前身是swagger-bootstrap-ui&#xff0c;有着比Swagger更为美观的UI以及功能。 例如以下效果图&#xff1a; 2&#xff09; 官方链接 官网&#xff1a;Knife4j …