- 昨天无意中刷到了此网页:NVIDIA 分析工具的用户手册
- Visual Profiler 是一种图形分析工具,可显示应用程序的 CPU 和 GPU 活动的时间轴,并包括一个用于识别优化机会的自动分析引擎。
- nvprof 分析工具,可以从命令行收集和查看分析数据。
- NVIDIA Nsight Systems整合了Visual Profiler和nvprof 。 进行 GPU 和 CPU 采样和跟踪,并使用 NVIDIA Nsight Compute 进行 GPU 内核分析。
- 事件event是设备上可计数的活动、操作或事件。个人理解,就是指一个函数调用过程。在我做的异构性能分析系统中,事件至少有两个时间点,起始和终止,有的还有进入队列,等待执行等概念,对应的是opencl中的概念。
- 指标metric是根据一个或多个事件值计算的应用程序特征。个人理解,就是指带宽这种性能指标。在我做的异构性能分析系统中,是允许自定义的,有几百个参数。
- 聚焦分析,Focused Profiling,本质上就是缩小性能分析范围。减少输出,不容易被大量无用信息干扰。类似vs的通用性能分析与自定义性能分析。
- 标记 CPU 活动的区域,Marking Regions of CPU Activity,本质就是自己设置一个新事件的起止。相对于自动标记的cuda调用事件,这种是自定义事件。
- 命名 CPU 和 CUDA 资源,Naming CPU and CUDA Resources,别名可以方便理解,降低分析难度,本质也是信息简化、数据降维。
- 刷新配置文件数据, Flush Profile Data,为了性能采样的性能,优先使用缓存,需要通知程序将采样数据存储到硬盘。
- Visual Profiler 可视化分析器,本质是通过图形化性能采样数据,方便人去理解和分析性能数据。
- 从 File 菜单中选择 New Session 来创建新会话。multi-process 分析选项包括:分析子进程Profile child processes,分析所有进程Profile all processes,仅分析当前进程Profile current process only。按照进程为单位分析,一个进程本身对应一个事件概念。
- CUDA options设置gpu事件的采样范围。也涉及gpu内存、功耗、散热等。本质都是数据采样,为后续图形化性能分析、辅助分析做准备。
- CPU (host) options设置线程采样、OpenACC 等。受限于linux、windows系统特性,有些数据采集只有linux提供。
- Timeline Options: 时间轴选项,关键点是建立统一的时间坐标系,例如cpu tsc与gpu计时。然后就是根据时间范围筛选部分事件。
- 以上是设置数据采样的细节,后续采样后就是数据显示和分析的细节。显示时支持一些交互,都是为了方便分析比较。
- 在我做的异构性能分析系统中,数据采样的关键点是形成事件树,每个事件至少要记录自己的父节点。兄弟节点一般是并行关系,父子节点一般是调用关系。同一个事件可能有多个时间分片,此时用不同属性、颜色标注。数据采样形成的数据文件可以是文本,也可以是二进制数据,当然,nvidia应该采用的是二进制数据文件,因为效率问题。nvidia早期版本也是CSV 文件。
- 可视化分析器视图 Visual Profiler Views举例
我在做异构性能分析系统之前,没有见过这个界面,但是,我做的跟这个非常接近,js实现差一点。
这种设计出发点其实很简单,就是建立笛卡尔坐标系,类似户外运动经常用的全球GPS坐标系,基于地图map形成快速反馈环节,明确系统存在的问题和改进方向。
我是用js直接生成的web页面,这个数据量大了,必须用程序显示,否则很难控制大量图形对象的流畅显示。
分析视图的本质就是将表格数据转化为柱状图、饼状图之类的形式。配合AI或许可以给出一些性能分析结果和建议。
PC 采样视图,可以对应到c、asm代码,这种复杂功能出现得比较晚。本质上,都是基于更为完整的采样数据进行处理和现实。
内存统计的图形化,方便人工快速分析内存迁移的细节。
表格形式实际上最基本的分析方式,但经过程序归类处理后,比较方便。
cpu上的线程视图。细节控制举例:筛选部分线程、cpu事件树、排序、突出显示、源码显示等
openacc表格。
openmp表格。
外加控制台输入输出界面,参数设置界面。
-
自定义分析,使用上次退出时的界面布局,视图停靠移动等
-
命令行参数,略
-
nvtx分析方式
nvtx跟我在另外一个win下工具软件开发的性能分析模块类似,说白了就是有一个全局数据空间存储cpu下api的名称、起止时间等信息,程序退出时一次性输出到csv文件,用工具打开分析即可。
nvtx似乎是开源的,https://github.com/NVIDIA/NVTX 可以考虑在自己的项目中引用,形成更好的分析方案,但是要基于nvidia的工具套件。
对于 C 和 C++,NVTX 是一个没有依赖项的仅头文件库。
nvtx的输出可以用nsight转化为事件树图形
-
MPI Profiling with nctx
Message Passing Interface,消息传递接口。MPI 是一种用于并行计算的标准化消息传递库。它定义了一组函数和协议,允许运行在多台计算机(或同一台计算机的多个核心)上的进程之间进行通信和数据交换。MPI 不是一种编程语言,而是一个库。 -
MPS Profiling with Visual Profiler and nvprof
Moving Particle Semi-implicit method,移动粒子半隐式方法。MPS 是一种用于模拟流体和其他连续介质的粒子方法。它将连续的流体离散成大量的粒子,通过计算粒子之间的相互作用来模拟流体的运动。 -
openacc
Open Accelerators,开放加速,语法有点类似openmp。一种用于异构并行编程的标准。它允许程序员使用指令 (directives) 来指导编译器将程序的部分代码卸载到加速器(例如 GPU)上执行,而无需编写底层的 CUDA 或 OpenCL 代码。 -
dependency analysis依赖分析,简单理解就是函数调用关系,事件树显示,分析等待时间、空闲时间。
-
度量标准参考,本质就是各种基本采样数据的组合计算结果,方便从不同的视角快速分析系统的性能瓶颈。