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区域图像 ...
随机推荐
- CentOS 6.x 重置root 密码
1.重启,进入启动界面,快速按e,进入GNU GRUB界面. 2.选择第二项,按e,进行编辑. 3.在末尾输入1或single,回车,返回上一界面,还是选第二项,按b,进入单用户模式. 此时输入命令 ...
- springboot启动微服务项目时,启动后没有端口号信息,也访问不了
2018-06-05 13:43:42.282 [localhost-startStop-1] DEBUG org.apache.catalina.core.ContainerBase - Add c ...
- bzoj 2281: [Sdoi2011]黑白棋
再次,,,,,虚(一开始看错题了,看成一次移动一个棋子,能移动1-d个格子...这样的话有没有大神会做??本蒟蒻就教) 额,,直接%%%%把...http://hzwer.com/5760.html ...
- 019-PHP创建目录函数
<?php if (mkdir("myDir1", 0777)) //创建目录的函数 { print("目录创建成功"); //目录建立成功 } else ...
- DRF教程10-关系字段
https://www.django-rest-framework.org/api-guide/relations/ 在编程中核心的就是数据结构. 关系字段用来表示model之间的关系,比如外键,m2 ...
- Mysql: if 结构
if结构 语法 if 条件1 then 语句1; elseif 条件2 then 语句2; ... else 语句n; # 可以不写 应用场合:应用在begin end 中 SEL ...
- Mac安装vue产生错误
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/webpack/node_modules/_ ...
- 面试官,不要再问我“Java 垃圾收集器”了(转载)
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...
- [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome
Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...
- 在开发过程中遇到的Oracle的坑及开发技巧
本人与2018年毕业,工作一年多,仍是菜鸟,自毕业以来一直从事java软件开发工作,工作中大部分数据库都是使用的Oracle,碰到的问题总结一下(随时更新). 1.sql中使用group by 分组时 ...