OpenMP程序的编译和运行(共13页)

上传人:风*** 文档编号:52188499 上传时间:2022-02-07 格式:DOC 页数:13 大小:290KB
收藏 版权申诉 举报 下载
OpenMP程序的编译和运行(共13页)_第1页
第1页 / 共13页
OpenMP程序的编译和运行(共13页)_第2页
第2页 / 共13页
OpenMP程序的编译和运行(共13页)_第3页
第3页 / 共13页
资源描述:

《OpenMP程序的编译和运行(共13页)》由会员分享,可在线阅读,更多相关《OpenMP程序的编译和运行(共13页)(13页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上 SHANGHAI UNIVERSITY学 院计算机工程与科学学院实验OpenMP程序的编译和运行姓名陈帅学号教师刘芳芳时间2015.05.06报告成绩实验2-1. OpenMP程序的编译和运行1. 实验目的1) 在Linux平台上编译和运行OpenMP程序;2) 在Windows平台上编译和运行OpenMP程序。3) 掌握OpenMP并行编程基础。2. 实验环境1) 硬件环境:计算机一台;2) 软件环境:Linux、Win2003、GCC、MPICH、VS2008或其他版本Visual Studio;3. 实验内容1. Linux下OpenMP程序的编译和运行。Op

2、enMP是一个共享存储并行系统上的应用编程接口,支持C/C+和FORTRAN等语言,编译和运行简单的Hello World程序。在Linux下编辑hellomp.c源程序,或在Windows下编辑并通过附件中的FTP工具(端口号:1021)上传,用gcc -fopenmp -O2 -o hellomp.out hellomp.c命令编译,用./hellomp.out命令运行程序。注:在虚拟机中当使用vi编辑文件时,不是以ESC键退出插入模式,可以使用“Ctrl+c”进入命令模式,然后输入wq进行存盘退出。代码如下:#include #include int main()int nthreads

3、,tid;omp_set_num_threads(8);#pragma omp parallel private(nthreads,tid)tid=omp_get_thread_num();printf(Hello World from OMP thread %dn,tid);if(tid=0)nthreads=omp_get_num_threads();printf(Number of threads is %dn,nthreads);安装gcc检查GCC是否安装完成 编写hellomp.c编译运行2.控制并行执行的线程数。根据算法的要求和硬件情况,例如CPU数量或者核数,选择适合的线程数可

4、以加速程序的运行。请按照下列的方法进行线程数量的设置。/设置线程数为10xuycsv168 openmp$ OMP_NUM_THREADS=10/将线程数添加为环境变量xuycsv168 openmp$ export OMP_NUM_THREADS/运行修改hellomp.c程序,删除omp_set_num_threads(8);语句如果不定义OMP_NUM_THREADS,默认会等于CPU数量,在8核心的机器上,会打印出8行Hello World.omp_set_num_threads(8); 设置了子线程数为8,即是可以有8个子线程并行运行。#pragma omp parallel pri

5、vate(nthreads,tid) 为编译制导语句,每个线程都自己的nthreads和tid两个私有变量,线程对私有变量的修改不影响其它线程中的该变量。程序的功能是对于每个线程都打印出它的id号,对于id号为0的线程打印出线程数目。2. Windows下OpenMP程序的编译和运行。用VS2013编辑上述的hellomp.c源程序,注意在菜单“项目-属性-C/C+-语言”选中“OpenMP支持”,编译并运行程序。打开或者新建一个c+项目,依次选择Project-属性-配置属性(configuration property)-c/c+-语言(Language),打开OpenMP支持;设置环境变

6、量OMP_NUM_THREADS。设置环境变量:我的电脑-属性-高级-环境变量,新建一个OMP_NUM_THREADS变量,值设为2,即为程序执行的线程数。图3 VS2013使用界面使用VS2013进行并行程序设计,图3为VS2013使用界面,图4为运行结果截图。图4 程序运行结果截图虽然线程都是一起开始运行,但实验中每次运行的结果都不一样,这个是因为每次每个线程结束的先后可能不一样的。所以每次运行的结果都是随机的。这是串行程序和并行程序不同的地方:串行程序可以重新运行,结果和之前一样;并行程序却因为执行次序无法控制可能导致每次的结果都不一样。实验2-2 矩阵乘法的OpenMP实现及性能分析1

7、. 实验目的1) 用OpenMP实现最基本的数值算法“矩阵乘法”2) 掌握for编译制导语句3) 对并行程序进行简单的性能调优2. 实验内容1) 运行并测试OpenMP编写两个n阶的方阵a和b的相乘程序,结果存放在方阵c中,其中乘法用for编译制导语句实现并行化操作,并调节for编译制导中schedule的参数,使得执行时间最短。要求在window环境(不用虚拟机),在linux环境(用和不用虚拟机情况下)测试程序的性能,并写出详细的分析报告。源代码如下:#include#include#includevoid comput(float* A,float* B,float* C)/两个矩阵相乘

