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
原创粉丝点击