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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

并行程序設(shè)計課程實驗報告實驗2:基于Windows Thread和OpenMP的多線程編程姓名*院系軟件學院學號*任課教師張偉哲指導教師蘇統(tǒng)華實驗地點軟件學院五樓機房實驗時間2015年4月8日實驗課表現(xiàn)出勤、表現(xiàn)得分實驗報告得分實驗總分操作結(jié)果得分一、實驗目的要求:需分析本次實驗的基本目的,并綜述你是如何實現(xiàn)這些目的的? 一、1熟練掌握C+語言;。2、掌握Visual Studio* .NET*集成開發(fā)環(huán)境的使用;3、掌握Windows32 Thread API開發(fā)多線程程序;4、掌握Windows32 Thread API中互斥機制的使用方式二、1掌握OpenMP的基本功能、構(gòu)成方式、句法; 2、掌握OpenMP體系結(jié)構(gòu)、特點與組成;3、掌握采用OpenMP進行多核架構(gòu)下多線程編程的基本使用方法和調(diào)試方法。二、實驗內(nèi)容該部分填寫在實驗過程中,你都完成了哪些工作。一、1. 定位到文件夾Win32 Threads HelloThreads,用Microsoft Visual studio打開文件HelloThread.sln,編譯并運行程序;2. 對main.cpp中函數(shù)進行修改,要求輸出線程創(chuàng)建順序(例如:Hello Thread 0, Hello Thread 1, Hello Thread 2 等等);注意:利用CreateThread()循環(huán)變量作為每個線程的執(zhí)行順序唯一標識3. 編譯并多次運行程序,記錄線程執(zhí)行順序,分析線程程序執(zhí)行順序是否不可預見及其產(chǎn)生原因4. 定位到文件夾Win32 Threads Pi,用Microsoft Visual studio打開文件Pi.sln,編譯并運行程序;5. 對此串行代碼使用Windows32 Thread API進行線程化,要求4線程實現(xiàn),且每次迭代計算僅由一個線程完成6. 使用CRITICAL_SECTION機制和Semaphors機制對多線程共享變量進行互斥操作,避免數(shù)據(jù)競爭。二、1、關(guān)閉病毒掃描和監(jiān)控程序;2、采用Microsoft Visual Studio工具打開實驗程序文件:/Helloworlds/Helloworlds.c;3、編譯,運行程序并記錄實驗結(jié)果;4、在源程序代碼中的找到主程序體:printf(Hello Worldn);for(i=0;iicl /Qopenmp HelloWorlds.c;6、設(shè)定Openmp線程數(shù):C:Set OMP_NUM_THREADS=2;7、重新運行程序,觀測實驗結(jié)果,并記錄。實驗二 積分方法求PI值的并行處理化算法 1、關(guān)閉病毒掃描和監(jiān)控程序;2、采用Microsoft Visual Studio工具打開實驗程序文件:/pi/pi.sln;3、編譯,運行程序并記錄實驗結(jié)果;4、在源程序代碼中的找到主程序體中進行omp方式優(yōu)化5、采用/Qopenmp重新編譯程序;三、實驗結(jié)果記錄實驗結(jié)果。2.1一、(1)直接編譯運行:(2)打印數(shù)值(3)每次打印10個 Hello ,會發(fā)現(xiàn)明顯的亂序執(zhí)行現(xiàn)象(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();得到結(jié)果:(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 編譯,并設(shè)置Set OMP_NUM_THREADS=2,運行結(jié)果如下:(2)積分法求 PI直接運行使用 OpenMP 優(yōu)化#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);結(jié)果如下:八線程:(3)1.直接運行:2.使用 OMP 優(yōu)化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、將需要線程化執(zhí)行的代碼塊抽出來,改寫成函數(shù)。2、使用CreateThread函數(shù)創(chuàng)建線程,并把上一步的得到的函數(shù)的函數(shù)名作為參數(shù)傳入CreateThread中。3、注意線程直接的競爭現(xiàn)象,通過加鎖等手段避免線程之間的競爭影響運行結(jié)果思考題2:Windows32 Thread API幾種共享數(shù)據(jù)互斥機制可以采用,如何應(yīng)用?Windows32 Thread API共享數(shù)據(jù)互斥機制總共有四種:事件(Event)、臨界區(qū)(Critical section)、互斥量(Mutex)、信號量(Semaphore)?,F(xiàn)分別敘述如下:1、 事件(Event):是WIN32提供的最靈活的線程間同步方式。使用方法:用CreateEvent創(chuàng)建一個事件。對于需要手工設(shè)置的事件,在需要該事件或者事件發(fā)生時,采用SetEvent及ResetEvent來進行設(shè)置。2、臨界區(qū)(Critical section):防止多個線程同時執(zhí)行一個代碼段。使用方法:1) 需要設(shè)置臨界區(qū)時,要先定義臨界區(qū)對象,采用CRITICAL_SECTION g_cs; 2) 使用前需初始化臨界區(qū),采用InitializeCriticalSection(&g_cs);函數(shù)3) 需要進入臨界區(qū)時,采用:EnterCriticalSection(&g_cs);函數(shù),從而阻止其他的線程進入。4) 離開臨界區(qū)時,采用:LeaveCriticalSection(&g_cs);,從而讓其他的線程可以進入該臨界區(qū)。5) 當該臨界區(qū)不再有使用價值時,需銷毀臨界區(qū),采用:DeleteCriticalSection(&g_cs);3、互斥量(Mutex):互斥量通常用于協(xié)調(diào)多個線程或進程的活動,控制對資源的“鎖定”和“取消鎖定”,從而控制對共享資源的訪問。使用方法:1) 首先,建立互斥體對象,得到句柄使用HANDLE CreateMutex()函數(shù);2) 然后,在線程可能產(chǎn)生沖突的區(qū)域前調(diào)用WaitForSingleObject函數(shù),將句柄傳給函數(shù),請求占用互斥對象:dwWaitResult = WaitForSingleObject(hMutex,5000L); 3) 共享資源訪問結(jié)束,釋放對互斥體對象的占用:ReleaseMutex(hMutex); 4) 最后使用CloseHandle函數(shù)刪除互斥體對象。4、信號量(Semaphore):信號對象允許多個有限個數(shù)的線程同時訪問共享資源。 使用方法:1) 當需要信號量時要先調(diào)用CreateSemaphore函數(shù)創(chuàng)建信號量2) 在需要請求資源時,調(diào)用WaitForSingleObject函數(shù)或者WaitForMultipleObject函數(shù)等待信號量。3) 資源使用完畢后,調(diào)用ReleaseSemaphore函數(shù)釋放信號量思考題3:OpenMP的主要功能,基本構(gòu)成體有哪些?主要功能:OpenMP提供了對并行算法的高層的抽象描述,程序員通過在源代碼中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程序進行并行化,并在必要之處加入同步互斥以及通信。提供標準性、可移植性?;緲?gòu)成體:OpenMp由三大部分

溫馨提示

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

評論

0/150

提交評論