ʻO ka papa hash maʻalahi no GPU

ʻO ka papa hash maʻalahi no GPU
Ua hoʻopuka wau ma Github papahana hou He Papa Hash GPU maʻalahi.

He papa hash GPU maʻalahi ia e hiki ke hana i nā haneli miliona o nā hoʻokomo i kēlā me kēia kekona. Ma kaʻu pona NVIDIA GTX 1060, hoʻokomo ke code i 64 miliona mau kī-waiwai paʻa ma kahi o 210 ms a wehe i 32 miliona mau pālua ma kahi o 64 ms.

ʻO ia hoʻi, ʻo ka wikiwiki o ka pona ma kahi o 300 miliona inserts / sec a me 500 miliona holoi / sec.

Ua kākau ʻia ka papa ma CUDA, ʻoiai hiki ke hoʻohana ʻia ke ʻano hana like i ka HLSL a i ʻole GLSL. He mau palena ka hoʻokō e hōʻoia i ka hana kiʻekiʻe ma ke kāleka wikiō:

  • Hoʻopili wale ʻia nā kī 32-bit a me nā waiwai like.
  • Loaʻa ka nui paʻa o ka papa hash.
  • A pono e like kēia nui me ʻelua i ka mana.

No nā kī a me nā waiwai, pono ʻoe e mālama i kahi marker delimiter maʻalahi (ma ke code ma luna nei ʻo 0xffffffff).

Papa Hash me ka laka ole

Hoʻohana ka papa hash i ka ʻōlelo huna me ʻimi laina laina, ʻo ia hoʻi, he pūʻulu o nā hui waiwai kī i mālama ʻia i ka hoʻomanaʻo a ʻoi aku ka maikaʻi o ka hana cache. ʻAʻole hiki ke ʻōlelo like ʻia no ke kaulahao, e pili ana i ka ʻimi ʻana i kahi kuhikuhi ma kahi papa inoa pili. ʻO ka papaʻaina hash kahi mea mālama maʻalahi KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

ʻO ka nui o ka papaʻaina he mana o ʻelua, ʻaʻole ka helu prime, no ka mea ua lawa kahi aʻo wikiwiki e hoʻopili ai i ka mask pow2/AND, akā ʻoi aku ka lohi o ka mea hoʻohana modulus. He mea koʻikoʻi kēia ma ke ʻano o ka hoʻāʻo ʻana i ka laina, no ka mea, i ka nānā ʻana i ka papaʻaina laina pono e hoʻopaʻa ʻia ka papa kuhikuhi slot i kēlā me kēia slot. A ʻo ka hopena, ua hoʻohui ʻia ke kumukūʻai o ka hana modulo i kēlā me kēia slot.

Mālama ka papaʻaina i ke kī a me ka waiwai no kēlā me kēia mea, ʻaʻole kahi hash o ke kī. No ka mea mālama wale ka papa ʻaina i nā kī 32-bit, ua helu wikiwiki ʻia ka hash. Hoʻohana ka code ma luna i ka hash Murmur3, e hana wale ana i kekahi mau hoʻololi, XOR a me nā hoʻonui.

Hoʻohana ka papaʻaina hash i nā ʻenehana pale laka kūʻokoʻa i ka hoʻonohonoho hoʻomanaʻo. ʻOiai inā hoʻopau kekahi mau hana kākau i ke ʻano o nā hana ʻē aʻe, e mālama mau ka papa hash i ke kūlana kūpono. E kamaʻilio mākou e pili ana i kēia ma lalo nei. Hana maikaʻi ka ʻenehana me nā kāleka wikiō e holo ana i nā tausani o nā kaula i ka manawa like.

Hoʻomaka ʻia nā kī a me nā waiwai i ka papaʻaina hash i ka hakahaka.

