Ua hoʻopuka wau ma Github
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 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).
ʻ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
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.
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:
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
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