已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
openMP实验报告openMP实验报告目录openMP实验报告1OpenMP简介1实验一2实验二3实验三5实验四6实验五9实验六10实验七11实验八13实验总结15在学习了MPI之后,我们又继续学习了有关openMP的并行运算,通过老师的细致讲解,我们对openMP有了一个初步的了解:OpenMP简介OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C语言、C+、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargma omp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码依然可以正常运作,只是不能利用多线程和多核CPU来加速程序的执行而已。OpenMP使得程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,它是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,然而,在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作,从而使得程序员可以更加专注于具体的算法本身,而非如何编程使得代码在CPU负载平衡和线程粒度方面做出平衡。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。实验步骤:通过编写了一些程序,验证了关于openMP的一些简单的性质。实验一代码:#include omp.h#include #include int main(int argc, char *argv) int id, numb; omp_set_num_threads(3); #pragma omp parallel private(id, numb) id = omp_get_thread_num(); numb = omp_get_num_threads(); printf(I am thread %d out of %d n, id, numb); system(pause); return 0;实验结果:可以看到,因为三个进程同步执行,所以输出顺序是乱序的,就是表示运行优先级相同。当把进程数改成10的时候,得到下面的结果:与上面的到的结论(并行并行运算)相同。实验二代码:#include omp.h#include #include int main(int argc, char *argv) int id; omp_set_num_threads(2); #pragma omp parallel printf(what will you see?n);#pragma omp forfor( int i = 1; i = 5; +i )printf( i = %d of %dn, i,omp_get_thread_num() );printf(How many answers?n); system(pause); return 0;实验运行结果:可以看到,在设置进程为2的情况之下,运算(计算规模)被等可能的分配给各个进程。实验三代码:#include #include #include int main() #pragma omp parallel sections /声明该并行区域分为若干个section,section之间的运行顺序为并行的关系 #pragma omp sectionfor (int i = 0; i 5; +i) std:cout i + std:endl; #pragma omp sectionfor (int j = 0; j 5; +j) std:cout j - std:endl; system(pause);return 0; 运行结果:结果分析: 语句”#pragma omp parallel sections”声明该并行区域分为若干个section,section之间的运行顺序为并行的关系.实验四代码:#include #include #include int main() #pragma omp parallel for (int i = 0; i 100; +i) std:cout i + std:endl; #pragma omp barrier for (int j = 0; j 10; +j) std:cout j - std:endl; system(pause);return 0; 运行结果:结果分析:在语句 #pragma omp barrier 的作用下,只有当上面所有的进程计算工作全部完成之后,才会继续barrier之后的工作。实验五 代码:#include #include #include #include using namespace std;int main()int sum = 0;cout Before: sum endl;#pragma omp parallel forfor(int i = 0; i 100; i+)#pragma omp critical (a)sum += i;sum += i * 2;cout After: sum endl;system(pause);return 0;运行结果:结果分析:CRITICAL指令指定一块同一时间只能被一条线程执行的代码区域各个线程还是并行执行for里面的语句,但当你们执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。实验六代码:#include #include #include #include using namespace std;#define NUM_THREADS 2static long num_steps = 100000;int main()int i, id;double x, pi, sum = 0.0;double step = 1.0 / (double) num_steps;omp_set_num_threads(NUM_THREADS);#pragma omp parallel private(x, i, id) reduction(+:sum)id = omp_get_thread_num();for(i = id + 1; i = num_steps; i = i + NUM_THREADS)x = (i - 0.5) * step;sum += 4.0 / (1.0 + x * x);pi = sum * step;printf(pi = %.12fn, pi);system(pause);return 0;运行结果:结果分析:很简单, 通过并行运算,发挥计算机多核的优势,自然能够较单核计算更快的得出计算结果,但是要注意计算机的核数是有限制的,不能无限扩大并行计算线程。实验七代码:#include #include #include #include using namespace std;int i = 0, sum1, sum2, sum3, sum;int main()#pragma omp parallel sections num_threads(3)#pragma omp section for(i = 0; i 100; i+)sum1 += i;#pragma omp section for(i = 100; i 200; i+)sum2 += i;#pragma omp section for(i = 200; i 300; i+)sum3 += i;sum = sum1 + sum2 + sum3;printf(sum = %dn, sum);system(pause);return 0;运行结果:结果分析:这里需要将累计求和值得部分和分配给几个变量的原因是:当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果,因为多线程计算如果只设置一个sum,每次增加的值可能是不同进程的,从而导致运算结果混乱,但是如果把不同进程的计算结果分别保存,这样就不会出现结算结果错误的问题。实验八将openMP 与之前学习过的MPI实验进行综合,通过计算PI的运算时间的比较得出结论代码:#include#include#includempi.hstaticlong num_steps = 100000;#define NUM_THREADS 4void main(int argc, char* argv)int i_start, i_end, i, myid, numprocs;double pi, mypi, x, step, sum = 0.0;double start, end; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid);if(myid = 0) start = MPI_Wtime(); MPI_Bcast(&num_steps, 1, MPI_INT, 0, MPI_COMM_WORLD); i_start = myid * (num_steps / numprocs); i_end = i_start + (num_steps / numprocs); step = 1.0 / (double) num_steps; omp_set_num_threads(NUM_THREADS);#pragma omp parallel private(x, i) reduction(+:sum)for( i = i_start; i i_end; i += NUM_THREADS) x = (i + 0.5) * step; sum = sum + 4.0 / (1.0 + x * x); mypi = step * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);if(myid = 0) printf(Pi = %fn, pi);end = MPI_Wtime();printf(Run time is : %.10fn, end - start);fflush(stdout);MPI_Finalize();实验结果:实验结果分析:MPI与openMP的主要区别在于:OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式),可扩展性差,MPI:进程级;分布式存储;显式;可扩展性好。在这里,我们将MPI作为一个消息传递机制,在计算机集群之间传递不同进程计算的结果的值,在集群中的单台计算机上使用openMP进行多线程编程,即通过MPI的分布式有点综合openMP的共享内存计算方式来共同结合,从而提高运算效率。由实验结果我们可以得知,如果仅仅是使用MPI或者仅仅使用opnMP的情况下,都只能部分程度上达到并行计算的效果,而两者进行综合的话,就可以尽最大可能的发挥计算机集群的运算威力。实验总结这次实验,是我们在之前学习过的MPI的基础之上,通过对openMP的学习,进一步了解了关于计算机多核多进程计算的概念。实验过程中,遇到各种各样的问题,老师耐心的予以一一解答。关于MPI与openMP,具体来说,在OpenMp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南京采购计算机管理制度
- 沈阳医学院《国际经济法》2025-2026学年期末试卷
- 上海中华职业技术学院《跨境电商理论与务实》2025-2026学年期末试卷
- 泰州学院《金融理论与实务》2025-2026学年期末试卷
- 徐州医科大学《供应链管理》2025-2026学年期末试卷
- 上海对外经贸大学《经济学专业导论》2025-2026学年期末试卷
- 上海公安学院《内科护理》2025-2026学年期末试卷
- 朔州陶瓷职业技术学院《中药炮制学》2025-2026学年期末试卷
- 上海海关学院《工程数学》2025-2026学年期末试卷
- 沈阳体育学院《旅游资源开发与管理》2025-2026学年期末试卷
- CSC-300系列数字式发变组保护装置的调试说明
- 2025新人教版七年级下册英语 Unit 6知识点梳理及语法讲义(答案版)
- 政策变化风险对市场营销的影响及应对策略
- 补办离婚委托书范本
- 第3章S7-300指令系统及编程
- 风雨同舟砥砺前行2025年度颁奖典礼
- 测绘项目安全保证措施
- 《广西壮族自治区 农田建设项目预算定额及概算编制规程》
- 招标代理机构遴选投标方案(技术标)
- 《如何有效组织幼儿开展体能大循环活动》课件
- 石油化工蒸汽管道保温材料及选用技术规定
评论
0/150
提交评论