Hiki ke hoʻololi ʻia ke code e mālama i nā kī 64-bit a me nā waiwai pū kekahi. Pono nā kī i ka heluhelu ʻana, kākau, a me nā hana hoʻohālikelike a hoʻololi. A koi nā waiwai i nā hana heluhelu a kākau ʻana. ʻO ka mea pōmaikaʻi, ma CUDA, nā hana heluhelu-kākau no nā waiwai 32- a me 64-bit he atomic inā lōʻihi lākou e hoʻohālikelike ʻia (e ʻike i lalo). maanei), a kākoʻo nā kāleka wikiō hou i nā hana hoʻohālikelike atomika 64-bit. ʻOiaʻiʻo, ke neʻe nei i 64 bits, e emi iki ka hana.

ʻO ke kūlana papaʻaina Hash

Hiki i kēlā me kēia hui waiwai kī ma ka papa hash ke loaʻa kekahi o nā mokuʻāina ʻehā:

  • Ua nele ke kī a me ka waiwai. Ma kēia mokuʻāina, hoʻomaka ka papaʻaina hash.
  • Ua kākau ʻia ke kī, akā ʻaʻole i kākau ʻia ka waiwai. Inā heluhelu ʻia ka ʻikepili ʻē aʻe, a laila hoʻi nele. He mea maʻamau kēia, ʻo ia ka mea i hana ʻia inā ua hana liʻiliʻi ma mua o kahi kaula hoʻokō ʻē aʻe, a ke kamaʻilio nei mākou e pili ana i kahi hoʻolālā data concurrent.
  • Hoʻopaʻa ʻia ke kī a me ka waiwai.
  • Loaʻa ka waiwai i nā pae hoʻokō ʻē aʻe, akā ʻaʻole i loaʻa ke kī. Hiki i kēia ke hana no ka mea he kumu hoʻomanaʻo i kauoha ʻole ʻia ke kumu hoʻohālike CUDA. He mea maʻamau kēia; i kēlā me kēia hanana, ua nele ke kī, ʻoiai inā ʻaʻole pēlā ka waiwai.

ʻO kahi nuance koʻikoʻi i ka manawa i kākau ʻia ai ke kī i ka slot, ʻaʻole ia e neʻe hou - ʻoiai ke holoi ʻia ke kī, e kamaʻilio mākou e pili ana i kēia ma lalo.

Hoʻohana pū ʻia ke code papaʻaina hash me nā hiʻohiʻona hoʻomanaʻo i kauoha ʻole ʻia i ʻike ʻole ʻia ke ʻano o ka heluhelu ʻana a kākau ʻia. Ke nānā nei mākou i ka hoʻokomo ʻana, ka nānā ʻana, a me ka holoi ʻana i ka papaʻaina hash, e hoʻomanaʻo ʻo kēlā me kēia hui waiwai kī ma kekahi o nā mokuʻāina ʻehā i hōʻike ʻia ma luna.

Ke hoʻokomo nei i loko o ka papaʻaina hash

ʻO ka hana CUDA e hoʻokomo ana i nā hui waiwai kī i loko o ka papa hash e like me kēia:

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

No ka hoʻokomo ʻana i kahi kī, hoʻomaka ke code ma o ka papaʻaina hash e hoʻomaka me ka hash o ke kī i hoʻokomo ʻia. Hana kēlā me kēia slot i ka hana hoʻohālikelike-a-swap atomic e hoʻohālikelike ana i ke kī i loko o kēlā slot me ka hakahaka. Inā ʻike ʻia kahi kūlike ʻole, hoʻonui ʻia ke kī o ka slot me ke kī i hoʻokomo ʻia, a laila hoʻihoʻi ʻia ke kī kī mua. Inā nele kēia kī kumu a i like paha me ke kī i hoʻokomo ʻia, a laila ua loaʻa i ke code kahi slot kūpono no ka hoʻokomo ʻana a hoʻokomo i ka waiwai i hoʻokomo ʻia i loko o ka slot.

