《Learning CUDA Programming》读书笔记(三)

2023-11-10

CUDA occupancy:

一般等于:Active Thread Blocks per Multiprocessor / Max Threads per Multiprocessor;分子是用户kernel和GPU硬件条件共同决定的,分母完全由GPU硬件条件决定;

这个occupancy越高(越接近100%),则GPU的SM上驻留的(叫做active)threads就越多,(实际同时运行的threads数目取决于SM的core数目,远小于active threads), 就越有可能把更多的IO给hide起来;(也不一定,如果这个kernel的threads不怎么IO,则这个率低些也不影响计算单元忙碌程度;如果死劲访存IO,这个率100%也照样有处理器空闲发生,即所有线程都在访存中)

CUDA提供了一个Excel表(CUDA Occupancy Calculator),只要填入当前GPU硬件型号和kernel thread所用的寄存器、block用的shared memory(这两者可以从nvcc的输出里得到)、block的threads个数,表格自动给出occupancy等信息;

占用率一般受三个条件的限制:
1.SM最大并发thread数,SM最大并发Warp数,SM最大并发block数
2.shared memory资源限制
3.register资源限制

函数头__launch_bound__和编译选项--maxrregcount,可以影响编译器优化寄存器的使用,以达到尽量高的执行效率(优化得太猛也容易导致register退化到显存,手动tune的难度较高)

Profiler里显示的Achieved Occupancy,才是运行时候的真实值;

Reduce操作的GPU并行:

1. Global Memory版本:加和多轮,每轮起一次kernel,只用显存;没法只用一个kernel内嵌循环的原因是无法在kernel内部对grid进行同步;

2. Shared Memory版本:每轮每个block先把自己这段读进自己block的shared-memory,sync, 然后循环加和,循环内部有sync,最后把自己block得到的结果写到显存数组[blockIdx]位置处;下一轮的block数目由待加和的数组长度决定;

3. 把取余%操作换成位运算,有一定速度提升;

(4. 博客里看到过的,用原子操作来把block结果加和到显存变量上,可以一个kernel就结束了,不需要多轮)

优化过程中,nvprof起到指导性作用!

减少Warp Diverge的策略:

1. 让同一个warp只执行一个分支,多个分支让多个warp来执行;

2. 合并使得分支数目减少;

3. 减小分支内部的工作量;

4. 改变数据的布局(例如转置,聚合,...)

5. 把group进行partition(Cooperative Group技术),使用tiled_partition

Reduction加和的例子:

   - 同一个warp里,一部分线程执行,一部分线程不干活,效率低(因为把计算单元占用了?);

    - 一部分warp执行,一部分warp不干活(例如等待在__syncthreads上),效率高(因为不干活的warp把计算单元让出了?)

    - 把相邻两个相加,变成前一半的一个和后一半的一个相加,为什么能快一些(没看懂)?

    - grid-stripe-loops技术,即每个线程搬运和加和好几个元素,比之前的每个线程一个元素,要快;原因:我认为,主要是因为每个线程干活时间比上启动kernel的时间,增加了;次要原因是线程数和block数目可以降到一个合理水平,太多了反而性能下降;人家用cuda的一个API来自动得到每个SM最优启动多少个block(输入kernel, 每个block的thread数目,每个block的shared-memory占用量), 总block数目=SM数目*这个最优数目;

老CUDA硬件是两级同步,即warp级隐式同步,block级显式同步(就__syncthreads()一个API)

新CUDA硬件支持显式的warp级同步原语(三组),每个线程有自己的PC和stack,如下图右侧:

__shfl_down_sync函数,可以把warp内每个线程的一个变量进行组播操作,用mask来控制warp内的哪些线程参与计算,最后warp同步一把再继续;用在Reduce那个案例上,避免了shared-memory的使用,直接访问寄存器,更快;

Cooperative Group技术:

thread_group内的sync,可以避免整个block的sync,更高效;还可以拆分成更小的group;

this_thread_block()得到当前block,具有sync()、group_index()、thread_index()等成员函数,和__syncthreads()、blockIdx、threadIdx对等;

if...else...里的__syncthreads()调用,容易产生死锁;书上的block.sync()例子我认为有问题,还是会死锁;

