рдЬрд╛рд╡рд╛ рдореЗрдВ GPU рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЬрд╛рд╡рд╛ рд╕реЗ GPU рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдЬрдмрд░рджрд╕реНрдд рд╢рдХреНрддрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ GPU рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛ рд╕реЗ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИред

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

рдПрдХ рдмрд╛рд░ рдЬрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ GPU рдФрд░ CPU рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдпрд╛, рддреЛ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ Java рджреБрдирд┐рдпрд╛ рдореЗрдВ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ GPU рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдореБрдЦреНрдп рд░реВрдкрд░реЗрдЦрд╛ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рдХреБрдЫ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред

рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдПрдХ рдмрд┐рдЯ


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

2D / 3D рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рд╛рд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдореЗрдВ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рддрд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдорд╛рдирдХ рд╕реАрдкреАрдпреВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ (рдЪрд┐рддреНрд░ 1 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдЬреАрдкреАрдпреВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред

рдЫрд╡рд┐
рдЕрдВрдЬреАрд░ред 1. рд╕реАрдкреАрдпреВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмреНрд▓реЙрдХ

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

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

рдЫрд╡рд┐
рдЕрдВрдЬреАрд░ред 2. рдПрдХ рд╕рд╛рдзрд╛рд░рдг GPU рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ

рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рд╕реНрддреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрдВрдХреНрд╕ рдореЗрдВ рдЙрдирдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрдИ рдирд┐рд░реНрджреЗрд╢реЛрдВ, рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛ рдпрд╛ MIMD ("mim-dee" рдЙрдЪреНрдЪрд╛рд░рдг) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЕрдХреНрд╕рд░ рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рдкрд░ рдПрдХ рд╣реА рдирд┐рд░реНрджреЗрд╢ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдХрд▓ рдирд┐рд░реНрджреЗрд╢, рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛ рдпрд╛ SIMD (рд╕реНрдкрд╖реНрдЯ "рд╕рд┐рдо-рдбреА") рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ, рдПрдХ рдПрдХрд▓ GPU рдореЗрдВ рдХрдИ ALU рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ 3.

рдЫрд╡рд┐
рдЕрдВрдЬреАрд░ред 3. SIMD рдбрд┐рдЬрд╛рдЗрди (рджрд╛рдПрдВ рд╕реЗ) GPU рдмреНрд▓реЙрдХ рдХреА MIMD- рд╢реИрд▓реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рддреБрд▓рдирд╛ (рдмрд╛рдПрдВ рд╕реЗ)

SIMD рдФрд░ MIMD рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдорд┐рд▓рд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдмреИрдВрдбрд╡рд┐рдбреНрде рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ SIMD рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд┐рддреНрд░ рдореЗрдВ рд╣реИ 4.

рдЫрд╡рд┐
рдЕрдВрдЬреАрд░ред 4. рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ SIMD рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛рдо рдХрд░рдирд╛; 128 ALU рдХреЗ рд╕рд╛рде 16 рдХреЛрд░ рд╣реИрдВ

рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЫреЛрдЯреЗ, рд╕рд░рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ, рдЖрдк рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

GPU рдкрд░ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо


рдЦреЗрд▓реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рднрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрдкреАрдпреВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдереЗ рдФрд░ рд╕реАрдкреАрдпреВ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рдереЗред

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

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

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

рдореБрдЦреНрдп рд╣реИрдВ:

  • DirectCompute: Microsoft рдХреА рдирд┐рдЬреА shader рднрд╛рд╖рд╛ / API рдЬреЛ Direct3D рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, DirectX 10 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
  • рдПрдПрдордбреА рдлрд╛рдпрд░рд╕реНрдЯреНрд░реАрдо: рдирд┐рдЬреА рдЕрддрд┐ / Radeon рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рдЬреЛ рдПрдПрдордбреА рджреНрд╡рд╛рд░рд╛ рдкреБрд░рд╛рдиреА рд╣реИрдВред
  • OpenACC: рдорд▓реНрдЯреА-рд╡реЗрдВрдбрд░ рдХрдВрд╕реЛрд░реНрдЯрд┐рдпрдо, рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди
  • ++ AMP: Microsoft C++
  • CUDA: Nvidia,
  • OpenL: , Apple, Khronos Group

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

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╛рд╡рд╛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред JSR 231 рдХреА рд╢реБрд░реБрдЖрдд 2002 рдореЗрдВ рд╣реБрдИ рдереА рдФрд░ рдЗрд╕реЗ GPU рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ 2008 рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ OpenGL 2.0 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдУрдкрди JOCL рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдУрдкрдирдЧреЗрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдЬрд╛рд░реА рд╣реИ (рдЬреЛ рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ) рдФрд░ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╕рд┐рджреНрдз Minecraft рдЦреЗрд▓ JOCL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

GPGPU рдЖ рд░рд╣рд╛ рд╣реИ


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

  1. рдбреЗрдЯрд╛ рдХреЛ рд░реИрд╕реНрдЯрд░ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдирдХреЛрдб рдХрд░реЗрдВред
  2. рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрд╕ рд▓рд┐рдЦреЗрдВред
  3. рдЙрди рджреЛрдиреЛрдВ рдХреЛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкрд░ рднреЗрдЬреЗрдВред
  4. рдлреНрд░реЗрдо рдмрдлрд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  5. рдПрдХ рд░реЗрдЦрд╛рдкреБрдВрдЬ рд╕рд░рдгреА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░, рд╕реНрдЯреИрдирдлреЛрд░реНрдб рдЗрдВрд╕реНрдЯреАрдЯреНрдпреВрдЯ рдХреЗ рдХрдИ рдЕрдзреНрдпрдпрдиреЛрдВ рдиреЗ GPU рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред 2005 рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмреНрд░реБрдХрдЬреАрдкреАрдпреВ рдмрдирд╛рдпрд╛, рдЬреЛ рдПрдХ рдЫреЛрдЯрд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛, рд╕рдВрдХрд▓рдХ рдФрд░ рд░рдирдЯрд╛рдЗрдо рд╢рд╛рдорд┐рд▓ рдерд╛ред

BrookGPU рдиреЗ рдмреНрд░реБрдХ рдереНрд░реЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ ANSI C рд╡реИрд░рд┐рдПрдВрдЯ рдерд╛ред рдпрд╣ рд╕рд░реНрд╡рд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП OpenGL v1.3 +, DirectX v9 + рдпрд╛ AMD Close to Metal рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ Microsoft Windows рдФрд░ Linux рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, BrookGPU рд╕реАрдкреАрдпреВ рдкрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХрд╛ рдЕрдиреБрдХрд░рдг рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЙрд╕ рд╕рдордп рдЙрдкрд▓рдмреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдмрдВрдж рдирд╣реАрдВ рд╣реБрдЖред GPGPU рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдбрд┐рд╡рд╛рдЗрд╕ GPU рдФрд░ рдЙрд╕ рдкрд░ рдЬрд┐рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдЙрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ), рдбреЗрдЯрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GPU рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХреЙрдкреА рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рдмрд╣реБрдд рджреЗрд░реА рд╣реЛрддреА рд╣реИред рдФрд░ 2000 рдХреЗ рджрд╢рдХ рдХреЗ рдордзреНрдп рдореЗрдВ, рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рдереА, рдЗрди рджреЗрд░реА рдиреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП GPU рдХреЗ рдЧрд╣рди рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рдмрд╛рд╣рд░ рд░рдЦрд╛ред

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

