主要在vs2015下使用OMP,写一些自己omp的学习心得:

一、在VS2015下OpenMP的使用:

1、VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好。

2、在VS下使用OPenMP需要在项目设置中找到,项目-->语言-->OpenMP支持中,选择是,下图所示:

并且在头文件中包含"omp.h"即可支持OpenMP了。

二、关于数据属性

1、shared 用来声明一个或者多个共享变量,在并行区会有数据竞争。

2、private 声明私有变量。

 1 void test_private()
2 {
3 printf("--before parallel--------------\n");
4 int a =100 ;
5 printf("a=%d\n", a);
6 printf("--parallel--------------\n");
7 #pragma omp parallel for private(a)
8 for (int i = 0; i < 10; i++)
9 {
10 a = i;//如果a没有被初始化,会提示a没有初始化,即使在并行前做了初始化也会有错误!
11 printf("a=%d\n", a);
12 }
13 printf("--after parallel--------------\n");
14 printf("a=%d\n", a);
15 }

结果输出:

--before parallel--------------
a=100
--parallel--------------
a=0
a=6
a=8
a=1
a=2
a=5
a=9
a=3
a=4
a=7
--after parallel--------------
a=100

3、default default(shared):表示并行区域内的共享变量在不指定的情况下都是shared属性;default(none):表示必须显式指定所有共享变量的数据属性,否则会报错,除非变量有明确的属性定义(比如循环并行区域的循环迭代变量只能是私有的。

4、firstprivate  继承并行区域之外的变量的值,用于在进入并行区域之前进行一次初始化。

void test_firstprivate()
{
printf("--before parallel--------------\n");
int a = 100;
printf("a=%d\n", a);
printf("--parallel--------------\n");
#pragma omp parallel for firstprivate(a) num_threads(3)
for (int i = 0; i < 10; i++)
{
printf("ID=%d,i=%d,a=%d\n",omp_get_thread_num(),i,a);
a = i;//对于某个线程来说,firstprivate仅仅进行一次初始化
}
printf("--after parallel--------------\n");
printf("a=%d\n", a); }

结果如下:

--before parallel--------------
a=100
--parallel--------------
ID=0,i=0,a=100
ID=0,i=1,a=0
ID=2,i=7,a=100
ID=0,i=2,a=1
ID=1,i=4,a=100
ID=2,i=8,a=7
ID=0,i=3,a=2
ID=2,i=9,a=8
ID=1,i=5,a=4
ID=1,i=6,a=5
--after parallel--------------
a=100

5、lastprivate 如果需要在并行区域内的私有变量经过计算后,在退出并行区域时,需要将其值赋给同名的共享变量,就可以使用lastprivate完成。

 1 void test_lastprivate()
2 {
3 printf("--before parallel--------------\n");
4 int a = 100;
5 printf("a=%d\n", a);
6 printf("--parallel--------------\n");
7 #pragma omp parallel for lastprivate(a) num_threads(3)
8 for (int i = 0; i < 10; i++)
9 {
10 a = i;
11 printf("ID=%d,i=%d,a=%d\n", omp_get_thread_num(), i, a);
12
13 }
14 printf("--after parallel--------------\n");
15 printf("a=%d\n", a); //获得逻辑上a的最后一个值,而不是最后一个线程的a值
16 }

结果如下:

--before parallel--------------
a=100
--parallel--------------
ID=0,i=0,a=0
ID=0,i=1,a=1
ID=1,i=4,a=4
ID=2,i=7,a=7
ID=0,i=2,a=2
ID=2,i=8,a=8
ID=1,i=5,a=5
ID=0,i=3,a=3
ID=1,i=6,a=6
ID=2,i=9,a=9
--after parallel--------------
a=9

6、threadprivate 指定全局变量被OpenMP所有的线程各自产生一个私有的拷贝,即各个线程都有自己私有的全局变量。一个很明显的区别在于,threadprivate并不是针对某一个并行区域,而是整个于整个程序,所以,其拷贝的副本变量也是全局的,即在不同的并行区域之间的同一个线程也是共享的。threadprivate只能用于全局变量或静态变量。

7、copyin 用于将主线程中threadprivate变量的值拷贝到执行并行区域的各个线程的threadprivate变量中,从而使得team内的子线程都拥有和主线程同样的初始值。copyin中的参数必须被声明成threadprivate的。

8、copyprivate用于将线程私有副本变量的值从一个线程广播到执行同一并行区域的其他线程的同一变量。copyprivate只能用于single指令的子句中,在一个single块的结尾处完成广播操作。copyprivate只能用于private/firstprivate或threadprivate修饰的变量。

openmp学习心得(一)的更多相关文章

  1. openmp学习心得(二)----常见的运行时库函数

    omp_set_dynamic();如果设置了动态调整,并行区域会根据系统的资源状况,动态分配线程的数量.好像仅仅有0和非0的区别,设置为0不进行动态分配. omp_get_num_threads,o ...

  2. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  9. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

随机推荐

  1. 硕盟type-c转接头HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  2. 【第八篇】- Git 查看提交历史之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ Git 查看提交历史 Git 提交历史一般常用两个命令: git log 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看. 针对 ...

  3. linux关于profile 、bashrc 、.bash_profile、.bashrc的区别

    linux关于profile .bashrc ..bash_profile..bashrc的区别 - /etc/profile /etc/bashrc ~/.bash_profile ~/.bashr ...

  4. Vue项目中应用TypeScript

    一.前言 与如何在React项目中应用TypeScript类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-c ...

  5. 内部类访问外部类成员变量,使用外部类名.this.成员变量

    public class Outer { private int age = 12; class Inner { private int age = 13; public void print() { ...

  6. 批大小、mini-batch、epoch的含义

    每次只选取1个样本,然后根据运行结果调整参数,这就是著名的随机梯度下降(SGD),而且可称为批大小(batch size)为 1 的 SGD. 批大小,就是每次调整参数前所选取的样本(称为mini-b ...

  7. HCNP Routing&Switching之路由过滤工具Filter-Policy

    前文我们了解了路由控制技术中路由策略和路由匹配工具IP-Prefix相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15314262.html:今天我们 ...

  8. Shell系列(20)- 字符截取命令cut

    前言 grep是按行提取:cut默认是通过制表符,按列提取,不能识别用空格作为分隔符 语法 cut [选项] [文件] 选项 -f :列号,截取哪几列数据,多个列号用逗号隔开:列与列之间默认用TAB制 ...

  9. python学习笔记(一)-基础知识

    O.解释型语言和编译型语言 编译型语言就是先把写好的程序翻译成计算机语言然后执行,就是所谓的一次编译到处运行,比如c.c++就是编译型语言,这样的语言特点是运行速度快,但是需要事先把程序编译好才可以. ...

  10. 我在学习Blazor当中踩的巨坑!Blazor WebAssembly调试

    最近嘛,看看Blazor已经蛮成熟的.顺便想在自家的框架里使用这个东西,毕竟我还是很念旧的,而且Blazor的技术栈也不麻烦.然后呢,在调试这一关我可是踩了大坑. 我的VS是2019,很早以前装的.然 ...