OpenCL和OpenGL的计算着色器有什么区别?

67

我知道OpenCL可以控制GPU的内存架构,从而实现更好的优化,但是,不考虑这一点,我们能否使用计算着色器进行向量运算(加法、乘法、倒置等)?

2个回答

71
与其他OpenGL着色器类型不同,计算着色器与计算机图形无直接关系,并提供更直接的底层硬件抽象,类似于CUDA和OpenCL。它提供可定制的工作组大小、共享内存、组内同步以及所有来自CUDA和OpenCL的已知和喜爱的功能。
其主要区别在于:
- 它使用GLSL而非OpenCL C。虽然这两种编程语言之间没有如此巨大的差异,但您可以使用所有与图形相关的GLSL函数(OpenCL不可用),例如高级纹理类型(例如立方图数组)、高级过滤(例如mipmap,好吧,您可能需要自己计算mip级别)以及像4x4矩阵或几何函数这样的小便利。 - 它是像GLSL着色器程序那样的OpenGL着色器程序。这意味着访问OpenGL数据(如缓冲区、纹理、图像)仅仅是微不足道的,而在OpenGL和OpenCL/CUDA之间进行交互可能会变得繁琐,您可能需要进行手动同步。同样将其集成到现有的OpenGL工作流中也是微不足道的,而设置OpenCL则需要一本书,更不要说将其集成到现有图形管道中了。
因此,计算着色器确实旨在用于现有的OpenGL应用程序中,虽然它表现出通常(类似于OpenCL/CUDA)的GPU编程计算方法,与其他着色器阶段的图形方法相对不同,后者没有OpenCL/CUDA的灵活性(当然也提供其他优点)。因此,执行计算任务比将其挤入不适用于通用计算的其他着色器阶段或引入必须与之同步的另一个计算框架更加灵活、直接和容易。

计算着色器应该能够以与OpenCL相同的灵活性和对硬件资源的控制,以及相同的编程方法做到几乎任何可以通过OpenCL实现的功能。因此,如果您有一个适合GPU的算法(可以很好地使用CUDA或OpenCL完成任务),那么您也可以使用计算着色器来完成它。但是,仅仅因为有计算着色器并不意味着使用OpenGL(它仍然是并且可能总是首先用于实时计算机图形的框架)有太多意义。对于这一点,您可以使用OpenCL或CUDA。当混合图形和计算能力时,计算着色器的真正优势就发挥出来了。


18
不要忘记 OpenCL 提供的精度保证,而 GLSL 明确没有提供。 - Nicol Bolas
1
是的。浮点精度在这两者之间有很大的不同。 - Nicol Bolas
5
有一些扩展可以提供IEEE精度并禁用操作重新排序。 - Luca
@LennartRolland 这取决于设备/驱动程序。理论上来说,它们应该运行同样快,因为你在同样的硬件上以同样的方式使用它们。然而,如果它们真的被实现和优化了,那么这取决于驱动程序。我承认,我现在并不知道程序大小/复杂性方面是否有更大的差异。虽然其中一个支持一些另一个不支持的功能,但这些是更详细/高级的功能,而答案基本上保持通用。 - Christian Rau
2
对于OpenGL算术精度保证感兴趣的人应该关注ARB_shader_precision扩展,该扩展在OpenGL 4.1中引入。请参见:https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_precision.txt - Droid Coder
显示剩余4条评论

4

点击这里可以看到另一个角度。

总结:

是的,OpenCL已经存在了,但它面向的是重量级应用程序(比如CFD、FEM等),并且比OpenGL更加通用(可以考虑GPU以外的设备...例如Intel的Xeon Phi架构支持超过50个x86核心)。

此外,在OpenGL/CUDA和OpenCL之间共享缓冲区并不容易。


1
实际上,高端GPU在解决可并行化问题时比高端CPU更具有>>40倍的能力,具体来说是在矩阵计算方面。我现在并不太关心CPU的能力。那么回到我的问题,我们可以使用计算着色器进行矩阵求逆吗?相比OpenCL需要多少工作? - Maiss
1
据我所知,仅为稀疏矩阵编写并行算法是足够复杂的,您可能需要使用C99(OpenCL的内核语言)编写它们。 - Rahul Banerjee
2
在OpenGL的计算着色器中,您可以执行许多类型的计算,这与OpenCL类似,主要区别在于OpenGL使用_GLSL_(OpenGL着色语言)作为其内核语言,而不是OpenCL的C99方言。没有限制进行矩阵计算(例如,仅使用稀疏矩阵),在特定情况下,您可能能够使用基于块的矩阵算法,利用GLSL的一些本地矩阵操作。 - radical7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接