แแแแแแแฅแแแงแแ Github-แแ
แแก แแ แแก แแแ แขแแแ GPU แฐแแจแแก แชแฎแ แแแ, แ แแแแแกแแช แจแแฃแซแแแ แฌแแแจแ แแกแแแแ แแแแแแแ แฉแแแแ แแแก แแแแฃแจแแแแแ. แฉแแแก NVIDIA GTX 1060 แแแแขแแแแ แแแแ แแแแแกแแแก 64 แแแแแแ แจแแแแฎแแแแแ แแแแแ แแ แแแฃแ แแแกแแฆแแแ-แแแแจแแแแแแแแก แฌแงแแแแก แแแแฎแแแแแแ 210 ms-แจแ แแ แจแแแก 32 แแแแแแ แฌแงแแแแก แแแแฎแแแแแแ 64 ms-แจแ.
แแแฃ แแแแขแแแแ แกแแฉแฅแแ แ แแ แแก แแแแฎแแแแแแ 300 แแแแแแแ แฉแแกแแ/แฌแ แแ 500 แแแแแแแ แฌแแจแแ/แฌแ.
แชแฎแ แแแ แแฌแแ แแแ CUDA-แจแ, แแฃแแชแ แแแแแ แขแแฅแแแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก HLSL แแ GLSL-แแ. แแแแแแแแแขแแชแแแก แแฅแแก แ แแแแแแแแ แจแแแฆแฃแแแ แแแแแ แแแ แแแแ แแแฆแแแ แจแแกแ แฃแแแแแก แฃแแ แฃแแแแแกแแงแแคแแ:
- แแแแฃแจแแแแแฃแแแ แแฎแแแแ 32-แแแขแแแแ แแแแแแจแแแ แแ แแแแแ แแแแจแแแแแแแแแ.
- แฐแแจแแก แชแฎแ แแแก แแฅแแก แคแแฅแกแแ แแแฃแแ แแแแ.
- แแ แแก แแแแ แฃแแแ แแงแแก แกแแแซแแแแ แแก แแ แแก แขแแแ.
แแแกแแฆแแแแแแกแ แแ แแแแจแแแแแแแแแแกแแแแก, แแฅแแแ แฃแแแ แแแฏแแแจแแแ แแแ แขแแแ แแแแแกแแแฆแแ แแแ แแแ แแแ แ (แแแแแ แแแแจแ แแก แแ แแก 0xffffffff).
แฐแแจ แแแแแแ แกแแแแขแแแแก แแแ แแจแ
แฐแแจแแก แชแฎแ แแแ แแงแแแแแก แฆแแ แแแกแแแแ แแแ KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
แชแฎแ แแแแก แแแแ แแ แแก แแ แแก แกแแแซแแแแ แ แแ แแ แ แแแ แขแแแ แ แแชแฎแแ, แ แแแแแ แแ แแ แกแฌแ แแคแ แแแกแขแ แฃแฅแชแแ แกแแแแแ แแกแแ pow2/AND แแแฆแแแก แแแแแกแแงแแแแแแแ, แแแแ แแ แแแแฃแแแก แแแแ แแขแแ แ แแแชแแแแแแ แแแแแ. แแก แแแแจแแแแแแแแแแ แฎแแแแแแแ แแแแแแแแแแแก แจแแแแฎแแแแแจแ, แแแแแแแแ แฎแแแแแแแ แชแฎแ แแแแก แซแแแแแจแ แกแแแขแแก แแแแแฅแกแ แฃแแแ แแงแแก แจแแคแฃแแฃแแ แแแแแแฃแ แกแแแขแจแ. แแ แจแแแแแแ, แแแแ แแชแแแก แฆแแ แแแฃแแแแ แแแแขแแแ แแแแฃแแก แแแแแแฃแ แกแแแขแจแ.
แชแฎแ แแแ แแแแฎแแแก แแฎแแแแ แแแกแแฆแแแก แแ แแแแจแแแแแแแแก แแแแแแฃแแ แแแแแแแขแแกแแแแก แแ แแ แ แแแกแแฆแแแแก แฐแแจแก. แแแแแแแแ แชแฎแ แแแ แแแแฎแแแก แแฎแแแแ 32-แแแขแแแ แแแกแแฆแแแแแก, แฐแแจแ แซแแแแแ แกแฌแ แแคแแ แแแแแแแแแแแ. แแแแแ แแแชแแแฃแแ แแแแ แแงแแแแแก Murmur3 แฐแแจแก, แ แแแแแแช แแกแ แฃแแแแก แแฎแแแแ แ แแแแแแแแ แชแแแแก, 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 แแแ แแแจแ.
แกแขแแขแแ
แแแแแฃแ แแแขแฃแแแ แแแแแแ
แแแแแ แแแชแแแฃแ แคแฃแแฅแชแแแก แแแแแก แคแ แแแแแแขแแแจแ 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);
}
}
แแแแแแแแแกแแแแ แแแแ แแแ แฐแแจแแก แชแฎแ แแแ แแฎแแ แก แฃแญแแ แก แแ แแแ แแฃแแแ แฉแแแแ แแแแก, แซแแแแแก แแ แฌแแจแแแก. แแแแก แแแแ, แ แแ แแแกแแฆแแแ-แแแแจแแแแแแแแก แฌแงแแแแแแ แงแแแแแแแแก แแแฎแแแแ แแ แ-แแ แ แแแแแแแ แแแแแจแแ แแ แแแแแแจแแแ แแ แแแซแ แแแแแ, แชแฎแ แแแ แแแ แแแขแแแก แแซแแแแ แกแแกแฌแแ แแก, แแแจแแแแช แแ, แ แแแแกแแช แกแฎแแแแแกแฎแแ แขแแแแก แแแแ แแชแแแแ แแแแแแงแแแแแ แแ แแแ แแฃแแแ.
แแฃแแชแ, แแฃ แแแ แแแแแฃแ แแ แแแแแแฃแจแแแแแ แฉแแกแแแแแกแ แแ แฌแแจแแแก แฏแแฃแคแก แแ แแฃ แฌแงแแแแแแแก แจแแงแแแแแก แแแกแแแ แจแแแชแแแก แแฃแแแแแแขแแแก, แแแจแแ แแแ แแแฌแแแแกแฌแแ แแแขแงแแแแแแ, แ แแแแแ แฌแงแแแแ "แแแแแแ แฏแแแแก" - แแแแ แฉแแแฌแแ แแแ แฐแแจแแก แชแฎแ แแแจแ. แแแฅแแแ, แฉแแแ แแแแแแแซแแฎแแ แฉแแกแแแก แแแแ แฌแงแแแแแแแก แจแแงแแแแแก แแแกแแแแ 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
แแ แแ แแฅแขแแแฃแแแ แแ แแ แกแแแแแก แฐแแจแแก แชแฎแ แแแ GPU-แกแแแแก:
std::unordered_map
แแแฎแแ แฏแ 70 ms แแแแแแแขแแแแก แฉแแกแแ แแ แแแแฆแแแ แแ แจแแแแแ แแแแ แแแแแแแกแฃแคแแแแ unordered_map
(แแแแแแแแแแ แแแแแแแขแแกแแแ แแแแแก แแแฆแฌแแแแก แแแแ แแ แ แกแญแแ แแแแ, แ แแแแแ แจแแแแแ unordered_map
แแแแแแแ แแแฎแกแแแ แแแแก แแ แแแแแฏแแ แแแ แแแแแงแแคแ). แแฃแแฌแ แคแแแแ แ แแ แแแฅแแแ, std:unordered_map
แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแ แจแแแฆแฃแแแแแ. แแก แแ แแก CPU-แแก แจแแกแ แฃแแแแแก แแ แแ แซแแคแ, แแฎแแ แก แฃแญแแ แก แแแแแกแแแแ แ แแแแแก แแแกแแฆแแแแก แแแแจแแแแแแแแแก, แแแ แแแ แแฃแจแแแแก แแแฆแแแ แแแแแงแแแแแแก แกแแฎแจแแ แแ แแ แแฉแแแแแแก แกแขแแแแแฃแ แจแแกแ แฃแแแแแก แแ แแแแแฏแแ แแแ แฌแแจแแแก แจแแแแแ.
แฐแแจแแก แชแฎแ แแแแก แฎแแแแ แซแแแแแแ GPU-แกแแแแก แแ แแ แแแ แแแแแก แจแแ แแก แแแแฃแแแแแชแแแกแแแแก แแงแ 984 ms. แแก แแแแชแแแก แชแฎแ แแแแก แแแฎแกแแแ แแแแจแ แแแแแแแกแแแแกแ แแ แแแกแ แฌแแจแแแก แแ แแก แแแฎแแ แฏแฃแ แแ แแก (1 GB แแแฎแกแแแ แแแแก แแ แแฏแแ แแ แแแแแงแแคแ, แ แแกแแช แแแ แแแแฃแแ แแ แ แกแญแแ แแแแ CUDA-แจแ), แแแแแแแขแแแแก แฉแแกแแ แแ แฌแแจแแ แแ แแแแแ แแแแแแ แแแ. แแกแแแ แแฎแแแแแแแแแจแ แแแแฆแแแ แงแแแแ แแกแแ แแแแแ แแแ แแแแก แแแฎแกแแแ แแแแจแ.
แฐแแจแแก แชแฎแ แแแแก แแแกแ แฃแแแแแก แแแกแญแแ แแ 271 ms. แแก แแแแชแแแก แแแแแ แแแ แแแแก แแแแ แแแแแแแขแแแแก แฉแแกแแแกแ แแ แฌแแจแแแก แแ แแก แแแฎแแ แฏแฃแ แแ แแก แแ แแ แแแแแแแกแฌแแแแแก แแแฎแกแแแ แแแแจแ แแแแแ แแแแก แแ แแแฆแแแฃแแ แชแฎแ แแแแก แแแแแแ แแแแก แแ แแก แแแฎแแ แฏแฃแ แแ แแก. แแฃ GPU แชแฎแ แแแ แแแแฎแแแก แชแฎแแแ แแแก, แแ แแฃ แฐแแจแแก แชแฎแ แแแ แแแแแแแแ แจแแแชแแแก แแแแแ แแแ แแแแก แแแฎแกแแแ แแแแก (แแแแแแแแแ, แฐแแจแแก แชแฎแ แแแแก แจแแกแแฅแแแแแแ, แ แแแแแกแแช แแแแแแงแแแแแก แกแฎแแ GPU แแแแ แแ แแ แ แชแแแขแ แแแฃแ แ แแ แแชแแกแแ แ), แแแจแแ แขแแกแขแแก แจแแแแแ แจแแกแแแแแแกแแ.
แแแแแ แแแ แแแแก แฐแแจแแก แชแฎแ แแแ แแฉแแแแแแก แแแฆแแ แจแแกแ แฃแแแแแก แแแฆแแแ แแแแขแแ แฃแแแ แแแแแแแกแ แแ แแฅแขแแฃแ แ แแแ แแแแแแแแชแแแก แแแแ.
แจแแแฆแฃแแแแแ
แฐแแจแแก แชแฎแ แแแแก แแ แฅแแขแแฅแขแฃแ แแก แแฅแแก แ แแแแแแแแ แกแแแแแฎแ, แ แแแแแแช แฃแแแ แแชแแแแ:
- แฎแแแแแแแ แแแแแแ แแแ แแคแแ แฎแแแก แแแแกแขแแ แแ แแแแก, แ แแช แแฌแแแแก แแแแแแแแ แแแแแแจแแแแก แกแ แฃแแงแแคแแแแ แแแแแแกแแแแก.
- แแแแแแจแแแ แแ แแ แแก แแแแฆแแแฃแแ แคแฃแแฅแชแแแก แแแแแงแแแแแแ
delete
แแ แแ แแแ แแแแแแแแแแแจแ แแกแแแ แแคแฃแญแแแแ แแแแแแแก.
แจแแแแแแ, แฐแแจแแก แชแฎแ แแแแก แจแแกแ แฃแแแแ แจแแแซแแแแ แแแแแแแแ แแแฅแแแแแแแก, แแแแกแแแฃแแ แแแแ แแฃ แแก แแแแ แฎแแแก แแแแแแแแแแแจแ แแ แกแแแแแก แแ แแฅแแก แแ แแแแแ แฉแแแแ แแ แแ แฌแแจแแ. แแ แแแแฃแกแแแแก แจแแ แแแแแแแก แแ แ-แแ แแ แแแแ แฎแแแแฎแแ แแแแแขแแแ แแแ แแฎแแ แชแฎแ แแแจแ แกแแแแแแ แแแแแแ แฃแขแแแแแแชแแแก แกแแฉแฅแแ แแ แแ แแแแฆแแแฃแแ แแแแแแจแแแแก แแแคแแแขแแ แ แฎแแแแฎแแแ แแแกแฌแแ แแแแก แแ แแก.
แแฆแฌแแ แแแ แกแแแแแฎแแแแก แกแแแแฃแกแขแ แแชแแแ, แแ แแแแแแแงแแแแ แแแแแฎแกแแแแแฃแ แแแแก, แ แแแ แจแแแฅแแแ แชแฎแ แแแ 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 แแแแแแแ แแแกแแฆแแแ/แฌแ.)
แฃแขแแแแแแชแแแก แแแขแแแแกแแแ แแ แแแ, แจแแกแ แฃแแแแ แแชแแ แแแแ. แฃแแแขแแก แจแแแแฎแแแแแจแ แแก แแ แแ แแก แกแแกแฃแ แแแแ. แแฃ แแแแแแแชแแ แแแแแกแแแก แแแแแแแขแแแก แชแฎแ แแแจแ แแ แจแแแแแ แฃแแฃแแแแแแงแแคแก แแแ (แแแแแแแแแ, แฌแแแแจแ แกแแขแงแแแแแก แแแแแแแกแแก), แแแจแแ แแก แแ แแ แแก แแ แแแแแแ. แแแแ แแ แแฃ แแแแแแแชแแ แแงแแแแแก แฎแแแแ แซแแแ แฐแแจแแก แชแฎแ แแแก (แแแแแแแแแ, แแ แแคแแแฃแ แ แแแแฅแขแแ แจแ แกแฃแ แแแแแแก แแ แ แชแแ แแแแ แแแฌแแแแแแก แจแแกแแแแฎแแ, แกแแแแช แแแแฎแแแ แแแแแ แฎแจแแ แแ แแแแแกแแแก แแ แจแแแก แแแคแแ แแแชแแแก), แแแจแแ แแก แฅแชแแแ แจแแแซแแแแ แแงแแก แแ แแแแแแฃแ แ.
แแ แแแแแแแแ แฐแแจแแก แชแฎแ แแแแก แแแแแแแแแแแก แกแแฆแ แแ 64 แแแแแแแ แฉแแกแแแก แจแแแแแ (แแแแแงแแแแแแก แคแแฅแขแแ แ 0,5). แกแแจแฃแแแ แกแแฆแ แแ แแงแ 0,4774, แแแแขแแ แแแแแแจแแแแก แฃแแแขแแกแแแ แแงแ แแ แกแแฃแแแแแกแ แจแแกแแซแแ แญแ แแแจแ แแ แแ แแ แกแแแขแแ แแแจแแ แแแฃแแ แกแแฃแแแแแกแ แแแแแชแแแแแ. แฎแแแก แแแฅแกแแแแแฃแ แ แกแแฆแ แแ แแงแ 60.
แจแแแแแ แแแแแแแ แกแแชแแแแ แกแแฆแ แแ แแแแแแแแ 124 แแแแแแแ แฉแแแแ แแแ (แฃแขแแแแแแชแแแก แคแแฅแขแแ แ 0,97). แกแแจแฃแแแ แกแแฆแ แแ แฃแแแ แแงแ 10,1757, แฎแแแ แแแฅแกแแแแแฃแ แ - 6474 (!!). แฎแแแแแแแ แกแแแกแแ แฃแแ แแคแแฅแขแฃแ แแแ แแแแจแแแแแแแแแ แแแแแแก แแแแแงแแแแแแก แแแฆแแแ แกแแฉแฅแแ แแก แแ แแก.
แฃแแฏแแแแกแแ แจแแแแแแ แฉแฃแแแ แแ แฐแแจแแก แชแฎแ แแแแก แแแแแงแแแแแแก แแแฉแแแแแแแแ แแแแแแ. แแแแ แแ แจแแแแแ แฉแแแ แแแ แแแ แจแแกแ แฃแแแแแก แแแฎแกแแแ แแแแก แแแฎแแแ แแแแก แฎแแ แฏแแ. แกแแแแแแแแ แแ, 32-แแแขแแแแ แแแกแแฆแแแแแแก แแ แแแแจแแแแแแแแแแก แจแแแแฎแแแแแจแ, แแก แจแแแซแแแแ แแแแแ แแแแแก. แแฃ แแแแแ แแแงแแแแแ แแแแแแแแจแ 128 แแแแแแแ แแแแแแแขแแก แแฅแแแ แชแฎแ แแแจแ แจแแแแแแ แฉแฃแแแแ แฃแขแแแแแแชแแแก แแแแคแแชแแแแขแก 0,25, แแแจแแ แแแกแจแ แจแแแแแซแแแ แแแแแแแแแกแแ แแ แแฃแแแขแแก 32 แแแแแแแ แแแแแแแขแ, แฎแแแ แแแ แฉแแแแแ 96 แแแแแแแ แกแแแขแ แแแแแแ แแแแ - 8 แแแแขแ แแแแแแฃแ แฌแงแแแแแ. , 768 MB แแแแแ แแฃแแ แแแฎแกแแแ แแแ.
แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ แกแแฃแแแ แแ แแแแแ แแแ แแแแก แแแฎแกแแแ แแแแก แแแแแ แแแแแ, แ แแช แฃแคแ แ แฆแแ แแแฃแแ แ แแกแฃแ แกแแ, แแแแ แ แกแแกแขแแแแก แแแฎแกแแแ แแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แฃแแแขแแก แแแแแแแแ แแแ แแแกแแขแแแแก แแ แแคแแแฃแ แแแ แแแแแก, แ แแแแแแกแแช แแฅแแ CUDA-แก แแฎแแ แแแญแแ แ, แแฅแแ แแแแแแฃแ 4 GB แแแฎแกแแแ แแแ (แฌแแ แแก แแ แแก NVIDIA 2080 Ti-แก แแฅแแก 11 GB), แแแแแช แแ แแฅแแแแ แงแแแแแแ แแแแแแ แฃแแ แแแแแฌแงแแแขแแแแแ แแกแแแ แแแแฎแแแแก แแแแแ แแแ.
แแแแแแแแแแแ แแแแฌแแ แฃแคแ แ แแแขแก แแแแแ แแแ แแแแแแกแแแแก แฐแแจแแก แชแฎแ แแแแแแก แจแแฅแแแแก แจแแกแแฎแแ, แ แแแแแแกแแช แแ แแฅแแ แแ แแแแแแแแ แแแแแแ แแแแก แกแแฆแ แแแกแแแ, แแกแแแ แฌแแจแแแแ แกแแแขแแแแก แฎแแแแฎแแ แแแแแงแแแแแแก แแแแแแ.
แฎแแแก แกแแฆแ แแแก แแแแแแแ
แแแกแแฆแแแแก แแแแแแแแแแแก แกแแฆแ แแแก แแแกแแแแแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแฆแแ แแแกแแฆแแแแก แฐแแจแ (แแแกแ แแแแแแฃแ แ แแแแแฅแกแ แชแฎแ แแแจแ) แแแกแ แ แแแแฃแ แ แชแฎแ แแแแก แแแแแฅแกแแแแ:
// 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-แก.
แแแกแแแแ
แแฃ แแฅแแแ แแแฅแแ แจแแแแแฎแแแแ แแ แแแแแแขแแ แแแ, แแแฎแแแ แแแแฌแแ แแ แแแกแแแแ แแแ
แแก แแแแ แแแแฌแแ แ แจแแกแแแแจแแแแ แกแขแแขแแแแแก แจแแแแแแแแแ:
แแกแแคแแแแจแ แงแแแแแแ แแแ แขแแแ แแแแแแแแแก แแแ แแจแ แฐแแจแแก แชแฎแ แแแ แแแแแแแแแก แแแ แแจแ แแแแแแแก แแแ แแจแ แฐแแจ แแแแแแ
แกแแแแแแแแแ แแแแแแ แซแแแแ แแแแแแแแ แขแแแแก แฐแแจแแก แชแฎแ แแแแก แแแแแ แแแแก แจแแกแแฎแแ แฌแแ แแก แแ แแแแ แจแแกแ แฃแแแแแก แแแแแแแก. แฉแแแ แแแแแแแ แแแแชแแแก แฏแแญแแแแแก, แ แแแแ แฐแฃแแแก แฐแแจแแแแก แแ แแฃแแฃแแแก แฐแแจแแแแก แแขแแแฃแ แ แแแแ แแชแแแแแก แแแแแงแแแแแแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแแจแ, แ แแแแแแแช แแแกแแฎแแ แฎแแแแแแ GPU.
แฌแงแแ แ: www.habr.com