Yooj yim hash rooj rau GPU

Yooj yim hash rooj rau GPU
Kuv tso nws rau Github qhov project tshiab Ib qho yooj yim GPU Hash Table.

Nws yog ib qho yooj yim GPU hash rooj muaj peev xwm ntawm kev ua ntau pua lab ntawm cov ntxig rau ib ob. Ntawm kuv lub NVIDIA GTX 1060 lub laptop, cov cai ntxig 64 lab randomly generated key-value khub nyob rau hauv txog 210 ms thiab tshem tawm 32 lab khub nyob rau hauv txog 64 ms.

Ntawd yog, qhov ceev ntawm lub laptop yog kwv yees li 300 lab ntxig / sec thiab 500 lab deletes / sec.

Cov lus sau rau hauv CUDA, txawm hais tias tib cov txheej txheem tuaj yeem siv rau HLSL lossis GLSL. Qhov kev siv tau muaj ntau yam kev txwv kom ntseeg tau tias kev ua haujlwm siab ntawm daim npav video:

  • Tsuas yog 32-ntsis yuam sij thiab tib qhov txiaj ntsig tau ua tiav.
  • Lub rooj hash muaj qhov loj me.
  • Thiab qhov loj me no yuav tsum sib npaug ntawm ob mus rau lub zog.

Rau cov yuam sij thiab qhov tseem ceeb, koj yuav tsum tau tseg ib qho yooj yim delimiter marker (hauv cov cai saum toj no yog 0xffffffff).

Hash rooj tsis muaj xauv

Lub rooj hash siv qhib qhov chaw nyob nrog linear soj ntsuam, uas yog, nws tsuas yog ib qho array ntawm tus nqi tseem ceeb uas tau khaws cia hauv lub cim xeeb thiab muaj kev ua haujlwm zoo tshaj cache. Tib yam tsis tuaj yeem hais rau chaining, uas cuam tshuam nrog kev tshawb nrhiav tus pointer hauv cov npe txuas. Lub rooj hash yog ib qho yooj yim array khaws cov ntsiab lus KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

Qhov loj ntawm lub rooj yog lub zog ntawm ob, tsis yog tus lej tseem ceeb, vim tias kev siv lub pow2 / THIAB daim npog ntsej muag yuav tsum muaj ib qho kev qhia ceev, tab sis tus neeg teb xov tooj modulus qeeb dua. Qhov no yog ib qho tseem ceeb nyob rau hauv cov ntaub ntawv ntawm linear probing, txij li thaum nyob rau hauv ib tug linear rooj saib lub qhov ntsuas qhov ntsuas yuav tsum tau qhwv nyob rau hauv txhua lub qhov. Thiab yog li ntawd, tus nqi ntawm kev ua haujlwm yog ntxiv modulo hauv txhua qhov.

Lub rooj tsuas khaws tus yuam sij thiab tus nqi rau txhua lub ntsiab lus, tsis yog hash ntawm tus yuam sij. Txij li lub rooj tsuas yog khaws cov yuam sij 32-ntsis, lub hash yog xam sai heev. Cov cai saum toj no siv Murmur3 hash, uas tsuas yog ua haujlwm ob peb zaug, XORs thiab ntau ntxiv.

Lub rooj hash siv cov txheej txheem ntsuas kev tiv thaiv uas tsis muaj kev cia siab ntawm kev nco. Txawm hais tias qee qhov kev sau ntawv cuam tshuam qhov kev txiav txim ntawm lwm yam haujlwm zoo li no, lub rooj hash tseem yuav tuav lub xeev raug. Peb mam li tham txog qhov no hauv qab no. Cov txheej txheem ua haujlwm zoo nrog daim npav video uas khiav ntau txhiab tus xov ib txhij.

Cov yawm sij thiab qhov tseem ceeb hauv lub rooj hash yog pib ua kom khoob.

Cov cai tuaj yeem hloov kho los tuav 64-ntsis yuam sij thiab qhov tseem ceeb ib yam. Cov yuam sij xav tau atomic nyeem, sau, thiab sib piv-thiab-swap ua haujlwm. Thiab qhov tseem ceeb xav tau atomic nyeem thiab sau cov haujlwm. Hmoov zoo, hauv CUDA, nyeem-sau ua haujlwm rau 32- thiab 64-ntsis qhov tseem ceeb yog atomic ntev npaum li lawv tau ua raws li ib txwm muaj (saib hauv qab). no), thiab niaj hnub video phaib txhawb 64-ntsis atomic piv-thiab-pauv ua haujlwm. Tau kawg, thaum tsiv mus rau 64 ntsis, kev ua haujlwm yuav txo qis me ntsis.

