Simple hash tabili fun GPU

Simple hash tabili fun GPU
Mo ti firanṣẹ lori Github titun ise agbese A Simple GPU Hash Table.

O jẹ tabili hash GPU ti o rọrun ti o lagbara lati ṣiṣẹ awọn ọgọọgọrun miliọnu awọn ifibọ fun iṣẹju kan. Lori kọǹpútà alágbèéká NVIDIA GTX 1060 mi, koodu naa nfi 64 milionu awọn orisii iye-bọtini ti ipilẹṣẹ laileto ni iwọn 210 ms ati yọkuro awọn orisii miliọnu 32 ni bii 64 ms.

Iyẹn ni, iyara lori kọǹpútà alágbèéká kan fẹrẹ to 300 million awọn ifibọ / iṣẹju-aaya ati 500 million paarẹ / iṣẹju-aaya.

A kọ tabili ni CUDA, botilẹjẹpe ilana kanna le ṣee lo si HLSL tabi GLSL. Imuse naa ni awọn idiwọn pupọ lati rii daju iṣẹ ṣiṣe giga lori kaadi fidio kan:

  • Awọn bọtini 32-bit nikan ati awọn iye kanna ni a ṣe ilana.
  • Tabili hash ni iwọn ti o wa titi.
  • Ati iwọn yii gbọdọ jẹ dogba si meji si agbara.

Fun awọn bọtini ati awọn iye, o nilo lati ṣe ifipamọ ami apinfunni ti o rọrun (ninu koodu loke eyi ni 0xffffffff).

Hash tabili lai titii

Tabili hash nlo adirẹsi ṣiṣi pẹlu laini probing, iyẹn ni, o jẹ akojọpọ awọn orisii iye bọtini ti o fipamọ sinu iranti ati pe o ni iṣẹ kaṣe giga julọ. Bakan naa ni a ko le sọ fun sisopọ, eyiti o kan wiwa fun atọka ninu atokọ ti o sopọ mọ. Tabili elile jẹ awọn eroja titoju titobi ti o rọrun KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

Iwọn tabili jẹ agbara ti awọn meji, kii ṣe nọmba akọkọ, nitori pe itọnisọna iyara kan to lati lo iboju-boju pow2/AND, ṣugbọn oniṣẹ modulus lọra pupọ. Eleyi jẹ pataki ninu ọran ti laini probing, niwon ni a PCM tabili jade Atọka Iho gbọdọ wa ni ti a we ni kọọkan Iho . Ati bi awọn kan abajade, awọn iye owo ti awọn isẹ ti wa ni afikun modulo ni kọọkan Iho .

Tabili nikan ni o tọju bọtini ati iye fun eroja kọọkan, kii ṣe hash ti bọtini. Niwọn bi tabili ṣe tọju awọn bọtini 32-bit nikan, hash jẹ iṣiro ni iyara pupọ. Awọn koodu ti o wa loke nlo Murmur3 hash, eyiti o ṣe awọn iyipada diẹ nikan, XORs ati awọn isodipupo.

Tabili hash nlo awọn ilana aabo titiipa ti o jẹ ominira ti aṣẹ iranti. Paapaa ti diẹ ninu awọn iṣẹ kikọ ba dabaru aṣẹ ti iru awọn iṣẹ miiran, tabili hash yoo tun ṣetọju ipo ti o pe. A yoo sọrọ nipa eyi ni isalẹ. Ilana naa n ṣiṣẹ nla pẹlu awọn kaadi fidio ti o nṣiṣẹ ẹgbẹẹgbẹrun awọn okun nigbakanna.

Awọn bọtini ati awọn iye ninu tabili hash ti wa ni ipilẹṣẹ si ofo.

Awọn koodu le ṣe atunṣe lati mu awọn bọtini 64-bit ati awọn iye daradara. Awọn bọtini nilo kika atomiki, kikọ, ati afiwe-ati-siwopu. Ati awọn iye nilo kika atomiki ati awọn iṣẹ kikọ. O da, ni CUDA, awọn iṣẹ-kika-kikọ fun awọn iye 32- ati 64-bit jẹ atomiki niwọn igba ti wọn ba ni ibamu nipa ti ara (wo isalẹ). nibi), ati awọn kaadi fidio ode oni ṣe atilẹyin awọn iṣẹ ṣiṣe afiwe-ati-paṣipaarọ atomiki 64-bit. Nitoribẹẹ, nigba gbigbe si awọn iwọn 64, iṣẹ ṣiṣe yoo dinku diẹ.

