Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance OpenGL:这里还有什么瓶颈?_Performance_Opengl_Profiling_Gpu - Fatal编程技术网

Performance OpenGL:这里还有什么瓶颈?

Performance OpenGL:这里还有什么瓶颈?,performance,opengl,profiling,gpu,Performance,Opengl,Profiling,Gpu,我优化了我们的立体声应用程序,将几乎所有的几何图形(大约1600个绘制调用)批处理成单个绘制调用(每只眼睛),使其成为GPU绑定。现在我们已经绑定了GPU,我想知道如何提高这个单一渲染调用的GPU性能,但是,很难找到瓶颈 在所有屏幕截图中,有问题的渲染调用都是ID为91和154的渲染调用 按原样渲染场景并使用Nvidia的NSIGHT分析帧(我在Nvidia Geforce GTX 980上渲染),我得到以下帧计时(注意:1和3是感兴趣的): 这些渲染调用每次大约需要5毫秒 框架探查器显示以下瓶

我优化了我们的立体声应用程序,将几乎所有的几何图形(大约1600个绘制调用)批处理成单个绘制调用(每只眼睛),使其成为GPU绑定。现在我们已经绑定了GPU,我想知道如何提高这个单一渲染调用的GPU性能,但是,很难找到瓶颈

在所有屏幕截图中,有问题的渲染调用都是ID为91和154的渲染调用

按原样渲染场景并使用Nvidia的NSIGHT分析帧(我在Nvidia Geforce GTX 980上渲染),我得到以下帧计时(注意:1和3是感兴趣的): 这些渲染调用每次大约需要5毫秒

框架探查器显示以下瓶颈百分比: 使用相应的着色器类型:

这似乎暗示片段着色器是渲染调用的瓶颈。虽然我们使用的片段着色器相当复杂,但我希望受到几何体的限制(draw调用渲染一个包含约60万个三角形的索引三角形列表)

看到这些结果,我将像素着色器替换为只输出插值顶点法线的着色器。使用简单片段着色器,帧探查器报告渲染调用没有明显的瓶颈,但是,仍然需要相同的时间。 (以下屏幕截图使用用于渲染的简化片段着色器进行分析):

因此,使用更简单的版本替换片段着色器后,着色器阶段不再显示为瓶颈,但渲染调用在GPU上仍需要相同的时间还有什么可能是渲染调用的瓶颈?

为了进一步了解,这里是用于分析框架的硬件计数器 使用复杂片段着色器: 使用简单片段着色器:

我还尝试降低屏幕分辨率(两个维度的大小各为一半),这两种方法都没有导致更快的渲染调用


有没有办法进一步确定为什么这些渲染调用不会在GPU上花费更少的时间?

我首先要研究的是内存布局。这里有一个相当大的IBO,并且根据内部索引的顺序,您可能会花费大量时间处理顶点缓存未命中。更简单的方法是避免使用IBO并使用完整的三角形规范——更多的数据和内存使用这种方式,但它对缓存友好,您可以从论文的基准测试中看到,在没有对IBO进行适当排序以提高顶点缓存效率的情况下,不使用索引通常会更快,另一个更简单的方法是使用更小的VBOs/IBOs并使用更多的渲染调用。这里最好是缓存友好型的,而不是以牺牲最小的调用次数为代价,因此,如果您不想麻烦对它们进行局部性排序,较小的VBO/IBO可以提供帮助。这并不像制作一个大型IBO/VBO并让GPU运行得更快那么简单——数据需要以一种缓存友好的方式进行排列,以使其真正快速运行,否则制作更大的VBO/IBO可能弊大于利。你确定只输出插值法线吗?在“简单片段着色器”(simple fragment shader)案例中,有大量纹理获取。这些是来自顶点着色器吗?非常感谢您的输入!您是对的,仍然有一个纹理提取,但是移除它不会改变draw调用持续时间。索引已经进行了缓存优化-而且,如果更好的变换后缓存利用率可以加快绘制调用,这难道不意味着着色器阶段(尤其是顶点着色器)应该显示为渲染调用的瓶颈吗?