
ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ
Π³ΠΎ Π² Github .
Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ° Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π·Π° GPU, ΡΠΏΠΎΡΠΎΠ±Π½Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ° ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ Ρ NVIDIA GTX 1060 ΠΊΠΎΠ΄ΡΡ Π²ΠΌΡΠΊΠ²Π° 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 210 ΠΌΡ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΄Π²ΠΎΠΉΠΊΠΈ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 64 ΠΌΡ.
Π’Π°ΠΊΠ° ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π»Π°ΠΏΡΠΎΠΏΠ° Π΅ ΠΎΠΊΠΎΠ»ΠΎ 300 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ ΠΈ 500 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ.
Π’Π°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° CUDA, Π½ΠΎ ΡΡΡΠ°ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΈ Π·Π° HLSL ΠΈΠ»ΠΈ GLSL. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠΈ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ°:
- ΠΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ΅ ΡΠ°ΠΌΠΎ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΡΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
- Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° ΡΠΈΠΊΡΠΈΡΠ°Π½ ΡΠ°Π·ΠΌΠ΅Ρ.
- Π ΡΠΎΠ·ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π²Π΅Π½ Π½Π° Π΄Π²Π΅ Π½Π° ΡΡΠ΅ΠΏΠ΅Π½.
ΠΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ° ΠΏΡΠΎΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π» (Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡ ΠΊΠΎΠ΄ ΡΠΎΠ²Π° Π΅ 0xffffffff).
Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
Π Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΡ Ρ , ΡΠΎΠ΅ΡΡ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΈΠΌΠ° ΠΎΡΠ»ΠΈΡΠ½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΊΠ΅ΡΠ°. Π’ΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠ°ΠΆΠ΅ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π² Π²Π΅ΡΠΈΠ³Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π² ΡΠ²ΡΡΠ·Π°Π½ ΡΠΏΠΈΡΡΠΊ. Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ ΠΏΡΠΎΡΡ ΠΌΠ°ΡΠΈΠ², ΠΊΠΎΠΉΡΠΎ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ KeyValue:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
Π Π°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° Π΄Π²Π΅, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΈΡΠ»ΠΎ, Π·Π°ΡΠΎΡΠΎ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° pow2/AND-ΠΌΠ°ΡΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° Π±ΡΡΠ·Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ ΠΌΠΎΠ΄ΡΠ» ΡΠ°Π±ΠΎΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ Π·ΠΎΠ½Π΄ΠΈΡΠ²Π°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΡΡ Π½Π° ΡΠ»ΠΎΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±Π²ΠΈΡ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΠΎΡ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΡΠ°Π·Ρ ΠΎΠ΄ΡΡ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ» Π·Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΠΎΡ.
Π’Π°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ ΠΊΠ»ΡΡ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, Π° Π½Π΅ Ρ ΡΡ Π½Π° ΠΊΠ»ΡΡΠ°. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅, Ρ ΡΡΡΡ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ·ΠΎ. Π ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡ ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ ΡΡ Murmur3, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΌΠ΅Π½ΠΈ, XOR-ΠΎΠ²Π΅ ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ.
Π Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠΉΡΠΎ Π½Π΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠ΅Π΄Π° Π½Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΎΡΠΈ Π°ΠΊΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π·Π°ΠΏΠΈΡ Π½Π°ΡΡΡΠ°Π²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΡΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. ΠΠ΅ΡΠΎΠ΄ΠΈΠΊΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎ Ρ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈ, Π² ΠΊΠΎΠΈΡΠΎ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Ρ ΠΈΠ»ΡΠ΄ΠΈ ΠΏΠΎΡΠΎΡΠΈ.
ΠΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π² Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΊΠ°ΡΠΎ ΠΏΡΠ°Π·Π½ΠΈ.
ΠΠΎΠ΄ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½, Π·Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΠΈ 64-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π°ΡΠΎΠΌΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, Π·Π°ΠΏΠΈΡ ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΡΠ°Π·ΠΌΡΠ½Π° (compare-and-swap). Π Π·Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠ° Π½ΡΠΆΠ½ΠΈ Π°ΡΠΎΠΌΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π² 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() Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠΎΡΡ (plain) ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ² (volatile) ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π½Π° ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ Π² Ρ
Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°. ΡΠ²ΡΡΠ΄ΠΈ, ΡΠ΅:
ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ ΠΏΠΎ ΡΠ²ΠΎΠ΅ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π΄Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ Π² Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρβ¦ Π’Π΅Π·ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»ΡΡΠΎΠ²ΠΎΡΠΎ ΡΠ»ΠΎΠ²ΠΎ
volatile: β¦ Π²ΡΡΠΊΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π² ΡΠ΅Π°Π»Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°.
Π‘ΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π·Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° volatile. ΠΠΊΠΎ ΠΏΠΎΡΠΎΠΊΡΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ ΠΏΠΎ-ΡΠ°Π½Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½Π΅, ΡΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΎΡΡΠ°ΡΡΠ»Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ, ΡΠΎΠ²Π° Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Ρ
Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½Π°ΠΉ-Π°ΠΊΡΡΠ°Π»Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π» volatile, Π½ΠΎ ΡΠΎΠ³Π°Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°: ΠΏΠΎ ΠΌΠΎΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΏΡΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° 32 ΠΌΠ»Π½. Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π°ΠΌΠ°Π»Ρ ΠΎΡ 500 ΠΌΠ»Π½. ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ Π΄ΠΎ 450 ΠΌΠ»Π½. ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ.
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ
Π ΡΠ΅ΡΡΠ° Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π½Π° 64 ΠΌΠ»Π½. Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° 32 ΠΌΠ»Π½. ΠΎΡ ΡΡΡ
, ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ std::unordered_map ΠΈ Ρ
Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π·Π° GPU ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΡΡΡΠ²Π°:

