ΠŸΡ€ΠΎΡΡ‚Π° Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π° GPU

ΠŸΡ€ΠΎΡΡ‚Π° Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π° GPU
ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ… Π³ΠΎ Π² Github Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠŸΡ€ΠΎΡΡ‚Π° Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π° GPU.

Π’ΠΎΠ²Π° Π΅ проста Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π° GPU, способна Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° стотици ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ вмъквания Π² сСкунда. На моя Π»Π°ΠΏΡ‚ΠΎΠΏ NVIDIA GTX 1060 ΠΊΠΎΠ΄ΡŠΡ‚ вмъква 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡŽΡ‡-стойност Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 210 ms ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΄Π²ΠΎΠΉΠΊΠΈ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 64 ms.

ВоСст скоростта Π½Π° Π»Π°ΠΏΡ‚ΠΎΠΏ Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ 300 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° вмъквания/сСк ΠΈ 500 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° изтривания/сСк.

Π’Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π΅ написана Π½Π° CUDA, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΡΡŠΡ‰Π°Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ към HLSL ΠΈΠ»ΠΈ GLSL. ВнСдряванСто ΠΈΠΌΠ° няколко ограничСния Π·Π° осигуряванС Π½Π° висока производитСлност Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°:

  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ сС само 32-Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ ΡΡŠΡ‰ΠΈΡ‚Π΅ стойности.
  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠΌΠ° фиксиран Ρ€Π°Π·ΠΌΠ΅Ρ€.
  • И Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ трябва Π΄Π° Π΅ Ρ€Π°Π²Π΅Π½ Π½Π° Π΄Π²Π΅ Π½Π° стСпСн.

Π—Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ стойности трябва Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ прост Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅Π½ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ (Π² горния ΠΊΠΎΠ΄ Ρ‚ΠΎΠ²Π° Π΅ 0xffffffff).

Π₯Сш маса Π±Π΅Π· Π±Ρ€Π°Π²ΠΈ

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎ адрСсиранС с Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ сондиранС, тоСст Ρ‚ΠΎΠ²Π° Π΅ просто масив ΠΎΡ‚ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡŽΡ‡-стойност, ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ ΠΈΠΌΠ° ΠΏΡ€Π΅Π²ΡŠΠ·Ρ…ΠΎΠ΄Π½Π° производитСлност Π½Π° кСша. Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠ°ΠΆΠ΅ Π·Π° Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π°, която Π²ΠΊΠ»ΡŽΡ‡Π²Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» Π² ΡΠ²ΡŠΡ€Π·Π°Π½ списък. Π₯Сш Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π΅ прост масив, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‰ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π΅ стСпСн Π½Π° Π΄Π²Π΅, Π° Π½Π΅ просто число, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π΅Π΄Π½Π° Π±ΡŠΡ€Π·Π° инструкция Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π°, Π·Π° Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ маската pow2/AND, Π½ΠΎ модулният ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±Π°Π²Π΅Π½. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π² случай Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ сондиранС, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π² Π»ΠΈΠ½Π΅ΠΉΠ½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚ Π½Π° слота трябва Π΄Π° бъдС ΠΎΠ±Π²ΠΈΡ‚ във всСки слот. И Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ†Π΅Π½Π°Ρ‚Π° Π½Π° опСрацията сС добавя ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ» във всСки слот.

Π’Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° само ΠΊΠ»ΡŽΡ‡Π° ΠΈ стойността Π·Π° всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚, Π° Π½Π΅ Ρ…Π΅Ρˆ Π½Π° ΠΊΠ»ΡŽΡ‡Π°. Въй ΠΊΠ°Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° само 32-Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, Ρ…Π΅ΡˆΡŠΡ‚ сС изчислява ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡŠΡ€Π·ΠΎ. ΠšΠΎΠ΄ΡŠΡ‚ ΠΏΠΎ-Π³ΠΎΡ€Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ…Π΅ΡˆΠ° Murmur3, ΠΊΠΎΠΉΡ‚ΠΎ изпълнява само няколко смСни, XOR ΠΈ умноТСния.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‰ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ са нСзависими ΠΎΡ‚ Ρ€Π΅Π΄Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. Π”ΠΎΡ€ΠΈ Π°ΠΊΠΎ някои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° запис Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ Ρ€Π΅Π΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΏΠ°ΠΊ Ρ‰Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅. Π©Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ. Π’Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ чудСсно с Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ хиляди нишки Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ΠšΠ»ΡŽΡ‡ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ стойноститС Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° сС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Π·Π° ΠΏΡ€Π°Π·Π½ΠΈ.

ΠšΠΎΠ΄ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½, Π·Π° Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΈ 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 691 ms Π·Π° вмъкванС ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π·Π° освобоТдаванСто ΠΈΠΌ unordered_map (ΠΎΡ‚ΡŠΡ€Π²Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΡ‚Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π²ΡŠΡ‚Ρ€Π΅ unordered_map правят сС мноТСство разпрСдСлСния Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚). чСстно ΠΊΠ°Π·Π°Π½ΠΎ, std:unordered_map напълно Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ограничСния. Π’ΠΎΠ²Π° Π΅ нишка Π·Π° изпълнСниС с Π΅Π΄ΠΈΠ½ процСсор, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΊΠ»ΡŽΡ‡-стойности ΠΎΡ‚ всякакъв Ρ€Π°Π·ΠΌΠ΅Ρ€, прСдставя сС Π΄ΠΎΠ±Ρ€Π΅ ΠΏΡ€ΠΈ високи Π½ΠΈΠ²Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° стабилна производитСлност слСд мноТСство изтривания.

ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π·Π° GPU ΠΈ ΠΌΠ΅ΠΆΠ΄ΡƒΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½Π°Ρ‚Π° комуникация бСшС 984 ms. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΊΠ°Ρ€Π°Π½ΠΎ Π² поставянС Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΉ (разпрСдСлянС Π½Π° 1 GB ΠΏΠ°ΠΌΠ΅Ρ‚ Π΅Π΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΡ‚Π½Π΅ΠΌΠ° извСстно Π²Ρ€Π΅ΠΌΠ΅ Π² CUDA), вмъкванС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ Π²ΡŠΡ€Ρ…Ρƒ тях. Всички копия към ΠΈ ΠΎΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π° ΡΡŠΡ‰ΠΎ сС Π²Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄.

Π—Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° самата Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΎΡ‚Π½Π΅ 271 ms. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΊΠ°Ρ€Π°Π½ΠΎ ΠΎΡ‚ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π° Π·Π° вмъкванС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ, ΠΈ Π½Π΅ Π²Π·Π΅ΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΊΠ°Ρ€Π°Π½ΠΎ Π·Π° ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. Ако GPU Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΆΠΈΠ²Π΅Π΅ дълго Π²Ρ€Π΅ΠΌΠ΅ ΠΈΠ»ΠΈ Π°ΠΊΠΎ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° сС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° изцяло Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° създаванС Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°, която Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ GPU ΠΊΠΎΠ΄, Π° Π½Π΅ ΠΎΡ‚ цСнтралния процСсор), Ρ‚ΠΎΠ³Π°Π²Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ тСста Π΅ умСстСн.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π° дСмонстрира висока производитСлност ΠΏΠΎΡ€Π°Π΄ΠΈ висока пропускатСлна способност ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ

АрхитСктурата Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠΌΠ° няколко ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅:

  • Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ сондиранС Π΅ Π²ΡŠΠ·ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²Π°Π½ΠΎ ΠΎΡ‚ Π³Ρ€ΡƒΠΏΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠ°Ρ€Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅Ρ‚Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ поставСни ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ ΠΈΠ΄Π΅Π°Π»Π½ΠΎ.
  • ΠšΠ»ΡŽΡ‡ΠΎΠ²Π΅Ρ‚Π΅ Π½Π΅ сС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Ρ‚ Ρ‡Ρ€Π΅Π· функцията delete ΠΈ с Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π°Ρ‚Ρ€ΡƒΠΏΠ²Π°Ρ‚ масата.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° производитСлността Π½Π° Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ постСпСнно Π΄Π° сС влоши, особСно Π°ΠΊΠΎ тя ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° дълго Π²Ρ€Π΅ΠΌΠ΅ ΠΈ ΠΈΠΌΠ° мноТСство вмъквания ΠΈ изтривания. Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° смСкчаванС Π½Π° Ρ‚Π΅Π·ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ…Π΅ΡˆΠΈΡ€Π°Π½Π΅ Π² Π½ΠΎΠ²Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° с доста ниска стСпСн Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ…Π΅ΡˆΠΈΡ€Π°Π½Π΅.

Π—Π° Π΄Π° ΠΈΠ»ΡŽΡΡ‚Ρ€ΠΈΡ€Π°ΠΌ описанитС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ горния ΠΊΠΎΠ΄, Π·Π° Π΄Π° създам Ρ‚Π°Π±Π»ΠΈΡ†Π° със 128 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π° ΠΏΡ€Π΅Π· 4 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ запълня 124 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° слота (ΠΊΠΎΠ΅Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΡ‚ ΠΎΠΊΠΎΠ»ΠΎ 0,96). Π•Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° с Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ, всСки Ρ€Π΅Π΄ Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ядрото Π½Π° CUDA Π·Π° вмъкванС Π½Π° 4 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π½ΠΎΠ²ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π² Π΅Π΄Π½Π° Ρ…Π΅Ρˆ Ρ‚Π°Π±Π»ΠΈΡ†Π°:

Π‘Ρ‚Π΅ΠΏΠ΅Π½ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚ Π½Π° вмъкванС 4 194 304 Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€