为什么我们仍然使用CPU而不是GPU?

厄尔

在我看来,这些天来,很多计算都是在GPU上完成的。显然,图形是在此处完成的,但是使用CUDA等工具,AI,哈希算法(认为是比特币)等也可以在GPU上完成。为什么我们不能仅仅放弃CPU并单独使用GPU?是什么使GPU比CPU快得多?

bw德拉科

TL; DR回答: GPU比CPU具有更多的处理器内核,但是由于每个GPU内核的运行速度都比CPU内核慢得多,并且不具有现代操作系统所需的功能,因此它们不适合每天执行大多数处理计算。它们最适合计算密集型操作,例如视频处理和物理模拟。


GPGPU仍然是一个相对较新的概念。GPU最初仅用于渲染图形。随着技术的进步,GPU相对于CPU的大量内核被用于开发GPU的计算能力,从而使它们可以同时处理许多并行数据流,而不管这些数据可能是什么。尽管GPU可以具有数百甚至数千个流处理器,但它们的运行速度都比CPU内核慢,并且具有较少的功能(即使它们的Turing完整并且可以被编程为运行CPU可以运行的任何程序)。GPU缺少的功能包括中断和虚拟内存,这是实现现代操作系统所必需的。

换句话说,CPU和GPU具有明显不同的体系结构,使其更适合于不同的任务。GPU可以处理许多流中的大量数据,对其执行相对简单的操作,但不适用于对单个或几个数据流进行繁重或复杂的处理。CPU在每个核的基础上(以每秒的指令数计算)要快得多,并且可以更轻松地对单个或几个数据流执行复杂的操作,但不能同时有效地处理多个流。

结果,GPU不适合处理无法从中受益或无法并行化的任务,包括许多常见的消费类应用程序,例如文字处理器。此外,GPU使用根本不同的架构。人们必须为GPU编写专门的应用程序才能正常工作,并且对GPU进行编程需要采用截然不同的技术。这些不同的技术包括新的编程语言,对现有语言的修改以及新的编程范例,它们更适合于将计算表示为要由许多流处理器执行的并行操作。有关编程GPU所需技术的更多信息,请参阅Wikipedia上有关流处理并行计算的文章

现代GPU能够执行矢量运算和浮点运算,而最新的显卡则能够处理双精度浮点数。诸如CUDA和OpenCL之类的框架使程序能够为GPU编写,并且GPU的性质使它们最适合于高度可并行化的操作,例如科学计算中,在该计算中,一系列专用的GPU计算卡可以替代小型的GPU。计算群集,如NVIDIA Tesla个人超级计算机中的拥有Folding @ home经验的拥有现代GPU的消费者可以使用它们为GPU客户端做出贡献,GPU客户端可以以非常高的速度执行蛋白质折叠模拟并为项目做出更多的贡献(请务必阅读FAQs)。首先,尤其是与GPU相关的内容)。GPU还可以使用PhysX在视频游戏中实现更好的物理模拟,加速视频编码和解码,并执行其他计算密集型任务。GPU最适合执行这些类型的任务。

AMD率先推出了称为加速处理单元(APU)的处理器设计,该处理器将传统的x86 CPU内核与GPU结合在一起。这种方法使图形性能大大优于主板集成的图形解决方案(尽管无法与更昂贵的分立GPU匹敌),并允许紧凑,低成本的系统,并具有良好的多媒体性能,而无需单独的GPU。最新的英特尔处理器还提供了片上集成图形,尽管竞争性集成GPU性能目前仅限于使用Intel Iris Pro Graphics的少数芯片。随着技术的不断进步,我们将看到这些曾经分离的零件的融合程度越来越高。AMD的构想未来,CPU和GPU可以集成在一起,能够无缝地完成同一任务

尽管如此,由PC操作系统和应用程序执行的许多任务仍然更适合CPU,并且需要大量工作来使用GPU加速程序。由于许多现有软件都使用x86架构,并且由于GPU需要不同的编程技术并且缺少操作系统所需的几个重要功能,因此日常计算从CPU到GPU的一般过渡非常困难。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们使用CPU而不是GPU进行光线跟踪?

来自分类Dev

为什么我们仍然使用HTTP而不是WebSocket来构建Web应用程序?

来自分类Dev

为什么我们不能只使用[] []而不是int [] []?

