CUDA: рдмреНрд▓реЙрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди

рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рджреЛ рдРрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ: i ) рдкреНрд░рддреНрдпреЗрдХ j- th рд╕реНрдЯреНрд░реАрдо рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ j- th рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, ii ) рдЗрд╕ рдзрд╛рд░рд╛ рдХреЛ рдПрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЕрдзрд┐рдХ "рдкрдбрд╝реЛрд╕реА" рдзрд╛рдЧреЗред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдЕрд╡рд░реЛрдз рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ рддрдм рддрдХ рдЦрддреНрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╕рднреА рдиреЗ рдЕрдкрдиреЗ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ (рдЪрд░рдг ( i )) рдореЗрдВ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реЛред рдЕрдиреНрдпрдерд╛, рдХреБрдЫ рдереНрд░реЗрдб рдЪрд░рдг ( ii ) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдХреБрдЫ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рдиреЗ рдЕрднреА рддрдХ рдЪрд░рдг ( i ) рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЦреЗрджрдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди CUDA рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА GPU рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдб рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдЖрдк рдЗрд╕ рд╕рдВрдХрдЯ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рд╛рд▓рд╛рдБрдХрд┐, Google, рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдпрд╣ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╕рдВрддреЛрд╖рдЬрдирдХ рдиреБрд╕реНрдЦрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рдФрд░ рд╢реБрд░реБрдЖрддреА (рдЬреЛ рдореИрдВ рд╣реВрдВ) рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВред



CUDA рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ [1,2] рдФрд░ рд╕реНрд▓рд╛рдЗрдбреНрд╕ [3,4] , рд╡рд┐рднрд┐рдиреНрди рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рд╛рдЗрдЯреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА [5-11], рд╕рд╛рдорд╛рдиреНрдп рддрд╕реНрд╡реАрд░ рдЬреЛ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, CUDA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВред рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░, рдЙрд╕реЗ SIMT ( рд╕рд┐рдВрдЧрд▓-рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди, рдорд▓реНрдЯреАрдкрд▓-рдереНрд░реЗрдб ) рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рддрд╛ рд╣реИ - рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдХрдИ рдпрд╛ рдХрдо рд╕реНрд╡рддрдВрддреНрд░ рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХрд▓ рдХрд╛рд░реНрдп (рдЪрд┐рддреНрд░ 1 рджреЗрдЦреЗрдВ) рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЗрди рд╕рднреА рдзрд╛рдЧреЛрдВ рдХреА рд╕рдордЧреНрд░рддрд╛ рдХреЛ рдЧреНрд░рд┐рдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЕрдВрдЬреАрд░ред  1ред

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

рдЕрдВрдЬреАрд░ред  2ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдЯреЗрд╕реНрд▓рд╛ рдореЗрдВ 30 рдПрд╕рдПрдо рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 8 рд╕реНрдХреЗрд▓рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди 240 рдХреЛрд░ рдкрд░, рдЖрдк рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддрдВрддреНрд░реЛрдВ рдХреА рдмрджреМрд▓рдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ (1) рд╕реЗ рдЧреНрд░рд┐рдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрди рдХреЛрд░ рдФрд░ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рджреЛрдиреЛрдВ рдХрд╛ рдХрд╛рд░реНрдп рд╕рдордп)ред рдФрд░ рдмрд╕ рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИрдВред

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

рдЕрдВрдЬреАрд░ред  3ред

