Π― Π²ΡΠ»ΠΎΠΆΠΈΠ» Π½Π° Github
ΠΡΠΎ ΠΏΡΠΎΡΡΠ°Ρ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ GPU, ΡΠΏΠΎΡΠΎΠ±Π½Π°Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ ΡΠΎΡΠ½ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π²ΡΡΠ°Π²ΠΎΠΊ. ΠΠ° ΠΌΠΎΡΠΌ Π½ΠΎΡΡΠ±ΡΠΊΠ΅ Ρ NVIDIA GTX 1060 ΠΊΠΎΠ΄ Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ 64 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠ°Ρ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π·Π° 210 ΠΌΡ ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ 32 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΠΏΠ°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π·Π° 64 ΠΌΡ.
Π’ΠΎ Π΅ΡΡΡ ΡΠΊΠΎΡΠΎΡΡΡ Π½Π° Π½ΠΎΡΡΠ±ΡΠΊΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 300 ΠΌΠ»Π½ Π²ΡΡΠ°Π²ΠΎΠΊ/ΡΠ΅ΠΊ ΠΈ 500 ΠΌΠ»Π½ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ/ΡΠ΅ΠΊ.
Π’Π°Π±Π»ΠΈΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° CUDA, Ρ ΠΎΡΡ ΡΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊ HLSL ΠΈΠ»ΠΈ GLSL. Π£ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΡ Π²ΡΡΠΎΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅:
- ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ 32-Π±ΠΈΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ ΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
- Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ.
- Π ΡΡΠΎΡ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ Π΄Π²ΡΠΌ Π² ΡΡΠ΅ΠΏΠ΅Π½ΠΈ.
ΠΠ»Ρ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠΈΠΉ ΠΌΠ°ΡΠΊΠ΅Ρ (Π² ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΡΠΎ 0xffffffff).
Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ
Π Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠΊΡΡΡΠ°Ρ Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΡ Ρ KeyValue
:
struct KeyValue
{
uint32_t key;
uint32_t value;
};
Π Π°Π·ΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ°Π²Π΅Π½ Π΄Π²ΠΎΠΉΠΊΠ΅ Π² ΡΡΠ΅ΠΏΠ΅Π½ΠΈ, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎΠΌΡ ΡΠΈΡΠ»Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ pow2/AND-ΠΌΠ°ΡΠΊΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡΡΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅. ΠΡΠΎ Π²Π°ΠΆΠ½ΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ ΠΏΠΎΠΈΡΠΊΠ΅ ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»ΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»ΠΎΡ. Π Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»ΠΎΡΠ΅.
Π’Π°Π±Π»ΠΈΡΠ° Ρ ΡΠ°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π° Π½Π΅ Ρ ΡΡ ΠΊΠ»ΡΡΠ°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΡΠ°Π½ΠΈΡ Π»ΠΈΡΡ 32-Π±ΠΈΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ, Ρ ΡΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ. Π ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΡΡ Murmur3, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π»ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π²ΠΈΠ³ΠΎΠ², XOR-ΠΎΠ² ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΉ.
Π Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° Π·Π°ΡΠΈΡΡ ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ Π½Π°ΡΡΡΠ°ΡΡ ΠΎΡΠ΅ΡΡΠ΄Π½ΠΎΡΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠ± ΡΡΠΎΠΌ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π½ΠΈΠΆΠ΅. ΠΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ°ΠΌΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΡΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠ»ΡΡΠΈ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ ΠΏΡΡΡΡΠΌΠΈ.
ΠΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΌΠΎΠ³ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈ 64-Π±ΠΈΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΊΠ»ΡΡΠ΅ΠΉ ΡΡΠ΅Π±ΡΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ (compare-and-swap). Π Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½ΡΠΆΠ½Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. Π ΡΡΠ°ΡΡΡΡ, Π² CUDA ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ 32- ΠΈ 64-Π±ΠΈΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π²ΡΡΠΎΠ²Π½Π΅Π½Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (ΡΠΌ.
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ
ΠΠ°ΠΆΠ΄Π°Ρ ΠΏΠ°ΡΠ° ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ:
- ΠΠ»ΡΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΡΡΡ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ.
- ΠΠ»ΡΡ Π±ΡΠ» Π·Π°ΠΏΠΈΡΠ°Π½, Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΅ΡΡ Π½Π΅Ρ. ΠΡΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΡΠΎ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ Π±Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π» ΡΡΡΡ ΡΠ°Π½ΡΡΠ΅, Π° ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ Π΄Π°Π½Π½ΡΡ .
- ΠΠ°ΠΏΠΈΡΠ°Π½Ρ ΠΈ ΠΊΠ»ΡΡ, ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
- ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π° ΠΊΠ»ΡΡ β Π΅ΡΡ Π½Π΅Ρ. Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² CUDA ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠ»Π°Π±ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΠΈ ΠΊΠ»ΡΡ Π²ΡΡ Π΅ΡΡ ΠΏΡΡΡΠΎΠΉ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΠΌ ΡΠΆΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ.
ΠΠ°ΠΆΠ½ΡΠΉ Π½ΡΠ°Π½Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡ Π±ΡΠ» Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΡΠ»ΠΎΡ, ΠΎΡ ΡΠΆΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ β Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΊΠ»ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»ΡΠ½, ΠΎΠ± ΡΡΠΎΠΌ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π½ΠΈΠΆΠ΅.
ΠΠΎΠ΄ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π°ΠΆΠ΅ ΡΠΎ ΡΠ»Π°Π±ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ ΠΏΠ°ΠΌΡΡΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π²ΡΡΠ°Π²ΠΊΡ, ΠΏΠΎΠΈΡΠΊ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΠ°ΡΠ° ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ.
ΠΡΡΠ°Π²ΠΊΠ° Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ
CUDA-ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠ°ΡΡ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
void gpu_hashtable_insert(KeyValue* hashtable, uint32_t key, uint32_t value)
{
uint32_t slot = hash(key);
while (true)
{
uint32_t prev = atomicCAS(&hashtable[slot].key, kEmpty, key);
if (prev == kEmpty || prev == key)
{
hashtable[slot].value = value;
break;
}
slot = (slot + 1) & (kHashTableCapacity-1);
}
}
ΠΠ»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΊΠ»ΡΡΠ° ΠΊΠΎΠ΄ ΠΈΡΠ΅ΡΠΈΡΡΠ΅Ρ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Ρ ΡΡΠ° Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°. Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»ΠΎΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΠ»ΡΡ Π² ΡΡΠΎΠΌ ΡΠ»ΠΎΡΠ΅ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΡΡΡΡΠΌ. ΠΡΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅, ΡΠΎ ΠΊΠ»ΡΡ Π² ΡΠ»ΠΎΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π½Π° Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΠΊΠ»ΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΡΠ»ΠΎΡΠ°. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π±ΡΠ» ΠΏΡΡΡΡΠΌ ΠΈΠ»ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π» Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠΌΡ ΠΊΠ»ΡΡΡ, Π·Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄ Π½Π°ΡΡΠ» ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ Π΄Π»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ ΡΠ»ΠΎΡ ΠΈ Π²Π½ΠΎΡΠΈΡ Π² ΡΠ»ΠΎΡ Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠ»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΠ΄ΡΠ° gpu_hashtable_insert()
Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ, ΡΠΎΠ³Π΄Π° Π»ΡΠ±ΠΎΠ΅ ΠΈΠ· ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ»ΠΎΡ ΠΊΠ»ΡΡΠ°. ΠΡΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΌ: ΠΎΠ΄Π½Π° ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΊΠ»ΡΡΠ°-Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Ρ
ΠΎΠ΄Π΅ Π²ΡΠ·ΠΎΠ²Π° Π±ΡΠ΄Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠ°ΠΌΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ.
ΠΠΎΠΈΡΠΊ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅
ΠΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠ»ΡΡΠ΅ΠΉ:
uint32_t gpu_hashtable_lookup(KeyValue* hashtable, uint32_t key)
{
uint32_t slot = hash(key);
while (true)
{
if (hashtable[slot].key == key)
{
return hashtable[slot].value;
}
if (hashtable[slot].key == kEmpty)
{
return kEmpty;
}
slot = (slot + 1) & (kHashTableCapacity - 1);
}
}
Π§ΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ°, Ρ ΡΠ°Π½ΡΡΠ΅Π³ΠΎΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΌΡ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Ρ ΡΡΠ° ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°. Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»ΠΎΡΠ΅ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΊΠ»ΡΡ ΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠ΅ΠΌ, ΠΈ Π΅ΡΠ»ΠΈ Π΄Π°, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΊΠ»ΡΡ ΠΏΡΡΡΡΠΌ, ΠΈ Π΅ΡΠ»ΠΈ Π΄Π°, ΡΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠΈΡΠΊ.
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½Π΅ ΡΠ΄Π°ΡΡΡΡ Π½Π°ΠΉΡΠΈ ΠΊΠ»ΡΡ, ΡΠΎ ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠ΅ ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎ Π² Ρ ΠΎΠ΄Π΅ Π²ΡΡΠ°Π²ΠΎΠΊ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ. ΠΠ°ΠΆΠ΄Π°Ρ ΠΏΠ°ΡΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π² Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅
ΠΠΎΠ΄ Π΄Π»Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ:
void gpu_hashtable_delete(KeyValue* hashtable, uint32_t key, uint32_t value)
{
uint32_t slot = hash(key);
while (true)
{
if (hashtable[slot].key == key)
{
hashtable[slot].value = kEmpty;
return;
}
if (hashtable[slot].key == kEmpty)
{
return;
}
slot = (slot + 1) & (kHashTableCapacity - 1);
}
}
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎ: ΠΌΡ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠ»ΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Π½Π΅ ΡΠ°ΠΌ ΠΊΠ»ΡΡ) ΠΏΡΡΡΡΠΌ. ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆ Π½Π° lookup()
, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΠΎ ΠΊΠ»ΡΡΡ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΡΡΡΠΌ.
ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π²ΡΡΠ΅, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΡΠ»ΠΎΡ, ΠΎΠ½ ΡΠΆΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ. ΠΠ°ΠΆΠ΅ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠ»ΡΡ ΠΎΡΡΠ°ΡΡΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅, ΠΏΡΠΎΡΡΠΎ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΡΡΡΠΌ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»ΠΎΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΡΡΡΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ β ΠΎΠ½ΠΎ Π²ΡΡ-ΡΠ°Π²Π½ΠΎ ΡΡΠ°Π½Π΅Ρ ΠΏΡΡΡΡΠΌ.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ
ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΡΠΏΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ Π² Π½Π΅Ρ Π½Π΅ΠΏΡΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΡΡΠ°ΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. Π― ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΠΎΡΠ΅Π» ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΎΠ±ΡΠ°Π·Π΅Ρ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΡΡΡΠΌ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π² CUDA-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ°ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Ρ ΠΎΡΡ-ΠΊΠΎΠ΄Π΅, Π° Π½Π΅ Π² ΡΠ΄ΡΠ΅ CUDA.
Π ΡΡΠ°ΡΡΠ΅
ΠΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ
Π ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΡΡ
Π²ΡΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°Ρ
ΠΊΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΠΈ gpu_hashtable_insert()
, _lookup()
ΠΈ _delete()
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ΅ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠ°Π·. Π Π½ΠΈΠΆΠ΅ gpu_hashtable_insert()
, _lookup()
ΠΈ _delete()
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠ°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ, ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΠ°ΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ GPU-ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
// CPU code to invoke the CUDA kernel on the GPU
uint32_t threadblocksize = 1024;
uint32_t gridsize = (numkvs + threadblocksize - 1) / threadblocksize;
gpu_hashtable_insert_kernel<<<gridsize, threadblocksize>>>(hashtable, kvs, numkvs);
// GPU code to process numkvs key/values in parallel
void gpu_hashtable_insert_kernel(KeyValue* hashtable, const KeyValue* kvs, unsigned int numkvs)
{
unsigned int threadid = blockIdx.x*blockDim.x + threadIdx.x;
if (threadid < numkvs)
{
gpu_hashtable_insert(hashtable, kvs[threadid].key, kvs[threadid].value);
}
}
Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π·Π°ΡΠΈΡΠΎΠΉ ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΡΠ΅ Π²ΡΡΠ°Π²ΠΊΠΈ, ΠΏΠΎΠΈΡΠΊΠΈ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ°ΡΡ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³Π΄Π° Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ, Π° ΠΊΠ»ΡΡΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ, ΡΠ°Π±Π»ΠΈΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ°Π·Π½ΡΡ Π²ΠΈΠ΄ΠΎΠ².
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ· Π²ΡΡΠ°Π²ΠΎΠΊ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ, ΠΈ Π΅ΡΠ»ΠΈ Π²ΠΎ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΏΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ΡΡ ΠΊΠ»ΡΡΠΈ, ΡΠΎ ΠΌΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΡ Β«ΠΏΠΎΠ±Π΅Π΄ΡΡΒ» β Π±ΡΠ΄ΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Ρ Π² Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ. ΠΠΎΠΏΡΡΡΠΈΠΌ, ΠΌΡ Π²ΡΠ·Π²Π°Π»ΠΈ ΠΊΠΎΠ΄ Π²ΡΡΠ°Π²ΠΊΠΈ ΡΠΎ Π²Ρ
ΠΎΠ΄Π½ΡΠΌ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ ΠΈΠ· ΠΏΠ°Ρ A/0 B/1 A/2 C/3 A/4
. ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, ΠΏΠ°ΡΡ B/1
ΠΈ C/3
Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π² Π½Π΅ΠΉ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π»ΡΠ±Π°Ρ ΠΈΠ· ΠΏΠ°Ρ A/0
, A/2
ΠΈΠ»ΠΈ A/4
. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅ Π±ΡΡΡ β Π²ΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ Π·Π½Π°ΡΡ, ΡΡΠΎ Π²ΠΎ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ Π½Π΅Ρ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΡ
ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ, ΠΈΠ»ΠΈ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ.
ΠΡΠ»ΠΈ Π΄Π»Ρ Π²Π°Ρ ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ΡΡ ΠΏΠ°ΡΡ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ CUDA-Π²ΡΠ·ΠΎΠ²Π°ΠΌ. Π CUDA Π»ΡΠ±Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠ΄ΡΠ° Π²ΡΠ΅Π³Π΄Π° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠ΄ΡΠ° (ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π ΡΠ°Π·Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠ°Ρ
ΡΠ΄ΡΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ). ΠΡΠ»ΠΈ Π² ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ·Π²Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΡΠ΄ΡΠΎ Ρ A/0 B/1 A/2 C/3
, Π° Π΄ΡΡΠ³ΠΎΠ΅ Ρ A/4
, ΡΠΎΠ³Π΄Π° ΠΊΠ»ΡΡ A
ΠΏΠΎΠ»ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 4
.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ lookup()
ΠΈ delete()
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ (plain) ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ (volatile) ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ² ΠΏΠ°Ρ Π² Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅.
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΡ ΠΏΠ°ΠΌΡΡΡ β¦ ΠΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°
volatile
: β¦ Π»ΡΠ±Π°Ρ ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π² Π½Π°ΡΡΠΎΡΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠ°ΠΌΡΡΡ.
Π‘ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ volatile
. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π·Π°ΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½Π΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ, ΡΠΎ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°ΡΠ΅Π²ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠΎ Π²ΡΡ ΠΆΠ΅ ΡΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΠ΄ΡΠ°. ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΡΡ ΡΠ²Π΅ΠΆΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ volatile
, Π½ΠΎ ΡΠΎΠ³Π΄Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ½ΠΈΠ·ΠΈΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΏΠΎ ΠΌΠΎΠΈΠΌ ΡΠ΅ΡΡΠ°ΠΌ β ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ 32 ΠΌΠ»Π½ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ½ΠΈΠ·ΠΈΠ»Π°ΡΡ Ρ 500 ΠΌΠ»Π½ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ/ΡΠ΅ΠΊ Π΄ΠΎ 450 ΠΌΠ»Π½ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ/ΡΠ΅ΠΊ.
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
Π ΡΠ΅ΡΡΠ΅ Π½Π° Π²ΡΡΠ°Π²ΠΊΡ 64 ΠΌΠ»Π½ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ 32 ΠΌΠ»Π½ ΠΈΠ· Π½ΠΈΡ
ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ std::unordered_map
ΠΈ Ρ
ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ Π΄Π»Ρ GPU ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ:
std::unordered_map
ΠΏΠΎΡΡΠ°ΡΠΈΠ»Π° 70 691 ΠΌΡ Π½Π° Π²ΡΡΠ°Π²ΠΊΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ unordered_map
(ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π½Π΅ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π½ΡΡΡΠΈ unordered_map
Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ). Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Ρ std:unordered_map
ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΠΉ CPU-ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ»ΡΡΠΈ-Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Ρ
ΠΎΡΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ Π²ΡΡΠΎΠΊΠΈΡ
ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ°Ρ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ
ΡΠ΄Π°Π»Π΅Π½ΠΈΠΉ.
ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ Π΄Π»Ρ GPU ΠΈ ΠΌΠ΅ΠΆΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΡΡΠ°Π²ΠΈΠ»Π° 984 ΠΌΡ. Π‘ΡΠ΄Π° Π²Ρ ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ΠΌΡ, Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π΅Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ (ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ 1 ΠΠ± ΠΏΠ°ΠΌΡΡΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π² CUDA Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ), Π²ΡΡΠ°Π²ΠΊΠ° ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π½ΠΈΠΌ. Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅Π½Ρ Π²ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ.
Π Π°Π±ΠΎΡΠ° ΡΠ°ΠΌΠΎΠΉ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ Π·Π°Π½ΡΠ»Π° 271 ΠΌΡ. Π‘ΡΠ΄Π° Π²Ρ ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠΎΠΉ Π½Π° Π²ΡΡΠ°Π²ΠΊΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈ Π½Π΅ ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅ΠΉΡΡ ΡΠ°Π±Π»ΠΈΡΠ΅. ΠΡΠ»ΠΈ GPU-ΡΠ°Π±Π»ΠΈΡΠ° ΠΆΠΈΠ²ΡΡ Π΄ΠΎΠ»Π³ΠΎ, ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π² ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ GPU-ΠΊΠΎΠ΄ΠΎΠΌ, Π° Π½Π΅ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ), ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ΅Π½.
Π₯ΡΡ-ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π²ΡΡΠΎΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΡ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
Π£ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ:
- ΠΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌΡ Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, ΠΈΠ·-Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΠ»ΡΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ.
- ΠΠ»ΡΡΠΈ Π½Π΅ ΡΠ΄Π°Π»ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ
delete
ΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΡ.
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΡΠ½ΠΈΠΆΠ°ΡΡΡΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΠΎΠ»Π³ΠΎ ΠΈ Π² Π½Π΅ΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΌΡΠ³ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Ρ ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΡΠ΄Π°Π»ΡΠ½Π½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ Π½Π° 128 ΠΌΠ»Π½ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ Π±ΡΠ΄Ρ Π²ΡΡΠ°Π²Π»ΡΡΡ 4 ΠΌΠ»Π½ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Ρ 124 ΠΌΠ»Π½ ΡΠ»ΠΎΡΠΎΠ² (ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠΊΠΎΠ»ΠΎ 0,96). ΠΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠΎΠΊΠ° β ΡΡΠΎ Π²ΡΠ·ΠΎΠ² ΡΠ΄ΡΠ° CUDA ΡΠΎ Π²ΡΡΠ°Π²ΠΊΠΎΠΉ 4 ΠΌΠ»Π½ Π½ΠΎΠ²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΎΠ΄Π½Ρ Ρ ΡΡ-ΡΠ°Π±Π»ΠΈΡΡ:
ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΡΠ°Π²ΠΊΠΈ 4 194 304 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
0,00
11,608448 ΠΌΡ (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