【问题标题】:How does GPU programming differ from usage of the graphics card in games?GPU 编程与游戏中显卡的使用有何不同?
【发布时间】:2013-08-04 00:38:40
【问题描述】:

进行 GPU 编程的一种方法是 OpenCL,它适用于并行化的数字运算操作。

现在想想您最喜欢的 3D PC 游戏。当屏幕渲染时,发生了什么?开发人员是手工制作了 OpenCL 内核(或类似的内核),还是在显卡中使用了预编程的功能?

抱歉,这听起来像是一个家庭作业问题,我想不出更好的方法来问它。

【问题讨论】:

标签: graphics gpu


【解决方案1】:

当您运行游戏时,您的 GPU 上可能会运行两个不同的系统:

  • OpenGL 将图像渲染到您的屏幕(图形)
  • OpenCL 执行通用计算任务(计算)

OpenGL 使用着色器进行编程。 OpenCL 是用内核编程的。

如果您想更详细地了解游戏如何在 GPU 上运行,我建议您阅读有关 OpenCL、OpenGL 和游戏引擎架构的信息。

【讨论】:

    【解决方案2】:

    好吧,所以,我将根据历史来回答这个问题。希望这可以很好地概述情况并让您决定如何继续。

    图形管道

    3D 图形具有几乎固定不变的计算流程。你从你的变换矩阵开始,你乘以你的顶点位置(可能会产生更多的动态),找出你的像素应该被着色,然后吐出结果。这是 3D 图形的(过于简单化的)要点。要更改其中的任何内容,您只需使用“着色器”稍微调整管道的一个方面,即具有定义输入和输出的小可编程元素,以便它们可以插入管道。

    早期的 GPGPU

    当 GPGPU 仍处于起步阶段时,人们获得 GPU 大规模并行能力的唯一方法是通过图形着色器。例如,有片段着色器,基本上会计算屏幕的每个像素应该是什么颜色(我在这里有点过于简单化了,但他们就是这样做的)。

    因此,例如,您可以使用顶点着色器来处理有关屏幕的数据,然后通过利用颜色混合减少片段着色器中的一堆值(有效地将数学问题空间转换为...好吧,色彩空间)。

    其要点是旧的 GPGPU 东西在 3D 图形的范围内工作,使用与 3D 图形管道的其余部分相同的“显卡中的预编程功能”。

    阅读、写作和思考都很痛苦(或者至少,我发现它很痛苦以至于我被劝阻了)。

    CUDA 和 OpenCL 以及 [所有其他不太流行的 GPGPU 解决方案]

    然后一些人走过来说,“哇,这有点愚蠢 - 当我们想要进行更一般的计算时,我们被困在图形管道中!”

    因此 GPGPU 摆脱了图形管道的限制,现在我们有了 OpenCL 和 CUDA 以及 Brook 和 HSA……嗯,你明白了。

    tl;博士

    GPGPU 内核和 3D 图形内核之间的区别在于,后者被困在带有(方便)约束的管道中,而前者的要求要宽松得多,管道由用户定义,结果不要必须附加到显示器上(尽管如果你是那样的受虐狂,它们可以是)。

    【讨论】:

    • 所以理论上我可以只使用内核来编写 3D 游戏?
    • 假设您允许自己从 CPU 端调用几个调用来设置对内核的调用,理论上您可以……但这将是一种自虐的努力——您将牺牲所有OpenGL 等工具包提供的常用帧/像素/矢量/等缓冲区抽象(以​​及其他有用方面)的便利性。我也相当肯定,与仅使用供应商支持的工具包相比,您的代码往往会更慢、更笨重、更复杂。
    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多