劉喜平
(江西財經大學 信息管理學院,江西 南昌 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、微服務等架構,體會分布式應用的特點,理解分布式應用中如何屏蔽底層平臺和服務的差異,如何將不同地理位置分布的服務集成起來,遠程對象如何交互等。
并行與分布式計算是一個新的計算范式,從串行計算到并行計算是大勢所趨。本文回顧了并行與分布式計算這一知識域的課程開設現狀和內容,并思考了該知識域與能力培養、課程設置和實踐課程設置方面的問題。目前在實際的教學設置中還存在一些問題,如重概念、輕實踐,與其他課程結合不夠緊密等,需要更多的探索和實踐。