多核程序設(shè)計(jì)實(shí)驗(yàn)之二_第1頁(yè)
多核程序設(shè)計(jì)實(shí)驗(yàn)之二_第2頁(yè)
多核程序設(shè)計(jì)實(shí)驗(yàn)之二_第3頁(yè)
多核程序設(shè)計(jì)實(shí)驗(yàn)之二_第4頁(yè)
多核程序設(shè)計(jì)實(shí)驗(yàn)之二_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Multicore

ProgrammingInstructor:

Zhang

Weizhe

(

)Computer

Network

and

Information

Security

TechniqueResearch

Center

,

School

of

Computer

Science

andTechnology,

Harbin

Institute

of

TechnologyWindows多線程編程及調(diào)優(yōu)Windows線程庫(kù)介紹Win32API是Windows操作系統(tǒng)為內(nèi)核以及應(yīng)用程序之間提供的接口,將內(nèi)核提供的功能進(jìn)行函數(shù)封裝,應(yīng)用程序通過(guò)調(diào)用相關(guān)的函數(shù)獲得相應(yīng)的系統(tǒng)功能。MFC是微軟基礎(chǔ)函數(shù)類庫(kù)(

FoundationClasses),由微軟提供的,用類庫(kù)的方式將Win32API進(jìn)行封裝,

以類的方式提供給開發(fā)者。.NET

Framework

由兩部分構(gòu)成:公共語(yǔ)言運(yùn)行庫(kù)(Common

LanguageRuntime

,CLR)和Framework類庫(kù)(Framework

Class

Library

,F(xiàn)CL)。.NET基礎(chǔ)類庫(kù)的System.Threading命名空間提供了大量的類和接口來(lái)支持多線程。所有與多線程機(jī)制相關(guān)的類都存放在System.Threading命名空間中。使用win32線程APIWin32函數(shù)庫(kù)中提供了操作多線程的函數(shù),包括創(chuàng)建線程、管理線程、終止線程、線程同步等接口。線程函數(shù)arm);DWORD

WINAPI

ThreadFunc

(LPVOID

lpvThre線程創(chuàng)建HANDLE

CreateThread

(LPSECURITY_ATTRIBUTES

lpThreadAttributes,SIZE_T

dwStackSize,LPTHREAD_START_ROUTINE

lpStartAddress,LPVOID

lpParameter,DWORD

dwCreationFlags,LPDWORD

lpThreadId);線程管理設(shè)置線程的優(yōu)先級(jí)線程優(yōu)先級(jí)=進(jìn)程優(yōu)先級(jí)+線程相對(duì)優(yōu)先級(jí)Bool

SetThre riority

(HANDL

E

hPriority

,

int

nPriority)線程的掛起與恢復(fù)進(jìn)程中的每個(gè)線程都有掛起計(jì)數(shù)器(suspendcount)

。當(dāng)掛起計(jì)數(shù)器值為0時(shí),線程被執(zhí)行;當(dāng)掛起計(jì)數(shù)器值大于0時(shí),調(diào)度器不去調(diào)度該線程。DWORD

SuspendThread(HANDLE

hThread);DWORD

ResumeThread(HANDLE

hThread);線程等待一組能使線程阻塞其自身執(zhí)行的等待函數(shù)WaitForSingleObject、WaitForMultipleObject。線程終結(jié)Win32多線程的實(shí)現(xiàn)下面這個(gè)程序首先創(chuàng)建兩個(gè)線程,當(dāng)輸入為1時(shí),執(zhí)行線程,否則掛起線程。#include

<windows.h>#include

<iostream>using

namespace

std;DWORD

WINAPIFunOne(LPVOIDparam){while(true){Sleep(1000);o!

";cout<<"}return0;}DWORD

WINAPI

FunTwo(LPVOID

param){while(true){Sleep(1000);cout<<"world!

";}return

0;}Win32多線程的實(shí)現(xiàn)(續(xù))int

main(int

argc,

char*

argv[]){int

input=0;HANDLE

hand1=CreateThread

(NULL,

0,

FunOne,

(void*)&input,CREATE_SUSPENDED,

NULL);HANDLEhand2=CreateThread

(NULL,

0,

FunTwo,

(void*)&input,

CREATE_SUSPENDED,

NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return

0;}線程執(zhí)行和資源存取線程之間通信的兩個(gè)基本問(wèn)題是互斥和同步線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)該等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對(duì)于共享資源,在各線程Win32線程同步的實(shí)現(xiàn)全局變量事件(Event)臨界區(qū)(Critical

section)互斥量(Mutex)信號(hào)量(Semaphore)時(shí)的排它性。Win32線程同步的實(shí)現(xiàn)全局變量進(jìn)程中的所有線程均可以 所有的全局變量,因而全局變量成為Win32多線程通信的最簡(jiǎn)單方式。事件事件(Event)是WIN32提供的最靈活的線程間同步方式。事件存在兩種狀態(tài):激發(fā)狀態(tài)(signaled

or

true)未激發(fā)狀態(tài)(unsignal

or

false)事件可分為兩類:手動(dòng)設(shè)置:這種對(duì)象只能用程序來(lái)手動(dòng)設(shè)置,在需要該事件或者事件發(fā)生時(shí),采用SetEvent及ResetEvent來(lái)進(jìn)行設(shè)置。自動(dòng)恢復(fù):一旦事件發(fā)生并被處理后,自動(dòng)恢復(fù)到?jīng)]有事件狀態(tài),不需要再次設(shè)置。Win32線程同步的實(shí)現(xiàn)(續(xù))臨界區(qū)一種防止多個(gè)線程同時(shí)執(zhí)行一個(gè)特定代碼段的機(jī)制適用于多個(gè)線程操作之間沒有先后順序但要求互斥的同步。多個(gè)線程

