
每个仲裁器都会结合一个排序器。这是个可能会表达“x 执行绪已赢得仲裁”的小型程式计数器。然后它会执行 SIMD 阵列的下一个执行绪。举例来说,一个著色器上有 12 组指令,在执行材质捉取之前必须先在 ALU 上执行。排序器处理执行绪的该片段,直到执行绪再度进入睡眠。 它会睡眠到它赢得材质捉取的仲裁。当它赢得仲裁时,睡眠的执行绪会苏醒,并处理其指令集的下一步。 即使它完成前 12 个指令后立即赢得材质捉取的仲裁,也必须先睡眠,等到资料回来,以免浪费 ALU 的时钟周期。
根据这种设计结构,由于可以立即处理许多不同的执行绪,因此许多执行绪都处于睡眠中的情况并不罕见。 在每个执行绪睡眠时,仍有其他赢得特定资源仲裁的其他指令在执行中,这有助确保硬体的完全使用率。要是执行绪的数目高过资源承受程度呢?因为每个 SIMD 都会有至少两个执行绪在作用中,因此这并不常见,这代表有 50% 的工作都不在执行中。也可能发生进入睡眠的执行绪比实体本地快取空间还多的情况,这就是用得上虚拟化技术的时候了。
虚拟化
所有的著色器快取都已虚拟化。先前产品的像素著色器储存量有限,例如 R300 与 R400 的纯量使用 64 个,向量也是 64个。 5xx 系列提升为 1500 个指令,R600 虽然也有实体著色器指令快取,但已完全虚拟化。睡眠中的著色器仍必须占用某些实体记忆体的实体记忆体位址。而总指令数已“虚拟化”为几乎无上限。具体而言,它可以处理高达 2^32 的字,大约一个约 4 GB 的著色器。至于具有回圈的指令总数,则将近无限制,就像 回圈化后的 CPU 的能力范围。
这是让执行绪为特定著色器取得运算的典型资料流会产生情况。它会从系统或其他可定址记忆体捉取,然后就像 CPU,被带入快取并执行,但在这之后就较为复杂了。由于是完全关联的快取,所以可以同时保有所有指令。但和通常拥有 2 到 3 个指令的 CPU 不同的是,R600 系列具备不同的著色器,而每一著色器在同一时间都是执行著色器的片段工作。
设计中同时也存在著常数 (constant) 快取。常数是著色器中使用的值。这些值不会随著每个绘制命令或原始命令,就往下传送到著色器中。值可能是 1.0 与 2.0 之间、pi 与 e 或某个其他值。它们是程式中使用的“半静态变数”,所有内容加上指令都被快取处理。DX9 导入这些设计,而它们必须不超过记忆体的实体量。DX10 再度将这些项目虚拟化,DX10 的常数数目惊人,因此 ATI 将整个系统快取处理。必要时,它会全部载入处理。
运作的原理?效率、平行化与延迟
为什么 ATI 同时作用这么多执行绪并必须仲裁所有资源呢?难道不能同时间做下一件事并不理它吗? 现实是系统还必须处理延迟的问题,工作或捉取某个东西都需要时间。如果著色器说:“去捉取一个材质。”即使在击中快取时,也必须执行该材质位址的细节等级 (LOD) 运算、执行快取检查、从该快取取得资料、过滤该资料、然后再带回来。这个程序至少要花上十数个周期,如果有一个快取遗漏,那么就要花上一个记忆体周期了。来回 DRAM 之间可能要花上数百个周期,而实际上可能是数千周期。
现实是不但这个单元要求材质,像光栅后端等硬体的其他部分也在同时启始记忆体捉取动作。根据 ATI 的说法,同时间可能有“80 个读取用户端”,每一个用户端都在向记忆体要求某个东西。记忆体频宽相当大,采用 GDDR3 的 R600 记忆体频宽约为 105 Gbps,而 GDDR4 版本为 160 Gbps。
即使频宽这么多的情况下,还是有许多用户端要求大量频宽,通常频宽会不够。用户端的要求很重要,但为了保持效率,也必须“不”立即回应它们。这些请求必须针对记忆体以有效率的方式组织,例如停留在开放 DRAM 分页上。诀窍在于保持相当高的记忆体效率,以维持尖峰频宽。为了接近尖峰频宽,不但记忆体要很有效率,系统也必须能容许延迟。当对记忆体控制器或著色器外的元件请求时,必须让装置习惯于等待,如先前提到,单元等待资料数十、数百与数千周期的情况相当常见。
为了隐藏延迟的现象,最好是平行进行工作。在硬体完成一项工作并知道必须等下一段工作的同时,它就被置于睡眠模式 (即使这会占用十数个周期),然后它会找到另一个要办的工作,让数百个执行绪平行工作,硬体才能总是有事情做。
理论上,要连续处理下一件工作及再下一个并不难,硬体会随时处理事情,以仲裁和排序到最合适的脚本,以有效进行事情的流程。如果出现暂停,硬体甚至能储存其状态、使之睡眠,然后再处理其他事情。当处于睡眠模式的工作取回后,则可以立即准备好完成先前等待的任务。当有足够的执行绪在作用时,理论上要确保单元总有事做并不是个问题。
CPU 一次只能处理数个执行绪,而绘图处理器可以同时满足数千个执行绪。ATI 设定了每个执行绪 16 像素的工作负载量,当你将再乘上执行绪数时,这代表任何特定时间内,著色器中都有数万个像素。在平行工作充裕的情况下,就不必担心隐藏性延迟的问题了,这就是平行处理的艺术,也是与 CPU 相较之下,GPU 更容易达到理论数字值的原因了。
