cpu和gpu的性能有何不同

cpu和gpu的性能有何不同,第1张

cpu全称Central Processing Unit中文名:中央处理器

CPU一般由逻辑运算单元、控制单元和存储单元组成。在逻辑运算和控制单元中包括一些寄存器,这些寄存器用于CPU在处理数据过程中数据的暂时保存。

CPU虽然有多核,但总数没有超过两位数,每个核都有足够大的缓存;CPU有足够多的数字和逻辑运算单元,并辅助有很多加速分支判断甚至更复杂的逻辑判断的硬件。cpu拥有超强的逻辑能力。CPU擅长处理具有复杂计算步骤和复杂数据依赖的计算任务,如分布式计算,数据压缩,人工智能,物理模拟,以及其他很多很多计算任务等

GPU全称Graphic Processing Unit中文名为:图形处理器

GPU能够从硬件上支持T&L(TransformandLighting,多边形转换与光源处理)的显示芯片,因为T&L是3D渲染中的一个重要部分,其作用是计算多边形的3D位置和处理动态光线效果,也可以称为“几何处理”。一个好的T&L单元,可以提供细致的3D物体和高级的光线特效;只不过大多数PC中,T&L的大部分运算是交由CPU处理的(这也就是所谓的软件T&L),由于CPU的任务繁多,除了T&L之外,还要做内存管理、输入响应等非3D图形处理工作,因此在实际运算的时候性能会大打折扣,常常出现显卡等待CPU数据的情况,其运算速度远跟不上今天复杂三维游戏的要求。即使CPU的工作频率超过3GHz或更高,对它的帮助也不大,由于这是PC本身设计造成的问题,与CPU的速度无太大关系。

gpu是作为一个附属型处理器出现存在的,它主要处理计算机中与图形计算有关的工作。

GPU的核数远超CPU,被称为众核,但每个核拥有的缓存大小相对小。GPU的数字逻辑运算单元也少而简单(GPU初始时在浮点计算上一直弱于CPU)。gpu拥有超高的运算速度。

GPU擅长于图像处理,所以gpu主要是用在图像、视频游戏等领域。GPU的功耗远远超过CPU。

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。它与内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。

CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微 *** 作,然后发出各种控制命令,执行微 *** 作系列,从而完成一条指令的执行。指令是计算机规定执行 *** 作的类型和 *** 作数的基本命令。指令是由一个字节或者多个字节组成,其中包括 *** 作码字段、一个或多个有关 *** 作数地址的字段以及一些表征机器状态的状态字以及特征码。有的指令中也直接包含 *** 作数本身。

两者的区别在于存在于片内的缓存体系和数字逻辑运算单元的结构差异。

首先需要解释CPU和GPU这两个缩写分别代表什么。CPU即中央处理器,GPU即图形处理器

两者的区别在于存在于片内的缓存体系和数字逻辑运算单元的结构差异:CPU虽然有多核,但总数没有超过两位数,每个核都有足够大的缓存和足够多的数字和逻辑运算单元,并辅助有很多加速分支判断甚至更复杂的逻辑判断的硬件;

GPU的核数远超CPU,被称为众核(NVIDIA Fermi有512个核)。每个核拥有的缓存大小相对小,数字逻辑运算单元也少而简单(GPU初始时在浮点计算上一直弱于CPU)。从结果上导致CPU擅长处理具有复杂计算步骤和复杂数据依赖的计算任务,如分布式计算,数据压缩,人工智能,物理模拟,以及其他很多很多计算任务等。

GPU由于历史原因,是为了视频游戏而产生的(至今其主要驱动力还是不断增长的视频游戏市场),在三维游戏中常常出现的一类 *** 作是对海量数据进行相同的 *** 作,如:对每一个顶点进行同样的坐标变换,对每一个顶点按照同样的光照模型计算颜色值。GPU的众核架构非常适合把同样的指令流并行发送到众核上,采用不同的输入数据执行。

