рдореИрдВрдиреЗ рдЬреАрдердм рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреАрдПрдкреА рд╣реИрд╢ рдЯреЗрдмрд▓ рдирд╛рдордХ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреЛрд╕реНрдЯ рдХреА редрдпрд╣ GPU рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реИрдХрдбрд╝реЛрдВ рд▓рд╛рдЦреЛрдВ рдЖрд╡реЗрд╖рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред NVIDIA GTX 1060 рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░, рдХреЛрдб рдиреЗ рд▓рдЧрднрдЧ 210 рдПрдордПрд╕ рдореЗрдВ 64 рдорд┐рд▓рд┐рдпрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреА-рд╡реИрд▓реНрдпреВ рдЬреЛрдбрд╝реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдП рдФрд░ рд▓рдЧрднрдЧ 64 рдПрдордПрд╕ рдореЗрдВ 32 рдорд┐рд▓рд┐рдпрди рдЬреЛрдбрд╝реЗ рдирд┐рдХрд╛рд▓реЗредрдпрд╣реА рд╣реИ, рд▓реИрдкрдЯреЙрдк рдкрд░ рдЧрддрд┐ рд▓рдЧрднрдЧ 300 рдорд┐рд▓рд┐рдпрди рдЖрд╡реЗрд╖рдг / рд╕реЗрдХрдВрдб рдФрд░ 500 рдорд┐рд▓рд┐рдпрди рдирд┐рд╖реНрдХрд╛рд╕рди / рд╕реЗрдХрдВрдб рд╣реИредрддрд╛рд▓рд┐рдХрд╛ CUDA рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕реА рддрдХрдиреАрдХ рдХреЛ HLSL рдпрд╛ GLSL рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИрдВ:- рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рд╕рдорд╛рди рдорд╛рди рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
- рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
- рдФрд░ рдпрд╣ рдЖрдХрд╛рд░ рджреЛ рдбрд┐рдЧреНрд░реА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рд░рд▓ рдкрд░рд┐рд╕реАрдорди рдорд╛рд░реНрдХрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдКрдкрд░ рдХреЛрдб рдореЗрдВ рдпрд╣ 0xffffffff рд╣реИ)редрдмрд┐рдирд╛ рддрд╛рд▓реЗ рдХреЗ рд╣реИрд╢ рдЯреЗрдмрд▓
рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд░реЗрдЦреАрдп рд╕рдВрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЦреБрд▓реЗ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рдХреИрд╢ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рдирд╛ред рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рд░рдгреА рднрдВрдбрд╛рд░рдг рддрддреНрд╡ рд╣реИ KeyValue
:struct KeyValue
{
uint32_t key;
uint32_t value;
};
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╢рдХреНрддрд┐ рдореЗрдВ рджреЛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рдПрдХ рдЕрднрд╛рдЬреНрдп рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ pow2 / AND-mask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рддреНрд╡рд░рд┐рдд рдирд┐рд░реНрджреЗрд╢ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдореЙрдбреНрдпреВрд▓ рдСрдкрд░реЗрдЯрд░ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред рдпрд╣ рд░реИрдЦрд┐рдХ рд╕рдВрд╡реЗрджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд░реЗрдЦреАрдп рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрд▓реЙрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдореЛрдбреБрд▓реЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИредрддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдХреБрдВрдЬреА рд╣реИрд╢ рдирд╣реАрдВред рдЪреВрдВрдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдореБрд░рдореБрд░ 3 рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдСрдлрд╕реЗрдЯ, рдПрдХреНрд╕рдУрдЖрд░ рдФрд░ рдЧреБрдгрди рдХрд░рддрд╛ рд╣реИредрд╣реИрд╢ рдЯреЗрдмрд▓ рдПрдХ рд▓реЙрдХ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдСрд░реНрдбрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдРрд╕реЗ рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЖрджреЗрд╢ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣реИрд╢ рдЯреЗрдмрд▓ рдЕрднреА рднреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рддрдХрдиреАрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рдзрд╛рдЧреЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рддреЗ рд╣реИрдВредрд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ 64-рдмрд┐рдЯ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХреЗред рдХреБрдВрдЬреА рдХреЛ рдкрд░рдорд╛рдгреБ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ рдФрд░ рд╡рд┐рдирд┐рдордп рд╕рдВрдЪрд╛рд▓рди (рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рдорд╛рдгреБ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, 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 рдзрд╛рдЧреЗ рдореЗрдВ:
uint32_t threadblocksize = 1024;
uint32_t gridsize = (numkvs + threadblocksize - 1) / threadblocksize;
gpu_hashtable_insert_kernel<<<gridsize, threadblocksize>>>(hashtable, kvs, numkvs);
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()
рдПрдХ рд╕рд╛рдзрд╛рд░рдг (рд╕рд╛рджрд╛) рдпрд╛ рдЪрд░ (рд╡рд╛рд╖реНрдкрд╢реАрд▓) рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВредCUDA рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐:рд╕рдВрдХрд▓рдХ, рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдкрд░, рд╡реИрд╢реНрд╡рд┐рдХ рдпрд╛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ ... рдЗрди рдЕрдиреБрдХреВрд▓рди рдХреЛ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ volatile
: ... рдЗрд╕ рдЪрд░ рдХреЗ рдХрд┐рд╕реА рднреА рд▓рд┐рдВрдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрдврд╝рдиреЗ рдпрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ volatile
ред рдпрджрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдзрд╛рдЧрд╛ рдкрд╣рд▓реЗ рдкрдврд╝реЗ рдЧрдП рдСрдкрд░реЗрд╢рди рд╕реЗ рдХреИрд╢ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝реА рдкреБрд░рд╛рдиреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдХрд░реНрдиреЗрд▓ рдХреЙрд▓ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ volatile
, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреНрд░рджрд░реНрд╢рди рдереЛрдбрд╝рд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛: рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬрдм рдЖрдк 32 рдорд┐рд▓рд┐рдпрди рдЖрдЗрдЯрдо рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЧрддрд┐ 500 тАЛтАЛрдорд┐рд▓рд┐рдпрди рдбрд┐рд▓реАрдЯ / рдПрд╕ рд╕реЗ 450 рдорд┐рд▓рд┐рдпрди рдбрд┐рд▓реАрдЯ / рдПрд╕ рддрдХ рдШрдЯ рдЬрд╛рддреА рд╣реИредрдкреНрд░рджрд░реНрд╢рди
64 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ 32 рдорд┐рд▓рд┐рдпрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, std::unordered_map
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдФрд░ GPU рдХреЗ рдмреАрдЪ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВ рд╣реИ:std::unordered_map
рдмрд╛рдж рдХреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдкрд░ 70 691 рдПрдордПрд╕ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ unordered_map
(рд▓рд╛рдЦреЛрдВ рддрддреНрд╡реЛрдВ рд╕реЗ рд░рд┐рд╣рд╛рдИ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ unordered_map
рдХрдИ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдЕрдВрджрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ )ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, std:unordered_map
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реАрдорд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдПрдХрд▓ рд╕реАрдкреАрдпреВ-рдзрд╛рдЧрд╛ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЗ рдХреБрдВрдЬреА-рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрдЪреНрдЪ рдЙрдкрдпреЛрдЧ рджрд░реЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдИ рд╡рд┐рд▓реЛрдкрди рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рд░ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИредGPU рдФрд░ рдЕрдВрддрд░-рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЕрд╡рдзрд┐ 984 рдПрдордПрд╕ рдереАред рдЗрд╕рдореЗрдВ рдЯреЗрдмрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп (1 рдЬреАрдмреА рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдмрд╛рд░ рдЖрд╡рдВрдЯрди, рдЬрд┐рд╕рдореЗрдВ CUDA рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ), рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдореНрдорд┐рд▓рди рдФрд░ рд╡рд┐рд▓реЛрдкрди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдЙрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА рдореЗрдореЛрд░реА рд╕реЗ рд╕рднреА рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИредрд╣реИрд╢ рдЯреЗрдмрд▓ рдиреЗ рд╕реНрд╡рдпрдВ 271 рдПрдордПрд╕ рд▓рд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╕реНрдореГрддрд┐ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ GPU рдЯреЗрдмрд▓ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп GPU рдХреЛрдб рдФрд░ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рддреЛ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИредрд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдЕрдкрдиреЗ рдЙрдЪреНрдЪ рдмреИрдВрдбрд╡рд┐рдбреНрде рдФрд░ рд╕рдХреНрд░рд┐рдп рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХреЗ рдХрд╛рд░рдг рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИредрдиреБрдХрд╕рд╛рди
рд╣реИрд╢ рдЯреЗрдмрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдореБрджреНрджреЗ рд╣реИрдВ:- рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд░реИрдЦрд┐рдХ рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред
- рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдВрдЬреА рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ
delete
рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рд╕рдореНрдорд┐рд▓рди рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдЙрдкрдпреЛрдЧ рдХреА рджрд░ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд░реАрд╢рд╢ рдХрд░рдиреЗ рдкрд░ рд░рд┐рдореЛрдЯ рдХреАрдЬрд╝ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реИредрд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ 128 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ 124 рдорд┐рд▓рд┐рдпрди рд╕реНрд▓реЙрдЯ рднрд░рдиреЗ рддрдХ 4 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреЛ рдЪрдХреНрд░рд╡рд╛рддреА рд░реВрдк рд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реВрдВрдЧрд╛ (рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ 0.96 рд╣реИ)ред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ CUDA рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 4 рдорд┐рд▓рд┐рдпрди рдирдП рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓ рд╣реИ:рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдмрдврд╝рддрд╛ рд╣реИ, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХрдо рд╣реЛрддреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдпрджрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рддреНрдпрд╛рдЧ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХрд┐рд╕реА рдкреБрд╕реНрддрдХ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЛ рдЧрд┐рдирддреЗ рд╣реБрдП), рддреЛ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЧреИрд░-рдЦрд╛рд▓реА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдХреНрд╕рд░ рдЬрд╛рдирдХрд╛рд░реА рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛рддрд╛ рд╣реИ), рддреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░реЗрд╢рд╛рдиреА рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ 64 рдорд┐рд▓рд┐рдпрди рдЖрд╡реЗрд╖рдг (рдЙрдкрдпреЛрдЧ рдХрд╛рд░рдХ 0.5) рдХреЗ рдмрд╛рдж рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдорд╛рдкрд╛ред рдФрд╕рдд рдЧрд╣рд░рд╛рдИ 0.4774 рдереА, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдпрд╛ рддреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рд╕реНрд▓реЙрдЯ рдореЗрдВ рдпрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдПрдХ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рдереАрдВред рдЕрдзрд┐рдХрддрдо рдзреНрд╡рдирд┐ рдХреА рдЧрд╣рд░рд╛рдИ 60 рдереАредрдлрд┐рд░ рдореИрдВрдиреЗ 124 рдорд┐рд▓рд┐рдпрди рдЖрд╡реЗрд╖рдг (рдЙрдкрдпреЛрдЧ рджрд░ 0.97) рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдзреНрд╡рдирд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдорд╛рдкрд╛ред рдФрд╕рдд рдЧрд╣рд░рд╛рдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 10.1757 рдереА, рдФрд░ рдЕрдзрд┐рдХрддрдо - 6474 (!!)ред рд░реИрдЦрд┐рдХ рдзреНрд╡рдирд┐ рдкреНрд░рджрд░реНрд╢рди рдЙрдЪреНрдЪ рдЙрдкрдпреЛрдЧ рджрд░реЛрдВ рдкрд░ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЧрд┐рд░рддрд╛ рд╣реИредрдЗрд╕ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдХрдо рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, 32-рдмрд┐рдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ 128 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 0.25 рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреБрдгрд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдореЗрдВ 32 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╢реЗрд╖ 96 рдорд┐рд▓рд┐рдпрди рд╕реНрд▓реЙрдЯ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ - рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП 8 рдмрд╛рдЗрдЯреНрд╕, 768 рдПрдордмреА рдХреА рдЦреЛрдИ рдЧрдИ рдореЗрдореЛрд░реАредрдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдореЛрд░реА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╕рдВрд╕рд╛рдзрди рд╣реИред рдпрджреНрдпрдкрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдЬреЛ CUDA рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рдХрдо рд╕реЗ рдХрдо 4 рдЬреАрдмреА рдореЗрдореЛрд░реА рд╣реЛрддреА рд╣реИ (рд▓реЗрдЦрди рдХреЗ рд╕рдордп, NVIDIA 2080 рддрд┐рд╡рд╛рд░реА рдореЗрдВ 11 рдЬреАрдмреА рд╣реИ), рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЦреЛрдирд╛ рд╕рдмрд╕реЗ рдмреБрджреНрдзрд┐рдорд╛рдиреА рдХрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛редрдмрд╛рдж рдореЗрдВ рдореИрдВ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдЦреВрдВрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдзреНрд╡рдирд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рджреВрд░рд╕реНрде рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреАредрд╕реЗрдВрд╕рд┐рдВрдЧ рдбреЗрдкреНрде рдореЗрдЬрд░рдореЗрдВрдЯ
рдХреБрдВрдЬреА рд▓рдЧрдиреЗ рдХреА рдЧрд╣рд░рд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдХреБрдВрдЬреА рд╣реИрд╢ (рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЖрджрд░реНрд╢ рд╕реВрдЪрдХрд╛рдВрдХ) рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);
рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдореЗрдВ рджреЛ рдмрд╛рдЗрдирд░реА рдирдВрдмрд░реЛрдВ рдХреЗ рдЬрд╛рджреВ рдХреЗ рдХрд╛рд░рдг рдФрд░ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдХрд┐ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреА рдХреНрд╖рдорддрд╛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдХреБрдВрдЬреА рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдХреБрдВрдЬреА рд▓реЗрдВ рдЬрд┐рд╕реЗ 1 рдкрд░ рд╣реИрд╢реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд▓реЙрдЯ 3 рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рдХреНрд╖рдорддрд╛ 4 рд╡рд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ (3 тАФ 1) & 3
рдЬреЛ 2 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд▓рд┐рдЦреЗрдВ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рд╖рдп рдЦреЛрд▓реЗрдВ редрдпрд╣ рдХреЛрдб рдХреБрдЫ рдорд╣рд╛рди рд▓реЗрдЦреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ:рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрди, рд╣реИрд╢ рд░реЙрдмрд┐рди рд╣реБрдб рдФрд░ рдХреЛрдпрд▓ рд╣реИрд╢ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред