级别: 初级 Gary Pollice, 实践教授, Worcester Polytechnic Institute
2008 年 3 月 15 日
如果我们打算充分利用并行硬件的优势,那么我们需要更好地教授学生如何设计并开发利用硬件的优势的软件。
来自 The Rational Edge.
在伍斯特工业学院(Worcester Polytechnic Institute,WPI)计算机科学系正在进行的讨论之一是如何看待课程中的并行的作用。在其他的学院和大学中也进行着类似的讨论。这里是些基本问题:在学生的大学本科课程中,他们应该获得什么程度的并行,并且在哪些课程中,他们应该得到这样的并行?
本月,我将探讨计算机科学和软件工程中的并行的重要性,并且建议一些下一代计算机科学家应该储备的东西。
背景
当我最初学习编程的时候,我学习如何按照形成最终结果的有序步骤书写我的算法。毕竟,计算机是执行一个接一个的指令的机器 —— 但是它们如此之快,以至于大部分人不能设想用于我们正在解决的问题的不同的范型。的确,我们可以设想更快的处理器,但是摩尔定律告诉我们计算机可以继续更加快速,并且它们已经更快了。
1
现代操作系统向我们提供多任务的功能。这种方式提高了程序性能,不是因为计算机太慢了,而是因为它们太快了。在完成辅助操作,例如磁盘访问,的同时,计算机花费大量时间处于空闲状态。因此,操作系统的设计人员找到快速切换上下文、划分内存资源,并且使用空闲周期的方法,这样多个程序就可以表面上同时运行了。对于大多数需求来讲,这种形式的多任务正好工作得很好。现在,在我的桌面机(单处理器 Pentium 4)上,运行着 57 个进程,634个线程,仅仅使用了处理能力的 3%,以及大约 50% 的物理内存容量。令我觉得有趣的是,只有大约十个进程是我所调用的。余下的归我的操作系统和软件配置所有。
多年以前,我们快速地增长多进程所提供的能力。开发操作系统的计算机科学家在引入线程 —— 在进程中运行的轻量进程 —— 时给我们进行了提升。线程是同一程序的执行片段,并且在理论上,允许我们同时执行程序中的不同操作。然而,我们仍旧运行在一个处理器上,即使两个线程真的可以同时执行,物理法则也是不允许的。
现在,我们可以在多处理器上计算,多处理器对于我们所有的计算需求都是实际可用的。我大胆地猜测一下,阅读本文的读者有一半以上是通过不只一个处理器的计算机阅读的。如果您有这样的处理器,那么您肯定看到您的程序加速了。但是我的桌面处理器上有如此多的空闲周期,为什么我会需要另一个处理器呢?当我们开发使用更多线程的程序时,我们将遇到更多次线程同时运行的现象。如果我们能够提供同时执行它们的能力,那么性能增长将是显著的。我在我新的笔记本上看到了这些。它有一个具有基本处理器速度的双核处理器,该速度要比我的单核桌面机慢得多。但性能提高是十分显著的。
现在出现了多核处理器,它是单个 CPU 片拥有共享资源的多个处理器。David Patterson,加利福尼亚大学教授及 Association for Computing Machinery 前会长,在他的文章“Computer Science Education in 21st Century”
2
中对 2006 年的多核技术进行了非常易读的阐述。Herb Sutter 在 2005 年 2 月的 Dr. Dobb's Journal 中还对并行的基本趋势进行了很好的概述。
3
作为软件工程师,我们应该稍微有些气愤的是,硬件远远优于软件。的确,在我们认识到软件的好处之前,我们需要硬件来并行地执行我们的程序,但是既然我们的硬件在此,我们就将努力赶上我们的软件。这不是一个新的现象。在过去的几十年中,随着新的处理器,以及新的指令集的出现,编译器作者、OS 设计人员和其它系统软件开发人员努力让他们的程序利用上新的硬件。一些硬件工程师向硬件添加取代传统的软件的特性。举例来说,DEC Alpha 片进行相当多的代码优化 —— 进入了传统上是编译器开发人员的领域。
谁真正需要并行?
询问我们是否及什么时候真正进行并行
4
计算合理吗?让线程运行在不同的物理处理器上是很好的,但作为计算机科学家和软件开发人员,我需要担心这些吗?
只要硬件能够适当地安排线程,许多程序设计人员就可能永远不用真正地担心并行程序设计。我们每日所处理的大部分问题都被标准的顺序程序很好地解决了。这不意味着所有的程序都顺从顺序的解决方案。这也不意味着我们不会发现对于许多到目前为止,没有用我们的计算机实际地解决了的问题的解决方案。
许多需要真正的并行计算的问题都通过在向量和矩阵上执行操作的科学计算解决了。在 80 和 90 年代,开发了许多特殊的向量处理器来支持这种类型的计算。开发了用于像 FORTRAN 的程序设计语言的特殊编译器来优化代码,以利用向量处理器。
一些公司专攻大规模的并行计算。其中一个较著名的是由 Danny Hillis 和 Sheryl Handler 于 1982 年建立的 Thinking Machines Corp。Thinking Machines 开发了特殊的处理器,以及为了在它们的处理器上开发软件而开发的基于 LISP、FORTRAN 和 C 的语言。不幸的是,拥有需要大规模并行处理的问题,并且能够买得起像 Thinking Machines 提供的那样的机器的客户非常少。
今天,我们有更多需要并行计算的问题,并且幸运的是,我们拥有可以满足我们关于并行计算的需求的便宜的硬件。这些问题的示例包括天气预报、数据挖掘、遗传和生物医学工程,及人工智能应用。
5
当今计算机科学课程中的并行
如今,典型的计算机科学的研究生会在他们的一些课程中了解到并行性。通常,该注意被认为是值得提及的特殊或高级主题,但是很少对如何将并行思考并入主要的 CS 主题中进行深入研究。
学生会遇到两种基本的并行类型。第一个是并行的资源分配。当进程竞争有限的资源时,我们需要根据某种公平性和需要的定义,在公平的基础上令那些资源可用。第二类并行问题是如何设计程序,从而有效地使用同时可用的资源,例如多处理器。如今的学生对第一类问题的接触比第二类多。
这是因为学生通常在操作系统课程中遇到并行处理和并行问题。如今,在不考虑进程、线程、死锁和其它并行主题的情况下,不可能了解操作系统的设计。可以一般在具体的操作系统环境中探究这些主题。这些常常是开源的操作系统,如 Linux 或 Open Solaris。
6
在这些项目中的进程和线程中常常出现并行。为了开始创建安全、有效的操作系统,学生必须了解许多经典的死锁和同步问题。我想每个 CS 研究生都至少做过涉及哲学家就餐问题或生产者消费者问题的家庭作业。
7
这些问题帮助我们处理如何确保避免竞争资源的进程之间的死锁。它们假设在计算系统中存在某种并行。直到深入研究并行计算的特性,学生才略知一点成功地处理并行所需的其他问题。
但是,许多学习过操作系统的学生不能将他们的进程和线程的知识应用于实际用途。我是在假设我的面向对象分析和设计课程中的学生乐于使用 Java 中的线程时发现这一点的。他们知道线程是什么,然而从未书写过实际的线程化的应用程序。他们的实践没有赶上他们的理论知识。从那以后,我经常在我课程中的某个部分中加入利用线程的代码书写工作。然而,线程只是并行冰山的一角。
数据库课程解决并行资源问题。原子事务、回滚和其它关键的数据库主题背后的理论非常类似于学生在操作系统中学习的问题。从资源观点研究并行。
许多 CS 学生从未介入过令人神往的设计和实现天然并行的程序的主题。设想书写程序来控制交通、空中、陆地,或者甚至网络运输。您不仅处理异步发生的事件,而且还处理许多在您的软件系统中控制对象的线程,这必须能够很容易地通信,并且快速地共享信息。有一些,但不是很多机会可以让一般的本科生有机会考虑这样的问题。
大部分计算机科学系提供计算机体系结构和组织的课程。在这样的课程中,我在比任务或线程粒度更细的层次上了解了并行计算。即使我不是非常了解硬件,但是该课程很好地介绍了当硬件设计人员想要提高处理器性能时必须考虑的问题。他们“获得”并行性,并且让许多实现快速、准确计算所需的问题并行处理。此外,比起软件开发人员,他们已经花费更多时间总体考虑它。
编译器的确提出那种应该在不同层次上处理并行的程序设计问题。编译器是作为程序设计人员和底层机器架构之间的接口的程序。如果您没有可以生成代码来利用底层处理器架构和指令集的编译器,那么最快的机器也将是无用的。不幸的是,大部分本科编译课程只教授扫描、语法分析、中间表示,和某种代码生成的基础。并行性的难题和生成有效代码所需的优化不适合在单个的编译器构造的课程中讲。这些问题应该属于第二学期,或者研究生的课程 —— 即使这样也不会很详细地介绍。
一些学生将会上程序设计语言设计或程序设计范型的课程。我曾经教过关于程序设计语言的设计的研究生课程,并且非常高兴地看到我所采用的课本中有一个关于并行计算和程序设计的章节。该章节位于书的最后一个部分,并且承诺只是并行程序设计的入门,但这至少是个开始。
8
您可能注意到,我们已经讨论了较基础,较理论的计算机科学的课程。我认为这很重要。如果我们打算有效地并行计算,那么我们需要在理论基础上深入了解它。通常,典型的 CS 本科生要选的理论课程很少或不涉及并行领域的内容。我明确考虑的课程都是那些我们已经标记的计算基础(Foundations of Computing)、算法(Algorithms),和离散数学的课程。
改变我们的方法
缺乏对并行的接触是不幸但不是无望的。首先,我们需要认识到的是,那些具有坚实的计算基础的学生确实能进入先进的计算技术领域,并且为先进的计算技术和工具做出很大贡献。但我们可以为未来的学生做更好的准备。
我希望您会同意,如果我们打算利用并行硬件中的优势,那么我们需要更好地教授学生如何设计并开发利用硬件的软件。我们需要自底向上来做这件事。我们需要变更一些向学生展示的基本材料,并且在整个课程中加强。
大多数 CS 学生选择这个专业,因为他们要么喜欢编程,要么认为他们会喜欢。根据不同的学校,学生将一头扎进流行的程序设计语言,例如 C++ 或 Java,并且学习如何利用迭代的和事件驱动的设计构建顺序的程序。一些学校,像 WPI,采取一种稍微不同的方式。CS 专业所上的第一个课程称为程序设计入门(Introduction to Program Design),该课教授如何通过学生编程来解决问题。我们在该课中使用e Scheme 程序设计语言,因为 Scheme 学起来非常简单,有最少的语法,并且诶非常灵活。Scheme 还支持递归地解决问题,这是解决许多问题的普通方法。学习递归的程序设计方法和迭代的方法的学生比了解不那么多的学生更能够解决较多选择的问题。
那么,如果我们扩展向学生展示的问题的范围怎么办,要求他们以他们可能确认什么时候并行解决方案是适合的的方式处理问题?我们需要向课程中加入一些东西,并且不幸的是,课程开发是零和博弈。如果您添加一些东西,您必须去掉一些东西,而这就是问题。我们可以添加许多关于并行的材料,但是我们应该放弃什么呢?
学术机构一贯地审查和修订它们的课程。该情况与试图决定如何分配每年的预算,并决定用于市场而生产的最佳的产品组合的公司没太大差别。我们不得不决定,什么制定了用于未来的计算机科学家的基本技能,以及用可用的人员,我们可以提供什么附加的主题。而这些是很难做出的决策。
发展并行计算的深入理解的真正优势将必要地通过研究生的研究,以及只是偶尔提供的高级的本科生课程。由于我一直在教课,所以我想要向本科生提供的课程有如此多,但我已经开始认识到,必须包含核心课程,并且没有留下许多时间用于我想要给出的特殊课程。我时常能够提供特殊主题的课堂讨论或者独立的研究。
需要什么
理论上,介绍性的计算机科学课程会包含由并行解决方案最好地解决的问题实例,以及一些书写使用并行结构的简单应用程序的经验。如果您使用像 Scheme 的语言,那么有一些并行扩展的实例。对于其他函数式语言,像 LISP,存在并行扩展。作为函数式语言的扩展,并行程序对我来说似乎更自然,尽管我必须承认我没有密切关注其他的。
我要建议的下一个变更是,计算机科学课程确保它们的关于计算、算法,和离散数学的基础课 —— 也就是,理论的基础课程 —— 包含并行。在离散数学和基础课程中引入时态逻辑令一些工具能处理并行。
一旦我们在这些基础课程中种下了并行的种子,那么我们就可以在课程中展开它们。这应该在像人工智能、数据库,和操作系统这样的课程中相当地容易。到学生毕业的时候,他或她应该能够在工作面试中证实他们能够有效地用并行技术工作。
结束语
过不了多久,并行计算课程就将更加普及。它们开始出现在许多大学中。这些课程将开发那些在适合时将加入核心课程的材料。它们将成为将要导致基于并行的有效利用的新的计算范型的新算法、语言,和架构的基础。
我最兴奋于关于新语言和支持它们的相应的编译器的这些可能性。面向对象范型花费了几十年占据了主流。我相信我们正处于另一个重要的范型替换的开始,并且将看到并行程序设计比让对象升到日珥所花费的少得多的时间成为几乎每个程序设计人员工具箱里的工具。像这样的先进技术是令计算机科学如此吸引我的东西。
注释
1 不论摩尔定律准确地预测纳米技术的改进是否是有争议的(参见 http://www.firstmonday.org/issues/issue7_11/tuomi/ 进行讨论),但是它已经成为增长的硬件性能的引用最广泛的指示器。
2参见关于并行性的部分,http://academic.evergreen.edu/projects/icer/documents/Patterson.pdf。
3参见 http://www.gotw.ca/publications/concurrency-ddj.htm。
4 我交替地使用“并行”和“并发”。
5在 Manavendra Misra 的关于 Parallel Computing for Scientists and Engineers 的课程的第一堂课的笔记中可以找到更多信息 http://www.krellinst.org/UCES/archive/classes/ASC/main.html。
6参见 http://www.linux.org/ 和 http://www.opensolaris.org/os/。
7参见 http://www.isi.edu/~faber/cs402/notes/lecture8.pdf,或 http://www.cs.cornell.edu/Courses/cs414/2004su/slides/08_classicsynchproblems.pdf。
8课本是 Programming Languages and Methodologies,Robert J. Schalkoff、Jones 和 Bartlett,2007 年,ISBN 9780763740597。
参考资料 - 参与论坛讨论。
- 您可以参阅本文在 develperWorks 全球网站上的 英文原文。
- 现在开办了一个特别为 Rational Edge 的文章创办的 新论坛,现在您就可以分享您对本文或本期杂志或以前杂志中的其他文章的想法。阅读世界各地您的同行们所说的内容,生成您自己的讨论,或者加入正在进行的讨论。单击 这里 开始。
-
全球 Rational 用户组社区
关于作者  | 
|  | Gary Pollice 是伍斯特市伍斯特工学院的一名实践教授,文学硕士。他讲授软件工程、设计、测试以及其它计算机科学的课程,同时也指导学生设计。在进入学术界之前,他有35年多的开发各种软件的经验,从商业应用到编译器和工具。他的最后一份工作是在 IBM Rational 软件,他是有名的“RUP 倔老头”,同时也是最早的 Rational Suite 团队的成员之一。 他是 小团队开发软件:一种以RUP为核心的方法 的主要作者,该书由 Addison-Wesley 在2004年出版。他在数学方面取得了学士学位,在计算机科学领域取得理科硕士学位。 |
对本文的评价
|