GPU 片上调度系统

这篇文章分析和说明GPU 片上的kernel 通过stream 作为载体是如何分发到SM 处理器上,同时CUDA 所抽象的grid/block/thread 在GPU 设备层面是如何调度的。调度器通常是被忽略的一个部分,但对CUDA kernel 的编写和后期系统性能分析很有帮助,也可以帮助大家进一步理解CUDA 的语义。

片上的分级调度

CUDA GPU三级调度结构

stream scheduler:

  • FIFO顺序:同一流中的操作按FIFO顺序执行,即先提交的先执行。
  • 流隔离:CUDA流与单个应用程序相关联,不同应用程序的流互不干扰。例如,如果应用程序A0正在运行,则应用程序A1的流不会干扰A0。
    并行执行:不同流中的操作可以并行执行,但同一流中的操作必须顺序执行。
  • 流优先级:从Maxwell GPU架构(例如Jetson TX1嵌入式板)开始,CUDA提供了一个运行时函数调用,用于为流分配优先级。
  • 当前所有测试过的GPU架构(包括Maxwell、Pascal、Volta和Turing)仅支持两个离散的优先级(高和低)。如果低优先级流占用了一个SM的所有计算资源,则后来提交到高优先级流上的内核可以抢占当前运行的内核。

Thread block scheduler:

  • 寻找空闲SM 映射CUDA 语义所表达的grid/block/thread 结构
  • 在所有内核被分配到一个流时,线程块会通过所有可用的SM进行循环分配(Round-Robin,RR),先分配到偶数ID的SM,然后是奇数ID的SM
  • 在分配线程块到SM之前,线程块调度器会进行一个占用测试,检查每个SM当前的资源利用情况(线程/warps数量, 寄存器,共享内存),以确定是否可以容纳新的线程块。此测试的目的是确保当前的占用率能够满足新内核的需求,从而实现线程块到SM的映射
  • NVIDIA提供了一个CUDA Occupancy Calculator(CUDA占用计算器),这是一个公开可用的电子表格工具,帮助计算特定线程/块配置下目标GPU的理论占用率。通过结合该计算器与设备查询命令得到的架构参数,可以推导出线程、共享内存和寄存器资源的利用率​目前已经整合到nsight compute 中 (https://docs.nvidia.com/nsight-compute/NsightCompute/index.html#occupancy-calculator)
    Tips: 通过下面的方法可以获取当前thread 所映射的SM id
    int smid; asm volatile("mov.u32%0, %%smid;" : "=r"(smid));
    在这里插入图片描述前两行为stream1的线程数和warp数;
    前两列为stream2的线程数和warp数;
    其他单元格表示一个SM在被stream1上的kernel占用后还能继续容纳的最大warp
    空白底色代表两个block被分配到了不同的SM上
    浅灰底色代表两个block被分配到了同一个SM上

Warp Scheduler

  • 每个SM有若干个warp调度器和相应的指令分发单元。
  • 例如,在Pascal架构的GPU中,每个SM有两个warp调度器和两个指令分发单元,每个warp调度器每个时钟周期可以调度两条独立的指令;
  • 图灵架构包含4个Warp scheduler 同时对SM 进行了partition,分为4份;
  • Maxwell, Pascal, Volta和Turing架构中使用的warp调度策略是松散轮询调度(Loose Round Robin, LRR)。
  • 在LRR策略下,warp以轮询方式调度,当一个warp遇到未满足的依赖(如全局内存未命中)时,它会暂停,使下一个准备好的warp被调度。这种调度策略通过足够的ready warp来隐藏内存访问的延迟,并确保warp之间的公平性​
    图灵架构
    关于warp scheduler,我们再进一步深入探讨,上面说道图灵架构每个SM 被划分为4个partition,每个partition 一个scheduler,具体来说:
  • 每个SM有4个Warp Scheduler。
  • 每个Warp Scheduler可以在同一时间调度32个线程。
  • 每个时钟周期内,每个SM可以调度128个线程(4个Warp × 32个线程/每个Warp)。
  • 每个SM最多支持2048个并发线程,但这些线程并不会在同一个时钟周期内同时运行。
    因此,对于warp scheduler 来说,多个warp 是通过时分复用的方式实现对scheduler 的占用以及指令的发射,多个warp 间在同一时刻如果处于同一个partition,是串行执行(或者等待前一个warp stall/wait 状态 ),在不同的partion 之间可以实现并行,从编程的角度我们可以利用这一点。

调度器对warp和SM partition(同时也是调度器id)的映射采用如下简单的方式:
scheduler_id = warp_id%4
在同一个block中,warp id 是4 的整数倍的warp 会被调度到同一个partion。
一个极端的情况,假如一个block里只有2个warp要做计算,其余warp直接退出。如果这两个要做计算的warp(称为active的warp)对4同余,那么就会造成因为4个partition负载不均衡而产生的性能损失。

在这里插入图片描述
这种情况下,可以看到V100/A100 0/4,1/5 … 以4 同余的warp ,算力利用率都相对较低。

CUDA 对资源的抽象

launch_kernel<<<N,1>>> 和launch_kernel<<<1,N>>> 的区别

  • launch_kernel<<<N, 1>>>:
    这表示内核以 N 个线程块启动,每个线程块只有 1 个线程。
    这种配置通常用于当内核需要执行 N 个独立的任务,每个任务由一个单独的线程块完成。
    网格维度为 N,每个线程块的维度为 1。
  • launch_kernel<<<1, N>>>:
    这表示内核以 1 个线程块启动,但这个线程块包含 N 个线程。
    这种配置通常用于当内核需要执行一个任务,但这个任务可以被分解为 N 个并行操作,由同一个线程块中的 N 个线程并行完成。
    网格维度为 1,每个线程块的维度为 N。

当每个线程执行的任务是独立的,并且没有线程间同步的需求时,使用 <<<N, 1>>> 配置可能更合适,原因包括:

  • 减少线程块内同步:
    在CUDA中,同一个线程块内的线程可以协同工作,但这也意味着它们可能需要进行线程间同步,例如使用 《=》 或 max() 等原子操作。如果任务是独立的,这种同步是不必要的,使用单个线程的线程块可以避免这种同步开销。

  • 简化线程索引计算:
    当每个线程执行独立任务时,线程索引的计算通常更简单。使用 <<<N, 1>>> 时,每个线程的全局索引可以直接用其线程块索引表示,因为每个线程块内只有一个线程。

  • 提高资源利用率:
    在某些情况下,使用单个线程的线程块可以更有效地利用GPU资源。例如,如果内核设计为每个线程处理一个数据元素,使用 <<<N, 1>>> 可以直接映射N个线程到N个数据元素,而不需要额外的逻辑来分配线程到数据。

  • 避免共享内存竞争:
    如果使用多个线程的线程块,这些线程可能会竞争访问共享内存。当任务独立时,每个线程块只有一个线程,因此不存在共享内存访问的竞争问题。

  • 提高启动效率:
    启动大量单个线程的线程块可能比启动少量多线程的线程块更有效率,因为每个线程块的启动开销是固定的,而更多的线程块可以更细粒度地利用GPU的并行处理能力。

  • 适应性:
    在某些GPU架构中,可能更适合于处理大量小线程块的情况。使用 <<<N, 1>>> 可以更好地适应这种架构特性。

  • 减少线程块内线程间通信:
    如果内核中没有线程间通信的需求,使用 <<<N, 1>>> 可以减少线程块内线程间通信的复杂性和开销。

Reference

  • Nvidia official site
  • Dissecting the NVidia Turing T4 GPU via Microbenchmarking
  • Inferring Scheduling Policies of an Embedded CUDA GPU
  • Dissecting the CUDA scheduling hierarchy - a Performance and Predictability Perspective
  • cuda programming guide

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

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

相关文章

将 Tcpdump 输出内容重定向到 Wireshark

在 Linux 系统中使用 Tcpdump 抓包后分析数据包不是很方便。 通常 Wireshark 比 tcpdump 更容易分析应用层协议。 一般的做法是在远程主机上先使用 tcpdump 抓取数据并写入文件&#xff0c;然后再将文件拷贝到本地工作站上用 Wireshark 分析。 还有一种更高效的方法&#xf…

【HarmonyOS】鸿蒙应用实现截屏

【HarmonyOS】鸿蒙应用实现截屏 组件截屏 通过componentSnapshot的get函数&#xff0c;将需要截图的组件设置id传进去即可。 import { componentSnapshot } from kit.ArkUI; import { image } from kit.ImageKit;/*** 截图*/ Entry Component Preview struct SnapShotPage {S…

sheng的学习笔记-AI-层次聚类

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习的前置知识&#xff1a;聚类&#xff0c;可参考&#xff1a;sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 什么是层次聚类 层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分&#xff0c;从而形…

【Python系列】使用 `isinstance()` 替代 `type()` 函数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

国产版Sora复现——智谱AI开源CogVideoX-2b 本地部署复现实践教程

目录 一、CogVideoX简介二、CogVideoX部署实践流程2.1、创建丹摩实例2.2、配置环境和依赖2.3、上传模型与配置文件2.4、开始运行 最后 一、CogVideoX简介 智谱AI在8月6日宣布了一个令人兴奋的消息&#xff1a;他们将开源视频生成模型CogVideoX。目前&#xff0c;其提示词上限为…

thinkphp8开发的广告联盟网站系统源码

这款程序是采用国内主流的PHP框架&#xff0c;最新版本thinkphp8.0.4&#xff0c;也是目前市面上功能相对比较强大&#xff0c;界面比较好看的一款全开源的广告联盟系统&#xff0c;程序支持任意二开商业&#xff0c;并且代码无任何加密处理。 程序开发&#xff1a;PHPMySQL …

Windows使用wsl安装docker-desktop

一&#xff1a;修改Windows配置&#xff0c;启用相关功能。 1&#xff1a;启用硬件虚拟化VT-d 各品牌电脑的Bios设置都不一致&#xff0c;需要自行查找如何进入Bios开启VT-x功能&#xff0c;绝大部分电脑此功能默认情况下是直接开启的。 2&#xff1a;确定Windows系统的类别…

【全面介绍下Gitea,什么是Gitea?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

日常生活中的卡片写作素材

日常生活中&#xff0c;有哪些内容适合写卡片&#xff1f; ​​我认为有两类非常值得写卡片&#xff0c;一类是经常重复说的内容&#xff0c;一类是给其他人提供价值的信息。 ​ ​ ​ 重复说的内容&#xff1a; ​​比如&#xff0c;你在工作中经常解答同事一些问题&a…

怎么限制电脑不能打开某个网页或网站(四个方法你可一定要学会)

老板&#xff1a;我公司的员工真的很让人头疼。 朋友&#xff1a;怎么了&#xff1f; 老板&#xff1a;我一不在就有人偷偷打开某些违法网站&#xff0c;画面不可描述啊&#xff01; 朋友&#xff1a;难道你还不知道可以禁止员工打开某个网站&#xff1f; 老板&#xff1a;…

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…

【优秀python大屏案例】基于python flask的前程无忧大数据岗位分析可视化大屏设计与实现

随着大数据和人工智能技术的迅猛发展&#xff0c;数据分析和可视化在各个行业中的应用越来越广泛。特别是在招聘领域&#xff0c;大数据分析不仅能够帮助企业更好地了解市场需求&#xff0c;还能为求职者提供科学的职业规划建议。本文探讨了基于Python Flask框架的前程无忧大数…

如何判断IP地址属于住宅IP还是机房IP

在数字化时代,IP地址作为互联网通信的基础标识&#xff0c;扮演着重要的角色。无论是网络管理、数据分析还是安全监控&#xff0c;正确识别IP地址的类型——尤其是区分是住宅IP还是机房IP&#xff0c;对于确保网络安全、优化网络性能以及合法合规运营具有重要意义。IPIDEA代理I…

小白入门机器学习被劝退的4大原因,你中了哪一个?

hi&#xff0c;喵老师&#x1f431;来啦。 很多小白朋友&#xff0c;尤其是准研究生、文科生&#xff0c;刚开始接触机器学习之后常常在短时间内就「入门即放弃」了。 其实背后主要的原因无非那么几个&#xff0c;今天喵老师就给大家盘一盘&#xff0c;看看你是哪一种&#x1…

BUUCTF [安洵杯 2019]easy_serialize_php 1

打开题目&#xff0c;看到一串php代码&#xff0c;试着代码审计一下&#xff0c;看一下有用信息 可以看出是通过$_SESSION[img]来读取文件 extract可以将数组中的变量导入当前变量表 也就是说我们可以伪造$_SESSION 数组中的所有数据 这里传递一个参数fphpinfo 先用hackbar进…

缺失的第一个正数

思路&#xff1a;我的初步想法是先对数组排序&#xff0c;然后找到第一个正数的位置&#xff0c;从1开始顺序比对&#xff1a;哪个没出现就是答案。 代码&#xff1a; class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums…

常见中间件漏洞复现之【Apache】!

CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者…

WEB渗透Web突破篇-WAF绕过

SQL注入分块传输 https://github.com/c0ny1/chunked-coding-converter跑注入点被拦截使用分块传输&#xff0c;右键选择使用SQLMAP跑注入>python sqlmap.py -r 1.txt --batch --proxyhttp://127.0.0.1:8080 --dbs自动提供可用的tamper Atlas GitHub - m4ll0k/Atlas: Quick…

常见中间件漏洞复现之【Tomcat】!

Tomcat介绍 tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露出来了很多的漏洞 …

解决windows安装docker desktop打开报错问题

下载docker windows版本: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_sourcedocker&utm_mediumwebreferral&utm_campaigndd-smartbutton&utm_locationmodule 正常安装&#xff0c;然后运行&#xff0c;弹出这个报错: 试了…