第06章 科学计算系统平台的性能优化_第1页
第06章 科学计算系统平台的性能优化_第2页
第06章 科学计算系统平台的性能优化_第3页
第06章 科学计算系统平台的性能优化_第4页
第06章 科学计算系统平台的性能优化_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第6章科学计算系统平台的性能优化桥梁工程结构智慧监测——理论与实践CONTENTS16.1系统平台运行效能优化26.2系统平台输入输出优化36.3系统平台健壮性上章研究了基于MATLABBuilderJA产品和MATLAB函数开发科学计算类库的组件化实现方案,以及基于JavaEE和科学计算类库构建可为桥梁健康监测服务的Web智能计算平台的各项技术,并用实例验证了在Web智能计算平台上集成MATLAB语言强大的科学计算能力的可行性。结果表明,基于JavaEE平台规范,结合监测数据处理算法的组件化实现方案,对于进行一般化的桥梁健康监测系统平台设计有重要的指导意义和实践意义。但是在实践中发现,以上述思路为基础搭建的Web平台的运营过程中存在一些瓶颈问题,限制了其应用,概述如下:系统平台运行速度无法满足需求,用户从通过浏览器发送请求到能够在浏览器查看结果需要较长时间。系统平台输入输出需要花费较长时间,且由于海量监测数据的影响,将占用较大的运行内存。系统平台健壮性较差,容易引起服务器崩溃,影响了系统平台的总体性能。本书将在下一章内针对上述瓶颈问题分析原因,并进行相应的关键技术研究。6.1系统平台运行效能优化运行效率及性能的问题:系统平台在开发和正式投入运营时遇到的最主要的瓶颈问题。、导致此问题的原因可分为两方面:系统平台的数据处理面向海量的监测数据,当基于MATLAB开发的算法函数较为复杂时,耗费时间会很长;MATLAB语言属于解释性语言,执行效率较低。上述两方面因素导致了在用户通过浏览器在向服务器发送数据处理请求后,需等待较长时间方可查看到返回的数据处理结果,而这与人机界面的友好直观要求相悖,用户显然不愿意在浏览器端等候很长的时间。针对此问题,本章展开了研究,认为在编写算法函数时采纳如下方案可以在一定程度上提升函数执行速度和性能,避免耗时过长或性能下降:优化程序代码使用MEX文件采用并行计算方式初始化MCR6.1.1优化程序代码1采用向量化操作循环语句及循环体经常被认为是MATLAB编程的瓶颈问题。在MATLAB中,应尽量避免使用循环,应采用向量化的操作,来代替循环语句及循环体,可以大幅度提高运行效率。考虑下面的级数求和公式:按照常规的编程方式,编写计算函数fun1.m,如下:(为演示效率提升效果,对该级数的前107项求和)1采用向量化操作----------------------------------------------fun1.m--------------------------------------------functions=fun1()%基于上一页公式,对级数公式的前1000000项求和

tic;s=0;forn=1:1e7s=s+n/((n^2+1)*(n^3+2)*(n^4+3));end;toc;end------------------------------------------Endoffunction---------------------------------------采用向量化编程方式,编写计算函数fun1_1.m,如下:1采用向量化操作---------------------------------------------fun1_1.m-------------------------------------------functions=fun1_1()%基于级数求和公式,采用向量化方式,对级数公式求和tic;s=0;n=(1:1e7);v=n./((n.^2+1).*(n.^3+2).*(n.^4+3));%对向量进行操作;fori=1:1e7s=s+v(i);end;toc;end;------------------------------------------Endoffunction-----------------------------------------在同一台机器上分别运行两个函数fun1.m及fun1_1.m,耗费时间如下表,从表中可以看出,采用向量化编程方式约可节约近一半时间。1采用向量化操作函数运行时间对比2优先采用内置函数MATLAB软件提供了大量的函数工具箱,工具箱中内置了很多已经过优化的函数,这些函数一般是基于更底层的C语言构造的,因而直接采用内置函数,往往比自己编写函数运行效率要高很多。因此,在编程时推荐优先采用MATLAB软件的内置函数。如fun1_1.m函数中的for循环代码块,即可以直接采用s=sum(v)来完成,不仅减少了代码量,而且运行速度也有所提高。----------------------------------------------fun1.m--------------------------------------------functions=fun1()%基于上一页公式,对级数公式的前1000000项求和

