Едноставна Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»Π° Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор

Едноставна Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»Π° Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор
Π“ΠΎ објавив Π½Π° Github Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Едноставна Ρ…Π΅Ρˆ Ρ‚Π°Π±Π΅Π»Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор.

Π’ΠΎΠ° Π΅ Сдноставна Ρ‚Π°Π±Π΅Π»Π° Π·Π° Ρ…Π°Ρˆ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор способна Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° стотици ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ инсСрти Π²ΠΎ сСкунда. На ΠΌΠΎΡ˜ΠΎΡ‚ Π»Π°ΠΏΡ‚ΠΎΠΏ 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() ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΏΠ°Ρ€ΠΎΠ²ΠΈ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ, сСкој ΠΏΠ°Ρ€ Π²ΠΎ посСбна нишка Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор:

// 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 ms Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΈ ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ ΠΏΠΎΡ‚ΠΎΠ° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΈ unordered_map (Π΄Π° сС ослободимС ΠΎΠ΄ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅, бидСјќи Π²Π½Π°Ρ‚Ρ€Π΅ unordered_map сС ΠΏΡ€Π°Π²Π°Ρ‚ повСќС мСмориски распрСдСлби). Π˜ΡΠΊΡ€Π΅Π½ΠΎ ΠΊΠ°ΠΆΠ°Π½ΠΎ, std:unordered_map сосСма Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°. Π’ΠΎΠ° Π΅ Π΅Π΄Π½Π° нишка Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° процСсорот, ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° ΠΊΠ»ΡƒΡ‡Π½ΠΈ врСдности ΠΎΠ΄ која Π±ΠΈΠ»ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°, Π΄ΠΎΠ±Ρ€ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΏΡ€ΠΈ високи стапки Π½Π° искористСност ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° стабилни пСрформанси ΠΏΠΎ ΠΏΠΎΠ²Π΅ΡœΠ΅ΠΊΡ€Π°Ρ‚Π½ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ°.

Π’Ρ€Π΅ΠΌΠ΅Ρ‚Ρ€Π°Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ…Π°Ρˆ-Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор ΠΈ ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΌΠ΅Ρ“Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ бСшС 984 ms. Ова Π³ΠΎ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΠΎ Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΠΈ нСјзино Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ (ΠΎΠ΄Π²ΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ 1 GB ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π΅Π΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π·Π° ΡˆΡ‚ΠΎ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ извСсно Π²Ρ€Π΅ΠΌΠ΅ Π²ΠΎ CUDA), Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ΅ Π½Π°Π΄ Π½ΠΈΠ². Π‘Π΅ Π·Π΅ΠΌΠ°Π°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ΠΈ ситС ΠΊΠΎΠΏΠΈΠΈ Π΄ΠΎ ΠΈ ΠΎΠ΄ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ°Ρ‚Π°.

На самата Ρ…Π°Ρˆ-Ρ‚Π°Π±Π΅Π»Π° ΠΈ Π±Π΅Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ 271 ms Π·Π° Π΄Π° сС ΠΊΠΎΠΌΠΏΠ»Π΅Ρ‚ΠΈΡ€Π°. Ова Π³ΠΎ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΠΎ ΠΎΠ΄ Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ°Ρ‚Π° Π·Π° Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ Π½Π΅ Π³ΠΎ Π·Π΅ΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΠΎ Π·Π° ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ΅ ΠΏΡ€Π΅ΠΊΡƒ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° Ρ‚Π°Π±Π΅Π»Π°. Ако Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор ΠΆΠΈΠ²Π΅Π΅ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅, ΠΈΠ»ΠΈ Π°ΠΊΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π·Π° Ρ…Π°Ρˆ Π΅ цСлосно содрТана Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ°Ρ‚Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° сС создадС Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»Π° ΡˆΡ‚ΠΎ ќС сС користи ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ ΠΊΠΎΠ΄ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор, Π° Π½Π΅ ΠΎΠ΄ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»Π½ΠΈΠΎΡ‚ процСсор), Ρ‚ΠΎΠ³Π°Ρˆ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ ΠΎΠ΄ тСстот Π΅ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π΅Π½.

Π’Π°Π±Π΅Π»Π°Ρ‚Π° Π·Π° Ρ…Π°Ρˆ Π·Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° високи пСрформанси ΠΏΠΎΡ€Π°Π΄ΠΈ високата пропусност ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°

