概括地說,本發(fā)明實(shí)施例涉及分組處理,具體地說,涉及用于分組處理中的查找的哈希表。
背景技術(shù):
在分組處理芯片中,可以將分組信息(例如,來自分組報頭(header)的元數(shù)據(jù))用作在查找表中查找分組處理信息的鍵。該分組處理信息用于分組轉(zhuǎn)發(fā)和/或分類。例如,該鍵用于在轉(zhuǎn)發(fā)表中查找轉(zhuǎn)發(fā)信息。該查找表(例如,轉(zhuǎn)發(fā)表)被劃分為多個槽(slot)。每個槽可以有多個單元格(cell)用于存儲相應(yīng)的沖突元素。每個沖突元素存儲針對相應(yīng)鍵的分組處理信息以及該鍵本身。使用哈希函數(shù)h(k)來對槽進(jìn)行索引,其中k是鍵。由于哈希函數(shù)將多個鍵映射到同一個槽,所以在每個槽中包括有多個沖突元素。為了搜索針對特定鍵k的分組處理信息,可以讀取具有索引h(k)的槽中的沖突元素,并且將該沖突元素中存儲的鍵值與k比較。相匹配指示了匹配的沖突元素存儲針對k的分組處理信息。
可以通過增加每一槽的單元格數(shù)量并且因此增加沖突元素數(shù)量來提高該查找表(例如,轉(zhuǎn)發(fā)表)的使用率:成功查找的可能性隨著每一槽的沖突元素的數(shù)量的增加而增加。然而,增加每一槽的單元格數(shù)量會增加執(zhí)行查找時要從一個槽中讀取的數(shù)據(jù)量,這增加了用于處理分組的時延。增加的時延導(dǎo)致降低的性能。
因此,需要限制存儲器訪問然而提供高使用率的分組處理查找技術(shù)。
技術(shù)實(shí)現(xiàn)要素:
在一些實(shí)施例中,分組處理方法包括使用根據(jù)與分組相關(guān)聯(lián)的信息構(gòu)造的鍵來生成第一哈希值和第二哈希值。從第一表中的槽中的單元格讀取塊編號,其中,所述第一表中的所述槽是由所述第一哈希值來索引的,并且所述單元格是由所述第二哈希值來索引的。執(zhí)行針對第二表中的槽中的塊的存儲器訪問操作以便從所述塊讀取包括所述分組的分組處理信息的數(shù)據(jù)。所述第二表中的所述槽是由所述第一哈希值來索引的,并且所述塊是由所述塊編號來索引的。所述分組是根據(jù)所述分組處理信息來處理的。
在一些實(shí)施例中,維護(hù)用于分組處理的查找表的方法包括創(chuàng)建第一表,所述第一表被劃分為第一批多個槽,以及創(chuàng)建第二表,所述第二表被劃分為第二批多個槽。所述第一批多個槽中的每一個槽被劃分為多個單元格。所述第二批多個槽中的每一個槽被劃分為多個塊。使用鍵來生成第一哈希值和第二哈希值。將該鍵和與該鍵值相關(guān)聯(lián)的分組處理信息存儲在所述第二表中的相應(yīng)槽中的相應(yīng)塊中,其中,所述第二表中的所述相應(yīng)槽是由所述第一哈希值來索引的,并且所述相應(yīng)塊是由塊編號來索引的。將所述塊編號存儲在所述第一表中的相應(yīng)槽中的相應(yīng)單元格中,其中,所述第一表中的所述相應(yīng)槽是由所述第一哈希值來索引的,并且所述第一表中的所述相應(yīng)槽中的所述相應(yīng)單元格是由所述第二哈希值來索引的。
在一些實(shí)施例中,分組處理系統(tǒng)包括哈希模塊,其用于使用根據(jù)與分組相關(guān)聯(lián)的信息構(gòu)造的鍵來生成第一哈希值和第二哈希值。該分組處理系統(tǒng)還包括表訪問模塊,其用于從第一表中的槽中的單元格讀取塊編號,以及執(zhí)行針對第二表中的槽中的塊的存儲器訪問以便從所述塊讀取包括分組處理信息的數(shù)據(jù)。所述第一表中的所述槽是由所述第一哈希值來索引的,并且所述單元格是由所述第二哈希值來索引的。所述第二表中的所述槽是由所述第一哈希值來索引的,并且所述塊是由所述塊編號來索引的。所述分組處理系統(tǒng)還包括分組處理模塊,其用于根據(jù)從所述塊讀取的分組處理信息來處理所述分組。
附圖說明
本發(fā)明實(shí)施例是以舉例說明的方式示出的并且并不意在受到附圖的限制。
圖1是根據(jù)一些實(shí)施例的用于處理分組的系統(tǒng)的框圖。
圖2A是根據(jù)一些實(shí)施例的哈希表和相應(yīng)的存根表的框圖。
圖2B示出了根據(jù)一些實(shí)施例的圖2A的哈希表中的塊。
圖3是示出了根據(jù)一些實(shí)施例的具有兩個相應(yīng)的存根表的兩個哈希表的框圖。
圖4A和圖4B示出了根據(jù)一些實(shí)施例的處理分組的方法的流程圖。
圖5A和圖5B示出了根據(jù)一些實(shí)施例的維護(hù)查找表的方法的流程圖。
貫穿整個附圖和本描述中相同的附圖標(biāo)記指代相應(yīng)的部分。
具體實(shí)施方式
在下面的描述中,闡釋了很多特定細(xì)節(jié),諸如特定組件、電路和過程的示例,以便提供對本公開內(nèi)容的透徹理解。并且,在下面的描述中以及為了解釋說明的目的,闡釋特定術(shù)語以便提供對本發(fā)明實(shí)施例的透徹理解。然而,對于本領(lǐng)域的技術(shù)人員顯而易見的是,可以不要求這些特定細(xì)節(jié)來實(shí)踐本發(fā)明實(shí)施例。在其它實(shí)例中,以框圖的形式示出了公知的電路和設(shè)備以避免模糊本公開內(nèi)容。本文中使用的術(shù)語“耦合”意為直接連接或通過一個或多個中間組件或電路連接。在本文中描述的各個總線上提供的任何信號可以與其它信號時間復(fù)用并且在一個或多個公共總線上提供。另外,電路元件或軟件塊之間的互連可以顯示為總線或單個信號線。每個總線可以替代地是單個信號線,而每個單個信號線也可以替代地是總線,并且單個線或總線可以表示用于組件之間的通信的種種物理或邏輯機(jī)制中的任何一種或多種。本發(fā)明實(shí)施例不應(yīng)被解釋為僅限于本文中描述的特定示例,而是應(yīng)該將所附權(quán)利要求定義的所有實(shí)施例包括在其范圍內(nèi)。
圖1是根據(jù)一些實(shí)施例的用于處理分組的系統(tǒng)100的框圖。在一些實(shí)施例中,系統(tǒng)100是網(wǎng)絡(luò)交換機(jī)或路由器的一部分。系統(tǒng)100包括用于接收和發(fā)送分組的多個端口102。端口102耦合到處理電路104,該處理電路耦合到存儲器120和存儲器124。處理電路104可以通過存儲控制器(為了簡單未示出)耦合到存儲器120和/或存儲器124。
存儲器120存儲一個或多個哈希表122,該哈希表存儲用于指定如何處理相應(yīng)分組的分組處理信息。一個或多個哈希表122的每一個都被劃分為槽,該槽也可以被稱為桶(bucket)。槽被劃分為塊,塊被劃分為單元格。單元格也可以被稱為箱(bin)。每個單元格存儲一個沖突元素;每個沖突元素存儲針對相應(yīng)鍵的分組處理信息以及該鍵本身。存儲器124存儲一個或多個存根(stub)表126。一個或多個存根表126的每一個都被劃分為槽,每個槽都被劃分為單元格。根據(jù)一些實(shí)施例,一個或多個存根表126中的單元格存儲指向一個或多個哈希表122中的塊的指針。(本文中使用的術(shù)語“單元格”指的是槽的一部分。在哈希表122中,一個單元格存儲一個沖突元素。在存根表126中,一個單元格存儲用于指向相應(yīng)哈希表122中的塊的塊編號。本文中使用的術(shù)語“單元格”因此與“存儲器單元”不是同樣的事物。相反,槽中的每個單元格將包括多個存儲器單元。下面關(guān)于圖2A、圖2B和圖3描述一個或多個哈希表122和一個或多個存根表126的示例。
處理電路104包括鍵構(gòu)造模塊106、哈希模塊108、表訪問模塊110、分組處理模塊116和表維護(hù)模塊119。鍵構(gòu)造模塊106構(gòu)造在查找被存儲在一個或多個哈希表122中的分組處理信息中使用的鍵。該鍵是根據(jù)鍵構(gòu)造原則,使用與分組相關(guān)聯(lián)的信息(例如,從分組中提取的信息)構(gòu)造的。例如,鍵可以是使用從分組報頭提取的元數(shù)據(jù)來構(gòu)造的。在一個示例中,提取出分組報頭的目標(biāo)地址并將其用作鍵。在另一個示例中,提取出分組的整個分組報頭(例如,互聯(lián)網(wǎng)協(xié)議(IP)報頭)并將其用作鍵。
將由鍵構(gòu)造模塊106構(gòu)造的鍵提供給哈希模塊108,哈希模塊108對該鍵進(jìn)行哈希以生成哈希值。該哈希模塊108可以為相應(yīng)鍵生成多個哈希值。在一些實(shí)施例中,該哈希模塊108實(shí)現(xiàn)多個哈希函數(shù)。例如,該哈希模塊108可以將第一哈希函數(shù)h1應(yīng)用于鍵k以生成第一哈希值h1(k)并且將第二哈希函數(shù)h2應(yīng)用于鍵k以生成第二哈希值h2(k)。該哈希模塊108還可以將第三哈希函數(shù)h3應(yīng)用于鍵k以生成第三哈希值h3(k)并且將第四哈希函數(shù)h4應(yīng)用于鍵k以生成第四哈希值h4(k)。對不同的哈希函數(shù)的使用僅僅是生成哈希值h1(k)、h2(k)、h3(k)和/或h4(k)的一個示例;其它示例也是可能的。
將由哈希模塊108生成的哈希值與由鍵構(gòu)造模塊106構(gòu)造的鍵一起提供給表訪問模塊110。表訪問模塊110使用該哈希值訪問一個或多個存根表126和一個或多個哈希表122。下面關(guān)于圖2A和圖3,并且也在圖4A-圖4B的方法400和圖5A-圖5B的方法500中提供了使用哈希值來訪問這些表的示例。在一些實(shí)施例中,表訪問模塊110包括用于將從哈希表122中的沖突元素讀取的鍵與由鍵構(gòu)造模塊106提供的鍵進(jìn)行比較的比較邏輯單元112。在一些實(shí)施例中,表訪問模塊110包括用于確定從存根表126中的單元格讀取的塊編號是否為有效塊指針的驗證邏輯單元114。
將由表訪問模塊110從哈希表122獲取的分組處理信息提供給分組處理模塊116,分組處理模塊116根據(jù)該分組處理信息來處理分組。在一些實(shí)施例中,分組處理模塊116包括分組轉(zhuǎn)發(fā)引擎118,它將分組路由到由該分組處理信息指定的輸出端口102以用于傳輸。
表維護(hù)模塊119建立并更新該一個或多個哈希表122和該一個或多個存根表126。例如,表維護(hù)模塊119在一個或多個哈希表122中存儲鍵和相應(yīng)的分組處理信息,并且將相應(yīng)的塊編號存儲在一個或多個存根表126中。
在一些實(shí)施例中,存儲器120在處理電路104外部。例如,處理電路104實(shí)現(xiàn)在分組處理芯片中,而存儲器120實(shí)現(xiàn)在一個或多個外部存儲芯片中。存儲器124可以嵌入與處理電路104相同的集成電路中(即,相同芯片)(例如,作為緩存存儲器)。替代地,存儲器124可以實(shí)現(xiàn)在包括該處理電路104的集成電路(例如,分組處理芯片)外部的一個或多個存儲器芯片中。在一些實(shí)施例中,存儲器120是動態(tài)隨機(jī)訪問存儲器(DRAM),而存儲器124是靜態(tài)隨機(jī)訪問存儲器(SRAM)。在一些實(shí)施例中,存儲器120是雙倍數(shù)據(jù)速率(DDR)存儲器(例如,DDR DRAM)。
圖2A是根據(jù)一些實(shí)施例的哈希表202和相應(yīng)的存根表210的框圖。哈希表202是存儲器120中的哈希表122(圖1)的示例,而存根表210是存儲器124中的存根表126(圖1)的示例。哈希表202被劃分為m個槽(即,桶)204,其中,m是大于1的整數(shù),使得哈希表202包括槽204-0到槽204-(m-1)。使用第一哈希值集合h1(k)(例如,使用第一哈希函數(shù)h1(k))來對槽204-0到槽204-(m-1)進(jìn)行索引,其中h1(k)的取值范圍在0和(m-1)之間。從而,作為應(yīng)用于特定鍵k的h1(k)的值給出了哈希表202中的槽204的索引。
哈希表202中的每個槽204被劃分為p個塊206,其中,p是大于1的整數(shù),使得每個槽204包括塊206-0到塊206-(p-1)。圖2B示出了根據(jù)一些實(shí)施例的塊206。塊206被劃分為存儲q個相應(yīng)的沖突元素220的q個單元格,其中,q是大于1的整數(shù),使得該塊包括沖突元素220-0到?jīng)_突元素220-(q-1)。每個沖突元素220包括鍵222和分組處理信息224。每個塊206可以獨(dú)立于相同槽204中的其它塊206被訪問。在一些實(shí)施例中,塊206具有的大小為x(例如,以字節(jié)為單位),允許其在單個存儲器事務(wù)(例如,針對將存儲器120耦合到處理電路104的數(shù)據(jù)總線的單個總線請求事務(wù))中被從存儲器120讀取。很多因素可能影響為了提高系統(tǒng)效率(例如,數(shù)據(jù)突發(fā)大小、緩存線大小)而進(jìn)行的對x的值的選擇。例如(例如,當(dāng)存儲器120是DDR時),總線請求事務(wù)可以指的是從存儲器120讀取的單個數(shù)據(jù)突發(fā),使得塊206具有的大小x等于該存儲器120的每一數(shù)據(jù)突發(fā)的字節(jié)數(shù)量。在一個示例中,該存儲器120是具有每一數(shù)據(jù)突發(fā)128字節(jié)(即,128B)的DRAM,并且塊206是128B的(即,x=128B)。每個沖突元素220以及因此的每個單元格是y字節(jié)的,使得q=ceiling(x/y,1)(向上舍入(ceiling),即,x除以y,進(jìn)位到最近的整數(shù))。每個槽204有n個沖突元素,以及因此的n個單元格。每個槽204因此被劃分為p個塊206,其中,p=ceiling(n/q,1)
該存根表210被劃分為m個槽212,使得該存根表包括槽212-0到槽212-(m-1)。與哈希表202中的槽204-0到槽204-(m-1)類似,使用第一哈希值集合h1(k)(例如,使用第一哈希函數(shù)h1(k))來對槽212-0到槽212-(m-1)進(jìn)行索引。每個槽212被劃分為b個單元格214,其中,b是大于或等于p的整數(shù),使得每個槽包括單元格214-0到單元格214-(b-1)。在一個示例中,b等于n。每個單元格214的大小是ceiling(log2(p),1)(即,哈希表202的每個槽204中的塊206的數(shù)量的以2為底的對數(shù),進(jìn)位到最近的整數(shù))。存根表210以比特為單位的大小是ceiling(log2(p),1)*m*b。
使用第二哈希值集合h2(k)(例如,使用第二哈希函數(shù)h2(k))來對單元格214-0到單元格214-(b-1)進(jìn)行索引,其中,h2(k)的取值范圍在0到b-1之間。從而,作為應(yīng)用于特定鍵k的h2(k)的值給出了存根表210中的單元格214的索引。槽212中的單元格214-0到單元格214-(b-1)存儲哈希表202中的相應(yīng)槽204中的塊206的塊編號。在圖2A的示例中,槽212-(m-1)中的單元格214-1存儲‘0’,這是哈希表202的槽204-(m-1)中的塊206-0的塊編號。槽212-(m-1)中的單元格214-2存儲值‘p-1’,這是哈希表202的槽204-(m-1)中的塊206-(p-1)的塊編號。槽212-(m-1)中的單元格214-1因此存儲指向槽204-(m-1)中的塊206-0的指針,并且槽212-(m-1)中的單元格214-2因此存儲指向槽204-(m-1)中的塊206-(p-1)的指針。在一些實(shí)施例中,每個單元格214可以獨(dú)立于相同槽212中的其它單元格214來被訪問。
因此,針對鍵k的沖突元素220在哈希表202中被存儲在由存根表210中的相應(yīng)單元格214中存儲的塊編號指定的塊206中。相應(yīng)單元格214由h2(k)來索引并且處于由h1(k)來索引的槽212中,而沖突元素220處于由h1(k)來索引的槽204中。
在一個示例中,哈希表202實(shí)現(xiàn)在DRAM中,存根表210實(shí)現(xiàn)在SRAM中,其中,m=8k、n=16、x=128B、y=32B并且b=16。因此,p=4并且q=4。該哈希表202的大小因此是8k*16*32B=4兆字節(jié)(MB),并且存根表219的大小因此是2*8k*16比特=256千比特=32千字節(jié)(KB)。該4MB DRAM哈希表202根據(jù)一些應(yīng)用提供高使用率,而增加的用于存儲塊編號的32KB SRAM存根表210限制了對DRAM訪問的大小,從而帶來了低時延。
如果該哈希表202不包括針對在查找中使用的鍵的沖突元素,則該查找將會失敗??梢酝ㄟ^增加系統(tǒng)100的負(fù)載因數(shù)來降低查找失敗的可能性。負(fù)載因數(shù)被定義為條目數(shù)量除以桶(即,槽)的數(shù)量,其中,條目數(shù)量指的是被成功插入到該表中的條目的數(shù)量。對于系統(tǒng)100而言期望的是具有高負(fù)載因數(shù)連同低沖突率。為了在提高負(fù)載因數(shù)的同時達(dá)到低沖突率,可以在系統(tǒng)100中包括第二哈希表122和相應(yīng)的存根表126。
圖3是示出了根據(jù)一些實(shí)施例可以結(jié)合哈希表202和存根表210(圖2A)一起使用的第二哈希表302和第二存根表310的框圖。哈希表302是存儲器120中的哈希表122(圖1)的示例,而存根表310是存儲器124中的存根表126(圖1)的示例。響應(yīng)于確定哈希表202沒有存儲針對特定鍵的沖突元素,可以訪問哈希表302和存根表310。
哈希表302被劃分為c個槽(即,桶)304,其中,c是大于1的整數(shù),使得該哈希表302包括槽304-0到槽304-(c-1)。使用第三哈希值集合h3(k)(例如,第三哈希函數(shù)h3(k))來對槽304-0到槽304-(c-1)進(jìn)行索引,其中,h3(k)的取值范圍在0和(c-1)之間。每個槽304被劃分為p個塊206,使得每個槽304包括塊206-0到塊206-(p-1)。如針對哈希表202中的塊206所描述的,每個槽206可以獨(dú)立于相同槽304中的其它塊206來被訪問。存根表310被劃分為c個槽312,使得存根表310包括槽312-0到槽312-(c-1)。與槽304-0到槽304-(c-1)類似,使用第三哈希值集合h3(k)(例如,第三哈希函數(shù)h3(k))來對槽312-0到槽312-(c-1)進(jìn)行索引。每個槽312被劃分為b個單元格214,使得每個槽312包括單元格214-0到單元格214-(b-1)。使用第四哈希值集合h4(k)(例如,第四哈希函數(shù)h4(k))來對單元格214-0到單元格214-(b-1)進(jìn)行索引,其中,h4(k)的取值范圍在0和(b-1)之間。存根表310的每個槽312中的單元格214-0到單元格214-(b-1)存儲指向哈希表301中的相應(yīng)槽304中的塊206的塊編號。在一些實(shí)施例中,每個單元格214可以獨(dú)立于相同槽312中的其它單元格214來被訪問。
因此,針對鍵k的沖突元素220在哈希表302中被存儲在由存根表310中的相應(yīng)單元格214中存儲的塊編號指定的塊206中。相應(yīng)單元格214由h4(k)來索引并且處于由h3(k)來索引的槽312中,而沖突元素220處于由h3(k)來索引的槽304中。
在圖3的示例中,哈希表202的每個槽204中的塊206的數(shù)量被示出為等于哈希表302的每個槽304中的塊206的數(shù)量。然而,這些數(shù)量可以是不同的。類似的,存根表210的每個槽212中的單元格214的數(shù)量被示出為等于存根表310的每個槽312中的單元格214的數(shù)量。然而,這些數(shù)量可以是不同的。
圖4A和4B示出了根據(jù)一些實(shí)施例的處理分組的方法400的流程圖。該方法400,例如在系統(tǒng)100(圖1)中執(zhí)行。
在方法400中,接收到第一分組。根據(jù)與該第一分組相關(guān)聯(lián)的信息(例如,根據(jù)該分組報頭中的元數(shù)據(jù))來構(gòu)造第一鍵k1(402,圖4A)。該第一鍵,例如是由鍵構(gòu)造模塊106(圖1)來構(gòu)造的。
使用第一鍵來生成(404,406)哈希值h1(k1)和h2(k1)。例如,將第一哈希函數(shù)應(yīng)用于第一鍵以確定哈希值h1(k1),并且將第二哈希函數(shù)應(yīng)用于該第一鍵以確定哈希值h2(k1)。例如由哈希模塊108(圖1)來執(zhí)行哈希操作404和406。
(例如,由圖1的表訪問模塊110)從第一表中的槽中的單元格讀取(408)第一塊編號(例如,從圖2A的存根表210中的槽212中的單元格214讀取)。該槽由哈希值h1(k1)來索引,而該單元格由哈希值h2(k1)來索引。在一些實(shí)施例中,該單元格是在無需讀取該槽中的其它單元格的情況下被讀取的。在一些實(shí)施例中,該第一塊編號是在單個事務(wù)(例如,單個存儲器訪問)中從存儲該第一表的存儲器讀取的(例如,在圖1的存儲器124中)。在一些實(shí)施例中,用于存儲該第一表的存儲器是SRAM。
在一些實(shí)施例中,(例如,由圖1的驗證邏輯單元114)確定(410)該第一塊編號是用于第二表的有效塊編號。
執(zhí)行(412)針對第二表中的槽中(例如,圖2A的哈希表202中的槽204中)的塊(例如,圖2B的塊206)的存儲器訪問,以便讀取包括該第一分組的分組處理信息(例如,圖2B的分組處理信息224)的數(shù)據(jù)。例如由圖1的表訪問模塊110來執(zhí)行該存儲器訪問。該槽由哈希值h1(k1)來索引,并且該塊由該第一塊編號來索引。在存儲器訪問中,該塊是在無需讀取該槽中的其它塊的情況下被讀取的。在一些實(shí)施例中,分組處理信息包括分組轉(zhuǎn)發(fā)信息(例如,用于指定圖1的輸出端口102)。在一些實(shí)施例中,在單個存儲器事務(wù)(例如,單總線請求事務(wù),其示例是單個突發(fā))中從存儲該第二表的存儲器(例如,圖1的存儲器120中)讀取(414)該塊。在一些實(shí)施例中,用于存儲該第二表的存儲器是DRAM。
可以響應(yīng)于確定(410)該第一塊編號是用于第二表的有效塊編號,來讀取該塊。替代地,操作410的確定可以被省略。
在一些實(shí)施例中,從該塊讀取(416)多個沖突元素220-0到220-(q-1)(圖2B)。每個沖突元素220存儲相應(yīng)的鍵222以及與該相應(yīng)的鍵222相關(guān)聯(lián)的相應(yīng)的分組處理信息224。(例如,使用圖1的比較邏輯單元112)確定沖突元素220-0到220-(q-1)中的一個沖突元素的相應(yīng)的鍵222與該第一鍵匹配。將該沖突元素220的相應(yīng)的分組處理信息224識別為該第一分組的分組處理信息。
在一些實(shí)施例中,為了讀取多個沖突元素220-0到220-(q-1),使用下面的表達(dá)式來確定用于存儲該第二表的存儲器中(例如,存儲器120中)的存儲器偏移:
(h1(k1)*n+q*(第一塊編號))*y (1)其中,h1(k1)是在操作404中生成的哈希值,n是第二表的每個槽中(例如,圖2A的哈希表202的每個槽204中)的沖突元素220的數(shù)量,q是多個沖突元素220-0到220-(q-1)中的沖突元素220的數(shù)量,并且y是每個沖突元素220的大小。然后,從具有該存儲器偏移(例如,針對存儲器120中的哈希表202的起始位置)的存儲器位置讀取該多個沖突元素220-0到220-(q-1)。
根據(jù)該第一分組的分組處理信息來處理(418)該第一分組。在一些實(shí)施例中,該第一分組被提供(420)給由該分組處理信息指定的輸出端口以用于傳輸。例如,分組轉(zhuǎn)發(fā)引擎118將該第一分組路由給指定的端口102(圖1)。
在一些實(shí)施例中,接收(422,圖4B)第二分組。根據(jù)與該第二分組相關(guān)聯(lián)的信息(例如,根據(jù)該分組報頭中的元數(shù)據(jù))來構(gòu)造(422)第二鍵k2。例如,由鍵構(gòu)造模塊106(圖1)來構(gòu)造該第二鍵。
使用第二鍵來生成(424,426)哈希值h1(k2)和h2(k2)。例如,將第一哈希函數(shù)應(yīng)用于該第二鍵以確定哈希值h1(k2),并且將第二哈希函數(shù)應(yīng)用于第二鍵以確定哈希值h2(k2)。例如可以由哈希模塊108(圖1)來執(zhí)行哈希操作424和426。
使用哈希值h1(k2)和h2(k2),確定(428)該第二表(例如,圖2A的哈希表202)未存儲該第二分組的分組處理信息。例如,讀取在該第一表中由h1(k2)索引的槽中由h2(k2)索引的單元格(例如,圖2A的存根表210中的槽212中的單元格214),并且做出以下確定:從該單元格讀取的值指示該第二表未存儲該第二分組的分組處理信息。例如,驗證邏輯單元114(圖1)確定從該單元格讀取的值不是有效塊編號。
哈希值h3(k2)和h4(k2)是使用第二鍵來生成的(430,432)。例如,將第三哈希函數(shù)應(yīng)用于第二鍵以確定哈希值h3(k2),并且將第四哈希函數(shù)應(yīng)用于該第二鍵以確定哈希值h4(k2)。例如,可以由哈希模塊108(圖1)來執(zhí)行哈希操作430和432。
從第三表中的槽中的單元格(例如,圖3的存根表310中的槽312中的單元格214)讀取(434)第二塊編號。該槽是由哈希值h3(k2)來索引的,而該單元格是由哈希值h4(k2)來索引的。在一些實(shí)施例中,讀取該單元格是在無需讀取該槽中的其它單元格的情況下進(jìn)行的。在一些實(shí)施例中,在單個事務(wù)(例如,單個存儲器訪問)中從存儲該第三表的存儲器(例如,圖1的存儲器124中)讀取該第二塊編號。在一些實(shí)施例中,用于存儲該第三表的存儲器是SRAM。
執(zhí)行(436)針對第四表中的槽中(例如,圖3的哈希表302中的槽304中)的塊(例如,圖2B的塊206)的存儲器訪問,以讀取包括該第二分組的分組處理信息(例如,圖2B的分組處理信息224)的數(shù)據(jù)。該槽由哈希值h3(k2)來索引,并且該塊由第二塊編號來索引。在存儲器訪問中,讀取該塊是在無需讀取該槽中的其它塊的情況下進(jìn)行的。在一些實(shí)施例中,在單個存儲器事務(wù)(例如,單總線請求事務(wù),其示例是單個突發(fā))中從存儲該第四表的存儲器(例如,圖1的存儲器120中)讀取(438)該塊。在一些實(shí)施例中,用于存儲該第四表的存儲器是DRAM。
在操作436中,可以從該塊讀取(440)多個沖突元素220-0到220-(q-1)(圖2B)。每個沖突元素220存儲相應(yīng)的鍵222和與該相應(yīng)的鍵222相關(guān)聯(lián)的相應(yīng)的分組處理信息224。(例如,使用圖1的比較邏輯單元112)確定沖突元素220-0到220-(q-1)中的一個沖突元素的相應(yīng)的鍵222與該第二鍵匹配。將該沖突元素220中的相應(yīng)的分組處理信息224識別為該第二分組的分組處理信息。
在一些實(shí)施例中,為了在操作440中讀取多個沖突元素220-0到220-(q-1),使用下面的表達(dá)式來確定用于存儲該第四表的存儲器中(例如,存儲器120中)的存儲器偏移:
(h3(k2)*n+q*(第二塊編號))*y(2)其中,h3(k2)是在操作430中生成的哈希值,n是第四表的每個槽中(例如,圖3的哈希表302的每個槽304中)的沖突元素220的數(shù)量,q是多個沖突元素220-0到220-(q-1)中的沖突元素220的數(shù)量,并且y是每個沖突元素220的大小。然后,從具有該存儲器偏移(例如,針對存儲器120中的哈希表302的起始)的存儲器位置讀取該多個沖突元素220-0到220-(q-1)。
例如,由表訪問模塊110(圖1)來執(zhí)行讀取操作434和436。
根據(jù)該第二分組的分組處理信息來處理(442)該第二分組。在一些實(shí)施例中,該第二分組被提供給由該分組處理信息指定的輸出端口以用于傳輸。例如,分組轉(zhuǎn)發(fā)引擎118將該第二分組路由給指定的端口102(圖1)。
方法400通過將對第二表和/或第四表的存儲器訪問的大小限于槽內(nèi)的塊而不是整個槽,來提供低時延的表查找。方法400還可以將對第一表和/或第三表的存儲器訪問的大小限于槽內(nèi)的單元格而不是整個槽。在第一表和/或第三表中存儲塊編號允許在不增加時延的情況下增加第二表和/或第三表的每個槽中的沖突元素的數(shù)量。從而可以實(shí)現(xiàn)具有結(jié)合低沖突率和低時延的高使用率和高負(fù)載因數(shù)的大型查找表。
盡管方法400包括若干個看上去以特定順序發(fā)生的操作,然而顯而易見的是,方法400能夠包括更多或更少的操作并且該操作中的一些能夠被連續(xù)或并行地執(zhí)行。兩個或更多操作的順序可以被改變,兩個或更多操作的效果可以重疊,并且兩個或更多操作可以被組合為單個操作。
圖5A和5B示出了根據(jù)一些實(shí)施例的維護(hù)查找表的方法500的流程圖。該方法500,例如在系統(tǒng)100(圖1)中執(zhí)行,并且可以結(jié)合方法400(圖4A-圖4B)一起執(zhí)行。
在方法500中,創(chuàng)建(502,圖5A)第一表(例如,圖2A的存根表210),其被劃分為第一批多個槽(例如,槽212-0到槽212-(m-1)),其中,每個槽被劃分為第一批多個單元格(例如,單元格214-0到單元格214-(b-1))。例如,該第一表被存儲在存儲器124(圖1)中,在一些實(shí)施例中其是SRAM。在一些實(shí)施例中,每個單元格在存儲器124中是可以被獨(dú)立訪問的(例如,在單個相應(yīng)的存儲器事務(wù)中)。
創(chuàng)建(504)第二表(例如,圖2A的哈希表202),其被劃分為第二批多個槽(例如,槽204-0到槽204-(m-1)),其中,每個槽被劃分為第一批多個塊(例如,塊206-0到塊206-(p-1))。例如,該第二表存儲在存儲器120中(圖1),在一些實(shí)施例中其是DRAM。在一些實(shí)施例中,每個塊包括(506)多個沖突元素(例如,圖2B的沖突元素220-0到?jīng)_突元素220-(q-1))。在一些實(shí)施例中,每個塊在存儲器120中是可以獨(dú)立地訪問的(例如,在單總線請求事務(wù)中,其示例是突發(fā))。例如,每個塊的大小可以等于針對該存儲器120的每一數(shù)據(jù)突發(fā)的字節(jié)數(shù)量。
使用第一鍵k1來生成(508,510)哈希值h1(k1)和h2(k1)。例如,將第一哈希函數(shù)應(yīng)用于第一鍵以確定哈希值h1(k1),并且將第二哈希函數(shù)應(yīng)用于第一鍵以確定哈希值h2(k1)。例如,可以由哈希模塊108(圖1)來執(zhí)行哈希操作508和510。
第一鍵和與該第一鍵相關(guān)聯(lián)的分組處理信息被存儲(512)在第二表中的相應(yīng)槽中的相應(yīng)塊中。該相應(yīng)槽由哈希值h1(k1)來索引。該相應(yīng)塊具有第一塊編號。在一些實(shí)施例中,該第一鍵和與該第一鍵相關(guān)聯(lián)的分組處理信息被存儲(514)在該相應(yīng)塊中的沖突元素220中。
第一塊編號被存儲(516)在第一表的相應(yīng)槽中的相應(yīng)單元格中。該相應(yīng)槽由哈希值h1(k1)來索引。該相應(yīng)單元格由哈希值h2(k1)來索引。
根據(jù)一些實(shí)施例,由表維護(hù)模塊119(圖1)來執(zhí)行存儲操作512(例如,包括操作514)和516。
在一些實(shí)施例中,創(chuàng)建(圖5B的518)第三表(例如,圖3的存根表312),其被劃分為第三批多個槽(例如,槽312-0到槽312-(c-1)),其中,每個槽被劃分為第二批多個單元格(例如,單元格214-0到單元格214-(b-1))。在一些實(shí)施例中,每個單元格在存儲器124中是可以被獨(dú)立訪問的(例如,在單個相應(yīng)的存儲器事務(wù)中)。另外,創(chuàng)建(520)第四表(例如,圖3的哈希表302),其被劃分為第四批多個槽(例如,槽304-0到槽304-(c-1)),其中,每個槽被劃分為第二批多個塊(例如,塊206-0到塊206-(p-1))。在一些實(shí)施例中,每個塊在存儲器120中是可以被獨(dú)立地訪問的(例如,在單總線請求事務(wù)中,其示例是突發(fā))。在一些實(shí)施例中,每個塊包括(522)多個沖突元素(例如,圖2B的沖突元素220-0到?jīng)_突元素220-(q-1))。
使用第二鍵k2來生成(524,526)哈希值h3(k2)和h4(k2)。例如,將第三哈希函數(shù)應(yīng)用于第二鍵以確定哈希值h3(k2),并且將第四哈希函數(shù)應(yīng)用于第二鍵以確定哈希值h4(k2)。例如可由哈希模塊108(圖1)來執(zhí)行哈希操作524和526。
第二鍵和與該第二鍵相關(guān)聯(lián)的分組處理信息被存儲(528)在第四表中的相應(yīng)槽中的相應(yīng)塊中。該相應(yīng)槽由哈希值h3(k2)來索引。該相應(yīng)塊具有第二塊編號。在一些實(shí)施例中,該第二鍵和與該第二鍵相關(guān)聯(lián)的分組處理信息被存儲(530)在第四表中的相應(yīng)槽中的相應(yīng)塊中的沖突元素220中。
第二塊編號被存儲(532)在第三表中的相應(yīng)槽中的相應(yīng)單元格中。該相應(yīng)槽由哈希值h3(k2)來索引。該相應(yīng)單元格由哈希值h4(k2)來索引。
根據(jù)一些實(shí)施例,由表維護(hù)模塊119(圖1)來執(zhí)行存儲操作528(例如,包括操作540)和532。在一些實(shí)施例中,響應(yīng)于確定在第二表中由h1(k2)索引的槽不能存儲該第二鍵及其相關(guān)聯(lián)的分組處理信息(例如,由于該槽是滿的),來執(zhí)行存儲操作528和532。
該方法500提供了具備高使用率、高負(fù)載因數(shù)、低沖突率和低時延的查找表。盡管方法500包括若干個看上去以特定順序發(fā)生的操作,然而顯而易見的是,方法500能夠包括更多或更少的操作并且該操作中的一些能夠被連續(xù)或并行地執(zhí)行。兩個或更多操作的順序可以被改變,兩個或更多操作的效果可以重疊,并且兩個或更多操作可以被組合為單個操作。
在一些實(shí)施例中,利用硬件來執(zhí)行方法400和/或500。例如,可以使用處理電路104中對應(yīng)于鍵構(gòu)造模塊106、哈希模塊108、表訪問模塊110、分組處理模塊116和/或表維護(hù)模塊119的一個或多個狀態(tài)機(jī)來執(zhí)行方法400和/或500。替代地,可以利用軟件來實(shí)現(xiàn)方法400和/或500。例如,該處理電路104可以包括處理器并且可以耦合到非易失性存儲器,該非易失性存儲器用作存儲被配置為由處理器執(zhí)行的一個或多個程序的非臨時性計算機(jī)可讀存儲介質(zhì)。一個或多個程序可以包括指令,當(dāng)其由處理器執(zhí)行時使得系統(tǒng)100執(zhí)行方法400和/或500。該一個或多個程序因此可以包括指令,當(dāng)其由處理器執(zhí)行時實(shí)現(xiàn)鍵構(gòu)造模塊106、哈希模塊108、表訪問模塊110、分組處理模塊116和/或表維護(hù)模塊119的功能。
在上述的描述中,已經(jīng)參考了其特定示例性實(shí)施例來描述了本發(fā)明實(shí)施例。然而,顯而易見的是,可以在不脫離如所附權(quán)利要求所闡釋的本公開內(nèi)容的廣泛精神和范圍的前提下對其做出各種修改和變化。因此,應(yīng)以說明性而非限制性意義來考慮本描述和附圖。