《并行程序设计》实验报告
并行程序设计实验报告-OpenMP 基础实验

实验1:OpenMP 基础实验1、实验目的1)了解OpenMP的运行环境2)掌握OpenMP编程的基本要素、编译方法,可运用相关知识独立完成一个基本的OpenMP程序的编写与调试过程。
2、实验要求1)掌握OpenMP运行环境在ubuntu环境中打开一个终端界面。
尝试在图形操作界面左侧寻找终端的图标进行点击,或直接使用快捷键Ctrl+Alt+T打开终端界面进行Shell环境。
2)运行一个简单OpenMP程序程序代码见程序1-1、1-23)OpenMP兼容性检查通过检查预处理宏_OPENMP 是否定义来进行条件编译。
如果定义了_OPENMP,则包含omp.h 并调用OpenMP 库函数。
程序代码见程序1-34)常用线程操作库函数语句在OpenMP编程过程中,一旦涉及线程操作,有较大的概率使用三个常用的库函数,分别为:(1) int omp_get_num_threads(void) 获取当前线程组(team)的线程数量,如果不在并行区调用,则返回1。
(2) int omp_get_thread_num(void) 返回当前线程号。
(3) int omp_get_num_procs(void) 返回可用的处理核个数。
注意区别这三个库函数的外形及意义,特别是前两个库函数,初始使用时很容易混淆。
程序代码见程序1-45)parallel语句的练习parallel 用来构造一个并行区域,在这个区域中的代码会被多个线程(线程组)执行,在区域结束处有默认的同步(隐式路障)。
我们可以在parallel 构造区域内使用分支语句,通过omp_get_thread_num 获得的当前线程编号来指定不同线程执行区域内的不同代码。
程序代码见程序1-5、1-66)critical和reducation语句的练习为了保证在多线程执行的程序中,出现资源竞争的时候能得到正确结果,OpenMP 提供了3种不同类型的多线程同步机制:排它锁、原子操作和临界区。
中科大并行程序实验报告

并行程序设计实验报告公共部分1.用MPI_Send、MPI_Recv实现MPI_Bcast、MPI_Alltoall、MPI_Gather、MPI_Scatter 等MPI群及通信函数功能。
_MPI_Bcast:程序运行结果如下伪代码如下:_MPI_Bcast(sendbuf, sendcount, sendtype, root, comm)对每个处理器执行以下算法if my_rank = root thenfor i = 0 to p do //p为进程个数MPI_Send(sendbuf, sendcount, sendtype, i, root, comm) //root向每个进程发送消息end forend if//每个进程从root接收带有root标签的消息,接受信息存在各自的sendbuf中MPI_Recv(sendbuf, sendcount, sendtype, root, root, comm., &status)_MPI_Scatter:将字符串”abcdefgh”以进程2为根散播出去,程序运行结果如下:伪代码如下:_MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm)各处理器执行以下算法if my_rank = root thenfor i = 0 to sendcount doMPI_Send(sendbuf + i, 1, sendtype, i , root, comm)//将sendbuf中的信息按进程标识顺序发送给各个进程end forend if//每个进程从root处接收各自的消息,并存在recvbuf中第root号位置MPI_Recv(recvbuf + root, 1, recvtype, root, root, comm., &status)_MPI_Alltoall:进程0到进程5存储的数据分别为”000000”到”555555”,经全局交换之后运行结果如下:伪代码如下:_MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)对每个处理器执行以下代码:for i = 0 to p-1_MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, i, comm) //_MPI_Scatter即为前一个程序的伪代码//Alltoall就是每一个进程都以自己为root执行一次Scatterend for_MPI_Gather:将四个进程的第3个字符汇聚到进程2,执行结果如下:伪代码如下:_MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) 对每个进程执行以下代码MPI_Send(sendbuf,sendcount, sendtype, root, root, comm)if my_rank = root thenfor i = 0 to p-1 doMPI_Recv(recvbuf + i, recvcount, recvtype, i, root, comm., &status) end forend if2. LU分解的MPI实现(顺序划分)5个节点、处理9x9矩阵时运行结果如下:伪代码如下:输入:矩阵A(nxn)输出:下三角矩阵L(nxn),上三角矩阵U(nxn)Begin对所有处理器my_rank(0..p-1)同时执行如下算法:for i = 0 to m-1 do //对处理器的各行**************for j = 0 to p-1 doif(my_rank = j) thenv = j * m + i; //当前主行************************for k = v to n dof[k] = a[i, k]end forelsev = j*m + i; //当前主行************************接收主行所在处理器广播来的主行元素End ifif(my_rank = j) then //编号为j的处理器对其i+1行以后各行进行变换for k= i+1 to m-1 doa[k, v] = a[k, v] / f[v]for w = v+1 to n-1 doa[k, w] = a[k, w] – f[w]*a[k, v]end forend forif(my_rank > j) then //编号大于j的处理器对其所有行变换for k = 0 to m -1 doa[k, v] = a[k, v] / f[v]for w = v+1 to n-1 doa[k, w] = a[k, w] – f[w]*a[k, v]end forend forend ifend forend forend大体思路如同上面的伪代码给出,核心思想就是如果当前主行在第j号处理器,那么按照顺序划分的想法,编号小于j的处理器已经变换完了自己的各行,不需要做什么处理;编号为j的处理器应用当前主行为其j+1行等后续各行变换;编号大于j的处理器其各行都还没有经过变换,所以应用主行对其所有行进行变换。
并行程序实验报告

