OpenCL异构计算——OpenCL设备架构

引言

作为开发者,我们需要了解不同硬件特性潜在的优势,其中设备扮演着重要的角色,并且不同的设备有着对应的硬件架构。当读者已经对目标硬件足够了解时,就能在设计并行算法和软件时做出更加理性的抉择。这里的“了解”指的是了解OpenCL中编程、内存和运行时模型设计背后的哲学。

OpenCL并行模型希望能够在现有的硬件上高效的运行相应应用,比如在串行处理器、对称多处理器、多线程或SIMD,以及一些支持向量的设备。本章我们会讨论这些设备,以及对设备的整体设计。

本文思维导图:
mindmap

硬件权衡

  • 多核处理器设计
    • 在保留了单个处理器的时钟周期和硬件复杂度同时,增加更多处理核
    • 不会让处理器上晶体管数量增加,以减少功耗
    • SIMD和VLIW(very long instruction word)架构能够通过提升算术运算和逻辑控制的比值,做更多工作。
    • 这样的情况下ALU会对于如此之少的工作量感到不满。
  • 多线程
    • 与增加算术计算和逻辑控制的比值不同,多线程增加了工作量。
    • 进行计算的同时,进行逻辑控制,比如内存搬运,这样可以增加我们队设备的利用率。

权衡缓存和内存系统的同时(不同的架构下进行不同的访存方式),也要权衡在这期间处理器使用分配。

频率提升带来的性能提升和局限性

SIMD向量抽取操作很困难,因此在迁移到并行计算之前计算机体系结构过去只着眼于提升单线程的执行性能,而把困难的,多线程的并行计算交给特定市场的高性能专业计算机去完成。

然而在过去的十多年里,主要由功耗和散热的限制,继续提高CPU的主频已经明显变得不现实

CMOS的动态功耗可以近似为动态功率和静态功率之和:
P = A C V 2 + V I l e a k P = ACV^2 + VI_{leak} P=ACV2+VIleak

  • A 是活动因子,即在电路中正在切换的晶体管数量
  • C 是电路的电容量
  • V 是电路的电压
  • F 是切换频率
  • I l e a k I_{leak} Ileak 是估计的晶体管漏电电流

随着制程工艺达到当今如此小的尺度,我们已经不可能在不增加晶体管切换错误率的情况下继续降低电压。进而,频率的任何提升所带来的功耗提升和散热问题变得不可忽视!

超标量执行

  • 超标量和乱序作为扩展解决方案,已经在CPU上存在了很久
  • CPU主要依赖的信息为指令流中的指令,或是对未使用的功能单元进行调度(如果该信息可用的话)。

请添加图片描述

  • 乱序逻辑的主要受益人就是软件开发者们。
  • 硬件上自动将编程者代码并行化,串行的代码不需要做任何修改就能比原来执行的速度快很多。

超标量让CPU主频设计领先了10多年,其让CPU总体性能成超线性增长的趋势,即使是在流行大规模生产设备的时代,这种设计都未过时。

  • 这种超时代的设计,也是有缺陷的
    • 乱序调度逻辑需要是用到大量的晶体管,需要增加CPU的芯片面积以存储队列中未完成(in-flight)的指令和存储指令间的依赖关系,以应对执行期间硬件上的动态调度。
    • 要让投机(speculative)指令迅速执行,就需要扩大并行的乱序指令窗口。投机指令的结果是一次性,并且会浪费更多的资源

良好的超标量处理器数不胜数,控制数据公司的西摩·克雷在90年代设计的CDC 600就是一款很不错的多RISC(Reduced Instruction Set Computer,精简指令集计算机)设计。目前,高端CPU基本上都支持超标量处理。很多GPU同样具有超标量的能力。

超长指令字 VLIW

  • 为了增强处理器的指令并行性,VLIW的执行十分依赖于编译模式。
  • 为了替代现有的标量指令流,VLIW处理器上发出的每一条指令,都包含了多个并发的子指令,并且这些指令会直接映射到处理器的执行流水线上
  • VLIW指令包都是已编码的,并且指令流中的每个独立的部分都会映射到处理器上特定的计算单元执行。
  • 很多VLIW设计中,计算单元都是异构的,因此这些指令只会安排给特定的VLIW指令流。
  • 缺陷
    • 编译器没有办法将所有指令包都填满,所以执行效率不会特别高。
    • VLIW指令在执行方面还有另外一部分开销,那就是相应编译器的开发的成本,而超标量的执行就没有这部分开销。

