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

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

3天内不再提示

剖析GPU分支分歧对性能的影响

B4Pb_gh_6fde77c 来源:GPU and Computing 作者: GPUComputing 2021-08-13 16:07 次阅读

在先前文章中,我们谈到现代GPU发展出SIMT(Single Instruction Multiple Thread)的执行结构,硬件线程池的线程们有相对独立的运行上下文,以Warp为单位分发到一组处理单元按SIMD的模式运行。

这些Warp内的线程共享同样的PC,以锁步的方式执行指令,但是每个线程又可以有自己的执行分支。很自然衍生的一个问题就是现代GPU如何有效的处理Branch Divergence(分支分歧)?

一方面为适应复杂图形渲染以及通用计算的要求,GPU编程语言像其它高级语言一样需要支持各种各样的流控制(Flow Control)指令,比如ifswitchdoforwhile等等,这些指令都会导致分支分歧。

另一方面GPU并行计算的特点要求所有处理单元整齐划一地执行相同指令,才能够取得性能最大化。如何较好地解决这两种不同要求导致的冲突,一直是GPU研究中的热点难点问题。在这里笔者没有能力深入探讨,只是浅尝辄止做一般介绍,主要求这个系列内容完整,不足甚至谬误之处,请各位看官不吝指正。

一,分支分歧对性能的影响

这一节我们首先来讨论下分支分歧对GPU性能的影响。以如下ifelse代码为例,我们看下GPU一般是如何来处理分支分歧的?

if (cond) {。。。} else {。。。}

假设一个Warp中有16个线程判断条件为真,另外16个线程条件为假,所以一半线程会执行if中的语句,另一半线程执行else中的语句。这看起来像个悖论,我们知道Warp中的线程同一时刻只能执行相同的指令。

实际上遇到分支分歧时GPU会顺序执行每个分支路径,而禁用不在此路径上的线程,直到所有有线程使能的分支路径都走完,线程再重新汇合到同一执行路径。每个分支都有些线程不干活或者干无用功,Warp实际上需要执行的指令数目大增。

假设每个分支任务量大致相同,分支分歧造成的性能损失少则原先的一半,最坏的情况如果每个线程执行分支都不一致,性能下降为最高时候的1/32。

所以无论在设计算法还是分配处理数据的时候,我们都要小心尽量避免同一个Warp内线程出现分支分歧的状况,在遇到流控制指令的时候,最好能够选择同样的路径。

二,如何实现Reconvergence

上一节我们讲了Warp的线程产生了分支分歧之后,为求性能最佳,不可能让它们一直放任自流,最终还是要尽可能在合适时机把它们重新汇合(Reconverge)起来。但这一切是如何实现的呢?

按照参考1的说法,“The SM uses a branch synchronization stack to manage independent threads that diverge and converge” 。下面根据可接触到的文献我们看看大概是如何实现的,不一定跟GPU产商的实际做法一致。

我们称这个Warp运行时栈为SIMT Stack,每个Warp拥有一个SIMT栈用于处理SIMT执行模式中的分支分歧。

首先我们需要先确定分支分歧的最近重汇合点(Reconvergence Point),一般可以选用造成分支分歧节点的直接后序支配节点(Immediate post-dominator,若控制流图的节点n 到终结节点的每一条路径均要经过节点d,则称节点d后序支配节点n,如d与n之间没有任何其他节点后序支配n,则称节点d直接后序支配节点n)。

这可以通过编译时的控制流分析得到。左边是我们假想的一段GPU伪代码,右边是对应的控制流图,我们假设SIMD通道的数目是4,每个节点边上的掩码数字代表通道上线程在该节点基本块有没有使能。

SIMT栈结构每个条目由执行指令PC、分支重汇合PC(RPC)和使能线程掩码三部分组成。执行流从节点B分支分歧到节点E重新汇合时SIMT栈的更新过程。执行的时候,遇到流控制指令,我们将各个分支依次入栈,栈顶条目的PC会被送到取指单元开始相应分支路径的处理。

