【openMP并行计算】计算π
本系列文章均为个人学习笔记
Linux环境对OpenMP的支持:
在Linux上编译和运行OpenMP程序
编译OpenMP程序: gcc -fopenmp a.c
运行OpenMP程序: ./a.out
1. 串行计算π
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000000;
double step;
int main ()
{int i;double x, pi, sum = 0.0;double start_time, run_time;step = 1.0/(double) num_steps;start_time = omp_get_wtime();for (i=1;i<= num_steps; i++){x = (i-0.5)*step;sum = sum + 4.0/(1.0+x*x);}pi = step * sum;run_time = omp_get_wtime() - start_time;printf("\n pi with %ld steps is %lf in %lf seconds\n ",num_steps,pi,run_time);
}
结果:
2. 使用并行域并行化的程序:
#include <stdio.h>
#include <omp.h>#define MAX_THREADS 4static long num_steps = 100000000;
double step;
int main ()
{int i,j;double pi, full_sum = 0.0;double start_time, run_time;double sum[MAX_THREADS];step = 1.0/(double) num_steps;for (j=1;j<=MAX_THREADS ;j++) {omp_set_num_threads(j);full_sum=0.0;start_time = omp_get_wtime();#pragma omp parallel //并行域开始,每个线程(0和1)都会执行该代码{int i;int id = omp_get_thread_num();int numthreads = omp_get_num_threads();double x;sum[id] = 0.0;if (id == 0) //保证只有一个线程输出IDprintf(" num_threads = %d",numthreads);for (i=id;i< num_steps; i+=numthreads){x = (i+0.5)*step;sum[id] = sum[id] + 4.0/(1.0+x*x);}}for(full_sum = 0.0, i=0;i<j;i++){full_sum += sum[i];}pi = step * full_sum;run_time = omp_get_wtime() - start_time;printf("\n pi is %f in %f seconds %d thrds \n",pi,run_time,j);}
}
//共4个线程参加计算,其中线程0进行迭代步0,4,...线程1进行迭代步1,5,....
结果:
我们发现使用并行计算结果耗时更多,因为 False sharing。(自行百度)
3.private字句和critical制导语句并行化:
#include <stdio.h>
#include <omp.h>#define MAX_THREADS 4static long num_steps = 100000000;
double step;
int main ()
{int i,j;double pi, full_sum = 0.0;double start_time, run_time;double sum[MAX_THREADS];step = 1.0/(double) num_steps;for(j = 1; j <= MAX_THREADS; j++){omp_set_num_threads(j);full_sum = 0.0;start_time = omp_get_wtime();#pragma omp parallel private(i) //该子句表示 i 变量对于每个线程是私有的{int id = omp_get_thread_num();int numthreads = omp_get_num_threads();double x;double partial_sum = 0;#pragma omp single //作用和上一份代码一样,保证只有一个线程输出IDprintf(" num_threads = %d",numthreads);for (i = id; i < num_steps; i += numthreads){x = (i+0.5)*step;partial_sum += + 4.0/(1.0+x*x);}#pragma omp critical //指定代码段在同一时刻只能由一个线程进行执行full_sum += partial_sum;}pi = step * full_sum;run_time = omp_get_wtime() - start_time;printf("\n pi is %f in %f seconds %d threds \n ",pi,run_time,j);}
}
//共4个线程参加计算,其中线程0进行迭代步0,4....,线程1进行迭代步1,5....
结果;
速度明显快了很多!
4.并行规约并行化:
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000000;
double step;
int main ()
{int i;double x, pi, sum = 0.0;double start_time, run_time;step = 1.0/(double) num_steps;for (i = 1; i <= 4; i++){sum = 0.0;omp_set_num_threads(i);start_time = omp_get_wtime();#pragma omp parallel
{#pragma omp single printf(" num_threads = %d",omp_get_num_threads());#pragma omp for reduction(+:sum) //每个线程保留一份私有拷贝sum,最后对线程中所以sum进行+规约,并更新sum的全局值for (i=1;i<= num_steps; i++){x = (i-0.5)*step;sum = sum + 4.0/(1.0+x*x);}
}pi = step * sum;run_time = omp_get_wtime() - start_time;printf("\n pi is %f in %f seconds and %d threads\n",pi,run_time,i);}
}
//共4个线程参加计算,其中线程0进行迭代步0~24999,线程1进行迭代步24999~50000.
结果:
速度一般般
【openMP并行计算】计算π相关推荐
- 并行:四种C+OpenMP计算π的并行程序
四种C+OpenMP计算π的并行程序 VS2017中OpenMP配置 计算π的串行程序 计算π的并行程序 1.并行域并行化 2.共享任务结构并行化 3.private字句和critical制导语句并行 ...
- ++ 多核cpu 并行_一文读懂什么是多核并行计算(三)
导读:面向应用工程师的商业软件咨询.自研软件定制开发服务的仿真公众号,点击关注进入菜单,查看更多精彩内容. (三)如何实现多核并行计算呢? 了解了多核.多Machine.多Rack后,我可以看一下软件 ...
- OpenCV算法加速(1)OpenMP/PPL/TTB基础知识
一.提高OpenCV的运算速度,有以下几种方法: 1.利用x86转为x64提速,可以提高1倍的速度 2.多线程的openmp或Intel TBB提速,将cpu的利用率从20%多提高到100% 3.利用 ...
- OpenMP相关文章收藏学习
BLOG 关于生产者消费者问题的OpenMP实现 https://blog.csdn.net/zhangjt33/article/details/81165253 简介:关于生产者消费者问题的Open ...
- maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...
前言: 原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代,但是maya中mll插件的插件套路在传递参数上会占用大量的io,对于数据比较大的部分也会有相当消耗.如果全部写在c++部分又感 ...
- 2C4T与4C4T在计算密集型任务下的效率对比
文章目录 1. 环境 2. 代码 3. 结果 1. 环境 机器1:Intel® Core™ i5-4200H CPU @ 2.80GHz,双核四线程,win10 x64,16G内存 机器2:Intel ...
- GPU+VORONOI+KOKKOS+OPENMP反应力场加速
关注 Mr.material,\color{Violet} \rm Mr.material\ ,Mr.material , 更\color{red}{更}更多\color{blue}{多}多精\col ...
- 卷积神经网络图像分类识别
卷积神经网络和图像分类识别Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅 ...
- 卷积神经网络和图像分类识别
Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日 原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅修改,已获作者本人授权. ...
最新文章
- 中国量子计算原型机 九章 问世 | AI日报
- ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
- foreach对集合的输出作用
- html a标签去掉下划线_让HTML元素动起来
- win7系统如何访问xp系统的服务器,WIN7系统怎么让XP系统访问呢
- 电机速度曲线规划2:S形速度曲线设计与实现
- 任达华遇袭是效仿“宏颜获水”事件?百度回应:严惩肇事者 以儆效尤
- 在Linux上进行动态注入 | LD_PRELOAD
- 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
- 自动化专业是计算机相关专业吗,自动化专业属于什么学科门类
- 脱硫系统中的烟气挡板门选电动型、气动型?还是电动液压型?快别纠结了……
- 使用python print打印函数返回值多一个None的问题探究
- Canonical Coin Systems
- 《python(廖雪峰课程)》学习笔记
- Python设置Latex公式中显示数学字体STIX
- 解决图片无法打开的问题: “Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足”
- 阿里天池——利用pandas分析美国总统竞选选票情况
- 博客与计算机相关的内容无法进行查看,博客检索的关键技术研究-计算机科学与技术专业论文.docx...
- MIMIC-III:MIMIC_Extract代码实例数据预处理
- c++中的clock()函数