OpenMP学习(三)
来源:互联网 发布:淘宝商品数据包 编辑:程序博客网 时间:2024/05/16 14:58
一、OpenMP组成
由三大部分组成:
1、指令 Directives
2、运行时环境 Runtime Environment
3、环境变量 Environment Variable
二、指令 Directives
指令有以下几种:
并行区域 parallel region
worksharing结构 worksharing constructs
任务 tasks
同步 syncronization
数据共享特性 data-sharing attributes
1. parallel region
一个并行区域是一段被多个线程同时执行的代码
#pragma omp parallel [clause[[,]clause]...]{"this code is executed in parallel"}(这里自动是一个barrier)
2. worksharing constructs
#pragma omp for{}#pragma omp section{}#pragma imp single{}
这些工作会平分给所有的线程。
必须包含在一个并行区域中。
工作会被所有的工作线程接触。
在入口处没有提示barrier,在结束的时候默认有barrier(除非被指定了nowait)
在work-sharing结构中不会启动新线程
支持随机获取C++中的迭代器的循环,例子:
void iterator_example(){ std::vector vec(23); std::vector::iterator it; #pragma omp for default(none) shared(vec) for(it=vec.begin(); it<vec.end(); it++) { ... }}
2.1 for 指令例子
dingx@stoker:~$ vi + 2.c#include<stdio.h>#include<omp.h>int main(){int i;int n=100,m=10;#pragma omp parallel default(none) \ shared(m,n) private(i){ #pragma omp for nowait for(i=0;i<n-1;i++) printf("%d\n",i); #pragma omp for nowait for(i=0;i<n-1;i++) printf("%d\n",i);}return 0;}结果
dingx@stoker:~$ ./2338822006677115544
2.2 section 指令例子
#include<stdio.h>#include<omp.h>int main(){int i;int n=1000,m=10;#pragma omp parallel default(none) \ shared(m,n) private(i){ #pragma omp sections { #pragma omp section for(i=0;i<n-1;i++) printf("%d\n",i); #pragma omp section for(i=0;i<n-1;i++) printf("%d\n",i); }}return 0;}
重叠的I/O和处理
dingx@stoker:~$ cat 3.c#pragma omp parallel sections{#pragma omp section{for(int i=0; i<N; i++){(void)read_input(i);(void)signal_read(i);}}#pragma omp section{for(int i=0; i<N; i++){(void)wait_read(i);(void)process_data(i);(void)signal_processed(i);}}#pragma omp section{for(int i=0; i<N; i++){(void)wait_processed(i); (void)write_output(i);}}}
2.3 single指令
#pragma omp single [private][firstprivate]\ [copyprivate][nowait]{ ...}
3. Orphaning
#pragma omp parallel{ (void) dowork();}void doword(){ #pragma omp for for(int i=0; i<n; i++) { ... }}
dowork()被并行执行
(void) dowork();#pragma omp parallel{ (void) dowork();}void doword(){ #pragma omp for for(int i=0; i<n; i++) { ... }}串行部分调用dowork的部分只被主线程执行
0 0
- OpenMP学习(三)
- OpenMP编程学习笔记三
- OpenMP学习(一)
- OpenMP 学习(二)
- OpenMP学习(四)
- OpenMP学习(五)
- OpenMP学习(六)
- OpenMP(三) 线程同步
- openMP学习笔记(一)
- OpenMP Tutorial学习笔记(13)OpenMP环境变量(Environment Variables)
- OpenMP学习
- openmp 学习
- openmp学习
- Using OpenMP (三) 同步
- OpenMP模式下多线程文件操作(三)
- OpenMP Tutorial学习笔记(4)OpenMP指令之同步构造(Parallel)
- OpenMP Tutorial学习笔记(6)OpenMP指令之组合共享工作构造(Combined Work-Sharing)
- OpenMP Tutorial学习笔记(7)OpenMP指令之任务构造(Task Constructs)
- Cavas绘图移动游戏背景呈现前进效果(雷电战机一)
- 工厂方法模式
- Python暴力破解的收集
- 读书笔记--盗梦工厂--2014年03月05日
- 集合中ArrayList的使用
- OpenMP学习(三)
- Android R文件无法恢复问题
- 如何熟悉一个开源项目?
- C# 中的委托和事件
- 我感兴趣的博文与专家
- Android Math.random()解释
- 我的建博之旅
- (集思广益)区分ipv6奇偶地址
- objective-c static变量的使用总结