本發(fā)明涉及緩存領(lǐng)域,尤其涉及一種基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法。
背景技術(shù):
1、在定義數(shù)據(jù)元素的數(shù)據(jù)結(jié)構(gòu)時(shí),可以包含多個(gè)次關(guān)鍵字成員,當(dāng)其作為全局動(dòng)態(tài)數(shù)據(jù)在fpga上時(shí),此類全局動(dòng)態(tài)數(shù)據(jù)通常使用在片上緩存中構(gòu)建查找表的方法來解決算法中的運(yùn)算問題,即將所有的全局動(dòng)態(tài)數(shù)據(jù)按任意順序組織在同一張查找表中,并存放在片上緩存中,通過為每一個(gè)數(shù)據(jù)元素創(chuàng)建一個(gè)全局索引來查找、更新和移動(dòng)表中數(shù)據(jù)元素,完成相關(guān)計(jì)算。
2、上述方法,即片上緩存內(nèi)查表法對(duì)于數(shù)據(jù)量小的小體系實(shí)現(xiàn)簡單,計(jì)算效率高;但對(duì)于大體系,由于現(xiàn)有的fpga片上緩存有限,無法存放整張查找表,若需要使用一張查找表來完成查找、更新和移動(dòng)表中數(shù)據(jù)元素,并完成相關(guān)計(jì)算,則實(shí)現(xiàn)困難。
3、對(duì)此,現(xiàn)有技術(shù)中存在兩種解決方法:
4、一種方法是仍然維護(hù)全局動(dòng)態(tài)數(shù)據(jù)表,但將全局動(dòng)態(tài)數(shù)據(jù)表存放到片外緩沖上;這種處理方法雖然實(shí)現(xiàn)簡單,但存在極大增加訪問延遲的問題,對(duì)于離散隨機(jī)的數(shù)據(jù)訪問,其效率會(huì)大幅度降低;
5、另一種方法是利用全局動(dòng)態(tài)數(shù)據(jù)的存取存在一定的局部性;在片上緩存中,每次存放全局動(dòng)態(tài)表的一部分,即局部動(dòng)態(tài)表;但由于全局索引無法直接索引局部動(dòng)態(tài)表,且表中的動(dòng)態(tài)數(shù)據(jù)存在元素的更新和移動(dòng),所以需要為局部動(dòng)態(tài)表構(gòu)建新的局部索引;一種常見的索引方法是通過哈希(hash)來進(jìn)行索引,即將全局索引哈希為局部索引后,再通過局部索引查找對(duì)應(yīng)元素;哈希算法帶來的問題是:哈希沖突的存在導(dǎo)致難以獲知確定性的硬件節(jié)拍數(shù),因此難以實(shí)現(xiàn)硬件流水,只能串行執(zhí)行,而這同樣極大增加訪問延遲,降低了計(jì)算效率;同時(shí),在更新局部動(dòng)態(tài)數(shù)據(jù)時(shí),哈希表也難以確定包含指定次關(guān)鍵字的所有數(shù)據(jù)元素的位置,導(dǎo)致時(shí)間復(fù)雜度提高。
技術(shù)實(shí)現(xiàn)思路
1、針對(duì)上述存在的問題,本發(fā)明提供的一種基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,能夠解決現(xiàn)有技術(shù)訪問由全局動(dòng)態(tài)數(shù)據(jù)構(gòu)成的查找表時(shí),數(shù)據(jù)訪問延遲大、算法時(shí)間復(fù)雜度高的問題,實(shí)現(xiàn)降低數(shù)據(jù)訪問延遲,調(diào)高計(jì)算效率。
2、為實(shí)現(xiàn)上述目的,本發(fā)明采取的技術(shù)方案為:
3、本發(fā)明提供的一種基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,包括以下步驟:
4、s101:為全局動(dòng)態(tài)數(shù)據(jù)中每一個(gè)次關(guān)鍵字創(chuàng)建一個(gè)firstn節(jié)點(diǎn),firstn節(jié)點(diǎn)設(shè)置局部索引,用于指向次關(guān)鍵字在數(shù)據(jù)元素中處于第n個(gè)位置的第一個(gè)數(shù)據(jù)元素;
5、s102:為數(shù)據(jù)元素中每一個(gè)次關(guān)鍵字創(chuàng)建一個(gè)next數(shù)據(jù)項(xiàng),next數(shù)據(jù)項(xiàng)設(shè)置局部索引,指向次關(guān)鍵字在數(shù)據(jù)元素中處于相同位置的下一個(gè)數(shù)據(jù)元素;
6、s103:遍歷所有的數(shù)據(jù)元素通過頭插法構(gòu)建以firstn節(jié)點(diǎn)為頭節(jié)點(diǎn)的鏈表,將鏈表組織成多組局部動(dòng)態(tài)數(shù)據(jù);
7、s104:將局部動(dòng)態(tài)數(shù)據(jù)以及與次關(guān)鍵字相關(guān)的數(shù)據(jù)依次從片外緩存?zhèn)鬏數(shù)狡暇彺妗?/p>
8、本發(fā)明提供的基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,優(yōu)選地,所述步驟s103中,在將鏈表組織成多組局部動(dòng)態(tài)數(shù)據(jù)時(shí),將第一個(gè)次關(guān)鍵字相同的數(shù)據(jù)元素存放在同一組局部動(dòng)態(tài)數(shù)據(jù)中。
9、本發(fā)明提供的基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,優(yōu)選地,還包括在不同局部動(dòng)態(tài)數(shù)據(jù)間移動(dòng)數(shù)據(jù)元素的方法;所述在不同局部動(dòng)態(tài)數(shù)據(jù)間移動(dòng)數(shù)據(jù)元素的方法包括以下步驟:
10、s201:獲取第n個(gè)位置為所查次關(guān)鍵字的第一個(gè)數(shù)據(jù)元素的firstn節(jié)點(diǎn),并獲取數(shù)據(jù)元素;
11、s202:遍歷以firstn節(jié)點(diǎn)為頭節(jié)點(diǎn)的鏈表的所有數(shù)據(jù)元素;
12、s203:獲取目標(biāo)局部動(dòng)態(tài)數(shù)據(jù)空間,并將數(shù)據(jù)元素移動(dòng)至該局部動(dòng)態(tài)數(shù)據(jù)空間;
13、s204:更新指向該數(shù)據(jù)元素的next數(shù)據(jù)項(xiàng);
14、s205:更新以firstn節(jié)點(diǎn)為起點(diǎn)的鏈表中指向該數(shù)據(jù)元素的索引;
15、s206:尋找鏈表中所查次關(guān)鍵字在數(shù)據(jù)元素中處于相同位置的下一個(gè)數(shù)據(jù)元素,執(zhí)行步驟s203,直至鏈表中無符合尋找要求的數(shù)據(jù)元素。
16、本發(fā)明提供的一種基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,優(yōu)選地,還包括查找或更新包含指定次關(guān)鍵字的數(shù)據(jù)元素的方法;所述在不同局部動(dòng)態(tài)數(shù)據(jù)間移動(dòng)數(shù)據(jù)元素的方法包括以下步驟:
17、s301:設(shè)置雙重循環(huán),外層循環(huán)遍歷包含指定次關(guān)鍵字的所有鏈表,內(nèi)層循環(huán)遍歷鏈表中的數(shù)據(jù)元素;
18、s302:在內(nèi)層循環(huán)內(nèi),將查找到的符合條件的數(shù)據(jù)元素添加到結(jié)果集合中,或更新該數(shù)據(jù)元素中與指定次關(guān)鍵字相關(guān)的非關(guān)鍵字的值。
19、上述技術(shù)方案具有如下優(yōu)點(diǎn)或者有益效果:
20、本發(fā)明提供的基于十字鏈表算法的局部化全局動(dòng)態(tài)數(shù)據(jù)方法,在步驟s101中,全局動(dòng)態(tài)數(shù)據(jù)包括若干個(gè)由次關(guān)鍵字構(gòu)成的數(shù)據(jù)元素,為了便于劃分局部動(dòng)態(tài)數(shù)據(jù),將全局動(dòng)態(tài)數(shù)據(jù)內(nèi)所有數(shù)據(jù)元素中的次關(guān)鍵字均設(shè)置有一個(gè)節(jié)點(diǎn)結(jié)構(gòu),每個(gè)相同的次關(guān)鍵字按其在數(shù)據(jù)元素中所處的位置標(biāo)記為firstn節(jié)點(diǎn),n為該次關(guān)鍵字在數(shù)據(jù)元素中處于第n個(gè)位置,firstn節(jié)點(diǎn)是局部索引,用于指向次關(guān)鍵字在數(shù)據(jù)元素中處于第n個(gè)位置的第一個(gè)數(shù)據(jù)元素,此處第一個(gè)指數(shù)據(jù)元素排列在全局動(dòng)態(tài)數(shù)據(jù)內(nèi)的位置;通過對(duì)全局動(dòng)態(tài)數(shù)據(jù)內(nèi)所有數(shù)據(jù)元素中的次關(guān)鍵字設(shè)置firstn節(jié)點(diǎn),可以對(duì)每個(gè)次關(guān)鍵字按照其在數(shù)據(jù)元素中所處位置進(jìn)行分類,便于對(duì)次關(guān)鍵字進(jìn)行查詢,同時(shí)可以將由整個(gè)全局動(dòng)態(tài)數(shù)據(jù)構(gòu)成的查找表分割為多個(gè)查詢組;
21、在步驟s102中,為數(shù)據(jù)元素中每一個(gè)次關(guān)鍵字創(chuàng)建一個(gè)next數(shù)據(jù)項(xiàng),next數(shù)據(jù)項(xiàng)設(shè)置局部索引,指向次關(guān)鍵字在數(shù)據(jù)元素中處于相同位置的下一個(gè)數(shù)據(jù)元素,可以提高查詢包含所需查找的次關(guān)鍵字的數(shù)據(jù)元素的能力,同時(shí),在所需查找的次關(guān)鍵字的數(shù)據(jù)元素中還包括其他設(shè)置有next數(shù)據(jù)項(xiàng)的次關(guān)鍵字,此類次關(guān)鍵字同樣地可以指向在數(shù)據(jù)元素中與其處于相同位置的下一個(gè)數(shù)據(jù)元素,從而以較小的緩存空間可以獲取與所需查找的數(shù)據(jù)元素相關(guān)的其他數(shù)據(jù)元素;
22、在步驟s103中,遍歷全局動(dòng)態(tài)數(shù)據(jù)內(nèi)所有的數(shù)據(jù)元素,并通過頭插法構(gòu)建以firstn節(jié)點(diǎn)為頭節(jié)點(diǎn)的鏈表,即將含有相同次關(guān)鍵詞且其firstn節(jié)點(diǎn)相同的數(shù)據(jù)元素以頭插法的方式放入一個(gè)鏈表內(nèi),將鏈表組織成多組局部動(dòng)態(tài)數(shù)據(jù),其結(jié)合步驟s102,可以構(gòu)成十字鏈表;相較于現(xiàn)有技術(shù)中將全局索引哈希為局部索引的方法,通過對(duì)鏈表的尋址方法,可以在確定的周期內(nèi)讀取到下一個(gè)需要計(jì)算的數(shù)據(jù)元素,保證了流水線化的可能性;同時(shí),由于十字鏈表的特性,可以在o(1)時(shí)間復(fù)雜度找到包含指定次關(guān)鍵字在指定位置的數(shù)據(jù)元素,降低了更新和移動(dòng)局部動(dòng)態(tài)數(shù)據(jù)中包含指定次關(guān)鍵字在指定位置的數(shù)據(jù)元素的時(shí)間復(fù)雜度;
23、在步驟s104中,將局部動(dòng)態(tài)數(shù)據(jù)以及與次關(guān)鍵字相關(guān)的數(shù)據(jù)依次從片外緩存?zhèn)鬏數(shù)狡暇彺妫噍^于現(xiàn)有技術(shù)中將所有全局動(dòng)態(tài)數(shù)據(jù)存放在片外緩存的方法,將全局動(dòng)態(tài)數(shù)據(jù)局部化為多組局部動(dòng)態(tài)數(shù)據(jù),并將局部動(dòng)態(tài)數(shù)據(jù)分批從片外緩存?zhèn)鬏數(shù)狡暇彺孢M(jìn)行計(jì)算,可以充分利用程序的局部性以及片上緩存的低延遲特性,從而降低數(shù)據(jù)訪問延遲,調(diào)高計(jì)算效率。