Inā ma hoʻokahi kāhea kernel gpu_hashtable_insert() he nui nā mea me ke kī hoʻokahi, a laila hiki ke kākau ʻia kekahi o kā lākou waiwai i ke kī kī. Manaʻo ʻia kēia he mea maʻamau: e kūleʻa ana kekahi o nā mea waiwai nui i ka wā o ke kelepona ʻana, akā no ka mea e hana like ana kēia mau mea a pau i loko o kekahi mau loina o ka hoʻokō ʻana, ʻaʻole hiki iā mākou ke wānana i ka mea kākau hoʻomanaʻo ka mea hope loa.

Huli papaʻaina Hash

Code no ka huli ʻana i nā kī:

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

No ka loaʻa ʻana o ka waiwai o kahi kī i mālama ʻia i loko o ka papaʻaina, hoʻomaka mākou ma o ka array e hoʻomaka me ka hash o ke kī a mākou e ʻimi nei. Ma kēlā me kēia slot, nānā mākou inā ʻo ke kī ka mea a mākou e ʻimi nei, a inā pēlā, hoʻihoʻi mākou i kona waiwai. E nānā pū mākou inā nele ke kī, a inā pēlā, kāpae mākou i ka ʻimi.

Inā ʻaʻole hiki iā mākou ke loaʻa ke kī, hoʻihoʻi ke code i kahi waiwai ʻole.

Hiki ke hana like kēia mau hana hulina ma o ka hoʻokomo ʻana a me ka holoi ʻana. Loaʻa i kēlā me kēia paʻa i ka papaʻaina kekahi o nā mokuʻāina ʻehā i hōʻike ʻia ma luna no ke kahe.

Holoi i loko o ka papaʻaina hash

Code no ka holoi ʻana i nā kī:

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

Hana ʻia ka holoi ʻana i kahi kī ma kahi ʻano maʻamau: waiho mākou i ke kī i ka papaʻaina a kaha i kona waiwai (ʻaʻole ke kī ponoʻī) me he mea ʻole. Ua like loa kēia code me lookup(), koe naʻe ke loaʻa kahi pāʻani ma ke kī, e hoʻonele ʻia kona waiwai.

E like me ka mea i ʻōlelo ʻia ma luna, ke kākau ʻia kahi kī i kahi slot, ʻaʻole ia e neʻe hou. ʻOiai ka holoi ʻia ʻana o kahi mea mai ka papaʻaina, e hoʻomau ʻia ke kī, lilo wale kona waiwai. ʻO ia ke kumu ʻaʻole pono mākou e hoʻohana i kahi hana kākau atomika no ka waiwai slot, no ka mea, ʻaʻole ia he mea nui inā he kaʻawale a ʻaʻole paha ka waiwai o kēia manawa - e lilo mau nō ia.

Hoʻololi hou i ka pākaukau hash

Hiki iā ʻoe ke hoʻololi i ka nui o ka papaʻaina hash ma ka hana ʻana i kahi papaʻaina nui aʻe a hoʻokomo i nā mea ʻole mai ka papaʻaina kahiko i loko. ʻAʻole wau i hoʻokō i kēia hana no ka mea makemake wau e maʻalahi ka code sample. Eia kekahi, ma nā polokalamu CUDA, hana pinepine ʻia ka hoʻomanaʻo ʻana i ka code host ma mua o ka kernel CUDA.

ʻO ka ʻatikala He Paʻa Hash ʻAʻohe Laka ʻole wehewehe i ke ʻano o ka hoʻololi ʻana i ia ʻano ʻikepili pale laka.

Ka hoʻokūkū

Ma nā snippet code hana ma luna gpu_hashtable_insert(), _lookup() и _delete() kaʻina hoʻokahi kī-waiwai paʻa i ka manawa. A lalo gpu_hashtable_insert(), _lookup() и _delete() kaʻana like i nā ʻano hui like ʻole, kēlā me kēia pālua i kahi pae hoʻokō GPU ʻokoʻa:

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