并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用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号进程依次接收其它进程发送过来的消息并将其输出。
并行程序设计实验报告-OpenMP 进阶实验

实验2:OpenMP 进阶实验1、实验目的掌握生产者-消费者模型,具备运用OpenMP相关知识进行综合分析,可实现实际工程背景下生产者-消费者模型的线程级负责均衡规划和调优。
2、实验要求1)single与master语句制导语句single 和master 都是指定相关的并行区域只由一个线程执行,区别在于使用master 则由主线程(0 号线程)执行,使用single 则由运行时的具体情况决定。
两者还有一个区别是single 在结束处隐含栅栏同步,而master 没有。
在没有特殊需求时,建议使用single 语句。
程序代码见程序2-12)barrier语句在多线程编程中必须考虑到不同的线程对同一个变量进行读写访问引起的数据竞争问题。
如果线程间没有互斥机制,则不同线程对同一变量的访问顺序是不确定的,有可能导致错误的执行结果。
OpenMP中有两种不同类型的线程同步机制,一种是互斥机制,一种是事件同步机制。
其中事件同步机制的设计思路是控制线程的执行顺序,可以通过设置barrier同步路障实现。
3)atomic、critical与锁通过critical 临界区实现的线程同步机制也可以通过原子(atomic)和锁实现。
后两者功能更具特点,并且使用更为灵活。
程序代码见程序2-2、2-3、2-44)schedule语句在使用parallel 语句进行累加计算时是通过编写代码来划分任务,再将划分后的任务分配给不同的线程去执行。
后来使用paralle for 语句实现是基于OpenMP 的自动划分,如果有n 次循环迭代k 个线程,大致会为每一个线程分配[n/k]各迭代。
由于n/k 不一定是整数,所以存在轻微的负载均衡问题。
我们可以通过子句schedule 来对影响负载的调度划分方式进行设置。
5)循环依赖性检查以对π 的数值估计的方法为例子来探讨OpenMP 中的循环依赖问题。
圆周率π(Pi)是数学中最重要和最奇妙的数字之一,对它的计算方法也是多种多样,其中适合采用计算机编程来计算并且精确度较高的方法是通过使用无穷级数来计算π 值。
并行程序实验报告

并行程序实验报告( 一).并行程序的简介。
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)多程序多数据并行计算机的概念。
华科计算机并行实验报告

课程设计报告题目:并行实验报告课程名称:并行编程原理与实践专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1,实验一 (1)1 实验目的与要求 (1)1.1实验目的 (1)1.2实验要求 (1)2 实验内容 (1)2.1.1熟悉pthread编程 (1)2.1.2简单的thread编程 (2)2.2.1熟悉openMP编程 (3)2.3.1熟悉MPI编程 (4)2,实验2~5 (7)1 实验目的与要求 (7)2 算法描述 (7)3.实验方案 (8)4实验结果与分析 (8)3 心得体会 (10)附录: (10)3 蒙特.卡罗算法求π的并行优化 (19)1.蒙特.卡罗算法基本思想 (19)2.工作过程 (20)3.算法描述 (20)4 设计与实现 (21)5 结果比较与分析 (23)6 思考与总结 (24)1,实验一1 实验目的与要求1.1实验目的1)熟悉并行开发环境,能进行简单程序的并行开发,在Linux下熟练操作。
2)熟悉一些并行工具,如pthread,OpenMP,MPI等进行并行编程3)培养并行编程的意识1.2实验要求1)利用pthread、OpenMP、MPI等工具,在Linux下进行简单的并行编程,并且掌握其编译、运行的方法。
2)理解并行计算的基础,理解pthread、OpenMP、MPI等并行方法。
2 实验内容2.1.1熟悉pthread编程Linux系统下的多线程遵循POSIX线程接口,称为 pthread。
编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
下面是pthread编程的几个常用函数:1,int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);返回值:若是成功建立线程返回0,否则返回错误的编号形式参数:pthread_t *restrict tidp 要创建的线程的线程id指针const pthread_attr_t *restrict attr 创建线程时的线程属性void* (start_rtn)(void) 返回值是void类型的指针函数void *restrict arg start_rtn的行参2 , int pthread_join( pthread_t thread, void **retval );thread表示线程ID,与线程中的pid概念类似;retval用于存储等待线程的返回值连接函数pthread_join()是一种在线程间完成同步的方法。
哈工大软件学院并行程序设计课程实验报告之二

