分享

1.1.3 CPU+GPU异构并行

 昵称17588304 2014-07-22

1.1.3  CPU+GPU异构并行

目前主流计算机的处理能力主要来自CPU和GPU。CPU与GPU一般经北桥 通过AGP或者PCI-E总线连接,各自有独立的外部存储器,分别是内存和显存。在一些芯片组中使用的集成GPU没有采用独立的显存芯片,直接从内存中分出一块区域作为显存。Intel和AMD提出的CPU-GPU融合产品还准备直接将CPU和GPU通过QPI或者HT总线连接,集成在一块芯片内。可以预见,受面积、功耗和散热的限制,此类融合产品不大可能集成性能很高的GPU,并且有可能不为GPU提供独立显存。

传统的CPU+GPU异构并行处理的典型任务是图形实时渲染。在这类应用中,CPU负责根据用户的输入和一定的规则(如游戏的AI)确定在下一帧需要显示哪些物体,以及这些物体的位置,再将这些信息传递给GPU,由GPU绘制这些物体并进行显示。两者的计算是并行的:在GPU绘制当前帧的时候,CPU可以计算下一帧需要绘制的内容。

在这些处理中,CPU负责的是逻辑性较强的事务计算,GPU则负责计算密集度高的图形渲染。为了满足事务计算的需要,CPU的设计目标是使执行单元能够以很低的延迟获得数据和指令,因此采用了复杂的控制逻辑和分支预测,以及大量的缓存来提高执行效率;而GPU必须在有限的面积上实现很强的计算能力和很高的存储器带宽,因此需要大量执行单元来运行更多相对简单的线程,在当前线程等待数据时就切换到另一个处于就绪状态等待计算的线程。简而言之,CPU对延迟将更敏感,而GPU则侧重于提高整体的数据吞吐量。CPU和GPU的设计目标的不同决定了两者在架构和性能上的巨大差异,具体来说有:

1.CPU线程与GPU线程

CPU的一个核心通常在一个时刻只能运行一个线程的指令。CPU的多线程机制通过操作系统提供的API实现,是一种软件粗粒度多线程。当一个线程中断,或者等待某种资源时,操作系统就保存当前线程的上下文,并装载另外一个线程的上下文。这种机制使得CPU切换线程的代价十分高昂,通常需要数百个时钟周期。某些具有超线程功能的CPU可以将一个物理核心虚拟成多个核心,但每个虚拟核心在一个时刻也只能运行一个线程。

GPU采用的则是由硬件管理的轻量级线程,可以实现零开销的线程切换。线程的切换在这里成为一件好事:当一个线程因为访问片外存储器或者同步指令开始等待以后,可以立即切换到另外一个处于就绪态的线程,用计算来隐藏延迟。当线程中的计算指令需要的时间较多,而访存相对较少,即计算密集度比较高时,延迟就可以被计算隐藏,而且线程越多,延迟隐藏得更好。

2.多核与众核

当前的主流CPU中一般有2~8个核心,每个核心中有3~6条执行流水线。这些核心极采用了很多提高指令级并行的技术,如超标量超深流水线、乱序执行、预测执行,以及大容量缓存等,也采用了如SSE、3Dnow!一类的数据级并行技术。由于缓存和控制逻辑需要很大面积,因此在一块芯片上能够集成的核心数量也就被限制了。

当前的NVIDIA GPU中有1~30个包含完整前端的流多处理器,每个流多处理器可以看成一个包含8个1D流处理器的SIMD处理器。CUDA就利用了多个流多处理器间的粗粒度任务级或数据级并行,以及流多处理器内的细粒度数据并行。

尽管GPU的运行频率低于GPU,但更多的执行单元数量还是使GPU能够在浮点处理能力上获得优势,即使是芯片组里集成的低端GPU,在单精度浮点处理能力上也能和主流的CPU打成平手,而主流GPU的性能则可以达到同时期主流CPU性能的10倍左右,如图1-4所示。

  

3.外部存储器

GT200 GPU的显存带宽达到了140GB/s,是同时期CPU最高内存带宽的5倍,图1-5是CPU与GPU同期带宽的比较。造成GPU与CPU外部存储器带宽差异的主要原因有两个:

   

首先,显存中使用的GDDR存储器颗粒与内存的DDR存储器颗粒在技术上基本相同,但显存颗粒是直接固化在显卡的PCB板上的,而内存则为了兼顾可扩展性的需要,必须通过DIMM插槽与主板相连。直接焊在PCB板上的显存的信号完整性问题比通过插槽连接的内存更容易解决,显存的工作频率也通常比使用相同技术的内存要高一些。

其次,目前的CPU存储器控制器一般基于双通道或者三通道技术的,每个通道位宽64bit;而GPU中则存在数个存储器控制单元,例如GTX280 GPU中就有8个存储器控制器,每个控制两片位宽32bit的显存芯片,使总的存储器位宽达到512bit。这样,尽管内存中的DDR存储器颗粒比显卡上的GDDR存储器颗粒还要多,但CPU能够同时访问的存储器颗粒反而少于GPU。

4.缓存

CPU中的缓存主要用于减小访存延迟和节约带宽。缓存在多线程环境下会发生失效反应:在每次线程上下文切换之后,都需要重建缓存上下文,一次缓存失效的代价是几十到上百个时钟周期。同时,为了实现缓存与内存中数据的一致性,还需要复杂的逻辑进行控制。

在GPU中则没有复杂的缓存体系与替换机制。GPU缓存是只读的,因此也不用考虑缓存一致性问题。GPU缓存的主要功能是用于过滤对存储器控制器的请求,减少对显存的访问。所以GPU上缓存的主要功能不是减小访存延迟,而是节约显存带宽。

从上面的分析可以看出,GPU的主要设计目标是以大量线程实现面向吞吐量的数据并行计算,适合于处理计算密度高、逻辑分支简单的大规模数据并行任务。而CPU则有复杂的控制逻辑和大容量的缓存减小延迟,能够适应各种不同的情况,尤其擅长复杂逻辑运算。使用GPU处理数据并行任务,而由CPU进行复杂逻辑和事务处理等串行计算,就可以最大限度地利用计算机的处理能力,实现桌面上的超级计算。CPU+GPU并行不只是计算能力的提高,也不只是节省了成本和能源;将高性能计算普及到桌面,使得许多以往不可能的应用成为了现实,这种灵活性本身就是一种革命性的进步。

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多