您好、欢迎来到现金彩票网!
当前位置:秒速时时彩 > 算术下溢 >

为什么 CPU 的浮点运算能力比 GPU 差为什么不提高 C的浮点运算能

发布时间:2019-06-16 08:27 来源:未知 编辑:admin

  为什么 CPU 的浮点运算能力比 GPU 差,为什么不提高 CPU 的浮点运算能力?

  [图片] 问题如题所示,我主要想知道既然CPU的浮点运算能力如此落后于GPU,为什么不提升CPU这方面的能力呢?是因为浮点运算更偏向于图形专业应用吗?还是因为CPU工艺方面的制约呢?

  速度区别主要是来自于架构上的区别。架构的不同则是因为硬件的设计目的不一样。

  CPU和GPU进行计算的部分都是ALU,而如图所示,GPU绝大部分的芯片面积都是ALU,而且是超大阵列排布的ALU。这些ALU都是可以并行运行的,所以浮点计算速度就特别高了。

  相比起来,CPU大多数面积都需要给控制单元和Cache,因为CPU要承担整个计算机的控制工作,没有GPU那么单纯。

  所以GPU的程序控制能力相比CPU来说不强,稍早时候的CUDA程序像是递归都是不能用的(较新的设备上可以了)。

  我觉得也不是CPU不能提高浮点计算速度,而是因为没什么特别的必要了。咱们通常的桌面应用根本没有什么特别的浮点计算能力要求。而同时GPU这样的设备已经出现了,那么需要浮点计算的场合利用上就行了

  首先,「速度区别主要是来自于架构上的区别」是一个表面化的解释。对,架构是不同。但是这种不同是目前各个厂家选择的现状,还是由于本质的原因决定的?CPU 能不能增加核?GPU 那张图为什么不需要 cache?

  首先,CPU 能不能像 GPU 那样去掉 cache?不行。GPU 能去掉 cache 关键在于两个因素:数据的特殊性(高度对齐,pipeline 处理,不符合局部化假设,很少回写数据)、高速度的总线。对于后一个问题,CPU 受制于落后的数据总线标准,理论上这是可以改观的。对于前一个问题,从理论上就很难解决。因为 CPU 要提供通用性,就不能限制处理数据的种类。这也是 GPGPU 永远无法取代 CPU 的原因。

  其次,CPU 能不能增加很多核?不行。首先 cache 占掉了面积。其次,CPU 为了维护 cache 的一致性,要增加每个核的复杂度。还有,为了更好的利用 cache 和处理非对齐以及需要大量回写的数据,CPU 需要复杂的优化(分支预测、out-of-order 执行、以及部分模拟 GPU 的 vectorization 指令和长流水线)。所以一个 CPU 核的复杂度要比 GPU 高的多,进而成本就更高(并不是说蚀刻的成本高,而是复杂度降低了成片率,所以最终成本会高)。所以 CPU 不能像 GPU 那样增加核。

  至于控制能力,GPU 的现状是差于 CPU,但是并不是本质问题。而像递归这样的控制,并不适合高度对齐和 pipeline 处理的数据,本质上还是数据问题。

  更别说CPU核心指令集更全面 GPU核心基本只有SIMD指令(因为GPU主要是用于图形处理 向量运算远比标量运算多 并且对CPU来说多一套指令运算单元 就是几个核心的成本 对GPU来说就是多几百上千个核心的成本)

  CPU每个核心有独立的缓存 GPU基本是所有核心共享一个缓存(GPU主要做图形渲染 所有核心都执行同一份指令 获取同样的数据 CPU主要是执行多个串行任务 每个核心可以处理不同的任务 从不同地方获取不同的数据)

  GPU乱序执行可以有 因为所有核心都干一样的事情 可以共享一份指令 不需要独立的乱序执行 (不过一般不会有 因为这个功能可以直接放到编译器中实现 因为GPU的开发语言少 基本只有GLSL和HLSL 编译器是厂商自己开发的 不像CPU那样 开发语言多如牛毛 各种编译器五花八门 指令集大相径庭 所以才迫切需求这种动态的乱序执行优化)

  分支预测肯定不会有 成本上来说分支预测不能共享 每个核心都多一个分支预测的逻辑单元成本太大

  关键是根本就不需要 GPU程序一般都很短 本来就可以全部装载到高速缓存中 其次是对于GPU处理的任务而言 分支预测也无意义

  GPU的强项是并行运算能力比CPU强(多个不同任务的并行运算GPU也无法胜任 GPU只适合处理单个可并行任务的并行运算) 而不是浮点运算能力强(这个谣言也不知道谁传出来的 非要强调浮点运算 非要说浮点运算的话 不如说大多数老式GPU甚至没有整数运算能力 因为根本没有整数指令 最早设计目的是加速图形渲染 基本都是浮点运算 所以GPU核心的SIMD指令 只有浮点指令 没有整数指令 新型GPU因为不光光用于图形渲染 还想推广到通用计算 就是所谓的GPGPU 所以开始加入整数运算的支持)

  CPU的核心就像一个心算高手 并且掌握各种奇技淫巧 一分钟能算100次四则运算

  但是 你让10个心算高手合作算10000个四则运算 和 1000个普通人合作算10000个四则运算

  (10个心算高手每人算1000个要花10秒 1000个普通人每人算10个只要1秒)

  但是如果这10000个四则运算有依赖 就是下一题的条件依赖于上一题的结果

  当然是心算高手快 因为一旦有这种强依赖 就只能串行 10个人干和1000个人干并不会比1个人干来得快

  一个全自动流水线 如果你只让他生产一个东西 绝对不会比一台高级数控机床快

  其实可以提高啊,GPU的运算能力好主要是高并行度+简单指令集嘛。CPU想要这么做的话,推出一个针对浮点的简单指令集,然后做好多好多个支持这个指令集的运算单元一起跑就好了。

  等等,这件事Intel已经干过了,那个指令集叫AVX-512,支持512 bit的向量指令,然后把一大把这种针对浮点优化过的核心捆成一捆打包出售,叫做Xeon Phi……只不过虽然它里面是CPU的核心,但是因为功能是加速器,所以并不称作CPU而已。

  至于你问我Xeon Phi的性能如何,我没用过不知道。不过世界最快的超级计算机(天河2号)用这个,并且前10名里面,X86体系结构的5台机器有两台用这个,两台用GPU,一台什么都不用。可见Xeon Phi作为浮点加速卡还是能跟GPU刚的。

  所以我的回答就是,如果你非要针对浮点优化,CPU的那种体系结构也能跟GPU差不多快。只不过这么优化就成了专门的加速卡了,一般我们不再把它称作CPU。

  如果只是算加法,当然是1000个小学生算得快,但是如果来一个微积分再来一个排列组合,这种问题只能让大学生来,这无论给你多少个小学生都搞不定。

  GPU计算的都是纯数值运算,这个计算量很大,但是简单,可以让小学生用人海战术搞定。

  但是CPU管的就多了,不仅仅是数值运算,还有逻辑运算,寻址,跳转,中断等等,这种复杂的问题只能让大学生来,你丢给小学生它搞不定啊。

  大多数情况下,cpu性能由单核心性能决定,提升单核心性能才能提升用户体验,增加核心数量主要是提升跑分成绩,但用户体验并没有如同跑分成绩一般上升,所以cpu需要权衡两者之间的利弊,提升核心数量提高了成本,但用户体验并没有那么大提升,得不偿失,所以这么多年来cpu核心数量只是缓慢提升。

  gpu是显卡用的,本身的计算就高度并行,增加核心数量可以实质的提升性能。这是因为它仅仅用于显卡渲染这种并行化很高的计算。显卡可以用大量堆砌核心数量来提升性能,这比提升单核性能更简单。

  把跑分除以核心数量之后,cpu的单核心浮点性能实际上高于gpu。所以题主的问题其实是个伪命题。

  CPU的浮点运算已经提高很多了,尤其是引入AVX2以后。基本同频的skylake对ivb,浮点性能几乎翻倍。

  而且老黄这个奸商把maxwell双精单元砍到1/32以后,CPU的双精浮点性能都能吊打显卡的了。

  gpu因为主要要处理高精度的图像颜色还有等等各种3d绘图的中间过程,所以需要有强大的浮点计算能力来支撑。

  而cpu处理的大量内容并没有这么多的浮点计算,所以本着好钢用在刀刃上的原则,在固定的成本下,也不用把宝贵的空间用来完成这些地方。

  精确的浮点运算是非常复杂的,阶码和尾数要分别反复计算和规格化,相比定点或者说整形运算延迟都要成倍增加。不过最大问题是浮点数在处理器中的表示是有限的,有上限和下限,但是很难预测运算时候是否会出现处理器无法表示的情况,这就需要处理器能识别这样的例外或者错误,使其不影响接下来的运算---科学计算中大量使用迭代和递归,误差和错误会累积放大。以前(386-387时代以前)很容易就能写出一些程序在“高精度”机器上跑出很有趣的花样---几秒钟的运算就能提交一个误差百分之几千的结果。

  要防止这样的误差,代价是极大的,发现浮点错误或者例外,就要立即停止流水线中的运算,有些中断例程要阻塞流水线几十甚至几百周期。但是这其实是最快的处理方案,因为后续的运算很可能都不再正确。没有这样的机制,就需要之后做更大量的校验和补偿运算,或者面对一个彻底跑飞的结果。

  再看cpu和gpu就很容易明白差别在什么地方。cpu是很少的alu(甚至可能只有一组浮点流水线),所以可以做精确的浮点计算。SSE之类的SIMD一次可以进行更多的浮点运算,例外处理就马虎一些了(比如sse往往自动把上溢或下溢的结果表示为可表示的最大数和最小数....),往往需要编译器有巧妙地处理。而gpu,那么多的alu同时进行大量的浮点运算,基本不可能实现完整的例外和错误处理------所以gpu进行浮点运算其编译器到程序以及可应用的范围都有很大的限制,需要尽可能的避免迭代和递归等等影响精度的算法等等。

  不过gpu在处理显示相关的运算中,浮点例外和浮点错还真不是什么大问题,玩早期3d游戏的人估计都对各种互相穿越的物品司空见惯了--那些其实就是追求高速度的gpu一定程度放弃数据精确性的结果。

  高性能计算领域非常看重浮点计算,所以才会研究用gpu加速浮点。这个领域的一些cpu就是以浮点处理为核心开发的,但是它们仍然是标量或者短向量的浮点组件,理论值与同规模的gpu仍然差很多,甚至有2个数量级的落差,所以才有题主的疑问。

  gpu里的浮点组件比cpu里的简单,其实也不是必然,早期cpu里的浮点组件未必比现在gpu里的强大。而现代cpu里fpu强大是因为对高频优化和有一些专用组件如移位器等,但这是相当浪费的,cpu一个浮点组件的规模足够gpu安排下几十个浮点组件,理论吞吐量仍然差别巨大。就是说如果cpu可以使用很多但是较弱的浮点组件,专家们绝对会毫不犹豫的。

  举个例子,同时代同工艺下8核cpu的面积下gpu可以安排下近千计算单元。即一个cpu浮点单元要应对上百个gpu浮点单元。即使考虑到整形组件和缓存等,cpu浮点单元仍要对应十几到几十个gpu浮点单元。即使频率高几倍理论性能仍然大大不及。但是专家们仍然坚持使用标量或者短向量的fpu,主要原因就是我上文描述的了。

  其实gpu浮点还有分枝跳转等问题,当然这些问题也与海量并行无法单独处理单个运算有关。

  其实这是跟人类的需求相负荷的,最早出来的时候人们对多媒体并没有这么大的需求,也就是对浮点的需求并不强烈,那自然就先解决重要的整数了,就这样一直发展着,直到后来GPU后来才有了较大发展。

  至于说为什么现在不提高cpu,只能说不需要不划算,cpu是通用型的设备,它要提供多种复杂的服务,而Gpu则相对来说比较单一,这样实现相同功能gpu最划算,就像常见的家用游戏机的效果比电脑好一样,实际上我们可以看到电脑的配置并不必家用机差,这就是专用和通用体现出来的一些区别,当然这些是基于现在的情况。

  你有本事把芯片面积增加六倍还能保证良率,然后居然还有足够多的逗比客户愿意花六倍的价钱买这个逗比芯片,那你就能把CPU的浮点性能提高六倍。

  一颗Knights Corner Xeon Phi轻松突破1000GFlops,与之相对的GTX980大概在144GFlops左右。

  这个主要看需求,gpu的出现就是为了加速适合并行处理的大规模计算。而CPU主要处理相关性的逻辑,这种逻辑一般是串行的,一般也不是浮点的。

  GPU的出现就是为了大量的浮点运算(图形图像处理),除图形图像外的其他任务很少用到浮点运算,所以CPU不是不能提高浮点运算能力,而是没必要。也许未来的哪一天GPU再次和CPU整合,不再作为单独的部件存在了。

  CPU虽然核心数没有GPU多,但CPU的缓存数量亦是GPU不能比的,加上如同SSE、AVX等诸多指令集,CPU并非不能进行大规模的计算。您在第二段中的比较不算太全面。 事实上有论文中用CPU和GPU做同样的任务,实现的速率相差不见得很大,甚至有时CPU更快。 只是由于缓存数较多,CPU可能更适合任务并行,而GPU更适合数据并行。

  以前CPU弱,要是搞个浮点数运算的协处理器,运算速度跑的飞起。当然了,如果真为了计算,CPU一样可以把ALU搞的很强大,不过没必要。毕竟术业有专攻嘛,CPU主要是流程控制,而不是计算,然而GPU在处理光线之类的渲染的时候,会做大量的计算工作。

  CPU的浮点运算能力一直在提高。主要瓶颈是功耗和芯片体积。目前市面上的通用CPU一般都集成了浮点运算器。但话说回来,没必要比较CPU和GPU的浮点运算能力,她们分工不同。就像比较李彦宏和百度某coder谁更了解汇编语言一样。

  CPU的芯片面积和功耗都有限制,不能什么都集成到一个芯片里。另外一个因素是市场需求。

  从架构的角度来讲,如果需要强大的浮点运算能力,那么浮点运算芯片一定是独立的,成网络的。

http://allpennsylvania.com/suanshuxiayi/97.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有