CUDA-MODE 第一课课后实战(下)

news2024/11/25 2:47:50

我的课程笔记,欢迎关注:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode

CUDA-MODE 第一课课后实战(下)

Nsight Compute Profile结果分析

继续对Nsight Compute的Profile结果进行分析,

Details部分

接在上篇的 Warp State Statistics 部分 之后。

Compute Workload Analysis 部分

Detailed analysis of the compute resources of the streaming multiprocessors (SM), including the achieved instructions per clock (IPC) and the utilization of each available pipeline. Pipelines with very high utilization might limit the overall performance.

对流式多处理器(SM)的计算资源进行详细分析,包括实际达到的每时钟周期指令数(IPC)以及每个可用流水线的利用率。利用率非常高的流水线可能会限制整体性能。

下面对这里涉及到的表格指标的知识库进行翻译(后面和第一个指标Executed Ipc Elapsed相同部分的翻译就省掉了):

  • Executed Ipc Elapsed[inst/cycle]

执行的warp指令数

sm_inst_executed.avg.per_cycle_elapsed
(此计数器指标表示所有子单元实例中每个执行周期的平均操作数)

sm: 流式多处理器以32个线程为一组(称为warps)来处理内核的执行。
Warps进一步分组为协作线程数组(CTA),在CUDA中称为块。
一个CTA的所有warps在同一个SM上执行。
CTA在其线程之间共享各种资源,例如共享内存。

warp: CTA内32个线程的组。
一个warp被分配到一个子分区,并从启动到完成都驻留在该子分区。

instructions: 一条汇编(SASS)指令。
每条执行的指令可能生成零个或多个请求。

  • SM Busy

sm_instruction_throughput.avg.pct_of_peak_sustained_active
假设SMSP间理想负载平衡的SM核心指令吞吐量
(此吞吐量指标表示在所有子单元实例的活动周期内达到的峰值持续率的百分比)

SMSPs: 每个SM被划分为四个处理块,称为SM子分区。
SM子分区是SM上的主要处理元素。
一个子分区管理固定大小的warp池。

  • Executed Ipc Active[inst/cycle]

sm_inst_executed.avg.per_cycle_active
执行的warp指令数
(此计数器指标表示所有子单元实例中每个活动周期的平均操作数)

  • Issue Slots Busy

sm_inst_issued.avg.pct_of_peak_sustained_active
发出的warp指令数
(此计数器指标表示在所有子单元实例的活动周期内达到的峰值持续率的平均百分比)

  • Issued Ipc Active[inst/cycle]

sm_inst_issued.avg.per_cycle_active
发出的warp指令数
(此计数器指标表示所有子单元实例中每个活动周期的平均操作数)

接着对后半部分的图标进行分析:

这里提示低利用率(Low Utilization)并且预估加速比可以到91.84%。所有计算Pipline都未被充分利用。这可能是因为内核太小,或者每个调度器没有发出足够的warps。

由于这是个访存密集型算子,计算利用率低其实是正常的,这里的预估加速是一个粗略的计算,不能完全参考。Compute Workload Analysis部分需要结合Memory Workload Analysis 部分来看。

点开Low Utilization最右边那个按钮之后可以看到关键的性能指标以及指导建议。

最下面的Pipline利用率图表分为两部分,分别显示了不同类型pipline的利用率。

此外,图中还建议查看"Launch Statistics"和"Scheduler Statistics"部分以获取更多详细信息,这可能有助于理解为什么Pipline利用率如此之低。

Launch Statistics部分

这里的具体指标的知识库不再赘述,直接看一下Tail Effect部分,这里说的是 Wave 是指可以在目标GPU上并行执行的最大块数。在这个内核中,2个完整Wave和一个部分Wave(包含433个线程块)被执行。假设所有线程块的执行时间均匀,部分Wave可能占总内核运行时间的33.3%,而完整占用度为24.0%。

图中建议尝试启动没有部分 Wave 的网格。减少尾效应也可以减少执行完整网格所需的 Wave 数量。建议查看硬件模型描述以获取更多关于启动配置的详细信息。

Scheduler Statistics部分