std::unordered_map ΠΏΠΎΠΏΡΠ°Π²ΠΈ 70 691 ΠΌΡ Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° unordered_map (ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΡΠ½Π΅ΠΌΠ° Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° unordered_map ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ±ΡΠΎΠΉΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π·Π°Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ). Π§Π΅ΡΡΠ½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π·Π° std::unordered_map Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. Π’ΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ ΠΏΠΎΡΠΎΠΊ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° CPU, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅-ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ, Π΄ΠΎΠ±ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΈ Π²ΠΈΡΠΎΠΊΠΈ ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠΈ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠ»Π΅Π΄ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½ΠΈΡ.
ΠΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π·Π° GPU ΠΈ ΠΌΠ΅ΠΆΠ΄ΡΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΎΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±Π΅ΡΠ΅ 984 ΠΌΡ. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ (Π΅Π΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π·Π°Π΄Π΅Π»ΡΠ½Π΅ Π½Π° 1 ΠΠ ΠΏΠ°ΠΌΠ΅Ρ, ΠΊΠΎΠ΅ΡΠΎ Π² CUDA ΠΎΡΠ½Π΅ΠΌΠ° Π²ΡΠ΅ΠΌΠ΅), Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΡ Π½ΠΎΡΠΎ ΠΈΡΠ΅ΡΠΈΡΠ°Π½Π΅. ΠΠΊΠ»ΡΡΠ΅Π½ΠΈ ΡΠ° ΡΡΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΏΠΈΡ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΈΠ·Π²ΡΠ½ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ°.
Π Π°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠ°ΠΌΠ°ΡΠ° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΡΠ½Π΅ 271 ΠΌΡ. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ° Π΅ ΠΏΠΎΡ Π°ΡΡΠΈΠ»Π° Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΠΈ Π½Π΅ Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΈΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠΊΠΎ 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 ΠΠ± Π·Π°Π³ΡΠ±Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ.
ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΡΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° Π·Π°Π³ΡΠ±Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎ-ΡΠ΅Π½Π΅Π½ ΡΠ΅ΡΡΡΡ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π½Π°ΡΡΠΎΠ»Π½ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠΈ CUDA, ΠΈΠΌΠ°Ρ Π½Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ 4 ΠΠ± ΠΏΠ°ΠΌΠ΅Ρ (ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° NVIDIA 2080 Ti ΠΈΠΌΠ° 11 ΠΠ±), Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° Π·Π°Π³ΡΠ±Π°ΡΠ° Π½Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΠ΅Ρ Π½Π΅ Π±ΠΈ Π±ΠΈΠ»Π° Π½Π°ΠΉ-ΠΌΡΠ΄ΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠΎ-ΠΊΡΡΠ½ΠΎ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½ΡΠΌΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΡΠΈΡΠΈ ΡΠ»ΠΎΡΠΎΠ²Π΅.
ΠΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠ° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΠΊΠ»ΡΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ Ρ Π΅ΡΠ° Π½Π° ΠΊΠ»ΡΡΠ° (Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°) ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ:
// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);
ΠΠ°ΡΠ°Π΄ΠΈ ΠΌΠ°Π³ΠΈΡΡΠ° Π½Π° Π΄Π²Π΅ΡΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΠΈ ΡΠΈΡΠ»Π° Π² Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΡ ΠΊΠΎΠ΄ ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅ΡΡΡ Π½Π° Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ ΡΠ°Π²Π΅Π½ Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΠΈΡΠ»ΠΎ Π½Π° ΡΡΠ΅ΠΏΠ΅Π½, ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΡΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡΡ Π½Π° ΠΊΠ»ΡΡΠ° ΡΠ΅ ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΠΈ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. ΠΠ΅ΠΊΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΊΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Ρ
Π΅ΡΠΈΡΠ° Π² 1, Π½ΠΎ Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ Π² ΡΠ»ΠΎΡ 3. Π’ΠΎΠ³Π°Π²Π° Π·Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅Ρ 4 ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ (3 β 1) & 3, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΡΠ°Π²Π½ΠΎ Π½Π° 2.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΌΠΈ Π½Π° ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ Π½ΠΎΠ²Π° ΡΠ΅ΠΌΠ° Π².
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π²Π΄ΡΡ Π½ΠΎΠ²Π΅Π½ ΠΎΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈ ΡΡΠ°ΡΠΈΠΈ:
Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ° Π΄Π° ΠΏΠΈΡΠ° Π·Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ ΠΈ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌ ΡΡΡ
Π½Π°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. Π ΠΏΠ»Π°Π½ΠΎΠ²Π΅ΡΠ΅ ΠΌΠΈ Π΅ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π² Π²Π΅ΡΠΈΠ³Π°, Ρ
Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π ΠΎΠ±ΠΈΠ½ Π₯ΡΠ΄ ΠΈ Ρ
Π΅ΡΠΈΡΠ°Π½Π΅ Ρ ΠΊΡΠΊΡΠ²ΠΈΡΠ° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΡΡΡΠΊΡΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
