现代图形管线有多少使用专用硬件?

6

换句话说,如果有人试图使用GPGPU(CUDA、OpenCL)重新实现OpenGL或DirectX(或类似技术),那么在哪些方面以及为什么会比NVIDIA和AMD卡上的原始实现更慢呢?

我可以看出,顶点/片段/几何/细分着色器可以使用GPGPU制作成漂亮且快速的效果,但如何处理生成要呈现的片段列表、剪辑、纹理采样等等这些问题呢?

我只是出于学术兴趣而提出这个问题。


3
我非常确定现代OpenGL和DirectX会广泛使用你的图形芯片。你具体有什么问题? - Mat
1
当然,他们广泛使用您的图形芯片。 GPGPU(如CUDA和OpenCL)也广泛使用您的图形芯片。但是,“芯片”由具有不同功能的各种部件组成。其中一些部分本质上是可编程的(例如使用顶点着色器或OpenCL)。那么我的问题是,图形管道的哪些部分使用了芯片的其他固定功能部分,这些部分的功能不能使用OpenCL等实现(至少速度相同)?我猜纹理压缩和采样之类的东西就是这种情况的例子,但我不确定。 - DaedalusFall
1
你可能想看一下Fabian Giesen的这个优秀博客系列,以帮助你进一步学习。 - Bart
@Bart:我还没有看到你的链接足够多的内容,以确定它是否是我想知道的,但它绝对很有趣。谢谢。 - DaedalusFall
3个回答

14

现代GPU仍有许多固定功能的硬件是隐藏在计算API背后的。这些包括:混合阶段、三角形光栅化和许多芯片内队列。当然,着色器都可以很好地映射到CUDA/OpenCL--毕竟,着色器和计算语言都使用GPU的相同部分--通用着色器核心。将这些单元想象成一堆非常宽的SIMD CPU(例如,GTX 580具有16个具有32个宽SIMD单元的核心)。

通过着色器可以访问纹理单元,因此没有必要在“计算”中实现它。如果您这样做,性能很可能很差,因为您无法访问空间布局优化的纹理缓存。

不应低估光栅化所需的工作量。这是一个重大问题,如果您将整个GPU都投入其中,您将获得大约25%的光栅硬件性能(见:High-Performance Software Rasterization on GPUs)。这包括混合成本,通常也由固定功能单元完成。

曲面细分也有一个固定功能部分,难以有效地模拟,因为它将输入放大到1:4096,并且您肯定不希望预先保留这么多内存。

此外,由于没有访问帧缓冲区压缩的权限,您会遇到许多性能减少。当您处于计算模式时,“隐藏”了专用硬件,这很难达到与“图形管道”相同的效用比率(例如,它可以根据着色器负载轻松缓冲来自顶点着色器的输出,您无法像它那样灵活地切换着色器)。


不要忘记所有属性上传逻辑。包括从规范化值到浮点数的免费转换,后-T&L缓存等。 - Nicol Bolas
也许更好的方式是将GPU分为可编程和固定功能部分。毕竟,光栅化阶段和着色器单元都是GPU的功能部分。 - datenwolf
那基本上回答了我的问题。我必须承认,我并没有想到三角形光栅化会成为一个问题,感谢提供链接。你说在“计算”中不需要实现纹理单元,但既然不需要在“计算”中做任何事情,为什么要停留在纹理单元之外呢?也许我想编写自己的纹理压缩格式并实现以前未曾听说过的采样技术:)。好的回答,谢谢。 - DaedalusFall
我认为你想要使用CUDA/OpenCL(“计算”),在这里你可以访问硬件纹理单元,但不是所有的部分都可以访问(在计算中执行所有操作的想法是你可以修改任何部分,这肯定很酷;并且只使用公开的硬件。同样的论点也适用于Larrabee,它基本上是计算+纹理单元。) - Anteru
我思考这个问题的原因是最近我买了一张新的AMD显卡,但它的(Linux)驱动程序很糟糕。从我的有限观察来看,NVIDIA和AMD似乎都对GPGPU提供比桌面图形更好(更稳定)的Linux支持。我的想法是是否可以编写一个GL实现来使用暴露的计算能力,这样可以使驱动程序更稳定、更统一(可能需要不使用硬件纹理单元)。当然,即使可能,我也没有必要的知识和时间! - DaedalusFall

1

0
换句话说,如果有人试图使用GPGPU(CUDA、OpenCL)重新实现OpenGL或DirectX(或类似物),你是否意识到,在CUDA和OpenCL出现之前,通过DirectX或OpenGL访问着色器来完成GPGPU?
在OpenCL或CUDA上重新实现OpenGL会引入不必要的复杂性。在支持OpenCL或CUDA的系统上,OpenGL和DirectX驱动程序将与OpenCL和/或CUDA驱动程序共享大量代码,因为它们访问相同的硬件。
更新
在现代GPU上,整个管道都在硬件上运行。这就是整个GPU的作用。在CPU上完成的工作是簿记和数据管理。簿记将是整个转换矩阵设置(即确定转换矩阵并将其分配给GPU的适当寄存器)、几何数据上传(将几何和图像数据传输到GPU内存)、着色器编译和最后但并非最不重要的“扳机”,即向GPU发送命令,使其执行准备好的程序以绘制漂亮的东西。然后,GPU将自行从内存中获取几何和图像数据,并根据寄存器(=统一变量)中的着色器和参数进行处理。

2
也许更适合作为评论,因为“不要这样做,没有实际价值”的回答从根本上并没有回答问题。尤其是当问题“纯粹出于学术兴趣”,只想知道现代图形管线的哪些部分使用专用硬件时,更是如此。 - Christian Rau
我所说的并不是发生在CPU端的事情,而仅涉及到OpenCL/CUDA可用与整张显卡所能完成的功能之间的差异。 - DaedalusFall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接