CN104809179B - 访问哈希表的装置和方法 - Google Patents

访问哈希表的装置和方法 Download PDF

Info

Publication number
CN104809179B
CN104809179B CN201510179425.8A CN201510179425A CN104809179B CN 104809179 B CN104809179 B CN 104809179B CN 201510179425 A CN201510179425 A CN 201510179425A CN 104809179 B CN104809179 B CN 104809179B
Authority
CN
China
Prior art keywords
hash table
cache
hash
hit
target
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201510179425.8A
Other languages
English (en)
Other versions
CN104809179A (zh
Inventor
赵鹏
刘雷
曹玮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Original Assignee
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd, Institute of Computing Technology of CAS filed Critical Huawei Technologies Co Ltd
Priority to CN201510179425.8A priority Critical patent/CN104809179B/zh
Publication of CN104809179A publication Critical patent/CN104809179A/zh
Application granted granted Critical
Publication of CN104809179B publication Critical patent/CN104809179B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明提供一种访问哈希表的装置和方法,所述装置包括:获取模块,用于获取访问请求,所述访问请求包括关键字;第一确定模块,用于根据所述获取模块获取的所述关键字,确定目标哈希地址;第二确定模块,用于根据所述第一确定模块确定的所述目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,所述哈希表缓存位于通用的处理器中,且所述哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,所述哈希表缓存的每个缓存行用于缓存所述哈希表的一个哈希表项;第一访问模块,用于当所述第二确定模块确定所述哈希表缓存中存在命中的哈希表项时,访问所述哈希表缓存中命中的哈希表项。本发明实施例提高了哈希数据处理的效率。

Description

访问哈希表的装置和方法
技术领域
本发明涉及计算机领域,更为具体地,涉及一种访问哈希表的装置和方法。
背景技术
随着大数据时代的到来,分布式计算在给我们带来大量机遇的同时,也带来了许多挑战。如何获取海量的数据信息,如何从海量的数据信息中挖掘出有更价值的信息,如何构建高效、稳定的大数据处理平台和分布式计算平台都是亟待解决的问题。
无论是传统的数据库***,还是新兴的大数据处理平台,它们中的许多都是基于键-值(key-value)对的数据模型构建的,其中,键也称关键字。例如,各种关系型数据库***,Hadoop Mapreduce、Hadoop Dryad等分布式处理平台,Memcached、Redis等内存计算***均是采用键-值的数学模型而构建的。哈希表(hash table)是存储键-值对的一种很重要的数据结构。哈希表一般建立在内存中,对哈希表的大量操作意味着处理器的大量的访存操作。而对内存的访问恰是制约处理器性能的瓶颈,从而可知,对哈希表的操作是这一类平台上的应用的瓶颈。
现有技术中,中央处理器(CPU,Central Processing Unit)一般包括L1缓存和L2缓存,而哈希数据与其他类型的数据共用这些通用缓存,这样会经常出现通用缓存中的哈希数据被其他类型的数据替换掉的现象,使得通用缓存中的哈希数据的命中率低,此时CPU不得不再次进行访存操作,重新从内存中读取被替换掉的哈希数据,导致***效率低下。
发明内容
本发明实施例提供一种访问哈希表的装置和方法,以提高哈希表访问的效率。
第一方面,提供一种访问哈希表的装置,所述装置包括:获取模块,用于获取访问请求,所述访问请求包括关键字;第一确定模块,用于根据所述获取模块获取的所述关键字,确定目标哈希地址;第二确定模块,用于根据所述第一确定模块确定的所述目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,所述哈希表缓存位于通用的处理器中,且所述哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,所述哈希表缓存的每个缓存行用于缓存所述哈希表的一个哈希表项;第一访问模块,用于当所述第二确定模块确定所述哈希表缓存中存在命中的哈希表项时,访问所述哈希表缓存中命中的哈希表项。
结合第一方面,在第一方面的一种实现方式中,所述哈希表缓存包括主哈希表缓存和公共冲突缓存,所述公共冲突缓存用于存放所述至少部分哈希表项中的冲突表项,所述第二确定模块具体用于:根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项;和/或根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,所述主哈希表缓存包括N路缓存,所述N路缓存之间组相连,其中所述N路缓存中的每个缓存行的tag字段包括:第一字段和第二字段,所述每个缓存行的第一字段为所述每个缓存行存储的哈希表项对应的哈希地址的高位字段,所述每个缓存行的第二字段为所述每个缓存行存储的哈希表项对应的关键字,所述第二确定模块具体用于:以所述目标哈希地址的低位字段为索引,从所述N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;将所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段进行比较;当所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段均不相同时,确定所述主哈希表缓存中不存在命中的哈希表项;当所述N个缓存行中存在第一字段与所述目标哈希地址的高位字段相同的目标缓存行时,比较所述目标缓存行的第二字段与所述访问请求包括的关键字是否相同;当所述目标缓存行的第二字段与所述访问请求包括的关键字相同时,确定所述主哈希表缓存中存在命中的哈希表项;当所述目标缓存行的第二字段与所述访问请求包括的关键字不相同时,确定所述主哈希表缓存中不存在命中的哈希表项。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,所述公共冲突缓存包括全相连结构,所述公共冲突缓存的缓存行的目标tag字段包括第三字段和第四字段,所述第三字段为所述公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,所述第四字段为所述公共冲突缓存的缓存行存储的哈希表项对应的关键字,所述第二确定模块具体用于:比较所述目标哈希地址与所述公共冲突缓存中的每个缓存行的tag字段;当所述公共冲突缓存中各缓存行的tag字段与所述目标哈希地址均不相同时,确定所述公共冲突缓存中不存在命中的哈希表项;当所述公共冲突缓存中存在tag字段与所述目标哈希地址相同的目标缓存行时,比较所述目标缓存行的第四字段与所述访问请求包括的关键字;当所述目标缓存行的第四字段与所述访问请求包括的关键字相同时,确定所述公共冲突缓存中存在命中的哈希表项;当所述目标缓存行的第四字段与所述访问请求包括的关键字不相同时,确定所述公共冲突哈希缓存中不存在命中的哈希表项。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,所述访问请求包括写请求,所述访问请求中还包括待写入的数据,所述第一访问模块具体用于:当所述哈希表缓存中存在命中的哈希表项时,将所述待写入的数据写入所述哈希表缓存中的命中的哈希表项所在缓存行的data字段。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,所述访问请求包括读请求,所述第一访问模块具体用于:当所述哈希表缓存中存在命中的哈希表项时,读取所述哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,还包括:第二访问模块,用于当所述第二确定模块确定所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
结合第一方面或其上述实现方式的任一种,在第一方面的另一种实现方式中,所述第二访问模块具体用于:当所述哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,所述地址寄存器位于所述处理器中,用于存储所述处理器执行的指令的地址;根据所述访问内存的指令,访问所述内存;所述第二访问模块还用于:当所述内存访问完毕之后,跳转回所述地址寄存器中记录的所述下一条指令的地址,并执行所述下一条指令。
第二方面,提供一种访问哈希表的方法,所述方法包括:获取访问请求,所述访问请求包括关键字;根据所述关键字,确定目标哈希地址;根据所述目标哈希地址,确定所述哈希表缓存中是否存在命中的哈希表项,所述哈希表缓存位于通用的处理器中,且所述哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,所述哈希表缓存的每个缓存行用于缓存所述哈希表的一个哈希表项;当所述哈希表缓存中存在命中的哈希表项时,访问所述哈希表缓存中命中的哈希表项。
结合第二方面,在第二方面的一种实现方式中,所述哈希表缓存包括主哈希表缓存和公共冲突缓存,所述公共冲突缓存用于存放所述至少部分哈希表项中的冲突表项,所述根据所述目标哈希地址,确定所述哈希表缓存中是否存在命中的哈希表项,包括:根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项;和/或根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,所述主哈希表缓存包括N路缓存,所述N路缓存之间组相连,其中所述N路缓存中的每个缓存行的tag字段包括:第一字段和第二字段,所述每个缓存行的第一字段为所述每个缓存行存储的哈希表项对应的哈希地址的高位字段,所述每个缓存行的第二字段为所述每个缓存行存储的哈希表项对应的关键字,所述根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项,包括:以所述目标哈希地址的低位字段为索引,从所述N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;将所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段进行比较;当所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段均不相同时,确定所述主哈希表缓存中不存在命中的哈希表项;当所述N个缓存行中存在第一字段与所述目标哈希地址的高位字段相同的目标缓存行时,比较所述目标缓存行的第二字段与所述访问请求包括的关键字是否相同;当所述目标缓存行的第二字段与所述访问请求包括的关键字相同时,确定所述主哈希表缓存中存在命中的哈希表项;当所述目标缓存行的第二字段与所述访问请求包括的关键字不相同时,确定所述主哈希表缓存中不存在命中的哈希表项。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,所述公共冲突缓存包括全相连结构,所述公共冲突缓存的缓存行的tag字段包括第三字段和第四字段,所述第三字段为所述公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,所述第四字段为所述公共冲突缓存的缓存行存储的哈希表项对应的关键字,所述根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项,包括:比较所述目标哈希地址与所述公共冲突缓存中的每个缓存行的tag字段;当所述公共冲突缓存中各缓存行的tag字段与所述目标哈希地址均不相同时,确定所述公共冲突缓存中不存在命中的哈希表项;当所述公共冲突缓存中存在tag字段与所述目标哈希地址相同的目标缓存行时,比较所述目标缓存行的第四字段与所述访问请求包括的关键字;当所述目标缓存行的第四字段与所述访问请求包括的关键字相同时,确定所述公共冲突缓存中存在命中的哈希表项;当所述目标缓存行的第四字段与所述访问请求包括的关键字不相同时,确定所述公共冲突哈希缓存中不存在命中的哈希表项。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,所述访问请求包括写请求,所述访问请求中还包括待写入的数据,所述当所述哈希表缓存中存在命中的哈希表项时,访问所述命中的哈希表项,包括:当所述哈希表缓存中存在命中的哈希表项时,将所述待写入的数据写入所述哈希表缓存中的命中的哈希表项所在缓存行的data字段。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,所述访问请求包括读请求,所述当所述哈希表缓存中存在命中的哈希表项时,访问所述命中的哈希表项,包括:当所述哈希表缓存中存在命中的哈希表项时,读取所述哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,还包括:当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
结合第二方面或其上述实现方式的任一种,在第二方面的另一种实现方式中,所述当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存,包括:当所述哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,所述地址寄存器位于所述处理器中,用于存储所述处理器执行的指令的地址;根据所述访问内存的指令,访问所述内存;所述方法还包括:当所述内存访问完毕之后,跳转回所述地址寄存器中记录的所述下一条指令的地址,并执行所述下一条指令。
本发明实施例中,在通用的处理器中设置了专门缓存哈希表的至少部分哈希表项的哈希表缓存,并基于哈希表缓存的是哈希表项,设置了一套适合该哈希表缓存的访问逻辑,即根据哈希地址访问哈希表缓存的访问逻辑,避免了在通用的缓存中哈希数据经常被其他数据替换掉而导致的处理器的多次访存操作,提高了哈希数据处理的效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍,显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的访问哈希表的装置的示意性框图。
图2是本发明实施例的访问哈希表的装置的示意性结构图。
图3是本发明实施例的哈希地址和标签字段格式的示意图。
图4是本发明实施例的哈希表缓存结构的示例图。
图5是哈希表缓存中的缓存行的数据格式的示意图。
图6是本发明实施例的访问哈希表流程图。
图7是本发明实施例的访问哈希表流程图。
图8是本发明实施例的内存与哈希表缓存数据交互过程的示意图。
图9是本发明实施例的内存与哈希表缓存数据交互过程的示意图。
图10是本发明实施例的内存与哈希表缓存数据交互过程的示意图。
图11是本发明实施例的访问哈希表的方法的示意性流程图。
图12是本发明实施例的访问哈希表的装置的示意性框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
图1是本发明实施例的访问哈希表的装置示意性框图。图1的装置100包括:
获取模块124,用于获取访问请求,访问请求包括关键字;
第一确定模块125,用于根据获取模块124获取的关键字,确定目标哈希地址;
第二确定模块126,用于根据第一确定模块125确定的目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,该哈希表缓存位于通用的处理器中,且哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,哈希表缓存的每个缓存行用于缓存哈希表的一个哈希表项;
第一访问模块127,用于当哈希表缓存中存在命中的哈希表项时,访问命中的哈希表项。
应理解,与哈希操作相关的程序运行时,会在内存中生成哈希表,上述哈希表缓存可专门缓存程序在内存中生成的哈希表的至少部分哈希表项。应理解,哈希表缓存可将内存中的至少部分哈希表项拷贝到缓存中,并非取代内存中的表项。上述哈希表缓存位于通用的处理器中,而非集成在片上***的专用处理器,该通用的处理器一般可包括一级缓存,还可以包括二级甚至更多级的缓存。此外,通用处理器中的一级缓存或二级缓存可以按照现有技术的方式继续处理通用数据,通用数据可以包括哈希数据,也可以不包括哈希数据。处理器在处理哈希数据时,可以优先考虑使用哈希表缓存。
应理解,上述获取模块124、第一确定模块125、第二确定模块126和第一访问模块127可以理解为由指令所实现功能模块,也可为实体的硬件模块,这些指令可以是专门为处理器调用哈希表缓存而设置的指令。后续会对指令的具体形式和功能进行详细的描述。
需要说明的是,在内存中,哈希表的哈希表项的内容包括关键字和值,即分别为key和value,上述哈希表缓存的每个缓存行可用于缓存哈希表的一个哈希表项具体可指:哈希表缓存的每个缓存行(cache line)中的内容可包括哈希表的一个哈希表项的内容,并非要求哈希表缓存的缓存行和内存中的缓存行具体形式一样(可以一样,也可以不一样),也并非要求哈希表缓存的哈希表项和内存中的哈希表项的具体形式一样(可以一样,也可以不一样)。实际中,哈希表缓存中的哈希表项的结构可包括state字段、tag字段和data字段,可将哈希表的key和value存入到以上字段中,也可将哈希表的key和value在内存中的地址存入到以上字段中,也可将哈希表的key对应的哈希地址和value存入到以上字段中。后续会对缓存行的具体结构进行详细描述。
应理解,上述第二确定模块126根据目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项的具体方式与哈希表缓存的具体结构,以及缓存行的具体格式有关。例如,当哈希表缓存为全相连结构时,可以逐行访问哈希表缓存的缓存行;当哈希表缓存为组相连结构时,可以先基于预先设定的index确定每组中的对应缓存行,再分别访问各组中的对应缓存行。后续会基于哈希表缓存和缓存行的具体结构详细描述哈希表缓存的访问逻辑。
应理解,装置100还可包括第二访问模块,该第二访问模块根据目标哈希地址访问内存的具体方式可以为例如,基于哈希表在内存中的基地址以及目标哈希地址计算待访问的哈希表项在内存中的位置,如果该位置存在哈希冲突,按照现有技术中的冲突解决方式再次确定待访问的哈希表项的位置,并访问位于该位置的哈希表项中的内容。
上述访问内存可以是直接访问内存,也可以是通过访问通用缓存来访问内存,如果通用缓存中没有命中,则再访问内存,这里的通用缓存可以指处理器内通常设置的一级缓存和/或二级缓存,当然,通用缓存中还可以设置更多级的通用缓存。
需要说明的是,上述根据关键字,确定目标哈希地址的具体方式可以为:根据关键字进行哈希运算,得到目标哈希地址;或者,将关键字代入预设的哈希函数,得到目标哈希地址。
本发明实施例中,在通用的处理器中设置了专门缓存哈希表的至少部分哈希表项的哈希表缓存,并基于哈希表缓存的是哈希表项,设置了一套适合该哈希表缓存的访问逻辑,即根据哈希地址访问哈希表缓存的访问逻辑,避免了在通用的缓存中哈希数据经常被其他数据替换掉而导致的处理器的多次访存操作,提高了哈希数据处理的效率。
可选地,作为一个实施例,哈希表缓存包括主哈希表缓存(Main Hash TableCache,MHTC)和公共冲突缓存(Common Collision Cache,CCC),公共冲突缓存可用于存放至少部分哈希表项中的冲突表项,第二确定模块126可具体用于根据目标哈希地址,确定主哈希表缓存中是否存在命中的哈希表项;和/或根据目标哈希地址,确定公共冲突缓存中是否存在命中的哈希表项。
具体地,所谓公共冲突缓存存放的冲突表项可以是指与主哈希表缓存中存放的表项具有哈希冲突的表项,也就是说,公共冲突缓存中存放的表项可以与主哈希表缓存中的至少一个表项对应的哈希地址相同。但是,应理解,并非主哈希表缓存不存放具有哈希冲突的表项,实际中,主哈希表缓存也可以不存放或存放一定数量的冲突表项,而公共冲突缓存存放主哈希表缓存存放不下的冲突表项。
例如,主哈希表缓存采用多路组相连结构,下文中以4路组相连结构为例进行论述,4路组相连结构能够存储具有相同哈希地址的4个冲突表项,当需要存放该相同哈希地址下的第5个冲突表项时,可以存放至公共冲突缓存中。
此外,处理器对主哈希缓存和公共冲突缓存可以按照先后访问的方式或者并行访问的方式进行访问,本发明实施例对此不作具体限定。
在该实施例中,第二确定模块126还可用于当主哈希表缓存和公共冲突缓存中均不存在命中的哈希表项时,确定所述哈希表缓存中不存在命中的哈希表项;否则,确定所述哈希表缓存中存在命中的哈希表项。
在该实施例中,哈希表缓存不但包括用于存储哈希表项的主哈希缓存,还包括用于存储冲突表项的公共冲突缓存,这样可以提高哈希表缓存的冲突处理能力,哈希冲突处理能力的提升必然会降低处理器访存的次数,提高哈希操作的效率。
可选地,作为一个实施例,主哈希表缓存包括N路缓存,N路缓存之间组相连,其中N路缓存中的每个缓存行的tag字段包括:第一字段和第二字段,所述每个缓存行的第一字段为所述每个缓存行存储的哈希表项对应的哈希地址的高位字段,所述每个缓存行的第二字段为所述每个缓存行存储的哈希表项对应的关键字,第二确定模块126可具体用于:以目标哈希地址的低位字段为索引,从N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;将N个缓存行中的每个缓存行的第一字段与目标哈希地址的高位字段进行比较(比如,同时比较该N个缓存行的第一字段与目标哈希地址的高位字段),其中N个缓存行的第一字段与目标哈希地址的高位字段长度相等;当N个缓存行中的每个缓存行的第一字段与目标哈希地址的高位字段均不相同时,确定主哈希表缓存中不存在命中的哈希表项;当N个缓存行中存在第一字段与目标哈希地址的高位字段相同的目标缓存行时,比较目标缓存行的第二字段与访问请求包括的关键字是否相同;当目标缓存行的第二字段与访问请求包括的关键字相同时,确定主哈希表缓存中存在命中的哈希表项;当目标缓存行的第二字段与访问请求包括的关键字不相同时,确定主哈希表缓存中不存在命中的哈希表项。
应理解,本发明实施例的主哈希表缓存的tag字段由哈希地址的高位字段和关键字组成,这样的判断逻辑与现有技术相比,能够节省指令的开销。具体而言,现有技术通过哈希地址计算得到要访问的哈希表项在内存中的虚拟地址,通过访存指令取得key,再通过比较指令进行比较。与现有技术相比,本发明实施例可以直接使用一条指令完成在哈希表缓存中查找特定的哈希表项并比较key(哈希地址高位的比较是为了在缓存中查找特定的哈希表项),从而节省了指令的开销。
可选地,作为一个实施例,公共冲突缓存包括全相连结构(或者公共冲突缓存采用全相连结构),公共冲突缓存的缓存行的tag字段包括第三字段和第四字段,第三字段为公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,第四字段为公共冲突缓存的缓存行存储的哈希表项对应的关键字,第二确定模块126具体用于:比较目标哈希地址与公共冲突缓存中的每个缓存行的tag字段;当公共冲突缓存中各缓存行的tag字段与目标哈希地址均不相同时,确定公共冲突缓存中不存在命中的哈希表项;当公共冲突缓存中存在tag字段与目标哈希地址相同的目标缓存行时,比较目标缓存行的第四字段与访问请求包括的关键字;当目标缓存行的第四字段与访问请求包括的关键字相同时,确定公共冲突缓存中存在命中的哈希表项;当目标缓存行的第四字段与访问请求包括的关键字不相同时,确定公共冲突哈希缓存中不存在命中的哈希表项。
可选地,作为一个实施例,访问请求包括写请求,访问请求中还包括待写入的数据,第一访问模块127可具体用于:当哈希表缓存中存在命中的哈希表项时,将待写入的数据写入哈希表缓存中的命中的哈希表项所在缓存行的data字段。
可选地,作为一个实施例,访问请求包括读请求,第一访问模块127可具体用于:当哈希表缓存中存在命中的哈希表项时,读取哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
可选地,作为一个实施例,装置100还可包括第二访问模块,第二访问模块具体用于:当哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,地址寄存器位于处理器中,用于存储处理器执行的指令的地址;根据访问内存的指令,访问内存;第二访问模块还可用于:当内存访问完毕之后,跳转回地址寄存器中记录的上述下一条指令的地址,并执行所述下一条指令(或者继续执行访问请求流程中未执行完的流程)。
上述地址寄存器也可称为哈希表返回地址寄存器(Hash Table Return AddressRegister,HTRAR),用于存储当前正在执行的哈希表缓存的访问请求的指令的下一条指令的地址,目的是实现跳转功能。具体而言,哈希表缓存的访问请求的指令和访问内存的指令可以是分别存储在两个位置的不同指令,当哈希表缓存的访问请求的指令执行过程中发现哈希表缓存中不存在命中的哈希表项时,将哈希表缓存的访问请求的下一条指令存储到HTRAR中,跳转到访问内存的指令的首地址,开始进行内存访问,当内存访问结束时,再跳转回来继续执行哈希表缓存的访问请求的下一条指令。需要说明的是,本发明实施例对跳转回来继续执行的哈希表缓存的访问请求的指令的下一条指令不作具体限定,可以根据实际情况设定。例如,当上述内存访问请求为写请求时,跳转回来后可以将写入内存的数据写入哈希表缓存中,或者直接结束。
下面结合具体例子,更加详细地描述本发明实施例。应注意,图2至图10的例子仅仅是为了帮助本领域技术人员理解本发明实施例,而非要将本发明实施例限于所例示的具体数值或具体场景。本领域技术人员根据所给出的图2至图10的例子,显然可以进行各种等价的修改或变化,这样的修改或变化也落入本发明实施例的范围内。
总体来说,在本实施例中,在处理器内部实现一个用于缓存哈希表项的快速缓存部件:哈希表缓存,并添加扩展指令集,提供操作哈希表快速缓存的指令。应理解,应用程序创建的哈希表仍然存储在内存当中,HTC中缓存的可以是内存哈希表的一个子集。扩展指令集包括读、写哈希表的执行令,该读、写哈希表的指令将首先尝试在HTC中快速命中待读、写的项,如果命中,快速返回;不命中,继续访问内存。应用程序中对哈希表的操作将通过编译器(或解释器加虚拟机)翻译成上述扩展指令集中的指令。
图2是本发明实施例的***框架的示例图。如图2所示,本发明实施例的方案应用在通用的微处理器上,并对微处理器的体系结构做适当扩展。图中的扩展部分包括HTC、HTRAR、以及扩展指令集中的各指令。首先,在微处理器内部设计一个HTC;增加一个地址寄存器HTRAR,该地址寄存器用来保存访问内存中的哈希表后的返回地址,即用来保存访问内存中的哈希表后的下一条指令的地址,后面介绍指令时再做详细介绍。扩展指令集,增加HTR、HTW、HTCW以及HTRET四条指令来操作哈希表以及哈希表缓存。
首先,整个哈希表可以是由应用程序在内存中建立的。通用的一级缓存、二级缓存(或称L1cache和L2cache)中可能会缓存一定的哈希表的数据,这是通过硬件预取(或软件预取)方式,将哈希表数据看做普通数据,以缓存行大小为单位,取到缓存中的。HTC中也保存哈希表的缓存数据,这些数据是通过我们扩展的指令,以哈希表项为单位取到HTC中的。
接下来,依次介绍扩展的几条指令:
1、对哈希表的写入操作指令:htw
指令格式:htw rs,label
指令描述:将固定寄存器r0的内容,作为key,固定寄存器r1的内容作为value,rs寄存器(rs寄存器是除r0和r1之外的任意寄存器)的内容作为哈希地址,写HTC。
指令操作:使用哈希地址查找HTC,如果命中,直接将r1寄存器的值写入data字段,脏位置1;如果没有命中,将htw的下一条指令的地址保存到HTRAR中,跳转到label处,访问内存,label可以是访问内存操作的指令所在地址的首地址,或者指向该首地址的指针,处理器根据该label的指示能够找到访问内存的指令在存储器中的位置,并从该位置开始读取访问内存的指令,从而实现对内存的访问。
2、对哈希表的读取操作指令:htr
指令格式:htr rs,label
指令描述:将固定寄存器r0的内容,作为key,rs寄存器的内容作为哈希地址,查找HTC。如果HTC命中,将找到的value值存放到固定寄存器r1中,否则,跳转到label处执行。
指令操作:使用哈希地址查找HTC,如果在HTC中命中,将data字段写入到r1寄存器;如果没有命中,跳转到标号处继续执行,并将htr下一条指令的地址保存到HTRAR寄存器中。
3、对HTC写入操作的指令:htcw
指令格式:htcw rs
指令描述:将固定寄存器r0,r1的内容分别作为key和value写入到rs指定的哈希地址对应的HTC中。
指令操作:根据哈希地址找到HTC中存放该哈希表项的位置,如果该位置仍有空闲项,将key和value写入HTC,否则根据替换策略替换出一项再写入HTC。
4、内存访问完成后的返回指令:htret
指令格式:htret
指令描述:与htw、htr配合使用,当htw或htr指令执行后跳转到label处执行完成后,使用该指令返回htw或htr的下一条指令继续执行。
指令操作:读取HTRAR中保存的返回地址,跳转到该地址。
下面对图2中的HTC的内部结构进行详细描述。在此之前,首先介绍一下本发明实施例相关的一些数据格式。
首先,内存和HTC中的key和value可以使用64位存储。当key(value)的长度不大于64位时,直接存储,当key(value)的长度大于64位时,可以在哈希表中存储key(value)的地址。通过这种方式,本发明实施例可以支持存储任意长度,任意数据类型的键值(key-value)对。
其次,如图3所示,哈希地址(Hash Address)可以由两个部分组成,缓存标签(Cache Tag)以及缓存索引(Cache Index)。哈希地址的长度可以在[Cache Index,CacheIndex+Cache Tag]区间内。因此,该装置支持的最大哈希表可以包含2(Cache Index+Cache Tag)项。
HTC是由两部分组成的,包括一个主哈希表缓存(Main Hash Table Cache,MHTC),以及一个公共冲突缓存(Common Collision Cache,CCC),具体参见图4。
MHTC可以是多路组相连的Cache,例如,可以是一个四路组相连的Cache,共含有2(Index+2)项缓存行。每一个缓存行的结构如图5所示。S字段(即State字段)包括脏位D,存在位P等标志位;标签字段(即Tag字段)由两部分组成:缓存标签(Cache Tag)部分是哈希地址(Hash Address)去掉低位的Index剩余的高位部分,关键字(key)是本缓存行(Cache line)缓存的哈希表项的键;数据字段(Data字段)存储本Cache line缓存的哈希表项的值。查找MHTC的过程可以为:首先根据Hash Address的低位部分的Cache Index字段,找到对应的四路Cache line。同时比较这四路Cache line判断是否命中,每一路的比较的逻辑为:首先比较Hash Address的高位部分Cache Tag是否与Cache line中的Cache Tag相同,如果不相同,则此路Cache不命中,如果相同,再将寄存器r0中的key与Cache line中的key做比较,如果仍然相同,则此路cache命中,否则不命中。
主哈希表缓存(MHTC)的四路组相连结构可以缓存同一哈希地址的4项冲突项,支持4项冲突项的同时比较。为了进一步提高Cache命中率,在MHTC的基础上,增加一个公共冲突缓存部件(CCC),该部件用来缓存MHTC中存放不下的冲突项。该部件是一个含有128项的全相连Cache,htcw指令向HTC中新写入一项时,如果MHTC中该键-值对对应的哈希地址的4路冲突项全部填满时,则将该项***到CCC中。查找CCC的过程为:同时查找CCC的128项Cache line,比较判断是否命中。每一路的比较的逻辑为:使用整个Hash Address作为HashTag(因为在全相连的结构中不存在Hash Index),与Cache line中Cache Tag比较,如果不相同,则此路Cache不命中,如果相同,再将寄存器r0中的key与Cache line中的key做比较,如果仍然相同,则此路cache命中,否则不命中。
将MHTC和CCC组合在一起形成HTC,查找HTC的比较逻辑为:同时查找MHTC和CCC,只要二者有一个命中,HTC命中;二者都不命中,HTC不命中。
哈希表专用缓存HTC与通用Cache(如一级缓存、二级缓存等)区别在于缓存的对象不同,因此导致二者在Cache line的结构、命中的比较逻辑上的差异。即通用Cache中Cacheline的内容是内存中一段连续的地址空间的内容,HTC中Cache line的内容是内存中哈希表的一项;不同于通用Cache的命中比较逻辑,HTC的比较逻辑中增加了对key的比较。
首先,针对哈希冲突时需要多次访存的问题,HTC能够同时比较多个冲突表项,解决了多次访存的问题。并且,HTC中对key的比较是包含在Cache命中判断逻辑中的,不再需要额外的比较指令。其次,HTC将哈希表项缓存到专用的位置,不会存在其他数据对Cache的干扰的问题(这种干扰是指其他数据被缓存到与哈希表数据相同的Cache line中,哈希表数据被替换出去的情况),提高哈希表数据命中率。
下面结合图6和图7,详细描述哈希表缓存的读写过程。
在图6中,应用程序中写哈希表的流程是:
首先,将关键字(Key)存入固定寄存器r0中,将值(Value)存入固定寄存器r1中,为执行htw指令做准备;
然后,使用应用程序指定的哈希函数根据Key计算出哈希地址;
接下来执行哈希表写入指令:htw,该指令完成的操作如上文所述,此处不再详述;
如果在哈希表缓存中命中,htw指令会直接将存在r0和r1寄存器中的Key和Value写入命中的哈希表快速缓存表项中,写哈希表操作到此结束;
如果哈希表快速缓存没有命中,htw指令会将该指令下一条指令的地址保存到HTRAR寄存器中,并跳转到htw指令指定的label处;
其中,在label处,程序执行的操作和使用通用缓存的程序写入哈希表的操作相同:根据哈希表在内存中的基地址以及哈希地址计算出待写入表项在内存哈希表的位置,如果该位置存在冲突,根据解决冲突的方法,再次确定要写入的位置,将哈希表项写入该位置。
最后,执行哈希表操作返回指令:htret,转回到HTRAR指定的位置,至此,写哈希表操作结束,应用程序继续执行后续操作。
在图6中,应用程序中读哈希表的流程是:
首先,将Key存入固定寄存器r0中;然后根据Key计算出哈希地址;
接下来,执行哈希表读取指令:htr,该指令完成的操作上文所述,此处不再赘述;
如果哈希表缓存命中,htr指令将从命中的表项中取出Value存入到固定寄存器r1中,读流程到此结束;
如果没有命中,htr指令会将该指令下一条指令的地址保存到HTRAR寄存器中,并跳转到htw指令指定的label处。
在Label处,程序执行的操作和使用通用缓存的程序读取哈希表的操作相同:根据哈希表在内存中的基地址、哈希地址以及使用的冲突解决方法找到所有可能的哈希表项,逐一比较找到与待查找Key相同的哈希表项,将该表项的Value值读到固定寄存器r1中;接下来使用htcw指令将该表项缓存到哈希表缓存中;
最后,执行返回指令htret,转回到HTRAR指定的位置,继续执行后续操作。另外,对于待查找表项不在内存哈希表中的情况,在label处比较完所有可能表项后,可以置位某固定寄存器,htret返回后,程序通过检查该寄存器的值判断待查找表项是否读到,进行下一步处理。
图7是写哈希表流程的另一个实施例。在图7中,写哈希表的过程为:
首先使用哈希函数根据Key计算出哈希地址;
接下来查快速哈希表缓存,判断是否命中;
当哈希表缓存命中时,将待写入哈希表项写入哈希表快速缓存,接下来根据选取的写命中时策略决定是否要将该表项也写入到内存哈希表中(写穿透策略时要写入内存哈希表,写回策略可以没有此步操作);
哈希表缓存不命中时,将待写入项写入内存哈希表相应位置;
接下来根据选取的写不命中策略决定是否要将该表项写入哈希表缓存(写分配策略要写入哈希表缓存,写不分配策略可以没有此步操作)。
在图7中,读哈希表的步骤为:
首先使用哈希函数根据Key计算出哈希地址;
接下来查快速哈希表缓存,并判断是否命中,当哈希表缓存命中时,直接返回查找到的表项;
不命中时,查内存哈希表,并将查到的表项缓存到哈希表缓存中。
下面结合图8,以MHTC包括4×4=16项,CCC具有24项为例进行举例说明。
首先建立了一个有16个项的哈希表,假设键和值都是64位。现在内存中有如下表所示的键值对:
表一:内存中的键值(Key-Value)对
Key Value 哈希地址
0x1000 100 0010
0x2000 200 0101
0x3000 300 0100
0x4000 400 0000
0x5000 500 0101
假设在应用程序中,有一系列依次按照键访问哈希表的操作,访问顺序是:0x2000,0x1000,0x5000。假设初始状态下,HTC中没有缓存任何数据,此时HTC和内存中的状态如图8所示。访问0x2000时,应用程序首先根据选定的哈希函数,计算出哈希地址,将0x2000存入到寄存器r0中,通过htr指令读哈希表,HTC不命中,转到htr指令中指定的label处处理。label处将首先计算出待访问的哈希地址在内存中存储的位置,在内存中该位置上读出键值对,存入到HTC中,同时将冲突项预取到HTC中,最后通过htret指令返回。此时,HTC中的数据如图9所示。接下来访问0x1000的操作与访问0x2000的操作类似,HTC也不命中,返回后HTC中的数据如图10所示。最后,访问0x5000时,首先计算哈希地址,根据哈希地址查找HTC时,命中,结果直接保存到寄存器r1中。
上文结合图1至图10,详细描述了根据本发明实施例的访问哈希表的装置。下文结合图11,详细描述根据本发明实施例的访问哈希表的方法。应理解,图11中描述的访问哈希表的方法可以由图1中的访问哈希表的装置执行,为了简洁,适当省略重复的描述。
图11是本发明实施例的访问哈希表的方法的示意性流程图。图11的方法包括:
1110、获取访问请求,访问请求包括关键字;
1120、根据关键字,确定目标哈希地址;
1130、根据目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,哈希表缓存位于通用的处理器中,且哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,哈希表缓存的每个缓存行用于缓存哈希表的一个哈希表项;
1140、当哈希表缓存中存在命中的哈希表项时,访问哈希表缓存中命中的哈希表项;
本发明实施例中,在通用的处理器中设置了专门缓存哈希表的至少部分哈希表项的哈希表缓存,并基于哈希表缓存的是哈希表项,设置了一套适合该哈希表缓存的访问逻辑,即根据哈希地址访问缓存的访问逻辑,避免了在通用的缓存中哈希数据经常被其他数据替换掉而导致的处理器的多次访存操作,提高了哈希数据处理的效率。
可选地,作为一个实施例,哈希表缓存包括主哈希表缓存和公共冲突缓存,公共冲突缓存用于存放至少部分哈希表项中的冲突表项,步骤1130可包括:根据目标哈希地址,确定主哈希表缓存中是否存在命中的哈希表项;和/或根据目标哈希地址,确定公共冲突缓存中是否存在命中的哈希表项。
可选地,作为一个实施例,主哈希表缓存包括N路缓存,N路缓存之间组相连,其中N路缓存中的每个缓存行的tag字段包括:第一字段和第二字段,每个缓存行的第一字段为该每个缓存行存储的哈希表项对应的哈希地址的高位字段,每个缓存行的第二字段为该每个缓存行存储的哈希表项对应的关键字,上述根据目标哈希地址,确定主哈希表缓存中是否存在命中的哈希表项可包括:以目标哈希地址的低位字段为索引,从N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;将N个缓存行的第一字段与目标哈希地址的高位字段进行比较;当N个缓存行中的每个缓存行的第一字段与目标哈希地址的高位字段均不相同时,确定主哈希表缓存中不存在命中的哈希表项;当N个缓存行中存在第一字段与目标哈希地址的高位字段相同的目标缓存行时,比较目标缓存行的第二字段与访问请求包括的关键字是否相同;当目标缓存行的第二字段与访问请求包括的关键字相同时,确定主哈希表缓存中存在命中的哈希表项;当目标缓存行的第二字段与访问请求包括的关键字不相同时,确定主哈希表缓存中不存在命中的哈希表项。
可选地,作为一个实施例,公共冲突缓存包括全相连结构(或者公共冲突缓存采用全相连结构),公共冲突缓存的缓存行的tag字段包括第三字段和第四字段,第三字段为公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,第四字段为公共冲突缓存的缓存行存储的哈希表项对应的关键字,上述根据目标哈希地址,确定公共冲突缓存中是否存在命中的哈希表项可包括:比较目标哈希地址与公共冲突缓存中的每个缓存行的tag字段;当公共冲突缓存中各缓存行的tag字段与目标哈希地址均不相同时,确定公共冲突缓存中不存在命中的哈希表项;当公共冲突缓存中存在tag字段与目标哈希地址相同的目标缓存行时,比较目标缓存行的第四字段与访问请求包括的关键字;当目标缓存行的第四字段与访问请求包括的关键字相同时,确定公共冲突缓存中存在命中的哈希表项;当目标缓存行的第四字段与访问请求包括的关键字不相同时,确定公共冲突哈希缓存中不存在命中的哈希表项。
可选地,作为一个实施例,访问请求包括写请求,访问请求中还包括待写入的数据,当哈希表缓存中存在命中的哈希表项时,访问命中的哈希表项,包括:当哈希表缓存中存在命中的哈希表项时,将待写入的数据写入哈希表缓存中的命中的哈希表项所在缓存行的data字段。
可选地,作为一个实施例,访问请求包括读请求,当哈希表缓存中存在命中的哈希表项时,访问命中的哈希表项,包括:当哈希表缓存中存在命中的哈希表项时,读取哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
可选地,作为一个实施例,图11的方法还可包括:当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
上述访问内存可以是直接访问内存,也可以是通过访问通用缓存来访问内存,如果通用缓存中没有命中,则再访问内存,这里的通用缓存可以指处理器内通常设置的一级缓存和/或二级缓存,当然,通用缓存中还可以设置更多级的缓存。
可选地,作为一个实施例,当哈希表缓存中不存在命中的哈希表项时,根据目标哈希地址访问内存,包括:当哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,地址寄存器位于处理器中,用于存储处理器执行的指令的地址;根据访问内存的指令,访问内存;图11的方法还可包括:当内存访问完毕之后,跳转回地址寄存器中记录的下一条指令的地址,并执行上述下一条指令。
图12是本发明实施例的访问哈希表的装置的示意性框图。图12的装置1200包括:
存储器1210,用于存储程序;
处理器1220,用于执行程序,当所述程序被执行时,所述处理器1220具体用于:获取访问请求,访问请求包括关键字;根据关键字,确定目标哈希地址;根据目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,哈希表缓存位于通用的处理器1220中,且哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,哈希表缓存的每个缓存行用于缓存哈希表的一个哈希表项;当哈希表缓存中存在命中的哈希表项时,访问哈希表缓存中命中的哈希表项;
本发明实施例中,在通用的处理器中设置了专门缓存哈希表的至少部分哈希表项的哈希表缓存,并基于哈希表缓存的是哈希表项,设置了一套适合该哈希表缓存的访问逻辑,即根据哈希地址访问缓存的访问逻辑,避免了在通用的缓存中哈希数据经常被其他数据替换掉而导致的处理器的多次访存操作,提高了哈希数据处理的效率。
可选地,作为一个实施例,哈希表缓存包括主哈希表缓存和公共冲突缓存,公共冲突缓存用于存放至少部分哈希表项中的冲突表项,所述处理器1220可具体用于:根据目标哈希地址,确定主哈希表缓存中是否存在命中的哈希表项;和/或根据目标哈希地址,确定公共冲突缓存中是否存在命中的哈希表项。
可选地,作为一个实施例,主哈希表缓存包括N路缓存,N路缓存之间组相连,其中N路缓存中的每个缓存行的tag字段包括:第一字段和第二字段,每个缓存行的第一字段为该每个缓存行存储的哈希表项对应的哈希地址的高位字段,每个缓存行的第二字段为该每个缓存行存储的哈希表项对应的关键字,处理器1220可具体用于:以目标哈希地址的低位字段为索引,从N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;将N个缓存行的第一字段与目标哈希地址的高位字段进行比较;当N个缓存行中的每个缓存行的第一字段与目标哈希地址的高位字段均不相同时,确定主哈希表缓存中不存在命中的哈希表项;当N个缓存行中存在第一字段与目标哈希地址的高位字段相同的目标缓存行时,比较目标缓存行的第二字段与访问请求包括的关键字是否相同;当目标缓存行的第二字段与访问请求包括的关键字相同时,确定主哈希表缓存中存在命中的哈希表项;当目标缓存行的第二字段与访问请求包括的关键字不相同时,确定主哈希表缓存中不存在命中的哈希表项。
可选地,作为一个实施例,公共冲突缓存包括全相连结构,公共冲突缓存的缓存行的tag字段包括第三字段和第四字段,第三字段为公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,第四字段为公共冲突缓存的缓存行存储的哈希表项对应的关键字,处理器1220可具体用于:比较目标哈希地址与公共冲突缓存中的每个缓存行的tag字段;当公共冲突缓存中各缓存行的tag字段与目标哈希地址均不相同时,确定公共冲突缓存中不存在命中的哈希表项;当公共冲突缓存中存在tag字段与目标哈希地址相同的目标缓存行时,比较目标缓存行的第四字段与访问请求包括的关键字;当目标缓存行的第四字段与访问请求包括的关键字相同时,确定公共冲突缓存中存在命中的哈希表项;当目标缓存行的第四字段与访问请求包括的关键字不相同时,确定公共冲突哈希缓存中不存在命中的哈希表项。
可选地,作为一个实施例,访问请求包括写请求,访问请求中还包括待写入的数据,处理器1220可具体用于当哈希表缓存中存在命中的哈希表项时,将待写入的数据写入哈希表缓存的命中的哈希表项所在缓存行的data字段。
可选地,作为一个实施例,访问请求包括读请求,处理器1220可具体用于:当哈希表缓存中存在命中的哈希表项时,读取哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
可选地,作为一个实施例,处理器1220还可用于:当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
可选地,作为一个实施例,当哈希表缓存中不存在命中的哈希表项时,处理器1220可具体用于:当哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,地址寄存器位于处理器中,用于存储处理器执行的指令的地址;根据访问内存的指令,访问内存;处理器1220还可用于:当内存访问完毕之后,跳转回地址寄存器中记录的下一条指令的地址,并执行上述下一条指令。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的模块及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***、装置和模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的***、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上模块集成在一个模块中。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (16)

1.一种访问哈希表的装置,其特征在于,所述装置包括:
获取模块,用于获取访问请求,所述访问请求包括关键字;
第一确定模块,用于根据所述获取模块获取的所述关键字,确定目标哈希地址;
第二确定模块,用于根据所述第一确定模块确定的所述目标哈希地址,确定哈希表缓存中是否存在命中的哈希表项,所述哈希表缓存位于通用的处理器中,且所述哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,所述哈希表缓存的每个缓存行用于缓存所述哈希表的一个哈希表项;
第一访问模块,用于当所述第二确定模块确定所述哈希表缓存中存在命中的哈希表项时,访问所述哈希表缓存中命中的哈希表项。
2.如权利要求1所述的装置,其特征在于,所述哈希表缓存包括主哈希表缓存和公共冲突缓存,所述公共冲突缓存用于存放所述至少部分哈希表项中的冲突表项,
所述第二确定模块具体用于:
根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项;和/或
根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项。
3.如权利要求2所述的装置,其特征在于,所述主哈希表缓存包括N路缓存,所述N路缓存之间组相连,其中所述N路缓存中的每个缓存行的目标tag字段包括:第一字段和第二字段,所述每个缓存行的第一字段为所述每个缓存行存储的哈希表项对应的哈希地址的高位字段,所述每个缓存行的第二字段为所述每个缓存行存储的哈希表项对应的关键字,
所述第二确定模块具体用于:
以所述目标哈希地址的低位字段为索引,从所述N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;
将所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段进行比较;
当所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段均不相同时,确定所述主哈希表缓存中不存在命中的哈希表项;
当所述N个缓存行中存在第一字段与所述目标哈希地址的高位字段相同的目标缓存行时,比较所述目标缓存行的第二字段与所述访问请求包括的关键字是否相同;
当所述目标缓存行的第二字段与所述访问请求包括的关键字相同时,确定所述主哈希表缓存中存在命中的哈希表项;
当所述目标缓存行的第二字段与所述访问请求包括的关键字不相同时,确定所述主哈希表缓存中不存在命中的哈希表项。
4.如权利要求2所述的装置,其特征在于,所述公共冲突缓存包括全相连结构,所述公共冲突缓存的缓存行的目标tag字段包括第三字段和第四字段,所述第三字段为所述公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,所述第四字段为所述公共冲突缓存的缓存行存储的哈希表项对应的关键字,
所述第二确定模块具体用于:
比较所述目标哈希地址与所述公共冲突缓存中的每个缓存行的tag字段;
当所述公共冲突缓存中各缓存行的tag字段与所述目标哈希地址均不相同时,确定所述公共冲突缓存中不存在命中的哈希表项;
当所述公共冲突缓存中存在tag字段与所述目标哈希地址相同的目标缓存行时,比较所述目标缓存行的第四字段与所述访问请求包括的关键字;
当所述目标缓存行的第四字段与所述访问请求包括的关键字相同时,确定所述公共冲突缓存中存在命中的哈希表项;
当所述目标缓存行的第四字段与所述访问请求包括的关键字不相同时,确定所述公共冲突哈希缓存中不存在命中的哈希表项。
5.如权利要求1-4中任一项所述的装置,其特征在于,所述访问请求包括写请求,所述访问请求中还包括待写入的数据,
所述第一访问模块具体用于:
当所述哈希表缓存中存在命中的哈希表项时,将所述待写入的数据写入所述哈希表缓存中的命中的哈希表项所在缓存行的data字段。
6.如权利要求1-4中任一项所述的装置,其特征在于,所述访问请求包括读请求,
所述第一访问模块具体用于:
当所述哈希表缓存中存在命中的哈希表项时,读取所述哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
7.如权利要求1-4中任一项所述的装置,其特征在于,还包括:
第二访问模块,用于当所述第二确定模块确定所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
8.如权利要求7所述的装置,其特征在于,
所述第二访问模块具体用于:
当所述哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,所述地址寄存器位于所述处理器中,用于存储所述处理器执行的指令的地址;
根据所述访问内存的指令,访问所述内存;
所述第二访问模块还用于:
当所述内存访问完毕之后,跳转回所述地址寄存器中记录的所述下一条指令的地址,并执行所述下一条指令。
9.一种访问哈希表的方法,其特征在于,所述方法包括:
获取访问请求,所述访问请求包括关键字;
根据所述关键字,确定目标哈希地址;
根据所述目标哈希地址,确定所述哈希表缓存中是否存在命中的哈希表项,所述哈希表缓存位于通用的处理器中,且所述哈希表缓存专门用于缓存内存中的哈希表的至少部分哈希表项,其中,所述哈希表缓存的每个缓存行用于缓存所述哈希表的一个哈希表项;
当所述哈希表缓存中存在命中的哈希表项时,访问所述哈希表缓存中命中的哈希表项。
10.如权利要求9所述的方法,其特征在于,所述哈希表缓存包括主哈希表缓存和公共冲突缓存,所述公共冲突缓存用于存放所述至少部分哈希表项中的冲突表项,
所述根据所述目标哈希地址,确定所述哈希表缓存中是否存在命中的哈希表项,包括:
根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项;和/或
根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项。
11.如权利要求10所述的方法,其特征在于,所述主哈希表缓存包括N路缓存,所述N路缓存之间组相连,其中所述N路缓存中的每个缓存行的目标tag字段包括:第一字段和第二字段,所述每个缓存行的第一字段为所述每个缓存行存储的哈希表项对应的哈希地址的高位字段,所述每个缓存行的第二字段为所述每个缓存行存储的哈希表项对应的关键字,
所述根据所述目标哈希地址,确定所述主哈希表缓存中是否存在命中的哈希表项,包括:
以所述目标哈希地址的低位字段为索引,从所述N路缓存中的每路缓存中选出对应的缓存行,得到N个缓存行;
将所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段进行比较;
当所述N个缓存行中的每个缓存行的第一字段与所述目标哈希地址的高位字段均不相同时,确定所述主哈希表缓存中不存在命中的哈希表项;
当所述N个缓存行中存在第一字段与所述目标哈希地址的高位字段相同的目标缓存行时,比较所述目标缓存行的第二字段与所述访问请求包括的关键字是否相同;
当所述目标缓存行的第二字段与所述访问请求包括的关键字相同时,确定所述主哈希表缓存中存在命中的哈希表项;
当所述目标缓存行的第二字段与所述访问请求包括的关键字不相同时,确定所述主哈希表缓存中不存在命中的哈希表项。
12.如权利要求10所述的方法,其特征在于,所述公共冲突缓存包括全相连结构,所述公共冲突缓存的缓存行的目标tag字段包括第三字段和第四字段,所述第三字段为所述公共冲突缓存的缓存行存储的哈希表项对应的哈希地址,所述第四字段为所述公共冲突缓存的缓存行存储的哈希表项对应的关键字,
所述根据所述目标哈希地址,确定所述公共冲突缓存中是否存在命中的哈希表项,包括:
比较所述目标哈希地址与所述公共冲突缓存中的每个缓存行的tag字段;
当所述公共冲突缓存中各缓存行的tag字段与所述目标哈希地址均不相同时,确定所述公共冲突缓存中不存在命中的哈希表项;
当所述公共冲突缓存中存在tag字段与所述目标哈希地址相同的目标缓存行时,比较所述目标缓存行的第四字段与所述访问请求包括的关键字;
当所述目标缓存行的第四字段与所述访问请求包括的关键字相同时,确定所述公共冲突缓存中存在命中的哈希表项;
当所述目标缓存行的第四字段与所述访问请求包括的关键字不相同时,确定所述公共冲突哈希缓存中不存在命中的哈希表项。
13.如权利要求9-12中任一项所述的方法,其特征在于,所述访问请求包括写请求,所述访问请求中还包括待写入的数据,
所述当所述哈希表缓存中存在命中的哈希表项时,访问所述命中的哈希表项,包括:
当所述哈希表缓存中存在命中的哈希表项时,将所述待写入的数据写入所述哈希表缓存中的命中的哈希表项所在缓存行的data字段。
14.如权利要求9-12中任一项所述的方法,其特征在于,所述访问请求包括读请求,
所述当所述哈希表缓存中存在命中的哈希表项时,访问所述命中的哈希表项,包括:
当所述哈希表缓存中存在命中的哈希表项时,读取所述哈希表缓存中的命中的哈希表项所在缓存行的data字段的内容。
15.如权利要求9-12中任一项所述的方法,其特征在于,还包括:
当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存中的哈希表项。
16.如权利要求15所述的方法,其特征在于,
所述当所述哈希表缓存中不存在命中的哈希表项时,根据所述目标哈希地址访问所述内存,包括:
当所述哈希表缓存中不存在命中的哈希表项时,将当前正在执行的访问请求的下一条指令的地址写入地址寄存器,并跳转至用于访问内存的指令所在的地址,其中,所述地址寄存器位于所述处理器中,用于存储所述处理器执行的指令的地址;
根据所述访问内存的指令,访问所述内存;
所述方法还包括:
当所述内存访问完毕之后,跳转回所述地址寄存器中记录的所述下一条指令的地址,并执行所述下一条指令。
CN201510179425.8A 2015-04-16 2015-04-16 访问哈希表的装置和方法 Active CN104809179B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510179425.8A CN104809179B (zh) 2015-04-16 2015-04-16 访问哈希表的装置和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510179425.8A CN104809179B (zh) 2015-04-16 2015-04-16 访问哈希表的装置和方法

Publications (2)

Publication Number Publication Date
CN104809179A CN104809179A (zh) 2015-07-29
CN104809179B true CN104809179B (zh) 2018-10-02

Family

ID=53694001

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510179425.8A Active CN104809179B (zh) 2015-04-16 2015-04-16 访问哈希表的装置和方法

Country Status (1)

Country Link
CN (1) CN104809179B (zh)

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107579916B (zh) 2016-07-04 2021-03-23 新华三技术有限公司 转发表项访问方法及装置
US10282294B2 (en) * 2017-02-15 2019-05-07 Samsung Electronics Co., Ltd. Mitigating DRAM cache metadata access overhead with SRAM metadata cache and bloom filter
CN108804234B (zh) * 2017-04-28 2023-05-09 腾讯科技(深圳)有限公司 数据存储***及其操作方法
CN107291628B (zh) * 2017-07-04 2020-09-01 北京京东尚科信息技术有限公司 访问数据存储设备的方法和装置
CN107729053B (zh) * 2017-10-17 2020-11-27 安徽皖通邮电股份有限公司 一种实现高速缓存表的方法
CN109947669A (zh) * 2017-12-21 2019-06-28 北京忆恒创源科技有限公司 Kv存储设备的地址转换方法与***
CN109039911B (zh) * 2018-07-27 2021-02-26 烽火通信科技股份有限公司 一种基于hash查找方式共享ram的方法及***
CN110858201B (zh) * 2018-08-24 2023-05-02 阿里巴巴集团控股有限公司 数据处理方法及***、处理器、存储介质
CN109446114B (zh) * 2018-10-12 2020-12-18 咪咕文化科技有限公司 一种空间数据缓存方法、装置和存储介质
CN109684350A (zh) * 2018-12-15 2019-04-26 平安证券股份有限公司 证券登记数据核对方法、装置、计算机设备及存储介质
CN109918131B (zh) * 2019-03-11 2021-04-30 中电海康无锡科技有限公司 一种基于非阻塞指令cache的指令读取方法
CN110032528A (zh) * 2019-04-19 2019-07-19 苏州浪潮智能科技有限公司 存储***的内存数据查找方法、装置、设备及存储介质
CN114077380A (zh) * 2020-08-20 2022-02-22 深圳市中兴微电子技术有限公司 一种多通道查表方法和装置
CN113297101A (zh) * 2020-09-30 2021-08-24 阿里云计算有限公司 用于哈希缓存的方法以及装置
CN114584482B (zh) * 2022-02-14 2023-09-08 阿里巴巴(中国)有限公司 基于内存存储检测数据的方法、装置以及网卡
CN116701246B (zh) * 2023-05-23 2024-05-07 合芯科技有限公司 一种提升缓存带宽的方法、装置、设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101090401A (zh) * 2007-05-25 2007-12-19 金蝶软件(中国)有限公司 一种群集环境下的数据缓存方法及***
CN102307234A (zh) * 2011-08-24 2012-01-04 北京邮电大学 基于移动终端的资源检索方法
CN102314397A (zh) * 2011-09-23 2012-01-11 浙江大学 缓存数据块的处理方法
CN102388373A (zh) * 2011-09-30 2012-03-21 华为技术有限公司 访问高速缓冲存储器的方法及非真实缓存代理

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101090401A (zh) * 2007-05-25 2007-12-19 金蝶软件(中国)有限公司 一种群集环境下的数据缓存方法及***
CN102307234A (zh) * 2011-08-24 2012-01-04 北京邮电大学 基于移动终端的资源检索方法
CN102314397A (zh) * 2011-09-23 2012-01-11 浙江大学 缓存数据块的处理方法
CN102388373A (zh) * 2011-09-30 2012-03-21 华为技术有限公司 访问高速缓冲存储器的方法及非真实缓存代理

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
针对顺序数据访问应用的分离式数据缓存器设计;刘姝等;《北京大学学报(自然科学版)》;20080531;第44卷(第3期);第359-369页 *

Also Published As

Publication number Publication date
CN104809179A (zh) 2015-07-29

Similar Documents

Publication Publication Date Title
CN104809179B (zh) 访问哈希表的装置和方法
US20140032845A1 (en) Systems and methods for supporting a plurality of load accesses of a cache in a single cycle
CN104115134B (zh) 用于管理对复合数据存储设备进行访问的方法和***
US9229873B2 (en) Systems and methods for supporting a plurality of load and store accesses of a cache
CN105283855B (zh) 一种寻址方法及装置
US20140052726A1 (en) Hardware implementation of the aggregation/group by operation: hash-table method
CN111694770B (zh) 一种处理io请求的方法及装置
CN102521330A (zh) 一种桌面虚拟化环境下的镜像分布式存储方法
CN107992577B (zh) 一种哈希表数据冲突处理方法及装置
CN102662869A (zh) 虚拟机中的内存访问方法和装置及查找器
CN105359142B (zh) 哈希连接方法和装置
CN106708749B (zh) 一种数据查找方法
CN106445416A (zh) 一种数据记录的存储、查询和检索的方法及装置
CN107025130A (zh) 处理节点、计算机***及事务冲突检测方法
US8028118B2 (en) Using an index value located on a page table to index page attributes
CN107766478A (zh) 一种面向高竞争情景的并发索引结构的设计方法
CN110008030A (zh) 一种元数据访问的方法、***及设备
CN107977577A (zh) 访存指令访问检测方法及装置
CN106547472B (zh) 存储阵列管理方法及装置
CN107133183A (zh) 一种基于tcmu虚拟块设备的缓存数据访问方法及***
JPH05210593A (ja) マイクロプロセッサのためのメモリ区分化装置およびセグメント記述子をセグメント・レジスタへロードする方法
US7197620B1 (en) Sparse matrix paging system
CN107783909B (zh) 一种内存地址总线扩展方法及装置
CN105868023B (zh) 一种分布式***中的数据处理方法及计算节点
US20030196024A1 (en) Apparatus and method for a skip-list based cache

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
EXSB Decision made by sipo to initiate substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant