ืคึผืฉื•ื˜ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ื’ืคึผื•

ืคึผืฉื•ื˜ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ื’ืคึผื•
ืื™ืš ืึทืจื™ื™ึทื ื’ืขืฉื™ืงื˜ ืขืก ืื•ื™ืฃ Github ื ื™ื™ึท ืคึผืจื•ื™ืขืงื˜ ื ืคึผืฉื•ื˜ ื’ืคึผื• ื”ืึทืฉ ื˜ื™ืฉ.

ืขืก ืื™ื– ืึท ืคึผืฉื•ื˜ ื’ืคึผื• ื”ืึทืฉ ื˜ื™ืฉ ื•ื•ืึธืก ืื™ื– ื‘ื™ื›ื•ืœืช ืฆื• ืคึผืจืึทืกืขืกื™ื ื’ ื”ื•ื ื“ืขืจื˜ืขืจ ืคื•ืŸ ืžื™ืœื™ืึทื ื– ืคื•ืŸ ื™ื ืกืขืจืฅ ืคึผืขืจ ืกืขืงื•ื ื“ืข. ืื•ื™ืฃ ืžื™ื™ืŸ NVIDIA GTX 1060 ืœืึทืคึผื˜ืึทืคึผ, ื“ื™ ืงืึธื“ ื™ื ืกืขืจืฅ 64 ืžื™ืœื™ืึธืŸ ืจืึทื ื“ืึทืžืœื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืฉืœื™ืกืœ-ื•ื•ืขืจื˜ ืคึผืขืจื– ืื™ืŸ ื•ื•ืขื’ืŸ 210 ืžื™ื– ืื•ืŸ ืจื™ืžื•ื•ื•ื– 32 ืžื™ืœื™ืึธืŸ ืคึผืขืจื– ืื™ืŸ ื•ื•ืขื’ืŸ 64 ืžื™ื–.

ืึทื– ืื™ื–, ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืื•ื™ืฃ ืึท ืœืึทืคึผื˜ืึทืคึผ ืื™ื– ื‘ืขืขืจืขืš 300 ืžื™ืœื™ืึธืŸ ื™ื ืกืขืจืฅ / ืกืขืง ืื•ืŸ 500 ืžื™ืœื™ืึธืŸ ื“ื™ืœื™ืฅ / ืกืขืง.

ื“ืขืจ ื˜ื™ืฉ ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ CUDA, ื›ืึธื˜ืฉ ื“ื™ ื–ืขืœื‘ืข ื˜ืขื›ื ื™ืง ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ืขื ื“ื˜ ืฆื• HLSL ืึธื“ืขืจ GLSL. ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ื”ืื˜ ืขื˜ืœืขื›ืข ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื– ืฆื• ืขื ืฉื•ืจ ื”ื•ื™ืš ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ื™ืฃ ืึท ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ:

  • ื‘ืœื•ื™ื– 32-ื‘ื™ืกืœ ืฉืœื™ืกืœืขืŸ ืื•ืŸ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืึทืœื•ืขืก ื–ืขื ืขืŸ ืคึผืจืึทืกืขืกื˜.
  • ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื”ืื˜ ืึท ืคืึทืจืคืขืกื˜ื™ืงื˜ ื’ืจื™ื™ืก.
  • ืื•ืŸ ื“ืขื ื’ืจื™ื™ืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ื’ืœื™ื™ึทืš ืฆื• ืฆื•ื•ื™ื™ ืฆื• ื“ื™ ืžืึทื›ื˜.

ืคึฟืึทืจ ืฉืœื™ืกืœืขืŸ ืื•ืŸ ื•ื•ืึทืœื•ืขืก, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจืขื–ืขืจื•ื•ื™ืจืŸ ืึท ืคึผืฉื•ื˜ ื“ืขืœื™ืžื™ื˜ืขืจ ืžืึทืจืงืขืจ (ืื™ืŸ ื“ื™ ืื•ื™ื‘ืŸ ืงืึธื“, ื“ืึธืก ืื™ื– 0xffffffff).

