MPI编程环境配置与示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一.系统安装.......................................................... 2..
1. 下载地址........................................................
2.
2. 安装步骤........................................................ 2.
3. Visual Stdi o 设置 ................................................ 2.
二.实验程序.......................................................... 3..
1. 简单的MPI编程示例............................................. 3.
2. 消息传递MPI编程示例1 ........................................................................... 4.
3. 消息传递MPI编程示例2 ............................................................................ 5.
4. Monte Carlo方法计算圆周率...................................... 7.
5. 计算积分........................................................ .9..
三.心得体会.......................................................... 1.0
一.系统安装
1. 下载地址
FTP匿名登陆 ,在pub/mpi/nt 文件夹中
2. 安装步骤
1)在安装有MPI的计算机上要建立一个有管理员权限的账户,不可以没有密码; 2)双击exe文件,按默认设置安装MPI;
3)注册MPI账户,调用MPIRegister.exe用户名和密码即为第一步中的账户。

3. Visual Stdio设置
为避免每新建一个项目都要设置一次,可以对它进行通用设置。

打开视图-其他窗口-属性管理器,点击Debug|Wi n32目录下的
er ,在VC+阳录下的包含目录中添加MPICF的Include 路径,库目录中添加MPICH的Lib路径;在链接器-输入目录下的附加依赖项中添力卩mpich.lib 、mpe.lib、mped.lib、mpichd.lib 。

二.实验程序
1.简单的MPI编程示例
1)源代码
伺gu
TvIPIRjn
2.消息传递MPI编程示例1
1)源代码
#in elude <mpi.h>
#i nclude <stdio.h>
int main (i nt argc, char** argv)
{
int myid, nu mprocs,source;
MPI_Status status;
char messages[100];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &n umprocs);
MPI_Comm_ra nk(MPI_COMM_WORLD, &m yid);
if (myid != 0)
{
strcpy(messages, "Hello World!");
MPI_Se nd(messages, strle n( messages) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
}
else
{
for (source = 1; source < nu mprocs; source++)
{
MPI_Recv(messages, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD,&status);
prin tf("I am process %d I recv stri ng '%s' from process %d\n", myid, messages, source);
}
}
MPI_Fi nalize();
return 0;
}
2)运行截图
3.消息传递MPI编程示例2
1)源代码
#include <stdio.h>
#in clude <mpi.h>
#in clude<math.h>
#defi ne N 1002
int main (i nt argc, char** argv) {
int myid, nu mprocs, C = 0;
double data[N], SqrtSum=0.0;_
double d;
for (int i = 0; i < N; i++)
data[i] = i;
MPI_Status status;
MPI_I nit(&argc, & argv);_
MPI_Comm_ra nk(MPI_COMM_WORLD, &m yid);
MPI_Comm_size(MPI_COMM_WORLD, &n umprocs);
--nu mprocs;
if (myid == 0)
{
for (i nt i = 0; i < N; ++i)
MPI_Send(&data[i], 1, MPI_DOUBLE, i%numprocs + 1,1, MPI_COMM_WORLD);
for (int source = 1; source <= nu mprocs; ++source) { MPI_Recv(&d, 1, MPI_DOUBLE, source, 99,
MPI_COMM_WORLD, & status);
SqrtSum += d;
}
}
else
{
for (int i = myid; i < N; i = i + nu mprocs)
{
MPI_Recv(&d, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, & status);
SqrtSum += sqrt(d);
++C;
}
MPI_Se nd(&SqrtSum, 1, MPI_DOUBLE, 0, 99,
MPI_COMM_WORLD);
}
prin tf("I am process %d. I recv total %d from process 0, and SqrtSum=%f.\n", myid, C, SqrtSum);_
MPI_Fi nalize();_
return 0;
{ 2)运行截图
4. Mon te Carlo 方法计算圆周率
1)源代码
#i nclude "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int myid, nu mprocs;
int source;
long count = 1000000;
MPI_Status status;
MPI 」nit(&argc, &argv);
MPI_Comm_ra nk(MPI_COMM_WORLD, &m yid);
MPI_Comm_size(MPI_COMM_WORLD, &n umprocs); sran
d(myid);
double y, x, pi = 0.0, n = count;
long m = 0, m1 = 0, i = 0, p = 0;
for (i = 0; i<co unt; i++) : d JI prpces =
4+ I tQtal : 3 JI process
£ I recv total : 日JI process
2. I recv 丁 cm procca? 0, 1 77亡匸¥ tctal - BJl pro 匚i ■旨吕
1. 1 TECV total QLiiM-IRLjn 回 E LL . AdvujCtd NlLlit«T Of
25C pr?c C ?S O J ar^d SqrtSun-5278- 2T3265+ 衍〔from process 口 and ScirtSuii=53TO, 581309, E5〔 fr^r process 0. ar:1 WqrtSUn=F?&g. 737055. 0 frm 「txuke 0; find 5町廿1皿=21 W 斗囲FIFJF,
^□1 f rot nrn .- J and Sqi"tSmi=£265,日B3S5E File Edit View Help
A»niicati< E :^VorkSpacc^gsdisxftriubivPcb^npiLabi.
[
uijtttii
x = (double)ra nd() / (double)RAND_MAX;
y = (double)ra nd() / (double)RAND_MAX;
if ((x - 0.5)*(x - 0.5) + (y - 0.5)*(y - 0.5)<0.25)
++m;
}
pi = 4.0*m / n;
prin tf("Process %d of % pi = %f\n", myid, nu mprocs, pi);
if (myid != 0)
{
MPI_Se nd(&m, 1, MPI_DOUBLE, 0, 1,
MPI_COMM_WORLD);
}
else
{
p = m;
for (source = 1; source <nu mprocs; source++)
{
MPI_Recv(&m1, 1, MPI_DOUBLE, source, 1, MPI_COMM_WORLD, & status);
p = p + m1;
}
prin tf("pi = %f\n", 4.0*p / (n*nu mprocs));
}
MPI_Fi nalize();
return 0;
}
2)运行截图
5.计算积分
1)源代码
#defi ne N 100000000
#defi ne a 0
#defi ne b 10
#include <stdio.h>
#include <stdlib.h>
#in clude <time.h>
#include "mpi.h"
int main (i nt argc, char** argv)
{
int myid, nu mprocs;
int i; _
double local = 0.0, dx = ((double)b - (double)a) / (double)N; double in te, x;
MPI_I nit(&argc, & argv);_
MPI_Comm_ra nk(MPI_COMM_WORLD, &m yid);_
MPI_Comm_size(MPI_COMM_WORLD, &n umprocs);
for (i = myid; i<N; i = i + nu mprocs)
{
x = a + i*dx + dx / 2;
local += x*x*dx;
}
MPI_Reduce(&local, &inte, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);_
if (myid == 0)
{
prin tf("The in tegal of x*x in regio n [ %d,%d] =%16.15f\n", a, b, in te);
}
MPI_Fi nalize();
return 0;
}
2)运行截图
三•心得体会
1. 学习了MPICH的安装、注册。

用户名和密码为装有MPI、的计算机的账号名
和密码(注册时密码不能为空),
2. 学会执行MPI程序——基于图形界面的guiMPIRun
3. 通过PPT上的程序,真正了解了什么是并行实验程序,并自己实现和观察了并
行程序执行的过程,对并行程序设计有了进一步的了解。

相关文档
最新文档