ΠΠΎ ΠΎΠ±ΡΠ°Π²ΠΈΠ² Π½Π° 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-Π±ΠΈΡΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΡΠ΅ Π°ΡΠΎΠΌΡΠΊΠΈ ΡΓ¨ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ΅ ΠΏΡΠΈΡΠΎΠ΄Π½ΠΎ ΠΏΠΎΡΠ°ΠΌΠ½Π΅ΡΠΈ (Π²ΠΈΠ΄ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρ).
Π₯Π΅Ρ ΡΠΎΡΡΠΎΡΠ±Π° Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°
Π‘Π΅ΠΊΠΎΡ ΠΏΠ°Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΈ-Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π²ΠΎ Ρ Π΅Ρ-ΡΠ°Π±Π΅Π»Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π΅Π΄Π½Π° ΠΎΠ΄ ΡΠ΅ΡΠΈΡΠΈΡΠ΅ ΡΠΎΡΡΠΎΡΠ±ΠΈ:
- ΠΠ»ΡΡΠΎΡ ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° ΡΠ΅ ΠΏΡΠ°Π·Π½ΠΈ. ΠΠΎ ΠΎΠ²Π°Π° ΡΠΎΡΡΠΎΡΠ±Π°, ΡΠ°Π±Π΅Π»Π°ΡΠ° Π·Π° Ρ Π°Ρ Π΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π°.
- ΠΠ»ΡΡΠΎΡ Π΅ Π·Π°ΠΏΠΈΡΠ°Π½, Π½ΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ Π΅ Π·Π°ΠΏΠΈΡΠ°Π½Π°. ΠΠΊΠΎ Π΄ΡΡΠ³Π° Π½ΠΈΡΠΊΠ° ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΡΠ°Π° ΠΏΠΎΡΠΎΠ° ΡΠ΅ Π²ΡΠ°ΡΠ° ΠΏΡΠ°Π·Π½Π°. ΠΠ²Π° Π΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ, ΠΈΡΡΠΎΡΠΎ ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠ΅ΡΠ΅ Π°ΠΊΠΎ Π½Π΅ΠΊΠΎΡΠ° Π΄ΡΡΠ³Π° Π½ΠΈΡΠΊΠ° Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΡΠ°Π½ΠΎ, Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π° ΡΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
- Π‘Π΅ ΡΠ½ΠΈΠΌΠ°Π°Ρ ΠΈ ΠΊΠ»ΡΡΠΎΡ ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ°.
- ΠΡΠ΅Π΄Π½ΠΎΡΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° Π·Π° Π΄ΡΡΠ³ΠΈ Π½ΠΈΡΠΊΠΈ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅, Π½ΠΎ ΠΊΠ»ΡΡΠΎΡ ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ Π΅. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ 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()
ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΎΠ±ΠΈΡΠ΅Π½ ΠΈΠ»ΠΈ ΠΈΡΠΏΠ°ΡΠ»ΠΈΠ² ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°Ρ Π΄ΠΎ Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΏΠ°ΡΠΎΠ²ΠΈ Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° Π·Π° Ρ
Π°Ρ.
ΠΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΈΡΠ°ΡΠ΅ΡΠΎ ΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ Π²ΠΎ Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΈΠ»ΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π°ΡΠ° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°... ΠΠ²ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ°Ρ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΠ»ΡΡΠ½ΠΈΠΎΡ Π·Π±ΠΎΡ
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.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, Π²Π΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅, ΠΈΡΠΏΡΠ°ΡΠ΅ΡΠ΅ ΠΌΠΈ Π΅-ΠΏΠΎΡΡΠ° Π½Π°
ΠΠ²ΠΎΡ ΠΊΠΎΠ΄ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΠΏΠΎΠ΄ ΠΈΠ½ΡΠΏΠΈΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ ΠΎΠ΄Π»ΠΈΡΠ½ΠΈ ΡΡΠ°ΡΠΈΠΈ:
ΠΠ°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π°ΡΠ° Ρ Π΅Ρ ΡΠ°Π±Π΅Π»Π° Π²ΠΎ ΡΠ²Π΅ΡΠΎΡ Π±Π΅Π· Π·Π°ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π₯Π΅Ρ ΡΠ°Π±Π΅Π»Π° Π±Π΅Π· ΡΠ΅ΠΊΠ°ΡΠ΅ Π±Π΅Π· Π·Π°ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅
ΠΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°, ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΌ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° Ρ
Π΅Ρ-ΡΠ°Π±Π΅Π»ΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΠΈ Π΄Π° Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ. ΠΠΎΠΈΡΠ΅ ΠΏΠ»Π°Π½ΠΎΠ²ΠΈ Π²ΠΊΠ»ΡΡΡΠ²Π°Π°Ρ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠΈΠ½ΡΠΈΡΠΈ, Ρ
Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π ΠΎΠ±ΠΈΠ½ Π₯ΡΠ΄ ΠΈ Ρ
Π°ΡΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΊΡΠΊΠ°Π²ΠΈΡΠΈ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π°ΡΠΎΠΌΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΠΎ ΡΡΡΡΠΊΡΡΡΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π»ΡΠΊΠΈ Π·Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ.
ΠΠ·Π²ΠΎΡ: www.habr.com