OpenMP系列
发布日期:2021-06-29 18:38:24
浏览次数:2
分类:技术文章
本文共 3535 字,大约阅读时间需要 11 分钟。
文章目录
OpenMP百度百科
- OpenMP Architecture Review Board牵头提出,已被广泛接受,
- 用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) [1] 。
- OpenMP支持C、C++和Fortran;
- 支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。
- OpenMp提供了对并行算法的高层的抽象描述,
- 程序员通过在源代码中加入专用的pragma来指明自己的意图,
- 编译器自动将程序并行化,并在必要之处加入同步互斥以及通信。
- 当选择忽略这些pragma,
- 或编译器不支持OpenMp时,
- 程序又可退化为通常的程序(串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
canci
OpenMP 小玩玩
OpenMP 在VS中开启!
- 如果还出错,就来这个
示例
#include#include"omp.h" using namespace std; void main(){ #pragma omp parallel{ cout << "Test" << endl;}system("pause");}
- 说明parallel后的语句被4个线程分别执行了一次,4个是程序默认的线程数,
- 可通过num_threads显式控制创建的线程数:
pragma omp parallel num_threads(6)
#include#include"omp.h" using namespace std; void main(){ #pragma omp parallel num_threads(6){ cout << "Test" << endl;}system("pause");}
pragma omp parallel for num_threads(252)
#include#include"omp.h"using namespace std;void main(){ #pragma omp parallel for num_threads(252) for (int i = 0; i < 12; i++) { printf("OpenMP Test, 线程编号为: %d\n", omp_get_thread_num()); } system("pause");}
设置不同线程
#include#include"omp.h"using namespace std;void test(){ for (int i = 0; i < 80000; i++) { }}void main(){ float startTime = omp_get_wtime(); //2#pragma omp parallel for num_threads(2) for (int i = 0; i < 80000; i++) { test(); } float endTime = omp_get_wtime(); printf("指定 2 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //4#pragma omp parallel for num_threads(4) for (int i = 0; i < 80000; i++) { test(); } endTime = omp_get_wtime(); printf("指定 4 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //8#pragma omp parallel for num_threads(8) for (int i = 0; i < 80000; i++) { test(); } endTime = omp_get_wtime(); printf("指定 8 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //12#pragma omp parallel for num_threads(12) for (int i = 0; i < 80000; i++) { test(); } endTime = omp_get_wtime(); printf("指定 12 个线程,执行时间: %f\n", endTime - startTime); startTime = endTime; //不使用OpenMP for (int i = 0; i < 80000; i++) { test(); } endTime = omp_get_wtime(); printf("不使用OpenMP多线程,执行时间: %f\n", endTime - startTime); startTime = endTime; system("pause");}
OPmp牛逼的reduction
#include#include"omp.h"#include using namespace std;# define N 99999999void main(){ int FinalSum = 0; int* sum = (int *)malloc(sizeof(int)*N); for (int j = 0; j < N; j++) { sum[j] = rand()%100; } float startTime = omp_get_wtime();#pragma omp parallel for reduction(+: FinalSum) for (int i = 0; i < N; i += 1) FinalSum += sum[i]; // Reduce to a single number* printf("%d\n",FinalSum); float endTime = omp_get_wtime(); printf("并行执行时间: %f\n", endTime - startTime); FinalSum = 0; startTime = omp_get_wtime(); for (int i = 0; i < N; i += 1) FinalSum += sum[i]; // Reduce to a single number* printf("%d\n", FinalSum); endTime = omp_get_wtime(); printf("串行执行时间: %f\n", endTime - startTime);}
参考链接
OpenMP 线程同步之临界区
- 多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。
\newline
\newline- 临界区是指在用一时刻只允许一个线程执行的一段用{…},包围的代码段。
- OpenMP中临界区声明方法如下: #pragma omp critical [(name)] //[]表示名字可选 { //需要同一时刻只能有一个线程访问的代码 }
代码
#include#include int main(){ int sum = 0;#pragma omp parallel printf("Hello World!!!\n");#pragma omp parallel for for (int i = 0; i < 10000; ++i) { #pragma omp critical { sum = sum + i%7; } } printf("Sum: %d\n" ,sum); return 0;}
-
按道理是可以用g++ a.cpp -o a -fopenmp
-
生成的,但是我失败了
-
我用VS吧!!
-
结果是
-
若将某行注释掉,执行结果中的Sum基本就是不确定的。
- 的确不确定了哈。
转载地址:https://cyj666.blog.csdn.net/article/details/103213090 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月14日 14时07分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue面试题四
2019-04-30
菜鸟笔记十:选择器
2019-04-30
菜鸟笔记十一:flex布局
2019-04-30
Mybatis动态sql拼接多个like模糊查询
2019-04-30
mybatisplus的按需自动注入
2019-04-30
LeetCode 19.删除链表的倒数第 N 个结点
2019-04-30
多线程 思维导图
2019-04-30
常用类介绍 思维导图
2019-04-30
Vector子类
2019-04-30
set集合
2019-04-30
HashSet集合
2019-04-30
TreeSet集合
2019-04-30
TreeSet比较器
2019-04-30
集合的迭代输出
2019-04-30
Map接口
2019-04-30
TreeMap集合
2019-04-30
pecl安装PHP swoole扩展遇到的问题
2019-04-30
SEO人员,为什么要关注新型SEO技术?
2019-04-30
SEO人员,为什么要思考网站安全重要性?
2019-04-30
SEO人员,怎么将网站关键词排进SERP前十名?
2019-04-30