Kākoʻo ka papaʻaina hash kūpaʻa i ka laka i nā hoʻokomo like, nā nānā, a me nā holoi ʻana. No ka mea, paʻa mau nā hui waiwai kī ma kekahi o nā mokuʻāina ʻehā a ʻaʻole neʻe nā kī, hōʻoia ka papa ʻaina i ka pololei ʻoiai ke hoʻohana ʻia nā ʻano hana like ʻole i ka manawa like.

Eia nō naʻe, inā mākou e hana i kahi pūʻulu o nā hoʻokomo a me nā holoi ʻana i ka like, a inā loaʻa nā kī pālua i ka papa hoʻokomo o nā pālua, a laila ʻaʻole hiki iā mākou ke wānana i nā hui e "lanakila" -e kākau ʻia i ka papa hash hope loa. E ʻōlelo mākou ua kāhea mākou i ke code hoʻokomo me kahi ʻano hoʻokomo o nā pālua A/0 B/1 A/2 C/3 A/4. Ke hoʻopau ʻia ke code, hui pū B/1 и C/3 ua hōʻoia ʻia e loaʻa i ka papaʻaina, akā i ka manawa like e ʻike ʻia kekahi o nā pālua i loko A/0, A/2 ai ole ia, A/4. He pilikia paha kēia a ʻaʻole paha - pili ia i ka noi. Hiki paha iā ʻoe ke ʻike ma mua ʻaʻohe kī pālua i ka laha hoʻokomo, a ʻaʻole paha ʻoe e noʻonoʻo i ka waiwai i kākau hope ʻia.