Hash tabili ipinle

Tọkọtaya iye-bọtini kọọkan ninu tabili hash le ni ọkan ninu awọn ipinlẹ mẹrin:

  • Bọtini ati iye ti ṣofo. Ni ipo yii, tabili hash ti wa ni ipilẹṣẹ.
  • Bọtini naa ti kọ silẹ, ṣugbọn iye ko ti kọ tẹlẹ. Ti okun miiran ba n ka data lọwọlọwọ, yoo pada wa ni ofo. Eyi jẹ deede, ohun kanna yoo ti ṣẹlẹ ti o tẹle ipaniyan miiran ti ṣiṣẹ diẹ sẹyin, ati pe a n sọrọ nipa eto data nigbakanna.
  • Mejeeji bọtini ati iye ti wa ni igbasilẹ.
  • Iye naa wa si awọn okun ipaniyan miiran, ṣugbọn bọtini ko sibẹsibẹ. Eyi le ṣẹlẹ nitori awoṣe siseto CUDA ni awoṣe iranti ti o paṣẹ ni alaimuṣinṣin. Eyi jẹ deede; ni eyikeyi iṣẹlẹ, bọtini ṣi ṣofo, paapaa ti iye ko ba si bẹ.

Ohun pataki nuance ni wipe ni kete ti awọn bọtini ti a ti kọ si awọn Iho, o ko si ohun to gbe - paapa ti o ba awọn bọtini ti wa ni paarẹ, a yoo soro nipa yi ni isalẹ.

Koodu tabili hash paapaa n ṣiṣẹ pẹlu awọn awoṣe iranti ti a ti paṣẹ ni alaimuṣinṣin ninu eyiti aṣẹ ti a ka ati kikọ iranti jẹ aimọ. Bi a ṣe nwo ifibọ, wiwa, ati piparẹ ninu tabili hash, ranti pe bata-iye bọtini kọọkan wa ni ọkan ninu awọn ipinlẹ mẹrin ti a ṣalaye loke.

Fi sii sinu tabili hash

Iṣẹ CUDA ti o fi awọn orisii iye bọtini sinu tabili hash dabi eyi:

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

Lati fi bọtini kan sii, koodu naa ṣe atunṣe nipasẹ tabili tabili hash ti o bẹrẹ pẹlu hash ti bọtini ti a fi sii. Iho kọọkan ninu awọn orun ṣe ohun atomiki afiwe-ati-siwopu isẹ ti o wé awọn bọtini ni wipe Iho to sofo. Ti o ba ti a mismatch ti wa ni-ri, awọn bọtini ni awọn Iho ni imudojuiwọn pẹlu awọn bọtini ti a fi sii, ati ki o si awọn atilẹba Iho bọtini ti wa ni pada. Ti bọtini atilẹba yii ba ṣofo tabi baamu bọtini ti a fi sii, lẹhinna koodu naa rii aaye ti o dara fun fifi sii ati fi iye ti a fi sii sinu iho naa.

Ti o ba wa ni ipe ekuro kan gpu_hashtable_insert() Awọn eroja lọpọlọpọ wa pẹlu bọtini kanna, lẹhinna eyikeyi awọn iye wọn le kọ si iho bọtini. Eyi ni a gba pe o jẹ deede: ọkan ninu awọn bọtini-iye kọwe lakoko ipe yoo ṣaṣeyọri, ṣugbọn niwọn igba ti gbogbo eyi ṣẹlẹ ni afiwe laarin ọpọlọpọ awọn okun ti ipaniyan, a ko le ṣe asọtẹlẹ iru kikọ iranti yoo jẹ eyi ti o kẹhin.

Ṣiṣayẹwo tabili hash

Koodu fun awọn bọtini wiwa:

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

Lati wa iye bọtini ti a fipamọ sinu tabili kan, a ṣe atunwo nipasẹ ọna ti o bẹrẹ pẹlu hash ti bọtini ti a n wa. Ni kọọkan Iho, a ṣayẹwo ti o ba awọn bọtini ni awọn ọkan ti a ti wa ni nwa fun, ati ti o ba bẹ, a pada awọn oniwe-iye. A tun ṣayẹwo boya bọtini naa ba ṣofo, ati pe ti o ba jẹ bẹ, a fagilee wiwa naa.

Ti a ko ba ri bọtini naa, koodu naa yoo pada iye ti o ṣofo.

