什么时候应该将工作转移到GPU而不是CPU?


15

正在开发诸如OpenCL之类的较新系统,以便我们可以在图形处理器上运行越来越多的代码,这是有道理的,因为我们应该能够尽可能多地利用系统中的功能。

但是,在所有这些新系统中,似乎GPU在各个方面都比CPU更好。因为GPU可以并行计算,所以多核GPU实际上看起来要比多核CPU好得多。您将能够一次进行许多计算,从而真正提高速度。在某些情况下,串行处理仍比并行处理更好,更快和/或更有效吗?



6
并不是关于硬件的问题。应该改写为“何时对CPU进行编程比对GPU进行编程”,这是IMO一个很好的p.se问题。请参阅SO上的GPGPU标签。但是架构“使用什么技术”的问题比这里要好。
凯特·格雷戈里

1
@Kate链接的超级用户问题似乎很好地涵盖了这个角度。通读它,老实说,我有点惊讶它没有被移植到这里。SO 上也有这个。我将重新讨论这个问题(既然您是对的,那么它的编程方面就在这里。)我希望我们看到的答案不仅指向该问题的现有(出色)覆盖范围。
亚当李尔

1
就@Anna而言,我认为答案需要更多的是关于程序员何时应该使用GPU,而不是纯粹的理论讨论,即GPU和CPU之间的区别是什么。我已经编辑标题以反映这一点。

2
@RetroX如果问题在不同的站点上,我们无法将其作为重复问题予以关闭。
亚当李尔

Answers:


26

但是,在所有这些新系统中,似乎GPU在各个方面都比CPU更好。

这是一个基本的误解。与当前的顶级CPU相比,当前的GPU内核仍然受到限制。我认为NVIDIA的Fermi架构是目前可用的最强大的GPU。它只有32位寄存器用于整数算术运算,而分支预测和推测执行的能力比目前的商用英特尔处理器要低。英特尔i7芯片提供了三个缓存级别,费米内核只有两个级别,费米上的每个缓存小于i7上的相应缓存。GPU内核之间的进程间通信相当有限,必须对计算进行结构调整以适应该限制(内核被捆绑到块中,并且块中内核之间的通信相对较快,但是块之间的通信较慢)。

当前GPU的显着局限性在于所有内核都必须运行相同的代码。与CPU中的内核不同,您不能告诉一个GPU内核运行您的电子邮件客户端,而告诉另一个GPU来运行您的Web服务器。您为GPU提供了反转矩阵的功能,并且所有内核都在不同的数据位上运行该功能。

GPU上的处理器生活在一个孤立的世界中。他们可以控制显示,但无法访问磁盘,网络或键盘。

使用GPU系统会产生大量的间接费用。GPU具有自己的内存,因此您的计算将受限于GPU卡上的内存量。在GPU内存和主内存之间传输数据相对昂贵。从实用上讲,这意味着将少量简短的计算从CPU交给GPU没有好处,因为设置和拆卸成本会浪费执行计算所需的时间。

最重要的是,当您拥有大量(可以成百上千个)可以并行计算的长计算副本时,GPU很有用。常见的典型任务是科学计算,视频编码和图像渲染。对于诸如文本编辑器之类的应用程序,可能对GPU有用的唯一功能是在屏幕上呈现类型。


双精度支持是Shader Model 5的一部分,AMD / ATI也提供。
Ben Voigt

@Ben,感谢您的纠正。我删除了错误的陈述。
查尔斯E.格兰特

11

GPU不是CPU那样的通用处理器。他们擅长做一件非常特定的事情-将相同的代码应用于大量数据-并且它们做得非常好,比CPU做得更好。但是大多数应用程序中的大多数并不是关于将相同的代码应用于大量数据。它是关于事件循环的:等待输入,读取输入,对其进行操作,然后等待更多输入。这是一个相当串行的过程,GPU吸纳了“串行”。

当您需要处理大量数据时,每个项目都可以独立于其他项目并行处理,然后继续将其发送到GPU。但是不要认为这是必须将所有东西都塞进去的“新范式”。

这个问题被标记为“优化”,因此请记住将其视为一个问题。在测试和性能分析显示需要进行优化的情况下应用GPU优化,并且任务的性质就是可以应用GPU优化。否则,不要理会它,因为这可能是过早的或不正确的优化,这会导致更多的问题而不是其解决的。


