主要在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. Android线程池使用介绍

    本文主要使用kotlin,讨论Android开发中的线程池用法. 我们想使用线程的时候,可以直接创建子线程并启动 Thread { Log.d("rfDev", "rus ...

  2. python库--flashtext--大规模数据清洗利器

    flashtext.keyword (flashtext) 类/方法 返回值 参数 说明 .KeywordProcessor() 对象kp case_sensitive=False 是否区分大小写 添 ...

  3. RSA及其证明 [原创]

    描述RSA的实现步骤介绍文章非常多,但说明并证明其原理,并进而讨论为什么这样设计的文章不多.本人才疏学浅,不敢说理解了R.S.A.三位泰斗的设计初衷,简单就自己的理解写一写,博大家一笑. 以下原创内容 ...

  4. Java Web实现登录验证码(Servlet+jsp)

    1.生成验证码图片(Servlet) import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import j ...

  5. 【PHP数据结构】图的遍历:深度优先与广度优先

    在上一篇文章中,我们学习完了图的相关的存储结构,也就是 邻接矩阵 和 邻接表 .它们分别就代表了最典型的 顺序存储 和 链式存储 两种类型.既然数据结构有了,那么我们接下来当然就是学习对这些数据结构的 ...

  6. JDK1.8源码(三)——java.lang.String类

    一.概述 1.介绍 String是一个final类,不可被继承,代表不可变的字符序列,是一个类类型的变量.Java程序中的所有字符串字面量(如"abc")都作为此类的实例实现,&q ...

  7. Linux学习笔记整理-1

    内核检测常用的7个命令: fdisk命令:用于检查磁盘使用情况,以及可以对磁盘进行分区. #fdisk -l 列出系统内所有能找到的设备的分区 #fdisk /dev/sda 列出sda磁盘的分区情况 ...

  8. CSS3思维导图

  9. 浅谈机(J)惨(C)技巧——从入门到精通(?)

    JC总是无聊的机房中有意思的一个瞬间... 比如: 这个杰作由 ZSWBWYX 完成 你认为这只是AK-IOI吗?不!注意用户名...也是此人的杰作. 所以,在险恶的机房里,一定要保护好自己的账号. ...

  10. 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%

    Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...