เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบ‡เปˆเบฒเบเบ”เบฒเบเบชเปเบฒเบฅเบฑเบš GPU

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบ‡เปˆเบฒเบเบ”เบฒเบเบชเปเบฒเบฅเบฑเบš GPU
เบ‚เป‰เบญเบเป„เบ”เป‰เป‚เบžเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ Github เป‚เบ„เบ‡เบเบฒเบ™เปƒเบซเบกเปˆ A Simple GPU Hash Table.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ GPU hash เบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบซเบผเบฒเบเบฎเป‰เบญเบเบฅเป‰เบฒเบ™เบ‚เบญเบ‡ inserts เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต. เปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‚เบ™เบ”เบšเบธเบ NVIDIA GTX 1060 เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบฅเบฐเบซเบฑเบ”เปƒเบชเปˆ 64 เบฅเป‰เบฒเบ™เบ„เบนเปˆเบ„เบต-เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปเบšเบšเบชเบธเปˆเบกเปƒเบ™เบ›เบฐเบกเบฒเบ™ 210 ms เปเบฅเบฐเป€เบญเบปเบฒ 32 เบฅเป‰เบฒเบ™เบ„เบนเปˆเปƒเบ™เบ›เบฐเบกเบฒเบ™ 64 ms.

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ„เบงเบฒเบกเป„เบงเปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‚เบ™เบ”เบšเบธเบเปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 300 เบฅเป‰เบฒเบ™ inserts/sec เปเบฅเบฐ 500 เบฅเป‰เบฒเบ™ deletes/sec.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เบ‚เบฝเบ™เปƒเบ™ CUDA, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป€เบ•เบฑเบเบ™เบดเบเบ”เบฝเบงเบเบฑเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš HLSL เบซเบผเบท GLSL. เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบตเบ‚เปเป‰เบˆเบณเบเบฑเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เปƒเบ™เบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญ:

  • เบžเบฝเบ‡เปเบ•เปˆ 32-bit keys เปเบฅเบฐเบ„เปˆเบฒเบ”เบฝเบงเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบกเบงเบ™เบœเบปเบ™.
  • เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ„เบปเบ‡เบ—เบตเปˆ.
  • เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ”เบ™เบตเป‰เบ•เป‰เบญเบ‡เป€เบ—เบปเปˆเบฒเบเบฑเบšเบชเบญเบ‡เบเบฑเบšเบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™.

เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ„เปˆเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฐเบซเบ‡เบงเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเบ‚เบฑเป‰เบ™เบ‡เปˆเบฒเบเบ”เบฒเบ (เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™ 0xffffffff).

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ locks

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปƒเบŠเป‰เบเบฒเบ™เป€เบ›เบตเบ”เบ—เบตเปˆเบขเบนเปˆเบเบฑเบš เบเบฒเบ™โ€‹เบชเบญเบšโ€‹เป€เบชเบฑเบ‡โ€‹เป€เบชเบฑเป‰เบ™โ€‹เบŠเบทเปˆโ€‹, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ array เบ‚เบญเบ‡เบ„เบนเปˆ key-value เบ—เบตเปˆเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš cache เบ”เบตเบเบงเปˆเบฒ. เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰, เป€เบŠเบดเปˆเบ‡เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบŠเบญเบเบซเบฒเบ•เบปเบงเบŠเบตเป‰เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เป€เบ›เบฑเบ™ array เบ‡เปˆเบฒเบเบ”เบฒเบเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบš KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ‚เบญเบ‡เบชเบญเบ‡, เบšเปเปˆเปเบกเปˆเบ™เบ•เบปเบงเป€เบฅเบเบ•เบปเป‰เบ™เบ•เป, เป€เบžเบฒเบฐเบงเปˆเบฒเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเป„เบงเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบเบฒเบ pow2 / AND, เปเบ•เปˆเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ modulus เปเบกเปˆเบ™เบŠเป‰เบฒเบเบงเปˆเบฒเบซเบผเบฒเบ. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบชเบทเบšเบชเบงเบ™เป€เบชเบฑเป‰เบ™, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบชเบฑเป‰เบ™เบŠเบทเปˆเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบตเบชเบฐเบฅเบฑเบญเบ”เบ•เบดเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเบซเปเปˆเบขเบนเปˆเปƒเบ™เปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡. เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปเบกเปˆเบ™เป€เบžเบตเปˆเบก modulo เปƒเบ™เปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เบชเบฝเบš.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบš, เบšเปเปˆเปเบกเปˆเบ™ hash เบ‚เบญเบ‡เบเบฐเปเบˆ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฐเปเบˆ 32-bit, hash เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ. เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปƒเบŠเป‰ Murmur3 hash, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบชเบฒเบก shifts, XORs เปเบฅเบฐเบเบฒเบ™เบ„เบนเบ™.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปƒเบŠเป‰เป€เบ•เบฑเบเบ™เบดเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เบฅเบฑเบญเบเบ—เบตเปˆเบšเปเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบฎเบฑเบเบชเบฒเบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เป€เบ•เบฑเบเบ™เบดเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบตเบเบฑเบšเบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเบ—เบตเปˆเปเบฅเปˆเบ™เบซเบผเบฒเบเบžเบฑเบ™เบเบฐเบ—เบนเป‰เบžเป‰เบญเบกเบเบฑเบ™.

