仲裁
这项硬体首先引介于 R500 系列的 Radeon X1000 绘图卡中。 导入这个处理器的目的在于让作用中的执行绪化指令集使用率最大化。这个设计逻辑在于确保著色器尽可能忙碌。 比“忙碌”更重要的是,它必须做正确种类的工作,也必须尽可能完成工作。

设定引擎等待著传送来自顶点、几何或像素著色等三伫列的资料到著色器核心中。这个仲裁程序会在插槽 (slot) 开启时,判断要处理的最佳资料。仲裁动作是根据著色器正在进行、已进行的内容、要处理的资料量及不同的其他参数而定的动态程序。
在进入著色器后,就会发生两件事之一:执行绪要不是被执行,要不就是“睡眠”直到可以被处理为止。著色器内有不同种类的执行绪在运作,而当它们睡眠时,就会进入本身的伫列中。超出这个范围之外,还有许多的仲裁进行著。仲裁机制必须搞清楚何时叫醒睡眠中的执行绪,以及其叫醒的顺序。
配合执行绪仲裁,也必须有资源仲裁。由于执行绪必须处理的 SIMD 阵列与快取资源数有限,这些资源也必须针对特定执行绪排定优先。执行绪也希望能以特定资源工作,但必须轮流进行。举例来说,如果一执行绪想要在 ALU 工作,则必须等待赢得仲裁,才能在下一个处理下一个。如果它想要执行材质捉取,也必须等待下一个材质捉取资源。
Demers 表示:“(这是) 非常复杂的系统。”“这比我们过去做的任何技巧都来得复杂。”
从以上的图表,你可以看到每个 SIMD 阵列有两个仲裁器。每一个周期只提交一个执行绪,每两个周期则提交另一个。每个 SIMD 阵列随时都有两个执行绪,所以可以选择它应该处理哪个。当一个执行绪完成时,它会接收另一个执行绪,以仲裁并完成,整个设计概念在于保持每个 SIMD 阵列都尽可能忙碌。
资料流进入依交替时钟周期工作的 SIMD 阵列。这可以示范为时钟 1 - 执行绪、时钟 - 2 执行绪 2、时钟 3 - 执行绪 1、时钟 4 - 执行绪 2等等,直到每一个动作完成。设定引擎会建立执行绪,并将之群组化为 64 件一组的区块。顶点装配器 (assembler) 会群组化 64 个项目,并以单一区块的形式传送出去。扫描转换器 (光栅化器) 与几何装配器也是一样。
仲裁器共有 8 个,作用为 ALU 类型作业用仲裁器、顶点与材质快取用仲裁器与未显示在方块图中任务用的仲裁器。为了阐明哪些类型的东西需要仲裁,Demers 陈述:“每一共享资源都必须仲裁。”
Demers 说:“ALU 的仲裁是以一组执行绪的形式发生,从整体的角度而言,这并不重要,ALU 中随时都是交错 2 个执行绪,促使使用率最大化。每一项资源都有仲裁,这些资源可能是材质请求、汇出著色器 (例如完成的执行绪)、未过滤快取的请求、记忆体读写的请求、内插与著色器存取的请求-这还只代表我目前想得到的请求。整体设计重点就是确保所有这些执行绪可以存取所有必要的资源,并尽可能保持资源的忙碌。排序 (sequencing) 的行为是发生在这之前或之后,以排序资料通过资源的顺序。”

