CUDA中Occupancy相关知识

前言 本篇文章只适合稍微有一些cuda基础的朋友阅读。

occupancy初步理解

occupancy中文翻译是占用率,一个SM中理论假如最大支持M个active warp(这里不理解什么是active warp可以参考这里), 而实际上因为各种原因只能支持N个,这里N/M就是occupancy。

occupancy具体分析

  • 最大active warp如何获取
    这里我们利用Nvidia T4这个机器来分析, T4中每个SM会切分为4个SMSP(参考这里),每个SMSP有8个warp slot,理论上一个SM最大则可以容纳32个warp,从显卡给出的实际数据来看,我们的分析是正确的。
    在这里插入图片描述
  • 实际active warp 如何获取
    在这里插入图片描述
    在这里插入图片描述
    这里我们会根据上面两张图来解析如何计算SM中实际支持的active warp个数。上面我们说了由于种种原因导致实际occupancy并不能达到100%,这里原因主要是三个:
  • Threads Per Block
  • Registers Per Thread
  • Shared Memory Per Block
    在这里我们假设kernel的三个配置分别是128,71,512。接下来我们分析为什么Occupancy是88%?

occupany的推导流程

我们知道一个warp包含32个thread, 一个block是一堆warp的集合,此外由于一个block不可切分,只能分配在一个SM上, 所以我们一旦确定了一个SM中最多能放入多少个block, 就可以知道最多能有active warp了。
首先我们先看Allocated Resources,第一列代表资源。首先看第一行warps资源,当下每个block有4=128/32个warp, 而SM中最多支持32 warp(Max Warps per Multiprocessor), 所以如果只看warp的限制,那么最多只能放入8=32/4个block。

这里注意,如果每个block的warp是1的话,算出来虽然是32个block,但是根据图片2中Max Thread Blocks per Multiprocessor可以知道,一个SM中最多允许放入16个block,所以也不会超过16.

接下来看第二行寄存器资源,首先我们要看一下Physical Limit of GPU这张表,这个表里显示寄存器的分配粒度是基于warp, 最小尺寸是256字节,一个SM总共有65536字节。由于我们设置是每个线程71字节,那么一个warp就需要2272 = 71 * 32字节。而寄存器不零售,都是批发给warp,所以一个warp会分配9个Unit Size,也就是2304=9*256个字节。那么受限于sm中65536字节的限制,这些寄存器一共可以供应28 = 65536/2304个warp。我们知道目前每个block是4个warp , 所以考虑寄存器资源最后最多只能配置7 = 28/4 个bock。

最后我们看第三行,每个block需要512字节的share memory, 而每个sm中最多只有32768个字节,那么考虑share memory资源最后最多可以配置64个block。

综上,根据木桶效应,sm中最多只能配置7个block。 每个block由于有4个warp, 所以active warp有28个。occupancy = 28 / 32 = 88%

Occupancy实际运用

下图展示了实际运用中并不会完全达到我们计算的结果,比如计算的是50%,而实际只有35.32%, 原因比较多. 参考这里

  • Unbalanced workload within blocks
    If warps within a block do not all execute for the same amount of time, the workload is said to be unbalanced. This means there are fewer active warps at the end of the kernel, which is a problem known as “tail effect”. The best solution is to try having a more balanced workload among the warps in each block.

  • Unbalanced workload across blocks
    If blocks within a grid do not all execute for the same amount of time, this workload is also unbalanced, but the efficiency of the device can be improved without having to change to a more balanced workload. Launching more blocks will allow new blocks to begin as others finish, meaning the tail effect does not occur inside every block, but only at the end of the kernel. If there are not more blocks to launch, running concurrent kernels with similar block properties can achieve the same effect.

  • Too few blocks launched
    The upper limit for active blocks per SM is determined by the theoretical occupancy, but that calculation does not account for a launch with fewer than that number of blocks per SM. The number of SMs on the device times the maximum active blocks per SM is called a “full wave”, and launching less than a full wave results in low achieved occupancy. For example, on a device with 15 SMs, and a configuration expecting 100% theoretical occupancy with 4 blocks per SM, a full wave would be 60 blocks. Launching only 45 blocks (assuming a balanced workload) will result in approximately 75% achieved occupancy.
    在这里插入图片描述
    上面这段话解释一下,这里我们使用T4这个机器,有40个sm, 根据kernel计算得到每个sm有8个block, 然后一个机器的full ware是320个block, 而实际只有250个block, 这要算出来平均就是0.78125 = 250/320个full ware

  • Partial last wave
    The SM has a maximum number of warps that can be active at once. Since occupancy is the ratio of active warps to maximum supported active warps, occupancy is 100% if the number of active warps equals the maximum. If this factor is limiting active blocks, occupancy cannot be increased. For example, on a GPU that supports 64 active warps per SM, 8 active blocks with 256 threads per block (8 warps per block) results in 64 active warps, and 100% theoretical occupancy. Similarly, 16 active blocks with 128 threads per block (4 warps per block) would also result in 64 active warps, and 100% theoretical occupancy.
    在这里插入图片描述

occupancy 有啥用

我们知道,入住的warp越多,每个周期可选的发射warp指令越多,由于计算和访存是不同的pipeline, 而且访存时钟周期较大,所以当A_warp在做访存的时候,如果有很多warp当时要做计算,那么延时就可以被隐藏起来,所以越多active warp一般会带来好的收益。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bayesian Occupancy Filter(基于贝叶斯推断的占有度滤波器)是一种在机器人感知与地图构建常用的滤波器。它基于贝叶斯概率推断原理,用于估计环境每个位置的占用状态。该滤波器的主要目的是改进感知器的测量值,以准确地估计位置的占有度。 Bayesian Occupancy Filter使用了一个二值化的栅格地图来表示环境。每个栅格代表一个离散的位置,并用1或0表示已占用或空闲。在该滤波器,每个栅格的占有度状态是通过先验概率与测量概率进行更新的。 滤波器的先验概率表示了栅格在没有任何测量信息时的占有度估计。它通常初始化为一个性的值,可以是0.5表示不确定性。当有新的观测数据时,根据贝叶斯定理计算出后验概率,从而更新栅格的占有度估计。 在每个时间步骤,Bayesian Occupancy Filter采用贝叶斯更新规则,将先验概率与测量概率相乘,得到栅格的后验概率。测量概率通常基于传感器测量模型,并考虑到噪声和不确定性。当测量概率较高时,表明传感器测量结果与先验估计一致,从而提高了栅格的占有度置信度。 Bayesian Occupancy Filter还包括一个更新阈值,用于确定栅格是否被更新。当栅格的置信度超过阈值时,将其视为有足够的证据进行更新。这样可以降低不准确的测量数据对占有度估计的干扰。 总之,Bayesian Occupancy Filter通过基于贝叶斯推断的方法,结合先验概率与测量概率,实现对环境每个位置占有度的估计。它是机器人感知与地图构建常用的滤波器,可以提高环境建模的准确性,并在机器人导航与路径规划等领域有广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值