占用率是每个多处理器的活跃 Warp 数量与最大可能活跃 Warp 数量的比率。另一种查看占用率的方式是,硬件处理 Warp 的能力中,实际使用 Warp 的百分比。较高的占用率并不一定能带来更高的性能,然而,较低的占用率总是会降低隐藏延迟的能力,从而导致整体性能下降。执行过程中,理论占用率与实际占用率之间的巨大差异通常表明工作负载高度不平衡。 

https://www.bilibili.com/video/BV1WNrHY5EeP

https://blog.csdn.net/feng__shuai/article/details/125665305

occupancy:占用率

一个SM中理论最大能支持M个active warp,实际上受限于SM中的资源只能支持N个

occupancy = N / M

  • 占用率指的是 某个 GPU Streaming Multiprocessor(SM) 上实际处于活动状态的 warp 数,占该 SM 理论上能同时容纳的最大 warp 数的百分比。
  • warp 就是一组 32 条线程的集合;在一个 SM 里同时挂起的 warp 越多,就越能在一次指令延迟(如访存)期间切换到其他 warp,从而隐藏延迟、提高并行度。

SM可以同时处理多个warp,受限于资源(执行单元、寄存器、共享内存等),并不是所有的warp都能同时活跃。

active warp是指正在执行指令的warp,可能处于不同的执行阶段:

(1)正在执行计算任务;

(2)正在等待内存访问结果

(3)正在执行控制流指令

上面是Ada架构(NVIDIA RTX4060、RTX4090等系列GPU)的SM内部结构,一个SM中有128个Core,所以至少能放下128个线程,对应4个warp。

为了隐藏延迟,需要在一个SM中放入更多的warp。

根据显卡架构的不同,可以计算出一个SM中最多承载的warp数量。

(1) 设置的block的大小。

同一个block必须跑在同一个SM中,同一个block不能跑在不同的SM上。同一个SM中可以容纳多个block。

(2)SM中寄存器文件的大小

CUDA延迟隐藏机制为:当一个warp处于等待状态,会立刻切换到下一个warp,保证SM中的计算单元cuda core上始终存在warp在执行,不至于cuda core存在空闲的时刻。GPU有大量的寄存器,每个thread都有自己的寄存器,不存在线程切换时切换上下文的开销,CUDA中warp切换的开销约为0。 

(3)SM中共享内存的大小

 (1)(2)(3)可以分别计算出一个SM中最多承载的warp数量,取三者之间的最小值。

可以使用CUDA Occupancy Calculator(CUDA 占用率计算器)计算Occupancy

一颗 GPU 里有很多 SM(Streaming Multiprocessor),每个 SM 像一间教室,里面坐着学生(线程)分组(warp)上课。每项上限就是教室的“消防规章”,决定一次能塞多少人、发多少书(寄存器)、用多大黑板(共享内存)。你写 kernel 时的线程块(block) 就得在这些规章内排座位,否则编译器/驱动直接报 “out of resources”。

