0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

hash算法在FPGA中的实现(2)

CHANBAEK 来源: FPGA的现今未 作者: FPGA的现今未 2023-09-07 17:02 次阅读

在前面的文章中:hash算法FPGA中的实现(一)——hash表的组建,记录了关于hash表的构建,这里记录另外一个话题,就是hash链表。我们知道,只要有hash的地方,就一定有冲突,关键就看如何解决冲突了。这里介绍两种常见的设计hash链表的方案。当然,解决hash冲突也不一定就要用链表的方法,还有其他方案。

hash链表说明

首先说下什么hash链表?还是借用上一篇文章中的图片来说明这个问题,如下图所示。hash链表是为了解决hash冲突而建立的一种数据结构。当某个key计算出hash值后,对应的hash桶中已经有了数据,出现了冲突,那这个时候就需要用一个链表来将具体相同hash值的key“链”起来,方便后续的查询。

图片

图中关于hash链表的示意,只是一种简单的表示,在FPGA的实际设计中,情况往往要复杂得多。

方案1——DDR

有的时候,我们并不知道链表到底会有多长,那么自然地会想到用DDR来存放链表。如何在DDR里组织数据结构呢?一般来讲,hash链表的数据结构如下:

图片

hash桶中除了上文所讲的数据结构外,还有一个下一链的地址addr1,它指向链表的一个节点,该链表节点的数据结构和hash桶类似,也包括key值和地址,如图中key A和addr2,对于由addr2指向的最后一链,只有key B和最后一链标记NULL。

这样的数据结构,在DDR中存放的时候,显然是不高效的。因为每处理一次hash,有多少个链表节点就要读多少次DDR。我们知道DDR的性能有2个指标,一个是Gbps,一个是Mpps。处理一次hash时读DDR的次数越多,处理的hash次数就会越少,性能就越低,所以我们优化链表的数据结构,降低对DDR的读取次数。

优化的思路和hash桶的数据结构类似,如下图所示:

图片

在一个节点中,不再只存放一个key,上图示例是存放了5个key。实际一次DDR的读写,可能最少是128byte或者256byte,以104bit的五元组为key来计算,可以存放9个key。一次可以读取N个key,相比以前的链表方案,读DDR的次数为原来的N分之一,性能提升N倍。

将这个话题继续引申下,如果hash桶存放在DDR中,那又如何构建hash表呢?如果真的需要把hash桶存放在DDR中,hash表的构建和hash链表的构建就是完全一模一样的了。

方案二——内部RAM

如果考虑所有的冲突次数在一定范围之内,那么可以把所有的链表存放在一起,即存放在一个内部的RAM中,实现对所有hash桶的链表管理。如下图所示:

图片

以4个hash桶为例子说明链表的管理,key1的hash值为0,落入到hash桶0,因此时hash桶中的指针指向地址0,即addr0,addr0为空,即可以写入key1在地址0中。同样key2的hash值也为0,由于addr0中已经有数据,此时addr1为空,因此将key2写入addr1中,同时把addr1写入key1中的下一链,完成链表的构建。

其他的key值大家可以自行推敲演练。采用这样的方案,所有的链表都存放在一个ram中,处理冲突的次数是有限的,相比DDR的方案,还是简单一些。

总结

关于上述2种方案,这里做一个简单的总结。

DDR链表内部RAM链表
应用场景万能场景,使用无限制
冲突次数无限制,只要ddr有足够空间对总体冲突次数(RAM的深度)有限制,超过后hash表无法写入,或者需要定期老化
实现难易程度相对复杂,涉及到DDR的读改写操作相对简单,但是也要实现对RAM的读改写操作,
性能低,需要串行读DDR,链表越长,性能越低高,虽然相比DDR链表性能高,同样也是链表越长,性能越低。

不管采用哪种方案,高效地组建表项,减少对hash表和链表的访问次数是hash处理性能的关键。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593275
  • DDR
    DDR
    +关注

    关注

    9

    文章

    677

    浏览量

    64255
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7362
  • 链表
    +关注

    关注

    0

    文章

    80

    浏览量

    10464
