文章編號:1672-5913(2008)20-0169-03
摘 要:本文闡述了在多核編程課程中采用的多樣的教學方法。首先介紹課程的總體規劃,再具體論述理論教學與實踐教學的教學過程和手段,以及討論課堂的設計思路,最后總結了教學效果和意義。
關鍵詞:多核編程;教學方法;多線程開發思想
中圖分類號:G642 文獻標識碼:B
2002年,為支持教育部國家示范性軟件學院項目,Intel啟動大學軟件學院計劃,促進軟件類課程建設,協同培養實用型、復合型的軟件人才。2007年我校與Intel開展合作,將目前主流的多核技術融入現行的本科教學計劃中,成立課程組,開設了一門專業課程——“多核編程”。目前該課程已經開設兩年,現將在本課程中的一些教學方法、心得與各位同仁分享。
1 課程介紹
本課程主要內容包括多核體系結構介紹,多線程開發思想,多線程程序設計與實現,多線程程序編譯、分析工具的應用,多線程編程方法學等。由于本課程授課內容比較新穎,與現今的多核技術密切相關,因此對學生要求較高,需要學生有較好的分析和編寫串行程序的能力,具備操作系統等相關課程的知識,因此本課程在大三下學期開設。
本課程以一條主線貫徹始終,反復重復、不斷強化為指導思想和教學方法。即以培養學生多線程開發思想為教學主線,以在多核平臺上編寫多線程程序為實踐教學手段,使學生掌握多線程開發的思想并在不斷實踐中反復重復加以鞏固強化,提高學生對多線程問題的分析和解決能力,為今后的學習打下基礎。
本課程注重實踐環節,上機實踐占總課時50%。課程的難點在于打破學生已經固有的串行編程思想,建立多線程開發思想。
2 教學方法設計
在整個教學過程中,分為理論教學和實踐教學兩部分。在課程安排上兩部分交替進行,相輔相成,并始終貫穿多線程開發思想這一主線,讓學生在實踐中不斷強化,加深理解直至靈活運用。
理論教學旨在幫助學生理解和掌握多核概念,多線程開發思想以及主要編程語言的應用等內容。實踐課程旨在通過實際的操作鞏固理論課上所學的知識,采用相關Intel多線程工具對程序進行性能分析、調優等。此外,討論環節的設置也是本課程教學特色之一。討論環節的展開加強了學生間的知識交流與自主學習的能力,也將理論教學與實踐教學融為一體。
2.1 理論教學
在理論教學中圍繞多線程開發思想這一主線展開。在授課中,本課程組始終保持以學生為本的態度,采取從學生現有知識體系出發,逐漸過渡學習新知識的教學方法,良好的保證了學生對授課內容的理解和接受程度。在這一過程中,采取了大量舉例、類比、圖示等分析方法。
多線程開發思想主要描述了多線程程序的開發流程,如圖1所示,大體上分為五個階段。每個階段的授課由淺入深,讓學生明確在每個階段對問題的分析方法,解決方案以及可以利用的輔助相關軟件等內容。下面將針對某一個階段的教學方法展開論述。

圖1 多線程開發流程簡圖
在多線程開發流程中任務分解,設計并行算法這一階段(如圖1第3階段)較為重要,它是多線程化的前提和依據。這一階段需要學生掌握任務分解的含義,任務分解的主要方法,這些方法的含義、特點、優缺點、適用條件,以及在明確任務分解方法的基礎上如何深入設計并行算法等內容。
在講述了這階段的理論內容后,為了幫助學生理解這階段的內容,在授課過程中列舉了大量現實生活的例子,例如種樹。假設兩人共同完成10棵樹的栽種工作,工作分為挖坑和栽種兩個任務,這時對這一項工作來說有兩種協調方法:(1)一人挖坑,一人種樹;(2)每人負責五棵樹的挖坑和栽種工作。這兩種協調方法剛好符合任務分解中任務分解和數據分解兩種分解方法。到這里學生已經比較明確這兩種分解的含義和不同之處,接著以例子和理論相互對比的方法深入分析這兩種分解的特點、優缺點以及適用條件。同時與操作系統中的線程同步,資源競爭等概念相聯系,使學生在理解上沒有障礙。接著引導學生設計該問題的簡明并行算法,讓學生明確實際問題如何轉化為算法,進而轉化為程序,從而使問題得以解決。簡明算法如下所示。
//第一種協調方法的算法:(1)一個人挖坑,一個人種樹
void caving();
void planting();
int main(){
init(); //系統初始化。
createthread(caving) ;// 生成一個線程(相當于一個人)完成挖坑的工作。
createthread(planting) ;// 生成一個線程(相當于一個人)完成栽種的工作。
wait(); //線程同步。
return 0;
}
//第二種協調方法的算法:每人負責五棵樹的挖坑和栽種工作。
void caving_planting ();
int main(){
init(); //系統初始化。
createthread(caving_planting (前五棵樹) );// 生成一個線程(相當于一個人)完成前五棵樹的工作。
createthread(caving_planting (后五棵樹) );// 生成一個線程(相當于一個人)完成后五棵樹的工作。
wait(); //線程同步。
return 0;
}
至此,這一階段基本闡述清楚,可以再舉一些例子讓學生自主分析理解,設計算法。
2.2 實踐教學
在實踐課程中本課程組采取循序漸進,劃分層次的教學方法,既保證了多數同學的學習效果也為優秀的同學提供了提高的空間。
實踐課時占總課時的一半,主要內容包括(1)對多線程開發思想加以實踐鞏固,(2)對學習過程中遇到的疑惑,自主設計相關實驗,驗證解決,提高學生獨立自主學習的能力。
實踐內容共分為五個實驗。各個實驗的目的及側重點各不相同。實驗內容如表1所示。

綜上所述,在實踐授課中始終圍繞理論授課的內容是理論知識的鞏固和補充,兩者在本課程中缺一不可。在實踐課程中還采取了隨堂檢查記錄成績的方法,既為最終考核提供了依據,也在一定程度上督促了學生的學習,調動了學生的學習積極性。
2.3 討論環節
隨著課程的進行,在課程的不同階段安排了若干次的討論環節。討論內容主要針對在課程學習中遇到的問題,通過學生間的各抒己見、資料查閱、實驗驗證等方法解決。其中有兩次討論環節值得一提。
一次是在自主實驗設計之前,首先將學生分組,每位學生闡述在自主實驗中將要解決的問題及初步設計方案,進行組內討論并修改設計方案至組內通過。接著組內將沒有通過的解決方案在全班討論上提出,進行討論修訂,最終確定設計方案。另一次是在自主實驗設計之后,學生將自己的實驗結果與實驗結論與大家分享,聆聽其他學生的評價及進一步的修改意見。例如,很多學生在OpenMP的學習過程中對其具體語法和語義的理解不是十分清楚,容易混淆。學生設計實驗,通過對幾組小程序的實踐驗證,對比分析,從而解決這一問題。這兩次討論環節的設置行之有效的幫助學生完成最后一次實驗,實驗效果良好,讓學生在實踐中懂得合作與分享的意義。
總之,本課程組認為討論環節在本課程中對學生的學習起到了積極的推進作用,讓學生在溝通與合作中自主學
習,加深了對課程各個環節的理解和掌握,提高了學生分析解決問題的能力。
3 考核方式
期末成績為百分制,沒有期末考試,讓學生專注于課程的學習。成績分為平時成績和實踐成績兩部分,平時成績主要針對學生平時上課的出勤率、聽課狀態、課上表現、作業完全等情況。實踐成績包括實驗報告、實驗課表現、隨堂檢查三部分。全面考核學生在整個學習過程中的態度和表現。當然這需要授課教師在課程的整個過程中關注每位學生的學習情況。
4 結束語
在Intel相關部門的大力支持及本課程組教師的共同努力下,本課程已經建立起較完善的教學體系和教學方法。由于在授課過程中,課程組始終貫徹一條主線的教學方法,因此使得授課內容集中連貫易于學生理解。理論與實踐的有機結合使學生的學習更具有實際針對性,討論環節的設置為學生間的交流和主動學習提供平臺。經過一個學期的系統學習,學生在今后遇到多線程相關問題時具有分析和解決的能力,達到教學目的。
參考文獻
[1] 多核系列教材編寫組.多核程序設計[M].北京:清華大學出版社,2007.