一种基于小内存处理大规模数据的并行程序开发方法

文档序号:8257986阅读:720来源:国知局
一种基于小内存处理大规模数据的并行程序开发方法
【技术领域】
[0001]本发明涉及高性能计算领域,具体地说是一种实用性强、基于小内存处理大规模数据的并行程序开发方法。
【背景技术】
[0002]当前社会人类的数据大爆炸,信息数据越来越多,人们对信息数据的处理能力的要求也越来越高,不仅石油勘探、气象预报、航天国防、科学研宄等需求高性能计算,金融、政府信息化、教育、企业、网络游戏等更广泛的领域对高性能计算的需求迅猛增长。
[0003]计算速度对于高性能计算尤为重要,高性能计算朝多核、众核发展。但是由于一些应用运算数据规模一直比较大,受限于网络带宽,系统内存等原因,系统无法处理数据量远远超过系统内存的承受,导致计算核心无法充分的利用。对于内存不足的系统,将数据量一次性全部导入内存再处理的方式已经无法满足当前的需求,需要进一步设计一种根据现有有限的硬件设备下能够在单机中处理大规模数据,并且不会降低计算效率、能够充分利用计算核心的方法。
[0004]基于此,本发明提供一种基于小内存处理大数据开发方法,对一些无法在小内存的设备条件下运行的程序或不能充分利用计算核心的系统修改,能够处理较大规模的数据,并使系统的计算设备达到计算的负载均衡且满负载的运行,从而最大限度的利用现有设备的性能,提高系统的整体运行的效率,大大缩短程序的运行时间。

【发明内容】

