【问题标题】:Serial CPU vs GPU code串行 CPU 与 GPU 代码
【发布时间】:2012-01-03 20:58:09
【问题描述】:
我正在写一篇关于异构计算可能性的理论作业。
我需要比较在 CPU 或 GPU 上以串行方式执行的单个线程(不可并行化)的有效性。
我知道这是一个奇怪的问题,因为在 GPU 上执行单个线程没有意义,但我确实可以将指导线比率用于我正在开发的启发式算法。
我知道它可以很容易地进行测试,但我对 CUDA 和 OpenCL 都没有任何实际经验,而且我很着急。
【问题讨论】:
标签:
cuda
opencl
gpgpu
heterogeneous
【解决方案1】:
GPU 执行单元往往是有序的,并且(至少在 nVidia GPU 的情况下)通常在单线程上下文中每 4 个时钟只能获得一条指令。将此与现代超标量 CPU 进行比较,在现代超标量 CPU 中,您通常可以获得每时钟 > 1 条指令的吞吐量,并且 CPU 在时钟换时钟的基础上胜出 4 倍或更多。不过,CPU 时钟频率往往比 GPU 时钟高得多,因此时钟速度很容易再增加 3 倍,使 CPU 相对于 GPU 提高 12 倍或更多。
【解决方案2】:
单个 GPU 内核的数量级比 CPU 弱,而且还有数据传输开销。 GPU 在并行代码上获胜的原因在于同时在 100 多个内核上运行的线程数量之多。考虑这个例子:
for(int i=0; i<1000; i++)
a[i]= /*some value*/
如果你只使用 1 个线程,它必须迭代 1000 次。 CPU 肯定会比 GPU 非常非常快。但是为了从 GPU 中受益,我们创建了 1000 个线程,每个线程将值插入到内存“a”的相应位置。这可能会导致性能超过 CPU。
【解决方案3】:
NVidia Tesla GPU 以 4ops/clock 执行某些操作。
GPU 上的内存带宽通常比 CPU主 RAM 快,并且有一些用于 2d 结构的巧妙缓存功能。
但通常不需要 - 如果您不需要对 >256 个项目执行相同的操作,请使用 CPU
【解决方案4】:
您还应该考虑 GPU 运行的时钟频率(1-2 GHz),与 CPU 相比,它非常低。当代码不并行时,GPU 的性能确实不是一个选择。