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