Visual Studio 2013 Update 4 CTP1中的GPU使用工具

在将一些改进发送到 Visual Studio 2013 Update 3 RC中的图形诊断 ,该团队一直致力于为您提供更多用于DirectX应用程序的分析工具。在昨天发布的VisualStudio2013更新4CTP1中(下载 在这里 ),你会发现一个全新的 GPU使用 中的工具 性能和诊断中心 可以用来收集和分析DirectX应用程序的GPU使用数据。CTP1支持在本地运行的Windows桌面和Windows应用商店应用程序。Windows Phone应用程序支持和远程支持将在稍后的版本中提供。你可以找到文件 在这里 ,观看现场演示 第9频道视频 ,或阅读此博客的其余部分以了解有关此功能的更多信息。 J

null

如果所有游戏都以60帧/秒的速度运行,并且不需要调查任何性能问题,那么这个世界将会变得更加美好!但是,实际上,在开发过程中,有时在发布后,有些应用无法达到目标帧速率——无论是在PC上60 FPS还是在较小的设备上30 FPS,或者是在会话过程中帧速率下降的应用。

DirectX应用程序中性能问题的原因可能各不相同,从只使用一个CPU核(多个核可以很容易地使用)到GPU呈现过于复杂的网格。要了解原因,通常从隔离主要问题是CPU或GPU使用过度还是不足开始是有帮助的。这个 GPU使用 工具可以帮助您确定CPU还是GPU是应用程序的性能瓶颈。如果存在受支持的图形卡并且安装了最新的驱动程序,您还可以检查每个GPU事件的计时。请检查 本文件 有关支持的图形卡列表,请查看图形卡供应商网站( 英特尔 , 英伟达 , AMD公司 )下载为该功能提供GPU事件数据的最新驱动程序。

我们先试试吧!

GPU使用工具可以通过Performance and Diagnostics hub via菜单启动 调试 -> 性能和诊断 Alt+F2键 .

图片[1]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

从这里您可以选择检查 GPU使用 或者您可以检查其他工具来运行它,例如 CPU使用率 .

首先,让我们单击 起点 运行 GPU使用 使用DirectX项目模板创建的默认DirectX项目上的工具。在提示的“用户帐户控制”对话框中,请求您获得收集数据的权限,单击 是的 .

GPU使用工具开始收集数据,并在打开的diagsession文件上显示三个图形,这些图形显示包括 帧时间 每秒 图形诊断工具中提供的图形,以及一个全新的 GPU利用率 显示GPU在高级别的繁忙程度的图形。

图片[2]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

现在让我们点击 停止收集 链接在底部或 住手 按钮生成报告。生成的报告显示了实时会话中相同的三个图表。如果您想深入了解时间线中特定范围的详细信息,例如,如果GPU利用率出现帧速率下降或峰值,可以在时间线中选择一个范围,然后单击 在这里 底部的链接可查看GPU使用数据的详细信息。在本例中,应用程序在整个会话中运行平稳,因此我们可以选择任何范围来检查GPU的详细信息。

图片[3]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

GPU详细信息窗口将与diagsession窗口分开打开。上半部分是一个时间轴视图,其中包含显示每个CPU核心和GPU引擎如何随时间使用的通道,下半部分包含一个事件列表,该列表显示GPU上发生的图形事件列表。请注意,事件列表中的数据需要图形驱动程序支持,因此,如果您的图形卡不受支持或尚未安装最新的驱动程序,则该数据可能不可用,在这种情况下,所有事件都将标记为“未分配”。你可以查一下 本文件 有关支持的图形卡列表,请查看图形卡供应商网站( 英特尔 , 英伟达 , AMD公司 )下载为该功能提供GPU事件数据的最新驱动程序。

所有使用GPU的进程都将被捕获,每个进程在时间轴视图中都被分配了不同的颜色。在本例中,黄色表示分析的目标进程App5.exe。

当您单击或浏览事件列表时,您会注意到CPU和GPU通道上有一个小弹出窗口小部件,显示所选事件何时在GPU上执行以及相应的CPU工作何时在CPU上发生。穿过车道标记的浅灰色垂直线 垂直同步 从每个监视器。Vsync行可以作为一个参考来了解某些Present调用是否错过了Vsync。一定有 当前通话双方 每两个 Vsyncs以使应用程序稳定地达到每秒60帧。

图片[4]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

此GPU详细信息视图提供了有用的信息,可以帮助您了解:

  • CPU和GPU在更精细的层次上有多忙
  • 当在CPU上调用DirectX事件时,以及当它们在GPU上执行时
  • 每个事件在GPU和CPU上花费了多长时间
  • 如果当前调用未命中目标帧速率,则缺少Vsyncs

在这个例子中,好处可能并不明显,因为应用程序非常简单,GPU和CPU都不忙。在下一节中,我们将在一个更现实的应用程序上试用它,看看如何使用数据。