[0005]本发明的技术任务是针对以上不足之处,提供一种实用性强、基于小内存处理大规模数据的并行程序开发方法。
[0006]一种基于小内存处理大规模数据的并行程序开发方法,其具体实现过程为: 在内存和外存开辟数据空间,并划分成若干数据块,将任务数据读入到划分的外存数据块中,计算与I/o线程操作不同的内存数据块与外存数据块交互,使得计算该数据块所需时间与I/o的时间相等;
设置读线程、计算线程、写线程,主线程根据CPU的计算核心数量启动计算线程和I/O线程,主线程初始化队列和各个缓存区,然后启动上述各个线程;
当需要计算划分到外存中的数据块时,读线程从内存中获取空的数据块缓冲区,然后将外存数据块中的数据读入到内存中;
计算线程从内存中获取已经读入的数据块,再从内存中获取一个空的数据块缓存区,计算结果存入到空的数据块缓冲区中,将源数据的数据块缓存区清空;
写线程获取计算线程计算完成后目的数据块缓存区中数据,将此数据写到外存中的缓冲区中,输出完毕后将目的数据块缓存区清空。
[0007]所述读线程、计算线程、写线程异步并行,需要源缓冲SR_BUF和目标缓冲DR_BUF,DR-BUF, SR_BUF均为由主线程开辟的内存缓冲空间;BUF是一个连续的存储空间,被分割成多份,每份称为一个缓冲块BUF_BLOCK,缓冲块对应一个基本数据块的作业单位;读线程与计算线程共同操作SR_BUF缓冲,计算线程与写线程共同操作DR_BUF缓冲。
[0008]每个缓冲或队列可容纳至少两个缓冲对象。
[0009]还包括环形队列,该环形队列存储缓冲区的ID,各线程从队列中获取要操作的缓冲区对应的ID,上述环形队列包括下述四个队列:
SR_BUF_FULL_QUEUE:新的计算任务队列,存放新读入的等待计算的源数据块的ID号SR_BUF_ID、数据块的大小信息,由读线程写入,计算线程弹出,当读线程向SR_BUF_ID对应的缓存区中读入新的数据时,将SR_BUF_ID入队,计算线程弹出SR_BUF_ID时,计算SR_BUF_ID对应的源数据;
SR_BUF_FREE_QUEUE:空闲源缓冲队列,存放当前空闲SR_BUF_ID号,由计算线程写入,读线程弹出,当SR_BUF_ID对应的源数据计算完毕时,释放SR_BUF_ID,告知读线程可对其更新数据;
DR_BUF_FREE_QUEUE:空闲目标缓冲队列,存放当前空闲数据块的ID号DR_BUF_ID,记录DR_BUF_ID号,由写线程写入,计算线程弹出;当写线程对DR_BUF_ID对应的缓存区数据输出完毕时,将DR_BUF_ID入队,告知计算线程,该DR_BUF_ID输出完毕可重新用于计算,计算线程弹出DR_BUF_ID时,启动计算,并将结果写入DR_BUF_ID对应的目标缓冲区中;DR_BUF_FULL_QUEUE:新的写任务队列,存放计算完毕等待写回的目标数据块的ID号DR_BUF_ID,由计算线程写入,写线程弹出;当计算线程向DR_BUF_ID所对应的缓冲区中读入新数据时,将DR_BUF_ID入队,写线程弹出DR_BUF_ID时,对DR_BUF_ID对应的目标数据进行输出。
[0010]基于上述队列,该并行程序开发的具体过程为:
主线程根据CPU的计算核心数启动nThreads个计算线程和同等数量的I/O线程,将计算数据划分为合适的基本数据块,并在外存开辟同样数量大小的内存,将数据库中的数据读入到外存中;
在内存中开辟内存块,其内存块的数量是线程数量的倍数;
创建四个队列 SR_BUF_FULL_QUEUE、SR_BUF_FREE_QUEUE、DR_BUF_FREE_QUEUE、DR_BUF_FREE_QUEUE,并初始化队列,即将内存块的ID存入FREE队列中,最后主线启动所有线程;读线程从SR_BUF_FREE_QUEUE队列中获取一个空的数据块ID,将一个外存数据块读入到此ID对应的数据块中,然后将此数据块的ID入队到队列SR_BUF_FULL_QUEUE中;
计算线程分别从SR_BUF_FULL_QUEUE和DR_BUF_FREE_QUEUE获取数据块的ID,计算源数据并将结果存入到目的数据块中,计算完成将源数据块清空并将其ID入队到SR_BUF_FREE_QUEUE对列中,将目的数据块的ID入队到DR_BUF_FULL_QUEUE对列中;
写线程中DR_BUF_FULL_QUEUE中获取待写的数据块的ID,将ID对应的数据块写入到外存中,写完成后将数据块中数据清空并将其ID入队到DR_BUF_FREE_QUEUE队列中;
计算线程与读写线程异步并行执行,直到系统结束。
[0011]本发明的一种基于小内存处理大规模数据的并行程序开发方法,具有以下优点: 该发明的一种基于小内存处理大规模数据的并行程序开发方法根据任务量在现有的硬件设备条件,动态调度计算数据的方法具有针对系统平台自适应,可实现系统的可靠、高效;可以自适应于小内存来处理大数据的系统,此系统可以由纯CPU系统组成;实现动态调度,系统中各计算核心实现满负载运行,系统设备利用率高,计算核心彼此相互不等待,系统中计算设备不出现空闲状态,系统将实现高效运转;在现有硬件的条件如内存容量、网络带宽不足的情况下,采取数据分块传输与计算异步处理的方式,能够有效处理大规模的数据;运行此系统将实现高性能,此系统将根据设备的计算能力和系统内设备资源的容量动态划分计算任务,实现计算任务的分块处理,提升系统的高效性,满足设备无法运行大量数据的要求,有很高的实用价值,实用性强,易于推广。
【附图说明】
[0012]附图1为本发明的数据划分示意图。
[0013]附图2为本发明的多缓存结构设计图。
[0014]附图3为本发明的环形队列示意图。
[0015]附图4为计算系统运行时序图。
【具体实施方式】
[0016]下面结合附图和具体实施例对本发明作进一步说明。
[0017]为充分利用带小内存的硬件设备的性能,以实现整个系统效率大幅提升,并解决在当前计算设备网络带宽不足、内存容量小等情况,而无法对较大规模数据进行处理的问题。本发明提出一种基于小内存处理大规模数据的并行程序开发方法,该发明中系统充分利用外存的大容量的特点,动态调度计算数据给计算核心,达到计算的负载均衡,同时通信与计算异步执行,提高系统整体的性能,满足小内存处理大数据的要求。
[0018]为了实现计算与I/O的更好的异步执行,本发明中设计四个环形的队列,队列中根据数据块存放数据的情况存放不同数据块的ID。计算与I/O作为队列的生产者或消费者共同操作队列。当计算完成一个数据块从队列中再获取另外的数据块,实现了计算的负载均衡。
[0019]本发明充分利用外存容量大的特点,将外存作为内存的缓存来存储暂时不用计算的数据。将整个计算数据划分为合适的小数据块,存放到外存中。只有当需要计算到该数据块时才将其调度到内存中,实现了数据的动态调度,满足了小内存处理大数据的要求。
[0020]该方法的实现基于各种线程进行,其中各种线程包括:
读线程,该线程将外存中数据块读入到空的内存数据块中;
计算线程,该线程获取一个已经被读线程读入的数据块,计算该数据块并将计算结果写入到空的数据块内存中。
[0021]写线程,该线程获取存有计算结果的数据块,将该数据块中的数据写回到外存中的数据块缓存区中。
[0022]环形队列,存储缓冲区的ID,线程从队列中获取要操作的缓冲区对应的ID。
[0023]本发明通过读线程、计算线程以及写线程的异步并行执行方法,使得计算与I/O最大限度的实现相互隐藏,充分利用外存的大容量来弥补内存的容量的不足,且避免计算效率的降低。此系统上I/O与并行计算的异步执行,提高了系统的整体的运行效率和设备的利用率,满足了高性能应用的要求。
[0024]本系统具有一定的适用性,理论上此方法的设计可以适用于任何由于内存过小而无法运行的系统中,同时由于异步的方式也不会降低系统的计算效率,保证系统全负荷高效率的正常工作。
[0025]其具体实现过程为:
如图1所示,在内存和外存开辟数据空间,并划分合适数量的数据块,将任务数据读入到划分的外存数据块中,计算与I/o线程操作不同的内存数据块与外存数据块交互,使得计算该数据块所需时间与I/o的时间尽可能的相等,如此计算与I/O的完全相互掩盖,提高系统的效率。
[0026]读、计算、写线程异步并行,需要SR_BUF和DR_BUF,SR_BUF称为源缓冲,DR_BUF称为目标缓冲。DR-BUF,SR_BUF均是由主线程开辟的内存缓冲空间;BUF是一个连续的存储空间,被分割成多份,每份称为一个缓冲块BUF_BLOCK,缓冲块对应一个基本数据块的作业单位。读线程与计算线程共同操作SR_BUF缓冲,计算线程与写线程共同操作DR_BUF缓冲。
[0027]多线程与缓冲关系示意图2,每个缓冲或队列可容纳两个或多个缓冲对象,形成典型的“生产者一一消费者”类型。
[0028]为了实现上述任务分发策略,设计如图3所示的四个队列:
SR_BUF_FULL_QUEUE:新的计算任务队列,存放新读入的等待计算的源数据块的
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1