在2003-2004年左右,图形学之外的领域专家开始注意到GPU与众不同的计算能力,开始尝试把GPU用于通用计算(即GPGPU)。之后NVIDIA发布了CUDA,AMD和Apple等公司也发布了OpenCL,GPU开始在通用计算领域得到广泛应用,包括:数值分析,海量数据处理(排序,Map-Reduce等),金融分析等等。

gpu二缓一致,GPU的LLC是全部SM共享的,memory-side caching, 采用write-back policy,不存在一致性的问题,在异构架构中,我们可以在CPU和加速之间暴露一个全局的共享内存接口,我们假设CPU、GPU等设备共享相同的物理内存(如手机上的SoC这种情况),如下图所示。在这种系统中,共享内存会引发一些新的问题,如什么是内存一致性模型?内存一致性模型如何实现?加速和处理器的私有缓存如何保持一致?我们接下来首先讨论加速内的内存一致性和缓存一致性,重点是GPU,然后讨论跨加速的内存一致性和缓存一致性。

异构SoC系统模型

GPU的内存一致性和缓存一致性

早期GPU的架构与编程模型

早期GPU主要为并行图形工作负载设计,特点是数据并行度高,但数据共享、同步和通信程度低。

GPU架构

GPU通常有几十个内核,叫做流式多处理器(Streaming Multiprocessors,SM),每个SM都是高度多线程的,能够运行上千条线程,映射到SM上的线程共享L1缓存和本地scratchpad内存,所有的SM都共享一个L2缓存。GPU通常将线程分组执行,称为warps,一个warp中的所有线程共享PC和堆栈,可以使用掩码来执行独立的线程,表明哪些线程在执行,哪些线程没有在执行,这种并行方式就是我们常听说的SIMT。但是最近,GPU开始允许一个warp中的线程有独立的PC和堆栈,允许线程独立调度,我们接下来也假设线程是可以独立调度的。

由于图形工作负载并不经常共享数据或进行同步,早期GPU选择不在L1缓存实现硬件的缓存一致性。

GPU编程模型

和CPU类似,GPU也有一套虚拟ISA,同时也有一套更高级别的语言框架,如CUDA和OpenCL,框架中的高级语言被编译成虚拟的ISA,并被翻译为本地的二进制文件。GPU虚拟ISA和高级语言框架通过被称为作用域(scope)的线程结构,向程序员暴露GPU架构的层次结构。和CPU相比,GPU线程被分组为叫做Cooperative Thread Arrays(CTA)的集群。CTA作用域指来自同一个CTA的线程集合,保证映射到相同的SM,并共享同一个L1huancun。GPU作用域指的是来自同一个GPU的线程集合,可以来自相同或不同的CTA,并共享L2缓存。最后,系统作用域指整个系统所有线程的集合,共享LLC缓存或统一的共享内存。

这种方式可以在没有硬件缓存一致性的情况下,用软件的方式实现数据同步和通信。

GPU内存一致性

GPU支持宽松一致性模型,通过FENCE指令进行同步,但是由于没有硬件缓存一致性,GPU的FENCE只针对属于同一CTA的其他线程。GPU的store指令也不保证原子性。

因此,早期GPU明确禁止在CTA组之间进行数据同步,但实践中可以通过绕过L1,在L2上进行同步。这种方案也有一些问题,绕过L1会导致性能下降,且程序员需要仔细地编写程序。

测验问题8:GPU不支持硬件缓存一致性,因此无法实现内存一致性模型。

答:错误。早期的GPU不支持硬件缓存一致性,但是支持作用域内的宽松内存一致性模型。

GPGPU的内存一致性和缓存一致性

GPGPU最好满足以下特点:

严格而直观的内存一致性模型,允许在所有线程之间进行同步

一个能够实现内存一致性模型的缓存一致性协议,允许高效的数据共享和同步,且保持常规GPU架构的简单性,因为GPU的主要任务仍然是图形工作负载

我们可以使用类似多核CPU的方法来实现缓存一致性,使用一种与内存模型无关的协议。然而这种方法并不适用于GPU,主要有两个原因。首先,类似于CPU的缓存一致性协议在GPU环境下会产生很高的通信开销,因为L1缓存的总容量通常与L2相当,甚至更大,会产生很大的面积开销,设计也非常复杂;其次,由于GPU保持着数千个活跃的硬件线程,因此需要跟踪相应数量的一致性事务,需要大量的硬件开销。

