tabilao hash tsotra ho an'ny GPU

tabilao hash tsotra ho an'ny GPU
Navoakako tao amin'ny Github izany tetikasa vaovao A Simple GPU Hash Table.

Izy io dia latabatra tenifototra GPU tsotra afaka manodina fampidirana an-jatony tapitrisa isan-tsegondra. Ao amin'ny solosaina findaiko NVIDIA GTX 1060, ny kaody dia mampiditra mpivady 64 tapitrisa novokarina an-tsokosoko ao anatin'ny 210 ms eo ho eo ary manala tsiroaroa 32 tapitrisa ao anatin'ny 64 ms.

Izany hoe, ny hafainganam-pandeha amin'ny solosaina finday dia manodidina ny 300 tapitrisa inserts/sec ary 500 millions deletes/sec.

Ny latabatra dia nosoratana tamin'ny CUDA, na dia azo ampiharina amin'ny HLSL na GLSL aza ny teknika mitovy. Ny fampiharana dia manana fetra maromaro mba hiantohana ny fahombiazan'ny karatra video:

  • Ny fanalahidy 32-bit sy ny sanda mitovy ihany no karakaraina.
  • Ny latabatra hash dia manana habe raikitra.
  • Ary io habe io dia tsy maintsy mitovy amin'ny roa amin'ny hery.

Ho an'ny fanalahidy sy ny soatoavina dia mila mitahiry mari-pamantarana tsotsotra ianao (amin'ny kaody etsy ambony dia 0xffffffff).

latabatra hash tsy misy hidy

Ny latabatra hash dia mampiasa adiresy misokatra miaraka amin'ny fanadihadiana linear, izany hoe, andiana mpivady sanda manan-danja fotsiny izy io izay voatahiry ao anaty fitadidiana ary manana fahaiza-manao cache ambony kokoa. Tsy azo lazaina ho toy izany koa ny rojo vy, izay misy ny fitadiavana tondro ao anaty lisitra mifandray. Ny latabatra hash dia singa fitehirizana tsotra KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

Ny haben'ny latabatra dia herin'ny roa, fa tsy isa voalohany, satria ny torolàlana haingana iray dia ampy hampiharana ny saron-tava pow2 / AND, fa ny operator modulus dia miadana kokoa. Zava-dehibe izany amin'ny trangan'ny fizahana tsipika, satria amin'ny fijerena tabilao tsipika dia tsy maintsy fonosina amin'ny slot tsirairay ny mari-pamantarana slot. Ary vokatr'izany, ny vidin'ny fandidiana dia ampiana modulo isaky ny slot.

Ny latabatra ihany no mitahiry ny lakile sy ny sanda ho an'ny singa tsirairay, fa tsy ny hash amin'ny lakile. Satria ny latabatra ihany no mitahiry fanalahidy 32-bit, ny hash dia kajy haingana be. Ny kaody etsy ambony dia mampiasa ny tenifototra Murmur3, izay manao fiovana vitsivitsy, XOR ary fampitomboana.

Ny latabatra hash dia mampiasa teknika fiarovana fanidiana izay tsy miankina amin'ny filaharan'ny fitadidiana. Na dia manakorontana ny filaharan'ny asa hafa toy izany aza ny asa fanoratana sasany, dia mbola hihazona ny toetra marina ny latabatra hash. Hiresaka momba izany eto ambany isika. Ny teknika dia miasa tsara amin'ny karatra video izay mihazakazaka kofehy an'arivony miaraka.

Ny fanalahidy sy ny soatoavina ao amin'ny latabatra hash dia natomboka ho foana.

