0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

hash算法在FPGA中的實(shí)現(xiàn)(1)

CHANBAEK ? 來(lái)源: FPGA的現(xiàn)今未 ? 作者: FPGA的現(xiàn)今未 ? 2023-09-07 17:01 ? 次閱讀

FPGA的設(shè)計(jì)中,尤其是在通信領(lǐng)域,經(jīng)常會(huì)遇到hash算法的實(shí)現(xiàn)。hash算法在FPGA的設(shè)計(jì)中,它主要包括2個(gè)部分,第一個(gè)就是如何選擇一個(gè)好的hash函數(shù),減少碰撞;第二個(gè)就是如何管理hash表。本文不討論hash算法本身,僅說(shuō)明hash表的管理。

原理

先對(duì)齊本文中要說(shuō)明的幾個(gè)概況,如下圖所示,hash函數(shù)的輸入稱(chēng)為key,hash函數(shù)的輸出,稱(chēng)為hash值,或者index。以上稱(chēng)呼可能不標(biāo)準(zhǔn),但是不影響對(duì)方案的理解即可。

圖片

hash算法的實(shí)現(xiàn)可以用一個(gè)很簡(jiǎn)單的圖來(lái)表示,如下圖所示,對(duì)輸入的key做hash運(yùn)算后,得到index,以index作為地址,把key值存入到其index對(duì)應(yīng)的hash表中。同理,在查詢的時(shí)候,也是先對(duì)key計(jì)算hash值,然后查hash表,如果hash表無(wú)效,說(shuō)明沒(méi)有命中,如果有效,則判斷hash表中的key和輸入的key是否相等,相等則為命中。

圖片

舉2個(gè)例子簡(jiǎn)單說(shuō)明下,假定key5,計(jì)算出index = 0,但是add0為空,所以key5沒(méi)有命中,或者說(shuō),hash表中沒(méi)有key5這個(gè)元素。假定key6,計(jì)算hash后得到index = 3,hash表addr3中有數(shù)據(jù),但是存放在addr3中的數(shù)據(jù)為key4,不等于key6,所以key6也沒(méi)有命中。

hash表構(gòu)建

上圖hash表的示意圖其實(shí)已經(jīng)說(shuō)明了一個(gè)簡(jiǎn)單的hash表的構(gòu)建,在FPGA內(nèi)部,常用BRAM來(lái)存放一個(gè)hash表,上圖所示hash表的深度為N,每個(gè)hash表中存放一個(gè)key。假如key的位寬為50個(gè)bit,hash后的index位寬為9bit。那么hash表就需要一個(gè)64bit*512表項(xiàng),消耗1個(gè)M36K(以xilinx的資源為例)。

但是事情肯定沒(méi)有這么簡(jiǎn)單,因?yàn)橹灰衕ash的地方就有沖突。那么下一步就是要解決hash沖突的問(wèn)題。

解決hash沖突最常見(jiàn)的方案就是hash鏈表,如下圖所示,key1、key5、key7具有相同的hash值,可以通過(guò)一個(gè)鏈表的形式將他們串聯(lián)在一起。這種方案在軟件是可能是非常好實(shí)現(xiàn)的,但是在FPGA里實(shí)現(xiàn)可能就比較難了,比如鏈表的最大深度為多少呢?每個(gè)hash桶的鏈表是單獨(dú)存放還是所有的存放在一起呢?

圖片

我們知道一個(gè)好的hash函數(shù),應(yīng)該是要盡可能地減少?zèng)_突的。如果從算法上我們證明了,我們的沖突最多不超過(guò)4次,那就有更加簡(jiǎn)單的方案來(lái)實(shí)現(xiàn)這個(gè)hash表了。

我們把hash表做一個(gè)改進(jìn),如下圖所示,我們每個(gè)hash桶中,不再是存放一個(gè)key,而是最多存放4個(gè)key,也就是不用鏈表來(lái)解決hash沖突問(wèn)題。

圖片

這樣做的好處有2個(gè),一個(gè)是沒(méi)有了對(duì)鏈表的處理,比較簡(jiǎn)單,第二個(gè)就是處理速度快,一次讀操作就把具有相同hash值的所有key值全部讀出來(lái)進(jìn)行比較。那這種方案在FPGA的ram中如何實(shí)現(xiàn)呢?還是以key的寬度為50bit,index的位寬為9bit為例。

一個(gè)桶的內(nèi)部結(jié)果如下圖所示,每個(gè)key還需要1bit指示是否有效,那么4個(gè)key需要514 = 204bit,用一個(gè)216bit512的BRAM即可,消耗2.5個(gè)M36K。

