有哪些特性使OpenCL在计算时比使用OpenGL的GLSL更具独到之处?尽管有图形相关的术语和不切实际的数据类型,但对OpenGL有什么真正的警告吗?
例如,并行函数计算可以通过使用其他纹理渲染到纹理来完成。减少操作可以通过迭代渲染到越来越小的纹理来完成。另一方面,随机写访问不可能以任何有效的方式(唯一的方法是通过纹理驱动的顶点数据渲染三角形)。使用OpenCL可以做到这一点吗?对于OpenGL,还有什么是不可能的?
发布于 2014-07-01 13:02:09
到目前为止,在任何答案中都没有提到的是执行速度。
如果
您的算法可以用OpenGL图形表示(例如,没有零散的写入、没有本地内存、没有工作组等)。它的运行速度通常会比OpenCL的对等物更快。我在这方面的特殊经验是在AMD、nVidia、IMG和高通GPU上做过图像过滤(聚集)内核。即使在核心OpenCL内核优化之后,OpenGL实现也总是运行得更快。(旁白:我怀疑这是由于多年来专门针对面向图形的工作负载而调整的硬件和驱动程序。)
我的建议是如果你的计算机程序
感觉
像它很好地映射到图形域,然后使用OpenGL。如果不是,则OpenCL更通用且更易于表达计算问题。
另一点需要提及(或询问)的是,你是作为一个业余爱好者(例如,为你自己)还是商业(即,为了分发给他人)来写作的。虽然几乎所有地方都支持OpenGL,但OpenCL在移动设备上完全缺乏支持,而且在未来几年内极不可能出现在安卓或iOS上。如果从单一代码库获得广泛的跨平台兼容性是一个目标,那么OpenGL可能会强加于您。
发布于 2011-10-26 19:08:01
OpenCL是专门为计算而创建的。当你使用OpenGL进行科学计算时,你总是必须考虑如何将你的计算问题映射到图形环境中(例如,谈论纹理和几何图元,如三角形等)。为了让你的计算进行下去。
在OpenCL中,您只需在内存缓冲区上使用计算内核来制定计算公式,就可以进行计算了。这实际上是一个巨大的胜利(从思考和实现这两种变体的角度来看)。
虽然内存访问模式是相同的(您的计算仍然在GPU上进行-但GPU现在变得越来越灵活)。
但是,除了使用十几个并行的“CPU”而不打破你的头脑--例如(愚蠢的例子)傅立叶变换为三角形和四边形之外,你还能期待什么呢?
发布于 2011-10-27 00:10:10
有哪些特性使OpenCL在计算时比使用OpenGL的GLSL更具独到之处?尽管有图形相关的术语和不切实际的数据类型,但对OpenGL有什么真正的警告吗?
是:它是一个图形API。因此,您在其中所做的一切都必须按照这些术语来制定。你必须将你的数据打包成某种形式的“渲染”。您必须弄清楚如何处理属性、统一缓冲区和纹理方面的数据。
使用OpenGL 4.3和OpenGL ES 3.1
计算着色器,事情变得有点混乱。计算着色器能够通过SSBO/图像加载/存储以类似于OpenCL计算操作的方式访问内存(尽管OpenCL提供实际指针,而GLSL不提供)。它们与OpenGL的互操作也比OpenCL/GL互操作快得多。
即使如此,计算着色器也不会改变一个事实: OpenCL计算操作在非常与OpenGL的计算着色器的精度不同。GLSL的浮点精度要求不是很严格,而OpenGL ES的要求甚至更低。因此,如果浮点精度对您的计算很重要,那么OpenGL将不是计算您需要计算的内容的最有效方法。
此外,OpenGL计算着色器需要支持4.x的硬件,而OpenCL可以在更差的硬件上运行。
此外,如果你通过选择渲染管道来进行计算,OpenGL驱动程序仍然会假设你正在进行渲染。因此,它将根据这一假设做出优化决策。它将优化着色器资源的分配,假设您正在绘制一幅图片。
例如,如果要渲染到浮点帧缓冲区,驱动程序可能会决定为您提供一个R11_
G11_B10帧缓冲区,因为它检测到您没有对alpha做任何操作,并且您的算法可以容忍较低的精度。如果您使用图像加载/存储
然而,与帧缓冲区不同,您获得此效果的可能性要小得多。
OpenCL不是一个图形应用程序接口;它是一个计算应用程序接口。
此外,OpenCL还可以让你访问更多的东西。它使您可以访问与GL相关的隐式内存级别。某些内存可以在线程之间共享,但GL中的单独着色器实例无法直接影响彼此(在图像加载/存储之外,但OpenCL运行在没有访问权限的硬件上)。
OpenGL将硬件所做的事情隐藏在抽象后面。OpenCL使您几乎完全了解所发生的事情。
你可以使用OpenGL进行任意计算。但你没有想要当有一个完全可行的替代方案时,就不会了。OpenGL中的计算服务于图形流水线。仅限
为任何类型的非渲染计算操作选择OpenGL的原因是为了支持不能运行OpenCL的硬件。目前,这包括很多移动硬件。
https://stackoverflow.com/questions/7907510
复制相似问题