CN116483739B - 基于hash计算的KV对快速写架构 - Google Patents

基于hash计算的KV对快速写架构 Download PDF

Info

Publication number
CN116483739B
CN116483739B CN202310735885.9A CN202310735885A CN116483739B CN 116483739 B CN116483739 B CN 116483739B CN 202310735885 A CN202310735885 A CN 202310735885A CN 116483739 B CN116483739 B CN 116483739B
Authority
CN
China
Prior art keywords
hash
hash value
data
address
state
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
CN202310735885.9A
Other languages
English (en)
Other versions
CN116483739A (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.)
Shencun Technology Wuxi Co ltd
Original Assignee
Shencun Technology Wuxi Co ltd
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 Shencun Technology Wuxi Co ltd filed Critical Shencun Technology Wuxi Co ltd
Priority to CN202310735885.9A priority Critical patent/CN116483739B/zh
Publication of CN116483739A publication Critical patent/CN116483739A/zh
Application granted granted Critical
Publication of CN116483739B publication Critical patent/CN116483739B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/0292User address space allocation, e.g. contiguous or non contiguous base addressing using tables or multilevel address translation means
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0811Multiuser, multiprocessor or multiprocessing cache systems with multilevel cache hierarchies
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本申请公开基于hash计算的KV对快速写架构,涉及FPGA领域,包括hash进程检测模块、写地址查询模块、状态标志更新模块、BRAM和DDR;hash进程检测模块接收hash值,从BRAM中读取状态标志位,确定hash值的查询状态和输出无进程冲突的目标hash值;写地址查询模块根据目标hash值查询DDR中的目标链表并确定KV对写地址,生成状态标志更新信号;状态标志更新模块根据写地址查询模块输出的状态标志更新信号确定写地址查询结果,并基于目标hash值更新状态标志位。该架构在低延迟BRAM中引入记录KV对创建流水线状态的状态标记位,从而使得设计在并行时不会出现写数据冲突,提高写效率。

Description

基于hash计算的KV对快速写架构
技术领域
本申请实施例涉及FPGA技术领域,特别涉及一种基于hash计算的KV对快速写架构。
背景技术
随着AI技术的快速发展,对数据库的吞吐速度也有了更高的要求。而Key-Value分布式存储系统具备极高的查询速度、可存储数据容量大、支持高度并发的特点,逐渐成为分布式数据中心的重要组成部分。但存储的Key-Value(键值)分布在系统的各个主机上,需要通过网络来访问。
Memcached、Redis是典型采用KV存储的系统,但它们的性能相较于本地的KV读写慢了几个数量级。这是因为厚重的软件网络协议会带来了巨大的通信开销。针对该问题,有两个方向的优化手段,一是采用RDMA取代TCP/IP,二是用DPDK等高性能报文处理框架。若要进一步提升KV键值存储的性能,目前多采用FPGA来实现高性能的KV存储。因为FPGA具备高度并行性,合理的架构和数据处理能显著提升性能。在FPGA实现中,基于LSM树(log-structured-merge-tree)的KV存储实现具有高度写性能,但极大地牺牲了读性能,且会存在读写放大的问题。而基于hash的KV存储实现具有较高的查询性能,但其写性能却不高。
对于基于hash的KV存储实现,若要保证其读性能的同时,显著提升其写性能,需要了解限制写性能的原因。其根本原因在于相邻的KV对创建可能会基于同一个hash,而pipeline(流水)的FPGA处理形式会引发数据冲突。因此,在完成前一个KV对创建前,会“堵住”处理管道。当然,可以使用低延迟的BRAM(1-2cycle)或HBM来存储KV信息,从而降低堵塞带来的影响。但片上BRAM的资源相对较少,限制在兆级别,无法满足大规模的键值存储。而HBM延迟相较于BRAM略高,但存储大小可达到几十G,并支持几十个AXI总线访问接口,但造价过于昂贵。对于大容量、造价一般但延迟略大的DDR(几十至上百个cycle)存储而言,堵塞后续KV对创建的方式,则会浪费DDR相当大的带宽资源。
发明内容
本申请实施例提供一种基于hash计算的KV对快速写架构,解决KV对创建流水中出现的写数据冲突以及写数据延迟的问题。具体的,所述架构包括hash进程检测模块、写地址查询模块、状态标志更新模块、块存储器BRAM、双倍速率同步动态随机存储器DDR和BRAM数据控制器;所述hash进程检测模块和所述状态标志更新模块通过所述BRAM数据控制器连接所述BRAM;所述写地址查询模块分别通过所述状态标志更新模块和总线桥AXI bridge连接BRAM数据控制器和DDR;BRAM中设置有存储各个hash值状态标志位的存储区,每个所述状态标志位分别用于表示各个hash值对应链表的查询状态;DDR中存储有用于读取链表和创建KV对的存储区;
所述hash进程检测模块接收外部输入的hash值,其中设置有缓存进程冲突hash值的寄存器和选通目标hash值的数据选择器;所述hash进程检测模块通过从BRAM中读取与hash值对应的状态标志位确定对应链表的查询状态,当前输入hash值的状态标志位指示对应链表处于查询状态时,说明存在进程冲突,从所述hash进程检测模块输出无进程冲突的目标hash值;当前输入hash值的状态标志位指示对应链表未处于查询状态时,说明不存在进程冲突,直接将输入的hash值输出到所述写地址查询模块;
所述写地址查询模块和所述hash进程检测模块连接,根据接收的目标hash值查询在DDR中的目标链表,并根据从DDR中的读取输出确定KV对的写地址;在确定KV对写地址后生成状态标志更新信号;其中,所述状态标志更新信号是基于确定KV对写地址的动作触发;
所述状态标志更新模块根据所述写地址查询模块输出的所述状态标志更新信号确定写地址查询结果,从所述写地址查询模块中提取需要更新状态的目标hash值,并基于目标hash值更新对应的状态标志位。
本申请实施例提供的技术方案带来的有益效果至少包括:通过在低延迟的BRAM中引入标记位,将后续处于KV对创建流水线中的hash值筛选成为不重复的值,从而使得设计在并行时不会出现写数据冲突;在确保不存在重复查询进程的状态下,通过近乎流水的AXI读写请求,保证读写通道一直保持充盈的状态;对存在冲突进程采用多级缓存机制,在不影响流水的情况下避免hash值重复,且不影响系统整体写入效率;以查询和更新低延迟的BRAM中状态标志位的方式可以减少对高延迟DDR的查询次数,在不占用DDR流水的情况下知晓流水进程冲突情况,大幅减少读取延迟,提高查询写地址和写入KV对效率。
附图说明
图1示出了相关技术中KV对快速写架构的实现原理图;
图2是本申请提供的基于hash计算的KV对快速写架构的设计框图;
图3 是Hash_process_avoid_conflict实现机制的原理架构图;
图4是多链查询hash映射的原理图;
图5是w_addr_search实现二次查询机制的原理架构图;
图6是Hash_mux实现二次查询的原理架构图;
图7是Hash_bit_updata更新bit_mark的结构示意图;
图8示出一种可能实现形式的Hash_bit_updata更新bit_mark的结构示意图;
图9是多个hash值映射单个状态标记位的映射示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
基于Hash的KV对创建过程在FPGA中实现可以概括为如下步骤:
S1,基于key计算对应hash值;
S2,基于hash值去查询对应存储空间(通常为双倍速率同步动态随机存储器DDR)的可写入区域地址;
S3,将hash值对应的Key-Value对写入查询到的地址空间中。
Key-Value对即为KV对,这里的Value信息仅包含地址和长度信息,考虑到FPAG的片上存储有限,单个Value信息一般需要很大的存储,一般以兆(M)为单位,所示完整的Value信息放在外接类似SSD的存储介质中。
然而,因为KV对的信息写入依赖于可存储地址的查询结果,所以当写入过程同步进行时,查询的地址可能会出现失去时效的情况。简而言之,当连续对同一个hash值对应的存储空间进行KV对创建时,会通过AXI总线先读取DDR中的数据,在查询得到可存储区域的地址后,再进行KV对信息写入。此时,因为DDR的延迟,写进程会延后于读进程十几个时钟至一百多时钟不等,这就导致除了第一个得到的地址外,后续地址(在第一次写入前发出的读请求,得到的地址都是一样的)都“过期”了。因此,在完成对某个hash值对应存储空间的KV对信息写入前,不应该再对该hash值对应的存储空间进行数据操作。也就是说,在进行KV对创建的过程中,要尽可能避免流水线/进程中的hash出现重复的情况。
为提高DDR的带宽利用率,尽可能实现读写流水访问的同时,避免写冲突出现,本申请在利用FPGA的块存储器(Block Random Access Memory,BRAM)来记录当前hash值对应的存储空间是否正在被操作,因为BRAM的时延远低于DDR,可将读写延迟cycle最低设置为1。而通过查询hash值对应的标记位状态来决定是基于当前hash值进行对应的KV对信息写入,还是缓存当前hash值及关联信息,开始下一个hash值对应的KV对信息写入。基于这一思想,本申请提出了基于hash的KV对快速写架构。
图1示出了基于hash的KV对快速写架构的实现原理图。在BRAM中单独设置一个存储区域entry_space,用于存放所有hash值的状态标志位。该状态标志位可以是单bit表示,且一个hash值映射一个状态标志位。可选的,鉴于通过hash函数得到的hash值存在乱序性,所以还可设定固定数量的连续hash值对应同一个状态标记位。如图9所示,1-16共16个hash值全部映射至BRAM中某块存储的某个bit位上,当改bit为高时,hash值为1-16的KV创建任务都不会被允许。尽管在标记位状态检查时会出现“误判”的情况,但这种概率很低,且不会影响整体设计的正确性,从而进一步降低BRAM资源消耗。而正常用于创建KV对的是DDR,本方案采用拉链法存储,即hash值映射到DDR中的数据(KV对)是存放在链表list中的。list存放于DDR的一个或两个空间中,其中key_space_fix中为每个hash值分配了一条固有的list。而key_space_expand中的空间则用于所有hash值申请额外的list。每个hash值至少对应一个list,每条list中可存储一条或多条KV对数据(数据结构不同,数量也存在差异)。需要说明的是,key_space_expand只针对链表数据超过设定宽度的情况下系统自动申请产生,若存储数据量较少则不存在第二个存储空间。
首先在接收hash值时,会从BRAM中读取该hash值对应的状态标志位,该状态标志位用于表示当前hash值对应目标链表(数据)的查询状态。如果目标链表(数据)没有被查询,则从DDR中读取与目标hash值映射的目标链表list。之后会遍历该list中的数据,查找是否存在与外部输入的key_len和key一致的KV信息,遍历到最后,查到key_len为0处便可得list中可存储信息的空间地址end_addr。当然,hash对应的存储空间可能由多条list链接形成,这时就需要基于附加链表继续遍历,直至找到写入地址。
当然,如果BRAM中读取该hash值对应的状态标志位指示该hash值正处于查询状态时,也就是hash值对应的链表存储空间正在被查询使用,此时就需要将该hash值缓存若干时钟周期,等待该hash值查询完成后再执行,避免阻塞流水线。
本申请采用状态标志位表示hash值对应目标链表的查询状态,而非选用写入KV对结束反馈作为触发标志,是考虑到DDR的读写延迟以及hash值向后传递本身就产生一定的读写及数据信号传递延迟,这边对BARM中的状态进行提前更新。也就是查询完成后即可进行更新,因为DDR写入KV对到反馈的延迟并不影响后续查询流水。
图2是本申请提供的基于hash计算的KV对快速写架构的设计框图,具体包括hash进程检测模块Hash_process_avoid_conflict、写地址查询模块w_addr_search、状态标志更新模块Hash_bit_updata、块存储器BRAM、双倍速率同步动态随机存储器DDR和BRAM数据控制器Bram_mux_and_ctrl。
hash进程检测模块和状态标志更新模块通过BRAM数据控制器连接BRAM。写地址查询模块分别通过状态标志更新模块和总线桥AXI bridge连接BRAM数据控制器和DDR。BRAM中存储各个hash值的状态标志位,记录hash值对应链表的查询状态。DDR用于读取链表和创建KV对。
hash进程检测模块接收外部输入的hash值,通过从BRAM中读取与hash值对应的状态标志位,并根据其表示的查询状态确定是否存在(查询)进程冲突,以及输出无进程冲突的目标hash值。Hash_process_avoid_conflict具有hash进程冲突检测机制,也就是根据状态标志位bit_mark判断输入的hash值是否存在进程冲突,确定存在冲突时对其缓存,将hash进程检测模块中未与后续处理产生冲突的hash值作为目标hash值输出到下一级w_addr_search。
写地址查询模块级联到hash进程检测模块的下一级,用于根据接收的目标hash值查询在DDR中的目标链表,并根据从DDR中的读取输出确定KV对的写地址,以及生成状态标志更新信号search_end。
状态标志更新模块根据写地址查询模块输出的状态标志更新信号确定写地址查询结果,从写地址查询模块中提取需要更新状态的目标hash值,并基于目标hash值更新对应的状态标志位。
下面针对上述各个模块的具体实现过程以及硬件原理进行详述。
图3是Hash_process_avoid_conflict实现机制的原理架构图。该部分架构包括第一数据选择器Mux1、第一pipe寄存器hash_pipe_1、第一数据状态处理器bram_data_rw1、第一分发器和第一FIFO寄存器hash_using_fifo。hash_using_fifo中缓存有KV对创建所对应的其他hash值,也就是存在进程冲突时缓存的其他hash值。
Mux1接收外部hash输入hash_in和hash_using_fifo,根据hash_in和第一hash_using_fifo中缓存hash值的有效性选通输入到hash_pipe_1中。
在一种可能的实施方式中,Mux1对hash值效性的判断是根据sel信号来选通的,其选通机制为:当只有外部输入的hash_in有效,而hash_using_fifo中缓存hash值无效时,选择hash_in通过;当只有hash_using_fifo中缓存hash值有效,而外部输入的hash_in无效时,选择hash_using_fifo中的hash值通过;当两者同时有效时,则采用轮换机制选通。kv对写入的过程会持续几十至一百多个时钟,采用轮换机制能在一定程度上减轻堵塞,若一直选择fifo中的hash值,会因为该hash值对应的操作状态在短时间内得不到更新而产生流水堵塞,但轮换的前提是hash_using_fifo有一定的空间剩余。
通过Mux1选通后的hash值送入hash_pipe_1,hash_pipe_1为单数据容量的stream型寄存器,且无传输延迟,其目的是为了消除通过Mux1后使用寄存器缓存带来的一拍延迟,从而加快与BRAM的交互。当该pipe左侧的slave段输入有效的数据,如果右侧的master端没准备好接收数据,而pipe内部有位置存储,则slave输入的数据就会缓存在内部;而当右侧的master准备好接收数据,则slave端的数据会立刻发送出去,不会缓存在该pipe内部。简而言之,该pipe类似于一个没有延迟且容量为1的fifo缓存器。
hash_pipe_1输出分别和Bram_mux_and_ctrl、bram_data_rw1及第一分发器连接,用于接收并提取hash值对应状态标志数据的存储地址bram_rw_addr和hash余数hash_index。其中的bram_rw_addr通过Bram_mux_and_ctrl送入BRAM,从BRAM中提取状态标志数据data_out。hash_index送入bram_data_rw1。
此处基于hash值的特点,通过hash函数计算取整即为地址,取余用于提取状态标志位。Bram_mux_and_ctrl是一个集成部分,可以包括bram选择器和控制器。
bram_data_rw1接收hash_index和data_out,并定位其中的状态标志位bit_mark;在确定bit_mark指示目标链表数据未处于查询状态时,改变状态标志数据data_w,然后通过Bram_mux_and_ctrl输入至BRAM。bram_data_rw1的设计是因为BRAM中的数据必须以配置的数据传输宽度为基本单位进行读写,以取回data_out,比如取回32位的数据。考虑到BRAM资源占用,本申请选用1bit数据表示记录的状态标志,所以该bram_data_rw1就需要根据data_out和hash_index定位bit_mark。
在一种可能的实施方式中,采用bit_mark=0低电平表示无进程冲突,1表示存在进程冲突。这样在确定状态标志位是低电平时,将其修改成高电平,占用基于目标hash值的链表查询和KV对创建流水,避免后续流水通道基于相同的hash去进行地址查询和KV对创建。当然在确定该hash值对应进程已存在,就将其缓存。
缓存机制通过第一分发器实现,bit_mark输入第一分发器,根据其状态选择将输出目标hash值hash_out,或将其缓存到hash_using_fifo。hash_using_fifo返回连接Mux1,用于在后续cycle根据sel信号再判断。关于hash的有效和无效实际上正是基于握手协议定义的,该部分并非是本方案首次提出,故对此不作过多解释。
下面举例说明Hash_process_avoid_conflict与BRAM的交互流程实现hash_res的筛选和管理,从而避免后续流水线出现同样的hash值。
假设有两个hash值为37的hash_in顺序进入,当第一个hash_in进入时,若hash_using_fifo是空的,所以Mux1会将hash_in送入hash_pipe_1缓存。hash_pipe_1对hash值进行取整和取余(会基于BRAM的数据访问宽度调整)。假设该处BRAM的数据宽度是32 bits,那么,将hash值37按32进行取整和取余,取整得到的1会作为访问BRAM的读地址bram_rw_addr。该地址会经过Bram_mux_and_ctrl送入BRAM,取出的数据固定为BRAM的数据宽度,也就是32 bits。而hash值经过取余得到的5会作为确认BRAM中对应状态标记位的索引hash_index。基于hash_index就能确定从BRAM返回的32 bits数据data_out中的哪一bit才是对应的状态标记位。假设hash值37是首次进入,那得到的状态标记位bit_mark一定为0,即后续处理通道没有对hash值37进行相关处理。这时,将hash_pipe_1中的hash值通过第一分发器输出到下一级处理(前提是下一级能接收)。输出hash_out的同时,需要将hash值37对应的BRAM中的标记位置为1,对该进程进行占用。
第一个hash值37输出后,第二个为37的hash_in输入Mux_1,因为hash_using_fifo仍然为空,所以仍然选择hash_in并提取data_out检查BRAM中对应的bit_mark,此时对应的bit_mark已经被标记为1,说明后续处理通道中有hash值37存在。这时就需要将第二个hash值37送入hash_using_fifo,用于参加下一轮的选择。
特别需要说明的是,图3中hash_pipe_1的使用消除了传输延迟,而在一些其他实施例中,还可以将其设置为普通优时颜的寄存器或寄存运算单元,将数据寄存到其中需要经过一个或若干cycle后取整取余后送往BRAM取状态标志位,同样可以实现状态检测。在高并发FPGA应用系统中并不比hash_pipe_1相差太多。而hash_using_fifo还可以平替为普通寄存器或寄存器组regs,分发器1连接rege,通过regs连接Mux1,区别在于regs完全按照地址顺序读取数据,而fifo则可以实现先入先出机制,也就是缓存的冲突hash值,按照等待时间取出。但考虑到FPGA并行特性,regs或hash_using_fifo中存储的hash不会太多,对于数据读取写入的等待远小于DDR写数据延迟。
对于bram_data_rw1来说,其作用是抢占hash值的查询流水,后面同样的hash值不再直接取DDR的数据。而状态标志更新模块的作用是更新(恢复)状态标志位,所以Hash_process_avoid_conflict还可以取消bram_data_rw1,而是直接产生一个确认信号发送到Hash_bit_updata,完全由Hash_bit_updata实现标志位置高和置低操作。
在KV对数据量不多的情况下仅需单链即可完成存储,但鉴于hash值对应空间的可存储地址查询不一定查询一条list就能完成,可能需要查询下级链表。因此,需要对二次查询的地址进行管理和再查询,才能在保证处理通道充盈的情况下不丢失数据。如图4所示,是多链查询hash映射的原理图。
在完成对应地址查询后,会基于得到的end_addr和要写入的KV对信息长度来判断当前list是否能存下,若能存下,则将key_len、key、value_addr和value_len打包成数据流,通过字节写的方式写入DDR中,写入的地址可通过hash_in+end_addr(hash对应的固定空间key_space_fix中的链地址)或者next_ list_addr+end_addr(key_space_expand中申请的并非最新的链地址)或者key_space_expand_addr(key_space_expand中申请的最新链地址)得到具体写入的绝对地址。同时,若是申请了新的链空间,需要在旧链的末端位置写入新链的地址,从而完成新旧链的关联。最后,需要将BRAM中对应hash值的状态标记位置为1。这样的设计,就能使得整个KV对的创建流程能以pipeline的模式实现,因为处理通道中不会存在一样的hash值。从而最大程度上利用DDR的带宽资源。
基于这种二次查询机制的原理,本申请设计了对DDR的流水访问中引入二次查询请求的管理机制,图5是w_addr_search实现二次查询机制的原理架构图。该部分架构包括地址查询单元Hash_mux、地址匹配单元Key_comp和第二FIFO寄存器ddr_data_fifo。ddr_data_fifo与Key_comp和AXI bridge连接,用于缓存从DDR中读取的链表数据ddr_read_out并输出到Key_comp。
Hash_mux与AXI bridge及Key_comp连接,用于根据目标hash值向AXI bridge输出对应的链表地址addr_in_ddr。Key_comp通过ddr_data_fifo读取链表数据,查询用于写入KV对的目标地址,并输出状态标志更新信号search_end。
Hash_mux接收第一分发器输出的hash_out后会判断是否需要进行二次查询,也就是读取链表,查询该链表上是否有空位用于KV对信息写入,若不存在时,就需要附加链表写入。
当目标hash值对应单一链表时,地址查询单元输出的链表地址为首链地址。Hash_mux得到的addr_in_ddr通过Axi_bridge从DDR中读取该目标链表对应的链表数据ddr_read_out。而Key_comp则从ddr_data_fifo中读取缓存的ddr_read_out(就是一条list中包含的所有数据),然后根据key_len、key、value_addr和value_len等信息查找KV对写地址。因为单链必然能够定位写地址,所以Key_comp会对应的状态标志更新信号search_end(包含查到的KV对实际写地址)到Hash_mux和Hash_bit_updata,此外,Key_comp还会输出查询结果search_res,用于其他操作。
当目标hash值对应有附加链表时,写地址查询模块执行二次查询,Key_comp向Hash_mux输出附链地址next_list_addr。Hash_mux将next_list_addr(相当于第一次查询的addr_in_ddr)发送至AXI bridge读取附链数据ddr_read_out。Key_comp二次基于读取的附链数据输出查询结果和状态标志更新信号。
对于Hash_mux二次查询阶段,由于hash_out持续输入,若不采用合适的缓存及选择机制,必然导致w_addr_search出现堵塞。对此本申请设计一种用于二次查询缓存机制选择的Hash_mux结构。如图6所示,Hash_mux包括第二数据选择器Mux2、第三数据选择器Mux3、第三FIFO寄存器hash_bram_fifo、第二分发器及第二pipe寄存器hash_pipe_2。第二和第三数据选择器基于输入数据的有效性及优先级选通,hash_bram_fifo连接Mux3和第二分发器,用于缓存选通后的目标hash值,并通过第二分发器向外部分发。
Mux2连接第一分发器和Key_comp的输出,选通输出目标hash值对应的首链地址或next_list_addr,并送入AXI bridge。第二分发器连接Key_comp,基于next_list_addr和search_end从hash_bram_fifo读取缓存的目标hash值,将其分发到hash_pipe_2或Hash_bit_updata。
如图6所示,当Hash_mux执行的是单链查询时,next_list_addr不存在或低电平信号,Mux_2选通hash_out,并输出addr_in_ddr。而对于需要进行二次查询时,第二分发器基于next_list_addr将hash_bram_fifo缓存的hash值分发至hash_pipe_2,用于下一轮选择。因为分发器2基于next_list_addr和search_end控制分发,具体是在next_list_addr有效时分发至hash_pipe_2,在search_end有效时分发至Hash_bit_updata。但next_list_addr只有在进行二次查询时才有效,而search_end只会在确定写地址时才会有效,二者不会出现冲突的情况,所以完全可以控制分发器2的有序输出。
因为Mux2和Mux3以输入数据有效性和优先级判断,当输入Mux2的目标hash值和next_list_addr同时有效时,优先选通next_list_addr,目的是先把需要二次查询的完成后再继续后输入的hash值查询。当输入Mux2的目标hash值和hash_pipe_2中缓存的hash值同时有效时,优先选hash_pipe_2中hash值。在二次查询的时钟周期内,next_list_addr与hash_pipe_2中的是基于同一个hash值产生和缓存,且同时有效,否则同时无效,将hash_bram_fifo缓存的目标hash值分发至Hash_bit_updata。因为首次进入的hash_out被Mux2和Mux3选通后必然会存入hash_bram_fifo,并从DDR查询写地址,在没确定写地址之前不会通过分发器2。当一次查询就确定写地址后,说明无需进行二次查询,此时next_list_addr必然无效,而查询结果search_end有效。
相反的,若一次查询未定位到写地址,也就是需要执行二次查询时,next_list_addr有效,那么即使有新的hash_out输入到Mux_2,Mux_2也会按照优先级选通next_list_addr到DDR进行二次取数据。基于此,在一次查询时分发器2就将缓存在hash_bram_fifo中缓存的hash值分发到hash_pipe_2中,用于Mux3的后续操作。Mux_2优先选择二次查询时因为如果旧hash对应的链没查询完成,又开始新的查询,就可能导致一些缓存旧hash关联信息的fifo溢出,导致整个系统卡死。
在一种可能的实施方式中,Hash_mux中还设置有计数器,计数器基于输入Mux2的目标hash值,以及Key_comp输出的状态标志更新信号search_end计算正在进行地址查询的数量。当接收到新输入的hash值时计数加一,当接收到search_end时计数减一,当寄存器的计数值达到设定阈值时,Mux2选通next_list_addr。这一设计思路同样是考虑系统并行能力,防止fifo溢出的问题。
需要说明的是,送入的hash_out在被Mux2选通后会直接送到Mux3,这边未采用寄存器形式的原因是hash_pipe_2中的数据和next_list_addr的数据是同步有效的(同一个hash产生的相关数据),两个选择器的选择策略都是优先选择它们。对于Mux2而言,next_list_addr和hash_in可能会同时有效。但是对于Mux3而言,只有Mux2选通有效的hash_in后,输入Mux3的值才是有效的。也就是说,输入到Mux3中的hash_out和hash_pipe_2中数据不可能同时有效。
这样处理后,就能保证KV对创建任务不丢失的情况下,工作通道能一直处于充盈的状态,实现DDR读写通道的并行和pipeline。
下面举例说明Hash_mux部分如何对二次查询进行管理,进入该部分的hash_out在经过上级的筛选后不会出现重复的情况。
假设hash_out为37,且没有next_list_addr输入,Mux2选择hash_ in进入后续处理,并对它进行取余得到访问DDR的地址add_in_ddr,同时将该hash值通过Mux3送入hash_bram_fifo暂存,用于在完成该hash值对应的list查询后,重新将该hash值对应的BRAM中的bit_mark置为0。
假设该处仅需使用18 bits的hash值(通过hash函数计算的hash值通常固定为32bits、64bits等),而DDR中每条list的空间大小为256字节,DDR的基地址为0。那么就能得到与该hash值对应的key_space_fix中list的首地址(hash值的低18 bits*256+0)。需要说明的是,基于输入的hash值只能得到key_space_fix(1个hash值只对应该空间的1条list)中的一条list数据,基于next_list_addr才能得到key_sapce_expand中的新增的list数据。
基于地址addr_in_ddr就能取出对应的整条list信息,后面Key_comp就能从该信息中寻找空位地址,用于写入kv对信息。Key_comp模块只会返回两种结果,一种是查完了整条List(得到一个空位地址,并不一定能写下,查询结束,写入的判断交由更后面的模块判断,不在本申请保护范围),后续没有其它list了,会返回search_end;而另外一种结果就是后面还有一条list,此时会返回一个next_list_addr,表明需要二次查询。
当基于hash_out为37的值得到地址并送入后续处理通道后,就能对接下来28的hash_out进行处理。假设这时上一个37的查询结果以及出来了(实际上因为DDR的延迟略大,查询结果需要几十甚至上百个时钟周期才能出来),且需要二次查询,即有next_list_addr进入。同时hash_bram_fifo中的37也会输出至hash_pipe_2缓存,并重新进行选择。而两个选择器的选择对象都是一致的,选择器Mux2的选择机制是二次查询优先。所以这边会先对hash值37对应的第二条list进行查询。
接着,重新对hash值为28的进行相同处理,取整运算输出访问ddr的地址,并将该hash值送入hash_bram_fifo缓存,用于BRAM中对应bit_mark的更新(置0)。cnt_searching在此过程中实时计数正在查询的条目数。
图7是Hash_bit_updata更新bit_mark的结构示意图,该部分结构包括第三pipe寄存器hash_pipe_3和第二数据状态处理器bram_data_rw2。hash_pipe_3输入连接分发器2,用于获取完成查询的目标hash值(hash_end输出)。也就是说,当hash_pipe_3接收到有效的hash_end输出时,说明针对某一目标hash值的查询完成,可以将对应bit_mark更新置0(可以开始向查询到的写地址写入KV数据,或写数据尚未完成)。这一机制可以省略DDR写数据的cycle,提前解除对同一目标hash值的查询流水并执行后续查询工作,让pipeline始终处于并行充盈状态。
hash_pipe_3输出分别和Bram_mux_and_ctrl和bram_data_rw2连接,用于接收并提取hash值对应状态标志数据data_out的存储地址和hash余数,状态标志数据存储地址bram_rw_addr通过Bram_mux_and_ctrl送入BRAM,从BRAM中提取data_out,hash余数送入bram_data_rw2。bram_data_rw2接收hash余数和从BRAM中取出的data_out,定位并更新其中的bit_mark后(data_w)写回BRAM中。
该部分结构还可以将hash_pipe_3修改为regs,因为此处送往BRAM是为了提前更新,而实际上DDR还未开始或未写完KV数据,hash_pipe_3这一无延迟机制和regs并不会影响DDR的操作,主要是因为BRAM的读写操作必须要等到其空闲才可以进行,假设BRAM繁忙时,hash_pipe_3中的数据同样无法立即将bram_rw_addr送入BRAM控制器,其功能完全等同于存在时钟延迟的regs计算单元。
还另一些实施例中,因为确定写地址的动作是由Key_comp模块发出的,并将结果告知Hash_mux,然后才会有hash_end。所以还可以设计Key_comp模块输出search_res的同时,将该信号发送至Hash_bit_updata(hash_pipe_3同时接入hash_end和search_res),由search_res信号触发Hash_bit_updata更新状态标志位。这种触发机制与hash_end的区别在于,前者是通过分发器2主动输出至Hash_bit_updata,而Key_comp模块的search_res信号是触发Hash_bit_updata主动穿透分发器2从hash_bram_fifo中提取hash_end(就是hash值),然后从BRAM中取数据更新。
此处bram_data_rw2和bram_data_rw1的区别在于,bram_data_rw1只能在data_out中bit_mark为0(或表示未被操作)时才进行置1进行占用标记;而bram_data_rw2只能在data_out中bit_mark为1(或表示正在被操作)时才更新置0恢复。
考虑到DDR的读写延迟以及hash值向后传递带来的延迟,这边对BARM中的状态进行提前更新。也就是查询完成后即可进行更新,因为DDR写入KV对到反馈延迟并不影响流水。图7中hash_pipe_3的执行动作基于search_end触发,但因为不能保证Bram是否是空闲的,所以hash_end需要暂存在pipe中。在search_end触发,且Bram空闲后即可提取对应hash值参与计算。
对于bram_data_rw2和bram_data_rw1的内部结构,因为是普通的位运算,所以本申请不作过多赘述。图8示出一种可能实现形式,即采用与门运算实现。例如bram_data_rw1,“11110111”中的“0”是bit_mark,则可以采用和掩码bit_mask和bram_data_out进行与运算,相当于“11110111”与“11111111”进行与运算,得到其他位不变,而bit_mark置1的data_w,bram_data_rw2则刚好相反。
综上所述,本申请提供的基于Hash的KV对快速写架构带来的有益效果包括如下:
1.通过在低延迟的BRAM中引入标记位,将后续处于KV对创建流水线中的hash值筛选成为不重复的值,从而使得设计在并行时不会出现写数据冲突;
2.引入对二次查询的信息管理和再查询机制,并对AXI读写通道并行化处理,通过近乎流水的AXI读写请求,保证读写通道一直保持充盈的状态;
3.使用状态标记位记录hash流水,减少对片上BRAM空间资源的占用;
4.对存在冲突进程采用多级缓存机制,在不影响流水的情况下避免hash值重复,且不影响系统整体写入效率;
5.在不读取DDR的情况下快速知晓流水进程冲突情况,减少对DDR查询次数,大幅减少读取延迟,提高查询写地址和写入KV对效率。
以上对本发明的较佳实施例进行了描述;需要理解的是,本发明并不局限于上述特定实施方式,其中未尽详细描述的设备和结构应该理解为用本领域中的普通方式予以实施;任何熟悉本领域的技术人员,在不脱离本发明技术方案作出许多可能的变动和修饰,或修改为等同变化的等效实施例,这并不影响本发明的实质内容;因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均仍属于本发明技术方案保护的范围内。

Claims (11)

1.一种基于hash计算的KV对快速写架构,其特征在于,所述架构包括hash进程检测模块、写地址查询模块、状态标志更新模块、块存储器BRAM、双倍速率同步动态随机存储器DDR和BRAM数据控制器;所述hash进程检测模块和所述状态标志更新模块通过所述BRAM数据控制器连接所述BRAM;所述写地址查询模块分别通过所述状态标志更新模块和总线桥AXIbridge连接BRAM数据控制器和DDR;BRAM中设置有存储各个hash值状态标志位的存储区,每个所述状态标志位分别用于表示各个hash值对应链表的查询状态;DDR中存储有用于读取链表和创建键值KV对的存储区;
所述hash进程检测模块接收外部输入的hash值,其中设置有缓存进程冲突hash值的寄存器和选通目标hash值的数据选择器;所述hash进程检测模块通过从BRAM中读取与hash值对应的状态标志位确定对应链表的查询状态,当前输入hash值的状态标志位指示对应链表处于查询状态时,说明存在进程冲突,从所述hash进程检测模块输出无进程冲突的目标hash值;当前输入hash值的状态标志位指示对应链表未处于查询状态时,说明不存在进程冲突,直接将输入的hash值输出到所述写地址查询模块;
所述写地址查询模块和所述hash进程检测模块连接,根据接收的目标hash值查询在DDR中的目标链表,并根据从DDR中的读取输出确定KV对的写地址;在确定KV对写地址后生成状态标志更新信号;其中,所述状态标志更新信号是基于确定KV对写地址的动作触发;
所述状态标志更新模块根据所述写地址查询模块输出的所述状态标志更新信号确定写地址查询结果,从所述写地址查询模块中提取需要更新状态的目标hash值,并基于目标hash值更新对应的状态标志位。
2.根据权利要求1所述的基于hash计算的KV对快速写架构,其特征在于,所述hash进程检测模块包括第一数据选择器、第一pipe寄存器、第一数据状态处理器、第一分发器和第一FIFO寄存器;所述第一FIFO寄存器中缓存有KV对创建所对应的其他hash值;所述第一pipe寄存器为单数据容量的stream型寄存器,且无传输延迟;
所述第一数据选择器接收外部hash输入和所述第一FIFO寄存器输出,根据外部hash输入和所述第一FIFO寄存器中其他hash值的有效性选通输入到所述第一pipe寄存器缓存;
所述第一pipe寄存器输出分别和所述BRAM数据控制器、所述第一数据状态处理器及所述第一分发器连接,用于接收并提取hash值对应状态标志数据的存储地址和hash余数,状态标志数据存储地址通过所述BRAM数据控制器送入BRAM,从BRAM中提取状态标志数据,hash余数送入所述第一数据状态处理器;hash值的状态标志位占据状态标志数据的一个bit位;
所述第一数据状态处理器接收hash余数和从BRAM中取出的状态标志数据,并根据hash余数定位其中的状态标志位;在确定状态标志位指示KV对处于未创建状态时改变状态标志数据,并通过所述BRAM数据控制器输入至BRAM;
所述第一分发器连接所述第一数据状态处理器,用于接收所述第一数据状态处理器输出的状态标志位,根据状态标志位确定当前hash值的查询状态。
3.根据权利要求2所述的基于hash计算的KV对快速写架构,其特征在于,所述第一分发器还连接所述第一pipe寄存器;若当前hash值已完成查询或KV对创建,将当前hash值从所述第一pipe寄存器中取出,并分发至所述第一FIFO寄存器;若当前hash值未完成查询,则直接从所述第一pipe寄存器中取出寄存的目标hash值并输出至所述写地址查询模块。
4.根据权利要求3所述的基于hash计算的KV对快速写架构,其特征在于,所述写地址查询模块包括地址查询单元、地址匹配单元和第二FIFO寄存器;所述第二FIFO寄存器与所述地址匹配单元和AXI bridge连接,用于缓存从DDR中读取的链表数据并输出到所述地址匹配单元;
所述地址查询单元与AXI bridge及所述地址匹配单元连接,用于根据目标hash值向AXI bridge输出对应的链表地址;
所述地址匹配单元通过所述第二FIFO寄存器读取链表数据,查询用于写入KV对的目标地址,并输出所述状态标志更新信号。
5.根据权利要求4所述的基于hash计算的KV对快速写架构,其特征在于,当目标hash值对应单一链表时,所述地址查询单元输出的链表地址为首链地址;
当目标hash值对应有附加链表时执行二次查询,所述地址匹配单元向所述地址查询单元输出附链地址;所述地址查询单元基于附链地址发送至AXI bridge读取附链数据;所述地址匹配单元基于读取的附链数据输出查询结果和所述状态标志更新信号。
6.根据权利要求5所述的基于hash计算的KV对快速写架构,其特征在于, 所述地址查询单元包括第二数据选择器、第三数据选择器、第三FIFO寄存器、第二分发器及第二pipe寄存器;所述第二和第三数据选择器基于输入数据的有效性及优先级选通,所述第三FIFO寄存器连接所述第三数据选择器和所述第二分发器,用于缓存选通后的目标hash值,并通过所述第二分发器向外部分发;
所述第二数据选择器连接所述第一分发器和所述地址匹配单元,选通输出目标hash值对应的直接地址或附链地址,并送入AXI bridge;
所述第二分发器连接所述地址匹配单元,基于附链地址和所述状态标志更新信号从所述第三FIFO寄存器读取缓存的目标hash值,将其分发到所述第二pipe寄存器或所述状态标志更新模块。
7.根据权利要求6所述的基于hash计算的KV对快速写架构,其特征在于,进行二次查询时,所述第二分发器基于附链地址将所述第三FIFO寄存器缓存的hash值分发至所述第二pipe寄存器;
当输入所述第二数据选择器的目标hash值和附链地址同时有效时,优先选通附链地址;当输入所述第三数据选择器的目标hash值和所述第二pipe寄存器中缓存的hash值同时有效时,优先选通所述第二pipe寄存器中hash值;
当所述第二分发器接收到二次查询的附链地址时,将所述第三FIFO寄存器读取缓存的目标hash值分发至所述第二pipe寄存器;当所述第二分发器接收到所述状态标志更新信号时,将目标hash值分发至所述状态标志更新模块。
8.根据权利要求6所述的基于hash计算的KV对快速写架构,其特征在于,所述地址查询单元还包括计数器,计数器基于输入所述第二数据选择器的目标hash值,以及所述地址匹配单元输出的所述状态标志更新信号计算正在进行地址查询的数量;当接收到新输入的hash值时计数加一,当接收到状态标志更新信号时计数减一;当寄存器的计数值达到设定阈值时,所述第二数据选择器选通附链地址。
9.根据权利要求6所述的基于hash计算的KV对快速写架构,其特征在于,所述状态标志更新模块包括第三pipe寄存器和第二数据状态处理器;所述第三pipe寄存器连接所述地址匹配单元和所述第二分发器,分别用于获取完成查询的目标hash值和接收所述状态标志更新信号;
所述第三pipe寄存器输出分别和所述BRAM数据控制器和所述第二数据状态处理器连接,用于接收并提取hash值对应状态标志数据的存储地址和hash余数,状态标志数据存储地址通过所述BRAM数据控制器送入BRAM,从BRAM中提取状态标志数据,hash余数送入所述第二数据状态处理器;
所述第二数据状态处理器接收hash余数和从BRAM中取出的状态标志数据,定位并更新其中的状态标志位后写回BRAM中。
10.根据权利要求2或9所述的基于hash计算的KV对快速写架构,其特征在于,当hash值对应的状态标志位是低电平0时,指示不存在或已完成KV对查询进程;当hash值对应的状态标志位是高电平1时,指示正进行KV对查询创建进程。
11.根据权利要求9所述的基于hash计算的KV对快速写架构,其特征在于,所述第一数据状态处理器获取当前hash值对应的状态标志数据,在状态标志位是低电平时,将其修改成高电平,占用基于目标hash值的链表查询和KV对创建流水;所述第二数据状态处理器获取当前hash值对应的状态标志位,将高电平的状态标志位更新为低电平,解除基于目标hash值的查询和KV对创建流水。
CN202310735885.9A 2023-06-21 2023-06-21 基于hash计算的KV对快速写架构 Active CN116483739B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310735885.9A CN116483739B (zh) 2023-06-21 2023-06-21 基于hash计算的KV对快速写架构

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310735885.9A CN116483739B (zh) 2023-06-21 2023-06-21 基于hash计算的KV对快速写架构

