αžαžΆαžšαžΆαž„ hash αžŸαžΆαž˜αž‰αŸ’αž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ GPU

αžαžΆαžšαžΆαž„ hash αžŸαžΆαž˜αž‰αŸ’αž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ GPU
αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡αžœαžΆαž“αŸ…αž›αžΎ Github αž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž˜αžΈ A Simple GPU Hash Table.

αžœαžΆαž‡αžΆαžαžΆαžšαžΆαž„ GPU hash αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžΆαž”αŸ‹αžšαž™αž›αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαŸ” αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž™αž½αžšαžŠαŸƒ NVIDIA GTX 1060 αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž›αŸαžαž€αžΌαžŠαž”αž‰αŸ’αž…αžΌαž› 64 αž›αžΆαž“αž‚αžΌαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž”αŸ’αžšαž αŸ‚αž› 210 ms αž“αž·αž„αžŠαž€αž…αŸαž‰ 32 αž›αžΆαž“αž‚αžΌαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž”αŸ’αžšαž αŸ‚αž› 64 ms αŸ”

αž“αŸ„αŸ‡αž‚αžΊαž›αŸ’αž”αžΏαž“αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž™αž½αžšαžŠαŸƒαž‚αžΊαž”αŸ’αžšαž αŸ‚αž› 300 αž›αžΆαž“αž”αž‰αŸ’αž…αžΌαž› / αžœαž·αž“αžΆαž‘αžΈ αž“αž·αž„ 500 αž›αžΆαž“αž›αž»αž” / αžœαž·αž“αžΆαž‘αžΈαŸ”

αžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„ CUDA αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡ HLSL ឬ GLSL αž€αŸαžŠαŸ„αž™αŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αžΆαž“αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αž–αžŸαŸ‹αž“αŸ…αž›αžΎαž€αžΆαžαžœαžΈαžŠαŸαž’αžΌαŸ–

  • αž˜αžΆαž“αžαŸ‚αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž… 32 αž”αŸŠαžΈαž αž“αž·αž„αžαž˜αŸ’αž›αŸƒαžŠαžΌαž…αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”
  • αžαžΆαžšαžΆαž„ hash αž˜αžΆαž“αž‘αŸ†αž αŸ†αžαŸαžšαŸ”
  • αž αžΎαž™αž‘αŸ†αž αŸ†αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αžŸαŸ’αž˜αžΎαž“αžΉαž„αž–αžΈαžšαž‘αŸ…αžαžΆαž˜αž–αž›αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΌαž“αžŸαŸ„ αž“αž·αž„αžαž˜αŸ’αž›αŸƒ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αž€αŸ‹αžŸαž‰αŸ’αž‰αžΆαž€αŸ†αžŽαžαŸ‹αž–αŸ’αžšαŸ†αžŠαŸ‚αž“αžŸαžΆαž˜αž‰αŸ’αž‰ (αž€αŸ’αž“αž»αž„αž€αžΌαžŠαžαžΆαž„αž›αžΎαž“αŸαŸ‡αž‚αžΊ 0xffffffff)αŸ”

αžαžΆαžšαžΆαž„ Hash αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžŸαŸ„

αžαžΆαžšαžΆαž„ 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 αž‚αžΊαž‡αžΆαž’αžΆαžαžΌαž˜ αžŠαžšαžΆαž”αžŽαžΆαž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž˜αŸ’αžšαžΉαž˜αžαžΆαž˜αž’αž˜αŸ’αž˜αž‡αžΆαžαž· (αžŸαžΌαž˜αž˜αžΎαž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜)αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡) αž“αž·αž„αž€αžΆαžαžœαžΈαžŠαŸαž’αžΌαž‘αŸ†αž“αžΎαž”αž‚αžΆαŸ†αž‘αŸ’αžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž” αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžαžΌαž˜αž·αž… 64 αž”αŸŠαžΈαžαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž“αŸ…αž–αŸαž›αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ… 64 αž”αŸŠαžΈαž αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αžΉαž„αžαž™αž…αž»αŸ‡αž”αž“αŸ’αžαž·αž…αŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžαžΆαžšαžΆαž„ 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 αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘ αžαžΆαžšαžΆαž„ Hash Free Wait-Free αž…αžΆαž€αŸ‹αžŸαŸ„ αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž€αŸ‚αž”αŸ’αžšαŸ‚αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž€αžΆαžšαž–αžΆαžšαžŠαŸ„αž™αž…αžΆαž€αŸ‹αžŸαŸ„αž”αŸ‚αž”αž“αŸαŸ‡αŸ”

