Aqu*_*irl 0 gpu nvidia performance-testing
https://developer.nvidia.com/sites/default/files/akamai/tools/files/PerfKit_4_5_User_Guide.pdf
NVIDIA PerfKit SDK允许图形开发人员访问底层NVIDIA GPU
性能计数器和NVIDIA 驱动程序计数器。
我想了解这些计数器的含义吗?它们是某种硬件还是软件?他们在做什么?
他们如何对我有帮助?请举例说明如何使用它们。
我必须使用Nvidia perfkit来确定某些处理机器人技术的软件的性能。
我不是图形程序员,所以我将从计算机体系结构的角度来解决这个问题。我不知道哪些计数器对于查找 3D 图形或 GPU 计算中的瓶颈特别有用,所以不要阅读我选择的计数器作为示例的任何内容。
当您调用图形函数时,许多繁重的工作都是由专用 GPU 硬件完成的。
但为了保持 GPU 硬件的运行,在主 CPU 上运行的驱动程序软件必须完成大量工作,有时这可能会成为瓶颈。有“驱动程序计数器”来跟踪软件正在执行/等待的各种操作,以及硬件计数器来跟踪 GPU 硬件实际正在执行的操作。
显卡就像一台带有处理器+内存的独立计算机,但处理器是一个专门的GPU,其指令集是为做GPU擅长的事情而设计的。但它仍然有自己的时钟并像流水线CPU一样解码/执行指令。GPU 性能事件可以统计在此硬件上执行的单精度浮点运算的数量等内容。或者为 GPU 访问其自己的内存缓存命中/未命中事件(它有自己的视频 RAM 缓存)。计数器由 GPU 管道内置的硬件进行跟踪。
NVidia 有一个其硬件跟踪的 GPU 硬件事件表。它包括诸如 之类的东西texture_busy,它计算“纹理单元繁忙的时钟周期”。将其与您分析的时间段内的总时钟周期进行比较,您会知道纹理单元的硬件吞吐量接近最大化/瓶颈的程度。或者shaded_pixel_count:发送到着色单元的光栅化像素数。在硬件事件中,它们按 GPU 硬件的哪个部分进行细分:有一般的“ GPU ”事件,如“ SM ”(着色器)事件,如inst_executed_vs“由顶点着色器 (VS) 执行的指令,不包括重播。 ”,以及缓存事件,例如l1_l2_requests“来自 L1 单元的 L2 请求数”。(我认为与 L1 未命中次数高度相关)。还有内存事件,例如sm_inst_executed_local_loads“执行本地加载指令”。
(上面的例子是“针对架构早于 Kepler 的 GPU ”;事实证明,我发现的第一个 google 搜索结果是旧 GPU 的页面。这不会改变基本原理:GPU 事件是硬件可以跟踪的低级事物,但CPU上的软件通常不能。它不知道将工作发送到GPU时是否会出现缓存未命中。)
该表将事件分为“图形”和“计算”API。也许某些事件是由 NVidia 软件从实际硬件计数器合成的。它记录了 NVidia 的开发人员工具可以向您展示的内容,而不是硬件实际重要的内容。例如inst_executed_cs_ratio可能源自执行的计算着色器指令的计数器和执行的总指令的另一个硬件计数器。
这些硬件性能计数器(可能)的实现非常类似于硬件 CPU 性能计数器,可以对时钟周期、指令、微指令、各种微架构资源的停顿进行计数。在 x86 CPU 上,计数器会定期溢出并生成中断(或在缓冲区中内部记录样本),因此您可以更好地了解CPU 在运行循环时到底做了什么,例如。但无论如何,如果您想比较 CPU 与 GPU 可以报告的事件类型, OProfile 有一个 Haswell 支持的事件表。有一个l2_rqsts类似于 NVidia 的计数器,但与 GPU 不同的是,有用于分支错误预测和 GPU 没有的其他东西的计数器。
驱动程序事件包括:OGL driver sleeping“OpenGL 最后一帧 mSec 在 OGL 驱动程序中休眠”或OGL vidmem bytes“OGL 当前分配的视频内存(本地视频内存)以字节为单位。可绘制对象和渲染目标不计算在内。”
还有简单的总计,例如OGL Frame Primitive Count和OGL Frame Vertex Count来查看驱动程序发送到 GPU 的总工作量。
驱动程序计数器包括cpu_load和等内容cpu_00_frequency,用于跟踪您距离 CPU 限制有多近。
所有软件/驱动程序计数器都代表每帧计数。这些计数器在驱动程序中每帧进行累积和更新,因此即使您以子帧速率频率进行采样,软件计数器也将保留相同的数据(来自前一帧)直到当前帧结束。
这些是驱动程序在软件中跟踪的高级事物,而不是在硬件中计数并在请求时查询以获取总计数的低级事物。
GPU中可能会发生许多不同类型的性能问题,每种问题都需要使用不同的性能计数器来识别和分析。您可以将彼得的答案作为起点。我将在这里讨论可供您使用的不同性能分析工具和库,以及如何开始使用它们。
NVIDIA PerfKit是一个库,可让您访问性能计数器。这意味着您必须编写代码来调用该库提供的API,以测量感兴趣的性能事件。因此,使用PerfKit可能不是诊断性能问题的最佳方法。无论如何,您可以在此页面底部找到PerfKit的用户指南。您可以从这里下载。
CUDA工具包带有其自己的相似库,称为CUDA分析工具接口(CUPTI)。用户指南可以在这里找到。这些幻灯片还讨论了如何通过CUPTI使用一些性能计数器。
在CUDA工具包带有两个分析工具,一个是一个命令行工具,称为nvprof另一个是一个GUI工具,称为视觉探查。这些工具建立在CUPTI之上,并且使用起来更加容易,因为您无需编写任何代码(或仅编写少量代码),因此我认为您应该使用其中一种工具。这两个工具的用户指南都可以在这里找到。这里是一个视频上与Visual Profiler中的性能分析。这是有关nvprof的介绍性文章。这里还有一些视频,介绍如何使用不同的工具分析各种问题。
任何人都很难为您提供特定的答案,因为您没有在询问特定的问题。但是我认为我的回答和彼得的回答应该可以帮助您入门。
| 归档时间: |
|
| 查看次数: |
2251 次 |
| 最近记录: |