前 言 编写本书的原因 大众市场上的计算系统将多核CPU和众核GPU两者结合起来,在笔记本电脑上的运算速度可以达到万亿次,在集群系统中的运算速度可以达到千万亿次。具有这种计算能力以后,我们有望很快将计算实验推广到科学、工程、健康和商业等领域。通过使用计算实验,很多人可能会在他们的学科领域中有所突破,这种规模是可控的、可观测的但规模水平又是空前的。本书提供了实现这种构想的关键途径:教会数百万的本科生和研究生并行编程,使计算思维能力和并行编程技能像数学运算那样普及。 从这门课的前身ECE498AL开始。在2006年的圣诞假期间,我们在疯狂地致力于幻灯片的讲座和实验作业。David正在开发一套系统,试着把早期的GeForce 8800 GTX GPU卡经客轮拉到伊利诺伊州,但直到开学后几个星期才到货。显然也是在开学后的几个星期以后,CUDA才开始公开。我们必须制定出合法的合同,以便在最初的几个星期内就能依照NDA保密协议为学生开设这门课程。我们也需要公开,这样学生才会来报名,直到预报告阶段之后我们才会公开这个课程。 2007年1月16日,我们上了第一堂课。所有事情才算是安顿下来。David每周都要乘公交车来Urbana上课。我们招收了52个学生,比我们要招收的人数还多两个。前10次课,我们大都要制作幻灯片。Wen-mei的研究生John Stratton,欣然主动地要求担任教学助理,并帮我们布置实验室。所有的学生都签了NDA,因此在CUDA公开前,我们可以继续上前几次课。我们把课堂的内容记录下来,但直到2月份才把它发布到网上。我们有物理、天文、化学、电气工程、机械工程,以及计算机科学和计算机工程专业的研究生。教室里洋溢的热情使我们都觉得这一切都是值得的。 从那以后,在一个学期的培养模式中,我们上3次课,在一周的密集培养模式中,我们上两次课。ECE498AL这门课程已经成为一门永久性的课程,其中伊利诺伊州中的Urbana-Champaign大学的ECE408很有名气。当我们第二次开ECE498AL这门课时,我们开始着手编写本书的前几章。在我们2009年春季和夏季的班级中,我们测试了这些章节。前4章也在麻省理工大学的班级上测试过,这门课由Nicolas Pinto在2009年春季时讲授。我们也在网上共享过前几章,从大量读者那里收到很多宝贵的反馈意见。我们受到了这些反馈意见的鼓舞,并决定继续完成本书。现在,我们很乐意把本书的第1版呈现给读者。 目标受众 本书的目标受众是研究生和本科生,他们来自各种科学学科和工程学科,他们的学科中需要用到计算思维能力和并行编程技巧,通过用已经普及的万亿次运算硬件能使他们在自己的领域中有所突破。我们假设读者至少已经具备基本的C语言编程经验,因此不管是在计算机科学领域内还是领域外,他们都是比较高级的程序员。我们专门面向计算领域内的科学家,如机械工程、土木工程、电气工程、生物工程、物理和化学,这些科学家将通过计算在他们的领域中进行进一步的研究。正因为这样,这些科学家既是他们领域内的专家,也是高级程序员。本书采用基本的C语言编程技巧,来教会大家用C语言进行并行编程。我们在CUDA中也用C语言,CUDA是一种支持NVIDIA公司开发的GPU并在少量CPU上模拟的并行编程环境。大约有2亿左右的使用者和专业人士在使用这些处理器,其中超过40 000的程序员在主动使用CUDA。读者作为学习经验的一部分而开发的应用程序将会被一个庞大的用户社区运行。 如何使用本书 本书通过具体资料提供我们在教ECE498AL时的经验。 分3个阶段的学习方法 我们为了能同时兼顾ECE498AL的课程和编程作业,把学习过程分成3个阶段: 第1个阶段——基于第3章的一次课致力于教会学生CUDA基本的存储器和线程模型、CUDA对C语言的扩展和基本的编程与调试工具。在这次课后,学生要能在几个小时内编出原始并行矩阵乘法的代码。 第2个阶段——下一个阶段是10次课,使学生从理论上理解CUDA存储器模型、CUDA线程模型、GPU硬件的性能特点、现代计算机系统体系结构和普通的数据并行编程模式,这些都是开发高性能并行应用程序所必需的。这些课的内容基于第4~7章。经过这个阶段后,矩阵乘法代码的性能提高了将近10倍。经过这个阶段后,学生也应该完成关于卷积、向量归约和前缀扫描的作业。 第3个阶段——一旦学生掌握了CUDA基本的编程技巧,剩下的课程内容涵盖计算思想、各种并行执行模型和并行编程规则。这些课的内容对应于第8~11章(这些课程的录音和视频可以从网上下载。 把所有内容连贯起来:最终项目 当读者通过这门课、实验和本书的章节掌握了基础知识后,最终项目把所学到的经验联系起来。最终项目对这门课如此重要,以致于它在这门课中的地位很显眼,大概需要花费两个月的时间。它采用了5个创新点:指导、专题讨论、检查、最终的报告和专题讨论会(在ECE498AL的网站上可以下载最终项目的更多信息,我们想提供对这些设计因素的深入思考)。 我们鼓励学生选取目前研究领域中一些具有挑战性的问题作为他们的最终项目。这个过程中,指导老师会成立计算科学研究小组来提出问题,这些研究小组就是后来的导师。我们要求导师提供一到两页的项目规格说明表,这个表应该简单地描述应用程序的重要性,导师想要学生组在应用程序中完成什么工作,需要了解与开发应用程序相关的技术和技能(特定类型的数学、物理、化学课程),以及一个网站和传统资源列表。学生可以利用这些表中对应的内容了解技术背景、构建模块,以及特定的实现方式和代码示例对应的具体的URL或ftp路径。这些项目说明表也应该为学生提供学习经验,在以后的工作当中可以定义他们自己的研究项目(在ECE498AL课程的网站上可以下载几个这种示例)。 我们也鼓励读者在项目的选择过程中可以与他们的导师不断地交流。只要学生和导师都同意了某个项目,他们就会密切地联系、频繁地切磋并不断地报告项目的进展情况。我们试图为学生和导师之间的协作关系提供方便,不仅是为学生也是为导师增长宝贵的经验。 项目专题讨论 整个班级对彼此的最终项目的意见的主要交流方式是专题讨论。我们通常会安排6个报告厅来进行专题讨论。专题讨论是为学生设计的。例如,如果一个学生已经确定了项目,就可以把专题讨论作为一种提出初步想法、获取反馈意见和招募队友的场所。如果一个学生还没有确定自己的项目,他可以仅参加演讲,参加讨论并加入其中的一个项目组。在项目专题讨论期间,学生没有等级之分,这么做是为了营造一种和谐的气氛,所以学生可以集中精力与导师、教学助理以及班上其他同学进行有意义的谈话。 有了专题讨论日程表后,导师和教学助理就可以花些时间给项目组提供反馈意见,以便学生也可以问问题。演讲的时间限制在10分钟内,因此在上课期间还有反馈和提问的时间。假设每次课90分钟,这将班级的大小限制在36人左右。为了严格控制时间安排并使反馈时间最大化,所有演示文稿预先加载到PC中。由于在专题讨论中并不是每个学生都会出席,因此每个班大概能容纳50个学生,可以根据需要提供额外的专题讨论时间。 导师和教学助理必须参加所有演讲,并给出有用的反馈意见。学生经常在下列问题上寻求帮助。第一,对于给定的时间,项目的规模是太大还是太小?第二,在这个领域中是否存在有利于这个项目的现有工作?第三,为并行执行而设立的目标计算是否适合CUDA编程模型? 设计文档 一旦学生决定选择某个项目并形成了团队后,我们就要求学生提交一个关于项目的设计文档。这有助于他们在正式进入项目前,思考整个项目的步骤。制定这种计划的能力对于他们将来事业的成功很重要。设计文档应该讨论项目的背景与目的,应用程序级目标和可能带来的影响,应用程序的主要特点,设计的概况,实现计划,他们的性能目标,经过论证的计划和可接受的测试,以及项目进度表。 在班级专题讨论会的前一周,教学助理对最终项目组进行一次项目检查。这个检查过程有助于确保学生没有偏离轨道,并且他们已经发现了设计过程早期存在的障碍。要求学生组带上他们最初的草案来检查,草案包括其应用程序的如下3个版本:(1)性能最优的CPU串行代码,采用SSE2和其他优化方案构建一系列健壮的基本代码,便于比较它们的速度;(2)性能最优的CUDA并行代码。这个版本是项目的主要成果;(3)基于版本3中同样的算法,但是用单精度实现的CPU串行代码版本。学生可以用这个版本认识到并行算法涉及额外的计算量时带来的系统开销。 学生组都要准备好讨论的主要思想,包括在每个版本用到的代码,任何浮点精度问题,任何针对应用程序之前结果的比较,以及如果他们显著地提高了运行速度会对这个领域产生什么影响。依我们的经验来看,在班级专题研讨会前一周进行检查,这是最佳的时间安排。如果时间太早,可能会把时间浪费在对不太成熟的项目和没有太大意义的会议上。如果时间太晚,学生就没有足够的时间根据反馈意见修订他们自己的项目。 项目报告 学生应该提交一份项目报告,这个报告关于他们的团队的主要发现。把6次课的时间放在一天,举行班级专题讨论会。在专题讨论会期间,学生所用的演讲时间正比于团队的规模。在演讲期间,学生要强调项目报告中做得最好的部分,这样也有益于整个班集体。演讲过程在学生的成绩中占的比例很高。每个学生必须单独回答一个直接向他或她提出的问题,因此同一个团队中每个学生的成绩也不相同。专题研讨会为学生提供了很好的制作简洁的演示文稿的机会,简洁的演示文稿能激发其他人阅读整篇文档。演讲结束后,学生要提交一份最终项目的完整报告。 在线补充 如果教师用本书作为课程的教材,就可以使用我们的实验安排、最终项目指南和示例项目说明。虽然本书提供了这些课程的知识性内容,但要想实现全部教学目标还应该查阅其他资料。我们也想邀请大家充分利用与本书相关的在线资料,这些资料可以在ELSEVIER出版社的网站上下载。 最后,我们鼓励读者提交反馈意见。如果读者有关于改进本书的任何想法或者对在线资料的补充,我们想听听读者的想法。当然,我们也想知道读者喜欢本书的哪一方面。 David B. Kirk和Wen-mei W. Hwu