首页 > 编程语言 >2024.4.10 OpenMP和MPI编程

2024.4.10 OpenMP和MPI编程

时间:2024-04-10 17:11:40浏览次数:29  
标签:10 2024.4 int sum MPI num steps 计算 OpenMP

OpenMP和MPI编程

OpenMP主要是在单机上进行并行,是基于共享内存的,共享内存就是多个核(包括单CPU多核和多CPU多核(都是单机))共享一个内存,只要是单台计算机都可以认为是共享内存,MP代表多线程的意思(Multi-Processing),其无法进行跨节点运算,并且OpenMP的库是默认集成在g++或者gcc里的;OpenMP在底层实现会链接Pthread库。
MPI则是用来进行多处理器,跨节点并行,OpenMPI是基于分布式内存,对于多台计算机组成的集群就是属于分布式内存。其中MPI是消息传递接口的意思(Message Passing Interface),OpenMPI也可以在单机上进行运行,但是由于其不同的核心之间的数据不是共享的,需要进行通信,因此速度不如OpenMP,常见的并行化策略是,在跨节点上采用OpenMPI编程,而在每个计算节点上采用OpenMP编程。

windows中,vscode格式化代码快捷键是“shift+alt+f”;
在mac中,vscode格式化代码快捷键是“shift+option+f”;
在ubuntu中,vscode格式化代码快捷键是“ctrl+shift+I”

计算PI

c/c++中计算PI:https://blog.csdn.net/wangnaisheng/article/details/135867160
c中利用公式计算PI:https://blog.csdn.net/AN_drew/article/details/131340999

利用莱布尼茨公式积分计算PI:

$f(x)=ax+b$

$\pi = arccos(-1) = 2arcsin(1) = 4arctan(1)$

double x, pi, sum = 0.0;   
  int num_steps=1000000;
  double step = 1.0 / (double)num_steps;   
  for (int i = 0; i< num_steps; i++)
  {      
   x = (i + 0.5)*step;      
   sum = sum + 4.0 / (1.0 + x*x);  
  }   
  pi = step * sum;

OpenMP下计算PI


分析:

#include <stdio.h>:包含标准输入输出库,用于执行I/O操作,例如printf。
#include <omp.h>:包含OpenMP库,这个头文件是必须的,以便使用OpenMP的功能。
static long num_steps = 100000000;:定义了一个静态长整型变量num_steps,设置为1亿,这个变量表示分割的矩形数量,也即迭代次数。
double step;:定义一个双精度浮点变量step,它将用于存储每个矩形的宽度。
int main():主函数的开始。
int i;:定义一个整型变量i用于循环迭代。
double x, pi, sum = 0.0;:定义三个双精度浮点变量,x用于计算中间结果,pi用于存储计算出的π值,sum初始化为0,用于累加每个矩形的面积。
step = 1.0 / (double)num_steps;:计算每个矩形的宽度,即(1 / num_steps)。
#pragma omp parallel for reduction(+:sum) private(x):这是一个OpenMP指令,用于并行化随后的for循环。
reduction(+:sum):这是一个归约子句,它指示OpenMP为每个线程创建sum的本地副本,并在所有线程完成它们的计算后,将这些本地副本的值相加,更新到原始的sum变量中。
private(x):这是一个私有子句,它指示每个线程应有其自己的x变量副本,防止不同线程间的数据竞争。
for (i = 0; i < num_steps; i++):一个循环,从0开始到num_steps,每次迭代都会计算函数的一个矩形区域面积并累加到sum。
x = (i + 0.5) * step;:计算当前矩形的中点的x值。
sum += 4.0 / (1.0 + x*x);:计算当前矩形的面积(根据π的积分公式),并累加到sum。
pi = step * sum;:所有矩形的面积加起来乘以宽度,得到对π的估计值。
printf("pi = %f\n", pi);:输出计算得到的π的值。
return 0;:主函数返回。
整个程序是一个并行化的数值积分计算,用于估算π的值。通过将计算任务分散到多个处理器核心,OpenMP能够显著提高计算的速度。这个特定的计算利用了Leibniz公式来估算π的值,该公式定义了π/4与一个无穷级数的关系。在这个程序中,积分区间是[0,1],并且函数是4/(1+x^2)。

在OpenMP伪共享下计算PI

解决伪共享后计算PI

对openmp中collapse子句的说明

#include <omp.h>
#include <stdio.h>

#define N 100
#define M 100

int main() {
    double A[N][M];
    // 初始化数组
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            A[i][j] = i + j;
        }
    }

    #pragma omp parallel for collapse(2)
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            A[i][j] = A[i][j] * 2.0; // 一个简单的操作,每个元素乘以2
        }
    }

    // 输出结果的简单验证
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("A[%d][%d] = %f\n", i, j, A[i][j]);
        }
    }

    return 0;
}

标签:10,2024.4,int,sum,MPI,num,steps,计算,OpenMP
From: https://www.cnblogs.com/jibinghu/p/18126444

相关文章

  • vmware安装银河麒麟V10系统宿主机断电异常关机银河麒麟开机报错
    现象:vmware安装银河麒麟V10系统,宿主机异常关机开启银河麒麟系统进入如上图,输入正确root密码还提示不正确解决办法:重新开启银河麒麟系统时,会有两个内核选择,选择下面那个内容,进入如上图,输入root密码后就可以进行root账户了,后续执行修复命令第一步:xfs-repair-v-L/dev/dm-0 ......
  • 解决Windows10 无法在PPT中插入MP4视频的问题
    今天拿到一个PPT无法播放里面的视频内容,这个PPT在其它电脑上都可以正常播放,但在我的电脑上无法播放。尝试删除PPT里面的视频重新插入原来的视频文件,PPT提示:"尝试安装最新版本的AppleQuickTime播放器"下载了最新版本的QuickTime无法正常安装,安装中途安装程序就回滚了,提示找......
  • Error: error:0308010C:digital envelope routines::unsupported
    Error:error:0308010C:digitalenveloperoutines::unsupported 一、问题现象在使用npmrundev命令运行vue工程时,报错如下:“Error:error:0308010C:digitalenveloperoutines::unsupported” 二、解决方案除了降低Node版本的方式,还可以通过如下方式解决该问题......
  • :error=>"Elasticsearch Unreachable: [http://192.168.100.44:9200/][Manticore::Soc
    [2024-04-10T14:02:09,005][WARN][logstash.outputs.elasticsearch]AttemptedtoresurrectconnectiontodeadESinstance,butgotanerror.{:url=>"http://192.168.100.44:9200/",:error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool......
  • 4 10总结
    原来,使用axios发送请求的内容写在组件内,但重复形式很多,故把这些重复的形式封装到js中,封装为函数形式(参数),并暴露给外部,但由于请求服务器获取数据是比加载页面慢的,故需要同步等待,在axios前加上await,但使用await需要放在余部函数中,故在function前加上async,然后是把同步等待的结......
  • 2024-04-10:用go语言,考虑一个非负整数数组 A, 如果数组中相邻元素之和为完全平方数,我们
    2024-04-10:用go语言,考虑一个非负整数数组A,如果数组中相邻元素之和为完全平方数,我们称这个数组是正方形数组。现在要计算A的正方形排列的数量。两个排列A1和A2被认为是不同的,如果存在至少一个索引i,满足A1[i]!=A2[i]。输入:[1,17,8]。输出:2。答案2024-04-10:来自左......
  • Python 一骑绝尘,Go 进入 TOP 10 | TIOBE 3 月榜单发布
    近日,3月TIOBE编程语言榜单已最新出炉,一起来看看本月有什么值得关注的新变化吧!1、Python可谓“一骑绝尘”与前几个月相比,本月的Python可谓“一骑绝尘”——哪怕与第二名的C语言(11.17%)比较,其市场份额(15.63%)都领先了近4.5%。得益于过去一年AI热潮席卷全球,被许多人......
  • Counter 1000
    Froma1000Hzclock,derivea1Hzsignal,calledOneHertz,thatcouldbeusedtodriveanEnablesignalforasetofhour/minute/secondcounterstocreateadigitalwallclock.Sincewewanttheclocktocountoncepersecond,theOneHertzsignalmustb......
  • 20240410每日一题题解
    20240410每日一题题解Problem一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第\(n\)天早上起来一看,只剩下\(1\)个桃子了。请问小猴买了几个桃子?输入一个正整数\(n\),表示天数。输出小猴买了多......
  • 10个极简Python代码
    1、列表重复元素判定以下方法可以检查给定列表是不是存在重复元素,它会使用set()函数来移除所有重复元素。2、字符元素组成判定检查两个字符串的组成元素是不是一样的。3、内存占用4、字节占用下面的代码块可以检查字符串占用的字节数。5、打印N次字符串该......