Publications (2)

Publication Number Publication Date
CN116483739A CN116483739A (zh) 2023-07-25
CN116483739B true CN116483739B (zh) 2023-08-25

Family

ID=87212229

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310735885.9A Active CN116483739B (zh) 2023-06-21 2023-06-21 基于hash计算的KV对快速写架构

Country Status (1)

Country Link
CN (1) CN116483739B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104348913A (zh) * 2014-10-28 2015-02-11 浪潮电子信息产业股份有限公司 一种紧耦合可扩展的大数据交互方法
CN107330047A (zh) * 2017-06-28 2017-11-07 华信塞姆(成都)科技有限公司 一种基于完美哈希算法的fpga训练及查询电路实现方法
CN114222979A (zh) * 2019-09-18 2022-03-22 赛灵思公司 跟踪可编程设备的状态

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10496283B2 (en) * 2016-01-22 2019-12-03 Suraj Prabhakar WAGHULDE Adaptive prefix tree based order partitioned data storage system

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104348913A (zh) * 2014-10-28 2015-02-11 浪潮电子信息产业股份有限公司 一种紧耦合可扩展的大数据交互方法
CN107330047A (zh) * 2017-06-28 2017-11-07 华信塞姆(成都)科技有限公司 一种基于完美哈希算法的fpga训练及查询电路实现方法
CN114222979A (zh) * 2019-09-18 2022-03-22 赛灵思公司 跟踪可编程设备的状态

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于SSD的Key-Value系统优化设计与实现;刘峪竹;肖侬;刘芳;陈志广;唐黎哲;;计算机研究与发展(第S1期);全文 *