αž—αžΆαž–αž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž€αžΌαžŠαž˜αž»αžαž„αžΆαžšαžαžΆαž„αž›αžΎ 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() αž”αŸ’αžšαžΎαž‘αŸ’αžšαž“αž·αž…αž’αž˜αŸ’αž˜αžαžΆ αž¬αž„αžΆαž™αž“αžΉαž„αž”αž„αŸ’αž€αž‡αžΆαž αŸαžαž»αž‘αŸ…αž’αžΆαžšαŸαž“αŸƒαž‚αžΌαž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αžŸαž‰αŸ’αž‰αžΆαŸ” αž―αž€αžŸαžΆαžš CUDA αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαžΆαŸ–

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„αž’αžΆαž…αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΆαžšαž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαžαž·αžŸαž€αž› αž¬αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€... αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡ volatile: ... αžŸαŸαž…αž€αŸ’αžαžΈαž™αŸ„αž„αžŽαžΆαž˜αž½αž™αž…αŸ†αž–αŸ„αŸ‡αž’αžαŸαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆαž˜αŸαžšαŸ€αž“αž’αžΆαž“ αž¬αžŸαžšαžŸαŸαžšαžŸαžαž·αž–αž·αžαŸ”

αž€αžΆαžšαž–αž·αž…αžΆαžšαžŽαžΆαž›αžΎαž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‘αŸαŸ” volatile. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αŸ’αžšαžΎαžαž˜αŸ’αž›αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αžΆαž“αž–αžΈαž˜αž»αž“ αž“αŸ„αŸ‡αžœαžΆαž“αžΉαž„αž”αŸ’αžšαžΎαž–αŸαžαŸŒαž˜αžΆαž“αž αž½αžŸαžŸαž˜αŸαž™αž”αž“αŸ’αžαž·αž…αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ‚ αž“αŸαŸ‡αž‡αžΆαž–αŸαžαŸŒαž˜αžΆαž“αž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαžαžΆαžšαžΆαž„ hash αž“αŸ…αž‚αŸ’αžšαžΆαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αžΆαžšαž αŸ… kernel αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαžΎαž–αŸαžαŸŒαž˜αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž›αž·αž”αž·αž€αŸ’αžšαž˜ volatileαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αžΉαž„αžαž™αž…αž»αŸ‡αž”αž“αŸ’αžαž·αž…αŸ– αž™αŸ„αž„αžαžΆαž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αŸ…αž–αŸαž›αž›αž»αž”αž’αžΆαžαž» 32 αž›αžΆαž“ αž›αŸ’αž”αžΏαž“αž”αžΆαž“αžαž™αž…αž»αŸ‡αž–αžΈ 500 αž›αžΆαž“αž›αž»αž”/αžœαž·αž“αžΆαž‘αžΈ αž‘αŸ… 450 αž›αžΆαž“αž›αž»αž”/αžœαž·αž“αžΆαž‘αžΈαŸ”

αž•αž›αž·αžαž—αžΆαž–

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž’αžΆαžαž» 64 αž›αžΆαž“αž“αž·αž„αž€αžΆαžšαž›αž»αž” 32 αž›αžΆαž“αž“αŸƒαž–αž½αž€αž‚αŸαž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αžšαžœαžΆαž„ std::unordered_map αž αžΎαž™αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž·αž“αž˜αžΆαž“αžαžΆαžšαžΆαž„ hash αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ GPUαŸ–

αžαžΆαžšαžΆαž„ 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αžŠαŸ‚αž›αžŸαŸ’αž˜αžΎαž“αžΉαž„ ្.

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αžŸαŸ†αžŽαž½αžšαž¬αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αžŸαžΌαž˜αž•αŸ’αž‰αžΎαž’αŸŠαžΈαž˜αŸ‚αž›αž˜αž€αžαŸ’αž‰αž»αŸ† Twitter αž¬αž”αžΎαž€αž”αŸ’αžšαž’αžΆαž“αž”αž‘αžαŸ’αž˜αžΈαŸ” αžƒαŸ’αž›αžΆαŸ†αž„.

αž€αžΌαžŠαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž”αŸ†αž•αž»αžŸαž‚αŸ†αž“αž·αžαž–αžΈαž’αžαŸ’αžαž”αž‘αž›αŸ’αž’αŸ—αŸ–

αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αž αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž“αŸ’αžαžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžαžΆαžšαžΆαž„ hash αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžαžœαžΈαžŠαŸαž’αžΌ αž“αž·αž„αžœαž·αž—αžΆαž‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž•αŸ‚αž“αž€αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžšαž½αž˜αž˜αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ Robin Hood hashing αž“αž·αž„ cuckoo hashing αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžΆαžαžΌαž˜αž·αž…αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ’αžšαžΎ GPU αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