中国地质大学研究生课程论文封面课程名称高性能计算教师姓名研究生姓名研究生学号研究生专业软件工程所在院系信息工程学院类别:A.博士√B.硕士C.进修生日期:2016年1月9日评语对课程论文的评语:平时成绩:课程论文成绩:总成绩:评阅人签名:注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。高性能计算在三维地质建模上的应用一、应用背景随着地学信息化的发展,数学地质正向“数字地质”发展。三维地质建模软件将是“数字地质”的精髓与核心。三维地质建模是指采用适当的数据结构,在计算机中建立能反映地质构造的形态和各要素之间关系以及地质体物理、化学属性空间分布等地质特征的数学模型。相比传统的平面图、剖面图,三维地质模型有显示直观、空间分析功能强大、对原始数据可以直接检查等特点。由于三维地质建模涉及钻孔数据、剖面数据、三维地震资料等多种数据源,并且地质建模从二维转向三维数据量急剧增大,涉及较为复杂的计算过程,单台电脑的计算能力已经逐渐满足不了相应计算与存储的要求。三维地质建模上的应用主要为通过各种地质数据源反演计算出易于分析和表达的三维GIS规则体元模型。本文对当前主流高性能计算技术进行了总结,并对比了几种可选的技术方案。高性能计算主要解决以下几个方面的问题:1)大规模矩阵的运算。由于获取地质源数据量的增大,地质数据进行反演计算的过程中会出现上万阶甚至更大的矩阵,这些矩阵的运算需要较长的时间甚至直接超过单台主机的内存容量。2)计算代码并行。在生成三维的规则体元数据时,需要对数据进行一定的插值,计算各个体元的属性值。地质体生成的三维体元数据对精度的要求较高,导致大量耗时的计算。3)存储管理。反演计算后模型采用三维体元数据的形式进行存储,需要占用大量的存储空间,合理进行分布式的存储有利于后期的分析,并增加数据读取的速度。二、可采用技术1.MPIMPI(MessagePassingInterfaee)是一个消息传递接口的标准,MPI不是一门编程语言,而是一个库,可以被C、C++、FORTRAN等编程语言调用。从语法上说,它遵守所有语言对函数的调用过程,和一般的函数没有什么区别。通过MPI可以实现多个主机之间进程的通信,达到集群计算的目的。MPI具有良好的移植性和可扩展性、完善的异步通信机制、众多厂商的支持并且易于使用。在linux环境下,常用的MPI库为MPICH和OpenMPI,低版本可以在windows上使用。最新的MPI3.1标准在2015年6月发布,不支持容错性,预计两年后发布的MPI4.0支持新的容错性。在windows环境下,推荐使用微软为高性能计算开发的MS-MPI。2015年11月发布当前最新的7.0版本,相比之下MPICH与OpenMPI都在2011年停止了对windows的更新,只能通过安装linux虚拟运行环境使用。微软专为windows开发了一套高性能集群计算的库MicrosoftHPCPack,通过HPCPack可以使用一台装有windowsserver系统的电脑做为主节点进行MPI任务的管理,其余电脑作为计算节点进行计算。2.CUDA(ComputeUnifiedDeviceArchitecture)CUDA是显卡厂商NVIDIA推出的并行计算平台和编程模型,专为NVIDIA显卡进行计算加速而设计,通过更为简单的模型提高了显卡并行运算的易用性。在高性能计算领域,GPU的计算能力远高于CPU。最新的NVIDIA专用于科学计算的显卡TESLAK80的双精度性能将近3TeraFLOPS,内存总带宽高达480GB/s。CUDAToolkit为C++程序员开发GPU程序提供了全面的开发环境,包含NVIDIAGPUs编译器,数学库,调试优化工具等。地质建模中的数学计算可以调用其中的数学库进行加速:cuBLAS(BasicLinearAlgebraSubroutines),是标准的BLAS库的完整实现,可以进行基本线性代数的运算,相比最新的MKL库有6倍至17倍的加速。cuSPARSE(SparseMatrixRoutines)包含一系列对于稀疏矩阵的线性代数运算,通过显卡的加速可以比最新的MKL库速度上快8倍。(数据来自)3.ApacheHadoopHadoop是一个开发和运行处理大规模数据的软件平台,Apache基金会下用Java语言编写的顶级项目之一,实现了在大量计算机组成的集群下对海量数据的分布式计算,并且一度成为大数据处理的代名词。Hadoop是Google提出的MapReduce框架与GoogleFileSystem(GFS)的开源实现,主要由HDFS、MapReduce、YARN以及一系列的生态系统组成。HDFS是Hadoop对于分布式文件管理的系统,通过文件备份、虚拟化等方式实现了良好的可扩展性、容错性和虚拟化,用户可以无需关心细节直接当做一般的文件系统进行使用。MapReduce框架是Hadoop的离线计算框架,可以在集群中对海量数据进行并发处理,由于在计算过程中需要将中间结果保存到磁盘并且不能灵活进行迭代处理,这一框架有被HadoopTez与Spark框架取代的趋势。YARN是Hadoop的资源管理框架,可以对大规模集群的计算资源进行管理,Hadoop的生态系统中的其它库都在YARN的框架上进行调度。4.ApacheSparkApacheSpark是云计算领域对于大数据处理的著名开源引擎。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache基金会的开源项目之一。Spark提供了一个全面、统一的框架,用于管理各种有不同性质的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。速度上,相比先前的HadoopMapReduce框架,Spark可以将集群中的应用在内存中的运行速度提升100倍,可以将应用在硬盘上的运行速度提高10倍。易用性上,Spark提供了Scala、Java、Python、R四种语言的接口,并有80种以上的较高抽象操作,可以直接使用Scala、Python、R语言的命令行进行调用。Spark还提供了一系列库,包括SparkSQL用于数据查询、MLib用于机器学习、GraphX图标数据处理、SparkStreaming流式数据处理。运行环境上,Spark可以运行于Mesos、HadoopYARN、独立集群,并可以从HBase、HDFS、Cassandra、Hive等库中获取数据。5.MesosApacheMesos是一个集群管理器,将CPU、内存、磁盘存储以及其他的计算资源从物理主机或虚拟主机中抽象出来进行管理,提供了容错机制和弹性分布式系统机制,使Mesos易于使用并且高效运行。Mesos使用类似Linux内核的原则进行构建,但不在同一个抽象层次。Mesos的内核运行在每一台主机上,并向运行于其上的应用(如Spark、Hadoop、Kafka、Storm、MPI等)提供整个集群资源管理和调度的API。Mesos具有这些特点:可以弹性管理10000个结点,具有良好的容错性,支持Docker容器,各个任务之间相互独立,多种资源(CPU、GPU、内存、端口等)的调度管理,提供Java、C++、Python接口用于编写新的应用框架,提供了webUI可以在浏览器上查看任务运行状态与集群状态,相对YARN可以对资源进行更细粒度的管理。Mesosphere公司为Mesos库提供维护与技术支持,并在Mesos的基础上进行开发,简化了大数据开源库的部署。Mesos被Mesosphere公司定位为大数据集群的操作系统,在部署好的Mesos集群上很容易进行其他开源库的部署,现在已经实现了16分钟搭建一个Spark集群,相对于以往的集群搭建极大的减少了时间与技术成本。三、可选方案1.单独使用Spark或MPI在计算过程单独使用CPU集群可以处理时,Spark和MPI都已经在实践中得到了很好的应用,在环境部署和程序编写、运行上都已经有了很多的参考资料。对于矩阵运算,Spark可以采用MLib机器学习库中的分布式矩阵运算程序进行计算,MPI可以采用Intel开发的MKL(MathKernelLibrary)进行计算,MKL库中对于分布式矩阵运算、共享内存的多CPU矩阵运算、单CPU的矩阵运算都能高效率的实现。但对于计算密集型的程序,当前CPU的计算能力远低于GPU,可能存在一块GPU显卡的计算能力高于几台电脑组成的CPU集群的情况。2.MPI结合CUDAMPI可以作为通信工具进行集群上各台电脑之间的通信,通过MPI可以在集群中发送和接收各种类型的数据。由于MPI与CUDA都提供C++语言的接口,具有较好的兼容性,使用MPI结合CUDA不容易产生多种语言调用存在的问题,并且有非常高的效率。MPI的发展在近几年明显不如云计算技术,其劣势主要在于集群管理复杂、容错性差、可扩展性小等方面。MPI与云计算的对比如下表:3.Spark结合CUDA由于CUDA在一般并行程序的设计上提供了包括Java语言在内的多种编程语言接口,但出于效率考虑,CUDA工具包中数学库只提供了C++接口,而Spark开源库采用Scala语言开发,没有提供C++接口。因此要在Spark框架上使用GPU的计算能力,需要使用其他的方式,目前可以考虑的方式有:1)使用JCUDA(CUDA的Java接口)。JCUDA可以直接进行并行程序的开发,对于矩阵运算使用Spark下MLib机器学习库中的矩阵运算函数,对函数通过JCUDA代码进行改进,优化成使用GPU运算的代码函数。2)使用JNI技术。JNI技术是Java语言为了提高自身运行效率直接调用C++本地库的技术,使用JNI可以弥补Java相对C++在效率上的劣势,直接调用C++函数。通过JNI技术可以在Spark库的数据处理过程中调用CUDA中cuBLAS的矩阵运算库,可以很好的利用GPU的计算能力,但在Java内存与C++内存相互调用时可能存在一定的问题。3)使用Socket通信。对Spark框架的程序与CUDA的程序之间建立socket单机通信,需要处理的计算通过socket进行发送。这种方式避免了两种语言内存之间调用的问题,但相对于前两种方式效率较低。MPISparkMPI优点运行效率高(C++)运行效率低(Java框架,使用JNI技术调用C++提高效率)框架占用内存小(安装包不到20M)占内存稍大(安装包140M)网络传输速度快(infiniband技术,需要硬件支持)传输速度稍慢tcp/ip技术与RPC技术直接支持GPU编程需要使用Jcuda或是JNI技术Spark优点模型较复杂模型较简单,开发容易容错性差(一个进程失败会导致整个程序停止)良好的容错性较差的扩展性良好的扩展性分布式文件管理难已实现分布式文件管理系统4.Mesos混合集群Mesos作为一个大数据框架的底层库,可以在搭建好自身集群后更简单的在其上配置多种开源库,开源库之间共享集群的资源。因此可以使用Mesos作为底层库,在其上搭建MPI与Spark的混合集群,还可以添加Hadoop的HDFS开源库进行文件分布式存储的管理。混合集群可以在同一个集群中同时使用多个框架,利用各个框架在数据处理上的优点,避免了配置和资源调度上的问题。在进行地质建模的过程中可以采用MPI进行计算密集型过程的处理,用Spark框架进行存储上的管理与数据密集型过程的处理。四、实验与总结方案4的优势较为明显,但是环境配置较为困难。搭建Mesos集群可以直接采用Mesosphere公司提供的安装包(Ubuntu系统下使用apt-get进行安装),可以避免在编译和配置上的问题,安装好后只要稍作修改即可直接使用。Spark在Mesos上的安装较为容易,只需要在一台主机上设置其它主机能够访问的共享目录,将Spark与配置文件打包放入共享目录就可以在所有的集群下运行,首次运行时需