ื”ืึทืฉ ื˜ื™ืฉ ืึธืŸ ืœืึทืงืก

ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื ื™ืฆื˜ ืขืคืขื ืขืŸ ืึทื“ืจืขืกื™ื ื’ ืžื™ื˜ ืœื™ื ืขืึทืจ ืคึผืจืึธื•ื‘ื™ื ื’, ื“ืึธืก ืื™ื–, ืขืก ืื™ื– ืคืฉื•ื˜ ืึท ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ืฉืœื™ืกืœ-ื•ื•ืขืจื˜ ืคึผืขืจื– ื•ื•ืึธืก ืื™ื– ืกื˜ืึธืจื“ ืื™ืŸ ื–ื›ึผืจื•ืŸ ืื•ืŸ ื”ืื˜ ื”ืขื›ืขืจ ืงืึทืฉ ืคืึธืจืฉื˜ืขืœื•ื ื’. ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ ื’ืขื–ืึธื’ื˜ ืคึฟืึทืจ ื˜ืฉืึทื™ื ื™ื ื’, ื•ื•ืึธืก ื™ื ื•ื•ืึทืœื•ื•ื– ื–ื•ื›ืŸ ืคึฟืึทืจ ืึท ื˜ื™ื™ึทื˜ืœ ืื™ืŸ ืึท ืœื™ื ื’ืงื˜ ืจืฉื™ืžื”. ื ื”ืึทืฉ ื˜ื™ืฉ ืื™ื– ืึท ืคึผืฉื•ื˜ ืžืขื ื’ืข ืกื˜ืึธืจื™ื ื’ ืขืœืขืžืขื ื˜ืŸ KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ื˜ื™ืฉ ืื™ื– ืึท ืžืึทื›ื˜ ืคื•ืŸ ืฆื•ื•ื™ื™, ื ื™ืฉื˜ ืึท ื”ื•ื™ืคึผื˜ ื ื•ืžืขืจ, ื•ื•ื™ื™ึทืœ ืื™ื™ืŸ ืฉื ืขืœ ื™ื ืกื˜ืจื•ืงื˜ื™ืึธืŸ ืื™ื– ื’ืขื ื•ื’ ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ื™ ืคึผืึธื•ื•2 / AND ืžืึทืกืงืข, ืึธื‘ืขืจ ื“ื™ ืžืึธื“ื•ืœื•ืก ืึธืคึผืขืจืึทื˜ืึธืจ ืื™ื– ืคื™ืœ ืกืœืึธื•ืขืจ. ื“ืึธืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ืœื™ื ืขืึทืจ ืคึผืจืึธื•ื‘ื™ื ื’, ื•ื•ื™ื™ึทืœ ืื™ืŸ ืึท ืœื™ื ืขืึทืจ ื˜ื™ืฉ ืœื•ืงืึทืคึผ ื“ื™ ืฉืคึผืขืœื˜ืœ ืื™ื ื“ืขืงืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ืืœื ื’ืขื•ื•ื™ืงืœื˜ ืื™ืŸ ื™ืขื“ืขืจ ืฉืคึผืขืœื˜ืœ. ืื•ืŸ ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื“ื™ ืคึผืจื™ื™ึทื– ืคื•ืŸ ื“ื™ ืึธืคึผืขืจืึทืฆื™ืข ืื™ื– ืžื•ืกื™ืฃ ืžืึธื“ื•ืœืึธ ืื™ืŸ ื™ืขื“ืขืจ ืฉืคึผืขืœื˜ืœ.

ื“ืขืจ ื˜ื™ืฉ ื‘ืœื•ื™ื– ืกื˜ืึธืจื– ื“ื™ ืฉืœื™ืกืœ ืื•ืŸ ื•ื•ืขืจื˜ ืคึฟืึทืจ ื™ืขื“ืขืจ ืขืœืขืžืขื ื˜, ื ื™ืฉื˜ ืึท ื”ืึทืฉ ืคื•ืŸ ื“ื™ ืฉืœื™ืกืœ. ื–ื™ื ื˜ ื“ื™ ื˜ื™ืฉ ื‘ืœื•ื™ื– ืกื˜ืึธืจื– 32-ื‘ื™ืกืœ ืฉืœื™ืกืœืขืŸ, ื“ื™ ื”ืึทืฉ ืื™ื– ืงืึทืœืงื™ืึทืœื™ื™ื˜ื™ื“ ื–ื™ื™ืขืจ ื’ืขืฉื•ื•ื™ื ื“. ื“ืขืจ ืงืึธื“ ืื•ื™ื‘ืŸ ื ื™ืฆื˜ ื“ื™ Murmur3 ื”ืึทืฉ, ื•ื•ืึธืก ื‘ืœื•ื™ื– ืคึผืขืจืคืึธืจืžื– ืึท ื‘ื™ืกืœ ืฉื™ืคืฅ, XORs ืื•ืŸ ืงื™ื™ืคืœ.

ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื ื™ืฆื˜ ืœืึทืงื™ื ื’ ืฉื•ืฅ ื˜ืขืงื ื™ืงืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืคืจื™ื™ึท ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืกื“ืจ. ืืคื™ืœื• ืื•ื™ื‘ ืขื˜ืœืขื›ืข ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืฆืขืฉื˜ืขืจืŸ ื“ื™ ืกื“ืจ ืคื•ืŸ ืื ื“ืขืจืข ืึทื–ืึท ืึทืคึผืขืจื™ื™ืฉืึทื ื–, ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื•ื•ืขื˜ ื ืึธืš ื”ืึทืœื˜ืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ืฉื˜ืึทื˜. ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ืขื ืื•ื ื˜ืŸ. ื“ื™ ื˜ืขื›ื ื™ืง ืึทืจื‘ืขื˜ ื’ืจื•ื™ืก ืžื™ื˜ ื•ื•ื™ื“ืขื ืงืึทืจื“ืก ื•ื•ืึธืก ืœื•ื™ืคืŸ ื˜ื•ื™ื–ื ื˜ืขืจ ืคื•ืŸ ืคึฟืขื“ืขื ืงืึทื ืงืขืจืึทื ื˜ืœื™.

