换句话说,如果要尝试使用 GPGPU(CUDA、OpenCL)重新实现 OpenGL 或 DirectX(或类似物),那么 NVIDIA 和 AMD 卡上的库存实现在哪里以及为什么会慢?
我可以看到如何使用 GPGPU 使顶点/片段/几何/镶嵌着色器变得又快又好,但是像生成要渲染的片段列表、裁剪、纹理采样等等这样的事情呢?
我纯粹是为了学术兴趣。
换句话说,如果要尝试使用 GPGPU(CUDA、OpenCL)重新实现 OpenGL 或 DirectX(或类似物),那么 NVIDIA 和 AMD 卡上的库存实现在哪里以及为什么会慢?
我可以看到如何使用 GPGPU 使顶点/片段/几何/镶嵌着色器变得又快又好,但是像生成要渲染的片段列表、裁剪、纹理采样等等这样的事情呢?
我纯粹是为了学术兴趣。
现代 GPU 仍然有许多固定功能的硬件,这些硬件对计算 APIS 是隐藏的。这包括:混合阶段、三角形光栅化和许多片上队列。当然,着色器都可以很好地映射到 CUDA/OpenCL——毕竟,着色器和计算语言都使用 GPU 的相同部分——通用着色器核心。将这些单元视为一堆非常宽的 SIMD CPU(例如,GTX 580 有 16 个内核和一个 32 宽的 SIMD 单元。)
您可以通过着色器访问纹理单元,因此无需在“计算”中实现它。如果您愿意,您的性能很可能会很糟糕,因为您无法访问针对空间布局优化的纹理缓存。
您不应低估光栅化所需的工作量。这是一个主要问题,如果您将所有 GPU投入其中,您将获得大约 25% 的光栅硬件性能(请参阅:GPU 上的高性能软件光栅化。)这包括混合成本,这也是由固定-通常是功能单元。
Tesselation 还有一个难以有效模拟的固定功能部分,因为它将输入放大到 1:4096,而且您肯定不想预先保留这么多内存。
接下来,您会受到很多性能损失,因为您无法访问帧缓冲区压缩,因为当您处于仅计算模式时,再次有专门的硬件用于此,对您“隐藏”。最后,由于您没有任何片上队列,因此很难达到与“图形管道”相同的效用比率(例如,它可以根据着色器负载轻松缓冲顶点着色器的输出,您可以不要灵活地切换着色器。)
一个有趣的源代码链接: http ://code.google.com/p/cudaraster/
和相应的研究论文: http ://research.nvidia.com/sites/default/files/publications/laine2011hpg_paper.pdf
Nvidia 的一些研究人员试图准确地实现和基准测试这篇文章中所要求的内容:““GPU 上的高性能软件光栅化”的开源实现”...
它是“纯粹的学术兴趣”的开源:它是 Opengl 的一个有限子集,主要用于基准三角形光栅化。
换句话说,如果要尝试使用 GPGPU(CUDA、OpenCL)重新实现 OpenGL 或 DirectX(或类似物)
您是否意识到,在 CUDA 和 OpenCL 存在之前,GPGPU 是由通过 DirectX 或 OpenGL 访问的着色器完成的?
在 OpenCL 或 CUDA 之上重新实现 OpenGL 会引入不必要的复杂性。在支持 OpenCL 或 CUDA 的系统上,OpenGL 和 DirectX 驱动程序将与 OpenCL 和/或 CUDA 驱动程序共享大量代码,因为它们访问相同的硬件。
在现代 GPU 上,所有管道都在硬件上运行。这就是整个 GPU 的用途。在 CPU 上完成的是簿记和数据管理。簿记将是整个变换矩阵设置(即确定变换矩阵,并将它们分配给 GPU 的适当寄存器)、几何数据上传(将几何和图像数据传输到 GPU 内存)、着色器编译以及最后但并非最不重要的一点,“扣动扳机”,即向 GPU 发送命令,使其执行准备好的程序以绘制漂亮的东西。然后 GPU 将自己从内存中获取几何和图像数据,根据寄存器中的着色器和参数(=uniforms)对其进行处理。