Hash lub xeev

Txhua tus khub tseem ceeb-tus nqi hauv lub rooj hash tuaj yeem muaj ib qho ntawm plaub lub xeev:

  • Qhov tseem ceeb thiab tus nqi yog khoob. Hauv lub xeev no, lub rooj hash yog pib.
  • Tus yuam sij tau sau tseg, tab sis tus nqi tseem tsis tau sau. Yog hais tias lwm cov xov tam sim no nyeem cov ntaub ntawv, nws rov qab khoob. Qhov no yog qhov qub, tib yam yuav tshwm sim yog tias lwm cov xov ntawm kev tua tau ua haujlwm me ntsis ua ntej, thiab peb tab tom tham txog cov ntaub ntawv sib koom ua ke.
  • Ob tus yuam sij thiab tus nqi raug kaw.
  • Tus nqi yog muaj rau lwm cov xov ntawm kev tua, tab sis tus yuam sij tseem tsis tau. Qhov no tuaj yeem tshwm sim vim tias CUDA programming qauv muaj cov qauv kev nco qab xoob. Qhov no yog qhov qub; nyob rau hauv txhua qhov xwm txheej, tus yuam sij tseem khoob, txawm tias tus nqi tsis yog lawm.

Ib qho tseem ceeb nuance yog tias thaum tus yuam sij tau sau rau hauv lub qhov, nws tsis txav mus ntxiv - txawm tias tus yuam sij raug tshem tawm, peb yuav tham txog qhov no hauv qab no.

Cov lus hash cov lus txawm ua haujlwm nrog xoob xaj cov qauv cim xeeb uas qhov kev txiav txim uas nco tau nyeem thiab sau tsis paub. Thaum peb saib qhov ntxig, saib, thiab tshem tawm hauv lub rooj hash, nco ntsoov tias txhua tus khub tseem ceeb yog nyob rau hauv ib qho ntawm plaub lub xeev tau piav qhia saum toj no.

Ntxig rau hauv ib lub rooj hash

CUDA muaj nuj nqi uas ntxig tus yuam sij-tus nqi rau hauv lub rooj hash zoo li no:

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);
    }
}

Txhawm rau ntxig tus yuam sij, tus lej rov ua dua los ntawm lub rooj lus hash pib nrog tus hash ntawm tus yuam sij tso. Txhua qhov hauv qhov array ua haujlwm atomic piv-thiab-swap ua haujlwm uas sib piv tus yuam sij hauv qhov ntawd kom khoob. Yog tias kuaj pom qhov tsis sib xws, tus yuam sij hauv qhov qhib tau hloov kho nrog tus yuam sij tso, thiab tom qab ntawd tus yuam sij thawj qhov tseem ceeb rov qab los. Yog tias tus yuam sij tseem ceeb no tsis muaj dab tsi los yog sib phim tus yuam sij ntxig, ces tus lej pom qhov tsim nyog rau kev ntxig thiab ntxig tus nqi tso rau hauv qhov.

Yog nyob rau hauv ib lub kernel hu gpu_hashtable_insert() muaj ntau lub ntsiab lus nrog tib tus yuam sij, tom qab ntawd ib qho ntawm lawv cov txiaj ntsig tuaj yeem sau rau ntawm qhov tseem ceeb. Qhov no suav hais tias yog ib txwm: ib qho ntawm qhov tseem ceeb-tus nqi sau thaum hu yuav ua tiav, tab sis txij li tag nrho qhov no tshwm sim nyob rau hauv tib lub sijhawm nyob rau hauv ob peb txoj haujlwm ntawm kev ua tiav, peb tsis tuaj yeem kwv yees qhov kev nco sau yuav yog qhov kawg.

Hash table nrhiav

Code rau searching keys:

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);
        }
}

Txhawm rau nrhiav tus nqi ntawm tus yuam sij khaws cia hauv lub rooj, peb rov hais dua los ntawm array pib nrog tus hash ntawm tus yuam sij peb tab tom nrhiav. Nyob rau hauv txhua lub qhov, peb xyuas seb tus yuam sij yog qhov peb tab tom nrhiav, thiab yog tias muaj, peb rov qab nws tus nqi. Peb kuj xyuas seb tus yuam sij yog dab tsi, thiab yog tias muaj, peb rho tawm qhov kev tshawb nrhiav.

Yog tias peb nrhiav tsis tau tus yuam sij, tus lej rov qab tus nqi khoob.

Tag nrho cov kev tshawb nrhiav no tuaj yeem ua tau ib txhij los ntawm kev ntxig thiab tshem tawm. Txhua khub hauv lub rooj yuav muaj ib qho ntawm plaub lub xeev tau piav qhia saum toj no rau qhov ntws.

Rho tawm hauv lub rooj hash

Code rau rho tawm cov yuam sij:

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);
    }
}

Rho tawm tus yuam sij yog ua nyob rau hauv ib txoj kev txawv txawv: peb tso tus yuam sij rau hauv lub rooj thiab kos nws tus nqi (tsis yog tus yuam sij nws tus kheej) li khoob. Txoj cai no zoo ib yam li lookup(), tshwj tsis yog tias thaum muaj kev sib tw pom ntawm tus yuam sij, nws ua rau nws tus nqi khoob.

Raws li tau hais los saum no, ib zaug sau tus yuam sij rau ib lub qhov, nws tsis txav mus lawm. Txawm tias thaum lub caij raug tshem tawm ntawm lub rooj, tus yuam sij tseem nyob hauv qhov chaw, nws tus nqi tsuas yog khoob. Qhov no txhais tau hais tias peb tsis tas yuav siv lub atomic sau ua haujlwm rau tus nqi ntawm qhov, vim nws tsis muaj teeb meem txawm tias tus nqi tam sim no khoob lossis tsis yog - nws tseem yuav khoob.

Resizing ib lub rooj hash

Koj tuaj yeem hloov qhov loj ntawm lub rooj hash los ntawm kev tsim lub rooj loj dua thiab ntxig cov ntsiab lus uas tsis yog khoob ntawm lub rooj qub rau hauv nws. Kuv tsis tau siv qhov kev ua haujlwm no vim kuv xav khaws cov qauv code yooj yim. Ntxiv mus, nyob rau hauv CUDA cov kev pab cuam, kev faib kev nco yog feem ntau ua nyob rau hauv lub host code es tsis yog nyob rau hauv lub CUDA kernel.

Kab lus Lub Rooj Xauv-Free Wait-Free Hash Table piav qhia txog yuav hloov pauv li cas cov ntaub ntawv kaw-tiv thaiv cov qauv.

Kev sib tw

Nyob rau hauv lub saum toj no function code snippet gpu_hashtable_insert(), _lookup() ΠΈ _delete() txheej txheem ib qho tseem ceeb-tus nqi khub ntawm ib lub sij hawm. Thiab qis dua gpu_hashtable_insert(), _lookup() ΠΈ _delete() txheej txheem ib array ntawm khub nyob rau hauv parallel, txhua khub nyob rau hauv ib tug cais GPU execution xov:

// 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);
    }
}

Lub rooj xauv-resistant hash txhawb kev sib dhos, nrhiav, thiab tshem tawm. Vim tias cov khub tseem ceeb yog ib txwm nyob hauv ib qho ntawm plaub lub xeev thiab cov yuam sij tsis txav mus los, lub rooj tau lees paub qhov tseeb txawm tias siv ntau hom kev ua haujlwm ib txhij.

Txawm li cas los xij, yog tias peb ua cov txheej txheem ntawm kev ntxig thiab tshem tawm nyob rau hauv tib lub sijhawm, thiab yog tias cov ntaub ntawv nkag ntawm cov khub muaj cov yuam sij sib npaug, ces peb yuav tsis tuaj yeem kwv yees cov khub twg yuav "yeej" - yuav raug sau rau hauv lub rooj zaum kawg. Cia peb hais tias peb hu ua qhov kev ntxig code nrog ib qho input array ntawm khub A/0 B/1 A/2 C/3 A/4. Thaum cov cai tiav, ua khub B/1 ΠΈ C/3 tau lees tias muaj nyob rau hauv lub rooj, tab sis tib lub sij hawm ib qho ntawm cov khub yuav tshwm sim hauv nws A/0, A/2 los yog A/4. Qhov no yuav los yog tsis yog ib qho teeb meem - nws tag nrho yog nyob ntawm daim ntawv thov. Tej zaum koj yuav paub ua ntej tias tsis muaj cov yuam sij sib npaug hauv cov khoom nkag, lossis koj yuav tsis quav ntsej tus nqi twg tau sau kawg.