เบ›เบธเปˆเบกเปเบฅเบฐเบ„เปˆเบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เป„เบ”เป‰เบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเป‰เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ.

เบฅเบฐเบซเบฑเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ”เบฑเบ”เปเบ›เบ‡เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ„เบต 64-bit เปเบฅเบฐเบ„เปˆเบฒเป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™. เบเบฐเปเบˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบญเปˆเบฒเบ™, เบ‚เบฝเบ™, เปเบฅเบฐเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบน. เปเบฅเบฐเบ„เปˆเบฒเบ•เปˆเบฒเบ‡เป†เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบ‚เบฝเบ™เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบน. เป‚เบŠเบเบ”เบต, เปƒเบ™ CUDA, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบญเปˆเบฒเบ™ - เบ‚เบฝเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปˆเบฒ 32- เปเบฅเบฐ 64-bit เปเบกเปˆเบ™เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบžเบงเบเบกเบฑเบ™เบชเบญเบ”เบ„เปˆเบญเบ‡เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ” (เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰). เบ—เบตเปˆเบ™เบตเป‰), เปเบฅเบฐเบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเปเบฅเบฐเปเบฅเบเบ›เปˆเบฝเบ™เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบน 64-bit. เปเบ™เปˆเบ™เบญเบ™, เป€เบกเบทเปˆเบญเบเป‰เบฒเบเป„เบ› 64 bits, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบˆเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ.

เบชเบฐเบ–เบฒเบ™เบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Hash

เปเบ•เปˆเบฅเบฐเบ„เบนเปˆเบ„เบต-เบ„เปˆเบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเบฒเบกเบฒเบ”เบกเบตเบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบตเปˆเบฅเบฑเบ”:

  • เบฅเบฐเบซเบฑเบ” เปเบฅเบฐเบ„เปˆเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ™เบตเป‰, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปเบกเปˆเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.
  • เบ„เบตเป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เบฅเบปเบ‡, เปเบ•เปˆเบกเบนเบ™เบ„เปˆเบฒเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบ‚เบฝเบ™. เบ–เป‰เบฒเบเบฐเบ—เบนเป‰เบญเบทเปˆเบ™เบเบณเบฅเบฑเบ‡เบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบขเบนเปˆ, เบกเบฑเบ™เบˆเบฐเบเบฑเบšเบ„เบทเบ™เบกเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบด, เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฐเบ—เบนเป‰เบญเบทเปˆเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบžเป‰เบญเบกเบเบฑเบ™.
  • เบ—เบฑเบ‡เบ„เบตเปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ–เบทเบเบšเบฑเบ™เบ—เบถเบ.
  • เบกเบนเบ™เบ„เปˆเบฒเปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™เบเบฐเบ—เบนเป‰เบญเบทเปˆเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบ•เปˆเบ„เบตเปเบกเปˆเบ™เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป„เบ”เป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก CUDA เบกเบตเบฎเบนเบšเปเบšเบšเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡เบงเปˆเบฒเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบด; เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบเบฐเปเบˆเบเบฑเบ‡เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ„เปˆเบฒเบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™.

เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบตเปˆ เบชเบณ เบ„เบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเป€เบกเบทเปˆเบญเบฅเบฐเบซเบฑเบ”เบ–เบทเบเบ‚เบฝเบ™เปƒเบชเปˆเบชเบฐเบฅเบฑเบญเบ”เบ•เบดเบ‡, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบเป‰เบฒเบเบญเบตเบเบ•เปเปˆเป„เบ› - เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบˆเบฐเบ–เบทเบเบฅเบถเบš, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เบฅเบฐเบซเบฑเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เป€เบ–เบดเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเปเบšเบšเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡เบงเปˆเบฒเบ‡เบ—เบตเปˆเบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ–เบทเบเบญเปˆเบฒเบ™เปเบฅเบฐเบ‚เบฝเบ™เปเบกเปˆเบ™เบšเปเปˆเบฎเบนเป‰. เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบเบฒเบ™เปเบŠเบ, เบŠเบญเบเบซเบฒ, เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 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 เบ‚เบญเบ‡เบเบฐเปเบˆเบ—เบตเปˆเปƒเบชเปˆ. เปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เปƒเบ™ array เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเปเบฅเบฐเบชเบฐเบซเบผเบฑเบšเบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเบ—เบตเปˆเบ›เบฝเบšเบ—เบฝเบšเบเบฐเปเบˆเปƒเบ™เบŠเปˆเบญเบ‡เบ™เบฑเป‰เบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบ–เป‰เบฒเบเบงเบ”เบžเบปเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™, เบเบฐเปเบˆเปƒเบ™เบชเบฐเบฅเบฑเบญเบ”เบ•เบดเบ‡เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เบ”เป‰เบงเบเบเบฐเปเบˆเบ—เบตเปˆเปƒเบชเปˆ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฐเปเบˆเบชเบฐเบฅเบฑเบญเบ”เบ•เบดเบ‡เป€เบ”เบตเบกเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™. เบ–เป‰เบฒเบเบฐเปเบˆเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ™เบตเป‰เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ เบซเบผเบทเบเบปเบ‡เบเบฑเบšเบเบฐเปเบˆเบ—เบตเปˆเปƒเบชเปˆเปเบฅเป‰เบง, เบฅเบฐเบซเบฑเบ”เป„เบ”เป‰เบžเบปเบšเบŠเปˆเบญเบ‡เบชเบฝเบšเบ—เบตเปˆเป€เปเบฒเบฐเบชเบปเบกเบชเบณเบฅเบฑเบšเบเบฒเบ™เปƒเบชเปˆ เปเบฅเบฐเปƒเบชเปˆเบ„เปˆเบฒเบ—เบตเปˆเปƒเบชเปˆเปƒเบชเปˆเปƒเบ™เบŠเปˆเบญเบ‡เปƒเบชเปˆ.

เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™เบซเบ™เบถเปˆเบ‡ kernel เป‚เบ— 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);
        }
}

เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบ„เปˆเบฒเบ‚เบญเบ‡เบเบฐเปเบˆเบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒ iterate เบœเปˆเบฒเบ™ array เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ hash เบ‚เบญเบ‡ key เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบŠเบญเบเบซเบฒ. เปƒเบ™เปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฐเปเบˆเปเบกเปˆเบ™เบญเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบŠเบญเบเบซเบฒ, เปเบฅเบฐเบ–เป‰เบฒเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฐเปเบˆเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เปเบฅเบฐเบ–เป‰เบฒเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒ.

เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบฅเบฐเบซเบฑเบ”เป„เบ”เป‰, เบฅเบฐเบซเบฑเบ”เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ.

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเป‰เบญเบกเบเบฑเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เปเบŠเบเปเบฅเบฐเบเบฒเบ™เบฅเบถเบš. เปเบ•เปˆเบฅเบฐเบ„เบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเบกเบตเบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบตเปˆเบฅเบฑเบ”เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป„เบซเบผ.

เบเบฒเบ™เบฅเบถเบšเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 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

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐเปƒเบชเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบšเปเปˆเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบปเปˆเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เบตเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ CUDA, เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบกเบฑเบเบˆเบฐเป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เป€เบˆเบปเป‰เบฒเบžเบฒเบšเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบขเบนเปˆเปƒเบ™ CUDA kernel.

เบšเบปเบ”เบ‚เบฝเบ™ เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Hash เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบฑเบญเบ เบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เบฅเบฑเบญเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™

เปƒเบ™ snippet เบฅเบฐเบซเบฑเบ”เบŸเบฑเบ‡เบŠเบฑเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡ gpu_hashtable_insert(), _lookup() ะธ _delete() เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เบนเปˆเบ„เบต-เบ„เปˆเบฒเป€เบ—เบทเปˆเบญเบฅเบฐเบญเบฑเบ™. เปเบฅเบฐเบ•เปˆเปเบฒเบเบงเปˆเบฒ gpu_hashtable_insert(), _lookup() ะธ _delete() เบ›เบฐเบกเบงเบ™เบœเบปเบ™ array เบ‚เบญเบ‡เบ„เบนเปˆเบ‚เบฐเบซเบ™เบฒเบ™, เปเบ•เปˆเบฅเบฐเบ„เบนเปˆเปƒเบ™เบเบฐเบ—เบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ” 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 เบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆ lock เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เปเบŠเบ, เบŠเบญเบเบซเบฒ, เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบžเป‰เบญเบกเบเบฑเบ™. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ„เบนเปˆเบ„เบต-เบ„เปˆเบฒเบชเบฐเป€เบซเบกเบตเบขเบนเปˆเปƒเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบตเปˆเบฅเบฑเบ”เปเบฅเบฐเบเบฐเปเบˆเบšเปเปˆเบเป‰เบฒเบเบญเบญเบ, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ›เบฐเป€เบžเบ”เบ•เปˆเบฒเบ‡เป†เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบžเป‰เบญเบกเบเบฑเบ™.

เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบŠเบธเบ”เบเบฒเบ™เปเบŠเบเปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเปเบšเบšเบ‚เบฐเบซเบ™เบฒเบ™, เปเบฅเบฐเบ–เป‰เบฒ input array เบ‚เบญเบ‡เบ„เบนเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰เบงเปˆเบฒเบ„เบนเปˆเปƒเบ”เบˆเบฐ "เบŠเบฐเบ™เบฐ" - เบˆเบฐเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash. เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เปเบŠเบเบ—เบตเปˆเบกเบต array input เบ‚เบญเบ‡เบ„เบนเปˆ A/0 B/1 A/2 C/3 A/4. เป€เบกเบทเปˆเบญเบฅเบฐเบซเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”, เบ„เบนเปˆ B/1 ะธ C/3 เบกเบตเบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบกเบตเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบ„เบนเปˆเปƒเบ”เบˆเบฐเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบกเบฑเบ™ A/0, A/2 เบซเบผเบท A/4. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบซเบผเบทเบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒ - เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบฎเบนเป‰เบฅเปˆเบงเบ‡เปœเป‰เบฒเบงเปˆเบฒเบšเปเปˆเบกเบตเบเบฐเปเบˆเบ—เบตเปˆเบŠเปเป‰เบฒเบเบฑเบ™เบขเบนเปˆเปƒเบ™ array เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบทเป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบชเบปเบ™เปƒเบˆเบงเปˆเบฒเบ„เปˆเบฒเปƒเบ”เบ–เบทเบเบ‚เบฝเบ™เบซเบผเป‰เบฒเบชเบธเบ”.

