αααα»αααΆααααα ααααΆαα
ααΎ Github
ααΆααΆααΆααΆα GPU hash ααααΆαααααααααΆααααααααΆαααααΎαααΆαααΆααααααΆααααα αΌααααα»ααα½ααα·ααΆααΈα αα ααΎαα»αααααΌααααα½ααα NVIDIA GTX 1060 αααααααα»α αααααΌααααα αΌα 64 ααΆαααΌααααααααΎααααα ααααααααα»ααααααααααα αα 210 ms αα·αααα αα 32 ααΆαααΌαααα»ααααααααααα αα 64 ms α
αααααΊααααΏααα ααΎαα»αααααΌααααα½αααααΊαααα αα 300 ααΆααααα αΌα / αα·ααΆααΈ αα·α 500 ααΆααα»α / αα·ααΆααΈα
ααΆααΆαααααΌαααΆαααααααααα»α CUDA αααααΈααΆαα αα αααααααΌα ααααΆα’αΆα ααααΌαααΆαα’αα»ααααα αααα HLSL α¬ GLSL αααααα ααΆαα’αα»ααααααΆαααααααααααΆα αααΎαααΎααααΈααΆααΆααΆαααΌαααααΎαααΆαααααααα ααΎααΆαααΈααα’αΌα
- ααΆαααααααΆααα α»α 32 αααΈα αα·ααααααααΌα ααααΆααααΌαααΆαααααΎαααΆαα
- ααΆααΆα hash ααΆαααα ααααα
- α αΎαααα ααααααααΌαααααααΎααΉαααΈααα ααΆαααα
αααααΆααααΌααα αα·αααααα α’αααααααΌαααααααααΆααααααααααααααΆαααα (αααα»αααΌαααΆαααΎαααααΊ 0xffffffff)α
ααΆααΆα Hash αααααααΆααα
ααΆααΆα hash ααααΎα’αΆααααααΆαααΎαα
αα ααΆαα½α KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
ααα αααααΆααΆαααΊααΆααΆαααααααΈα αα·ααααααΆαααααααα ααΈαααααααΆαααααΆαααΏααα½αααΊαααααααααΆααααΎααααΈα’αα»αααααααΆαα pow2/AND ααα»ααααααααα·ααααα·αααααΌαα»αααΊααΊαααΆαα αααααΆαααΆααααααΆαααα αααα»αααααΈααααΆααααΎαα’αααααααΈααα’ααα α αΆααααΆααααΈαααα»αααΆαααααΎαααΆααΆαααΈααα’ααα ααααααααααααααααααααΌααααα»ααα αααα»αααααααΈαα½ααα α αΎαααΆααααααααΆαα αααΆαααααααα·ααααα·ααΆαααααΌαααΆααααααααααΌαα»ααα αααα»αααααααΈαα½ααα
ααΆααΆααααααΆαα»αααααΌααα αα·αααααααααααΆααααΆαα»ααΈαα½αα αα·ααααααΆαααααΆαααααααααα αααααΆαααΆααΆααααααΆαα»αααααααΆααα α»α 32 αααΈα αααα αΆαααααΌαααΆαααααΆαααΆααα ααα ααΌαααΆαααΎααααΎ Murmur3 hash αααααααΎαααΆαααααΆαααααΆααααααΌααα½αα ααα½α XOR αα·ααα»αα
ααΆααΆα hash ααααΎαα αα αααααααΆαααΆαα αΆαααααααα―αααΆαααααΈααααΆααα’αααα αα αΆαα αααααΈααΆααααα·ααααα·ααΆααααααααααααααΆααααααααΆααααααααα·ααααα·ααΆαααααααααααα ααΆααΆα hash ααΉααα αααααααΆααααΆαααΆαααααΉαααααΌαα ααΎαααΉααα·ααΆαα’αααΈααΏααααααΆααααααα αα αα ααααααααααααΎαααΆαααα’ααΆαα½αααΆαααΈααα’αΌαααααααΎαααΆαααΆααααΆαααααααααα»ααααααααΆαααααΆα
ααααΆααα α»α αα·αααααααα αααα»αααΆααΆα hash ααααΌαααΆαα αΆααααααΎααα ααΆαααα
ααΌαα’αΆα
ααααΌαααΆαααααααααΎααααΈαααααααααααααΆααα
α»α
64 αααΈα αα·αααααααααααα ααααΆααα
α»α
ααααΌαααΆαα’αΆααΌαα’αΆα ααααα αα·αααααα·ααααα·ααΆααααααααα αα·αααααΌαα α αΎααααααααΆαααΆαααΌαααααα·ααααα·ααΆαα’αΆα αα·ααααααα’αΆααΌαα ααΆααααΆαααα’αα
αααα»α CUDA ααααα·ααααα·ααΆαα’αΆα-ααααααααααΆααααααα 32- αα·α 64-bit ααΊααΆα’αΆααΌα αααΆαααΆαα½αααΆααααΌαααΆααααααΉαααΆαααααααΆαα· (ααΌαααΎαααΆαααααα)α
ααααΆαααΆαααΆααΆα Hash
ααΌααααααααααΉαααΈαα½αααα αααα»αααΆααΆα hash α’αΆα ααΆααααααα½ααααα»αα ααααααααα ααα½ααα½αα
- ααΌααα αα·ααααααααΊαααα αα αααα»αααααΆαααΆαααα ααΆααΆα hash ααααΌαααΆαα αΆααααααΎαα
- ααΌαααβααααΌαβααΆαβαααααβα α»α ααα»ααααβαααααβαα·αβααΆααβααααΌαβααΆαβαααααβα α»αβαα βα‘αΎαβααα ααααα·αααΎαααααααααΆααααααααααααα»αα’αΆααα·αααααα αααααΆααΉααααα‘αααααα αααααΊααΆααΏαααααααΆ ααΏαααααααΉαααΎαα‘αΎαααααα·αααΎααααΎαααΆαααααα·ααααα·αα½αααααααααααΆαααααΎαααΆααα»ααααααααα·α α αΎαααΎααααα»ααα·ααΆαα’αααΈαα ααΆαααααααααα·ααααααααααααααΆα
- ααΆαααα αα·ααααααααααΌαααΆααααααααΆα
- αααααβααΊβα’αΆα βααααΎβααΆαβαααααΆααβααΆαβααααα·ααααα·βααααβαααα‘αΆαβαααααβααα ααα»ααααβαααααΉαβαα·αβααΆααβααΆαβαα βα‘αΎαβααα αααα’αΆα ααΎαα‘αΎααααααΆαααααααΌααααααααααα·ααΈ CUDA ααΆαααααΌα’αααα αα αΆααααααΆααααααΆααα»α αααααΆααΏαααααααΆαα αα αααα»αααααΉαααα·ααΆαααααΆαα½α αααα ααααα αααααΈααΆααααααααααΌα αααααααααα
α ααα»α ααααΆαααα½αααΊααΆαα ααααααααααααΌαααΆαααααααα ααααααα ααΆαααααααΆααααΈαααα αΎα - αααααΈααΆααααααΌαααΆααα»αααααα ααΎαααΉααα·ααΆαα’αααΈααΏααααααΆααααααα
ααΌαααΆααΆα hash αααααΆααααααΎαααΆαααΆαα½αααααΌα’αααα αα αΆαααα»α αααααααΆαααααα’αααα αα αΆαααααΌαααΆαα’αΆα αα·αααααααα·αααααΆααα αα αααααΎααα·αα·αααααΎαααΆααααα αΌα ααΆαααααΎα αα·αααΆααα»ααα αααα»αααΆααΆααααααΆ ααΌαα αΆαααΆααΌαααααααααΈαα½αααααα·ααα αααα»ααααααα½ααααα»αα ααααααααααΆαααα½ααααααΆααα·αααααΆααΆαααΎα
ααΆααααα αΌααα αααα»αααΆααΆααααααΆ
α’αα»αααα 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);
}
}
ααΎααααΈαααα αΌαααΌααα αααααΌαααααΎαααααααααΆααααα’αΆααααΆααΆα hash αααα αΆααααααΎαααααααααΆααααααΆααα α»α αααααΆααααα αΌαα αααααααααΈαα½αααα αααα»αα’αΆααααααΎααααα·ααααα·ααΆααααααααα αα·αααααα’αΆααΌα ααααααααααααααα αααα»αααααααααα αααα ααααα·αααΎααααΎαααΆααα·ααααΈαααααΆααααααΆ αααα αααα»ααααααααααααΌαααΆαααααΎαα αα α»ααααααααΆαααΆαα½αααΉααααααααΆααααα αΌα α αΎααααααΆααααααααΆααα α»α αααααααααΎαααααΌαααΆααααα‘αααααα·αα ααααα·αααΎααααΎααααααα α¬ααααΌαααααΆααΉααααααααΆααααα αΌα ααααααααΌαααΆαααααΎαααααααααααααααααααΆααααΆααααα αΌα αα·ααααα αΌαααααααααααΆααααα αΌααα αααα»ααααααααα
ααααα·αααΎαα
αααα»αααΆαα α
ααΊααααα½αα gpu_hashtable_insert()
ααΆαααΆαα»ααΆα
αααΎααααααΆαααααΆααα
α»α
ααΌα
ααααΆ αααααΆαααααααααααΆαα½ααααααα½αααα’αΆα
ααααΌαααΆαααααααα
ααΆαααααααααααααΆααα
α»α
α αααααααΌαααΆαα
αΆαααα»αααΆααΆααΏαααααααΆα αα½ααααα»αα
αααα key-value ααααααααα»αα’αα‘α»ααααα α
ααΌαααααααΉααααααα ααα»αααααααααΆαα’αααΈαααΆααα’αααααααΎαα‘αΎαααααααααΆαααα»αααααΎαααΆαααααα·ααααα· ααΎααα·αα’αΆα
ααΆααα»αααΆαα»αααΆαααΆααΎααΆαααααα memory αα½αααΆααΉαααααΆαααΆααΆααααααα
α»ααααααα
ααααΎαααΆααΆα Hash
ααΌααααααΆαααααααααααα
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()
ααΎαααααααα
ααααααααΆαααααΌααααααααΌαααΆαααααΎααα
ααΎαα ααΆααααΎα±αααααααααααααΆαααα
ααΌα αααααΆααααααΆααααΆαααΎ αα αααααααααα½αααααΌαααΆαααααααα ααΆααααααααα αααααΆααΉααααααααΆααααΈαααα αΎαα ααΌααααΈαααα ααααααααΆαα»αα½αααααΌαααΆααα»αα ααααΈααΆααΆαααααα αααα αααα αααα αααααααααααΆααΉαααααΆαααΆαααα αααααΆααααααΆααΎααα·αα αΆαααΆα αααααΎααααα·ααααα·ααΆααααααα’αΆααΌαα·ααααααΆαααααααααααααααααααααααΆαα·αααΆααααα αΆααΆααΎααααααα αα α»αααααααααα¬α’αα - ααΆααΉααα αααααα
ααααΆααααααΌαααα αααΆααΆα hash
α’αααα’αΆα ααααΆααααααΌαααα αααααΆααΆα hash ααααααααΎαααΆααΆααααα½α α αΎααααα αΌαααΆαα»αα·ααααααΈααΆααΆαα αΆαααα αααα»αααΆα αααα»αβαα·αβααΆαβα’αα»ααααβαα»αααΆαβαααβαα αααααβαααα»αβα ααβαααααΆβααΌαβααααΌβα²ααβααΆααααα ααΎαααΈααααα ααα αα αααα»ααααααα·ααΈ CUDA ααΆααααα ααα’αααα αα αΆαααΆααΉαααΆααααααΌαααΆαααααΎαα αααα»αααΌααααΆαααΈαααΆααΆααα αααα»αααΊααα CUDA α
αα
αααα»αα’ααααα
ααΆαααααα½ααααααα
αα
αααα»αα’αααααααΌααα»αααΆαααΆαααΎ gpu_hashtable_insert()
, _lookup()
ΠΈ _delete()
ααααΎαααΆαααΌααααααααα½ααααα»αααααααα½αα αα·αααΆαααΆα gpu_hashtable_insert()
, _lookup()
ΠΈ _delete()
ααααΎαααΆαα’αΆααααααΌααααααααΆ ααΌααΈαα½αααα
αααα»ααααααααα‘αΆαααααα·ααααα· GPU ααΆα
ααααα‘ααα
// 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);
}
}
ααΆααΆα hash αααααΉαααΆαα αΆαααα ααΆααααααΆααααα αΌα ααΆαααααΎα αα·αααΆααα»ααααα»ααααααααΆαααααΆα αααααΆαααααΌαααααααααααααααα·ααα αααα»ααααααα½ααααα»αα ααααααααααΆαααα½α α αΎααααα·αααααΆααααΈ ααΆααΆαααΆααΆααΌαααΆαααααΉαααααΌα αααααΈααΆααααα·ααααα·ααΆααααααααααααααααΆααααΌαααΆαααααΎαααα»ααααααααΆαααααΆαααααα
αααααΆαααΆαααΆααααα ααααα·αααΎααΎαααααΎαααΆαααααα»αααααΆααααα
αΌα αα·αααΆααα»αααααααααΆ α αΎαααααα·αααΎα’αΆαααααα
αΌαααααΌααΆααααααα½α αααααΎαααΉααα·αα’αΆα
ααααααααΆαααΆααΎααΌααΆααΉα "αααα" αα ααΉαααααΌαααΆαααααααα
ααΆααααΆααΆααααααΆα
α»ααααααα α§αααΆααΆ ααΎαααΆαα α
ααΌααααα
αΌαααΆαα½αα’αΆαααααα
αΌαααααΌ 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
. ααααα·αααΎαααααααα‘αΆαααααα·ααααα·ααααΎαααααααααΆαααααααΆααααΈααααα·ααααα·ααΆααααααΆαα’αΆαααΈαα»α αααααΆααΉαααααΎααααααΆαα α½αααααααααα·α
α ααα»αααααα
αα αααααΆααααααΆαααΈααααΆαααΆαααααΉαααααΌαααααΆααΆα hash αα
ααααΆααΆααααΆααααααΆαα α
kernel α ααααα·αααΎα’αααααααΌαααΆαααααΎααααααΆαα
α»αααααα α’αααα’αΆα
ααααΎαα·αα·αααα volatile
ααα»αααααααααΆααααααΆαα’αα»ααααααΉαααα
α»αααααα·α
α αααααΆαααΆαααααΎααααααααααααα»α αα
ααααα»αααΆαα» 32 ααΆα ααααΏαααΆαααα
α»αααΈ 500 ααΆααα»α/αα·ααΆααΈ αα
450 ααΆααα»α/αα·ααΆααΈα
ααα·αααΆα
αα
αααα»αααΆαααααΎααααααααααΆααααΆααααα
αΌαααΆαα» 64 ααΆααα·αααΆααα»α 32 ααΆααααα½αααααΆαααααα½ααααααααααΆα std::unordered_map
α αΎαααααΎααααα·αααΆαααΆααΆα hash αααααΆαα GPUα
std::unordered_map
α
αααΆαααα 70 ms αααα
αΌα αα·αααααΆαα»α
αα α αΎααααααΆαααααααααααα½αααα unordered_map
(ααΆααααα
αΆααααΆαα»ααΆααααΆαααααΌαα
αααΆααααα
αααΎα ααααααα
ααΆααααα»α unordered_map
ααΆααααα
ααα’αααα
αα
αΆαα
αααΎαααααΌαααΆαααααΎα‘αΎα) α αα·ααΆαααααααααααααα, std:unordered_map
ααΆαααΆααααααα·ααα»αααααΆααΆαααααα»αα ααΆααΊααΆααααΎαααΆααααΈααΈααΌαααα½α ααΆααααααααααααααΉαααααα αααΆαα½α ααααΎαααΆαααΆαααα’αααα»αα’ααααΆααααΎααααΆααααααα αα·ααααα αΆαααΈααααΎαααΆαααΆααααααααΆααααααΆααααΈααΆααα»αα
αααΎαα
ααααααααααΆααΆα hash αααααΆαα GPU αα·αααΆαααααΆααααααα’αααααααααα·ααΈααΊ 984 ms α αααααΆαααααα αΌαααΆαααααααααΆαααααΆαα αααΆααααα»αααΆαααΆααααΆααΆααααα»αα’αααα αα αΆα αα·αααΆααα»αααΆ (ααΆααααα ααα’αααα αα αΆα 1 GB αααα αααααααΌαα αααΆαααααααααααα»α CUDA) ααΆααααα αΌα αα·ααα»αααΆαα» αα·αααΆαααααΎαααααααααΎαα½αααΆα α αααΆααα ααααααΆααα’αααα αα·αααΈα’αααα αα αΆαααΆαααΈααα’αΌααααααΌααααααα·α αΆαααΆαααααα
ααΆααΆα hash αααα½αααΆα αααΆαααα 271 ms ααΎααααΈαααα ααα αααααΆαααααα αΌαααΆαααααααααΆαααααΆαα αααΆααααααΆααααα αΌα αα·ααα»αααΆαα»ααΆαααΈααα’αΌ αα·ααα·ααα·αααΈαααααααΆαααααΆαα αααΆααααα»αααΆαα αααααα αααα»αα’αααα αα αΆα αα·αααΆαααααΎα‘αΎααα·ααα ααΎααΆααΆααααααααααααα ααααα·αααΎααΆααΆα GPU ααααα ααΆαααΌα α¬ααααα·αααΎααΆααΆα hash ααΆαααΆαααααα»ααα αααα»αα’αααα αα αΆαααααααΆαααΈααα’αΌ (α§ααΆα ααα ααΎααααΈαααααΎαααΆααΆα hash αααααΉαααααΌαααΆαααααΎαααααΌα GPU αααααααα αα·ααα·αααααα½αααααΆααααααΆα) αααααΆαααα αααααααααααααΊααΆαααααααα
ααΆααΆα hash αααααΆααααΆαααΈααα’αΌαααα αΆαααΈααααΎαααΆαααααα αααααΆαααΆααααααΌαααααα αα·αααΆααααΆαααΆα‘αααααααα
ααα α»α
ααααΆααααααααααΆααΆα hash ααΆααααα αΆαα½αα ααα½ααααααααΌαααΉαα
- ααΆααααΎαα’αααααααΈααα’αααααααΌαααΆαααΆααΆαααααααΆαα ααααα ααααααααΆαα±ααααααΆααα α»α αα αααα»αααΆααΆαααααΌαααΆαααΆαααα·α ααΆαα₯αααα ααα
- αααα·αααααΌαααΆαααα
αααααααααΎαα»αααΆαααα
delete
α αΎαααΌα α αα αα½αααααΆααααααΆααα»α
ααΆαααααα ααααΎαααΆαααααΆααΆα hash α’αΆα αααααααααα·α ααααα ααΆαα·αααααααα·αααΎααΆααΆαααααααααΌα α αΎαααΆαααΆααααα αΌα αα·ααα»αα αααΎαα αααααααΆααα½αααΎααααΈααΆααααααααα»ααα·ααααα·ααΆαααααααΊααααΌααααα αΌαα‘αΎααα·ααα αααα»αααΆααΆαααααΈαα½αααΆαα½αααΉαα’ααααΆααααΎααααΆααααΆααα½ααα α αΎαααααα ααααΌαααααααααΆαααα ααααα‘α»αααα rehashing α
ααΎααααΈαααα αΆαααΈαααα αΆαααααΆααα·αααααΆ αααα»αααΉαααααΎααΌαααΆαααΎααΎααααΈαααααΎαααΆααΆααα½ααααααΆαααΆαα» 128 ααΆα α αΎαααααα·ααα»αααΆααααααΆαα» 4 ααΆααα αΌαααααααα»αααΆαααααα 124 ααΆααααα (α’ααααΆααααΎααααΆαααααα αα 0,96)α αααααΊααΆααΆααΆααααααα αα½αααΈαα½ααααΊααΆααΆαα α ααΊααα CUDA ααΎααααΈαααα αΌαααΆαα»ααααΈα ααα½α 4 ααΆααα αααα»αααΆααΆααααααΆαα½αα
α’ααααΆααααΎααααΆαα
ααααααααααΆααααα
αΌα 4 ααΆαα»
0,00
11,608448 ms (361,314798 ααΆααα/αα·ααΆααΈ)
0,03
11,751424 ms (356,918799 ααΆααα/αα·ααΆααΈ)
0,06
11,942592 ms (351,205515 ααΆααα/αα·ααΆααΈ)
0,09
12,081120 ms (347,178429 ααΆααα/αα·ααΆααΈ)
0,12
12,242560 ms (342,600233 ααΆααα/αα·ααΆααΈ)
0,16
12,396448 ms (338,347235 ααΆααα/αα·ααΆααΈ)
0,19
12,533024 ms (334,660176 ααΆααα/αα·ααΆααΈ)
0,22
12,703328 ms (330,173626 ααΆααα/αα·ααΆααΈ)
0,25
12,884512 ms (325,530693 ααΆααα/αα·ααΆααΈ)
0,28
13,033472 ms (321,810182 ααΆααα/αα·ααΆααΈ)
0,31
13,239296 ms (316,807174 ααΆααα/αα·ααΆααΈ)
0,34
13,392448 ms (313,184256 ααΆααα/αα·ααΆααΈ)
0,37
13,624000 ms (307,861434 ααΆααα/αα·ααΆααΈ)
0,41
13,875520 ms (302,280855 ααΆααα/αα·ααΆααΈ)
0,44
14,126528 ms (296,909756 ααΆααα/αα·ααΆααΈ)
0,47
14,399328 ms (291,284699 ααΆααα/αα·ααΆααΈ)
0,50
14,690304 ms (285,515123 ααΆααα/αα·ααΆααΈ)
0,53
15,039136 ms (278,892623 ααΆααα/αα·ααΆααΈ)
0,56
15,478656 ms (270,973402 ααΆααα/αα·ααΆααΈ)
0,59
15,985664 ms (262,379092 ααΆααα/αα·ααΆααΈ)
0,62
16,668673 ms (251,627968 ααΆααα/αα·ααΆααΈ)
0,66
17,587200 ms (238,486174 ααΆααα/αα·ααΆααΈ)
0,69
18,690048 ms (224,413765 ααΆααα/αα·ααΆααΈ)
0,72
20,278816 ms (206,831789 ααΆααα/αα·ααΆααΈ)
0,75
22,545408 ms (186,038058 ααΆααα/αα·ααΆααΈ)
0,78
26,053312 ms (160,989275 ααΆααα/αα·ααΆααΈ)
0,81
31,895008 ms (131,503463 ααΆααα/αα·ααΆααΈ)
0,84
42,103294 ms (99,619378 ααΆααα/αα·ααΆααΈ)
0,87
61,849056 ms (67,815164 ααΆααα/αα·ααΆααΈ)
0,90
105,695999 ms (39,682713 ααΆααα/αα·ααΆααΈ)
0,94
240,204636 ms (17,461378 ααΆααα/αα·ααΆααΈ)
αα ααααααααΆαααααΎααααΆααααΎαα‘αΎα ααααΎαααΆαααα α»αα ααααα·ααα½αα±ααα ααααΆααααααα»αααααΈααΆαα αααΎαα ααααα·αααΎαααααα·ααΈαααα αΌαααΆαα»αα αααα»αααΆααΆα α αΎααααααΆααααααααααααΆ (α§ααΆα ααα αααααΆααααΆααααααα»αααααα ) ααααα·ααααααΆαααα αΆααα ααα»ααααααααα·αααΎαααααα·ααΈααααΎααΆααΆα hash αααααΆαα’αΆαα»ααΆαααΌα (α§ααΆα ααααα αααα»ααααααα·ααΈααααααΆα ααα·αααΎααααΈαααααΆαα»αααααααα·ααααααααΌαααΆααααα’αααααααΎααααΆαααααα αΌα αα·ααα»αααααααΆαααΉαααΆαα) αααα₯αα·ααΆαααααα’αΆα ααΆααααα αΆα
α αΎαααΆαααΆααααααα ααααΆααααΎαα’αααααααΆααΆα hash αααααΆααααΈααΆααααα αΌαα ααα½α 64 ααΆα (αααααΆααααΎααααΆαα 0,5)α ααααα ααΆαααααααΊ 0,4774 ααΌα ααααααααΆαα αααΎααααα·ααα αααα»ααααααααααα’αααα»α α¬αααααα½ααα ααααΆαααΈααΈααΆααααα’αααα»αα ααααα ααα‘ααα’αα·ααααΆααΊ 60 α
αααααΆαααααααα»αααΆαααΆααααααα ααααΆααααΎαα’αααααααΎααΆααΆααααααΆα 124 ααΆααααα αΌα (αααααΆααααΎααααΆαα 0,97) α ααααα ααΆαααααααΊ 10,1757 α αΎαα’αα·ααααΆ - 6474 (!!). ααΆαα’αα»ααααααΆαα αΆαααααααΆααΈααα’αααααααΆααα α»ααααΆαααααΆαααααα»αα’ααααΆααααΎααααΆαααααααα
ααΆααΆααΆαααα’αααα»ααααα»αααΆααααααΆα’ααααΆααααΎααααΆααααΆααΆα hash αααα±ααααΆαα ααα»αααααααααΆααααααΎααααααΎαααΆαα’αα»αααααααα αααΆαααααΆαααααΎααααΆααα’αααα αα αΆαα ααΆααααΆαααα’ αα αααα»αααααΈααααααΆααα α»α αα·αααααα 32 αααΈα αααα’αΆα ααααΌαααΆαααΆααααΆαα»α αα·αα ααααα·αααΎαααα»αα§ααΆα αααααΆαααΎαααα»αααΆααΆααααααΆαααΆαα» 128 ααΆα ααΎααααααΆαααααΆααααΎααααΆαα 0,25 αααααΆααααααΎαα’αΆα ααΆαααα·αααΎαααΈ 32 ααΆαααΆαα»αα αααα»αααΆ α αΎα 96 ααΆαααααααααα αααααΉαααααΌαααΆααααα - 8 αααααααΆααααΌααΈαα½ααα , 768 ααααΆααααααΆαα αα αΆααααααΆαααααα
ααΌαα αααΆαααΆααΎααααα»ααα·ααΆαα’αααΈααΆαααΆαααααα’αααα αα αΆαααΆαααΈααα’αΌαααααΆααααΆαααααΆααααααααΆαα’αααα αα αΆαααααααααα αααααΈααΆααΆαααααΆα ααα·ααα»αααααΌαααααααΎαααΆαα αααΎααααααΆαααα CUDA ααΆαα’αααα αα αΆααααΆαα αα ααΆαα 4 GB (αα αααααααα NVIDIA 2080 Ti ααΆα 11 GB) ααΆαα αααα·ααααααΆααΆααααααα α α·αααααααααΆααααααα»ααααα»αααΆαααΆαααααααα·ααΆαααααααα
ααααααααααα»αααΉααααααααααααα’αααΈααΆααααααΎαααΆααΆα hash αααααΆααααΆαααΈααα’αΌααααα·αααΆααααα αΆααΆαα½αααΉαααΆααααΎαα’αααααααααα ααααΌα ααΆαα·ααΈααααΎα‘αΎααα·αααΌαααααααααααααΆααα»αα
ααΆαααΆαααααααααα ααα‘αα
ααΎααααΈβαααααβααααα βααβααΆαβααΆαααααβααβαα βααΎαβα’αΆα βααΆαβαααααΆβααααβαα (αααααααααβααΆααΆαβααβααα’βααααβααΆ) ααΈβαααααααααβααΆααΆαβαα·αβααααβααΆβααΆαα
// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);
αααααΆααααααααααααααααααααΈααααααααααααααααααΈα αα·αααΆααα·ααααααΆαααααααΆαααααΆααΆα hash ααΊααΈααα
ααΆαααααααΈα αα·ααΈααΆααααααααααΉαααααΎαααΆαααΌααααΈαααα
ααααααααααααααααααααΉαααααΌαααΆαααααΆααααΈαα
ααΎαααΆααΆαα α
αΌαααΎαααααΌααααααααΆαααα
ααα 1 ααα»ααααααααΌαααΆααααα
αΌααα
αααα»αααααααα 3α αααααΆαααααααααΆααααΆααΆααααααΆαααα α 4 ααΎαααα½αααΆα (3 β 1) & 3
αααααααΎααΉα α’.
ααα ααααΈααααα·ααααΆα
ααααα·αααΎα’αααααΆααααα½αα¬ααα·αααααααΌαααααΎα’ααΈααααααααα»α
ααΌααααααααΌαααΆαααααααααααααΆααααα»ααααα·αααΈα’αααααααα’αα
ααΆααΆα Hash ααααΆααααααΆαααααααα»ααααααα·ααααα ααΆααΆα Hash Free Wait-Free α αΆαααα
αα
αααα’ααΆαα αααα»αααΉααααααααααα’αααΈααΆαα’αα»ααααααΆααΆα hash αααααΆααααΆαααΈααα’αΌ αα·ααα·ααΆαααααΎαααΆααααααα½αααα αααααΆααααααααα»ααα½αααΆαααΆαααΆαααααααααααΆαα Robin Hood hashing αα·α cuckoo hashing αααααααΎααααα·ααααα·ααΆαα’αΆααΌαα·α
αα
αααα»ααα
ααΆαααααααααα·αααααααααααΆααααα½αααααΎ GPU α
ααααα: www.habr.com