【并行计算】OpenMP编程和MPI编程简单教程


OpenMP、MPI
Visual Studio Code
author:zoxiii


参考书籍:并行计算:结构·算法·编程_陈国良

前提:安装gcc

gcc安装步骤

  • Visual Studio Code

一、OpenMP

1、介绍

OpenMP基于共享内存的。

2、实现一个例子

  1. 写代码文件test.c
//*用OpenMP(C语言)编写的Hello World 程序代码段*//
#include"stdio.h"
#include"omp.h"
 
void main()
{
	int nthreads,tid;
	char buf[32];
	/*生成一个线程组*/
	#pragma omp parallel private(nthreads,tid)
	{
		/*获得并输出线程ID*/
		tid=omp_get_thread_num();
		printf("Hello World from OpenMP thread %d\n",tid);
		/*只有主线程做这些*/
		if(tid==0)
		{
			nthreads=omp_get_num_threads();
			printf("Number of threads id %d\n",nthreads);
		}
	}
}
  1. 打开Visual Studio Code的终端框(cmd),进入代码所在的文件夹
E:
cd E:\Project_All_Apps\OpenMP

在这里插入图片描述

  1. 使用OpenMP编译
## 编译
gcc -fopenmp -o test test.c
## 运行
./test.exe

在这里插入图片描述

二、MPI

0、安装

下载地址
在这里插入图片描述
在这里插入图片描述

安装 MPI Setup

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装 MPI SDK

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装两个文件后,打开cmd窗口,输入set MSMPI可以看到安装路径,如果有如下输出,表示已经安装成功。
在这里插入图片描述

1、介绍

MPI是基于消息传递的。

2、实现一个例子

  1. 写代码文件testmpi.c
//*计算Π的MPI(C语言)程序代码段*//
#define N 100
#include"mpi.h"  /*MPI头函数,提供了MPI函数和数据类型的定义*/
#include<stdio.h>
#include<math.h>
int main(int argc,char **argv)
{
    double local=0,pi,w,temp;
    int i,rank,size;
    w=1.0/N;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank != 0){
        printf("precess rank is %d\n",rank);
    }
    for(i=rank;i<N;i=i+size)
    {
        temp=(i+0.5)*w;
        local=4.0/(1.0+temp*temp)+local;
    }
    MPI_Reduce(&local, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
    if(rank==0)
        printf("pi is %f\n",pi*w);
    MPI_Finalize();
    return 0;
}
  1. 打开Visual Studio Code的终端框(cmd),进入代码所在的文件夹
    在这里插入图片描述
  2. 使用MPI编译
## 编译
gcc -I"D:\Program Files (x86)\Microsoft SDKs\MPI\Include" -o MPI testmpi.c "D:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64\msmpi.lib" 
## 运行
mpiexec -n 12 MPI.exe   # -n 12 代表使用12线程

在这里插入图片描述

OpenMP是一种应用于共享内存多处理器计算机的API,它通过编译器指令、库函数和环境变量支持多语言的多线程并行编程。在Python中,可以通过安装并使用支持OpenMP的C/C++扩展来实现并行计算,因为Python本身并不直接支持OpenMP。一个常用的方法是使用numpy这样的库,它背后可能使用了支持OpenMP的C/C++代码。 为了使用OpenMP并行求解π,你需要确保你的环境支持OpenMP,并安装了能够利用OpenMP进行并行计算的Python库。以下是一个利用OpenMP并行计算π的Python示例代码,它使用了numpy库来实现蒙特卡洛方法: ```python import numpy as np def compute_pi(n_samples, n_threads): # 使用numpy生成随机样本 x = np.random.uniform(-1, 1, n_samples) y = np.random.uniform(-1, 1, n_samples) # 计算落在单位圆内的点的个数 inside_circle = np.sum(x*x + y*y <= 1) # 利用蒙特卡洛方法计算π的近似值 pi_estimate = 4 * inside_circle / n_samples return pi_estimate if __name__ == "__main__": import os import multiprocessing # 设置OpenMP的线程数 os.environ["OMP_NUM_THREADS"] = "8" # 你可以根据自己的处理器核心数设置这个值 # 求解精度 precision = 1e-6 # 初始样本数量 n_samples = 10000 # 计算π的近似值 pi = compute_pi(n_samples, 8) # 检查精度是否满足要求 while abs((pi * 4) - np.pi) > precision: n_samples *= 2 # 增加样本数量以提高精度 pi = compute_pi(n_samples, 8) print(f"计算得到的π值为: {pi}") print(f"与真实值的差异为: {abs((pi * 4) - np.pi)}") ``` 这段代码首先定义了一个计算π的函数`compute_pi`,它使用蒙特卡洛方法来估算π值。在主函数中,我们设置了OpenMP的线程数环境变量`OMP_NUM_THREADS`,然后不断增加样本数量来提高π值的精度,直到达到所需的精度小于`1e-6`为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoxiii

越打赏越生长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值