同一個(gè)臨界區(qū)的原則:一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi)不能讓一個(gè)線程無(wú)限地停留在臨界區(qū)內(nèi),否則其他線程將不能進(jìn)入該臨界區(qū)互斥量通常用于協(xié)調(diào)多個(gè)線程或進(jìn)程的活動(dòng),通過(guò)“鎖定”和“取消鎖定”資源,控制對(duì)共享資源的

。信號(hào)量信號(hào)量是一個(gè)

對(duì)象,擁有一個(gè)計(jì)數(shù)器,可用來(lái)管理大量有限的系統(tǒng)資源。當(dāng)計(jì)數(shù)值大于零時(shí),信號(hào)量為有信號(hào)狀態(tài);當(dāng)計(jì)數(shù)值為零時(shí),信號(hào)量處于無(wú)信號(hào)狀態(tài)。MFC線程同步的實(shí)現(xiàn)AfxBeginThread()來(lái)創(chuàng)建一個(gè)CWinThread對(duì)象。CWinThread::CreateThread()函數(shù)用來(lái)啟動(dòng)新的線程MFC同步類某個(gè)對(duì)象的同某個(gè)對(duì)象的同步CCriticalSection

只允許當(dāng)前進(jìn)程中的一個(gè)線程步類CMutes

只允許系統(tǒng)中一個(gè)進(jìn)程內(nèi)的一個(gè)線程類某個(gè)對(duì)象CSymaphore

只允許一到某個(gè)指定數(shù)目個(gè)線程同時(shí)的同步類CEvent

當(dāng)某個(gè)事件發(fā)生時(shí)通知一個(gè)應(yīng)用程序的同步類.Net

Framework線程同步的實(shí)現(xiàn)創(chuàng)建輔助(或從屬)線程的第一個(gè)步驟是創(chuàng)建

ThreadStart

,指定要由該線程執(zhí)行的線程函數(shù)。然后將

ThreadStart

傳遞給Thread

類的構(gòu)造函數(shù)。ThreadStart

starter

=

new

ThreadStart(MyFunction);Thread

t

=new

Thread(starter);t.Start();線程創(chuàng)建好后,可以使用Thread類下的方法對(duì)線程進(jìn)行控制:.NETframework提供了很多的類和數(shù)據(jù)類型來(lái)控制對(duì)共享資源的

。Resume繼續(xù)已掛起的線程。Sleep已重載。將當(dāng)前線程阻塞指定的毫秒數(shù)。Suspend掛起線程,或者如果線程已掛起,則不起作用。Abort調(diào)用此方法通常會(huì)終止線程。OpenMP多線程編程及性能優(yōu)化OpenMP編程簡(jiǎn)介一種面向共享內(nèi)存以及分布式共享內(nèi)存的多處理器多線程并行編程語(yǔ)言。一種能夠被用于顯示指導(dǎo)多線程、共享內(nèi)存并行的應(yīng)用程序編程接口(API)。OpenMP具有良好的可移植性,支持多種編程語(yǔ)言O(shè)penMP能夠支持多種平臺(tái),包括大多數(shù)的類UNIX系統(tǒng)以及WindowsNT系統(tǒng)(Windows2000,Windows

XP,Windows

Vista等)。OpenMP多線程編程基礎(chǔ)OpenMP的編程模型以線程為基礎(chǔ),通過(guò)編譯指提供了導(dǎo)語(yǔ)句來(lái)顯示地指導(dǎo)并行化,為編程對(duì)并行化的完整的控制。采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion(續(xù))編譯指導(dǎo)語(yǔ)句在編譯器編譯程序的時(shí)候,會(huì)識(shí)別特定的注釋,而這些特定的注釋就包含著OpenMP程序的一些語(yǔ)義。#pragma

omp

<directive>

[clause[

[,]

clause]…]其中directive部分就包含了具體的編譯指導(dǎo)語(yǔ)句,包括parallel,

for,

parallelfor,

section,

sections,

single,

master,

critical,flush,

ordered和atomic。將串行的程序逐步地改造成一個(gè)并行程序,達(dá)到增量更新程序的目的,減少程序編寫

一定的負(fù)擔(dān)。運(yùn)行時(shí)庫(kù)函數(shù)OpenMP運(yùn)行時(shí)函數(shù)庫(kù)原本用以設(shè)置和獲取執(zhí)行環(huán)境相關(guān)的信息,它們當(dāng)中也包含一系列用以同步的API。支持運(yùn)行時(shí)對(duì)并行環(huán)境的改變和優(yōu)化,給編程

足夠的靈活性來(lái)控制運(yùn)行時(shí)的程序運(yùn)行狀況。使用Visual

Studio

2005編寫OpenMP程序當(dāng)前的Visual

Studio

.Net2005完全支持OpenMP

2.0標(biāo)準(zhǔn),通過(guò)新的編譯器選項(xiàng)/openmp來(lái)支持OpenMP程序的編譯和

。使用Visual

Studio

2005編寫OpenMP程序(續(xù))#include

“stdafx.h”#include

“omp.h”int

_tmain(int

argc,

_TCHAR*

argv[]){printf(“ ofromserial.\n”);printf(“Thread

number

=

%d\n”,omp_get_thread_num());

//串行執(zhí)行#pragma

omp

parallel //開始并行執(zhí)行{printf(“

o

from

parallel.

Thread

number=%d\n”,omp_get_thread_num());}printf(“return0;}o

from

serial

again.\n”);使用Visual

Studio

2005編寫OpenMP程序(續(xù)2)OpenMP程序使用到的環(huán)境變量OMP_NUM_THREADS設(shè)置為4三次執(zhí)行的結(jié)果OpenMP編程技術(shù)——循環(huán)并行化循環(huán)并行化編譯指導(dǎo)語(yǔ)句的格式#pragma

omp

parallel

for

[clause[clause…]]for(

index

= ;

test_expression

;

increment_expr){body

of

the

loop;}循環(huán)并行化語(yǔ)句的限制循環(huán)并行化的語(yǔ)句必須具有如下的形式for

(index=start

;

index<end

;

increment_expr)循環(huán)語(yǔ)句塊應(yīng)該是單出口與單

的循環(huán)嵌套循環(huán)并行化編譯指導(dǎo)語(yǔ)句可以加在任意一個(gè)循環(huán)之前,

則對(duì)應(yīng)的最近的循環(huán)語(yǔ)句被并行化,其他部分保持不變。OpenMP編程技術(shù)——并行區(qū)域編程通過(guò)循環(huán)并行化編譯指導(dǎo)語(yǔ)句使得一段代碼能夠在多個(gè)線程

同時(shí)執(zhí)行。并行區(qū)域編譯指導(dǎo)語(yǔ)句的格式與使用限制#pragma

omp

parallel

[clause[clause]…]blockparallel編譯指導(dǎo)語(yǔ)句的執(zhí)行過(guò)程#pragma

omp

parallelfor(int

i=0;i<5;i++)printf(" o

worldi=%d\n",i);程序的執(zhí)行結(jié)果:oworldi=0oworld

i=1oworldi=2oworldi=3oworldi=4#pragma

omp

parallel

forfor(int

i=0;i<5;i++)printf(" o

worldi=%d\n",i);程序的執(zhí)行結(jié)果:oworldi=0oworldi=3oworldi=1oworldi=4oworldi=2OpenMP編程技術(shù)——并行區(qū)域編程(續(xù))線程私有數(shù)據(jù)與thre

rivate,copyin子句使用thre

rivate子句用來(lái)標(biāo)明某一個(gè)變量是線程私有數(shù)據(jù),在程序運(yùn)行的過(guò)程中,不能夠被其他線程

到。使用copyin子句對(duì)線程私有的全局變量進(jìn)行初始化。int

counter=0;//using

thre

rivate#pragma

omp

threrivate(counter)void

inc_counter(){counter++;}int

_tmain(int

argc,

TCHAR

*

argv[]){#pragma

omp

parallelfor(int

i=0;i<10000;i++)inc_counter();printf("counter=%d\n",counter);}int

global=0;#pragma

omp

thre

rivate(global)int

_tmain(int

argc,

TCHAR

*

argv[]){global=1000;#pragma

omp

parallel

copyin(global){printf("global=%d\n",global);global=omp_get_thread_num();}printf("global=%d\n",global);printf("parallel

again\n");#pragma

omp

parallelprintf("global=%d\n",global);}OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)2)并行區(qū)域之間的工作共享工作隊(duì)列工作隊(duì)列的基本工作過(guò)程即為維持一個(gè)工作的隊(duì)列,線程在并行執(zhí)行的時(shí)候,不斷從這個(gè)隊(duì)列中取出相應(yīng)的工作完成,直到隊(duì)列為空為止。根據(jù)線程號(hào)分配任務(wù)由于每一個(gè)線程在執(zhí)行的過(guò)程中的線程標(biāo)識(shí)號(hào)是不同的,可以根據(jù)這個(gè)線程標(biāo)識(shí)號(hào)來(lái)分配不同的任務(wù)。使用循環(huán)語(yǔ)句分配任務(wù)#pragma

omp

parallel{printf("outside

loop

thread=%d\n",omp_get_thread_num());#pragma

omp

forfor(int

i=0;i<4;i++)printf("inside

loop

i=%d

thread=%d\n",i,omp_get_thread_num();}OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)3)工作分區(qū)編碼(sections)#pragma

omp

parallel

sections{#pragma

omp

sectionprintf("section

1

thread=%d\n",omp_get_thread_num());#pragma

omp

sectionprintf("section

2

thread=%d\n",omp_get_thread_num());#pragma

omp

sectionprintf("sectino

3

thread=%d\n",omp_get_thread_num());}程序運(yùn)行結(jié)果為:section1

thread=0section2

thread=1sectino3

thread=0OpenMP線程同步OpenMP支持兩種不同類型的線程同步機(jī)制互斥鎖事件通知機(jī)制數(shù)據(jù)競(jìng)爭(zhēng)int

i;

int

max_num=-1;#pragma

omp

parallel

forfor(i=0;i<n;i++)if(ar[i]>max_num)max_num=ar[i];互斥鎖機(jī)制在OpenMP中,提供了三種不同的互斥鎖機(jī)制用來(lái)對(duì)一塊內(nèi)存進(jìn)行保護(hù),它們分別是臨界區(qū)(critical),原子操作(atomic)以及由庫(kù)函數(shù)來(lái)提供同步操作。OpenMP線程同步——臨界區(qū)在程序需要

可能產(chǎn)生競(jìng)爭(zhēng)的內(nèi)存數(shù)據(jù)的時(shí)候,都需要相應(yīng)的臨界區(qū)代碼。臨界區(qū)編譯指導(dǎo)語(yǔ)句的格式如下所示:#pragma

omp

critical

[(name)]blockinti;

int

max_num_x=max_num_y=-1;#pragma

omp

parallel

forfor(i=0;i<n;i++){#pragma

omp

critical

(max_arx)if(arx[i]>max_num_x)max_num_x=arx[i];#pragma

omp

critical

(max_ary)if(ary[i]>max_num_y)max_num_y=ary[i];}OpenMP線程同步——原子操作原子操作是OpenMP編程方式給同步編程帶來(lái)的特殊的編程功能,通過(guò)編譯指導(dǎo)語(yǔ)句的方式直接獲取了現(xiàn)在多處理器計(jì)算機(jī)體系結(jié)構(gòu)的功能。通過(guò)#pragma

omp

atomic編譯指

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論