

摘要:為滿足新時(shí)期人工智能交叉方向人才培養(yǎng)需求,對(duì)“GPU并行計(jì)算”課程體系與教學(xué)模式進(jìn)行了積極的探索和實(shí)踐。理論教學(xué)方面,夯實(shí)并行計(jì)算基本理論,強(qiáng)化并行算法設(shè)計(jì)、GPU并行編程技巧及優(yōu)化方法。實(shí)踐教學(xué)方面,通過(guò)漸進(jìn)式實(shí)驗(yàn)項(xiàng)目的反復(fù)迭代,幫助學(xué)生建立實(shí)踐經(jīng)驗(yàn)和應(yīng)用信心。新體系通過(guò)多樣的教學(xué)模式使學(xué)生緊跟并行計(jì)算研究的前沿技術(shù)。通過(guò)鼓勵(lì)不斷創(chuàng)新和探索的課程評(píng)價(jià)體系使學(xué)生能夠自覺(jué)、自愿地將并行計(jì)算應(yīng)用于科學(xué)研究。
關(guān)鍵詞:GPU并行計(jì)算;體系設(shè)計(jì);教學(xué)模式;評(píng)價(jià)體系
一、前言
隨著多核CPU及GPU(Graphic Processing Unit)硬件產(chǎn)品的普及,并行計(jì)算技術(shù)突飛猛進(jìn),已成為人工智能高速發(fā)展的算力基石。目前許多高性能個(gè)人電腦上已經(jīng)配置了GPU獨(dú)立顯卡,組成了CPU+GPU的異構(gòu)并行計(jì)算平臺(tái),此平臺(tái)的廣泛使用能顯著縮短人工智能各類算法的計(jì)算時(shí)間[1]。當(dāng)前深度學(xué)習(xí)方向的主要底層實(shí)現(xiàn)技術(shù)既包含基于多核CPU硬件架構(gòu),又包含基于多核GPU架構(gòu)的并行計(jì)算。
針對(duì)非計(jì)算機(jī)專業(yè)背景研究生計(jì)算機(jī)理論基礎(chǔ)較弱的問(wèn)題,筆者研究探索了現(xiàn)代并行計(jì)算的有效教學(xué)方法,對(duì)現(xiàn)有“GPU并行計(jì)算”課程體系和教學(xué)模式進(jìn)行了改革。課程在傳統(tǒng)并行計(jì)算通用原理的基礎(chǔ)上,引入并強(qiáng)化了新計(jì)算架構(gòu)下的并行計(jì)算技術(shù)、并行程序設(shè)計(jì)及優(yōu)化方法。
二、“GPU并行計(jì)算”課程體系設(shè)計(jì)
本課程是為中國(guó)科學(xué)技術(shù)大學(xué)非計(jì)算機(jī)專業(yè)的研究生開設(shè)的專業(yè)選修課,課程在介紹并行計(jì)算基本理論和體系結(jié)構(gòu)的基礎(chǔ)上,深入介紹了多核CPU并行編程和GPU并行編程的平臺(tái)配置、算法設(shè)計(jì)、編程規(guī)范與技巧和各類程序優(yōu)化方法。
大多數(shù)非計(jì)算機(jī)專業(yè)的研究生在本科階段都學(xué)習(xí)了程序設(shè)計(jì)課程(如C語(yǔ)言、Python語(yǔ)言),養(yǎng)成了根深蒂固的串行計(jì)算思維,開始接觸較為難懂的并行計(jì)算理論,伴隨著編程調(diào)試上屢屢受挫,可能會(huì)放棄自主編寫并行程序,轉(zhuǎn)向直接調(diào)用Python和MATLAB的庫(kù)函數(shù),或仍采用傳統(tǒng)的串行編程。因此,筆者不斷探索“上手快,體驗(yàn)好,愿意用”的教學(xué)方法,保障學(xué)生能夠快速掌握并行編程技術(shù)。
“GPU并行計(jì)算”課程教學(xué)安排為理論課30學(xué)時(shí),實(shí)踐課40學(xué)時(shí),突出理論與實(shí)踐并重,課程體系設(shè)計(jì)如圖1所示。本課程貫徹“精講多練”的原則,培養(yǎng)學(xué)生快速進(jìn)行并行程序設(shè)計(jì)的能力,并使學(xué)習(xí)過(guò)程遵循算法設(shè)計(jì)、精細(xì)編程、逐步優(yōu)化、體驗(yàn)加速的良性循環(huán),在每一次迭代學(xué)習(xí)中不斷獲得成就感。課程教學(xué)內(nèi)容在介紹并行計(jì)算基本理論和方法的基礎(chǔ)上,側(cè)重培養(yǎng)學(xué)生的并行計(jì)算思維方式和建立算法模型的能力。
理論課程章節(jié)主要內(nèi)容及學(xué)時(shí)分配如下:
第一部分 并行計(jì)算基礎(chǔ)(共8學(xué)時(shí));
第二部分 多核CPU并行編程(共8學(xué)時(shí));
第三部分 GPU并行編程 (共14學(xué)時(shí))。
理論課程的教學(xué)重點(diǎn)是:并行程序的基本設(shè)計(jì)思想及其性能評(píng)價(jià)方法;多核CPU的實(shí)現(xiàn)模型及OpenMP編程技術(shù);GPU的硬件架構(gòu)及CUDA編程技術(shù)和程序優(yōu)化方法。
實(shí)驗(yàn)課程主要圍繞理論課程教學(xué)內(nèi)容開展,通過(guò)漸進(jìn)式實(shí)驗(yàn)項(xiàng)目來(lái)強(qiáng)化學(xué)生對(duì)所學(xué)內(nèi)容的理解,培養(yǎng)學(xué)生進(jìn)行并行程序設(shè)計(jì)的能力,見(jiàn)表1。實(shí)驗(yàn)教學(xué)中采用項(xiàng)目驅(qū)動(dòng)實(shí)踐的模式,學(xué)生自主規(guī)劃項(xiàng)目進(jìn)度,將本專業(yè)的實(shí)際課題用并行計(jì)算實(shí)現(xiàn)。
通過(guò)案例的學(xué)習(xí)和分析能幫助學(xué)生盡快建立并行計(jì)算的應(yīng)用模型,因此在近幾年的課程教學(xué)中建立并不斷完善了面向大規(guī)模計(jì)算、圖像處理、視覺(jué)計(jì)算、深度學(xué)習(xí)等典型應(yīng)用的實(shí)驗(yàn)案例庫(kù)。
三、“GPU并行計(jì)算”課程教學(xué)模式改革
“GPU并行計(jì)算”課程教學(xué)模式改革的目標(biāo)是面向新時(shí)代多專業(yè)人才的培養(yǎng)需求,既講授各種并行計(jì)算模型的設(shè)計(jì)思想和體系結(jié)構(gòu),又在實(shí)踐環(huán)節(jié)中培養(yǎng)學(xué)生開發(fā)并行程序的應(yīng)用能力。筆者設(shè)計(jì)了“理實(shí)交融”的課程教學(xué)模式,具體包括如下四點(diǎn):
理論講授:并行算法設(shè)計(jì)及編程模型——被動(dòng)學(xué)習(xí);
實(shí)驗(yàn)設(shè)計(jì):漸進(jìn)式實(shí)驗(yàn)項(xiàng)目——主動(dòng)學(xué)習(xí);
交流學(xué)習(xí):典型應(yīng)用案例庫(kù)、課程設(shè)計(jì)交流報(bào)告會(huì)——交流探討;
融合創(chuàng)新:完善課程設(shè)計(jì),激發(fā)創(chuàng)新思維——提升能力。
本課程教學(xué)中采取了三大舉措,讓學(xué)生愛(ài)上并行編程。
(一)課程教學(xué)中貫穿“上手快”
為了讓學(xué)生對(duì)并行計(jì)算的原理和基本算法能快速入門,“第一部分 并行計(jì)算基礎(chǔ)”涉及的內(nèi)容就能使學(xué)生快速了解并行程序設(shè)計(jì)的精髓。通過(guò)對(duì)MPI、OpenMP、CUDA小程序的剖析了解程序的基本構(gòu)成,通過(guò)簡(jiǎn)單的模仿練習(xí)解決實(shí)際問(wèn)題,培育并行編程的興趣和能力。
在課堂教學(xué)中采用類比式教學(xué)把抽象的并行系統(tǒng)結(jié)構(gòu)、計(jì)算模型用通俗易懂的類比講解,如將CPU的每個(gè)核類比為大學(xué)生,能力強(qiáng),適合做粗粒度并行;GPU的每個(gè)核類比為小學(xué)生,能力稍弱但人數(shù)眾多,適合做細(xì)粒度并行[2]。
(二)實(shí)驗(yàn)教學(xué)中貫穿“體驗(yàn)好”
實(shí)驗(yàn)教學(xué)中側(cè)重全方位的能力培養(yǎng),不再局限于學(xué)習(xí)單一的并行編程環(huán)境,而是引導(dǎo)學(xué)生了解硬件架構(gòu)和軟件體系。課堂上,學(xué)生被動(dòng)學(xué)習(xí)各種并行計(jì)算模型和使用規(guī)范。實(shí)驗(yàn)中,通過(guò)學(xué)習(xí)案例逐漸培養(yǎng)自己的并行計(jì)算思維和并行編程技能,熟練掌握問(wèn)題中的數(shù)據(jù)劃分、任務(wù)劃分技巧。通過(guò)精講多練的反復(fù)迭代,實(shí)現(xiàn)自身并行編程能力的提升。這種迭代學(xué)習(xí)的教學(xué)模式與人類天生的主動(dòng)學(xué)習(xí)模式相吻合。
從一開始修改串行程序,只增加少量的編譯指導(dǎo)語(yǔ)句來(lái)實(shí)現(xiàn)并行程序的執(zhí)行,到后期熟練地把各類問(wèn)題模型化、直接編寫并行程序,并考慮到數(shù)據(jù)讀取的快慢盡可能地使用離核最近的存儲(chǔ)器,使用各種優(yōu)化方法不斷加速程序的執(zhí)行。學(xué)生們?cè)趯?shí)踐環(huán)節(jié)不斷獲得的成就感增強(qiáng)了他們進(jìn)行并行計(jì)算的信心,形成了依托并行計(jì)算思維開發(fā)并行程序解決實(shí)際問(wèn)題的良性循環(huán)。
在課堂理論教學(xué)中,講解的程序范例從向量的求和、向量的點(diǎn)積、排序算法、矩陣相乘、經(jīng)典迭代算法、快速傅里葉變換、到2D圖像濾波、3D光線追蹤等,由淺入深,循序漸進(jìn),讓學(xué)生在編程實(shí)戰(zhàn)中體會(huì)成就感。實(shí)驗(yàn)課上,學(xué)生面對(duì)的是一個(gè)個(gè)精心設(shè)計(jì)并與上課內(nèi)容相匹配的漸進(jìn)式實(shí)驗(yàn)項(xiàng)目,每一個(gè)項(xiàng)目的完成都將鞏固課堂上學(xué)習(xí)的知識(shí)點(diǎn),融會(huì)貫通使用并行思維解決實(shí)際問(wèn)題。課程配備的助教老師具有豐富的并行編程經(jīng)驗(yàn),線上、線下都會(huì)耐心指導(dǎo)實(shí)驗(yàn)中遇到困難的同學(xué),并根據(jù)實(shí)驗(yàn)結(jié)果的完成度和優(yōu)化方案的實(shí)現(xiàn)來(lái)給出成績(jī)。
(三)課程教學(xué)導(dǎo)向圍繞“愿意用”
對(duì)于大多數(shù)非計(jì)算機(jī)專業(yè)的研究生來(lái)說(shuō),并行計(jì)算難點(diǎn)在于算法模型的設(shè)計(jì),以及編程調(diào)試中會(huì)遇到許多難以理解的BUG。解決之道無(wú)非是多練多做,并在教學(xué)班上培植出一種“人人都會(huì)并行計(jì)算”的氛圍。
GPU體系結(jié)構(gòu)和CUDA編程技術(shù)是本課程的重點(diǎn)和難度,這部分內(nèi)容包含大量術(shù)語(yǔ),并且每隔一年GPU就會(huì)推出新的架構(gòu)和硬件產(chǎn)品。如果缺乏對(duì)GPU硬件架構(gòu)和軟件生態(tài)的了解,用戶很難像簡(jiǎn)單的串行編程語(yǔ)言一樣,通過(guò)模仿程序示例寫出正確、高效的CUDA并行程序[3]。在長(zhǎng)期的課程教學(xué)中,筆者探索出了保障學(xué)生快速掌握CUDA并行編程的三項(xiàng)舉措。
1.快速生成CUDA主函數(shù)
CUDA主函數(shù)運(yùn)行在CPU端,主要完成分配和初始化內(nèi)存空間和顯存空間、將要計(jì)算的數(shù)據(jù)從主機(jī)內(nèi)存上傳輸?shù)紾PU顯存上、按指定的參數(shù)提交給GPU去執(zhí)行核函數(shù)、將計(jì)算后存在于GPU顯存上的結(jié)果數(shù)據(jù)傳輸至主機(jī)內(nèi)存并做進(jìn)一步處理,最后釋放顯存空間。
2.快速生成CUDA核函數(shù)
核函數(shù)是在GPU設(shè)備端上執(zhí)行的代碼,編程時(shí)要具有并行思維和想象力,站在線程的角度合理劃分?jǐn)?shù)據(jù)和任務(wù),用代碼描述清楚線程間的分工合作和具體要進(jìn)行的計(jì)算步驟和數(shù)據(jù)訪問(wèn)。在核函數(shù)的編寫中可以使用CUDA的內(nèi)建變量直接獲得不同維度的線程號(hào)。
3. 逐步優(yōu)化獲得高加速比
能夠正確運(yùn)行的并行程序并不意味著任務(wù)的完成,它只是一個(gè)程序的雛形,是逐步進(jìn)行優(yōu)化的起點(diǎn)。只有了解GPU的硬件架構(gòu)才能充分利用機(jī)器的資源,從而獲得優(yōu)良的加速比。常見(jiàn)的優(yōu)化包括根據(jù)顯卡的配置調(diào)整blocks、threads的數(shù)目,優(yōu)化指令流,合理使用共享內(nèi)存、常量?jī)?nèi)存、紋理內(nèi)存,保證數(shù)據(jù)的連續(xù)性,優(yōu)化顯存訪問(wèn),避免顯存帶寬成為瓶頸等。
四、鼓勵(lì)不斷創(chuàng)新和探索的課程評(píng)價(jià)體系
在學(xué)生最關(guān)注的成績(jī)?cè)u(píng)定環(huán)節(jié),本課程堅(jiān)持鼓勵(lì)不斷創(chuàng)新和探索的精神。學(xué)生的項(xiàng)目設(shè)計(jì)和實(shí)踐不是簡(jiǎn)單地重復(fù)已有算法,而是要求學(xué)生能將本專業(yè)的密集計(jì)算問(wèn)題抽象出并行算法模型并加以編程實(shí)現(xiàn),初步完成的程序作為優(yōu)化的起點(diǎn),之后再結(jié)合不同架構(gòu)下GPU顯卡的特點(diǎn)逐步進(jìn)行線程配置優(yōu)化、指令優(yōu)化、存儲(chǔ)優(yōu)化。在項(xiàng)目設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中,能逐步發(fā)現(xiàn)問(wèn)題并解決問(wèn)題、逐步優(yōu)化提高加速比的學(xué)生將得到成績(jī)上的鼓勵(lì)。
本課程擯棄了傳統(tǒng)的閉卷考試方式,主要采用的考核方式為平時(shí)實(shí)驗(yàn)編程項(xiàng)目,及期末自主選題大型項(xiàng)目加上寫課程報(bào)告。自主選題大型項(xiàng)目上,鼓勵(lì)各個(gè)院系的學(xué)生將并行計(jì)算運(yùn)用于解決本專業(yè)的計(jì)算問(wèn)題。此環(huán)節(jié)是培育創(chuàng)新思維和學(xué)術(shù)交叉能力的重要手段,真正做到活學(xué)活用。在學(xué)期期末舉行課程研討會(huì),由大項(xiàng)目完成優(yōu)秀者做報(bào)告展示成果,分享課程項(xiàng)目的設(shè)計(jì)思想及并行程序開發(fā)經(jīng)驗(yàn),并獲得成績(jī)上的加分。此教學(xué)環(huán)節(jié)強(qiáng)化了項(xiàng)目實(shí)踐的重要性,培養(yǎng)了學(xué)生公開做學(xué)術(shù)報(bào)告的能力,幫助更多同學(xué)拓寬了學(xué)術(shù)視野,促進(jìn)了交流與融合。
表2是本課程教學(xué)各環(huán)節(jié)的具體評(píng)價(jià),體現(xiàn)了注重過(guò)程培養(yǎng)、注重專業(yè)知識(shí)和鼓勵(lì)創(chuàng)新思維、不斷探索的原則。公平、公正、公開的課程評(píng)價(jià)體系也受到了學(xué)生的擁護(hù),學(xué)生選課積極踴躍,選課名額基本秒光。
通過(guò)一個(gè)學(xué)期的理論學(xué)習(xí)和實(shí)戰(zhàn)經(jīng)歷,學(xué)生們普遍反映通過(guò)這門課程的學(xué)習(xí),幫助自己建立起了完整的并行計(jì)算知識(shí)體系,并且快速掌握了并行編程的方法,為后續(xù)開展人工智能、大規(guī)??茖W(xué)計(jì)算的研究打下了基礎(chǔ)。最主要的體會(huì)是原來(lái)并行計(jì)算并不難!通過(guò)對(duì)算法的設(shè)計(jì)、語(yǔ)句的套用、庫(kù)函數(shù)的使用就能獲得成百上千倍的加速比。
五、課程教學(xué)面臨的具體問(wèn)題及解決方法
“GPU并行計(jì)算”課程作為研究生的專業(yè)選修課對(duì)學(xué)生的編程能力有一定的要求,考慮到C語(yǔ)言是大部分理工類高校的必修編程語(yǔ)言,本課程的教學(xué)以C語(yǔ)言為基礎(chǔ)。在實(shí)際教學(xué)中發(fā)現(xiàn)學(xué)生C語(yǔ)言掌握的程度有所不同,有的學(xué)生本科階段沒(méi)有使用過(guò)Visual Studio集成編譯環(huán)境;有的學(xué)生缺乏用C語(yǔ)言開發(fā)實(shí)際應(yīng)用程序的經(jīng)驗(yàn);有的學(xué)生C語(yǔ)言中的部分內(nèi)容沒(méi)有學(xué)過(guò),如帶參數(shù)的main函數(shù)、指針做函數(shù)的參數(shù)、指針數(shù)組等。這些編程基礎(chǔ)問(wèn)題都可能對(duì)本課程的學(xué)習(xí)帶來(lái)很大困擾。為此在理論和實(shí)驗(yàn)教學(xué)中筆者采用了如下措施來(lái)夯實(shí)學(xué)生的C語(yǔ)言編程基礎(chǔ)。
第一次實(shí)驗(yàn)課上布置安裝并測(cè)試機(jī)器CPU和GPU顯卡的參數(shù)配置;安裝測(cè)試Visual Studio集成編譯環(huán)境,并學(xué)習(xí)設(shè)置OpenMP的編譯環(huán)境和環(huán)境變量;在Visual Studio內(nèi)加裝CUDA和OpenCV等軟件并測(cè)試運(yùn)行CUDA SDK里的范例。實(shí)驗(yàn)課上這種手把手教學(xué)使得編程能力欠缺的學(xué)生學(xué)習(xí)并行計(jì)算的信心大增,一次實(shí)驗(yàn)課就基本掌握了本課程所需要的全部軟件編譯環(huán)境。
理論課上為學(xué)生彌補(bǔ)linux操作系統(tǒng)的基本用法,便于學(xué)生課后遠(yuǎn)程連接學(xué)校超算中心及實(shí)驗(yàn)室服務(wù)器進(jìn)行并行程序的編寫和調(diào)試。復(fù)習(xí)C語(yǔ)言中指針做函數(shù)的參數(shù)、帶參數(shù)的main函數(shù)等內(nèi)容,CUDA并行編程中的核函數(shù)和OpenMP并行編程中的主函數(shù)都是基于此類指針的使用。只有夯實(shí)了C語(yǔ)言編程的基礎(chǔ)才能在并行程序設(shè)計(jì)中不受語(yǔ)言的羈絆,專注于并行算法的設(shè)計(jì)與實(shí)現(xiàn)。
課程教學(xué)中注重分析并行機(jī)器硬件的體系結(jié)構(gòu),對(duì)比串行程序和并行程序不同的設(shè)計(jì)理念、執(zhí)行模式和調(diào)度策略。引導(dǎo)學(xué)生站在處理器的角度去體會(huì)如何獲取數(shù)據(jù)、處理數(shù)據(jù)才能充分地并行執(zhí)行;根據(jù)需要使用正確的存儲(chǔ)器,減少對(duì)GPU片外顯存的讀取,提高執(zhí)行單元的利用率,盡可能隱藏訪存延時(shí)。為了獲得高性能的計(jì)算結(jié)果,進(jìn)行合理的并行劃分、設(shè)計(jì)巧妙的算法,同時(shí)兼顧指令吞吐量、數(shù)據(jù)傳輸帶寬等多方因素,所以實(shí)際編程中往往是把注意力先集中于并行算法的設(shè)計(jì),優(yōu)先保證編寫出一個(gè)能正確運(yùn)行的并行程序;然后再進(jìn)行存儲(chǔ)優(yōu)化、指令優(yōu)化、調(diào)度優(yōu)化以獲得滿意的加速比。
六、結(jié)語(yǔ)
“GPU并行計(jì)算”課程力求通過(guò)理論與實(shí)踐并重的課程體系建設(shè)和精心準(zhǔn)備的教學(xué)內(nèi)容,在有限的學(xué)時(shí)內(nèi)為學(xué)生講授并行計(jì)算的核心思想;通過(guò)漸進(jìn)式教學(xué)實(shí)驗(yàn),提升學(xué)生的并行計(jì)算思維和并行算法設(shè)計(jì)及編程實(shí)現(xiàn)能力;通過(guò)多樣的教學(xué)形式使學(xué)生了解并行計(jì)算研究的前沿技術(shù)成果;通過(guò)鼓勵(lì)不斷創(chuàng)新和探索的課程評(píng)價(jià)體系使學(xué)生能夠更好地理解所學(xué)知識(shí)并自覺(jué)自愿地將并行計(jì)算應(yīng)用于科學(xué)研究。近幾年來(lái),對(duì)學(xué)生的調(diào)研結(jié)果及學(xué)生對(duì)課程的評(píng)價(jià)表明,各專業(yè)研究生通過(guò)本課程的學(xué)習(xí)能夠較好地掌握基本的并行編程原理和多核CPU、GPU并行編程技術(shù),并能運(yùn)用這些技術(shù)完成各專業(yè)相關(guān)領(lǐng)域算法的并行加速。
參考文獻(xiàn)
[1]遲學(xué)斌,王彥棢,王玨,等.并行計(jì)算與實(shí)現(xiàn)技術(shù)[M].北京:科學(xué)出版社,2015:46-56.
[2]雷洪,胡許冰.多核并行高性能計(jì)算OpenMP[M].北京:冶金工業(yè)出版社,2016:22-33.
[3]Shane Cook.CUDA并行程序設(shè)計(jì)(GPU編程指南)[M].蘇統(tǒng)華,李東,李松澤,魏通,譯.北京:機(jī)械工業(yè)出版社,2017:35-47.
基金項(xiàng)目:1.安徽省級(jí)質(zhì)量工程教學(xué)研究項(xiàng)目“面向多專業(yè)研究生的‘GPU并行計(jì)算’教學(xué)研究與實(shí)踐”(項(xiàng)目編號(hào):2020jyxm2271);2.中國(guó)科學(xué)技術(shù)大學(xué)質(zhì)量工程教學(xué)研究項(xiàng)目“計(jì)算思維在程序設(shè)計(jì)類課程中的培育與探索”(項(xiàng)目編號(hào):2021xjyxm064)
作者單位:中國(guó)科學(xué)技術(shù)大學(xué)信息科學(xué)技術(shù)學(xué)院
責(zé)任編輯:王穎振、楊惠娟