解读多核心Cell处理器:游戏主导发展方向(4) | ||||||||
---|---|---|---|---|---|---|---|---|
http://www.sina.com.cn 2005年03月22日 14:42 太平洋电脑网 | ||||||||
文/太平洋译站:石头 三、Cell的有序构架 我们已经提到,PPE和SPE两者都是有序核心,但为了了解有序核心对性能的影响,我们首先必须知道一点背景知识。
相关性,指令排序和并行 什么是相关性? 在许多CPU文章中都提出了相关性这个概念。在非常基础的级别下,CPU接受到的指令流通常是这样的形式: 操作 目标单元格,来源1,来源2,...,来源n 指令格式将从一个CPU ISA变化到下一个,但一般的思想是CPU收到一个操作,一个目标单元格来存储操作的结果,以及一个或多个来源,在那上面获取数据来执行操作。取决于构架,目标单元格和来源可以是内存位置或寄存器。为了简化问题,我们假定目前所有的目标单元格和来源都是寄存器。 让我们来看一个填写一些数据的例子: ADD R10,R1,R2 上面一行的汇编将被发送到CPU,告诉它把存储在R1(1号寄存器)和R2中的值加起来,并把结果存储到R10中。非常简单。现在我们再给CPU另一个要处理的操作: MUL R11,R10,R3 这一次,我们把存储在R10和R3中的值相乘,并把结果存储在R11中。作为单独的一行操作,上面的代码是容易完成的,但在直接放到我们的第一个例子后的时候,我们遇到了一点问题:
第一行写入R10,同时第二行从R10中读取。在没有上下文的情况下,CPU可能在第一行完成前开始执行第二行 - 对第三和第二行的情况也一样。在这里我们遇到的是所谓的“写入后读取”(Read After Write,RAW)相关性。有许多类型的相关性,但理解了这个基础的例子就已经足以让我们进入即将到来的下一个话题了 - 这种相关性的影响。 相关性带来的问题是它限制了并行执行的能力。以Athlon 64为例。它有三个整数执行单元,所有这些执行我们上面使用的代码的能力是相等的。理论上Athlon 64能够同时执行并行的三行整数操作 - 假定操作之间不存在相关性。执行上面的代码时,Athlon 64整数执行单元中的两个将闲置,要等待代码的第一行被执行。 像我们上面讨论的这种简单的相关性,阻碍了现代流行微处理器发挥它们最佳性能的能力。它仿佛有三只手,但只能通过一次收拾一件物品来打扫房间;这样低下的效率真是令人沮丧啊。 围绕相关性调整指令 幸好,对代码中的相关性问题有多种解决办法;一是从硬件入手解决问题,另一个是在软件中解决问题。 软件编译器负责产生发送到CPU用于执行的汇编代码。因此,由于CPU内部工作的固有原理,一般来说编译器能够产生最少数据相关性的代码。 有微处理器构架是完全依靠编译器来实现指令级并行的,同时尽可能多地消除相关性。这些构架被认为是有序微处理器。 有序构架 顾名思义,有序微处理器只能按照指令被发送到CPU的顺序来执行它们。CPU最多可以并行执行多条指令,但它没有能力对指令重新排序,以更好地适应它的需要。 如果编译器足够好的话,那有序微处理器应该是优秀的。不过有两个关键的限制: 1. 对有序构架的二进制编译是非常依赖构架的 虽然Athlon 64和Pentium 4两者都完全能够运行x86代码,但它们采用了极其不同的微构架,具有不同的执行单元,并且各自擅长的领域有很大的差异。如果上述两个芯片都完全依靠编译器来实现并行和最大化性能的话,肯定有一个会遭受极大的损失。即使每个程序总会有两个版本,但那趋向于变得巨大而杂乱 - 特别是从升级/补丁的观点来看。编译器不得不密切关注着它正为之编译的构架,就算它像游戏控制台一样工作,没有众多厂商以共同的ISA提供不同构架的CPU,但还是不如桌面x86市场的好。 2. 不可预知的内存延时 缓存在绝大多数时候是个好东西。微处理器上的缓存尽力保存了频繁使用的数据,所以它应该被做得与CPU通信的延时非常低。问题是缓存增加了一个不可预知的等级到它从内存获取数据的时间上。一次缓存冲突可能意味着数据要在10 - 20个周期后到达。一次缓存失败可能意味着好几百个周期的延误。至于有序微处理器,它不能根据数据可用性对指令重新排序,那么如果数据在缓存中不可用的话,CPU就不得不等待更长的时间以把它从主存中取出来,整个CPU不得不闲置,直到那个数据被从主存中读出。即使有其它的指令能够被执行,有序微处理器也无法有效处理待执行指令的重新排序,以克服不可预知的内存延时。 如果找到办法解决有序构架的限制的话,会有一些非常实际的好处: 1. 微处理器设计大为简化 为了处理待执行指令的重新排序,无序微处理器增加了数目惊人的复杂单元。我们将在下一节中更详细地讨论它们。通过把这个复杂度转移到软件/编译器那边,极大地简化了微处理器的复杂性,并为其它能够产生更好性能收益的单元剩下了晶体管额度。越低的复杂性也意味着越小的功耗和发热量。 2. 更短的管线 一般来说,为了处理指令的重新排序,构架的管线级数不得不增加,导致了更高的功耗,并且(由于更高的分支预报损失)而需要更精确的分支预报器。虽然对于较长的管线设计而言,增加管线深度的影响不会很大,但相对于较短的设计,增幅可能达到40%以上。 在历史上,简单的有序核心的思想一度被抛弃,因为有明显的另一个选择:无序构架。
[上一页] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] |