ื“ื™ ืฉืœื™ืกืœืขืŸ ืื•ืŸ ื•ื•ืึทืœื•ืขืก ืื™ืŸ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื–ืขื ืขืŸ ื™ื ื™ื˜ื™ืึทืœื™ื™ื–ื“ ืฆื• ืœื™ื™ื“ื™ืง.

ื“ืขืจ ืงืึธื“ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืžืึทื“ืึทืคื™ื™ื“ ืฆื• ืฉืขืคึผืŸ 64-ื‘ื™ืกืœ ืฉืœื™ืกืœืขืŸ ืื•ืŸ ื•ื•ืึทืœื•ืขืก. ืงื™ื– ื“ืึทืจืคืŸ ืึทื˜ืึธืžื™ืฉืข ืœื™ื™ืขื ืขืŸ, ืฉืจื™ื™ึทื‘ืŸ ืื•ืŸ ืคืึทืจื’ืœื™ื™ึทื›ืŸ-ืื•ืŸ-ื•ื™ืกื‘ื™ื™ึทื˜ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ืื•ืŸ ื•ื•ืึทืœื•ืขืก ื“ืึทืจืคืŸ ืึทื˜ืึธืžื™ืฉืข ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ืฆื•ืž ื’ืœื™ืง, ืื™ืŸ CUDA, ืœื™ื™ืขื ืขืŸ-ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืคึฟืึทืจ 32- ืื•ืŸ 64-ื‘ื™ืกืœ ื•ื•ืึทืœื•ืขืก ื–ืขื ืขืŸ ืึทื˜ืึธืžื™ืฉืข ื•ื•ื™ ืœืึทื ื’ ื•ื•ื™ ื–ื™ื™ ื–ืขื ืขืŸ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ืึทืœื™ื™ื ื“ (ื–ืขืŸ ื•ื•ื™ื™ื˜ืขืจ). ื“ืึธ), ืื•ืŸ ืžืึธื“ืขืจืŸ ื•ื•ื™ื“ืขื ืงืึทืจื“ืก ืฉื˜ื™ืฆืŸ 64-ื‘ื™ืกืœ ืึทื˜ืึธืžื™ืฉืข ืคืึทืจื’ืœื™ื™ึทื›ืŸ-ืื•ืŸ-ื•ื•ืขืงืกืœ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ืคื•ืŸ ืงื•ืจืก, ื•ื•ืขืŸ ืžืึธื•ื•ื™ื ื’ ืฆื• 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() ืคึผืจืึธืฆืขืก ืึท ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ืคึผืขืจื– ืื™ืŸ ืคึผืึทืจืึทืœืขืœ, ื™ืขื“ืขืจ ืคึผืึธืจ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื’ืคึผื• ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคืึธื“ืขื:

// 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() ื ื™ืฆืŸ ืึท ืงืœืึธืจ ืึธื“ืขืจ ื•ื•ืึทืœืึทื˜ืึทืœ ื˜ื™ื™ึทื˜ืœ ืฆื• ืึท ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ืคึผืขืจื– ืื™ืŸ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ. CUDA ื“ืึธืงื•ืžืขื ื˜ืึทื˜ื™ืึธืŸ ืฉื˜ืึทื˜ืŸ ืึทื–:

ื“ืขืจ ืงืึทืžืคึผื™ื™ืœืขืจ ืงืขืŸ ืงืœื™ื™ึทื‘ืŸ ืฆื• ืึทืคึผื˜ืึทืžื™ื™ื– ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ื‘ื˜ ืฆื• ื’ืœืื‘ืืœืข ืึธื“ืขืจ ืฉืขืจื“ ื–ื›ึผืจื•ืŸ ... ื“ื™ ืึธืคึผื˜ื™ืžื™ื–ืึทื˜ื™ืึธื ืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคืึทืจืงืจื™ืคึผืœื˜ ื ื™ืฆืŸ ื“ื™ ืงื™ื•ื•ืขืจื“ volatile: ... ืงื™ื™ืŸ ืจืขืคึฟืขืจืขื ืฅ ืฆื• ื“ืขื ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื™ื– ืงืึธืžืคึผื™ืœืขื“ ืื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ ื–ื›ึผืจื•ืŸ ืœื™ื™ืขื ืขืŸ ืึธื“ืขืจ ืฉืจื™ื™ึทื‘ืŸ ืœื™ืžืขื“.

ืงืขืจืขืงื˜ื ืึทืก ืงืึทื ืกื™ื“ืขืจื™ื™ืฉืึทื ื– ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ volatile. ืื•ื™ื‘ ื“ืขืจ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคืึธื“ืขื ื ื™ืฆื˜ ืึท ืงืึทืฉื˜ ื•ื•ืขืจื˜ ืคื•ืŸ ืึท ืคืจื™ืขืจ ืœื™ื™ืขื ืขืŸ ืึธืคึผืขืจืึทืฆื™ืข, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื™ืฆืŸ ืึท ื‘ื™ืกืœ ืึทื•ื˜ื“ื™ื™ื˜ื™ื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข. ืึธื‘ืขืจ ื ืึธืš, ื“ืึธืก ืื™ื– ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืจื™ื›ื˜ื™ืง ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืื™ืŸ ืึท ื–ื™ื›ืขืจ ืžืึธืžืขื ื˜ ืคื•ืŸ ื“ื™ ืงืขืจืŸ ืจื•ืคืŸ. ืื•ื™ื‘ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื ื•ืฆืŸ ื“ื™ ืœืขืฆื˜ืข ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ืขื ืื™ื ื“ืขืงืก volatile, ืึธื‘ืขืจ ื“ืขืžืึธืœื˜ ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื•ื•ืขื˜ ืคืึทืจืžื™ื ืขืจืŸ ืึท ื‘ื™ืกืœ: ืœื•ื™ื˜ ืžื™ื™ืŸ ื˜ืขืกืฅ, ื•ื•ืขืŸ ื“ื™ ื•ื™ืกืžืขืงืŸ 32 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ, ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ื“ื™ืงืจื™ืกื˜ ืคื•ืŸ 500 ืžื™ืœื™ืึธืŸ ื“ื™ืœื™ืฉืึทื ื– / ืกืขืง ืฆื• 450 ืžื™ืœื™ืึธืŸ ื“ื™ืœื™ืฉืึทื ื– / ืกืขืง.

ืคืึธืจืฉื˜ืขืœื•ื ื’

ืื™ืŸ ื“ื™ ืคึผืจืึธื‘ืข ืคึฟืึทืจ ื™ื ืกืขืจื˜ื™ื ื’ 64 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ ืื•ืŸ ื•ื™ืกืžืขืงืŸ 32 ืžื™ืœื™ืึธืŸ ืคื•ืŸ ื–ื™ื™, ืคืึทืจืžืขืกื˜ ืฆื•ื•ื™ืฉืŸ std::unordered_map ืื•ืŸ ืขืก ืื™ื– ื›ืžืขื˜ ืงื™ื™ืŸ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ื“ื™ ื’ืคึผื•:

ืคึผืฉื•ื˜ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ื’ืคึผื•
std::unordered_map ืคืืจื‘ืจืื›ื˜ 70 ืžื™ื– ื™ื ืกืขืจื˜ื™ื ื’ ืื•ืŸ ืจื™ืžื•ื•ื•ื™ื ื’ ืขืœืขืžืขื ื˜ืŸ ืื•ืŸ ื“ืึทืŸ ืคืจื™ื™ ื–ื™ื™ unordered_map (ื‘ืึทืงื•ืžืขืŸ ื‘ืึทืคืจื™ื™ึทืขืŸ ืคื•ืŸ ืžื™ืœื™ืึทื ื– ืคื•ืŸ ืขืœืขืžืขื ื˜ืŸ ื ืขืžื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜, ื•ื•ื™ื™ึทืœ ื™ืŸ unordered_map ืงื™ื™ืคืœ ื–ื›ึผืจื•ืŸ ืึทืœืึทืงื™ื™ืฉืึทื ื– ื–ืขื ืขืŸ ื’ืขืžืื›ื˜). ืขืจืœืขืš ื’ืขืจืขื“ื˜, std:unordered_map ื’ืึธืจ ืคืึทืจืฉื™ื“ืขื ืข ืจื™ืกื˜ืจื™ืงืฉืึทื ื–. ืขืก ืื™ื– ืึท ืื™ื™ืŸ ืงืคึผื• ืคืึธื“ืขื ืคื•ืŸ ื“ื•ืจื›ืคื™ืจื•ื ื’, ืฉื˜ื™ืฆื˜ ืฉืœื™ืกืœ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ืงื™ื™ืŸ ื’ืจื™ื™ืก, ืคึผืขืจืคืึธืจืžื– ื’ืขื–ื•ื ื˜ ืื™ืŸ ื”ื•ื™ืš ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืจืึทื˜ืขืก ืื•ืŸ ื•ื•ื™ื™ึทื–ืŸ ืกื˜ืึทื‘ื™ืœ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื ืึธืš ืงื™ื™ืคืœ ื“ื™ืœื™ืฉืึทื ื–.