Ny kaody dia azo ovaina mba hifehezana ny fanalahidy sy ny soatoavina 64-bit ihany koa. Ny fanalahidy dia mitaky asa atao amin'ny famakiana, fanoratana ary fampitahana sy fifandimbiasana atomika. Ary ny soatoavina dia mila asa famakiana sy fanoratana atomika. Soa ihany fa ao amin'ny CUDA, ny asa mamaky-manoratra ho an'ny sanda 32- sy 64-bit dia atomika raha toa ka mifanaraka amin'ny natiora izy ireo (jereo eto ambany). eto), ary ny karatra vidéo maoderina dia manohana ny asa fampitahana sy fifanakalozana atomika 64-bit. Mazava ho azy, rehefa mifindra amin'ny 64 bits dia hihena kely ny fampisehoana.

Toetran'ny latabatra hash

Ny mpivady sanda manan-danja tsirairay ao amin'ny latabatra hash dia afaka manana iray amin'ireo fanjakana efatra:

  • Foana ny fanalahidy sy ny sandany. Amin'ity fanjakana ity, ny latabatra hash dia natomboka.
  • Voasoratra ny lakile, fa tsy mbola voasoratra ny sandany. Raha misy kofehy hafa mamaky angon-drakitra amin'izao fotoana izao, dia miverina foana. Ara-dalàna izany, mety ho nitranga izany raha toa ka niasa teo aloha kokoa ny kofehy famonoana iray hafa, ary miresaka momba ny rafitra angon-drakitra miaraka isika.
  • Samy voarakitra an-tsoratra na ny lakile na ny sandany.
  • Ny sandany dia misy amin'ny kofehy famonoana hafa, saingy tsy mbola misy ny fanalahidy. Mety hitranga izany satria ny maodelin'ny fandaharana CUDA dia manana modely fitadidiana voalamina malalaka. Ara-dalàna izany; Na ahoana na ahoana, mbola foana ny fanalahidy, na dia tsy toy izany intsony aza ny sandany.

Ny zava-dehibe iray dia ny hoe rehefa nosoratana tamin'ny slot ny lakile dia tsy mihetsika intsony - na dia voafafa aza ny lakile, dia hiresaka momba izany eto ambany isika.

Ny kaody latabatra hash aza dia miasa miaraka amin'ny maodely fitadidiana malalaka izay tsy fantatra ny filaharan'ny famakiana sy fanoratana ny fahatsiarovana. Rehefa mijery ny fampidirana, ny fitadiavana ary ny famafana ao anaty tabilao hash isika, dia tadidio fa ny mpivady manan-danja tsirairay dia ao amin'ny iray amin'ireo fanjakana efatra voalaza etsy ambony.

Midira ao amin'ny tabilao hash

Ny fiasan'ny CUDA izay mampiditra tsiroaroa manan-danja ao anaty latabatra hash dia toa izao:

void gpu_hashtable_insert(KeyValue* hashtable, uint32_t key, uint32_t value)
{
    uint32_t slot = hash(key);

    while (true)
    {
        uint32_t prev = atomicCAS(&hashtable[slot].key, kEmpty, key);
        if (prev == kEmpty || prev == key)
        {
            hashtable[slot].value = value;
            break;
        }
        slot = (slot + 1) & (kHashTableCapacity-1);
    }
}

Mba hampidirana fanalahidy iray, ny kaody dia miverimberina amin'ny alàlan'ny laharan'ny latabatra hash manomboka amin'ny hash amin'ny fanalahidy nampidirina. Ny slot tsirairay ao amin'ny andry dia manao asa fampitahana atomika izay mampitaha ny fanalahidy ao amin'io slot io ho foana. Raha misy tsy mifanandrify hita, dia havaozina miaraka amin'ny lakile nampidirina ny lakile ao amin'ny slot, ary averina ny lakilen'ny slot voalohany. Raha foana io lakile voalohany io na nifanaraka tamin'ny lakile nampidirina, dia nahita slot mety hampidirana ilay kaody ary nampiditra ny sanda nampidirina tao amin'ilay slot.

