【问题标题】:How do I see the GPU's bottleneck in a complex algorithm?如何在复杂算法中看到 GPU 的瓶颈?
【发布时间】:2019-04-26 13:35:53
【问题描述】:

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

在 nSight 中,我看到我每帧执行 1600 个绘制调用。

可能有 3 个瓶颈:

  • 填充率
  • drawcall 太多了
  • 由于我的 GPU->CPU 下载和 CPU->GPU 上传导致 GPU 停止

我如何找到它是哪一个?

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

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

【问题讨论】:

标签: performance opengl gpgpu


【解决方案1】:

由于您提到了 Nvidia NSight 工具,您可以尝试按照以下 Nvidia 博客文章中说明的程序进行操作。

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

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

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

【讨论】:

    【解决方案2】:

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

    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 绘制调用吗?这肯定是原因之一。您可以在 FBO 上绘制一些东西以使用 GPU 计算它们。这是计算机着色器和片段着色器之间的最大区别。绘图调用总是减慢程序,但计算机着色器。

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

    如果你必须以某种方式使用FS,那么

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

    要找到真正的原因,最好根据您的芯片组和操作系统使用 GPU 和 GPU 分析器。

    【讨论】:

    • 谢谢!是的,我的意思是实际的 OpenGL 绘制调用,我绘制到 FBO。您能否指出“计算着色器不会减慢,不像绘制调用”这件事的参考?另外,我不明白“找到存储正在计算的数据的方法”。部分。
    • @StefanMonov 我添加了额外的信息。如果还不清楚,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多