文章目录
- 一. 选在Linux,Ubuntu或者Windows上搭建mpi环境
- First of all
- What’s more
- 二、VS配置mpi
- 三、计算pi值
- (1)基础编译环境的构建
- (2)MPICH安装
- (3)第一个mpi程序:pi值计算
搭建MPI并行计算环境,利用计算pi 的公式,计算pi 值,多线程数量n分别使用
100、1000、10000计算结果。
以下是具体安装流程和实验结果分析,分析n值对pi精度的影响,并行进程的个数对计算速度的影响。
一. 选在Linux,Ubuntu或者Windows上搭建mpi环境
以下是windows环境搭建,Ubuntu方式在第三点
First of all
安装visual studio
官网下载 地址:https://visualstudio.microsoft.com/zh-hans/vs/
下完后,双击exe文件。选择必要的工具
然后等待安装好即可
中间有错误的话可以参考官方纠错文档https://docs.microsoft.com/zh-cn/troubleshoot/visualstudio/general/visual-studio-2022-unsupported-operating-systems
PS:linux或者不使用VS的人可以到https://www.open-mpi.org/software/ompi/v4.1/下载对应的mpich版本,就不用VS了
What’s more
开始安装mpi了:https://www.microsoft.com/en-us/download/details.aspx?id=57467
运行下图两个文件
这样mpi就安装完成(上图仅是SDK,mpi图一样就没放)
二、VS配置mpi
参考http://t.zoukankan.com/CheeseIce-p-10626345.html
三、计算pi值
官网的VS C++ HelloWord 计算器应用https://docs.microsoft.com/zh-cn/cpp/get-started/tutorial-console-cpp?view=msvc-160 PS:可以先看看这个再去计算PI值哦、
以下采用Ubuntu方法
(1)基础编译环境的构建
为了正常编译MPI代码,需要安装C, C++与Fortran的编译环境。
Ubuntu缺省情况下,并没有提供这些语言的编译环境,因此需要手动安装。如果单独安装这些编译环境非常麻烦。幸运的是,build-essential工具提供了许多与编译相关的软件包,包括gcc/g++/gfortran等编译器、libc6-dev等必要的库与其他工具。于是,我们只需要通过包管理器安装build-essential即可。
apt-get命令的 -y 选项默认安装过程中同意所有的默认选择。
sudo apt-get install -y build-essential
下载与安装完成后,可键入下面的命令观察gcc版本信息。
gcc -v
(2)MPICH安装
软件包中包含了mpich,可以直接通过apt-get下载安装。
sudo apt-get install -y mpich
观察mpicc版本信息
mpicc -v
(3)第一个mpi程序:pi值计算
切换到用户家目录
cd ~
利用vim新建一份代码文件
vim mpi.c
vim进入后默认为控制模式。需要按字母i进入编辑模式,写入MPI程序代码。
#include<mpi.h>
#include<stdio.h>
#include<math.h>
#pragma comment(lib,"mpi.lib")
#define N1 100
#define N2 1000
#define N3 10000 //n分别使用**100、1000、10000**计算结果
void PI(int N){
double local = 0, pi, w, temp;
int i, rank, size,k;
w = 1.0 / N;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Status status;
double t1, t2;
t1 = MPI_Wtime();
for (i = rank; i < N; i = i + size)
{
temp = (i + 0.5)*w;
local = 4.0 / (1.0 + temp*temp) + local;
}
if ((rank!=0))
MPI_Send(&local, 1, MPI_DOUBLE, 0, rank, MPI_COMM_WORLD);
if (rank == 0)
for (i = 1; i < size;i++)
{
MPI_Recv(&temp, 1, MPI_DOUBLE,i, i, MPI_COMM_WORLD, &status);
local += temp;
}
if (rank == 0)
pi = local;
t2 = MPI_Wtime();
//t = t2 - t1;
if (rank == 0)
{
printf("pi is %lf\n", pi*w);
switch(N){
case 100: printf("n = 100, time is %lf\n", t2-t1);break;
case 1000: printf("n = 1000, time is %lf\n", t2-t1);break;
case 10000: printf("n = 10000, time is %lf\n", t2-t1);break;
}
}
MPI_Finalize();
}
int main(int argc, char **argv)
{
int i;
MPI_Init(&argc, &argv);
PI(N1);
return 0;
}
按esc键进入控制模式,输入:wq保存并退出文件。
利用 mpicc 命令编译MPI代码文件。mpicc 是编译并链接用C编写的MPI程序的命令。
mpicc pi.c -o pi.o
利用 mpirun 命令运行程序。其中 -np 选项指定处理器数目。mpirun 是MPI程序的启动脚本,它可以简化作业的启动程序,并且尽可能把不同特征屏蔽掉,提供给用户一个通用的MPI并行机的概念。
mpirun -np 8 ./pi.o
改为N2=1000再运行
N3=10000