рдЕрдм рдЬрдм рдореИрдВрдиреЗ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдмрддрд╛ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЛ рд╕рдмрд╕реЗ рд╕рдлрд▓ рдЬреАрдкреАрдпреВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ - рдУрдкрдирд╕реАрдПрд▓ рдФрд░ рд╕реАрдпреВрдбреАрдП - рджреЗрдЦреЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдУрдкрдирд╕реАрдПрд▓ рдФрд░ рдЬрд╛рд╡рд╛


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

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрд╛рдо рдкрд╣рд▓реЗ рд╣реА рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ: JOCL, JogAmp, рдФрд░ JavaCLред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, JavaCL рдПрдХ рдореГрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрди рдЧрдИ рд╣реИред рд▓реЗрдХрд┐рди JOCL рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреАрд╡рд┐рдд рдФрд░ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░реВрдВрдЧрд╛ред

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

рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: рдлреЛрд▓реНрдбрд┐рдВрдЧ рд╡реИрдХреНрдЯрд░ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЪрдордХрджрд╛рд░ рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рджреЛ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред рдЖрдк рдкрд╣рд▓реЗ рд╕рд░рдгреА рд╕реЗ рдПрдХ рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рд╕рд░рдгреА рд╕реЗ рдПрдХ рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдпреЛрдЧ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрдЬреАрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред 5.

