OpenGL与OpenCL,可以选择和为什么?

时间:2011-10-26 18:57:27

标签: opengl opencl gpgpu

使用GLSL进行计算时,OpenCL可以选择哪些功能优于OpenGL?尽管有与图形相关的术语和实用的数据类型,但是对OpenGL有什么实际的警告吗?

例如,可以通过使用其他纹理渲染纹理来完成并行函数评估。减少操作可以通过迭代渲染到越来越小的纹理来完成。另一方面,无法以任何有效的方式进行随机写访问(唯一的方法是通过纹理驱动的顶点数据渲染三角形)。这可能与OpenCL有关吗? OpenGL还有什么其他方法是不可能的?

11 个答案:

答案 0 :(得分:56)

OpenCL专为计算而创建。当您使用OpenGL进行科学计算时,您总是必须考虑如何将计算问题映射到图形上下文(即根据纹理和三角形等几何图元进行交谈),以便进行计算。

在OpenCL中,您只需使用内存缓冲区上的计算内核来计算您的计算,就可以了。这实际上是一场巨大的胜利(从思考并实施两种变体的角度来看)。

内存访问模式虽然相同(您的计算仍然在GPU上进行 - 但这些天GPU变得越来越灵活。)

但是,除了使用十几个并行“CPU”而不打破如何翻译之外,您还有什么期望? (愚蠢的例子)傅里叶到三角形和四边形......?

答案 1 :(得分:39)

到目前为止,在任何答案中都没有提到的是执行速度。 如果您的算法可以用OpenGL图形表示(例如,没有分散的写入,没有本地存储器,没有工作组等),它通常比OpenCL对应物运行得更快。我对此的具体体验是在AMD,nVidia,IMG和Qualcomm GPU上进行图像过滤(聚集)内核。即使在硬核OpenCL内核优化之后,OpenGL实现也总是运行得更快。 (除此之外:我怀疑这是因为多年的硬件和驱动程序专门针对以图形为导向的工作负载。)

我的建议是,如果您的计算程序感觉就像它很好地映射到图形域,那么使用OpenGL。如果没有,OpenCL更通用,更简单地表达计算问题。

要提及(或要问)的另一点是你是作为业余爱好者(即为自己)或商业(即分发给他人)。虽然OpenGL几乎无处不在,但OpenCL完全缺乏对移动设备的支持,并且imho在未来几年内不太可能出现在Android或iOS上。如果一个代码库的广泛跨平台兼容性是一个目标,那么OpenGL可能会被强加给你。

答案 2 :(得分:22)

  

使用GLSL进行计算时,OpenCL可以选择哪些功能优于OpenGL?尽管有与图形相关的术语和实用的数据类型,但是对OpenGL有什么实际的警告吗?

是的:这是一个图形API。因此,你在其中所做的一切都必须按照这些条款制定。您必须将数据打包为某种形式的“渲染”。您必须弄清楚如何在属性,统一缓冲区和纹理方面处理数据。

使用OpenGL 4.3和OpenGL ES 3.1 compute shaders,事情变得更加混乱。计算着色器能够通过SSBO /图像加载/存储以类似于OpenCL计算操作的方式访问内存(尽管OpenCL提供实际指针,而GLSL不提供)。他们与OpenGL的互操作也比OpenCL / GL互操作快得多。

即便如此,计算着色器也不会改变一个事实:OpenCL计算操作的运行精度与非常的精度不同于OpenGL的计算着色器。 GLSL的浮点精度要求不是很严格,OpenGL ES的要求也不那么严格。因此,如果浮点精度对于计算很重要,那么OpenGL将不是计算计算所需内容的最有效方法。

此外,OpenGL计算着色器需要具有4.x功能的硬件,而OpenCL可以在更低劣的硬件上运行。

此外,如果您通过选择渲染管道进行计算,OpenGL驱动程序仍会假设您正在进行渲染。因此,它将根据该假设做出优化决策。假设您正在绘制图片,它将优化着色器资源的分配。

例如,如果你渲染到浮点帧缓冲区,驱动程序可能只是决定给你一个R11_G11_B10帧缓冲区,因为它检测到你没有对alpha做任何事情,你的算法可以容忍更低的精确。但是,如果您使用image load/store而不是帧缓冲,那么您获得此效果的可能性就会大大降低。

OpenCL不是图形API;它是一个计算API。

此外,OpenCL只允许您访问更多内容。它使您可以访问与GL有关的内存级别。某些内存可以在线程之间共享,但GL中的单独着色器实例无法直接影响彼此(在Image Load / Store之外,但OpenCL在无权访问的硬件上运行)。

OpenGL隐藏了抽象背后硬件的功能。 OpenCL几乎可以让您了解正在发生的事情。

可以使用OpenGL进行任意计算。但你不想要;而不是有一个完全可行的选择。 OpenGL中的计算用于服务图形管道。

选择OpenGL用于任何类型的非呈现计算操作的原因是支持无法运行OpenCL的硬件。目前,这包括许多移动硬件。

答案 3 :(得分:12)

一个值得注意的功能是分散写入,另一个是缺少" Windows 7智能"。正如你可能知道的那样,如果OpenGL没有冲洗2秒左右就会杀死显示驱动程序(请不要在准确的时间内确定我,但我认为它是2秒)。如果您进行冗长的操作,这可能会很烦人。

此外,OpenCL显然可以使用比图形卡更多种类的硬件,并且它没有一个严格的面向图形的管道,并且具有人工限制"。运行多个并发命令流也更容易(微不足道)。

答案 4 :(得分:9)

虽然目前OpenGL对于图形来说是更好的选择,但这不是永久性的。