收藏 人收藏

    评论

    相关推荐

    应用于LTE-OFDM系统的Viterbi译码FPGA实现

    一种FPGA实现的基于软判决的Viterbi译码算法,并以一个(2,1,2)、回溯深度为10
    发表于 09-19 09:41

    FFT算法FPGA实现

    信号处理,FFT占有很重要的位置,其运算时间影响整个系统的性能。传统的实现方法速度很慢,难以满足信号处理的实时性要求。针对这个问题,本文研究了基于FPGA芯片的FFT
    发表于 05-28 13:38

    求助-FPGA实现retinex算法

    求助大神,FPGA实现retinex算法 。。。
    发表于 05-08 23:29

    FPGA实现PID算法

    本帖最后由 发烧友LV 于 2014-12-29 20:13 编辑 FPGA实现PID算法,面临着小数的计算,请问大家一般是怎么处
    发表于 12-03 21:59

    基于FPGA的多路回声消除算法实现

    基于FPGA的多路回声消除算法实现中文期刊文章作  者:尹邦政 朱静 毛茅作者机构:[1]广州广哈通信股份有限公司,广东广州510663;[2]广州大学实验中心,广东广州510006
    发表于 05-08 10:23

    怎么spartan 3AN fpga实现遗传算法

    我正在做我的遗传算法项目,有没有办法斯巴达3AN fpga实现遗传算法,如果没有建议我一些方
    发表于 04-03 13:16

    实用AGC算法的工作原理及音频FPGA的应用

    放大调整后,确保了通信系统信号输出的幅度可基本维持恒定的状态。文中将AGC算法应用于音频信号处理,可实现FPGA,并可有效降低音频信号输
    发表于 10-21 16:42

    基于Hash和二叉树的路由表查找算法

    基于Hash和二叉树的路由表查找算法 :提出了一种基于Hash和二又树的路由表查找算法,这一算法可以满足()C-768的转发要求,支持超过
    发表于 02-22 17:06 35次下载

    hash表的实现原理

    软件开发中,一个hash表相当于把n个key随机放入到b个bucket中,以实现n个数据在b个单位空间的存储。 我们发现hash表中存在一些有趣现象: hash表中key的分布规律 当
    发表于 09-28 14:31 0次下载
    <b class='flag-5'>hash</b>表的<b class='flag-5'>实现</b>原理

    基于SHA-1算法的硬件设计及实现FPGA实现

    算法进行深入研究,面向Xilinx K7 410T FPGA 芯片设计SHA-1算法实现结构,完成SHA-1算法编程,进行测试和后续应用。该
    发表于 10-30 16:25 4次下载
    基于SHA-1<b class='flag-5'>算法</b>的硬件设计及<b class='flag-5'>实现</b>(<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>)

    Hash算法简介

    区块Hash值时(即挖矿的过程),都使用了Hash算法,特别是SHA256算法。比特币系统本身也就是加密算法的衍生物。
    的头像 发表于 06-08 14:01 4786次阅读

    hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解

    由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash
    的头像 发表于 06-03 17:34 2979次阅读
    从<b class='flag-5'>hash</b><b class='flag-5'>算法</b>的原理和实际应用等几个角度,对<b class='flag-5'>hash</b><b class='flag-5'>算法</b>进行一个讲解

    hash算法FPGA中的实现(1)

    FPGA的设计中,尤其是在通信领域,经常会遇到hash算法实现hash算法
    的头像 发表于 09-07 17:01 607次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>实现</b>(1)

    hash算法FPGA中的实现(3)

    在前面的文章中主要介绍了hash表及其链表的结构,同时说明了如何读取表项。那表项是如何写入的了?前期的文章中有少量的提及,这里单独写一篇,介绍两种常见的方案。
    的头像 发表于 09-07 17:02 402次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>实现</b>(3)

    hash算法FPGA中的实现(4)

    在前面的文章中主要介绍了hash表及其链表的结构,以及key值的插入方法,既然有key值的插入,那就有key值的删除,一种删除是CPU通过重新刷新链表来删除,另外一种就是FPGA删除了,这里主要讨论FPGA如何删除链表。
    的头像 发表于 09-07 17:03 404次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在<b class='flag-5'>FPGA</b>中的<b class='flag-5'>实现</b>(4)