ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ
Π³ΠΎ Π² Github
Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π½Π° GPU, ΡΠΏΠΎΡΠΎΠ±Π½Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ° ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ NVIDIA GTX 1060 ΠΊΠΎΠ΄ΡΡ Π²ΠΌΡΠΊΠ²Π° 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 210 ms ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΄Π²ΠΎΠΉΠΊΠΈ Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 64 ms.
Π’ΠΎΠ΅ΡΡ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π»Π°ΠΏΡΠΎΠΏ Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ 300 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ ΠΈ 500 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ.
Π’Π°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° CUDA, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΡΡΠ°ΡΠ° ΡΠ΅Ρ Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΊΡΠΌ HLSL ΠΈΠ»ΠΈ GLSL. ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°:
- ΠΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ΅ ΡΠ°ΠΌΠΎ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΡΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
- Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° ΡΠΈΠΊΡΠΈΡΠ°Π½ ΡΠ°Π·ΠΌΠ΅Ρ.
- Π ΡΠΎΠ·ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΡΠ°Π²Π΅Π½ Π½Π° Π΄Π²Π΅ Π½Π° ΡΡΠ΅ΠΏΠ΅Π½.
ΠΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅ ΠΏΡΠΎΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅Π½ ΠΌΠ°ΡΠΊΠ΅Ρ (Π² Π³ΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ΄ ΡΠΎΠ²Π° Π΅ 0xffffffff).
Π₯Π΅Ρ ΠΌΠ°ΡΠ° Π±Π΅Π· Π±ΡΠ°Π²ΠΈ
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅ Ρ KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
Π Π°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° Π΄Π²Π΅, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΈΡΠ»ΠΎ, Π·Π°ΡΠΎΡΠΎ Π΅Π΄Π½Π° Π±ΡΡΠ·Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π°, Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΌΠ°ΡΠΊΠ°ΡΠ° pow2/AND, Π½ΠΎ ΠΌΠΎΠ΄ΡΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±Π°Π²Π΅Π½. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ Π² Π»ΠΈΠ½Π΅ΠΉΠ½Π° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΡΡ Π½Π° ΡΠ»ΠΎΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±Π²ΠΈΡ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΠΎΡ. Π Π² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠ΅Π½Π°ΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ» Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΠΎΡ.
Π’Π°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ ΠΊΠ»ΡΡΠ° ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, Π° Π½Π΅ Ρ Π΅Ρ Π½Π° ΠΊΠ»ΡΡΠ°. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅, Ρ Π΅ΡΡΡ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ·ΠΎ. ΠΠΎΠ΄ΡΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ Π΅ΡΠ° Murmur3, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΌΠ΅Π½ΠΈ, XOR ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ.
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°ΠΊΠ»ΡΡΠ²Π°ΡΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π·Π° Π·Π°ΡΠΈΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΎΡ ΡΠ΅Π΄Π° Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΎΡΠΈ Π°ΠΊΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π·Π°ΠΏΠΈΡ Π½Π°ΡΡΡΠ°Ρ ΡΠ΅Π΄Π° Π½Π° Π΄ΡΡΠ³ΠΈ ΡΠ°ΠΊΠΈΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΏΠ°ΠΊ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅. Π©Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠΎΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π’Π΅Ρ Π½ΠΈΠΊΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠΈ ΡΡΠ΄Π΅ΡΠ½ΠΎ Ρ Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Ρ ΠΈΠ»ΡΠ΄ΠΈ Π½ΠΈΡΠΊΠΈ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π² Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ Π·Π° ΠΏΡΠ°Π·Π½ΠΈ.
ΠΠΎΠ΄ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½, Π·Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΠΈ 64-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, Π·Π°ΠΏΠΈΡ ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·ΠΌΡΠ½Π°. Π ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π² CUDA ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ Π·Π° 32- ΠΈ 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ° Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈ, ΡΡΠΈΠ³Π° Π΄Π° ΡΠ° Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ ΠΏΠΎΠ΄ΡΠ°Π²Π½Π΅Π½ΠΈ (Π²ΠΈΠΆΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ).
Π‘ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°
ΠΡΡΠΊΠ° Π΄Π²ΠΎΠΉΠΊΠ° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π΅Π΄Π½ΠΎ ΠΎΡ ΡΠ΅ΡΠΈΡΠΈΡΠ΅ ΡΡΡΡΠΎΡΠ½ΠΈΡ:
- ΠΠ»ΡΡΡΡ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΡΠ° ΠΏΡΠ°Π·Π½ΠΈ. Π ΡΠΎΠ²Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°.
- ΠΠ»ΡΡΡΡ Π΅ Π·Π°ΠΏΠΈΡΠ°Π½, Π½ΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ Π·Π°ΠΏΠΈΡΠ°Π½Π°. ΠΠΊΠΎ Π΄ΡΡΠ³Π° Π½ΠΈΡΠΊΠ° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΡ ΡΠ΅ Π²ΡΡΡΠ° ΠΏΡΠ°Π·Π½Π°. Π’ΠΎΠ²Π° Π΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ, ΡΡΡΠΎΡΠΎ Π½Π΅ΡΠΎ ΡΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ, Π°ΠΊΠΎ Π΄ΡΡΠ³Π° Π½ΠΈΡΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈΠ»Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ.
- ΠΠ°ΠΏΠΈΡΠ²Π°Ρ ΡΠ΅ ΠΊΠ°ΠΊΡΠΎ ΠΊΠ»ΡΡΡΡ, ΡΠ°ΠΊΠ° ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ°.
- Π‘ΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π·Π° Π΄ΡΡΠ³ΠΈ Π½ΠΈΡΠΊΠΈ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ ΠΊΠ»ΡΡΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ, Π·Π°ΡΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡΡ ΠΌΠΎΠ΄Π΅Π» 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()
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΡΡΠΎΡΠ½Π΅Π½ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ Π² Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°.
ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ Π΄Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° ΠΈ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π² Π³Π»ΠΎΠ±Π°Π»Π½Π° ΠΈΠ»ΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ... Π’Π΅Π·ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ ΡΡΠ΅Π· ΠΊΠ»ΡΡΠΎΠ²Π°ΡΠ° Π΄ΡΠΌΠ°
volatile
: ... Π²ΡΡΠΊΠ° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠ° ΠΊΡΠΌ ΡΠ°Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡ Π² ΡΠ΅Π°Π»Π½Π° ΠΏΠ°ΠΌΠ΅Ρ.
Π‘ΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π·Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ volatile
. ΠΠΊΠΎ Π½ΠΈΡΠΊΠ°ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ ΠΏΠΎ-ΡΠ°Π½Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, ΡΠΎΠ³Π°Π²Π° ΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΎΡΡΠ°ΡΡΠ»Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠΎΠ²Π° Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° volatile
, Π½ΠΎ ΡΠΎΠ³Π°Π²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΡΠ΅ Π½Π°ΠΌΠ°Π»Π΅Π΅ Π»Π΅ΠΊΠΎ: ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΏΡΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π°ΠΌΠ°Π»Ρ ΠΎΡ 500 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ Π½Π° 450 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ/ΡΠ΅ΠΊ.
ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΠΎΡΡ
Π ΡΠ΅ΡΡΠ° Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π½Π° 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΎΡ ΡΡΡ
, ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ std::unordered_map
ΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π½ΡΠΌΠ° Ρ
Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π·Π° GPU:
std::unordered_map
ΠΈΠ·ΡΠ°Π·Ρ
ΠΎΠ΄Π²Π° 70 691 ms Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π·Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΈΠΌ unordered_map
(ΠΎΡΡΡΠ²Π°Π²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΡΠ½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π°ΡΠΎΡΠΎ Π²ΡΡΡΠ΅ unordered_map
ΠΏΡΠ°Π²ΡΡ ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ). ΡΠ΅ΡΡΠ½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, std:unordered_map
Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. Π’ΠΎΠ²Π° Π΅ Π½ΠΈΡΠΊΠ° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Ρ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ Π²ΡΡΠΊΠ°ΠΊΡΠ² ΡΠ°Π·ΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ ΡΠ΅ Π΄ΠΎΠ±ΡΠ΅ ΠΏΡΠΈ Π²ΠΈΡΠΎΠΊΠΈ Π½ΠΈΠ²Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠ»Π΅Π΄ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ.
ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π·Π° GPU ΠΈ ΠΌΠ΅ΠΆΠ΄ΡΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½Π°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ Π±Π΅ΡΠ΅ 984 ms. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π½ΠΎ Π² ΠΏΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΉ (ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° 1 GB ΠΏΠ°ΠΌΠ΅Ρ Π΅Π΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΠ½Π΅ΠΌΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² CUDA), Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΡΡ Ρ ΡΡΡ . ΠΡΠΈΡΠΊΠΈ ΠΊΠΎΠΏΠΈΡ ΠΊΡΠΌ ΠΈ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ° ΡΡΡΠΎ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄.
ΠΠ°Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠ°ΡΠ° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΡΠ½Π΅ 271 ms. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π½ΠΎ ΠΎΡ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ° Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΠΈ Π½Π΅ Π²Π·Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π½ΠΎ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠΊΠΎ GPU ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΆΠΈΠ²Π΅Π΅ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈΠ»ΠΈ Π°ΠΊΠΎ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠ·ΡΡΠ»ΠΎ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ Π΄ΡΡΠ³ GPU ΠΊΠΎΠ΄, Π° Π½Π΅ ΠΎΡ ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ), ΡΠΎΠ³Π°Π²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΡΠ΅ΡΡΠ° Π΅ ΡΠΌΠ΅ΡΡΠ΅Π½.
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ° Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΏΠΎΡΠ°Π΄ΠΈ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅:
- ΠΠΈΠ½Π΅ΠΉΠ½ΠΎΡΠΎ ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅ Π΅ Π²ΡΠ·ΠΏΡΠ΅ΠΏΡΡΡΡΠ²Π°Π½ΠΎ ΠΎΡ Π³ΡΡΠΏΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΊΠ°ΡΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ ΠΈΠ΄Π΅Π°Π»Π½ΠΎ.
- ΠΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Ρ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡΡΠ°
delete
ΠΈ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π°ΡΡΡΠΏΠ²Π°Ρ ΠΌΠ°ΡΠ°ΡΠ°.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π΄Π° ΡΠ΅ Π²Π»ΠΎΡΠΈ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΠΎ ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ. ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΡΠΌΠ΅ΠΊΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Ρ Π΅ΡΠΈΡΠ°Π½Π΅ Π² Π½ΠΎΠ²Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄ΠΎΡΡΠ° Π½ΠΈΡΠΊΠ° ΡΡΠ΅ΠΏΠ΅Π½ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Ρ Π΅ΡΠΈΡΠ°Π½Π΅.
ΠΠ° Π΄Π° ΠΈΠ»ΡΡΡΡΠΈΡΠ°ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π³ΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ΄, Π·Π° Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡ 128 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π° ΠΏΡΠ΅Π· 4 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ Π·Π°ΠΏΡΠ»Π½Ρ 124 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ»ΠΎΡΠ° (ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΡ ΠΎΠΊΠΎΠ»ΠΎ 0,96). ΠΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΡΠ΅Π΄ Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° CUDA Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π½Π° 4 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π½ΠΎΠ²ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π΅Π΄Π½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°:
Π‘ΡΠ΅ΠΏΠ΅Π½ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ 4 194 304 Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°
0,00
11,608448 ms (361,314798 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,03
11,751424 ms (356,918799 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,06
11,942592 ms (351,205515 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,09
12,081120 ms (347,178429 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,12
12,242560 ms (342,600233 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,16
12,396448 ms (338,347235 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,19
12,533024 ms (334,660176 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,22
12,703328 ms (330,173626 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,25
12,884512 ms (325,530693 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,28
13,033472 ms (321,810182 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,31
13,239296 ms (316,807174 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,34
13,392448 ms (313,184256 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,37
13,624000 ms (307,861434 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,41
13,875520 ms (302,280855 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,44
14,126528 ms (296,909756 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,47
14,399328 ms (291,284699 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,50
14,690304 ms (285,515123 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,53
15,039136 ms (278,892623 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,56
15,478656 ms (270,973402 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,59
15,985664 ms (262,379092 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,62
16,668673 ms (251,627968 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,66
17,587200 ms (238,486174 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,69
18,690048 ms (224,413765 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,72
20,278816 ms (206,831789 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,75
22,545408 ms (186,038058 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,78
26,053312 ms (160,989275 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,81
31,895008 ms (131,503463 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,84
42,103294 ms (99,619378 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,87
61,849056 ms (67,815164 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,90
105,695999 ms (39,682713 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
0,94
240,204636 ms (17,461378 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΊΠ»Π°Π²ΠΈΡΠ°/ΡΠ΅ΠΊ.)
Π‘ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π°ΠΌΠ°Π»ΡΠ²Π°. Π’ΠΎΠ²Π° Π² ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ Π½Π΅ Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½ΠΎ. ΠΠΊΠΎ Π΄Π°Π΄Π΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΌΡΠΊΠ²Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΈ ΠΈΠ·Ρ Π²ΡΡΠ»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π±ΡΠΎΠΈ Π΄ΡΠΌΠΈ Π² ΠΊΠ½ΠΈΠ³Π°), ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠΎ Π°ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄ΡΠ»Π³ΠΎΡΡΠ°ΠΉΠ½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΏΡΠ°Π·Π½ΠΈ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΡΠ΅ΡΡΠΎ Π²ΠΌΡΠΊΠ²Π° ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ), ΡΠΎΠ³Π°Π²Π° ΡΠΎΠ²Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ.
Π ΠΈΠ·ΠΌΠ΅ΡΠΈ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ»Π΅Π΄ 64 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ (ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ 0,5). Π‘ΡΠ΅Π΄Π½Π°ΡΠ° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° Π±Π΅ΡΠ΅ 0,4774, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΊΠ»ΡΡΠΎΠ²Π΅ Π±ΡΡ Π° ΠΈΠ»ΠΈ Π² Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠ»ΠΎΡ, ΠΈΠ»ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΡΠ»ΠΎΡ ΠΎΡ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° ΠΏΠΎΠ·ΠΈΡΠΈΡ. ΠΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π°ΡΠ° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° Π½Π° ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅ Π±Π΅ΡΠ΅ 60.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·ΠΌΠ΅ΡΠΈΡ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ°ΡΠ° ΡΡΡ 124 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π²Π»ΠΎΠΆΠΊΠΈ (ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ 0,97). Π‘ΡΠ΅Π΄Π½Π°ΡΠ° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ 10,1757, Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π°ΡΠ° - 6474 (!!). ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΈ Π²ΠΈΡΠΎΠΊΠΈ Π½ΠΈΠ²Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅.
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ ΡΡΠ΅ΠΏΠ΅Π½ΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½ΠΈΡΠΊΠ°. ΠΠΎ ΡΠΎΠ³Π°Π²Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π·Π° ΡΠΌΠ΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ. ΠΠΊΠΎ Π² Π³ΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡ 128 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΡ 0,25, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 32 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π½Π΅Ρ, Π° ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ 96 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ»ΠΎΡΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°Π³ΡΠ±Π΅Π½ΠΈ - 8 Π±Π°ΠΉΡΠ° Π·Π° Π²ΡΡΠΊΠ° Π΄Π²ΠΎΠΉΠΊΠ° , 768 MB Π·Π°Π³ΡΠ±Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ.
ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π·Π°Π³ΡΠ±Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎ-ΡΠ΅Π½Π΅Π½ ΡΠ΅ΡΡΡΡ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π½Π°ΡΡΠΎΠ»Π½ΠΈ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ CUDA, ΠΈΠΌΠ°Ρ ΠΏΠΎΠ½Π΅ 4 GB ΠΏΠ°ΠΌΠ΅Ρ (ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ NVIDIA 2080 Ti ΠΈΠΌΠ° 11 GB), Π²ΡΠ΅ ΠΏΠ°ΠΊ Π½Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π½Π°ΠΉ-ΠΌΡΠ΄ΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΡΡΠΌΠΈ.
ΠΠΎ-ΠΊΡΡΠ½ΠΎ ΡΠ΅ ΠΏΠΈΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½ΡΠΌΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π°ΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΡΠΈΡΠΈ ΡΠ»ΠΎΡΠΎΠ²Π΅.
ΠΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅
ΠΠ° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠΎΠ½Π΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ Ρ Π΅ΡΠ° Π½Π° ΠΊΠ»ΡΡΠ° (Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°) ΠΎΡ Π½Π΅Π³ΠΎΠ²ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°:
// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);
ΠΠΎΡΠ°Π΄ΠΈ ΠΌΠ°Π³ΠΈΡΡΠ° Π½Π° Π΄ΠΎΠΏΡΠ»Π²Π°ΡΠΈΡΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΠΈ ΡΠΈΡΠ»Π° Π½Π° Π΄Π²Π΅ ΠΈ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅ΡΡΡ Π½Π° Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π΅ Π΄Π²Π΅ Π½Π° ΡΡΠ΅ΠΏΠ΅Π½ Π΄Π²Π΅, ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΡΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠ»ΡΡΠΎΠ²ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ Π΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ΅Π½ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. ΠΠ΅ΠΊΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΊΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ Π΅ Ρ
Π΅ΡΠΈΡΠ°Π½ Π΄ΠΎ 1, Π½ΠΎ Π΅ Π²ΠΌΡΠΊΠ½Π°Ρ Π² ΡΠ»ΠΎΡ 3. Π’ΠΎΠ³Π°Π²Π° Π·Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅Ρ 4 ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ (3 β 1) & 3
, ΠΊΠΎΠ΅ΡΠΎ Π΅ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π½Π° 2.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, ΠΌΠΎΠ»Ρ, ΠΏΠΈΡΠ΅ΡΠ΅ ΠΌΠΈ Π½Π°
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΠΏΠΎΠ΄ Π²Π΄ΡΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΎΡΠ»ΠΈΡΠ½ΠΈ ΡΡΠ°ΡΠΈΠΈ:
ΠΠ°ΠΉ-ΠΏΡΠΎΡΡΠ°ΡΠ° Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π±Π΅Π· Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π² ΡΠ²Π΅ΡΠ° Π₯Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π±Π΅Π· Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅
Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ° Π΄Π° ΠΏΠΈΡΠ° Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° Ρ
Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΈ ΠΈ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌ ΡΡΡ
Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅. ΠΠΎΠΈΡΠ΅ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π²Π΅ΡΠΈΠΆΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅, Ρ
Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π ΠΎΠ±ΠΈΠ½ Π₯ΡΠ΄ ΠΈ Ρ
Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΡΠΊΡΠ²ΠΈΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΡΡΡΠΊΡΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° GPU.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com