ื“ืขืจ ื’ืขื“ื•ื™ืขืจ ืคื•ืŸ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ื“ื™ ื’ืคึผื• ืื•ืŸ ื™ื ื˜ืขืจ-ืคึผืจืึธื’ืจืึทื ืงืึธืžื•ื ื™ืงืึทืฆื™ืข ืื™ื– ื’ืขื•ื•ืขืŸ 984 ืžื™ื–. ื“ืึธืก ื›ื•ืœืœ ื“ื™ ืฆื™ื™ื˜ ื•ื•ืึธืก ืื™ื– ืคืืจื‘ืจืื›ื˜ ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื˜ื™ืฉ ืื™ืŸ ื–ื›ึผืจื•ืŸ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ืขืก (ืึทืœืึธืงืึทื˜ื™ื ื’ 1 ื’ื™ื’ืื‘ื™ื™ื˜ ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืื™ื™ืŸ ืžืึธืœ, ื•ื•ืึธืก ื ืขืžื˜ ืขื˜ืœืขื›ืข ืžืึธืœ ืื™ืŸ CUDA), ื™ื ืกืขืจื˜ื™ื ื’ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ืขืœืขืžืขื ื˜ืŸ ืื•ืŸ ื™ื˜ืขืจื™ื™ื˜ื™ื ื’ ืื™ื‘ืขืจ ื–ื™ื™. ืึทืœืข ืงืืคื™ืขืก ืฆื• ืื•ืŸ ืคื•ืŸ ื“ื™ ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ ื–ื›ึผืจื•ืŸ ื–ืขื ืขืŸ ืื•ื™ืš ื’ืขื ื•ืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ.

ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ื–ื™ืš ื’ืขื ื•ืžืขืŸ 271 ืžื™ื– ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ. ื“ืึธืก ื›ื•ืœืœ ื“ื™ ืฆื™ื™ื˜ ืคืืจื‘ืจืื›ื˜ ื“ื•ืจืš ื“ื™ ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ ื™ื ืกืขืจื˜ื™ื ื’ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ืขืœืขืžืขื ื˜ืŸ, ืื•ืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ื“ื™ ืฆื™ื™ื˜ ืคืืจื‘ืจืื›ื˜ ืงืึทืคึผื™ื™ื ื’ ืื™ืŸ ื–ื›ึผืจื•ืŸ ืื•ืŸ ื™ื˜ืขืจื™ื™ื˜ื™ื ื’ ืื™ื‘ืขืจ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื˜ื™ืฉ. ืื•ื™ื‘ ื“ื™ ื’ืคึผื• ื˜ื™ืฉ ืœืขื‘ื˜ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜, ืึธื“ืขืจ ืื•ื™ื‘ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืื™ื– ืงืึทื ื˜ื™ื™ื ื“ ืื™ืŸ ื“ื™ ื–ื™ืงืึธืจืŸ ืคื•ืŸ ื“ื™ ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ (ืœืžืฉืœ, ืฆื• ืฉืึทืคึฟืŸ ืึท ื”ืึทืฉ ื˜ื™ืฉ ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื•ืจืš ืื ื“ืขืจืข ื’ืคึผื• ืงืึธื“ ืื•ืŸ ื ื™ืฉื˜ ื“ื™ ื”ื•ื™ืคื˜ ืคึผืจืึทืกืขืกืขืจ), ื“ืขืžืึธืœื˜ ื“ื™ ืคึผืจืึธื‘ืข ืจืขื–ื•ืœื˜ืึทื˜ ืื™ื– ื‘ืึทื˜ื™ื™ึทื˜ื™ืง.

ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืคึฟืึทืจ ืึท ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ ื“ืขืžืึทื ืกื˜ืจื™ื™ืฅ ื”ื•ื™ืš ืคืึธืจืฉื˜ืขืœื•ื ื’ ืจืขื›ื˜ ืฆื• ื”ื•ื™ืš ื˜ืจื•ืคึผื•ื˜ ืื•ืŸ ืึทืงื˜ื™ื•ื• ืคึผืึทืจืึทืœืขืœื™ื–ืึทื˜ื™ืึธืŸ.

ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื–

ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ื”ืื˜ ืึท ื‘ื™ืกืœ ื™ืฉื•ื– ืฆื• ื–ื™ื™ืŸ ืึทื•ื•ืขืจ ืคื•ืŸ:

  • ืœื™ื ืขืึทืจ ืคึผืจืึธื•ื‘ื™ื ื’ ืื™ื– ื›ืึทืžืคึผืขืจื“ ื“ื•ืจืš ืงืœืึทืกื˜ืขืจื™ื ื’, ื•ื•ืึธืก ื– ื“ื™ ืฉืœื™ืกืœืขืŸ ืื™ืŸ ื“ื™ ื˜ื™ืฉ ืฆื• ื–ื™ื™ืŸ ื’ืขืฉื˜ืขืœื˜ ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ื‘ื™ืฉืœื™ื™ืžืขืก.
  • ืงื™ื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ ื ื™ืฆืŸ ื“ื™ ืคึฟื•ื ืงืฆื™ืข delete ืื•ืŸ ืžื™ื˜ ื“ืขืจ ืฆืฒึทื˜ ืฆืขืฉืคึผืจื™ื™ื˜ืŸ ื–ื™ื™ ื“ืขื ื˜ื™ืฉ.

ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ืึท ื”ืึทืฉ ื˜ื™ืฉ ืงืขื ืขืŸ ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื– ื“ื™ื’ืจื™ื™ื“, ืกืคึผืขืฆื™ืขืœ ืื•ื™ื‘ ืขืก ื™ื’ื–ื™ืกืฅ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜ ืื•ืŸ ื”ืื˜ ืคื™ืœืข ื™ื ืกืขืจืฅ ืื•ืŸ ื“ื™ืœื™ืฅ. ืื™ื™ืŸ ื•ื•ืขื’ ืฆื• ืคืึทืจืžื™ื ืขืจืŸ ื“ื™ ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื– ืื™ื– ืฆื• ืจื™ื›ืึทืคึผืŸ ืื™ืŸ ืึท ื ื™ื™ึทืข ื˜ื™ืฉ ืžื™ื˜ ืึท ื’ืึทื ืฅ ื ื™ื“ืขืจื™ืง ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืงื•ืจืก ืื•ืŸ ืคื™ืœื˜ืขืจ ืื•ื™ืก ื“ื™ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ ืฉืœื™ืกืœืขืŸ ื‘ืขืฉืึทืก ื“ื™ ืจื™ื”ืึทืฉื™ื ื’.

