GPU 如何并行处理非图形数据?

How the GPU process non-graphic data in parallel?

由于图形管道中可编程着色器的引入启用了 GPGPU 概念,该概念将 GPU 用作适合并行数据的通用处理引擎。

然而,据我所知,由于与 GPGPU 相比,GPU 仍然大量用于图形处理,因此它使用了很多无法编程的固定图形流水线阶段。

如果我的理解是正确的,当一个数据被GPU处理时,无论数据类型(图形或一般),都应该通过固定图形流水线处理,包括可编程阶段和非可编程固定阶段.

这是否意味着非图形处理即使不使用它也应该经过图形处理阶段?或者它可以绕过那些用于图形的固定阶段吗?如果有人能解释 GPU 管道如何为 GPGPU 工作,我将不胜感激。

虽然旧的 GPU 在芯片中硬编码了管道,但现代 GPU 本身只是一个大型 ASIC,可以以愚蠢的速度计算矢量化数据。是人决定了它能做什么。所以渲染管线是在像 OpenGL 这样的图形库中定义的,而不是在 GPU 中。因此,GPU并不关心它在计算什么,只要它是向量化的数据,它就可以完成所有需要的计算并给你一个结果。

TL;DR: GPGPU完全绕过了渲染管线,但管线至今仍在使用

GPU 由两个主要部分组成(与您的问题相关)。第一个是处理部分,由内存、寄存器、warp 单元、调度器和流处理器组成。另一部分是一组控制器,负责几何处理和图形管道。这些控制器只是向流处理器发出命令,以指示如何处理渲染管道的每个步骤的数据,无论是硬连线还是基于用户提供的着色器。 NVidia 称它们为“PolyMorph 引擎”,AMD 称它们为“几何处理器”。

从历史上看,其中一些控制器是硬连线的,只能以单一方式执行操作,因此您只能对顶点着色器、片段着色器和像素着色器进行编程。镶嵌控制器例如在 GPU 上是硬连线的,而不是用户可编程的。随着需求的增长,越来越多的控制器变成了用户可编程控制器,如今其中大部分控制器都是完全可编程的 (Wikipedia)。

在 GPGPU 的早期,唯一的计算方法是通过在全屏面上使用带有输入数据的纹理来破解可用的着色器来计算结果,然后读回渲染图像( See slide 26 on this introduction).

借助 CUDA,NVidia 允许用户不仅可以对 shaders/polymorph 引擎进行编程,还可以直接与流处理器交互并在其上执行代码(参见幻灯片 31 和 32)。

这并不意味着图形管线已经过时,但现在有一种方法可以完全绕过它并直接在 GPU 处理器上 运行 代码。 Nvidia 对今天的流水线如何工作有很好的解释,您还可以在其中看到 PolyMorph 引擎和流处理器 here

图形管道仍然通过卸载过程中重复和更复杂的部分来帮助开发人员,例如管理内存、管理扭曲、传递数据等等。理论上,您可以使用 CUDA 直接在 StreamingProcessors 上编写自己的管道,然后渲染结果,但这会很乏味。使用着色器编写 GPGPU 代码是多么乏味。