
ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ
Π² Github .
Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ° Π·Π° GPU, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ° ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ Ρ NVIDIA GTX 1060 ΠΊΠΎΠ΄ΡΡ Π²ΠΌΡΠΊΠ²Π° 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 210 ms ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΄Π²ΠΎΠΉΠΊΠΈ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 64 ms.
Π’ΠΎΠ΅ΡΡ, ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π»Π°ΠΏΡΠΎΠΏΠ° Π΅ ΠΎΠΊΠΎΠ»ΠΎ 300 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π²ΡΡΠ°Π²ΠΊΠΈ/ΡΠ΅ΠΊ ΠΈ 500 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ.
Π’Π°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° CUDA, ΠΌΠ°ΠΊΠ°Ρ ΡΠ΅ ΡΡΡΠ°ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΈ Π² HLSL ΠΈΠ»ΠΈ GLSL. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Ρ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ°:
- ΠΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ΅ ΡΠ°ΠΌΠΎ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
- Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° ΡΠΈΠΊΡΠΈΡΠ°Π½ ΡΠ°Π·ΠΌΠ΅Ρ.
- Π ΡΠΎΠ·ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° Π΄Π²Π΅.
ΠΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ° ΠΏΡΠΎΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π» (Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡ ΠΊΠΎΠ΄ ΡΠΎΠ²Π° Π΅ 0xffffffff).
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
Π Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΡ Ρ , ΡΠΎΠ΅ΡΡ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΈΠΌΠ° ΠΎΡΠ»ΠΈΡΠ½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΊΠ΅ΡΠ°. Π’ΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠ°ΠΆΠ΅ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π΅ΡΠΈΠ³ΠΈ (chaining), ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π² ΡΠ²ΡΡΠ·Π°Π½ ΡΠΏΠΈΡΡΠΊ. Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ ΠΏΡΠΎΡΡ ΠΌΠ°ΡΠΈΠ², ΠΊΠΎΠΉΡΠΎ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ 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ΠΈ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π°ΠΏΡΠ»Π²Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π΄Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΠΎ ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π΄ΡΠ»Π³ΠΎ ΠΈ Π² Π½Π΅Ρ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ±ΡΠΎΠΉΠ½ΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ. ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΡΠΌΠ΅ΠΊΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ Π΅ rehaheshiranje Π² Π½ΠΎΠ²Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π½ΠΈΠ·ΡΠΊ ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΏΡΠΈ rehaheshiranje.
ΠΠ° Π΄Π° ΠΈΠ»ΡΡΡΡΠΈΡΠ°ΠΌ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π³ΠΎΡΠ΅ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ 128 ΠΌΠ»Π½ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΎ ΡΠ΅ Π²ΡΡΠ°Π²ΡΠΌ 4 ΠΌΠ»Π½ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π·Π°ΠΏΡΠ»Π½Ρ 124 ΠΌΠ»Π½ ΡΠ»ΠΎΡΠΎΠ²Π΅ (ΠΊΠΎΠ΅ΡΠΈΡΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΠΊΠΎΠ»ΠΎ 0,96). ΠΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΡΠ΅Π΄ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° CUDA ΡΠ΄ΡΠΎ Ρ Π²ΡΡΠ°Π²ΠΊΠ° Π½Π° 4 ΠΌΠ»Π½ Π½ΠΎΠ²ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π² Π΅Π΄Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°:
ΠΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° 4 194 304 Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°
0,00
11,608448 ΠΌΡ (361,314798 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,03
11,751424 ΠΌΡ (356,918799 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,06
11,942592 ΠΌΡ (351,205515 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,09
12,081120 ΠΌΡ (347,178429 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,12
12,242560 ΠΌΡ (342,600233 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,16
12,396448 ΠΌΡ (338,347235 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,19
12,533024 ΠΌΡ (334,660176 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,22
12,703328 ΠΌΡ (330,173626 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,25
12,884512 ΠΌΡ (325,530693 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,28
13,033472 ΠΌΡ (321,810182 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,31
13,239296 ΠΌΡ (316,807174 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,34
13,392448 ΠΌΡ (313,184256 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,37
13,624000 ΠΌΡ (307,861434 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,41
13,875520 ΠΌΡ (302,280855 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,44
14,126528 ΠΌΡ (296,909756 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,47
14,399328 ΠΌΡ (291,284699 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,50
14,690304 ΠΌΡ (285,515123 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,53
15,039136 ΠΌΡ (278,892623 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,56
15,478656 ΠΌΡ (270,973402 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,59
15,985664 ΠΌΡ (262,379092 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,62
16,668673 ΠΌΡ (251,627968 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,66
17,587200 ΠΌΡ (238,486174 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,69
18,690048 ΠΌΡ (224,413765 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,72
20,278816 ΠΌΡ (206,831789 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,75
22,545408 ΠΌΡ (186,038058 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,78
26,053312 ΠΌΡ (160,989275 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,81
31,895008 ΠΌΡ (131,503463 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,84
42,103294 ΠΌΡ (99,619378 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,87
61,849056 ΠΌΡ (67,815164 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,90
105,695999 ΠΌΡ (39,682713 ΠΌΠ»Π½ ΠΊΠ»ΡΡΠ°/ΡΠ΅ΠΊ.)
0,94
240,204636 ΠΌΡ (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
