NVIDIA系统级性能分析工具Nsight Systems如何从入门到精通?

摘要:本文首先对NVIDIA GPU程序系统级性能分析工具Nsight Systems进行简单的介绍,然后说明了工具适用平台及安装,最后通过cuda-samples示例程序的分析,说明了如何在实际应用中使用该功能强大的工具。
1 基本情况 1.1 简介 Nsight Systems(简称nsys)是NVIDIA推出的一款系统级性能分析工具,主要用于优化 GPU 加速应用程序(尤其是基于 CUDA、OpenCL、DirectX、Vulkan 等 API 开发的程序)的性能,帮助开发者定位和解决计算、内存、通信等环节的瓶颈。所谓系统层面的分析工具,除了分析GPU的使用,还要分析CPU的使用,以及CPU和GPU的交互情况,可以捕捉CPU和GPU的各种事件,发现CPU和GPU上的等待以及不必要的同步,可以通过Nsight systems将任务均匀的分配到CPU和GPU上。做为NVIDIA核心分析工具之一,它和Compute以及Graphics有各自的侧重点: Nsight Systems: A system-wide performance analysis tool Nsight Compute: An interactive kernel profiler for CUDA applications Nsight Graphics: A standalone developer tool to debug, profile, and export frames built with Direct3D, Vulkan, OpenGL, OpenVR 下图给出了CUDA程序整理优化流程,对于Nsight Systems侧重点在CPU&GPU同步、数据拷贝以及处理重叠同步运行等方面,优化后再分别用Compute完成Kernel层或者用Graphics完成图像层优化,这之后再重新进行系统层分析及优化,不断迭代最终完成应用程序优化。 接下来用下面的图来初步了解下Nsight Systems的强大功能,图中matrix_mul_test是一个GPU程序,在它执行过程中ntoskernl.exe会以线程形式参与到内存管理和设备驱动交互等环节,红色、橙色、绿色分别表示CPU占用率、当前CPU核(不同颜色表示线程运行在不同CPU核上)、线程状态(不同颜色表示不同状态Running,Ready to run,Blocked),图中标记1处于Running状态,标记2处于Ready to run状态,这时可能是ntoskernl线程在当前CPU核上时间片运行结束,CPU核已经调度给其他线程,比如标记3表示的ToDesk程序的相应线程。 通过上图可以看到,借助Nsight Systems的图形显示可以直观方便的对GPU程序的运行过程进行分析。 1.2 安装 Nsight Systems是一款跨平台应用工具,根据主机平台的不同,它支持本地或远程Profiling目标程序,简单来说就是在Linxu和Windows下既支持本地分析有支持远程分析目标程序,对于Mac系统来说,只支持远程分析目标程序,以下是完整的支持列表: 不同平台的用户,可从最后参考1地址获得相应平台的安装程序,工具当前最新版本为2025.5.1。 以Windows平台为例,下载以后直接安装NsightSystems-2025xxxxx.msi文件即可,另外如果之前安装toolkit,其实已经在在其中包含Nsight Systems,当然可能不是最新版本。其他平台看着请参考官网说明进行安装。 2 使用说明 2.1 图形界面 1. 创建工程 打开NsightSystems后,工具中默认会创建一个Project 1的工程,可以将该工程进行重命名,如改为HelloNsight,之后需要在右侧指定一个分析目标,工具支持多种方式的目标,以下进行详细解释: (1)Localhost connection 表示本地主机连接,即对运行 Nsight Systems 的本机进行性能分析、调试。可监测和分析本机上运行的程序,收集其性能数据,像 CPU、GPU 的使用情况,线程活动等。图图中“zwv” 是已识别我的电脑名称。 (2)USB connections 指通过 USB 连接的调试目标。可用于分析连接到本机 USB 接口的设备上运行的程序性能,比如Jetson和Rive平台等,只要设备支持且正确配置,就能通过该连接进行性能数据采集。 (3)SSH connections 基于 SSH(Secure Shell)协议的远程连接。借助 SSH 安全通道,可连接到远程主机(如另一台服务器、开发机等),对远程主机上运行的程序进行性能分析和调试,方便管理不在本地的设备或集群环境中的程序性能。 (4)SSH connection groups 是 SSH 连接组,可将多个 SSH 连接进行分组管理。
阅读全文