哈希游戏- 哈希游戏平台- 哈希游戏官方网站
hash运算有两种实现方式,一种是软件方式,依靠cpu(中央处理器,centralprocessingunit)的运算来实现,利用cpu的多核优势,将数据流通过算法分组,然后采用多线程方式进行分组计算,最后再将各个计算结果通过算法合并运算。另一种是硬件方式,在cpu中,hash运算模块利用硬件来实现hash值的计算,在一个cpu中,同一种算法的硬件hash运算模块常常只有一个,多个线程之间需要程序通过抢占的方式调用硬件资源,用完需要立即释放,多个线程之间相互抢占hash运算模块,在并行处理多路数据流的时候频繁申请和释放hash运算模块硬件资源(包括dma内存)。
上述软件方式中,对cpu的要求较高,cpu需为多核,而且该方式占用了cpu的运算时间,当遇到大量并行数据流需要计算时,cpu会被频繁占用,影响其他的程序的执行效率。硬件方式则需要多个线程之间相互抢占hash运算硬件资源,频繁申请和释放硬件资源会影响整个数据处理系统的效率,而且,由于硬件hash运算模块计算的速度远高于数据产生和数据加载的速度,每次在等待硬件hash运算模块计算的期间,cpu相当于处于空闲状态,使得cpu没有得到充分利用。
本申请提供了一种数据hash值的计算方法及系统,所述方法包括:根据程序申请占用hash计算模块,并向内核申请一段内存资源,根据待处理数据,依次创建多个线程,并根据多个所述线程,将所述内存资源划分为等数量的存储区域。将所述待处理数据分流至多个所述线程,并分别加载至每一线程相对应的所述存储区域,多个所述线程同步处理所述待处理数据。本申请数据hash值的计算方法中,多个线程共享设备和内存资源,其中,预先分配好内存资源,将内存资源划分为多个存储区域,多个线程相互独立的访问其对应的存储区域,本申请不需要频繁的申请以及释放设备和内存资源,提高了hash值的计算效率,同时,对cpu的利用更加合理化,提高了其他程序的执行效率。
在数据处理,特别是在视频流处理的应用中,传统的编码、解码等都是依靠cpu的运算来实现,即软解码/编码。随着现在视频分辨率越来越高,cpu的负荷也越来越重。目前,在改进的cpu中,像编码、解码及hash运算这些常用模块通常采用硬件实现。而在一个cpu中,同一种算法的hash计算模块常常只有一个,需要程序通过抢占的方式来分时复用。随着需求的不断增加,数据流并行处理的通道数和每个通道的处理数据量也在不断增加,需要设计一种数据hash值的计算方法,以此保证数据hash计算的效率。
用户可根据多个所述线程内待处理数据的数量自行分配所述内存资源的大小,也就是说,每个线程对应所述内存资源中的存储区域的大小不同。由于硬件资源有限,待处理数据的数量不可控,一般情况下分配的存储区域的大小和需要处理的数据量的多少不是一个数量级,故待处理数据的数量有可能远大于存储区域的大小。参见图2,为本发明实施例提供的内存资源分配示意图。图中以x、y及z三个线程为例,将申请占用的内存资源分配给x、y及z三个线程。
进一步,多个所述线程均将对应的存储区域进行划分,得到第一存储单元和第二存储单元。每一个线程将自己的存储区域从逻辑上分为两块(第一存储单元和第二存储单元),在等待hash计算模块计算数据的同时,cpu继续加载待处理数据到另一块空闲存储单元。如图2所示,x线程、y线程及z线程,三个线程均将自己所对应的存储区域划分为第一存储单元和第二存储单元。为了增加应用场景的灵活性,本申请中,所述第二存储单元的大小大于或等于所述第一存储单元的大小,也就是说,第一存储单元和第二存储单元的大小分配可由用户自行设定,例如,有些应用是周期替产生一个大文件和一个小文件,此时为了达到最优效率,就可以不均匀分配第一存储单元和第二存储单元。
多个所述线程将对应的待处理数据进行计算,具体为:首先,读取线程中部分所述待处理数据至相对应的第一存储单元或第二存储单元,然后,通知所述hash计算模块,即通知所述hash计算模块待处理数据所在位置,内存资源的偏移地址及待处理数据的数据长度值,使hash计算模块计算所述第一存储单元或所述第二存储单元中的待处理数据,在所述第一存储单元或所述第二存储单元中的部分待处理数据计算过程中,更新所述线程中部分待处理数据至所述第一存储单元或所述第二存储单元。不断重复更新所述线程中部分待处理数据至所述第一存储单元或所述第二存储单元中,并进行数据计算,也就是说,第一存储单元和第二存储单元交替使用,直至所述线程中所述待处理数据全部计算完成。
与上述方法相对应的,本发明实施例还提供了一种数据hash值的计算系统,所述系统包括:申请资源模块,用于根据程序申请占用hash计算模块,及内存资源;存储划分模块,用于根据待处理数据,依次创建多个线程,并根据多个所述线程,将所述内存资源划分为等数量的存储区域;数据分流模块,用于将所述待处理数据分流至多个所述线程,并分别加载至每一线程相对应的存储区域;数据处理模块,用于多个所述线程同步处理所述待处理数据。
综上,本申请中,根据程序申请占用hash计算模块,并向内核申请一段内存资源,根据待处理数据,依次创建多个线程,并根据多个所述线程,分配各个线程所占用的内存资源,每一个线程将自己存储区域从逻辑上分为所述第一存储单元和所述第二存储单元两块。向所述线程内均输入预设信息,所述预设信息包括:设备句柄及内存资源分配情况,多个所述线程同步处理所述待处理数据,当全部的待处理数据处理完成后,多个所述线程退出,根据所述程序释放所述内存资源及所述hash计算模块。本申请数据hash值的计算方法中,多个线程共享设备和内存资源,其中,预先分配好内存资源,多个线程相互独立的访问其对应的存储区域,本申请不需要频繁的申请以及释放设备和内存资源,提高了hash值的计算效率,同时,对cpu的利用更加合理化,提高了其他程序的执行效率。另外,每一个线程访问的存储空间被再次划分为两个区域,避免了数据读取或者数据产生的速度跟不上hash计算模块的运算速度的问题。
需要说明的是,在本说明书中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或暗示这些实体或操作之间存在任何这种实际的关系或顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的电路结构、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种电路结构、物品或者设备所固有的要素。在没有更多限制的情况下,有语句“包括一个……”限定的要素,并不排除在包括所述要素的电路结构、物品或者设备中还存在另外的相同要素。