让我们忙起来分析一个更现实的应用程序

在本例中,我们将使用一个名为CityDemo的内部测试应用程序,它可以渲染模拟城市的三维场景。这一次,我们将试着两者兼而有之 GPU使用 CPU使用率 同一会话中的工具。虽然只需要GPU使用工具来确定应用程序是CPU绑定还是GPU绑定,但是添加CPU使用信息将允许我们在发现CPU有问题时更快地分析情况(提示,提示)。

同样,让我们启动Performance and Diagnostics hub,但这次我们将选择两者 GPU使用 CPU使用率 . 这个 每秒 这个图表告诉我们这个应用程序的运行速度是每秒40帧。FPS图中的红线表示60 FPS的默认阈值。如果您想以较低的帧速率为目标,可以使用下拉列表将其更改为30 FPS。你也会注意到我们有一个 CPU利用率 因为我们选择了CPU使用工具。这提供了一个高层次的GPU和CPU状态的内聚视图。在这种情况下,CPU利用率约为20%,GPU约为60%。所以CPU和GPU都没有得到充分利用,但是,为什么应用程序不能达到每秒60帧呢?

图片[5]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

为了弄清其中的奥秘,让我们深入了解GPU的细节,看看是否有任何线索可以解释应用程序运行缓慢的原因。由于图形是常量,我们可以选择任何范围并打开GPU详细信息视图。从细节视图中的时间线可以看出:

1.GPU上的当前调用错过了Vsync大约四次中的一次,这导致约40 FPS。我们目前还没有在图形上标记当前调用,但在这种情况下,当前调用位于GPU通道上每个块的末尾。尝试使用时间线上方的Filter控件仅显示当前事件,这样可以更容易地查找当前事件。

图片[6]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

2.请注意,有些事件是分组的,例如“Draw city”和“Draw rain”。这些组来自于使用 ID3DUserDefinedAnnotation用户定义说明 接口。添加标记以按节对呈现代码进行分组,可以极大地帮助您确定呈现代码的哪些部分比较昂贵,特别是对于复杂的应用程序。以下是如何将标记插入应用程序的示例:

康普特 < ID3DUserDefinedAnnotation用户定义说明 >佩尔夫;

pPerf->开始事件(L) “绘制城市” );

mu city->Render(mu d3dContext.Get(), );

pPerf->EndEvent();

3.查看事件列表,我们可以看出“Draw city”在GPU上渲染大约需要14毫秒。比较一下CPU从哪里开始的“画城市”和它从哪里开始的“画雨”在下面的两个截图上的CPU3车道上,他们非常接近对方。这表明CPU很快就完成了“画城市”和开始“画雨”了。但从“拉雨”开始的地方到CPU3车道的街区尽头,CPU花了将近12毫秒来准备雨滴的数据。

图片[7]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

图片[8]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

4.在这一点上,我们可以看出有一个CPU限制的问题,因为GPU是在等待CPU来处理雨滴的数据,这是昂贵的。看看CPU核心通道,我们发现这个应用程序一次只使用一个核心,其他三个CPU核心是免费的。

现在我们知道存在CPU受限的问题,让我们通过返回主视图并选择 CPU使用率 选项卡(幸好我们在启动时打开了CPU使用率收集!)。在这里,我们可以深入到调用树中,看看哪些函数使用了最多的CPU。在本例中,SkinnableModel::CommitUpdates发出的stl调用消耗了所选CPU时间的66.31%。我们可以右击函数并单击 查看源 在编辑器中打开此函数。

图片[9]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

在CommitUpdates函数中,我们看到stl被以下代码调用:

对于 ( 汽车 iter=m_pendingInstances.begin();iter!=m_pendingInstances.end();iter++)

{

instanceList[instanceIndex++]=*iter;

}

在这一点上,我们知道这是我们的应用程序的瓶颈。这个for循环迭代5000次,为每个雨滴准备数据。我们可以通过并行化任务来利用这台机器上的所有四个CPU核来加快这一速度。实现这一点的一种方法是将for循环转换为并行的u for(在这种情况下,每个u将执行相同的技巧) J ).

(0,size,[&,size]的并行u( 内景 实例索引 )

{

实例列表[ 实例索引 ++]=*iter++;

});

现在再次运行应用程序。呜呼!FPS上升到60FPS,这是“之后”的图表,显示GPU正在命中每一个Vsync,并且所有的四个CPU核心都被利用。

图片[10]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

图片[11]-Visual Studio 2013 Update 4 CTP1中的GPU使用工具-yiteyi-C++库

摘要

在这篇博文中,我们介绍了如何使用GPU使用工具。这个工具有用吗?你认为它怎么样?如果你还没有,请 下载Visual Studio 2013更新4 CTP1 ,试试看,让我们知道! J

GPU使用文档.pdf

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享