GPU์šฉ ๋‹จ์ˆœ ํ•ด์‹œ ํ…Œ์ด๋ธ”

GPU์šฉ ๋‹จ์ˆœ ํ•ด์‹œ ํ…Œ์ด๋ธ”
Github์— ์˜ฌ๋ ธ์–ด์š” ์ƒˆ ํ”„๋กœ์ ํŠธ ๊ฐ„๋‹จํ•œ GPU ํ•ด์‹œ ํ…Œ์ด๋ธ”.

์ดˆ๋‹น ์ˆ˜์–ต ๊ฐœ์˜ ์‚ฝ์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ GPU ํ•ด์‹œ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๋‚ด NVIDIA GTX 1060 ๋…ธํŠธ๋ถ์—์„œ ์ฝ”๋“œ๋Š” ์•ฝ 64ms ์•ˆ์— ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋œ 210๋งŒ ๊ฐœ์˜ ํ‚ค-๊ฐ’ ์Œ์„ ์‚ฝ์ž…ํ•˜๊ณ  ์•ฝ 32ms ์•ˆ์— 64๋งŒ ์Œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋žฉํƒ‘์˜ ์†๋„๋Š” ์ดˆ๋‹น ์‚ฝ์ž… 300์–ต ํšŒ, ์‚ญ์ œ 500์–ต ํšŒ/์ดˆ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์€ CUDA๋กœ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ HLSL์ด๋‚˜ GLSL์—๋„ ๋™์ผํ•œ ๊ธฐ์ˆ ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์—๋Š” ๋น„๋””์˜ค ์นด๋“œ์˜ ๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • 32๋น„ํŠธ ํ‚ค์™€ ๋™์ผํ•œ ๊ฐ’๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ํฌ๊ธฐ๋Š” XNUMX์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์™€ ๊ฐ’์˜ ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์œ„ ์ฝ”๋“œ์—์„œ๋Š” 0xffffffff์ž„).

์ž ๊ธˆ์ด ์—†๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐฉํ˜• ์ฃผ์†Œ ์ง€์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜• ํ”„๋กœ๋น™์ฆ‰, ๋‹จ์ˆœํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  ์šฐ์ˆ˜ํ•œ ์บ์‹œ ์„ฑ๋Šฅ์„ ๊ฐ–๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๋ชฉ๋ก์—์„œ ํฌ์ธํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์—ฐ๊ฒฐ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋น ๋ฅธ ๋ช…๋ น์–ด๋กœ powXNUMX/AND ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋ชจ๋“ˆ๋Ÿฌ์Šค ์—ฐ์‚ฐ์ž๋Š” ํ›จ์”ฌ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ ํ˜• ํ”„๋กœ๋น™์˜ ๊ฒฝ์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜• ํ…Œ์ด๋ธ” ์กฐํšŒ์—์„œ๋Š” ์Šฌ๋กฏ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ ์Šฌ๋กฏ์— ๋ž˜ํ•‘๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ž‘์—… ๋น„์šฉ์€ ๊ฐ ์Šฌ๋กฏ์— ๋ชจ๋“ˆ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์—๋Š” ํ‚ค์˜ ํ•ด์‹œ๊ฐ€ ์•„๋‹Œ ๊ฐ ์š”์†Œ์˜ ํ‚ค์™€ ๊ฐ’๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์—๋Š” 32๋น„ํŠธ ํ‚ค๋งŒ ์ €์žฅ๋˜๋ฏ€๋กœ ํ•ด์‹œ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ช‡ ๋ฒˆ์˜ ๊ต๋Œ€, XOR ๋ฐ ๊ณฑ์…ˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” Murmur3 ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•œ ์ž ๊ธˆ ๋ณดํ˜ธ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์“ฐ๊ธฐ ์ž‘์—…์ด ๋‹ค๋ฅธ ์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ๋ฐฉํ•ดํ•˜๋”๋ผ๋„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์ˆ˜์ฒœ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๋น„๋””์˜ค ์นด๋“œ์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ‚ค์™€ ๊ฐ’์€ ๋น„์–ด ์žˆ๋„๋ก ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

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์–ต XNUMX์ฒœ๋งŒ ์‚ญ์ œ๋กœ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

ะŸั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ

64๋งŒ๊ฐœ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  32๋งŒ๊ฐœ๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ…Œ์ŠคํŠธ์—์„œ std::unordered_map GPU์—๋Š” ์‚ฌ์‹ค์ƒ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค.

GPU์šฉ ๋‹จ์ˆœ ํ•ด์‹œ ํ…Œ์ด๋ธ”
std::unordered_map ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ œ๊ฑฐํ•œ ํ›„ ํ•ด์ œํ•˜๋Š” ๋ฐ 70ms๊ฐ€ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. unordered_map (์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ๋Š” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. unordered_map ๋‹ค์ค‘ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค). ์†”์งํžˆ ๋งํ•˜์ž๋ฉด, std:unordered_map ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ œํ•œ ์‚ฌํ•ญ. ๋‹จ์ผ CPU ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋กœ, ๋ชจ๋“  ํฌ๊ธฐ์˜ ํ‚ค-๊ฐ’์„ ์ง€์›ํ•˜๊ณ , ๋†’์€ ํ™œ์šฉ๋ฅ ์—์„œ๋„ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ญ์ œ ํ›„์—๋„ ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

GPU ๋ฐ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ง€์† ์‹œ๊ฐ„์€ 984ms์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„(ํ•œ ๋ฒˆ์— 1GB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐ CUDA์—์„œ๋Š” ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ), ์š”์†Œ๋ฅผ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œํ•˜๊ณ  ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋น„๋””์˜ค ์นด๋“œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ๋ณต์‚ฌ๋ณธ๋„ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ž์ฒด๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ 271ms๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋น„๋””์˜ค ์นด๋“œ์—์„œ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์ด ํฌํ•จ๋˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GPU ํ…Œ์ด๋ธ”์ด ์˜ค๋žซ๋™์•ˆ ์ง€์†๋˜๊ฑฐ๋‚˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๋น„๋””์˜ค ์นด๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์™„์ „ํžˆ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ค‘์•™ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ GPU ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ) ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋””์˜ค ์นด๋“œ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ํ™œ์„ฑ ๋ณ‘๋ ฌํ™”๋กœ ์ธํ•ด ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ œํ•œ

ํ•ด์‹œ ํ…Œ์ด๋ธ” ์•„ํ‚คํ…์ฒ˜์—๋Š” ์•Œ์•„์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„ ํ˜• ํ”„๋กœ๋น™์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง์œผ๋กœ ์ธํ•ด ๋ฐฉํ•ด๋ฅผ ๋ฐ›์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ํ…Œ์ด๋ธ”์˜ ํ‚ค๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๊ฒŒ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด๋„ ํ‚ค๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. delete ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์ด ์–ด์ˆ˜์„ ํ•ด์ง‘๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์€ ์ ์ฐจ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ค๋žซ๋™์•ˆ ์กด์žฌํ•˜๊ณ  ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ์™„ํ™”ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํ™œ์šฉ๋ฅ ์ด ์ƒ๋‹นํžˆ ๋‚ฎ์€ ์ƒˆ ํ…Œ์ด๋ธ”๋กœ ๋‹ค์‹œ ํ•ด์‹œํ•˜๊ณ  ๋‹ค์‹œ ํ•ด์‹œ ์ค‘์— ์ œ๊ฑฐ๋œ ํ‚ค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค๋ช…๋œ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 128์–ต 4์ฒœ 124๋ฐฑ๋งŒ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  0,96์–ต 4์ฒœ XNUMX๋ฐฑ๋งŒ ๊ฐœ์˜ ์Šฌ๋กฏ์„ ์ฑ„์šธ ๋•Œ๊นŒ์ง€ XNUMX๋ฐฑ๋งŒ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ๋ฅ  ์•ฝ XNUMX). ๋‹ค์Œ์€ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๊ฐ ํ–‰์€ ํ•˜๋‚˜์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— XNUMX๋งŒ ๊ฐœ์˜ ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” CUDA ์ปค๋„ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

์ด์šฉ๋ฅ 
์‚ฝ์ž… ๊ธฐ๊ฐ„ 4๊ฐœ ์š”์†Œ

