我正在使用GLSL片段着色器进行GPGPU计算(我有我的理由)。
在nSight中,我看到我每帧都要做1600次抽调。
可能存在3个瓶颈:
我如何找到它是哪一个?
如果我的算法很简单(例如高斯模糊或其他东西),我可以强制每个drawcall的视口为1x1,并且根据速度变化,我可以排除填充问题。
但就我而言,这需要更改整个算法。
由于您提到了Nvidia NSight工具,您可以尝试按照以下Nvidia博客文章中介绍的步骤进行操作。
它解释了如何阅读和理解硬件性能计数器以解释性能瓶颈。
用于优化任何GPU工作负载的峰值性能百分比分析方法:
https://devblogs.nvidia.com/the-peak-performance-analysis-method-for-optimizing-any-gpu-workload/
而不是找到一个,改变计算方式。
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,那么
要找到实际原因,请根据您的芯片组和操作系统更好地使用GPU和GPU分析器。