为什么GPU在数值计算方面比CPU更高效?分支更糟糕?有人可以给我一个详细的解释吗?
答案 0 :(得分:3)
不确定您要找的是什么。假设它是为了一般理解为什么这样做而不是其他方式。本文提供了对您的问题的合理理解(以外行人的话说):
https://en.bitcoin.it/wiki/Why_a_GPU_mines_faster_than_a_CPU
简而言之:
CPU内核每个时钟可以执行4个32位指令(使用 128位SSE指令)或8通过AVX(256位),而像GPU一样 Radeon HD 5970每个时钟可以执行3200个32位指令 (使用其3200 ALU或着色器)。这相差800(或400 在AVX的情况下)每个时钟更多的指令。截至2011年, 最快的CPU具有高达6,8或12个核心,并且稍微高一些 频率时钟(2000-3000 MHz与Radeon HD 5970的725 MHz相比), 但是一个HD5970仍然比四个12核快五倍 CPU为2.3GHz(也可以让你回到4700美元而不是 HD5970售价350美元。
GPU专为特定任务而设计,即渲染需要大量计算的3D图形。因此,某些应用程序将“数字运算”卸载到GPU,就像大多数现代浏览器一样。然而,对于分支功能,任务与CPU保持一致(现在,谁知道他们将在以后做什么),因为CPU具有更好的“超主”功能。
答案 1 :(得分:1)
GPU中的每个SM都是一个SIMD处理器,在SIMD的每个通道上执行不同的warp线程。一旦应用程序受到更多计算限制(少量内存访问),并且没有分支应用程序实现GPU的峰值FLOPS。这是因为在分支上,GPU掩盖了发散的一侧并首先执行另一侧。两条路径都是串行执行的,这使得某些SIMD通道处于非活动状态,从而降低了性能。
我已经在Fung's paper中添加了一个有用的图片,该图片在上述参考资料中公开提供,以显示性能实际上如何下降:
图(a)显示了warp中发生的GPU中的典型分支差异(此样本中为4个线程)。假设您有以下内核代码:
A: // some computation
if(X){
B: // some computation
if(Y){
C: // some computation
}
else{
D: // some computation
}
E: // some computation
}else{
F: // some computation
}
G: // some computation
A处的线程分叉成B和F.如(b)所示,一些SIMD通道在时间下降性能上被禁用。图(c)到(e)显示了硬件如何串行执行分支路径和管理分歧。有关更多信息,请参阅这篇有用的论文,这是一个很好的起点。
计算限制的应用程序,如矩阵乘法或N-Body仿真,很好地映射到GPU并返回非常高的性能。这是因为他们很好地占据了SIMD通道,遵循流媒体模型,并且有一些内存访问。