我正在使用GLSL片段着色器进行GPGPU计算(有我的理由)。
在nSight中,我看到每帧正在进行1600次绘画调用。
可能存在3个瓶颈:
如何找到它?
如果我的算法很简单(例如高斯模糊等),则可以强制将每个绘制调用的视口设为1x1,并根据速度变化来排除填充率问题。
但是,就我而言,这需要更改整个算法。
答案 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,那么
要找到实际原因,请根据您的芯片组和操作系统更好地使用GPU和GPU分析器。