NVIDIA PerfKit SDK允许图形开发人员访问低级别的NVIDIA GPU。 性能计数器和NVIDIA 驱动程序计数器。
我想知道这些柜台的含义?是硬件还是软件?他们干些什么?
它们对我有多大帮助?请举例说明如何利用它们。
我必须使用Nvidia试剂盒来确定处理机器人的某些软件的性能。
发布于 2018-04-01 16:27:38
GPU中可能会出现许多不同类型的性能问题,每种问题都需要使用不同的性能计数器来识别和分析。你可以把彼得的回答当作出发点。我将在这里讨论可供您使用的各种分析工具和库,以及如何开始使用它们。
库
NVIDIA PerfKit是一个允许您访问性能计数器的库。这意味着您必须编写代码来调用库提供的API来度量感兴趣的性能事件。因此,使用PerfKit可能不是诊断性能问题的最佳方法。无论如何,您可以在PerfKit页面底部找到这的用户指南。您可以从这里下载它。
CUDA工具包附带了自己的类似库,称为CUDA分析工具接口(CUPTI)。用户指南可以找到这里。这些幻灯片还讨论了如何通过CUPTI使用一些性能计数器。
工具
CUDA工具包附带了两个分析工具,一个是命令行工具,称为nvprof,另一个是GUI工具,称为目视剖面仪。这些工具构建在CUPTI之上,而且使用起来容易得多,因为您不必编写任何代码(或少量代码),所以我认为您应该使用这些工具之一。这两种工具的用户指南都可以找到这里。下面是使用Visual进行性能分析的视频。下面是一篇关于尼夫罗夫的介绍性文章。这里还有一堆关于如何使用不同工具分析各种问题的视频。
任何人都很难给你一个具体的答案,因为你不是在问具体的问题。但我认为我的回答和彼得的回答应该能帮助你开始工作。
发布于 2018-03-31 18:26:47
我不是一个图形程序员,所以我将从计算机架构的角度来处理这个问题。我不知道哪些计数器对寻找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),不包括重放”,以及Cache事件(如l1_l2_requests“来自L1单元的L2请求的数量”)。(我想,这与L1失误的数量有很大关系)。还有内存事件,如sm_inst_executed_local_loads“本地加载指令的执行”。
(上面的例子是"for GPU的架构早于开普勒“;结果发现,我发现的第一次谷歌热是老GPU的页面。这并没有改变基本原理: GPU事件是硬件可以跟踪的低级事件,但CPU上的软件通常无法跟踪,它不知道在向GPU发送工作时是否会出现缓存错误。)
该表将事件分解为“图形”和“图形”。“计算”API。也许有些事件是由NVidia的软件从实际的HW计数器合成的。它是记录NVidia的开发工具可以向您展示的东西,而不是硬件的实际数量。例如,inst_executed_cs_ratio可能来自已执行的计算着色指令计数器和执行总指令的另一个HW计数器。
这些硬件性能计数器是(可能)实现的,非常类似于硬件CPU性能计数器,它可以计算时钟周期、指令、uop、各种微体系结构资源的暂停等等。在x86 CPU上,计数器周期性溢出并生成一个中断(或在缓冲区内部记录一个示例),这样您就可以更好地了解例如,在运行循环时,CPU到底做了什么?。但是无论如何,OProfile有哈斯韦尔支持的事件表,如果您想要比较一个CPU可以报告什么样的事件与GPU。l2_rqsts有一个计数器,就像NVidia的计数器,但是与GPU不同的是,还有用于分支错误预测的计数器和GPU没有的其他东西。
驱动程序事件包括如下内容:OGL driver sleeping:"OGL驱动程序中休眠的OpenGL Last“,或OGL vidmem bytes”OGL当前以字节分配的视频内存(本地视频内存)。Drawable和呈现目标不被计算“。
还有一些简单的总数,如OGL Frame Primitive Count和OGL Frame Vertex Count,以查看驱动程序向GPU发送的总工作量。
驱动程序计数器包括诸如cpu_load和cpu_00_frequency之类的东西,以跟踪您离CPU有多近。
所有软件/驱动程序计数器都表示每帧记帐。这些计数器在每个帧的驱动程序中进行累积和更新,因此即使您以子帧速率频率采样,软件计数器也将保存相同的数据(从前一个帧到当前帧的末尾)。
--这些都是驱动程序在软件中跟踪的高级别的东西,而不是在硬件中计数并在请求时查询以获得总计数的低级事物。
https://stackoverflow.com/questions/49167343
复制相似问题