
ΠΠ°ΡΠΈΡ
Π½Π° 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);
}
}
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π·Π°ΡΠΈΡΠ° ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΈ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ, ΡΡΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π΄Π²ΠΎΠΉΠΊΠΈΡΠ΅ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ° Π² Π΅Π΄Π½ΠΎ ΠΎΡ ΡΠ΅ΡΠΈΡΠΈΡΠ΅ ΡΡΡΡΠΎΡΠ½ΠΈΡ ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Ρ, ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ Π΄ΠΎΡΠΈ ΠΏΡΠΈ simultaneus ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π²ΠΈΠ΄.
ΠΠΊΠΎ ΠΎΠ±Π°ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ, ΠΈ Π°ΠΊΠΎ Π²Ρ
ΠΎΠ΄Π½ΠΈΡΡ ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΡΠ±Π»ΠΈΡΠ°ΡΠΈ ΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅, Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ "ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π²Π°Ρ" β ΠΊΠΎΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π² Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈ. ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΡΠΌΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π»ΠΈ ΠΊΠΎΠ΄Π° Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Ρ Π²Ρ
ΠΎΠ΄Π΅Π½ ΠΌΠ°ΡΠΈΠ² ΠΎΡ Π΄Π²ΠΎΠΉΠΊΠΈ 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 ΠΊΠΎΠ΄, Π° Π½Π΅ ΠΎΡ ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ), ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΡΠ΅ΡΡΠ° Π΅ Π°ΠΊΡΡΠ°Π»Π΅Π½.
Π₯Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ° Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄:
- ΠΠΈΠ½Π΅ΠΉΠ½ΠΎΡΠΎ Π·ΠΎΠ½ΠΈΡΠ°Π½Π΅ Π΅ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²Π°Π½ΠΎ ΠΎΡ ΠΊΠ»ΡΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΡΡΠΎ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π΅ ΡΠ° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΈΠ΄Π΅Π°Π»Π½ΠΎ.
- ΠΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ Ρ ΡΡΠ½ΠΊΡΠΈΡ
ΠΈΠ·ΡΡΠΈΠΉΠΈ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π°ΡΡΡΠΏΠ²Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π΄Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΠΎ ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π΄ΡΠ»Π³ΠΎ ΠΈ Π΅ Π² Π½Π΅Ρ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½ΠΈΡ. ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΡΠΌΠ΅ΠΊΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ Π΅ ΠΏΡΠ΅Ρ Π΅ΡΠΈΡΠ°Π½Π΅ Π² Π½ΠΎΠ²Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π½ΠΈΡΡΠΊ ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΏΡΠΈ ΠΏΡΠ΅Ρ Π΅ΡΠΈΡΠ°Π½Π΅.
ΠΠ° Π΄Π° ΠΈΠ»ΡΡΡΡΠΈΡΠ°ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π³ΠΎΡΠ΅ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° Ρ 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
