换句话说,如果有人试图使用GPGPU(CUDA、OpenCL)重新实现OpenGL或DirectX(或类似技术),那么在哪些方面以及为什么会比NVIDIA和AMD卡上的原始实现更慢呢?
我可以看出,顶点/片段/几何/细分着色器可以使用GPGPU制作成漂亮且快速的效果,但如何处理生成要呈现的片段列表、剪辑、纹理采样等等这些问题呢?
我只是出于学术兴趣而提出这个问题。
换句话说,如果有人试图使用GPGPU(CUDA、OpenCL)重新实现OpenGL或DirectX(或类似技术),那么在哪些方面以及为什么会比NVIDIA和AMD卡上的原始实现更慢呢?
我可以看出,顶点/片段/几何/细分着色器可以使用GPGPU制作成漂亮且快速的效果,但如何处理生成要呈现的片段列表、剪辑、纹理采样等等这些问题呢?
我只是出于学术兴趣而提出这个问题。
现代GPU仍有许多固定功能的硬件是隐藏在计算API背后的。这些包括:混合阶段、三角形光栅化和许多芯片内队列。当然,着色器都可以很好地映射到CUDA/OpenCL--毕竟,着色器和计算语言都使用GPU的相同部分--通用着色器核心。将这些单元想象成一堆非常宽的SIMD CPU(例如,GTX 580具有16个具有32个宽SIMD单元的核心)。
通过着色器可以访问纹理单元,因此没有必要在“计算”中实现它。如果您这样做,性能很可能很差,因为您无法访问空间布局优化的纹理缓存。
不应低估光栅化所需的工作量。这是一个重大问题,如果您将整个GPU都投入其中,您将获得大约25%的光栅硬件性能(见:High-Performance Software Rasterization on GPUs)。这包括混合成本,通常也由固定功能单元完成。
曲面细分也有一个固定功能部分,难以有效地模拟,因为它将输入放大到1:4096,并且您肯定不希望预先保留这么多内存。
此外,由于没有访问帧缓冲区压缩的权限,您会遇到许多性能减少。当您处于计算模式时,“隐藏”了专用硬件,这很难达到与“图形管道”相同的效用比率(例如,它可以根据着色器负载轻松缓冲来自顶点着色器的输出,您无法像它那样灵活地切换着色器)。