рдкреНрд░рддреНрдпреЗрдХ рдПрд╕рдПрдо рдореЗрдВ, рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдЗрдХрд╛рдИ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рд╕рдВрд╕рд╛рдзрди рд╡рд┐рддрд░рд┐рдд рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдордп рдкрд░ рд╣рд░ рдХреНрд╖рдг, рдПрдХ рдПрд╕рдПрдо рдХреЗ рд╕рднреА рдХрд░реНрдиреЗрд▓ рдПрдХ рддрд╛рдирд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЗрд╕ рдПрд╕рдПрдо рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдЕрдЧрд▓рд╛ рддрд╛рдирд╛ рдЪрд╛рд▓рд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ CUDA рдХреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░рдг рдПрдХ рддрд╛рдирд╛ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реИ рдФрд░ рдЗрд╕реЗ SIMD ( рд╕рд┐рдВрдЧрд▓ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди, рдорд▓реНрдЯреАрдкрд▓ рдбреЗрдЯрд╛ ) рдХреЗ рдХрд░реАрдм рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд╛рдирд╛ рд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рднреА рд╕рд┐рдВрдХ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░, рдХреЛрдИ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ CUDA рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛ рд╕рдВрдЧрдарди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рддрдХ рдзрд╛рдЧреЗ рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд╣реБрдВрдЪ рдХреА рдЙрдЪреНрдЪрддрдо рдбрд┐рдЧреНрд░реА рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА (рднреМрддрд┐рдХ рдореЗрдореЛрд░реА ) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ, рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдбреЗрдкреНрдЯрд░ рдмреЛрд░реНрдб рдкрд░ рд╕реАрд▓ рдХрд┐рдП рдЧрдП рдПрдХреАрдХреГрдд рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ - рд╡рд╣реА рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА, рдЬрд┐рд╕реЗ рдЕрдм рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд╛ рд╕реНрдерд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдзреАрдорд╛ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреА "рд╕реБрдЧрдорддрд╛ рдХреА рдбрд┐рдЧреНрд░реА" рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рд╣реИ : рдкреНрд░рддреНрдпреЗрдХ рдПрд╕рдПрдо (рдЫрд╡рд┐ 2 рджреЗрдЦреЗрдВ) рдореЗрдВ рд╕реНрдерд┐рдд рдмреНрд▓реЙрдХ, рдЖрдорддреМрд░ рдкрд░ рдЖрдХрд╛рд░ рдореЗрдВ 16KB (1) , рдХреЗрд╡рд▓ рдЙрди рдереНрд░реЗрдбреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдПрд╕рдПрдо рдХреЗ рдХреЛрд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ рдЕрдВрдЬреАрд░ред 1, рдЕрдВрдЬреАрд░ред 3)ред рдЪреВрдВрдХрд┐ рдПрдХ рдПрд╕рдПрдо рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд╕рдПрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреА рдкреВрд░реА рдорд╛рддреНрд░рд╛ рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрд╕рдПрдо рдХреЛрд░ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдХрд╣реАрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдЧрддрд┐, рд╕реНрдореГрддрд┐ рдХреЗ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рдкрд╣реБрдВрдЪ рдЧрддрд┐ рд╣реИред рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬреЛ рдкреНрд░рд╛рдердорд┐рдХ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдореЗрдореЛрд░реА рд╣реИред рдЗрд╕ рдПрд╕рдПрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдПрд╕рдПрдо рдХреЗ рд╕рднреА рдХреИрд╢ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдзрд╛рдЧреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЙрд╕реЗ рдФрд░ рдХреЗрд╡рд▓ рдЙрд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред CUDA рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдЪрд┐рддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ (рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрджрд╛ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░): рдПрдХ рд╣реА рдЯреЗрд╕реНрд▓рд╛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдПрд╕рдПрдо 32-рдмрд┐рдЯ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ (1) рдХреЗ 16384 рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

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

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

рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рдХрд░реЗрдВ


рдЗрд╕рд▓рд┐рдП, рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдбреЙрдкреНрдЯрд░ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рджреЛ рдЦрдВрдб рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВ: X [] рдФрд░ P [] рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 128 рддрддреНрд╡ред рд╕рд░рдгреА X [] рд╣реЛрд╕реНрдЯ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд░реИрдо рд╕реЗ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛)ред 64 рдереНрд░реЗрдбреНрд╕ рдХреЗ рджреЛ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ - рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ, рдХреБрд▓ 128 рдереНрд░реЗрдбреНрд╕ (рдЪрд┐рддреНрд░ 4 рджреЗрдЦреЗрдВ)ред

рдЕрдВрдЬреАрд░ред  4ред

