GPU рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░рд▓ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛

GPU рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░рд▓ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛
рдореИрд▓реЗ Github рдорд╛ рдкреЛрд╕реНрдЯ рдЧрд░реЗрдВ рдирдпрд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг GPU рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛.

рдпреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг GPU рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛ рдЬреБрди рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб рд▓рд╛рдЦреМрдВ рдЗрдиреНрд╕рд░реНрдЯрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рд╕рдХреНрд╖рдо рдЫред рдореЗрд░реЛ NVIDIA GTX 1060 рд▓реНрдпрд╛рдкрдЯрдкрдорд╛, рдХреЛрдбрд▓реЗ рд▓рдЧрднрдЧ 64 ms рдорд╛ 210 рдорд┐рд▓рд┐рдпрди рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдЙрддреНрдкрдиреНрди рдХреБрдЮреНрдЬреА-рдорд╛рди рдЬреЛрдбреАрд╣рд░реВ рдШреБрд╕рд╛рдЙрдБрдЫ рд░ рд▓рдЧрднрдЧ 32 ms рдорд╛ 64 рдорд┐рд▓рд┐рдпрди рдЬреЛрдбреАрд╣рд░реВ рд╣рдЯрд╛рдЙрдБрдЫред

рдЕрд░реНрдерд╛рддреН, рд▓реНрдпрд╛рдкрдЯрдкрдХреЛ рдЧрддрд┐ рд▓рдЧрднрдЧ рейреж рдХрд░реЛрдб рдЗрдиреНрд╕рд░реНрдЯ/рд╕реЗрдХреЗрдиреНрдб рд░ релреж рдХрд░реЛрдб рдбрд┐рд▓рд┐рдЯ/рд╕реЗрдХреЗрдиреНрдб рд╣реБрдиреНрдЫред

рддрд╛рд▓рд┐рдХрд╛ CUDA рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рдпрджреНрдпрдкрд┐ рдЙрд╣реА рдкреНрд░рд╡рд┐рдзрд┐ HLSL рд╡рд╛ GLSL рдорд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрдорд╛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдзреЗрд░реИ рд╕реАрдорд╛рд╣рд░реВ рдЫрдиреН:

  • рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рд╕рдорд╛рди рдорд╛рдирд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред
  • рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдЫред
  • рд░ рдпреЛ рд╕рд╛рдЗрдЬ рдкрд╛рд╡рд░рдорд╛ рджреБрдИ рдмрд░рд╛рдмрд░ рд╣реБрдиреБрдкрд░реНрдЫред

рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рдорд╛рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрд▓рд┐рдорд┐рдЯрд░ рдорд╛рд░реНрдХрд░ рдЖрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рдорд╛рдерд┐рдХреЛ рдХреЛрдбрдорд╛ рдпреЛ 0xffffffff рд╣реЛ)ред

рддрд╛рд▓рд╛ рдмрд┐рдирд╛ рд╣реНрдпрд╛рд╕ рдЯреЗрдмрд▓

рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рдЦреБрд▓рд╛ рдареЗрдЧрд╛рдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рд░реИрдЦрд┐рдХ рдЬрд╛рдБрдЪ, рддреНрдпреЛ рд╣реЛ, рдпреЛ рдХреЗрд╡рд▓ рдХреБрдЮреНрдЬреА-рдорд╛рди рдЬреЛрдбреАрд╣рд░реВрдХреЛ рдПрд░реЗ рд╣реЛ рдЬреБрди рдореЗрдореЛрд░реАрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдЙрдЪреНрдЪ рдХреНрдпрд╛рд╕ рдкреНрд░рджрд░реНрд╢рди рдЫред рдЪреЗрдирд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдпрд╣реА рднрдиреНрди рд╕рдХрд┐рдБрджреИрди, рдЬрд╕рдорд╛ рд▓рд┐рдЩреНрдХ рдЧрд░рд┐рдПрдХреЛ рд╕реВрдЪреАрдорд╛ рд╕реВрдЪрдХ рдЦреЛрдЬреНрдиреБ рд╕рдорд╛рд╡реЗрд╢ рдЫред рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рднрдгреНрдбрд╛рд░рдг рддрддреНрд╡ рд╣реЛ KeyValue:

struct KeyValue
{
    uint32_t key;
    uint32_t value;
};

рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЖрдХрд╛рд░ рджреБрдИрдХреЛ рдкрд╛рд╡рд░ рд╣реЛ, рдкреНрд░рд╛рдЗрдо рдирдореНрдмрд░ рд╣реЛрдЗрди, рдХрд┐рдирднрдиреЗ pow2/AND рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рджреНрд░реБрдд рдирд┐рд░реНрджреЗрд╢рди рдкрд░реНрдпрд╛рдкреНрдд рдЫ, рддрд░ рдореЛрдбреБрд▓рд╕ рдЕрдкрд░реЗрдЯрд░ рдзреЗрд░реИ рдврд┐рд▓реЛ рдЫред рдпреЛ рд░реИрдЦрд┐рдХ рдЬрд╛рдБрдЪрдХреЛ рдорд╛рдорд▓рд╛рдорд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рдХрд┐рдирдХрд┐ рд░реЗрдЦреАрдп рддрд╛рд▓рд┐рдХрд╛ рд▓реБрдХрдЕрдкрдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓рдЯрдорд╛ рд╕реНрд▓рдЯ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмреЗрд░рд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рд░ рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд▓рд╛рдЧрдд рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓рдЯрдорд╛ рдореЛрдбреНрдпреБрд▓реЛ рдердкрд┐рдПрдХреЛ рдЫред

рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡рдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдЮреНрдЬреА рд░ рдорд╛рди рдорд╛рддреНрд░ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫ, рдХреБрдЮреНрдЬреАрдХреЛ рд╣реНрдпрд╛рд╕ рд╣реЛрдЗрдиред рддрд╛рд▓рд┐рдХрд╛рд▓реЗ 32-рдмрд┐рдЯ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдорд╛рддреНрд░ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ рднрдПрдХреЛрд▓реЗ, рд╣реНрдпрд╛рд╕ рдзреЗрд░реИ рдЫрд┐рдЯреЛ рдЧрдгрдирд╛ рдЧрд░рд┐рдиреНрдЫред рдорд╛рдерд┐рдХреЛ рдХреЛрдбрд▓реЗ Murmur3 рд╣реНрдпрд╛рд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ рдХреЗрд╣реА рд╢рд┐рдлреНрдЯрд╣рд░реВ, XORs рд░ рдЧреБрдгрди рдорд╛рддреНрд░ рдЧрд░реНрдЫред

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

рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рдорд╛рдирд╣рд░реВ рдЦрд╛рд▓реА рдЧрд░реНрди рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдЫрдиреНред

рдХреЛрдб 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 рдХреЛ рд▓рд╛рдЧрд┐ рд▓рдЧрднрдЧ рдХреБрдиреИ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдЫреИрди:

GPU рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░рд▓ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛
std::unordered_map рддрддреНрд╡рд╣рд░реВ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрди рд░ рд╣рдЯрд╛рдЙрди рд░ рддреНрдпрд╕рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдореБрдХреНрдд рдЧрд░реНрди 70 ms рдЦрд░реНрдЪ рдЧрд░рд┐рдпреЛ unordered_map (рд▓рд╛рдЦреМрдВ рддрддреНрд╡рд╣рд░реВрдмрд╛рдЯ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдЙрди рдзреЗрд░реИ рд╕рдордп рд▓рд╛рдЧреНрдЫ, рдХрд┐рдирднрдиреЗ рднрд┐рддреНрд░ unordered_map рдзреЗрд░реИ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдЧрд░рд┐рдПрдХреЛ рдЫ)ред рдЗрдорд╛рдирджрд╛рд░реАрдкреВрд░реНрд╡рдХ рднрдиреНрдиреБ рдкрд░реНрджрд╛, std:unordered_map рдкреВрд░реНрдгрддрдпрд╛ рдлрд░рдХ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВред рдпреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдПрдХрд▓ CPU рдереНрд░реЗрдб рд╣реЛ, рдХреБрдиреИ рдкрдирд┐ рдЖрдХрд╛рд░рдХреЛ рдореБрдЦреНрдп-рдорд╛рдирд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ, рдЙрдЪреНрдЪ рдЙрдкрдпреЛрдЧ рджрд░рд╣рд░реВрдорд╛ рд░рд╛рдореНрд░реЛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджрдЫ, рд░ рдзреЗрд░реИ рдореЗрдЯрд╛рдЗрд╕рдХреЗрдкрдЫрд┐ рд╕реНрдерд┐рд░ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦрд╛рдЙрдБрджрдЫред