рдЫрд╡рд┐
рдЕрдВрдЬреАрд░ред 5. рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рдпреЛрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕реБрд╕рдВрдЧрдд рд╣реИ рдФрд░ рдлрд┐рд░ рднреА рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХреЛрд░ GPU рдореЗрдВ рдзрдХреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 2048 рдХреЛрд░ рд╣реИрдВ, рдЬреИрд╕реЗ рдПрдирд╡реАрдбрд┐рдпрд╛ 1080 рдкрд░, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 2048 рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд╛рд╡рд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЯреЗрд░рдлреНрд▓реЙрдкреНрд╕ рдЖрдкрдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред 10 рдорд┐рд▓рд┐рдпрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб JOCL рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

public class ArrayGPU {
    /**
     * The source code of the OpenCL program 
     */
    private static String programSource =
        "__kernel void "+
        "sampleKernel(__global const float *a,"+
        "             __global const float *b,"+
        "             __global float *c)"+
        "{"+
        "    int gid = get_global_id(0);"+
        "    c[gid] = a[gid] + b[gid];"+
        "}";
    
    public static void main(String args[])
    {
        int n = 10_000_000;
        float srcArrayA[] = new float[n];
        float srcArrayB[] = new float[n];
        float dstArray[] = new float[n];
        for (int i=0; i<n; i++)
        {
            srcArrayA[i] = i;
            srcArrayB[i] = i;
        }
        Pointer srcA = Pointer.to(srcArrayA);
        Pointer srcB = Pointer.to(srcArrayB);
        Pointer dst = Pointer.to(dstArray);


        // The platform, device type and device number
        // that will be used
        final int platformIndex = 0;
        final long deviceType = CL.CL_DEVICE_TYPE_ALL;
        final int deviceIndex = 0;

        // Enable exceptions and subsequently omit error checks in this sample
        CL.setExceptionsEnabled(true);

        // Obtain the number of platforms
        int numPlatformsArray[] = new int[1];
        CL.clGetPlatformIDs(0, null, numPlatformsArray);
        int numPlatforms = numPlatformsArray[0];

        // Obtain a platform ID
        cl_platform_id platforms[] = new cl_platform_id[numPlatforms];
        CL.clGetPlatformIDs(platforms.length, platforms, null);
        cl_platform_id platform = platforms[platformIndex];

        // Initialize the context properties
        cl_context_properties contextProperties = new cl_context_properties();
        contextProperties.addProperty(CL.CL_CONTEXT_PLATFORM, platform);
        
        // Obtain the number of devices for the platform
        int numDevicesArray[] = new int[1];
        CL.clGetDeviceIDs(platform, deviceType, 0, null, numDevicesArray);
        int numDevices = numDevicesArray[0];
        
        // Obtain a device ID 
        cl_device_id devices[] = new cl_device_id[numDevices];
        CL.clGetDeviceIDs(platform, deviceType, numDevices, devices, null);
        cl_device_id device = devices[deviceIndex];

        // Create a context for the selected device
        cl_context context = CL.clCreateContext(
            contextProperties, 1, new cl_device_id[]{device}, 
            null, null, null);
        
        // Create a command-queue for the selected device
        cl_command_queue commandQueue = 
            CL.clCreateCommandQueue(context, device, 0, null);

        // Allocate the memory objects for the input and output data
        cl_mem memObjects[] = new cl_mem[3];
        memObjects[0] = CL.clCreateBuffer(context,
            CL.CL_MEM_READ_ONLY | CL.CL_MEM_COPY_HOST_PTR,
            Sizeof.cl_float * n, srcA, null);
        memObjects[1] = CL.clCreateBuffer(context,
            CL.CL_MEM_READ_ONLY | CL.CL_MEM_COPY_HOST_PTR,
            Sizeof.cl_float * n, srcB, null);
        memObjects[2] = CL.clCreateBuffer(context,
            CL.CL_MEM_READ_WRITE,
            Sizeof.cl_float * n, null, null);
        
        // Create the program from the source code
        cl_program program = CL.clCreateProgramWithSource(context,
            1, new String[]{ programSource }, null, null);
        
        // Build the program
        CL.clBuildProgram(program, 0, null, null, null, null);
        
        // Create the kernel
        cl_kernel kernel = CL.clCreateKernel(program, "sampleKernel", null);
        
        // Set the arguments for the kernel
        CL.clSetKernelArg(kernel, 0,
            Sizeof.cl_mem, Pointer.to(memObjects[0]));
        CL.clSetKernelArg(kernel, 1,
            Sizeof.cl_mem, Pointer.to(memObjects[1]));
        CL.clSetKernelArg(kernel, 2,
            Sizeof.cl_mem, Pointer.to(memObjects[2]));
        
        // Set the work-item dimensions
        long global_work_size[] = new long[]{n};
        long local_work_size[] = new long[]{1};
        
        // Execute the kernel
        CL.clEnqueueNDRangeKernel(commandQueue, kernel, 1, null,
            global_work_size, local_work_size, 0, null, null);
        
        // Read the output data
        CL.clEnqueueReadBuffer(commandQueue, memObjects[2], CL.CL_TRUE, 0,
            n * Sizeof.cl_float, dst, 0, null, null);
        
        // Release kernel, program, and memory objects
        CL.clReleaseMemObject(memObjects[0]);
        CL.clReleaseMemObject(memObjects[1]);
        CL.clReleaseMemObject(memObjects[2]);
        CL.clReleaseKernel(kernel);
        CL.clReleaseProgram(program);
        CL.clReleaseCommandQueue(commandQueue);
        CL.clReleaseContext(context);

    }