圖片

如果key的位寬非常大,比如是五元組,一共104bit,如果用上述的方案,那就是105*4 = 420bit,那就需要6個(gè)M36K來(lái)存放。可見(jiàn),key的位寬越大,消耗的資源就越多。

hash表的優(yōu)化

如果我的設(shè)計(jì),要的就是速度,對(duì)資源的消耗不是很關(guān)系,那用上述的結(jié)構(gòu)即可,如果我的設(shè)計(jì)可以犧牲一點(diǎn)點(diǎn)性能,但是需要減少資源的消耗,怎么辦呢?

我們可以把hash桶的內(nèi)部結(jié)構(gòu)修改下,由拼位寬改成拼深度,如下圖所示:

圖片

分別以50bit和104bit的key為例,對(duì)于50bit的key,需要的存儲(chǔ)為64bit5124,需要4個(gè)M36K。對(duì)于104bit的key,需要的存儲(chǔ)為108bit5124,需要6塊??此菩枰木彺娌](méi)有減少,有的情況下甚至增加了。

如果hash值是8bit了,那情況就不一樣了。因?yàn)閔ash值為8bit和9bit的時(shí)候,BRAM的深度的增加,并沒(méi)有帶來(lái)額外的資源消耗,但是表項(xiàng)的寬度卻只有原來(lái)的一半,資源也就可以減少一半。比如原來(lái)hash表位 288bit256,需要消耗4個(gè)M36K,采用上述的優(yōu)化方案后,表項(xiàng)變成144512,只需要消耗2個(gè)M36K。

除了上述的對(duì)hash桶的改進(jìn)外,有時(shí)候可以同時(shí)拼寬度和深度,如下圖所示:

圖片

總結(jié)

hash表的設(shè)計(jì),需要兼顧資源和性能問(wèn)題。主要的考慮點(diǎn)就是充分利用BRAM 的特性來(lái)實(shí)現(xiàn)資源和性能的平衡。

圖片

當(dāng)然,hash表也可以不放在BRAM中,存放在DDR里,那就演變成另外一個(gè)話題,如何高效地讀寫(xiě)DDR中的hash表了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21620

    瀏覽量

    601238
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5949

    瀏覽量

    135783
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • Hash算法
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    7379
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA物聯(lián)網(wǎng)的應(yīng)用前景

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)物聯(lián)網(wǎng)的應(yīng)用前景非常廣闊,其高度的靈活性和可編程性使其成為物聯(lián)網(wǎng)應(yīng)用不可或缺的核心組件。以下是對(duì)FPGA
    的頭像 發(fā)表于 10-25 09:22 ?252次閱讀

    FPGA圖像處理領(lǐng)域的優(yōu)勢(shì)有哪些?

    單元和可編程互聯(lián)線,可以實(shí)現(xiàn)高度并行的數(shù)據(jù)處理。圖像處理任務(wù),如圖像預(yù)處理、特征提取和圖像識(shí)別等,需要大量的計(jì)算任務(wù)。FPGA可以通過(guò)并行處理技術(shù),將這些任務(wù)同時(shí)執(zhí)行,從而大大提高
    發(fā)表于 10-09 14:36

    為什么FPGA屬于硬件,還需要搞算法

    嗎?單純搞算 法就行了嗎?一臉懵求解答。 A:FPGA 屬于硬件,但其功能的實(shí)現(xiàn)離不開(kāi)算法FPGA 雖然是硬件,但它具有可編程性,要
    發(fā)表于 09-09 16:54

    如何在FPGA實(shí)現(xiàn)按鍵消抖

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)實(shí)現(xiàn)按鍵消抖是一個(gè)重要的設(shè)計(jì)環(huán)節(jié),特別是處理用戶輸入時(shí),由于物理按鍵的機(jī)械特性和電氣特性,按鍵在按下和釋放
    的頭像 發(fā)表于 08-19 18:15 ?1260次閱讀

    FPGA自動(dòng)駕駛領(lǐng)域有哪些應(yīng)用?

    FPGA自動(dòng)駕駛領(lǐng)域的主要應(yīng)用: 一、感知算法加速 圖像處理:自動(dòng)駕駛需要通過(guò)攝像頭獲取并識(shí)別道路信息和行駛環(huán)境,這涉及到大量的圖像處理任務(wù)。
    發(fā)表于 07-29 17:09

    FPGA人工智能的應(yīng)用有哪些?

    和安全的云計(jì)算和網(wǎng)絡(luò)服務(wù)。 三、具體應(yīng)用場(chǎng)景 圖像分類(lèi):圖像分類(lèi)任務(wù),FPGA可以承擔(dān)前置處理、圖像卷積、全連接等任務(wù)。通過(guò)FPGA的并行計(jì)算能力,可以大幅提高
    發(fā)表于 07-29 17:05

    如何在FPGA實(shí)現(xiàn)狀態(tài)機(jī)

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)實(shí)現(xiàn)狀態(tài)機(jī)是一種常見(jiàn)的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動(dòng)作和新的狀態(tài)。這里,我們將詳細(xì)探討如何在
    的頭像 發(fā)表于 07-18 15:57 ?429次閱讀

    FPGA實(shí)現(xiàn)什么樣的算法?

    FPGA功能如此強(qiáng)大,請(qǐng)問(wèn)用FPGA實(shí)現(xiàn)或者比較適合實(shí)現(xiàn)什么樣的算法
    發(fā)表于 05-26 20:18

    STM32F439的HASH模塊DMA傳輸計(jì)算問(wèn)題求解

    項(xiàng)目中需要使用439的的HASH模塊計(jì)算文件的MD5值,使用的DMA方式,為了提高CPU效率,讓其他任務(wù)DMA傳輸數(shù)據(jù)、硬件計(jì)算MD5期間可以得到運(yùn)行,DMA的數(shù)據(jù)來(lái)自FMC外擴(kuò)的SDRAM
    發(fā)表于 04-19 06:42

    中國(guó)鐵路網(wǎng)的Dijkstra算法實(shí)現(xiàn)案例

    該項(xiàng)目分別在DE1-SOC開(kāi)發(fā)板的FPGA和HPS上實(shí)現(xiàn)了Dijkstra算法,能在中國(guó)鐵路網(wǎng)中找到兩站之間的最短距離和路線。
    的頭像 發(fā)表于 04-09 11:10 ?486次閱讀
    中國(guó)鐵路網(wǎng)的Dijkstra<b class='flag-5'>算法</b><b class='flag-5'>實(shí)現(xiàn)</b>案例

    怎么用FPGA算法 如何在FPGA實(shí)現(xiàn)最大公約數(shù)算法

    FPGA算法的優(yōu)點(diǎn)在于它們可以提供高度的定制化和靈活性,使得算法可以根據(jù)實(shí)際需求進(jìn)行優(yōu)化和調(diào)整。此外,FPGA還可以實(shí)現(xiàn)硬件加速,提供比傳統(tǒng)
    的頭像 發(fā)表于 01-15 16:03 ?1900次閱讀

    FPGA圖像處理之CLAHE算法

    FPGA圖像處理--CLAHE算法(一)中介紹了為啥要用CLAHE算法來(lái)做圖像增強(qiáng)。
    的頭像 發(fā)表于 01-04 12:23 ?2330次閱讀
    <b class='flag-5'>FPGA</b>圖像處理之CLAHE<b class='flag-5'>算法</b>

    浮點(diǎn)LMS算法FPGA實(shí)現(xiàn)

    運(yùn)算的運(yùn)算步驟遠(yuǎn)比定點(diǎn)運(yùn)算繁瑣,運(yùn)算速度慢且所需硬件資源大大增加,因此基于浮點(diǎn)運(yùn)算的LMS算法的硬件實(shí)現(xiàn)一直以來(lái)是學(xué)者們研究的難點(diǎn)和熱點(diǎn)。 本文正是基于這種高效結(jié)構(gòu)的多輸入FPA,FPGA
    的頭像 發(fā)表于 12-21 16:40 ?700次閱讀

    fpga布局布線算法加速

    現(xiàn)代電子設(shè)備,針對(duì)復(fù)雜的數(shù)字電路,FPGA(Field-Programmable Gate Array)是一種非常優(yōu)秀的可編程邏輯器件。FPGA的設(shè)計(jì)過(guò)程
    的頭像 發(fā)表于 12-20 09:55 ?742次閱讀

    redis hash底層實(shí)現(xiàn)原理

    Redis是一個(gè)開(kāi)源的內(nèi)存數(shù)據(jù)庫(kù),使用鍵值對(duì)存儲(chǔ)數(shù)據(jù)。其中,Redis的數(shù)據(jù)結(jié)構(gòu)之一就是哈希(Hash),它提供了一種將多個(gè)字段(Field)存儲(chǔ)一個(gè)鍵(Key)的方法。那么Re
    的頭像 發(fā)表于 12-04 16:27 ?544次閱讀