我知道很多GPU比CPU快的例子。但是存在很难并行化的算法(问题)。你能给我举一些CPU可以克服GPU的例子或测试吗?
编辑:
谢谢你的建议!我们可以在最流行的和最新的中央处理器和图形处理器之间进行比较,例如核心i5 2500k与GeForce GTX560Ti。
我想知道如何比较它们之间的SIMD模型。例如: Cuda调用SIMD模型,更准确地说是SIMT。但SIMT应该与CPU上的多线程技术进行比较,即在MIMD核心之间分配线程(任务)(核心i5 2500k给出4个MIMD核心)。另一方面,这些MIMD核中的每一个都可以实现SIMD模型,但这是SIMT之外的东西,我不知道如何比较它们。最后,可以将具有并发内核执行的费米体系结构视为具有SIMT的MIMD核。
发布于 2011-08-18 14:51:21
根据我的经验,我将总结CPU和GPU中的并行程序在性能方面的主要区别。相信我,比较是可以一代一代地改变的。因此,我只会指出什么对CPU和GPU是好的,什么是坏的。当然,如果你做一个极端的程序,即只有坏的或好的一面,它在一个平台上运行的速度肯定会更快。但这两者的混合需要非常复杂的推理。
主机程序级
一个关键的区别是内存传输成本。GPU设备需要一些内存传输。在某些情况下,这种开销不是微不足道的,例如,当您必须频繁地传输一些大型数组时。在我的经验中,这种成本可以最小化,但将大部分主机代码推到设备代码中。您可以这样做的唯一情况是当您必须与程序中的主机操作系统交互时,例如输出到监视器。
设备程序级
现在我们来看一幅尚未完全揭示的复杂图景。我的意思是,在GPU中有许多神秘的场景还没有被披露。但是,就性能而言,我们仍然有很多CPU和GPU (内核代码)的区别。
我注意到,有几个因素对这种差异有很大的影响。
GPU由许多执行单元组成,旨在处理大规模并行程序。如果你有很少的工作,比如说几个连续的任务,并将这些任务放在GPU上,那么许多执行单元中只有几个是忙碌的,因此将比CPU慢。因为另一方面,CPU更适合处理短时间和顺序的任务。原因很简单,CPU复杂得多,能够利用指令级并行,而GPU利用线程级并行。嗯,我听说NVIDIA GF104可以做超标量,但我没有机会去体验它。
值得注意的是,在GPU中,工作负载被分成小块(或OpenCL中的工作组),块被安排成块,每个块在一个流处理器中执行(我使用的是NVIDIA的术语)。但是在CPU中,这些块是按顺序执行的--除了一个循环,我想不出其他任何东西。
因此,对于块数量较少的程序,它可能会在CPU上运行得更快。
分支对于GPU来说总是不好的东西。请记住,GPU更喜欢相同的东西。相等的块,相等的块内的线程和相等的线程内的经线。但是什么才是最重要的呢?
***Branch divergences.***Cuda/OpenCL程序员讨厌分支分歧。由于所有线程以某种方式被划分为32个线程的集合,称为warp,并且warp中的所有线程都以锁步方式执行,分支分歧将导致warp中的一些线程被序列化。因此,warp的执行时间将相应地倍增。
与GPU不同,CPU中的每个内核都可以遵循自己的路径。此外,由于CPU具有分支预测功能,因此可以有效地执行分支。
因此,具有更多偏差的程序可能会在CPU上运行得更快。
这真的够复杂的了,所以让我们让它变得简短。
请记住,全局内存访问具有非常高的延迟(400-800个周期)。因此,在老一代GPU中,内存访问是否合并是一个关键问题。现在你的GTX560 (费米)有2级以上的缓存。因此,在许多情况下可以降低全局存储器访问成本。但是,CPU和GPU中的缓存不同,因此它们的效果也不同。
我可以说的是,它真的取决于你的内存访问模式,你的内核代码模式(内存访问如何与计算交错,操作的类型,等等)来判断一个人在GPU或CPU上运行得更快。
但不知何故,你可以预期大量的缓存未命中(在GPU中)会对GPU产生非常糟糕的影响(有多糟糕?-这取决于你的代码)。
此外,共享内存是GPU的一个重要特性。访问共享内存的速度与访问L1缓存的速度一样快。因此,使用共享内存的内核将会有很大的好处。
还有一些我没有真正提到的因素,但这些因素在许多情况下都会对性能产生很大影响,比如存储体冲突、内存事务大小、GPU占用率……
https://stackoverflow.com/questions/7091958
复制相似问题