哈工大軟件學院《并行程序設計》課程實驗報告之二.doc_第1頁
哈工大軟件學院《并行程序設計》課程實驗報告之二.doc_第2頁
哈工大軟件學院《并行程序設計》課程實驗報告之二.doc_第3頁
哈工大軟件學院《并行程序設計》課程實驗報告之二.doc_第4頁
哈工大軟件學院《并行程序設計》課程實驗報告之二.doc_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

并行程序設計課程實驗報告實驗2:基于Windows Thread和OpenMP的多線程編程姓名*院系軟件學院學號*任課教師張偉哲指導教師蘇統華實驗地點軟件學院五樓機房實驗時間2015年4月8日實驗課表現出勤、表現得分實驗報告得分實驗總分操作結果得分一、實驗目的要求:需分析本次實驗的基本目的,并綜述你是如何實現這些目的的? 一、1熟練掌握C+語言;。2、掌握Visual Studio* .NET*集成開發環境的使用;3、掌握Windows32 Thread API開發多線程程序;4、掌握Windows32 Thread API中互斥機制的使用方式二、1掌握OpenMP的基本功能、構成方式、句法; 2、掌握OpenMP體系結構、特點與組成;3、掌握采用OpenMP進行多核架構下多線程編程的基本使用方法和調試方法。二、實驗內容該部分填寫在實驗過程中,你都完成了哪些工作。一、1. 定位到文件夾Win32 Threads HelloThreads,用Microsoft Visual studio打開文件HelloThread.sln,編譯并運行程序;2. 對main.cpp中函數進行修改,要求輸出線程創建順序(例如:Hello Thread 0, Hello Thread 1, Hello Thread 2 等等);注意:利用CreateThread()循環變量作為每個線程的執行順序唯一標識3. 編譯并多次運行程序,記錄線程執行順序,分析線程程序執行順序是否不可預見及其產生原因4. 定位到文件夾Win32 Threads Pi,用Microsoft Visual studio打開文件Pi.sln,編譯并運行程序;5. 對此串行代碼使用Windows32 Thread API進行線程化,要求4線程實現,且每次迭代計算僅由一個線程完成6. 使用CRITICAL_SECTION機制和Semaphors機制對多線程共享變量進行互斥操作,避免數據競爭。二、1、關閉病毒掃描和監控程序;2、采用Microsoft Visual Studio工具打開實驗程序文件:/Helloworlds/Helloworlds.c;3、編譯,運行程序并記錄實驗結果;4、在源程序代碼中的找到主程序體:printf(Hello Worldn);for(i=0;iicl /Qopenmp HelloWorlds.c;6、設定Openmp線程數:C:Set OMP_NUM_THREADS=2;7、重新運行程序,觀測實驗結果,并記錄。實驗二 積分方法求PI值的并行處理化算法 1、關閉病毒掃描和監控程序;2、采用Microsoft Visual Studio工具打開實驗程序文件:/pi/pi.sln;3、編譯,運行程序并記錄實驗結果;4、在源程序代碼中的找到主程序體中進行omp方式優化5、采用/Qopenmp重新編譯程序;三、實驗結果記錄實驗結果。2.1一、(1)直接編譯運行:(2)打印數值(3)每次打印10個 Hello ,會發現明顯的亂序執行現象(4)運行程序(5)使用下面的多線程代碼進行計算#include #include CRITICAL_SECTION cSection;const int numThreads = 4;static long num_steps=100000; double step, pi;double x, sum = 0.0;DWORD WINAPI helloFunc(LPVOID pArg) int s = *(int *)pArg;step = 1.0/(double) num_steps;for (int i=s; i s + 25000; i+)x = (i+0.5)*step;EnterCriticalSection(&cSection);sum = sum + 4.0/(1.0 + x*x);LeaveCriticalSection(&cSection);return 0;void main() InitializeCriticalSection(&cSection);HANDLE hThreadnumThreads;int tNumnumThreads; for (int i = 0; i numThreads; i+) tNumi = i * 25000; hThreadi = CreateThread(NULL, 512, helloFunc, (void *)&tNumi, 0, NULL);WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE); pi = step * sum; printf(Pi = %12.9fn,pi); getchar();得到結果:(6)使用 mutex 進行互斥DWORD WINAPI CountWords(LPVOID arg) BOOL bDone = FALSE ; char inLine132;while (!bDone) bDone = (GetNextLine(fd, inLine) = EOF); if (!bDone) WaitForSingleObject(hMutex, INFINITE); TotalWords += GetWordAndLetterCount(inLine) ; ReleaseMutex(hMutex); return 0;二、(1)修改程序如下#pragma omp parallelprintf(Hello Worldn);for(i=0;i6;i+)printf(Iter:%dn,i);使用 cl直接編譯運行使用 icl /Qopenmp 編譯,并設置Set OMP_NUM_THREADS=2,運行結果如下:(2)積分法求 PI直接運行使用 OpenMP 優化#pragma omp parallel for private(x) reduction(+: sum)for (i=0; inum_steps; i+)x = (i + .5)*step;sum = sum + 4.0/(1.+ x*x);結果如下:八線程:(3)1.直接運行:2.使用 OMP 優化vslNewStream( &stream, BRNG, (int)clock() ); #pragma omp parallel for private(r) reduction(+: dUnderCurve) for(j=0;jiter/BLOCK_SIZE;j+) vdRngUniform( METHOD, stream, BLOCK_SIZE*2, r, 0.0, 1.0 ); /Create random numbers into array r #pragma omp parallel for private(x,y) reduction(+:dUnderCurve) for (i=0;iBLOCK_SIZE;i+) x=ri; /X Coordinate y=ri+BLOCK_SIZE; /Y Coordinate if (x*x + y*y = 1.0) /is distance from Origin under Curve dUnderCurve+; 3. 八線程四、思考題思考題1:串行程序采用Windows32 Thread API進行線程化基本步驟?1、將需要線程化執行的代碼塊抽出來,改寫成函數。2、使用CreateThread函數創建線程,并把上一步的得到的函數的函數名作為參數傳入CreateThread中。3、注意線程直接的競爭現象,通過加鎖等手段避免線程之間的競爭影響運行結果思考題2:Windows32 Thread API幾種共享數據互斥機制可以采用,如何應用?Windows32 Thread API共享數據互斥機制總共有四種:事件(Event)、臨界區(Critical section)、互斥量(Mutex)、信號量(Semaphore)。現分別敘述如下:1、 事件(Event):是WIN32提供的最靈活的線程間同步方式。使用方法:用CreateEvent創建一個事件。對于需要手工設置的事件,在需要該事件或者事件發生時,采用SetEvent及ResetEvent來進行設置。2、臨界區(Critical section):防止多個線程同時執行一個代碼段。使用方法:1) 需要設置臨界區時,要先定義臨界區對象,采用CRITICAL_SECTION g_cs; 2) 使用前需初始化臨界區,采用InitializeCriticalSection(&g_cs);函數3) 需要進入臨界區時,采用:EnterCriticalSection(&g_cs);函數,從而阻止其他的線程進入。4) 離開臨界區時,采用:LeaveCriticalSection(&g_cs);,從而讓其他的線程可以進入該臨界區。5) 當該臨界區不再有使用價值時,需銷毀臨界區,采用:DeleteCriticalSection(&g_cs);3、互斥量(Mutex):互斥量通常用于協調多個線程或進程的活動,控制對資源的“鎖定”和“取消鎖定”,從而控制對共享資源的訪問。使用方法:1) 首先,建立互斥體對象,得到句柄使用HANDLE CreateMutex()函數;2) 然后,在線程可能產生沖突的區域前調用WaitForSingleObject函數,將句柄傳給函數,請求占用互斥對象:dwWaitResult = WaitForSingleObject(hMutex,5000L); 3) 共享資源訪問結束,釋放對互斥體對象的占用:ReleaseMutex(hMutex); 4) 最后使用CloseHandle函數刪除互斥體對象。4、信號量(Semaphore):信號對象允許多個有限個數的線程同時訪問共享資源。 使用方法:1) 當需要信號量時要先調用CreateSemaphore函數創建信號量2) 在需要請求資源時,調用WaitForSingleObject函數或者WaitForMultipleObject函數等待信號量。3) 資源使用完畢后,調用ReleaseSemaphore函數釋放信號量思考題3:OpenMP的主要功能,基本構成體有哪些?主要功能:OpenMP提供了對并行算法的高層的抽象描述,程序員通過在源代碼中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程序進行并行化,并在必要之處加入同步互斥以及通信。提供標準性、可移植性。基本構成體:OpenMp由三大部分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論