0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPU Microarch学习笔记

处理器与AI芯片 来源:处理器与AI芯片 2023-08-14 14:39 次阅读

Warp

GPU的线程从thread grid 到threadblock,一个thread block在CUDA Core上执行时,会分成warp执行,warp的颗粒度是32个线程。比如一个thread block可能有1024个线程,那么就会分成32个warp执行。

ddb374e6-390d-11ee-9e74-dac502259ad0.png

上图的CTA(cooperative thread arrays)即为thread block。

Warp内的32个线程是以lock-step的方式锁步执行,也就是在没有遇到分支指令的情况下,如果执行,那么执行的都是相同的指令。通过这种方式32个线程可以共享pc,源寄存器ID和目标寄存器ID。

虽然warp是以32的颗粒度,但是具体在GPU内部执行时,也可能是以16的颗粒度,分两次执行,比如早期的fermi架构。

dddfa098-390d-11ee-9e74-dac502259ad0.png

如上图所示,两个warp scheduler,每个warp每次只能在16个CUDA core上执行。

后续的Pascal GPU架构 CUDA core增加到了32个,每个周期都能执行一个warp。

de11a43a-390d-11ee-9e74-dac502259ad0.png

寄存器

GPU的寄存器数量是影响划分CUDA thread block的数量的原因之一,如下图所示[1]。

de51f210-390d-11ee-9e74-dac502259ad0.png

虽然内部执行是按照warp执行的,按照调度顺序和ready进行调度。但是寄存器的分配是静态的按照thread number分配的,而不是warp。在warp执行时,32个线程,每个线程读取源寄存器,写入目标寄存器。假设每个寄存器4B,那么每次32个线程读取128B。

因而128B也就是GPU L1 Cache Cacheline的大小。不同于CPU,每一级的cache都要维护MOSEI的一致性,对于GPU的thread来说,私有memory不需要共享,因此对于local memory可以write back。而全局共享memory则可以write evict。

CPU的寄存器,在编译器编译时,会根据寄存器的live time进行优化,而且在CPU内部执行时,进行重命名,在有限的寄存器数量上尽量地解决依赖问题。

GPU只在编译时优化,尽量减少对memory的使用,在内部执行时,如果针对每个warp都增加一个寄存器重命名单元,设计复杂。因此GPU每个线程需要的寄存器就是它编译时需要的寄存器上限(寄存器上限也可以通过编译器控制)。这就导致了实际GPU内部执行时对寄存器使用数量的波动。如下图[2]所示,因此也有很多文章研究如何优化寄存器的使用。

de8424f6-390d-11ee-9e74-dac502259ad0.png

在编译时,nvcc可以通过指定--maxrregcount指定寄存器的数量,但是过多的寄存器会因为固定的寄存器资源而导致thread数量变少,过少的寄存器也会导致需要频繁的访问memory,因此也需要折衷。

deadf132-390d-11ee-9e74-dac502259ad0.png

WARP Divergence

之前讨论warp时说如果32个线程,没有遇到分支,那么每个线程都执行同一条指令,但是如果存在分支呢?

GPU没有CPU的分支预测,使用active mask和predicate register来构建token stack来处理遇到分支时的问题。

GPGPU-sim按照下图[3]模拟的token stack,其中的

def25c8c-390d-11ee-9e74-dac502259ad0.png

另一种可能的token stack则是按照如下的方式构建,结合了指令,predicateregister和token stack。

df2592c8-390d-11ee-9e74-dac502259ad0.png

上图[4]中的(b)即为编译出的汇编指令,SSY 0xF0即为push stack,if else分支指令结束重聚的指令地址为0xF0。每个warp会有当前的active pc寄存器和active mask寄存器。我们假设一个warp内有8个thread,在SSY0xF0指令执行时,会将active mask 压栈,压栈的内容包括Fig1中的entry type SSY,active mask和re-convergence pc,也就是0xF0(从SSY 0xF0指令可以获得).

在分支指令@PO BRA 0xB8执行时,会将DIV(divergence),activemask(0xF0,这个并非pc,而是active mask,当前warp的每个thread的predicateregister拼接而成,8bit 每个bit表示一个thread是否满足if条件)和 0xB8(if语句块内的第一条指令的地址)压栈。

然后gpu会默认执行else分支(因为if需要跳转,else直接顺序执行),执行else分支时,需要对active mask取反,只执行不满足if条件的那些thread。

Else分支的最后一条汇编指令末尾会增加.S flag用于标志popstack,此时pop指令会将active mask出栈,更新到active mask寄存器和active pc中,然后执行if 分支,直到执行完毕if内的最后一条指令,对应地址0xE8,此时再次出栈。