只有条目掩码中使能的线程会处于活跃状态,当下一条PC等于栈顶条目RPC的时候,说明该分支已经到了汇合点,栈顶条目会被弹出,开始下一分支的处理以至所有执行线程汇合并共同执行接下来的指令。值得注意的是真实环境下GPU都设计有一些特殊指令来维护SIMT栈。

下图表示上面代码在时间轴上的执行过程,实心箭头表示对应线程在该执行节点处于活跃状态,反之空心箭头代表不活跃状态。

ada94e44-fbb9-11eb-9bcf-12bb97331649.png

基于SIMT栈的Reconvergence方案并不完美,其中一个很大的问题是Warp内线程细粒度同步的时候很容易引发死锁。按照Nvidia的说法,“algorithms requiring fine-grainedsharing of data guarded by locks or mutexes can easily lead to deadlock,depending on which warp the contending threads come from.”。

以下面代码为例,某幸运线程拿到锁之后,在最近重汇合点C等着与大部队接头,不幸的是它无法执行下面的Exch指令以释放锁,导致其它线程只能在B处空转,形成死锁。

adb72852-fbb9-11eb-9bcf-12bb97331649.png

从更高的层次上理解,分支分歧导致的顺序执行只发生在Warp内的线程,Warp之间却相互不受干扰,这种不一致的处理方式对算法移植的适应性还是可预测性都会带来影响。Nvidia从Volta GPU开始做出了改进。

提出了“Independent Thread Scheduling”的方法,使得所有线程无关所在Warp可以具有同样并发执行能力,为此相比之前的GPU其Warp内所有线程共享PC以及运行栈,Volta GPU的线程都分别有各自的PC和运行栈,如下图所示。

adc43d30-fbb9-11eb-9bcf-12bb97331649.png

如此针对同样的GPU程序以及分支分歧,Volta与之前的GPU相比有截然不同的调度行为。我们注意到在Volta中所有的Warp线程并没有一起强制汇合执行Z基本块,主要考虑到Z可能作为生产者需要提供其它执行分支依赖的的数据。

回到我们先前死锁的例子,在Volta中这个死锁便可迎刃而解。如果我们明显了解相关分支不存在同步行为,为优化性能计,CUDA提供了 __syncwarp() 函数以便强制汇合。

add48e2e-fbb9-11eb-9bcf-12bb97331649.png

主要参考资料

NVIDIA Tesla: A Unified Graphics and Computing Architecture

Dynamic Warp Formation and Scheduling for Efficient GPU Control Flow

https://developer.nvidia.com/blog/inside-volta/

General-Purpose Graphics Processor Architectures

编辑:jq

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

    关注

    27

    文章

    4400

    浏览量

    126539
  • PC
    PC
    +关注

    关注

    9

    文章

    1948

    浏览量

    152765
  • 编程
    +关注

    关注

    88

    文章

    3438

    浏览量

    92316

原文标题:近距离看GPU计算(3)

