• 美文
  • 文章
  • 散文
  • 日记
  • 诗歌
  • 小说
  • 故事
  • 句子
  • 作文
  • 签名
  • 祝福语
  • 情书
  • 范文
  • 读后感
  • 文学百科
  • 当前位置: 柠檬阅读网 > 范文 > 正文

    利用对文件的读取测试并行系统的I/O性能

    时间:2020-12-17 09:43:55 来源:柠檬阅读网 本文已影响 柠檬阅读网手机站

    (1.内蒙古大学 计算机学院,内蒙古 呼和浩特 010021;
    2.内蒙古科技信息研究所,内蒙古 呼和浩特 010010)
    摘 要:本研究对象为并行计算机的I/O性能,利用负载平衡算法将任务分发给不同的处理结点,通过进程间的相互协调、有序合作完成任务。在完成任务的过程中,通过记录I/O时间与计算时间,求出I/O性能与计算性能,通过分析比较数据从而认识I/O性能的重要性。研究计算机的I/O性能对于如何进一步改进系统以及提高资源利用率具有重要意义。
    关键词:并行性;
    并行程序设计;
    I/O;
    MPI;
    进程
    中图分类号:TP316.4  文献标识码:A  文章编号:1007—6921(2008)08—0053—03

    并行程序设计方法的一个最基本的观点,就是把一个事物的行为看成是多个事物互相作用的结果。本文的主要研究内容就是在并行环境下,利用C语言和MPI编写程序,对已建立的文件进行读写,进而测试数据在单机上和并行系统中的I/O性能,并对测试数据进行分析,以体现并行系统在处理大规模数据时的优越性。
    1 并行程序设计的有关概蓬
    1.1 并行计算的概念 

    并行计算是指有很多小任务合作来求解一个大计算问题的一种方法,而数据并行指的是将相同的操作同时作用于不同的数据,从而提高问题求解速度。长期的实践表明数据并行可以高效地解决大部分科学与工程计算问题。数据并行模型是一种较高层次上的并行计算模型,它提供给程序员一个全局的地址空间。通常这类模型所采用的语言本身就提供有并行执行的语义,因而程序员只需要简单地指明执行什么样的并行操作和并行操作的对象,就实现了数据并行的编程。
    1.2 程序并行化的负载平衡方法   

    本次研究的程序设计用到了程序并行化的负载平衡方法,主要运用了数据分割这一方法,因此对负载平衡方法作一些简单的介绍。


    负载平衡群集就是带均衡策略(算法)的服务器群集。负载平衡群集在多节点之间按照一定的策略(算法)分发网络或计算处理负载。负载平衡建立在现有网络结构之上,它提供了一种廉价有效的方法来扩展服务器带宽,增加吞吐量,提高数据处理能力,同时又可以避免单点故障。
    1.3 MPI概述
    1.3.1 MPI的概念及优点。为了简化并行程序的设计,需要采用合适的并行编程模型。目前两种最重要的并行编程模型是数据并行和消息传递。数据并行编程模型的编程级别较高,编程相对简单,但只适用于解决数据并行问题;
    消息传递编程模型的编程级别较低,编程相对复杂,但却有着更加广泛的应用范围。

    由于消息传递并行编程模型的广泛应用,目前已经出现了许多基于该模型的并行编程语言,其中最流行的是PVM(Parallel Virtual Machine)和MPI(Message Process Interface)。MPI是一种基于消息传递模型的并行编程接口,目前已经发展成为消息传递模型的代表和事实上的工业标准,而不是一门具体的语言。迄今为止,所有的并行计算机制造商都提供对MPI的支持,因而从理论上说任何一个正确的MPI程序可以不加修改地在所有并行计算机上运行。MPI的主要优点是:MPI的实现方式多样化,同一编程界面可有多种开发工具;
    MPI能实现完全的异步通信;
    MPI能有效地管理消息缓冲区;
    MPI能在MPP与工作站机群上有效运行;
    MPI异步执行时能保护用户的其它软件不受影响;
    MPI是完全可移植的标准平台。
    1.3.2 用到的MPI中的函数的说明。MPI只是一个并行编程语言标准,要编写基于MPI的并行程序,还必须借助某一MPI具体实现。为了保证编译的正确性,程序的首部必须包含MPI的头文件<mpi.h>.该文件给出了MPI所有调用接口的说明,并对所有用到的常量进行了定义。

    在点到点的通信中,主要用到的函数是MPI[CD#*4]SEND(buf,count,datatype,dest,tag,comm) 和MPI[CD#*4]RECV(buf,count,datatype,source,tag,comm,status),其中buf为发送(接收)缓冲区的起始地址;
    count为发送(接收)缓冲区种元素的个数,非负整数;
    datatype为发送(接收)缓冲区种元素的数据类型;
    dest为目标进程的逻辑编号,类型为整数;
    source为数据源的rank值(整数);
    tag为消息标签,类型为整数;
    comm为通信子,status时MPI采用的一种能保证一个进程的多个线程都在接受消息时也能可靠的进行的一种方法。
    2 算法分析
    2.1 测试环境的介绍及课题分析
    2.1.1 测试环境。硬件:4台浪潮英信NL120服务器(双Intel DP XEON CPU、1 GB 内存);
    10 Mb以太网组成的机群系统;
    软件:Red Hat Linux 8.0,MPI应用环境,Linux C语言,Linux vi编辑器。
    2.1.2 测试工具。Linux vi编辑器,MPI应用环境。
    2.1.3 测试对象。生成的大小为1 000×1 000的矩阵,对其进行读取,处理及写回等操作,以测试在单机下或并行系统下的I/O性能。
    2.1.4 课题分析。本次研究主要侧重计算机在单机或并行系统中的I/O性能测试,通过进程同时读取、处理和写回数据,并按负载平衡算法对任务数据进行分割,并行处理任务。同时通过对测试数据的分析体现并行处理所带来的优越性。


    2.2 算法概述

    程序的编写是基于Linux操作系统下的MPI和C环境。在程序的开始先定义两个文件file1和file2,file1作为源文件,file2作为目标文件,用来存放经过进程处理后的数据。再定义两个数组array和buffer,不固定分配,目的是根据实际的进程数分配内存。

    打开一个文件,内容为全是字符“a”的1 000×1 000的矩阵,并根据进程数为每个进程分配矩阵,将每个进程准确的定位到文件中的位置,开始将文件中的字符读到矩阵中,读取的方法采用的是纵向读取。此时是n个进程同时读取,这是本程序中并行性的第一次体现。当进程读取完毕后,将进行对已读取数据的处理,对字符的ASCII码加2(即将字符‘a’变为‘c’),并在处理完毕后继续空转8 000×10 000次,目的是模拟大规模数据处理的计算量,这使程序并行性的第二次体现。当所有的数据处理过程完毕后,程序将会把处理结果写回目标文件file2,此时,在写文件时运用了两种算法:一是进程0负责收集结果,先将进程0自己的处理结果写回file2中去,然后再收集其他进程的处理结果(利用函数MPI_RECV(buf,count,datatype,source,tag,comm,status)),写回数组array,再将数据写回目标文件file2;
    二是进程0负责收集结果,然后将结果数据同时写入目标文件。这是程序并行性的第三次体现。
    2.3 核心算法的分析
    2.3.1 文件读取的算法分析。程序在读取文件时,是采取纵向读取的方式,每个进程是相对独立的,因为各进程之间独立处理自己的任务,并无任务数据交换,也无信息交互。首先建立一个1000*1000的矩阵,再利用rows得到每一个进程所需要处理的列数,然后精确定位每个进程的读取位置,以4个进程为例(gsize4),则每个进程读取一个大小为1 000×250的矩阵(rows=1000/gsize),进程0先将第一行从0——249的250个字符读入array[0][0]——array[0][249]中,其他的同时进程进行着类似的工作,定位工作由fseek(file1,myrank*rows,SEEK_SET)完成。当0、1、2、3号进程各自在第一行的读取工作结束
    后由fseek(file1,rows*(gsize-1)/*250*3*/,SEEK_CUR)做跳转的工作,每个进程跳转250*3列(rows*(gsize-1)),达到精确定位的目的。

    在进程读取矩阵时,有可能会遇到矩阵不满的情况,也就是说在某个进程读取的过程中,读取的字符已经读完,但还没有填满array[1000][2500](array的大小不固定分配,而是根据实际的进程数进行分配),为了简单起见,我用‘$’将array填满。在填的过程中可能会遇到两种情况:①可能在读取某一行完毕后正好读完,则从下一行的开始进行填充;
    ②可能在读取某一行到中间时正好读完,则从本行的剩余部分开始进行填充;
    为了实现以上的功能,我定义了endi和endj来确定读取数据完毕的位置。
    2.3.2 文件处理算法分析。对于已经读到内存的数据进行处理是比较简单的。每个进程并行的处理数据,同时分别在各自的array中将字符的ASCII码加二,及array[rows*i+j]+=2。虽然是一个2位数组,但在内存中也是顺序存放的,因此用array[rows*i+j]来表示,相当于array[i][j]。在进行每一次加二处理后都要进行150×10 000次的空转以模拟运算量。最后利用函数MPI[CD#*4]Barrier();
    对进程的处理情况进行判断。
    各进程在进行处理之前先要进行一个判断,当array中的字符不为‘$’符时,才进行运算。利用MPI_WTIME函数对进程处理计时,以测试其并行性的优势所在。
    2.3.3 处理后数据写回文件算法分析。当进程对数据处理结束后,要将处理后的结果写回到文件file2中去。进程0负责收集结果,并经结果写进文件中。进程0先将自己的处理结果从array中写入file2,然后在接受其他进程的处理结果。程序这样处理的目的是当只设定了一个进程时,也就是只有进程0,则进程0就不用去收集其他进程的结果,只将自己的处理结果写入file2中,使程序只在一个节点上运行,从而可以根据其结果来测试在单机环境下的I/O性能。当存在多个进程时,其他的进程利用MPI函数MPI_Send(p+rows*i,rows,MPI_CHAR,0,i,MPI_COMM_WORLD)将处理结果发送给进程0,而进程0对其他的每个进程(以4个进程为例,rows=250)利用函数MPI_Recvbuffer,rows/*250*/,MPI_CHAR,k,i,MPI_OMM_WORLD,&status)进行接收,总是先接收大小为1*250的数据写入buffer中,然后将数据从buffer写入到文件file2中。这样,进程0对其他的进程每个接收1000次,并对file2写入1000次。进程0总共接收数据的次数是1000*(gsize-1)。对程序的写入过程进行计时作为测试I/O结果的一部分。

    由于上述算法没有经过代码优化,因此在测试时产生的结果随机的产生较大的数据波动,因此对以上代码进行了优化,添加了一个名为writearray[][]数组,进程0将自己处理的结果从array中放入writearray中,其他的进程将数据发送给进程0,进程0接收后,将其他进程buffer中的数据(MPI自动处理)写到writearray中,直到写完为止,然后将writearray中的数据整体写回文件file2中。这样处理的目的是减少进程0对文件file2进行写操作所花费的开销。但同时也增加了对writearray写操作的开销,由于对writearray的写操作是在内存中进行的,因此相对于写存储器的开销要小得多,达到了代码优化的目的。
    3 测试方案及结果分析
    3.1 测试方案

    本次测试利用已编写的程序,分别在Linux操作系统下的MPI环境中运行,利用MPI_WTIME函数,分别对进程的读过程、处理过程、写过程和总体消耗的时间进行计时,通过测试结果的比较,找出一个进程数与处理速度I/O性能之间的最优点。
    3.2 测试结果分析
    3.2.1 分析1:由测试数据可以清楚地看出,当只有进程0时,所有的数据均在一个节点上进行处理,相当于是测试了单机的I/O性能;
    而当进程数增加时,所有的进程都是并行的工作,所以,在读取文件的方面:随着进程数的增加,文件读取的任务在负载平衡算法下被分割成了n份(n=gsize),每个进程并不知道其他进程的存在,它们之间没有通信和数据交换,所以每个进程是相对独立的处理各自的任务,从而实现了并行处理。当进程数越多,整个文件的读取速度有着明显的提高。在处理任务方面:随着进程数的增加,对整个文件的计算处理的速度也有非常明显的提高。但随着进程数的增加,系统用于对进程的维护的开销也随之加大,从数据显示,当进程数与并行系统的物理节点个数相一致时,并行处理的整体性能最佳。
    3.2.2 分析2:由测试数据可以清楚地看出,当只有进程0时,所有的数据均在一个节点上进行处理,相当于是测试了单机的I/O性能,当进程数增加时,出现了一个现象,就是进程对文件的写入时间有所增加,这是因为当只有一个进程时,系统不需要在进程通信方面做任何开销,所以写入时间花费较少。随着进程数的增加,系统用于通信的开销要远大于写入文件的开销,所以出现了花费更长的时间的现象。当进程数增加到一定数量后(与系统的物理节点数相近),系统用于通信的开销、用于维护进程的开销和增加进程数所带来的系统性能的提高几乎相抵甚至高于增加进程数所带来的系统性能的提高,所以,在这一阶段系统用于
    I/O的时间相对比较平稳。
    4 结论

    本次研究主要利用对文件的读写测试并行系统I/O的性能。通过对测试结果的比较和分析,认为在整体任务处理的开销中,I/O处理的开销是不容忽视的。具体到本次测试,利用较多的进程数进行并行处理的确有利于提高系统的I/O性能,但是在进程数的选取和系统在通信及进程维护等方面的开销来看,必须找到一个平衡点,也可以说是性能最优点。在本次测试中,由于模拟的计算量较读取数据来说相对较大,所以整个程序的运行时间中,并行计算所花费的时间占据较大的比例。但是从整体的程序处理时间来看,随着系统并行性的提高,系统的I/O性能及整体性能都有着明显的提升。
    [参考文献]
    [1] MPI应用程序设计手册[S].国家智能计算机研究开发中心 国家高性能计算中心(北京),1998.
    [2] 梁博.Linux高性能计算集群概述(第三章)[D].《并行算法》课程论文资源.
    [3] 陈国良,并行计算:结构,算法,编程[M].北京:高等教育出版社,1999.

    相关热词搜索: 并行 读取 性能 利用 文件

    • 文学百科
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章