【问题标题】:When does the CPU wait on the GPU?CPU 什么时候在 GPU 上等待?
【发布时间】:2009-12-29 01:57:00
【问题描述】:

在一个受 GPU 限制的应用程序中,我想知道 CPU 会在什么时候等待 GPU 完成渲染。 DirectX 和 OpenGL 有区别吗?

运行类似于下面的示例,显然 CPU 并没有跑掉 - 并且查看任务管理器,CPU 使用率(如果它是单核机器)将低于 100%。

While (running){

    Clear ();

    SetBuffers (); // Vertex / Index

    SetTexture ();

    DrawPrimitives ();

    Present ();
}

【问题讨论】:

  • 在不知道您要问什么操作系统的情况下无法回答这个问题
  • 那将是 windows - XP 向上

标签: graphics hardware


【解决方案1】:

简短的总结是,您可能会在 Present() 中看到等待,但这实际上取决于 Present() 调用是什么。

一般来说,除非您明确表示您想知道 GPU 何时完成,否则您最终可能会在(对您而言是随机的)驱动程序的输入缓冲区填满点等待。将 GPU 驱动程序和卡视为一个非常长的管道。您可以在一端投入工作,最终在一段时间后出现在显示器上。您可以在管道填满之前将几帧命令放入管道中。该卡可能会花费大量时间来绘制图元,但您可能会在几帧后看到 CPU 在某个点等待。

如果您的 Present() 调用包含 glFinish() 的等效项,则整个管道必须在该调用返回之前耗尽。因此,CPU 将在那里等待。

希望以下内容对您有所帮助:

Clear ();

导致当前缓冲区中的所有像素改变颜色,所以GPU正在做 工作。查找 GPU 的清晰像素/秒 率,看看这应该花多少时间。

SetBuffers (); 
SetTexture ();

驱动程序可能会在这里做一些工作,但通常它想等到你 实际上做绘图以使用这些新数据。在任何情况下,GPU 都不会 这里很多。

DrawPrimitives ();

现在这里是 GPU 应该做大部分工作的地方。取决于 原始大小将受到顶点/秒或像素/秒的限制。也许你有 一个昂贵的着色器,您将受到着色器指令/秒的限制。

但是,您可能不会将此视为 CPU 正在等待的地方。司机 可能会为您缓冲命令,CPU 可能会继续运行。

Present ();

此时,GPU 工作量很小。它只是更改了一个指针以从不同的缓冲区开始显示。

然而,这可能是 显示 CPU 在 GPU 上等待的地方。根据您的 API,“Present()”可能包含诸如 glFlush() 或 glFinish() 之类的内容。如果是这样,那么您可能会在这里等待。

【讨论】:

    【解决方案2】:

    在 Windows 上,等待位于视频驱动程序中。它们在一定程度上取决于驱动程序的实现,但在很多情况下,等待的需求取决于您使用的 API 的要求(调用是否定义为同步)。

    所以是的,DirectX 和 OpenGL 之间很可能会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多