เบ–เป‰เบฒเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปเบเบเบ„เบนเปˆเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš CUDA เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เปƒเบ™ CUDA, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเป€เบญเบตเป‰เบ™ kernel เบชเบฐเป€เบซเบกเบตเบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบญเบตเป‰เบ™ kernel เบ•เปเปˆเป„เบ› (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡ thread. เปƒเบ™ thread เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, kernels เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™). เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป‚เบ—เบซเบฒเบซเบ™เบถเปˆเบ‡ kernel เบเบฑเบš A/0 B/1 A/2 C/3, เปเบฅเบฐเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบต A/4, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™ A เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบกเบนเบ™เบ„เปˆเบฒ 4.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เบงเบ™ lookup() ะธ delete() เปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰เปเบšเบšเบ—เบณเบกเบฐเบ”เบฒ เบซเบผเบทเบ•เบปเบงเบŠเบตเป‰เบเบฒเบ™เบœเบฑเบ™เบœเบงเบ™เป„เบ›เบซเบฒ array เบ‚เบญเบ‡เบ„เบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash. เป€เบญเบเบฐเบชเบฒเบ™ CUDA เบฅเบฐเบšเบธเบงเปˆเบฒ:

เบœเบนเป‰เบชเบฑเบ‡เบฅเบงเบกเบญเบฒเบ”เบˆเบฐเป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฝเบ™เปƒเบชเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบปเปˆเบงเป‚เบฅเบเบซเบผเบทเปเบšเปˆเบ‡เบ›เบฑเบ™ ... เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™. volatile: ... เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡เปƒเบ”เป†เบเบฑเบšเบ•เบปเบงเปเบ›เบ™เบตเป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ—เบตเปˆเบญเปˆเบฒเบ™เบซเบผเบทเบ‚เบฝเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ.

เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบšเปเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ volatile. เบ–เป‰เบฒเบเบฐเบ—เบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบŠเป‰เบ„เปˆเบฒเบˆเบฒเบเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฒเบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบตเปˆเบญเปˆเบฒเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบˆเบฐเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบฅเป‰เบฒเบชเบฐเป„เบซเบกเป€เบฅเบฑเบเบ™เป‰เบญเบ. เปเบ•เปˆเบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปƒเบ™เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเป€เบกเบฑเบ”. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบซเบผเป‰เบฒเบชเบธเบ”, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ”เบฑเบ”เบชเบฐเบ™เบต 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 เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฐเบ—เบนเป‰ CPU เบ”เบฝเบงเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ key-value เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบ”เบตเปƒเบ™เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบนเบ‡, เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบฅเบถเบšเบซเบผเบฒเบ.

เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเปเบฒเบฅเบฑเบš GPU เปเบฅเบฐเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™ 984 ms. เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบงเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบกเบฑเบ™ (เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™ 1 GB เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบšเบฒเบ‡เป€เบงเบฅเบฒเปƒเบ™ CUDA), เบเบฒเบ™เปƒเบชเปˆเปเบฅเบฐเบฅเบถเบšเบญเบปเบ‡เบ›เบฐเบเบญเบš, เปเบฅเบฐเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบ. เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เป„เบ›โ€‹เปเบฅเบฐโ€‹เบˆเบฒเบโ€‹เบซเบ™เปˆเบงเบโ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹เบšเบฑเบ”โ€‹เบงเบดโ€‹เบ”เบตโ€‹เป‚เบญโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เป€เบญเบปเบฒโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒ 271 ms เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบชเปเบฒเป€เบฅเบฑเบ”. เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบเบฒเบ™เปƒเบชเปˆเปเบฅเบฐเบฅเบถเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญ, เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐ iterating เปƒเบ™เป„เบฅเบเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš. เบ–เป‰เบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ GPU เบกเบตเบŠเบตเบงเบดเบ”เบขเบนเปˆเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เบซเบผเบทเบ–เป‰เบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปเบกเปˆเบ™เบšเบฑเบ™เบˆเบธเบขเบนเปˆเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡เบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเบ—เบฑเบ‡เบซเบกเบปเบ” (เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เป‚เบ”เบเบฅเบฐเบซเบฑเบ” GPU เบญเบทเปˆเบ™เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบเบฒเบ‡), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™. เบœเบปเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เปเบกเปˆเบ™โ€‹เบเปˆเบฝเบงโ€‹เบ‚เป‰เบญเบ‡โ€‹.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เบชเบนเบ‡เปเบฅเบฐเบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡

เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบกเบตเบšเบฑเบ™เบซเบฒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบฅเบฐเบงเบฑเบ‡:

  • Linear probing เบ–เบทเบเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป‚เบ”เบเบเบฒเบ™เป€เบ›เบฑเบ™เบเบธเปˆเบก, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฐเปเบˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™.
  • เบเบฐเปเบˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ–เบญเบ”เบญเบญเบเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ delete เปเบฅเบฐเป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›, เบžเบงเบเป€เบ‚เบปเบฒเบเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ•เบฐ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเบฒเบกเบฒเบ”เบ„เปˆเบญเบเป†เบซเบผเบธเบ”เบฅเบปเบ‡, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบ–เป‰เบฒเบกเบฑเบ™เบกเบตเบขเบนเปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เปเบฅเบฐเบกเบตเบเบฒเบ™เปƒเบชเปˆเปเบฅเบฐเบฅเบปเบšเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ. เบงเบดเบ—เบตเบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบ‚เปเป‰เป€เบชเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™ rehash เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เปˆเปเบฒเบžเปเบชเบปเบกเบ„เบงเบ™เปเบฅเบฐเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบญเบญเบเบ„เบตเบญเบญเบเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™ rehashing.

เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบ, เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบต 128 เบฅเป‰เบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบฅเบฐ loop เบœเปˆเบฒเบ™ 4 เบฅเป‰เบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเบปเบ™เบเปˆเบงเบฒเบ‚เป‰เบญเบเป„เบ”เป‰เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ 124 เบฅเป‰เบฒเบ™เบŠเปˆเบญเบ‡ (เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเบกเบฒเบ™ 0,96). เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš, เปเบ•เปˆเบฅเบฐเปเบ–เบงเปเบกเปˆเบ™ CUDA kernel เป‚เบ—เบซเบฒเป€เบžเบทเปˆเบญเปเบŠเบ 4 เบฅเป‰เบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash:

เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰
เป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เปเบŠเบ 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 เบฅเป‰เบฒเบ™ inserts (เบ›เบฑเบ”เป„เบˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ 0,5). เบ„เบงเบฒเบกเป€เบฅเบดเบเบชเบฐเป€เบฅเปˆเบเปเบกเปˆเบ™ 0,4774, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฐเปเบˆเบชเปˆเบงเบ™เปƒเบซเบเปˆเบขเบนเปˆเปƒเบ™เบŠเปˆเบญเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบซเบผเบทเบซเบ™เบถเปˆเบ‡เบŠเปˆเบญเบ‡เบซเปˆเบฒเบ‡เบˆเบฒเบเบ•เปเบฒเปเบซเบ™เปˆเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”. เบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบชเบฝเบ‡เบชเบนเบ‡เบชเบธเบ”เปเบกเปˆเบ™ 60.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบงเบฑเบ”เปเบ—เบเบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡ probing เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบต 124 เบฅเป‰เบฒเบ™ inserts (เบ›เบฑเบ”เป„เบˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ 0,97). เบ„เบงเบฒเบกเป€เบฅเบดเบเบชเบฐเป€เบฅเปˆเบเปเบกเปˆเบ™เปเบฅเป‰เบง 10,1757, เปเบฅเบฐเบชเบนเบ‡เบชเบธเบ” - 6474 (!!). เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เป€เบชเบฑเป‰เบ™เบŠเบทเปˆเบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเปƒเบ™เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบนเบ‡.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบ™เบตเป‰เบ•เปเปˆเบฒ. เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบ—เบฐเบงเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ. เป‚เบŠเบเบ”เบต, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฐเปเบˆ 32-bit เปเบฅเบฐเบ„เปˆเบฒ, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™. เบ–เป‰เบฒเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบต 128 เบฅเป‰เบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบš, เบžเบงเบเป€เบฎเบปเบฒเบฎเบฑเบเบชเบฒเบ›เบฑเบ”เปƒเบˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ 0,25, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบงเบฒเบ‡เบšเปเปˆเบกเบตเบซเบผเบฒเบเบเปˆเบงเบฒ 32 เบฅเป‰เบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เบ™เบฑเป‰เบ™, เปเบฅเบฐเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญ 96 เบฅเป‰เบฒเบ™เบŠเปˆเบญเบ‡เบˆเบฐเบชเบนเบ™เป€เบชเบ - 8 bytes เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เบนเปˆ. , 768 MB เบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบตเปˆเบชเบนเบ™เป€เบชเบเป„เบ›.

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ‚เบญเบ‡เบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญ, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ„เปˆเบฒเบซเบผเบฒเบเบเปˆเบงเบฒเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฑเบ”เบเบฒเบŸเบดเบ desktop เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ CUDA เบกเบตเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 4 GB (เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™, NVIDIA 2080 Ti เบกเบต 11 GB), เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบชเบฐเบซเบฅเบฒเบ”เบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบชเบนเบ™เป€เบชเบเบˆเปเบฒเบ™เบงเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบ•เปเปˆเบกเบฒเบ‚เป‰เบญเบเบˆเบฐเบ‚เบฝเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเบ—เบตเปˆเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบšเบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡ probing, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ„เบทเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เบŠเปˆเบญเบ‡เบ—เบตเปˆเบ–เบทเบเบฅเบปเบš.

เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบชเบฝเบ‡

เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเป€เบฅเบดเบ probing เบ‚เบญเบ‡เบเบฐเปเบˆ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฐเบเบฑเบ” hash เบ‚เบญเบ‡เบ„เบต (เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ‚เบญเบ‡เบกเบฑเบ™) เบˆเบฒเบเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเบงเบˆเบดเบ‡เบ‚เบญเบ‡เบกเบฑเบ™:

// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ magic เบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเบชเบญเบ‡เบ‚เบญเบ‡เบชเบญเบ‡เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เบ‚เบญเบ‡เบชเบญเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เปเบกเปˆเบ™เบชเบญเบ‡เบเบฑเบšเบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ‚เบญเบ‡เบชเบญเบ‡, เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบเป„เบ›เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เปƒเบซเป‰เป€เบญเบปเบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆ hashed เป€เบ›เบฑเบ™ 1, เปเบ•เปˆเบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบŠเปˆเบญเบ‡เบชเบฝเบš 3. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบˆเบธ 4 เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš. (3 โ€” 1) & 3, เบŠเบถเปˆเบ‡เป€เบ—เบปเปˆเบฒเบเบฑเบš 2 .

เบชเบฐเบซเบฅเบธเบš

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เปเบฒเบ–เบฒเบกเบซเบผเบทเบ„เปเบฒเป€เบซเบฑเบ™, เบเบฐเบฅเบธเบ™เบฒเบชเบปเปˆเบ‡เบญเบตเป€เบกเบงเบซเบฒเบ‚เป‰เบญเบเบ—เบตเปˆ Twitter เบซเบผเบทเป€เบ›เบตเบ”เบซเบปเบงเบ‚เปเป‰เปƒเบซเบกเปˆเปƒเบ™ เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™.

เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบ–เบทเบเบ‚เบฝเบ™เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ”เบปเบ™เปƒเบˆเบˆเบฒเบเบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ”เบตเป€เบฅเบตเบ”:

เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบทเบšเบ•เปเปˆเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ hash เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญเปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เปเบœเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบ›เบฐเบเบญเบšเบกเบตเบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰, Robin Hood hashing, เปเบฅเบฐ cuckoo hashing เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบกเบดเบ”เบเบฑเบš GPU.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™