正在开发诸如OpenCL之类的较新系统,以便我们可以在图形处理器上运行越来越多的代码,这是有道理的,因为我们应该能够尽可能多地利用系统中的功能。
但是,在所有这些新系统中,似乎GPU在各个方面都比CPU更好。因为GPU可以并行计算,所以多核GPU实际上看起来要比多核CPU好得多。您将能够一次进行许多计算,从而真正提高速度。在某些情况下,串行处理仍比并行处理更好,更快和/或更有效吗?
正在开发诸如OpenCL之类的较新系统,以便我们可以在图形处理器上运行越来越多的代码,这是有道理的,因为我们应该能够尽可能多地利用系统中的功能。
但是,在所有这些新系统中,似乎GPU在各个方面都比CPU更好。因为GPU可以并行计算,所以多核GPU实际上看起来要比多核CPU好得多。您将能够一次进行许多计算,从而真正提高速度。在某些情况下,串行处理仍比并行处理更好,更快和/或更有效吗?
Answers:
但是,在所有这些新系统中,似乎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有用的唯一功能是在屏幕上呈现类型。
GPU不是CPU那样的通用处理器。他们擅长做一件非常特定的事情-将相同的代码应用于大量数据-并且它们做得非常好,比CPU做得更好。但是大多数应用程序中的大多数并不是关于将相同的代码应用于大量数据。它是关于事件循环的:等待输入,读取输入,对其进行操作,然后等待更多输入。这是一个相当串行的过程,GPU吸纳了“串行”。
当您需要处理大量数据时,每个项目都可以独立于其他项目并行处理,然后继续将其发送到GPU。但是不要认为这是必须将所有东西都塞进去的“新范式”。
这个问题被标记为“优化”,因此请记住将其视为一个问题。在测试和性能分析显示需要进行优化的情况下应用GPU优化,并且任务的性质就是可以应用GPU优化。否则,不要理会它,因为这可能是过早的或不正确的优化,这会导致更多的问题而不是其解决的。
一个简单的答案是,当您需要对大量项目中的每一个进行相当小的,非常简单的计算时,GPU效果最佳。为了以这种方式完成很多工作,每个项目的计算必须独立于其他项目的计算。如果(通常)一项与另一项之间存在某种依赖关系,那么通常您需要找出一些打破它的方法,然后才能从GPU上执行大量代码。如果完全无法打破依赖关系,或者需要太多工作才能打破,则代码可能会在CPU上更快地执行。
当前大多数CPU也支持许多类型的操作,而这些操作是当前GPU根本不支持的(例如,用于多任务的内存保护)。
从略有不同的方向来看,CPU的设计(在很大程度上)是为程序员提供了相当方便的条件,而硬件人员则尽了最大的努力(这是最荒谬的最好的方法!)来创建可以维持这种方便模型的硬件。程序员,但仍会尽快执行。
GPU的发展方向恰恰相反:它们的设计主要是为了方便硬件设计人员,而OpenCL之类的东西试图在硬件限制的情况下提供尽可能合理的编程模型。
编写代码以在GPU上运行通常比在CPU上花费更多的时间和精力(因此将花费更多)。因此,这样做主要是在以下情况下(如果有):
下面是每个一些明显的可能性-但一个庞大的应用数量显然是甚至还没有接近任何一个。我会很惊讶地发现(例如)CRUD应用程序很快就会在GPU上运行(如果确实如此,则可能会发生,因为有人会牢记这个确切的目标,而未必有一个趋于最佳的目标)成本/收益比)。
现实情况是,很多(我很想说“最”)的应用,典型的CPU远远超过速度不够快,以及编程方便(导致之类的新功能,更容易开发)是多比数量更为重要执行速度。
您将能够一次进行许多计算,从而真正提高速度。
提高速度?所以呢?去年全年,我只需要回忆一次或两次。大部分我一直在要求的时间修改或修复逻辑,调整为不同的数据源,以提高用户交互等等等等。唯一速度的客户有兴趣在这些情况下是作出改变的速度。“请在一个月或两个星期内发布更好的新功能”。
不要误会我的意思-作为编码器,我喜欢彻底挤压CPU节拍。只是这种艺术通常没有很高的需求。
在某些情况下,串行处理仍比并行处理更好,更快和/或更有效吗?
我会说有很多情况。串行处理比并行处理更简单,这使得在速度不是关键要求的所有情况下,效率更高。串行处理可以更轻松地实现复杂的逻辑和用户界面,更易于指定和测试,维护和更改。
通常,串行处理可以使程序员的意图更清晰地表达,并且更易于阅读代码。我会说它可以节省最宝贵和稀缺的资源-程序员的大脑。
CPU仍然更加通用。例如,GPU在单精度方面比CPU效率更高,但在双精度方面却没有。CPU的库比GPU的库多得多。
一个简单的规则是,如果可以根据线性代数的构造来表述您的操作并且对时间要求严格,请在GPU上执行此操作,否则请使用CPU。
GPU与大量的CPU不同,它们具有截然不同的性能特征。