原文链接:https://traxnet.wordpress.com/2011/07/22/understanding-modern-gpus-3/(该系列的第三篇文章,也是最后一篇,原作者之后就没有更新了。)
目前为止,我们已经了解了常见的API,CPU和GPU在host端的通信,以及他们如何交互和同步。在这篇新文章中,我们将首先探索 GPU 的主要单元,作为外部接口的即命令处理器 (Command processor,CP)。

Command processor

我们学习了CPU如何向GPU发送包括状态更改、指令和数据的各种命令,这一系列行为有一套规范好的设计与解释。CP跟踪GPU中的状态,更新host端的映射寄存器并发出中断信号以通知CPU。

事实上,(据我所知)CP是嵌入GPU的微处理器,能够执行由驱动程序软件处理的大部分任务。CP包含内部存储器,可以做复杂的逻辑运算、算术运算等。它能够管理多个command buffer,跟踪发送到GPU的内容,或者在接收到命令流后更新fence。

CP的第一个任务是解码命令,以便为其他组件提供信息。它还负责读写host内存以及管理device内存。管理状态是一项复杂的任务,在某些情况下,为了保持一致性,在任务继续之前部分pipeline会被flush。这是最坏的情况,因为它使得任务变成串行。这一点基本取决于GPU制造商的实现。

Setup step

CP管理一些专用的固定功能逻辑,顶点装配器(VA),曲面细分器,几何装配器(GA),光栅化器/插值器。这些元素负责为处理内核提供数据,与线程调度程序(NVIDIA命名其为GigaThread)通信并以块的形式发布计算任务。费米架构似乎有点不同,因为这些固定的功能逻辑块愈发有可能成为瓶颈。NVIDIA选择复制其中一些逻辑或将它们重新安排到流处理器(Streamer Processor)中,使得许多并发操作称为可能。

虽然我想把文章的重点放在高性能计算上,但对这些设置块进行简单解释很有趣。对于流中的每个顶点,在进一步处理之前,需要获取一组关联的属性(如法线、双法线等)并组装成一个块。这是顶点装配器的主要任务。随着属性列表的增长,性能会逐渐下降,因为需要从内存中获取越来越多的数据才能进行后续处理。

曲面细分器是一个高度可编程的逻辑块,可以对面片进行细分,为流水线提供更多顶点和图元。几何装配器获取图元信息以及邻接信息,并发送所有这些信息,以便在几何着色器中进一步处理。光栅器发出要由片段着色器处理的片段。插值曾经是在光栅器内部完成的整体操作,但现在大部分工作都是直接在片段着色器中完成的。计算片段的重心坐标,你可以轻松地在着色器中对每个定义的属性进行插值(通过用户着色器)。

所有这些设置都为作为GPU核心的流处理器提供数据。我们将在几天内回顾它们的工作原理。(很可惜原作者在这里断章了)。