计算着色器和Cuda之间的映射

时间:2014-01-10 16:20:07

标签: opengl cuda opencl shader compute-shader

我试图了解计算机着色器和Cuda之间的差异以及它们的运作方式。我只使用过Cuda,据我所知:

在基于着色器的计算中,着色器的数量等于像素的数量,而在Cuda中,我们可以使用内核 - 线程来操作多个“像素数据元素”。

在Cuda,我们有各种内存类型,我们可以从中获取数据(全局,共享,常量,纹理),但在基于着色器的计算中会发生什么?是否有不同的内存类型以及计算如何映射到图形(内核,输入,输出)?在计算着色器中是否真的没有进程之间的通信(比如Cuda中的共享内存和同步)?计算着色器内核还有其他限制吗?

1 个答案:

答案 0 :(得分:1)

它们具有相同的通用性,真正的区别在于计算着色器是图形API(如OpenGL和Direct3D)的扩展。计算着色器允许您绕过正常的可编程图形管道(例如顶点 - >曲面细分 - > geomtery->片段)并访问主机GPU的基础计算能力,而无需将算法在某处进入上述管道。绝对存在计算着色器中工作组中的调用之间的共享内存/同步。

另外,我不知道“像素”这个概念来自哪里。创建计算着色器的重点是从仅适用于实际图形管道(例如顶点,片段/像素)的构造中解除开发,并将所有内容都删除到通用目的(因此术语 GPGPU )计算/记忆功能。当然,当使用D3D / OpenGL计算着色器而不是像OpenCL或CUDA这样的专用API时,通常会完成与渲染相关的事情,但这绝不是必需的。

要将所有这些放入更正式的上下文中,请考虑GLSL规范如何引入计算处理器。取而代之的关键是它们是一种新型着色器,但 不是 是图形管道中的一个新阶段 - 它们本身就存在。


GLSL 4.4 Spec - 2.6 Compute Processor - pp.8

  

计算处理器

     
    

计算处理器是一个可编程单元,可以从其他着色器中独立运行     处理器。

         

[...]

         

计算着色器可以访问许多与片段和其他着色器处理器相同的资源,包括纹理,缓冲区,图像变量和原子计数器。它没有任何预定义输入,也没有任何固定功能输出。它不是图形管道的一部分,其可见的副作用是通过更改图像,存储缓冲区和原子计数器。

         

计算着色器对称为工作组的一组工作项进行操作。工作组是着色器调用的集​​合,可以并行执行相同的代码。工作组内的调用可以通过共享变量与同一工作组的其他成员共享数据,并发出内存和控制障碍以与同一工作组的其他成员同步。