如何优雅地测量GPU占用率?(nsys gpu-metrics-devices使用)
背景 做GPU性能优化时,一种思路是先找到GPU占用率低的环节,然后做针对性优化,把GPU占用率提上去,那么问题就来了: 哪些指标可以表征GPU占用率? 如何测量GPU的占用率? nsys profile gpu-metrics-devices 一番搜索后,发现nsys从 2021.2.4开始profile时开始支持gpu-metrics-devi…
如何优雅地测量GPU CUDA Kernel耗时?(三)- nsys统计kernel耗时
背景 文一,文二介绍了常用的GPU性能分析手段,聚焦单个kernel的耗时分析。而实际应用中,还可能需要统计多个kernel耗时数据,比如: kernel在不同时刻的耗时可能不一样,只观测一个具体kernel不够准确,所以需要统计kernel耗时分位值。 优化性能需要找到耗时大户,这就需要统计各种kernel的耗时占比。 解析Nsys SQLite…
如何优雅地测量GPU CUDA Kernel耗时?(二)- 精确测量
背景 上文介绍了kernel常用的测量方法,而实际应用中,还会遇到其他的问题,比如: 1. 为什么同样的输入,测量的耗时存在较大差距? 2. 怎样才能精确的测量kernel耗时? 问题 我们看以下以下常见代码,仅仅做了linear操作: def test(): a_size = (20, 8192) b_size = (5120, 8192) ev…
如何优雅地测量GPU CUDA Kernel耗时?(一)- nsys、CudaEvent使用
背景 工作中经常需要评估模型性能,会涉及到GPU Kernel的耗时分析。网上关于GPU耗时的文章比较散,本文记录下日常用到的一些工具及使用过程中的坑,大多是使用经验,若有错误,还请不吝指出。 GPU耗时和CPU耗时有啥区别? 在开始之前,我们需要了解GPU耗时和CPU耗时有啥区别? 在默认情况下,CPU与GPU的执行逻辑是异步的。CPU中调用ke…
如何优雅使用torch的view? 如何理解RowMajor/ColumnMajor?
背景 最近看一些torch代码,有很多view操作,之前没深入了解,存在一些问题: view的参数该如何填写呢? view后得到的tensor结果是怎样的呢? view是如何将tensor进行映射的呢? 本质上涉及到tensor元素在内存中的布局问题,所以就查了些资料,写下自己的理解。 什么是RowMajor/ColumnMajor? 首先需要明确…
不当工具人,如何提出有效的问题?
引言 不知道大家会不会有这样的一些时刻?面对别人的一番陈述后,脑子里没有具体的思路,觉得别人的观点有些不对,但又提不出问题,容易被人牵着走。比如工作中,面对领导的任务,同事的方案;在生活中,销售的推销,网上的评论等等。 自己在很多时候也会出现这样的问题,一直在找好的解决办法。前段时间,读完了《学会提问》这本书,颇有收益。这是一本关于批判性思维的书,…
Golang中struct如何优雅地相互转换?
为什么需要对struct进行转换? 一般而言,不同服务的协议,在生成桩代码后会放在不同仓库中。由于协议引用,相同的数据结构也会重新生成一份。而实践中,一些打包服务需要将上游的数据结构进行透传。由于数据结构所在包不同,被视为了不同的类型,所以无法直接赋值,此时就需要将上游的数据结构转换成当前服务response中的对应结构体。 现有的项目里也存在大量…
利用VS Code+Qemu+GDB调试Linux内核
背景 一直以来,都对linux系统的理解都是在应用层面,看过了《UNIX环境高级编程》,对于系统中的一些模块的实现方法还缺乏深刻的认识,故想研究下Linux内核机制。 单纯阅读源码还是不如一步一步调试内核理解深刻,对于调试内核的方法,网上也有不少,主要是利用Qemu+GDB对内核进行调试,但网上的资料大多零散,步骤记录不够详细,笔者在实现过程中走了…
浅谈库函数与系统调用,以fork函数为例
背景 最近,在看unix环境高级编程,第一章就讲了unix下的函数调用结构: 这图其实把结构表达的很清楚,但感觉还是有两个疑问: 库函数是具体是如何调用system call 不通过库函数,我们程序中如何调用system call 追溯 既然要探究库函数本质,那必然得看看库函数的源码,以最新版本的glibc 2.27为例吧 本来之前想从fgets入…
深入理解C++中的左值引用,右值引用
先谈引用 由于C中的指针过于灵活,容易出错,所以C++引入了引用来减少出错的用法,记得C++ primer中说,引用就是一个变量的别名,在初始化引用后,引用就无法改变再引用到其他的对象了。在遇到类的移动构造函数时,又见识到了右值引用,书上说,右值引用用于引用到临时对象。 那么就存在一些问题了: 这个别名到底是怎么实现的呢? 引用和指针存在什么关系呢…