Also Published As

Publication number Publication date
CN116483739A (zh) 2023-07-25

Similar Documents

Publication Publication Date Title
US10198363B2 (en) Reducing data I/O using in-memory data structures
US8321385B2 (en) Hash processing in a network communications processor architecture
JP6356675B2 (ja) 集約/グループ化動作:ハッシュテーブル法のハードウェア実装
US9218290B2 (en) Data caching in a network communications processor architecture
US9183145B2 (en) Data caching in a network communications processor architecture
US7558925B2 (en) Selective replication of data structures
US8407707B2 (en) Task queuing in a network communications processor architecture
US9154442B2 (en) Concurrent linked-list traversal for real-time hash processing in multi-core, multi-thread network processors
US8539199B2 (en) Hash processing in a network communications processor architecture
CN110808910B (zh) 一种支持QoS的OpenFlow流表节能存储架构及其方法
US9871727B2 (en) Routing lookup method and device and method for constructing B-tree structure
JP2018045700A (ja) ネットワークプロセッサにおけるマルチコア相互接続
JPH04308956A (ja) 受信バッファ
CN110069431B (zh) 基于RDMA和HTM的弹性Key-Value键值对数据存储方法
CN110377531B (zh) 基于日志结构的持久性内存存储引擎装置及控制方法
JPH1185710A (ja) サーバ装置およびファイル管理方法
US9152564B2 (en) Early cache eviction in a multi-flow network processor architecture
US7293158B2 (en) Systems and methods for implementing counters in a network processor with cost effective memory
CN107562806B (zh) 混合内存文件系统的自适应感知加速方法及系统
CN111406251A (zh) 数据预取方法及装置
CN116560562A (zh) 一种读、写数据方法及装置
CN116483739B (zh) 基于hash计算的KV对快速写架构
JPH07239808A (ja) 分散データ管理方式
CN114390069B (zh) 基于分布式缓存的数据访问方法与系统、设备及存储介质
JP3301359B2 (ja) リスト管理システム、方法及び記憶媒体

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant