《并行程序设计》实验指导书之一_第1页
《并行程序设计》实验指导书之一_第2页
《并行程序设计》实验指导书之一_第3页
《并行程序设计》实验指导书之一_第4页
《并行程序设计》实验指导书之一_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《并行程序设计》实验指导书之一实验1.1使用intel编译器生成优质代码实验目的1.掌握六步骤的优化过程;2.掌握利用编译器选项来优化代码;3.掌握针对不同CPU使用自动向量化进行性能调优;实验要求1.熟练掌握C语言;。2、熟练掌握Intel编译器的使用;3、熟练掌握nmake程序管理工具。实验内容实验步骤:步骤一:不使用优化技术构建应用程序1.如果测试的计算机支持TurboBoost或Hyper-Threading技术,最好先关闭它们,否则CPU时钟频率会动态调整。在bios里关闭:重启计算机,开机时按F2进入BIOS设置页面,在advanced里找到cpu电源设置或speedup设置,如果没有,说明计算机不支持TurboBoost及Hyper-Threading,那就不需要修改。2.在所有程序->IntelParallelStudioXE2015中,打开Intel编译器的命令行提示符窗口。3.新建一个文件夹,将code1.1文件夹中的代码拷贝进去。4.用Intel编译器构建intel.noopt.exe应用程序(先清理,再编译):nmakecleannmakeTARGET=intel.nooptCFLAGS=/Od5.运行intel.noopt.exe程序并且记录执行结果,选取最短时间作为结果进行记录。步骤二:使用通用优化1.参考上述命令,用Intel编译器构建应用程序(提示:通用优化的CFLAGS选项是"/O1")2.执行intel.01.exe应用程序并记录运行结果3.用/O2、/O3、/Ox选项重复1、2步步骤三:使用处理器相关的优化在这个步骤中使用自动向量化选项来构建样例应用程序。1.不使用选项,构建和运行应用程序,这时的结果和步骤二一样。增加Qvec-到CFLAGS选项中以关闭自动向量化4.(可选)通过产生向量化报告来查看向量化的差异(CFLAGS为"/Qvec-report:2")增强自动向量化选项5.使用各种/Qx选项(SSE、SSE3、SSSE3、SSE4.1、SSE4.2、及AVX),nmakecleannmakeCFLAGS="-/QxSSE2"target="intel.SSE2"产生可移植的应用,并记录实验结果。6.使用QaxAVX选项重新构建应用程序nmakecleannmakeCFLAGS="-/QaxAVX"target="intel.axAVX"7.运行程序,即使所用的CPU不支持AVX,程序也能正常运行,记录实验结果。步骤四:增加过程间优化过程间优化(InterproceduralOptimization,IPO)完成对应用程序的静态的拓扑分析。使用/Qip选项将使得分析工作限于同一个源代码内部,使用/Qipo选项则会在命令行列出的所有源代码中展开分析。IPO分析整个程序,对于包含许多频繁调用的中小型函数的程序特别有效。IPO消除或减少重复的计算、低效的内存使用、简化循环。也开展其他优化,例如别名分析、死函数的消除、无用变量的消除、内联函数。IPO能重新编排函数以获得更好的内存布局和局部性。 过程间优化1.使用/Qipo选项来构建和运行应用程序:2.记录运行时间3.重复1、2步,添加使用的平台上最高级别的自动向量化(SSE2、SSE3、SSSE3、SSE4.1、SSE4.2和AVX),记录运行时间步骤五:性能测评指导的优化到目前为止,前面的所有优化都是静态的,即分析了代码但是没有运行它们。性能测评指导的优化PGO(Profile-GuidedOptimization)使用动态的方法。用典型数据来运行未经优化的代码一次或多次,每次都收集性能测评的信息。这些测评的信息接着被用于优化以产生最终可执行文件。 使用PGO的3个步骤打开PGO功能nmakereallycleannmakeCFLAGS="/Qprof-gen"TARGET="intel.pgo.gen"执行intel.pgo.gen.exe程序,记录实验结果在所运行的程序的目录下查看,应当能看到刚创建的.dyn文件重新构建应用程序,告诉编译器需要使用刚才产生的动态信息:nmakecleannmakeCFLAGS="/Qprof-use"TARGET="intel.pgo"4.运行intel.gpo.exe,记录实验结果,对比一下性能步骤六:自动向量化的调优编译code1.2中的test.cpp程序,要求自动向量化器产生报告:icl/ctest.cpp/Qvec-report2/c查看项目目录下的.optrpt文件,找到循环没有向量化的提示信息。使用GAP,看看能不能提供一些其他有用的建议。icl/ctest.cpp/Qguide/c根据GAP建议,用命令行选项/Qno-alias-args选项来帮助编译器成功实现向量化,可以看到这样做之后就没有建议消息了。编译代码,要求产生报告icl/ctest.cpp/Qvec-report:2/Qno-alias-args查看项目目录下的.optrpt文件,有"REMAINDERLOOPWASVECTORIZED"的提示信息,这样就有了向量化的循环!编译运行conde1.2下的所有代码,并对比向量化与未向量化的性能icl/offf.exemain.cpptest.cpp/Qvec-report:2icl/offf.exemain.cpptest.cpp/Qvec-report:2/Qno-alias-args实验1.2ParallelStudioXE快速上手实验目的1.学习增加并行性的三步骤;2.使用CilkPlus来增加并行性;3.使用OpenMP来增加并行性实验要求1.能编写普通C语言串行程序;2、对CilpPlus和OpenMP有初步了解;实验原理用IntelParallelStudio的不同的核心组件来实现并行化:利用IntelVTuneAmplifierXE性能测评工具来识别串行程序的热点代码,以及分析并行程序中的同步、效率和负载平衡;利用ComposerXE创建新的并行化应用,然后用IntelInspectorXE2015来发现线程和内存错误;最后返回到AmplifierXE工具,检查线程并发性,如果需要再进行细节上的调优。三步骤方法如图所示:分析串行代码中可并行化的部分,这可能是最重要的一个步骤,此处所做的决定将影响最后并行化后的程序;利用所选中的并行模型的语法构造来实现并行性调试及检查是否引入了并行类型的错误。程序是否能够正确运行?是否有线程或内存错误?并不是所有串行程序都适合并行化。并行化自身将引入时间开销。在实施并行化之前,先将串行程序编译好并运行一遍,这样可以得到该应用程序的一个基准,也可以知道输出的结果是什么样子,在并行化之后,需要检查程序的输出和串行版本一致。code2中的代码将两个循环结合到一起:外层循环和内层的“工作循环”。外层循环执行若干次内部的被计时的内层循环,用于体现因计算机运行的其他后台程序而引起的时间变化,内层工作循环运行所花费的时间被记录下来并形成报告。工作循环本身迭代运行多次,每一次循环迭代内部嵌套两个更深层的循环—用于计算一个数列的求和。两个数列的项数由内层的工作循环计数值决定。然后每个数列和的平方根的倒数累加到一个总和,这个总和在工作循环的结尾处输出出来。这将阻止编译器将这些变量优化掉。在每一个工作循环结束处的输出将显示工作循环完成的迭代次数、执行所需花的时间。实验内容:使用CilkPlus串行版本:在MicrosoftVisualStudio中创建项目:(1)在MicrosoftVisualStudio创建一个新项目,它是一个空白的控制台应用程序项目,不带有任何预编译的头文件。添加一个新的C++源代码文件(如果使用.c文件,后面会报错)并且将code2中串行版本的代码粘贴到里面。(2)在屏幕顶端的下拉框中选择项目的发行版Release(3)添加相应的库以便可以使用timeGetTime()函数。选择Project->Properties菜单,然后添加名为winmm.lib的库到LinkerInput目录中的AdditionalDependencies域(4)选择Project->Properties菜单并保证优化选项设置成MaximumSpeed(5)使用Microsoft编译器,在VisualStudio中按下Ctrl+F5键来启动应用程序。切换为使用Intel编译器:选择Project->IntelCompiler->UseIntelC++将弹出一个窗口询问是否将你的项目按照使用IntelC++编译器的方式重新配置。单击OK按钮,只需要检查项目的属性保持不变即可。使用Ctrl+F5创建和运行程序,可以与前面的结果相比较三步骤增加并行性:步骤1:分析串行程序本步骤的目的是找到最适合给程序增加并行性的地方。用IntelParallelAmplifierXE进行热点分析,由于AmplifierXE使得程序的运行明显变慢,所以应用程序要用小的数据量来执行,减少循环次数来减少运行时间。将代码中的外层循环缩减到1,重新构建项目(Ctrl+F5)从AmplifierXE部分的工具栏上选择NewAnalysis选择所分析的热点的类型,热点分析将查找消耗CPU活动最多的代码。单击Start按钮,Amplifier将在程序上执行热点分析。进入Bottom-up视图,点击main(),再双击main()函数,就可以查看热点的源代码,相关热点用一个条状图表示,该条的长度正比于各代码行所花费的时间。步骤2:用CilkPlus实现并行性在识别出热点代码之后,下一步就是通过将热点包含到并行域中来实现代码的并行化。在程序的开头加入头文件:#include<cilk/cilk.h>通过加入cilk_for来将C++的for循环替换成cilk_for循环。需要注意的是,循环计数器必须在循环控制内进行声明。cilk_for(intj=0;j<VERYBIG;j++)修改输出信息:printf("CilkPlusParallelTimingsfor%diterations\n\n",VERYBIG);将VERYBIG设置成10000、外层循环恢复到6,用Release发行版本重构应用程序。观看实验结果,发现并行版本要慢,甚至可能慢很多,这是因为引入了并行性的同时引入了并发执行问题。步骤3:调试及错误检查本步骤的目的是检查程序中是否有并行类型的错误,例如死锁和数据竞争(会令程序运行变慢)。这些错误是由于多个线程并发地读写相同的数据变量引起的。将配置改成debug版本,但先不要重新构建应用程序;Inspector的运行很慢,直接运行将耗费太多时间,由于只是进行分析,所以将VERYBIG设置成1000,同时将外部循环设置成1;同之前的一样,添加winmm.lib,并设置成不使用优化;(注意在属性设置时也要选择debug模式进行设置,否则修改仍然在release上进行);重新构建应用程序;启动InspectorXE,选择NewAnalysis在左侧下拉框中选择ThreadingErrorAnalysis,右侧选择LocateDeadlocksandDataRaces单击Start按钮。Inspector开始运行程序,同时执行分析。Inspector被设置成发现死锁和数据竞争,记录下实验结果,如果没有发现错误,则重复分析几次,直至看到错误。8.双击问题可以显示和它相关的代码,从代码中获知哪些变量有问题,哪些没有问题,并且分析问题出现的原因,对程序进行修改,9.通过添加CilkPlus归约器进行修改,CilkPlus的归约器用于满足并行代码中使用共享变量的要求。可以说归约器是一个共享变量,然而在运行时各个线程访问改变量的各自私有拷贝(或视图),并只对该私有拷贝进行操作。当并行域结束时,该变量各自的最终视图异步地汇总到单个共享变量中,这就在不使用耗时的锁的情况下,避免了数据竞争出现。(1)增加额外的头文件声明:#include<cilk/reducer_opadd.h>(2)在程序的开头删除sum和total变量的声明(3)用CilkPlus的归约器重新声明sum和total。归约器默认将变量清零,但是最好设置初值。cilk::reducer_opadd<longint>sum(0);cilk::reducer_opadd<double>total(0.0);将这两行添加到外部循环,替换以下语句:sum=0;total=0.0;这将保证对每一次外部循环,sum和total都被复位为0.(4)修改printf语句,使用归约器的get_value()函数,它将给出归约器变量的归约汇总后的值。printf("TimeElapsed%10dmSecsTotal=%lfCheckSum=%ld\n",(int)elapsedtime,tot

温馨提示

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

评论

0/150

提交评论