ืฆื• ืื™ืœื•ืกื˜ืจื™ืจืŸ ื“ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ื™ืฉื•ื–, ืื™ืš ื•ื•ืขื˜ ื ื•ืฆืŸ ื“ื™ ืื•ื™ื‘ืŸ ืงืึธื“ ืฆื• ืฉืึทืคึฟืŸ ืึท ื˜ื™ืฉ ืžื™ื˜ 128 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ ืื•ืŸ ืฉืœื™ื™ืฃ ื“ื•ืจืš 4 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ ื‘ื™ื– ืื™ืš ื”ืึธื‘ืŸ ืึธื ื’ืขืคื™ืœื˜ 124 ืžื™ืœื™ืึธืŸ ืกืœืึธืฅ (ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืงื•ืจืก ืคื•ืŸ ื•ื•ืขื’ืŸ 0,96). ื“ืึธ ืื™ื– ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื˜ื™ืฉ, ื™ืขื“ืขืจ ืจื•ื“ืขืจืŸ ืื™ื– ืึท CUDA ืงืขืจืŸ ืจื•ืคืŸ ืฆื• ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ 4 ืžื™ืœื™ืึธืŸ ื ื™ื™ึท ืขืœืขืžืขื ื˜ืŸ ืื™ืŸ ืื™ื™ืŸ ื”ืึทืฉ ื˜ื™ืฉ:

ื‘ืึทื ื™ืฅ ืงื•ืจืก
ื™ื ืกืขืจืฉืึทืŸ ื’ืขื“ื•ื™ืขืจ 4 ืขืœืขืžืขื ื˜ืŸ

