

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