Summary of the activity of the schedulers issuing instructions. Each scheduler maintains a pool of warps that it can issue instructions for. The upper bound of warps in the pool (Theoretical Warps) is limited by the launch configuration. On every cycle each scheduler checks the state of the allocated warps in the pool (Active Warps). Active warps that are not stalled (Eligible Warps) are ready to issue their next instruction. From the set of eligible warps the scheduler selects a single warp from which to issue one or more instructions (Issued Warp). On cycles with no eligible warps, the issue slot is skipped and no instruction is issued. Having many skipped issue slots indicates poor latency hiding.

这是调度器发出指令活动的总结。每个调度器维护一个可以为其发出指令的warp池。池中warp的上限(理论warp数)受启动配置的限制。在每个周期,每个调度器检查池中分配的warp的状态(活跃warps)。未被停滞的活跃warps(Eligible warps)准备好发出它们的下一条指令。从Eligible warps集合中,调度器选择一个warp来发出一条或多条指令(已发射的warp)。在没有Eligible warps的周期中,发射槽被跳过,不发出任何指令。有许多被跳过的发射槽表明延迟隐藏效果不佳。

下面是对指标的知识库进行翻译

  • Active Warps Per Scheduler[warp]

smsp__warps_active.avg_per_cycle_active
累计活跃的线程组数量
(该计数器度量了每个活跃周期中所有子单元实例的平均线程组数量)

smsp: 每个SM(流多处理器)被划分为四个处理块,称为SM子分区。
SM子分区是SM上的主要处理单元。
每个子分区管理一个固定大小的线程组池。

warps: 一个CTA(合作线程阵列)中有32个线程。
一个线程组被分配到一个子分区并驻留在该子分区直到完成。

  • No Eligible[%]

smsp__issue_inst0.avg.pct_of_peak_sustained_active

在活跃周期中没有指令被发出的活跃周期的百分比。这个计数器指标表示在所有子单元实例中,达到峰值持续活跃状态期间的平均百分比。

instructions: 一个汇编(SASS)指令。
每个执行的指令可能产生零个或多个请求。

  • Eligible Warps Per Scheduler[warp]

smsp__issue_active.avg.per_cycle_active

在每个活跃周期中发出1条指令的周期数。这个计数器指标代表所有子单元实例中每个活跃周期的平均操作数。

  • One or More Eligible[%]

smsp__issue_active.avg.pct_of_peak_sustained_active

在活跃周期中发出一条指令活跃周期的百分比。这个计数器指标表示在所有子单元实例中,达到峰值持续活跃状态期间的平均百分比。这个指标和No Eligible[%]互补。

后续的分析结果:

  • 每个调度器(scheduler)每个周期都可以发出一条指令,但是这个内核每9.6个周期才会发出一条指令。这可能会造成硬件资源的浪费,影响性能表现。
  • 每个调度器最多可以分配12个线程组(warp),但这个内核平均只分配了9.15个活跃的线程组。然而,每个周期里平均只有0.28个线程组是可以发出指令的(eligible)。
  • 可以发出指令的线程组(eligible warps)是活跃线程组(active warps)的子集,它们是准备好发出下一条指令的。
  • 每个周期如果没有可以发出指令的线程组,就会导致调度插槽(issue slot)被浪费,没有发出任何指令。
  • 为了提高可以发出指令的线程组数量,需要减少活跃线程组被阻塞的时间。可以查看"Warp State Statistics"和"Source Counters"部分,找出导致线程组被阻塞的主要原因。

"Warp State Statistics"和"Source Counters"部分我们已经看过了,这里反应出的问题就是对Warp Stall现象的解释,是从调度器本身的角度来解释的。

Occupancy 部分

占用率(Occupancy)是指每个SM上活跃线程组(warp)的数量与可能的最大活跃线程组数量的比率。另一种看待占用率的方式是,它表示硬件处理线程组的能力中实际被使用的百分比。虽然较高的占用率并不总能带来更高的性能,但是低占用率会降低隐藏延迟的能力,从而导致整体性能下降。在执行过程中,理论占用率和实际达到的占用率之间存在较大差异,通常表示工作负载高度不均衡。占用率反映了GPU资源的利用情况,是评估CUDA程序性能的一个关键指标。过低的占用率会导致性能下降,需要分析并优化造成低占用率的原因。

首先,理论最大可能活跃线程组数为48个,实际达到的活跃线程组数为36.50个,占用率为76.04%。

