并行计算实验报告(高性能计算与网格技术)

并行计算实验报告(高性能计算与网格技术)
并行计算实验报告(高性能计算与网格技术)

高性能计算和网格技术

实验报告

实验题目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/

n

A的第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

{

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; //线程ID

int myk = my_data->K_number; //外层循环计数K

float 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 分解。

在LU 分解的过程中,主要的计算是利用主行i 对其余各行j ,(j )i )做初等行变换,由于各行计算之间没有数据相关关系,因此可以对矩阵按行划分来实现并行算法。

考虑到计算过程中处理器负载的均衡,对矩阵采用行交叉划分;假设处理器个数为p ,矩阵的阶数为n ,则每个处理器处理的行数为

??p n m /=。

由于在OpenMP 和MPI 中并行算法的实现不太一样,所以接下来的两小节中我将分别针对两个编程环境设计LU 分解的并行实现。

3.2、OpenMP 编程

因为OpenMP 是基于线程的编程模型,所以设计了一个基于多

线程的OpenMP 的LU 分解算法,关键代码如下:

for(k = 0;k

tid=omp_get_thread_num(); //当前线程ID

int myid = tid;

printf("hello world from OMP thread %d \n",tid);

int myk = k;

float mychushu = A[k][k];

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];//对行进行初等行变换}

}

}

其主要思想为:外层设置一个列循环,在每次循环中开设THREAD _NUMS个线程,每个线程处理的矩阵A的行为上述的m,一次循环过后则完成对应列的变换,这样在N此循环过后便可完成矩阵A的LU分解。即L为A[k][j]中k>j的元素,其对角线上元素为1.0,其它为0,U为A[k][j]中k<=j的元素,其余为0。

这里如果我们使用的是一般的多线程编程,则在开启THREAD _NUMS个线程后,在下次循环开始之前,需要手动配置等待线程同步,不然可能出现错误。但由于OpenMP使用Fork-Join并行执行模型,其会在线程队执行完以后才转到主线程执行,所以不需要等待线程同步。详细的代码请参看附带源程序。

3.3、MPI 编程

设处理器个数为p ,矩阵A 的阶数为n ,??p n m /=,对矩阵A 行交叉划分后,编号为i(i=0,1,…,p-1)的处理器存有A 的第i, i+p,…, i+ (m-1)p 行。然后依次以第0,1,…,n-1行作为主行,将其广播给所有处理器,各处理器利用主行对其部分行向量做行变换,这实际上是各处理器轮流选出主行并广播。若以编号为my_rank 的处理器的第i 行元素作为主行,并将它广播给所有处理器,则编号大于等于my_rank 的处理器利用主行元素对其第i+1,…,m-1行数据做行变换,其它处理器利用主行元素对其第i,…,m-1行数据做行变换,计算完成后,编号为0的处理器收集各处理器中的计算结果,并从经过初等行变换的矩阵A 中分离出下三角矩阵L 和上三角矩阵U 。

关键代码如下:

/*0号进程采用行交叉划分将矩阵A 划分为大小m*M 的p 块子矩阵,依次发送给1至p-1号进程*/ if (my_rank==0) {

for(i=0;i

for(j=0;j

for(i=0;i

MPI_Recv(&a(i,0),M,MPI_FLOAT,0,i+1,MPI_COMM_WORLD,&status); }

for(i=0;i

for(j=0;j

{

/*j号进程负责广播主行元素*/

if (my_rank==j)

{

v=i*p+j;

for (k=v;k

f[k]=a(i,k);

MPI_Bcast(f,M,MPI_FLOAT,my_rank,MPI_COMM_WORLD);

}

else

{

v=i*p+j;

MPI_Bcast(f,M,MPI_FLOAT,j,MPI_COMM_WORLD);

}

/*编号小于my_rank的进程(包括my_rank本身)利用主行对其第i+1,…,m-1行数据做行变换*/

if (my_rank<=j){

for(k=i+1;k

{

a(k,v)=a(k,v)/f[v];

for(w=v+1;w

a(k,w)=a(k,w)-f[w]*a(k,v);

}

}

/*编号大于my_rank的进程利用主行对其第i,…,m-1行数据做行变换*/ if (my_rank>j){

for(k=i;k

{

a(k,v)=a(k,v)/f[v];

for(w=v+1;w

a(k,w)=a(k,w)-f[w]*a(k,v);

}

}

}

/*0号进程从其余各进程中接收子矩阵a,得到经过变换的矩阵A*/

if (my_rank==0)

{

for(i=0;i

for(j=0;j

A(i*p,j)=a(i,j);

}

if (my_rank!=0)

{

for(i=0;i

MPI_Send(&a(i,0),M,MPI_FLOAT,0,i,MPI_COMM_WORLD);

}

else

{

for(i=1;i

for(j=0;j

{

MPI_Recv(&a(j,0),M,MPI_FLOAT,i,j,MPI_COMM_WORLD,&status);

for(k=0;k

A((j*p+i),k)=a(j,k);

}

}

3.4、程序调优:OpenMP和MPI混合编程

我们知道OpenMP是基于线程的并行编程模型,一个共享存储的进程由多个线程组成,OpenMP就是基于已有线程的共享编程模型;而MPI属于消息传递的并行编程模型,这个从前两小节中可以看到,因为在LU的MPI实现中,我们对矩阵采用交叉划分,根据p(处理器号)划分行,因此可以对每个划分出来的矩阵采用多线程并行算法,也即可以采用OpenMP计算。

在MPI的编号大于等于my_rank的处理器利用主行元素对其第i+1,…,m-1行数据做行变换,其它处理器利用主行元素对其第i,…,m-1行数据做行变换部分采用OpenMP计算,所以混合编程的核心代码如下:

/*编号小于my_rank的进程(包括my_rank本身)利用主行对其第i+1,…,m-1行数据做行变换*/

if (my_rank<=j){

int tid;

omp_set_num_threads(THREADS_NUM);

#pragma omp parallel private(tid)

{

tid = omp_get_thread_num();

int myid = tid;

int myk = i+1;

float mychushu = f[v];

int s,e;

int c,d;

s = (m-myk-1)*myid/THREADS_NUM;

e = (m-myk-1)*(myid+1)/THREADS_NUM;

for(c=s+myk+1;c

a(c,v)=a(c,v)/mychushu;

for(d=v+1;d

a(c,d)=a(c,d)-f[d]*a(c,v);

}

}

}

}

四、程序运行效果及分析

这里将通过测试在确定的线程下,对于随机生成的不同大小的矩阵,串行及OpenMP&MPI的运行时间来分析程序性能。并通过改变线程的数量,在不同情况下多次测量,测试编译参数对程序性能的影响。

4.1、固定线程数时,不同矩阵大小下性能测试

a.当线程数为5时:

测试得到的不同矩阵大小下的加速比数据如图1所示:

图1

根据图1中所示测得的数据,生成折线图如下:

b.当线程数为100时,测得的实验数据如图2所示:

图2

根据图2中所示测得实验数据生成的折线图如下:

结果分析:

从以上的结果可以看出在不同的线程下,OpenMP的性能都会随着矩阵规模的增大而变好,也就是在矩阵规模变大时,OpenMP的加速比变大,虽然在实验中有出现下降,但总体来说加速比在增大。同时,可以看到在矩阵很小时,加速比几乎为零,也即此时的OpenMP 运行时间比串行时间久,这主要是在矩阵规模很小时,OpenMP多线程减少的计算时间相比为维护这么多线程花费的时间要少很多,所以在数据规模很小时,不应该采用OpenMP编程并行编程。相反,在数据规模很大时,采用OpenMP并行编程模型,将带来巨大的性能提升。

4.2、固定矩阵大小时,不同线程数下的性能测试

a.当矩阵大小为2000时,测得的数据如图3所示:

图3

根据图3测得实验数据,生成的折线图如下:

b.当矩阵大小为4000时,测得的数据如图4所示:

图4

根据图4测得实验数据,生成的折线图如下:

结果分析:

从上面的实验测试可以看出,在不同的线程数量下,OpenMP运行的加速比不同,同线程数量变大时,OpenMP的加速比并没有如所期望的一样变大,相反随线程数量的增加,OpenMP的加速比变小了。因为OpenMP是基于多线程的编程模型,而我们知道多线程程序性能的提高是基于多CPU同时运行线程,而本次程序测试的主机为4核的,也即可以同时运行4个线程,因此当线程数量增多到超过CPU 数量时,多余的线程实际上并没有得到执行,相反这个时候还需要额外维护这大量的线程,因此性能降低,所以加速比随线程增多而有所降低。因此,在进行OpenMP并行编程时,我们需要根据所运行的主机的CPU数量合理的设置线程的数量,以获得最大的加速比。

以上是针对OpenMP并行算法与串行算法的性能的比较,下面再简单对不同进程情况下MPI的LU并行算法与串行算法的性能比较。

c. 分别在矩阵大小为3000和4000时测得的实验数据如下:

根据测得的实验数据,生成的折线图如下:

结果分析:

从上面的实验测试结果,可以看出,在进程为4时,MPI的加速比为最大,而在两边变化时,加速比有所下降。也即在进行MPI并行编程时,合理设置进程也是非常重要的,一般也是根据运行主机的CPU的数量来设置,如本次主机的CPU数量为4,所以设置进程数为4,每个CPU分别负责执行一个进程,在进程数量过多时,进程没有被执行,反而还增加了维护进程的开销,我们知道这个开销是很大的。

结论:

无论是MPI并行编程还是OpenMP并行编程,都要在大数据量时才能体现其优点,在运行大数据量时,MPI与OpenMP能极大的提高程序运行性能,提供较高的加速比。因为MPI要维护进程,进行消息传递等,而OpenMP要维护线程等,而这都是要花费时间的,特别是在进程或线程数量很大时,维护、通信、同步等的开销很大,所以在数据量很小时,不能采用MPI或OpenMP编程,因为其开销比其

带来的性能提升要大。另外,在采用MPI及OpenMP编程时,要根据运行主机合理的设置进程或线程的数量。否则将不能最大化其性能。具体过程可参照上述分析。

最后感谢xx老师对我们的辛苦教学以及xx助教对我们的悉心指导。

多核编程与并行计算实验报告 (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! ";

并行计算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

计算方法上机实验报告

《计算方法》上机实验报告 班级: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 四、运行结果: 实验二:

计算网络A - 实验报告()

《计算网络》实验报告 学院______计算机学院______专业_______软件工程_______ 年级班别______13(4)班_______ 学号_____3113006393_______学生姓名________朱育楷________ 指导教师____ 梁路 _______ 成绩

广东工业大学 计算机学院软件工程专业13(4)班学号3113006393 姓名__朱育楷___协作者_____无______ 教师评定_______________ 实验题目一. Windows下常用的网络命令 一、实验目的 学习在Windows系统中进行网络配置、用ping ipconfig/winipcfg命令工具来进行网络测试、使用tracert路由跟踪命令、使用netstat、arp、nslookup命令查看网络状态。 本实验在于使学生更好地理解计算机网络设置的基本操作,掌握计算机网络配置的基本监测技术。 二、实验内容和要求 1、使用Ping工具测试本机TCP/IP协议的工作情况,记录下相关信息。 2、使用IPconfig工具测试本机TCP/IP网络配置,记录下相关信息。 3、使用netsh工具测试本机TCP/IP网络配置,记录下相关信息。 4、使用Tracert工具测试本机到https://www.360docs.net/doc/6018330980.html, 所经过的路由数,记录下 相关信息。 5、使用Netstat工具,记录下相关信息。 6、使用Arp工具,记录下相关信息。 7、使用Nslookup工具,记录下相关信息。 二、实验结果 1、使用Ping工具测试本机TCP/IP协议的工作情况,记录下相关信息。

2、使用IPconfig工具测试本机TCP/IP网络配置,记录下相关信息。

多核编程与并行计算实验报告 (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,

计算机网络实验报告 答案讲解

计算机网络实验报告 专业计算机科学与技术 班级计102 学号109074057 姓名王徽军 组号一组D 指导教师毛绪纹 安徽工业大学计算机学院 二○一二年十二月

目录 实验总体说明 (3) 实验一以太网帧的构成 (3) 实验三路由信息协议RIP (8) 实验四传输控制协议TCP (10) 实验五邮件协议SMTP、POP3、IMAP (12) 实验六超文本传输协议HTTP (14)

实验总体说明 1.实验总体目标 配合计算机网络课程的教学,加强学生对计算机网络知识(TCP/IP协议)的深刻理解,培养学生的实际操作能力。 2.实验环境 计算机网络协议仿真实验室: 实验环境:网络协议仿真教学系统(通用版)一套 硬件设备:服务器,中心控制设备,组控设备,PC机若干台 操作系统:Windows 2003服务器版 3.实验总体要求 ●按照各项实验内容做实验,记录各种数据包信息,包括操作、观察、记录、分析, 通过操作和观察获得直观印象,从获得的数据中分析网络协议的工作原理; ●每项实验均提交实验报告,实验报告的内容可参照实验的具体要求,但总体上应包 括以下内容:实验准备情况,实验记录,实验结果分析,算法描述,程序段,实验过程中遇到的问题以及对思考问题的解答等,实验目的、实验原理、实验步骤不需要写入实验报告中。 实验一以太网帧的构成 实验时间:_____________ 成绩:________________ 实验角色:_____________ 同组者姓名:______________________________

练习一:领略真实的MAC帧 q....U 00000010: 85 48 D2 78 62 13 47 24 58 25 00 00 00 00 00 00 .H襵b.G$X%...... 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 ............ 练习二:理解MAC地址的作用 ●记录实验结果 表1-3实验结果 本机MAC地址源MAC地址目的MAC地址是否收到,为什么 主机B 8C89A5-7570BB 8C89A5-757113 8C89A5-7570C1 是,主机A与主机B接在同一共享模块 主机D 8C89A5-771A47 8C89A5-757113 8C89A5-7570C1 是,主机C与主机D接在同一共享模块 主机E 8C89A5-757110 无无否,与主机A、C都不在同一共享模块 主机 F 8C89A5-7715F8 无无否,与主机A、C都不在同一共享模块 练习三:编辑并发送MAC广播帧 ●结合练习三的实验结果,简述FFFFFF-FFFFFF作为目的MAC地址的作用。 答:该地址为广播地址,作用是完成一对多的通信方式,即一个数据帧可发送给同一网段内的所有节点。 练习四:编辑并发送LLC帧 ●实验结果 帧类型发送序号N(S)接受序号N(R) LLC 001F 0 ●简述“类型和长度”字段的两种含义 答:一是如果字段的值小于1518,它就是长度字段,用于定义下面数据字段的长度;二是如果字段的值大于1536,用于定义一个封装在帧中的PDU分组的类型。 思考问题: 1.为什么IEEE802标准将数据链路层分割为MAC子层和LLC子层? 答:出于厂商们在商业上的激烈竞争,IEEE的802委员会未能形成一个统一的、最佳的局域网标准,而是被迫制定了几个不同标准,如802.4令牌总线网、802.5令牌环网等。为了使数据链路层能更好地适应多种局域网标准,802委员会就将局域网的数据链路层拆成两个子层,即逻辑链路控制

并行计算实验报告一

江苏科技大学 计算机科学与工程学院 实验报告 实验名称: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:利用多线程编程编写一个龟兔赛跑程序。 乌龟:速度慢,休息时间短;

并行计算第一次实验报告

并行计算上机实验报告题目:多线程计算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;

计算机网络技术实验报告

重庆交通大学 学生实验报告 实验课程名称《计算机网络技术》课程实验 开课实验室软件与通信实验中心 学院国际学院年级2012 专业班(1)班 学生姓名吴双彪学号6312260030115 开课时间2014 至2015 学年第二学期 实验2简单的局域网配置与资源共享 实验目的: 1、掌握将两台PC联网的技能与方法 2、掌握将几台PC连接成LAN的技能与方法 3、掌握局域网内资源共享的技能与方法 实验内容和要求: 1、选用百兆交换机连接PC若干台; 2、在上述两种情况下分别为PC配置TCP/IP协议,使他们实现互联和资源共享实验环境:(画出实验网络拓图) 实验步骤: 1、选择两台计算机; 选PC0与PC1. 2、设置两台计算机IP地址为C类内部地址; 两台PC机的IP分别设置为:、202.202.242.47、202.202.243.48; 两台PC机的掩码分别设置为:、255.255.255.0、255.255.255.0; 3、用一台计算机Ping另一台计算机,是否能Ping通?

4、我的电脑→工具→文件夹选项→查看→去掉“使用简单文件共享(推荐)”前 的勾;设置共享文件夹。 5、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访 问:本地帐户的共享和安全模式”设为“仅来宾-本地用户以来宾的身份验证” (可选,此项设置可去除访问时要求输入密码的对话框,也可视情况设为“经典-本地用户以自己的身份验证”); 6、通过网络邻居或在运行窗口输入“\\对方IP地址”实现资源共享。 1)指定IP地址,连通网络 A.设置IP地址 在保留专用IP地址范围中(192.168.X.X),任选IP地址指定给主机。 注意:同一实验分组的主机IP地址的网络ID应相同 ..。 ..,主机ID应不同 ..,子网掩码需相同B.测试网络连通性 (1)用PING 命令PING 127.0.0.0 –t,检测本机网卡连通性。 解决方法:检查网线是否连接好,或者网卡是否完好 (2)分别“ping”同一实验组的计算机名;“ping”同一实验组的计算机IP地址,并记录结 果。答:能。结果同步骤3 (3)接在同一交换机上的不同实验分组的计算机,从“网上邻居”中能看到吗?能ping通 吗?记录结果。 2) 自动获取IP地址,连通网络 Windows主机能从微软专用B类保留地址(网络ID为169.254)中自动获取IP地址。 A.设置IP地址 把指定IP地址改为“自动获取IP地址”。 B.在DOS命令提示符下键入“ipconfig”,查看本机自动获取的IP地址,并记录结果。 C.测试网络的连通性 1.在“网上邻居”中察看能找到哪些主机,并记录结果。 2.在命令提示符下试试能“ping”通哪些主机,并记录结果。 答:能ping通的主机有KOREYOSHI ,WSB ,ST ,LBO ,CL 。思考并回答 测试两台PC机连通性时有哪些方法? 实验小结:(要求写出实验中的体会)

并行处理实验报告:用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++)

高性能计算报告

高性能计算实验报告 学生姓名:X X 学号:XXXXXXXXXX 班号:116122 指导教师:郭明强 中国地质大学(武汉)信息工程学院 第一题

1.编写console程序 2.由下图看出,电脑是双核CPU 3.多线程程序,利用windowsAPI函数创建线程

代码 #include"stdafx.h" #include #include"windows.h" usingnamespace std; DWORD WINAPI first(PVOID pParam) { for (int i = 0;i < 10;i++) { printf("1\n"); } return 0; } DWORD WINAPI second(PVOID pParam) { for (int i = 0;i < 10;i++) { printf("2\n"); } return 0; } int main(int argc, char * argv[]) { HANDLE hHandle_Calc[2]; hHandle_Calc[0] = CreateThread(NULL, 0, first, NULL, 0, NULL); hHandle_Calc[1] = CreateThread(NULL, 0, second, NULL, 0, NULL); WaitForMultipleObjects(2, hHandle_Calc, true, INFINITE);

} 第二题多线程实现计算e和π的乘积 代码 #include"stdafx.h" #include"windows.h" #define num_steps 2000000 #include usingnamespace std; //计算e DWORD WINAPI ThreadCalc_E(PVOID pParam)//计算e子函数{ double factorial = 1; int i = 1; double e = 1; for (;i

ANSYS高性能并行计算

ANSYS高性能并行计算 作者:安世亚太雷先华 高性能并行计算主要概念 ·高性能并行计算机分类 并行计算机主要可以分为如下四类:对称多处理共享存储并行机(SMP,Symmetric Multi-Processor)、分布式共享存储多处理机(DSM,Distributied Shared Memory)、大规模并行处理机(MPP,Massively Parallel Processor)和计算机集群系统(Cluster)。 这四类并行计算机也正好反映了高性能计算机系统的发展历程,前三类系统由于或多或少需要在CPU、内存、封装、互联、操作系统等方面进行定制,因而成本非常昂贵。最后一类,即计算机集群系统,由于几乎全采用商业化的非定制系统,具有极高的性能价格比,因而成为现代高性能并行计算的主流系统。它通过各种互联技术将多个计算机系统连接在一起,利用所有被连接系统的综合计算能力来处理大型计算问题,所以又通常被称为高性能计算集群。高性能并行计算的基本原理就是将问题分为若干部分,而相连的每台计算机(称为节点)均可同时参与问题的解决,从而显著缩短解决整个问题所需的计算时间。 ·集群互联网络 计算机集群系统的互联网络大体上经历了从Ethernet到Giganet、Myrinet、Infiniband、SCI、Quadrics(Q-net)等发展历程,在“延时”和“带宽”两个最主要指标上有了非常大的改善,下表即是常用的互联方式: ANSYS主要求解器的高性能并行计算特性

ANSYS系列CAE软件体系以功能齐全、多物理场耦合求解、以及协同仿真而著称于世。其核心是一系列面向各个方向应用的高级求解器,并行计算也主要是针对这些求解器而言。 ANSYS的主要求解器包括: Mechanical:隐式有限元方法结构力学求解器; CFX :全隐式耦合多重网格计算流体力学求解器; AUTODYN:显式有限元混合方法流固耦合高度非线性动力学求解器; LS-DYNA:显式有限元方法非线性结构动力学求解器; FEKO:有限元法、矩量法、高频近似方法相互混合的计算电磁学求解器; ·高性能并行计算的典型应用 现代CAE计算的发展方向主要有两个:系统级多体耦合计算和多物理场耦合计算,前者摒弃了以往只注重零部件级CAE仿真的传统,将整个对象的完整系统(如整机、整车)一次性纳入计算范畴;后者在以往只注重单一物理场分析(如结构力学、流体力学)的基础上,将影响系统性能的所有物理因素一次性纳入计算范畴,考虑各物理因素综合起来对分析对象的影响。因此,可以说,高性能并行计算也是CAE的发展方向,因为它是大规模CAE 应用的基石。例如,在航空航天领域,需要高性能并行计算的典型CAE应用有: –飞机/火箭/导弹等大型对象整体结构静力、动力响应、碰撞、安全性分析,整体外流场分析,多天线系统电磁兼容性及高频波段RCS分析,全模型流体-结构-电磁耦合分析;–航空发动机多级转子/静子联合瞬态流动分析,流体-结构-热耦合分析; –大型运载火箭/导弹发射过程及弹道分析…… · ANSYS求解器对高性能并行计算的支持 作为大型商用CAE软件的领头雁,ANSYS在对高性能并行计算的支持方面也走在所有CAE软件的前列,其各个求解器对高性能并行系统的支持可用下表描述:

计算机网络实验报告完整版

华中科技大学文华学院 计算机网络 实 验 报 告 姓名: 学号: 学部(系):信息科学与技术学部 专业年级: 指导教师:朱琳琳 2014年4月

实验1 常用网络命令 1.实验目的 ●掌握常用网络命令的使用方法; ●熟悉和掌握网络管理、网络维护的基本内容和方法 2. 实验前的准备 ●阅读本实验的内容及操作步骤; 3. 实验内容 (1)、arp命令 Arp –a 查看本地局域网内所有用户ip和mac地址绑定关系。 Arp –s 用于在计算机ARP表中添加一个静态的ARP记录。

(2)、ipconfig命令 Ipconfig /all 显示所有适配器的完整TCP/IP配置

Ipconfig /displaydns 显示DNS客户解析器缓存的内容 Ipconfig /flushdns 清理并重设DNS客户解析器缓存的内容。

(3)、Nbtstat命令 Nbtstat -n nbtstat –s ip 通过IP显示另一台计算机的物理地址和名字列表。如nbtstat –s192.168.0.113 (4)、netstat命令 Netstat –a 显示所有有效连接(包括TCP和UDP两种)的信息,如图。

Netstat –n 显示所有活动的TCP 连接以及计算机侦听的TCP 和UDP 端口。 Netstat –r 显示 IP 路由表的内容。该参数与 route print 命令等价。 (5)、ping 命令 Ping后加上ip地址或域名,命令用来检测TCP/IP的安装或运行存在的某些最基本的问题。 可直接键入PING寻求帮助

并行计算-实验二-矩阵乘法的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

网格和单元的基本概念

网格和单元的基本概念 前记:首先说明,和一般的有限元或者计算力学的教材不一样,本人也不打算去抄袭别人的著作,下面的连载是一个阶段的学习或者专业感悟集大成,可以说深入浅出,也可以说浅薄之极——如果你认为浅薄,很好,说明我理解透了,也祝贺你理解透了!好了,废话少说,书归正传。 无论是CSD(计算结构力学)、CTD(计算热力学)还是CFD(计算流体动力学)——我们统一称之为工程物理数值计算技术。支撑这个体系的4大要素就是:材料本构、网格、边界和荷载(荷载问题可以理解为数学物理方程的初值问题),当然,如果把求解技术也看作一个要素,则也可以称之为5大要素。网格是一门复杂的边缘学科,是几何拓补学和力学的杂交问题,也是支撑数值计算的前提保证。本番连载不做任何网格理论的探讨(网格理论是纯粹的数学理论),仅限于尽量简单化的应用技术揭秘。 网格出现的思想源于离散化求解思想,离散化把连续求解域离散为若干有限的子区域,分别求解各个子区域的物理变量,各个子区域相邻连续与协调,从而达到整个变量场的协调与连续。离散网格仅仅是物理量的一个“表征符号”,网格是有形的,但被离散对象既可以是有形的(各类固体),也可以是无形的(热传导、气体),最关键的核心在于网格背后隐藏的数学物理列式,因此,简单点说,看得见的网格离散是形式,而看不见的物理量离散才是本质核心。 对计算结构力学问题,网格剖分主要包含几个内容:杆系单元剖分(梁、杆、索、弹簧等)、二维板壳剖分(曲面或者平面单元)、三维实体剖分(非结构化全六面体网格、四面体网格、金字塔网格、结构化六面体网格、混合网格等),计算热力学和计算流体动力学的网格绝大部分是三维问题。对于CAE工程师而言,任何复杂问题域最终均直接表现为网格的堆砌,工程师的任务等同于上帝造人的过程,网格是一个机体,承载着灵魂(材料本构、网格、边界和荷载),求解技术则是一个思维过程。 网格基本要素是由最基本的节点(node)、单元线(edge)、单元面(face)、单元体(body)构成,实质上,线、面、体只不过是为了让网格看起来更加直观,在分析求解过程中,线、面、体本质上并没有起多大的作用,数值离散的落脚点在节点(node)上,所有的物理变量均转化为节点变量实现连续和传递。在所有的CAE环境下,网格的基本要素均可以直接构成,但对于复杂问题而言,这是一个在操作上很难实现的事情,因此,基于几何要素的网格划分技术成为现代网格剖分应用的支点,和网格基本要素完全相同,对应的几何要素分别称之为点(point)、线(curve)、面(surface)和实体(solid)。 数值离散求解器是不能识别几何元素的,要对其添加“饲料”,工程师必须对几何元素进行“精加工”,因此,从这个意义上来说,网格剖分的本质就是把几何要素转换为若干离散的元素组,这些元素组堆砌成形态上近似逼近原有几何域的简单网格集合体。因此,这里说明了一个网格“加工”质量的基本判别标准——和几何元素的拟合逼近程度,理论上,越逼近几何元素的网格质量越好,当然,几何逼近只是一个基本的判别标准,网格质量判别有一系列复杂的标准,后文详细阐述。 本篇将专门解释几个基本概念:点网格;一维线网格;二维三角形面网格、二维四边形面网格;三维四面体网格(tetrahedra)、三维金字塔单元(pyramid)、五面体单元(prism)、三维六面体单元(hexahedra);结构化网格(structural grid)、非结构化网格(nonstructural grid)、混合网格(blend grid)。需要专门

计算机网络技术实践实验报告

计算机网络技术实践 实验报告 实验名称实验三 RIP和OSPF路由协议的配置及协议流程 姓名____ ______实验日期: ____________________ 学号___________实验报告日期: ____________________ 报告退发: ( 订正、重做 ) 一.环境(详细说明运行的操作系统,网络平台,机器的IP地址)●操作系统:Windows7 ●网络平台:虚拟网络(软件Dynamips) ●IP地址:127.0.0.1 二.实验目的 ●在上一次实验的基础上实现RIP和OSPF路由协议 ●自己设计网络物理拓扑和逻辑网段,并在其上实现RIP和OSPF协议 ●通过debug信息详细描述RIP和OSPF协议的工作过程。 ●RIP协议中观察没有配置水平分割和配置水平分割后协议的工作流程; ●OSPF中需要思考为什么配置完成后看不到路由信息的交互?如何解 决? 三.实验内容及步骤(包括主要配置流程,重要部分需要截图) ●设计网络物理拓扑和逻辑网段

编写.net文件 autostart = false [localhost] port = 7200 udp = 10000 workingdir = ..\tmp\ [[router R0]] image = ..\ios\unzip-c7200-is-mz.122-37.bin model = 7200 console = 3001 npe = npe-400 ram = 64 confreg = 0x2102 exec_area = 64 mmap = false slot0 = PA-C7200-IO-FE slot1 = PA-4T s1/0 = R1 s1/1 s1/1 = R2 s1/2

并行计算__中国科学技术大学(1)--测验习题1

并行分布式试卷1 姓名____________________ 学号____________________ 分数_____________ 1.填空(每空1分,共30分) 1.在并行机系统中,常用的静态互联网络有__ ___________,__ _____________,_ _____________________,______________________,___________________等。2.在并行机系统中,常用的动态互联网络有___________________________________, _____________________________________和______________________________。3.近代并行计算机体系结构模型包括_______ _________,___________________,_ ______________________,____________ ______,_____________________等。4.常用的并行存储访问模型(又叫并行存储结构)包括_______________________, ________________________________,_____________________________等。 5.常用的并行程序设计模型有____________ _______,__ _ _______________,___ _________________________等。 6.大型稀疏线性方程常用迭代解法有____________________,_ _________________, _________________________,__________________________等。 7.常用的并行计算(或算法)模型有___________________,___ ________________ _,________________________,______________________等。 8.我国自行研制的并行计算机三大系列是___________________________,________ _____________________,_____________________________。 2.简要回答(每题5分,共20分) 1.试述并行算法基本的设计技术。 2.何谓X-Y 选路算法何E-cube 选路算法(可以例明之)?3.何谓Amdahle 和Gustfson 加速定律及其推导过程? 4.何谓等效率、等速度和平均延迟可扩放性度量标准?并推导他们之间的等效性。 三.综合题(每题10分,共50分) 1.假定44?A 和44?B 都已加载到44?处理器阵列上,试图示Cannon 矩阵乘法的具体 过程。 2.已知??????=4331A ,?? ? ???--=8765B ,试用DNS 方法,逐步求出矩阵乘积

相关文档
最新文档