0,00
11,608448ms(361,314798์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,03
11,751424ms(356,918799์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,06
11,942592ms(351,205515์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,09
12,081120ms(347,178429์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,12
12,242560ms(342,600233์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,16
12,396448ms(338,347235์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,19
12,533024ms(334,660176์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,22
12,703328ms(330,173626์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,25
12,884512ms(325,530693์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,28
13,033472ms(321,810182์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,31
13,239296ms(316,807174์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,34
13,392448ms(313,184256์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,37
13,624000ms(307,861434์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,41
13,875520ms(302,280855์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,44
14,126528ms(296,909756์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,47
14,399328ms(291,284699์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,50
14,690304ms(285,515123์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,53
15,039136ms(278,892623์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,56
15,478656ms(270,973402์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,59
15,985664ms(262,379092์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,62
16,668673ms(251,627968์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,66
17,587200ms(238,486174์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,69
18,690048ms(224,413765์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,72
20,278816ms(206,831789์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,75
22,545408ms(186,038058์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,78
26,053312ms(160,989275์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,81
31,895008ms(131,503463์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,84
42,103294ms(99,619378์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,87
61,849056ms(67,815164์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,90
105,695999ms(39,682713์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

0,94
240,204636ms(17,461378์–ตXNUMX๋งŒXNUMX๋งŒ ํ‚ค/์ดˆ)

ํ™œ์šฉ๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ…Œ์ด๋ธ”์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ ๋‹ค์Œ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ฑ…์˜ ๋‹จ์–ด ์ˆ˜๋ฅผ ์…€ ๋•Œ) ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜๋ช…์ด ๊ธด ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ณด๋ฅผ ์ž์ฃผ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ์ด๋ฏธ์ง€์˜ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ž˜ํ”ฝ ํŽธ์ง‘๊ธฐ์—์„œ) ์ด ๋™์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  64๋งŒ ๊ฐœ์˜ ์‚ฝ์ž… ํ›„ ํ•ด์‹œ ํ…Œ์ด๋ธ” ํƒ์ƒ‰ ๊นŠ์ด๋ฅผ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(ํ™œ์šฉ๋ฅ  0,5). ํ‰๊ท  ๊นŠ์ด๋Š” 0,4774์ด๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ํ‚ค๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ข‹์€ ์Šฌ๋กฏ์— ์žˆ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ข‹์€ ์œ„์น˜์—์„œ ํ•œ ์Šฌ๋กฏ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์†Œ๋ฆฌ ๊นŠ์ด๋Š” 60์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ 124์–ต 0,97๋งŒ ๊ฐœ์˜ ์ธ์„œํŠธ(์ด์šฉ๋ฅ  10,1757)๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์—์„œ ํ”„๋กœ๋น™ ๊นŠ์ด๋ฅผ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‰๊ท  ๊นŠ์ด๋Š” ์ด๋ฏธ XNUMX์ด์—ˆ๊ณ  ์ตœ๋Œ€๊ฐ’์€ - 6474 (!!). ์„ ํ˜• ๊ฐ์ง€ ์„ฑ๋Šฅ์€ ํ™œ์šฉ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ํฌ๊ฒŒ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

์ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ™œ์šฉ๋ฅ ์„ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ํฌ์ƒํ•˜๋ฉด์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ 32๋น„ํŠธ ํ‚ค์™€ ๊ฐ’์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์ด ์ •๋‹นํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ 128์–ต 0,25๋งŒ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์—์„œ ํ™œ์šฉ๋ฅ ์„ 32๋กœ ์œ ์ง€ํ•˜๋ฉด 96๋งŒ ๊ฐœ ์ดํ•˜์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜๋จธ์ง€ 8๋งŒ ๊ฐœ์˜ ์Šฌ๋กฏ์€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค(๊ฐ ์Œ๋‹น 768๋ฐ”์ดํŠธ). , XNUMXMB์˜ ๋ฉ”๋ชจ๋ฆฌ ์†์‹ค.

์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๊ท€์ค‘ํ•œ ๋ฆฌ์†Œ์Šค์ธ ๋น„๋””์˜ค ์นด๋“œ ๋ฉ”๋ชจ๋ฆฌ ์†์‹ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. CUDA๋ฅผ ์ง€์›ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ฐ์Šคํฌํ†ฑ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ์—๋Š” ์ตœ์†Œ 4GB์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ(์ž‘์„ฑ ๋‹น์‹œ NVIDIA 2080 Ti์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” 11GB), ๊ทธ๋Ÿฌํ•œ ์–‘์„ ์žƒ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€์žฅ ํ˜„๋ช…ํ•œ ๊ฒฐ์ •์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ํ”„๋กœ๋น™ ๊นŠ์ด์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๋น„๋””์˜ค ์นด๋“œ์šฉ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‚ญ์ œ๋œ ์Šฌ๋กฏ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์†Œ๋ฆฌ ๊นŠ์ด ์ธก์ •

ํ‚ค์˜ ๊ฒ€์ƒ‰ ๊นŠ์ด๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค์—์„œ ํ‚ค์˜ ํ•ด์‹œ(์ด์ƒ์ ์ธ ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค)๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

1์˜ 3์˜ ๋ณด์ˆ˜ ์ด์ง„์ˆ˜์˜ ๋งˆ๋ฒ•๊ณผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์šฉ๋Ÿ‰์ด 4์˜ XNUMX์ œ๊ณฑ์ด๋ผ๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ‚ค ์ธ๋ฑ์Šค๊ฐ€ ํ…Œ์ด๋ธ”์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. XNUMX๋กœ ํ•ด์‹œ๋˜์—ˆ์ง€๋งŒ ์Šฌ๋กฏ XNUMX์— ์‚ฝ์ž…๋œ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฉ๋Ÿ‰์ด XNUMX์ธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค. (3 โ€” 1) & 3, ์ด๋Š” 2์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์งˆ๋ฌธ์ด๋‚˜ ์˜๊ฒฌ์ด ์žˆ์œผ์‹œ๋ฉด ์ €์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ํŠธ์œ„ํ„ฐ ๋˜๋Š” ๋‹ค์Œ์—์„œ ์ƒˆ ์ฃผ์ œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ.

์ด ์ฝ”๋“œ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ๋„ ๋น„๋””์˜ค ์นด๋“œ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ธ€์„ ์“ฐ๊ณ  ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ณ„ํš์—๋Š” GPU ์นœํ™”์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์›์ž ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•œ ์ฒด์ด๋‹, ๋กœ๋นˆํ›„๋“œ ํ•ด์‹ฑ, ๋ป๊พธ๊ธฐ ํ•ด์‹ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€