最新多核软件开发技术北大讲义PPT课件

上传人:痛*** 文档编号:231283017 上传时间:2023-08-31 格式:PPT 页数:38 大小:1.43MB
返回 下载 相关 举报
最新多核软件开发技术北大讲义PPT课件_第1页
第1页 / 共38页
最新多核软件开发技术北大讲义PPT课件_第2页
第2页 / 共38页
最新多核软件开发技术北大讲义PPT课件_第3页
第3页 / 共38页
点击查看更多>>
资源描述
多核软件开发技术北大讲义本讲主要内容本讲主要内容OpenMP编程简介编程简介 OpenMP多线程应用程序编程技术多线程应用程序编程技术 OpenMP多线程应用程序性能分析多线程应用程序性能分析 使用使用VS 2005编写编写OpenMP程序程序 当前的当前的Visual Studio.Net 2005完全支持完全支持OpenMP 2.0标准标准 通过新的编译器选项通过新的编译器选项/openmp来支持来支持OpenMP程序的编译和链接程序的编译和链接 建立一个新的项目建立一个新的项目 配置项目属性配置项目属性 设置环境变量设置环境变量 OpenMP多线程应用程序编程技术多线程应用程序编程技术 循环并行化循环并行化 循环并行化是使用循环并行化是使用OpenMP来并行化程序的最重来并行化程序的最重要的部分要的部分 在在C/C+语言中,循环并行化语句的编译指导语语言中,循环并行化语句的编译指导语句格式如下:句格式如下:#pragma omp parallel for clauseclausefor(index=first;test_expr;increment_expr)body of the loop;循环并行化语句的限制循环并行化语句的限制 并不是所有的循环语句都能够在其前面加上并不是所有的循环语句都能够在其前面加上#pragma omp parallel来实现并行化来实现并行化并行化的语句必须是并行化的语句必须是for循环语句并具有规范格式循环语句并具有规范格式 能够推测出循环的次数能够推测出循环的次数 for(index=start;index end;increment_expr)在循环过程中不能使用在循环过程中不能使用break语句语句 不能使用不能使用goto和和return语句从循环中跳出语句从循环中跳出 可以使用可以使用continue语句语句 循环并行化编译指导语句的子句循环并行化编译指导语句的子句 循环并行化子句可以包含一个或者多个子句来控循环并行化子句可以包含一个或者多个子句来控制循环并行化的实际执行制循环并行化的实际执行 常见子句有:常见子句有:作用域子句作用域子句控制线程的调度(控制线程的调度(schedule)子句)子句动态控制是否并行化(动态控制是否并行化(if)子句)子句进行同步的子句(进行同步的子句(ordered)子句)子句控制变量在串行部分与并行部分传递(控制变量在串行部分与并行部分传递(copyin)子句)子句循环嵌套循环嵌套 可以将嵌套循环的任意一个循环体进行并行化可以将嵌套循环的任意一个循环体进行并行化 循环并行化编译指导语句可以加在任意一个循循环并行化编译指导语句可以加在任意一个循环之前环之前对应的最近的循环语句被并行化,其它部分保对应的最近的循环语句被并行化,其它部分保持不变持不变 控制数据的共享属性控制数据的共享属性OpenMP程序在同一个共享内存空间上执行程序在同一个共享内存空间上执行 可以任意使用这个共享内存空间上的变量进可以任意使用这个共享内存空间上的变量进行线程间的数据传递行线程间的数据传递 OpenMP还允许线程保留自己的私有变量不还允许线程保留自己的私有变量不能让其它线程访问到能让其它线程访问到 使用作用域子句的一些规则使用作用域子句的一些规则 作用域子句作用的变量是已经申明的有名变量作用域子句作用的变量是已经申明的有名变量 作用域子句在作用到类或者结构的时候,只能作作用域子句在作用到类或者结构的时候,只能作用到类或者结构的整体,而不能只作用域类或者用到类或者结构的整体,而不能只作用域类或者结构的一个部分结构的一个部分 一个编译指导语句能够包含多个数据作用域子句一个编译指导语句能够包含多个数据作用域子句作用域子句只能作用在出现在编译指导语句起作作用域子句只能作用在出现在编译指导语句起作用的语句变量部分用的语句变量部分 规约操作的并行化规约操作的并行化 在规约操作中,会反复将一个二元运算符应用在一在规约操作中,会反复将一个二元运算符应用在一个变量和另外一个值上,并把结果保存在原变量中个变量和另外一个值上,并把结果保存在原变量中 在使用规约操作时,只需在变量前指明规约操作的在使用规约操作时,只需在变量前指明规约操作的类型以及规约的变量类型以及规约的变量#pragma omp parallel for private(arx,ary,n)reduction(+:a,b)for(i=0;in;i+)a=a+arxi;b=b+aryi;规约操作并行化的限制规约操作并行化的限制并不是所有的操作都能够使用规约操作并不是所有的操作都能够使用规约操作所有能够在所有能够在OpenMP的的C/C+语言中出现的规约操作语言中出现的规约操作 运算符数据类型默认初始值+整数,浮点0*整数,浮点1-整数,浮点0&整数所有位都开启,0|整数0整数0&整数1|整数0数据相关性与并行化操作数据相关性与并行化操作 并不是所有的循环都能够使用并不是所有的循环都能够使用#pragma omp parallel for来进行并行化来进行并行化 必须要保证数据两次循环之间不存在数据相必须要保证数据两次循环之间不存在数据相关性关性 数据相关性又被称为数据竞争(数据相关性又被称为数据竞争(Data Race)当两个线程对同一个变量进行操作,并且有当两个线程对同一个变量进行操作,并且有一个操作为写操作的时候,就说明这两个线一个操作为写操作的时候,就说明这两个线程存在数据竞争程存在数据竞争 并行区域编程并行区域编程 循环并行化实际上是并行区域编程的一个特循环并行化实际上是并行区域编程的一个特例例 并行区域简单的说就是通过循环并行化编译并行区域简单的说就是通过循环并行化编译指导语句使得一段代码能够在多个线程内部指导语句使得一段代码能够在多个线程内部同时执行同时执行 在在C/C+语言中,并行区域编写的格式如下:语言中,并行区域编写的格式如下:#pragma omp parallel clauseclauseblock parallel编译指导语句的执行过程编译指导语句的执行过程当程序遇到当程序遇到parallel编译指导语句的时候,就编译指导语句的时候,就会生成相应数目(根据环境变量)的线程组会生成相应数目(根据环境变量)的线程组成一个线程组,并将代码重复地在各个线程成一个线程组,并将代码重复地在各个线程内部执行内部执行 parallel的末尾有一个隐含的同步屏障的末尾有一个隐含的同步屏障(barrier),所有线程完成所需的重复任务),所有线程完成所需的重复任务有,在这个同步屏障出会和(有,在这个同步屏障出会和(join)工作队列工作队列 工作队列的基本工作过程:工作队列的基本工作过程:为维持一个工作的队列,线程在并行执行的为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完时候,不断从这个队列中取出相应的工作完成,直到队列为空为止成,直到队列为空为止 根据线程号分配任务根据线程号分配任务每一个线程在执行的过程中的线程标识号是每一个线程在执行的过程中的线程标识号是不同的不同的 可以根据这个线程标识号来分配不同的任务可以根据这个线程标识号来分配不同的任务#pragma omp parallel private(myid)nthreads=omp_get_num_threads()();myid=omp_get_thread_num()();get_my_work_done(myid,nthreads);线程同步线程同步 OpenMP支持两种不同类型的线程同步机制支持两种不同类型的线程同步机制:互斥锁:可以用来保护一块共享的存储空间,互斥锁:可以用来保护一块共享的存储空间,使得每一次访问这块共享内存空间的线程最使得每一次访问这块共享内存空间的线程最多一个,保证了数据的完整性多一个,保证了数据的完整性事件通知:这种机制保证了多个线程之间的事件通知:这种机制保证了多个线程之间的执行顺序执行顺序 互斥锁机制互斥锁机制 用来对一块内存进行保护用来对一块内存进行保护OpenMP提供了三种不同的互斥锁机制提供了三种不同的互斥锁机制:临界区(临界区(critical)原子操作(原子操作(atomic)由库函数来提供同步操作由库函数来提供同步操作 临界区(临界区(critical)临界区通过编译指导语句对产生数据竞争的临界区通过编译指导语句对产生数据竞争的内存变量进行保护内存变量进行保护 在程序需要访问可能产生竞争的内存数据的在程序需要访问可能产生竞争的内存数据的时候,都需要插入相应的临界区代码时候,都需要插入相应的临界区代码#pragma omp critical(name)block在执行上述的程序块在执行上述的程序块block之前,必须首先要之前,必须首先要获得临界区的控制权获得临界区的控制权 原子操作原子操作 现代体系结构的多处理计算机提供了原子更现代体系结构的多处理计算机提供了原子更新一个单一内存单元的方法新一个单一内存单元的方法通过单一一条指令就能够完成数据的读取与通过单一一条指令就能够完成数据的读取与更新操作更新操作通过这种方式就能够完成对单一内存单元的通过这种方式就能够完成对单一内存单元的更新,提供了一种更高效率的互斥锁机制更新,提供了一种更高效率的互斥锁机制#pragma omp atomicx=expr 运行时库函数的互斥锁支持运行时库函数的互斥锁支持 函数名称描述void omp_init_lock(omp_lock_t*)初始化一个互斥锁void omp_destroy_lock(omp_lock_t*)结束一个互斥锁的使用并释放内存void omp_set_lock(omp_lock_t*)获得一个互斥锁void omp_unset_lock(omp_lock_t*)释放一个互斥锁int omp_test_lock(omp_lock_t*)试图获得一个互斥锁,并在成功是返回真(true),失败是返回假(false)事件同步机制事件同步机制 用来控制代码的执行顺序,使得某一部分代用来控制代码的执行顺序,使得某一部分代码必须在其它的代码执行完毕之后才能执行码必须在其它的代码执行完毕之后才能执行OpenMP中的中的事件同步主要包括:事件同步主要包括:同同步屏障(步屏障(barrier)定序区段(定序区段(ordered sections)主线程执行(主线程执行(master)隐含的同步屏障(隐含的同步屏障(barrier)在每一个并行区域都会有一个隐含的同步屏障在每一个并行区域都会有一个隐含的同步屏障一个同步屏障要求所有的线程执行到此屏障,一个同步屏障要求所有的线程执行到此屏障,然后才能够继续执行下面的代码然后才能够继续执行下面的代码#pragma omp for,#pragma omp single,#pragma omp sections程序块都包含自己的隐程序块都包含自己的隐含的同步屏障含的同步屏障 为了避免在循环过程中不必要的同步屏障,可为了避免在循环过程中不必要的同步屏障,可以增加以增加nowait子句到相应的编译指导语句中子句到相应的编译指导语句中 明确的同步屏障语句明确的同步屏障语句 在有些情况下,隐含的同步屏障并不能提供有效的在有些情况下,隐含的同步屏障并不能提供有效的同步措施同步措施 程序员可以在需要的地方插入明确的同步屏障语句程序员可以在需要的地方插入明确的同步屏障语句#pragma omp barrier 在并行区域的执行过程中,所有的执行线程都会在在并行区域的执行过程中,所有的执行线程都会在同步屏障语句上进行同步同步屏障语句上进行同步#pragma omp parallelinitialization()();#pragma omp barrierprocess()();循环并行化中的顺序语句(循环并行化中的顺序语句(ordered)对于循环并行化中的某些处理需要规定执行对于循环并行化中的某些处理需要规定执行的顺序的顺序 典型的情况:在一次循环的过程中典型的情况:在一次循环的过程中一大部分的工作是可以并行执行的,而其余的工一大部分的工作是可以并行执行的,而其余的工作需要等到前面的工作全部完成之后才能够执行作需要等到前面的工作全部完成之后才能够执行 在循环并行化的过程中,可以使用在循环并行化的过程中,可以使用ordered子子句使得顺序执行的语句直到前面的循环都执句使得顺序执行的语句直到前面的循环都执行完毕之后再执行行完毕之后再执行 OpenMP多线程应用程序性能分析多线程应用程序性能分析 影响性能的主要因素影响性能的主要因素 程序并行部分的比率程序并行部分的比率 OpenMP本身的开销本身的开销 负载均衡负载均衡局部性局部性线程同步带来的开销线程同步带来的开销结束语结束语谢谢大家聆听!谢谢大家聆听!38
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!