Gbogbo awọn iṣẹ ṣiṣe wiwa wọnyi le ṣee ṣe ni igbakanna nipasẹ awọn ifibọ ati awọn piparẹ. Tọkọtaya kọọkan ninu tabili yoo ni ọkan ninu awọn ipinlẹ mẹrin ti a ṣalaye loke fun sisan.

Nparẹ ninu tabili hash

Koodu fun piparẹ awọn bọtini:

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

Paarẹ bọtini kan jẹ ni ọna dani: a fi bọtini silẹ ni tabili ati samisi iye rẹ (kii ṣe bọtini funrararẹ) bi ofo. Yi koodu jẹ gidigidi iru si lookup(), ayafi ti o ba ti a baramu ti wa ni ri lori a bọtini, o mu ki awọn oniwe-iye ofo.

Bi darukọ loke, ni kete ti a bọtini ti wa ni kọ si a Iho , o ti wa ni ko si ohun to gbe. Paapaa nigbati ohun elo ba paarẹ lati tabili, bọtini naa wa ni aye, iye rẹ di ofo. Eyi tumọ si pe a ko nilo lati lo iṣẹ kikọ atomiki fun iye Iho, nitori ko ṣe pataki boya iye ti isiyi jẹ ofo tabi rara - yoo tun di ofo.

Yiyipada tabili hash kan

O le yi iwọn tabili hash pada nipa ṣiṣẹda tabili nla ati fifi awọn eroja ti ko ṣofo sii lati tabili atijọ sinu rẹ. Emi ko ṣe iṣẹ ṣiṣe yii nitori Mo fẹ lati jẹ ki koodu ayẹwo jẹ rọrun. Pẹlupẹlu, ninu awọn eto CUDA, ipin iranti ni igbagbogbo ṣe ni koodu agbalejo ju ninu ekuro CUDA.

Nkan na A Titii-Ọfẹ Duro-Ọfẹ Hash Tabili ṣapejuwe bi o ṣe le yipada iru igbekalẹ data ti o ni aabo titiipa.

Idije

Ni awọn loke iṣẹ koodu snippets gpu_hashtable_insert(), _lookup() и _delete() ilana ọkan bọtini-iye bata ni akoko kan. Ati isalẹ gpu_hashtable_insert(), _lookup() и _delete() ṣe ilana akojọpọ awọn orisii ni afiwe, bata kọọkan ni okun ipaniyan GPU lọtọ:

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

Tabili hash titii-titii ṣe atilẹyin awọn ifibọ nigbakanna, wiwa, ati awọn piparẹ. Nitoripe awọn orisii iye-bọtini nigbagbogbo wa ni ọkan ninu awọn ipinlẹ mẹrin ati awọn bọtini ko gbe, tabili ṣe iṣeduro pe o tọ paapaa nigbati awọn oriṣiriṣi awọn iṣẹ ṣiṣe lo ni akoko kanna.

Bibẹẹkọ, ti a ba ṣe ilana ipele kan ti awọn ifibọ ati awọn piparẹ ni afiwe, ati pe ti ọna titẹ sii ti awọn orisii ba ni awọn bọtini ẹda ẹda, lẹhinna a kii yoo ni anfani lati ṣe asọtẹlẹ iru awọn orisii ti yoo “bori” - yoo kọ si tabili hash nikẹhin. Jẹ ki a sọ pe a pe koodu ifibọ pẹlu ọna kika ti awọn orisii A/0 B/1 A/2 C/3 A/4. Nigbati koodu ba pari, awọn orisii B/1 и C/3 jẹ iṣeduro lati wa ninu tabili, ṣugbọn ni akoko kanna eyikeyi ninu awọn orisii yoo han ninu rẹ A/0, A/2 tabi A/4. Eyi le tabi ko le jẹ iṣoro - gbogbo rẹ da lori ohun elo naa. O le mọ tẹlẹ pe ko si awọn bọtini ẹda-ẹda ninu ọna titẹ sii, tabi o le ma bikita iye wo ni a kọ nikẹhin.

Ti eyi ba jẹ iṣoro fun ọ, lẹhinna o nilo lati ya awọn orisii ẹda-iwe si oriṣiriṣi awọn ipe eto CUDA. Ni CUDA, iṣẹ eyikeyi ti o pe ekuro nigbagbogbo n pari ṣaaju ipe ekuro ti o tẹle (o kere ju laarin okun kan. Ni awọn okun oriṣiriṣi, awọn kernels ti wa ni ṣiṣe ni afiwe). Ni apẹẹrẹ loke, ti o ba pe ekuro kan pẹlu A/0 B/1 A/2 C/3, ati awọn miiran pẹlu A/4, lẹhinna bọtini A yoo gba iye 4.