#Property (截图原文)物理含义对 kernel/占用率(occupancy) 的影响
1Threads per Warp = 32CUDA 规定 32 条线程组成一个执行单元 warp,硬件线程调度都是以 warp 为粒度。决定了许多数值必须是 32 的倍数(如寄存器分配、分支同步)。
2Max Warps per Multiprocessor = 48一个 SM 最多同时“挂起”48 个 warp。48 warp × 32 线程 ≈ 1536 线程/SM 就是下条上限。若寄存器/共享内存用太多导致只能挂更少 warp,occupancy 会降。docs.nvidia.com
3Max Thread Blocks per Multiprocessor = 24每个 SM 最多可驻留 24 个线程块(block)。如果你的 block 很小,理论上 24 个也封顶;如果很大,往往被寄存器或线程数先卡住。docs.nvidia.com
4Max Threads per Multiprocessor = 153648 warp×32 线程 = 1536。硬件能同时保留这么多线程上下文。这是占用率 100 % 时的“天花板”。线程多≠更快,超过隐藏延迟所需就没收益。
5Maximum Thread Block Size = 1024单个 block 里线程总数上限。典型调参:128 - 512 之间试;要破 1024 只能改算法拆块。
6Registers per Multiprocessor = 65536 (32-bit)每个 SM 共有 64 K 个 32 位寄存器。大内存还债最贵?不是,全局访存才贵。寄存器是最快的,但总量固定——线程太多或每线程寄存器太多都会抢这个池子。docs.nvidia.com
7Max Registers per Thread Block = 65536同一个 block 能分到的寄存器总量上限(也是全部 64 K)。如果 block 本身就把 64 K 寄存器吃光,只能独占 SM,occupancy 直接锁死到 1 块。
8Max Registers per Thread = 255单线程能用的寄存器数上限(编译器会给 256 向上取整)。>255 时编译报错。高寄存器/线程可能触发溢出(spill),把寄存器内容写到慢得多的本地内存。docs.nvidia.com
9Shared Memory per Multiprocessor = 102 400 B (≈100 KB)每个 SM 可用的共享内存总量(Ada 架构把它和 L1 Cache 共享,可动态“分房间”)。这 100 KB 由所有驻留块瓜分,算 occupancy 时必须够用。docs.nvidia.com
10Max Shared Memory per Block = 102 400 B单个 block 能申请的共享内存。Runtime 还会帮你占掉 1 KB(见条 14),所以有效是 100 KB-1 KB ≈ 99 KB。如果你申请 >48 KB,需要 cudaFuncSetAttribute 显式“开闸”才能发射 kernel。docs.nvidia.com
11Register Allocation Unit Size = 256寄存器按 256 个为最小“页” 分配给 一个 warp。不够整页会向上取整。例:一个 warp 真正只需 33 ×寄存器,硬件仍按 256 给;浪费越多,可驻留 warp 就越少。forums.developer.nvidia.com
12Register Allocation Granularity = warp寄存器配额以 warp 为粒度,而不是线程或 block。这就是为啥上一条要整页向上取整。forums.developer.nvidia.com
13Shared Memory Allocation Unit Size = 128 B共享内存也是按 128 字节对齐、向上取整。所以即便你只用 1 字节,也会吃掉 128 B,可能让多个 block 无法并存。hanhaowen.github.io
14Warp Allocation Granularity = 4当计算寄存器 & 共享内存限制时,warp 数会向上取到 4 的倍数举例:21 warp → 硬件按 24 warp 计;多出来的“幽灵 warp”仍要算寄存器,所以占用率计算会更紧。forums.developer.nvidia.com
15Shared Memory Per Block (CUDA runtime use) = 1024 BCUDA 运行时保留的 1 KB“私房钱”,用于内部参数、动态调度数据等。实际可用共享内存 = 条 10 上限 − 1024 B。保证 kernel 不会把自己撑爆。docs.nvidia.com

block_size对SM可启动warp数量的限制

由上表可知

(1)每一个block必须分配到一个SM中;

(2)一个warp中有32个线程;

(3)每一个SM最多可以放48个warp(1536个线程);

(4)每一个SM最多可以放24个block。

假设设置的一个block中的线程数量为70,则一个block中的warp数量为3,由于每一个SM中最多可以放48个warp,因此一个SM中有16个block。

(16 block / SM * 3 warp / block) / 48 warp / SM = 100%

假设设置的一个block中的线程数量为32,则一个block中的warp数量为1,由于每一个SM中最多可以放48个warp,因此一个SM中有48个block。而每一个SM中最多可以放24个block,所以一个SM中有24个block,24个block总共24个warp。

(24 block / SM * 1 warp / block) / 48 warp / SM = 50%

假设设置的一个block中的线程数量为256,则一个block中的warp数量为8,由于每一个SM中最多可以放48个warp,因此一个SM中有6个block。而每一个SM中最多可以放24个block,所以一个SM中有6个block,6个block总共48个warp。

(6 block / SM * 8 warp / block) / 48 warp / SM = 100%

假设设置的一个block中的线程数量为160,则一个block中的warp数量为5,由于每一个SM中最多可以放48个warp,因此一个SM中有9个block。而每一个SM中最多可以放24个block,所以一个SM中有9个block,9个block总共45个warp。

(9 block / SM * 5 warp / block) / 48 warp / SM = 93.75%

register对SM可启动warp数量的限制

由上表可知:

(1)每一个SM有65536个寄存器,64KB大小;

(2)寄存器的最小分配单元是256个;

(3)寄存器的分割粒度是warp;

(4)warp的分配粒度是4(如果warp allocation granularity为4,那么即使一个内核配置只需要3个warp的寄存器资源,硬件也会按照4个warp来分配寄存器资源)。

假设每个线程需要51个寄存器,一个block中的线程总数为128个线程

每个线程需要51个寄存器,每个warp需要51 * 32 = 1632个寄存器,1632个寄存器按照256粒度分配,1632 / 256向上取整 = 7,总共需要7 * 256 = 1792个寄存器

一个SM中总共有65536个寄存器,每个warp需要1792个寄存器,一个SM中的warp数量为36.57个warp,向下取整为36个warp

occupancy = 36 / 48 = 75 %

假设每个线程需要90个寄存器,一个block中的线程总数为128个线程

每个线程需要90个寄存器,每个warp需要90 * 32 = 2880个寄存器,1632个寄存器按照256粒度分配,1632 / 256向上取整 = 12,总共需要12 * 256 = 3072个寄存器

一个SM中总共有65536个寄存器,每个warp需要3072个寄存器,一个SM中的warp数量为21.33个warp,向下取整为21个warp

warp的分配粒度是4,但是分配24个warp需要的寄存器资源,一个SM的资源不够,因此只能分配20个warp。

occupancy = 20 / 48 = 41.66 %

共享内存(smem)对SM可启动warp数量的限制

由上表可知:

(1)每一个SM有102400 bytes大小的共享内存

(2)共享内存的分配单元大小是128 bytes

(3)每个SM必须分配1024 bytes共享内存

假设一个block中有128个线程,每个block需要5000 bytes共享内存

每个block需要共享内存大小1024 + 5000 = 6024 bytes

按照128 byte粒度分配,6024 / 128 = 47.0625,向上取整 48 * 128 = 6144 bytes,所以每个block实际需要6144 bytes共享内存。

每个SM中总共有102400 bytes共享内存,102400 / 6144 = 16.667个block,即一个SM中只能存放16个block。

16个block对应16 * 4 = 64个warp,超过了一个SM中只能最多48个warp的规定,因此,一个SM中有48个warp,对应12个block

occupancy = 48 / 48 = 100 %

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置自己的NTP 服务器做时间同步

✅ 推荐方案:使用 chrony 搭建 NTP 服务器(适用于 CentOS 7/8/9) chrony 是 CentOS 推荐的 NTP 实现,精度高、资源占用低、同步快,默认在 CentOS 8 中取代了 ntpd。 🔧 一、安装 chrony sudo yum install…

【运维系列】Plane 开源项目安装和配置指南

Plane是一个用现代前端技术栈(Next.js TailwindCSS)开发的开源项目管理平台,核心理念是 Bring Structure to Chaos" —— 给混乱的项目管理带来结构感。 1.项目地址 gitHub 2.项目使用的关键技术和框架 Plane 项目使用了多种关键技术…

3.读取图片和图片采集

目录 一、Halcon 1. 图片的基本概念 2. 获取图片方式1-读取本地图片 3. 获取图片方式2-在线采集 4. C#获取图片数据架构 二、VS联合编程 1. 读取本地图片 2.在线采集 一、Halcon 1. 图片的基本概念 1. 图片2. 像素 3. 分辨率4. 位深度5. 不同后缀1. png jpg 2. bmp 6…

前端流式接口/Socket.IO/WebSocket的区别和选用

WebSocket: 定义:WebSocket是一种在单个TCP连接上进行全双工通信的协议,实现了客户端与服务器之间的实时双向通信。特点:基于HTTP协议,但通过握手升级为WebSocket协议,支持持久连接,减少延迟和带…

QT 学习笔记摘要(二)

第一节 常用控件 1. QWidget 核心属性 1.1 objectName 1.2 enabled API说明 isEnabled() 获取到控件的可⽤状态 setEnabled() 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤ 1.3 geometry && window frame geometry: x y width height API 说明 geom…

FastAPI + Redis 高性能任务队列实现:AI内容生成系统实践

FastAPI Redis 高性能任务队列实现:AI内容生成系统实践 引言 在现代应用中,任务队列是处理资源密集型操作的重要组件。本文将详细介绍一个基于FastAPI和Redis实现的高性能任务队列系统,该系统用于处理AI图片和视频的生成请求。我们将从架构…

光学跟踪系统在汽车远程设计验证中的应用优势

在汽车制造行业,传统设计验证流程依赖实体模型评审,存在周期长、成本高、跨地域协作困难等痛点。随着光学跟踪技术的突破,以ART、OptiTrack为代表的高精度光学追踪系统正重塑汽车远程设计验证的范式。本文从技术原理、应用场景及产业价值三个…

windows 访问ubuntu samba配置

1. 启用文件共享和SMB 1.0/CIFS支持 首先,确保Windows启用了文件共享和SMB 1.0/CIFS支持1。 步骤: 打开控制面板 -> 程序 -> 程序和功能 -> 启用或关闭Windows功能。 勾选“SMB 1.0/CIFS 文件共享支持”。 2. 启用不安全的来宾登录 有时需要启用不安…

Apache Doris 3.0.6 版本正式发布

