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

  • VS2017中OpenMP配置
  • 计算π的串行程序
  • 计算π的并行程序
    • 1.并行域并行化
    • 2.共享任务结构并行化
    • 3.private字句和critical制导语句并行化
    • 4.并行规约并行化
  • 四种并行程序整合在一个project里

最近并行计算课要做一份实验报告,挺有意思的,特写篇博客记录一下。

VS2017中OpenMP配置

参考之前的博客:https://blog.csdn.net/chao_ji_cai/article/details/89431622

计算π的串行程序

/* serial code */
static long num_steps = 100000;
double step;
void main()
{int i;double x, pi, sum = 0.0;step = 1.0/(double)num_steps;for(i=0; i<=num_steps; i++){x = (i-0.5)*step;sum = sum+4.0/(1.0+x*x);}pi = step*sum;
}

计算π的并行程序

1.并行域并行化

#include "pch.h"
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
int main ()
{ int i;double x, pi, sum[NUM_THREADS];step = 1.0/(double) num_steps;omp_set_num_threads(NUM_THREADS);  #pragma omp parallel private(i)  //并行域开始,每个线程(0和1)都会执行该代码
{double x;int id;id = omp_get_thread_num();for (i=id, sum[id]=0.0;i< num_steps; i=i+NUM_THREADS){x = (i+0.5)*step;sum[id] += 4.0/(1.0+x*x);}
}for(i=0, pi=0.0;i<NUM_THREADS;i++)  pi += sum[i] * step;printf("pi is approximately:%.16lf\n",pi);}

2.共享任务结构并行化

#include "pch.h"
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
int main ()
{ int i;double x, pi, sum[NUM_THREADS];step = 1.0/(double) num_steps;omp_set_num_threads(NUM_THREADS);  //设置2线程#pragma omp parallel  //并行域开始,每个线程(0和1)都会执行该代码
{double x;int id;id = omp_get_thread_num();sum[id]=0;
#pragma omp for  //未指定chunk,迭代平均分配给各线程(0和1),连续划分for (i=0;i< num_steps; i++){x = (i+0.5)*step;sum[id] += 4.0/(1.0+x*x);}
}for(i=0, pi=0.0;i<NUM_THREADS;i++)  pi += sum[i] * step;printf("pi is approximately:%.16lf\n",pi);
}//共2个线程参加计算,其中线程0进行迭代步0~49999,线程1进行迭代步50000~99999.

3.private字句和critical制导语句并行化

#include "pch.h"
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
int main ()
{ int i;double pi=0.0;double sum=0.0;double x=0.0;step = 1.0/(double) num_steps;omp_set_num_threads(NUM_THREADS);  //设置2线程
#pragma omp parallel private(x,sum,id) //该子句表示x,sum变量对于每个线程是私有的(!!!注意id要设为私有变量)
{int id;id = omp_get_thread_num();for (i=id, sum=0.0;i< num_steps; i=i+NUM_THREADS){x = (i+0.5)*step;sum += 4.0/(1.0+x*x);}
#pragma omp critical  //指定代码段在同一时刻只能由一个线程进行执行pi += sum*step;
}printf("pi is approximately:%.16lf\n",pi);
}   //共2个线程参加计算,其中线程0进行迭代步0,2,4,...线程1进行迭代步1,3,5,....当被指定为critical的代码段  正在被0线程执行时,1线程的执行也到达该代码段,则它将被阻塞知道0线程退出临界区。
}

4.并行规约并行化

#include "pch.h"
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
int main ()
{ int i;double pi=0.0;double sum=0.0;double x=0.0;step = 1.0/(double) num_steps;omp_set_num_threads(NUM_THREADS);  //设置2线程
#pragma omp parallel for reduction(+:sum) private(x) //每个线程保留一份私有拷贝sum,x为线程私有,最后对线程中所以sum进行+规约,并更新sum的全局值for(i=1;i<= num_steps; i++){x = (i-0.5)*step;sum += 4.0/(1.0+x*x);}pi = sum * step;printf("pi is approximately:%.16lf\n",pi);
}   //共2个线程参加计算,其中线程0进行迭代步0~49999,线程1进行迭代步50000~99999.

四种并行程序整合在一个project里

有些重名变量需要重命名

#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2int main()
{int i;double pi = 0.0;double sum = 0.0;double x = 0.0;step = 1.0 / (double)num_steps;omp_set_num_threads(NUM_THREADS);  //1.--------------------------------------------------------->并行规约  reduction
#pragma omp parallel for reduction(+:sum) private(x) for (i = 1; i <= num_steps; i++) {x = (i - 0.5)*step;sum += 4.0 / (1.0 + x * x);}pi = sum * step;printf("并行规约 pi :%.16lf\n ", pi);//2.--------------------------------------------->private子句和critical部分并行化double pi1 = 0.0;int id;
#pragma omp parallel private(x,sum,id) //注意id要设为私有变量{id = omp_get_thread_num();for (i = id, sum = 0.0; i < num_steps; i = i + NUM_THREADS) {x = (i + 0.5)*step;sum += 4.0 / (1.0 + x * x);}
#pragma omp critical  //指定代码段在同一时刻只能由一个线程进行执行pi1 += sum * step;}printf("private子句和critical部分并行化 pi :%.16lf\n", pi1);//3.---------------------------------------------------------->共享任务结构并行化double pi2 = 0.0;double sum1[NUM_THREADS];
# pragma omp parallel private(i,x) shared(sum){int id = omp_get_thread_num();sum1[id] = 0;
# pragma omp forfor (i = 0; i < num_steps; i++){x = (i + 0.5)*step;sum1[id] += 4.0 / (1.0 + x * x);}}for (i = 0, pi = 0; i < NUM_THREADS; i++)pi2 += sum1[i] * step;printf("共享任务结构并行化 pi :%.16lf\n", pi2);//4.--------------------------------------------------------------->并行域并行化double pi3 = 0.0;double sum2[NUM_THREADS];
#pragma omp parallel private(i)  {double x;int id;id = omp_get_thread_num();for (i = id, sum2[id] = 0.0; i < num_steps; i = i + NUM_THREADS) {x = (i + 0.5)*step;sum2[id] += 4.0 / (1.0 + x * x);}}for (i = 0, pi3 = 0.0; i < NUM_THREADS; i++)  pi3 += sum2[i] * step;printf("并行域并行化 pi :%.16lf\n", pi3);
}

