面向程序员的GPGPU技术系列(1) 为什么要理解GPU体系结构?

GPU的计算能力在电脑游戏和计算机视觉领域已经得到了充分的证明。本文的目的不在于介绍GPU的发展史和其在上述领域的应用,而是侧重于如何在通用计算领域发挥GPU强大的计算能力,即GPGPU(General-Purpose-GPU)技术 。笔者是一名程序员,所以本文面向的也是广大对GPU计算感兴趣程序员,而不是GPU的设计者。普遍的观点认为,对程序员来说进入GPU计算的最大门槛在于对GPU体系结构的理解,这种理解不是要懂得硬件的设计和工作原理,而是对一些体系结构概念和性能模型的理解。也许有人会问,为什么很多程序员不需要了解CPU体系结构同样能写出高效的C/C++代码? 窃以为原因分两个方面:
1,CPU体系结构的发展已经经过几十年,系统软件(OS, Compiler...)的发展已非常成熟,基本的概念也已经写入教科书。
2,对CPU编程多数情况下还是以串行思想为主,并不是所有程序员都熟悉Multi-threading,Map-Reduce等并行编程方法。

而GPU体系结构在短短的几年进行着突飞猛进的发展,两大阵营ATI和NV之间也有很多不同,所以即使是游戏领域的程序员也不见得能准确的描述他所写的代码是如何在GPU上面运行的(也许很多时候他们也不需要知道,一方面体系结构的不同已经被成熟的API包装得很好了,另外一个“飞快”的游戏并不一定是一个好的游戏)。然而,在通用计算领域使用GPU,一定是为了更高的运行效率,而且通用计算领域的算法又是多样化的很难用一套API进行封装(后面会提到,我们确实能总结出一些常用的"计算元"-primitive来让问题变的简单一些)。

基于以上的原因,笔者认为为了能写出能高效运行的GPU通用计算程序,程序员需要对GPU体系结构有一定的理解。然而,GPU体系结构是一个快速变化而且非常复杂的领域,要深入理解并达到“知其所以然”的程度需要很多年的积累和实践。这显然这并不应该是程序员所能承受的。为了让这种学习对于一般程序员来说也不至于成为一种负担或痛苦的无底深渊,所以应该区别出哪些才是对自己写程序是有真正有参考价值。本文第一部分的目的就在于能尽量整理出这些有价值的知识,并分析它们会怎么影响程序员的代码。



 

你可能感兴趣的:(体系结构)