рдЕрдм рдЪрд░рдг ( i ) рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдирдВрдмрд░ j рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо, рд╕рд░рдгреА [[] рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк P [j] рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд▓рд╛, рдЪрд░рдг ( ii ) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдкреНрд░рддреНрдпреЗрдХ j- th рд╕реНрдЯреНрд░реАрдо, рд╕рд░рдгреА P [] рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рд╢реБрд░реВ рдХрд░реЗрдЧреА, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд X [j] рдореЗрдВ рд▓рд┐рдЦ рджреЗрдЧреАред рдмреЗрд╢рдХ, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ 128 рдмрд╛рд░ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CUDA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдореЗрдВ рднрд╛рд░рд┐рдд рдХрд╛рд░рдХреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдПрдХреНрд╕ -> рдкреА рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреА > рдПрдХреНрд╕ - рдХрдИ рдмрд╛рд░ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдЧреБрдгрд╛рдВрдХ рдЪреБрдирддреЗ рд╣реИрдВ - рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рдФрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рд╕рдиреЗ рдХрднреА рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрд╛ рдирд╣реАрдВ рд╣реИ рд╡рд╣ рддреБрд░рдВрдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд CUDA рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реИ:
__global__ void Kernel(float *X, float *P) { const int N = 128; //       . const int index = threadIdx.x + blockIdx.x*blockDim.x; //  . float a; //   .   . /*  (i): */ a = X[0]; for(int j = 1; j < N; ++j) // ,   a += X[j]; P[index] = a / N; // ,     . /*   (i). */ /*  (ii): */ a = P[0]; for(int j = 1; j < N; ++j) // ,   a += P[j]; X[index] = a / N; // ,     . /*   (ii). */ } 

рдЗрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА P [] рд╕рдордп-рд╕рдордп рдкрд░ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рдпрд╣рд╛рдБ, X [] рдХрднреА-рдХрднреА рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдХреЛрдИ рдЕрдВрддрд░ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рддрддреНрд╡ X [j] рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ 32 рд▓рдЧрд╛рддрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рд╣реЛрдЧрд╛! рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рднреА 32 рдХрд╛ рдПрдХ рдЧреБрдгрдХ рд╣реЛрдЧрд╛ - рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рдмрд╣реБрдд рддрд╛рдирд╛-рдмрд╛рдирд╛ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдПрдХ рдкреНрд░рдХрдЯреАрдХрд░рдг рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рддрд╛рдирд╛`рдУрд╡ рдХреА рд╕рд┐рдВрдХ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рддреЛ рдпрд╣ рдЙрд╕рдХреЗ рдмрд╛рдХреА рдХреЗ рд╕рднреА рддрд╛рдирд╛ рдореЗрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк CUDA рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
 __global__ void Kernel(float *X, float *P) { ... /*   (i). */ __syncthreads(); /*  (ii): */ ... } 

рддрдм рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдХрд╣реАрдВ рдпрд╣ рдЧрд▓рдд рд╣реЛрдЧрд╛ - рддреЛ рдкреВрд░реЗ рдмреНрд▓реЙрдХред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреНрд▓реЙрдХ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди рдХреЗ рддрд░реАрдХреЗ


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВ:
  1. CUDA рдХрд░реНрдиреЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреЗрд╡рд▓ рд╕рднреА рдереНрд░реЗрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдХреЛрд░ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  2. рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЭрдВрдбреЗ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдЖрдУред


рдореБрдЭреЗ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореЗрд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧреБрдард▓реА рдХреЛ рдЕрдХреНрд╕рд░ (рд╣рдЬрд╛рд░реЛрдВ рдмрд╛рд░) рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдбрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрд░реА рд╣реЛрдЧреАред рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЪрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ ... "рдмрдбрд╝реЗ" рдХреЛрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕реАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рд╕реЗ рд░рд╕ рдореЗрдВ рдЙрдмрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред рд╕реНрдореГрддрд┐ред

рдПрдХ рдзреНрд╡рдЬ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ "рдмреА .5 рдореЗрдореЛрд░реА рдлрд╝реЗрдВрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕" [1] рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд░реНрдиреЗрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд╣рд╛рдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреНрд▓реЙрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдЕрд╡рд░реЛрдз рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛ - рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ рд╡рд┐рд▓рдВрдмрд┐рдд рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдмреНрд▓реЙрдХ рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХрд░реНрдиреЗрд▓ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 __device__ unsigned int count; // -  .    //4     . /*    -: */ __device__ void InitSyncWholeDevice(const int index) { if (index == 0) //    grid` ( 0)   count = 0; //    . if (threadIdx.x == 0) //    block`  ,  - while (count != 0); //   . //     block` ,      : __syncthreads(); // , - .    device -  . } /*     device: */ __device__ void SyncWholeDevice() { //      : unsigned int oldc; //   ,     gmem  smem,    grid`: __threadfence(); //    block`    (  ) //-: if (threadIdx.x == 0) { //  oldc   count  "+1": oldc = atomicInc(&count, gridDim.x-1); //   ,    ""    gmem: __threadfence(); //     (   count      ), //     count,    ,    //  gmem.    ,    "",      //,      ""   . if (oldc != (gridDim.x-1)) while (count != 0); } //      ,      : __syncthreads(); } __global__ void Kernel_Synced(float *X, float *P) { InitSyncWholeDevice(threadIdx.x + blockIdx.x*blockDim.x); ... /*   (i). */ SyncWholeDevice(); /*  (ii): */ ... } 

рд╡рд╣, рдЬреИрд╕реЗ, рд╡рд╣ рд╕рдмред рдЭрдВрдбреЗ рдХреЛ рдЬрдЦреНрдореА рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдпрд╣ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, SyncWholeDevice () рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ , рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╛рдзрд╛ рджреЗрд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВ? рд╕рдм рдХреЗ рдмрд╛рдж, рдПрдХ рд╕рдордп рд▓реВрдк рд╣реИ ред рдпрд╣рд╛рдБ рд╣рдо рдЕрдореВрд░реНрдд рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЧрджреНрдпрд╛рдВрд╢ рдХреА рдУрд░ рдиреМрдХрд╛рдпрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк рд╕рдВрдХрд▓рдХ [12-14] рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди nvcc ptx рдлрд╛рдЗрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдкрд╛рд╢ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓реВрдк рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Ptx рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХреЗ рдХреЙрд▓ рдХреЛ рд▓реВрдк рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
 __device__ void do_while_count_not_eq(int val) { asm("{\n\t" "$my_while_label: \n\t" " .reg .u32 r_count; \n\t" " .reg .pred p; \n\t" " ld.global.u32 r_count, [count]; \n\t" " setp.ne.u32 p, r_count, %0; \n\t" "@p bra $my_while_label; \n\t" "}\n\t" : : "r"(val)); } 

рдХрд╛рдЙрдВрдЯрд░ рдлреНрд▓реИрдЧрд╢рд┐рдк рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ (рдпрд╛ рд╕рд╛рдЭрд╛) рдореЗрдореЛрд░реА рдореЗрдВ рдЪрд░ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдЪрд░ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
 __device__ volatile unsigned int count; // -  .    //4     . ... //  oldc   count  "+1": oldc = atomicInc((unsigned int*)&count, gridDim.x-1); ... 


рд╕рдорд╛рдзрд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд▓рди


рдЕрдм рд╣рдо рджреЛ рдмреНрд▓реЙрдХ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдПрдХ рдореЛрдЯрд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдЕрдлрд╡рд╛рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдХрд░реНрдиреЗрд▓ рдХреЙрд▓ ~ 10 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рд▓реЗрддрд╛ рд╣реИ - рдпрд╣ рдХрдИ рдХреЛрд░ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдХреАрдордд рд╣реИред рд▓реВрдк рд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, ~ 10 рдереНрд░реЗрдб (рдХрд┐рддрдиреЗ рдмреНрд▓реЙрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдФрд░ рд▓реВрдк рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрд╢рди рдореЗрдВ рд▓рдЧрднрдЧ 500 рдШрдбрд╝реА рдЪрдХреНрд░ рд▓рдЧрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХрд░рдиреЗ рджреЗрдВ 3. рдлрд┐рд░, рд▓рдЧрднрдЧ 10 * 500 * 3 = 1.5 * 10 ^ 4 рдЪрдХреНрд░реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдкрд░реЗрд╢рди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред 1.5 GHz рдХреА рдореБрдЦреНрдп рдЖрд╡реГрддреНрддрд┐ рдкрд░, рд╣рдореЗрдВ 1.0 * 10 ^ (- 5) рд╕реЗрдХрдВрдб = 10 ╬╝s рдорд┐рд▓рддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рдд рдкрд░рд┐рдорд╛рдг рдХрд╛ рдХреНрд░рдо рд╕рдорд╛рди рд╣реИред

рд▓реЗрдХрд┐рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЕрдВрдЬреАрд░ред 5 рдореЗрдВ, рдкреЛрд╕реНрдЯ рд░реАрдбрд░ 100 рд▓рдЧрд╛рддрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдПрдХреНрд╕ -> рдкреА -> рдПрдХреНрд╕ рдкрд░ рдмрд┐рддрд╛рдП рд╕рдордп рдХреА рддреБрд▓рдирд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд┐рдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП 10 рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ред 100 рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ (2) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреЛ рдФрд╕рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10 рдмрд╛рд░ рджреЛрд╣рд░рд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдЕрдВрдЬреАрд░ред  5ред

рдХреНрд╖реИрддрд┐рдЬ рддрд▓ рдореЗрдВ, рд╢реБрд░реБрдЖрддреА рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд▓реЙрдЯ рдХреА рдЬрд╛рддреА рд╣реИред " рдорд▓реНрдЯреА рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ " рд╡рд┐рдзрд┐ ( MKL ) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ " рд╕рд┐рдВрдЧрд▓ рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ " рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЕрдХреНрд╖ рдХреЛ " рдЕрдХреНрд╖реАрдп рдХреЙрд▓ ( рдПрд╕рдХреЗрдПрд▓ - рд╕рд┐рдВрдЧрд▓ рдХреЙрд▓рдиреЗрд▓ рд▓реЙрдиреНрдЪ) рдХрд╣рддреЗ рд╣реИрдВ ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдЧреНрд░рд┐рдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд▓рд╛рдн, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рд╣реИрдВ, рдЙрддрдирд╛ рдХрдо рдПрдордХреЗрдПрд▓ рд╡рд┐рдзрд┐ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддреА рд╣реИред 32 рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рд╡рд╣ SKL рд╡рд┐рдзрд┐ рд╕реЗ рдереЛрдбрд╝рд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ, рдЕрдзрд┐рдХ рдереНрд░реЗрдбреНрд╕ ( рдереНрд░реЗрдбрдЖрдИрдбреАрдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ == 0 рд╣реЛрдиреЗ рдкрд░) рдзреАрдореА рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рд╕реЗ рдЧрд┐рдирддреА рдЪрд░ рдкрдврд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ "рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдкрдврд╝рд╛, рд╕рднреА рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд░реНрде рджрд┐рдпрд╛"ред рдпрджрд┐ рд╣рдо рдПрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдпрдВ рдХреА рдирд┐рд░рдВрддрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдирд┐рдпрдорд┐рддрддрд╛ рдХреЛ рднреА рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, рд▓реЗрдЦрдХ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рднрд╛рд╡, рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдПрд╕рдПрдо рдореЗрдВ рддрд╛рдирд╛ рдкреНрд░рдмрдВрдзрдиред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЖрдЧреЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ (1024) рдХреЗ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдЙрдирдХрд╛ рдЕрд▓рдЧ рд╡рд┐рднрд╛рдЬрдиред рдЪрд┐рддреНрд░рд╛ 6 рджреЛ рддрд░реАрдХреЛрдВ (рдПрдордХреЗрдПрд▓ рдФрд░ рдПрд╕рдХреЗрдПрд▓) рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ 100 * 10 рдкрд░ рдмрд┐рддрд╛рдП рдЧрдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдордп рдХреЗ рд░реЗрдЦрд╛рдВрдХрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдЕрдВрдЬреАрд░ред  6ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЪрд┐рддреНрд░ 5 рдореЗрдВ рд╡рд┐рдХрд░реНрдг "рдЯреБрдХрдбрд╝рд╛" рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрдбрд╝реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде, рджреЛрдиреЛрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред CUDA рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ [2] рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦрдХ, рдлрд┐рд░ рд╕реЗ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЕрдВрддрд░ рдХреА рдХрдореА рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде рдПрд╕рдХреЗрдПрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдиреБрдХрд╕рд╛рди рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЪрд░ рдЧрд┐рдирддреА рдХреА рд░реАрдбрд┐рдВрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкреАрдХреЗрдПрдХреНрд╕-рдХреЛрдбрд╛рдВрддрд░рдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ SKL рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЧрдП рдереЗред рдХрднреА-рдХрднреА рдЕрд╕реНрдерд┐рд░ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЧреНрд░рд┐рдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдЗрд╕реЗ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред рдордВрджреА рдХрд╛ рдкрд░рд┐рдорд╛рдг 0.20% рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддреНрд╡рд░рдг 0.15% рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ ptx- рдХреЛрдбрд╛рдВрддрд░рдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓реВрдк рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ SKL рд╡рд┐рдзрд┐ рдХреЗ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрдХ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░ рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди, рдмреНрд▓реЙрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд░реЛрд╢рдиреА рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА; рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдЪрд┐рддреНрд░реЛрдВ рдХреЛ CUDA рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо (2) рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ , рдкрд╛рдардХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдлрд░ рдХреЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХреЗрдВрдЧреЗ (рдереНрд░реЗрдбреНрд╕ __syncthreads () ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА, рдПрдХ рдЬрдЧрд╣ рдПрдХрддреНрд░ рдХреА рдЧрдИ, рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рджрд┐рдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА, рдФрд░ "googling", рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЪреМрдХрд╕ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдПрдХ рдмреЗрд╡рдХреВрдл рдкреНрд░рд╡реГрддреНрддрд┐ рд╣реИред


(1) рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CUDA API рдлрд╝рдВрдХреНрд╢рди cudaGetDeviceProperties (...) [1-2] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред
(2) рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб , pastebin.com рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред


рд╕реВрдЪрдирд╛ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕реВрдЪреА


[рез] рдХреНрдпреВрдбрд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧрд╛рдЗрдб
[реи] рдХреНрдпреВрдбрд╛ рд╕реА рдмреЗрд╕реНрдЯ рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдЧрд╛рдЗрдб
[рей] рдЙрдиреНрдирдд CUDA рд╡реЗрдмрд┐рдирд╛рд░: рдореЗрдореЛрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди
[рек] рдПрд╕ред рддрд╛рд░рд┐рдХ, рдЬреАрдкреАрдпреВ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдФрд░ рд╕реАрдпреВрдбреАрдПрдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдПрдХ рдкрд░рд┐рдЪрдп
[рел] рд╡реЗрдВрдбрд░рдмрд┐рд▓реНрдЯ рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА, ACCRE, CUDA рдХреЗ рд╕рд╛рде GPU рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ
[рем] рдУрдПрдордПрд╕рдЯреАрдпреВ, рд░реЗрдбрд┐рдпреЛ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд╕рдВрдХрд╛рдп, рдПрдХреАрдХреГрдд рд╕реВрдЪрдирд╛ рд╕рдВрд░рдХреНрд╖рдг рд╡рд┐рднрд╛рдЧ, рдЬреАрдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо " рд░рд┐рдЯрд░реНрдорд┐рдВрдЧ "
[[] рдЧреНрд░реАрд╖реНрдордХрд╛рд▓реАрди рд╕реБрдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдЕрдХрд╛рджрдореА, NVIDIA рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рддреНрд╡рд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреНрд▓рд╕реНрдЯрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ
[[] IXBT.com: NVIDIA CUDA - GPU рдкрд░ рдЧреИрд░-рдЧреНрд░рд╛рдлрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ
[реп] cgm.computergraphics.ru: CUDA рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдкрд░рд┐рдЪрдп
[резреж] THG.ru: рдПрдирд╡реАрдбрд┐рдпрд╛ рдХреНрдпреВрдбрд╛: рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдпрд╛ рд╕реАрдкреАрдпреВ рдореГрддреНрдпреБ рдкрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ?
[резрез] step3d.narod.ru: CUDA рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ, CUDA рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рднрд╛рдЧ реи)
[резреи] CUDA рдХрдВрдкрд╛рдЗрд▓рд░ рдбреНрд░рд╛рдЗрд╡рд░ (NVCC)
[резрей] рдХреНрдпреВрдбрд╛ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдкреАрдЯреАрдПрдХреНрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
[резрек] рдкреАрдЯреАрдПрдХреНрд╕: рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдПрд╕рдП рд╕рдВрд╕реНрдХрд░рдг рей.реж
[резрел] рд╕реАрдпреВрдбреАрдП рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ ( рдкреАрдбреАрдПрдл , рдПрдЪрдЯреАрдПрдордПрд▓ рдСрдирд▓рд╛рдЗрди )

Source: https://habr.com/ru/post/In151897/


All Articles