大牛博客里讲的更清楚:可以用cg::partition(this_thread_block(), 4)把block拆分成更小的thread_group;可以用coalesced_threads()来得到本warp里当前活跃线程构成的group,从而安全的sync;

循环展开大法:

用#pragma unroll来暗示编译器去展开循环,省得自己复制粘贴代码了;

缺点:也许会使用更多寄存器导致occupancy下降;代码增大可能让指令cache的miss率上升;

AtomicAdd这样的原子操作,一般用在每个block的结果加和到全局结果里去;因为block数目不多,所以race不明显;如果一上来每个thread把自己的数AtomicAdd加到全局结果里,则会巨慢,因为把计算串行化了;

Low-precision计算的好处:1. 节省显存带宽,节省显存占用;2. 加快计算;

一般是计算用半精度,结果放在单精度里;

用特殊的指令执行半精度计算(例如__hmul);还支持一次计算2个的half2、float2变量和__hmul2指令;

DP4A指令:SIMD风格的,一次算4组INT8计算;

当任务是Memory-bounded时,FP32、FP16、FP8的速度大概是1:2:4;

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Learning CUDA Programming》读书笔记(三) 的相关文章

  • 使用libcurl下载文件小例

    libcurl是一个很强大的开源网络处理库 支持包括HTTP HTTPS FTP 一系列网络协议 用它来进行HTTP的get post 或者下载文件更是小菜一碟 chrome内核都用到了它 本文主要讲解一个使用curl下载文件的小例 首先是
  • 数据库的导入导出及授权

    目录 数据库导出 数据库导入 数据库授权 1 忘记root密码 2 创建表时 colume使用的时 mysql 保留字导致报错 数据库导出 1 导出数据库为bname的表结构 其中用户名为root 密码为dbpasswd 生成的脚本名为db
  • 判断素数 C C++两个版本

    题目 输入一个数 判断是否是素数 C代码 include
  • Midjourney2023下载使用详细操作方法教程

    手把手教你入门绘图超强的AI绘画程序Midjourney 用户只需要输入一段图片的文字描述 即可生成精美的绘画 下面是Midjourney注册和使用的方法 第一步 先注册一个Discord账号https discord gg 注册的时候要人
  • 第三十四章、PyQt中的输入部件:QComboBox组合框功能详解

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 一 概述 Designer中输入工具部件中的Combo Box组合框与其他可视化工具组合框功能相同 组合了按钮
  • 《QDebug 2023年1月》

    一 Qt Widgets 问题交流 二 Qt Quick 问题交流 三 其他 1 QScreen grabWindow 截屏 如果没有指定范围 默认是截取对应屏幕的区域 QScreen文档https doc qt io qt 5 15 qs
  • 在控制台打印1000以内的所有素数(质数)

    素数 质数 的定义 质数是指在大于1的自然数中 除了1和它本身以外不再有其他因数的自然数 编程思路 根据定义可以知道 代码应该包括两个循环 外层循环用于遍历范围内的每一个数 可以定义为i 内存循环则用来遍历由2至小于i的数 此处在遍历1和i
  • 挂马方式研究、挂马检测技术研究

    1 挂马定义 所谓的挂马 就是黑客通过各种手段 包括SQL注入 网站敏感文件扫描 服务器漏洞 网站程序0day 等各种方法获得网站管理员账号 然后登陆网站后台 通过数据库 备份 恢复 或者上传漏洞获得一个webshell 利用获得的webs
  • 目标检测算法之YOLOV2

    YOLOV2论文对v1中许多地方都进行了相关的改进和提升 其将骨干网络也进行了更换 不在使用v1的骨干网络 其v2骨干模型结构图如下 作者删去了骨干网络最下面的三层操作 接上了三个卷积核一个高维度特征与低维度特征的融合 并最终生成模型输出
  • 获取进程pid并添加数组,去重。

    var cmd process platform win32 tasklist ps aux var exec require child process exec var qqname qq Array prototype unique1
  • TV模型图像修复 matlab

    原lena 随手截的噪声图 合成的需要修复的图 修复后的图 没有处理边界 对于从来没有接触过图像修复的我来说 效果真是惊艳了 下面介绍运算步骤 和各项异性扩散类似 整个算法也是基于迭代的 迭代公式如下 其中Io代表当前处理的像素 Ip代表邻
  • Java代码规范检查插件调研及总结

    代码规范工具对比 代码规范工具是什么 大家应该都有过写完代码后review的情况 用于提高编码质量 尽早的发现问题 节约开发时间和成本 但review 这个过程往往要消耗 更多的开发资源 所以就出现 自动检测可能代码中存在的问题的工具 我们
  • nrichIP分析command tools(Sodan接口调用查询)

    nrichIP分析command tools 一 项目简介 nrich是一种命令行工具 可快速分析文件中的所有 IP 并查看哪些具有开放端口 漏洞 也可以从标准输入输入数据以在数据管道中使用 二 项目本地部署 1 项目地址 https gi
  • OpenCV样本训练经验

    从下述几篇文章中总结 OpenCV中Adaboost训练的经验总结 采用opencv cascadetrain进行训练的步骤及注意事项 使用opencv traincascade训练遇到的问题总汇 在讲下面内容时首先应先清楚一件事情 自己收
  • 微信营销最重要的是什么

    随着移动互联网的迅速发展 微信已经成为了企业进行营销的重要平台之一 然而 众多企业在微信上进行营销 不同的策略和方法层出不穷 那么 微信营销最重要的是什么呢 本文将深入探讨这个问题 揭示微信营销的核心要素 1 用户价值和体验 微信营销最重要
  • CSDN 添加目录及基本操作(保姆级教程)

    文章目录 1 步骤 1 步骤 1 点击发布 2 这里点击右上角的使用MD编辑器 3 界面介绍 最左边是编辑区 中间视图区 最右边是语法说明区 也就是直接引用区 4 目录操作 toc 文章名称 在使用完在使用完 toc 操作后 对应的我们复制
  • spring boot和activiti的demo

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 添加依赖
  • Web安全漏洞之:JDK1.5环境下扫描远程调试端口导致JVM崩溃【JDWP exit error JVMTI_ERROR_NONE(0)】

    问题描述 对运行在JDK 1 5版本下的java应用服务器进行端口扫描 扫描的方式可以用相关扫描软件 最简单的是直接用ping telnet命令 有闲情还可以自己写一段代码进行socket连接 扫描时会发现java进程crash 经测试百发
  • C# 调用接口时跳过登录认证

    涉及到的软件 API Post Vistual Studio EnableCors origins headers methods RoutePrefix api IPC Authorize public partial class IPC

随机推荐

  • db2 -670 54010 问题解决

    前一段时间研究db2表空间 发现无法复现54010错误 该错误由于行长度超过表空间限制而出现 但是在db210 5之后 加入新参数 可以不再受此控制 解决办法 v10 5 之前 使用大的表空间 比如32k 16k v10 5之后 ibm新增
  • Python深度学习-u4.1:分类和回归术语表

    分类和回归都包含很多专业术语 这些术语在机器学习领域都有确切的定义 本文对常见术语进行整理 样本 sample 或输入 input 进入模型的数据点 预测 prediction 或输出 output 从模型出来的结果 目标 target 真
  • PgSQL优化的100种方法

    1 确保数据库系统已经针对最新版本更新了所有的安全补丁 2 确保持久化数据所在的设备的 I O 操作速度非常快 3 将表的分区分布在多个磁盘上 以提高数据和索引的访问速度 4 为了确保快速数据访问 请使用恰当的索引 但不要过度依赖索引 5
  • 外卖经营小助理,快速帮你获取外卖店面经营情况

    外卖经营小助理 快速帮你获取外卖店面经营情况
  • 生产者消费者模型你知道多少

    背景 进入正题之前先说点故事 从最开始学java的那里开始 我是从08年下半年开始学Java 在 我的六年程序之路 中提到了一些 当时比较简单 每天看尚学堂的视频 对于初学者而言看视频好一些 然后写代码 比较清楚的记得马士兵讲到生产者消费者
  • linux学习书籍汇总 值得推荐的linux学习书籍

    在总结这些linux学习书籍之前 我在各个linux学习讨论群 都能看到许多新手在问关于linux学习书籍推荐这样的问题 在这里 整理了一些值得推荐的linux学习书籍 希望对新手学习linux有一定的帮助 1 嵌入式Linux C语言程序
  • 使用ElementUI在同一张表格上同时实现合并行和列单元格

    代码演示地址 https jsfiddle net Tomatoro 可以直接在代码演示地址自己尝试想要实现的效果效果图
  • 《硬件架构的艺术》笔记(二)

    时钟和复位 2 1 同步设计 2 1 1避免使用行波计数器 用触发器来驱动其他触发器的时钟输入端 一般会存在问题 由于第个触发器时钟到g的延而使第二个触发器的时钟输入产生偏 而且不能在每个时钟边沿都激活 用这种方式连接两个以上的触发器就会形
  • Altium Designer 16来自原理图/PCB的各种报错 (持续更新):

    NO1 Net xxx has only one pin 根本原因 在BGA的原理图绘制时 我一般拉出该元件的所有IO的网络 这方便利于我开发其他款板卡 同样也会因为不同板卡的需求不同而造成有些IO并没有使用到 也就是整个原理图中only
  • 软件测试的学习方法

    学习软件测试需要掌握以下几个步骤 1 了解软件测试基础知识 软件测试是指在软件开发过程中 对软件进行验证和确认 以确定其是否符合规定的需求 标准和规范 因此 学习软件测试需要先理解软件测试的定义 分类 流程等基本概念 2 学习软件测试工具
  • 读写锁的实现

    读写锁的实现 待编辑
  • STEM教育课程的发展

    STEM教育本身的定义就是跨学科的整合式教育 科创教育近几年一直是教育领域的重头戏 由机器人和3D打印引发的创新科技教育热潮一直引领着创新教育行业 细分归属STEM教育的范畴 格物斯坦小坦克来说说stem教育课程的发展 STEM教育是全球许
  • 深入解析中间件之-Canal

    canal 阿里巴巴mysql数据库binlog的增量订阅 消费组件 MySQL binlog MySQL主从复制 mysql服务端修改配置并重启 1 2 3 4 5 6 7 8 9 10 11 12 vi etc my cnf mysql
  • Bonita实现的BPM应用系统

    多个领域的组织已经从Bonita的BPM解决方案中受益 用于改进它们的业务流程 世界各地的很多机构在它们的系统中已经成功布署了Bonita 1 Government of the Canary Islands 电子政务系统的BPM Boni
  • Optional int parameter 'folderId' is not present but cannot be translated into a null value due to b

    错误信息 严重 Servlet service for servlet controller in context with path gxbms threw exception Request processing failed nest
  • ungui中mainform以及login窗体的背景设置

    1 打开mainmodule窗体 2 设置mainmodule的background属性 3 设置mainmodule窗体的loginbackground属性 结果
  • 25个恶意JavaScript 库通过NPM官方包仓库分发

    聚焦源代码安全 网罗国内外最新资讯 编译 代码卫士 专栏 供应链安全 数字化时代 软件无处不在 软件如同社会中的 虚拟人 已经成为支撑社会正常运转的最基本元素之一 软件的安全性问题也正在成为当今社会的根本性 基础性问题 随着软件产业的快速发
  • Windows中通过命令行新建文件夹、新建文件

    进大厂 身价翻倍的法宝来了 主讲内容 docker kubernetes 云原生技术 大数据架构 分布式微服务 自动化测试 运维 腾讯课堂 点击进入 网易课堂 点击进入 7月1号 7月29号 8折优惠 7月1号 7月29号 8折优惠 7月1
  • 补码的作用

    补码的作用 避免零在二进制中的歧义 另一个好处就是方便运算 所有运算都能用加法运算器来实现 不再需要减法运算器 其实在计算机中 所有的减法操作都被转化为加法操作 如果想要深入研究 可以看看计算机组成原理 举个简单的例子 正数的补码和反码 原
  • 《Learning CUDA Programming》读书笔记(三)

    CUDA occupancy 一般等于 Active Thread Blocks per Multiprocessor Max Threads per Multiprocessor 分子是用户kernel和GPU硬件条件共同决定的 分母完全