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
    +关注

    关注

    28

    文章

    5102

    浏览量

    134487
  • PC
    PC
    +关注

    关注

    9

    文章

    2164

    浏览量

    158513
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96782

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入剖析NCP13994:高性能半桥谐振转换器控制器

    在电子工程师的设计世界里,一款优秀的控制器就像是一位得力助手,能够为电源转换设计带来诸多便利和高性能表现。今天,我们就来深入剖析安森美(onsemi)的NCP13994,一款专为半桥谐振转换器打造的高性能电流模式控制器。
    的头像 发表于 12-05 11:27 294次阅读
    深入<b class='flag-5'>剖析</b>NCP13994:高<b class='flag-5'>性能</b>半桥谐振转换器控制器

    NVIDIA RTX PRO 2000 Blackwell GPU性能测试

    Blackwell 架构 GPU 中的中端专业图形卡,高度仅为全高 GPU 的二分之一。如果您需要的是一块半高显卡,能适配小机箱,功耗不高,还要具备 AI 及光线追踪性能的话,那么 RTX PRO 2000 是很好的选择。
    的头像 发表于 11-28 09:39 3930次阅读
    NVIDIA RTX PRO 2000 Blackwell <b class='flag-5'>GPU</b><b class='flag-5'>性能</b>测试

    蜂鸟E203简单分支预测的改进

    是最简单的静态分支预测,其预测的命中率并不是很高,因此流水线常常需要因为冲刷而浪费很多周期,导致CPU的性能下降。因此,针对题目通过对E203微架构进行优化提升处理器性能的要求,我们想到了对其
    发表于 10-24 07:45

    提高条件分支指令预测正确率的方法

    “Gshare方法”。 BTB: 分支目标缓冲器(Branch Target Buffer,BTB)是一个用于存储分支指令地址和目标地址的高速缓存,其常见于超标量处理器中,主要用于提高分支预测器的
    发表于 10-22 08:22

    基于全局预测历史的gshare分支预测器的实现细节

    的地址位数,虽然BHR位数越多,分支预测器的准确度越高,但正确率提高的代价是PHT消耗的资源呈指数形式迅速地增长,因此我们必须在面积与性能之间进行权衡。。最终经过对各类32位RISC-V开源处理器内核
    发表于 10-22 06:50

    NVIDIA桌面GPU系列扩展新产品

    NVIDIA 桌面 GPU 系列扩展,推出 NVIDIA RTX PRO 4000 SFF Edition GPU 和 RTX PRO 2000 Blackwell GPU,可提高工程、内容创作和 3D 可视化等应用的
    的头像 发表于 08-18 11:50 1019次阅读

    aicube的n卡gpu索引该如何添加?

    请问有人知道aicube怎样才能读取n卡的gpu索引呢,我已经安装了cuda和cudnn,在全局的py里添加了torch,能够调用gpu,当还是只能看到默认的gpu0,显示不了gpu1
    发表于 07-25 08:18

    如何在Ray分布式计算框架下集成NVIDIA Nsight Systems进行GPU性能分析

    在大语言模型的强化学习训练过程中,GPU 性能优化至关重要。随着模型规模不断扩大,如何高效地分析和优化 GPU 性能成为开发者面临的主要挑战之一。
    的头像 发表于 07-23 10:34 2057次阅读
    如何在Ray分布式计算框架下集成NVIDIA Nsight Systems进行<b class='flag-5'>GPU</b><b class='flag-5'>性能</b>分析

    【「算力芯片 | 高性能 CPU/GPU/NPU 微架构分析」阅读体验】+NVlink技术从应用到原理

    前言 【「算力芯片 | 高性能 CPU/GPU/NPU 微架构分析」书中的芯片知识是比较接近当前的顶尖芯片水平的,同时包含了芯片架构的基础知识,但该部分知识比较晦涩难懂,或许是由于我一直从事的事芯片
    发表于 06-18 19:31

    ​为什么GPU性能效率比峰值性能更关键

    在评估GPU性能时,通常首先考察三个指标:图形工作负载的纹理率(GPixel/s)、浮点运算次数(FLOPS)以及它们能处理计算和AI工作负载的每秒8-bittera运算次数(TOPS)。这些关键
    的头像 发表于 03-13 08:34 732次阅读
    ​为什么<b class='flag-5'>GPU</b><b class='flag-5'>性能</b>效率比峰值<b class='flag-5'>性能</b>更关键

    OpenVINO™检测到GPU,但网络无法加载到GPU插件,为什么?

    OpenVINO™安装在旧的 Windows 10 版本 Windows® 10 (RS1) 上。 已安装 GPU 驱动程序版本 25.20.100.6373,检测到 GPU,但网络无法加载
    发表于 03-05 06:01

    GPU 性能原理拆解

    「迷思」是指经由人们口口相传,但又难以证明证伪的现象。由于GPU硬件实现、驱动实现是一个黑盒,我们只能通过厂商提供的API、经过抽象的架构来了解并猜测其原理。因此坊间流传着各种关于与GPU打交道
    的头像 发表于 02-08 14:29 1012次阅读
    <b class='flag-5'>GPU</b> <b class='flag-5'>性能</b>原理拆解

    BNC接头技术原理与工程应用剖析:从结构到性能优化

    在现代电子通信和射频领域,BNC接头作为一种广泛应用的连接器件,发挥着至关重要的作用。它以其可靠的连接性能、优异的电气特性和广泛的兼容性,成为众多电子设备和系统中不可或缺的一部分。本文将深入剖析
    的头像 发表于 12-31 16:07 2273次阅读
    BNC接头技术原理与工程应用<b class='flag-5'>剖析</b>:从结构到<b class='flag-5'>性能</b>优化

    《CST Studio Suite 2024 GPU加速计算指南》

    问题,但会降低旧GPU硬件性能,可通过NVIDIA控制面板或命令行工具nvidia - smi管理。 - TCC模式(Windows only):某些GPU计算需要启用,可通过命令行工具nvidia
    发表于 12-16 14:25