Bayi jẹ ki a sọrọ nipa boya awọn iṣẹ yẹ lookup() и delete() lo itọka itele tabi iyipada si opo orisii ninu tabili hash. CUDA Iwe O sọ pe:

Olupilẹṣẹ le yan lati mu kika kika ati kikọ si agbaye tabi iranti pinpin… Awọn iṣapeye wọnyi le jẹ alaabo nipa lilo koko-ọrọ volatile: ... Eyikeyi itọkasi si oniyipada yii ni a ṣajọpọ sinu iranti kika gidi tabi kọ ẹkọ.

Awọn ero atunṣe ko nilo ohun elo volatile. Ti okun ipaniyan ba lo iye ti a fipamọ lati iṣẹ ṣiṣe kika iṣaaju, lẹhinna yoo jẹ lilo alaye ti igba atijọ. Ṣugbọn sibẹ, eyi jẹ alaye lati ipo deede ti tabili hash ni akoko kan ti ipe ekuro. Ti o ba nilo lati lo alaye tuntun, o le lo itọka naa volatile, ṣugbọn lẹhinna iṣẹ naa yoo dinku diẹ: ni ibamu si awọn idanwo mi, nigba piparẹ awọn eroja miliọnu 32, iyara naa dinku lati awọn piparẹ miliọnu 500 / iṣẹju-aaya si awọn piparẹ miliọnu 450 / iṣẹju-aaya.

Ise sise

Ninu idanwo fun fifi awọn eroja 64 milionu ati piparẹ 32 milionu ninu wọn, idije laarin std::unordered_map ati pe ko si tabili hash fun GPU:

Simple hash tabili fun GPU
std::unordered_map lo 70 ms fifi sii ati yiyọ awọn eroja ati lẹhinna laaye wọn unordered_map (yọkuro awọn miliọnu awọn eroja gba akoko pupọ, nitori inu unordered_map ọpọ iranti ipin ti wa ni ṣe). Nitootọ, std:unordered_map patapata ti o yatọ awọn ihamọ. O jẹ okun Sipiyu kan ti ipaniyan, ṣe atilẹyin awọn iye-bọtini ti iwọn eyikeyi, ṣe daradara ni awọn oṣuwọn lilo giga, ati ṣafihan iṣẹ iduroṣinṣin lẹhin awọn piparẹ pupọ.

Iye akoko tabili hash fun GPU ati ibaraẹnisọrọ laarin eto jẹ 984 ms. Eyi pẹlu akoko ti o lo gbigbe tabili sinu iranti ati piparẹ rẹ (fifi 1 GB ti iranti silẹ ni akoko kan, eyiti o gba akoko diẹ ninu CUDA), fifi sii ati piparẹ awọn eroja, ati atunbere lori wọn. Gbogbo awọn adakọ si ati lati iranti kaadi fidio ni a tun ṣe sinu akọọlẹ.

Tabili hash funrararẹ gba 271 ms lati pari. Eyi pẹlu akoko ti kaadi fidio ti nfi sii ati piparẹ awọn eroja, ati pe ko ṣe akiyesi akoko ti o lo didakọ sinu iranti ati aṣetunṣe lori tabili abajade. Ti tabili GPU ba wa laaye fun igba pipẹ, tabi ti tabili hash ba wa ni igbọkanle ninu iranti kaadi fidio (fun apẹẹrẹ, lati ṣẹda tabili hash ti yoo lo nipasẹ koodu GPU miiran kii ṣe ero isise aarin), lẹhinna abajade idanwo jẹ pataki.

Tabili hash fun kaadi fidio n ṣe afihan iṣẹ giga nitori ilosi giga ati isọdọkan ti nṣiṣe lọwọ.

shortcomings

Awọn faaji tabili hash ni awọn ọran diẹ lati mọ si:

  • Ṣiṣayẹwo laini jẹ idiwọ nipasẹ iṣupọ, eyiti o fa ki awọn bọtini inu tabili gbe kere ju pipe lọ.
  • Awọn bọtini ko yọ kuro ni lilo iṣẹ naa delete ati lori akoko ti won clutter tabili.

Bi abajade, iṣẹ ti tabili hash le dinku diẹdiẹ, paapaa ti o ba wa fun igba pipẹ ati pe o ni ọpọlọpọ awọn ifibọ ati paarẹ. Ọna kan lati dinku awọn aila-nfani wọnyi ni lati rehash sinu tabili tuntun pẹlu iwọn lilo kekere ti iṣẹtọ ati ṣe àlẹmọ awọn bọtini yiyọ kuro lakoko isọdọtun.

Lati ṣe apejuwe awọn ọran ti a ṣalaye, Emi yoo lo koodu ti o wa loke lati ṣẹda tabili kan pẹlu awọn eroja miliọnu 128 ati lupu nipasẹ awọn eroja miliọnu 4 titi Emi yoo fi kun awọn iho 124 milionu (oṣuwọn lilo nipa 0,96). Eyi ni tabili abajade, ila kọọkan jẹ ipe ekuro CUDA lati fi awọn eroja tuntun 4 miliọnu sinu tabili hash kan:

Iwọn lilo
Iye akoko ifibọ 4 eroja

0,00
11,608448 ms (361,314798 awọn bọtini miliọnu / iṣẹju-aaya)

0,03
11,751424 ms (356,918799 awọn bọtini miliọnu / iṣẹju-aaya)

0,06
11,942592 ms (351,205515 awọn bọtini miliọnu / iṣẹju-aaya)

0,09
12,081120 ms (347,178429 awọn bọtini miliọnu / iṣẹju-aaya)

0,12
12,242560 ms (342,600233 awọn bọtini miliọnu / iṣẹju-aaya)

0,16
12,396448 ms (338,347235 awọn bọtini miliọnu / iṣẹju-aaya)

0,19
12,533024 ms (334,660176 awọn bọtini miliọnu / iṣẹju-aaya)

0,22
12,703328 ms (330,173626 awọn bọtini miliọnu / iṣẹju-aaya)

0,25
12,884512 ms (325,530693 awọn bọtini miliọnu / iṣẹju-aaya)

0,28
13,033472 ms (321,810182 awọn bọtini miliọnu / iṣẹju-aaya)

0,31
13,239296 ms (316,807174 awọn bọtini miliọnu / iṣẹju-aaya)

0,34
13,392448 ms (313,184256 awọn bọtini miliọnu / iṣẹju-aaya)

0,37
13,624000 ms (307,861434 awọn bọtini miliọnu / iṣẹju-aaya)

0,41
13,875520 ms (302,280855 awọn bọtini miliọnu / iṣẹju-aaya)

0,44
14,126528 ms (296,909756 awọn bọtini miliọnu / iṣẹju-aaya)

0,47
14,399328 ms (291,284699 awọn bọtini miliọnu / iṣẹju-aaya)

0,50
14,690304 ms (285,515123 awọn bọtini miliọnu / iṣẹju-aaya)

0,53
15,039136 ms (278,892623 awọn bọtini miliọnu / iṣẹju-aaya)

0,56
15,478656 ms (270,973402 awọn bọtini miliọnu / iṣẹju-aaya)

0,59
15,985664 ms (262,379092 awọn bọtini miliọnu / iṣẹju-aaya)

0,62
16,668673 ms (251,627968 awọn bọtini miliọnu / iṣẹju-aaya)

0,66
17,587200 ms (238,486174 awọn bọtini miliọnu / iṣẹju-aaya)

0,69
18,690048 ms (224,413765 awọn bọtini miliọnu / iṣẹju-aaya)

0,72
20,278816 ms (206,831789 awọn bọtini miliọnu / iṣẹju-aaya)

0,75
22,545408 ms (186,038058 awọn bọtini miliọnu / iṣẹju-aaya)

0,78
26,053312 ms (160,989275 awọn bọtini miliọnu / iṣẹju-aaya)

0,81
31,895008 ms (131,503463 awọn bọtini miliọnu / iṣẹju-aaya)

0,84
42,103294 ms (99,619378 awọn bọtini miliọnu / iṣẹju-aaya)

0,87
61,849056 ms (67,815164 awọn bọtini miliọnu / iṣẹju-aaya)

0,90
105,695999 ms (39,682713 awọn bọtini miliọnu / iṣẹju-aaya)

0,94
240,204636 ms (17,461378 awọn bọtini miliọnu / iṣẹju-aaya)