来自分类Dev

为什么我们使用WebDriver而不是Selenium IDE?

来自分类Dev

为什么我们不能只使用[] []而不是int [] []?

来自分类Dev

为什么我们使用 promise 而不是 if/then 语句?

来自分类Dev

为什么我们仍然可以使用已处置的对象?

来自分类Dev

为什么我们仍然在Groovy / Grails中使用package关键字?

来自分类Dev

为什么我们使用setLayoutParams?

来自分类Dev

为什么我们使用TaskStackBuilder?

来自分类Dev

为什么我们使用@staticmethod?

来自分类Dev

为什么我们使用扩展?

来自分类Dev

为什么我们使用“NULL”?

来自分类Dev

为什么我们使用@Echo off / on而不是仅使用Echo off / on?

来自分类Dev

为什么我们应该使用类而不是记录,反之亦然?

来自分类Dev

为什么我们更喜欢在$ q中使用$ q而不是$ http

来自分类Dev

为什么当我们使用SMALLINT而不是DECIMAL时SUM更快

来自分类Dev

为什么我们不能只使用数组而不是varargs?

来自分类Dev

为什么我们使用#include“ stdafx.h”而不是#include <stdafx.h>?

来自分类Dev

为什么我们在jQuery中使用$(document)而不是$(“ document”)?

来自分类Dev

为什么我们开始使用.html而不是.htm?

来自分类Dev

为什么我们在Rails记录器中使用块而不是字符串?

来自分类Dev

为什么我们不能在WCF中使用抽象类而不是接口?

来自分类Dev

为什么我们在组装时使用sub esp,4而不是推送寄存器?

来自分类Dev

为什么我们应该使用接口而不是具体类型?

来自分类Dev

为什么我们使用cp复制文件而不是dd?(在Unix衍生物中)

来自分类Dev

为什么我们应该使用本地php gettext而不是gettexxt库

来自分类Dev

为什么我们开始使用.html而不是.htm?

来自分类Dev

为什么我们建议使用迭代器而不是列表(低级解释)

Related 相关文章

  1. 1

    为什么我们使用CPU而不是GPU进行光线跟踪?

  2. 2

    为什么我们仍然使用HTTP而不是WebSocket来构建Web应用程序?

  3. 3

    为什么我们不能只使用[] []而不是int [] []?

  4. 4

    为什么我们使用WebDriver而不是Selenium IDE?

  5. 5

    为什么我们不能只使用[] []而不是int [] []?

  6. 6

    为什么我们使用 promise 而不是 if/then 语句?

  7. 7

    为什么我们仍然可以使用已处置的对象?

  8. 8

    为什么我们仍然在Groovy / Grails中使用package关键字?

  9. 9

    为什么我们使用setLayoutParams?

  10. 10

    为什么我们使用TaskStackBuilder?

  11. 11

    为什么我们使用@staticmethod?

  12. 12

    为什么我们使用扩展?

  13. 13

    为什么我们使用“NULL”?

  14. 14

    为什么我们使用@Echo off / on而不是仅使用Echo off / on?

  15. 15

    为什么我们应该使用类而不是记录,反之亦然?

  16. 16

    为什么我们更喜欢在$ q中使用$ q而不是$ http

  17. 17

    为什么当我们使用SMALLINT而不是DECIMAL时SUM更快

  18. 18

    为什么我们不能只使用数组而不是varargs?

  19. 19

    为什么我们使用#include“ stdafx.h”而不是#include <stdafx.h>?

  20. 20

    为什么我们在jQuery中使用$(document)而不是$(“ document”)?

  21. 21

    为什么我们开始使用.html而不是.htm?

  22. 22

    为什么我们在Rails记录器中使用块而不是字符串?

  23. 23

    为什么我们不能在WCF中使用抽象类而不是接口?

  24. 24

    为什么我们在组装时使用sub esp,4而不是推送寄存器?

  25. 25

    为什么我们应该使用接口而不是具体类型?

  26. 26

    为什么我们使用cp复制文件而不是dd?(在Unix衍生物中)

  27. 27

    为什么我们应该使用本地php gettext而不是gettexxt库

  28. 28

    为什么我们开始使用.html而不是.htm?

  29. 29

    为什么我们建议使用迭代器而不是列表(低级解释)

热门标签

归档