8、传统方法 int x,y; for(y=0;y4;y+) for(x=0;x4;x+) C4*y+x = A4*y+0*B4*0+x + A4*y+1*B4*1+x + A4*y+2*B4*2+x + A4*y+3*B4*3+x; int main() double duration; clock_t s,f; int x=0; int y=0; int n=0; int k=0; float A=1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16; float B=0.1f,0.2f,0.3f,0.4f, 0.5f,0.6f,0.7f,0.8f, 0.9f,0

9、.10f,0.11f,0.12f, 0.13f,0.14f,0.15f,0.16f; float C16; s= clock(); /#pragma omp parallel if(false) for(n=0;n;n+) comput(A,B,C); f=clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(s-1,000,000 :%fn,duration); for(y=0;y4;y+) for(x=0;x4;x+) printf(%f,Cy*4+x); printf(n); printf(n=n); s = clock()

10、; /parallel 2 #pragma omp parallel for for(n=0;n2;n+)/CPU是核线程的 for(k=0;k;k+)/每个线程管个循环 comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p2- 1,000,000:%fn,duration); /parallel 3 s = clock(); #pragma omp parallel for for(n=0;n4;n+) /CPU是核线程的 for(k=0;k;k+)/每个线程管个循环 comput(A,

11、B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p3- 1,000,000:%fn,duration); /parallel 1 s = clock(); #pragma omp parallel for for(n=0;n;n+) comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p1- 1,000,000 :%fn,duration); for(y=0;y4;y+) for(x=0;x4;x+)

12、printf(%f,Cy*4+x); printf(n); return 0;程序运行结果:分析报告:由运行结果可以看出串行运算次s-1的时间是0.,并行运算次p-1的时间是0.,并行的时间比串行还要久一点,原因在于对计算机来说计算万次的此矩阵计算是非常easy的事情,计算量很小,在这种情况下OMP多线程计算时,线程的创建和销毁的开销会变成主要的消耗时间。p-2是2线程运算,p-3是4线程运算,所以在同样运算次的情况下,p-2的时间要比p-3的时间多出来0.秒。2)请自己找一个需要大量计算但是程序不是很长的程序,实现OMP的多线程并行计算,要求写出并行算法,并分析并行的效果(注:必须核对串行和

13、并行的计算结果,保证正确性)#include#include#includeusing namespace std;void qh (int i) float sum = 0; int j; for (int j = 1; j = i; j+) sum += sqrt(j);void qh1(int i)/计算1到i平方根的和 float sum = 0; int j; for (int j = 1; j = i; j+) sum += sqrt(j); cout sum= sumendl;int main() int i = 10; clock_t s, f; s = clock(); do

14、uble duration; int x = 0; int y = 0; int n = 0; int k = 0; /#pragma omp parallel if(false) for (n = 0; n; n+) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(s-1,000,000 :%fn, duration); printf(n=n); s = clock(); /parallel 2 #pragma omp parallel for for (n = 0; n2; n+

15、)/CPU是核线程的 for (k = 0; k; k+)/每个线程管个循环 qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p2-500,000:%fn, duration); /parallel 3 s = clock(); #pragma omp parallel for for (n = 0; n4; n+) /CPU是核线程的 for (k = 0; k; k+)/每个线程管个循环 qh(i); qh1(i); f = clock(); duration = (double

16、)(f - s) / CLOCKS_PER_SEC; printf(p3- 250,000:%fn, duration);/parallel 4 s = clock();#pragma omp parallel for for (n = 0; n4; n+) /CPU是核线程的 for (k = 0; k; k+)/每个线程管个循环 qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p4- 500,000:%fn, duration); /parallel 1 s = clock();

17、 #pragma omp parallel for for (n = 0; n; n+) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p1- 1,000,000 :%fn, duration); system(pause); return 0;运行结果:结果分析:程序计算的是1到10 的平方根的和,由运行结果可以看出,串行运算s-1的时间比并行运算p-1的时间要稍短一些,这是因为并行运算有创建和销毁线程的时间,当计算量比较少时,这部分的时间就变为主要的消耗时间。p-2是以2线程运算次,p-4是以4线程运算次,由p-4比p-2多出的0.时间可以看出多创建2个线程是非常消耗时间的(运算量较少时)。P-3是以4线程运算次,耗时同p-2相同,说明在计算量小的情况下使用OMP多核线程是非常划不来的。总之,OMP并行多核线程技术适用于计算量很大时使用,这是线程创建和销毁的时间就可以忽略不计,对于计算量小的运算,还是串行运算靠谱。专心-专注-专业

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!