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

时间:2019-04-26 13:35:54

标签: performance opengl gpgpu

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

在nSight中,我看到每帧正在进行1600次绘画调用。

可能存在3个瓶颈:

  • 填写
  • 只是太多的电话会议
  • GPU由于我的GPU-> CPU下载和CPU-> GPU上传而停滞

如何找到它?

如果我的算法很简单(例如高斯模糊等),则可以强制将每个绘制调用的视口设为1x1,并根据速度变化来排除填充率问题。

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

2 个答案:

答案 0 :(得分:1)

由于您提到的是Nvidia NSight工具,因此您可以尝试遵循以下Nvidia博客文章中介绍的过程。

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

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

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

答案 1 :(得分: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调用吗?这可能是确定的原因之一。您可以在FBO上绘制一些内容以使用GPU计算它们。那是Computer Shader和Fragment Shader之间的最大区别。绘图调用始终会降低程序速度,但会降低计算机着色器的速度。

  

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

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

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

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