GPU 片上调度系统

news2024/11/25 22:43:30

这篇文章分析和说明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.coloradmin.cn/o/1985968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

春秋云境 | 文件上传 | CVE-2022-28525

目录 靶标介绍 开启靶场 蚁剑连接 获取 flag 靶标介绍 ED01-CMS v20180505 存在任意文件上传漏洞 开启靶场 发现了一个登录功能&#xff0c;使用 burp 爆破一下 爆破之后得到账号是 admin 密码是 admin&#xff0c;登录后是这样的页面 在左边的菜单栏挨着一个一个找&…

天地图按地名搜索+openlayer+vue3

使用element-plus组件库安装ol npm i ol -s 安装axios (调用天地图api http://lbs.tianditu.gov.cn/server/search.html) npm i axios -s 主要代码 <template><div class"my-add-maker-box"><div class"my-point-box"><span>经…

直接用文件方式安装Cuda版本的Pytorch

先查看当前安装好的Cuda版本&#xff1a; 采用pip install 文件 方式安装本地的whl文件&#xff1a; 注意whl文件已经提前下载好了&#xff1a; 然后开始安装&#xff1a; 解压安装途中&#xff0c;相关的包也重新下载&#xff1a; 继续安装&#xff1a; 安装完毕了&#xff1…

【多线程-从零开始-伍】volatile关键字和内存可见性问题

volatile 关键字 import java.util.Scanner; public class Demo2 { private static int n 0; public static void main(String[] args) { Thread t1 new Thread(() -> { while(n 0){ //啥都不写 } System.out.println("t1 线程结束循环"); }, "…

基于STM32的智能灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码传感器读取和控制代码应用场景 农业灌溉花园自动灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过实时监测土壤湿度和环境温度&#xff0c;自动控制灌溉设…

【画流程图工具】

画流程图工具 draw.io draw.io&#xff08;现称为 diagrams.net&#xff09;是一款在线图表绘制工具&#xff0c;可以用于创建各种类型的图表&#xff0c;如流程图、网络图、组织结构图、UML图、思维导图等。以下是关于它的一些优点、应用场景及使用方法&#xff1a; 优点&a…

Linux(初学)

一.Linux历史 1.计算机发展历史 1945.2.14 埃尼阿克(第一台计算机)(军事用途) 摩尔定律(计算机小型化,高性能化) 摩尔定律是英特尔创始人之一戈登摩尔的经验之谈&#xff0c;其核心内容为&#xff1a;集成电路上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加…

理解Android framework之AOSP:从内核到应用层

一、AOSP Android framework确保设备的各个部件和程序顺利协同工作。对于想要全面了解 Android 设备内部工作原理、开发高质量应用、优化设备性能以及充分利用 Android 生态系统潜力的人来说&#xff0c;了解 Android 框架也是必不可少的。它是连接用户、开发者和 Android 平台…

高效录屏指南:四大电脑录屏必备工具推荐!

在数字化时代&#xff0c;无论是工作汇报、在线教育还是游戏直播&#xff0c;电脑录屏已经成为了一项不可或缺的技能。今天&#xff0c;我们就来探索一下市面上几款备受好评的录屏工具&#xff1a;福昕录屏大师、转转大师录屏、爱拍录屏、嗨格式录屏大师&#xff0c;看看它们各…

基于RFID技术的智能压缩机装配线优化方案

基于RFID技术的智能压缩机装配线优化方案 传统压缩机装配线往往存在诸多痛点&#xff0c;如生产线单一、无法满足多元化和个性化的市场需求&#xff1b;生产数据滞后&#xff0c;导致产品统计的及时性和准确性无法得到保证&#xff1b;质量问题追溯困难&#xff0c;无法快速准…

c/c++ 为数组整体赋初值

目录 声明 一.整体赋值为0、“”或‘ ’ 二.整体赋值为其他 1.利用for循环赋值 2.逐个赋值 声明 为让c/c的朋友都看懂&#xff0c;本文将采取c语言为大家讲解 一.整体赋值为0、“”或‘ ’ 为什么把0、“”或‘ ’这三种情况单独调出来呢&#xff0c;因为如果将数组定义…

日股暴涨暴跌,港股恐将遭受波及!

近日海外市场波动较大&#xff0c;比如美国、日本等市场的走势可谓是“上蹿下跳”。港股市场也因此受到影响。众所周知&#xff0c;影响股票市场走势的重要因素之一是资金面&#xff0c;这一表现影响大盘及个股的走势。在港股市场&#xff0c;卖空数据作为关键指标备受关注。 …

铲屎官的好帮手,去猫咪浮毛神器——宠物空气净化器分享

养猫的家庭普遍面临一个共同的挑战&#xff1a;即便是刚经过一番精心打扫的居住环境&#xff0c;不出两日&#xff0c;家具表面、地板乃至家中各个缝隙便悄无声息地被一层细腻柔软的猫毛轻轻覆盖。这一现象&#xff0c;很大程度上归咎于猫咪的日常活跃与季节性的换毛过程。不仅…

ACL 2024 Oral | 大模型也会被忽悠?揭秘AI的信念之旅

地球是平的吗&#xff1f; 当然不是。自古希腊数学家毕达哥拉斯首次提出地圆说以来&#xff0c;现代科学技术已经证明了地球是圆形这一事实。 但是&#xff0c;你有没有想过&#xff0c;如果 AI 被误导性信息 “忽悠” 了&#xff0c;会发生什么&#xff1f; 来自清华、上海…

网络面经

1.TCP头格式有哪些&#xff1f; 图解TCP头部格式 详情 源端口和目的端口 端口的作用是什么&#xff1f; 端口的作用是在网络中唯一表示一台主机中的一个进程 序列号 什么是序列号&#xff1f; 用来给传输的字节标号的 比如要传10个字节 那么给第一个字节标号为1001 那么第十…

周鸿祎哈佛演讲摘要:大模型创业要抓住中国机会

时间:2024/04/13(美东时间) 地点:美国波士顿哈佛大学 *演讲语言为中文&#xff0c;“因为我的英文就比are you OK 的水平高一点点”。 1、无论你是一个创业者&#xff0c;还是一个企业家&#xff0c;最重要的一点说要跟用户保持接触&#xff0c;要去聊天&#xff0c;跟用户对话…

测试环境搭建整套大数据系统(十八:ubuntu镜像源进行更新)

镜像源更新为清华源 报错显示 解决方案 做好备份 cp /etc/apt/sources.list /etc/apt/sources.list.bak查看配置信息 sudo vim /etc/apt/sources.listsudo sed -i s/cn.archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update

Java学习Day22:基础篇12

异常 1.什么是异常 2.继承体系 3.异常和错误的区别 4.异常处理 1.抛出异常throw public class err { public static void main(String[] args) { add(1,0); } static void add(int a,int b){ if (b0) { throw new ArithmeticExcepti…

【Linux】Linux重定向指南:探索输出重定向与追加重定向的奥秘!

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;Linux重定向指南&#xff1a;探索输出重定向与追加重定向的奥秘&#xff01; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪…

css水波浪动画效果

为缩小gif大小&#xff0c;动画效果做了加速&#xff0c;效果如下&#xff1a; <!DOCTYPE html> <html> <head> <style> *{padding:0;margin:0;}/*清除默认填充及边距*/.water{position:relative;width:100vw;height:100vh;overflow:hidden;background…