рдЬрдВрдЧ рдореЗрдВ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ GPU рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдПрдореБ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рдкрд░рд┐рдЪрдп


рдПрдореВ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░рд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


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


рд╕реНрдерд╛рдкрдирд╛


  1. рдЖрдк рдЬрд┐рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реЗ рдмрд╛рд╣рд░реА рдУрдкрдирд╕реАрдПрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  2. рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда рдХреЗ Cargo.toml рдХрд░реЗрдВред рдпрд╣ рдирд╡реАрдирддрдо рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп * рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рд▓реЗрдВ):

     [dependencies] em = "*" //   Emu ocl = "*" //   OpenCL 

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕


рдПрдореБ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдУрдкрдирд╕реАрдПрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИред


рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░


рдПрдореБ рднрд╛рд╖рд╛ рдореЗрдВ рдиреМ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ рд░рд╕реНрдЯ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ:


рдирд╛рдорд╡рд┐рд╡рд░рдг
f32рдмрддреНрддреАрд╕ рдмрд┐рдЯ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░
i8рдкреНрд░рддреАрдХ рдпрд╛ рдЖрда-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛
i16рд╕реЛрд▓рд╣ рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
i32рдмрддреНрддреАрд╕ рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
i64рдЪреМрдВрд╕рда рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
u8рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЖрда рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛
u16рдирд┐рд░реБрдкрд┐рдд рд╕реЛрд▓рд╣ рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛
u32рдмрд┐рди рдмреНрдпрд╛рд╣реА рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛
u64рдЕрдирд╕рд╛рдЗрдирд╕ рдЪреМрдВрд╕рда рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛
boolрдмреВрд▓рд┐рдпрди рдореВрд▓реНрдп
[TYPE]рдПрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ TYPE рдХреЗ рдЪрд░ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИ

рдЪрд░


рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд▓реЗрдЯрд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдХреЛрд▓рди, рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк, рдмрд░рд╛рдмрд░ рд╕рд╛рдЗрди, рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдорд╛рди рдФрд░ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреЗ рдкреАрдЫреЗ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред


 let age: i32 = 54; let growth: f32 = 179.432; let married: bool = true; 

рд░реВрдкрд╛рдВрддрд░рдг


рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рдж, рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрджрд┐рдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рднреА рдорд╛рдк рдХреА рдПрдХ рдЗрдХрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЕрдЧрд▓рд╛ рднрд╛рдЧ рджреЗрдЦреЗрдВ):


 let width: i16 = 324; let converted_width: i64 = width as i64; 

рдорд╛рдк рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ


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


 let length: f32 = 3455.345; //  length += 7644.30405 as cm; //  length += 1687.3043 as mm; //  

рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ


рдПрдореБ рдореЗрдВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдиреАрдЪреЗ рдЗрд╕реА рддрд╛рд▓рд┐рдХрд╛ рд╣реИред


рдирд╛рдордореВрд▓реНрдп
Y24 рдХреА рд╢рдХреНрддрд┐ рдХреЛ 10
Z21 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
Eрез 18 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ резреж
P15 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
Tрезреи рдХреА рд╢рдХреНрддрд┐ рд╕реЗ резреж
Gрезреж рдХреА рд╢рдХреНрддрд┐ рд╕реЗ реп
M6 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
k3 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 10
h2 рдХреА рд╢рдХреНрддрд┐ рдХреЛ 10
Dрез рдХреА рд╢рдХреНрддрд┐ рд╕реЗ резреж
d-1 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 10
c10 -2 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП
m-3 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 10
u-6 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
n-9 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
p-12 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10
f-15 рдХреА рд╢рдХреНрддрд┐ рддрдХ 10
a-18 рдХреА рдбрд┐рдЧреНрд░реА рддрдХ 10
z-21 рдХреА рд╢рдХреНрддрд┐ рддрдХ 10
y-24 рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 10

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдпреБрдХреНрдд рддрд╛рд▓рд┐рдХрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рд╢рд░реНрдд рдмрдпрд╛рди


рдПрдореБ рд╕рд╢рд░реНрдд рдмрдпрд╛рди рд░рд╕реНрдЯ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 let number: i32 = 2634; let satisfied: bool = false; if (number > 0) && (number % 2 == 0) { satisfied = true; } 

рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдП


рдлрд╝реЙрд░ рд▓реВрдк рдХреЗ рд╣реЗрдбрд░ рдХреЛ for NUM in START..END рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдБ NUM рдПрдХ рдЪрд░ рд╣реИ рдЬреЛ рд╕реАрдорд╛ рд╕реЗ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ - [START; END) рдЗрдХрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ [START; END) ред


 let sum: u64 = 0; for i in 0..215 { sum += i; } 

рдЬрдмрдХрд┐ рд▓реВрдк


рдЬрдмрдХрд┐ рд▓реВрдк рдХрд╛ рд╢реАрд░реНрд╖рдХ рдЙрд╕ while (CONDITION) рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ CONDITION рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рд╢рд░реНрдд рд╣реИред рдпрд╣ рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ:


 let sum: u64 = 0; let idx: i32 = 0; while (idx < 215) { sum += idx; idx += 1; } 

рдЕрдВрддрд╣реАрди рдЫреЛрд░реЛрдВ


рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рдХрд╛рд╕ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ loop рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ break рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдпрд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрдпрд╛рди continue (рдЕрдиреНрдп рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЫреЛрд░реЛрдВ рдХреА рддрд░рд╣)ред


 let collapsed: u64 = 1; let idx: i32 = 0; loop { if idx % 2 == 0 { continue; } sum *= idx; if idx == 12 { break; } } 

рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд▓реМрдЯреЗрдВ


рдЕрдиреНрдп рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣, return рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рднреА рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ) рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


 let result: i32 = 23446; return result; 

рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░


  • рдЙрдкрд▓рдмреНрдз рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░: = , += , -= , *= , /= , %= , &= , ^= , <<= , >>= ;
  • рд╕реВрдЪрдХрд╛рдВрдХ рдСрдкрд░реЗрдЯрд░ [IDX] ;
  • рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ - (ARGS) ;
  • рдпреВрдирд┐рд░реА рдСрдкрд░реЗрдЯрд░реНрд╕: * рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП; рдмреВрд▓рд┐рдпрди рдбреЗрдЯрд╛ рдХреЛ рдкрд▓рдЯрдирд╛, - рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛;
  • рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░: + , - , * , / , % , && , || , & , | , ^ , >> , << , > , < , >= , <= , == , == != ред

рдХрд╛рд░реНрдпреЛрдВ


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


 add(left f32, right f32) f32 { return left + right; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ f32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рдкрд╛рд░рд┐рдд рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдпреЛрдЧ рджреЗрддрд╛ рд╣реИред


рдкрддрд╛ рд╕реНрдерд╛рди


рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ __private__ рд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред


рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдЙрдкрд╕рд░реНрдЧреЛрдВ global_ рдФрд░ local_ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкрддреЗ рдХреА рдЬрдЧрд╣ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред


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


рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп


рдПрдореВ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди (рдУрдкрдирд╕реАрдПрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ GPU рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


  • get_work_dim() - рдЖрдпрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_global_size() - рджрд┐рдП рдЧрдП рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_global_id() - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рддрддреНрд╡ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_global_size() - рджрд┐рдП рдЧрдП рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_local_id() - рджрд┐рдП рдЧрдП рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╕рдореВрд╣ рдХреЗ рднреАрддрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_num_groups() - рджрд┐рдП рдЧрдП рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╕рдореВрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • get_group_id() - рдХрд╛рд░реНрдпрд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреЗрддрд╛ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдкрдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ get_global_id(0) , рдЬреЛ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЖрдкрдХреЗ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред


рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди


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


 use em::emu; emu! { multiply(global_vector [f32], scalar f32) { global_vector[get_global_id(0)] *= scalar; } } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрдкрдирд╕реАрдПрд▓ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдореИрдХреНрд░реЛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ build! рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


 use em::build; //    build! {...} extern crate ocl; use ocl::{flags, Platform, Device, Context, Queue, Program, Buffer, Kernel}; build! { multiply [f32] f32 } 

рд░рд╕реНрдЯ рдХреЛрдб рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдЗрдореВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 fn main() { let vector = vec![0.4445, 433.245, 87.539503, 2.0]; let result = multiply(vector, 2.0).unwrap(); dbg!(result); } 

рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг


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


 use em::{build, emu}; //    build! {...} extern crate ocl; use ocl::{flags, Buffer, Context, Device, Kernel, Platform, Program, Queue}; emu! { multiply(global_vector [f32], scalar f32) { global_vector[get_global_id(0)] *= scalar; } } build! { multiply [f32] f32 } fn main() { //     : let args = std::env::args().collect::<Vec<String>>(); if args.len() < 3 { panic!(": cargo run -- <SCALAR> <NUMBERS>..."); } //      : let scalar = args[1].parse::<f32>().unwrap(); //      : let vector = args[2..] .into_iter() .map(|string| string.parse::<f32>().unwrap()) .collect(); //    : let result = multiply(vector, scalar).unwrap(); dbg!(result); } 

рдЖрдк cargo run -- 3 2.1 3.6 6.2 рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореА рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ:


 [src/main.rs:33] result = [ 6.2999997, 10.799999, 18.599998, ] 

OpenCL рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ


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


 use em::emu; //  "ocl"        Rust: extern crate ocl; use ocl::{flags, Platform, Device, Context, Queue, Program, Buffer, Kernel}; //  Emu    (OpenCL)   //     "EMU: &'static str": emu! { //     : multiply(global_buffer [f32], coeff f32) { global_buffer[get_global_id(0)] *= coeff; } } fn multiply(global_buffer: Vec<f32>, coeff: f32) -> ocl::Result<Vec<f32>> { //        , //  , ,   : let platform = Platform::default(); let device = Device::first(platform)?; let context = Context::builder() .platform(platform) .devices(device.clone()) .build()?; let program = Program::builder() .devices(device) .src(EMU) .build(&context)?; let queue = Queue::new(&context, device, None)?; let dims = global_buffer.len(); //    : let buffer = Buffer::<f32>::builder() .queue(queue.clone()) .flags(flags::MEM_READ_WRITE) .len(dims) .copy_host_slice(&global_buffer) .build()?; //       , //    : let kernel = Kernel::builder() .program(&program) .name("multiply") .queue(queue.clone()) .global_work_size(dims) .arg(&buffer) .arg(&coeff) .build()?; //    (    //   : unsafe { kernel.cmd() .queue(&queue) .global_work_offset(kernel.default_global_work_offset()) .global_work_size([dims, 0, 0]) .local_work_size(kernel.default_local_work_size()) .enq()?; } //  ,         // "dims": let mut vector = vec![0.0f32; dims]; buffer.cmd() .queue(&queue) .offset(0) .read(&mut vector) .enq()?; Ok(vector) } fn main() { let initial_data = vec![3.7, 4.5, 9.0, 1.2, 8.9]; //   ,   Emu,  //  "initial_data": let final_data = multiply(initial_data, 3.0).unwrap(); println!("{:?}", final_data); } 

рд╕рдорд╛рдкрди


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рд░реВрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд░реВрд╕реНрдд ( рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг ) рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рддреНрд╡рд░рд┐рдд рдЬрд╡рд╛рдм рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


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


All Articles