VLIW设计通常出现在数字信号处理芯片上。当前的高端设备包括Intel的安腾处理器(以显式并行指令计算著称)和AMD的HD6000系列GPU。

SIMD和向量操作

VLIW和硬件管理的超标量执行方式都是通过查询地址,并行执行同指令流中不相关的指令,而SIMD与向量并行可以让指令在数据上并行执行。

  • 一条SIMD指令表示将同样的操作在多个数据元素上并行执行!

  • 封装单个的SIMD指令,需要同时对多个数据元素执行某种操作

  • 向量操作将向量化操作通用化,并且向量操作通常会用来处理较长连续的数据序列,通常会使用流水线的形式进行向量操作,而非同时对多个数据进行操作。

  • 向量操作对连续、密集的内存读写给予了更多的支持。

![[Pasted image 20240523152159.png]]
图中表示SIMD顺序执行单个指令,多个ALU同时对数据进行处理

  • SIMD的优势与ALU的工作方式有关,大量的调度工作和逻辑解码工作都可以省去。
  • 缺陷
    • 很多代码无法数据并行化,那么就无法使用向量操作进行性能提升
    • 这个工作无法交给编译器,因为编译器很难对数据并行的代码进行提取

向量处理器源于超级计算机领域,不过SIMD设计在很多领域都有应用。CPU通常会包含SIMD流水线,用来显式执行标量指令流中的SIMD指令。x86芯片上包含了多种指令集,比如:SIMD扩展(SSE)和高级向量扩展(AVX);PowerPC上又AltiVec扩展指令集;ARM上有NEON扩展指令集。GPU架构在历史上为了支持像素向量,其显式包含了SIMD操作,很多现代GPU依旧能能显式的对SIMD向量进行操作。

GPU上也是单通道标量指令流。因为很多逻辑使用向量的方式进行处理,让这些支持向量操作的机器被称为向量机。例如:AMD的Radeon R9 290X架构就能支持64路SIMD操作。这种宽度的向量指令通过多个时钟周期,通过一个16通道的SIMD单元分发到流水线上。

硬件多线程

  • 并行的三种常见的形式:
    • 指令并行
    • 数据并行
    • 线程并行

并行的方式就是执行多个独立的指令流。这种方式需要并行机器(多核)的支持,不过对于单核CPU来说这种方式也很用。

实现硬件多线程的挑战在于管理额外的指令流,以及第二条指令流需要了解寄存器和高速缓存的状态。

  • 两种方式实现片上(硬件)多线程
    • [[同时多线程( Simultaneous multithreading, SMT)]]
    • [[分时多线程]]

两种硬件多线程实现形式都是比较常见的。MTA设计源于Tera(一款经典的时间片多线程超级计算机),这种设计难以投入实际生产;不过,Cray随后的实现就不一样了——MTA-2,其利用每个CPU上的128个寄存器迅速的切换线程(包括线程的状态),并且忽略已经停止的线程。标准AMD皓龙处理是基于Cray的设计,其对MTA的扩展设计——XMT,将会更加适应未来的多线程处理器。Sun的尼亚加拉系列芯片就实现了多芯多线程的设计(每个芯上8个线程),为了让数据中心的工作量,以到低耗能和高吞吐的方式完成。Intel奔腾4和之后的Nehalem和其他继承者们上都实现了一种名为“超线程”的SMT设计。现代GPU每个芯上可以在同一时域中运行大量的线程,具体线程的数量收到一般计算资源的限制:目前的这代AMD GPU中,通常一个芯开启8-16个线程,就能够隐藏延迟和停顿。

多核架构

从概念上来说,增加时钟周期内工作量最简单的方式,就是将单一芯片做的事情,克隆到多个芯片上去做。这种最简单模式下,每个芯上都是独立运行,共享数据存储在系统内存中,通常会遵循缓存一致性协议。这种设计是传统多插槽服务器SMP系统(multisocket server symmetric multiprocessing system)的简化版本,并且在其基础上对性能进行了大幅度的提升,在某些情况下会有十分极限的加速效果。

