深入浅出说CUDA程序设计(一)

第一章 为什么需要并行程序

CUDA,全称是Compute Unified Device Architecture,一般翻译成中文为计算统一设备架构。笔者以为这样的名字会让人对CUDA感到很迷惑,CUDA到底是什么呢?笔者用自己的大白话来说下自己对CUDA的理解,CUDA就是一个基于GPU(目前是单指Nvidia公司的)的通用并行计算平台。这里有3个关键字,GPU,通用计算和并行!

 

关于GPU,相信它是什么,不用多说,不过关于CUDA的硬件架构后面会有一些分析,因为要写出高质量的CUDA程序,不了解底层运行机制是不够的,这就是侯捷讲的“勿在高台筑浮沙”,这里说一点题外话,笔者经常在同行老朋友面前很得意的吹嘘:“你们这些家伙写的程序都是在CPU上跑的,太土了!俺的可是在GPU上跑的哦”,所以嘛,学习CUDA是很有前途的!

 

第二个重要概念是通用计算,这个主要是与以前的GPU只做渲染流水线相对应的,由于笔者比较年轻,没有经历过师兄他们走过的黑暗岁月,呵呵!传统的GPU架构需要按一个标准的流水线编程,要经过vertex processorfragment processorpixel operation,这会使编程变得困难和不容易控制。早期的GPGPUGeneral Purpose Computing on GPU通用计算为目的的GPU)也需要按照那样的标准的流水线编程,而CUDA的出现对我们学软件的来讲,才标志着真正意义上GPU通用计算的到来!CUDA从技术本身来讲,仅仅是C/C++的一个小超集(这个后面会详细分析),从软件工程的角度看,降低了学习成本,加之其灵活性,必将在工程应用中发挥巨大的作用!在美国几乎所有顶级学府如哈弗,MIT等都有CUDA实验室,美国NASA的很多大型项目在多年前都已经使用CUDA技术。基本上,可以说CUDA提供了一个无论是在软件编程还是硬件处理都适合通用计算的平台架构。

 

在学习CUDA编程以前,我们必须深刻认识下CUDA程序中最核心的概念——并行。在操作系统的课程里面,我们会遇到另外一个名词——并发。在单核时代或者说对于普通的CPU运行程序,这两个词的意思是一模一样的!但我们应该清楚知道两者的区别,并发指复用,同一个时刻只有一个指令在处理器上执行;而并行则是在同一时刻多个指令同时运行,在GPU上处理器的称谓换成了个多处理器,每个多处理器上有8个名叫CUDA core的处理单元。在本科答辩的时候,有个老师问我,是不是可以说1个多处理器上有8个核(注:他不做CUDA的)。笔者以为作为初学者可以这样看,但如果想深入了解和掌握高级优化手段就必须明白CPU上的多核不等同于CUDA core,这个问题会在后面章节逐步说明。这里花点笔墨来说明一下并行与并发的区别,主要是让读者明白CPU并行程序和GPU并行程序在底层运行机制的区别,同时初学者往往遇到EmuDebug运行正确,而实际运行却错误的情况。这里最根本的原因还在于EmuDebug运行模式下是串行而非并行。虽然有很多牛人觉得EmuDebug没有意义,但我还是建议初学者遇到结果错误的时候先保证EmuDebug是正确的,因为绝大多数情况,保证EmuDebug是正确的说明程序逻辑没有问题(当然也有例外,后面会讲到)。

 

知道了并行的概念,那么为什么我们需要并行程序,根据摩尔定律:集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍,当价格不变时;或者说,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上,如图1。他的核心思想就是硬件会越来越越快,可是随着单核CPU的时钟频率不断增加,也落入了收益递减规律里面了,其中一个主要的性能瓶颈是存储器延迟。因此我们有了新的摩尔定律:No longer get faster, just wider(未来的计算机不会更快,而是更“宽”)。新的需求也给我们这个做软件的带来了挑战和机遇:必须重新设计算法,To be aggressively parallel!笔者庆幸自己在不到两年的时光发表10来篇EI论文也得益于这样的变革机遇!在并行处理这个领域,并行体系结构、并行软件和并行算法三者缺一不可,而其中并行算法则是核心和瓶颈技术,也是我们从事软件行业的人应该肩负的使命。

 

在结束这个开场白的时候,我们来比较学术化的看看什么是并行算法。并行算法是指在各种并行计算机上求解问题和处理数据的算法,其本质是把多任务映射到多处理器中执行,或将现实的多维问题映射到具有特定的拓扑结构的多处理器上求解。一定要牢记的是并行算法的实现强烈的依赖于计算机硬件和软件环境,这是我们软件出身的人最容易忽视的,笔者个人比较特别的经历就是在系统开发时的直接合作师兄是硬件工程师,我们经常被对方弄的很崩溃。但自己现在能够写出比较高质量的CUDA程序也得益于这些对硬件问题的崩溃和思考!

 

 

你可能感兴趣的:(CUDA技术专区)