我知道 OpenCL 可以控制 GPU 的内存架构,因此可以进行更好的优化,但是,抛开这一点,我们可以使用计算着色器进行矢量运算(加法、乘法、求逆等)吗?
2 回答
与其他 OpenGL 着色器类型相比,计算着色器与计算机图形没有直接关系,并且提供了更直接的底层硬件抽象,类似于 CUDA 和 OpenCL。它提供了可定制的工作组大小、共享内存、组内同步以及所有来自 CUDA 和 OpenCL 的已知和喜爱的东西。
主要区别基本上是:
- 它使用 GLSL 而不是 OpenCL C。虽然这些编程语言之间没有太大的区别,但是您可以使用 OpenCL 不可用的所有与图形相关的 GLSL 功能,例如高级纹理类型(例如立方体贴图数组)、高级过滤(例如 mipmapping,好吧,你可能需要自己计算 mip 级别),以及 4x4 矩阵或几何函数之类的小便利。
- 它是一个与任何其他 GLSL 着色器一样的 OpenGL 着色器程序。这意味着访问 OpenGL 数据(如缓冲区、纹理、图像)是微不足道的,而 OpenGL 和 OpenCL/CUDA 之间的接口可能会变得乏味,您可能需要手动进行同步工作。同样,将其集成到现有的 OpenGL 工作流程中也是微不足道的,而设置 OpenCL 本身就是一本书,更不用说将其集成到现有的图形管道中。
所以这归结为,计算着色器确实适用于现有的 OpenGL 应用程序,尽管与其他着色器的图形方法相比,它展示了 GPU 编程的常用(OpenCL/CUDA 类)计算方法阶段,它不具有 OpenCL/CUDA 的计算灵活性(当然,同时提供其他优势)。因此,执行计算任务比将它们压缩到其他不适用于通用计算的着色器阶段或引入必须与之同步的额外计算框架更灵活、直接和容易。
Compute shaders should be able to do nearly anything achievable with OpenCL with the same flexibility and control over hardware resources and with the same programming approach. So if you have a good GPU-suitable algorithm (that would work well with CUDA or OpenCL) for the task you want to do, then yes, you can also do it with compute shaders, too. But it wouldn't make that much sense to use OpenGL (which still is and will probably always be a framework for real-time computer graphics in the first place) only because of compute shaders. For this you can just use OpenCL or CUDA. The real strength of compute shaders comes into play when mixing graphics and compute capabilities.
在这里寻找另一个视角。总结:
是的,OpenCL 已经存在,但它针对的是重量级应用程序(想想 CFD、FEM 等),而且它比 OpenGL更通用(想想 GPU 之外......英特尔的 Xeon Phi 架构支持超过 50 个 x86 内核)。
此外,在 OpenGL/CUDA 和 OpenCL 之间共享缓冲区并不好玩。