АрхитСктурата Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»Π° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π·Π° ΠΊΠΎΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π·Π½Π°Π΅:

  • Π›ΠΈΠ½Π΅Π°Ρ€Π½ΠΎΡ‚ΠΎ ΡΠΎΠ½Π΄ΠΈΡ€Π°ΡšΠ΅ Π΅ ΠΏΠΎΠΏΡ€Π΅Ρ‡Π΅Π½ΠΎ ΠΎΠ΄ Π³Ρ€ΡƒΠΏΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ, ΡˆΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π° ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈΡ‚Π΅ Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ поставСни ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ ΠΎΠ΄ ΡΠΎΠ²Ρ€ΡˆΠ΅Π½ΠΎ.
  • ΠšΠΎΠΏΡ‡ΠΈΡšΠ°Ρ‚Π° Π½Π΅ сС отстрануваат со помош Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° delete ΠΈ со Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ја Π½Π°Ρ‚Ρ€ΡƒΠΏΡƒΠ²Π°Π°Ρ‚ масата.

Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, пСрформанситС Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»Π° ΠΌΠΎΠΆΠ΅ постСпСно Π΄Π° сС Π²Π»ΠΎΡˆΡƒΠ²Π°Π°Ρ‚, особСно Π°ΠΊΠΎ постои Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ ΠΈΠΌΠ° Π±Ρ€ΠΎΡ˜Π½ΠΈ Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ° ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ°. Π•Π΄Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС ΡƒΠ±Π»Π°ΠΆΠ°Ρ‚ ΠΎΠ²ΠΈΠ΅ нСдостатоци Π΅ Π΄Π° сС прСиспита Π²ΠΎ Π½ΠΎΠ²Π° Ρ‚Π°Π±Π΅Π»Π° со ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ниска стапка Π½Π° искористСност ΠΈ Π΄Π° сС Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π°Ρ‚ отстранСтитС ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅.

Π—Π° Π΄Π° Π³ΠΈ илустрирам ΠΎΠΏΠΈΡˆΠ°Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ќС Π³ΠΎ користам Π³ΠΎΡ€Π΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° Π΄Π° создадам Ρ‚Π°Π±Π΅Π»Π° со 128 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ Π΄Π° Π²Ρ€Ρ‚Π°ΠΌ Π½ΠΈΠ· 4 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠΏΠΎΠ»Π½Π°ΠΌ 124 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ слотови (стапка Π½Π° искористСност ΠΎΠ΄ ΠΎΠΊΠΎΠ»Ρƒ 0,96). Π•Π²Π΅ ја Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° со Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ, сСкој Ρ€Π΅Π΄ Π΅ ΠΏΠΎΠ²ΠΈΠΊ Π½Π° CUDA ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π·Π° Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ 4 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π½ΠΎΠ²ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π²ΠΎ Π΅Π΄Π½Π° Ρ…Π°Ρˆ Ρ‚Π°Π±Π΅Π»Π°:

Π‘Ρ‚Π°ΠΏΠΊΠ° Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅
Π’Ρ€Π΅ΠΌΠ΅Ρ‚Ρ€Π°Π΅ΡšΠ΅ Π½Π° Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ 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 ΠΈΠ»ΠΈ ΠΎΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ Π½ΠΎΠ²Π° Ρ‚Π΅ΠΌΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π°.

Овој ΠΊΠΎΠ΄ Π΅ напишан ΠΏΠΎΠ΄ ΠΈΠ½ΡΠΏΠΈΡ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ ΠΎΠ΄Π»ΠΈΡ‡Π½ΠΈ статии:

Π’ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°, ќС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΌ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°ΠΌ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π΅Π»ΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠΈ ΠΈ Π΄Π° Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ пСрформанси. ΠœΠΎΠΈΡ‚Π΅ ΠΏΠ»Π°Π½ΠΎΠ²ΠΈ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ со ΡΠΈΠ½ΡŸΠΈΡ€ΠΈ, Ρ…Π΅ΡˆΠΈΡ€Π°ΡšΠ΅ Π½Π° Π ΠΎΠ±ΠΈΠ½ Π₯ΡƒΠ΄ ΠΈ Ρ…Π°ΡˆΠΈΡ€Π°ΡšΠ΅ со ΠΊΡƒΠΊΠ°Π²ΠΈΡ†ΠΈ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° атомски ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎ структури Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΠΈ сС ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΡΠΊΠΈ Π·Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€