大三下課件多核技術(shù)編程_第1頁(yè)
大三下課件多核技術(shù)編程_第2頁(yè)
大三下課件多核技術(shù)編程_第3頁(yè)
大三下課件多核技術(shù)編程_第4頁(yè)
大三下課件多核技術(shù)編程_第5頁(yè)
已閱讀5頁(yè),還剩81頁(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)介

1、12346Master ThreadParalllRegionNestedParallelRegion8910n方便把串行程序改編為并行程序方便把串行程序改編為并行程序12兩種編程方式的優(yōu)缺點(diǎn)兩種編程方式的優(yōu)缺點(diǎn)n編譯指導(dǎo)語(yǔ)句可以實(shí)現(xiàn):編譯指導(dǎo)語(yǔ)句可以實(shí)現(xiàn):n將串行程序逐步改造成一個(gè)并行程序,達(dá)到增量更新將串行程序逐步改造成一個(gè)并行程序,達(dá)到增量更新程序的目的,從而減少編程人員的一定負(fù)擔(dān)。程序的目的,從而減少編程人員的一定負(fù)擔(dān)。n能夠?qū)⒋谐绦蚝筒⑿谐绦虮3衷谕粋€(gè)源代碼文件能夠?qū)⒋谐绦蚝筒⑿谐绦虮3衷谕粋€(gè)源代碼文件當(dāng)中,減少了維護(hù)的負(fù)擔(dān)。當(dāng)中,減少了維護(hù)的負(fù)擔(dān)。n編譯指導(dǎo)語(yǔ)句的優(yōu)勢(shì)體現(xiàn)在

2、編譯的階段,對(duì)于運(yùn)行階編譯指導(dǎo)語(yǔ)句的優(yōu)勢(shì)體現(xiàn)在編譯的階段,對(duì)于運(yùn)行階段支持較少。段支持較少。n運(yùn)行時(shí)庫(kù)函數(shù):運(yùn)行時(shí)庫(kù)函數(shù):1415n編譯器在鏈接編譯器在鏈接17182021222324252627數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念 n如果語(yǔ)句如果語(yǔ)句S2與語(yǔ)句與語(yǔ)句S1存在數(shù)據(jù)相關(guān),那么存在數(shù)據(jù)相關(guān),那么必然存在以下兩種情況之一:必然存在以下兩種情況之一: nS1在循環(huán)的一次迭代中訪問(wèn)存儲(chǔ)單元在循環(huán)的一次迭代中訪問(wèn)存儲(chǔ)單元L,而,而S2在隨后的一次迭代中訪問(wèn)同一存儲(chǔ)單元,即:在隨后的一次迭代中訪問(wèn)同一存儲(chǔ)單元,即:循環(huán)迭代相關(guān)循環(huán)迭代相關(guān) ;nS1和和S2在同一循環(huán)迭代中訪問(wèn)同一存儲(chǔ)單元在同一循環(huán)迭

3、代中訪問(wèn)同一存儲(chǔ)單元L,但,但S1的執(zhí)行在的執(zhí)行在S2之前,即:非循環(huán)迭代相關(guān)之前,即:非循環(huán)迭代相關(guān) 。 數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念n實(shí)例:實(shí)例: x0 = 0; y0 = 1; #pragma omp parallel for private(k) for (k = 1; k 100; k+) xk = yk-1 + 1; /S1 yk = xk-1 + 2; /S2 數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念 x0 = 0; y0 = 1; x49 = 74;y49 = 74 ;#pragma omp parallel for private(m, k) for (m = 0; m 2; m+) f

4、or (k = m*49 + 1; k m*50 + 50; k+) xk = yk-1 + 1; /S1 yk = xk-1 + 2; /S2 31nthreadprivate表示一個(gè)線程私有的全局變量。表示一個(gè)線程私有的全局變量。 3233n在一個(gè)循環(huán)體內(nèi)經(jīng)常會(huì)包含另外一個(gè)循環(huán)體,在一個(gè)循環(huán)體內(nèi)經(jīng)常會(huì)包含另外一個(gè)循環(huán)體,循環(huán)產(chǎn)生了嵌套循環(huán)產(chǎn)生了嵌套3435線程1棧線程2棧堆程序代碼程序數(shù)據(jù)n在使用作用域子句的時(shí)候要遵循如下的一在使用作用域子句的時(shí)候要遵循如下的一些規(guī)則些規(guī)則 :n作用域子句作用的變量是已經(jīng)申明的有名變量作用域子句作用的變量是已經(jīng)申明的有名變量;n作用域子句在作用到類或者結(jié)構(gòu)

5、的時(shí)候,必須作用域子句在作用到類或者結(jié)構(gòu)的時(shí)候,必須作用到類或者結(jié)構(gòu)的整體,而不能只作用于類作用到類或者結(jié)構(gòu)的整體,而不能只作用于類或者結(jié)構(gòu)的一個(gè)部分;或者結(jié)構(gòu)的一個(gè)部分;n一個(gè)編譯指導(dǎo)語(yǔ)句能夠包含多個(gè)數(shù)據(jù)作用域子一個(gè)編譯指導(dǎo)語(yǔ)句能夠包含多個(gè)數(shù)據(jù)作用域子句,但是變量只能出現(xiàn)在一個(gè)作用域子句中,句,但是變量只能出現(xiàn)在一個(gè)作用域子句中,即變量不能既是共享的,又是私有的;即變量不能既是共享的,又是私有的;n在語(yǔ)法結(jié)構(gòu)上,作用域子句只能作用在出現(xiàn)在在語(yǔ)法結(jié)構(gòu)上,作用域子句只能作用在出現(xiàn)在編譯指導(dǎo)語(yǔ)句起作用的語(yǔ)句變量部分。另外,編譯指導(dǎo)語(yǔ)句起作用的語(yǔ)句變量部分。另外,可以將作用域子句作用在類的靜態(tài)變量上

6、??梢詫⒆饔糜蜃泳渥饔迷陬惖撵o態(tài)變量上。nOpenMP 對(duì)默認(rèn)情況下,并行區(qū)中所有的對(duì)默認(rèn)情況下,并行區(qū)中所有的變量都是共享的,但有三種例外情況:變量都是共享的,但有三種例外情況:n在在parallel for循環(huán)中,循環(huán)中,循環(huán)索引變量是私有的是私有的;n那些并行區(qū)中的局部變量是私有的;那些并行區(qū)中的局部變量是私有的;n所有在所有在private,firstprivate,lastprivate或或reduction子句中列出的變量都是私有的。私有子句中列出的變量都是私有的。私有化是通過(guò)為每個(gè)線程創(chuàng)建各個(gè)變量的獨(dú)立副本化是通過(guò)為每個(gè)線程創(chuàng)建各個(gè)變量的獨(dú)立副本來(lái)完成的。來(lái)完成的。383940n

7、使用使用reduction子句進(jìn)行多線程程序設(shè)計(jì)時(shí),要記子句進(jìn)行多線程程序設(shè)計(jì)時(shí),要記住以下三個(gè)要點(diǎn):住以下三個(gè)要點(diǎn): n在第一個(gè)線程到達(dá)指定了在第一個(gè)線程到達(dá)指定了reduction子句的共享區(qū)域或子句的共享區(qū)域或循環(huán)末尾時(shí),原來(lái)的規(guī)約變量的值變?yōu)椴淮_定,并保循環(huán)末尾時(shí),原來(lái)的規(guī)約變量的值變?yōu)椴淮_定,并保持此不確定狀態(tài)直至規(guī)約計(jì)算完成持此不確定狀態(tài)直至規(guī)約計(jì)算完成 ;n如果在一個(gè)循環(huán)中使用到了如果在一個(gè)循環(huán)中使用到了reduction子句,同時(shí)又使子句,同時(shí)又使用了用了nowait子句,那么在確保所有線程完成規(guī)約計(jì)算的子句,那么在確保所有線程完成規(guī)約計(jì)算的柵欄同步操作前,原來(lái)的規(guī)約變量的值將

8、一直保持不柵欄同步操作前,原來(lái)的規(guī)約變量的值將一直保持不確定的狀態(tài)確定的狀態(tài);n各個(gè)線程的私有副本值被規(guī)約的順序是未指定的。因各個(gè)線程的私有副本值被規(guī)約的順序是未指定的。因此,對(duì)于同一段程序的一次串行執(zhí)行和一次并行執(zhí)行此,對(duì)于同一段程序的一次串行執(zhí)行和一次并行執(zhí)行,甚至兩次并行執(zhí)行來(lái)說(shuō),都無(wú)法保證得到完全相同,甚至兩次并行執(zhí)行來(lái)說(shuō),都無(wú)法保證得到完全相同的結(jié)果(這主要針對(duì)浮點(diǎn)計(jì)算而言),也無(wú)法保證計(jì)的結(jié)果(這主要針對(duì)浮點(diǎn)計(jì)算而言),也無(wú)法保證計(jì)算過(guò)程中諸如浮點(diǎn)計(jì)算異常這樣的行為會(huì)完全相同。算過(guò)程中諸如浮點(diǎn)計(jì)算異常這樣的行為會(huì)完全相同。私有變量的初始化和終結(jié)操作私有變量的初始化和終結(jié)操作n循環(huán)并

9、行化開始時(shí)訪問(wèn)到私有變量在主線程中的循環(huán)并行化開始時(shí)訪問(wèn)到私有變量在主線程中的同名變量的值,也有可能需要將循環(huán)并行化最后同名變量的值,也有可能需要將循環(huán)并行化最后一次循環(huán)的變量結(jié)果返回給主線程中的同名的變一次循環(huán)的變量結(jié)果返回給主線程中的同名的變量。量。nOpenMP 編譯指導(dǎo)語(yǔ)句使用編譯指導(dǎo)語(yǔ)句使用firstprivate和和 lastprivate對(duì)這兩種需求進(jìn)行支持,使得循環(huán)并行對(duì)這兩種需求進(jìn)行支持,使得循環(huán)并行開始執(zhí)行的時(shí)候私有變量通過(guò)主線程中的變量初開始執(zhí)行的時(shí)候私有變量通過(guò)主線程中的變量初始化,同時(shí)循環(huán)并行結(jié)束的時(shí)候,將最后一次循始化,同時(shí)循環(huán)并行結(jié)束的時(shí)候,將最后一次循環(huán)的相應(yīng)變

10、量賦值給主線程的變量。環(huán)的相應(yīng)變量賦值給主線程的變量。n程序?qū)嵗撼绦驅(qū)嵗?4344在每一個(gè)線程的內(nèi)部在每一個(gè)線程的內(nèi)部,私有變量私有變量val被初始化被初始化為主線程原有的同名變量的值為主線程原有的同名變量的值,并且在循環(huán)并且在循環(huán)并行化退出的時(shí)候并行化退出的時(shí)候,相應(yīng)的變量被原有串行相應(yīng)的變量被原有串行執(zhí)行的最后一次執(zhí)行的最后一次執(zhí)行(循環(huán))執(zhí)行(循環(huán))對(duì)應(yīng)的值所賦值。對(duì)應(yīng)的值所賦值。 4546for(int j=1;jN;j+)for(int i=0;iN;i+)ai,j=ai,j+ai,j-1;for(int j=1;jN;j+) #pragma omp parallel forfo

11、r(int i=0;iN;i+)ai,j=ai,j+ai,j-1;47n并行區(qū)域編譯指導(dǎo)語(yǔ)句的使用限制并行區(qū)域編譯指導(dǎo)語(yǔ)句的使用限制nparallel編譯指導(dǎo)語(yǔ)句與循環(huán)并行化編譯指導(dǎo)語(yǔ)句與循環(huán)并行化parallel for語(yǔ)句類似,在使用到程序塊之前也有一定的限語(yǔ)句類似,在使用到程序塊之前也有一定的限制。制。n程序塊必須是只有單一入口和單一出口的程序程序塊必須是只有單一入口和單一出口的程序塊塊n不能從外面轉(zhuǎn)入到程序塊的內(nèi)部,也不允許從不能從外面轉(zhuǎn)入到程序塊的內(nèi)部,也不允許從程序塊內(nèi)部有多個(gè)出口轉(zhuǎn)到程序塊之外程序塊內(nèi)部有多個(gè)出口轉(zhuǎn)到程序塊之外n程序塊內(nèi)部的跳轉(zhuǎn)是允許的程序塊內(nèi)部的跳轉(zhuǎn)是允許的n程

12、序塊內(nèi)部直接調(diào)用程序塊內(nèi)部直接調(diào)用exit函數(shù)來(lái)退出整個(gè)程序函數(shù)來(lái)退出整個(gè)程序的執(zhí)行也是允許的的執(zhí)行也是允許的#pragma omp parallelfor(int i=0;i5;i+) printf(hello world i=%dn,i);#pragma omp parallel forfor(int i=0;i5;i+) printf(hello world i=%dn,i);n程序段程序段9的執(zhí)行結(jié)果的執(zhí)行結(jié)果hello world i=0hello world i=0hello world i=1hello world i=1hello world i=2hello world i=

13、2hello world i=3hello world i=3hello world i=4hello world i=4n程序段程序段10的執(zhí)行結(jié)果的執(zhí)行結(jié)果hello world i=0hello world i=3hello world i=1hello world i=4hello world i=2n并行區(qū)域與循環(huán)并行化的區(qū)別并行區(qū)域與循環(huán)并行化的區(qū)別n并行區(qū)域采用復(fù)制的執(zhí)行方式,將代碼在所有的線程并行區(qū)域采用復(fù)制的執(zhí)行方式,將代碼在所有的線程內(nèi)部都執(zhí)行一次內(nèi)部都執(zhí)行一次n循環(huán)并行化采用工作分配的執(zhí)行方式,將循環(huán)所需要循環(huán)并行化采用工作分配的執(zhí)行方式,將循環(huán)所需要所有工作量按照一定的

14、方式分配到各個(gè)執(zhí)行線程中,所有工作量按照一定的方式分配到各個(gè)執(zhí)行線程中,所有線程執(zhí)行工作的總和是原先串行執(zhí)行所完成的工所有線程執(zhí)行工作的總和是原先串行執(zhí)行所完成的工作量。作量。n并行區(qū)域并行區(qū)域parallel語(yǔ)句的作用:語(yǔ)句的作用:n當(dāng)程序遇到當(dāng)程序遇到parallel編譯指導(dǎo)語(yǔ)句時(shí),就會(huì)生成相應(yīng)數(shù)編譯指導(dǎo)語(yǔ)句時(shí),就會(huì)生成相應(yīng)數(shù)目(根據(jù)環(huán)境變量)的線程,且組成一個(gè)線程組,并目(根據(jù)環(huán)境變量)的線程,且組成一個(gè)線程組,并將代碼重復(fù)地在各個(gè)線程內(nèi)部執(zhí)行。將代碼重復(fù)地在各個(gè)線程內(nèi)部執(zhí)行。Parallel的末尾隱的末尾隱含一個(gè)同步障礙,所有線程完成各自的任務(wù)后將在這含一個(gè)同步障礙,所有線程完成各自的

15、任務(wù)后將在這個(gè)同步障礙匯合。此時(shí),此線程組的主線程個(gè)同步障礙匯合。此時(shí),此線程組的主線程(master)繼繼續(xù)執(zhí)行,而相應(yīng)的子線程續(xù)執(zhí)行,而相應(yīng)的子線程(slave)則停止執(zhí)行。則停止執(zhí)行。52int counter=0; /using threadprivate#pragma omp threadprivate(counter) void inc_counter()()counter+; int _tmain(int argc, TCHAR * argv)#pragma omp parallel for(int i=0;i10000;i+)inc_counter()();printf(cou

16、nter=%dn,counter); 53int global=0;#pragma omp threadprivate(global)int _tmain(int argc, TCHAR * argv)global=1000;#pragma omp parallel copyin(global) printf(global=%dn,global); global=omp_get_thread_num()(); printf(global=%dn,global);printf(parallel againn);#pragma omp parallelprintf(global=%dn,globa

17、l); n運(yùn)行結(jié)果:運(yùn)行結(jié)果: global=10000 global=10000 global=0 parallel again global=0 global=1n通過(guò)通過(guò)copyin將線程的私有變量初始化為主線程中相應(yīng)的全將線程的私有變量初始化為主線程中相應(yīng)的全局變量的值。局變量的值。n在并行區(qū)域執(zhí)行完畢退出后,主線程與子線程中的相應(yīng)的在并行區(qū)域執(zhí)行完畢退出后,主線程與子線程中的相應(yīng)的全局變量繼續(xù)有效,并且在再一次進(jìn)入并行區(qū)域時(shí),使用全局變量繼續(xù)有效,并且在再一次進(jìn)入并行區(qū)域時(shí),使用上一次退出時(shí)所賦的值。上一次退出時(shí)所賦的值。55n將不同的工作任務(wù)編寫成不同的代碼片段并行執(zhí)將不同的工作任

18、務(wù)編寫成不同的代碼片段并行執(zhí)行行工作隊(duì)列工作隊(duì)列程序程序13int next_task=0; int get_next_task() int task; #pragma omp criticalif(next_task8) task=next_task; next_task+; else task=-1; return task; void task_queue() int my_task; #pragma omp parallel private(my_task) my_task=get_next_task(); while(my_task!=-1) get_task_done(my_tas

19、k); my_task=get_next_task(); 根據(jù)線程號(hào)分配任務(wù)根據(jù)線程號(hào)分配任務(wù)#pragma omp parallel private(myid) nthreads=omp_get_num_threads(); myid=omp_get_thread_num(); get_my_work_done(myid,nthreads); 58n運(yùn)行結(jié)果:運(yùn)行結(jié)果: outside loop thread=0 outside loop thread=1 inside loop i=2 thread=1 inside loop i=0 thread=0 inside loop i=3 th

20、read=1 inside loop i=21thread=060626364656667 int counter=0; #pragma omp parallel for(int i=0;i10000;i+) #pragma omp atomic /atomic operation counter+; printf(counter = %dn,counter);68n運(yùn)行庫(kù)函數(shù)還支持嵌套的鎖機(jī)制,為了某運(yùn)行庫(kù)函數(shù)還支持嵌套的鎖機(jī)制,為了某些特殊的情況,如:進(jìn)行遞歸函數(shù)的調(diào)用些特殊的情況,如:進(jìn)行遞歸函數(shù)的調(diào)用707172omp_lock_t lock; /對(duì)應(yīng)程序?qū)嵗龑?duì)應(yīng)程序?qū)嵗?int co

21、unter=0;void inc_counter() printf(thread id=%dn,omp_get_thread_num(); for(int i=0;i100000;i+) omp_set_nest_lock(&lock); counter+; omp_unset_nest_lock(&lock); void dec_counter( ) printf(thread id=%dn,omp_get_thread_num(); for(int i=0;i1000;i+) omp_set_nest_lock(&lock); counter- -; omp_uns

22、et_nest_lock(&lock); int_tmain (int argc, _TCHAR*argv ) omp_init_nest_lock(&lock);#pragma omp parallel sections #pragma omp section inc_counter ( );#pragma omp section dec_counter ( ); omp_destroy_nest_lock (&lock); printf(“counter=%dn”,counter);75 #pragma omp for #pragma omp sections76

23、#pragma omp parallel #pragma omp for nowait for(int i=0;i9;+i) xi=(yi+zi)/2; printf(i=%d thread=%dn,i,omp_get_thread_num(); printf(finishedn); 77 #pragma omp parallel initialization ( ) ; #pragma omp barrier; process ( ) ; 78 #pragma omp ordered #pragma omp parallel for ordered schedule(dynamic)79vo

24、id work(int k) printf(thread id =%d k=%dn,omp_get_thread_num(),k); #pragma omp ordered printf( %dn, k); void ordered_func(int lb, int ub, int stride) int i; #pragma omp parallel for ordered schedule(dynamic) for (i=lb; iub; i+=stride) work(i); int _tmain(int argc, _TCHAR* argv) ordered_func(0, 50, 5

25、); return 0; 8081int _tmain(int argc, _TCHAR* argv) _int64 frequency; _int64 counter; _int64 begin; _int64 end; QueryPerformanceFrequency(LARGE_INTEGER*)&frequency); QueryPerformanceCounter(LARGE_INTEGER*)&counter); QueryPerformanceCounter(LARGE_INTEGER*)&begin); QueryPerformanceCounter(LARGE_INTEGER*)&end); return 0; 82 _int64 sum=0; #pragma omp parallel for reduction(+:sum) for(int i=0;i10000;i+) sum+=i;- _int64 sum=0; for(int i=0;i10000;i+) sum+=i;83 #pragma omp parallel for for(int i=0;i100;i+) if (i50) smallwork() else bigwork();- #pragma omp parallel for for(i

溫馨提示

  • 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)論