然后,根据下面的三张小图可以看到,块大小对性能的影响,每块共享内存用量对性能的影响。

  • 随着每线程寄存器数量的增加,性能先上升后下降,存在一个最优值。寄存器数量的增加会限制同时运行的线程数,需要权衡利弊。
  • 块大小的变化也会影响性能表现,存在一个最优值。块大小过大会限制并行度,过小则会增加调度开销。
  • 共享内存用量的增加会降低可同时运行的块数,从而影响性能。
Source部分

最后来到 Source 部分的解读。

在CUDA-MODE 第一课课后实战(上)中的Source Counters部分已经提到它和Souces部分有关联:

下面这张图展示Source Counters部分的详细信息:

我们可以看到代码中存在未合并的全局内存访问,这可能导致性能损失。分支效率很高,不是主要的性能瓶颈。主要的性能问题集中在triton_sample.py文件的第21行和第28行。warp停滞是一个值得关注的问题,特别是在第21行。

当我们点击绿色的代码链接之后我们就可以跳转到Source部分,直接进入到导致问题的源代码行:

我们不仅可以查看产生问题的源代码,还可以查看编译器生成的PTX/SASS等格式的代码。定位到源代码并结合Source Counters部分给出的建议将对我们优化代码提供很大的帮助。

此外,当我们查看源代码对应的SASS汇编代码时,将鼠标悬停在指令上面,底下即会显示这条汇编的作用(部分指令不会显示)。

总结

通过对Nsight Compute的学习可以发现Nvidia的Profile工具易用性和专业性都非常强,对每个做CUDA开发的开发者来说它都是必不可少的。这两篇文章就是学习CUDA-MODE Lecture1之后在Nsight Compute的实践内容了。

  • 推荐阅读:https://www.youtube.com/watch?v=04dJ-aePYpE

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

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

相关文章

PyQT 串口改动每次点开时更新串口信息

class MainWindow(QWidget, Ui_Form):def __init__(self):super().__init__(parentNone)self.setupUi(self)self.comboBox.installEventFilter(self) # 加载事件过滤器self.comboBox.addItems(get_ports())def eventFilter(self, obj, event): # 定义事件过滤器if isinstance(o…

前端容器化部署:解决重启容器时的静态资源丢失问题

文章目录 什么是前端容器化?重启容器时静态资源丢失的问题解决静态资源丢失的方案1. 使用持久化卷创建和挂载卷使用Docker Compose定义卷 2. 使用对象存储将静态资源上传到对象存储 3. 使用构建时持久化使用CI/CD管道 4. 使用动态加载和缓存使用浏览器缓存使用服务端…

Java 8日期时间API革新:从Date到LocalDate、LocalTime与LocalDateTime的转型与优势解析

文章目录 前言一、基础介绍1.Date2.LocalDate3.LocalTime4.LocalDateTime 二、区别三、推荐场景四、推荐原因总结 前言 在Java的发展历程中,日期和时间的处理一直是开发者们关注的焦点。从早期的java.util.Date类到java.util.Calendar接口,虽然为日期时间…

Linux从0到1——进程池

Linux从0到1——进程池 1. 进程池的概念2. 进程池实现思路3. 进程池的代码实现3.1 创建管道,创建子进程3.2 封装任务3.3 Work接口3.4 发送任务3.5 回收资源,关闭管道(重点)3.6 改造CreatChannels接口 4. 完整代码 1. 进程池的概念…

数据结构面试-核心概念-问题理解

目录 1.数据结构及其分类 2.时间复杂度与空间复杂度及大O表示法 3.循环队列及其判断队空和队满的方法 4.栈与队列在计算机系统中的应用 5.串的模式匹配算法 6.线索二叉树、二叉搜索树、平衡二叉树 7.哈夫曼树与哈夫曼编码 8.DFS与BFS 9.最小生成树及其构建算法 10.最短…

谭晓生解读:AI如何重塑网络安全的未来?

导语 | 当前,对网络安全而言,每一次新的信息技术浪潮都蕴含着巨大机会,同时也意味着巨大的挑战。大模型的发展,是带来了更大的AI安全风险,还是将赋能提升网络安全呢?网络安全正在迎来一场重大范式转移&…

【网络编程】TCP通信基础模型实现

tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…

基于redis的zset实现排行榜

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.sun-club-subject集成redis1.sun-club-domain引入依赖2.sun-…

Linux 内核源码分析---内核 Netlink 套接字

linux 内核一直存在的一个严重问题就是内核态和用户态的交互的问题&#xff0c;对于这个问题内核大佬们一直在研究各种方法&#xff0c;想让内核和用户态交互能够安全高效的进行。如系统调用&#xff0c;proc&#xff0c;sysfs 等内存文件系统&#xff0c;但是这些方式一般都比…

从今年的计算机视觉比赛看风向

记第一次参加CV比赛的经历-长三角&#xff08;芜湖&#xff09;人工智能视觉算法大赛-CSDN博客 去年参赛的记录里说了&#xff1a; 最近&#xff0c;同样的由芜湖举办的比赛又上线了&#xff0c;果然&#xff1a; 2023年是这些赛题&#xff0c;典型的CV&#xff1a; 今年变成…

如何高效记录并整理编程学习笔记?一个好的笔记软件往往可以达到事半功倍的学习效果 φ(* ̄0 ̄)

在编程学习的旅程中&#xff0c;良好的笔记习惯不仅是知识积累的基石&#xff0c;更是提升学习效率、巩固学习成果的关键。选择合适的笔记工具&#xff0c;并掌握其高效使用方法&#xff0c;对于每一位编程学习者而言都至关重要。本文将从笔记工具的选择角度出发&#xff0c;探…

Linux 中断机制(一)之中断和异常

目录 一、什么是中断1、概述2、中断的分类 二、中断和异常1、中断和异常2、中断的上下部3、异常4、APIC5、中断描述符表 三、软件实现 一、什么是中断 1、概述 中断&#xff08;interrupt&#xff09;是指在 CPU 正常运行期间&#xff0c; 由外部或内部事件引起的一种机制。 …

Miracast ——随时随地在Wi-Fi®设备上分享高清内容

Miracast 是一种无线显示技术&#xff0c;由 Wi-Fi 联盟开发&#xff0c;允许设备之间通过无线方式分享多媒体内容。 Wi-Fi CERTIFIED Miracast™支持在Miracast设备之间无缝显示多媒体内容。Miracast使用户能够通过无线连接在Wi-Fi设备之间分享多媒体内容&#xff0c;包括高分…

六西格玛绿带培训对企业有什么帮助?

六西格玛&#xff0c;这一源自摩托罗拉、风靡全球的管理哲学和方法论&#xff0c;以其严谨的数据分析、持续改进的流程优化理念&#xff0c;帮助无数企业实现了从“好”到“卓越”的跨越。而六西格玛绿带&#xff0c;作为这一体系中的中坚力量&#xff0c;是连接高层管理者与一…

Linux--C语言之分支结构

文章目录 一、分支结构&#xff08;一&#xff09;概念&#xff08;二&#xff09;条件构建1.关系表达式&#xff1a;2.逻辑表达式&#xff1a;3.常量/变量&#xff1a;值是否非0&#xff0c;取值&#xff08;0|1&#xff09; &#xff08;三&#xff09;选择结构的形式1.单分支…

QT容器组

目录 容器组 Group BoX&#xff08;组&#xff09; Scroll Area&#xff08;组滑动&#xff09; Tool Box&#xff08;分页显示&#xff09; Tab Widget&#xff08;也是分页显示&#xff09; Stacked widget&#xff08;也是分页&#xff09; Frame&#xff08;就一个框…

无字母数字webshell之命令执行

文章目录 无字母数字的webshell构造技巧php7下简单解决问题php5下解决问题glob开始操作 无字母数字的webshell构造技巧 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$c…

应对FingerprintJS反爬:Selenium的破解策略与技术详解

目录 引言 FingerprintJS技术概述 技术原理 应用场景 应对策略 高级解决方案 代码实现与案例分析 去除webdriver特征 使用Undetected_chromedriver 案例分析&#xff1a;爬取目标网站数据 结论 引言 在现代互联网环境中&#xff0c;网站反爬技术日益成熟&#xff0…

分布式知识总结(基本概念)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本概念 吞吐量 指系统在单位时间能够处理多少个请求 QPS 每秒…

【mars3d】加载pbf矢量瓦片的最佳方案介绍

矢量瓦片的目前最佳方案&#xff1a; 目前示例中提供了不同的矢量瓦片的加载方案 但是加载矢量瓦片pbf的最佳方案&#xff1a; 使用 TileServer GL 开源地图服务工具&#xff1a;https://github.com/maptiler/tileserver-gl &#xff0c; 它利用 MapLibre GL Native 进行服务…