Raha amin'ny antso kernel iray gpu_hashtable_insert() misy singa maromaro miaraka amin'ny fanalahidy iray ihany, avy eo ny sandany rehetra dia azo soratana amin'ny slot fanalahidy. Heverina ho ara-dalàna izany: hahomby ny fanoratana iray amin'ireo sanda manan-danja mandritra ny antso, saingy satria mitranga izany rehetra izany miaraka amin'ny andian-dahatsoratra maromaro amin'ny famonoana, dia tsy afaka maminavina isika hoe iza no soratana fahatsiarovana ho farany.

Fikarohana latabatra tenifototra

Kaody fitadiavana fanalahidy:

uint32_t gpu_hashtable_lookup(KeyValue* hashtable, uint32_t key)
{
        uint32_t slot = hash(key);

        while (true)
        {
            if (hashtable[slot].key == key)
            {
                return hashtable[slot].value;
            }
            if (hashtable[slot].key == kEmpty)
            {
                return kEmpty;
            }
            slot = (slot + 1) & (kHashTableCapacity - 1);
        }
}

Mba hahitana ny sandan'ny fanalahidy iray voatahiry ao anaty latabatra, dia miverina amin'ny alàlan'ny array isika manomboka amin'ny hash amin'ny fanalahidy tadiavintsika. Ao amin'ny slot tsirairay, dia manamarina raha ny fanalahidy no tadiavintsika, ary raha izany, dia mamerina ny sandany. Hamarininay koa raha foana ny lakile, ary raha izany dia atsahatray ny fikarohana.

Raha tsy mahita ny lakile isika dia mamerina sanda poakaty ny code.

Ireo asa fikarohana rehetra ireo dia azo atao miaraka amin'ny alàlan'ny fampidirana sy famafana. Ny mpivady tsirairay ao amin'ny latabatra dia hanana ny iray amin'ireo fanjakana efatra voalaza etsy ambony momba ny fikorianan'ny.

Famafana ao anaty latabatra hash

Kaody famafana fanalahidy:

void gpu_hashtable_delete(KeyValue* hashtable, uint32_t key, uint32_t value)
{
    uint32_t slot = hash(key);

    while (true)
    {
        if (hashtable[slot].key == key)
        {
            hashtable[slot].value = kEmpty;
            return;
        }
        if (hashtable[slot].key == kEmpty)
        {
            return;
        }
        slot = (slot + 1) & (kHashTableCapacity - 1);
    }
}

Ny famafana fanalahidy dia atao amin'ny fomba tsy mahazatra: avelantsika eo amin'ny latabatra ny lakile ary mariho ny sandany (fa tsy ny lakile mihitsy) ho banga. Ity kaody ity dia mitovy amin'ny lookup(), afa-tsy hoe rehefa hita eo amin'ny fanalahidy iray ny lalao iray dia ataony foana ny sandany.

Araka ny voalaza etsy ambony, raha vantany vao nosoratana tamin'ny slot ny fanalahidy iray, dia tsy mihetsika intsony. Na dia voafafa amin'ny latabatra aza ny singa iray dia mijanona eo amin'ny toerany ny lakile, lasa foana ny sandany. Midika izany fa tsy mila mampiasa asa fanoratana atomika ho an'ny sandan'ny slot isika, satria tsy maninona na foana na tsia ny sanda ankehitriny - mbola ho foana izany.

Manova ny latabatra hash

Azonao atao ny manova ny haben'ny latabatra hash amin'ny famoronana latabatra lehibe kokoa ary mampiditra singa tsy misy banga avy amin'ny latabatra taloha ao anatiny. Tsy nampihatra an'io fampiasa io aho satria tiako ny hitazona ny kaody santionany ho tsotra. Ankoatr'izay, ao amin'ny programa CUDA, ny fizarana fahatsiarovana dia matetika atao amin'ny code mpampiantrano fa tsy ao amin'ny kernel CUDA.

Ilay lahatsoratra Latabatra tenifototra tsy misy hidim-piandrasana mamaritra ny fomba hanovana rafitra angon-drakitra voaaro toy izany.

fifaninanana

Ao amin'ny snippets fehezan-dalàna ambony gpu_hashtable_insert(), _lookup() и _delete() manaova tsiroaroa manan-danja iray isaky ny mandeha. Ary ambany gpu_hashtable_insert(), _lookup() и _delete() manaova andiana tsiroaroa mifanandrify, ny tsiroaroa tsirairay ao anaty kofehy famonoana GPU mitokana:

// CPU code to invoke the CUDA kernel on the GPU
uint32_t threadblocksize = 1024;
uint32_t gridsize = (numkvs + threadblocksize - 1) / threadblocksize;
gpu_hashtable_insert_kernel<<<gridsize, threadblocksize>>>(hashtable, kvs, numkvs);

// GPU code to process numkvs key/values in parallel
void gpu_hashtable_insert_kernel(KeyValue* hashtable, const KeyValue* kvs, unsigned int numkvs)
{
    unsigned int threadid = blockIdx.x*blockDim.x + threadIdx.x;
    if (threadid < numkvs)
    {
        gpu_hashtable_insert(hashtable, kvs[threadid].key, kvs[threadid].value);
    }
}

Ny latabatra hash mahatohitra hidy dia manohana ny fampidirana, ny fitadiavana ary ny famafana miaraka. Satria ao amin'ny iray amin'ireo fanjakana efatra foana ny mpivady sanda manan-danja ary tsy mihetsika ny lakile, dia miantoka ny fahamarinan'ny tabilao ny latabatra na dia samy ampiasaina miaraka aza ny karazana asa samihafa.

Na izany aza, raha manao andiana fampidirana sy famafana mifanandrify isika, ary raha misy lakile dika mitovy ny laharan'ireo tsiroaroa, dia tsy ho afaka haminavina hoe iza no mpivady "handresy" — hosoratana amin'ny tabilao tenifototra farany. Andao atao hoe niantso ny kaody fampidirana miaraka amin'ny laharan'ny mpivady A/0 B/1 A/2 C/3 A/4. Rehefa vita ny kaody dia ampiarahina B/1 и C/3 dia azo antoka fa ho eo amin'ny latabatra, fa miaraka amin'izay koa, misy tsiroaroa hiseho ao A/0, A/2 na A/4. Mety ho olana izany na mety tsy ho olana - miankina amin'ny fampiharana izany. Mety ho fantatrao mialoha fa tsy misy lakile dika mitovy amin'ny laharan'ny fidirana, na mety tsy hiraharaha izay sanda nosoratana farany ianao.

Raha olana aminao izany, dia mila manasaraka ireo mpivady roa mitovy amin'ny antson'ny rafitra CUDA samihafa ianao. Ao amin'ny CUDA, ny asa rehetra miantso ny kernel dia vita alohan'ny antso kernel manaraka (farafaharatsiny ao anatin'ny kofehy iray. Amin'ny kofehy samihafa, ny kernel dia tanterahina mifanandrify). Amin'ny ohatra etsy ambony, raha miantso kernel iray miaraka amin'ny A/0 B/1 A/2 C/3, ary ny iray hafa miaraka amin'ny A/4, avy eo ny fanalahidy A hahazo ny sandany 4.

Andeha isika hiresaka momba ny tokony ho asa lookup() и delete() Mampiasà fanondro tsotra na mivadibadika ho an'ny andiana tsiroaroa ao amin'ny latabatra hash. CUDA Documentation milaza fa:

Ny compiler dia mety misafidy ny hanatsara ny famakiana sy fanoratana amin'ny fitadidiana maneran-tany na zaraina... Ireo fanatsarana ireo dia mety ho kilemaina amin'ny fampiasana ny teny fototra. volatile: ... izay fanondroana an'io fari-piainana io dia atambatra ho fampianarana mamaky na manoratra tena tadidy.

Tsy mila fampiharana ny fiheverana marina volatile. Raha mampiasa sanda voatahiry avy amin'ny asa vakiana teo aloha ny kofehy famonoana, dia hampiasa fampahalalana efa lany andro izy io. Na izany aza, ity dia fampahalalana avy amin'ny toetry ny latabatra hash amin'ny fotoana iray amin'ny antso kernel. Raha mila mampiasa ny vaovao farany ianao dia afaka mampiasa ny index volatile, fa avy eo dia hihena kely ny fampisehoana: araka ny fitsapana nataoko, rehefa mamafa singa 32 tapitrisa dia nihena ny hafainganam-pandeha avy amin'ny 500 tapitrisa famafana/sg ho 450 tapitrisa famafana/sec.

vokatra

Ao amin'ny fitsapana ny fampidirana singa 64 tapitrisa sy ny famafana ny 32 tapitrisa amin'izy ireo, fifaninanana eo amin'ny std::unordered_map ary saika tsy misy latabatra hash ho an'ny GPU:

tabilao hash tsotra ho an'ny GPU
std::unordered_map nandany 70 ms nampiditra sy nanala singa ary nanafaka azy ireo avy eo unordered_map (mila fotoana be ny fanesorana singa an-tapitrisany, satria ao anatiny unordered_map famatsiana fahatsiarovana maro no atao). Raha ny marina, std:unordered_map fameperana hafa tanteraka. Izy io dia kofehy famonoana CPU tokana, manohana ny soatoavina manan-danja amin'ny habe rehetra, miasa tsara amin'ny tahan'ny fampiasana avo lenta, ary mampiseho fampisehoana maharitra aorian'ny famafana maro.

Ny faharetan'ny latabatra tenifototra ho an'ny GPU sy ny fifandraisana amin'ny programa dia 984 ms. Tafiditra ao anatin'izany ny fotoana lany amin'ny fametrahana ny latabatra ao anaty fitadidiana sy ny famafana azy (manome fahatsiarovana 1 GB indray mandeha, izay maka fotoana kely ao amin'ny CUDA), ny fampidirana sy famafana ireo singa, ary ny famerenana azy ireo. Ny kopia rehetra mankany sy avy amin'ny fitadidiana karatra video dia raisina ihany koa.

