GPU เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ

GPU เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ
เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เช—เซ€เชฅเชฌ เชชเชฐ เชชเซ‹เชธเซเชŸ เช•เชฐเซเชฏเซเช‚ เชจเชตเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชเช• เชธเชฐเชณ GPU เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ.

เชคเซ‡ เชเช• เชธเชฐเชณ GPU เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช›เซ‡ เชœเซ‡ เชธเซ‡เช‚เช•เชกเซ‹ เชฒเชพเช–เซ‹ เช‡เชจเซเชธเชฐเซเชŸเซเชธ เชชเซเชฐเชคเชฟ เชธเซ‡เช•เชจเซเชก เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เช›เซ‡. เชฎเชพเชฐเชพ NVIDIA GTX 1060 เชฒเซ‡เชชเชŸเซ‹เชช เชชเชฐ, เช•เซ‹เชก เชฒเช—เชญเช— 64 ms เชฎเชพเช‚ เชฐเซ‡เชจเซเชกเชฎเชฒเซ€ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒ 210 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€-เชตเซ‡เชฒเซเชฏเซ เชœเซ‹เชกเซ€เช“ เชฆเชพเช–เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฒเช—เชญเช— 32 ms เชฎเชพเช‚ 64 เชฎเชฟเชฒเชฟเชฏเชจ เชœเซ‹เชกเซ€เช“เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ‡ เช›เซ‡.

เชเชŸเชฒเซ‡ เช•เซ‡, เชฒเซ‡เชชเชŸเซ‹เชช เชชเชฐเชจเซ€ เชเชกเชช เช†เชถเชฐเซ‡ 300 เชฎเชฟเชฒเชฟเชฏเชจ เช‡เชจเซเชธเชฐเซเชŸ/เชธเซ‡เช•เชจเซเชก เช…เชจเซ‡ 500 เชฎเชฟเชฒเชฟเชฏเชจ เชกเชฟเชฒเซ€เชŸ/เชธเซ‡เช•เชจเซเชก เช›เซ‡.

เช•เซ‹เชทเซเชŸเช• CUDA เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡, เชœเซ‹ เช•เซ‡ เชธเชฎเชพเชจ เชคเช•เชจเซ€เช• HLSL เช…เชฅเชตเชพ GLSL เชชเชฐ เชฒเชพเช—เซ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชตเชฟเชกเซ€เชฏเซ‹ เช•เชพเชฐเซเชก เชชเชฐ เช‰เชšเซเชš เชชเซเชฐเชฆเชฐเซเชถเชจ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚ เช˜เชฃเซ€ เชฎเชฐเซเชฏเชพเชฆเชพเช“ เช›เซ‡:

  • เชซเช•เซเชค 32-เชฌเซ€เชŸ เช•เซ€ เช…เชจเซ‡ เชธเชฎเชพเชจ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
  • เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชจเชฟเชถเซเชšเชฟเชค เช•เชฆ เชนเซ‹เชฏ เช›เซ‡.
  • เช…เชจเซ‡ เช† เชฎเชพเชช เชถเช•เซเชคเชฟเชจเชพ เชฌเซ‡ เชฌเชฐเชพเชฌเชฐ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช.

เช•เซ€เช“ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชเช• เชธเชฐเชณ เชกเชฟเชฒเชฟเชฎเชฟเชŸเชฐ เชฎเชพเชฐเซเช•เชฐ เช…เชจเชพเชฎเชค เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เช‰เชชเชฐเซ‹เช•เซเชค เช•เซ‹เชกเชฎเชพเช‚ เช† 0xffffffff เช›เซ‡).

เชคเชพเชณเชพเช“ เชตเชฟเชจเชพ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ

เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช“เชชเชจ เชเชกเซเชฐเซ‡เชธเซ€เช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชฐเซ‡เช–เซ€เชฏ เชคเชชเชพเชธ, เชเชŸเชฒเซ‡ เช•เซ‡, เชคเซ‡ เชซเช•เซเชค เช•เซ€-เชตเซ‡เชฒเซเชฏเซ เชœเซ‹เชกเซ€เชจเซ€ เชเชพเช•เชเชฎเชพเชณ เช›เซ‡ เชœเซ‡ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชถเซเชฐเซ‡เชทเซเช  เช•เซ‡เชถ เชชเซเชฐเชฆเชฐเซเชถเชจ เชงเชฐเชพเชตเซ‡ เช›เซ‡. เช† เชœ เชธเชพเช‚เช•เชณ เชฎเชพเชŸเซ‡ เช•เชนเซ€ เชถเช•เชพเชฏ เชจเชนเซ€เช‚, เชœเซ‡เชฎเชพเช‚ เชฒเชฟเช‚เช• เช•เชฐเซ‡เชฒเซ€ เชธเซ‚เชšเชฟเชฎเชพเช‚ เชชเซ‹เช‡เชจเซเชŸเชฐ เชถเซ‹เชงเชตเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช เชเช• เชธเชฐเชณ เชเชฐเซ‡ เชธเซเชŸเซ‹เชฐเชฟเช‚เช— เชคเชคเซเชตเซ‹ เช›เซ‡ KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

เช•เซ‹เชทเซเชŸเช•เชจเซเช‚ เช•เชฆ เชฌเซ‡เชจเซ€ เชถเช•เซเชคเชฟ เช›เซ‡, เช…เชตเชฟเชญเชพเชœเซเชฏ เชธเช‚เช–เซเชฏเชพ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ pow2/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() เชธเชฎเชพเช‚เชคเชฐเชฎเชพเช‚ เชœเซ‹เชกเซ€เชจเชพ เชเชฐเซ‡ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‹, เชฆเชฐเซ‡เช• เชœเซ‹เชกเซ€ เช…เชฒเช— GPU เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฅเซเชฐเซ‡เชกเชฎเชพเช‚:

// CPU code to invoke the CUDA kernel on the GPU
uint32_t threadblocksize = 1024;
uint32_t gridsize = (numkvs + threadblocksize - 1) / threadblocksize;
gpu_hashtable_insert_kernel<<<gridsize, threadblocksize>>>(hashtable, kvs, numkvs);

// GPU code to process numkvs key/values in parallel
void gpu_hashtable_insert_kernel(KeyValue* hashtable, const KeyValue* kvs, unsigned int numkvs)
{
    unsigned int threadid = blockIdx.x*blockDim.x + threadIdx.x;
    if (threadid < numkvs)
    {
        gpu_hashtable_insert(hashtable, kvs[threadid].key, kvs[threadid].value);
    }
}

