挑战ARM Imagination I6400处理器解析

  • 来源:微型计算机
  • 关键字:CPU,ARM,收购
  • 发布时间:2014-10-29 15:03

  ARM无疑是移动计算世界的霸主,但并不意味着别的厂商就没有任何机会。Imagination,这个移动图形领域的大厂在收购了MIPS的全套家当后,开始推出多款基于MIPS架构的产品,它真的可以和ARM一战吗?

  ARM在移动计算领域最大的优势在于同时拥有CPU和GPU的设计能力。现在另一家厂商站了出来,这就是Imagination。它于2012年耗资一亿美元收购了MIPS,它的目标也很明确—和ARM竞争,成为移动计算世界中拥有硬件话语权的公司。Imagination目前已经在MIPS架构的CPU设计上略有所成,他们发布了高端的P5600、主流的I6400以及低端的M5100三个系列,面对不同类型的用户。今天我们重点来关注主流的I6400。

  有关MIPS和Imagination I6400

  在解析I6400之前,有必要先来说说MIPS。因为它不仅Imagination希望借助MIPS让自己成为像ARM那样的厂商Imagination给出的有关MIPS架构的规格和优势图解仅代表的是一个架构的名称,还代表了一个公司和一段历史。MIPS的全称是Microprocessor without Interlocked Piped Stages,也就是无内部互锁流水级的微处理器,它是1981年由史丹佛大学教授约翰·轩尼诗最先研发的。MIPS架构的优势在于结构体系简单,同等性能条件下芯片面积和功耗表现更好。目前MIPS主要用在机顶盒、网络交换机等产品上。我国龙芯系列CPU使用的正是MIPS架构。

  不过MIPS公司虽然在产品上创意颇多,但是在运营方面做得始终不是很好。在2012年,MIPS最终以一亿美元的价格被Imagination纳入囊中。很快,Imagination就推出了基于MIPS的多款产品。今天我们关注的是其中的I6400。首先,I6400的性能定位需要明确,本文才好进行下面的讨论。根据一个大概的估计来看的话,I6400所展示出来的性能基本上和目前比较热门的Cortex-A17相当,略好于Cortex-A9。

  目前主流的ARM处理器和MIPS处理器之间的性能对比。需要说明的是,这里所使用的DMIPS/MHz只是一个非常简单的参数衡量,它和处理器的真实性能有一定相关性,但是并不能完全用于衡量处理器的性能。从表1来看,I6400的DMIPS/MHz为3.0,比Cortex-A9的2.5略高,但是比Cortex-A15的4.0要略低。在简要地了解了它的性能定位之后,本文接下来就要为大家介绍I6400的相关架构和设计内容。

  第六版64位MIPS架构

  计算机通过指令下达任务,处理器往往只能使用一种特定的指令,处理器所能够使用的指令的总和被称为指令集架构(ISA)。发送到处理器的指令必须使用相对应的指令集架构才能解释并运行。目前有两种流行的指令集架构,分别是RISC精简指令集和CISC复杂指令集。RISC要比CISC包含更少的指令,因此RISC的整体架构更简单、清晰。

  尽管CISC要比RISC复杂,但这仅仅是它们在处理器发展早期才具有的鲜明差别。现代处理器尤其是英特尔、AMD的高端x86处理器,虽然在应用层面上依旧是CISC架构,但是实际上处理器在内部会将CISC指令转化为RISC指令以便进行更高效的处理。相比之下,RISC处理器则不需要这一层转化,直接就可以高效地处理RISC指令。不过RISC也有自己的问题,它无法一次完成稍微复杂的指令,需要使用多条简单指令来合并完成。因此,如何平衡处理器的设计成为现代处理器的一个重要课题。

  言归正传,目前最流行的RISC架构是ARMISA,MIPS也是一种基于RISC的ISA,它从1985年诞生后就不断地推出新版本,从第一代到第五代,每一代都是前一代的超集。1999年,MIPS宣布ISA进行重大改版,不再使用此前五代的命名方式,而是采用两个全新的方案—MIPS32和MIPS64。

  第六版MIPS是在2014年才完成的,I6400是采用了这个全新版本ISA的首款处理器。第六版相比之前的版本最重要的改动是优化、精简了指令集,去除了一些不常用或是与Power VRGPU重叠的指令集。不仅如此,第六版还包含了一些加速指令,比如为谷歌Chrome V8引擎加速的指令集等。

  很多人都称第六版指令集为MIPS3264release 6,这实际上并不正确,因为MIPS的64位ISA实际上是32位ISA的超集。这和桌面x86使用的AMD64指令集有所不同。MIPS64ISA没有规定操作模式,而是一个专为64位开发的产品,CPU内部的寄存器都是64位的。当它运行32位指令时,结果会使用符号扩展的方式被保存在寄存器中,这意味着MIPS架构下不存在模式切换,32位和64位的应用程序可以共存,甚至使用相同的硬件资源。

  总的来看,借助MIPS架构在64位和32位上的优势,I6400在指令集方面不存在问题,甚至Imagination的Power VR GPU和I6400之间联合使用还存在一定的优势。这方面I6400做得不错。

  I6400架构分析:SMT和数据绑定

  由于I6400所面向的并非性能市场,而是主流市场,因此在架构设计上I6400显得更为实用一些。I6400采用了双发射顺序架构,支持IEEE754-2008浮点规格、128位SIMD指令和硬件虚拟化。在架构方面,I6400拥有9级流水线,相比Cortex-A53的8级整数、10级NENO和浮点运算而言,6400的频率潜力更高一些。

  此外,I6400的CPU核心拥有32KB+32KB的L1缓存(可选值),每个核心有两个线程。在核心面积方面,I6400在28nmHPM工艺下每个核心的面积约为1mm2,这和Cortex-A53基本相当,如果对比对象改成Cortex-A9的话,Cortex-A9在40nm下的核心面积是2.5mm2,28nm下大约是1.5mm2。因此I6400在设计和架构上还是具有颇多优势的,至少每平方毫米性能表现比较好,况且I6400单个核心还支持双线程,这也是其设计特点之一。

  来看I6400的架构图。从上到下首先是Businterface Unit总线接口单元,用于外部数据进入处理器内部,并起到处理器内部数据交换的作用。接下来则是常见的Instruction Fetch Unit指令拾取单元,指令将会从L1缓存中取出并且准备进入下面的模块进行处理。再下来的这一部分就非常重要了,这是I6400能够实现SMT运作的最关键内容,Imagination在这里设计了一个线程管理单元,用户可以根据需要使用一个线程模块或多个线程模块(最多4个),这意味着I6400既可以做到单核心单线程,也可以做到单核心双线程、三线程到最多四线程。在这部分之后,数据将会进入Instruction Issue Unit指令发射单元,而这个单元下方挂接了大量的计算模块,诸如MDI、ALU等。此外,Imagination还在这里设计了一个branch pipe和一个memory pipe,前者可能和分支预测有关,后者是数据存储、读取地址的控制单元,memory pipe还直接和branch pipe、Bus interface Unit以及L1数据缓存连接。

  除了上述内容外,I6400中还包括了其他单元模块。可选模块方面,除了上述提到的线程管理单元外,还有MT SIMD单元可以选择,这部分是进行单精度和双精度浮点、整数运算的单元,一般来说面向通用设备的处理器应该很需要这个模块来进行计算,而一些简单的应用场合则可以考虑取消它以降低成本。固定模块方面,I6400中重要的单元还有电源管理模块,Power Mgmt Unit,简称PMU,这个部分类似英特尔处理器中常见的功耗控制模块,实现对处理器在各种状态下的功耗控制,以提高能耗比。另外,I6400的L1数据缓存和L1指令缓存是可选的,从32KB到64KB均可,都使用了4-way的方案。

  I6400还有一个重要功能,被称作指令绑定或者读取绑定(instruction bonding or load/store bonding)。这个功能的意义很大,它可能在硬件调度器中实现。一般来说,应用程序经常会移动大量的数据,比如从内存的A移动到B,这是一大串内存访问指令。这样的指令不但数量多,并且很占用时间。但是I6400有一个奇妙的设定,当两个加载或者存储的指令目的地址相邻的时候,那么I6400可以将这两个指令合并在一起进入读写单元变成一个指令。举例来说,2个32位的整数访问将会被结合成一个64位的整数访问,而两个64位的整数存储将会被结合成一个128位的整数存储,或者两个64位的浮点也可以拼接为一个128位的浮点指令。

  另外,I6400的指令绑定对软件来说没有任何影响,它是硬件级别的。I6400的总线宽度为了支持SIMD单元而设计为128位,因此这一功能是I6400中数据读取单元的自然扩展。在最乐观的情况下,移动大量数据最多可以节省一半的时间,这样大大提升了数据存储方面的效率。

  I6400的多核心:基于目录的一致性

  I6400显然在实际产品上不会只配置单物理核心,即使它能够支持SMT。问题来了,在多核心情况下,I6400应该如何保证一致性呢?说起一致性,这一直是多核心处理器的一个难题。因为多个执行核心的存在,每个核心都拥有自己的缓存,当某个核心的L1缓存中写入某数据诸如0xCFFABA后,其他核心是否还应该在本地使用这个数据?答案显然是否定的,在理想情况下,其他核心的缓存也应该更新,这样才能保证所有核心位于同样的层面,不会出现冲突和错误。

  目前解决核心一致性的主流方法是监听。在多核系统中,每个内核都可以监听其他内核的L1缓存,如果某核心中发生了一个写操作,那么这个地址立刻失效,当其他核心访问到一个无效的缓存地址时,也不会返回这个无效地址的数据,而是直接去寻找一致性的L2缓存。当然,任何时候所有核心都积极监听并对L1缓存更新是再好不过的,但是这样的设计复杂到令人望而却步,尤其是在目前八核处理器如此普遍的前提下,每个核心都必须低延迟地直连到其他七个核心。

  为了解决这个问题,现在的处理器都会监听总线刷新所有核心的一致性。监听总线会连接所有核心的L1高速缓存,所有核心共享这条总线。当一个内核写入L1缓存时,它会在总线上发出一条信息,告诉其他核心自己更改了某个地址,这个地址在其他核心上就会失效。这样的设计相比芯片直连来说要简单不少,不过这种做法依旧增加了晶体管数量并带来了一定的数据量。ARM的Cortex-A53则为每一个核心增加了监测控制单元,这个单元的任务就是在总线上监听所有数据的更改情况。除此之外,英特尔也在其桌面处理器中采用了类似方案。

  不过I6400没有采用这些设计,而是使用了一种基于目录的一致性方案。I6400的L2缓存保存了所有从CPU核心中复制出来的数据列表。当一个数据被改变时,这个列表会被更新,CPU核心就会知道这个信息并标注哪些数据被改动了。在最恶劣的情况下,假如两个高延迟的操作同时发生的话,有可能增加总线的通讯时间从而降低速度,但它发生的几率很低。基于目录的缓存一致性方案比较容易实现,因此它是一个单一的有关L1和L2之间的点对点链接。这一简单高效的缓存一致性方案还有可能是让I6400可以实现六核心方案的重要因素,相比之下ARM Cortex-A53架构最多只能实现四核心。当然有利也有弊,该方案需要占用宝贵的L2缓存空间。好在Imagination在I6400的L2规格上非常大方,厂商可以选择从512KB到最大8MB的16-way缓存,这样虽然带来一定的晶体管耗费,但是综合看来还是利大于弊的。

  写在最后

  从指令集、架构以及产品本身来看,MIPS还是值得期待的,Imagination也希望MIPS能够成为ARM之外移动计算市场中的第二种选择。Imagination I6400的目标是与Cortex-A53正面竞争。根据可靠的消息,I6400将在2014年12月出货,而用户应该在大约6个月后就能看到搭载I6400的设备上市了。

  考虑到I6400的定位和性能,用户应该会在不少廉价的Android平板和手机上体验到它,不过在此之前还有许多实际问题需要解决。由于MIPS和ARM从指令集开始就无法兼容,因此在这类产品中,只有使用JAVA编写的那些程序才能正常运行,因为JAVA虚拟机的存在,它可以将JAVA语言编译成任何机器语言。但是如果开发者采用了Android原生开发套件,那么针对ARM或者英特尔处理器编写的程序则无法在MIPS的机器上运行。想促使开发人员编写适合MIPS的应用,Imagination还需要做很多工作。

  TIPS:有关I6400中SMT的设计

  从I6400的架构图来看,I6400核心设计的最大特点就是支持同步多线程(SMT)。有关同步多线程的内容我们已经非常熟悉了,早在2002年英特尔就在Pentium 4上启用了名为Hyper Threading超线程的同步多线程技术。除了Core 2系列不支持超线程技术外,英特尔进入Nehalem时代后,几乎所有的架构都支持超线程技术。从实际效果来看,超线程技术能够在软件支持的情况下带来一定的性能增长。与此类似的是IBM在Power 7和Power 8上使用的SMT技术,IBM的SMT技术最高可以让单核心支持四路SMT(Power 7)或8路SMT(Power 8)。

  不过比较奇怪的是,目前除了英特尔、IBM以及本文介绍的MIPS相关产品外,还没有看到其他厂商在主流产品中使用SMT技术。比如另一个CPU设计大厂AMD,其最接近SMT技术的产品是推土机和相关架构所采用的模块化设计,每个模块中有两个完整的整数内核,不过共用浮点单元。AMD宣称这样的设计要比英特尔的SMT更好,多线程表现更为出色。在资源耗费方面,有资料显示英特尔的超线程技术只需要多增加约10%的晶体管就能实现性能在理想情况下大约20%的增加(至少不会损害性能),相比之下AMD的模块化设计可能需要耗费更多的资源。回到I6400上来,有关I6400的SMT,目前的消息是可能实现单个物理核心从单核心单线程到单核心四线程的不同配置方案。更细节的消息是I6400内部在线程管理单元部分实现了指令队列功能,再加上随后增加的硬件排序单元,能够在执行部分带来更好的性能。从理论上来说,处理器接收到的指令总是随机分布的,随后的一些处理单元比如FPU、ALU等并不会随时随地满载。因此类似SMT的技术就希望可以通过指令重排和调度,将一些并行性比较强的指令重新排序后塞入操作端,从而实现性能的提升。比如目前有四个线程的任务,其中0、1、2线程需要ALU单元执行,3号线程需要FPU单元,在拥有SMT的情况下,0、1、2单元会被安排进入忙碌的ALU单元进行,这个时候相关的排序机构会让计算有条不紊地进行,但是可能需要等待。而3号线程需要的FPU单元是空闲的,因此可以直接将数据传递给FPU单元并开始计算。这样能在很大程度上提升效率和性能。

  Imagination宣称I6400应用的SMT技术大概只需要增加10%的资源消耗,就能带来30%,甚至最高50%的性能提升。如果这个数据是真的话,那么这项功能将非常有意义。估计这样的提升是SMT作用在特定的应用程序下,就像英特尔超线程那样。部分网络应用程序应该会受益于SMT的作用。

  文 张平

关注读览天下微信, 100万篇深度好文, 等你来看……