《并行程序设计》课程实验报告实验2:基于Windows Thread和OpenMP的多线程编程姓名*** 院系软件学院学号**********任课教师张伟哲指导教师苏统华实验地点软件学院五楼机房实验时间2015年4月8日实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、实验目的要求:需分析本次实验的基本目的,并综述你是如何实现这些目的的?一、1.熟练掌握C++语言;。
2、掌握Visual Studio* .NET*集成开发环境的使用;3、掌握Windows32 Thread API开发多线程程序;4、掌握Windows32 Thread API中互斥机制的使用方式二、1.掌握OpenMP的基本功能、构成方式、句法;2、掌握OpenMP体系结构、特点与组成;3、掌握采用OpenMP进行多核架构下多线程编程的基本使用方法和调试方法。
二、实验内容该部分填写在实验过程中,你都完成了哪些工作。
一、1. 定位到文件夹Win32 Threads\ HelloThreads\,用Microsoft Visual studio打开文件HelloThread.sln,编译并运行程序;2. 对main.cpp中函数进行修改,要求输出线程创建顺序(例如:Hello Thread 0, Hello Thread 1, Hello Thread 2 等等);注意:利用CreateThread()循环变量作为每个线程的执行顺序唯一标识3. 编译并多次运行程序,记录线程执行顺序,分析线程程序执行顺序是否不可预见及其产生原因4. 定位到文件夹Win32 Threads\ Pi\,用Microsoft Visual studio打开文件Pi.sln,编译并运行程序;5. 对此串行代码使用Windows32 Thread API进行线程化,要求4线程实现,且每次迭代计算仅由一个线程完成6. 使用CRITICAL_SECTION机制和Semaphors机制对多线程共享变量进行互斥操作,避免数据竞争。
并行程序设计实验报告

并行程序设计实验报告实验报告:并行程序设计一、实验目的本实验旨在通过并行程序设计,提高程序的执行效率和性能,减少串行程序在处理大规模数据时出现的效率瓶颈。
二、实验原理1.任务划分:将大规模的任务划分成多个可并行执行的子任务。
2.任务分配:将各个子任务分配给不同的计算单元(如多线程、多进程、多核)进行处理。
3.任务合并:将各个子任务的计算结果进行合并,得到最终的结果。
三、实验内容本次实验主要涉及多线程编程和数据并行编程。
1.多线程编程多线程编程是指在一个单独的程序中同时运行多个线程,利用系统的多核资源来提高程序的执行效率。
多线程编程可以通过线程的创建、启动、运行和同步等操作来实现。
在本实验中,我们将使用C++编程语言,并利用其提供的多线程库来实现多线程编程。
具体步骤如下:(1)使用pthread库创建并启动多个线程。
(2)利用线程同步机制(如互斥锁、信号量等)保证线程的正确执行顺序和数据的正确性。
(3)通过编写并行程序,将大规模任务划分成多个子任务,并分配给不同的线程进行处理。
2.数据并行编程数据并行编程是指将大规模的数据划分成多个小块,并分配给多个计算单元(如GPU)进行并行处理。
每个计算单元都执行相同的计算操作,但操作的数据不同。
在本实验中,我们将使用CUDA平台进行数据并行编程。
(1)利用CUDA编程模型,将计算任务划分成多个线程块,并分配给不同的计算单元执行。
(2)通过编写并行程序,实现数据的划分和映射、任务的分配和协调。
四、实验结果经过多次实验,我们发现并行程序设计在处理大规模数据时能够显著提高程序的执行效率和性能。
相比于串行程序,多线程编程和数据并行编程分别提高了X%和Y%的执行速度。
同时,我们也发现在设计并行程序时,要考虑到数据的划分和映射、任务的分配和协调、线程的同步和通信等方面的问题。
这些问题对于程序的性能和正确性都有着重要的影响。
五、实验总结通过本次实验,我们了解到并行程序设计的基本原理和技术,以及它在优化程序性能和提高执行效率方面的重要作用。
哈工大-软件学院-《并行程序设计》课程实验报告之三

