一种mpi并行数据存储优化方法

文档序号:6332061阅读:789来源:国知局
专利名称:一种mpi并行数据存储优化方法
技术领域
本发明涉及一种存储优化方法,具体涉及一种MPI并行数据存储优化方法,属于 计算机并行处理领域。
背景技术
计算机的并行处理能力,在某些领域中具有重要的应用价值;MPI (Message Passing Interface,消息传递接口)为编程人员提供了目前国际上最流行的并行编程环 境,对分布式存储的可缩放并行计算机、工作站网络,以及集群系统都有良好的支持。然而, 在实际应用中发现,某些并行文件系统在执行MPI_File_Write_at调用,对同一目标文件 进行多节点间多进程并行写操作时,由于某些进程操作数据的首尾偏移量不在文件系统数 据块大小的整数倍位置上,会导致最终写结果的不一致。从并行文件系统本身解决这一问题,需要从文件系统的整体架构着手,投入大量 的人力和物力,耗费成本较高;在应用层每次写操作前,预先保证所写数据的首尾偏移量都 在文件系统数据块大小的整数倍位置上,可以较为高效的完成并行写操作,但需要编程人 员在工作中时刻注意这一问题,无形中增加了编程的任务量、削弱了程序的灵活性。

发明内容
本发明的目的在于针对现有技术存在的问题,从应用层提供一种优化方法,保证 某些并行文件系统在执行MPI调用,对同一目标文件进行多节点间多进程并行写操作时, 最终写结果的一致性。在某些并行文件系统中,当多个并行进程对同一目标文件进行写操作时,就其中 某个进程而言,如附图1所示,存在两个主要的参数信息数据的偏移量(offset)和要写的 字节数(count)。假设当前文件系统数据块的大小是fsBlkSize (byte),对于进程A而言,其 要进行写操作的数据首尾偏移量位置分布如图1所示,其中,offset到下一个fsBlkSize整 数倍偏移量的距离是X (byte),而(offset+count)形成的末尾偏移量到上一个fsBlkSize 整数倍偏移量的距离是Y (byte),这样,中间剩余数据段的长度就应该是fsBlkSize的非负 整数倍。推而广之,并行进程中每个进程的实际情况都可以用A进程来表示,只不过它们各 自的X、Y值不同,只要保证X、Y的取值、以及(X+Y)的和,介于0到fsBlkSize之间即可。 鉴于上述分析,本发明所采用的解决方案是,对要进行写操作的目标文件涉及的MPI函数 (MPI_File_open、MPI_File_write_at 和 MPI_File_close),进行同参异名式封装,并在应 用程序中将涉及目标文件的MPI操作(文件打开、写文件和文件关闭),都采用封装后的函 数(比如,分别对应为 MPI_File_open_Ex、MPI_File_write_at_Ex 和 MPI_File_close_Ex) 进行替换。封装后的函数在进行并行写操作时,可以依据由首尾偏移量位置决定的X、Y的 不同取值,分别采用不同的处理方式。本发明提供了一种MPI并行数据存储优化方法,包括以下步骤步骤一对欲进行写操作的目标文件涉及的MPI函数调用,即文件打开MPI_File_open、写文件MPI_File_write_at和文件关闭MPI_File_close,进行同参异名式封装;步骤二在步骤一封装的写文件函数中,假设读取到的当前文件系统数据块大 小是fsBlkSize,根据当前操作数据的偏移量offset和要写的字节数count,由offset 与fsBlkSize的数量关系,得到offset到下一个fsBlkSize整数倍偏移量的距离X,由 offset+count与fsBlkSize的数量关系,得到offset+count形成的末尾偏移量到上一个 fsBlkSize整数倍偏移量的距离Y ;其中fsBlkSize、X、Y的单位均为byte ;封装的写文件函 数根据所得到的X、Y值,采用不同的处理方式(1)如果当前进程操作数据的首尾偏移量都在文件系统数据块大小的整数倍位置 上,即X、Y都为零,仍调用原MPI_File_Write_at函数进行并行写操作;(2)如果当前进程的offset值不在文件系统数据块大小的整数倍位置上,即X值 不为零,需要将此处长度为X的数据信息,暂时拷贝到一段区域中暂存,待该进程对目标 文件执行关闭操作前,再将这部分暂存的内容利用文件锁机制,串行写入到文件的实际位 置;(3)如果当前进程的offset+count值不在文件系统数据块大小的整数倍位置上, 即Y值不为零,需要将此处长度为Y的数据信息,暂时拷贝到一段区域中暂存,待该进程对 目标文件执行关闭操作前,再将这部分暂存的内容利用文件锁机制,串行写入到文件的实 际位置;(4)无论X、Y取值为何种情况,只要中间剩余的长度为fsBlkSize整数倍的数据 段的长度不为零,即至少是fsBlkSize,都需要对其进行处理,处理方式是仍调用原MPI_ File_write_at函数进行并行写操作;步骤三在应用程序中,将所有欲进行写操作的目标文件涉及的MPI函数调用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_close,都采用步骤一中封装后的函数进 行替换;替换后,对要进行写操作的目标文件,均调用封装后的函数进行操作。有益效果本发明的有益效果是(1)修改简单。无需对某些并行文件系统做任何修改,仅通过在应用层的少许修 改,就能以可以接受的效率,保证写操作结果的正确性。(2)应用简便。所提供的解决方案便于实现,也容易封装成不同风格的库函数,便 于满足不同用户的编程需要。(3)兼容性好。该方案涉及的参数,均源于MPI原有函数,故而封装出来的库函数, 可以与MPI原有函数较好兼容,方便替换。