OpenGL最终可以合并为OpenCL的扩展。这两个平台的大约80%相同,但是具有不同的语法怪癖,对于大致相同的硬件组件有不同的命名法。这意味着要学习两种语言,要弄清楚两种API。图形驱动程序开发人员更喜欢合并,因为他们不再需要为两个单独的平台开发。这为驱动程序调试留下了更多的时间和资源。 ;)

另一件需要考虑的事情是,OpenGL和OpenCL的起源不同:OpenGL在网络早期的固定管道开始时就开始并获得了动力,随着技术的发展,它逐渐被附加和弃用。 OpenGL在某种程度上是OpenGL的演变,因为OpenGL开始用于数字处理,因为GPU的(计划外)灵活性允许这样做。 “图形与计算”实际上更像是一种语义论证。在这两种情况下,您总是尝试将数学运算映射到具有最高性能的硬件。有些部分GPU硬件不会使用vanilla CL,但这样做不会保留单独的扩展。

那么OpenGL如何在CL下工作呢?推测性地,三角形光栅化器可以作为特殊的CL任务排队。特殊的GLSL函数可以在vanilla OpenCL中实现,然后在内核编译期间被驱动程序覆盖为硬件加速指令。在OpenCL中编写着色器,等待提供库扩展,听起来并不是一种痛苦的经历。

召唤一个拥有比另一个更多的功能没有多大意义,因为他们都获得80%相同的功能,只是在不同的命名法下。声称OpenCL对图形不利,因为它专为计算而设计没有意义,因为图形处理计算。

答案 5 :(得分:6)

另一个主要原因是OpenGL \ GLSL仅支持显卡。尽管多核使用始于使用图形硬件,但许多硬件供应商正致力于计算多核硬件平台。例如,请参阅英特尔骑士角。

使用OpenGL \ GLSL开发计算代码将阻止您使用任何非图形卡的硬件。

答案 6 :(得分:4)

从OpenGL 4.5开始,这些是OpenCL 2.0的功能,OpenGL 4.5没有(据我所知)(这不包括OpenGL没有的功能):

活动

更好的原子学

工作组功能:                 work_group_all和work_group_any                 work_group_broadcast:                 work_group_reduce                 work_group_inclusive / exclusive_scan

从内核中排队内核

指针(尽管如果你在GPU上执行这可能并不重要)

OpenGL没有的一些数学函数(尽管你可以在OpenGL中自己构建它们)

共享虚拟内存

(更多)内核的编译器选项

轻松选择特定的GPU(或其他)

无GPU时可以在CPU上运行

对这些利基硬件平台(例如FGPA)的更多支持

在某些(所有?)平台上,您不需要窗口(及其上下文绑定)来进行计算。

OpenCL允许对计算精度进行更多控制(包括一些通过这些编译器选项)。

上面的很多内容主要是为了更好的CPU - GPU交互:事件,共享虚拟内存,指针(虽然这些也可能有益于其他东西)。

OpenGL已经获得了将事物分类到客户端和服务器内存的不同区域的能力,因为此处已经发布了很多其他帖子。 OpenGL现在具有更好的内存屏障和原子支持,并允许您将内容分配到GPU内的不同寄存器(OpenCL可以达到相同的程度)。例如,您现在可以在OpenGL中共享本地计算组中的寄存器(使用类似AMD GPU LDS(本地数据共享)的东西(尽管此特定功能目前仅适用于OpenGL计算着色器)。 OpenGL在某些平台上具有更强大的性能实现(例如开源Linux驱动程序)。 OpenGL可以访问更多固定功能的硬件(就像其他答案所说)。虽然有时可以避免固定功能硬件(例如Crytek使用深度缓冲器的“软件”实现),但固定功能硬件可以很好地管理内存(并且通常比没有为GPU工作的人更好)硬件公司可以)并且在大多数情况下是非常优越的。我必须承认OpenCL具有非常好的固定功能纹理支持,这是OpenGL的主要固定功能区域之一。

我认为英特尔骑士角是一个控制自己的x86 GPU。 我还认为OpenCL 2.0及其纹理功能(实际上是OpenCL的较小版本)可以用于与user2746401建议的性能相同的程度。

答案 7 :(得分:3)

OpenCL(在2.0版本中)描述了异构计算环境,其中系统的每个组件都可以生成&消耗由其他系统组件生成的任务。不再需要更多的CPU,GPU(等)概念 - 你只需要Host&设备(多个)。

相反,OpenGL对CPU有严格的划分,CPU是任务生产者& GPU,任务消费者。这并不错,因为灵活性较低可确保更高的性能。 OpenGL只是更窄范围的工具。

答案 8 :(得分:2)

除了现有的答案之外,OpenCL / CUDA不仅更适合计算领域,而且不会过多地抽象出底层硬件。通过这种方式,您可以更直接地从共享内存或合并内存访问等内容中获利,否则这将在着色器的实际实现中被隐藏(如果您愿意,它本身只是一个特殊的OpenCL / CUDA内核)。 p>

虽然要从这些东西中获利,你还需要更多地了解你的内核将运行的特定硬件,但不要试图使用着色器明确地考虑这些事情(如果完全可能的话)。

一旦你做了比简单的1级BLAS例程更复杂的事情,你一定会欣赏OpenCL / CUDA的灵活性和通用性。

答案 9 :(得分:2)

OpenCL专为通用计算而设计的“功能”,而OpenGL则用于图形。你可以在GL中做任何事情(它是图灵完成的),但是你用螺丝刀的把手作为锤子在钉子上行驶。

此外,OpenCL不仅可以在GPU上运行,还可以在CPU和各种专用加速器上运行。

答案 10 :(得分:0)

一个想法是用这两种方式编写程序并根据您的优先级对其进行测试。

例如:如果您正在处理图像管道,那么您在 openGL 或 openCL 中的实现可能比其他更快。

祝你好运。