Yog hais tias qhov no yog ib qho teeb meem rau koj, ces koj yuav tsum cais cov duplicate khub mus rau txawv CUDA system hu. Hauv CUDA, txhua qhov haujlwm uas hu rau lub ntsiav ib txwm ua tiav ua ntej lub xov tooj tom ntej (tsawg kawg hauv ib txoj xov. Hauv qhov piv txwv saum toj no, yog tias koj hu rau ib lub ntsiav nrog A/0 B/1 A/2 C/3, thiab lwm yam nrog A/4, ces tus yuam sij A yuav tau txais tus nqi 4.

Tam sim no cia peb tham txog seb yuav tsum ua haujlwm li cas lookup() ΠΈ delete() siv ib tug dawb los yog volatile pointer rau ib tug array ntawm khub nyob rau hauv lub hash rooj. CUDA Cov ntaub ntawv Hais tias:

Lub compiler tuaj yeem xaiv los txhim kho kev nyeem ntawv thiab sau rau lub ntiaj teb lossis sib koom nco... volatile: ... ib qho kev siv rau qhov sib txawv no yog muab tso ua ke rau hauv lub cim xeeb tiag tiag nyeem lossis sau cov lus qhia.

Kev txiav txim siab kom raug tsis tas yuav tsum tau thov volatile. Yog hais tias qhov kev ua tiav xov siv tus nqi cached los ntawm kev ua haujlwm nyeem ua ntej, ces nws yuav siv cov ntaub ntawv tsis tu ncua me ntsis. Tab sis tseem, qhov no yog cov ntaub ntawv los ntawm lub xeev tseeb ntawm lub rooj hash ntawm ib lub sijhawm ntawm lub ntsiav hu. Yog tias koj xav siv cov ntaub ntawv tshiab, koj tuaj yeem siv qhov ntsuas volatile, tab sis tom qab ntawd qhov kev ua tau zoo yuav txo qis me ntsis: raws li kuv qhov kev ntsuam xyuas, thaum tshem tawm 32 lab lub ntsiab lus, qhov ceev tau txo los ntawm 500 lab deletions / sec mus rau 450 lab deletions / sec.

Tsim tau

Hauv kev sim rau ntxig 64 lab lub ntsiab lus thiab tshem tawm 32 lab ntawm lawv, kev sib tw ntawm std::unordered_map thiab yuav luag tsis muaj lub rooj hash rau GPU:

Yooj yim hash rooj rau GPU
std::unordered_map siv 70 ms ntxig thiab tshem tawm cov ntsiab lus thiab tom qab ntawd tso lawv unordered_map (kev tshem tawm ntau lab lub ntsiab lus yuav siv sijhawm ntau, vim tias sab hauv unordered_map ntau lub cim xeeb faib ua). Hais ncaj ncees, std:unordered_map txawv kiag li txwv. Nws yog tib lub CPU xov ntawm kev ua tiav, txhawb nqa qhov tseem ceeb ntawm txhua qhov loj me, ua tau zoo ntawm kev siv tus nqi siab, thiab qhia tau tias kev ua haujlwm ruaj khov tom qab ntau qhov kev tshem tawm.

Lub sijhawm ntawm lub rooj hash rau GPU thiab kev sib txuas lus sib txuas lus yog 984 ms. Qhov no suav nrog lub sijhawm siv los tso lub rooj hauv lub cim xeeb thiab tshem tawm (tso tseg 1 GB ntawm lub cim xeeb ib zaug, uas yuav siv sijhawm qee lub sijhawm hauv CUDA), ntxig thiab tshem tawm cov ntsiab lus, thiab rov ua dua lawv. Tag nrho cov ntawv luam mus thiab los ntawm daim npav video nco kuj raug coj mus rau hauv tus account.

Lub rooj hash nws tus kheej siv 271 ms kom tiav. Qhov no suav nrog lub sijhawm siv los ntawm daim npav video ntxig thiab tshem tawm cov ntsiab lus, thiab tsis suav nrog lub sijhawm siv luam rau hauv kev nco thiab iterating hla lub rooj. Yog tias lub rooj GPU nyob ntev, lossis yog tias lub rooj hash muaj tag nrho hauv lub cim xeeb ntawm daim npav video (piv txwv li, los tsim lub rooj hash uas yuav siv los ntawm lwm tus GPU code thiab tsis yog lub hauv paus processor), ces qhov kev xeem tau muaj feem xyuam.

Lub rooj hash rau daim npav video qhia tau hais tias muaj kev ua tau zoo vim muaj kev sib tw siab thiab ua haujlwm sib luag.

Disadvantages

Lub hash table architecture muaj ob peb qhov teeb meem kom paub txog:

  • Linear probing yog hampered los ntawm clustering, uas ua rau cov yuam sij nyob rau hauv lub rooj yuav tsum tau muab tso rau tsawg tshaj li zoo kawg nkaus.
  • Cov yuam sij tsis raug tshem tawm siv lub luag haujlwm delete thiab dhau sij hawm lawv clutter lub rooj.

Yog li ntawd, qhov kev ua tau zoo ntawm lub rooj hash tuaj yeem maj mam degrade, tshwj xeeb tshaj yog tias nws muaj nyob rau lub sijhawm ntev thiab muaj ntau qhov ntxig thiab tshem tawm. Ib txoj hauv kev los txo cov kev tsis zoo no yog rov ua dua tshiab rau hauv lub rooj tshiab nrog tus nqi siv qis thiab lim tawm cov yuam sij tshem tawm thaum lub sijhawm rov ua dua.

Txhawm rau piav qhia txog cov teeb meem tau piav qhia, Kuv yuav siv cov cai saum toj no los tsim ib lub rooj nrog 128 lab cov ntsiab lus thiab voj mus txog 4 lab cov ntsiab lus kom txog thaum kuv tau ua tiav 124 lab slots (siv tus nqi ntawm 0,96). Ntawm no yog lub ntsiab lus, txhua kab yog CUDA ntsiav hu kom ntxig 4 lab cov ntsiab lus tshiab rau hauv ib lub rooj hash:

Kev siv tus nqi
Insertion duration 4 hais

0,00
11,608448 ms (361,314798 lab tus yuam sij / sec.)

0,03
11,751424 ms (356,918799 lab tus yuam sij / sec.)

0,06
11,942592 ms (351,205515 lab tus yuam sij / sec.)

0,09
12,081120 ms (347,178429 lab tus yuam sij / sec.)

0,12
12,242560 ms (342,600233 lab tus yuam sij / sec.)

0,16
12,396448 ms (338,347235 lab tus yuam sij / sec.)

0,19
12,533024 ms (334,660176 lab tus yuam sij / sec.)

0,22
12,703328 ms (330,173626 lab tus yuam sij / sec.)

0,25
12,884512 ms (325,530693 lab tus yuam sij / sec.)

0,28
13,033472 ms (321,810182 lab tus yuam sij / sec.)

0,31
13,239296 ms (316,807174 lab tus yuam sij / sec.)

0,34
13,392448 ms (313,184256 lab tus yuam sij / sec.)

0,37
13,624000 ms (307,861434 lab tus yuam sij / sec.)

0,41
13,875520 ms (302,280855 lab tus yuam sij / sec.)

0,44
14,126528 ms (296,909756 lab tus yuam sij / sec.)

0,47
14,399328 ms (291,284699 lab tus yuam sij / sec.)

0,50
14,690304 ms (285,515123 lab tus yuam sij / sec.)

0,53
15,039136 ms (278,892623 lab tus yuam sij / sec.)

0,56
15,478656 ms (270,973402 lab tus yuam sij / sec.)

0,59
15,985664 ms (262,379092 lab tus yuam sij / sec.)

0,62
16,668673 ms (251,627968 lab tus yuam sij / sec.)

0,66
17,587200 ms (238,486174 lab tus yuam sij / sec.)

0,69
18,690048 ms (224,413765 lab tus yuam sij / sec.)

0,72
20,278816 ms (206,831789 lab tus yuam sij / sec.)

0,75
22,545408 ms (186,038058 lab tus yuam sij / sec.)

0,78
26,053312 ms (160,989275 lab tus yuam sij / sec.)

0,81
31,895008 ms (131,503463 lab tus yuam sij / sec.)

0,84
42,103294 ms (99,619378 lab tus yuam sij / sec.)

0,87
61,849056 ms (67,815164 lab tus yuam sij / sec.)

0,90
105,695999 ms (39,682713 lab tus yuam sij / sec.)

0,94
240,204636 ms (17,461378 lab tus yuam sij / sec.)

Raws li kev siv nce ntxiv, kev ua haujlwm qis dua. Qhov no tsis tsim nyog nyob rau hauv feem ntau. Yog tias daim ntawv thov ntxig cov ntsiab lus rau hauv lub rooj thiab muab pov tseg (piv txwv li, thaum suav cov lus hauv phau ntawv), ces qhov no tsis yog teeb meem. Tab sis yog tias daim ntawv thov siv lub rooj ntev ntev hash (piv txwv li, hauv cov duab editor los khaws cov khoom tsis muaj qhov khoob ntawm cov duab uas tus neeg siv nquag ntxig thiab tshem tawm cov ntaub ntawv), ces tus cwj pwm no tuaj yeem muaj teeb meem.

Thiab ntsuas lub rooj hash soj ntsuam qhov tob tom qab 64 lab ntxig (siv qhov zoo tshaj 0,5). Qhov nruab nrab qhov tob yog 0,4774, yog li feem ntau cov yuam sij yog nyob rau hauv qhov zoo tshaj plaws qhov tau los yog ib lub qhov deb ntawm qhov zoo tshaj plaws txoj hauj lwm. Qhov siab tshaj plaws suab nrov yog 60.

Tom qab ntawd kuv ntsuas qhov ntsuas qhov tob ntawm lub rooj nrog 124 lab qhov ntxig (siv qhov ntsuas 0,97). Qhov nruab nrab qhov tob yog 10,1757, thiab qhov siab tshaj plaws - 6474 (!!). Linear sensing kev ua tau zoo poob qis ntawm kev siv cov nqi siab.

Nws yog qhov zoo tshaj kom khaws cov lus hash no siv tus nqi qis. Tab sis tom qab ntawd peb nce kev ua tau zoo ntawm kev siv lub cim xeeb. Hmoov zoo, nyob rau hauv cov ntaub ntawv ntawm 32-ntsis yuam sij thiab qhov tseem ceeb, qhov no tuaj yeem tsim nyog. Yog tias hauv qhov piv txwv saum toj no, hauv ib lub rooj nrog 128 lab lub ntsiab lus, peb khaws qhov kev siv ntawm 0,25, ces peb tuaj yeem tso tsis pub ntau tshaj 32 lab cov ntsiab lus hauv nws, thiab qhov seem 96 lab qhov yuav ploj - 8 bytes rau txhua khub. , 768 MB ntawm kev nco ploj.

Thov nco ntsoov tias peb tab tom tham txog qhov poob ntawm daim npav video nco, uas yog qhov muaj txiaj ntsig zoo dua li kev nco. Txawm hais tias feem ntau niaj hnub desktop graphics phaib uas txhawb CUDA muaj tsawg kawg yog 4 GB ntawm lub cim xeeb (thaum lub sijhawm sau ntawv, NVIDIA 2080 Ti muaj 11 GB), nws tseem yuav tsis yog qhov kev txiav txim siab tshaj plaws kom poob cov nyiaj ntawd.

Tom qab ntawd kuv yuav sau ntau ntxiv txog kev tsim cov rooj hash rau daim npav video uas tsis muaj teeb meem nrog kev soj ntsuam qhov tob, nrog rau txoj hauv kev los rov siv dua cov ntawv tshem tawm.

Kev ntsuas qhov tob

Txhawm rau txiav txim siab qhov tob ntawm tus yuam sij, peb tuaj yeem rho tawm tus yuam sij hash (nws lub ntsiab lus zoo tshaj plaws) los ntawm nws qhov ntsuas qhov tseeb:

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

Vim hais tias ntawm cov khawv koob ntawm ob tus ob lub complement binary tooj thiab qhov tseeb hais tias lub peev xwm ntawm lub rooj hash yog ob mus rau lub hwj chim ntawm ob, txoj kev no yuav ua hauj lwm txawm tias thaum lub sij hawm tseem ceeb Performance index yog tsiv mus rau qhov pib ntawm lub rooj. Cia peb muab tus yuam sij uas hashed rau 1, tab sis muab tso rau hauv qhov 3. Ces rau lub rooj uas muaj peev xwm 4 peb tau txais (3 β€” 1) & 3, uas yog sib npaug rau 2.

xaus

Yog tias koj muaj lus nug lossis lus nug, thov email rau kuv ntawm Twitter los yog qhib lub ncauj lus tshiab hauv chaw khaws cia.

Cov cai no tau sau raws li kev tshoov siab los ntawm cov khoom zoo:

Nyob rau hauv lub neej yav tom ntej, kuv yuav txuas ntxiv sau txog kev siv lub rooj hash rau video phaib thiab txheeb xyuas lawv cov kev ua tau zoo. Kuv cov phiaj xwm suav nrog chaining, Robin Hood hashing, thiab cuckoo hashing siv cov haujlwm atomic hauv cov ntaub ntawv cov qauv uas yog GPU tus phooj ywg.

Tau qhov twg los: www.hab.com

Ntxiv ib saib