《并行程序設(shè)計》實驗指導書之二_第1頁
《并行程序設(shè)計》實驗指導書之二_第2頁
《并行程序設(shè)計》實驗指導書之二_第3頁
《并行程序設(shè)計》實驗指導書之二_第4頁
《并行程序設(shè)計》實驗指導書之二_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《多核程序設(shè)計》實驗指導書之二實驗2.1Windows32ThreadAPI線程程序設(shè)計實驗目的1.掌握Windows32ThreadAPI特點和基本使用方法;2.掌握如何采用Windows32ThreadAPI將串行程序轉(zhuǎn)換成多線程程序;3.掌握Windows32ThreadAPI中互斥機制的使用方式;實驗要求1.熟練掌握C++語言;2、掌握VisualStudio*.NET*集成開發(fā)環(huán)境的使用;3、掌握Windows32ThreadAPI開發(fā)多線程程序;4、掌握Windows32ThreadAPI中互斥機制的使用方式實驗內(nèi)容1.新建一個Win32控制臺應用程序,附加選項選擇空項目,添加一個源文件,將2-1文件夾里HelloThreads下的main.cpp的內(nèi)容拷貝到源文件中;2.對main.cpp中函數(shù)進行修改,要求輸出線程創(chuàng)建順序(例如:HelloThread0,HelloThread1,HelloThread2等等);注意:利用CreateThread()循環(huán)變量作為每個線程的執(zhí)行順序唯一標識3.編譯并多次運行程序,記錄線程執(zhí)行順序,分析線程程序執(zhí)行順序是否不可預見及其產(chǎn)生原因4.將2-1文件夾里Pi.cpp的代碼拷貝到一個項目中,編譯并運行程序;5.對此串行代碼使用Windows32ThreadAPI進行線程化,要求4線程實現(xiàn),且每次迭代計算僅由一個線程完成;6.使用CRITICAL_SECTION機制和Semaphors機制對多線程共享變量進行互斥操作,避免數(shù)據(jù)競爭。本實驗我們要學習windows多線程編程的基本知識,如線程創(chuàng)建、線程等待等,同時要掌握如何使用win32的線程同步機制來實現(xiàn)線程的同步。創(chuàng)建線程:HANDLECreateThread{LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORD dwCreationFlags, LPDWORDlpThreadId};參數(shù)lpThreadAttrubutes 描述施行于這一新線程的security屬性,NULL表示使用缺省值dwStackSize 新線程初始的保留堆棧的大小,0表示使用缺省大?。?MBlpStartAddress 新線程將開始的起始地址,這是一個函數(shù)指針lpParameter 此值將被傳送到上述所指定之新線程函數(shù)去,作為參數(shù)dwCreationFlags 產(chǎn)生一個暫時掛起的線程,為0表示“立即開始執(zhí)行”lpThreadId 新線程的ID會被傳回到這里線程等待:DWORDWaitForMultipleObject(DWORDnCount,CONSTHANDLE*lpHandle,BOOLbWaitAll,DWORDdwMilliseconds);該函數(shù)可以用來同時監(jiān)測多個對象參數(shù)nCount 表示lpHandle所指之handles數(shù)組的元素個數(shù)lpHandle 指向一個由對象handles所組成的數(shù)組,這些handles不需要為相同的類型bWaitAll bWaitAll為true時,表示所有的handles都必須激發(fā)函數(shù)才返回,否則此函數(shù)將在任何一個handle激發(fā)時就返回dwMilliseconds 表示一個時間長度,當該時間長度達到時,即使沒有任何handles激發(fā),此函數(shù)也會返回??稍O(shè)置為0或INFINITEWin32線程同步實現(xiàn)全局變量事件:當程序中一個線程的運行需要等待另外一個線程中一項特定操作的完成才能繼續(xù)執(zhí)行時,就可以使用事件對象來通知等待線程某個條件已滿足;臨界區(qū):臨界區(qū)是一種防止多個線程同時執(zhí)行一個特定代碼段的機制如果有多個線程試圖同時訪問臨界區(qū),那么在有一個線程進入后其他所有試圖訪問此臨界區(qū)的線程獎被掛起,并一直持續(xù)到進入臨界區(qū)的線程離開臨界區(qū)使用于多個線程操作之間沒有先后順序但要求互斥的同步。在進程使用之前調(diào)用如下函數(shù)對對象進行初始化:VOIDInitializeCriticalSection(LPCRITICAL_SECTION);當一個線程使用臨界區(qū)時,調(diào)用函數(shù)EnterCriticalSection或者TryEnterCriticalSection;當要求占用、退出臨界區(qū)時,調(diào)用函數(shù)LeaveCriticalSection,釋放對臨界區(qū)對象的占用,供其他線程使用?;コ饬浚夯コ饬客ǔS糜趨f(xié)調(diào)多個線程或進程的活動,通過“鎖定”和“取消鎖定”資源,控制對共享資源的訪問。當一個互斥量被一個線程鎖定了,其他試圖對其加鎖的線程就會被阻塞。當對互斥量加鎖的線程解除了鎖定后,則被阻塞的線程中的一個就會得到互斥量信號量:信號量是一個核心對象,擁有一個計數(shù)器,可用來管理大量有限的系統(tǒng)資源。當計數(shù)器值大于0時,信號量為有信號狀態(tài);當計數(shù)值為0時,信號量處于無信號狀態(tài)??砂聪铝胁襟E使用信號量對象:創(chuàng)建信號量對象HANDLE

CreateSemaphore(

LPSECURITY_ATTRIBUTES

IpSemaphoreAttributes,

LONG

IInitialCount,

LONG

IMaximumCount,

LPCTSTR

IpName);參數(shù)IpSemaphoreAttributes 表示安全控制,一般直接傳入NULL;IInitialCount 表示初始化的信號量;IMaximumCount 表示允許信號量增加到的最大值;IpName 表示信號量的名稱;打開一個信號量對象HANDLE

OpenSemaphore(

DWORD

dwDesiredAccess,

BOOL

bInheritHandle,

LPCTSTR

lpName);參數(shù)dwDesiredAccess 表示訪問權(quán)限,一般傳入SEMAPHORE_ALL_ACCESSbInheritHandle 表示信號量句柄繼承性,一般傳入TRUEIpName 表示名稱,不同進程中的各線程可以通過名稱來確保它們訪問同一個信號量在線程訪問共享資源之前調(diào)用(-操作)DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);參數(shù)hHandle 表示一個能夠支持被通知/未通知的信號量對象dwMilliseconds 表示為了等待該信號量對象變?yōu)橐淹ㄖ獱顟B(tài),它將等待多長時間共享資源訪問完成后,應釋放對信號量對象的占用(+操作)BOOLReleaseSemaphore(HANDLEhSemaphore,LONGIReleaseCount,LPLONGIpPreviousCount);參數(shù)hSemaphore 表示所要操作的信號量對象的句柄IReleaseCount 表示這個信號量對象在當前基礎(chǔ)上所要增加的值IpPreviousCount 指向返回信號量上次值的變量的指針,如果不需要信號量上次的值,那么這個參數(shù)可以設(shè)置為NULL;5.信號量使用完后,應將其關(guān)閉BOOLCloseHandle(HANDLEhObject);參數(shù)hObject 表示一個已打開信號量對象的handle實驗一、生成和運行一個多線程程序新建項目項目配置:使用HelloThreads文件夾下的main.c多線程程序,實現(xiàn)四個線程分別向屏幕輸出“hellothread”,如果想屏幕上輸出每個線程的編號,則我們必須給線程函數(shù)傳一個線程編號參數(shù),請實現(xiàn)這個改變。(提示:傳遞指針時要先強轉(zhuǎn)成void類型的指針;在這里傳遞的參數(shù)不能直接使用i,想一想,為什么?)實驗二、利用中值積分定理計算Pi值串行算法:要多線程實現(xiàn)的話,主要是把for循環(huán)的計算過程分到幾個線程中去,由于每次計算都要更新sum的值,就有可能發(fā)生一個線程已經(jīng)更新了sum的值,而另一個線程讀到的還是舊的sum值,所以在這里使用臨界區(qū),把sum放到臨界區(qū)中,這樣一次只能有一個線程訪問和修改sum的值。實驗三、互斥量的使用先運行一遍2-1文件夾下countWords里的Serial.cpp串行程序,記錄實驗結(jié)果。再使用Threaded_sub.cpp,這是使用信號量完成同樣功能的程序,注意,Threaded_sub.cpp中刪除了有關(guān)信號量操作的代碼,請自行補充完整后運行,將運行結(jié)果與串行程序相對比,保證運行結(jié)果一致。要注意下面2點:1.將InFile1.txt放到相應目錄下2.為了fopen能正常運行,在VS的預處理器定義中添加_CRT_SECURE_NO_WARNINGS實驗2.2Windows系統(tǒng)下利用OpenMP進行多線程編程實驗目的1.掌握OpenMP的基本功能、構(gòu)成方式、句法;2、掌握OpenMP體系結(jié)構(gòu)、特點與組成;3、掌握采用OpenMP進行多核架構(gòu)下多線程編程的基本使用方法和調(diào)試方法。實驗要求1.熟練掌握C++語言;2、掌握VisualStudio*.NET*集成開發(fā)環(huán)境的使用;3、性能優(yōu)化及多核技術(shù)的基本概念;4、OpenMP并行程序設(shè)計基礎(chǔ)。實驗原理OpenMP應用編程接口API是在共享存儲體系結(jié)構(gòu)上的一個編程模型,其包含:編譯制導(CompilerDirective)、運行庫例程(RuntimeLibrary)和環(huán)境變量(EnvironmentVariables)三大部分,并支持增量并行化(IncrementalParallelization),用于實現(xiàn)并行性運算的優(yōu)化解決方法。實驗內(nèi)容實驗一Helloworld程序1、關(guān)閉病毒掃描和監(jiān)控程序;2、將2-2文件夾中hello里的Helloworlds.cpp中的代碼拷貝到MicrosoftVisualStudio項目中:3、設(shè)定Openmp線程數(shù):C:\>SetOMP_NUM_THREADS=14、編譯,運行程序并記錄實驗結(jié)果;5、在源程序代碼中找到主程序體: printf("HelloWorld\n"); for(i=0;i<6;i++) printf("Iter:%d\n",i);;加上#pragmaompparallel{}段6、采用/Qopenmp重新編譯程序(使用Intel編譯器,通過Intel命令窗口進入)C:\>icl/Qopenmp源文件;7、在命令行中設(shè)定Openmp線程數(shù):C:\>SetOMP_NUM_THREADS=28、在命令行中重新運行程序,觀測實驗結(jié)果,并記錄。實驗二積分方法求PI值的并行處理化算法1、關(guān)閉病毒掃描和監(jiān)控程序;2、將2-2文件夾中pi.cpp代碼拷貝到MicrosoftVisualStudio項目中3、編譯,運行程序并記錄實驗結(jié)果;4、在源程序代碼中的找到主程序體中進行omp方式優(yōu)化①需要并行運算的程序體:加上#pragmaompparallel{}段parallel語句后面被大括號括起來的代碼是并行執(zhí)行的。②找到for循環(huán)體引入omp并行處理方法加上#pragmaompforfor(xxx:yyy:zzz){}段#pragmaompfor語句是一個工作分擔結(jié)構(gòu),它使得循環(huán)由一個線程池的線程并行執(zhí)行。③檢查所有變量,將需要進行特別聲明的變量進行omp處理:#pragmaompparallelprivate(varname,vaname)reduction(+:varname)shared(varname){}段reduction子句為變量指定一個操作符,每個線程都會創(chuàng)建reduction變量的私有拷貝,在OpenMP區(qū)域結(jié)束處,將使用各個線程的私有拷貝的值通過制定的操作符進行迭代運算,并賦值給原來的變量。④對于特殊的共享變量,可以進行加鎖處理#pragmaompcritical{}段(本實驗中不用)5、采用/Qopenmp重新編譯程序(使用Intel編譯器,通過Intel命令窗口進入)如果本來是VS編譯器,切換為Intel編譯器6、在命令行中設(shè)定Openmp線程數(shù):C:\>SetOMP_NUM_THREADS=?7、在命令行中重新運行程序,觀測實驗結(jié)果,并記錄。實驗三PI值蒙特卡洛算法的改進與編程1、關(guān)閉病毒掃描和監(jiān)控程序;2、將2-2文件夾下MonteCarloPi里pimonte_VSL_serial.cpp的代碼拷貝到一個MicrosoftVisualStudio項目中;3、編譯,運行程序并記錄實驗結(jié)果;在這里,我們使用蒙特卡羅法計算pi的值,要使用MKL的隨機數(shù)生成器,所以要在VisualStudio中導入MKL的include和library文件,選擇:項目屬性配置屬性VC++目錄,如下圖所示設(shè)置相關(guān)參數(shù):a.Lib中添加:C:\ProgramFiles\Intel\ComposerXE2015\mkl\lib\ia32b.Include中添加C:\ProgramFiles\Intel\ComposerXE2015\mkl\include注意:添加lib時要注意區(qū)分,32位、64位的目錄是不同的。c.項目屬性配置屬性IntelPerformanceLibrarys,在useIntelMKL后面的下拉框選擇sequential4、在源程序代碼的主程序體中進行omp方式優(yōu)化①需要并行運算的程序體:加上#pragmaompparallel{}段②找到for循環(huán)體引入omp并行處理方法加上#pragmaompforfor(xxx:yyy:zzz){}段③檢查所有變量,將需要進行特別聲明的變量進行omp處理:#pragmaompparallelprivate(varname,vaname)\reduction(+:varname,varname)\shared(varnam

溫馨提示

  • 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

提交評論