刘喜平
(江西财经大学 信息管理学院,江西 南昌 330013)
随着芯片集成度的不断提高,芯片的功耗、复杂性也越来越高,使得传统的通过提高主频、增加结构的复杂度来提升性能的途径已经难以为继。在此背景下,从2005 年起,大部分主流的CPU 制造商开始通过增加核心的数量快速提升微处理器的性能[1]。时至今日,多核处理器已经成为主流,单处理器计算环境逐渐退出历史舞台。从应用的角度看,过去几十年里,借助不断提升的计算能力,人类在许多领域(如基因解码、医疗成像、人工智能、虚拟现实等)发展非常迅速,但随着人类科学探索的不断深入,许多应用对计算能力的要求也越来越高,问题的规模也在不断增加,迫切需要将大量处理器和计算机集合起来共同完成计算任务。来自需求与现实两方面的动力推动了计算向并行与分布式计算方向转变。并行计算一直以来都是大规模科学与工程计算、数据分析的基础工具。近年来,随着现代计算机普遍采用多核异构的体系结构,以及互联网、大数据、云计算、人工智能的兴起,并行计算的应用领域不断扩大。
鉴于其日益重要的地位,并行与分布式计算被纳入计算机专业本科课程体系中。在美国计算机协会ACM 和国际电子电气工程师协会计算机学会IEEE-CS 制定的《计算机专业(本科)课程设置指南之CS2013》[2]中,并行与分布式计算是计算机专业知识体系的18 个知识域之一,是一个全新的知识域;并行与分布式计算类课程的等级也由原来的选修课程提升为核心基础课程。在教育部计算机科学与技术专业教学指导分委员会系统研究组给出的课程体系改革方案中,并行计算也是一个很重要的方向[3]。
目前国内外很多知名大学的计算机专业已经开始开设多门并行与分布式计算相关课程[4-6],如国外的康奈尔大学、哥伦比亚大学、莱斯大学、麻省理工学院、哈佛大学、斯坦福大学等著名大学开设了分布式计算导论、分布式计算原理、并行与分布式计算、并行编程、并行计算机体系结构等课程;在国内,很多大学也在作出调整,如浙江大学开设了多核计算、网格计算和分布式系统、并行计算机体系结构和编程;北京大学开设了多核编程;华中科技大学开设了并行与串行数据结构与算法、并行体系结构、并行编程原理与实践等;南京大学、中山大学、四川大学、天津大学等也开设了并行处理相关课程。
分析现有的并行与分布式计算课程,其结构内容如图1 所示。可以看出,并行与分布式计算涉及的内容比较庞杂,涉及算法、系统、开发等多个方面的内容。有的学校将每个部分单独开设课程,有的学校将某几个部分整合在一起,并没有统一的做法。
图1 并行与分布式计算课程知识结构
教育部计算机科学与技术专业教学指导分委员会在新的教学指导纲领性文件中指出,计算机类本科生应具备四大专业基本能力:计算思维能力、算法设计与分析能力、程序设计与实现能力、系统能力[3]。每一个能力的培养都可以在多个知识域中体现,每一个知识域都对多个方面的能力培养有贡献。并行与分布式计算中各个知识块的内容与这4 个方面的能力紧密相连,它们之间的对应关系如图2 所示。并行与分布式计算的重要性日益提高,对各个能力的培养提出了新的要求。
图2 并行与分布式计算知识内容与四大专业基本能力的对应关系
(1)计算思维能力。传统的计算机课程在讲述求解问题的思路时,主要以串行执行为背景,没有将并行计算考虑进来。实际上,很多问题在求解的时候如果将并行计算作为一个选项,那么求解思路就会完全不同。计算的本质是求解问题,其中有些适合串行求解,有些天然地适合并行求解。比如,在一个数据序列中求最值,按照串行计算的思路是按顺序逐个比较,每一步均保留大的,最后得到最大数,这需要线性级别的时间复杂度。在并行环境下,可以并行地进行比较,最后找出最大数,其时间复杂度可以缩小到对数级。在培养计算思维的时候,应当同时涵盖串行与并行计算思维,才不至于思维与现实脱节[4]。
(2)算法设计与分析能力。传统模式下讲授数据结构和算法的时候,一个基本的假设是所设计的数据结构只是给一个进程来访问,但是在并行计算模式下,多个进程或者线程可能同时访问一个数据结构,因此数据结构的设计需要保证并发访问的正确性。例如,在为多线程环境下设计链表结构的时候,就需要考虑到对链表的操作可能会导致问题,因此,可以设计带有锁的阻塞并发队列,也可以设计不带锁的非阻塞并发队列,但是后者需要基于特殊的指令。再比如,排序是一个非常常见的问题,在串行计算模式下出现了很多经典算法,如冒泡排序、快速排序等,但是这些算法并不能简单地移植到并行计算环境下。一个常见的并行排序算法是奇偶交换排序,它将排序过程分为奇交换和偶交换两个阶段。对于奇交换来说,它总是比较奇数索引以及其相邻的后续元素,而偶交换总是比较偶数索引和其相邻的后续元素,其中的比较和交换可以充分并行化。
(3)程序设计与实现能力。传统的程序设计教学都是围绕编写串行程序而展开的,对于并行和分布式程序的开发涉及比较少。多线程编程、MPI、OpenMP 等编程的模式和工具可以让程序员更加方便地利用并行计算资源,应该作为程序设计能力培养的重点之一。SOA 体系结构、Web Service 等架构和模式是编写现代Web 环境下分布式应用的主流架构,在计算机系本科生的工程能力培养中具有重要地位。基于MapReduce、Spark 等分布式计算框架的程序设计可以重复利用现有的分布式计算的生态系统,大幅降低大规模数据处理的门槛,是大数据时代的必备技能。
(4)系统能力。目前支持并行计算的计算机系统众多,如多核、众核、集群、大规模并行计算机等。理解并行计算机和分布式计算机体系结构,对于提高系统能力具有非常重要的作用。应用开发人员必须对计算机系统具有全面的认识,了解不同系统平台的底层结构。各种并行计算机系统的出现对于系统能力的培养提出了更高层次的要求。
并行与分布式计算课程的内容比较杂,而不同高校的培养目标不同,特色不同,完全可以根据自己的特点有选择性地开设相关课程,可以从以下几个方向来开设相关专业课程,如图3 所示。
图3 并行与分布式计算课程方向
(1)并行与分布式程序设计。这一方向主要教授在各种平台下的程序设计开发,涵盖并行算法、多核与异构架构编程、分布式应用开发技术和大数据处理技术,主要内容是介绍并行计算机系统、多核和异构计算平台、分布式环境,以及基于分布式计算框架的大数据环境等各个计算环境下的算法和程序设计。
(2)并行计算。这一方向系统地介绍并行计算系统及其算法,涵盖并行计算机系统和并行算法两大内容。
(3)计算机系统。这一方向主要围绕并行计算机系统、云计算、多核与异构编程等介绍计算机系统的高级主题。
(4)分布式计算。这一方向系统地介绍分布式计算的原理和技术,主要涵盖分布式系统原理、分布式应用开发技术、大数据处理技术等技术。
并行与分布式计算是一个知识域,并不需要对应于一个课程。如何将该知识域中的知识单元融入课程中,即如何开设课程,不同的学校有不同的做法[7]。现有的做法可以总结如下。
(1)方案之一(+1 方案)。其他课程内容不作调整,另外专门开设一门并行与分布式计算课程。这种方案的优点是容易实现,不需要对教学方案作出大的调整,但是由于并行与分布式计算知识域内容非常丰富,要把它们浓缩到一门课程中是不容易的。如果一定要开设这门课程,其内容需要经过精心取舍,既能激发学生的兴趣,又能体现并行与分布式计算的精髓。
(2)方案之二(+0.n 方案)。不专门开设并行与分布式计算课程,而是将该知识域的内容分散到几门相关的课程中,如在操作系统课程中介绍分布式文件系统,在计算机体系结构中介绍并行计算机和分布式系统体系结构,在算法课程中介绍并行算法,在开发类课程中介绍SOA、组件技术、Web 服务等分布式开发技术,在大数据技术课程中介绍MapReduce 等分布式计算框架。这种方案无需对现有的培养计划和课程设置方案作任何调整,但是效果难以保证。这是因为一方面各个课程中不一定有足够的课时来讲授相关知识点;另一方面并行与分布式计算的相关知识分散在各处,学生的理解不够深入,主要还是以传统的思维为主;三是知识点实际是割裂的,不利于理解掌握形成整体知识结构。
(3)方案之三(+m 方案)。专门开设若干新的课程讲述并行与分布式相关的内容,如并行程序设计、分布式计算、大数据处理技术等。这种方案相对来说考虑比较周全,将并行与分布式计算的知识融合到几门课程中,但是由于课时总量是固定的,因此需要优化课程结构,调整其他课程的比重,因而牵涉面较大。
(4)方案之四(+m.n 方案)。这种方案一方面开设若干门新课,另一方面在已有课程中增加知识点,双管齐下融入相关知识点。例如,在计算机导论课中,可以介绍并行思维,让学生对于并行计算有直观的认识;在操作系统课程中,可以介绍多线程编程;在软件工程课程中,可以讲授SOA 和Web Services 等架构。再如,可以单独开设一门课程讲述现有分布式系统、分布式计算框架和云计算框架下的开发,从而使学生对于分布式系统和云计算有更为深入的理解。这种方案也需要对现有的课程结构进行调整。
在这4 种方案中,前面2 种方案不需要对课程体系作出大的变动,相对较容易实现,但是知识的融合较难实现;后面2 种方案有较多空间来展开,特别是第4 种方案,充分考虑了并行与分布式计算与其他课程之间的融合,也考虑了课程自身的体系,但是需要对课程体系作出较大的调整。
并行与分布式计算中涉及大量的概念和原理,理论上的介绍比较枯燥,不容易激发学生的兴趣,为此,很多高校开设并行与分布式计算的实验课,或者设置实践课时[5,8]。实践项目的设置可以考虑以下方向。
(1)算法与程序设计。程序设计比较容易激起学生的兴趣,让学生有成就感,为此,可以通过程序设计实践加深学生对并行与分布式计算的理解。在程序设计实践中,可以通过共享内存编程、分布式内存编程、基于分布式计算框架MapReduce 和Spark 的编程、云计算框架的编程等编程模式的对比,让学生体会到串行程序设计与并行程序设计的区别、数据密集型和计算密集型计算的区别以及计算向数据靠拢和数据向计算靠拢理念上的区别。
(2)大数据处理。大数据是计算机科学的一个热门发展方向,而大数据技术天生就是基于分布式技术的,以大数据技术为抓手可以较好地将分布式计算技术与大数据处理的实践结合起来,两个方面相得益彰。具体来说,可以讲授GFS、HDFS 等分布式数据存储,批处理式的MapReduce、面向流式计算的Storm、基于内存计算的Spark、批流结合的Flink 等分布式计算框架,分布式缓存、分布式队列等分布式基础设施,以及Hive、HBase 等分布式数据库和数据仓库。
(3)系统开发。并行系统和分布式系统的原理较为抽象,可以设置一些系统开发方面的实践课以加深理解。例如,基于GFS 的思想开发一个分布式文件系统、基于Bigtable 的思想实现分布式数据库、基于P2P 原理实现分布式文件共享系统、分布式消息队列的实现等。
(4)应用开发。着重通过SOA 架构、Web Services、微服务等架构,体会分布式应用的特点,理解分布式应用中如何屏蔽底层平台和服务的差异,如何将不同地理位置分布的服务集成起来,远程对象如何交互等。
并行与分布式计算是一个新的计算范式,从串行计算到并行计算是大势所趋。本文回顾了并行与分布式计算这一知识域的课程开设现状和内容,并思考了该知识域与能力培养、课程设置和实践课程设置方面的问题。目前在实际的教学设置中还存在一些问题,如重概念、轻实践,与其他课程结合不够紧密等,需要更多的探索和实践。