一、实验目的及要求
熟悉MPI编程环境,掌握MPI编程基本函数及MPI的相关通信函数用法,掌握MPI的主从模式及对等模式编程;
熟悉OpenMP编程环境,初步掌握基于OpenMP的多线程应用程序开发,掌握OpenMP相关函数以及数据作用域机制、多线程同步机制等。 二、实验设备(环境)及要求
Microsoft Visual Studio .net 2005 MPICH2
Windows 7 32位
Intel Core2 Duo T5550 1.83GHz 双核CPU 2GB内存 三、实验内容与步骤
1. 配置实验环境
http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads 处下载MPICH2,并安装。
将安装目录中的bin目录添加到系统环境变量path中。
以管理员身份运行cmd.exe,输入命令smpd -install -phrase ***。***为安装时提示输入的passphrase。
运行wmpiregister.exe,输入具有系统管理员权限的用户名及密码,进行注册。 配置vs2005,加入MPICH2的包含文件,引用文件和库文件,如下图。
配置项目属性,添加附加依赖项mpi.lib,如下图。 VS2005支持OpenMP,只需在项目属性中做如下配置。
2. 编写MPI程序
题目:一个小规模的学校想给每一个学生一个唯一的证件号。管理部门想使用6位数字,但不确定是否够用,已知一个“可接受的”证件号是有一些限制的。编写一个并行计算程序来计算不同的六位数的个数(由0-9组合的数),要求满足以下限制:
? 第一个数字不能为0;
? 两个连续位上的数字不能相同; ? 各个数字之和不能为7、11、13
代码如下。 #include \#include
#define NUM 6
#define MAX 999999 #define MIN 100000
int check(int n) {
int i, x, y, sum;
if (n < MIN) { return -1; }
sum = 0;
for (i=1; i if (sum==7 || sum==11 || sum==13) { return -1; } return 0; } void main(int argc, char **argv) { int myid, numprocs, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Status status; double startTime, endTime; int i, mycount, count; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Get_processor_name(processor_name,&namelen); if (myid == 0) { startTime = MPI_Wtime(); } mycount = 0; for (i=myid; i<=MAX; i+=numprocs) { if (check(i) == 0) { mycount++; } } printf(\%d of %d on %s get result=%d\\n\myid, numprocs, processor_name, mycount); if (myid != 0) { MPI_Send(&mycount, 1, MPI_INT, 0, myid, MPI_COMM_WORLD); } else { count = mycount; for (i=1; i MPI_Finalize(); } 计算量平均分给每个进程,每个进程将自己计算的部分结果发送给0号进程,由0号进程将结果相加,并输出。 MPI_Init函数进行MPI的初始化,MPI_Comm_size函数获得相关进程数,MPI_Comm_rank函数获得该进程在指定通信因子中的进程号,MPI_Get_processor_name获得进程名。 其他进程使用MPI_Send函数将自己计算的结果发送给0号进程,0号进程使用MPI_Recv函数接受其他进程发送来的结果。 3. 编写OpenMP程序