亲爱的社区小伙伴们,Apache Doris 3.0.6 版本已于 2025 年 06 月 16 日正式发布。 该版本进一步提升了系统的性能及稳定性,欢迎大家下载体验。 GitHub 下载 官网下载 行为变更 禁止 Unique 表使用时序 Compaction存算分离场景下 Auto Bucket 单分桶容…

安全帽检测数据集简介(约2万张图片)

安全帽检测数据集简介(约2万张图片) 📦 已发布目标检测数据集合集(持续更新)安全帽检测数据集简介(约2万张图片)📁 数据集概况🖼️ 数据样本展示 YOLOv8 训练实战&#x…

RJ45 网口实现千兆传输速率(1Gbps)的原理,涉及物理层传输技术、线缆标准、信号调制及网络协议等多方面的协同设计。以下从技术维度展开详细解析:

一、千兆以太网的标准与物理层基础 1. 标准规范 千兆以太网遵循 IEEE 802.3ab(针对双绞线)和 IEEE 802.3z(针对光纤)标准,其中 RJ45 接口对应双绞线场景,核心是通过四对双绞线(CAT5e/CAT6 线缆…

Node.js爬虫 CheerioJS ‌轻量级解析、操作和渲染HTML及XML文档

简介 ‌ CheerioJS ‌ 是一个专为 Node.js 设计的轻量级库&#xff0c;用于解析、操作和渲染 HTML 及 XML 文档&#xff0c;语法类似 Jquery。 安装 npm install cheerio 示例 const cheerio require("cheerio");const html <html><head><tit…

华为运维工程师面试题(英语试题,内部资料)

华为运维工程师面试题(英语试题,内部资料) 一、英文自我介绍,重点突出自己运维经验(10分) 二、短语翻译(英译中)(15*3分=45分) 1. Data is a collection of un-organized facts, which can include words, numb ers, images, and sounds. 1. 数据是未经组织的事…

【赵渝强老师】使用mydumper备份MySQL

MySQL在备份方面包含了自身的mysqldump工具&#xff0c;但其只支持单线程工作&#xff0c;这就使得它无法迅速的备份数据。而mydumper作为一个实用工具&#xff0c;能够良好支持多线程工作&#xff0c;这使得它在处理速度方面十倍于传统的mysqldump。其特征之一是在处理过程中需…

华为云 Flexus+DeepSeek 征文|华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】

华为云 FlexusDeepSeek 征文&#xff5c;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】 文章目录 华为云 FlexusDeepSeek 征文&#xff5c;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】前言1、…

✨通义万相 2.1(Wan2.1)环境搭建指南:基于 CUDA 12.4 + Python 3.11 + PyTorch 2.5.1 GPU加速实战

&#x1f680;【超详细】基于 CUDA 12.4 Python 3.11 构建 Wan2.1 项目的集成推理环境&#xff08;含 PyTorch 2.5.1 GPU 安装教程&#xff09; 本文将一步一步带你搭建一个可用于构建和运行 Wan2.1 的深度学习环境&#xff0c;完全兼容 CUDA 12.4&#xff0c;并基于官方镜像 …

PROFIBUS DP转ETHERNET/IP在热电项目中的创新应用

在热电项目中&#xff0c;多种设备的高效协同是保障能源稳定供应的关键。PROFIBUS DP与ETHERNET/IP两种工业通信协议因特性不同而应用场景各异。通过协议转换技术实现JH-PB-EIP疆鸿智能PROFIBUS DP转ETHERNET/IP&#xff0c;可整合西门子PLC与电力仪表、变频器等设备&#xff0…

精准把脉 MySQL 性能!xk6-sql 并发测试深度指南

在数据库性能测试领域&#xff0c;xk6-sql凭借其强大的功能和灵活性&#xff0c;成为众多开发者和测试人员的得力工具。它能够模拟高并发场景&#xff0c;精准测试数据库在不同负载下的性能表现。然而&#xff0c;在一些网络受限的环境中&#xff0c;实现xk6-sql的离线安装以及…

【文件】Linux 内核优化实战 - fs.inotify.max_user_instances

目录 一、参数作用与原理1. 核心功能2. 应用场景 二、默认值与影响因素1. 默认配置2. 影响因素 三、调整方法与示例1. 查看当前值2. 临时修改&#xff08;生效至系统重启&#xff09;3. 永久修改&#xff08;修改配置文件&#xff09;4. 合理值建议 四、常见报错与解决方案1. 报…

c++系列之特殊类的设计

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 仅在堆上创建对象的类 将类的构造函数&#xff0c;拷贝构造私有,防止在栈上生…