具体的技术细节可以参考原书(埋坑,GPU的部分确实现在看来有些难理解,等之后学习了GPU的架构之后再回来填坑)。

其他异构系统

我们开始进一步讨论如何在多个设备的系统中暴露一个全局的共享内存接口,难点在于每个设备都可能通过不同的一致性协议来实现不同的内存模型,当多个内存模型不同的设备被集成在一起时,异构系统的内存模型是什么样的?如何对这种系统进行编程?如何整合多个设备的缓存一致性协议?我们接下来简单讨论这些问题,并概述设计空间。

异构系统的内存模型

如果两个设备A和B连接在一起并共享内存,这种情况下的内存模型是什么样的?一个符合直觉的答案是选择其中较弱的一个作为整体的内存模型,但如果两个内存模型无法比较,这种答案就不可行了。即使两者可以比较,可能也会有更好的答案。

四个设备组成的异构系统

在如上所示的异构系统中,C1和C2内存模型为SC,C3和C4内存模型为TSO。考虑下面的例子,在第一个例子中,有可能r1和r2同时读到0,但在第二个例子中插入了FENCE后,r1和r2就不能同时读到0了,但需要注意的是在SC的线程上仍然不需要插入FENCE,这种系统实际上产生了一个不同于SC和TSO的复合内存模型。

Dekker算法的例子

在这种系统中变成也是比较困难的,很难直接精确定义复合内存模型,更好的办法可能是使用HSA或OpenCL等进行编程。

异构系统的缓存一致性协议

通过分层缓存一致性来集成多个设备

考虑两个多核设备A和B,每个设备都有自己的内存模型,并通过不同的缓存一致性协议来实现内存模型,如上图所示。我们应该如何将两个设备集成到一个共享内存异构系统中,并将两个缓存一致性协议正确连接在一起?答案取决于每个设备的内存 *** 作是否满足自己的内存排序规则。

分层缓存一致性

在分层缓存一致性系统中,本地缓存一致性控制器收到请求后,首先试图在本地满足该请求,如果无法满足就转发到全局一致性控制器,再转发到另一个设备的本地缓存一致性控制器。在这种设计中,全局控制器必须有足够丰富的接口来满足各个设备本地控制器发起的请求,且每个本地控制器必须用shim来扩展,作为两个控制器之间的接口转换。相关的一些例子可以参考原文。

减少异构系统缓存一致性的带宽需求

在异构系统中,内核之间的缓存一致性通信带宽可能成为性能瓶颈。一种解决思路是采用粗粒度的缓存一致性,比如在GPU本地以page大小的粒度进行跟踪,如果缓存未命中且已知该位置对应的page对GPU来说是私有的或只读的,就不需要访问全局的目录,而是可以从高带宽的总线从内存直接访问。

CPU-GPU系统中缓存一致性的一个低复杂度解决方案

我们可以采用选择性的GPU缓存,任何被映射到CPU内存的数据都不会缓存在GPU中,任何来自GPU内存的数据,如果目前被缓存在CPU中,也不会被缓存在GPU中。这个简单的策略可以很好地实现缓存一致性。为了实现这种方法,GPU维护一个粗粒度的目录,维护当前由CPU缓存的数据,当CPU访问GPU内存中的一个缓存块时,这个缓存块所在的区域就被插入到目录中,目录中所有的位置都不会被缓存到GPU中。不过这种方法也有坏处,即任何被CPU缓存的数据都必须从CPU中取回,为了解决这个问题需要进行进一步的优化,如GPU对CPU的请求进行合并、在GPU上加入一个特殊的CPU侧的缓存等。

以上就是关于cpu和gpu的性能有何不同全部的内容,包括:cpu和gpu的性能有何不同、“cpu”和“GPU”之间的区别有什么不一样、gpu二缓一致等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10125467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存