เชฒเซ‹เช•-เชชเซเชฐเชคเชฟเชฐเซ‹เชงเช• เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชธเชฎเชตเชฐเซเชคเซ€ เชฆเชพเช–เชฒ, เชฒเซเช•เช…เชช เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เช•เซ€-เชตเซ‡เชฒเซเชฏเซ เชœเซ‹เชกเซ€ เชนเช‚เชฎเซ‡เชถเชพ เชšเชพเชฐเชฎเชพเช‚เชฅเซ€ เชเช• เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชšเชพเชตเซ€เช“ เช–เชธเซ‡เชกเชคเซ€ เชจเชฅเซ€, เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชเช•เชธเชพเชฅเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ€ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชชเชฃ เช•เซ‹เชทเซเชŸเช• เชšเซ‹เช•เชธเชพเชˆเชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชœเซ‹ เช•เซ‡, เชœเซ‹ เช†เชชเชฃเซ‡ เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เชจเชฟเชตเซ‡เชถ เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชฌเซ‡เชšเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€เช, เช…เชจเซ‡ เชœเซ‹ เชœเซ‹เชกเซ€เช“เชจเชพ เช‡เชจเชชเซเชŸ เชเชฐเซ‡เชฎเชพเช‚ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช•เซ€ เชนเซ‹เชฏ, เชคเซ‹ เช…เชฎเซ‡ เช†เช—เชพเชนเซ€ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช•เซ‡ เช•เชˆ เชœเซ‹เชกเซ€ "เชœเซ€เชคเชถเซ‡"โ€”เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชชเชฐ เช›เซ‡เชฒเซเชฒเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช…เชฎเซ‡ เชœเซ‹เชกเซ€เชจเชพ เช‡เชจเชชเซเชŸ เชเชฐเซ‡ เชธเชพเชฅเซ‡ เชจเชฟเชตเซ‡เชถ เช•เซ‹เชกเชจเซ‡ เชฌเซ‹เชฒเชพเชตเซ€เช เช›เซ€เช A/0 B/1 A/2 C/3 A/4. เชœเซเชฏเชพเชฐเซ‡ เช•เซ‹เชก เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ, เชคเซเชฏเชพเชฐเซ‡ เชœเซ‹เชกเซ€ B/1 ะธ C/3 เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชนเชพเชœเชฐ เชฐเชนเซ‡เชตเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชœ เชธเชฎเชฏเซ‡ เชคเซ‡เชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ เชœเซ‹เชกเซ€ เชฆเซ‡เช–เชพเชถเซ‡ A/0, A/2 เช…เชฅเชตเชพ A/4. เช† เชธเชฎเชธเซเชฏเชพ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชจ เชชเชฃ เชนเซ‹เชˆ เชถเช•เซ‡ - เชคเซ‡ เชฌเชงเซเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชคเชฎเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชœเชพเชฃเชคเชพ เชนเชถเซ‹ เช•เซ‡ เช‡เชจเชชเซเชŸ เชเชฐเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช•เซ€ เชจเชฅเซ€, เช…เชฅเชตเชพ เชคเชฎเซ‡ เช•เชฆเชพเชš เชงเซเชฏเชพเชจ เชจ เชฐเชพเช–เชถเซ‹ เช•เซ‡ เช•เชˆ เช•เชฟเช‚เชฎเชค เช›เซ‡เชฒเซเชฒเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เชœเซ‹ เช† เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชธเซเชฏเชพ เช›เซ‡, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เชœเซ‹เชกเซ€เชจเซ‡ เช…เชฒเช— เช…เชฒเช— CUDA เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชฎเชพเช‚ เช…เชฒเช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. CUDA เชฎเชพเช‚, เช•เซ‹เชˆเชชเชฃ เช‘เชชเชฐเซ‡เชถเชจ เช•เซ‡ เชœเซ‡ เช•เชฐเซเชจเชฒเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เช†เช—เชพเชฎเซ€ เช•เชฐเซเชจเชฒ เช•เซ‰เชฒ เชชเชนเซ‡เชฒเชพเช‚ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เช›เซ‡ (เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชเช• เชฅเซเชฐเซ‡เชกเชจเซ€ เช…เช‚เชฆเชฐ. เชตเชฟเชตเชฟเชง เชฅเซเชฐเซ‡เชกเซ‹เชฎเชพเช‚, เช•เชฐเซเชจเชฒ เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชœเซ‹ เชคเชฎเซ‡ เชเช• เช•เชฐเซเชจเชฒ เชธเชพเชฅเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‹ เช›เซ‹ A/0 B/1 A/2 C/3, เช…เชจเซ‡ เช…เชจเซเชฏ เชธเชพเชฅเซ‡ A/4, เชชเช›เซ€ เช•เซ€ A เช•เชฟเช‚เชฎเชค เชฎเชณเชถเซ‡ 4.

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชตเชพเชค เช•เชฐเซ€เช เช•เซ‡ เชถเซเช‚ เชซเช‚เช•เซเชถเชจเซเชธ เชœเซ‹เชˆเช lookup() ะธ delete() เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชœเซ‹เชกเซ€เชจเซ€ เชเชฐเซ‡ เชฎเชพเชŸเซ‡ เชธเชพเชฆเชพ เช…เชฅเชตเชพ เช…เชธเซเชฅเชฟเชฐ เชชเซ‹เช‡เชจเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. CUDA เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชœเชฃเชพเชตเซ‡ เช›เซ‡ เช•เซ‡:

เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชตเซˆเชถเซเชตเชฟเช• เช…เชฅเชตเชพ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชตเชพเช‚เชšเชจ เช…เชจเซ‡ เชฒเซ‡เช–เชจเชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพเชจเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡... เช† เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เช•เซ€เชตเชฐเซเชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ volatile: ... เช† เชšเชฒเชจเซ‹ เช•เซ‹เชˆเชชเชฃ เชธเช‚เชฆเชฐเซเชญ เชตเชพเช‚เชšเชตเชพ เช…เชฅเชตเชพ เชฒเช–เชตเชพเชจเซ€ เชธเซ‚เชšเชจเชพเชฎเชพเช‚ เชตเชพเชธเซเชคเชตเชฟเช• เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเช‚เช•เชฒเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชธเชšเซ‹เชŸ เชตเชฟเชšเชพเชฐเชฃเชพเช“เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ volatile. เชœเซ‹ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฅเซเชฐเซ‡เชก เช…เช—เชพเช‰เชจเซ€ เชฐเซ€เชก เช‘เชชเชฐเซ‡เชถเชจเชฎเชพเช‚เชฅเซ€ เช•เซ…เชถเซเชก เชฎเซ‚เชฒเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชคเซ‡ เชฅเซ‹เชกเซ€ เชœเซ‚เชจเซ€ เชฎเชพเชนเชฟเชคเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‡. เชชเชฐเช‚เชคเซ เชคเซ‡เชฎ เช›เชคเชพเช‚, เช† เช•เชฐเซเชจเชฒ เช•เซ‹เชฒเชจเซ€ เชšเซ‹เช•เซเช•เชธ เช•เซเชทเชฃเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ€ เชธเชพเชšเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เช›เซ‡. เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เชจเชตเซ€เชจเชคเชฎ เชฎเชพเชนเชฟเชคเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ volatile, เชชเชฐเช‚เชคเซ เชชเช›เซ€ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฅเซ‹เชกเซเช‚ เช˜เชŸเชถเซ‡: เชฎเชพเชฐเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช…เชจเซเชธเชพเชฐ, 32 เชฎเชฟเชฒเชฟเชฏเชจ เช˜เชŸเช•เซ‹เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชคเซ€ เชตเช–เชคเซ‡, เชเชกเชช 500 เชฎเชฟเชฒเชฟเชฏเชจ เชกเชฟเชฒเซ€เชถเชจ/เชธเซ‡เช•เช‚เชกเชฅเซ€ เช˜เชŸเซ€เชจเซ‡ 450 เชฎเชฟเชฒเชฟเชฏเชจ เชกเชฟเชฒเซ€เชถเชจ/เชธเซ‡เช•เชจเซเชก เชฅเชˆ เช—เชˆ เช›เซ‡.

เช‰เชคเซเชชเชพเชฆเช•เชคเชพ

64 เชฎเชฟเชฒเชฟเชฏเชจ เชคเชคเซเชตเซ‹ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ 32 เชฎเชฟเชฒเชฟเชฏเชจ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เช•เชธเซ‹เชŸเซ€เชฎเชพเช‚, เชตเชšเซเชšเซ‡ เชธเซเชชเชฐเซเชงเชพ std::unordered_map เช…เชจเซ‡ GPU เชฎเชพเชŸเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฐเซ€เชคเซ‡ เช•เซ‹เชˆ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชจเชฅเซ€:

GPU เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ
std::unordered_map เชคเชคเซเชตเซ‹ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชฎเชจเซ‡ เชฎเซเช•เซเชค เช•เชฐเชตเชพเชฎเชพเช‚ 70 ms เช–เชฐเซเชšเซเชฏเชพ unordered_map (เชฒเชพเช–เซ‹ เชคเชคเซเชตเซ‹เชฅเซ€ เช›เซเชŸเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช…เช‚เชฆเชฐ unordered_map เชฌเชนเซเชตเชฟเชง เชฎเซ‡เชฎเชฐเซ€ เชซเชพเชณเชตเชฃเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เชธเชพเชšเซเช‚ เช•เชนเซเช‚ เชคเซ‹, std:unordered_map เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฒเช— เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹. เชคเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‹ เชธเชฟเช‚เช—เชฒ CPU เชฅเซเชฐเซ‡เชก เช›เซ‡, เช•เซ‹เชˆเชชเชฃ เช•เชฆเชจเชพ เช•เซ€-เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡, เช‰เชšเซเชš เช‰เชชเชฏเซ‹เช— เชฆเชฐเซ‡ เชธเชพเชฐเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฌเชนเซเชตเชฟเชง เช•เชพเชขเซ€ เชจเชพเช–เชตเชพ เชชเช›เซ€ เชธเซเชฅเชฟเชฐ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

GPU เช…เชจเซ‡ เช‡เชจเซเชŸเชฐ-เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ‹ เชธเชฎเชฏเช—เชพเชณเซ‹ 984 ms เชนเชคเซ‹. เช†เชฎเชพเช‚ เชŸเซ‡เชฌเชฒเชจเซ‡ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เชตเชฟเชคเชพเชตเซ‡เชฒเซ‹ เชธเชฎเชฏเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ (เชเช•เชตเชพเชฐ 1 GB เชฎเซ‡เชฎเชฐเซ€ เชซเชพเชณเชตเชตเซ€, เชœเซ‡ CUDA เชฎเชพเช‚ เชฅเซ‹เชกเซ‹ เชธเชฎเชฏ เชฒเซ‡ เช›เซ‡), เชคเชคเซเชตเซ‹เชจเซ‡ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชตเชฟเชกเชฟเชฏเซ‹ เช•เชพเชฐเซเชก เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชฌเชงเซ€ เชจเช•เชฒเซ‹ เชชเชฃ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ 271 เชเชฎเชเชธเชจเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซเชฏเซ‹. เช†เชฎเชพเช‚ เชตเชฟเชกเชฟเชฏเซ‹ เช•เชพเชฐเซเชก เชฆเซเชตเชพเชฐเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เชตเชฟเชคเชพเชตเซ‡เชฒเซ‹ เชธเชฎเชฏ เชถเชพเชฎเซ‡เชฒ เช›เซ‡, เช…เชจเซ‡ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช•เซ‰เชชเชฟ เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ€ เช•เซ‹เชทเซเชŸเช• เชชเชฐ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชตเชฟเชคเชพเชตเซ‡เชฒ เชธเชฎเชฏเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชคเซ‹ เชจเชฅเซ€. เชœเซ‹ GPU เชŸเซ‡เชฌเชฒ เชฒเชพเช‚เชฌเซ‹ เชธเชฎเชฏ เชœเซ€เชตเซ‡ เช›เซ‡, เช…เชฅเชตเชพ เชœเซ‹ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชตเชฟเชกเชฟเชฏเซ‹ เช•เชพเชฐเซเชกเชจเซ€ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒเซเช‚ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชจเซเชฏ GPU เช•เซ‹เชก เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เช•เซ‡เชจเซเชฆเซเชฐเซ€เชฏ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เชฆเซเชตเชพเชฐเชพ เชจเชนเซ€เช‚), เชคเซ‹ เชชเช›เซ€ เชชเชฐเซ€เช•เซเชทเชฃ เชชเชฐเชฟเชฃเชพเชฎ เชธเช‚เชฌเช‚เชงเชฟเชค เช›เซ‡.

เชตเชฟเชกเซ€เชฏเซ‹ เช•เชพเชฐเซเชก เชฎเชพเชŸเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช‰เชšเซเชš เชฅเซเชฐเซเชชเซเชŸ เช…เชจเซ‡ เชธเช•เซเชฐเชฟเชฏ เชธเชฎเชพเช‚เชคเชฐเชฃเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช‰เชšเซเชš เชชเซเชฐเชฆเชฐเซเชถเชจ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เช–เชพเชฎเซ€เช“

เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เชฅเซ‹เชกเชพ เชฎเซเชฆเซเชฆเชพเช“ เช›เซ‡ เชœเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชงเซเชฏเชพเชจ เชฐเชพเช–เชตเซเช‚:

  • เชฒเซ€เชจเชฟเชฏเชฐ เชชเซเชฐเซ‹เชฌเชฟเช‚เช— เช•เซเชฒเชธเซเชŸเชฐเชฟเช‚เช— เชฆเซเชตเชพเชฐเชพ เช…เชตเชฐเซ‹เชงเชพเชฏ เช›เซ‡, เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เช•เซ€เช“ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ€เชคเซ‡ เช“เช›เซ€ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
  • เช•เชพเชฐเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ€ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€ delete เช…เชจเซ‡ เชธเชฎเชฏ เชœเชคเชพเช‚ เชคเซ‡เช“ เชŸเซ‡เชฌเชฒเชจเซ‡ เช•เซเชฒเชŸเชฐ เช•เชฐเซ‡ เช›เซ‡.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชฌเช—เชกเซ€ เชถเช•เซ‡ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชœเซ‹ เชคเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ€ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชนเซ‹เชฏ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เช…เชธเช‚เช–เซเชฏ เช‡เชจเซเชธเชฐเซเชŸ เช…เชจเซ‡ เชกเชฟเชฒเซ€เชŸ เชนเซ‹เชฏ. เช† เช—เซ‡เชฐเชซเชพเชฏเชฆเชพเชจเซ‡ เช˜เชŸเชพเชกเชตเชพเชจเซ€ เชเช• เชฐเซ€เชค เช เช›เซ‡ เช•เซ‡ เชเช•เชฆเชฎ เชจเซ€เชšเชพ เช‰เชชเชฏเซ‹เช— เชฆเชฐ เชธเชพเชฅเซ‡ เชจเชตเชพ เชŸเซ‡เชฌเชฒ เชชเชฐ เชซเชฐเซ€เชฅเซ€ เชนเซ‡เชถ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชฐเซ€เชนเซ‡เชถเชฟเช‚เช— เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฆเซ‚เชฐ เช•เชฐเซ‡เชฒเซ€ เช•เซ€เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเซ€.

เชตเชฐเซเชฃเชตเซ‡เชฒ เชฎเซเชฆเซเชฆเชพเช“เชจเซ‡ เชธเชฎเชœเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชนเซเช‚ เช‰เชชเชฐเซ‹เช•เซเชค เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— 128 เชฎเชฟเชฒเชฟเชฏเชจ เชคเชคเซเชตเซ‹ เชธเชพเชฅเซ‡เชจเซเช‚ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เชถ เช…เชจเซ‡ เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชนเซเช‚ 4 เชฎเชฟเชฒเชฟเชฏเชจ เชธเซเชฒเซ‹เชŸ (เชฒเช—เชญเช— 124 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฆเชฐ) เชญเชฐเซเช‚ เชจเชนเซ€เช‚ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ 0,96 เชฎเชฟเชฒเชฟเชฏเชจ เชคเชคเซเชตเซ‹เชฎเชพเช‚เชฅเซ€ เชฒเซ‚เชช เช•เชฐเซ€เชถ. เช…เชนเซ€เช‚ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซเช‚ เช•เซ‹เชทเซเชŸเช• เช›เซ‡, เชฆเชฐเซ‡เช• เชชเช‚เช•เซเชคเชฟ เชเช• เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ 4 เชฎเชฟเชฒเชฟเชฏเชจ เชจเชตเชพ เช˜เชŸเช•เซ‹ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ CUDA เช•เชฐเซเชจเชฒเชจเซ‡ เช•เซ‰เชฒ เช›เซ‡:

เชตเชชเชฐเชพเชถ เชฆเชฐ
เชจเชฟเชตเซ‡เชถ เชธเชฎเชฏเช—เชพเชณเซ‹ 4 เชคเชคเซเชตเซ‹

0,00
11,608448 ms (361,314798 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,03
11,751424 ms (356,918799 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,06
11,942592 ms (351,205515 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,09
12,081120 ms (347,178429 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,12
12,242560 ms (342,600233 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,16
12,396448 ms (338,347235 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,19
12,533024 ms (334,660176 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,22
12,703328 ms (330,173626 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,25
12,884512 ms (325,530693 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,28
13,033472 ms (321,810182 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,31
13,239296 ms (316,807174 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,34
13,392448 ms (313,184256 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,37
13,624000 ms (307,861434 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,41
13,875520 ms (302,280855 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,44
14,126528 ms (296,909756 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,47
14,399328 ms (291,284699 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,50
14,690304 ms (285,515123 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,53
15,039136 ms (278,892623 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,56
15,478656 ms (270,973402 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,59
15,985664 ms (262,379092 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,62
16,668673 ms (251,627968 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,66
17,587200 ms (238,486174 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,69
18,690048 ms (224,413765 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,72
20,278816 ms (206,831789 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,75
22,545408 ms (186,038058 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,78
26,053312 ms (160,989275 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,81
31,895008 ms (131,503463 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,84
42,103294 ms (99,619378 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,87
61,849056 ms (67,815164 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,90
105,695999 ms (39,682713 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

0,94
240,204636 ms (17,461378 เชฎเชฟเชฒเชฟเชฏเชจ เช•เซ€/เชธเซ‡เช•เชจเซเชก.)

เชœเซ‡เชฎ เชœเซ‡เชฎ เช‰เชชเชฏเซ‹เช— เชตเชงเซ‡ เช›เซ‡ เชคเซ‡เชฎ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เช˜เชŸเซ‡ เช›เซ‡. เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เช† เช‡เชšเซเช›เชจเซ€เชฏ เชจเชฅเซ€. เชœเซ‹ เช•เซ‹เชˆ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เช˜เชŸเช•เซ‹ เชฆเชพเช–เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เซ‡ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซเชธเซเชคเช•เชฎเชพเช‚ เชถเชฌเซเชฆเซ‹ เช—เชฃเชคเซ€ เชตเช–เชคเซ‡), เชคเซ‹ เช† เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€. เชชเชฐเช‚เชคเซ เชœเซ‹ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชšเชพเชฒเชคเชพ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช—เซเชฐเชพเชซเชฟเช•เซเชธ เชเชกเชฟเชŸเชฐเชฎเชพเช‚ เช›เชฌเซ€เช“เชจเชพ เชฌเชฟเชจ-เช–เชพเชฒเซ€ เชญเชพเช—เซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเซเชฏเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชตเชพเชฐเช‚เชตเชพเชฐ เชฎเชพเชนเชฟเชคเซ€ เชฆเชพเช–เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เซ‡ เช›เซ‡), เชคเซ‹ เช† เชตเชฐเซเชคเชจ เชธเชฎเชธเซเชฏเชพเชฐเซ‚เชช เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡.

เช…เชจเซ‡ 64 เชฎเชฟเชฒเชฟเชฏเชจ เช‡เชจเซเชธเชฐเซเชŸ (เช‰เชชเชฏเซ‹เช— เชชเชฐเชฟเชฌเชณ 0,5) เชชเช›เซ€ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชชเซเชฐเซ‹เชฌเชฟเช‚เช— เชกเซ‡เชชเซเชฅ เชฎเชพเชชเซเชฏเซเช‚. เชธเชฐเซ‡เชฐเชพเชถ เชŠเช‚เชกเชพเชˆ 0,4774 เชนเชคเซ€, เชคเซ‡เชฅเซ€ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชšเชพเชตเซ€เช“ เช•เชพเช‚ เชคเซ‹ เชถเซเชฐเซ‡เชทเซเช  เชธเช‚เชญเชตเชฟเชค เชธเซเชฒเซ‹เชŸเชฎเชพเช‚ เชนเชคเซ€ เช…เชฅเชตเชพ เชถเซเชฐเซ‡เชทเซเช  เชธเซเชฅเชพเชจเชฅเซ€ เชเช• เชธเซเชฒเซ‹เชŸ เชฆเซ‚เชฐ เชนเชคเซ€. เชฎเชนเชคเซเชคเชฎ เช…เชตเชพเชœเชจเซ€ เชŠเช‚เชกเชพเชˆ 60 เชนเชคเซ€.

เชชเช›เซ€ เชฎเซ‡เช‚ 124 เชฎเชฟเชฒเชฟเชฏเชจ เช‡เชจเซเชธเชฐเซเชŸ (เช‰เชชเชฏเซ‹เช— เชชเชฐเชฟเชฌเชณ 0,97) เชธเชพเชฅเซ‡ เชŸเซ‡เชฌเชฒ เชชเชฐ เชคเชชเชพเชธเชจเซ€ เชŠเช‚เชกเชพเชˆ เชฎเชพเชชเซ€. เชธเชฐเซ‡เชฐเชพเชถ เชŠเช‚เชกเชพเชˆ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ 10,1757 เชนเชคเซ€, เช…เชจเซ‡ เชฎเชนเชคเซเชคเชฎ - 6474 (!!). เช‰เชšเซเชš เช‰เชชเชฏเซ‹เช— เชฆเชฐเซ‡ เชฒเซ€เชจเชฟเชฏเชฐ เชธเซ‡เชจเซเชธเชฟเช‚เช— เช•เชพเชฎเช—เซ€เชฐเซ€ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช˜เชŸเซ‡ เช›เซ‡.

เช† เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฆเชฐ เช“เช›เซ‹ เชฐเชพเช–เชตเซ‹ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡. เชชเชฐเช‚เชคเซ เชชเช›เซ€ เช…เชฎเซ‡ เชฎเซ‡เชฎเชฐเซ€ เชตเชชเชฐเชพเชถเชจเชพ เช–เชฐเซเชšเซ‡ เชชเซเชฐเชฆเชฐเซเชถเชจเชฎเชพเช‚ เชตเชงเชพเชฐเซ‹ เช•เชฐเซ€เช เช›เซ€เช. เชธเชฆเชญเชพเช—เซเชฏเซ‡, 32-เชฌเซ€เชŸ เช•เซ€ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹เชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช† เชตเชพเชœเชฌเซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชœเซ‹ เช‰เชชเชฐเซ‹เช•เซเชค เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, 128 เชฎเชฟเชฒเชฟเชฏเชจ เชคเชคเซเชตเซ‹ เชธเชพเชฅเซ‡เชจเชพ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚, เช†เชชเชฃเซ‡ 0,25 เชจเซเช‚ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชชเชฐเชฟเชฌเชณ เชฐเชพเช–เซ€เช เช›เซ€เช, เชคเซ‹ เช†เชชเชฃเซ‡ เชคเซ‡เชฎเชพเช‚ 32 เชฎเชฟเชฒเชฟเชฏเชจ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชคเชคเซเชตเซ‹ เชฎเซ‚เช•เซ€ เชถเช•เซ€เช เชจเชนเซ€เช‚, เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเชพ 96 เชฎเชฟเชฒเชฟเชฏเชจ เชธเซเชฒเซ‹เชŸเซเชธ เช–เซ‹เชตเชพเชˆ เชœเชถเซ‡ - เชฆเชฐเซ‡เช• เชœเซ‹เชกเซ€ เชฎเชพเชŸเซ‡ 8 เชฌเชพเช‡เชŸเซเชธ , 768 MB เช–เซ‹เชตเชพเชฏเซ‡เชฒเซ€ เชฎเซ‡เชฎเชฐเซ€.

เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เช…เชฎเซ‡ เชตเชฟเชกเชฟเช“ เช•เชพเชฐเซเชก เชฎเซ‡เชฎเชฐเซ€เชจเชพ เชจเซเช•เชถเชพเชจ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เชœเซ‡ เชธเชฟเชธเซเชŸเชฎ เชฎเซ‡เชฎเชฐเซ€ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฎเซ‚เชฒเซเชฏเชตเชพเชจ เชธเช‚เชธเชพเชงเชจ เช›เซ‡. เชœเซ‹ เช•เซ‡ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ เช†เชงเซเชจเชฟเช• เชกเซ‡เชธเซเช•เชŸเซ‹เชช เช—เซเชฐเชพเชซเชฟเช•เซเชธ เช•เชพเชฐเซเชก เช•เซ‡ เชœเซ‡ CUDA เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชฎเชพเช‚ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ 4 GB เชฎเซ‡เชฎเชฐเซ€ เชนเซ‹เชฏ เช›เซ‡ (เชฒเซ‡เช–เชคเซ€ เชตเช–เชคเซ‡, NVIDIA 2080 Ti เชชเชพเชธเซ‡ 11 GB เช›เซ‡), เชคเซ‹ เชชเชฃ เช†เชŸเชฒเซ€ เชฐเช•เชฎ เช—เซเชฎเชพเชตเชตเซ€ เช เชธเซŒเชฅเซ€ เชฌเซเชฆเซเชงเชฟเชถเชพเชณเซ€ เชจเชฟเชฐเซเชฃเชฏ เชจเชฅเซ€.

เชชเชพเช›เชณเชฅเซ€ เชนเซเช‚ เชตเชฟเชกเซ€เชฏเซ‹ เช•เชพเชฐเซเชกเซเชธ เชฎเชพเชŸเซ‡ เชนเซ‡เชถ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ‡ เชตเชงเซ เชฒเช–เซ€เชถ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชŠเช‚เชกเชพเชฃเชจเซ€ เชคเชชเชพเชธ เชธเชพเชฅเซ‡ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€, เชคเซ‡เชฎเชœ เช•เชพเชขเซ€ เชจเชพเช–เซ‡เชฒ เชธเซเชฒเซ‹เชŸเซเชธเชจเซ‹ เชซเชฐเซ€เชฅเซ€ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชคเซ‹.

เชธเชพเช‰เชจเซเชกเชฟเช‚เช— เชŠเช‚เชกเชพเชˆ เชฎเชพเชชเชจ

เช•เซ€เชจเซ€ เชชเซเชฐเซ‹เชฌเชฟเช‚เช— เชกเซ‡เชชเซเชฅ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชคเซ‡เชจเชพ เชตเชพเชธเซเชคเชตเชฟเช• เชŸเซ‡เชฌเชฒ เช‡เชจเซเชกเซ‡เช•เซเชธเชฎเชพเช‚เชฅเซ€ เช•เซ€เชจเซ€ เชนเซ‡เชถ (เชคเซ‡เชจเซ‹ เช†เชฆเชฐเซเชถ เชŸเซ‡เชฌเชฒ เช‡เชจเซเชกเซ‡เช•เซเชธ) เช•เชพเชขเซ€ เชถเช•เซ€เช เช›เซ€เช:

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

เชฌเซ‡เชจเชพ เชฌเซ‡ เชชเซ‚เชฐเช• เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชธเช‚เช–เซเชฏเชพเช“เชจเชพ เชœเชพเชฆเซเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช…เชจเซ‡ เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เชนเซ‡เชถ เช•เซ‹เชทเซเชŸเช•เชจเซ€ เช•เซเชทเชฎเชคเชพ เชฌเซ‡เชจเซ€ เชถเช•เซเชคเชฟ เชฌเซ‡ เช›เซ‡, เช† เช…เชญเชฟเช—เชฎ เชœเซเชฏเชพเชฐเซ‡ เชฎเซเช–เซเชฏ เชธเซ‚เชšเช•เชจเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช–เชธเซ‡เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชชเชฃ เช•เชพเชฐเซเชฏ เช•เชฐเชถเซ‡. เชšเชพเชฒเซ‹ เชเช• เชšเชพเชตเซ€ เชฒเชˆเช เชœเซ‡ 1 เชชเชฐ เชนเซ‡เชถ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชธเซเชฒเซ‹เชŸ 3 เชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเช›เซ€ 4 เช•เซเชทเชฎเชคเชพเชตเชพเชณเชพ เชŸเซ‡เชฌเชฒ เชฎเชพเชŸเซ‡ เช†เชชเชฃเชจเซ‡ เชฎเชณเซ‡ เช›เซ‡. (3 โ€” 1) & 3, เชœเซ‡ 2 เชจเซ€ เชธเชฎเช•เช•เซเชท เช›เซ‡.

เชจเชฟเชทเซเช•เชฐเซเชท

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเซเชฐเชถเซเชจเซ‹ เช…เชฅเชตเชพ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เชนเซ‹เชฏ, เชคเซ‹ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชฎเชจเซ‡ เช‡เชฎเซ‡เช‡เชฒ เช•เชฐเซ‹ Twitter เช…เชฅเชตเชพ เชฎเชพเช‚ เชจเชตเซ‹ เชตเชฟเชทเชฏ เช–เซ‹เชฒเซ‹ เชญเช‚เชกเชพเชฐ.

เช† เช•เซ‹เชก เช‰เชคเซเชคเชฎ เชฒเซ‡เช–เซ‹เชฎเชพเช‚เชฅเซ€ เชชเซเชฐเซ‡เชฐเชฃเชพ เชนเซ‡เช เชณ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹:

เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚, เชนเซเช‚ เชตเชฟเชกเชฟเช“ เช•เชพเชฐเซเชกเซเชธ เชฎเชพเชŸเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเชถเซ‡ เชฒเช–เชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เชถ เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชถ. เชฎเชพเชฐเซ€ เชฏเซ‹เชœเชจเชพเช“เชฎเชพเช‚ GPU เชซเซเชฐเซ‡เชจเซเชกเชฒเซ€ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชฎเชพเช‚ เชเชŸเซ‹เชฎเชฟเช• เช“เชชเชฐเซ‡เชถเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชšเซ‡เช‡เชจเชฟเช‚เช—, เชฐเซ‹เชฌเชฟเชจ เชนเซ‚เชก เชนเซ‡เชถเชฟเช‚เช— เช…เชจเซ‡ เช•เซ‹เชฏเชฒ เชนเซ‡เชถเชฟเช‚เช—เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