Bi iṣamulo ti n pọ si, iṣẹ ṣiṣe dinku. Eyi kii ṣe ifẹ ni ọpọlọpọ igba. Ti ohun elo kan ba fi awọn eroja sinu tabili kan lẹhinna sọ wọn nù (fun apẹẹrẹ, nigba kika awọn ọrọ ninu iwe), lẹhinna eyi kii ṣe iṣoro. Ṣugbọn ti ohun elo naa ba lo tabili hash ti o pẹ to (fun apẹẹrẹ, ninu oluṣatunṣe awọn aworan lati ṣafipamọ awọn ẹya ti ko ṣofo ti awọn aworan nibiti olumulo nigbagbogbo nfi sii ati paarẹ alaye), lẹhinna ihuwasi yii le jẹ iṣoro.

Ati iwọn ijinle iwadi tabili hash lẹhin awọn ifibọ 64 million (ifosiwewe iṣamulo 0,5). Ijinle apapọ jẹ 0,4774, nitorinaa ọpọlọpọ awọn bọtini wa boya ninu iho ti o dara julọ tabi iho kan kuro ni ipo ti o dara julọ. Ijinle ohun ti o pọju jẹ 60.

Mo lẹhinna wọn ijinle iwadii lori tabili pẹlu awọn ifibọ miliọnu 124 (ifosiwewe iṣamulo 0,97). Ijinle apapọ ti tẹlẹ 10,1757, ati pe o pọju - 6474 (!!). Iṣe akiyesi laini ṣubu ni pataki ni awọn iwọn lilo giga.

O dara julọ lati jẹ ki iwọn lilo tabili hash yii kere. Ṣugbọn lẹhinna a mu iṣẹ pọ si laibikita agbara iranti. O da, ninu ọran ti awọn bọtini 32-bit ati awọn iye, eyi le jẹ idalare. Ti o ba wa ninu apẹẹrẹ ti o wa loke, ninu tabili pẹlu awọn eroja miliọnu 128, a tọju ifosiwewe lilo ti 0,25, lẹhinna a ko le gbe diẹ sii ju awọn eroja miliọnu 32 ninu rẹ, ati awọn iho 96 miliọnu ti o ku yoo padanu - 8 baiti fun bata kọọkan. , 768 MB ti sọnu iranti.

Jọwọ ṣe akiyesi pe a n sọrọ nipa isonu ti iranti kaadi fidio, eyiti o jẹ orisun ti o niyelori diẹ sii ju iranti eto lọ. Botilẹjẹpe ọpọlọpọ awọn kaadi kọnputa tabili ode oni ti o ṣe atilẹyin CUDA ni o kere ju 4 GB ti iranti (ni akoko kikọ, NVIDIA 2080 Ti ni 11 GB), kii yoo jẹ ipinnu ọlọgbọn julọ lati padanu iru awọn oye.

Nigbamii Emi yoo kọ diẹ sii nipa ṣiṣẹda awọn tabili hash fun awọn kaadi fidio ti ko ni awọn iṣoro pẹlu ijinle iwadii, ati awọn ọna lati tun lo awọn iho paarẹ.

Wiwọn ijinle ohun

Lati pinnu ijinle iwadii bọtini kan, a le jade hash bọtini naa (atọka tabili ti o dara julọ) lati atọka tabili gangan rẹ:

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

Nitori idan ti awọn nọmba alakomeji ti awọn meji meji ti o ni ibamu ati otitọ pe agbara ti tabili hash jẹ meji si agbara ti meji, ọna yii yoo ṣiṣẹ paapaa nigbati a ba gbe itọka bọtini si ibẹrẹ tabili. Jẹ ká ya a bọtini ti o hashed to 1, sugbon ti wa ni fi sii sinu Iho 3. Lẹhinna fun tabili pẹlu agbara 4 a gba. (3 — 1) & 3, eyiti o jẹ deede si 2.

ipari

Ti o ba ni awọn ibeere tabi awọn asọye, jọwọ fi imeeli ranṣẹ si mi twitter tabi ṣii akọle tuntun ni awọn ibi ipamọ.

A kọ koodu yii labẹ awokose lati awọn nkan to dara julọ:

Ni ọjọ iwaju, Emi yoo tẹsiwaju lati kọ nipa awọn imuse tabili hash fun awọn kaadi fidio ati itupalẹ iṣẹ wọn. Awọn ero mi pẹlu sisẹ, Robin Hood hashing, ati cuckoo hashing ni lilo awọn iṣẹ atomiki ni awọn ẹya data ti o jẹ ọrẹ GPU.

orisun: www.habr.com

Fi ọrọìwòye kun