多核系统有不同的外观,准确定义什么是“核”可能非常困难。
主流高端CPU上通常都包含很多的功能模块,这些功能模块中除了逻辑接口、内存控制器之类的功能,其他功能都是相对于其他“核”独立的。
然而,这个界限有时也会变得模糊。例如:AMD的推土机(Steamrooler,高功率核芯)设计,其设计就要比彪马(Puma)的设计简单许多(详见下图),共享功能单元会在核芯之间形成一种可以拷贝的单元,这种单元被称为模块。传统的设计中,因为硬件需要交替执行浮点指令,在具有共享浮点功能的流水线上,所以单线程将会在多个核芯上切换执行。这种设计旨在提升功能单元的占用率,从而提高执行效率。

![[Pasted image 20240523160057.png]]
AMD彪马(左)和Bulldozer(右)高端设计(这里并未展示任何共享模块)。彪马采用的是低功率设计,这种设计遵循传统的方式,将功能单元映射到每个核芯上。推土机则让两个核芯共享一个模块,图中两个核芯就共享了一个浮点单元。

GPU的设计以类似的方式展示了对核的不同定义。
很多GPU设计,例如AMD的GCN(Graphics Core Next)架构,以及英伟达的费米和开普勒架构,这些设计都会跟随一个额外的类似中央处理器的芯片。不过,有些设计与这些设计有着本质的不同。例如,我们来看一下AMD Radeon HD6970高端显卡的内置图,我们就能看到与推土机类似的设计。虽然这个设备只有24个SIMD核芯,但是观察其执行单元,我们可以使用一种最公平的方式与传统CPU进行比较,这些SIMD核芯只能执行ALU操作——浮点和整型操作。指令调度、解码和分发都通过“波”调度单元执行。因为调度单元是一个宽IMD线程上下文——称为“波面阵”,所以其调度器就命名为“波”调度器。的确,在AMD Radeon HD 6970上又两个“波”调度器(以避免提升设计的复杂度),不过这款显卡的低端版本中,只能使用一个“波”调度器和一排SIMD核芯。

请添加图片描述

AMD Radeon HD6970 GPU架构。这个设备由两部分组成,每个部分的指令控制(调度和分发)通过“波”调度器进行。24个16通道的SIMD核芯,每个SIMD通道上执行4路VLIW指令,包含私有一级(L1)缓存,并且共享本地数据(通过便笺式存储器)。

集成:片上系统和APU

嵌入式领域中,异构方法和多芯设计是一样的。为了达到低能耗,嵌入式开发者们构建出复杂的片上系统,这个系统将很多组件压缩到一个芯片上,这是种性价比十分高的设计。使用这种方式将特定的组件合并,就能在某些特殊的功率要求情况下对设备进行优化,这点对于移动领域来说十分重要。

  • 片上系统的优点:
    • 将很多元素融合在一个设备上,这样在生产的时候一次就能搞定,避免在制造阶段耗费太多成本。
    • 更少的功能将会降低设备上的面积占用率,可以节省功耗和降低设备体积,这对于移动通讯领域很重要。
    • 更短的距离意味着数据交互和信息传递完全可以在一个内存系统中进行,并且降低了交互的功耗。
    • 低通讯延迟可以增加处理器对负载分发的次数。

手机领域就有该方式的成功案例,比如高通的金鱼草(Snapdragon)和德州仪器的OMAP系列。这种设计与在ARM上的实现称为指令集架构(ISA)——一个移动GPU、内存控制器和各种无线和媒体处理组件。高性能领域,索尼、松下和IBM开发了Cell宽带引擎处理器(Cell/B.E.),其结合了一些体积小、性能高、传统的全功能核芯,目标就是为了让每一瓦功耗能做更多的工作。AMD和Intel都开发出了结合CPU和GPU的片上系统。

  • AMD的片上系统称为APU,其将高性能显卡和CPU打包在一起,以提高芯片工作的效率。

高速缓存层次和系统内存

早些年的超级计算机上的内存带宽和延迟,使CPU总是可以随时访问需要的数据,这种情况持续了很长时间。如今,CPU端发出一条内存请求不会有之前那种延迟,相应的数据可能会在成百上千个CPU始终周期后返回。单线程CPU上,乱序逻辑不可能复杂到能够掩盖很多的延迟。

  • 幸运的是,内存访问模式表现出一定程度的局部性:
    • 空间局部性:两个以上(包括两个)的读或写操作,对内存上(一定程度上)附近的地址。
    • 时间局部性:在相对小的时间窗内对同一地址进行两个以上(包括两个)的读或写操作。

通过这两种局部方式可以得出结论,如果我们要存储从某个内存地址,以及从其临近地址读取的值,读取之后将会再次使用到这些值。利用这个结论,CPU的设计者们会在CPU到内存缓存中间添加很多缓冲层,以便对内存访问进行优化。

  • 高速缓存的设计也有很多,不过这些设计可以根据所依赖的负载分为两类:
    • CPU高速缓存倾向于减少延迟。为了达到这个目标,缓存通过复杂的层次结构,将要使用的数据放在离CPU较近的地方。
    • 乱序逻辑只能掩盖有限的延迟,所以访问到数据所耗费的时钟周期越少越好。另外,让数据接近执行单元也能最小化功耗:长距离的数据搬运很占CPU的功耗。

我们经常在GPU设计中看到一种更加偏向于空间局部性的扩展设计,就是将内存设计成可二维访问的模式,从而让缓存保存更多有效的数据。

包括GPU和Cell处理器的一些设计,包括软件管理的暂存式存储器空间或是代替缓存层次结构的设计。这些设计中,给定功耗下内存都有很高的性能和空间预期,不过这样的设计对于编程来说是非常复杂的。

事实是任何给定的设计,都需要去权衡缓存层级和处理器基础功能的负载。不幸的是,对于所有处理器设计,从负载组合角度无法给出一个完美的答案。

架构设计空间

现实世界中,我们所见的架构远比之前提到架构复杂。我们所使用的计算机架构在各个方面都会发生很大的变化,具有很大的设计空间。即便是当前公开的架构,不同厂商的实现都有不同。

  • 在GPU领域,我们经常会遇到下面的几种情况:
    • CPU是串行的,GPU是并行的
    • CPU只有几个核,GPU有数百个核
    • CPU只能运行一两个线程,GPU可以运行成千上万个线程

当然,现实中的设计要远比上面描述复杂的多,比如,缓存内部的差异、流水线的数量、流水线的类型,等等。

CPU设计

很多人都在“CPU”进行过开发。即使在CPU上,使用并行的方式也是大相径庭。

低功耗CPU

在功耗要求非常非常低的时候,CPU核会设计的很简单,如果有多个也是多个串行使用。这种情况下,功耗在设计中就是最关键的因素,性能则为次要因素。这样的设计通常不支持浮点计算,且无需并行化。

目前常用低功耗CPU ISA总线使用的是ARM ISA架构(ARM对该架构拥有知识产权)。ARM架构起源于艾康RISC机,其实就是艾康电脑的桌面架构,不过目前这种简单的架构是移动端和嵌入式领域的主要架构。DEC生产出了StrongARM微处理后,在1996到1998年期间,艾康也确实进军过桌面领域。ARM有各式各样的设计方式,因为ISA协议允许制造商对自己的芯片进行自由设计。通常,ARM的核芯会和其他功能单元一起放在一个芯片上,比如:蜂窝调制解调器、嵌入式图像处理器和视频加速器,等等。

大多数ARM ISA的变种架构都会在其核芯上排布三到七阶流水线。基于ARMv7 ISA架构Cotex-A8Cotex-A9Cotex-A15核都支持超标量,且使用了高达4个对称核芯。基于ARMv7的核芯可以选择性的支持NEON SIMD指令,每个核上可以执行64位和128位SIMD操作。

ARMv8-A架构增加了64bit指令集,NEON扩展支持128bit寄存器,支持双精度和密码指令。基于ARMv8-A架构的高端处理器Cortex-A57,目标是中等性能,8路宽指令,低功耗,还有一条乱序流水线。Cortex-A53中保留了顺序流水线,不过这条流水线只支持2路宽指令。

彪马微架构就是AMD当前低功耗CPU阵营中的一员,其功耗在2~25瓦之间。为了实现低功耗设计,彪马核芯的时钟要比高端产品慢很多,并且设计以尽可能低的峰值性能,减少数据路径上的开销。彪马是一款64位设计,支持双通道乱序执行,并且具有2个128位SIMD单元,将这两个单元拼接起来,就能执行AVX指令操作。

Intel的Atom设计使用了与AMD彪马不同的方式,所得到的性能也不一样。在Silvermont微架构之前,Atom并不支持乱序执行,使用SMT来弥补单线程的性能不足。自从Silvermont问世,Intel和AMD对于功耗和性能的技术性几乎达到同一水准。

通常,低功耗CPU只能进行顺序或窄乱序执行(使用相关窄SIMD单元)。核芯数量的变化在多线程情况下可对各种“性能-功耗”平衡点进行缩放。总之,性能简单和主频较低(相较桌面级CPU),都是减少功率消耗的一种方式。

主流桌面级CPU

主流桌面级CPU的两大主要品牌——AMD和Intel,在架构设计上两家的CPU架构和彪马的设计差不多。不同的情况下,他们会增加CPU中不同元素的复杂度。

Haswell微架构是当前Intel核的主流架构。之前几代,比如Sandy BridgeIvy Bridge,支持128位SSE操作和256位AVX操作。Haswell添加了对AVX2(AVX的升级版,支持更多的整型操作指令)的支持。Haswell流水线可以并行执行8个不同类型的操作,功能单元通过8个调度口进行连接,完成类型混合的操作。其乱序引擎可以在单位时间内处理192个操作。

Intel为Nehalem处理器(Sandy Bridge系处理器)增加了硬件多线程,并且在Sandy Bridge和Haswell架构上都保留了硬件多线程。这种情况下,就是真正的SMT:每个核上的执行单元可以处理来自不同线程的不同操作。这提升了功能单元的利用性,也增加了调度的复杂度。

AMD的压路机(Steamroller)增加了线程执行的数量,其使用的方法介于增加核的数量和增加核芯上的线程数之间。推土机的这种方式让整数核芯二次独立,使其拥有私有ALU、状态寄存器和调度器。不过,取指单元、浮点ALU和二级高速缓存还是在核芯间共享的。AMD参考了这种共享方式,将两个核芯设计为一个“模块”。设计模块的目的只共享多个功能单元,从而减少在实际负载中对资源的严重竞争。之前的推土机(Bulldozer)和打桩机(Piledriver)微架构中,解码单元和两个核芯组成一个模块。不过,在压路机架构下,解码单元已经在多个核之间复用了。

通过4个ALU流水线,每个核都能支持乱序执行。共享的浮点ALU为一对128位SIMD单元的合并,可用来执行AVX指令。为了节省在移动设备上的功耗,压路机微架构也引入了可以动态调整大小的二级高速缓存——其中部分功能可以根据工作负载进行关闭。

我们了解了主流CPU中的多宽指令执行,乱序硬件,高频时钟和大量缓存——所有性能都用来维持在合理的功耗下单线程的高性能。主流桌面级CPU中,核内多线程是很少见或不存在的,并且芯片内SIMD单元可以设置宽度,这样就不会再不用的时候,浪费芯片的面积。

服务器CPU

Intel安腾架构和其子代架构是非常成功的(最新版本是安腾9500),其基于VLIW技术,是Intel对主流服务器处理器的一次有趣的尝试。安腾架构中有很多的寄存器(128个整型寄存器和128个浮点寄存器)。该架构使用的是一种VLIW名为EPIC(Explicityly Parallel Instruction Code,并行指令代码)的指令,这种该指令能一次存储3个128bit的指令束。CPU每个时钟周期会从L1缓存上取四个指令束,这样就能在一个时钟周期内执行12个指令。这种处理有效的将多核和多插口服务器结合起来。

EPIC将并行化的问题从运行时转移到编译时,这样反馈信息就可以从编译器的执行跟踪进行获取。这就要让编译器完成将指令打包成VLIW或EPIC指令包,这样的结果编译器的好与坏,直接影响到该架构的性能。为了协助编译器,大量的执行掩码,束间依赖信号,预取指令,推测式加载,以及将循环寄存器文件构建入架构。为了提升处理器的吞吐量,最新的安腾微架构包含了SMT,安腾9500支持前端流水线和后端流水线独立执行。

SPARC T系列(如图所示),其起源于Sun,后在Oracle进行开发,其使用多线程的方式为服务器的工作负载计算吞吐量。

请添加图片描述

