摘 要:面对信息时代所产生的海量数据,如果还是用以前的串行的方式来解决,既不能满足现代人高节奏生活的要求,也不能适应现在大数据云计算的时代特征,并行处理技术无疑是提高效率的主要手段。本文阐述了目前并行处理方面最为流行的技术体系。
关键词:海量数据;效率;并行处理
1引言
由于移动宽带、物联网技术、云计算技术的迅猛发展,网络被许许多多的移动终端、传感设备接入,海量数据正以惊人的速度产生。如:搜索引擎,如何更好的对网页信息进行合理的安排,才能满足用户的需求,由此而引发的种种大数据处理问题,并行处理不可或缺。并行处理技术的发展水平作为衡量国家高新技术实力的一项重要指标,它在国内应用到科学技术、经济发展和国家安全等领域中比如:天气预报建模、大型数据库管理、大规模地震数据处理、人工智能、控制犯罪率、国防战略部署等等。
2并行技术
并行处理技术可以分为三个部分,共享存储系统,分布式系统以及基于GPU的并行处理。对于共享存储系统,每种操作系统都有其对应的线程库,比如:在Windows下一般使用MFC架构以及.Net Framework下相关的操作方法,在Linux下一般使用Pthreads。另外共享存储系统广泛使用的是OpenMP编程规范 。对于分布式系统架构,使用最多的是Hadoop、Spark集群以及MPI消息传递标准。对于GPU异构环境的并行处理,NVIDIA的显卡可以直接使用CUDA框架。
3共享存储系统
共享存储,指的是在同一个分区上,同一块存储设备被多台服务器访问。如果没有这样的功能,这就意味着,谁需要该文件,这个用户就必须提供该文件的拷贝,很明显当用户访问量很大时,相当大地程度上浪费存储空间。多主机建设的共享存储系统,不仅完美地实现了数据的保存和保证信息安全的功能,而且实现了每台主机相互进行数据传送及数据共享的高效性,如非线性剪辑广播行业,员工在生片记录和数字化的同时,可以使另一个编辑人员审核视频的长度,以便它可以有效地加快制片速度,大大节约生产成本。
在共享存储系统的编写程序主要分为两个部分:针对于特定操作系统的线程库和在不同平台上编程的规范及库。OpenMP标准是共享内存并行系统下,多处理器程序设计的一套对程序具有指导性的编译处理方案,它具有良好的跨平台性和可移植性,支持多种程序设计语言:C语言、C++、Fortran。由于OpenMp的编译器的普遍使用,涌现出了许多支持的它的编译器(如:Sun Compiler,GNU Compiler和Intel Compiler等)。在并行算法的高层,OpenMP作了抽象的描述,编写并行程序的复杂度及难度得到大大的降低。因此,程序员不必在意其实现的具体细节,只需要通过在源代码中加入特殊的编译指令,来表明自己的意***,通过编译器编译之后,实现了串行程序的并行化,并且,如果有需要的话,会自动添加同步互斥机制和通信功能。如果一些编译器及相关平台不能识别该编译指令,则编译器会选择跳过这些指令,源代码依然仍可以执行,只是不能通过多线程机制来加快程序的运行速度,但源程序的稳定性并不会被影响。另外,OpenMP标准的并行是线程级的并行,资源消耗量低,占用内存也就较少,在共享存储系统上发挥着一定的优势。
4分布式系统
分布式系统有消息传递和MapReduce这两种程序设计模型,消息传递的编程框架是MPI,其使用的编程环境是MPICH2,MapReduce对应的编程环境是Hadoop。
4.1 MPI
MPI是一种跨语言编程接口标准,用于编写并行计算机上的消息传递程序。用户实现信息的通讯和互换,是通过在程序中发送数据和接收数据完成的。
由于MPI并行编程框架具有良好的移植性(支持以现在流行的Windows操作系统以及大部分Linux操作系统为主要代表的不同的操作系统)和较好的异步通信速度,所以其远远胜于老式的信息传递库。MPI支持很多种程序设计语言,在一些由指定惯例集(API)组成的MPI上,可由C语言,C++,Fortran,或者平台上有此类库的语言可以直接调用。此外,MPI还支持多核处理器、集群等其它分布式硬件平台。
4.2Hadoop
Hadoop框架最核心的结构设计部分是:MapReduce计算模型和HDFS(Hadoop Distributed File System)分布式文件系统。MapReduce模型,采用的是“分而治之”,
“先分后合”的思想来处理大数据,程序员编写的并行程序,通过Map、Reduce这两个过程,将大任务转换为同时执行的许许多度多的小片段,极大地提高了数据的计算能力。面对如此庞大的数据,Hadoop采用分布式文件系统(HDFS)来解决海量的数据存储的存储问题; Hadoop 集群上所有节点上的文件由分布式文件系统存储和管理。HDFS对POSIX的要求很低,集群的数据能够以流的形式被访问,因此,它特别适合对那些拥有着超大数据的程序以高吞吐量的形式进行访问。Hadoop框架结构中的更多相关子项目,比如: HBase是分布式NoSQL数据库,而Hive是数据仓库工具。
5 基于GPU的并行
GPU(Graphics Processing Unit)不是单纯一个***形计算接口,而且对数据还有很强地处理能力。GPU和CPU这两个处理器在设计时,采用了完全不同的理念:GPU旨在提供数据的高吞吐量,而CPU的优化意在大幅度提高串行代码的执行性能。对并行程序的执行,充分发挥它们各自的优势,将逻辑性很突出的事物,移交给CPU处理,而对于诸如***形渲染这种计算密度较大的任务,由GPU执行,那么基于GPU的并行程序的在执行效率上会提高不少。
5.1 CUDA
CUDA (Compute Unified Device Architecture)框架就是针对GPU设计的一个计算设备,CUDA程序只是在原有的C语言的基础上添加了函数和扩张库。在整个结构中,并行程序被分成两个部分:Host主机(CPU)上执行串行代码,Device设备(GPU)主要负责大部分可并行处理的任务。GPU需要处理的数据,由内存中传送到显存中,这里的显存笼统上可以说是GPU的任何存储器,Device端的代码通过Kernel函数由Host端进行计算,执行完了之后,将运行的结果传回内存中。
5.2 CUDA 的线程层次
在CUDA线程的结构体系中,Grid(网格),Block(块)和Thread(线程)这主要的三层构成了并行的线程阵列,N个Thread构成了一个Block,而N个Block又构成了一个Grid,Thread是整个体系结构中,程序运行的最小单位。在同一个Block中的Thread不仅能够共享纹理存储器及全局存储器,而且能够共同访问某些共享存储器,而如果Thread不在同一个Block中,它们只能共享全局存储器。虽然每个Grid中的Thread执行程序是相同的,但每个Thread各自所需的执行数据不同,它们对应于共享存储器中的不同位置,这就需要一种工作机制,来进行存储空间的定位,实现定位的具体公式如下:i = blockIdx.x * blockDim.x + threadIdx.x
5.3 CUDA 的存储模型
在各存储器中,位于最底层的是寄存器。寄存器是每个线程各自私有的,如果寄存器的存储空间不够,本地存储器将开始启用(对于每个线程来说,它也是私用的),但是数据被保存在帧缓冲区(DRAM)中,因此访问速度较寄存器而言很慢。接着是共享存储器,它是可读写存储器,能够被在同一Block中的所有Thread(最多512个)访问。共享存储器功能很强大,可以保存公用的计数器、Block的公用结果,其访问速度与寄存器相当,是减少线程间通信延时的一种较好的处理方法。 除此以外,还有两种地址空间:常数存储器和纹理存储器。由于它们具有只读性,所以能够缓存在GPU片内,从而大大加快了访问速度。支持随机访问的常数存储器空间只有64k,在CUDA程序中,经常用来存储访问的只读参数;而纹理存储器尺寸较大,与传统的缓存相比,它支持二维寻址可以通过插值、滤波的方式来访问大尺寸的二维、三维***象,也可以用采样序列的方法进行高带宽的流式访问。最后是全局存储器,它只是普通的显存,整个Grid中的任意Tread都可以从GPU或者CPU读写全局存储器的任意位置。
6 总结
并行处理是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并行处理技术也可以分为两部分:数据的通信,数据的处理。在分布式系统下,各节点的数据需要交换,MPI技术可以帮助解决通信问题,在共享存储系统下,数据可以被多台服务器直接访问,数据不需要通信。数据的处理方式根据处理器的不同可以分为CPU和GPU。目前的多核,多处理器,分布式系统属于CPU的并行;而GPU直接启动多线程实现并行。
作者简介:白圆(1991),性别 男,民族 汉,籍贯 湖北省云梦县,职务/职称[学生],学历 硕士研究生,单位 宁夏大学 ,研究方向 并行分布处理与高性能计算。