主要在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. Spring5(六)——AspectJ(xml)

    一.AspectJ 1.介绍 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,也可以说 AspectJ 是一个基于 Java 语言的 AOP 框架.通常我们在 ...

  2. 『Python』多进程

    Python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在Python中大部分情况需要使用多进程.Python提供了multiprocessin ...

  3. 鸿蒙内核源码分析(索引节点篇) | 谁是文件系统最重要的概念 | 百篇博客分析OpenHarmony源码 | v64.01

    百篇博客系列篇.本篇为: v64.xx 鸿蒙内核源码分析(索引节点篇) | 谁是文件系统最重要的概念 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么 ...

  4. P5404-[CTS2019]重复【KMP,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5404 题目大意 给出一个字符串\(S\),然后求有多少个长度为\(m\)的串\(T\)满足.无限多个串\(T\) ...

  5. P5110-块速递推【特征方程,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P5110 题目大意 数列\(a\)满足 \[a_n=233a_{n-1}+666a_{n-2},a_0=0,a_1= ...

  6. Golang使用swaggo自动生成Restful API文档

    #关于Swaggo 相信很多程序猿和我一样不喜欢写API文档.写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全.但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至 ...

  7. 什么?你还不明白自动化的POM设计模式?

    POM简介.POM优势.如何设计POM POM简介 Page Object Model (POM) 直译为"页面对象模型",这种设计模式旨在为每个待测试的页面创建一个页面对象(cl ...

  8. Excel 高亮当前行、高亮重复行的探索

    本文原创,转载请注明出处:https://www.cnblogs.com/wotent/p/15348891.html TLDR 下载文件 高亮.zip ,将解压后的"高亮.xlam&quo ...

  9. 记typora美化----让文章更加优美

    前言 昨晚偶然间看到一篇介绍记笔记工具以及如何美化的视频,突发奇想我打算也写一篇记录一下自己的美化过程,并会把自己使用的插件,样式文件等提供在下方,觉得不错得可以直接拿去使用,只希望观众能够一键3连, ...

  10. C++ostringstream用法

    ostringstream用法 1.类型转换 要求包含头文件; 字符串和int之间的互相转换: int num = 100; string str = ""; std::ostri ...