本系列文章均为个人学习笔记

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并行计算】计算π相关推荐

  1. 并行:四种C+OpenMP计算π的并行程序

    四种C+OpenMP计算π的并行程序 VS2017中OpenMP配置 计算π的串行程序 计算π的并行程序 1.并行域并行化 2.共享任务结构并行化 3.private字句和critical制导语句并行 ...

  2. ++ 多核cpu 并行_一文读懂什么是多核并行计算(三)

    导读:面向应用工程师的商业软件咨询.自研软件定制开发服务的仿真公众号,点击关注进入菜单,查看更多精彩内容. (三)如何实现多核并行计算呢? 了解了多核.多Machine.多Rack后,我可以看一下软件 ...

  3. OpenCV算法加速(1)OpenMP/PPL/TTB基础知识

    一.提高OpenCV的运算速度,有以下几种方法: 1.利用x86转为x64提速,可以提高1倍的速度 2.多线程的openmp或Intel TBB提速,将cpu的利用率从20%多提高到100% 3.利用 ...

  4. OpenMP相关文章收藏学习

    BLOG 关于生产者消费者问题的OpenMP实现 https://blog.csdn.net/zhangjt33/article/details/81165253 简介:关于生产者消费者问题的Open ...

  5. maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...

    前言: 原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代,但是maya中mll插件的插件套路在传递参数上会占用大量的io,对于数据比较大的部分也会有相当消耗.如果全部写在c++部分又感 ...

  6. 2C4T与4C4T在计算密集型任务下的效率对比

    文章目录 1. 环境 2. 代码 3. 结果 1. 环境 机器1:Intel® Core™ i5-4200H CPU @ 2.80GHz,双核四线程,win10 x64,16G内存 机器2:Intel ...

  7. GPU+VORONOI+KOKKOS+OPENMP反应力场加速

    关注 Mr.material,\color{Violet} \rm Mr.material\ ,Mr.material , 更\color{red}{更}更多\color{blue}{多}多精\col ...

  8. 卷积神经网络图像分类识别

    卷积神经网络和图像分类识别Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅 ...

  9. 卷积神经网络和图像分类识别

    Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日 原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅修改,已获作者本人授权. ...

最新文章

  1. 中国量子计算原型机 九章 问世 | AI日报
  2. ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
  3. foreach对集合的输出作用
  4. html a标签去掉下划线_让HTML元素动起来
  5. win7系统如何访问xp系统的服务器,WIN7系统怎么让XP系统访问呢
  6. 电机速度曲线规划2:S形速度曲线设计与实现
  7. 任达华遇袭是效仿“宏颜获水”事件?百度回应:严惩肇事者 以儆效尤
  8. 在Linux上进行动态注入 | LD_PRELOAD
  9. 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
  10. 自动化专业是计算机相关专业吗,自动化专业属于什么学科门类
  11. 脱硫系统中的烟气挡板门选电动型、气动型?还是电动液压型?快别纠结了……
  12. 使用python print打印函数返回值多一个None的问题探究
  13. Canonical Coin Systems
  14. 《python(廖雪峰课程)》学习笔记
  15. Python设置Latex公式中显示数学字体STIX
  16. 解决图片无法打开的问题: “Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足”
  17. 阿里天池——利用pandas分析美国总统竞选选票情况
  18. 博客与计算机相关的内容无法进行查看,博客检索的关键技术研究-计算机科学与技术专业论文.docx...
  19. MIMIC-III:MIMIC_Extract代码实例数据预处理
  20. c++中的clock()函数

热门文章

  1. 三十二楼层选几层最好_32楼层的选择几层最好 住楼房几层最好风水
  2. imprecise external abort
  3. 记一次too many open files 异常
  4. Azure Log Analytics产品API文档读后感
  5. JavaBeans技术的应用
  6. Oracle数据库网络详解
  7. 使用awk提取文本 awk处理条件 awk流程控制 awk扩展应用
  8. oracle恢复误删的表
  9. 计算机财务管理知识点,财务管理知识点梳理(财务基础必背知识点整理篇)
  10. db2 SEQUENCE