Ny latabatra hash mihitsy dia naka 271 ms vao vita. Tafiditra ao anatin'izany ny fotoana lanin'ny karatra video hampidirana sy famafana ireo singa, ary tsy tafiditra ao anatin'izany ny fotoana lany amin'ny fanaovana kopia ao anaty fitadidiana sy ny famerenana ny latabatra vokarina. Raha velona mandritra ny fotoana maharitra ny latabatra GPU, na raha ao anaty fitadidiana ny karatra video ny latabatra hash (ohatra, mba hamoronana latabatra hash izay hampiasain'ny code GPU hafa fa tsy ny processeur afovoany), dia mifandraika ny valin'ny fitsapana.

Ny latabatra hash ho an'ny karatra vidéo dia mampiseho fampisehoana avo lenta noho ny fidirana ambony sy ny fampitoviana mavitrika.

fahadisoana

Ny maritrano latabatra hash dia manana olana vitsivitsy tokony hotandremana:

  • Voasakantsakana amin'ny alalan'ny clustering ny probing linear, izay mahatonga ny fanalahidin'ny latabatra ho tsy dia tsara loatra.
  • Tsy nesorina ny fanalahidy amin'ny fampiasana ny fiasa delete ary rehefa mandeha ny fotoana dia manakorontana ny latabatra izy ireo.

Vokatr'izany dia mety hiharatsy tsikelikely ny fampandehanana ny latabatra hash, indrindra raha efa ela izy io ary misy fampidirana sy famafana maro. Ny fomba iray hanalefahana ireo fatiantoka ireo dia ny famerenana indray amin'ny latabatra vaovao miaraka amin'ny tahan'ny fampiasana ambany dia ambany ary manivana ireo fanalahidy nesorina mandritra ny fanavaozana.

Mba hanazavana ireo olana voalaza ireo, dia hampiasa ny kaody etsy ambony aho mba hamoronana latabatra misy singa 128 tapitrisa ary mamakivaky singa 4 tapitrisa mandra-pahafeno ny slots 124 tapitrisa (teo amin'ny 0,96 eo ho eo ny tahan'ny fampiasana). Ity ny tabilao valiny, ny laharana tsirairay dia antso kernel CUDA hampiditra singa vaovao 4 tapitrisa ao anaty latabatra hash iray:

Ny tahan'ny fampiasana
Ny faharetan'ny fampidirana singa 4

0,00
11,608448 ms (361,314798 tapitrisa fanalahidy/seg.)

0,03
11,751424 ms (356,918799 tapitrisa fanalahidy/seg.)

0,06
11,942592 ms (351,205515 tapitrisa fanalahidy/seg.)

0,09
12,081120 ms (347,178429 tapitrisa fanalahidy/seg.)

0,12
12,242560 ms (342,600233 tapitrisa fanalahidy/seg.)

0,16
12,396448 ms (338,347235 tapitrisa fanalahidy/seg.)

0,19
12,533024 ms (334,660176 tapitrisa fanalahidy/seg.)

0,22
12,703328 ms (330,173626 tapitrisa fanalahidy/seg.)

0,25
12,884512 ms (325,530693 tapitrisa fanalahidy/seg.)

0,28
13,033472 ms (321,810182 tapitrisa fanalahidy/seg.)

0,31
13,239296 ms (316,807174 tapitrisa fanalahidy/seg.)

0,34
13,392448 ms (313,184256 tapitrisa fanalahidy/seg.)

0,37
13,624000 ms (307,861434 tapitrisa fanalahidy/seg.)

0,41
13,875520 ms (302,280855 tapitrisa fanalahidy/seg.)

0,44
14,126528 ms (296,909756 tapitrisa fanalahidy/seg.)

0,47
14,399328 ms (291,284699 tapitrisa fanalahidy/seg.)

0,50
14,690304 ms (285,515123 tapitrisa fanalahidy/seg.)

0,53
15,039136 ms (278,892623 tapitrisa fanalahidy/seg.)

0,56
15,478656 ms (270,973402 tapitrisa fanalahidy/seg.)

0,59
15,985664 ms (262,379092 tapitrisa fanalahidy/seg.)

0,62
16,668673 ms (251,627968 tapitrisa fanalahidy/seg.)

0,66
17,587200 ms (238,486174 tapitrisa fanalahidy/seg.)

0,69
18,690048 ms (224,413765 tapitrisa fanalahidy/seg.)

0,72
20,278816 ms (206,831789 tapitrisa fanalahidy/seg.)

0,75
22,545408 ms (186,038058 tapitrisa fanalahidy/seg.)

0,78
26,053312 ms (160,989275 tapitrisa fanalahidy/seg.)

0,81
31,895008 ms (131,503463 tapitrisa fanalahidy/seg.)

0,84
42,103294 ms (99,619378 tapitrisa fanalahidy/seg.)

0,87
61,849056 ms (67,815164 tapitrisa fanalahidy/seg.)

0,90
105,695999 ms (39,682713 tapitrisa fanalahidy/seg.)

0,94
240,204636 ms (17,461378 tapitrisa fanalahidy/seg.)

Rehefa mitombo ny fampiasana dia mihena ny fahombiazany. Tsy ilaina izany amin'ny ankamaroan'ny tranga. Raha mampiditra singa ao anaty latabatra ny fampiharana iray ary manary azy ireo (ohatra, rehefa manisa teny ao anaty boky), dia tsy olana izany. Fa raha mampiasa latabatra tenifototra maharitra maharitra ny fampiharana (ohatra, ao amin'ny tonian-dahatsoratry ny sary mba hitahiry ampahany amin'ny sary tsy misy banga izay ampidiran'ny mpampiasa sy famafana fampahalalana matetika), dia mety hiteraka olana izany fihetsika izany.

Ary norefesiny ny halalin'ny latabatra hash taorian'ny fampidirana 64 tapitrisa (fampiasana 0,5). Ny halalin'ny salan'isa dia 0,4774, noho izany ny ankamaroan'ny fanalahidy dia ao amin'ny slot tsara indrindra na slot iray miala amin'ny toerana tsara indrindra. Ny halalin'ny feo ambony indrindra dia 60.

Norefesiko avy eo ny halalin'ny fizahana teo ambony latabatra misy fampidirana 124 tapitrisa (fampiasana 0,97). Ny halalin'ny salan'isa dia efa 10,1757, ary ny ambony indrindra - 6474 (!!). Mihena be ny fahombiazan'ny fandrefesana tsipika amin'ny tahan'ny fampiasana ambony.

Ny tsara indrindra dia ny mitazona ny tahan'ny fampiasana an'ity tabilao hash ity ho ambany. Saingy avy eo dia mampitombo ny fampisehoana isika amin'ny fandaniana ny fanjifana fahatsiarovana. Soa ihany fa raha ny fanalahidy sy ny soatoavina 32-bit dia azo hamarinina izany. Raha amin'ny ohatra etsy ambony, ao anaty latabatra misy singa 128 tapitrisa, dia mitazona ny utilization factor 0,25 isika, dia tsy afaka mametraka singa mihoatra ny 32 tapitrisa ao anatiny, ary ny slots 96 tapitrisa sisa dia ho very - 8 bytes isaky ny mpivady. , 768 MB ny fahatsiarovana very.

Mariho fa miresaka momba ny fahaverezan'ny fahatsiarovana karatra video isika, izay loharano sarobidy kokoa noho ny fahatsiarovana ny rafitra. Na dia manana fahatsiarovana 4 GB farafaharatsiny aza ny ankamaroan'ny karatra sary desktop maoderina izay manohana ny CUDA (tamin'ny fotoana nanoratana, ny NVIDIA 2080 Ti dia manana 11 GB), dia mbola tsy fanapahan-kevitra hendry indrindra ny hamoy vola toy izany.

Hanoratra bebe kokoa momba ny famoronana tabilao hash ho an'ny karatra vidéo izay tsy manana olana amin'ny halalin'ny fizahana aho, ary koa ny fomba hampiasana indray ireo slot voafafa.

Fandrefesana ny halalin'ny feo

Mba hamaritana ny halalin'ny fanalahidin'ny fanalahidy iray, dia azontsika atao ny maka ny hash an'ny fanalahidy (fanondroana latabatra tsara indrindra) avy amin'ny fanondroana latabatra tena izy:

// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);

Noho ny majika amin'ny isa roa mifameno roa an'ny roa sy ny hoe ny fahafahan'ny latabatra hash dia roa amin'ny herin'ny roa, ity fomba ity dia hahomby na dia afindra any amin'ny fiandohan'ny latabatra aza ny fanondroana fototra. Andeha isika haka fanalahidy iray izay nasiana tombo-kase ho 1, fa ampidirina amin'ny slot 3. Avy eo ho an'ny latabatra misy capacité 4 dia mahazo (3 — 1) & 3, izay mitovy amin'ny 2.

famaranana

Raha manana fanontaniana na fanehoan-kevitra ianao dia alefaso mailaka aho amin'ny Twitter na manokatra lohahevitra vaovao ao repository.

Ity kaody ity dia nosoratana teo ambany fitaomam-panahy avy amin'ny lahatsoratra tena tsara:

Amin'ny ho avy dia hanohy hanoratra momba ny fampiharana latabatra hash ho an'ny karatra video aho ary hamakafaka ny zava-bitany. Ny drafitr'asako dia ny fametahana rojo, Robin Hood hashing, ary cuckoo hashing amin'ny fampiasana asa atomika amin'ny rafitra angon-drakitra izay mety amin'ny GPU.

Source: www.habr.com

Add a comment