如何在复杂算法中看到GPU的瓶颈?

问题描述 投票:3回答:2

我正在使用GLSL片段着色器进行GPGPU计算(我有我的理由)。

在nSight中,我看到我每帧都要做1600次抽调。

可能存在3个瓶颈:

  • 填充率
  • 太多抽奖活动
  • 由于我的GPU-> CPU下载和CPU-> GPU上传,GPU停止运行

我如何找到它是哪一个?

如果我的算法很简单(例如高斯模糊或其他东西),我可以强制每个drawcall的视口为1x1,并且根据速度变化,我可以排除填充问题。

但就我而言,这需要更改整个算法。

performance opengl gpgpu
2个回答
1
投票

由于您提到了Nvidia NSight工具,您可以尝试按照以下Nvidia博客文章中介绍的步骤进行操作。

它解释了如何阅读和理解硬件性能计数器以解释性能瓶颈。

用于优化任何GPU工作负载的峰值性能百分比分析方法:

https://devblogs.nvidia.com/the-peak-performance-analysis-method-for-optimizing-any-gpu-workload/


0
投票

而不是找到一个,改变计算方式。

I'm using GLSL fragment shaders for GPGPU calculations (I have my reasons). 

我不确定您的OpenGL版本是什么,但使用FS上的计算机着色器将解决问题

In nSight I see that I'm doing 1600 drawcalls per frame.

你的意思是实际的OpenGL drawcalls?冥想是肯定的原因之一。您可以在FBO上绘制一些东西来使用GPU计算它们。这是Computer Shader和Fragment Shader之间的最大区别。绘制调用总是会使程序变慢,但计算机着色器。

用于图像处理的计算着色器的架构优势是它们跳过ROP(渲染输出单元)步骤。即使您不使用,像素着色器的写入很可能会经过所有常规混合硬件。

如果你不得不以某种方式使用FS,那么

  1. 试着找到减少drawcalls。
  2. 找到存储正在计算的数据的方法。这就像使用渲染纹理作为内存一样,如果需要使用RTT更改顶点,则必须将纹理作为位置,速度或任何需要更改顶点或其属性(如法线/颜色)的内容加载。

要找到实际原因,请根据您的芯片组和操作系统更好地使用GPU和GPU分析器。

© www.soinside.com 2019 - 2024. All rights reserved.