运行结果:

四种并行程序参考博客:https://blog.csdn.net/rectsuly/article/details/69788860

并行:四种C+OpenMP计算π的并行程序相关推荐

  1. 四种物联网卡计算模式

    从物联网卡从业人员的视角看来,三天两头看见对换算更为可用和分布式架构的需求.当逐渐将物联网卡与OT和IT系统软件融合时,亟待解决的第一个难题是机器设备发送至网络服务器的巨大信息量. 在一个加工厂智能化 ...

  2. 阶乘的计算java_java中四种阶乘的计算

    package com.zf.s2;//创建一个包 import java.math.BigInteger;//导入类 import java.util.ArrayList; import java. ...

  3. 图片向量相似检索服务(2)——四种基本距离计算原理

    余弦距离(Cosine distance) 余弦相似度原理 用向量空间中的两个向量夹角的余弦值作为衡量两个个体间差异大小的度量,值越接近1,就说明夹角角度越接近0°,也就是两个向量越相似,就叫做余弦相 ...

  4. 四种代码洁癖类型,程序员看了直呼内行(文末经典书送)

    很多程序员在写代码的时候 都有自己的独特的习惯 比较典型的就是"代码洁癖" 我收集了一些代码洁癖症状 分了四个类型 来看看有没有你对应的吧 一.极简断舍离型 二.距离产生美型 三. ...

  5. 四种代码洁癖类型,程序员看了直呼内行

    很多程序员在写代码的时候 都有自己的独特的习惯 比较典型的就是"代码洁癖" 他二哥收集了一些代码洁癖症状 分了四个类型 来看看有没有你对应的吧 看到大家都如此极致的追求, 他二哥实 ...

  6. 某金融产品妹纸:四种姿势教你跪舔程序员不要不要的

    我 是一个妹纸 是一位互联网金融产品的产品经理 谈起跟程序员哥哥死磕的经历 我先征求了一下朋友们意见 结果 ...... 难道程序员和产品经理真的到了只能互相砍杀的地步了吗?在工作中,我遇到了几种不同 ...

  7. STM32F103四种方法实现的LED闪灯程序

    本程序为点亮两个LED,分别为LED1和LED2,分别连接到几口GPIOB的0脚和1脚. 因此首先对GPIOB的0脚和1脚机型初始化. 先创建LED的驱动程序, LED.H和 LED.C LED.H ...

  8. 由浅入深CIL系列:5.抛砖引玉:判断string是否为空的四种方法的CIL代码看看效率如何?...

      本节将接触几个新的CIL操作码如下 ldc.i4.0    将整数值 0 作为 int32 推送到计算堆栈上 Ceq         比较两个值.如果这两个值相等,则将整数值 1 (int32) ...

  9. 四种方法求最大公约数

    一.题目分析 实验题目:运行最大公约数的常用算法,并进行程序的调式与测试,要求程序设计风格良好,并添加异常处理模块(如输入非法等). 分析:运用四种算法分别计算最大公约数,并选择手动输入数据验证算法正 ...

最新文章

  1. Nagios+Cacti+Nconf配置
  2. 网络工程计算机文科可以报考么,文科生可报考自考本科网络工程吗?
  3. PTA浙大版python程序设计题目集--第2章-4 特殊a串数列求和 (20 分)
  4. java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
  5. 【软件构造】第一章 软件构造基础(1)
  6. windows下dos窗口实现持续ping显示时间保存至日志
  7. cookie可存的最大限制_cookie、localStorage、sessionStorage、
  8. 如何解决Silverlight跨域访问安全性问题
  9. sql server的标识种子列
  10. 关于U盘病毒autorun.inf更改文件夹属性为系统文件夹并隐藏文件夹
  11. qq输入法自定义短语并在手机qq输入法使用
  12. C#检查网络是否连接的方法
  13. The server time zone value ‘锟叫癸拷锟斤拷\u05FC时锟斤拷‘ is unrecognized or represents more than one time zone
  14. 写作分册王诚pdf_后王诚时代|老铁们,管综写作还能跟谁?
  15. 未能解析主引用“Fiddler”,因为它是针对“.NETFramework,Version=v4.6.1”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.5
  16. 05 CSS从原理到熟练 - 1
  17. k8s pod基础概念
  18. 华为模拟器eNSP基本命令
  19. 角度,弧度,三角函数
  20. Fireworks切图视频教程

热门文章

  1. 恒生电子实习记录-10
  2. 恒生电子面试过程纪录
  3. 计算机网络基础之计算机网络
  4. Java面向对象01:什么是面向对象
  5. 【FPGA】串口以命令控制温度采集
  6. Marlin:Preprocessing zkSNARKs with Universal and Updatable SRS学习笔记
  7. iOS开发--开源库
  8. antd3.x版本table使用fixed错位问题修复
  9. Exemplar-based image inpainting(+code)
  10. 关于18位身份证号码最后一位计算(Java实现)