将当前active pc更新为0xF0,activemask更新为0xFF,此时if else分支执行完毕,回到重聚点,所有线程继续lock-step锁步执行。

这里只假设一个if else,但是实际上可能存在if else的嵌套,因此第一步SSY 0xF0,可以理解成上下文切换时的先保存当前的activemask 0xFF和重聚点的指令地址0xF0。

上述的方案与GPGPU-sim中的架构类似,除了在指令中显式的增加了压栈出栈,GPGPU-sim处理每一个分支都需要压栈if else两条分支,占用两项,而方案2)中每次除了保存当前active mask外,只需压栈一项。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5183

    浏览量

    118351
  • 编译器
    +关注

    关注

    1

    文章

    1587

    浏览量

    48796
  • CUDA
    +关注

    关注

    0

    文章

    120

    浏览量

    13506
  • cache技术
    +关注

    关注

    0

    文章

    41

    浏览量

    1015
  • GPU芯片
    +关注

    关注

    1

    文章

    303

    浏览量

    5711

原文标题:GPU Microarch 学习笔记【1】

文章出处:【微信号:处理器与AI芯片,微信公众号:处理器与AI芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA在深度学习应用中或将取代GPU

    笔记本电脑或机架式服务器上训练神经网络时,这不是什么大问题。但是,许多部署深度学习模型的环境对 GPU 并不友好,比如自动驾驶汽车、工厂、机器人和许多智慧城市环境,在这些环境中硬件必须忍受热、灰尘、湿度
    发表于 03-21 15:19

    深度学习框架TensorFlow&TensorFlow-GPU详解

    TensorFlow&TensorFlow-GPU:深度学习框架TensorFlow&TensorFlow-GPU的简介、安装、使用方法详细攻略
    发表于 12-25 17:21

    CPU,GPU,TPU,NPU都是什么

    嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么一、什么是CPU?二、什么是GPU?三、什么是TPU?四、什么是NPU?附:一、什么是CPU?中央处理器(CPU)
    发表于 12-15 06:07

    Mali GPU支持tensorflow或者caffe等深度学习模型吗

    Mali GPU 支持tensorflow或者caffe等深度学习模型吗? 好像caffe2go和tensorflow lit可以部署到ARM,但不知道是否支持在GPU运行?我希望把训练
    发表于 09-16 14:13

    PADS_2007学习笔记

    PADS_2007学习笔记
    发表于 01-16 13:54 18次下载

    Ansoft学习笔记

    ansoft学习笔记与常见问题
    发表于 03-23 10:24 0次下载

    Java设计模式学习笔记

    Java设计模式学习笔记
    发表于 09-08 10:15 5次下载
    Java设计模式<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    ARM学习笔记

    ARM学习笔记
    发表于 10-13 14:28 3次下载
    ARM<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    Altera FPGA CPLD学习笔记

    Altera FPGA CPLD学习笔记(肇庆理士电源技术有限)-Altera FPGA CPLD学习笔记                 
    发表于 09-18 10:54 82次下载
    Altera FPGA CPLD<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    学习笔记】单片机汇编学习

    学习笔记】单片机汇编学习
    发表于 11-14 18:21 12次下载
    【<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】单片机汇编<b class='flag-5'>学习</b>

    使用外部GPU在Linux笔记本上加速机器学习

      随着 Intel Thunderbolt 3 在笔记本电脑中的引入,您现在可以使用外部 GPU ( e GPU )外壳来使用专用的 GPU 来进行游戏、制作和数据科学。霹雳 3e
    的头像 发表于 04-28 14:16 1921次阅读
    使用外部<b class='flag-5'>GPU</b>在Linux<b class='flag-5'>笔记</b>本上加速机器<b class='flag-5'>学习</b>

    GPU 引领的深度学习

    GPU 引领的深度学习
    的头像 发表于 01-04 11:17 568次阅读

    Sentaurus TCAD学习笔记

    半导体仿真Sentaurus TCAD 学习笔记,仅供学习
    发表于 08-07 14:54 4次下载

    Allegro学习笔记.zip

    Allegro学习笔记
    发表于 12-30 09:19 6次下载

    GPU在深度学习中的应用与优势

    人工智能的飞速发展,深度学习作为其重要分支,正在推动着诸多领域的创新。在这个过程中,GPU扮演着不可或缺的角色。就像超级英雄电影中的主角一样,GPU在深度学习中拥有举足轻重的地位。那么
    的头像 发表于 12-06 08:27 922次阅读
    <b class='flag-5'>GPU</b>在深度<b class='flag-5'>学习</b>中的应用与优势