Github áá ááĽáááá
á á°á¨ááľ á ááś áááŽáá˝ á¨ááá አááľáá˘áŤáá˝á ááŤááľ á¨áá˝á ááá á¨ááአáá˝ á áá á¨áĽ ááᢠá áĽá á¨NVIDIA GTX 1060 áááśá áá áŽáą 64 áááŽá á áááá° á¨ááአá¨ááá áĽá´áľ áĽááśá˝á á 210 ms á áŤáŁá˘ áŤáľáᣠáĽá 32 áááŽá áĽááśá˝á á 64 áá´ á áŤáŁá˘ áŤáľáááłáá˘
áááľáᣠá¨áá áŽáááá°á ááĽááľ á áááľ 300 áááŽá ááŁáá˝/á´áŽááľ áĽá 500 áááŽá ááĽááľ/á´áŽááľ ááá˘
á áá á¨áĄ á CUDA á°á˝áá, ááá áĽááłá á°ááłáłá áá´ á HLSL ááá GLSL áá°áá á áá˝áá. á áŞá˛áŽ áŤááľ áá á¨áá°á á ááťá¸á ááá¨ááἠáľáá áŤá á ááŤáł áá°áŚá˝ á ááľáĄ-
- 32-á˘áľ áááá˝ áĽáť áĽá á°ááłáłá áĽá´áśá˝ áá¨áááá.
- á¨áá˝ á á¨á´áá áá áá á á áá.
- áĽá áá áá á á¨ááá áá á¨áááľ áá áĽáŠá ááá á áá áľ.
áááá áĽá áĽá´áśá˝áŁ ááá ááłá˘ ááááľ ááľá¨á፠áŚáł ááľáŤá áŤáľáááááłá (á¨áá áŁáá áŽáľ áá
0xffffffff áá)á˘
á¨áá˝ á á¨á´á áŤá áááááŤáá˝
á¨áá˝ á á¨á´áá áááľ á áľáŤáťáá˝á áá ááá KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
á¨á áá á¨áĄ áá á á¨áááľ ááá áĽáá áá ááĽá á áá°áá, ááááŤáąá á ááľ ááŁá áááŞáŤ á¨áá2/AND áááĽáá ááá°áá á á á áá, ááá áá ááá áŚááŹá°á á áŁá áááá áá. áá á ááľááŤá ááá ááłá áá á áľááá áá ᣠááááŤáąá á ááľáá á áá á¨áĽ ááá ááľáĽ á¨áĽá áááŤá á áĽáŤááłááą ááľáá˘áŤ ááľáĽ áá á áá á áá áľá˘ áĽá á áá¤áąá, á¨ááá á᪠á áĽáŤááłááą ááľáá˘áŤ ááľáĽ ááąá áłááá.
á áá á¨áĄ ááĽáŤááłááą á¤ááááľ áááá áĽá áĽá´áąá áĽáť áŤá¨ááťá áĽáá á¨áááá áá˝ á áá°ááᢠá áá á¨áĄ áŁá 32-á˘áľ áááá˝á áĽáť áľáááŤá¨áá˝ áá˝ á áŁá á ááĽááľ áá°ááᢠá¨áá áŤáá áŽáľ Murmur3 hash áá áááᣠáá á áĽááľ áá¨ááá˝áᣠXORáá˝á áĽá ááŁááľá áĽáť ááá˘
á¨áá˝ á á¨á´áá á¨ááľáłááť á á°á á°á¨á°á áá á¨áá á¨áááá áĽá á áá´áá˝á áá áááᢠááá áĽááłá á ááłááľ á¨á˝áá áľáŤáá˝ á¨ááá˝á á¨áĽáá°áá á áááľ áľáŤáá˝ á á°á á°á¨á°á á˘áŤá áášá, á¨áá˝ á á¨á´áá á ááá áľáááááá áááł áá áĽáá. á¨áá á áłá˝ áľááá ááłá áĽáááááŤáá. á´ááአá á ááľ áá á áşáá˝ á¨ááá አááŽá˝ á ááŤááą á¨áŞá˛áŽ áŤááśá˝ áĽáŠ áá°áŤáá˘
á áá˝ á áá á¨áĽ ááľáĽ áŤááľ áááá˝ áĽá áĽá´áśá˝ áá° áŁáśááľ á°ááá¨ááá˘
áŽáą áŁá 64-á˘áľ áááá˝á áĽá áĽá´áśá˝á áĽáá˛áá ááľá°áŤá¨á áá˝ááᢠáááá˝ á áśáá ááá áĽáŁ ááá áĽá áááłá°á áĽá áááŤá¨áá áááááᢠáĽá áĽá´áśá˝ á áśáá ááá ἠáĽá ááťá ááááá˝á áááááᢠáĽáá° áĽáľá ááᣠá CUDA ááľáĽáŁ á32- áĽá 64-á˘áľ áĽá´áśá˝ á¨ááá ἠááá áľáŤáá˝ á á°ááĽáŽ áĽáľáŤá áľá¨áľ á áśáá áá¸á (á¨áá
á áłá˝ áááá¨áą)á˘
á¨áá˝ á°áá á¨áĽ áááł
á áá˝ á áá á¨áĽ ááľáĽ áŤááľ áĽáŤááłááą á¨ááá-áĽá´áľ áĽááľ á¨á áŤáą áááśá˝ ááľáĽ á ááą ááá¨á áá˝áááĄ
- ááá áĽá áĽá´áľ áŁáś áá¸áᢠá áá áááł, á¨áá˝ á á¨á´áá á°áááŻá.
- ááá á°á˝áá, ááá áá áĽá´áą áá á áá°áťáá. áá áá á á áá áá ááἠáĽáŤáá á á¨ááᣠá¨á፠áŁáś ááááłáᢠáá á¨á°ááá° áá, áá á¨á áááá áá áľáá˝ áá°á áĽá á˘á°áŤ á°ááłáłá ááá áá¨á°áłá, áĽá áĽá¨á°ááááá áŤááá áľá á ááľ áá á¨ááἠááá á áá.
- áááąá ááá áĽá áĽá´áą á°áááá áá.
- áĽá´áą áááá˝ á¨ááľáá¸á፠ááŽá˝ ááááᣠáá ááá áá á áá°ááᢠáá áá¨á°áľ á¨áá˝áá á¨CUDA ááŽááŤááá áá´á á ááá á¨áłáá á¨áá á°á¨ áľááľáł áá´á áľááá ááᢠáá á¨á°ááá° ááᤠá ááááá á ááŁá ááá á ááá áŁáś ááᣠááá áĽááłá áĽá´áą áŁáááá áĽááłá˘
á ááľ á áľááá ááĽáĽ ááá áá° ááľáá˘áŤá á¨á°áá á áá á ááááłááľá - ááá áĽááłá ááá á˘á°á¨áá, áľááá ááłá á¨áá á áłá˝ áĽáááááŤáá.
á¨áá˝ á á¨á´á áŽáľ ááá áááś á¨áá á°á¨ áľááľáł á¨ááá áĽá áľ áĽá á¨áááá áľ á á°á á°á¨á°á á¨áááłáá áŁá¸á á ááá á áłáá á¨áá á°á¨ áľááľáł áá´áá˝ áá°áŤáᢠá áá˝ á áá á¨áĽ ááľáĽ ááľááŁáľáᣠáááá áĽá áá°á¨áá áľáááá¨áľáŁ áĽáŤááłááą á¨ááá-áĽá´áľ áĽááľ á¨áá á¨á°ááášáľ á áŤáľ áááśá˝ á á ááą ááľáĽ áááá á áľáłááľá˘
á áá˝ á á¨á´á ááľáĽ ááľááŁáľ
á¨ááá áĽá´áľ áĽááśá˝á á áá˝ á áá á¨áĽ ááľáĽ á¨ááŤáľáᣠá¨CUDA á°ááŁá áá á áááľááá˘
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);
}
}
áááá áááľááŁáľ áŽáą á¨ááŁá ááá áá˝ ááᎠá áá˝ á áá á¨áĽ áľááľá á áŠá áá°ááááᢠá áľááľá ááľáĽ áŤáá áĽáŤááłááą ááľáá˘áŤ á¨á áśáá áááłá°á-áĽá-áľáá áŚááŹá˝á áŤá¨ááááᣠá á፠ááľáá˘áŤ ááľáĽ áŤááá ááá á¨áŁáś áá áŤááłáľáŤáᢠá áááááľ á¨á°ááᣠá ááľáá˘áŤá ááľáĽ áŤáá ááá á ááŁá ááá áááááᣠáĽá á¨á፠ááá ááľáá˘áŤ ááá ááááłáᢠáá áŚáŞá áá ááá áŁáś á¨áá ááá á¨ááŁá ááá áá á¨ááááľ á¨áá áŽáą áááľááŁáľ á°áľáá á¨áá ááľáá˘áŤ á áááś á¨ááŁáá áĽá´áľ áá° ááľáá˘áŤá ááľáĽ á áľááŁá˘
á á ááľ á¨á¨ááá áĽáŞ á¨áá gpu_hashtable_insert()
á°ááłáłá ááá áŤáá¸á áĽá ááĽá¨ áááŽá˝ á á ᣠá¨á፠áááá¸áá áĽá´áśáťá¸á á ááá ááľáá˘áŤ áá ááá áá˝ááᢠáá
áĽáá° áá°á á ááá áŤá: á áĽáŞá áá
áľ á¨áá˝ááľ ááá-áááá˝ ááľáĽ á ááą ááłáŤááłá, ááá áá áá
áá á á ááŤáł á¨á áááá ááŽá˝ ááľáĽ á áľáአáľááá¨á°áľ á¨áľáá áá
á°á¨ áľááľáł ááá á¨áá¨á¨áťá áĽáá°ááá ááááľ á áá˝áá.
á¨áá˝ á°áá á¨áĽ ááá
á¨ááá áááá˝ áŽáľ:
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);
}
}
á á°áá á¨áĽ ááľáĽ á¨á°á¨áḠáááá áá áááááľáŁ á áááááá ááá áá˝ á áááá áľááľá ááľáĽ á°áááá áĽáá°áŤááᢠá áĽáŤááłááą ááľáá˘áŤ ááľáĽ ááá á¨áááááá áááá áĽáá¨áááŁáá, áĽá á¨áá, áĽá´áąá áĽááááłáá. áĽáá˛áá ááá áŁáś áááá áĽáá¨áááŁáá, áĽá á¨áá, ááááá áĽááááŁáá.
áááá ááááľ áŤááťáá, áŽáą áŁáś áĽá´áľ ááááłá.
áĽááá áá á¨ááá ááááá˝ á ááá°áľ áĽá á áá°á¨á á á ááľ áá áá¨ááá áá˝ááᢠá á áá á¨áĄ ááľáĽ áŤááľ áĽáŤááłááą áĽááľ ááá°áą á¨áá á¨á°ááášáľ á áŤáľ áááśá˝ ááľáĽ á ááą áááŤá¸áá.
á áá˝ á áá á¨áĽ ááľáĽ áá°á¨á
áááá˝á ááá°á¨á áŽáľ;
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);
}
}
áááá áá°á¨á áŁáá°ááá° ááááľ ááᥠáááá á á°áá á¨áĄ ááľáĽ áĽáá°áááá áĽá áĽá´áąá (áááá áłááá) áŁáś á áľááá ááááľ áĽáá°ááááᢠáá
áŽáľ ᨠáá á áŁá á°ááłáłá ááᢠlookup()
á ááá áá ááĽá፠á¨á°áá á áľá°áá áááá áŁáś áŤá°ááááá˘
á¨áá áĽáá°á°áááá á ááľ ááá áá° ááľáá˘áŤ á¨á°áťá á áá á ááááłááľá. á ááľ á¤ááááľ á¨á áá á¨áĄ áá á˛á°á¨á áĽááł ááá áĽááłá áááŤáᣠááá á ááá áŁáś ááááᢠáá áááľ á ááľáá˘áŤ áĽá´áľ á¨á áśáá á˝áá áľáŤá áá áá á áŤáľááááá, ááááŤáąá á¨á áá áá áŁáś ááá á áááá ááá á áá°áá - á ááá áŁáś áááá.
á¨áá˝ á á¨á´áá áá á ááá¨á
áľáá á á¨á´á á ááá á áĽá áŁáś áŤááá áááá˝á á¨á áŽáá á á¨á´á áá á ááľááŁáľ á¨áá˝ á á¨á´ááá áá á ááá¨á áá˝áá. á¨ááá áŽáąá ááá ááľá¨á áľááááአáá á á°ááŁá á áá°á°ááĽá¨ááᢠá¨áá á á áá á CUDA ááŽááŤáá˝ ááľáĽ á¨áá á°á¨ áľááľáł áá°áŁ áĽááá áá á CUDA kernel ááľáĽ áłááá á á áľá°ááá áŽáľ ááľáĽ áá¨áááá.
á á˝áá
á°ááłáłáŞááľ
á¨áá áŁáá á¨á°ááŁá áŽáľ á
ááĽáŚá˝ ááľáĽ gpu_hashtable_insert()
, _lookup()
и _delete()
á á ááľ áá á ááľ ááá-áĽá´áľ ááŤááľá˘ áĽá áá
gpu_hashtable_insert()
, _lookup()
и _delete()
á¨áĽááśá˝ áľááľá á áľáአáŤáŤááłáᣠáĽáŤááłááą áĽááľ á á°áᨠá¨ááአá¨ááľáá¸á፠áá ááľáĽáĄ
// 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);
}
}
áááááŤá á¨áááá á¨áá˝ á á¨á´á á á ááľ áá ááľááŁáľáᣠááááá˝á áĽá áľá¨ááá˝á áá°áááᢠá¨ááá-áĽá´áľ áĽááśá˝ áá áá á¨á áŤáą áááśá˝ ááľáĽ á á áá°áá áľáááá áĽá ááááš á¨áááááłááą áľááá á¨á°ááŤáŠ á áááľ áľáŤáá˝ á á°ááłáłá áá áĽá á áá á áááá áľ áá áĽááłá á°áá á¨áĄ áľááááááľá áŤá¨áááŁáá˘
ááá ááᣠá¨ááľáá˘áŤ áĽá áľá¨ááá˝á á áľáአáĽááľáŹáľ áĽá á¨áĽááśá˝ á¨ááĽá áľ áľááľá á¨á°áŁá áááá˝á á¨áŤáᣠá¨áľááš áĽááśá˝ âáŤá¸áááâ á¨áááá áá°áá á á áá˝áá - á áá¨á¨áť áá° áá˝ á á¨á´áá ááááᢠááľáá˘áŤ áŽáľ á¨áĽááśá˝ á¨áá¤áľ áľááľá áá á áá°áá áĽáá á A/0 B/1 A/2 C/3 A/4
. áŽáą á˛á ááá
, áĽááľ B/1
и C/3
á á áá á¨áĄ ááľáĽ ááááľ ááľáľá á°á°áĽáśáłá, áá á á°ááłáłá áá áááá¸áá áĽááśá˝ á áĽáą ááľáĽ ááłáŤá A/0
, A/2
ááá A/4
. áá
ááááŁáľ á˝áá áááá áá˝áá - ááá á áá°áá áŞáŤá áá á¨á°áá°á¨á° áá. á áá¤áľ áľááľá ááľáĽ ááá á¨á°áŁá áááá˝ áĽáá°áá á áľááľáá áŤáá ááááᣠááá á¨áľáá áá á áá¨á¨áť áĽáá°á°áťá ááľ ááá°áĄ áá˝ááá˘
áá
ááĽááľá á˝áá á¨áá á¨á°áŁá áĽááśá˝á áá° á°ááŤáŠ á¨CUDA áľáááľ áĽáŞáá˝ ááá¨áľ áŤáľáááááłáᢠá CUDA ááľáĽáŁ á¨ááá á¨áá áŤá ááááá ááá áá áá á¨áááĽáá á¨á¨ááá áĽáŞ á ááľ áá áááá (á˘áŤááľ á á ááľ áá ááľáĽá˘ á á°ááŤáŠ ááŽá˝ ááľáĽáŁ á¨áááá˝ á áľáአáá¨áááá)ᢠá¨áá áŁáá ááłá á ááľ á¨ááá á¨á°áá A/0 B/1 A/2 C/3
, áĽá ááá áá A/4
, á¨ááŤá ááá A
áá áŤááá 4
.
á áá á°ááŁáŤáľ ááá áľáááá áĽááááá lookup()
и delete()
á áá˝ á áá á¨áĽ ááľáĽ áá°á°áŤáŤá˘ áĽááľ áľááľá ááá˝ ááá á°áááá á ááá áá ááá˘
á áááŁáŞá ááá ἠáĽá ááťáá áá ááá áá ááá áá፠áá á°á¨ áľááľáł ááłá°áá áááἠáá˝áá... áĽááá ááľáŁáśá˝ ááá ááá á áá áá áá°áá¨á áá˝ááá˘
volatile
á¨áá á°áááá ááááá ááŁááť á áĽááá°á áá á°á¨ áľááľáł ááľáĽ á¨á°á ááᨠá¨ááŁáĽ ááá á¨ááá áááŞáŤ ááá˘
á¨áľááááááľ áááśá˝ áááá¨áť á áŤáľáááá¸áá volatile
. á¨ááľáá¸á፠ááľá áá°á á˛á á¨á°áá á áŚááŹá˝á á¨á°á¸áá áĽá´áľ á¨á°á áá áľáá˝ áá áŤááá áľ áá¨á áá áááᢠáá á ááá ᣠáá
á á°áá°á á¨á¨ááá áĽáŞ áá
áľ á¨áá˝ á á¨á´áá áľáááá áááł á¨áᣠáá¨á ááᢠá¨á
áἠáááá áá¨á áá áá á¨ááá á˘áá´ááľá áá áá áá˝ááᢠvolatile
, ááá áá á¨á፠á áááá á áľááš ááááłá: á áĽá áá¨áŤáá˝ áá°á¨áľ, 32 áááŽá á¤ááááśá˝á á˛á°áá, ááĽáṠᨠ500 áááŽá áľá¨ááá˝ / á°á¨ááľ áá° 450 áááŽá áľá¨ááá˝ / á°á¨ááľ áááˇá.
áááłáááľ
64 áááŽá á¤ááááśá˝á áááľááŁáľ áĽá 32 áááŽá á¨ááááľá ááá°á¨á á á°á°á¨áá áá¨áŤ ááŤá¨á ááľáľá std::unordered_map
áĽá áááአááá á¨áá˝ á á¨á´á á¨áá áááľ ááťáááĄ-
std::unordered_map
á¤ááááśá˝á á ááľááŁáľ áĽá á ááľáááľ áĽá á¨ááŤá áá á áááŁáľ 70 áá´ á ááĽáˇáᢠunordered_map
(á áááŽá á¨ááá አááĽá¨ áááŽá˝á ááľáááľ áĽá áá áááľáłá ᣠááááŤáąá á ááľáĄ unordered_map
áĽá á¨áá
á°á¨ áľááľáł áá°áŁáá˝ á°á°áááá). áĽáááľ áááááᣠstd:unordered_map
áá ááá á¨á°ááŤáŠ áá°áŚá˝. áĽáą áá á á¨á˛áአá áááá áá áá ᣠáááááá áá á áŤáá¸áá ááá áĽá´áśá˝ áá°ááá ᣠá á¨áá°á á¨á á ááá ááĽááľ áĽáŠ áá°áŤá áĽá á¨á ááŤáł áľá¨á á áá á¨á°á¨áá á áááá áŤáłáŤáá˘
áááአáĽá á˘áá°á-ááŽááŤá áááááľ á¨áá˝ á á¨á´áá áááł 984 áá´ áá áᢠáá á á°áá á¨áĄá á áá á°á¨ áľááľáł ááľáĽ á ááľááἠáĽá á áá°á¨á (1 áᢠáá á°á¨ áľááľáłá á ááľ áá ááá°áĽ, áá á á CUDA ááľáĽ á¨á°áá°á áá áááľáłá), á¤ááááśá˝á ááľááŁáľ áĽá áá°á¨á áĽá á áĽááą áá á ááľáá áŤáłáááá áá áá¨ááŤá. ááá á ááá˝ áá° áŞá˛áŽ áŤááľ áá á°á¨ áľááľáł á á°á¨á᪠áááľ ááľáĽ áááŁá.
á¨áá˝ á á¨á´áá áŤáą ááá ááá 271 áá´ áá áˇáᢠáá á áŞá˛áŽ áŤááą ááľáĽ á¤ááááśá˝á á ááľááŁáľ áĽá á áá°á¨á áá áŤááá áá áá¨ááŤá, áĽá áá° áá á°á¨ áľááľáł á áááá ἠáĽá á á°ááá á°áá á¨áĽ áá á ááľáá áá áŤááá áá áááľ ááľáĽ á áŤáľááŁá. á¨ááአá á¨á´áá áá¨á á áá á¨ááá á¨áá ááá á¨áá˝ á á¨á´áá áá á áá á áŞá˛áŽ áŤááą áá á°á¨ áľááľáł ááľáĽ á¨ááá á¨áá (áááłá á ááá¨áá ááŽá°á°á áłááá á áá á¨ááአáŽáľ áĽá á áá á¨ááá á¨áá˝ á áá á¨áĽ áááá á)ᢠá¨áá°á áá¤áą á°ááá áá.
ááŞá˛áŽ áŤááľ áŤáá á¨áá˝ á áá á¨áĽ á á¨áá°á ááĽááľ áĽá áá áľáአááááŤáľ á¨áá°á á áááá áŤáłáŤáá˘
á˝ááŽá˝
á¨áá˝ á áá á¨áĽ á ááá´áá¸á ááłáľá°ááá¸á á¨ááᥠáĽááľ ááłáŽá˝ á ááľáĄ
- ááľááŤá áá°áť á áááľá°á ááľá°ááááᣠáá á°áá á á°áá á¨áĄ ááľáĽ áŤááľ áááá˝ á áľááá á¨á°ááá á áŤáá° áĽáá˛ááᥠáŤá°áááá˘
- á°ááŁáŠá á áá áá áááá˝ á ááááąá
delete
áĽá á¨áá á áá á á¨á´ááá áŤá ááťá.
á áá¤áąá, á¨áá˝ á áá á¨áĽ á áááá ááľ á ááľ ááááľ áá˝áá, á á°ááá áá¨á á áá áŤá áĽá áĽá ááľáá˘áŤáá˝ áĽá áá°á¨á. áĽááá á áľáááśá˝ ááá á¨á á ááą ááááľ áá° á á˛áľ á áá á¨áĽ á áá á áá á°á á¨áá áá፠ááĽááľ áĽáá°áá ááłá°áľ áĽá á áááś áááá áá á¨á°áááą áááá˝á ááŁáŤáľ ááá˘
á¨á°ááášáľá ááłáŽá˝ á ááłá áááľá¨áłáľáŁ 128 áááŽá á¤ááááśá˝á á¨áŤá á áá á¨áĽ áááá á áĽá 4 áááŽá áŚáłáá˝á áĽáľá¨ááá áľá¨áľ (á¨á á ááá áá á 124) áĽáľáŞáá áľá¨áľ á 0,96 áááŽá á¤ááááśá˝ á áŠá á°áá á¨áĽ áááá á á¨áá áŤááá áŽáľ áĽá ááááᢠá¨áá¤áľ á áá á¨áĽ áĽááᣠáĽáŤááłááą á¨áľá 4 áááŽá á áłá˛áľ ááĽá¨ áááŽá˝á áá° á ááľ á¨áá˝ á áá á¨áĽ áááľááŁáľ á¨CUDA kernel áĽáŞ ááá˘
á¨á á ááá áá á
á¨ááľááŁáľ áá 4 á¤ááááśá˝
0,00
11,608448 áá´ (361,314798 áááŽá áááá˝ á á°á¨ááľ)
0,03
11,751424 áá´ (356,918799 áááŽá áááá˝ á á°á¨ááľ)
0,06
11,942592 áá´ (351,205515 áááŽá áááá˝ á á°á¨ááľ)
0,09
12,081120 áá´ (347,178429 áááŽá áááá˝ á á°á¨ááľ)
0,12
12,242560 áá´ (342,600233 áááŽá áááá˝ á á°á¨ááľ)
0,16
12,396448 áá´ (338,347235 áááŽá áááá˝ á á°á¨ááľ)
0,19
12,533024 áá´ (334,660176 áááŽá áááá˝ á á°á¨ááľ)
0,22
12,703328 áá´ (330,173626 áááŽá áááá˝ á á°á¨ááľ)
0,25
12,884512 áá´ (325,530693 áááŽá áááá˝ á á°á¨ááľ)
0,28
13,033472 áá´ (321,810182 áááŽá áááá˝ á á°á¨ááľ)
0,31
13,239296 áá´ (316,807174 áááŽá áááá˝ á á°á¨ááľ)
0,34
13,392448 áá´ (313,184256 áááŽá áááá˝ á á°á¨ááľ)
0,37
13,624000 áá´ (307,861434 áááŽá áááá˝ á á°á¨ááľ)
0,41
13,875520 áá´ (302,280855 áááŽá áááá˝ á á°á¨ááľ)
0,44
14,126528 áá´ (296,909756 áááŽá áááá˝ á á°á¨ááľ)
0,47
14,399328 áá´ (291,284699 áááŽá áááá˝ á á°á¨ááľ)
0,50
14,690304 áá´ (285,515123 áááŽá áááá˝ á á°á¨ááľ)
0,53
15,039136 áá´ (278,892623 áááŽá áááá˝ á á°á¨ááľ)
0,56
15,478656 áá´ (270,973402 áááŽá áááá˝ á á°á¨ááľ)
0,59
15,985664 áá´ (262,379092 áááŽá áááá˝ á á°á¨ááľ)
0,62
16,668673 áá´ (251,627968 áááŽá áááá˝ á á°á¨ááľ)
0,66
17,587200 áá´ (238,486174 áááŽá áááá˝ á á°á¨ááľ)
0,69
18,690048 áá´ (224,413765 áááŽá áááá˝ á á°á¨ááľ)
0,72
20,278816 áá´ (206,831789 áááŽá áááá˝ á á°á¨ááľ)
0,75
22,545408 áá´ (186,038058 áááŽá áááá˝ á á°á¨ááľ)
0,78
26,053312 áá´ (160,989275 áááŽá áááá˝ á á°á¨ááľ)
0,81
31,895008 áá´ (131,503463 áááŽá áááá˝ á á°á¨ááľ)
0,84
42,103294 áá´ (99,619378 áááŽá áááá˝ á á°á¨ááľ)
0,87
61,849056 áá´ (67,815164 áááŽá áááá˝ á á°á¨ááľ)
0,90
105,695999 áá´ (39,682713 áááŽá áááá˝ á á°á¨ááľ)
0,94
240,204636 áá´ (17,461378 áááŽá áááá˝ á á°á¨ááľ)
á á ááá áĽá¨á¨áᨠá˛ááľ á áááá ááááłá. áá á á áĽááááš áááłáá˝ á°ááá á áá°áá. á áááŹá˝á á¤ááááśá˝á á á°áá á¨áĽ ááľáĽ áŤáľáᣠá áá áŤáľááá° (áááłá á áá áá ááľáĽ áááľá á˛ááĽá) áá á˝áá á áá°ááᢠááá áá á áááŹá˝á á¨á á áĽáľá áŤáá á¨áá˝ á áá á¨áĽ á¨á°á áá (áááłá á ááŤáááľ á ááłá˘ ááľáĽ á°á ááá áĽá áá á¨ááŤáľáᣠáĽá á¨áá°áááŁá¸áá áŁáś áŤááá á¨ááľáá˝ áááá˝á ááá¨áá¸áľ) áá áŁá ᪠á˝áá áááĽá áá˝ááá˘
áĽá á¨64 áááŽá ááľáá˘áŤáá˝ á áá (á¨á á ááá áááł 0,5) á¨áá˝ á á¨á´áá áááááŞáŤ áĽáááľ ááŤá˘ á ááŤá áĽáááľ 0,4774 áá á, áľááá á áĽááááš áááá˝ á á°áťáá áŚáł áá ááá á ááľ áŚáł á¨ááἠáŚáł ááá áá á. á¨áá°áá á¨áľáá áĽáááľ 60 áá áá˘
á¨ááŤá 124 áááŽá ááľáá˘áŤáá˝ (á¨á á ááá áááł 0,97) áŁáá á á¨á´á áá á¨áááááŞáŤáá áĽáááľ ááŤáᢠá ááŤá áĽáááľ ááľááá 10,1757 áá á ᣠáĽá á¨áá°áá - 6474 (!!) á¨ááľááŤá áłá°áł á ááťá¸á á á¨áá°á á¨á á ááá ááĽááśá˝ á á¨áá°á áááł ááááłáá˘
á¨áá á á¨áá˝ á áá á¨áĽ á á ááá áá á áá á°á ááľá¨á á¨á°áťá ááᢠáá á¨á፠á áá á ááľáłááť áááł ááŞáá˝ áá á ááááá áĽáá¨ááŤáá. áĽáá° áĽáľá áá, á 32-á˘áľ áááá˝ áĽá áĽá´áśá˝, áá áá¸áľá áá˝áá. á¨áá áŁáá ááłá 128 áááŽá ááĽá¨ áááŽá˝ áŁáá á á¨á´á ááľáĽ á¨á á ááá áááłá 0,25 áĽááľááá ááá ᣠá¨á፠á ááľáĄ ᨠ32 áááŽá áŤáá áá ááĽá¨ áááŽá˝á áĽááľáááŁáá ᣠáĽá á¨á°ááŠáľ 96 áááŽá ááá°áśá˝ áá áá - ááĽáŤááłááą áĽááľ 8 áŁáᾠᣠ768 áᣠá¨á á áá á°á¨ áľááľáłá˘
áĽáŁááá áľá áŞá˛áŽ áŤááľ áá á°á¨ áľááľáł ááŁáľ áĽá¨á°ááááá áá, áá á á¨áľáááľ áá á°á¨ áľááľáł á¨á áá áá áŤáá ááĽáľ áá. ááá áĽááłá CUDAá á¨áá°áá á áĽáááš áááá á¨á´áľááśá ááŤáááľ áŤááśá˝ á˘áŤááľ 4 áᢠáá á°á¨ áľááľáł á˘ááŤá¸áá (á áá˝áá áľ áá NVIDIA 2080 Ti 11 áᢠá áá) ᣠá ááá áĽáá°áá áŤá áá áá˝á ááŁáľ á áŁá áĽáŠ ááłá á ááááá˘
á áá áľá áĽáááľ á¨ááááá á˝áá áááá¸á á¨áŞá˛áŽ áŤááśá˝ á¨áá˝ á á¨á´ááá˝á áľáááá á áĽá áĽáá˛áá á¨á°á°á¨á ááá°áśá˝á áĽáá°áá áľááá áá á¨á áá áĽá˝áááá˘
á¨áľáá áĽáááľ áááŞáŤ
á¨áááá áĽáááľ áááá á¨áááá áá˝ (áĽáŠ á¨á°áá á¨áĽ áá¨á á áá) á¨áľááááá á¨á°áá á¨áĽ áá¨á á áá áááŁáľ áĽáá˝ááááĄ-
// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);
á¨áááľ áááą áá፠áááľáŽá˝ ááĽáŽá˝ á áľááľ áĽá á¨áá˝ á á¨á´áá á á
á ááááľ ááá áááľ á ááá áá
á ááŤá¨áĽ á¨ááá á˘áá´ááľ áá° á á¨á´áá ááááŞáŤ á˛áááá áĽááłá áá áŤáᢠáá° 1 á¨á°á áááá ááá áĽááá°áľ ááá áá áá° ááľáá˘áŤ 3 ááľáĽ á¨ááŁ. á¨ááŤá á á
á ááá á á¨á´á 4 áĽááááá (3 â 1) & 3
, áĽáąá ᨠ2 áá áĽáŠá áá.
áá°áá°ááŤ
áĽáŤááá˝ ááá á áľá°áŤá¨áśá˝ áŤáááľ áĽáŁááá á á˘áá áááŠááá˘
áá áŽáľ á¨áĽáŠ ááŁáĽáá˝ á°ááľáŚ áá á¨á°áťáááĄ-
á¨á ááá˝á ááá á¨áááááŤ-ááť á¨áá˝ á áá á¨áĽ á¨áááá፠ááť á¨áá ááť á¨áá˝ á á¨á´á
ááá°ááą, áľá áá˝ á°áá á¨áĽ á á°ááŁá á ááŞá˛áŽ áŤááśá˝ ááá áĽá á ááááá¸áá áá°áá°á áĽááĽááá. á¨áĽá áĽá
áśá˝ áááአá°áľáá á áá á¨áá¨á ááśá˝ ááľáĽ á¨á áśáá áŚááŹá˝áá˝á á áá áá á°áá°ááľáŁ áŽá˘á ááľ ááşáá áĽá áŠáአááşáá áŤáŤáľáłáá˘
ááá: hab.com