【问题标题】:What is the point of GLSL when there is OpenCL?当有 OpenCL 时,GLSL 的意义何在?
【发布时间】:2010-09-10 21:24:34
【问题描述】:

考虑一下标题中问题的完整形式:由于 OpenCL 可能是未来严重 GPU 编程的通用标准(在其他设备编程中),为什么不为 OpenGL 编程 - 以一种面向未来的方式 -利用 OpenCL 上的所有 GPU 操作?这样您就可以享受 GLSL 的优势,而不受其编程限制。

【问题讨论】:

  • 这有点像问“有了 Chrome,Safari 的意义何在?” :P
  • 重点是OpenCL不仅仅是GLSL的一个变种;它在编程上更丰富,在管理上也更强大。
  • OpenGL 4.3 管道中仍有大量固定功能,可编程性仅涉及在该管道上连接在一起的特定着色器。 OpenCL 将允许在程序代码中表达整个功能,但是——我猜——这里的问题真的变成了:那样会更慢吗?

标签: opengl graphics glsl opencl gpgpu


【解决方案1】:

GLSL 是OpenGL Shading Language。它最初旨在用于控制图形管道。

另一方面,OpenCL 是Open Computing Language。它不控制图形,而是控制计算。

这两种技术针对不同的能力和功能。

话虽如此,展望未来,他们可能很少有理由将 GLSL 用于计算目的。然而,截至今天,比 OpenCL 更多的供应商完全支持 GLSL,因此它仍然可用于计算目的,尽管它受到限制,因为这不是它的核心目的,至少现在是这样。

【讨论】:

  • 是的,我的意思是在不考虑 GLSL 和 OpenCL 目标的既定目的的情况下,OpenCL 似乎在更强大的界面中赋予了 GLSL 的优势。有没有什么是 OpenCL 不能做的,而 GLSL 能做到,还有什么 OpenCL 会以更糟糕的方式做?
  • @Lela:就纯粹的计算目的而言,目前,唯一真正的优势(据我所知)是部署和供应商支持之一 - GLSL 在野外得到了更好的支持(因此我的最后一段)。否则,对于纯计算,OpenCL 确实比 GLSL IMO 更好。
  • 嗯,是的。我应该更多地强调我提到的“面向未来”。这个问题的主要思想围绕着未来的编程,而大多数迹象表明 OpenCL 将成为广泛支持的标准。
【解决方案2】:

将来 OpenCL 可能会取代 GLSL。与此同时,OpenGL 互操作仍然存在一些问题,至少在最重要的 (NVidia/ATI) 实现中是这样。

不过,OpenCL不会完全取代 OpenGL。 OpenGL 在光栅图形方面做得更多。 OpenCL 中唯一的光栅图形基元是纹理/图像,它根本无法渲染图形。

【讨论】:

  • “无法渲染”是什么意思?据我所知,除了帧缓冲区(在屏幕上显示内容)之外,您可以使用 OpenCL 实现所有 OpenGL 管道。这并不意味着您仍然不能渲染到纹理或可能使用 OpenGL only 来分配随后可以在 OpenCL 中使用的帧缓冲区。
  • 是的,你可以这样做,但它会非常慢。 GPU 具有专用且高度优化的硬件,用于位块化、光栅化、混合、镶嵌和各种其他典型图形操作。 OpenCL 不为此硬件提供任何支持。这就是我的意思。
【解决方案3】:

GLSL 是一种“着色语言”。它用于 3D 渲染,并具有对此特别有用的特殊数据类型(例如长度为 4 的向量和秩为 4x4 的矩阵)。顶点和片段着色器位于渲染管道内定义明确的位置,它们会在流经此管道的数据时自动触发。着色器还可以直接访问 3D 管道的转换和投影矩阵。

OpenCL 是一种“计算语言”。它并不是专门为我们在 3D 渲染中看到的计算任务而设计的,而是 C 的一个子集。OpenCL 确实具有类似于 GLSL 中的向量和矩阵的数据类型(float4、float16),但它们使用起来不太方便。此外,您没有图形上下文(这可能是优点或缺点),并且 OpenCL 内核不驻留在 3D 渲染管道中。

如果您想要插入 3D 渲染管道并由渲染管道触发的计算模块,请使用 GLSL。如果您想在 3D 渲染管道之外的 GPU 上进行一般计算,请使用 OpenCL。

这并不意味着 OpenCL 不能用于渲染 3D 图形。它可以。事实上,您可以只在 OpenCL 中实现自己的管道,然后将您的绘图复制到帧缓冲区。但如果你只是想绘制一些 3D 图形,复制 SGI、Nvidia、Intel 和 AMD 工程师的所有工作可能不值得麻烦。然后更容易使用 GLSL 并将着色器插入到一个即用型且高性能的 OpenGL 管道中。想想看,编写 Mesa(开源 OpenGL 实现)是一项艰巨的任务。

【讨论】:

    【解决方案4】:

    @dietr:让我在这里生态你! CL/GL 互操作性会极大地损害整体性能,特别是在处理大量对象缓冲区(例如>100)时。上下文更改开销和缺乏对缓冲区结构或缓冲区指针的支持只会杀死我的应用程序,因此我正在认真考虑使用几何着色器来替换我的 opencl 代码。并且不要自欺欺人,用 opencl 完全替换整个 opengl 将需要一个完整的重新编码过程,这不仅会很长而且没有那么有利。此外,正如上面的人所说,opengl 所做的不仅仅是管道计算。我想说,如果你打算使用 CL/GL iterop,如果可以的话,试着在顶点/几何着色器上重写你的代码。

    【讨论】:

    • 我认为性能很大程度上取决于你做什么,以及如何做。通常,您不会共享数百个缓冲区,但最多只共享少数几个。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2014-02-24
    • 2023-03-15
    • 2016-11-29
    • 2012-07-14
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    相关资源
    最近更新 更多