MPI并行字符串搜索实验报告
- 格式:doc
- 大小:451.00 KB
- 文档页数:19
并行计算_实验三_简单的MPI并行程序及性能分析一、实验背景和目的MPI(Massive Parallel Interface,大规模并行接口)是一种用于进行并行计算的通信协议和编程模型。
它可以使不同进程在分布式计算机集群上进行通信和协同工作,实现并行计算的目的。
本实验将设计和实现一个简单的MPI并行程序,并通过性能分析来评估其并行计算的效果。
二、实验内容1.设计一个简单的MPI并行程序,并解决以下问题:a.将一个矩阵A进行分块存储,并将其均匀分配给不同的进程;b.将每个进程分别计算所分配的矩阵块的平均值,并将结果发送给主进程;c.主进程将收到的结果汇总计算出矩阵A的平均值。
2.运行该MPI程序,并记录下执行时间。
3.对程序的性能进行分析:a.利用不同规模的输入数据进行测试,观察程序的运行时间与输入规模的关系;b. 使用mpiexec命令调整进程数量,观察程序的运行时间与进程数量的关系。
三、实验步骤1.程序设计和实现:a.设计一个函数用于生成输入数据-矩阵A;b.编写MPI并行程序的代码,实现矩阵块的分配和计算;c.编写主函数,调用MPI相应函数,实现进程间的通信和数据汇总计算。
2.编译和运行程序:a.使用MPI编译器将MPI并行程序编译成可执行文件;b.在集群上运行程序,并记录下执行时间。
3.性能分析:a.对不同规模的输入数据运行程序,记录下不同规模下的运行时间;b. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间。
四、实验结果和分析执行实验后得到的结果:1.对不同规模的输入数据运行程序,记录下不同规模下的运行时间,得到如下结果:输入规模运行时间100x1002.345s200x2005.678s300x30011.234s...从结果可以看出,随着输入规模的增加,程序的运行时间也相应增加。
2. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间,得到如下结果:进程数量运行时间110.345s26.789s43.456s...从结果可以看出,随着进程数量的增加,程序的运行时间逐渐减少,但当进程数量超过一定限制后,进一步增加进程数量将不再显著减少运行时间。
并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用OpenMP编程的基本方法和MPI的编程方法,通过实践实现的基本程序,掌握基本的线程及进程级并行应用开发技术,能够分析并行性能瓶颈及相应优化方法。
二、实验环境Linux操作系统,mpi库,多核处理器三、实验设计与实现(一)MPI并行程序设计用MPI编写一个greeting程序,编号为0的进程接受其它各进程的“问候”,并在计算机屏幕上显示问候情况。
用MPI编写一个多进程求积分的程序,并通过积分的方法求π的值,结果与π的25位精确值比较。
(二)多线程程序设计用Pthreads或OpenMP编写通过积分的方法求π的程序。
把该程序与相应的MPI程序比较。
用Pthreads或OpenMP编写编写矩阵相乘的程序,观察矩阵增大以及线程个数增减时的情形。
四、实验环境安装(一)MPI环境安装1.安装kylin操作系统的虚拟机(用VirtualBox)2.安装增强功能,使之与windows主机能够文件共享。
3.拷贝mpich-3.0.4.tar.gz到/root/myworkspace/目录下,并解压(tar xzf mpich-3.0.4.tar.gz)4.下面开始安装mkdir /root/myworkspace/mpi./configure --prefix=/root/myworkspace/mpi --disable-f77 --disable-fcmakemake install5.配置环境变量打开/root/.bashrc文件,在文件的末尾加上两行:PATH=$PATH:/root/myworkspace/mpi/binexport PATH保存退出,然后执行命令source /root/.bashrc(二)openMP实验环境安装Visual Studio中修改:项目->属性->c/c++->语言,将“OpenMP支持”改成“是”:五、实验结果及分析(一)MPI并行程序设计实验一:问候发送与接收非零号进程将问候的信息发送给0号进程,0号进程依次接收其它进程发送过来的消息并将其输出。
华南师范大学实验报告学生姓名学 号专 业计算机科学与技术年级、班级课程名称并行计算实验项目快速排序的并行算法实验时间 2011 年 6 月 10 日实验类型实验指导老师实验评分3.1实验目的与要求1.熟悉快速排序的串行算法2.熟悉快速排序的并行算法3.实现快速排序的并行算法3.2 实验环境及软件单台或联网的多台PC机, Linux操作系统, MPI系统。
3.3实验内容1.快速排序的基本思想2.单处理机上快速排序算法3.快速排序算法的性能4.快速排序算法并行化5.描述了使用2m个处理器完成对n个输入数据排序的并行算法。
6.在最优的情况下并行算法形成一个高度为logn的排序树7、完成快速排序的并行实现的流程图8、完成快速排序的并行算法的实现3.4实验步骤3.4.1.快速排序(Quick Sort)是一种最基本的排序算法, 它的基本思想是: 在当前无序区R[1, n]中取一个记录作为比较的“基准”(一般取第一个、最后一个或中间位置的元素), 用此基准将当前的无序区R[1, n]划分成左右两个无序的子区R[1, i-1]和R[i, n](1≤i≤n), 且左边的无序子区中记录的所有关键字均小于等于基准的关键字, 右边的无序子区中记录的所有关键字均大于等于基准的关键字;当R[1, i-1]和R[i, n]非空时, 分别对它们重复上述的划分过程, 直到所有的无序子区中的记录均排好序为止。
3.4.2.单处理机上快速排序算法输入: 无序数组data[1,n]输出: 有序数组data[1,n]Begincall procedure quicksort(data,1,n)Endprocedure quicksort(data,i,j)Begin(1) if (i<j) then(1.1)r = partition(data,i,j)(1.2)quicksort(data,i,r-1);(1.3)quicksort(data,r+1,j);end ifEndprocedure partition(data,k,l)Begin(1) pivo=data[l](2) i=k-1(3) for j=k to l-1 doif data[j]≤pivo theni=i+1exchange data[i] and data[j]end ifend for(4) exchange data[i+1] and data[l](5) return i+1End3.4.3.快速排序算法的性能主要决定于输入数组的划分是否均衡, 而这与基准元素的选择密切相关。
本实验要求学生搭建并行环境并运行计算π的程序实验目的本实验的目的是为了让学生了解并行计算的概念和基本原理,掌握搭建并行环境的方法,以及能够编写并行程序并在并行环境中运行。
实验要求硬件要求本实验要求使用至少两台计算机,并能够通过网络进行连接。
建议使用至少4台计算机,以便更好地体现并行计算的效果。
软件要求本实验需要使用MPI(Message Passing Interface)并行编程库和编译器。
建议使用C语言进行编程。
实验步骤1.搭建并行环境首先,需要将所有计算机连接到同一个网络中,并且保证能够互相通信。
接着,需要安装MPI软件,并按照MPI的要求进行配置。
2.编写并行程序本实验要求使用MPI编写程序来计算π的值。
在编写程序之前,需要了解如何将一个计算任务分割成多个子任务,并且如何让不同的计算机并行地执行这些子任务。
程序的具体实现方式可以参考MPI的官方文档。
3.编译程序将编写好的程序进行编译,并生成可执行文件。
4.运行程序在并行环境中运行程序,观察实验结果。
实验结果通过本实验,学生可以了解并行计算的概念和基本原理,熟悉MPI库的使用方法,并且能够搭建并行环境并运行并行程序。
此外,学生还可以通过实验结果来比较串行计算和并行计算在计算π方面的效率区别,从而更好地理解并行计算的优势和应用场景。
实验总结通过本实验,学生可以逐步了解并行计算的概念和基本原理,掌握搭建并行环境,编写并行程序的方法,能够使用MPI库进行程序开发。
本实验的设计旨在让学生在实践中深入理解并行计算的概念和原理,并为今后进行高效的计算科学研究打下坚实的基础。
MPI综合实验报告目前三次MPI实验已经结束,结合之前所写的实验报告,对总体的实验容做一个总结。
参考资料:MPI简介多线程是一种便捷的模型,其中每个线程都可以访问其它线程的存储空间。
因此,这种模型只能在共享存储系统之间移植。
一般来讲,并行机不一定在各处理器之间共享存储,当面向非共享存储系统开发并行程序时,程序的各部分之间通过来回传递消息的方式通信。
要使得消息传递方式可移植,就需要采用标准的消息传递库。
这就促成的消息传递接口(Message Passing Interface, MPI)的面世,MPI是一种被广泛采用的消息传递标准[1]。
与OpenMP并行程序不同,MPI是一种基于消息传递的并行编程技术。
消息传递接口是一种编程接口标准,而不是一种具体的编程语言。
简而言之,MPI标准定义了一组具有可移植性的编程接口。
各个厂商或组织遵循这些标准实现自己的MPI软件包,典型的实现包括开放源代码的MPICH、LAM MPI以及不开放源代码的Intel MPI。
由于MPI提供了统一的编程接口,程序员只需要设计好并行算法,使用相应的MPI库就可以实现基于消息传递的并行计算。
MPI支持多种操作系统,包括大多数的类UNIX和Windows系统。
三次实验总结第一次实验:实验要求:配置好MPI运行的基本环境,测试MPI的基本通信程序。
程序:#include "stdafx.h"#include <mpi.h>void main( void ){MPI_Status status;charstring[]="xxxxx";int myid;MPI_Init(NULL,NULL);MPI_Comm_rank(MPI_COMM_WORLD,&myid);if(myid==2)MPI_Send("HELLO",5,MPI_CHAR,7,1234,MPI_COMM_WORLD);if(myid==7){MPI_Recv(string,5,MPI_CHAR,2,MPI_ANY_TAG,MPI_COMM_WORLD,&status); printf("Got%s from P%d,tag%d\n",string,status,status.MPI_SOURCE,status.MPI_TAG);}MPI_Finalize();}运行环境配置过程:(这个是在根据网上的环境配置教程做的)1、安装软件MPICH2,本次操作安装在C:\Program Files\MPICH2文件夹中。
并行程序实验报告( 一).并行程序的简介。
MPI(Message Passing Interface)是目前最重要的一种并行编程工具和环境,几乎所有重要的并行计算机厂商都提供对它的支持,MPI将功能、高效和移植性三个重要而又有一定矛盾的方面很好地融为一体,这是MPI能够取得成功的重要原因。
SIMD/MIMD并行计算机:指令和数据是计算机解决问题所涉及到的两个基本方面,即让计算机"执行什么"样的操作和对"什么对象"执行相应的操作,虽然现在计算机有了很大的发展,但他们仍然有重要的地位和作用,这也是为什么指令数据的划分方式至今仍在使用的重要原因。
不管是同时执行多条指令,还是同时处理多个数据,具有这样功能的计算机都可以称为并行计算机。
根据一个并行计算机能够同时执行的指令与处理数据的多少,可以把并行计算机分为SIMD (Single-Instruction Multiple-Data)单指令多数据并行计算机和MIMD(Multiple-Instruction Multiple-Data)多指令多数据并行计算机。
举例说明SIMD计算机的功能SIMD计算机同时用相同的指令对不同的数据进行操作,比如对于数组赋值运算A=A+1在SIMD并行机上可以用加法指令同时对数组A的所有元素实现加1。
即数组(或向量)运算特别适合在SIMD并行计算机上执行,SIMD并行机可以对这种运算形式进行直接地支持,高效地实现。
举例说明MIMD计算机的功能MIMD计算机同时有多条指令对不同的数据进行操作,比如对于算术表达式A=B+C+D-E+F*G可以转换为A=(B+C)+(D-E)+(F*G)加法(B+C),减法(D-E),乘法(F*G)如果有相应的直接执行部件,则这三个不同的计算可以同时进行。
SPMD/MPMD并行计算机SIMD和MIMD这种表达方法虽然至今还在广泛使用,但是,随着新的并行计算机组织方式的产生,比照上面的划分方法,人们按同时执行的程序和数据的不同,又提出了SPMD(Single-Program Multuple-Data)单程序多数据并行计算机和MPMD(Multiple-Program Multiple-Data)多程序多数据并行计算机的概念。
并行计算实验报告(高性能计算与网格技术)高性能计算和网格技术实验报告实验题目OpenMP和MPI编程姓名学号专业计算机系统结构指导教师助教所在学院计算机科学与工程学院论文提交日期一、实验目的本实验的目的是通过练习掌握OpenMP 和MPI 并行编程的知识和技巧。
1、熟悉OpenMP 和MPI 编程环境和工具的使用;2、掌握并行程序编写的基本步骤;3、了解并行程序调试和调优的技巧。
二、实验要求1、独立完成实验内容;2、了解并行算法的设计基础;3、熟悉OpenMP和MPI的编程环境以及运行环境;4、理解不同线程数,进程数对于加速比的影响。
三、实验内容3.1、矩阵LU分解算法的设计:参考文档sy6.doc所使用的并行算法:在LU分解的过程中,主要的计算是利用主行i对其余各行j,(j>i)作初等行变换,各行计算之间没有数据相关关系,因此可以对矩阵A 按行划分来实现并行计算。
考虑到在计算过程中处理器之间的负载均衡,对A采用行交叉划分:设处理器个数为p,矩阵A的阶数为n,??p=,对矩阵A行交叉划分后,编号为i(i=0,1,…,p-1)的处理器存有m/nA的第i, i+p,…, i+(m-1)p行。
然后依次以第0,1,…,n-1行作为主行,将其广播给所有处理器,各处理器利用主行对其部分行向量做行变换,这实际上是各处理器轮流选出主行并广播。
若以编号为my_rank 的处理器的第i行元素作为主行,并将它广播给所有处理器,则编号大于等于my_rank的处理器利用主行元素对其第i+1,…,m-1行数据做行变换,其它处理器利用主行元素对其第i,…,m-1行数据做行变换。
根据上述算法原理用代码表示如下(关键代码):for(k = 0;k<n;k++)< p="">{for (i = 0; i < THREADS_NUM; i++) {thread_data_arrray[i].thread_id = i;thread_data_arrray[i].K_number = k;thread_data_arrray[i].chushu = a[k][k];//创建线程rc = pthread_create(&pid[i], NULL, work,(void*)&thread_data_arrray[i]);…}for (i = 0; i < THREADS_NUM; i++){//等待线程同步rc = pthread_join(pid[i], &ret); …}}void *work(void *arg){struct thread_data *my_data;my_data = (struct thread_data*)arg;int myid = my_data->thread_id; //线程IDint myk = my_data->K_number; //外层循环计数Kfloat mychushu = my_data->chushu; //对角线的值int s, e;int i, j;s = (N-myk-1) * myid / THREADS_NUM; //确定起始循环的行数的相对位置e = (N-myk-1) * (myid + 1) / THREADS_NUM;//确定终止循环的行数的相对位置for (i = s+myk+1; i < e+myk+1; i++) //由于矩阵规模在缩小,找到偏移位置 { a[i][myk]=a[i][myk]/mychushu; for (j = myk+1; j < N; j++) a[i][j]=a[i][j]-a[i][myk]*a[myk][j]; }//printMatrix(a); return NULL;}第一部分为入口函数,其创建指定的线程数,并根据不同的线程id 按行划分矩阵,将矩阵的不同部分作为参数传递给线程,在多处理器电脑上,不同的线程并行执行,实现并行计算LU 分解。
实验名称:并行处理技术在图像识别中的应用实验目的:1. 了解并行处理技术的基本原理和应用场景。
2. 掌握并行计算环境搭建和编程技巧。
3. 分析并行处理技术在图像识别任务中的性能提升。
实验时间:2023年10月15日-2023年10月25日实验设备:1. 主机:****************************,16GB RAM2. 显卡:NVIDIA GeForce RTX 2080 Ti3. 操作系统:Windows 10 Professional4. 并行计算软件:OpenMP,MPI实验内容:本实验主要分为三个部分:1. 并行计算环境搭建2. 图像识别任务并行化3. 性能分析和比较一、并行计算环境搭建1. 安装OpenMP和MPI库:首先在主机上安装OpenMP和MPI库,以便在编程过程中调用并行计算功能。
2. 编写并行程序框架:使用C++编写一个并行程序框架,包括并行计算函数和主函数。
3. 编译程序:使用g++编译器编译程序,并添加OpenMP和MPI库的相关编译选项。
二、图像识别任务并行化1. 数据预处理:将原始图像数据转换为适合并行处理的格式,例如将图像分割成多个子图像。
2. 图像识别算法:选择一个图像识别算法,如SVM(支持向量机)或CNN(卷积神经网络),并将其并行化。
3. 并行计算实现:使用OpenMP或MPI库将图像识别算法的各个步骤并行化,例如将图像分割、特征提取、分类等步骤分配给不同的线程或进程。
三、性能分析和比较1. 实验数据:使用一组标准图像数据集进行实验,例如MNIST手写数字识别数据集。
2. 性能指标:比较串行和并行处理在图像识别任务中的运行时间、准确率等性能指标。
3. 结果分析:分析并行处理在图像识别任务中的性能提升,并探讨影响性能的因素。
实验结果:1. 并行处理在图像识别任务中显著提升了运行时间,尤其是在大规模数据集上。
2. 并行处理对准确率的影响较小,甚至略有提升。
并行程序设计实验一:运行MPI程序第一项:准备工作1、安装MPICH2下载MPICh2软件包,对已经下载好的mpich2-1.4.1p1-win-ia32进行安装2、新建用户密码开始——控制面板——用户账户和家庭安全——添加或删除用户账户——创建一个新账户——输入用户名(选择用户类型为“管理员”)——创建用户然后再创建密码。
如下图所示(若已经存在管理员,可使用原来的管理员账号和密码)这个用户名和密码就是我们测试时需要用的。
3、注册开始——所有程序——mpich2——wmpiregister如下图,这个就是刚才注册的用户和密码。
输入后点击Register——OK。
就会出现一行字,成功注册。
4、测试mpich2开始——所有程序——mpich2——wmpiconfig.exe——scan hosts这时左侧会出现绿色,说明成功了。
5、vc++6中的设置打开vc,工具——options——Directories——include files添加你刚刚安装的mpich2中include文件,如图所示然后在show directories for的下拉菜单中选择library files,同样添加lib文件。
要想运行成功,程序中也是要作些改动的。
第二项:测试程序通过测试以下MPI程序,可知系统运行成功。
1、MPI程序运行及结果分析程序1:输出Hello parallel world!。
程序源代码如下:程序运行无错后,build——组建,没有错误。
在debug文件夹中找到生成的exe文件,运行wmpiexec.exe文件。
程序运行结果:实验数据说明:本程序选择了5个进程,每个进程输出一句Hello parallel world!。
程序2:类似程序1,显示本次执行需要的进程数程序源代码如下:程序运行结果:程序运行数据说明:选择了5个进程,用变量num标识,标号从0-4,用变量rk标识。
程序3:消息传递功能,用MPI_Send()和MPI_Recv()两个函数实现进程之间数据的发送和接收,本程序实现的功能:实现其他进程像0进程发送消息,0进程负责从其他进程接收消息并输出。
MPI 并行设计程序实验报告:MPI 简介对MPI 的定义是多种多样的,但不外乎下面四个方面,它们限定了MPI 的内涵和外延:1、MPI是一个库,而不是一门语言。
许多人认为,MPI就是一种并行语言,这是不准确的。
但是,按照并行语言的分类,可以把FORTRAN+M或C+M P看作是一种在原来串行语言基础之上扩展后得到的,并行语言MPI库可以被FORTRAN77/C/Fortran90/C++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别;2、MPI 是一种标准或规范的代表,而不特指某一个对它的具体实现,迄今为止,所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI 在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行;3、MPI 是一种消息传递编程模型,并成为这种编程模型的代表。
事实上,标准MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的;4、MPI是多点接口(Multi Poi nt In terface)的简称,是西门子公司开发的用于PLC之间通讯的保密的协议。
MPI通讯是当通信速率要求不高、通信数据量不大时,可以采用的一种简单经济的通讯方式。
MPI 通信可使用PLC S7-200/300/400 、操作面板TP/OP 及上位机MP l/PROFIBUS通信卡,女口CP 5512/C P5611/C P5613等进行数据交换。
MPI网络的通信速率为19.2Kbps~12Mbps最多可以连接32个节点,最大通讯距离为50m但是可能通过中断器来扩展长度。
:实验目的通过把几台电脑并行联立起来,共同去运行一个并行程序。
三:实验过程(1)虚拟机安装,可以选择VMware和VirtualPC,从网上可以下载(2) 基于虚拟机,配置多机网络环境(3) 安装MPICH从CBL网站下载,(4) 在虚拟上安装VC6.0(5) 并行程序设计(6) 编写实验报告实验步骤:1. 在每台电脑中创建一个用户iSii :虞来»锻闰计》机« 口甸哪円 起悔酣*協助的離戶K 名功阿InttrMi 槍Jiffi 警的 ffl 于启动逬轻仲J®用起厚的讣jSsOLOibumc SQLDtb^c^r ^SUF?DE1_J Cjt^Htustvfl Corpoif«2. 设置一个共享文件]二[新建丈件夹3. 在VC 中运行程序Xes»□碰)ff 勃匸二I~1'.11 WI IIUJIIB^h I MFiCHi[十J TDD0;lOAD[_「J share5ftfAdairtiiT ■^h41.pJbit I.^TUSajQMIOTl ^TTJdl_pXZDOIInt4TT*t 来3M 户 B 动rn ig4t 殊户Ihit vin aeeowi ii iL»d "b, 谨* -亍裤Ira 支勇的!I 廣.■晤H *. I .注■■严« ・P. IIMFHFH't»W4fW. <wbi wbi. |1. ■ e,ii・甲砂・■ bw..If, .“■4・ViH R IwLri r »h ■ ■■I耳1PH |・—H ■阳■■袖■ WU* W外■刪"I**.-1 t iM«d ■ i乂EfH**4.运行程序放入share中5.关闭防火墙翎能撥--------- !糜用!厂JJ 'm?™T Farr.ilT, . j6.然后映射网络驱动器,将两台pc机联机H F M r K 匡^IPt ;S ■二庄'■< 鼻.|I■^■■K* *^E=ijd=Kt□逅QJ I 耳成]| [ 取消I7.在程序中打开mpich的工具Ji WFICH”角Jumpih&t ►■1』Mil rb a管理工具►雇iBpdVser gui deMPICH Confi duration, toolWriCH Job m uiag;erMPICH Update toolMriHunriLteriLet Esjlarer□u.tl&«k Exp rsEiMindEE Media Flajner 8.工具配置■FICB ConfitraraticmH "厂 n ■ J:.i I 「\ ; . ! ;「r irJjc bftiftd eflaredoutput 卜二 ; Io 若口a i^la J ■口-Ltg I wi Ascl^i. s-LLopt IoiiimL c. Lc 匚■!nttwofk driv* n 丸pp 」坞 ot 『?_th* miTrfiTi 十 nircmb 由r 苧四:实验总结趣,在以后的学习中,我会更加努力的学习关于计算机的知识。
MPI并行字符串搜索实验报告学院(部):软件学院专业班级:软件工程2011学生姓名:席晶晶学号: 114712026指导教师:胡志刚2011年12月11日一、实验目的1、了解MPI并行程序的概念和原理2、并行集群的搭建,创建并行程序的模拟运行环境3、实现字符串并行搜索二、实验原理1、并行集群的搭建,形成并行开发环境2、通过建共享文档,完成各PC机间资源的共享3、通过安装MPIch12,runMPI程序时,可将运行分为多个进程,实现多台PC机同时运行该程序,达到高效的目的。
三、实验步骤和内容第一步:建立用户。
在待安装MPI的计算机上都要建立一个用户,比如,本次实验在两台机器上建立一个叫205用户,密码是205,这个帐户必须拥有管理员权限。
同在C盘建立一个temp文件夹,用来放程序编译后的执行文件。
图3-1 创建205账户第二步:安装MPI。
双击“mpich.nt.1.2.5.exe”,一切按照默认的设置。
在每台运行MPI程序的机器上安装MPICH。
第三步:注册MPI帐户。
调用MPI自带的MPIRegister.exe程序进行帐户的注册。
本次实验:在每台机器上建立名称为205的帐户,密码为205。
注册帐户的界面如下:图3-2 注册205账户第四步:配置MPI。
在多台计算机上运行,需运行“MPICH Configuration tool”,通过“Add”和“Select”按钮添加所有要参与并行计算的计算机,并“Apply”确认。
为防止连接其他计算机发生错误,必要时关闭本机的防火墙。
图3-3 配置MPI第五步:VC环境的配置:打开VC++,在[工具]—[选项]里将MPICH NT 的相关目录加进Include 和Lib 搜索路径当中。
图3-4 VC环境的配置第六步:并行程序编写:程序描述:本次程序实现并行字符串搜索,程序的原理是:首先随即产生一个100*100的二维字符串数组,然后随即按四个方向(上、下、左、右)插入一条字符串“xijingjing”,即表示二维字符数组存在有效价值,通过并行查找(即用KMP字符串匹配算法),即不同进程查找不一样的方向,同时查找,实现程序并行。
标志位:flag 1表示右2表示左3表示下4表示上,flag是根据字符串“xijingjing”首字母插入的位置决定的。
下面标记为9个区域,每个区域只能有对应标记的方向。
例子:1号区域(x<9&&y<9)方向只能是右和下。
新建一个项目,在工程打开之后,打开[项目]—[设置]菜单,在“Link”页面中加入“mpich.lib”和“mpe.lib”。
图3-7 共享目录C:\\temp程序实现之后编译,找到项目文件中的debug文件夹中,找到“bingxing.exe”,并行的机器都要拷贝此文件到创建的共享目录“C:\\temp”目录下。
第六步:运行并行程序:运行如下图的 MPIRun,,找到C:\\temp下的可执行文件,选择进程数2,选择两台机器。
图3-8 共享目录C:\\tempRun程序就ok了。
实现了多进程运行程序,实现结果如下:图3-9 运行结果四、实验结果观察CPU使用以及pf的使用率。
图4-1 单机运行结果图4-2 并行运行结果可知CPU明显负载更小了,实现了高效率并行程序的运行五、实验总结掌握了并行开发环境的搭建,通过实验可知将程序分为多进程运行能极大的提高运行效率,减轻CPU的负载。
同时通过运行MPI程序掌握基本的并行程序的开发和运行。
附1:代码;附2:运行结果附1:代码#include <stdio.h>#include "mpi.h"#include <stdlib.h>#include <time.h>#include <string.h>//print a integer arrayvoid pnt(int a[], int n){int i;for(i = 0; i < n; ++i) printf("%d ", a[i]);printf("\n");}//calculate the next arrayvoid makenext(const char* ptrn, int *next){int len = strlen(ptrn);next[0] = 0;next[1] = 0;int i = 1;while(i < len - 1){int j = next[i];while(j > 0 && ptrn[j] != ptrn[i]) j = next[j];if(ptrn[j] == ptrn[i]) next[i + 1] = j + 1;else next[i + 1] = j;i++;}//pnt(next, len);}//KMP算法int indexofsubstr(const char* str, const char* ptrn){int lenstr = strlen(str);int lenptrn = strlen(ptrn);int next[1024]; //假设模式串的长度不超过1024makenext(ptrn, next);int i = 0, j = 0;while(i < lenstr && j < lenptrn){if(str[i] == ptrn[j]){i++,j++;}else{j = next[j];// if j euqals zero, increase i by 1. Otherwize, there may be a infinite loop!if(j == 0) i++;}if(j == lenptrn) return i - j; //match successfully, return the index }return -1;}int getRand13(int x){//获得1 3随即方向int flag=0;switch(rand()%x+1){case 1: flag=1; break;case 2: flag=3; break;default:printf("ERROR");}return flag;}int getRand134(int x){//获得1 3 4 三个随即方向int flag=0;switch(rand()%x+1){case 1: flag=1; break;case 2: flag=3; break;case 3: flag=4; break;default:printf("ERROR");}return flag;}int getRand14(int x){switch(rand()%x+1){case 1: flag=1; break;case 2: flag=4; break;default:printf("ERROR");}return flag;}int getRand124(int x){int flag=0;switch(rand()%x+1){case 1: flag=1; break;case 2: flag=2; break;case 3: flag=4; break;default:printf("ERROR");}return flag;}int getRand24(int x){int flag=0;switch(rand()%x+1){case 1: flag=2; break;case 2: flag=4; break;default:printf("ERROR");}}int getFlag(int x,int y){ //1右2 ←3下4上int flag=0;if(x<9){if(y<9){flag = getRand13(2);}if(y>=9&&y<=90){flag =rand()%3+1;}if(y>90){flag = rand()%2+2;}}if(x>=9&&x<=90){if(y<9){flag = getRand134(3);}if(y>=9&&y<=90){flag =rand()%4+1;}if(y>90){flag = rand()%3+2;}}if(x>90){if(y<9){flag = getRand14(2);}if(y>=9&&y<=90){flag =getRand124(3);}if(y>90){flag =getRand24(2);}}return flag;}void insert(char martrix[100][100],int x,int y,char *p,int flag){ int k=0;int m=0;if(flag==1){//→m=0;for(k=y;k<10+y;k++){martrix[x][k]=p[m++];}}else if(flag==2){//←有问题m=0;for(k=y;k>y-10;k--){martrix[x][k]=p[m++];}}else if(flag==3){//↓m=0;for(k=x;k<10+x;k++){martrix[k][y]=p[m++];}}else if(flag==4){//↑有问题m=0;for(k=x;k>x-10;k--){martrix[k][y]=p[m++];}}}void getHorizonal(char matrix[100][100],int myid,char *p,char *p1){ int i,j;for(i=0;i<100;i++){char temp[100];for(j=0;j<100;j++){temp[j]=matrix[i][j];}if(indexofsubstr(temp, p)!=-1){printf("Process%d找到的字符串起始位置在x=%d,y=%d",myid,i,indexofsubstr(temp, p));printf("方向向→\n\n");}if(indexofsubstr(temp, p1)!=-1){printf("Process%d找到的字符串起始位置在x=%d,y=%d",myid,i,indexofsubstr(temp, p1)+9);printf("方向向←\n\n");}}}void getVertical(char matrix[100][100],int myid,char *p,char *p1){int i,j;for(i=0;i<100;i++){char temp[100];for(j=0;j<100;j++){temp[j]=matrix[j][i];}if(indexofsubstr(temp, p)!=-1){printf("Process%d找到的字符串起始位置在x=%d,y=%d",myid,indexofsubstr(temp, p),i);printf("方向向↓\n\n");}if(indexofsubstr(temp, p1)!=-1){printf("Process%d找到的字符串起始位置在x=%d,y=%d",myid,indexofsubstr(temp, p1)+9,i);printf("方向向↑\n\n");}}}int main(int argc, char* argv[]){int myid, numprocs;int i=0;int j=0;double startime,endtime,startime1,endtime1;startime=startime1=endtime=endtime1=0;char *p="xijingjing";char *p1="gnijgnijix";char matrix[100][100];// srand(time(0));//srand()函数产生一个以当前时间开始的随机种子for(i=0;i<100;i++){for(j=0;j<100;j++){matrix[i][j]=(char)(rand()%26+97);}}int x=rand()%100; int y=rand()%100;//随即插入的x、y下标//获得插入位置的方向int flag=getFlag(x,y);printf("正在将“xijingjing”随即插入二位数组中。