很多服务器上的负载都是多线程的,特别是事务和网页负载,都会有大量的线程同时对服务器内存进行访问。UltraSPARC Tx系列和之后的SPARC Tx系列CPU的设计,使用最低的性能开销来负载对应数量的线程,使CPU整体吞吐量保持最大化,每一个核都设计的简单高效,无乱序执行逻辑。这种设计一直保持到SPARC T4。之后,每个核中开始出现线程级并行,这种方式能够在只有双流水线的处理器上交替的执行8个线程上的操作。这种设计能很好的隐藏指令延迟,并且比起主流x86的逻辑设计要简单许多。更加简单的SPARC T5设计上,每个处理器有16个核芯。

为了支持多个活动线程,SPARC架构需要多组寄存器,不过作为权衡因素,其推测性寄存存储方式要少于超标量设计。另外,协处理器可以对密码操作进行加速,并且片上以太网控制器可以提高网络吞吐量。

如前所述,最新的SPARC T4和T5有点回退到早前的多线程设计。每个CPU核支持乱序执行,并且可以从单线程模式(单线程可以使用所有资源)切换到多线程模式。从这个意义上来说,SPARC架构与现代另一种SMT设计越来越接近,SMT设计的代表就是Intel和CPU。

通常,服务器芯片以一些单线程性能为代价,换取最大化的并行性。与桌面级芯片不同,服务器芯片上的面积会更多的用来支持不同线程间的上下文切换。随着宽指令逻辑的出现(比如安腾处理器),其能帮助编译发现指令级别的并行。

GPU 体系结构

比起CPU架构,GPU架构有很宽泛的选择。深入讨论OpenCL编程(第8章)之前,我们来讨论其中几种架构。GPU倾向于使用复杂的硬件来进行多线程任务管理,因为显卡需要处理的项目很多,包括处理复杂图形、几何图形和图像像素。都是可高度并行的任务,其中大量任务都可以使用(高延迟容忍)多线程来完成。需要了解的是,除了管理任务队列的复杂机制,或在硬件管理系统后隐藏SIMD指令的执行外,其实GPU是很简单的多线程处理器,对其进行参数指定之后,能高效的处理大量像素

移动端GPU

移动端GPU也具有通用计算能力,包括ARM,Imagination Technologies联发科技高通提供的GPU都能够兼容OpenCL

  • GPU由多个小的着色核组成,小尺寸SIMD单元上可以执行大量的独立线程(不一定使用同一个SSE矢量流水线)。
    ARM的Mali-T760架构使用三种计算流水线,每个流水线上有16个着色核。
  • 核间任务管理支持负载管理:通常,GPU线程都由硬件控制器管理,而不会暴露给操作系统。
    例如Mali-T760这样的嵌入式设计,GPU和CPU能够共享全局内存,从而减少数据拷贝;在ARM的设计中,数据时完全缓存的

高端GPU:AMD Redeon R9 290X和NVIDIA GeForce GTX 780

高端桌面GPU和其衍生出的高性能计算,和工作站相比高性能计算在最大功率下更高效。

  • 为的是获取高内存带宽,GPU在内存方面需要大量的芯片投入其中,并且内存条(比如,GDDR5)上每个高带宽管脚都会使用(低延迟)内存协议
  • GPU使用混合特性来提升计算吞吐量,比如:对于给定数量的指令使用宽SIMD数组,来最大化算法吞吐量。

AMD Radeon R9 290X架构(下图)硬件上有16个SIMD通道,向量流水线4个时钟周期可以处理一个64元向量。
在这里插入图片描述

AMD Redeon R9 290X架构。该设备上有11个簇,共有44个核。每个核有一个标量处理单元(处理分支和整型操作)和4个16通道SIMD ALU。簇间会共享指令和矢量缓存。

英伟达GeForce GTX 780架构(下图)同样具有16个宽SIMD单元,并且能在两个时钟周期处理一个32元向量。

在这里插入图片描述

英伟达GeForce GTX 780架构。该设备具有12个巨核,英伟达称其为“多流处理器(streaming multiprocessors)”(SMX)。每个SMX具有12个SIMD单元(由特化的双精度和专用函数单元组成),1个L1缓存和1个只读数据缓存。

AMD和英伟达的架构中,使用中间语言对设备进行编程,采用的是智能SIMD模型(其中指令流代表着一个单通道SIMD单元),英伟达称这种方式为“单指令多线程”(也被称为“基于SIMD的单程多数据”)。

AMD使用ISA的方式是显式的添加了向量支持,这样就能基于“wavefront”对程序计数器进行管理,通过计时寄存器对不同的分支进行管理。

指令集并行化的方式很多。
AMD Radeon R9 290X就能在每个时钟周期发出多个指令,每条指令都发源于不同的程序计数器(每条矢量指令在周期内可能从不同的矢量单元发出)。
英伟达GeForce GTX 780的四个执行流水上,两个线程能同时协同工作。
AMD之前的设计(比如,Radeon HD 6970)会使用VLIW指令。实际上,Radeon HD 6970Radeon R9 290X在执行单元的设计上非常相似,其中的差异很大程度上取决于指令,前者单线程执行编译结构化指令,后者运行时四线程执行。这两种设计都在执行资源方面都是超标量的,访问内存、执行算法,以及同一核上线程执行的其他操作,如果在同一线程中就不需要超标量的设计了。这种架构的吞吐量也随着多线程的加入得到了提高,因为多线程可以对单线程的延迟进行掩盖。

比如市场上的GPU,高端的AMD和英伟达模型包含多个核。每个核都可看做为一个CPU,Radeon R9 290X具有44个核(每个核都由4个矢量单元),英伟达的设计有12个核(其核更大,每个核具有12个矢量单元)。每个核都有一块便签式存储缓存(在OpenCL中,可作为local内存由工作组进行分配)。

需要清楚的是,高端GPU设计严重依赖于线程状态,这就允许GPU可以快速的在多程序和高吞吐率间进行切换。与传统设计相比,当代高端CPU和GPU不再依赖复杂的乱序或单线程多流水并发。GPU是面向吞吐量的设计,非常依赖于线程级别的并发,其利用大量的向量处理单元来提高吞吐量。

APU和类APU设计

片上系统(SoC)的设计占据了嵌入式市场很长一段时间。目前,SoC的方式占领着移动市场,为移动端设备提供更好的性能。这样将处理器融合的设计(融合了CUP和GPU),除了在视频编码、随机数生成器和加密电路方面不够好之外,其在桌面的低端领域还是很流行的,其代表产品就是笔记本电脑和上网本。之后,随着晶体管体积收缩达到上限,CPU核芯不能在为性能带来多大的提高,这时的SoC已经遍布了高端桌面领域。在高端桌面领域,集成GPU的方式在能耗上要远远小于离散GPU,不过在性能方面离散GPU通常还是好于集成GPU。目前,市场上该类产品的主要架构就是,基于AMD的悍马和压路机架构的产品,以及Intel的Haswell架构产品。

AMD的设计针对低耗能和低端主流市场,其Beema和Mullins产品功耗在4.515瓦左右,这两款产品上融合了基于悍马架构的低耗能CPU核,以及低端的Radeon R9 GPU。这些部件使用的是28nm技术。AMD的高性能APU——Kaveri——是基于压路机内核的一款非常高性能的GPU。Kaveri A10-7850K的设计如图所示。
在这里插入图片描述

A10-7850K APU具有2个压路机CPU和8个Radeon R9 GPU核(总共有32个16通道SIMD单元)。这款APU具有一个高速总线,用于链接GPU和DDR3内存,并且具有一个着色器通道,其可以选择性的与CPU缓存保持一致。

Intel高端酷睿i7 CPU设计如图所示。具有4个Haswell微处理架构的核,集成的是Intel HD系列GPU,其完全支持OpenCL和DirectX 11。
在这里插入图片描述

集成HD 4000的i7处理器。虽然Intel并不称其为“APU”,不过从芯片的原理上和AMD的APU一样。Intel结合了4个Haswell x86处理器和图像处理器使用一个共享终级缓存(LLC,last-level cache),通过环形总线进行通讯。

APU架构为CPU和GPU的数据共享提供了空间,以缓解GPU和CPU数据通讯所带来的瓶颈。这就意味着使用集成显卡的方式会缩短数据传输的距离,而不用再受到PCIe总线的传输速度限制。要想对PCIe的方式进行改进,就需要牺牲一部分CPU内存带宽,作为两个设备的共享带宽,并通过共享带宽和离散GPU进行数据交互。对算法进行实现的时候,就需要将数据交互的部分考虑进去。集成设计在CPU和GPU混合编程时,减少数据交互的耗时,可以打破数据交互耗时过长所带来的瓶颈

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值