CUDA编程 - Nsight system Nsight compute 的安装和使用 - (1) 学习记录

2024-02-24 03:44

本文主要是介绍CUDA编程 - Nsight system Nsight compute 的安装和使用 - (1) 学习记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nsight system & Nsight compute

  • 安装和下载地址
  • 一、Nsight Systems
    • 1.1、主要应用
    • 1.2、比较常用的分析
      • 1.2.1、情况一
      • 1.2.2、情况二
  • 二、Nsight Compute
    • 2.1、主要应用
    • 2.2、比较常用的分析
      • 2.2.1、情况一
      • 2.2.2、情况二
  • 三、两者的比较
    • 3.1、Nsight systems
    • 3.2、Nsight compute
  • 四、参考使用途径
      • 方法一
      • 方法二
      • 方法三
      • 方法四

在 cuda 编程中,经常会用到 Nsight system 和 Nsight compute 进行性能分析等,下面做个学习总结。

本篇包括安装和常用分析思路总结,具体实践操作总结会放在下一篇博客。

安装和下载地址

Nsight Systems

Nsight Compute

汇总下载地址

一、Nsight Systems

1.1、主要应用

主要倾向于观察全局的 Profiling,比如 核函数读写情况,核函数之间的调度情况,SM占有率,CPU和GPU之间的异步执行的情况等。

在这里插入图片描述

1.2、比较常用的分析

1.2.1、情况一

可以对 kernel 执行 和 memory 进行 timeline 分析,尝试寻找是否可以优化

常用的优化角度:

  • 隐藏 memory access
  • 多流调度
  • 删除冗长的 memory access
  • 融合kernel减少 kernel launch的overhead
  • CPU与GPU的 overlapping

一、比如核函数与核函数之间的执行情况,是根据 timeline 进行分析的

比如下面的 timeline 可以发现核函数与核函数之间有延迟,或者是核函数的启动延迟等,都是可以展示出来的
在这里插入图片描述

二、 在多个 stream 的时候,可以查看调度情况和 Overlap 等,从而分析出如何进行更高效的调度

在这里插入图片描述

1.2.2、情况二

分析 DRAM 以及 PCIe 带宽的使用率 ,分析 SM 中 warp 的占有率

一、可以从中分析到哪些带宽没有被充分利用,从而进行优化

在这里插入图片描述

二、可以从中知道一个 SM 中资源是否被用满

在这里插入图片描述

二、Nsight Compute

官方使用说明链接

2.1、主要应用

主要分析核函数的内部的操作,比如显示不同block size核函数的执行时间,执行的吞吐量,带宽分析等。
在这里插入图片描述

2.2、比较常用的分析

2.2.1、情况一

一、roofline analysis

对核函数进行 roofline analysis,可以知道现在的核函数是计算密集型还是仿真密集型。即可以判断下一步优化是提高计算度,计算密度,还是优化访存等。

并且根据 base line 进行优化比较,比如设置两个核函数,对比核函数对性能的影响

在这里插入图片描述

比如在下图 蓝色在绿色的上方
在这里插入图片描述

2.2.2、情况二

二、occupancy analysis (占有率)

对核函数的各个指标进行估算一个warp的占有率的变化

在这里插入图片描述

三、memory bindwidth analysis

针对核函数中对各个memory的数据传输的带宽进行分析。可以比较好的理解memory架构

在这里插入图片描述

四、shared memory analysis

针对核函数中对 shared memory 访问以及使用效率的分析

在这里插入图片描述

三、两者的比较

3.1、Nsight systems

偏重于可视化application的整体的profiling以及各个细节指标

  • PCIe bindwidth
  • DRAM bindwidth
  • SM Warp occupancy
  • 所有核函数的调度信息
  • 所有核函数的执行时间,以及占用整体时间的比例
  • 多个Stream之间的调度信息
  • 同一个stream中的多个队列的调度信息
  • CPU和GPU之间的数据传输耗时
  • Application整体上的各个核函数以及操作的消耗时间排序
  • 捕捉同一个stream中的多个event

整体上会提供一些比较全面的信息,我们一般会从这里得到很多信息进而进行优化

3.2、Nsight compute

偏重于可视化每一个CUDA kernel的profiling以及各个细节指标

-SM中计算吞吐量
-L1 cache数据传输吞吐量
-L2 cache数据传输吞吐量
-DRAM数据传输吞吐量
-当前核函数属于计算密集型还是访存密集型
•Roofline model分析
-核函数中的L1 cache的cache hit几率, cache miss几率的多少
-核函数中各个代码部分的延迟
•精确到代码部分进行highlight
-核函数的load bandwidth, store bandwith, load次数, store次数
-L1 cache/shared memory, L2 cache, global memory中的memory access scheduling
-设置baseline,来进行核函数的优化前后的效率对比

整体上能够得到一个针对某一个kernel的非常精确的profiling,源码级别的性能捕捉,以及优化推荐

四、参考使用途径

方法一

在 host 端使用 Nsight 进行 ssh 远程 profiling

方法二

在 remote 端使用 Nsight 进行直接 profiling

方法三

在 remote 端通过CUI获取statistics之后传输到host端进行查看

***在当host端的nsight不能够直接ssh到 target device 情况下使用。比如说Jetson的profiling

方法四

在 remote 端直接使用CUI进行分析

***在当host端的nsight不能够直接ssh到 target device 情况下使用。比如说 Jetson 的profiling

在wsl中配置的问题参考链接

这篇关于CUDA编程 - Nsight system Nsight compute 的安装和使用 - (1) 学习记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740852

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三