文章出处:【微信号:gh_6fde77c41971,微信公众号:FPGA干货】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NVLink技术之GPUGPU的通信

    在多 GPU 系统内部,GPU 间通信的带宽通常在数百GB/s以上,PCIe总线的数据传输速率容易成为瓶颈,且PCIe链路接口的串并转换会产生较大延时,影响GPU并行计算的效率和性能
    发表于 03-27 09:40 252次阅读
    NVLink技术之<b class='flag-5'>GPU</b>与<b class='flag-5'>GPU</b>的通信

    超微gpu服务器评测

    随着科技的不断发展和进步,GPU服务器在大数据分析、深度学习、人工智能等领域正变得越来越重要。而超微GPU服务器因其出色的性能和高度定制化的优势,成为了众多企业和研究机构的首选。本文将从不同角度
    的头像 发表于 01-10 10:37 405次阅读

    英伟达和华为/海思主流GPU型号性能参考

    一句话总结,H100 vs. A100:3 倍性能,2 倍价格 值得注意的是,HCCS vs. NVLINK的GPU 间带宽。 对于 8 卡 A800 和 910B 模块而言,910B HCCS 的总带宽为392GB/s,与 A800 NVLink (400GB/
    发表于 12-29 11:43 1578次阅读
    英伟达和华为/海思主流<b class='flag-5'>GPU</b>型号<b class='flag-5'>性能</b>参考

    揭秘GPU: 高端GPU架构设计的挑战

    在计算领域,GPU(图形处理单元)一直是性能飞跃的代表。众所周知,高端GPU的设计充满了挑战。GPU的架构创新,为软件承接大模型训练和推理场景的人工智能计算提供了持续提升的硬件基础。
    的头像 发表于 12-21 08:28 416次阅读
    揭秘<b class='flag-5'>GPU</b>: 高端<b class='flag-5'>GPU</b>架构设计的挑战

    Git命令之本地分支与远程分支关联和解除

    在实际的工作生活中,往往需要将本地的分支和远程分支关联,这样我们就可以使用git pull命令来更新拉取最新的代码,并使用git push命令将自己本地的修改推送到远程仓库。但是如果此时你本地关联
    的头像 发表于 12-15 09:27 701次阅读
    Git命令之本地<b class='flag-5'>分支</b>与远程<b class='flag-5'>分支</b>关联和解除

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

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

    Mali GPU性能分析工具

    本文档描述了马里GPU性能分析工具2.2版中的已知勘误表。 这是一个贯穿整个产品生命周期的工作文档,因此,随着新信息的发现,其内容可能会被修改。 本文中包含的信息是ARM有限公司的财产,对错误或遗漏
    发表于 09-05 07:08

    一文带你详解芯片--SL8541e-系统性能优化

    375%以上,CPU充足;前台任务调度优先级高。 内存:1G内存机器占用剩余400M,内存充足;对比2G内存剩余更多,问题也存在 GPU:当前分支上没有合入GPU渲染,但以前在3.1release上合
    发表于 08-22 09:12

    UWA推出全新GPU性能测评工具,支持多款PowerVR芯片优化

    移动设备GPU性能优化对玩家游戏体验至关重要。侑虎科技UWA一直专注于游戏和VR应用的性能优化,移动设备GPU优化是其关注的重点,为了更好地满足开发者针对不同
    的头像 发表于 08-14 10:13 696次阅读
    UWA推出全新<b class='flag-5'>GPU</b><b class='flag-5'>性能</b>测评工具,支持多款PowerVR芯片优化

    Bifrost GPU可编程核心的顶级布局、优势和着色器核心功能

    优化应用程序的二维和三维性能时,您需要对硬件的工作原理有一个高层次的了解。例如,在使用GPU性能计数器进行优化时,了解马里GPU块架构尤为重要。 这是因为该计数器数据直接绑定到
    发表于 08-02 17:52

    Mali-Valhall系列GPU可编程内核

    2018年起。当使用GPU优化应用程序时,至少有一个高级心理模型是有用的了解底层硬件的工作方式。了解预期性能也很有用以及它可能执行的不同类型操作的数据速率。在优化使用Mali时,了解块体系结构尤为重要性能
    发表于 08-02 16:38

    基于磁贴的GPU架构优缺点

    本指南介绍了基于磁贴的GPU架构的优缺点。它还将ARM马里基于瓷砖的GPU架构设计与台式PC或控制台中常见的更传统的即时模式GPU进行了比较。 马里GPU使用基于平铺的渲染体系结构。
    发表于 08-02 12:54

    NVIDIA Hopper GPU上的新cuBLAS12.0功能和矩阵乘法性能

    NVIDIA Hopper GPU 上的新 cuBLAS 12.0 功能和矩阵乘法性能
    的头像 发表于 07-05 16:30 1713次阅读
    NVIDIA Hopper <b class='flag-5'>GPU</b>上的新cuBLAS12.0功能和矩阵乘法<b class='flag-5'>性能</b>

    一个GPU工作负载的调查

    通过减少指令缓存未命中提高 GPU 性能
    的头像 发表于 07-05 16:30 501次阅读
    一个<b class='flag-5'>GPU</b>工作负载的调查

    git拉取远程分支到本地的两种方法

    使用这种方式会在本地仓库新建分支xxx,并自动切换到新建的分支xxx,当然了远程分支xxx的代码也拉取到了本地分支xxx中。采用这种方法建立的本地
    的头像 发表于 05-06 09:19 1.4w次阅读