GPU рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛


рдореИрдВрдиреЗ рдЬреАрдердм рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреАрдПрдкреА рд╣реИрд╢ рдЯреЗрдмрд▓ рдирд╛рдордХ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреЛрд╕реНрдЯ рдХреА ред

рдпрд╣ 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 рдзрд╛рдЧреЗ рдореЗрдВ:

// 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()рдПрдХ рд╕рд╛рдзрд╛рд░рдг (рд╕рд╛рджрд╛) рдпрд╛ рдЪрд░ (рд╡рд╛рд╖реНрдкрд╢реАрд▓) рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред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 рдорд┐рд▓рд┐рдпрди рдирдП рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓ рд╣реИ:

рдкреНрд░рдпреЛрдЧ рджрд░рд╕рдореНрдорд┐рд▓рди 4 194 304 рддрддреНрд╡реЛрдВ рдХреА рдЕрд╡рдзрд┐
0.0011.608448 рдПрдордПрд╕ (361.314798 рдорд┐рд▓рд┐рдпрди рдХреБрдВрдЬреА / рд╕реЗрдХрдВрдб)
0,0311,751424 (356,918799 /.)
0,0611,942592 (351,205515 /.)
0,0912,081120 (347,178429 /.)
0,1212,242560 (342,600233 /.)
0,1612,396448 (338,347235 /.)
0,1912,533024 (334,660176 /.)
0,2212,703328 (330,173626 /.)
0,2512,884512 (325,530693 /.)
0,2813,033472 (321,810182 /.)
0,3113,239296 (316,807174 /.)
0,3413,392448 (313,184256 /.)
0,3713,624000 (307,861434 /.)
0,4113,875520 (302,280855 /.)
0,4414,126528 (296,909756 /.)
0,4714,399328 (291,284699 /.)
0,5014,690304 (285,515123 /.)
0,5315,039136 (278,892623 /.)
0,5615,478656 (270,973402 /.)
0,5915,985664 (262,379092 /.)
0,6216,668673 (251,627968 /.)
0,6617,587200 (238,486174 /.)
0,6918,690048 (224,413765 /.)
0,7220,278816 (206,831789 /.)
0,7522,545408 (186,038058 /.)
0,7826,053312 (160,989275 /.)
0,8131,895008 (131,503463 /.)
0,8442,103294 (99,619378 /.)
0,8761,849056 (67,815164 /.)
0,90105,695999 (39,682713 /.)
0,94240,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 рддрд┐рд╡рд╛рд░реА рдореЗрдВ 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 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд▓рд┐рдЦреЗрдВ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд┐рд╖рдп рдЦреЛрд▓реЗрдВ ред

рдпрд╣ рдХреЛрдб рдХреБрдЫ рдорд╣рд╛рди рд▓реЗрдЦреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ:


рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрди, рд╣реИрд╢ рд░реЙрдмрд┐рди рд╣реБрдб рдФрд░ рдХреЛрдпрд▓ рд╣реИрд╢ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

All Articles