CMP的方式非常直接,简单来说,CMP是通过“复制”物理核心来扩展处理器在多线程软件中的性能,这是获得最佳性能最简单和最有效的方式。但CMP的缺点是制造成本昂贵,并且受到处理器制造工艺的限制,不能将芯片做得越来越大。CMP对负载要求也很高,只有经过适当并行优化的负载才能充分发挥其性能,很多核心的CMP常常会浪费资源。在一些应用中,主频更高、结构更简单的双核和四核处理器往往能获得更好的性能。

SMT是一个相对廉价的技术,比如英特尔的Hyper-Threading,允许每个物理核心运行两个同步线程。SMT的设计思想是充分利用每个核心的资源。如果一个物理核心只有一个执行线程,那么在等待内存中的关键代码或数据时,线程处于停顿状态,核心利用率较低。而SMT技术允许一个物理核心运行两个或更多的线程,可以根据当前状况动态切换。如果一个线程停顿等待内存,另一个线程的指令则可以使用这个物理核心的所有执行单元,让核心利用更加充分。
为了让SMT正常工作,处理器的所有代码和存储部分需要被复制或分区。例如,一个双线程SMT处理器需要两套架构寄存器和重命名寄存器,一套给线程A,一套给线程B。另外,组成指令窗口的共享指令队列需要很大空间,才能容纳足够多的来自两个线程的指令,让执行单元保持忙碌状态。最后,两个线程任何共享单元(比如处理管线不同部分的指令缓存)都不能被任何一个线程独占。

AMD“推土机”采用32nm SOI工艺,这让它相比“马尼库尔”皓龙处理器可以在不增加功耗的前提下增加33%的核心数量和50%的吞吐量。与AMD之前所有处理器不同的是,“推土机”采用了“模块化”设计,每个“模块”包含两个处理器核心,这有些像一个启用了SMT的单核处理器。每个核心具有各自的整数调度器和四个专有的管线,两个核心共享一个浮点调度器和两个128位FMAC乘法累加器。
在K10架构中,ALU和AGU共享三个管线(平均1.5个),而“推土机”中每个核心整数单元管线的数量增加为4个:2个AGU专有、2个ALU专有。L1缓存也有所不同:K10架构中每个核心具有64KB L1指令缓存和64KB L1数据缓存;而“推土机”每个核心具有16KB L1数据缓存,每个模块具有64KB双向L1指令缓存。两个核心共享L2缓存,模块之间共享L3缓存及北桥。

“模块”和“核心”的概念容易让人混淆。实际上对于用户来说,没必要刻意关注“模块”概念,这只是AMD在设计上的称谓。当产品投放市场时,依旧会以核心数量为标识,例如采用推土机架构的“Interlagos”服务器处理器具有16个核心,而不是8个模块。AMD表示采用这种“模块”设计的主要原因是为了减少CPU的冗余电路。

如果采用CMP方式,随着核心数量的增加,CPU的核心面积会越来越大,重复电路越来越多,功耗也随之增加——因为CMP是采用复制核心的方式。而采用“模块”设计可以大大减少冗余电路,这对核心的大量增加很有意义。例如“推土机”中两个核心共享浮点部分。对于大部分服务器应用来说,整数运算比例远高于浮点运算(高性能计算除外),所以共享浮点执行单元并不会影响大多数应用中的性能。而整数部分则不是共享的,否则会造成瓶颈。
可以把AMD“推土机”架构看作是介于CMP和SMT之间的一种设计:两个线程(核心)共享浮点执行单元,但各自具有独立的整数执行资源。这像是SMT的另一种形式,也可以说是经AMD改良的“第三种方式”。与传统SMT设计不同,SMT仅复制核心的存储部分(一个线程一个存储模块register file),而AMD“推土机”架构中,每个线程复制的是完整的整数执行单元硬件,即一个线程具有一个存储模块和一组完整的整数执行单元。