    private static String getString(cl_device_id device, int paramName) {
        // Obtain the length of the string that will be queried
        long size[] = new long[1];
        CL.clGetDeviceInfo(device, paramName, 0, null, size);

        // Create a buffer of the appropriate size and fill it with the info
        byte buffer[] = new byte[(int)size[0]];
        CL.clGetDeviceInfo(device, paramName, buffer.length, Pointer.to(buffer), null);

        // Create a string from the buffer (excluding the trailing \0 byte)
        return new String(buffer, 0, buffer.length-1);
    }
}

рдпрд╣ рдХреЛрдб рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рд╣реИред рдореИрдВ рдЖрдЧреЗ рдХреЛрдб рд╕рдордЭрд╛рдКрдВрдЧрд╛; рдЕрдм рдЙрд╕ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдЦрд░реНрдЪ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред

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

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

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдпрд╣рд╛рдБ "рд╣реЛрд╕реНрдЯ рдХреЛрдб" рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рднрд╛рд╖рд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд╛рд╡рд╛ рдореЗрдВ), рдФрд░ "рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛрдб" рд╣реИред рдЖрдк рд╣рдореЗрд╢рд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣реЛрд╕реНрдЯ рдкрд░ рдХреНрдпрд╛ рдХрд╛рдо рд╣реЛрдЧрд╛ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣реЛрд╕реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХреЛрдб рдХреЛ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЗ рдмрд░рд╛рдмрд░ GPU рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рд╢рд╛рд▓ рд╣реИред

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

__kernel void MatrixMul_kernel_basic(int dim,
                  __global float *A,
                  __global float *B,
                  __global float *C){

    int iCol = get_global_id(0);
    int iRow = get_global_id(1);
    float result = 0.0;
    for(int i=0; i< dim; ++i)
    {
          result +=
          A[iRow*dim + i]*B[i*dim + iCol];
    }
    C[iRow*dim + iCol] = result;
}

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЛрдб рдЙрди рдбреЗрдЯрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдУрдкрдирд╕реАрдПрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рддреИрдпрд╛рд░реА рднрд╛рдЧ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдерд╛ред

рдпрджрд┐ рдЖрдкрдХрд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб SIMD рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд░ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЫреЛрдЯреЗ рдЕрдиреБрдХреВрд▓рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рдореНрди рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

#define VECTOR_SIZE 4    
__kernel void MatrixMul_kernel_basic_vector4(
    size_t dim, // dimension is in single floats
    const float4 *A,
    const float4 *B,
    float4 *C)
{
    size_t globalIdx = get_global_id(0);
    size_t globalIdy = get_global_id(1);
    float4 resultVec = (float4){ 0, 0, 0, 0 };
    size_t dimVec = dim / 4;
    for(size_t i = 0; i < dimVec; ++i) {
        float4 Avector = A[dimVec * globalIdy + i];
        float4 Bvector[4];
        Bvector[0] = B[dimVec * (i * 4 + 0) + globalIdx];
        Bvector[1] = B[dimVec * (i * 4 + 1) + globalIdx];
        Bvector[2] = B[dimVec * (i * 4 + 2) + globalIdx];
        Bvector[3] = B[dimVec * (i * 4 + 3) + globalIdx];
        resultVec += Avector[0] * Bvector[0];
        resultVec += Avector[1] * Bvector[1];
        resultVec += Avector[2] * Bvector[2];
        resultVec += Avector[3] * Bvector[3];
    }

    C[dimVec * globalIdy + globalIdx] = resultVec;
}

рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдардВрдбрд╛ред рдЖрдкрдиреЗ рдЕрднреА рдЕрднреА Java рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП GPU рдЦреЛрд▓рд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдПрдХ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА рдХреЛрдб рдХреЗ рд╕рд╛рде, рдФрд░ рдРрд╕реЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдЬрдм рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреЗрдВ рдЬреЛ JOCL рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИред

рдХреНрдпреБрдбрд╛ рдФрд░ рдЬрд╛рд╡рд╛


CUDA рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП Nvidia рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред CUDA рдорд╛рдирдХ GPU рд╕рдВрдЪрд╛рд▓рди, рдЬреИрд╕реЗ рдореИрдЯреНрд░рд┐рд╕реЗрд╕, рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЧрд╣рд░реЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рдФрд░ рдЕрдзрд┐рдХ рддреИрдпрд╛рд░-рд╕реЗ-рдЙрдкрдпреЛрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреА рд╣реИред рдпрд╣ рд╕рдм JCuda рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╣реИ:

  • JCublas: рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ
  • JCufft: рдлрд╛рд╕реНрдЯ рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо
  • JCurand: рд░реИрдВрдбрдо рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ
  • JCusparse: рджреБрд░реНрд▓рдн рдореИрдЯреНрд░рд┐рд╕реЗрд╕
  • JCusolver: рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЧреБрдгрди
  • JNvgraph: рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ
  • JCudpp: рдЖрджрд┐рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдбреЗрдЯрд╛ рдФрд░ рдХреБрдЫ рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ CUDA рдкреБрд╕реНрддрдХрд╛рд▓рдп
  • JNpp: GPU рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
  • JCudnn: рдЧрд╣рд░реЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдореИрдВ JCurand рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдХрд░реНрдиреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

...
int n = 100;
curandGenerator generator = new curandGenerator();
float hostData[] = new float[n];
Pointer deviceData = new Pointer();
cudaMalloc(deviceData, n * Sizeof.FLOAT);
curandCreateGenerator(generator, CURAND_RNG_PSEUDO_DEFAULT); 
curandSetPseudoRandomGeneratorSeed(generator, 1234);
curandGenerateUniform(generator, deviceData, n);
cudaMemcpy(Pointer.to(hostData), deviceData, 
        n * Sizeof.FLOAT, cudaMemcpyDeviceToHost);
System.out.println(Arrays.toString(hostData));
curandDestroyGenerator(generator);
cudaFree(deviceData);
...

рдпрд╣ рдмрд╣реБрдд рдордЬрдмреВрдд рдЧрдгрд┐рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

JCuda рдореЗрдВ, рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ CUDA рдХреЛрдб рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╡рд╛ рд╕реЗ рдЕрдкрдиреЗ рд╡рд░реНрдЧрдкрде рдореЗрдВ рдХреБрдЫ JAR рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП JCuda рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред

рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдХреЛрдб рд╕реЗ рдКрдкрд░ рд░рд╣реЗрдВ


рдпрд╣ рд╕рдм рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред рдХреНрдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ?

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

public static void main(String[] _args) {
    final int size = 512;
    final float[] a = new float[size];
    final float[] b = new float[size];

    /* fill the arrays with random values */
    for (int i = 0; i < size; i++){
        a[i] = (float) (Math.random() * 100);
        b[i] = (float) (Math.random() * 100);
    }
    final float[] sum = new float[size];

    Kernel kernel = new Kernel(){
        @Override public void run() {
I           int gid = getGlobalId();
            sum[gid] = a[gid] + b[gid];
        }
    };

    kernel.execute(Range.create(size));
    for(int i = 0; i < size; i++) {
        System.out.printf("%6.2f + %6.2f = %8.2f\n", a[i], b[i], sum[i])
    }
    kernel.dispose();
}

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

рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕реА рд╕реНрд╡рддрдВрддреНрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрд░рдкреА рдХреЛ рджреЗрдЦреЗрдВред рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

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

рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


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

рд╕реНрд░реЛрдд рд▓рд┐рдВрдХ

All Articles