0

我试图了解计算机着色器和 Cuda 之间的区别以及它们的操作方式。我只使用过 Cuda,据我了解:

在基于着色器的计算中,着色器的数量等于像素的数量,而在 Cuda 中,我们可以拥有对多个“像素数据元素”进行操作的内核线程。

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

4

1 回答 1

1

它们具有相同的通用目的,真正的区别在于计算着色器是图形 API 的扩展,例如 OpenGL 和 Direct3D。计算着色器允许您绕过正常的可编程图形管道(例如顶点->镶嵌->几何->片段)并访问主机 GPU 的底层计算能力,而无需将您的算法硬塞到上述管道中的某个地方。计算着色器中工作组中的调用之间绝对存在共享内存/同步。

另外,我不知道“像素”这个概念是从哪里来的。创建计算着色器的全部目的是减轻仅适用于实际图形管道(例如顶点、片段/像素)的构造的开发负担,并将所有内容剥离为通用(因此称为GPGPU)计算/内存功能。诚然,当使用 D3D/OpenGL 计算着色器而不是 OpenCL 或 CUDA 等专用 API 时,通常是为了完成与渲染相关的事情,但这绝不是必需的。

要将所有这些放在更正式的上下文中,请考虑 GLSL 规范如何引入计算处理器。摆脱这一点的关键是它们是一种新型着色器,但不是图形管道中的一个新阶段——它们是独立存在的。


GLSL 4.4 规范- 2.6 计算处理器 - 第 8 页

计算处理器

计算处理器是独立于其他着色器处理器运行的可编程单元。

[...]

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

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

于 2014-01-10T22:26:43.210 回答