并行编程报告

合集下载

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

并行程序设计实验报告-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种不同类型的多线程同步机制:排它锁、原子操作和临界区。

并行程序实验报告

并行程序实验报告

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

华科并行实验报告

华科并行实验报告

一、实验模块计算机科学与技术二、实验标题并行计算实验三、实验目的1. 了解并行计算的基本概念和原理;2. 掌握并行编程的基本方法;3. 通过实验加深对并行计算的理解。

四、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 并行计算平台:OpenMP五、实验步骤1. 准备实验环境首先,在计算机上安装OpenMP库,并配置环境变量。

2. 编写并行计算程序编写一个简单的并行计算程序,实现以下功能:(1)计算斐波那契数列的第n项;(2)计算素数的个数;(3)计算矩阵乘法。

以下为斐波那契数列的并行计算程序示例:```cpp#include <omp.h>#include <iostream>using namespace std;int main() {int n = 30;int fib[31] = {0};fib[0] = 0;fib[1] = 1;#pragma omp parallel forfor (int i = 2; i <= n; i++) {fib[i] = fib[i - 1] + fib[i - 2];}cout << "斐波那契数列的第" << n << "项为:" << fib[n] << endl; return 0;}```3. 编译程序使用g++编译器编译程序,并添加OpenMP库支持。

```bashg++ -fopenmp -o fib fib.cpp```4. 运行程序在命令行中运行编译后的程序,观察结果。

5. 分析结果通过对比串行计算和并行计算的结果,分析并行计算的优势。

六、实验过程1. 准备实验环境,安装OpenMP库并配置环境变量;2. 编写并行计算程序,实现斐波那契数列的并行计算;3. 编译程序,并添加OpenMP库支持;4. 运行程序,观察结果;5. 分析结果,对比串行计算和并行计算的性能。

并行程序设计实验报告-OpenMP 进阶实验

并行程序设计实验报告-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)多程序多数据并行计算机的概念。

简单并行接口实验报告

简单并行接口实验报告

简单并行接口实验报告班级:电信1001 姓名:张贵彬学号:201046830213实验一锁存器74LS273一、实验目的掌握简单并行接口的工作原理及使用方法。

二、实验内容1、按简单并行输出接口电路图连接线路(74LS273插通用插座,74LS32用实验台上的“或门”)。

74LS273为八D触发器,8个D输入端分别接数据总线D0~D7,8个Q输出端接LED显示电路L0~L7。

2、编程从键盘输入一个字符或数字,将其ASCⅡ码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。

三、编程提示上述并行输出接口的地址为2A8H,并行输入接口的地址为2A0H,通过上述并行接口电路输出数据需要3条指令:MOV AL,数据MOV DX,2A8HOUT DX,AL通过上述并行接口输入数据需要2条指令:MOV DX,2ADHIN AL,DX四、实验电路图五、实验流程图六、实验程序ls273 equ2a8hcode segmentassume cs:codestart:mov ah,2;回车符mov dl,0dhint21hmov ah,1;等待键盘输入int21hcmp al,27;判断是否为ESC键je exit ;若是则退出mov dx,ls273 ;若不是,从2A8H输出其ASCII码out dx,aljmp start ;转startexit: mov ah,4ch;返回int21hcode endsend start七、实验结果实验二数据缓冲器74LS244一、实验目的掌握简单并行接口的工作原理及使用方法。

二、实验内容1、按下面图2-2简单并行输入接口电路图连接电路(74LS244插通用插座,74LS32用实验台上的“或门”)。

74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关输出K0~K7,8个数据输出端分别接数据总线D0~D7。

2、用逻辑电平开关预置某个字母的ASCⅡ码,编程输入这个ASCⅡ码,并将其对应字母在屏幕上显示出来。

软件开发岗位实习报告:并发与并行编程实践经验

软件开发岗位实习报告:并发与并行编程实践经验

软件开发岗位实习报告:并发与并行编程实践经验一、导言在软件开发领域,随着计算机技术的不断发展,多核处理器的普及与应用,对于并发与并行编程的需求越来越迫切。

作为一名软件开发岗位的实习生,我有幸参与了一个项目,其中涉及到了并发与并行编程。

本次实习报告将总结我在项目中的实践经验,分享关于并发与并行编程的一些技巧和心得。

二、并发与并行编程的概念在开始进入实践经验的分享之前,我们先来了解一下并发与并行编程的概念。

并发编程是指程序的设计和实现中同时处理多个任务(称为线程)的能力。

在一个应用中,可以通过创建多个线程来执行不同的任务,从而提高系统的响应能力和效率。

并发编程的关键在于如何解决多个线程之间的并发访问和资源竞争问题。

而并行编程是指在物理上同时运行多个线程,利用多核处理器的优势,加速计算过程。

与并发编程相比,它更加追求任务的同时执行,尽量减少线程之间的等待时间。

三、并发编程的实践经验以下是我在实习过程中总结的一些并发编程的实践经验:1. 合理设计任务拆分:将一个大型任务拆分成多个小任务,然后通过创建多个线程并发执行这些小任务,可以提高程序的执行效率。

任务拆分的关键在于找准拆分的细粒度,尽量避免过细或过粗的拆分,以充分利用多线程的优势。

2. 注意线程之间的同步:线程之间的同步是并发编程中需要解决的关键问题。

通过适当使用锁机制、信号量、条件变量等同步手段,可以保证线程之间的互斥访问,避免数据竞争和死锁等问题。

3. 高效利用资源:在并发编程中,资源的合理利用是非常重要的。

例如,可以通过线程池来控制并发执行的线程数量,避免创建过多的线程,从而有效地管理系统资源。

4. 考虑异常处理:在并发编程中,由于多线程之间的相互依赖和调用,异常的处理变得比较复杂。

需要注意捕获和处理线程异常,保证程序的正确执行,并及时释放相应的资源。

四、并行编程的实践经验以下是我在实习过程中总结的一些并行编程的实践经验:1. 合理地任务划分:针对计算密集型任务,可以将任务划分为多个小任务,并行执行,将计算压力均匀地分散到多个处理器核心上,提高计算效率。

华科计算机并行实验报告

华科计算机并行实验报告

课程设计报告题目:并行实验报告课程名称:并行编程原理与实践专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录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()是一种在线程间完成同步的方法。

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

并行编程报告课程名称:并行编程原理专业班级:物联网1102 班学号 : U*********学生姓名:***指导教师:**报告日期:2014-6-11计算机科学与技术学院目录实验一:利用pthread 并行实现矩阵的乘法运算 (3)实验目的 (3)实验概述 (3)实验结果 (3)实验代码 (5)实验总结 (9)实验二:使用并行方法优化K-means 算法 (10)实验目的 (10)实验概述 (10)实验结果 (10)实验代码............................................................................................. .11实验总结............................................................................................. .18实验一:利用 pthread 并行实现矩阵的乘法运算实验目的该实验旨在让学生掌握利用 pthread 进行并行程序设计和性能优化的基本原理和方法,了解并行程序设计中数据划分和任务划分的基本方法,并能够利用pthread 实现矩阵的乘法运算的并行算法,然后对程序执行结果进行简单分析和总结。

具体包括:利用 for 循环编写串行的矩阵乘法运算;熟悉 pthread 进行线程创建、管理和销毁的基本原理和方法;利用 pthread 对上述串行的矩阵乘法运算加以改造;通过调整数据划分和任务划分的粒度(改变工作线程的数目),测试并行程序的执行效率;对实验结果进行总结和分析。

实验概述使用 pThread 完成这项工作。

创建一个新的线程:int pthread_create( pthread_t *thread,const pthread_attr_t *attr,void *(*func) (void *),void *arg);thread 表示线程 ID,与线程中的 pid 概念类似attr 表示设定线程的属性,可以暂时不用考虑func 表示新创建的线程会从这个函数指针处开始运行arg 表示这个函数的参数指针返回值为 0 代表成功,其他值为错误编号。

主进程等待线程结束:int pthread_join( pthread_t thread, void **retval );thread 表示线程 ID,与线程中的 pid 概念类似retval 用于存储等待线程的返回值两个矩阵相乘:一个 m 行 n 列的矩阵与一个 n 行 p 列的矩阵可以相乘,得到的结果是一个m 行 p 列的矩阵,其中的第 i 行第 j 列位置上的数为第一个矩阵第 i 行上的 n 个数与第二个矩阵第 j 列上的 n 个数对应相乘后所得的 n 个乘积之和。

实验结果实验随机产生的矩阵 B 的数据并行以及串行计算时间对比实验代码1.并行计算矩阵相乘代码:#include<stdio.h>#include<time.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>#include<memory.h>/*定义矩阵中元素的上限,避免相乘后溢出*/#define RANGE 150/*矩阵A有M行N列,矩阵B有N行M列*/#define M 200#define N 300int matrixA[M][N];int matrixB[N][M];int arr[M][M][N];int res[M][M]={0};void *func(void *arg);void put();void *func(void *arg)//每个子线程要完成的任务{int k=*(int *)arg;int i,j;for(i=0;i<M;i++)for(j=0;j<M;j++)arr[i][j][k]=matrixA[i][k]*matrixB[k][j];pthread_exit(NULL);}main(){//随即产生两个矩阵int i,j,k;srand((unsigned)time(NULL));for(i=0;i<M;i++)for(j=0;j<N;j++)matrixA[i][j] = rand()%RANGE;for(i=0;i<N;i++)for(j=0;j<M;j++)matrixB[i][j] = rand()%RANGE;clock_t start=clock();//开始计时pthread_t tids[N];for(i=0;i<N;i++){if(pthread_create(&tids[i],NULL,func,(void *)&i)) //产生线程,去完成矩阵相乘的部分工作量{perror("pthread_create");exit(1);}}for(i=0;i<N;i++)pthread_join(tids[i],NULL);//等待所有的子线程计算结束for(i=0;i<M;i++) //合。

for(j=0;j<M;j++)for(k=0;k<N;k++)res[i][j]+=arr[i][j][k];clock_t finish=clock();//结束计算printf("并行计算用时%.2f秒\n",(long)(finish-start)/1E6);put();exit(0);}void put(){FILE *file1,*file2,*file3;if((file1=fopen("matrixA","wt"))==NULL) {perror("fopen");exit(1);}if((file2=fopen("matrixB","wt"))==NULL) {perror("fopen");exit(1);}if((file3=fopen("res","wt"))==NULL){perror("fopen");exit(1);}int i,j,k;for(i=0;i<M;i++){for(j=0;j<N;j++)fprintf(file1,"%-8d",matrixA[i][j]); fprintf(file1,"\n");}fclose(file1);for(i=0;i<N;i++){for(j=0;j<M;j++)fprintf(file2,"%-8d",matrixB[i][j]); fprintf(file2,"\n");}fclose(file2);for(i=0;i<M;i++){for(j=0;j<M;j++)fprintf(file3,"%-8d",res[i][j]);fprintf(file3,"\n");}fclose(file3);}2.串行计算矩阵相乘代码:#include<stdio.h>#include<time.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>#include<memory.h>/*定义矩阵中元素的上限,避免相乘后溢出*/#define RANGE 150/*矩阵A有M行N列,矩阵B有N行M列*/#define M 200#define N 300int matrixA[M][N];int matrixB[N][M];int arr[M][M][N];int res[M][M]={0};void *func(void *arg);void put();main(){//随即产生两个矩阵int i,j,k;srand((unsigned)time(NULL));for(i=0;i<M;i++)for(j=0;j<N;j++)matrixA[i][j] = rand()%RANGE;for(i=0;i<N;i++)for(j=0;j<M;j++)matrixB[i][j] = rand()%RANGE;clock_t start=clock();//开始计时for(i=0;i<M;i++)for(j=0;j<M;j++)for(k=0;k<N;k++)res[i][j]+=matrixA[i][k]*matrixB[k][j]; clock_t finish=clock();//结束计算printf("串行计算用时%.2f秒\n",(long)(finish-start)/1E6);put();exit(0);}void put(){FILE *file1,*file2,*file3;if((file1=fopen("matrixA","wt"))==NULL){perror("fopen");exit(1);}if((file2=fopen("matrixB","wt"))==NULL){perror("fopen");exit(1);}if((file3=fopen("res","wt"))==NULL){perror("fopen");exit(1);}int i,j,k;for(i=0;i<M;i++){for(j=0;j<N;j++)fprintf(file1,"%-8d",matrixA[i][j]);fprintf(file1,"\n");}fclose(file1);for(i=0;i<N;i++){for(j=0;j<M;j++)fprintf(file2,"%-8d",matrixB[i][j]);fprintf(file2,"\n");}fclose(file2);for(i=0;i<M;i++){for(j=0;j<M;j++)fprintf(file3,"%-8d",res[i][j]);fprintf(file3,"\n");}fclose(file3);}实验总结由于本次随机矩阵相乘的计算量不是很大,所以最终的比较结果是,串行计算时间要远远小于并行计算时间,其主要原因是因为并行计算中要创建,销毁线程,这个过程消耗了大部分时间。

相关文档
最新文档