《并行程序设计》课程实验报告实验3:基于Intel Thread Checker和Profiler工具的多线程调试与调优(2)运行结果:VTune 诊断结果程序中,哪些变量可以作为线程中的共享变量?r 和round 可以作为共享变量,这两个变量在线程运行前就已经确定,并且不会再变化。
②哪些变量应该作为每个线程的私有变量?线程内部定义的i, j, start, end, tid 等变量属于私有变量、③哪些变量出于线程的同步必须予以保护?distx, disty, distz, dist 和pot 出于线程同步的原因必须予以保护。
使用临界区对数据进行保护:EnterCriticalSection(&cs);distx = pow( (r[0][j] - r[0][i]), 2 );disty = pow( (r[1][j] - r[1][i]), 2 );distz = pow( (r[2][j] - r[2][i]), 2 );dist = sqrt( distx + disty + distz );pot += 1.0 / dist;LeaveCriticalSection(&cs);不再有冲突现象。
把粒子和循环量改成之前单线程程序potential的数量,重新编译运行。
运行结果如下可见运行结果与单线程程序是一样的,但是相对单线程程序相比,性能提升不明显,主要原因是线程之间大量的发生竞争。
(2)1. 运行结果VTune 诊断结果:分析:为什么不是每次都出现死锁问题?死锁需要两个线程相互持有mutex同时请求对方持有的mutex,然后线程的执行顺序是不确定的,因此并不是每次执行都会出现死锁。
改动代码如下:DWORD WINAPI work0 (void *arg){Sleep(5000);EnterCriticalSection( &cs0 );globalX++;EnterCriticalSection( &cs1 );globalY++;LeaveCriticalSection( &cs1 );LeaveCriticalSection( &cs0 );return 0;}DWORD WINAPI work1 (void *arg){EnterCriticalSection (&cs0);globalX++;使用VTune ,诊断结果已经正常:(3)直接运行使用OpenMP 优化后,出现读写冲突:更改代码#pragma omp sections{#pragma omp sectionfor (t = -2; t < 19; t++) {if(!gray_code(t, gc)) printf("%2d %s\n", t, gc);}#pragma omp sectionfor (s = 19; t < >-2; t++) {if(!gray_code(t, gc)) printf("%2d %s\n", t, gc);}}可以消除竞争二、(1)运行结果使用VTune(2) 直接运行使用Profiler(3)四、思考题[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。
MPI并行编程实验报告

MPI并行编程实验报告MPI并行编程实验报告起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MPD、CONF, 完成实验室中临近机器间的并行配置。
概要:以寝室四台计算机为例,设置IP(192、168、1、1~192、168、1、4),更改主机名为node01,node02,node03,node04。
(一)创建SSH信任连接1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:127、0、0、1 localhost、localdomain localhost192、168、1、1 node01192、168、1、2 node02192、168、1、3 node03192、168、1、4 node042、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹3、进入、ssh目录#cd 、ssh4、生成authorized_keys文件#cp id_rsa、pub authorized_keys5、退出到root目录#cd 、、6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全)7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2-1、0、1、tar、gz2、创建安装目录#mkdir /usr/MPICH-instsll3、进入mpich2解压目录#cd mpich2-1、0、14、设置安装目录#、/configureprefix=/usr/MPICH-install5、编译#make6、安装#make install7、退出到root目录#cd 、、8、通过编辑、bashrc文件修改环境变量#vi 、bashrc修改后的、bashrc文件如下:# 、bashrc# User specific aliases and functions aliasrm='rmi'alias mv='mvinstall/bin" 新增加的#Source global definitionsif[nstall目录输出给其他三个结点,相应的配置步骤如下。
并行程序实验报告,机械1005孙宏浩20102024

并行程序设计机械1005孙宏浩学号20102024本实验要求学生搭建并行环境并运行计算π的程序。
一、实验条件1.硬件基础几台电脑、路由器或集线器。
这次实验在计算中心进行,硬件条件已经具备采用网线通过集线器形成局域网。
2.软件基础使用MPICH软件搭建并行计算的环境。
二、实验步骤1.查看自己的IP地址、获取同一组的成员的IP地址。
首先点击开始按钮在运行中输入CMD命令回车运行,在弹出的窗口中输入ipconfig\all命令显示自己的ip地址及计算机名称等信息,我使用的电脑ip地址是172.16.164.201同时从小组成员那里得到他们的ip地址分别为:172.16.164.170 在CMD窗口内输入ping 172.16.164.170ping 172.16.164.1962.格式化d盘来得到一个易于操作的磁盘空间,然后登入在程序设计技术的课程的参考资源中下载mpich1.2.5软件并解压安装在d盘的d:\mpich中3.在d盘内建立一个work的文件夹并右键点击在属性中设置为共享在权限选项卡中设置为完全控制以达到能在三台计算机之间有一个共同的能够操作的空间。
以此达到构建并行计算的环境。
5、建立并行程序所要求的账户,来实现在另一台计算机上启动另一个进程的要求。
右键单击我的电脑然后选择管理在目录树下的用户上再次右键单击添加新用户小组内的三台电脑上使用相同的用户名和密码分别设为mpi mpi。
建立新用户后在用户的目录下找到mpi然后右键给mpi这个用户添加管理员的权限。
6、配置vc++6.0启动vc++6.0然后在菜单选项工程中点击选项,在选项的选项卡中点击目录在默认的条件下增加路径d:\mpich\sdk\include然后在增加lib的路径d:\mpich\sdk\lib增加sourcefile路径为d:\mpich\sdk\include7、打开工程所在位置为d:\mpich\sdk\esamples\nt\basic的目录在选项卡中文件类型选择所有文件然后打开工程。
《并行程序设计》课程实验报告之四

《并行程序设计》课程实验报告实验4:基于WINDOWS平台的MPI并行程序设计3. 在项目->属性->Linker“Command Line”中添加impi.lib impicxx.lib3.将C:\Program Files (x86)\Intel\MPI\5.0.1.037\intel64\bin里面的.dll文件添加到C:\WINDOWS\System32中4.使用intel编译器编译,生成.exe文件5.执行(管理员权限打开CMD,执行下边的命令)2. 进行如下实验并记录数据(实验报告中给出数据并绘图)3. CMD命令示例:mpiexec -hosts 2 Win-7-01 4 Win-7-02 4 C:\Users\nbody.exe 4000 500倒数第二个参数(4000)是body的总数量,也就是数据规模最后一个参数(500)是每个进程处理的数据量,这里两个节点一共启动了8个进程三、实验结果记录实验结果。
4.1一、配置电脑环境。
1. 基本网络设置:关闭杀毒软件、计算机防火墙,将小组里所有计算机连接到同一个交换机上,查看每台计算机ip,使用ping命令测试,保证互相之间能够ping通。
2. 网络连接设置:由于需要在cluster上运行同一个程序,为了实现相互之间能连接成功,要注意需要保证小组内每台电脑有相同的管理员账户和密码。
例如小组中的账号密码都可以设为二、单机上编译运行简单的test程序1.打开test工程选择x64编译2. 在项目->属性->VC++目录“包含目录”中添加C:\Program Files (x86)\Intel\MPI\5.0.1.037\intel64\include;“库目录”添加C:\Program Files (x86)\Intel\MPI\5.0.1.037\intel64\lib;3. 在项目->属性->Linker“Command Line”中添加impi.lib impicxx.lib3.将C:\Program Files (x86)\Intel\MPI\5.0.1.037\intel64\bin里面的.dll文件添加到C:\WINDOWS\System32中4.使用intel编译器编译,生成.exe文件5.执行(管理员权限打开CMD,执行下边的命令)smpd –installsmpd -starthydra_service –installhydra_service –startmpiexec –register设置电脑账户和密码。
MPI并行设计程序实验报告一:MPI简介对MPI的定义是多种多样的,但

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 苧四:实验总结趣,在以后的学习中,我会更加努力的学习关于计算机的知识。
并行程序设计导论实验报告11123508盛骁文

并行程序设计导论实验报告11123508盛骁文用OpenMP进行共享内存编程实验报告 11123508 盛骁文实验一:程序5-1 一个使用OpenMP的”hello world”程序源代码:#include <stdio.h>#include <stdlib.h>#include <omp.h>void Hello(void);int main(int argc,char* argv[]){int thread_count = strtol(argv[1],NULL,10);# pragma omp parallel num_threads(thread_count)Hello();return 0;}void Hello(void){int my_rank = omp_get_thread_num();int thread_count = omp_get_num_threads();printf("Hello from thread %d of %d\n",my_rank,thread_count); }实验运行结果:实验心得:有多个线程运行程序,线程会竞争访问标准输出,因此不保证输出会按线程编号的顺序出现,输出可能是任何其他的线程编号的排列。
实验二:程序5-2 第一个OpenMP梯形积分法程序源代码:#include <stdio.h>#include <stdlib.h>#include <omp.h>void Trap(double a,double b,int n,double* global_result_p);int main(int argc,char* argv[]){double global_result =0.0;double a,b;int n;int thread_count;thread_count = strtol(argv[1],NULL,10);printf("Enter a,b, and n\n");scanf("%lf %lf %d",&a,&b,&n);# pragma omp parallel num_threads(thread_count)Trap(a,b,n,&global_result);printf("With n = %d trapezoids,our estimate\n",n);printf("of the integral from %f to %f = %.14\n,a,b,global_result");return 0;}double f(double x){return 0;}void Trap(double a,double b,int n,double* global_result_p){ double h,x,my_result;double local_a,local_b;int i,local_n;int my_rank = omp_get_thread_num();int thread_count = omp_get_num_threads();h = (b-a)/n;local_n = n/thread_count;local_a = a + my_rank*local_n*h;local_b = local_a + local_n*h;my_result = (f(local_a)+f(local_b))/2.0;for (i = 1;i<= local_n-1;i++){x = local_a + i*h;my_result += f(x);}my_result = my_result*h;# pragma omp critical*global_result_p += my_result;}实验运行结果:。
并行计算实验三报告

广东技术师范学院实验报告实验 (三)一、实验目的在一个局域网中建立能够互相通信的两台计算机,实现两台计算机并行运算。
二、实验内容:要求:用MPI_Isend 和MPI_Irecv 代替代码deadlock.c 中的MPI_send 和MPI_recv 来避免出现程序死锁。
程序代码deadlock.c 参考如下 #include <stdio.h> #include <string.h> #include "mpi.h"#define SIZE 16 intmain(int argc, char **argv) {static int buf1[SIZE], buf2[SIZE]; int nprocs, rank, tag, src, dst; MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* 获取总进程数*/ MPI_Comm_rank(MPI_COMM_WORLD, &rank); /* 获取本进程的进程号*//* 初始化buf1 */ memset(buf1, 1, SIZE); tag = 123;dst = (rank >= nprocs - 1) ? 0 : rank + 1; src = (rank == 0) ? nprocs - 1 : rank - 1;MPI_Send(buf1, SIZE, MPI_INT, dst, tag, MPI_COMM_WORLD);MPI_Recv(buf2, SIZE, MPI_INT, src, tag, MPI_COMM_WORLD, &status); MPI_Finalize();return 0;}实验源程序代码:#include "mpi.h"#include <stdio.h>#include <iostream.h>#include <fstream.h>void main(int argc, char *argv[]){int rank, size;const int MAXX = 8;const int MAXY = 3;const int MAXPROCESSOR = 64;int myid, namelen;float Data[8][8];int ArraySize[2];int i, j, k;double startwtime, endwtime;char processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Request *Status;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Get_processor_name(processor_name, &namelen);if(rank == 0){ifstream in("input.txt");in>>ArraySize[0]>>ArraySize[1];for(i = 0; i < ArraySize[0]; i++)for(j = 0; j < ArraySize[1]; j++)in>>Data[i][j];cout<<"二维数组如下:"<<endl;for(i = 0; i < ArraySize[0]; i++){for(j =0; j < ArraySize[1]; j++)cout<<Data[i][j]<<" ";cout<<endl;}}MPI_Bcast(ArraySize, 2, MPI_INT, 0, MPI_COMM_WORLD);int AverageLineNumber, HeavyProcessorNumber, MyLineNumber;int CurrentLine, StartLine, SendSize;float SendArray[8*3];MPI_Request *IERROR;AverageLineNumber = ArraySize[0]/size;HeavyProcessorNumber = ArraySize[0]%size;if(rank < HeavyProcessorNumber)MyLineNumber = AverageLineNumber + 1;elseMyLineNumber = AverageLineNumber;if(rank == 0){CurrentLine = ArraySize[0];for(i = size - 1; i >= 0; i--){SendSize = 0;if(i == 0)startwtime = MPI_Wtime();if(i < HeavyProcessorNumber)StartLine = CurrentLine - AverageLineNumber;elseStartLine = CurrentLine - AverageLineNumber + 1;for(j = StartLine; j < CurrentLine; j++)for(k = 0; k < ArraySize[1]; k++)SendArray[SendSize++] = Data[j][k];if(i != 0)MPI_Send(SendArray, SendSize, MPI_FLOAT, i, 10, MPI_COMM_WORLD);CurrentLine = StartLine - 1;}}elseMPI_Irecv(SendArray, MyLineNumber * ArraySize[1], MPI_FLOAT, 0, 10, MPI_COMM_WORLD, Status);float Sum;Sum = 0;for(i = 0; i < MyLineNumber * ArraySize[1]; i++)Sum += SendArray[i];float ALLSum[64];MPI_Gather(&Sum, 1, MPI_FLOAT, ALLSum, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);Sum = 0;if(rank == 0){for(i = 0; i < size; i++)Sum += ALLSum[i];endwtime = MPI_Wtime();cout<<"二维数据所有元素和为:"<<Sum<<endl;printf("运行时间为:%f\n", endwtime-startwtime);}MPI_Finalize();}单机运行:多机运行:三、实验分析与结论经过多次在机房与同学互相讨论,最终解决问题,成功实现多机执行。
实验八:多线程和并行程序设计

西华大学实验报告第组西华大学实验报告(理工类)开课学院及实验室:、实验目的1、了解多线程和并行的基本概念。
2、掌握多线程的创建方法。
3、学会启动线程并执行命令。
4、学会使用 BackGroundWorker 类。
5、了解异步编程基本概念以及学会基于委托的异步编程。
、实验原理Framework 允许异步调用任何方法。
为此,应定义与要调用的方法具有相同签名的委托;公共语言运行时会自动使用适当的签名为该委托定义Begininvoke 和Endinvoke 方法。
Begi nin voke 方法启动异步调用。
该方法与需要异步执行的方法具有相同的参数,还有另外两个可选参数。
第一个参数是一个Asyn cCallback 委托,该委托引用在异步调用完成时要调用的方法。
第二个参数Begininvoke 返回一个IAsyncResult ,后者可用于监视异步调用的进度。
Endinvoke 方法检索异步调用的结果。
在调用BeginInvoke 之后随时可以调用该方法。
如果异步调用尚未完成,则EndInvoke 会一直阻止 调用线程,直到异步调用完成。
EndInvoke 参数包括需要异步执行方法中的out 和ref 参数(在VisualBasic 中为 ByRef 和 ByRef )以及由 Begininvoke 返回的 IAsyncResult。
有四种使用Begininvoke 和EndInvoke 进行异步调用的常用方法。
调用了 Begininvoke 后,可以:1.进行某些操作,然后调用EndIn voke 一直阻塞到调用完成。
2. 使用 IAsy ncResult.As yn cWaitHa ndle 获取 WaitHa ndle ,使用它的 Wait One 方法将执行一直阻实验时间:异步编程的基础是委托与多线程,基于委托的异步编程,Begi nin voke 是实现异步调用的核心。
.NET是一个用户定义的对象,该对象将信息传递到回调方法。
哈工大软件学院《并行程序设计》课程实验报告材料之四

《并行程序设计》课程实验报告实验4:基于WINDOWS平台的MPI并行程序设计运行测试程序:在调试模式下运行:使用不同的命令运行:二、运行过程截图:实验结果记录如下:实验一:单机上,数据规模为4000时,随每机进程数变化的运行时间;进程数 1 2 3 4 5 时间实验二:一样数据规模为4000,随每机进程数变化的运行时间每机进程数单机双机三机四机1234 0.453638实验三:每机1个进程,随数据规模变化的n-body并行程序运行时间。
粒子数n 单机双机三机四机105010050010002000300040003. 根据记录的数据计算加速比与效率〔给出数据并绘图〕实验一:单机上,粒子数为4000,随进程数变化加速比〔Sp〕统计进程数 2 3 4 5 6 7 8 9 10 加速比实验二:粒子数为4000,随每机进程数变化的加速比每机进程数三机四机1234实验三:每机1个进程,随数据规模变化的n-body并行程序加速比和效率n-body并行算法的加速比〔Sp〕统计表粒子数n 双机三机四机10501005001000200030004000n-body并行算法的效率〔Ep〕统计表粒子数n 双机三机四机10501005001000200030004000四、思考题思考题1:深入分析并行nbody的机理,阐述其根本并行思想,给出其流程图N体问题的并行实现算法使用SPMD〔单程序多数据流〕计算模型,每个进程将执行一样的代码。
假设有m个计算资源,每个资源上启动一个进程,表示进程的标号是0、1、2、……m-1,每个进程分配的物体数是n0、n1、n2、……n(m-1),其中n0 + n1 + n2 + ……+ n(m-1) = n。
每个进程主要有两个数组localparticles、allparticles、sendbuf、recvbuf,其中localparticles用于保存分配给本进程的物体的信息;allparticles用于保存应用程序中所有物体的信息;sendbuf用于保存发送到下一个进程的物体;recv用于保存从前一个进程承受的物体。
并行编程实验报告

课程实验报告课程名称:并行编程专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验一 (3)1. 实验目的与要求 (3)2. 实验内容 (3)3. 实验结果 (3)实验二 (4)1. 实验目的与要求 (4)2. 算法描述 (4)3. 实验方案 (4)4. 实验结果与分析 (6)实验三 (7)1. 实验目的与要求 (7)2. 算法描述 (7)3. 实验方案 (7)4. 实验结果与分析 (8)实验四 (9)1. 实验目的与要求 (9)2. 算法描述 (9)3. 实验方案 (9)4. 实验结果与分析 (12)实验五 (13)1.实验目的与要求 (13)2.算法描述 (13)3.实验方案 (13)4.实验结果与分析 (15)PROJECT2 (17)AIM: (17)HYPOTHESIS: (17)METHODS: (17)RESULT: (17)DICUSSION&CONCLUSION (18)REFERENCE (19)1.实验目的与要求become familiar with the parallel development environments, and the basic principles and methods of parallel programming and performance optimization by using tools and frameworks like pthread, OpenMP, MPI under Linux system. 2.实验内容熟悉并行开发环境,掌握并行编程用到的工具如线程、OpenMP,、MPI等。
3.实验结果通过上机操作熟悉了各种命令,编写了简单的程序熟悉开发环境。
1.实验目的与要求a)master the basic principles and methods of parallelprogramming design and performance optimization using pthreadb)understand the basic method for data partition and taskdecomposition in parallel programmingc)implement the parallel algorithm of calculating the value of piusing pthreadd)then carries on the simple analysis and summary of theprogram execution results2.算法描述采用蒙特卡洛方法计算圆周率,利用单位圆与边长为1的正方形面积之比计算圆周率的近似值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《并行程序设计》
实验报告
2018/07/04
华南理工大学本科实验报告课程名称并行程序设计成绩评定
实验项目名称MPI+OpenMP实现PSRS排序实验。
数据量大小1G个整型数。
1、实验目标
(1)利用visual studio配置MPI环境和mpi混合编译环境;
(2)MPI+OpenMP实现PSRS排序实验。
数据量大小1G个整型数。
2、串行程序代码(串行程序已经放在网络教学平台,请把主要代码部分摘抄在下面)
void Odd_even_sort(
int a[] /* in/out */,
int n /* in */) {
int phase, i, temp;
for (phase = 0; phase < n; phase++)
if (phase % 2 == 0) { /* Even phase */
for (i = 1; i < n; i += 2)
if (a[i-1] > a[i]) {
temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
}
} else { /* Odd phase */
for (i = 1; i < n-1; i += 2)
if (a[i] > a[i+1]) {
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
} /* Odd_even_sort */
3、并行程序关键代码
4、性能分析
表3 采用4进程时,使用不同线程数在1G数据集上的测试结果
图1 串行:
图2 1G数据1、2、4进程+1线程:
图3 1G数据1、2、4进程+2线程:
图4 1G数据1、2、4进程+4线程:
图5 1G数据1、2、4进程+8线程:
图6:不同进程分别在不同线程下排序所需要的时间
5、总结
本次实验的机器是4核CPU,每个核有8个逻辑处理器,因此分别进行了1、2、4进程搭配1、2、4、8线程的实验,从实验结果来看,只有在单进程的时候,将线程数增加到8才取得了更好的效果,而进程数的增加反而更慢了。
特别的是在4进程的时候,算法的性能相比于2进程有很大的提升,但是仍然不如串行的性能好。
6、附件
Mpi_omp_int_vs.cpp。