GPU性能计数器和驱动程序计数器的含义是什么?

时间:2018-03-08 07:11:06

标签: gpu performance-testing nvidia

https://developer.nvidia.com/sites/default/files/akamai/tools/files/PerfKit_4_5_User_Guide.pdf

  

NVIDIA PerfKit SDK允许图形开发人员访问低级NVIDIA GPU    效果计数器 和NVIDIA 驱动程序计数器

我想了解这些柜台的含义?它们是某种硬件还是软件?他们做了什么?

他们对我有多大帮助?请举例说明如何使用它们。

我必须使用Nvidia perfkit来确定某些处理机器人的软件的性能。

3 个答案:

答案 0 :(得分:4)

我不是图形程序员,所以我将从计算机架构的角度来看待它。我不知道哪些计数器特别适用于查找3D图形或GPU计算中的哪种瓶颈,所以不要读取我选择哪些计数器作为示例。

当您调用图形功能时,很多繁重工作都是由专用的GPU硬件完成的。

为了保持GPU硬件的供应,在主CPU上运行的驱动程序软件必须做大量的工作,有时这可能是一个瓶颈。有“驱动程序计数器”来跟踪软件正在/正在等待的各种事情,以及用于跟踪GPU硬件实际执行情况的硬件计数器。

显卡就像是一台带处理器+内存的独立计算机,但处理器是一个专用的GPU,其指令集专为GPU擅长的事情而设计。但它仍然有自己的时钟,并解码/执行像流水线CPU一样的指令。 GPU性能事件可以计算在此硬件上执行的单精度浮点运算的数量。或者缓存命中/未命中事件,以便GPU访问自己的内存(它有自己的视频RAM缓存)。计数器由内置于GPU管道的硬件跟踪。

NVidia的表格为GPU hardware events that their hardware tracks。它包括像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可能来自执行的Compute Shader指令的计数器和执行的总指令的另一个HW计数器。

这些硬件性能计数器(可能)实现非常类似于硬件CPU性能计数器,它可以计算时钟周期,指令,uop,各种微架构资源的停顿等等。在x86 CPU上,计数器会定期溢出并生成中断(或在缓冲区内部记录样本),因此您可以更好地了解what exactly the CPU did while running a loop, for example。但无论如何,OProfile有a table of events supported by Haswell,如果你想比较CPU可以报告哪种类型的事件而不是GPU。有一个像l2_rqsts的计数器,就像NVidia一样,但与GPU不同的是,有分支错误预测的计数器和GPU没有的其他东西。

驱动程序事件包括以下内容:OGL driver sleeping:“OpenGL Last frame mSec在OGL驱动程序中休眠”,或OGL vidmem bytes“OGL当前视频内存量(本地视频内存) )以字节分配。不计算Drawables和渲染目标。“

还有简单的总计,例如OGL Frame Primitive CountOGL Frame Vertex Count,以了解驱动程序向GPU发送的总工作量。

驱动程序计数器包括cpu_loadcpu_00_frequency之类的内容,用于跟踪与CPU绑定的接近程度。

  

所有软件/驱动程序计数器代表每帧会计。这些计数器在每帧的驱动程序中累积和更新,因此即使您以子帧速率频率进行采样,软件计数器也将保持相同的数据(从前一帧)到当前帧的结束。

这些是驱动程序在软件中跟踪的高级内容,而不是在硬件中计算的低级内容,并在请求时查询以获取总计数。

答案 1 :(得分:4)

GPU中可能出现许多不同类型的性能问题,每个都需要使用不同的性能计数器来识别和分析。您可以将彼得的答案视为起点。我将在这里讨论可供您使用的不同分析工具和库以及如何开始使用它们。

NVIDIA PerfKit是一个可以访问性能计数器的库。这意味着您必须编写代码来调用库提供的API来测量感兴趣的性能事件。因此,使用PerfKit可能不是诊断性能问题的最佳方法。无论如何,您可以在this页面的底部找到PerfKit的用户指南。您可以从here下载。

CUDA工具包附带了自己的类似库,称为CUDA概要分析工具接口(CUPTI)。用户指南可以找到here。这些slides还讨论了如何通过CUPTI使用一些性能计数器。

工具

CUDA Toolkit附带两个分析工具,一个是命令行工具,名为nvprof,另一个是GUI工具,称为Visual Profiler。这些工具构建在CUPTI之上,它们更容易使用,因为您不必编写任何代码(或只是一些代码),所以我认为您应该使用这些工具之一。可以找到这两个工具的用户指南here。这是使用Visual Profiler进行性能分析的video。这是关于nvprof的介绍性文章。这里还有一堆关于如何使用不同工具分析各种问题的videos

任何人都很难给你一个具体的答案,因为你没有询问具体的问题。但我认为我的答案和彼得的答案应该可以帮助你开始。

答案 2 :(得分:1)

来自official nvidia site

  

它允许您访问内部的低级性能计数器   GPU本身内部的驱动程序和硬件计数器。 柜台可以   用于确定您的应用程序使用GPU的确切方式,   识别性能问题,并确认性能问题   已经解决

这意味着,您可以获取有关应用程序GPU使用情况和性能的信息,并用于查找性能问题。

还有一些链接: