多核程序设计 OpenMP编程_第1页
多核程序设计 OpenMP编程_第2页
多核程序设计 OpenMP编程_第3页
多核程序设计 OpenMP编程_第4页
多核程序设计 OpenMP编程_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、123678 问题问题:n主线程等待主线程等待globalvar为真,如不为为真,如不为真则一直循环,这样占用真则一直循环,这样占用CPU资源资源n如果主线程等其它线程优先级高于如果主线程等其它线程优先级高于ThreadFunc,则,则globalvar一直不一直不会被置为真会被置为真9nSetEvent只有一个参数,该参数指定了事件对象的句柄值,若只有一个参数,该参数指定了事件对象的句柄值,若事件成功激发,返回事件成功激发,返回TRUE;nResetEvent函数将事件对象恢复到最初的非激发状态,只有一函数将事件对象恢复到最初的非激发状态,只有一个参数,成功后返回真个参数,成功后返回真101

2、1p程序输出如下程序输出如下: Writing Reading The Program is End12131415161718212223242527282930nlock 关键字将语句块标记为临界区,方法关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:后释放该锁。此语句的形式如下:Object thisLock = new Object();lock (thisLock) / Critical code section333435363738394042Master ThreadParalllRegion

3、NestedParallelRegion444546n方便把串行程序改编为并行程序方便把串行程序改编为并行程序48两种编程方式的优缺点两种编程方式的优缺点n编译指导语句可以实现:编译指导语句可以实现:n将串行程序逐步改造成一个并行程序,达到增量更新将串行程序逐步改造成一个并行程序,达到增量更新程序的目的,从而减少编程人员的一定负担。程序的目的,从而减少编程人员的一定负担。n能够将串行程序和并行程序保持在同一个源代码文件能够将串行程序和并行程序保持在同一个源代码文件当中,减少了维护的负担。当中,减少了维护的负担。n编译指导语句的优势体现在编译的阶段,对于运行阶编译指导语句的优势体现在编译的阶段,

4、对于运行阶段支持较少。段支持较少。n运行时库函数:运行时库函数:5051n编译器在链接编译器在链接53545657585960616263数据相关的概念数据相关的概念 n如果语句如果语句S2与语句与语句S1存在数据相关,那么存在数据相关,那么必然存在以下两种情况之一:必然存在以下两种情况之一: nS1在循环的一次迭代中访问存储单元在循环的一次迭代中访问存储单元L,而,而S2在随后的一次迭代中访问同一存储单元,即:在随后的一次迭代中访问同一存储单元,即:循环迭代相关循环迭代相关 ;nS1和和S2在同一循环迭代中访问同一存储单元在同一循环迭代中访问同一存储单元L,但,但S1的执行在的执行在S2之前

5、,即:非循环迭代相关之前,即:非循环迭代相关 。 数据相关的概念数据相关的概念n实例:实例: 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 数据相关的概念数据相关的概念 x0 = 0; y0 = 1; x50 = 75;y50 = 76 ;#pragma omp parallel for private(m, k) for (m = 0; m 2; m+) for (k = m*50 + 1; k m*50 + 50

6、; k+) xk = yk-1 + 1; /S1 yk = xk-1 + 2; /S2 67nthreadprivate表示一个线程私有的全局变量。表示一个线程私有的全局变量。 6869n在一个循环体内经常会包含另外一个循环体,在一个循环体内经常会包含另外一个循环体,循环产生了嵌套循环产生了嵌套7071线程1栈线程2栈堆程序代码程序数据n在使用作用域子句的时候要遵循如下的一在使用作用域子句的时候要遵循如下的一些规则些规则 :n作用域子句作用的变量是已经申明的有名变量作用域子句作用的变量是已经申明的有名变量;n作用域子句在作用到类或者结构的时候,必须作用域子句在作用到类或者结构的时候,必须作用到

7、类或者结构的整体,而不能只作用于类作用到类或者结构的整体,而不能只作用于类或者结构的一个部分;或者结构的一个部分;n一个编译指导语句能够包含多个数据作用域子一个编译指导语句能够包含多个数据作用域子句,但是变量只能出现在一个作用域子句中,句,但是变量只能出现在一个作用域子句中,即变量不能既是共享的,又是私有的;即变量不能既是共享的,又是私有的;n在语法结构上,作用域子句只能作用在出现在在语法结构上,作用域子句只能作用在出现在编译指导语句起作用的语句变量部分。另外,编译指导语句起作用的语句变量部分。另外,可以将作用域子句作用在类的静态变量上。可以将作用域子句作用在类的静态变量上。nOpenMP 对

8、默认情况下,并行区中所有的对默认情况下,并行区中所有的变量都是共享的,但有三种例外情况:变量都是共享的,但有三种例外情况:n在在parallel for循环中,循环中,循环索引变量是私有的是私有的;n那些并行区中的局部变量是私有的;那些并行区中的局部变量是私有的;n所有在所有在private,firstprivate,lastprivate或或reduction子句中列出的变量都是私有的。私有子句中列出的变量都是私有的。私有化是通过为每个线程创建各个变量的独立副本化是通过为每个线程创建各个变量的独立副本来完成的。来完成的。747576n使用使用reduction子句进行多线程程序设计时,要记子

9、句进行多线程程序设计时,要记住以下三个要点:住以下三个要点: n在第一个线程到达指定了在第一个线程到达指定了reduction子句的共享区域或子句的共享区域或循环末尾时,原来的规约变量的值变为不确定,并保循环末尾时,原来的规约变量的值变为不确定,并保持此不确定状态直至规约计算完成持此不确定状态直至规约计算完成 ;n如果在一个循环中使用到了如果在一个循环中使用到了reduction子句,同时又使子句,同时又使用了用了nowait子句,那么在确保所有线程完成规约计算的子句,那么在确保所有线程完成规约计算的栅栏同步操作前,原来的规约变量的值将一直保持不栅栏同步操作前,原来的规约变量的值将一直保持不确

10、定的状态确定的状态;n各个线程的私有副本值被规约的顺序是未指定的。因各个线程的私有副本值被规约的顺序是未指定的。因此,对于同一段程序的一次串行执行和一次并行执行此,对于同一段程序的一次串行执行和一次并行执行,甚至两次并行执行来说,都无法保证得到完全相同,甚至两次并行执行来说,都无法保证得到完全相同的结果(这主要针对浮点计算而言),也无法保证计的结果(这主要针对浮点计算而言),也无法保证计算过程中诸如浮点计算异常这样的行为会完全相同。算过程中诸如浮点计算异常这样的行为会完全相同。私有变量的初始化和终结操作私有变量的初始化和终结操作n循环并行化开始时访问到私有变量在主线程中的循环并行化开始时访问到

11、私有变量在主线程中的同名变量的值,也有可能需要将循环并行化最后同名变量的值,也有可能需要将循环并行化最后一次循环的变量结果返回给主线程中的同名的变一次循环的变量结果返回给主线程中的同名的变量。量。nOpenMP 编译指导语句使用编译指导语句使用firstprivate和和 lastprivate对这两种需求进行支持,使得循环并行对这两种需求进行支持,使得循环并行开始执行的时候私有变量通过主线程中的变量初开始执行的时候私有变量通过主线程中的变量初始化,同时循环并行结束的时候,将最后一次循始化,同时循环并行结束的时候,将最后一次循环的相应变量赋值给主线程的变量。环的相应变量赋值给主线程的变量。n程

12、序实例:程序实例: 7980在每一个线程的内部在每一个线程的内部,私有变量私有变量val被初始化被初始化为主线程原有的同名变量的值为主线程原有的同名变量的值,并且在循环并且在循环并行化退出的时候并行化退出的时候,相应的变量被原有串行相应的变量被原有串行执行的最后一次执行的最后一次执行(循环)执行(循环)对应的值所赋值。对应的值所赋值。 81i=0,val(8)i=1,val(8)i=2,val=10000i=3,val=11111i=4,val(11111)82i=0,vali=1,vali=2,vali=3,vali=4,val8384for(int j=1;jN;j+)for(int i=

13、0;iN;i+)ai,j=ai,j+ai,j-1;for(int j=1;jN;j+) #pragma omp parallel forfor(int i=0;iN;i+)ai,j=ai,j+ai,j-1;85n并行区域编译指导语句的使用限制并行区域编译指导语句的使用限制nparallel编译指导语句与循环并行化编译指导语句与循环并行化parallel for语句类似,在使用到程序块之前也有一定的限语句类似,在使用到程序块之前也有一定的限制。制。n程序块必须是只有单一入口和单一出口的程序程序块必须是只有单一入口和单一出口的程序块块n不能从外面转入到程序块的内部,也不允许从不能从外面转入到程序块

14、的内部,也不允许从程序块内部有多个出口转到程序块之外程序块内部有多个出口转到程序块之外n程序块内部的跳转是允许的程序块内部的跳转是允许的n程序块内部直接调用程序块内部直接调用exit函数来退出整个程序函数来退出整个程序的执行也是允许的的执行也是允许的#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的执行结果的执行结果hello world i=0hell

15、o world i=0hello world i=1hello world i=1hello world i=2hello world i=2hello world i=3hello world i=3hello world i=4hello world i=4n程序段程序段10的执行结果的执行结果hello world i=0hello world i=3hello world i=1hello world i=4hello world i=2n并行区域与循环并行化的区别并行区域与循环并行化的区别n并行区域采用复制的执行方式,将代码在所有的线程并行区域采用复制的执行方式,将代码在所有的线程内

16、部都执行一次内部都执行一次n循环并行化采用工作分配的执行方式,将循环所需要循环并行化采用工作分配的执行方式,将循环所需要所有工作量按照一定的方式分配到各个执行线程中,所有工作量按照一定的方式分配到各个执行线程中,所有线程执行工作的总和是原先串行执行所完成的工所有线程执行工作的总和是原先串行执行所完成的工作量。作量。n并行区域并行区域parallel语句的作用:语句的作用:n当程序遇到当程序遇到parallel编译指导语句时,就会生成相应数编译指导语句时,就会生成相应数目(根据环境变量)的线程,且组成一个线程组,并目(根据环境变量)的线程,且组成一个线程组,并将代码重复地在各个线程内部执行。将代

17、码重复地在各个线程内部执行。Parallel的末尾隐的末尾隐含一个同步障碍,所有线程完成各自的任务后将在这含一个同步障碍,所有线程完成各自的任务后将在这个同步障碍汇合。此时,此线程组的主线程个同步障碍汇合。此时,此线程组的主线程(master)继继续执行,而相应的子线程续执行,而相应的子线程(slave)则停止执行。则停止执行。90int counter=0; /using threadprivate#pragma omp threadprivate(counter) void inc_counter()()counter+; int _tmain(int argc, TCHAR * argv

18、)#pragma omp parallel for(int i=0;i10000;i+)inc_counter()();printf(counter=%dn,counter); 91int 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,globa

19、l);printf(parallel againn);#pragma omp parallelprintf(global=%dn,global); 92并行区域之间的工作共享并行区域之间的工作共享程序程序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 priva

20、te(my_task) my_task=get_next_task()(); while(my_task!=-1) get_task_done(my_task); my_task=get_next_task()(); 并行区域之间的工作共享并行区域之间的工作共享n根据线程号分配任务:由于每一个线程在根据线程号分配任务:由于每一个线程在执行的过程中的线程标识号是不同的,可执行的过程中的线程标识号是不同的,可以根据这个线程标识号来分配不同的任务以根据这个线程标识号来分配不同的任务。#pragma omp parallel private(myid) nthreads=omp_get_num_thr

21、eads(); myid=omp_get_thread_num(); get_my_work_done(myid,nthreads); 95969899100101102103 int counter=0; #pragma omp parallel for(int i=0;i10000;i+) #pragma omp atomic /atomic operation counter+; printf(counter = %dn,counter);104105106107omp_lock_t lock; /对应程序实例对应程序实例3int counter=0;void inc_counter()

22、 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); 108 #pragma omp for #pragma omp sections109 #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

23、_num(); printf(finishedn); 110 #pragma omp parallel initialization ( ) ; #pragma omp barrier; process ( ) ; 111 #pragma omp ordered #pragma omp parallel for ordered schedule(dynamic)112void work(int k) printf(thread id =%d k=%dn,omp_get_thread_num(),k); #pragma omp ordered printf( %dn, k); void orde

24、red_func(int lb, int ub, int stride) int i; #pragma omp parallel for ordered schedule(dynamic) for (i=lb; i10) printf(“if clause, ThreadId=%dn”, omp_get_thread_num(); 如果如果n10,则大括号内代码并行执行;,则大括号内代码并行执行;如果如果n2*ncore?2*ncore:max_tn;/实实际线程数量际线程数量119Schedule子句:子句:n格式:格式:schedule(type,size)ntype参数:参数:dynam

25、ic/guided/runtime/staticnsize参数:表示循环迭代次数,必须为整数。参数:表示循环迭代次数,必须为整数。n如果如果type参数为参数为dynamic/guided/static,则,则size为为可选参数可选参数n如果如果type参数为参数为runtime,则不需要使用,则不需要使用size参数。参数。120Schedule子句:子句:n静态调度静态调度(static):parallel for语句不带语句不带schedule子句,默认为静态调度方式。子句,默认为静态调度方式。n动态调度动态调度(dynamic):没有:没有size参数:将迭代逐参数:将迭代逐个分配到

26、各个线程;使用个分配到各个线程;使用size参数:每次分配参数:每次分配给线程的迭代次数为给线程的迭代次数为size次。次。n启发式自调度启发式自调度(guided):开始时每个线程会分:开始时每个线程会分配到较大的迭代块,之后分配到的迭代块会递配到较大的迭代块,之后分配到的迭代块会递减。迭代块的大小按指数级下降到指定的减。迭代块的大小按指数级下降到指定的size大小。如果没有大小。如果没有size参数,默认参数,默认1。121122int _tmain(int argc, _TCHAR* argv) _int64 frequency; _int64 counter; _int64 begin; _int64 end; QueryPerformanceFrequency(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论