tic;s=0;forn=1:1e7s=s+n/((n^2+1)*(n^3+2)*(n^4+3));end;toc;end------------------------------------------Endoffunction---------------------------------------s=sum(v)3预分配数组在MATLAB函数执行过程中,若函数中数组的维度未事先确定,则数组会动态的更改其大小,这将耗费一定的时间,若数组维度较大,则耗费时间会相应大幅度增加。因此,建议在使用大维度数组时,事先定义其维度。考虑下面的求矩阵公式:若矩阵维度为[10000,10],按照常规的编程方式,编写函数fun2.m如下:3预分配数组---------------------------------------------fun2.m-------------------------------------------------functions=fun2()%基于上一页公式,求矩阵

%维度为[10000,10]tic;fori=1:10000forj=1:10s(i,j)=(i^2-j^2)/(i^2+j^2);end;end;toc;end------------------------------------------Endoffunction-------------------------------------------采用事先预分配数组的方式,编写函数fun2_1.m如下:3预分配数组----------------------------------------------fun2_1.m----------------------------------------------functions=fun2_1()%基于公式,事先预分配数组,求矩阵%维度为[10000,10]tic;s=zeros(10000,10);fori=1:10000

forj=1:10

s(i,j)=(i^2-j^2)/(i^2+j^2);

end;end;toc;end------------------------------------------Endoffunction-------------------------------------------3预分配数组在同一台机器上分别运行两个函数fun2.m及fun2_1.m,耗费时间如下表所示,从表中可以看出,采用预分配数组方式可显著减少运行时间。函数运行时间对比对于二重循环和多重循环的特殊问题,还可以使用meshgrid函数或ndgrid函数构造循环变量的矩阵,这样,可以将多重循环体采用向量化的方式实现。其中,meshgrid函数用于产生二维矩阵,ndgrid函数用于产生多维矩阵。采用meshgrid函数,编写函数fun2_2.m,如下:3预分配数组----------------------------------------------fun2_2.m---------------------------------------------functions=fun2_2()%基于公式,采用meshgrid函数,求矩阵%维度为[10000,10]tic;[i,j]=meshgrid(1:10000,1:10);s=(i.^2-j.^2)./(i.^2+j.^2);toc;end------------------------------------------Endoffunction------------------------------------------3预分配数组在同一台机器上分别运行两个函数fun2.m及fun2_2.m,耗费时间如下表所示,事实上,此处不需要对矩阵s进行预分配,在fun2_2.m运行时,s的维度默认与矩阵i,j的维度相同,也就是说,meshgrid函数从另一角度完成了预分配矩阵的任务。函数运行时间对比4修改内外层循环当函数中涉及到多层循环体(此循环体是不可避免的)时,如果多个循环执行的次数不同,则建议将循环次数最少的循环放在最外一层,循环次数越多的放在靠近的内一层,可以显著提高速度。将函数fun2.m的内外层循环进行修改,编写函数fun2_3.m,如下:----------------------------------------------fun2_3.m---------------------------------------------functions=fun2_3()%基于公式6-3,修改内外层循环,求矩阵%维度为[10000,10]tic;fori=1:10

forj=1:10000

s(i,j)=(i^2-j^2)/(i^2+j^2);

end;end;toc;end------------------------------------------Endoffunction------------------------------------------在同一台机器上分别运行两个函数fun2.m及fun2_3.m,耗费时间如下表所示,从表中可以看出,采用修改内外层循环方式可显著减少运行时间。函数运行时间对比4修改内外层循环5使用mlint函数和profile函数mlint函数和profile函数均是MATLAB软件内置的函数。mlint函数可以对代码进行检查,输出代码中存在的语法错误并给出提升代码运行性能的建议;profile函数可以监测代码中被调用的各子函数的运行时间,并输出运行时间的报告。根据运行时间报告,可以针对性地对耗费时间较长的子函数代码进行修改。关于profile函数的用法,可见函数fun3.m:------------------------------------------------fun3.m----------------------------------------------functionfun3()%演示profile函数profileon;%启动profilers1=fun2();s2=fun2_1();s3=fun2_2();s4=fun2_3();profileviewer;%在profiler窗口显示各子函数运行时间profileoff;%关闭profilerend------------------------------------------Endoffunction------------------------------------------5使用mlint函数和profile函数5使用mlint函数和profile函数输出结果见下图:profile函数的输出结果从图中可以看出,fun2子函数的运行时间最长,需要对其进行修改。因此,在编写代码时,可以利用profile函数,获得代码中被调用的子函数的具体执行时间,从而有针对性的进行修改。6其他代码优化技术其他代码优化技术包括:当读取或生成大量的数据时,考虑将数据进行分段,将前一段数据读取或写入硬盘后,清空工作空间,再进行下一段的操作。当矩阵中包含大量的零元素时,考虑用sparse函数将原矩阵转换成稀疏矩阵。在建立数值矩阵时,矩阵中每个元素默认采用双精度(double)数值类型,当要采用其他数值类型时,最好先用repmat函数生成矩阵。repmat函数也可用于方便的增大矩阵的大小和维数。6.1.2使用MEX文件如前文所述,MATLAB是一种解释性语言,这使其代码执行效率低。并且很多情况下,不可避免的要使用大量循环。这些因素使得MATLAB软件在运行速度方面,相比于其他编程语言处于劣势。但是,MATLAB软件提供了与C语言程序交互的应用编程接口(API),通过调用基于C语言开发的已编译的MEX文件,可以显著地加快函数的运行速度,同时,MEX文件还具有隐藏算法的优点。事实上,MATLAB内置的函数很多都是以MEX文件的形式存在。基于C语言的MEX文件是一种动态链接子程序(windows系统下为.dll文件),可以像调用M文件一样调用它。MEX文件主要应用方式包括:鉴于C语言在循环迭代方面的运行速度远远超过MATLAB语言,故MATLAB函数代码中的大量循环迭代部分可以用C语言编写为MEX文件,提高计算速度。可以直接采用C语言编写,也可以使用MATLABComplier或mcc命令将M文件自动编译。但是,目前MATLAB的最新版本(MATLAB7之后)已经不再支持将M函数自动编译成MEX文件,而是采用MATLABJIT实现加速。已经开发的C语言程序,通过添加入口函数mexFunction,可以实现由MATLAB调用。对于循环较少的文件

不建议重新编写为MEX文件形式6.1.3采用并行计算方式基于MATLAB软件可以进行并行计算,包括在单个计算机上以及计算机机群(cluster)上的并行计算。通过并行计算,可以充分利用计算机的硬件资源,从而使运行速度加快。但是,并行计算方式在使用时有以下两个特点:并行计算方式可以将大规模的任务分解为若干个子任务,再将各个子任务发布给不同的CPU或计算机去执行,最后把结果收回。这导致了各个子任务之间必须相互独立。对于循环次数较多但单个循环体执行很快的任务,花费在任务调度上的时间可能要超过通过并行节省的时间,这时不建议采用并行计算方式。但是,对于循环次数较少或单个循环体执行耗时较长的任务,采用并行计算方式将大幅度提升计算速度。6.1.3采用并行计算方式1基于多核CPU的并行计算MATLAB软件提供了并行计算工具箱(parallelcomputingtoolbox)来支持并行计算,常用的并行计算函数包括parfor、batch、spmd等。在基于多核CPU的并行计算中,一般将本地的MATLAB环境作为Client,而将单个核作为一个Worker,具体机制是在Client上自动或手动进行任务的调度分配,再将子任务发布到多个Worker上进行计算。例如,函数parfor的运行机制如图所示。parfor的运行机制1基于多核CPU的并行计算----------------------------------------------fun2_4.m----------------------------------------------functions=fun2_4()%在fun1.m的基础上,应用parfortic;parfori=1:2s(i)=fun1();end;toc;----------------------------------------------Endoffunction---------------------------------------在fun1.m的基础上,应用函数parfor,代码如下:1基于多核CPU的并行计算循环体运行时间/si=15.722si=26.206si=1&26.264s函数运行时间对比单独运行fun1.m时,其运行时间是5.727s(见6.1.1)但是,从表中可以看出,由于任务调度耗时的影,使得每次运行fun1函数的耗时有所增加,但是从总体上看,两次循环体是以并行方式执行,节省了近一倍时间。2基于计算机机群的并行计算机群是一组独立的计算机(节点)的集合体,节点间通过高性能的互联网络连接。各节点除了可以作为一个单一的计算资源供交互式用户使用外,还可以协同工作表现为一个单一的、集中的计算资源供并行计算任务使用。MATLAB机群模型如图所示,在机群中利用MATLAB进行并行计算需要安装并行计算工具箱PCT(ParallelComputingToolbox)与MATLAB分布式计算服务器MDCS(MATLABDistributedComputingServer)。MATLAB机群模型2基于计算机机群的并行计算基于MATLAB与计算机机群的并行计算流程可以表述为:首先,在每台参与计算的计算机中启动MATLABDistributedComputingEngine(MDCE)服务,该服务能够启动参与计算的Worker的MATLABSession和管理各台计算机Workers的JobManager。JobManager对Workers进行管理,给Workers分配计算任务,接收Workers计算后的结果。而Client通过PCT把工作分解为多个任务,然后把任务传递给JobManager。JobManager根据Workers的多少和空闲情况,适当地把任务分配给Workers完成。Workers完成任务后,会把各自的计算结果返回给JobManager。当所有Workers都返回结果后,Client就可以从JobManager里取回结果。2基于计算机机群的并行计算6.1.4初始化MCR在基于JavaEE平台规范开发的Web平台上调用MATLAB软件生成的组件时,MCR将自行启动,为该组件提供运行环境。但是,MCR的加载需要耗费一定的时间,一般情况下,几乎等同于启动MATLAB软件的时间,尤其是在网络上远程访问服务器时,由于网络延迟等因素的影响,MCR的启动时间会相应更长。因此,本章建议将MCR的启动与Web平台的加载相绑定,在加载Web平台之后,MCR即自行启动,这样,当用户访问Web平台时,MCR已经处于运行状态。初始化MCR的方式是在Web平台上添加一个实现ServletContextListener接口的应用程序环境对象(ServletContext)监听器,当Web服务器启动时,会自动创建ServletContext对象,而监听类捕捉到此对象后,只需调用该对象的setAttribute方法,通过初始化任何一个基于MATLAB软件生成的组件对象,就可以完成MCR的初始化。6.1.4初始化MCR6.2系统平台输入输出优化系统平台的输入主要包括:用户的请求信息,指用户填写在页面上的参数配置信息,如进行傅里叶变换时用户需要在网页上指定采用的信号滤波器、关心的频带范围及需要的频率分辨率等。保存在数据库中的信息。如传感器的各项参数,包括采样频率,部署位置等等。数据文件,主要是指监测到的原始数据文件,按照桥梁健康监测系统的组成划分,应保存在数据管理子系统中,在本章中,数据管理子系统部署在数据库服务器。系统平台的输出主要包括:用户关心的结果应输出到客户端浏览器上,供用户查看。用户配置的一些参数信息,如有必要,应保存在数据库中,如用户更改了在线评估功能的评估指标阀值,新的阀值应自动替换数据库中旧的阀值。重要的数据分析结果,应自动保存在数据库服务器中,以文件的形式保存。因此,系统平台的输入输出内容可划分为两类:一是用户自定义及数据库中的参数配置信息,特点是简单,占用内存空间较小;二是文件,包括原始数据文件和数据处理结果文件,较之前者更为复杂,占用内存空间很大。将输入输出内容进行合理优化,可以提升系统平台的运行速度,减少占用的内存空间,从而增强系统平台的整体性能。6.2.1参数配置信息的优化因此,本章建议:首先,在将用户自定义的或数据库中的参数配置信息提交时,应事先对这些信息进行编号,尽量以单个数值的形式进行数据类型的转换,避免使用数组或字符串等,后者的转换需要耗费更长的时间及占用更多的内存,而在MATLAB算法函数编程中,采用Switch关键字将不同编号值对应不同的参数信息。如在进行傅里叶变换时,页面上不同的信号滤波器选项可以设置为与编号(1,2,3,4,5….)等一一对应,当选择第一个信号滤波器时,传递给基于MATLAB软件生成组件的输入参数是数值1对应的MWArray子类对象,而组件对应的算法函数直接根据编号1对应的滤波器进行计算。6.2.1参数配置信息的优化数据转换类的层次结构图按照前文介绍的数据类型转换的概念,参数配置信息先被转换成MWArray类及其子类类型(如图),然后传给基于MATLAB软件生成的组件。数据类型的转换需要耗费一定的时间,且需要占用内存空间。6.2.1参数配置信息的优化其次,采用配置文件的方式代替部分参数配置信息。实际上,在进行数据处理的算法函数编程时,经常存在多种数据处理方法,每种处理方法对应不同的配置参数,这些配置参数一般是较多的,但往往比较固定,不需要进行修改,或者需要专业的研究人员来修改,因而,也不需要保存在数据库中。这时,建议采用配置文件的方式设置这些配置参数,可以保存在MATLAB的*.mat文件中,当调用组件内的方法需要上述参数时,直接在底层的算法函数中采用load函数加载*.mat文件即可。采用这种方式有两个优点:第一是通过配置文件加载的参数不需要进行数据类型的转换,节省运行时间和内存空间;第二是研究人员可以很方便的通过修改配置文件,实现自己的目的。6.2.2文件访问的优化原始数据文件一般占用内存空间较大,当基于Java语言读取原始数据文件时并传给基于MATLAB软件开发的组件时,就面临大量原始数据的类型转换问题,这将耗费较多的时间。因此,本章建议,当出现上述情况时,可以通过系统平台上的

Java应用自动将原始数据文件复制到组件所在机器上,并传给组件该文件的路径字符串,经过数据类型转换后,组件底层的MATLAB算法函数根据数据文件路径读取数据文件并进行处理。采用这种方式,就避开了大量原始数据的类型转换问题,节省了时间和内存空间。

温馨提示

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

评论

0/150

提交评论