- 6
- 0
- 约1.26万字
- 约 56页
- 2016-11-23 发布于湖北
- 举报
OpenMP编程概要
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 私有变量的初始化和终结操作 下面是程序的执行结果 i=0 val=8 i=1 val=8 i=0 val=8 i=1 val=10000 val=10000 在每一个线程的内部,私有变量val被初始化 为主线程原有的同名变量的值,并且在循环 并行化退出的时候,相应的变量被原有串行 执行的最后一次执行(循环)对应的值所赋值。 * 数据相关性与并行化操作 #pragma omp parallel for必须保证不存在数据相关性 数据相关性又被称为数据竞争(Data Race) for(int i=0;i99;i++) a[i]=a[i]+a[i+1]; 数据竞争下循环并行化方法 * 数据相关性与并行化操作 for(int j=1;jN;j++) for(int i=0;iN;i++) a[i,j]=a[i,j]+a[i,j-1]; for(int j=1;jN;j++) #pragma omp parallel for for(int i=0;iN;i++) a[i,j]=a[i,j]+a[i,j-1]; * 2 OpenMP编程技术——并行区域编程 通过循环并行化编译指导语句使得一段代码能够在多个线程内部同时执行。 并行区域编译指导语句的格式与使用限制 #pragma omp parallel [clause[clause]…] block parallel编译指导语句的执行过程(程序段9、10) #pragma omp parallel for(int i=0;i5;i++) printf(hello world i=%d\n,i); #pragma omp parallel for for(int i=0;i5;i++) printf(hello world i=%d\n,i); * 并行区域编程 线程私有数据与threadprivate子句(程序段11) 使用threadprivate子句用来标明某一个变量是线程私有数据,在程序运行过程中,不能被其它线程访问。 int 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(counter=%d\n,counter); } * 并行区域编程 线程私有数据与copyin子句(程序段12) 使用copyin子句对线程私有的全局变量进行初始化。 int global=0; #pragma omp threadprivate(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 parallel printf(global=%d\n,global); } * 并行区域编程 并行区域之间的工作共享 工作队列 工作队列的基本工作过程即维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止。 根据线程号分配任务 由于每一个线程在执行的过程中的线程标识号是不同的,可以根据这个线程标识号来分配不同的任务。 * 并行区域编程 并行区域之间的工作共享 使用循环语句分配任务(程序段15) #pragma omp parallel { printf(outside loop thread=%d\n,
原创力文档

文档评论(0)