8

一个简单的答案是,当您需要对大量项目中的每一个进行相当小的,非常简单的计算时,GPU效果最佳。为了以这种方式完成很多工作,每个项目的计算必须独立于其他项目的计算。如果(通常)一项与另一项之间存在某种依赖关系,那么通常您需要找出一些打破它的方法,然后才能从GPU上执行大量代码。如果完全无法打破依赖关系,或者需要太多工作才能打破,则代码可能会在CPU上更快地执行。

当前大多数CPU也支持许多类型的操作,而这些操作是当前GPU根本不支持的(例如,用于多任务的内存保护)。

从略有不同的方向来看,CPU的设计(在很大程度上)是为程序员提供了相当方便的条件,而硬件人员则尽了最大的努力(这是最荒谬的最好的方法!)来创建可以维持这种方便模型的硬件。程序员,但仍会尽快执行。

GPU的发展方向恰恰相反:它们的设计主要是为了方便硬件设计人员,而OpenCL之类的东西试图在硬件限制的情况下提供尽可能合理的编程模型。

编写代码以在GPU上运行通常比在CPU上花费更多的时间和精力(因此将花费更多)。因此,这样做主要是在以下情况下(如果有):

  1. 这个问题是如此平行,以至于您可以从最小的努力中获得很大的收益,或者
  2. 速度增益是如此重要,以至于需要进行大量额外工作。

下面是每个一些明显的可能性-但一个庞大的应用数量显然是甚至还没有接近任何一个。我会很惊讶地发现(例如)CRUD应用程序很快就会在GPU上运行(如果确实如此,则可能会发生,因为有人会牢记这个确切的目标,而未必有一个趋于最佳的目标)成本/收益比)。

现实情况是,很多(我很想说“最”)的应用,典型的CPU远远超过速度不够快,以及编程方便(导致之类的新功能,更容易开发)是比数量更为重要执行速度。


3

您将能够一次进行许多计算,从而真正提高速度。

提高速度?所以呢?去年全年,我只需要回忆一次或两次。大部分我一直在要求的时间修改或修复逻辑,调整为不同的数据源,以提高用户交互等等等等。唯一速度的客户有兴趣在这些情况下是作出改变的速度。“请在一个月或两个星期内发布更好的新功能”。

不要误会我的意思-作为编码器,我喜欢彻底挤压CPU节拍。只是这种艺术通常没有很高的需求。

在某些情况下,串行处理仍比并行处理更好,更快和/或更有效吗?

我会说有很多情况。串行处理比并行处理更简单,这使得在速度不是关键要求的所有情况下,效率更高。串行处理可以更轻松地实现复杂的逻辑和用户界面,更易于指定和测试,维护和更改。

通常,串行处理可以使程序员的意图更清晰地表达,并且更易于阅读代码。我会说它可以节省最宝贵和稀缺的资源-程序员的大脑。


2

CPU仍然更加通用。例如,GPU在单精度方面比CPU效率更高,但在双精度方面却没有。CPU的库比GPU的库多得多。


3
您能详细一点吗?您提供了三个语句,但没有提供有关其准确性的信息或说明。

那么,缺乏有效的双精度计算的是常识:en.wikipedia.org/wiki/GPGPU
quant_dev

@quant:您的信息已过期至少2年:544 GigaFLOPS比任何主流CPU 都要快得多。
Ben Voigt

@Ben我看不到您的链接提到双精度性能的地方。
quant_dev


2

一个简单的规则是,如果可以根据线性代数的构造来表述您的操作并且对时间要求严格,请在GPU上执行此操作,否则请使用CPU。

GPU与大量的CPU不同,它们具有截然不同的性能特征。


如果它是“时间紧迫的”,则您可能没有时间为计算着色器重新配置GPU并上传数据。最大的问题是最大的好处。
Ben Voigt

@Ben,我认为我们对“时间关键”有不同的定义,我的意思是,计算在关键路径上持续了相当长的时间。
dan_waterworth 2011年

1

如果您需要原始数字运算,则可以使用GPU。但是,所有这些ALU都意味着更少的晶体管专用于控制流(分支)电路。因此,如果您需要编写需要大量复杂控制流程,许多条件语句等的内容,那么CPU将会更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.