GPU рд░ рдЕрдиреНрддрд░-рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдЪрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЕрд╡рдзрд┐ 984 ms рдерд┐рдпреЛред рдпрд╕рдорд╛ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рдореЗрдореЛрд░реАрдорд╛ рд░рд╛рдЦреНрдиреЗ рд░ рдореЗрдЯрд╛рдЙрдиреЗ рд╕рдордп (1 GB рдореЗрдореЛрд░реА рдПрдХ рдкрдЯрдХ рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрдиреЗ, рдЬреБрди CUDA рдорд╛ рдХреЗрд╣реА рд╕рдордп рд▓рд╛рдЧреНрдЫ), рддрддреНрд╡рд╣рд░реВ рдШреБрд╕рд╛рдЙрдиреЗ рд░ рдореЗрдЯрд╛рдЙрдиреЗ, рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреЗ рд╕рдордп рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдореЛрд░реАрдорд╛ рд░ рдмрд╛рдЯ рд╕рдмреИ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВ рдкрдирд┐ рдЦрд╛рддрд╛рдорд╛ рд▓рд┐рдЗрдиреНрдЫред

рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдЖрдлреИрд▓реЗ рдкреВрд░рд╛ рдЧрд░реНрди 271 рдПрдордПрд╕ рд▓рд┐рдпреЛред рдпрд╕рдорд╛ рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрд▓реЗ рддрддреНрд╡рд╣рд░реВ рдШреБрд╕рд╛рдЙрди рд░ рдореЗрдЯрд╛рдЙрди рдмрд┐рддрд╛рдПрдХреЛ рд╕рдордп рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рд░ рдореЗрдореЛрд░реАрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд░ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛рдорд╛ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрди рдмрд┐рддрд╛рдПрдХреЛ рд╕рдордпрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИрдиред рдпрджрд┐ GPU рддрд╛рд▓рд┐рдХрд╛ рд▓рд╛рдореЛ рд╕рдордпрд╕рдореНрдо рдЬреАрд╡рд┐рдд рдЫ рднрдиреЗ, рд╡рд╛ рдпрджрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрдХреЛ рдореЗрдореЛрд░реАрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЬреБрди рдЕрдиреНрдп GPU рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫ рд░ рдХреЗрдиреНрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░рд▓реЗ рд╣реЛрдЗрди), рддреНрдпрд╕рдкрдЫрд┐ред рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫред

рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рдЙрдЪреНрдЪ рдереНрд░реБрдкреБрдЯ рд░ рд╕рдХреНрд░рд┐рдп рд╕рдорд╛рдирд╛рдиреНрддрд░рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦрд╛рдЙрдБрдЫред

рдХрдореАрдХрдордЬреЛрд░реА

рд╣реНрдпрд╛рд╕ рдЯреЗрдмрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рдБрдЧ рд╕рдЪреЗрдд рд╣реБрди рдХреЗрд╣реА рдореБрджреНрджрд╛рд╣рд░реВ рдЫрдиреН:

  • рд░реИрдЦрд┐рдХ рдЬрд╛рдБрдЪрд▓рд╛рдИ рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩрд▓реЗ рдмрд╛рдзрд╛ рдкреБрд░реНтАНрдпрд╛рдПрдХреЛ рдЫ, рдЬрд╕рд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВрд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдХрдо рд░рд╛рдЦреНрдЫред
  • рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреБрдЮреНрдЬреАрд╣рд░реВ рд╣рдЯрд╛рдЗрдПрдХреЛ рдЫреИрди delete рд░ рд╕рдордп рдмрд┐рддреНрджреИ рдЬрд╛рдБрджрд╛ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЯреЗрдмрд▓рд▓рд╛рдИ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдкрд╛рд░реНрдЫрдиреНред

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдмрд┐рд╕реНрддрд╛рд░реИ рдШрдЯреНрди рд╕рдХреНрдЫ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдпрджрд┐ рдпреЛ рд▓рд╛рдореЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд╡рд╕реНрдерд┐рдд рдЫ рд░ рдзреЗрд░реИ рдШреБрд╕рд╛рдЙрдиреЗ рд░ рдореЗрдЯрд╛рдЙрдиреЗ рдЫред рдпреА рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВрд▓рд╛рдИ рдХрдо рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рддрд░рд┐рдХрд╛ рдПрдХрджрдо рдХрдо рдЙрдкрдпреЛрдЧ рджрд░рдХреЛ рд╕рд╛рде рдирдпрд╛рдБ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкреБрди: рд╣реНрдпрд╛рд╕ рдЧрд░реНрдиреБ рд░ рдкреБрди: рд╣реНрдпрд╛рд╕рд┐рдЩрдХреЛ рдХреНрд░рдордорд╛ рд╣рдЯрд╛рдЗрдПрдХрд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВрд▓рд╛рдИ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрдиреБ рд╣реЛред

рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рдореБрджреНрджрд╛рд╣рд░реВ рдЪрд┐рддреНрд░рдг рдЧрд░реНрди, рдореИрд▓реЗ 128 рдорд┐рд▓рд┐рдпрди рд╕реНрд▓рдЯрд╣рд░реВ (рд▓рдЧрднрдЧ 4 рдХреЛ рдЙрдкрдпреЛрдЧ рджрд░) рднрд░реНрди рдирд╕рдХреЗрд╕рдореНрдо 124 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡рд╣рд░реВ рд░ 0,96 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡рд╣рд░реВ рдорд╛рд░реНрдлрдд рд▓реБрдк рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдерд┐рдХреЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдЫ, рдкреНрд░рддреНрдпреЗрдХ рдкрдЩреНрдХреНрддрд┐ рдПрдХ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ 4 рдорд┐рд▓рд┐рдпрди рдирдпрд╛рдБ рддрддреНрд╡рд╣рд░реВ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрди CUDA рдХрд░реНрдиреЗрд▓ рдХрд▓ рд╣реЛ:

рдЙрдкрдпреЛрдЧ рджрд░
рд╕рдореНрдорд┐рд▓рди рдЕрд╡рдзрд┐ 4 рддрддреНрд╡рд╣рд░реВ

0,00
11,608448 ms (361,314798 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,03
11,751424 ms (356,918799 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,06
11,942592 ms (351,205515 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,09
12,081120 ms (347,178429 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,12
12,242560 ms (342,600233 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,16
12,396448 ms (338,347235 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,19
12,533024 ms (334,660176 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,22
12,703328 ms (330,173626 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,25
12,884512 ms (325,530693 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,28
13,033472 ms (321,810182 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,31
13,239296 ms (316,807174 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,34
13,392448 ms (313,184256 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,37
13,624000 ms (307,861434 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,41
13,875520 ms (302,280855 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,44
14,126528 ms (296,909756 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,47
14,399328 ms (291,284699 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,50
14,690304 ms (285,515123 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,53
15,039136 ms (278,892623 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,56
15,478656 ms (270,973402 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,59
15,985664 ms (262,379092 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,62
16,668673 ms (251,627968 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,66
17,587200 ms (238,486174 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,69
18,690048 ms (224,413765 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,72
20,278816 ms (206,831789 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,75
22,545408 ms (186,038058 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,78
26,053312 ms (160,989275 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,81
31,895008 ms (131,503463 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,84
42,103294 ms (99,619378 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,87
61,849056 ms (67,815164 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,90
105,695999 ms (39,682713 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

0,94
240,204636 ms (17,461378 рдорд┐рд▓рд┐рдпрди рдХреБрдЮреНрдЬреА/рд╕реЗрдХреЗрдиреНрдбред)

рдЬрддрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдвреНрдЫ, рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдШрдЯреНрджреИ рдЬрд╛рдиреНрдЫред рдпреЛ рдзреЗрд░реИ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╡рд╛рдВрдЫрдиреАрдп рдЫреИрдиред рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рддрддреНрд╡рд╣рд░реВ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЦрд╛рд░реЗрдЬ рдЧрд░реНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреБрд╕реНрддрдХрдорд╛ рд╢рдмреНрджрд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрджрд╛), рддрдм рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЗрдиред рддрд░ рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рд▓рд╛рдореЛ рд╕рдордпрд╕рдореНрдо рдЪрд▓реНрдиреЗ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдЧреИрд░-рдЦрд╛рд▓реА рднрд╛рдЧрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдореНрдкрд╛рджрдХрдорд╛ рдЬрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдмрд╛рд░рдореНрдмрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдШреБрд╕рд╛рдЙрдБрджрдЫ рд░ рдореЗрдЯрд╛рдЙрдБрдЫ), рддрдм рдпреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реБрди рд╕рдХреНрдЫред

рд░ 64 рдорд┐рд▓рд┐рдпрди рд╕рдореНрдорд┐рд▓рд┐рддрд╣рд░реВ (рдЙрдкрдпреЛрдЧ рдХрд╛рд░рдХ 0,5) рдкрдЫрд┐ рд╣реНрдпрд╛рд╕ рдЯреЗрдмрд▓ рдкреНрд░реЛрдмрд┐рдЩ рдЧрд╣рд┐рд░рд╛рдЗ рдорд╛рдкрди рдЧрд░рд┐рдпреЛред рдФрд╕рдд рдЧрд╣рд┐рд░рд╛рдИ 0,4774 рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдзреЗрд░реИрдЬрд╕реЛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдпрд╛ рдд рдЙрддреНрддрдо рд╕рдореНрднрд╛рд╡рд┐рдд рд╕реНрд▓рдЯрдорд╛ рдерд┐рдП рд╡рд╛ рдЙрддреНрддрдо рд╕реНрдерд╛рдирдмрд╛рдЯ рдПрдХ рд╕реНрд▓рдЯ рдЯрд╛рдврд╛ рдерд┐рдПред рдЕрдзрд┐рдХрддрдо рдзреНрд╡рдирд┐ рдЧрд╣рд┐рд░рд╛рдИ 60 рдерд┐рдпреЛред

рддреНрдпрд╕рдкрдЫрд┐ рдореИрд▓реЗ резреирек рдорд┐рд▓рд┐рдпрди рдЗрдиреНрд╕рд░реНрдЯрд╣рд░реВ (рдЙрдкрдпреЛрдЧ рдХрд╛рд░рдХ реж.репрен) рднрдПрдХреЛ рдЯреЗрдмреБрд▓рдорд╛ рдкреНрд░реЛрдмрд┐рдЩ рдЧрд╣рд┐рд░рд╛рдЗ рдорд╛рдкрди рдЧрд░реЗрдВред рдФрд╕рдд рдЧрд╣рд┐рд░рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ 124 рдерд┐рдпреЛ, рд░ рдЕрдзрд┐рдХрддрдо - 6474 (!!) рд░реИрдЦрд┐рдХ рд╕реЗрдиреНрд╕рд┐рдЩ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдЙрдЪреНрдЪ рдЙрдкрдпреЛрдЧ рджрд░рд╣рд░реВрдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдШрдЯреНрдЫред

рдпреЛ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЙрдкрдпреЛрдЧ рджрд░ рдХрдо рд░рд╛рдЦреНрди рд╕рдмреИ рднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдЫред рддрд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдореЗрдореЛрд░реА рдЦрдкрддрдХреЛ рдЦрд░реНрдЪрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдмрдврд╛рдЙрдБрдЫреМрдВред рд╕реМрднрд╛рдЧреНрдп рджреЗрдЦрд┐, 32-рдмрд┐рдЯ рдХреБрдЮреНрдЬреА рд░ рдорд╛рди рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛, рдпреЛ рдЬрд╛рдпрдЬ рд╣реБрди рд╕рдХреНрдЫред рдпрджрд┐ рдорд╛рдерд┐рдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, 128 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡рд╣рд░реВ рднрдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдорд╛, рд╣рд╛рдореАрд▓реЗ 0,25 рдХреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░рдХ рд░рд╛рдЦреНрдЫреМрдВ, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпрд╕рдорд╛ 32 рдорд┐рд▓рд┐рдпрди рднрдиреНрджрд╛ рдмрдвреА рддрддреНрд╡рд╣рд░реВ рд░рд╛рдЦреНрди рд╕рдХреНрджреИрдиреМрдВ, рд░ рдмрд╛рдБрдХреА 96 рдорд┐рд▓рд┐рдпрди рд╕реНрд▓рдЯрд╣рд░реВ рд╣рд░рд╛рдЙрдиреЗрдЫрдиреН - рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбреАрдХреЛ рд▓рд╛рдЧрд┐ 8 рдмрд╛рдЗрдЯрд╣рд░реВред , 768 MB рд╣рд░рд╛рдПрдХреЛ рдореЗрдореЛрд░реАред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╣рд╛рдореА рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдореЛрд░реАрдХреЛ рд╣рд╛рдирд┐рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВ, рдЬреБрди рдкреНрд░рдгрд╛рд▓реА рдореЗрдореЛрд░реА рднрдиреНрджрд╛ рдмрдвреА рдореВрд▓реНрдпрд╡рд╛рди рд╕реНрд░реЛрдд рд╣реЛред рдпрджреНрдпрдкрд┐ рдзреЗрд░реИ рдЖрдзреБрдирд┐рдХ рдбреЗрд╕реНрдХрдЯрдк рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдбрд╣рд░реВ рдЬрд╕рд▓реЗ CUDA рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ рдХрдореНрддрд┐рдорд╛ 4 GB рдореЗрдореЛрд░реА рдЫ (рд▓реЗрдЦреНрдиреЗ рд╕рдордпрдорд╛, NVIDIA 2080 Ti рдорд╛ 11 GB рдЫ), рдпреЛ рдЕрдЭреИ рдкрдирд┐ рдпрд╕реНрддреЛ рд░рдХрдо рдЧреБрдорд╛рдЙрдиреБ рдмреБрджреНрдзрд┐рдорд╛рдиреА рдирд┐рд░реНрдгрдп рд╣реБрдиреЗрдЫреИрдиред

рдкрдЫрд┐ рдо рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдердк рд▓реЗрдЦреНрдиреЗрдЫреБ рдЬрд╕рдорд╛ рдЧрд╣рд┐рд░рд╛рдЗ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдорд╕реНрдпрд╛ рдЫреИрди, рд╕рд╛рдереИ рдореЗрдЯрд╛рдЗрдПрдХрд╛ рд╕реНрд▓рдЯрд╣рд░реВ рдкреБрди: рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛рд╣рд░реВред

рдзреНрд╡рдирд┐ рдЧрд╣рд┐рд░рд╛рдИ рдорд╛рдкрди

рдХреБрдЮреНрдЬреАрдХреЛ рдЬрд╛рдБрдЪ рдЧрд╣рд┐рд░рд╛рдЗ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди, рд╣рд╛рдореА рдпрд╕рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдмрд╛рдЯ рдХреБрдЮреНрдЬреАрдХреЛ рд╣реНрдпрд╛рд╕ (рдпрд╕рдХреЛ рдЖрджрд░реНрд╢ рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛) рдирд┐рдХрд╛рд▓реНрди рд╕рдХреНрдЫреМрдВ:

// get_key_index() -> index of key in hash table
uint32_t probelength = (get_key_index(key) - hash(key)) & (hashtablecapacity-1);

рджреБрдИрдХреЛ рджреБрдИрдХреЛ рдкреВрд░рдХ рдмрд╛рдЗрдирд░реА рд╕рдВрдЦреНрдпрд╛рд╣рд░реВрдХреЛ рдЬрд╛рджреВ рд░ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдХреНрд╖рдорддрд╛ рджреБрдИрдХреЛ рдкрд╛рд╡рд░рдорд╛ рджреБрдИ рд░рд╣реЗрдХреЛ рддрдереНрдпрд▓реЗ рдЧрд░реНрджрд╛, рдХреБрдЮреНрдЬреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд▓рд╛рдИ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд╕реБрд░реБрдорд╛ рд╕рд╛рд░рд┐рдпреЛ рднрдиреЗ рдкрдирд┐ рдпреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред 1 рдорд╛ рд╣реНрдпрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдХреБрдЮреНрдЬреА рд▓рд┐рдиреБрд╣реЛрд╕реН, рддрд░ рд╕реНрд▓рдЯ 3 рдорд╛ рдШреБрд╕рд╛рдЗрдПрдХреЛ рдЫред рддреНрдпрд╕рдкрдЫрд┐ рдХреНрд╖рдорддрд╛ 4 рднрдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЙрдБрдЫреМрдВред (3 тАФ 1) & 3, рдЬреБрди 2 рдХреЛ рдмрд░рд╛рдмрд░ рдЫред

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

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдкреНрд░рд╢реНрди рд╡рд╛ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВ рдЫрдиреН рднрдиреЗ, рдХреГрдкрдпрд╛ рдорд▓рд╛рдИ рдЗрдореЗрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН twitter рд╡рд╛ рдирдпрд╛рдБ рд╡рд┐рд╖рдп рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН рднрдгреНрдбрд╛рд░рд╣рд░реВ.

рдпреЛ рдХреЛрдб рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦрдмрд╛рдЯ рдкреНрд░реЗрд░рдгрд╛ рдЕрдиреНрддрд░реНрдЧрдд рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ:

рднрд╡рд┐рд╖реНрдпрдорд╛, рдо рднрд┐рдбрд┐рдпреЛ рдХрд╛рд░реНрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦреНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреЗрдЫреБ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗрдЫреБред рдореЗрд░рд╛ рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдЪреЗрдирд┐рдЩ, рд░реЛрдмрд┐рди рд╣реБрдб рд╣реНрдпрд╛рд╕рд┐рдЩ, рд░ GPU рдЕрдиреБрдХреВрд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВрдорд╛ рдкрд░рдорд╛рдгреБ рдЕрдкрд░реЗрд╕рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреЛрдпрд▓ рд╣реНрдпрд╛рд╕рд┐рдЩ рд╕рдорд╛рд╡реЗрд╢ рдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди