news 2026/8/20 21:10:14

权威指南 第三章

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
权威指南 第三章

概述

恭喜自己完成第三章内容,第三章内容主要讲了:

  • 通过配置文件驱动的方法优化内核
  • 理解线程束执行的本质
  • 增大GPU的并行性
  • 掌握网格和线程块的启发式配置
  • 学习多种CUDA的性能指标和事件
  • 了解动态并行与嵌套执行

相对于上一章无目的的修改grid和block的size,这章从原理进行了分析,如何去提高运行性能,个人认为这章比较重要的是:
理解GPU的wrap、以及好几种提高GPU计算性能的方法。
但是由于核函数多种多样,各种芯片资源也不同,需要能够通过性能分析工具如nsys、ncu进行内核函数的指标分析,进而思考核函数的优化方法。

1关键概念

首先是几个关键的概念,都跟性能的提升有关:

  • 线程束和线程块:线程束是SM中基本的执行单元。当一个线程块的网格被启动后,网格中的线程块分布在SM中。一旦线程块被调度到一个SM上,线程块中的线程会被进一步划分为线程束。一个线程束由32个连续的线程组成,在一个线程束中,所有的线程按照单指令多线程(SIMT)方式执行;也就是说,所有线程都执行相同的指令,每个线程在私有数据上进行操作。
  • 线程束分化:假设在一个线程束中有16个线程执行这段代码,cond为true,但对于其他16个来说cond为false。一半的线程束需要执行if语句块中的指令,而另一半需要执行else语句块中的指令,但是同一wrap只能执行相同的指令,因此else语句的线程只能在wrap执行if语句的线程时停下,等其执行完毕再执行else,这降低了wrap的并行能力。在同一线程束中的线程执行不同的指令,被称为线程束分化。
  • 资源分配:线程束的本地执行上下文主要由以下资源组成:·程序计数器·寄存器·共享内存,因此block的大小要合理划分,避免blocksize过大引起SM的资源没有充分利用,导致占用率较低;或者过小导致SM资源不足,无法充分发挥wrap的并行能力。
  • 延迟隐藏:在指令发出和完成之间的时钟周期被定义为指令延迟,分为两种:算术指令和内存指令,其中算术指令的延迟为10~20个周期,内存指令延迟为400~800个周期。在线程进行这两个指令时会浪费很多时间,wrap会在这些指令执行后,跳转到其他就绪的wrap上运行,待这个wrap的所有指令完成后再来处理,因此需要足够多的活跃wrap来进行跳转以延迟隐藏。常见的一个量化指标是:
    所需线程束数量=延迟×吞吐量
    假设在内核里一条指令的平均延迟是5个周期。为了保持在每个周期内执行6个线程束的吞吐量,则至少需要30个未完成的线程束。
  • 占用率occupancy:在每个CUDA核心里指令是顺序执行的。当一个线程束阻塞时,SM切换执行其他符合条件的线程束。理想情况下,我们想要有足够的线程束占用设备的核心。占用率是每个SM中活跃的线程束占最大线程束数量的比值:

    换句话讲就是希望让SM中的所有wrap全力运行。
  • 同步 synchronize:可分为两种·系统级:等待主机和设备完成所有的工作,常用cudaDeviceSynchronize(),·块级:在设备执行过程中等待一个线程块中所有线程到达同一点,常用__syncthread()
  • 可扩展性:可扩展性比性能更重要,使得代码能够在不同的GPU上运行,运算效率可以随着计算资源的增加而提高。

2使用性能检测工具

这部分放我常用的nsys和ncu指令:
nsys:因为我使用的是WSL2环境,因此不能直接运行ncu的ui,但是能使用nsys的ui,这个工具看程序运行的timeline很方便。

//使用nsys工具运行cuda_file并保存为报告nsys profile-o nsys_report_file cuda_path_flie//使用nsys-ui打开报告nsys-ui report_flie_name

一般打开的界面是这样的:

ncu:这个工具可以分析很多性能相关的信息,如SM占用率,内存效率,寄存器使用情况等等,进行性能调优的时候推荐使用。但是wsl上不能直接打开报告文件,使用稍微麻烦一点

//使用ncu运行cuda_file并保存计算负载分析报告,注意顺序ncu--section ComputeWorkloadAnsysis-o ncu_report_file cuda_path_file//使用ncu运行cuda_file并保存内存负载分析报告,注意顺序ncu--section MemoryWorkloadAnsysis-o ncu_report_file cuda_path_file//运行的话要使用windows上的ncu打开保存的报告

打开的报告界面是这样的:

还可以看详细的参数:

还能给你提供改进建议,非常好用啊就是说

3关于性能提高的优化方法

这章主要讲的是两方面:

  1. 避免线程束分化
  2. 展开循环

这里拿reduce sum简要说明一下:

1尽量优化减少if语句,如相对于相邻规约,使用交错配对的规约方法,可以大大提高访存效率
2.进行循环展开,在规约前处理多个连续相邻的数据块,可以很好的让内存带宽饱和和隐藏加载/存储延迟;若已知规约迭代次数,可以将规约循环完全展开
3.对最后的32个线程束进行循环展开,使用串行规约,在一个数据块里进行处理,避免了执行循环控制和线程同步逻辑。注意,短时间内多次执行计算语句需要加上volatile修饰符,告诉编译器每次赋值时必须讲值存回全局内存里。
4.使用模板化内核如template <int iblocksize>指定块大小作为模板参数,使得在编译器在编译阶段对核函数的分支进行优化

关于动态并行,现代的GPU上逐渐取消了这个功能,所以暂时跳过这部分的内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:30:06

收藏!彻底解决RAG系统效果不佳问题:这套组合策略让准确率飙升60%

为什么你的RAG系统效果不佳&#xff1f;如何通过组合策略彻底解决 我第一次构建RAG系统时&#xff0c;以为一切都很简单&#xff1a;把文档切块、创建向量、检索相似内容&#xff0c;然后喂给大模型。 结果准确率只有60%左右。 用户得到的是完全不相关的答案。系统会“自信满满…

作者头像 李华
网站建设 2026/7/14 16:30:07

C++:继承】面向对象编程精要:C++继承机制深度解析与最佳实践

1 ~> 继承基础与概念解析 1.1 继承的核心概念 1.1.1 继承的本质与定义 继承&#xff08;inheritance&#xff09;本质是类设计层次的复用。 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c…

作者头像 李华
网站建设 2026/7/14 16:30:04

从岭回归到循环矩阵:KCF算法核心数学工具全解析

1. 从“猜体重”说起&#xff1a;岭回归的直觉 大家好&#xff0c;我是老张&#xff0c;在AI和计算机视觉领域摸爬滚打了十几年。今天咱们不聊那些花里胡哨的模型&#xff0c;就从一个最基础的问题开始&#xff1a;给你一堆人的身高、臂展、鞋码数据&#xff0c;让你去猜他们的…

作者头像 李华
网站建设 2026/7/14 16:30:05

Qwen3-ASR-1.7B保姆级教程:开箱即用Web界面+GPU加速推理详细步骤

Qwen3-ASR-1.7B保姆级教程&#xff1a;开箱即用Web界面GPU加速推理详细步骤 1. 这是什么&#xff1f;一句话说清你能得到什么 你不需要装环境、不用写代码、不操心模型加载——只要点开一个网页&#xff0c;上传一段录音&#xff0c;几秒钟后就能看到准确的文字转写结果。Qwe…

作者头像 李华
网站建设 2026/7/14 16:30:09

2026年职业院校技能大赛移动应用设计与开发赛项—车机中控原型设计素材

2026年职业院校技能大赛移动应用设计与开发赛项—车机中控原型设计素材 文章目录 2026年职业院校技能大赛移动应用设计与开发赛项—车机中控原型设计素材 模块一 产品原型设计 2026年职业院校技能大赛移动应用设计与开发赛项—车机中控原型设计素材下载链接: 模块一 产品原型设…

作者头像 李华
网站建设 2026/7/14 16:30:09

java基于ssm的专门体检预约管理系统毕业论文

目录摘要第一章 绪论第二章 关键技术分析第三章 系统需求分析第四章 系统设计第五章 系统实现第六章 系统测试第七章 总结与展望参考文献致谢项目技术支持源码LW获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作以下是一个基于SSM框架的体检预约管…

作者头像 李华