图1——进程写操作数据分布示意图。图2——封装后MPI_File_open_Ex函数处理流程图。图3——封装后MPI_File_write_at_Ex函数处理流程图。图4——封装后MPI_File_close_Ex函数处理流程图。
具体实施例方式下面结合附图和具体实施方式
,对本发明做进一步的详细描述。在内存中开辟一段区域,用来对首尾偏移量中至少有一个不在文件系统数据块大 小整数倍位置上的小块数据(即X和Y的部分)进行暂存。此处定义了两个结构体rest_ data_t和reSt_data_gr0up_t。其中,reSt_data_t用来保存未对齐数据的暂存位置指针, 以及其在目标文件中的偏移量和长度;rest_data_gr0up_t在reSt_data_t结构的基础上, 封装了 cntUockHandle和reSt_data_t,前两者分别表示当前进程需要进行加锁处理的有 效reSt_data_t数量和用于加锁的文件句柄,而reSt_data_t可以定义成数组形式,其中的 元素用来记录需要暂存的头和尾的必要信息。在此基础上,定义一个rest_data_gr0up_t 结构体的全局变量gRestData,这是当前进程实际暂存数据时需要用到的重要变量。对目标文件写操作涉及的三个MPI函数“MPI_File_open”、“MPI_File_write_ at”和“MPI_File_cl0Se”,进行同参异名式封装,即函数的参数不变,而只是将函数名称进 行简单修改,比如,与前述部分相似,此处将上述三个函数依次封装成MPI_File_0pen_EX、 MPI_File_write_at_Ex和MPI_File_close_Ex。经过封装后,在实际的应用程序中,将涉及 目标文件的 MPI 函数调用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_close (依 次对应文件打开、写文件和文件关闭),都采用封装后的函数,即MPI_File_0pen_Ex、MPI_ File_write_at_Ex和MPI_File_cl0Se_EX,分别进行简单替换,采用封装后的函数进行多 节点间多进程并行写操作,可以正常实现并行写功能。封装的三个函数简单介绍如下(1)对MPI_File_open函数进行封装,如图2所示,主要目的是在该函数原有功能 的基础上,对每个欲进行写操作的目标文件,创建一个锁文件,封装后的函数原型如下int MPI_File_open_Ex (MPI_Comm comm, char^filename, int amode, MPI_Info info, MPI_File*fh);函数说明该函数完成对欲进行写操作的目标文件的打开操作,函数体中,依据目 标文件的目录和名称,在目标文件所在目录下,生成了一个同名但多出一个“.lock”作为 后缀的临时文件,作为锁文件,并对gRestData进行初始化,其余操作完全调用MPI原有的 MPI_File_open 函数实现。(2)对MPI_File_Write_at函数进行封装,如图3所示,主要是依据当前进程操作 数据的首尾偏移量,对要写的内容进行区分处理,封装后的函数原型如下int MPI_File_write_at_Ex (MPI_File_fh, MPI_0ffset offset, void*buf, int count, MPI_Datatype datatype, MPI_Status氺status);函数说明写操作处理函数,主要是依据要处理数据的偏移量offset和数量 count (以byte为单位),计算出当前要写入数据的首尾偏移量,然后按照前述方案分别处 理——如果操作数据的首尾偏移量都是文件系统数据块大小的整数倍,则仍然调用原始的 MPI_File_Write_at函数进行并行写操作,从而实现了进程间的并行写,这在一定程度上, 达到了大部分数据并行处理的效果;如果所操作数据的首尾偏移不在文件系统数据块大小 的整数倍位置,则在当前进程操作数据的始末偏移量范围内,将首尾偏移量调整到文件系 统数据块大小的最近整数倍位置,对这部分内容仍然按整数倍情况处理,剩下的头和尾两 块数据自然比文件系统数据块小,将头和尾的内容拷贝到一段区域中暂存,并将暂存位置、 偏移量和数量等信息,记录在gRestData中备用。
(3)对MPI_File_cl0Se函数进行封装,如图4所示,主要功能是处理写操作中可能 暂存起来的数据,封装后的函数原型如下int MPI_File_close_Ex(MPI_File*fh);函数说明该函数完成对目标文件的关闭操作,函数体中,在对完成写操作的目标 文件进行关闭操作前,在文件锁机制保证下,判断该进程有没有需要处理的暂存信息,如果 有,则将暂存的内容写入到文件的实际位置,然后解除文件锁,并调用MPI_File_cl0Se函 数,将文件关闭。总之,对原有MPI函数进行封装后,在用户空间应用程序中,将欲进行写操作 的目标文件涉及的 MPI 函数调用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_ close (依次对应文件打开、写文件和文件关闭),都要用封装后的函数,即MPI_File_open_ Ex、MPI_File_write_at_Ex和MPI_File_close_Ex,分别进行替换,用封装后的函数实现某 些并行文件系统中,多节点间多进程对同一目标文件的并行写操作在文件被打开的同时, 生成锁文件;写操作按照前述原理由封装后的函数自动执行;在文件关闭时,利用文件锁 机制,处理写操作中被暂存起来的数据。这些操作均由封装后的函数实现,用户无需关注具 体的实现细节,即可保证最终写结果的正确性和一致性;封装所需参数与原MPI的库函数 完全一致,方便那些习惯MPI原有函数的用户进行替换操作。本发明不仅限于以上实施例,凡是利用本发明的设计思路,做一些简单变化的设 计,都应计入本发明的保护范围之内。
权利要求
一种MPI并行数据存储优化方法,包括以下步骤步骤一 对欲进行写操作的目标文件涉及的MPI函数调用,即文件打开MPI_File_open、写文件MPI_File_write_at和文件关闭MPI_File_close,进行同参异名式封装;步骤二 在步骤一封装的写文件函数中,假设读取到的当前文件系统数据块大小是fsBlkSize,根据当前操作数据的偏移量offset和要写的字节数count,由offset与fsBlkSize的数量关系,得到offset到下一个fsBlkSize整数倍偏移量的距离X,由offset+count与fsBlkSize的数量关系,得到offset+count形成的末尾偏移量到上一个fsBlkSize整数倍偏移量的距离Y;其中fsBlkSize、X、Y的单位均为byte;封装的写文件函数根据所得到的X、Y值,采用不同的处理方式(1)如果当前进程操作数据的首尾偏移量都在文件系统数据块大小的整数倍位置上,即X、Y都为零,仍调用原MPI_File_write_at函数进行并行写操作;(2)如果当前进程的offset值不在文件系统数据块大小的整数倍位置上,即X值不为零,需要将此处长度为X的数据信息,暂时拷贝到一段区域中暂存,待该进程对目标文件执行关闭操作前,再将这部分暂存的内容利用文件锁机制,串行写入到文件的实际位置;(3)如果当前进程的offset+count值不在文件系统数据块大小的整数倍位置上,即Y值不为零,需要将此处长度为Y的数据信息,暂时拷贝到一段区域中暂存,待该进程对目标文件执行关闭操作前,再将这部分暂存的内容利用文件锁机制,串行写入到文件的实际位置;(4)无论X、Y取值为何种情况,只要中间剩余的长度为fsBlkSize整数倍的数据段的长度不为零,即至少是fsBlkSize,都需要对其进行处理,处理方式是仍调用原MPI_File_write_at函数进行并行写操作;步骤三 在应用程序中,将所有欲进行写操作的目标文件涉及的MPI函数调用,即MPI_File_open、MPI_File_write_at和MPI_File_close,都采用步骤一中封装后的函数进行替换;替换后,对要进行写操作的目标文件,均调用封装后的函数进行操作。
全文摘要
本发明涉及一种MPI并行数据存储优化方法,包括以下步骤1、对欲进行写操作的目标文件涉及的MPI函数调用,即文件打开、写文件和文件关闭,进行同参异名式封装;2、在步骤一封装的写文件函数中,根据当前文件系统数据块fsBlkSize,当前操作数据的偏移量offset和要写的字节数count,得到offset到下一个fsBlkSize整数倍偏移量的距离X,以及offset+count形成的末尾偏移量到上一个fsBlkSize整数倍偏移量的距离Y;封装的写文件函数根据所得到的X、Y值,采用不同的处理方式;3、在应用程序中,将所有欲进行写操作的目标文件涉及的MPI函数调用都采用步骤一中封装后的函数进行替换。本发明无需对文件系统做任何修改,仅通过在应用层的少许修改,就能以可以接受的效率保证写操作结果的正确性。
文档编号G06F17/30GK101957840SQ201010281839
公开日2011年1月26日 申请日期2010年9月14日 优先权日2010年9月14日
发明者周泽湘, 张伟涛, 方仑, 李焰, 王道邦, 肖建国, 谭毓安, 韩双牛 申请人:北京同有飞骥科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1