0,00
11,608448 ืžืก (361,314798 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,03
11,751424 ืžืก (356,918799 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,06
11,942592 ืžืก (351,205515 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,09
12,081120 ืžืก (347,178429 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,12
12,242560 ืžืก (342,600233 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,16
12,396448 ืžืก (338,347235 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,19
12,533024 ืžืก (334,660176 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,22
12,703328 ืžืก (330,173626 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,25
12,884512 ืžืก (325,530693 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,28
13,033472 ืžืก (321,810182 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,31
13,239296 ืžืก (316,807174 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,34
13,392448 ืžืก (313,184256 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,37
13,624000 ืžืก (307,861434 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,41
13,875520 ืžืก (302,280855 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,44
14,126528 ืžืก (296,909756 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,47
14,399328 ืžืก (291,284699 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,50
14,690304 ืžืก (285,515123 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,53
15,039136 ืžืก (278,892623 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,56
15,478656 ืžืก (270,973402 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,59
15,985664 ืžืก (262,379092 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,62
16,668673 ืžืก (251,627968 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,66
17,587200 ืžืก (238,486174 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,69
18,690048 ืžืก (224,413765 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,72
20,278816 ืžืก (206,831789 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,75
22,545408 ืžืก (186,038058 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,78
26,053312 ืžืก (160,989275 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,81
31,895008 ืžืก (131,503463 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,84
42,103294 ืžืก (99,619378 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,87
61,849056 ืžืก (67,815164 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,90
105,695999 ืžืก (39,682713 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

0,94
240,204636 ืžืก (17,461378 ืžื™ืœื™ืึธืŸ ืงื™ื– / ืกืขืง.)

ื•ื•ื™ ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ื™ื ืงืจื™ืกื™ื–, ืคืึธืจืฉื˜ืขืœื•ื ื’ ื“ื™ืงืจื™ืกืึทื–. ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื“ื™ื–ื™ื™ืจืึทื‘ืึทืœ ืื™ืŸ ืจื•ื‘ึฟ ืงืึทืกืขืก. ืื•ื™ื‘ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื™ื ืกืขืจืฅ ืขืœืขืžืขื ื˜ืŸ ืื™ืŸ ืึท ื˜ื™ืฉ ืื•ืŸ ื“ืขืžืึธืœื˜ ืึทื•ื•ืขืงื•ื•ืึทืจืคืŸ ื–ื™ื™ (ืœืžืฉืœ, ื•ื•ืขืŸ ืงืึทื•ื ื˜ื™ื ื’ ื•ื•ืขืจื˜ืขืจ ืื™ืŸ ืึท ื‘ื•ืš), ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืึท ืคึผืจืึธื‘ืœืขื. ืึธื‘ืขืจ ืื•ื™ื‘ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆื˜ ืึท ืœืึทื ื’-ื’ืขืœืขื‘ื˜ ื”ืึทืฉ ื˜ื™ืฉ (ืœืžืฉืœ, ืื™ืŸ ืึท ื’ืจืึทืคื™ืงืก ืจืขื“ืึทืงื˜ืึธืจ ืฆื• ืงืจืึธื ื ื™ื˜-ืœื™ื™ื“ื™ืง ืคึผืึทืจืฅ ืคื•ืŸ ื‘ื™ืœื“ืขืจ ื•ื•ื• ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืึธืคื˜ ื™ื ืกืขืจืฅ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข), ื“ืขื ื ืึทื˜ื•ืจ ืงืขืŸ ื–ื™ื™ืŸ ืคึผืจืึธื‘ืœืขืžืึทื˜ื™ืง.

ืื•ืŸ ื’ืขืžืืกื˜ืŸ ื“ื™ ื”ืึทืฉ ื˜ื™ืฉ ืคึผืจืึธื•ื‘ื™ื ื’ ื˜ื™ืคืงื™ื™ึทื˜ ื ืึธืš 64 ืžื™ืœื™ืึธืŸ ื™ื ืกืขืจืฅ (ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืคืึทืงื˜ืึธืจ 0,5). ื“ื™ ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ื˜ื™ืคืงื™ื™ึทื˜ ืื™ื– ื’ืขื•ื•ืขืŸ 0,4774, ืึทื–ื•ื™ ืจื•ื‘ึฟ ืฉืœื™ืกืœืขืŸ ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ืื™ืŸ ื“ืขืจ ื‘ืขืกื˜ืขืจ ืžืขื’ืœืขืš ืฉืคึผืขืœื˜ืœ ืึธื“ืขืจ ืื™ื™ืŸ ืฉืคึผืขืœื˜ืœ ืึทื•ื•ืขืง ืคื•ืŸ ื“ืขืจ ื‘ืขืกื˜ืขืจ ืฉื˜ืขืœืข. ื“ื™ ืžืึทืงืกื™ืžื•ื ืกืึทื•ื ื“ื™ื ื’ ื˜ื™ืคืงื™ื™ึทื˜ ืื™ื– ื’ืขื•ื•ืขืŸ 60.

ืื™ืš ื“ืขืžืึธืœื˜ ื’ืขืžืืกื˜ืŸ ื“ื™ ืคึผืจืึธื•ื‘ื™ื ื’ ื˜ื™ืคืงื™ื™ึทื˜ ืื•ื™ืฃ ืึท ื˜ื™ืฉ ืžื™ื˜ 124 ืžื™ืœื™ืึธืŸ ื™ื ืกืขืจืฅ (ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืคืึทืงื˜ืึธืจ 0,97). ื“ื™ ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ื˜ื™ืคืงื™ื™ึทื˜ ืื™ื– ืฉื•ื™ืŸ 10,1757, ืื•ืŸ ื“ื™ ืžืึทืงืกื™ืžื•ื - 6474 (!!). ืœื™ื ืขืึทืจ ืกืขื ืกื™ื ื’ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื˜ืจืืคื ืก ื‘ืื˜ื™ื™ื˜ื™ืง ื‘ื™ื™ ื”ื•ื™ืš ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืจื™ื™ืฅ.

ืขืก ืื™ื– ื‘ืขืกื˜ืขืจ ืฆื• ื”ืึทืœื˜ืŸ ื“ื™ ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืงื•ืจืก ืคื•ืŸ ื“ืขื ื”ืึทืฉ ื˜ื™ืฉ ื ื™ื“ืขืจื™ืง. ืึธื‘ืขืจ ื“ืขืžืึธืœื˜ ืžื™ืจ ืคืึทืจื’ืจืขืกืขืจืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื™ืŸ ื“ื™ ืงืึธืกื˜ ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืงืึทื ืกืึทืžืฉืึทืŸ. ืฆื•ืž ื’ืœื™ืง, ืื™ืŸ ื“ื™ ืคืึทืœ ืคื•ืŸ 32-ื‘ื™ืกืœ ืฉืœื™ืกืœืขืŸ ืื•ืŸ ื•ื•ืึทืœื•ืขืก, ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื’ืขืจืขื›ื˜ืคืืจื˜ื™ืงื˜. ืื•ื™ื‘ ืื™ืŸ ื“ื™ ืื•ื™ื‘ืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืŸ ืึท ื˜ื™ืฉ ืžื™ื˜ 128 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ, ืžื™ืจ ื”ืึทืœื˜ืŸ ื“ื™ ื™ื•ื˜ืึทืœืึทื–ื™ื™ืฉืึทืŸ ืคืึทืงื˜ืึธืจ ืคื•ืŸ 0,25, ืžื™ืจ ืงืขื ืขืŸ ืฉื˜ืขืœืŸ ื ื™ื˜ ืžืขืจ ื•ื•ื™ 32 ืžื™ืœื™ืึธืŸ ืขืœืขืžืขื ื˜ืŸ ืื™ืŸ ืขืก, ืื•ืŸ ื“ื™ ืจื•ืขืŸ 96 ืžื™ืœื™ืึธืŸ ืกืœืึธืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคืึทืจืคืึทืœืŸ - 8 ื‘ื™ื˜ืขืก ืคึฟืึทืจ ื™ืขื“ืขืจ ืคึผืึธืจ , 768 ืžื‘ ืคื•ืŸ ืคืึทืจืคืึทืœืŸ ื–ื›ึผืจื•ืŸ.

ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ืžื™ืจ ื–ืขื ืขืŸ ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ ื“ื™ ืึธื ื•ื•ืขืจ ืคื•ืŸ ื•ื•ื™ื“ืขื ืงืึทืจื˜ืœ ื–ื›ึผืจื•ืŸ, ื•ื•ืึธืก ืื™ื– ืึท ืžืขืจ ื•ื•ืขืจื˜ืคื•ืœ ืžื™ื˜ืœ ื•ื•ื™ ืกื™ืกื˜ืขื ื–ื›ึผืจื•ืŸ. ื›ืึธื˜ืฉ ืจื•ื‘ึฟ ืžืึธื“ืขืจืŸ ื“ืขืกืงื˜ืึทืคึผ ื’ืจืึทืคื™ืงืก ืงืึทืจื“ืก ื•ื•ืึธืก ืฉื˜ื™ืฆืŸ CUDA ื”ืึธื‘ืŸ ืœืคึผื—ื•ืช 4 ื’ื™ื’ืื‘ื™ื™ื˜ ืคื•ืŸ ื–ื›ึผืจื•ืŸ (ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ, ื“ื™ NVIDIA 2080 ื˜ื™ ื”ืื˜ 11 ื’ื™ื’ืื‘ื™ื™ื˜), ืขืก ื•ื•ืึธืœื˜ ื ืึธืš ื ื™ืฉื˜ ื–ื™ื™ืŸ ื“ื™ ื•ื•ื™ื™ื–ืึทืกื˜ ื‘ืึทืฉืœื•ืก ืฆื• ืคืึทืจืœื™ืจืŸ ืึทื–ืึท ืึทืžืึทื•ื ืฅ.

ืฉืคึผืขื˜ืขืจ ืื™ืš ื•ื•ืขืœ ืฉืจื™ื™ึทื‘ืŸ ืžืขืจ ื•ื•ืขื’ืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ื”ืึทืฉ ื˜ื™ืฉืŸ ืคึฟืึทืจ ื•ื•ื™ื“ืขื ืงืึทืจื“ืก ื•ื•ืึธืก ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืคึผืจืึธื‘ืœืขืžืก ืžื™ื˜ ืคึผืจืึธื•ื‘ื™ื ื’ ื˜ื™ืคืงื™ื™ึทื˜, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ื•ื•ืขื’ืŸ ืฆื• ืจื™ื™ื•ื– ืื•ื™ืกื’ืขืžืขืงื˜ ืกืœืึธืฅ.

ืกืึธื•ื ื“ื™ื ื’ ื˜ื™ืฃ ืžืขื–ืฉืขืจืžืึทื ื˜

ืฆื• ื‘ืึทืฉื˜ื™ืžืขืŸ ื“ื™ ืคึผืจืึธื•ื‘ื™ื ื’ ื˜ื™ืคืงื™ื™ึทื˜ ืคื•ืŸ ืึท ืฉืœื™ืกืœ, ืžื™ืจ ืงืขื ืขืŸ ืขืงืกื˜ืจืึทืงื˜ ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ื™ ืฉืœื™ืกืœ (ื–ื™ื™ึทืŸ ื™ื“ืขืึทืœ ื˜ื™ืฉ ืื™ื ื“ืขืงืก) ืคื•ืŸ ื–ื™ื™ืŸ ืคืึทืงื˜ื™ืฉ ื˜ื™ืฉ ืื™ื ื“ืขืงืก:

// 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.

ืกืึธืฃ

ืื•ื™ื‘ ืื™ืจ ื”ืึธื˜ ืคึฟืจืื’ืŸ ืึธื“ืขืจ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ, ื‘ื™ื˜ืข ื‘ืœื™ืฆืคึผืึธืกื˜ ืžื™ืจ ืื•ื™ืฃ ื˜ื•ื•ื™ื˜ื˜ืขืจ ืึธื“ืขืจ ืขืคึฟืขื ืขืŸ ืึท ื ื™ื™ึทืข ื˜ืขืžืข ืื™ืŸ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–.

ื“ืขืจ ืงืึธื“ ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื•ื ื˜ืขืจ ื™ื ืกืคึผื™ืจืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื•ื™ืกื’ืขืฆื™ื™ื›ื ื˜ ืึทืจื˜ื™ืงืœืขืŸ:

ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜, ืื™ืš ื•ื•ืขืœ ืคืึธืจื–ืขืฆืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื•ื•ืขื’ืŸ ื”ืึทืฉ ื˜ื™ืฉ ื™ืžืคึผืœืึทืžืึทื ืฅ ืคึฟืึทืจ ื•ื•ื™ื“ืขื ืงืึทืจื“ืก ืื•ืŸ ืึทื ืึทืœื™ื™ื– ื–ื™ื™ืขืจ ืคืึธืจืฉื˜ืขืœื•ื ื’. ืžื™ื™ึทืŸ ืคึผืœืึทื ื– ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื˜ืฉืึทื™ื ื™ื ื’, ืจืึธื‘ื™ืŸ ื›ื•ื“ ื›ืึทืฉื™ื ื’ ืื•ืŸ ืงื•ืงื• ื›ืึทืฉื™ื ื’ ื ื™ืฆืŸ ืึทื˜ืึธืžื™ืฉืข ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืื™ืŸ ื“ืึทื˜ืŸ ืกื˜ืจืึทืงื˜ืฉืขืจื– ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืคึผื• ืคืจื™ื™ึทื ื“ืœืขืš.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’