ืคืจืกืืชื ืืช ืื ื-Github
ืืืื ืืืืช Hash ืคืฉืืื ืฉื โโGPU ืืืกืืืืช ืืขืื ืืืืช ืืืืืื ื ืืืกืคืืช ืืฉื ืืื. ืืืืฉื ืื ืืื NVIDIA GTX 1060 ืฉืื, ืืงืื ืืื ืืก 64 ืืืืืื ืืืืืช ืืคืชื-ืขืจื ืฉื ืืฆืจื ืืืงืจืื ืชืื ื-210 ืืืคืืืช ืืฉื ืืื ืืืกืืจ 32 ืืืืืื ืืืืืช ืชืื ื-64 ืืืคืืืช ืืฉื ืืื.
ืืืืืจ, ืืืืืจืืช ืืืืฉื ื ืืื ืืื ื-300 ืืืืืื ืืืกืคืืช/ืฉื ืืื ื-500 ืืืืืื ืืืืงืืช/ืฉื ืืื.
ืืืืื ืืชืืื ื-CUDA, ืื ืื ื ืืชื ืืืืฉื ืืช ืืืชื ืืื ืืงื ืขื HLSL ืื GLSL. ืืืืฉืื ืืกืคืจ ืืืืืืช ืืื ืืืืืื ืืืฆืืขืื ืืืืืื ืืืจืืืก ืืกื:
- ืจืง ืืคืชืืืช 32 ืกืืืืืช ืืืืชื ืขืจืืื ืืขืืืืื.
- ืืฉืืืื ืืืฉ ืืฉ ืืืื ืงืืืข.
- ืืืืืื ืืื ืืืื ืืืืืช ืฉืืื ืืฉื ืืื ืืืืงืช.
ืขืืืจ ืืคืชืืืช ืืขืจืืื, ืขืืื ืืฉืืืจ ืกืื ืืคืจืื ืคืฉืื (ืืงืื ืฉืืืขืื ืื 0xffffffff).
ืฉืืืื ืืฉืืฉ ืืื ืื ืขืืืื
ืืืืช ืืืืืื ืืฉืชืืฉืช ืืืชืืืช ืคืชืืื ืขื KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
ืืืื ืืืืื ืืื ืืืงืช ืฉืชืืื, ืื ืืกืคืจ ืจืืฉืื ื, ืื ืืกืคืืงื ืืืจืื ืืืช ืืืืจื ืืื ืืืืื ืืช ืืกืืช pow2/AND, ืืื ืืืคืจืืืจ ืืืืืืืืก ืืืื ืืจืื ืืืชืจ. ืื ืืฉืื ืืืงืจื ืฉื ืืืืงื ืืื ืืืจืืช, ืฉืื ืืืืคืืฉ ืืืื ืืื ืืืจื ืืฉ ืืขืืืฃ ืืช ืืื ืืงืก ืืืฉืืฆืืช ืืื ืืฉืืฆืช. ืืืชืืฆืื ืืื, ืขืืืช ืืคืขืืื ืืชืืืกืคืช ืืืืืื ืืื ืืฉืืฆืช.
ืืืืื ืืืืกื ืช ืจืง ืืช ืืืคืชื ืืืขืจื ืขืืืจ ืื ืืืื ื, ืื ืืืืื ืฉื ืืืคืชื. ืืืืืื ืฉืืืืื ืืืืกื ืช ืจืง ืืคืชืืืช ืฉื 32 ืกืืืืืช, ื-hash ืืืืฉื ืืืจ ืืืื. ืืงืื ืฉืืืขืื ืืฉืชืืฉ ื-Hash Murmur3, ืฉืืืฆืข ืจืง ืืื ืืฉืืจืืช, XOR ืืืืคืืืช.
ืืืืช ืืืืืื ืืฉืชืืฉืช ืืืื ืืงืืช ืืื ืช ื ืขืืื ืฉืืื ื ืชืืืืืช ืืกืืจ ืืืืืจืื. ืื ืื ืคืขืืืืช ืืชืืื ืืกืืืืืช ืืฉืืฉืืช ืืช ืืกืืจ ืฉื ืคืขืืืืช ืืืจืืช ืืืื, ืืืืช ื-hash ืขืืืื ืชืฉืืืจ ืขื ืืืฆื ืื ืืื. ื ืืืจ ืขื ืื ืืืื. ืืืื ืืงื ืขืืืืช ืืฆืืื ืขื ืืจืืืกื ืืกื ืฉืืจืืฆืื ืืืคื ืฉืจืฉืืจืื ืืืงืืื.
ืืืคืชืืืช ืืืขืจืืื ืืืืืช ื-hash ืืืืชืืืื ืืจืืง.
ื ืืชื ืืฉื ืืช ืืช ืืงืื ืื ืฉืืืคื ืื ืืืคืชืืืช ืืืขืจืืื ืฉื 64 ืกืืืืืช. ืืคืชืืืช ืืืจืฉืื ืคืขืืืืช ืงืจืืื, ืืชืืื ืืืฉืืืื-ืืืืคื ืืืืืืช. ืืขืจืืื ืืืจืฉืื ืคืขืืืืช ืงืจืืื ืืืชืืื ืืืืืืืช. ืืืจืื ืืืื, ื-CUDA, ืคืขืืืืช ืงืจืืื-ืืชืืื ืขืืืจ ืขืจืื 32 ื-64 ืกืืืืืช ืื ืืืืืืืช ืื ืขืื ืื ืืืืฉืจืืช ืืืืคื ืืืขื (ืจืื ืืืื).
ืืฆื ืืืืช Hash
ืืื ืืื ืืคืชื-ืขืจื ืืืืืช ืืืืื ืืืื ืืืืืช ืืื ืืืจืืขื ืืฆืืื:
- ืืคืชื ืืขืจื ืจืืงืื. ืืืฆื ืื, ืืืืช ื-hash ืืืืชืืืช.
- ืืืคืชื ื ืืชื, ืื ืืขืจื ืขืืืื ืื ื ืืชื. ืื ืฉืจืฉืืจ ืืืจ ืงืืจื ื ืชืื ืื ืืขืช, ืืื ืืืืืจ ืจืืง. ืื ื ืืจืืื, ืืืชื ืืืจ ืืื ืงืืจื ืื ืฉืจืฉืืจ ืืืจ ืฉื ืืืฆืืข ืืื ืขืืื ืงืฆืช ืงืืื, ืืื ืื ื ืืืืจืื ืขื ืืื ื ื ืชืื ืื ืืืงืืื.
- ืื ืืืคืชื ืืื ืืขืจื ื ืจืฉืืื.
- ืืขืจื ืืืื ืืฉืจืฉืืจืื ืืืจืื ืฉื ืืืฆืืข, ืื ืืืคืชื ืขืืืื ืื. ืื ืืืื ืืงืจืืช ืืืืืื ืฉืืืืื ืืชืื ืืช CUDA ืืฉ ืืืื ืืืืจืื ืืกืืืจ ืืืืคื ืจืืคืฃ. ืื ื ืืจืืื; ืืื ืืงืจื, ืืืคืชื ืขืืืื ืจืืง, ืื ืื ืืขืจื ืืืจ ืื ืื.
ื ืืืื ืก ืืฉืื ืืื ืฉืืจืืข ืฉืืืคืชื ื ืืชื ืืืจืืฅ, ืืื ืืืจ ืื ืื - ืื ืื ืืืคืชื ื ืืืง, ื ืืืจ ืขื ืื ืืืืฉื.
ืงืื ืืืืช ื-hash ืืคืืื ืขืืื ืขื ืืืื ืืืืจืื ืืกืืืจืื ืืืืคื ืจืืคืฃ, ืฉืืื ืกืืจ ืืงืจืืื ืืืืชืืื ืฉื ืืืืืจืื ืืื ื ืืืืข. ืืืฉืจ ืื ื ืืกืชืืืื ืขื ืืื ืกื, ืืืคืืฉ ืืืืืงื ืืืืืช hash, ืืืืจ ืฉืื ืืื ืืคืชื-ืขืจื ื ืืฆื ืืืื ืืืจืืขืช ืืืฆืืื ืฉืชืืืจื ืืขืื.
ืืื ืกื ืืืืืช ืืืืื
ืคืื ืงืฆืืืช CUDA ืฉืืื ืืกื ืฆืืื ืืคืชื-ืขืจื ืืืืืช hash ื ืจืืืช ืื:
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 ืืื ืื-hash ืฉื ืืืคืชื ืฉืืืื ืก. ืื ืืจืืฅ ืืืขืจื ืืืฆืข ืคืขืืืช ืืฉืืืื ืืืืืคื ืืืืืืช ืืืฉืืื ืืช ืืืคืชื ืืืจืืฅ ืื ืืจืืง. ืื ืืืืื ืื ืืชืืื, ืืืคืชื ืืืจืืฅ ืืชืขืืื ืขื ืืืคืชื ืฉืืืื ืก, ืืืืืจ ืืื ืืืืืจ ืืคืชื ืืืจืืฅ ืืืงืืจื. ืื ืืคืชื ืืงืืจื ืื ืืื ืจืืง ืื ืชืืื ืืืคืชื ืฉืืืื ืก, ืืื ืืงืื ืืฆื ืืจืืฅ ืืชืืื ืืืื ืกื ืืืื ืืก ืืช ืืขืจื ืฉืืืื ืก ืืืจืืฅ.
ืื ืืงืจืืืช ืงืจื ื ืืืช gpu_hashtable_insert()
ืืฉื ื ืืกืคืจ ืืืื ืืื ืขื ืืืชื ืืคืชื, ืืื ืื ืืื ืืืขืจืืื ืฉืืื ืืืื ืืืืืชื ืืืจืืฅ ืืืคืชื. ืื ื ืืฉื ื ืืจืืื: ืืืช ืืืชืืืช ืขืจื-ืืคืชื ืืืืื ืืงืจืืื ืชืฆืืื, ืื ืืืืืื ืฉืื ืื ืงืืจื ืืืงืืื ืืชืื ืืกืคืจ ืฉืจืฉืืจืื ืฉื ืืืฆืืข, ืืื ื ื ืืืืืื ืืืืืช ืืืื ืืชืืืช ืืืืจืื ืชืืื ืืืืจืื ื.
ืืืคืืฉ ืืืืช 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);
}
}
ืืื ืืืฆืื ืืช ืืขืจื ืฉื ืืคืชื ืืืืืืกื ืืืืื, ืื ื ืขืืืจืื ืืจื ืืืขืจื ืืื ืื-hash ืฉื ืืืคืชื ืฉืื ื ืืืคืฉืื. ืืื ืืฉืืฆืช ืื ื ืืืืงืื ืื ืืืคืชื ืืื ืื ืฉืื ื ืืืคืฉืื, ืืื ืื, ื ืืืืจ ืืช ืขืจืื. ืื ื ืื ืืืืงืื ืื ืืืคืชื ืจืืง, ืืื ืื, ืื ื ืืืืืื ืืช ืืืืคืืฉ.
ืื ืื ื ืืื ืืืฆืื ืืช ืืืคืชื, ืืงืื ืืืืืจ ืขืจื ืจืืง.
ื ืืชื ืืืฆืข ืืช ืื ืคืขืืืืช ืืืืคืืฉ ืืืื ืืืงืืื ืืืืฆืขืืช ืืืกืคืืช ืืืืืงืืช. ืืื ืืื ืืืืื ืืืื ืืื ืืืจืืขืช ืืืฆืืื ืฉืชืืืจื ืืขืื ืขืืืจ ืืืจืืื.
ืืืืงื ืืืืืช ืืืืื
ืงืื ืืืืืงืช ืืคืชืืืช:
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 ืขื ืืื ืืฆืืจืช ืืืื ืืืืื ืืืชืจ ืืืื ืกืช ืืืื ืืื ืื ืจืืงืื ืืืืืื ืืืฉื ื ืืชืืื. ืื ืืืฉืืชื ืืช ืืคืื ืงืฆืืื ืืืืช ืืื ืื ืจืฆืืชื ืืฉืืืจ ืขื ืงืื ืืืืืื ืคืฉืื. ืืชืจื ืืื, ืืชืืื ืืืช 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()
ืืฉืชืืฉ ืืืฆืืืข ืจืืื ืื ื ืืืฃ ืืืขืจื ืฉื ืืืืืช ืืืืืช ื-hash.
ืืืืืจ ืขืฉืื ืืืืืจ ืืืฆืข ืืืคืืืืืืฆืื ืฉื ืงืจืืื ืืืชืืื ืืืืืจืื ืืืืืื ืื ืืฉืืชืฃ... ื ืืชื ืืืฉืืืช ืืืคืืืืืืฆืืืช ืืื ืืืืฆืขืืช ืืืืช ืืืคืชื
volatile
: ... ืื ืืชืืืืกืืช ืืืฉืชื ื ืื ืืืจืืืช ืืืืจืืช ืงืจืืื ืื ืืชืืื ืืืืืจืื ืืืืชื.
ืฉืืงืืื ืชืงืื ืืช ืืื ื ืืืืืืื ืืืฉืื volatile
. ืื ืฉืจืฉืืจ ืืืืฆืืข ืืฉืชืืฉ ืืขืจื ืฉืืืจ ืืคืขืืืช ืงืจืืื ืงืืืืช, ืื ืืื ืืฉืชืืฉ ืืืืืข ืืขื ืืืืฉื. ืืื ืขืืืื, ืืื ืืืืข ืืืืฆื ืื ืืื ืฉื ืืืืช ื-hash ืืจืืข ืืกืืื ืฉื ืงืจืืืช ืืงืจื ื. ืื ืืชื ืฆืจืื ืืืฉืชืืฉ ืืืืืข ืืขืืื ื ืืืืชืจ, ืืชื ืืืื ืืืฉืชืืฉ ืืืื ืืงืก volatile
, ืืื ืื ืืืืฆืืขืื ืืจืื ืืขื: ืืคื ืืืืืงืืช ืฉืื, ืืขืช ืืืืงืช 32 ืืืืืื ืืืื ืืื, ืืืืืจืืช ืืจืื ื-500 ืืืืืื ืืืืงืืช/ืฉื ืืื ื-450 ืืืืืื ืืืืงืืช/ืฉื ืืื.
ืคืจืืืืงืืืืืืช
ืืืืื ืืืื ืกืช 64 ืืืืืื ืืืื ืืื ืืืืืงืช 32 ืืืืืื ืืื, ืชืืจืืช ืืื std::unordered_map
ืืืื ืืืขื ืืืืช ืืืืื ืขืืืจ ื-GPU:
std::unordered_map
ืืืื 70 ืืืคืืืช ืืฉื ืืื ืืืื ืกื ืืืกืจื ืฉื ืืืื ืืื ืืืืืจ ืืื ืืฉืืจืืจื unordered_map
(ืืืืคืืจ ืืืืืืื ื ืืืื ืืื ืืืงื ืืจืื ืืื, ืื ืืคื ืื unordered_map
ืืชืืฆืขืืช ืืงืฆืืืช ืืืืจืื ืืจืืืืช). ืืื ืืช, std:unordered_map
ืืืืืืช ืฉืื ืืช ืืืืืืื. ืืื ืืื ืืคืขืื ืืืื ืฉื ืืขืื, ืชืืื ืืขืจืื ืืคืชื ืืื ืืืื, ืืชืคืงื ืืืื ืืฉืืขืืจื ื ืืฆืื ืืืืืื ืืืฆืื ืืืฆืืขืื ืืฆืืืื ืืืืจ ืืืืงืืช ืืจืืืืช.
ืืฉื ืืืืช ืืืืืื ืขืืืจ ื-GPU ืืืชืงืฉืืจืช ืืื ืชืืื ืืืช ืืืืชื 984 ืืืคืืืช ืืฉื ืืื. ืื ืืืื ืืช ืืืื ืืืืฉืงืข ืืืฆืืช ืืืืื ืืืืืจืื ืืืืืงืชื (ืืงืฆืืช 1 ื'ืืื-ืืืื ืฉื ืืืืจืื ืคืขื ืืืช, ืื ืฉืืืงื ืืื ืื ื-CUDA), ืืื ืกืช ืืืืืงืช ืืืื ืืื ืืืืืจืฆืื ืขืืืื. ืื ืืขืืชืงืื ืืืืืจืื ืืจืืืก ืืืกื ืืืื ื ื ืืงืืื ืืืฉืืื ืื ืื.
ืืืืืช ืืืืืื ืขืฆืื ื ืืจืฉื 271 ืืืคืืืช ืืฉื ืืื ืืื ืืืฉืืื. ืื ืืืื ืืช ืืืื ืืืืฉืงืข ืขื ืืื ืืจืืืก ืืืกื ืืืื ืกืช ืืืืืงืช ืืืื ืืื, ืืืื ื ืืืงื ืืืฉืืื ืืช ืืืื ืืืืฉืงืข ืืืขืชืงื ืืืืืจืื ืืืืืจืฆืื ืขื ืืืืื ืืืชืงืืืช. ืื ืืืืช ื-GPU ืงืืืืช ืืืืจื ืืื, ืื ืื ืืืืช ื-hash ืืืืื ืืืืืจืื ืฉื ืืจืืืก ืืืกื (ืืืืืื, ืืื ืืืฆืืจ ืืืืช ืืืืื ืฉืชืฉืืฉ ืืช ืงืื ื-GPU ืืืจ ืืื ืืช ืืืขืื ืืืจืืื), ืื ืชืืฆืืช ืืืืืงื ืจืืืื ืืืช.
ืืืืช ืืืืืื ืืืจืืืก ืืกื ืืืืืื ืืืฆืืขืื ืืืืืื ืืืืืช ืืชืคืืงื ืืืืื ืืืงืืื ืืงืืืืืช.
ืืืืืืช
ืืืจืืืืงืืืจืช ืืืืช ืืืืืื ืืฉ ืืื ืืขืืืช ืฉืืืื ืืฉืื ืื ืืืืื:
- ืืืืื ืืื ืืืจื ื ืคืืข ืขื ืืื clustering, ืื ืฉืืืจื ืืืคืชืืืช ืืืืื ืืืืืช ืคืืืช ืืืืฉืื.
- ืืคืชืืืช ืืื ื ืืืกืจืื ืืืืฆืขืืช ืืคืื ืงืฆืื
delete
ืืขื ืืืื ืื ืขืืืกืื ืืช ืืฉืืืื.
ืืชืืฆืื ืืื, ืืืืฆืืขืื ืฉื ืืืืช ืืืืื ืขืืืืื ืืืชืืจืืจ ืืืืจืื, ืืืืืื ืื ืืื ืงืืืืช ืืืฉื ืืื ืจื ืืืฉ ืื ืืืกืคืืช ืืืืืงืืช ืจืืืช. ืืืช ืืืจืืื ืืฆืืฆื ืืช ืืืกืจืื ืืช ืืืื ืืื ืืืื ืืก ืืืืฉ ืืืืื ืืืฉื ืขื ืฉืืขืืจ ื ืืฆืื ื ืืื ืืืื ืืืกื ื ืืช ืืืคืชืืืช ืฉืืืกืจื ืืืืื ืืืืืืฉ ืืืืฉ.
ืืื ืืืืืืฉ ืืช ืืืขืืืช ืืืชืืืจืืช, ืืฉืชืืฉ ืืงืื ืฉืืืขืื ืืื ืืืฆืืจ ืืืื ืขื 128 ืืืืืื ืืืื ืืื ืืืขืืืจ ืืืืืื ืฉื 4 ืืืืืื ืืืื ืืื ืขื ืฉืืืื 124 ืืืืืื ืืฉืืฆืืช (ืฉืืขืืจ ื ืืฆืื ืฉื ืืขืจื 0,96). ืื ื ืืืืช ืืชืืฆืืืช, ืื ืฉืืจื ืืื ืงืจืืืช ืืืืช CUDA ืืืื ืกืช 4 ืืืืืื ืืืื ืืื ืืืฉืื ืืืืืช hash ืืืช:
ืฉืืขืืจ ืฉืืืืฉ
ืืฉื ืืื ืกื 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 ืืืืืื ืืคืชืืืช/ืฉื ืืื)
ืืื ืฉืื ืืฆืื ืขืืื, ืืืืฆืืขืื ืืืจืืื. ืื ืื ืจืฆืื ืืจืื ืืืงืจืื. ืื ืืืฉืื ืืื ืืก ืืืื ืืื ืืืืื ืืื ืืฉืืื ืืืชื (ืืืืืื, ืืขืช ืกืคืืจืช ืืืืื ืืกืคืจ), ืื ืื ืืขืื. ืืื ืื ืืืคืืืงืฆืื ืืฉืชืืฉืช ืืืืืช hash ืืจืืืช ืืืื (ืืืืืื, ืืขืืจื ืืจืคื ืืื ืืืืกื ืืืงืื ืื ืจืืงืื ืฉื ืชืืื ืืช ืฉืืื ืืืฉืชืืฉ ืืืกืืฃ ืืืืืง ืืืืข ืืขืชืื ืงืจืืืืช), ืื ืืชื ืืืืช ืื ืขืืืื ืืืืืช ืืขืืืชืืช.
ืืืื ืืช ืขืืืง ืืืืืื ืฉื ืืืืช ื-hash ืืืืจ 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 ื'ืืื-ืืืื), ืื ืขืืืื ืื ืชืืื ืืืืืื ืืืืื ืืืคืกืื ืืืืืืช ืืืื.
ืืืืฉื ืืืชืื ืขืื ืขื ืืฆืืจืช ืืืืืืช ืืืืื ืืืจืืืกื ืืกื ืฉืืื ืืื ืืขืืืช ืขื ืขืืืง ืืืืืื, ืืื ืื ืืจืืื ืืฉืืืืฉ ืืืืจ ืืืจืืฆืื ืฉื ืืืงื.
ืืืืืช ืขืืืง ืฆืืืืื
ืืื ืืงืืืข ืืช ืขืืืง ืืืืืงื ืฉื ืืคืชื, ื ืืื ืืืืฅ ืืช ื-hash ืฉื ืืืคืชื (ืืื ืืงืก ืืืืื ืืืืืืืื ืฉืื) ืืืื ืืงืก ืืืืื ืืืืืชื ืฉืื:
// 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.
ืืกืงื ื
ืื ืืฉ ืื ืฉืืืืช ืื ืืขืจืืช, ืื ื ืฉืื ืื ืืืื ืืืชืืืช
ืงืื ืื ื ืืชื ืืืฉืจืืช ืืืืจืื ืืฆืืื ืื:
ืืืืช Hash ืืคืฉืืื ืืขืืื ืืื ื ืขืืื ืืืืช Hash ืืื ื ืขืืื ืืื ืืืชื ื
ืืขืชืื, ืืืฉืื ืืืชืื ืขื ืืืฉืืื ืืืืช hash ืขืืืจ ืืจืืืกื ืืกื ืืื ืชื ืืช ืืืืฆืืขืื ืฉืืื. ืืชืืื ืืืช ืฉืื ืืืืืืช ืฉืจืฉืืจ, ืืืืื ืจืืืื ืืื ืืืืืื ืงืืงืืื ืืืืฆืขืืช ืคืขืืืืช ืืืืืืืช ืืืื ื ื ืชืื ืื ืืืืืืชืืื ื-GPU.
ืืงืืจ: www.habr.com