繁体   English   中英

如何测量从计算着色器到渲染着色器的GPU上下文切换

[英]How to measure a GPU Context Switch from Compute to Rendering Shader

在OpenGL中,我派遣计算着色器以基于运动方程式计算给定对象模型中的新顶点位置。 然后,我通过顶点/片段渲染着色器程序来渲染这些新的顶点位置。 我的理解是,每当我调度计算着色器时,它都会启动需要有限时间的GPU设备上下文切换。

有人可以分享在OpenGL中如何测量计算着色器和渲染着色器之间的上下文切换。 我以为这是很少的时间,但是我需要测量一下。 感谢您的见解。

无法专门测量上下文切换时间。 您只能测量特定OpenGL命令之间的时间(通过计时器查询),并且没有执行上下文切换的OpenGL命令。 它是您发送的实际OpenGL命令的副产品。

您可以得到的最接近的是这样的:

glBindVertexArray(emptyVAO);
glEnable(GL_RASTERIZER_DISCARD); //Do the absolute minimal rendering.
glBindProgramPipeline(minimalComputeTask); //Compute shader that does nothing, using no resources and writing no values.
glDispatchCompute(1, 1, 1); //Done before the timer query, to force a switch to compute contexts.
glBeginQuery(GL_TIME_ELAPSED​, queryObject);
glDispatchCompute(1, 1, 1);
glBindProgramPipeline(minimalRenderShaders); //VS does nothing and takes no inputs; no FS at all, since we're discarding.
glDrawArrays(GL_POINTS, 0, 1);
glEndQuery(GL_TIME_ELAPSED);
glDisable(GL_RASTERIZER_DISCARD);

然后,您提取查询并读取时间。 但这甚至还包括实际执行计算和渲染操作所花费的时间。 并且在您的情况下,您的时间可能应该包括glMemoryBarrier ,它将允许渲染操作读取计算着色器编写的内容。

假设您的GL实现有意义地支持 计时器查询,则计时器查询听起来应该可以工作:

计时器查询是查询类型GL_TIMESTAMP和GL_TIME_ELAPSED的集合名称。 这些用于测量各种操作的GPU时序。 返回的所有时间均以纳秒为单位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM