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

下載本文檔

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

文檔簡介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論