OpenMP笔记(六)
OpenMP有三种常见的加锁操作:
critical是OpenMP的指令,它规定其后的代码为临界块,任何时候只允许一个线程访问;
omp_set_lock是OpenMP的库函数,要跟omp_unset_lock一起使用;
atomic也是指令,其后的内存位置将会原子更新
例子:
int main()
{
int i, nVar = 0, n = 5000000;
omp_set_num_threads(4);
clock_t t1, t2;
//critical
t1 = clock();
#pragma omp parallel for shared(nVar)
for (i = 0; i < n; i++)
{
#pragma omp critical
{
nVar += 1;
}
}
t2 = clock();
printf("critical nVar:%d\n", nVar);
printf("critical time: %ld ms\n", t2 - t1);
printf("---------------\n");
//Lock() & Unlock()
nVar = 0;
t1 = clock();
omp_lock_t mylock;
omp_init_lock(&mylock);
#pragma omp parallel for shared(nVar)
for (i = 0; i < n; i++)
{
omp_set_lock(&mylock);
nVar += 1;
omp_unset_lock(&mylock);
}
omp_destroy_lock(&mylock);
t2 = clock();
printf("Lock nVar:%d\n", nVar);
printf("Lock time: %ld ms\n", t2 - t1);
printf("---------------\n");
//atomic
nVar = 0;
t1 = clock();
#pragma omp parallel for shared(nVar)
for (i = 0; i < n; i++)
{
#pragma omp atomic
nVar += 1;
}
t2 = clock();
printf("atomic nVar:%d\n", nVar);
printf("atomic time: %ld ms\n", t2 - t1);
printf("---------------\n");
//normal
nVar = 0;
t1 = clock();
for (i = 0; i < n; i++)
{
nVar += 1;
}
t2 = clock();
printf("normal nVar:%d\n", nVar);
printf("normal time: %ld ms\n", t2 - t1);
system("pause");
return 0;
}

在这个任务里是不并行比并行性能好啊。如果要并行的话,加锁的时候还是atomic的性能好一些。
OpenMP笔记(六)的更多相关文章
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Python学习笔记六
Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Django开发笔记六
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
随机推荐
- go语言开发环境安装及第一个go程序
下载Go语言开发包 大家可以在Go语言官网(https://golang.google.cn/dl/)下载 Windows 系统下的Go语言开发包,如下图所示. 安装Go语言开发包 双击我们下载好的G ...
- 021-PHP常用的数值类型判断函数
<?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...
- java开发 中台
中台就是接入层啊,一般有中台的都是比较大的项目,后台会分为很多模块,比如订单模块,比如会员模块,接入层需要做的就是对数据的封装,权限的过滤,以及各种安全什么的, 前台需要什么数据,接入层去对应的后台微 ...
- spring学习第7天(PCD以及切点表达式)
1.PCD(PointCutDesigner) spring的aop只针对方法进行aop代理,而apectj联盟的aop比之更加强大,还可以针对字段等进行切面编程 1.1:execution,用的最多 ...
- python---函数作用域
1.作用域 local:局部作用域 E(Enclosing):闭包函数外的函数中 G(global): 全局作用域 B(Build-in):內建作用域 查找变量的顺序,从上到下 2.函数内的变 ...
- IBGP的自己下一跳,指定源命令。
neighbor router-id update-source loopback int 当两者并不是以物理接口为搭建邻居的时候,就得使用指定源,充当TCP接口. neighbor router-i ...
- C#后台执行JavaScript
方法一: Page.RegisterClientScriptBlock 方法 命名空間: System.Web.UI 这个方法现在已经过时.改用ClientScriptManager.Register ...
- flink和spark Streaming中的Back Pressure
Spark Streaming的back pressure 在讲flink的back pressure之前,我们先讲讲Spark Streaming的back pressure.Spark Strea ...
- vue仿写taobao
1.less () cnpm install less less-loader --save ()在webpack.base.conf.js里 { test:/\.less$/, loader:'st ...
- Codeforces Round #603 (Div. 2) A. Sweet Problem(水.......没做出来)+C题
Codeforces Round #603 (Div. 2) A. Sweet Problem A. Sweet Problem time limit per test 1 second memory ...