MPI并行编程实验报告
起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名
一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MP
D、CONF, 完成实验室中临近机器间的并行配置。概要:以寝室四台计算机为例,设置IP(1
92、1
68、1、1~1
92、1
68、1、4),更改主机名为node01,node02,node03,
node04。
(一)创建SSH信任连接
1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:1
27、0、0、1 localhost、localdomain localhost1
92、1
68、1、1 node011
92、1
68、1、2 node021
92、1
68、1、3 node031
92、1
68、1、4 node0
42、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹
3、进入、ssh目录#cd 、ssh
4、生成authorized_keys文件#cp id_rsa、pub authorized_keys
5、退出到root目录#cd 、、
6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全)
7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2-
1、0、1、tar、gz
2、创建安装目录#mkdir /usr/MPICH-instsll
3、进入mpich2解压目录#cd mpich2-
1、0、
14、设置安装目录#、/configureprefix=/usr/MPICH-
install
5、编译#make
6、安装#make install
7、退出到root目录#cd 、、8、通过编辑、bashrc文件修改环境变量#vi 、bashrc修改后的、bashrc文件如下:# 、bashrc# User specific aliases and functions alias
rm='rmi'alias mv='mvinstall/bin" 新增加的#Source global definitionsif
[nstall目录输出给其他三个结点,相应的配置步骤如下。
1、以 root 身分登录到 node1 上,确保 node1 上安装了NFS 程序 (nfs-utils 包)。首先运行一遍下述命令来开启 NFS 服务: /sbin/chkconfig nfs on /sbin/chkconfig nfslock on /etc/init、d/nfslock restart /etc/init、d/nfs restart然后编辑文件 /etc/exports,在其中加入下面二行 (如果该文件不存在则创建一个新文件): /home
10、0、0、0/2
55、2
55、2
55、248(rw,async,no_root_squash)
/usr/MPICH-install
10、0、0、0/2
55、2
55、2
55、248(rw,async,no_root_squash)做好上述修改后执行下面的命令: /sbin/exportfst nfsinstall 目录。可以在任何一个结点上用 df 命令来验证,例如: # df返回类似下面所示的结果:、、、、、、
node1:/home2486326442240284841197428095% /home
node1:/usr/MPICH-install246966888全文结束》》885603353307686% /usr/local
(四)环境测试
1、本地测试#mpd & 启动 #mpdtrace 观看启动机器
#mpdallexit 退出
2、通过mpd、hosts运行集群系统#mpdbootf mpd、hosts number为要起动的机器个数#mpdtrace #mpdallexit
3、测试运行MPICH的例子程序#mpdbootf mpd、hosts 启动4台机器#mpiexecinstall/exles/cpi number为使用的进程数
#mpdallexit二、HELLO WORLD并行程序设计
(一)程序源码:/*hello、c*/#include h>#include "mpi、h"int main( int argc, char *argv[] ){ int rank; int size; MPI_Init( 0, 0 ); MPI_m_rank(MPI_M_WORLD, &rank); MPI_m_size(MPI_M_WORLD, &size); printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0;} (二)程序编译$mpicc –o hello hello、c (三)运行结果$mpdboot –n MPI_M_WORLD,ierr) end if C 向右侧的邻居发送数据 if (myid 、lt、3) then call MPI_SEND(a(1,mysize+1),totalsize,MPI_REAL,myid+1,10,* MPI_M_WORLD,ierr) end ifC 从左侧的邻居接收数据 if (myid 、gt、 0) then call MPI_RECV(a(1,1),totalsize,MPI_REAL,myid-1,10,* MPI_M_WORLD,status,ierr) end if begin_col=2 end_col=mysize+1 if (myid 、eq、 0) then begin_col=3 endif if (myid 、eq、3) then end_col=mysize endif do j=begin_col,end_col do i=2,totalsize-1 b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25 end do end do do j=begin_col,end_col do i=2,totalsize-1 a(i,j)=b(i,j) end do end do end do do i=2,totalsize-1 print *, myid,(a(i,j),j=begin_col,end_col) end do call MPI_Finalize(rc) end捆绑发送接收 MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recv buf,recvcount,recvtype, source,recvtag,m,status) IN sendbuf IN sendcount IN sendtype IN dest IN sendtag OUT recvbuf IN recvcount IN recvtype IN source IN recvtag IN m OUT status 发送缓冲区起始地址(可选数据类型)发送数据的个数(整型) 发送数据的数据类型(句柄) 目标进程标识(整型) 发送消息标识(整型) 接收缓冲区初始地址(可选数据类型) 最大接收数据个数(整型) 接收数据的数据类型(句柄) 源进程标识(整型) 接收消息标识(整型) 通信域(句柄) 返回的状态(status) int MPI_Sendrecv(void *sendbuf, int sendcount,MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_m m, MPI_Status *status)MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, M, STATUS, IERROR) a(totalsize,mysize+2),b(totalsize,mysize+2) integer begin_col,end_col,ierr integer left,right,tag1,tag2 integer status(MPI_STATUS_SIZE) call MPI_INIT( ierr ) call MPI_M_RANK( MPI_M_WORLD, myid, ierr ) call MPI_M_SIZE( MPI_M_WORLD, numprocs, ierr ) print *, "Process ", myid, " of ", numprocs, " is alive"C 数组初始化 do j=1,mysize+2 do i=1,totalsize a(i,j)=0、0 end do end do if (myid 、eq、 0) then do i=1,totalsize a(i,2)= 8、0 end do end if if (myid 、eq、3) then do i=1,totalsize a(i,mysize+1)= 8、0 end do end if do i=1,mysize+2 a(1,i)= 8、0 a(totalsize,i)= 8、0 end do tag1=3 tag2=4C 设置当前进程左右两侧的进程标识if (myid 、gt、 0) then left=myid-1 left=MPI_PROC_NULL end if if (myid 、lt、3) then right=myid+1 else right=MPI_PROC_NULL end ifC Jacobi 迭代 do n=1,stepsC 从左向右平移数据 call MPI_SENDRECV(a(1,mysize+1),totalsize,MPI_REAL,right,tag1, * a(1,1),totalsize,MPI_REAL,left,tag1,* MPI_M_WORLD,status,ierr)C 从右向左平移数据 call MPI_SENDRECV(a(1,2),totalsize,MPI_REAL,left,tag2,* a(1,mysize+2),totalsize,MPI_REAL,right,tag2,* MPI_M_WORLD,status,ierr) begin_col=2 end_col=mysize+1 if (myid 、eq、 0) begin_col=3 endif if (myid 、eq、3) then end_col=mysize endif do j=begin_col,end_col do i=2,totalsize-1 b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25 end do end do do j=begin_col,end_col do i=2,totalsize-1 a(i,j)=b(i,j) end do end do end do do i=2,totalsize-1 print *, myid,(a(i,j),j=begin_col,end_col) end do call MPI_Finalize(rc) end实验三基于MPI计算π值Author:姓名 一、实验题目用 MPI 技术计算π的值。 二、实验目的熟悉 MPI 编程,加深对其编程的理解。 三、实验环境Windows XP SP3。 运行 MPI (一)安装 MPI第一步:下载 MPI 软件包得到文件: mpich2- 1、4、1p1-win-x86- 64、msi、 1、2、5、zip 第二步:安装 1、运行mpich2- 1、4、1p1-win-x86- 64、msi并按提示进程安装目标目录:D:\Program Files\MPICH,安装内容:全选 2、依照提示完成全部安装工作 第三步:验证安装是否正确完成 1、查看 D:\Program Files\MPICH 目录是否存在 2、打开“任务管理器”中的“进程”选项卡,查看是否有一个 mpd、exe 进程。如果有说明安装成功。以后每次启动系统,该进程将自动运行。第四步:采用相同的方法完成局域网内其它计算机的安装工作要求: 1、均为管理员账户 2、目标目录必须完全相同 第五步:注册(每台计算机都要进行)目的:将先前在每台计算机上申请的账号与密码注册到 MPICH 中去,以便 MPICH 在网络环境中访问每台主机。 方法: 运行“C:\Program Files\MPICH\mpd\bin\MPIRegister、exe”,输入账号及密码,完成注册。 用户名和密码必须是有管理员权限的密码,否则在运行该软件的时候将会出错。 第六步:配置(每台计算机都要进行)目的:让 MPI 程序能在多台机器上运行。 方法:开始->程序->MPICH->mpd->MPICH Configuration tool” (二)在 C 语言上如何编写并运行 MPI 程序第一步:设置 C 语言的编译环境 1、新建一个 Win32 Console Application 工程。 方法:File->New 2、打开工程设置对话框。 方法:Project-->settings 或 Alt+F7 3、切换到 C/C++选项卡。首先选择“Win32 Debug”(①的下拉框),再选择“Code Generation” (②的下拉框)再选择 “Debug Multithreaded” ,(③的下拉框)在“Project 。O ptions”的文本框中显示“/MT”表示设置成功。 然后选择“Win32Release” (①的下拉框)重复上述步骤。 4、在 C/C++选项卡中选择“All Configurations”。(①的下拉框)选择“Preprocessor” (②的下拉框),在相关位置输入 MPICH 所附带的头文件的目录。 5、 Link 选项卡中,在选择“All Configurations”。 再选择“Input”在“Additionallibrary path”的文本框中输入 MPICH 所附带的库文件的目录。 6、 Link 选项卡中,在选择“All Configurations”。 (①的下拉框)然后再选择“General” ,然后在“Object/library modules” 的文本框中添加“ws2_ 32、lib”。点击“OK”。这时在“mon Options” 中会出现“ws2_ 32、lib”。 7、在 Link 选项卡中,选择“Win32 Debug”。然后再选择“General”,然后在“Object/library modules”的文本框中添加“mpichd、lib”。点击“OK”。这时在“Project Options”中会出现“mpichd、lib”。 8、 Link 选项卡中,在选择“Win32 Release”。 然后再选择“General” ,在“Object/library modules” 的文本框中添加“mpich、lib”。点击“OK”。这时在“Project Options” 中会出现“mpich、lib”。第二步:编写程序并编译 1、输入程序 2、编译 第三步:运行 1、将执行文件拷贝至 MPIRun、exe 所在的目录 E:\mpidjana\hello\hello\Debug 2、点击运行按钮运行程序 四、源程序#include "mpi、h" #include #include double a; { return ( 4、0 / ( 1、0 + a*a)); } int main(argc,argv) int argc; char *argv[]; { int done = 0, n=100, myid, numprocs, i; double PI25DT = 3、141592653589793238462643; double mypi, pi, h, sum, x, a,startwtime, endwtime; MPI_Init(&argc,&argv); MPI_m_size(MPI_M_WORLD,&numprocs); MPI_m_rank(MPI_M_WORLD,&myid); if (myid == 0) startwtime = MPI_Wtime(); h = 1、0 / (double) n; sum = 0、0; for (i = myid +1; i <= n; i += numprocs) { x = h * ((double)i PI25DT)); endwtime = MPI_Wtime(); printf("wall clock time = %f\n", endwtime-startwtime); } MPI_Finalize(); } 五、运行结果实验四高斯算法的MPI实现Author:姓名 一、实验题目用 MPI 技术设计实现高斯算法。 二、实验目的熟悉 MPI 编程,加深对其编程的理解,并能够 使用MPI进行程序设计。 三、实验环境Windows XP SP3。 运行 MPI 四、源程序#include "stdio、h" #include "stdlib、h" #include "mpi、h" #include "math、h" #define a(x,y) a[x*M+y] #define b(x) b[x] #define A(x,y) A[x*M+y] #define B(x) B[x] #define floatsize sizeof(float) #define intsize sizeof(int) int M; int N; int m; float *A; float *B; double starttime; double time1; double time2; int my_rank; int p; int l; MPI_Status status; void fatal(char *message) { printf("%s\n",message); exit(1); } void Environment_Finalize(float *a,float *b,float *x,float *f) { free(a); free(b); free(x); free(f); } int main(int argc, char **argv) { int i,j,t,k,my_rank,group_size; int i1,i2; int v,w; float temp; int tem; float *sum; float *f; float lmax; float *a; float *b; float *x; int *shift; FILE *fdA,*fdB; MPI_Init(&argc,&argv); MPI_m_size(MPI_M_WORLD,&group_size); MPI_m_rank(MPI_M_WORLD,&my_rank); p=group_size; if (my_rank==0) { starttime=MPI_Wtime(); fdA=fopen("dataIn、txt","r"); fscanf(fdA,"%d %d", &M, &N); if (M != N-1) { printf("the input is wrong\n"); exit(1); } A=(float *)malloc(floatsize*M*M); B=(float *)malloc(floatsize*M); for(i = 0; i < M; i++) { for(j = 0; j < M; j++) { fscanf(fdA,"%f", A+i*M+j); } fscanf(fdA,"%f", B+i); } fclose(fdA); } MPI_Bcast(&M,1,MPI_INT,0,MPI_M_WORLD); /* 0号处理机将M广播给所有处理机 */ m=M/p; if (M%p!=0) m++; f=(float*)malloc(sizeof(float)*(M+1)); /* 各处理机为主行元素建立发送和接收缓冲区(M+1) */ a=(float*)malloc(sizeof(float)*m*M); /* 分配至各处理机的子矩阵大小为m*M */ b=(float*)malloc(sizeof(float)*m); /* 分配至各处理机的子向量大小为m */ sum=(float*)malloc(sizeof(float)*m); x=(float*)malloc(sizeof(float)*M); shift=(int*)malloc(sizeof(int)*M); if (a==NULL||b==NULL||f==NULL||sum==NULL||x==NULL||shift==NU LL) fatal("allocate error\n"); for(i=0;i shift[i]=i; /* 0号处理机采用行交叉划分将矩阵A划分为大小为m*M的p块子矩阵,将B划分为大小为m的p块子向量,依次发送给1至p-1号处理机 */ if (my_rank==0) { for(i=0;i for(j=0;j a(i,j)=A(i*p,j); for(i=0;i b(i)=B(i*p); } if (my_rank==0) { for(i=0;i if ((i%p)!=0) { i1=i%p; 并行计算 实 验 报 告 学院名称计算机科学与技术学院专业计算机科学与技术 学生姓名 学号 年班级 2016年5 月20 日 一、实验内容 本次试验的主要内容为采用多线程的方法计算pi的值,熟悉linux下pthread 形式的多线程编程,对实验结果进行统计并分析以及加速比曲线分析,从而对并行计算有初步了解。 二、实验原理 本次实验利用中值积分定理计算pi的值 图1 中值定理计算pi 其中公式可以变换如下: 图2 积分计算pi公式的变形 当N足够大时,可以足够逼近pi,多线程的计算方法主要通过将for循环的计算过程分到几个线程中去,每次计算都要更新sum的值,为避免一个线程更新sum 值后,另一个线程仍读到旧的值,所以每个线程计算自己的部分,最后相加。三、程序流程图 程序主体部分流程图如下: 多线程执行函数流程图如下: 四、实验结果及分析 令线程数分别为1、2、5、10、20、30、40、50和100,并且对于每次实验重复十次求平均值。结果如下: 图5 时间随线程的变化 实验加速比曲线的计算公式类似于 结果如下: 图5 加速比曲线 实验结果与预期类似,当线程总数较少时,线程数的增多会对程序计算速度带来明显的提升,当线程总数增大到足够大时,由于物理节点的核心数是有限的,因此会给cpu带来较多的调度,线程的切换和最后结果的汇总带来的时间开销较大,所以线程数较大时,增加线程数不会带来明显的速度提升,甚至可能下降。 五、实验总结 本次试验的主要内容是多线程计算pi的实现,通过这次实验,我对并行计算有了进一步的理解。上学期的操作系统课程中,已经做过相似的题目,因此程序主体部分相似。不同的地方在于,首先本程序按照老师要求应在命令行提供参数,而非将数值写定在程序里,其次是程序不是在自己的电脑上运行,而是通过ssh和批处理脚本等登录到远程服务器提交任务执行。 在运行方面,因为对批处理任务不够熟悉,出现了提交任务无结果的情况,原因在于windows系统要采用换行的方式来表明结束。在实验过程中也遇到了其他问题,大多还是来自于经验的缺乏。 在分析实验结果方面,因为自己是第一次分析多线程程序的加速比,因此比较生疏,参考网上资料和ppt后分析得出结果。 从自己遇到的问题来看,自己对批处理的理解和认识还比较有限,经过本次实验,我对并行计算的理解有了进一步的提高,也意识到了自己存在的一些问题。 六、程序代码及部署 程序源代码见cpp文件 部署说明: 使用gcc编译即可,编译时加上-pthread参数,运行时任务提交到服务器上。 编译命令如下: gcc -pthread PI_3013216011.cpp -o pi pbs脚本(runPI.pbs)如下: #!/bin/bash #PBS -N pi #PBS -l nodes=1:ppn=8 #PBS -q AM016_queue #PBS -j oe cd $PBS_O_WORKDIR for ((i=1;i<=10;i++)) do ./pi num_threads N >> runPI.log 江苏科技大学 计算机科学与工程学院 实验报告 实验名称:Java多线程编程 学号:姓名:班级: 完成日期:2014年04月22日 1.1 实验目的 (1) 掌握多线程编程的特点; (2) 了解线程的调度和执行过程; (3)掌握资源共享访问的实现方法。 1.2 知识要点 1.2.1线程的概念 (1)线程是程序中的一个执行流,多线程则指多个执行流; (2)线程是比进程更小的执行单位,一个进程包括多个线程; (3)Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。 (4)Java代码可以为不同线程共享,数据也可以为不同线程共享; 1.2.2 线程的创建 (1) 方式1:实现Runnable接口 Thread类使用一个实现Runnable接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法; (2)方式2:继承Thread类 重写Thread类的run方法; 1.2.3 线程的调度 (1) 线程的优先级 ●取值范围1~10,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_ PRIORITY=10、NORM_PRIORITY=5; ●用setPriority()设置线程优先级,用getPriority()获取线程优先级; ●子线程继承父线程的优先级,主线程具有正常优先级。 (2) 线程的调度:采用抢占式调度策略,高优先级的线程优先执行,在Java中,系统按照优先级的级别设置不同的等待队列。 1.2.4 线程的状态与生命周期 说明:新创建的线程处于“新建状态”,必须通过执行start()方法,让其进入到“就绪状态”,处于就绪状态的线程才有机会得到调度执行。线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。 1.2.5 线程的同步--解决资源访问冲突问题 (1) 对象的加锁 所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。对象的同步代码的执行过程如图14-2所示。 synchronized关键字的使用方法有两种: ●用在对象前面限制一段代码的执行,表示执行该段代码必须取得对象锁。 ●在方法前面,表示该方法为同步方法,执行该方法必须取得对象锁。 (2) wait()和notify()方法 用于解决多线程中对资源的访问控制问题。 ●wait()方法:释放对象锁,将线程进入等待唤醒队列; ●notify()方法:唤醒等待资源锁的线程,让其进入对象锁的获取等待队列。 (3)避免死锁 指多个线程相互等待对方释放持有的锁,并且在得到对方锁之前不会释放自己的锁。 1.3 上机测试下列程序 样例1:利用多线程编程编写一个龟兔赛跑程序。 乌龟:速度慢,休息时间短; 《计算方法》上机实验报告 班级:XXXXXX 小组成员:XXXXXXX XXXXXXX XXXXXXX XXXXXXX 任课教师:XXX 二〇一八年五月二十五日 前言 通过进行多次的上机实验,我们结合课本上的内容以及老师对我们的指导,能够较为熟练地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法和Gauss 求积公式等六种算法的原理和使用方法,并参考课本例题进行了MATLAB 程序的编写。 以下为本次上机实验报告,按照实验内容共分为六部分。 实验一: 一、实验名称及题目: Newton 迭代法 例2.7(P38):应用Newton 迭代法求 在 附近的数值解 ,并使其满足 . 二、解题思路: 设'x 是0)(=x f 的根,选取0x 作为'x 初始近似值,过点())(,00x f x 做曲线)(x f y =的切线L ,L 的方程为))((')(000x x x f x f y -+=,求出L 与x 轴交点的横坐标) (') (0001x f x f x x - =,称1x 为'x 的一次近似值,过点))(,(11x f x 做曲线)(x f y =的切线,求该切线与x 轴的横坐标) (') (1112x f x f x x - =称2x 为'x 的二次近似值,重复以上过程,得'x 的近似值序列{}n x ,把 ) (') (1n n n n x f x f x x - =+称为'x 的1+n 次近似值,这种求解方法就是牛顿迭代法。 三、Matlab 程序代码: function newton_iteration(x0,tol) syms z %定义自变量 format long %定义精度 f=z*z*z-z-1; f1=diff(f);%求导 y=subs(f,z,x0); y1=subs(f1,z,x0);%向函数中代值 x1=x0-y/y1; k=1; while abs(x1-x0)>=tol x0=x1; y=subs(f,z,x0); y1=subs(f1,z,x0); x1=x0-y/y1;k=k+1; end x=double(x1) K 四、运行结果: 实验二: 进程的控制 1 .实验目的 通过进程的创建、撤消和运行加深对进程概念和进程并发执行的理解,明确进程与程序之间的区别。 【答:进程概念和程序概念最大的不同之处在于: (1)进程是动态的,而程序是静态的。 (2)进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为1个独立单位得到操作系统的认可。 (3)1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。 (4)进程和程序的组成不同。从静态角度看,进程由程序、数据和进程控制块(PCB)三部分组成。而程序是一组有序的指令集合。】2 .实验内容 (1) 了解系统调用fork()、execvp()和wait()的功能和实现过程。 (2) 编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符串“parent:”和自己的标识数,而子进程则重复显示字符串“child:”和自己的标识数。 (3) 编写一段程序,使用系统调用fork()来创建一个子进程。子进程通过系统调用execvp()更换自己的执行代码,新的代码显示“new program.”。而父进程则调用wait()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。 3 .实验步骤 (1)gedit创建进程1.c (2)使用gcc 1.c -o 1编译并./1运行程序1.c #include (此文档为word格式,下载后您可任意编辑修改!) 多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日 实验一 // exa1.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include 实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include 单片机并行口实验报告 实验二并行口实验报告 班级: 学号: 姓名: 教师: 一、实验目的 通过实验了解8051并行口输入方式和输出方式的工作原理及编程方法。 二、实验内容 1、输出实验 如图4-1所示。以8031的P2口为输出口。通过程序控制发光二极管的亮灭。 2、输入实验 如图4-1所示。以8031的P1口为输入口。用开关向P1.0~P1.3输入不同的状态,控制P2口P2.4~P2.7发光二极管的亮灭。 3、查询输入输出实验 如图1-1所示。以8051的P1.6或P1.0为输入位,以P2口为输出,二进制计数记录按键的次数。 图1-1 三、编程提示 1、输出实验程序 (1)设计一组显示花样,编程使得P2口按照设计的花样重复显示。 (2)为了便于观察,每一状态加入延时程序。 2、输入实验程序 开关打开,则输入为1;开关闭合,则输入为0。读取P1.0~ P1.3的状态,并将它们输出到P2.4~ P2.7,驱动发光二极管。所以发光二极管L1~L4的亮灭应与开关P1.0~ P1.3的设置相吻合。 3、查询输入输出程序 (1)编程计数P1.0按键次数,按键不去抖动。 (2)编程计数P1.6按键次数,按键不去抖动。 (3)编程计数P1.0按键次数,按键软件延时去抖动。 观察(1)、(2)、(3)、的结果。 四、实验器材 计算机,目标系统实验板 五、实验步骤 1、在KEILC中按要求编好程序,编译,软件调试,生成.HEX文件。 2、断开电源,按图1-1所示,连好开关及发光二极管电路。 3、下载程序。 4、调试运行程序,观察发光二极管状态。 六、C源程序清单 1、#include 并行计算上机实验报告题目:多线程计算Pi值 学生姓名 学院名称计算机学院 专业计算机科学与技术时间 一. 实验目的 1、掌握集群任务提交方式; 2、掌握多线程编程。 二.实验内容 1、通过下图中的近似公式,使用多线程编程实现pi的计算; 2、通过控制变量N的数值以及线程的数量,观察程序的执行效率。 三.实现方法 1. 下载配置SSH客户端 2. 用多线程编写pi代码 3. 通过文件传输界面,将文件上传到集群上 4.将命令行目录切换至data,对.c文件进行编译 5.编写PBS脚本,提交作业 6.实验代码如下: #include #include 华中科技大学 课程名称并行处理 实验名称矩阵乘法的实现及加速比分析考生姓名李佩佩 考生学号 M201372734 系、年级计算机软件与理论2013级类别硕士研究生 考试日期 2014年1月3日 一. 实验目的 1) 学会如何使用集群 2) 掌握怎么用并行或分布式的方式编程 3) 掌握如何以并行的角度分析一个特定的问题 二. 实验环境 1) 硬件环境:4核CPU、2GB内存计算机; 2) 软件环境:Windows XP、MPICH2、VS2010、Xmanager Enterprise3; 3) 集群登录方式:通过远程桌面连接211.69.198.2,用户名:pppusr,密码:AE2Q3P0。 三. 实验内容 1. 实验代码 编写四个.c文件,分别为DenseMulMatrixMPI.c、DenseMulMatrixSerial.c、SparseMulMatrixMPI.c和SparseMulMatrixSerial.c,用于比较并行和串行矩阵乘法的加速比,以及稀疏矩阵和稠密矩阵的加速比。这里需要说明一下,一开始的时候我是把串、并行放在一个程序中,那么就只有两个.c文件DenseMulMatrix.c 和SparseMulMatrix.c,把串行计算矩阵乘的部分放到了主进程中,即procsID=0的进程,但是结果发现执行完串行后,再执行并行就特别的慢。另外,对于稀疏矩阵的处理方面可能不太好,在生成稀疏矩阵的过程中非0元素位置的生成做到了随机化,但是在进行稀疏矩阵乘法时没有对矩阵压缩,所以跟稠密矩阵乘法在计算时间上没多大区别。 方阵A和B的初始值是利用rand()和srand()函数随机生成的。根据稀疏矩阵和稠密矩阵的定义,对于稀疏矩阵和稠密矩阵的初始化方法InitMatrix(int *M,int *N,int len)会有所不同。这里需要说明一下,一开始对于矩阵A和B的初始化是两次调用InitMatrix(int *M ,int len),生成A和B矩阵,但是随后我发现,由于两次调用方法InitMatrix的时间间隔非常短,又由于srand()函数的特点,导致生成的矩阵A和B完全一样;然后,我就在两次调用之间加入了语句“Sleep(1000);”,加入头文件“#include 北京科技大学计算机与通信工程学院 实验报告 实验名称: 学生姓名: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间:2015年05月 一、实验目的与实验要求 1、实验目的 1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论; 2、实验要求 1编写矩阵乘法的串行程序,多次运行得到结果汇总; 2编写基于MPI,分别实现矩阵乘法的并行化。对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。 二、实验设备(环境)及要求 《VS2013》C++语言 MPICH2 三、实验内容与步骤 实验1,矩阵乘法的串行实验 (1)实验内容 编写串行程序,运行汇总结果。 (2)主要步骤 按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。 实验2矩阵乘法的并行化实验 3个总进程 5个总进程 7个总进程 9个进程 16个进程 四:实验结果与分析(一)矩阵乘法并行化 矩阵并行化算法分析: 并行策略:1间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程1:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此O(n)=(n); 2间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程3:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此T(n)=O(n); 多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日 实验一 // exa1.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include 实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include 8255并行口实验实验报告 作者: 一、实验目的 掌握8255A的编程原理。 二、实验设备 CPU挂箱、8086CPU模块。 三、实验内容 8255A的A口作为输入口,与逻辑电平开关相连。8255A的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。 四、实验原理介绍 本实验用到两部分电路:开关量输入输出电路和8255可编程并口电路。 五、实验步骤 1、实验接线 CS0?CS8255; PA0~PA7?平推开关的输出K1~K8; PB0~PB7?发光二极管的输入LED1~LED8。 2、编程并全速或单步运行。 3、全速运行时拨动开关,观察发光二极管的变化。当开关某位置于L 时,对应的发光二极管点亮,置于H时熄灭。 六、实验提示 实验也是如此。实验中,8255A工作于基本8255A是比较常用的一种并行接口芯片,其特点在许多教科书中均有介绍。8255A有三个8位的输入输出端口,通常将A端口作为输入用,B端口作为输出用,C端口作为辅助控制用,本输入输出方式(方式0)。 七、实验结果 程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如:K2置于L位置,则对应的LED2应该点亮。 八、程序框图(实验程序名:t8255.asm) 开始 设置8255工作方式 读A口 输出至B口 结束 九、程序源代码清单: assume cs:code code segment public org 100h start: mov dx,04a6h ;控制寄存器地址 mov ax,90h ;设 置为A口输入,B口输出 out dx,ax mov al,0feh start1:mov dx,04a2h 芯片的 入口地址 out dx,al mov bl,al mov dx ,04a0h in al,dx test ax,01h jz strat2 mov al ,bl rol al,1 流水灯循环左移 mov bl,al mov cx,3000h 设置cx为灯闪烁时间对应的循环次数 add: loop add jmp start1 无条件跳转至start1 strat2:mov al,bl mov dx,04a2h out dx,al ror al,1 流水灯循环左移 mov bl, al mov cx,3000h add1: loop add jmp start 无条件跳转至start code ends end start 十、实验总结 通过该实验,掌握了8255A的编程原理,学会了用汇编语言来编写程序控制8255A进行流水灯的操作实验。 深圳大学 实验报告 课程名称:并行计算 实验名称:矩阵乘法的OpenMP实现及性能分析姓名: 学号: 班级: 实验日期:2011年10月21日、11月4日 一. 实验目的 1) 用OpenMP 实现最基本的数值算法“矩阵乘法” 2) 掌握for 编译制导语句 3) 对并行程序进行简单的性能 二. 实验环境 1) 硬件环境:32核CPU 、32G 存计算机; 2) 软件环境:Linux 、Win2003、GCC 、MPICH 、VS2008; 4) Windows 登录方式:通过远程桌面连接192.168.150.197,用户名和初始密码都是自己的学号。 三. 实验容 1. 用OpenMP 编写两个n 阶的方阵a 和b 的相乘程序,结果存放在方阵c 中,其中乘法用for 编译制导语句实现并行化操作,并调节for 编译制导中schedule 的参数,使得执行时间最短,写出代码。 方阵a 和b 的初始值如下: ????????? ? ??????????-++++=12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1n n n n n n n a ???????? ? ???????????= 1,...,1,1,1..1,...,1,1,11,...,1,1,11,..., 1,1,1b 输入: 方阵的阶n 、并行域的线程数 输出: c 中所有元素之和、程序的执行时间 提示: a,b,c 的元素定义为int 型,c 中所有元素之各定义为long long 型。 Windows 计时: 用 实验报告 课程名称虚拟化与云计算学院计算机学院 专业班级11级网络工程3班学号3211006414 姓名李彩燕 指导教师孙为军 2014 年12 月03日 EXSI 5.1.0安装 安装准备 安装VSPHERE HYPERVISOR SEVER(EXSI 5.1.0)需要准备: 无操作系统的机器(如有系统,安装过程中会格式化掉),需切换到光盘启动模式。BOIS中开启虚拟化设置(virtualization设置成enable) VMware vSphere Hypervisor 自启动盘 安装过程 1.安装VMware vSphere Hypervisor确保机器中无操作系统,并且设置BIOS到光盘启 动模式 2.插入光盘,引导进入安装界面。 3.选择需要安装在硬盘 4.选择keyboard 类型,默认US DEFAULT 5.设置ROOT的密码 6.安装完毕后,请注意弹出光盘。然后重启。 7.F2进入系统配置界面。 8.选择到Configure management network去配置网络。 9.配置完毕后,注意重启网络以使设置生效,点击restart management network,测 试网络设置是否正确,点test management network。至此,sever端安装完毕。配置 1.添加机器名:在DNS服务器上添加相关正反解析设置。 2.License设置:Vsphere client登陆后,清单→配置→已获许可的功能→编辑 输入license 3.时间与NTP服务设置:Vsphere client登陆后,清单→配置→时间配置→属性 钩选上NTP客户端 选项中,NTP设置设添加NTP服务器,然后在常规中开启NTP服务 科技大学计算机与通信工程学院 实验报告 实验名称: 学生: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间:2015年05月 一、实验目的与实验要求 1、实验目的 1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论; 2、实验要求 1编写矩阵乘法的串行程序,多次运行得到结果汇总; 2编写基于MPI,分别实现矩阵乘法的并行化。对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。 二、实验设备(环境)及要求 《VS2013》C++语言 MPICH2 三、实验容与步骤 实验1,矩阵乘法的串行实验 (1)实验容 编写串行程序,运行汇总结果。 (2)主要步骤 按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。 实验2矩阵乘法的并行化实验 3个总进程 5个总进程 7个总进程 9个进程 16个进程 四:实验结果与分析(一)矩阵乘法并行化 矩阵并行化算法分析: 并行策略:1间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程1:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此O(n)=(n); 2间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程3:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此T(n)=O(n); MPI并行编程实验报告 起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名 一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MP D、CONF, 完成实验室中临近机器间的并行配置。概要:以寝室四台计算机为例,设置IP(1 92、1 68、1、1~1 92、1 68、1、4),更改主机名为node01,node02,node03, node04。 (一)创建SSH信任连接 1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:1 27、0、0、1 localhost、localdomain localhost1 92、1 68、1、1 node011 92、1 68、1、2 node021 92、1 68、1、3 node031 92、1 68、1、4 node0 42、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹 3、进入、ssh目录#cd 、ssh 4、生成authorized_keys文件#cp id_rsa、pub authorized_keys 5、退出到root目录#cd 、、 6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全) 7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2- 1、0、1、tar、gz 2、创建安装目录#mkdir /usr/MPICH-instsll 3、进入mpich2解压目录#cd mpich2- 1、0、 14、设置安装目录#、/configureprefix=/usr/MPICH- install 5、编译#make 6、安装#make install 基于o p e n M P的并行计 算实验 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 并行计算实验报告 课程:并行计算 姓名:郑波 学号44 班级:计算机科学与技术13-2班 日期:2015年12月7日 实验一:OpenMP基本使用 一、实验目的 1、熟悉OpenMP编程。 2、比较串行算法与并行算法在执行时间上的差别; 3、考察线程数目使用不同对并行算法执行时间的影响; 4、考察运算规模N对串、并行算法执行时间上的影响。 二、实验内容 1、使用OpenMP进行两个矩阵A和B的加法,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响 三、实验步骤 1、整个程序的设计流程 ①全局变量设置三个宏定义过的size×size的二维数组啊a,b,c。 ②初始化a数组为全1,b数组为全2 ③通过omp_set_num_threads()库函数设置线程数 ④调用openMP库函数omp_get_wtime()获取当前时间start #pragma omp parallel for开始做并行区部分 … 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 ⑤再次调用时间函数更新strat 串行做一边矩阵相加 更新end,end-start即为串行耗时 代码如下: #include 分支程序设计实验实验报告 ————————————————————————————————作者:————————————————————————————————日期: ? 实验二分支程序设计实验实验报告 实验名称:分支程序设计实验 指导教师罗志祥 专业班级光信1006 姓名张博学号U201013339 联系方式 一、任务要求: 熟练掌握K eil C环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行IO 口的使用。 1. 设有8bits 符号数X 存于外部R AM 单元,按以下方式计算后的结果Y 也存于外部RAM 单元,请按要求编写程序。 240/2204020X X Y X X X X ?≥? =<? ≤?当当当 2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P 0、P 1、P2端口输出(以压缩B CD 码的形式)。P3.0为低电平时开始计时,为高电平时停止计时。 提高部分(选做): a . 实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P 2口输出。利用P3.7状态选择加、减计数方式。 b. 利用P3口低四位状态控制开始和停止计数,控制方式自定。 二、设计思路: 1.分支函数程序设计:首先将X 赋给累加器A ,与40比较大小,将大于或等于40的执行乘方操作;小于40的再与20做比较,大于20的执行取除法操作,小于或等于20的执行取反操作。最后将计算结果Y 存于片外的RAM 上。 2.电子时钟程序设计思路:首先用循环程序的嵌套实现一个1s 的延时,同时让记秒的端口P2同步加一,到60后清零;再让此循环执行60次实现1min 的延时,同时让P1同步加一,到60后清零;再让分钟的循环执行24次,实现1hour 的延时,同时让P 0同步加一。至此循环,即可实现24小时的时钟功能。(注:本计算机的晶振频率为12MHz) 3.4位十进制加、减1计数程序思路:低位的个位和十位赋给一个寄存器,而将高位即百位千位赋给另外一个寄存器,通过循环程序使低位数循环100次即向高位进位或借位,高 实验二MATLAB并行计算的配置 一、实验目的 1.通过matlabpool命令启动和配置matlab并行计算池,了解matlabpool的基本使用方法。 2.能够编写parfor程序进行并行环境的测试。 3.完成课堂练习。 二、实验课时:4课时 三、实验原理 第一部分:matlab并行池的启动及matlabpool命令的基本使用 首先,通过matlabpool size命令判断是否已经启动matlabpool。 图1 matlabpool size运行结果图 如果返回0,则表示没有开启matlabpool;如果返回大于0的值,则表示已经开启matlabpool。 然后通过运行matlabpool local;命令启动默认配置,其中的local表示配置项的名称。 图2 matlabpool local运行效果图 在运行此命令时,如果是win 7或者以上版本的系统,会弹出windows安全警报对话框,我们直接点击允许访问就可以了。 图3 windows安全警报图 第二部分:编写用于自动启动matlab并行计算池的函数程序1 startmatlabpool.m如下: 程序2 closematlabpool.m代码如下: 接着,我们可以通过help parfor命令来查看parfor的基本使用方法,然后按要求完成课堂练习的编码工作。 Help parfor允许效果图 四、课堂练习 1.编写一个测试parfor的程序,要求调用以上两个函数; 2.根据下面的公式使用matlab进行计算: 五、实验报告要求 简述实验目的;写出实验内容中解答各个题目所需要的命令及实验结果;简写实验总结与心得体会。 上机地点:电三楼519机房 上机时间分为两组:周六上午9:00~11:30,PB12011班级同学 周六晚上6:30~9:00,其他同学 【注意事项】 1.本次作业分为简单题和中等题,简单题每题3分,共6分,中等题 4分。 2.实验请用基于C/C++的OpenMP编程模型最大效度的实现并行。 3.在完成实验后,提交实验报告时请务必给出不同线程数的加速比 图或加速比表格,并需要给出你算法的核心思想。代码请附在实验报告最后的附件中,最后只需要交实验报告即可。 4.请在一周之内提交你的实验报告,命名按照“1_学号_姓名”的格 式,如“1_SA13011075_张三”,并发送至pc_2015spring@https://www.doczj.com/doc/4611422646.html, 5.实验报告模板和本文档可以到此处下载: https://www.doczj.com/doc/4611422646.html,/~xiangbin/pc2015/ 6.测试时间函数参考。 double time_used; struct timeval tv_start, tv_end; gettimeofday(&tv_start, NULL); function(); gettimeofday(&tv_end, NULL); time_used=(tv_https://www.doczj.com/doc/4611422646.html,_sec-tv_https://www.doczj.com/doc/4611422646.html,_sec)*1000000+(tv_https://www.doczj.com/doc/4611422646.html,_usec-tv_https://www.doczj.com/doc/4611422646.html,_ usec); printf("time_used = %lf s\n", time_used/1000000); 一.简单题 1.针对教材中求PI的实例程序,请给出至少两种不同并行方式的OpenMP 实现。(划分数>= 1, 000, 000) 2. 使用OPENMP编写矩阵乘法程序。并行计算1
并行计算实验报告一
计算方法上机实验报告
进程管理实验报告
多核编程与并行计算实验报告 (1)
单片机并行口实验报告
并行计算第一次实验报告
并行处理实验报告:用MPI实现的矩阵乘法的加速比分析
矩阵乘法的并行化 实验报告
多核编程与并行计算实验报告 (1)
并行口实验实验报告
并行计算-实验二-矩阵乘法的OpenMP实现及性能分析
虚拟化与云计算实验报告.
矩阵乘法的并行化实验报告
MPI并行编程实验报告
基于openMP的并行计算实验
分支程序设计实验实验报告
实验二 MATLAB并行计算的配置
并行计算实验题目(OpenMP)