Inā he pilikia kēia iā ʻoe, a laila pono ʻoe e hoʻokaʻawale i nā pālua pālua i nā kelepona ʻōnaehana CUDA ʻē aʻe. Ma CUDA, hoʻopau mau ka hana e kāhea ana i ka kernel ma mua o ke kelepona kernel aʻe (ma ka liʻiliʻi ma loko o hoʻokahi kaula. I ka laʻana ma luna, inā ʻoe e kāhea i hoʻokahi kernel me A/0 B/1 A/2 C/3, a me kekahi me A/4, a laila ke kī A e loaʻa ka waiwai 4.

I kēia manawa e kamaʻilio e pili ana inā pono nā hana lookup() и delete() e hoʻohana i kahi kuhikuhi maʻalahi a i ʻole nā ​​​​mea kikoʻī i kahi ʻano o nā pālua ma ka papa hash. Palapala CUDA Wahi a:

Hiki i ka mea hōʻuluʻulu ke koho e hoʻonui i ka heluhelu a me ke kākau ʻana i ka hoʻomanaʻo honua a i ʻole ka hoʻomanaʻo like ʻana... Hiki ke hoʻopau ʻia kēia mau loiloi me ka hoʻohana ʻana i ka huaʻōlelo. volatile: ... hoʻohui ʻia kekahi ʻōlelo i kēia ʻano hoʻololi i kahi ʻōlelo hoʻomanaʻo maoli e heluhelu a kākau paha.

ʻAʻole pono ka noi ʻana i ka noʻonoʻo pono volatile. Inā hoʻohana ka pae hoʻokō i kahi waiwai i hūnā ʻia mai kahi hana heluhelu mua, a laila e hoʻohana ana ia i ka ʻike kahiko. Akā naʻe, ʻo kēia ka ʻike mai ke kūlana pololei o ka papaʻaina hash i kekahi manawa o ke kāhea kernel. Inā pono ʻoe e hoʻohana i ka ʻike hou loa, hiki iā ʻoe ke hoʻohana i ka index volatile, akā, e emi iki ka hana: e like me kaʻu mau ho'āʻo, i ka wā e holoi ai i 32 miliona mau mea, ua emi ka wikiwiki mai 500 miliona holoi / sec i 450 miliona holoi / sec.

'Ohanahana

I ka hoʻāʻo no ka hoʻokomo ʻana i 64 miliona mau mea a me ka holoi ʻana i 32 miliona o lākou, hoʻokūkū ma waena std::unordered_map a aneane ʻaʻohe papa hash no ka GPU:

ʻO ka papa hash maʻalahi no GPU
std::unordered_map Ua hoʻohana ʻo 70 ms i ka hoʻokomo a wehe ʻana i nā mea a laila hoʻokuʻu iā lākou unordered_map (ʻo ka hoʻopau ʻana i nā miliona o nā mea he nui ka manawa, no ka mea i loko unordered_map hana ʻia nā ʻāpana hoʻomanaʻo he nui). ʻO ka ʻōlelo ʻoiaʻiʻo, std:unordered_map nā kapu ʻokoʻa loa. ʻO ia kahi pae CPU hoʻokahi o ka hoʻokō, kākoʻo i nā waiwai kī o kēlā me kēia nui, hana maikaʻi i nā helu hoʻohana kiʻekiʻe, a hōʻike i ka hana paʻa ma hope o ka holoi ʻana he nui.

ʻO ka lōʻihi o ka papaʻaina hash no ka GPU a me ke kamaʻilio ma waena o ka papahana he 984 ms. Hoʻopili kēia i ka manawa e waiho ai i ka papaʻaina i ka hoʻomanaʻo a me ka holoi ʻana iā ia (e hoʻokaʻawale i ka 1 GB o ka hoʻomanaʻo i hoʻokahi manawa, e lōʻihi ana ka manawa ma CUDA), e hoʻokomo a holoi i nā mea, a me ka ʻike ʻana ma luna o lākou. Hoʻopili pū ʻia nā kope a pau i ka hoʻomanaʻo kāleka wikiō.

ʻO ka papa hash ponoʻī i lawe i 271 ms e hoʻopau. Hoʻopili kēia i ka manawa i hoʻohana ʻia e ke kāleka wikiō e hoʻokomo a holoi i nā mea, a ʻaʻole e noʻonoʻo i ka manawa i hoʻohana ʻia i ke kope ʻana i ka hoʻomanaʻo a me ka hoʻomaʻamaʻa ʻana ma luna o ka papaʻaina. Inā lōʻihi ka lōʻihi o ka noho ʻana o ka papaʻaina GPU, a i ʻole ka papaʻaina hash i loko o ka hoʻomanaʻo o ke kāleka wikiō (no ka laʻana, e hana i kahi papa hash e hoʻohana ʻia e nā code GPU ʻē aʻe a ʻaʻole ke kikowaena kikowaena), a laila pili ka hopena ho'āʻo.

Hōʻike ka papaʻaina hash no kahi kāleka wikiō i ka hana kiʻekiʻe ma muli o ke kahe kiʻekiʻe a me ka parallelization ikaika.

hewa

Aia kekahi mau pilikia e makaʻala i ka papa kuhikuhi hash:

  • Hoʻopilikia ʻia ka hoʻāʻo ʻana i ka laina e ka hui ʻana, kahi e hoʻokau ʻia ai nā kī i ka papaʻaina ma mua o ka maikaʻi.
  • ʻAʻole wehe ʻia nā kī me ka hoʻohana ʻana i ka hana delete a i ka wā lōʻihi e hoʻopuehu lākou i ka papaʻaina.

ʻO ka hopena, hiki ke hoʻohaʻahaʻa haʻahaʻa ka hana o ka papa hash, ʻoiai inā lōʻihi ka lōʻihi a he nui nā hoʻokomo a me nā holoi. ʻO kahi ala e hoʻohaʻahaʻa ai i kēia mau hemahema ʻo ka hoʻihoʻi hou ʻana i kahi papaʻaina hou me ka haʻahaʻa haʻahaʻa o ka hoʻohana ʻana a kānana i nā kī i wehe ʻia i ka wā o ka rehashing.

No ka hōʻike ʻana i nā pilikia i wehewehe ʻia, e hoʻohana wau i ka code ma luna e hana i kahi papa me 128 miliona mau mea a hoʻopaʻa ʻia ma o 4 miliona mau mea a hiki i koʻu hoʻopiha ʻana i 124 miliona mau slot (ka helu hoʻohana ma kahi o 0,96). Eia ka papaʻaina hopena, ʻo kēlā me kēia lālani he kelepona CUDA e hoʻokomo i 4 miliona mau mea hou i loko o ka papaʻaina hash:

Laki hoohana
Ka lōʻihi o ka hoʻokomo ʻana 4 mau mea

0,00
11,608448 ms (361,314798 miliona kī/sec.)

0,03
11,751424 ms (356,918799 miliona kī/sec.)

0,06
11,942592 ms (351,205515 miliona kī/sec.)

0,09
12,081120 ms (347,178429 miliona kī/sec.)

0,12
12,242560 ms (342,600233 miliona kī/sec.)

0,16
12,396448 ms (338,347235 miliona kī/sec.)

0,19
12,533024 ms (334,660176 miliona kī/sec.)

0,22
12,703328 ms (330,173626 miliona kī/sec.)

0,25
12,884512 ms (325,530693 miliona kī/sec.)

0,28
13,033472 ms (321,810182 miliona kī/sec.)

0,31
13,239296 ms (316,807174 miliona kī/sec.)

0,34
13,392448 ms (313,184256 miliona kī/sec.)

0,37
13,624000 ms (307,861434 miliona kī/sec.)

0,41
13,875520 ms (302,280855 miliona kī/sec.)

0,44
14,126528 ms (296,909756 miliona kī/sec.)

0,47
14,399328 ms (291,284699 miliona kī/sec.)

0,50
14,690304 ms (285,515123 miliona kī/sec.)

0,53
15,039136 ms (278,892623 miliona kī/sec.)

0,56
15,478656 ms (270,973402 miliona kī/sec.)

0,59
15,985664 ms (262,379092 miliona kī/sec.)

0,62
16,668673 ms (251,627968 miliona kī/sec.)

0,66
17,587200 ms (238,486174 miliona kī/sec.)

0,69
18,690048 ms (224,413765 miliona kī/sec.)

0,72
20,278816 ms (206,831789 miliona kī/sec.)

0,75
22,545408 ms (186,038058 miliona kī/sec.)

0,78
26,053312 ms (160,989275 miliona kī/sec.)

0,81
31,895008 ms (131,503463 miliona kī/sec.)

0,84
42,103294 ms (99,619378 miliona kī/sec.)

0,87
61,849056 ms (67,815164 miliona kī/sec.)

0,90
105,695999 ms (39,682713 miliona kī/sec.)

0,94
240,204636 ms (17,461378 miliona kī/sec.)

Ke piʻi aʻe ka hoʻohana ʻana, emi ka hana. ʻAʻole makemake kēia i ka nui o nā hihia. Inā hoʻokomo kekahi palapala noi i nā mea i loko o ka papaʻaina a laila e hoʻolei iā lākou (e like me ka helu ʻana i nā huaʻōlelo i loko o kahi puke), a laila ʻaʻole pilikia kēia. Akā inā hoʻohana ka noi i kahi papaʻaina hash lōʻihi (no ka laʻana, i loko o ka mea hoʻoponopono kiʻi e mālama i nā ʻāpana ʻole o nā kiʻi kahi e hoʻokomo pinepine ai ka mea hoʻohana a holoi i ka ʻike), a laila hiki ke pilikia kēia ʻano.

A ana i ka hohonu o ka papaʻaina hash ma hope o 64 miliona hoʻokomo (mea hoʻohana 0,5). ʻO ka hohonu awelika he 0,4774, no laila ʻo ka hapa nui o nā kī i loko o ka slot maikaʻi loa a i ʻole hoʻokahi slot mai kahi kūlana maikaʻi loa. ʻO 60 ka hohonu o ke kani.

A laila ana au i ka hohonu o ka hoʻāʻo ʻana ma ka pākaukau me 124 miliona mau mea hoʻokomo (mea hoʻohana 0,97). ʻO ka hohonu hohonu he 10,1757, a ʻo ka nui loa - 6474 (!!). Ke hāʻule nui nei ka hana ʻike laina laina ma nā helu hoʻohana kiʻekiʻe.

ʻOi aku ka maikaʻi e hoʻohaʻahaʻa i ka hoʻohana haʻahaʻa o kēia papaʻaina. Akā, hoʻonui mākou i ka hana ma ka lilo o ka hoʻohana hoʻomanaʻo. ʻO ka mea pōmaikaʻi, i ka hihia o nā kī 32-bit a me nā waiwai, hiki ke ʻae ʻia kēia. Inā ma ka laʻana i luna, ma ka papa me 128 miliona mau mea, mālama mākou i ka helu hoʻohana o 0,25, a laila ʻaʻole hiki iā mākou ke kau i nā mea ʻoi aku ma mua o 32 miliona mau mea i loko, a e nalowale nā ​​koena 96 miliona mau slot - 8 bytes no kēlā me kēia pālua. , 768 MB o ka hoʻomanaʻo nalowale.

E ʻoluʻolu e kamaʻilio mākou e pili ana i ka nalowale o ka hoʻomanaʻo ʻana i ke kāleka wikiō, ʻoi aku ka waiwai o ka hoʻomanaʻo ʻana o ka ʻōnaehana. ʻOiai ʻo ka hapa nui o nā kāleka kiʻi papa papa hou e kākoʻo ana i ka CUDA he 4 GB o ka hoʻomanaʻo (i ka manawa kākau, ʻo NVIDIA 2080 Ti he 11 GB), ʻaʻole naʻe ʻo ia ka hoʻoholo naʻauao e nalowale i kēlā mau kālā.

Ma hope aku e kākau hou wau e pili ana i ka hana ʻana i nā papa hash no nā kāleka wikiō ʻaʻohe pilikia me ka hohonu o ka hoʻāʻo ʻana, a me nā ala e hoʻohana hou ai i nā slot i holoi ʻia.

Ana hohonu kani

No ka hoʻoholo ʻana i ka hohonu o ke kī, hiki iā mākou ke unuhi i ka hash o ke kī (kona papa kuhikuhi papa kuhikuhi kūpono) mai kāna papa kuhikuhi papa kuhikuhi maoli:

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

Ma muli o ke kilokilo o nā helu binary hoʻohui a ʻelua a me ka ʻoiaʻiʻo o ka hiki o ka papaʻaina hash he ʻelua i ka mana o ʻelua, e hana kēia ala ʻoiai ke neʻe ʻia ka papa kuhikuhi kī i ka hoʻomaka o ka papaʻaina. E lawe kāua i kahi kī i hashed i ka 1, akā ua hoʻokomo ʻia i loko o ka slot 3. A laila no kahi papa me ka mana 4 loaʻa iā mākou (3 — 1) & 3, ua like ia me 2.

hopena

Inā he mau nīnau a manaʻo paha kāu, e leka uila mai iaʻu ma Twitter a i ʻole e wehe i kahi kumuhana hou i loko hale waihona.

Ua kākau ʻia kēia code ma lalo o ka hoʻoikaika ʻana mai nā ʻatikala maikaʻi loa:

I ka wā e hiki mai ana, e hoʻomau wau e kākau e pili ana i ka hoʻokō papaʻaina hash no nā kāleka wikiō a nānā i kā lākou hana. Hoʻopili kaʻu mau hoʻolālā i ke kaulahao, Robin Hood hashing, a me ka cuckoo hashing me ka hoʻohana ʻana i nā hana atomic i nā hale ʻikepili e pili ana iā GPU.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka