当前位置:文档之家› MPI并行编程实验报告

MPI并行编程实验报告

MPI并行编程实验报告
MPI并行编程实验报告

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 1,10,*

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)

SENDBUF(*), RECVBUF(*)INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE,SOURCE, RECVTAG, M,STATUS(MPI_STATUS_SIZE), IERROR虚拟进程program main implicit none include 'mpif、h' integer totalsize,mysize,steps parameter (totalsize=16) parameter (mysize=totalsize/4,steps=10) integer n, myid, numprocs, i, j,rc real

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 f(a)

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;

并行计算1

并行计算 实 验 报 告 学院名称计算机科学与技术学院专业计算机科学与技术 学生姓名 学号 年班级 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 #include #include #include void mian(){ int id; if(fork()==0) {printf(“child id is %d\n”,getpid()); } else if(fork()==0) {printf(“child2 id %d\n”,getpid()); } else {id=wait(); printf(“parent id is %d\n”,getpid()); }

多核编程与并行计算实验报告 (1)

(此文档为word格式,下载后您可任意编辑修改!) 多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日

实验一 // exa1.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! "; } return 0; } int main(int argc, char* argv[]) { int input=0; HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED,

单片机并行口实验报告

单片机并行口实验报告

实验二并行口实验报告 班级: 学号: 姓名: 教师:

一、实验目的 通过实验了解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 #define uchar unsigned char #define ON 0 #define OFF 1 sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay1(void); void main(void) { led1=led2=led3=led4=led5=led6=led7=led8=O FF; while(1) { led1=led8=ON; delay1(); led2=led7=ON;

并行计算第一次实验报告

并行计算上机实验报告题目:多线程计算Pi值 学生姓名 学院名称计算机学院 专业计算机科学与技术时间

一. 实验目的 1、掌握集群任务提交方式; 2、掌握多线程编程。 二.实验内容 1、通过下图中的近似公式,使用多线程编程实现pi的计算; 2、通过控制变量N的数值以及线程的数量,观察程序的执行效率。 三.实现方法 1. 下载配置SSH客户端 2. 用多线程编写pi代码 3. 通过文件传输界面,将文件上传到集群上 4.将命令行目录切换至data,对.c文件进行编译 5.编写PBS脚本,提交作业 6.实验代码如下: #include

#include #include #include #include #include static double PI=0; static int N=0; static int numOfThread=0; static int length=0; static int timeUsed=0; static int numOfThreadArray[]={1,2,4,6,8,10,12,14,16,20,24,30}; static int threadArraySize=12; static int nTime=4; static int repeatTime=30; static double totalTime=0; struct timeval tvpre, tvafter; pthread_mutex_t mut; clockid_t startTime,endTime;

并行处理实验报告:用MPI实现的矩阵乘法的加速比分析

华中科技大学 课程名称并行处理 实验名称矩阵乘法的实现及加速比分析考生姓名李佩佩 考生学号 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 ”,这样生成的A、B矩阵就不一样了,但很快问题又出现了,在Xshell中不能识别头文件“#include ”。所以,最后决定用下面的方法生成矩阵A和B,B是A的转置。 //稠密矩阵的生成方法 void InitMatrix(int *M,int *N,int len) { srand((unsigned)time( NULL)); for(i=0; i < len*len; i++)

矩阵乘法的并行化 实验报告

北京科技大学计算机与通信工程学院 实验报告 实验名称: 学生姓名: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间: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);

多核编程与并行计算实验报告 (1)

多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日 实验一 // exa1.cpp : Defines the entry point for the console application.

// #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! ";

并行口实验实验报告

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实现及性能分析

深圳大学 实验报告 课程名称:并行计算 实验名称:矩阵乘法的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 计时: 用中的clock_t clock( void )函数得到当前程序执行的时间 Linux 计时: #include

虚拟化与云计算实验报告.

实验报告 课程名称虚拟化与云计算学院计算机学院 专业班级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并行编程实验报告

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

基于openMP的并行计算实验

基于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 #include<> #define size 10000 using namespace std; int a[size][size], b[size][size], c[size][size]; int main() { for(int i=0;i!=size;++i) //initial the matrix for(int j=0;j!=size;++j){ a[i][j]=1; b[i][j]=2; } double start=omp_get_wtime(); omp_set_num_threads(4); #pragma omp parallel for for(int i=0;i

分支程序设计实验实验报告

分支程序设计实验实验报告

————————————————————————————————作者:————————————————————————————————日期: ?

实验二分支程序设计实验实验报告 实验名称:分支程序设计实验 指导教师罗志祥 专业班级光信1006 姓名张博学号U201013339 联系方式

一、任务要求: 熟练掌握K eil C环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行IO 口的使用。 1. 设有8bits 符号数X 存于外部R AM 单元,按以下方式计算后的结果Y 也存于外部RAM 单元,请按要求编写程序。 240/2204020X X Y X X X X ?≥? =<

实验二 MATLAB并行计算的配置

实验二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进行计算: 五、实验报告要求 简述实验目的;写出实验内容中解答各个题目所需要的命令及实验结果;简写实验总结与心得体会。

并行计算实验题目(OpenMP)

上机地点:电三楼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编写矩阵乘法程序。

相关主题
文本预览
相关文档 最新文档