
рдпрд╛рдж рд░рдЦреЗрдВ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрдврд╝реЗ рдмрд┐рдирд╛ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЪреБрдирд╛ рд╣реИ?
рд╣рдо "рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рд╡рд┐рджреНрд░реЛрд╣" рдХреЗ рдпреБрдЧ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред
рд▓рдЧрднрдЧ рд╕рднреА рдЦрд░реАрдж, рдЖрд░рд╛рдо рдХреА рдЬрдЧрд╣, рдХрд╛рдо, рдЕрдзреНрдпрдпрди рдФрд░ рдЙрдкрдЪрд╛рд░, рдПрдХ рдмреИрдВрдХ рдФрд░ рдПрдХ рдЯреИрдВрдХ, рдПрдХ рдлрд┐рд▓реНрдо рдФрд░ рдПрдХ рдХрдВрдкрдиреА рдХреА рдкрд╕рдВрдж ... рд╣рдЬрд╛рд░реЛрдВ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдиреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рдЙрдкрдЧреНрд░рд╣ / рдЬреАрд╡рди рд╕рд╛рдереА рдЪреБрдирддреЗ рд╣реИрдВред
рдпрд╛ рдЬрдм рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реМрдЪрд╛рд▓рдп рдореЗрдВ рдПрдХ рдмреВрде рдЪреБрдирддреЗ рд╣реИрдВ :)ред
рдпрд╛ - рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрдиред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╢рд╛рдпрдж рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рдЖрдПред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдБ рдХрд┐ Cilk +, OpenMP, OpenCL, TBB рдФрд░ ArBB (Ct) рд╕реЗ рдЙрдирдХреА рдХреНрд╖рдорддрд╛рдУрдВ, рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рдФрд░ рдЙрдкрдпреЛрдЧ, рдкреНрд░рд▓реЗрдЦрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛, рд╕рд╛рде рд╣реА рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПред
рддреБрд░рдВрдд, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЙрдкрдХрд░рдг рдпрд╛ рддреЛ рдореБрдлреНрдд рд╣реИрдВ рдпрд╛ рд╕рдВрдХрд▓рдХ рдХреА рдХреАрдордд рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
OpenMPред
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдорд╛рдВрддрд░рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░реИрдЧреНрдорд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ (рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдпрд╣ рд╕рднреА рдкреНрд░рдореБрдЦ рд╕рдВрдХрд▓рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ - рдФрд░ рдПрдЖрд░рдПрдо рдкрд░) рдФрд░ рдУрдПрд╕ (рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рднреА)ред
рдкреНрд░рд▓реЗрдЦрди рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рд╣реИ - рдЪрдордХрджрд╛рд░ рдкрддреНрд░рд┐рдХрд╛рдУрдВ рддрдХред
рдЕрдзреНрдпрдпрди рдореЗрдВ
рдЖрд╕рд╛рдиреА рдЕрд╕рд╛рдзрд╛рд░рдг рд╣реИред рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдордп - рдорд┐рдирдЯред рдПрдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП - рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВред
рдбреАрдмрдЧрд┐рдВрдЧ рд╕реАрдорд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡ рд╣реИ - рдЗрдВрдЯреЗрд▓ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реНрдЯреВрдбрд┐рдпреЛ рджреЗрдЦреЗрдВред
рдиреБрдХрд╕рд╛рди : рдпрд╣ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдереНрд░реЗрдбреНрд╕ рдХреЗ "рдЙрдиреНрдирдд" рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдореЗрдВ рдФрд░ рд╕рдорд╛рдВрддрд░рд┐рдХрд░рдг рдХреЗ рдЕрдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде "рд╕рдВрдпреБрдХреНрдд"ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред OpenMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
#pragma omp parallel for for (i = 0; i < n; ++i) result[i] = a[i] * b[i];
OpenCL (рдУрдкрди рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛)
рд╡рд┐рд╖рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпреБрд╡рд╛ (2008 рд╡рд░реНрд╖ рдХрд╛ рдЬрдиреНрдо) рдорд╛рдирдХред рдпрд╣реА рд╣реИ, рдЕрдВрджрд░ рдпрд╣ рди рдХреЗрд╡рд▓ рд╕реАрдкреАрдпреВ, рдмрд▓реНрдХрд┐ рдЬреАрдкреАрдпреВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдПрдХрдорд╛рддреНрд░ рдлрд╛рдпрджрд╛ рд╣реИред рдпрд╣ AMD, Apple, ARM, Intel, NVidia рдФрд░ рд╕рднреА рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдирд┐рд░реНрдорд╛рдг рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред Microsoft рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рдПрдХ рдФрд░ рдШреЛрд╖рд┐рдд рд▓рд╛рдн рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдб рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реЗрдХреНрдЯрд░рдХрд░рдг рд╣реИред рд▓реЗрдХрд┐рди OpenCL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :)
рдорд╛рдирдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛: рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдореЗрдЬрдмрд╛рди рдФрд░ рдХрдИ рдУрдкрдирд╕реАрдПрд▓ рдбрд┐рд╡рд╛рдЗрд╕ (рдХрдВрдкреНрдпреВрдЯ рдпреВрдирд┐рдЯ), рдЬреЛ рдПрдХ рд╕рд╛рде рдХрд░реНрдиреЗрд▓-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди (рдХрд░реНрдиреЗрд▓) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реА (рд╕реА рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд╕рд╛рде) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЗрдЬрдмрд╛рди рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╣рд░ рдЪреАрдЬ рдФрд░ рд╣рд░ рдХрд┐рд╕реА рдХреА рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ :):
- рдПрдХ OpenCL рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдПрдБ,
- рдЧреБрдард▓реА рдмрдирд╛рдПрдБ
- рдирд┐рд╖реНрдкрд╛рджрди рдордВрдЪ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ = рд╕рдВрджрд░реНрдн, рдЙрдкрдХрд░рдг рдФрд░ рдХрддрд╛рд░реЗрдВ,
- рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ рдФрд░ рдмрдирд╛рдПрдВ (рдЧреБрдард▓реА рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп),
- рдореЗрдореЛрд░реА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВ,
- рдЧреБрдард▓реА рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ OpenCL рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдФрд░ рдЧреБрдард▓реА рдкрд╛рд░рд┐рдд рдХрд░реЗрдВред
рдкреНрд░рд▓реЗрдЦрди : рдмрд╣реБрдд рдХрдоред
рдЯреВрд▓ рдХреЛ рд╕реАрдЦрдирд╛ / рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдХрдореА рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрджрд╛рд╣рд░рдгред рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдордп - рджрд┐рдиред рдПрдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП - рдПрдХ рд╕рдкреНрддрд╛рд╣ред
рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди : рдореМрдЬреВрджрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдХрдард┐рдирд╛рдИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп
void scalar_mul(int n, const float *a, const float *b, float *result) { int i; for (i = 0; i < n; ++i) result[i] = a[i] * b[i]; }
OpenCL рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
__kernel void scalar_mul(__global const float *a, __global const float *b, __global float *result) { size_t id = get_global_id(0); result[id] = a[id] * b[id]; }
... рдкреНрд▓рд╕ рдЖрдкрдХреЛ рдЕрднреА рднреА рдореБрдЦреНрдп рд╣реЛрд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдКрдкрд░ рджреЗрдЦреЗрдВ) рдХреЗ рд▓рд┐рдП рдХреЛрдб (!) рдХреА рдПрдХ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб, рд╡рд┐рд╢реЗрд╖ рдУрдкрдирд╕реАрдПрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИ, рдмреЗрд╢рдХ, рдЗрдВрдЯреЗрд▓ рдУрдкрдирд╕реАрдПрд▓ рдПрд╕рдбреАрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдВрддрд░рд┐рдХреАрдХрд░рдг рдЙрдкрдХрд░рдг рдЗрдирд▓ рдкреИрд░реЗрд▓рд▓ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
Cilk Plus, TBB, ArBBред
Cilk Plusред
рдкреНрд▓рд╕ рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Cilk рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред
рдЕрдЧрд╕реНрдд 2011 рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрдВрдЯреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ (рд╡рд┐рдВрдбреЛрдЬ, рд▓рд┐рдирдХреНрд╕) рдФрд░, рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд C \ C ++ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, - рддреБрд░рдВрдд gcc 4.7, рдЬреЛ рддреБрд░рдВрдд рдПрдХ
рдХрдореА рджрд┐рдЦрд╛рддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдХрдореАред GPU рднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рд▓рд╛рдн:рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ ред OpenMP рдХреА рддреБрд▓рдирд╛ рдореЗрдВ Cilk рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдорд┐рдирдЯреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ - рдХрд╛рдо рдХреЗ рдШрдВрдЯреЗред
рдЗрд╕реА рд╕рдордп, рдкреНрд░рджрд░реНрд╢рди OpenMP рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд▓реНрдХ рд╕рднреА рдЗрдирд▓ рдкреИрд░реЗрд▓рд▓ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдФрд░ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИред
Intel Cilk SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдиреНрдпреВрдирддрдо рд╣реЛрддреЗ рд╣реИрдВ; рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд▓реЗрдЦрди : рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд▓реНрдХреА рдХреА рд╕рд╛рджрдЧреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдкрд╕рдВрджреАрджрд╛ рддрд┐рд▓рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
cilk_for (i = 0; i < n; ++i) { result[i] = a[i] * b[i]; }
TBB (рднрд╡рди рдирд┐рд░реНрдорд╛рдг рдЦрдВрдб)
рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯреЗрд▓ рдХреА рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рд▓рд┐рдирдХреНрд╕, рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Xbox360 рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЗрдВрдЯреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдиреБрдХрд╕рд╛рди : рдПрдХ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
тАв рдереНрд░реЗрдб рд╕реЗрдл рдХрдВрдЯреЗрдирд░: рд╡реЗрдХреНрдЯрд░, рдХрддрд╛рд░, рд╣реИрд╢ рдЯреЗрдмрд▓;
тАв рдХрдо, рд╕реНрдХреИрди, рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рд╕реЙрд░реНрдЯ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдоред
тАв рд╕реНрдХреЗрд▓реЗрдмрд▓ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░реНрд╕;
тАв рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди;
рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЙрджрд╛рд╣рд░рдг : рдПрдХ рдмрд╣реБрдд, рдЕрдЪреНрдЫреА рдЧреБрдгрд╡рддреНрддрд╛ред
рд╕реАрдЦрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдХреЛрдб рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдХрдард┐рди рд╣реИред рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╣реИ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдирд╣реАрдВ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдзреНрдпрдпрди / рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдордп рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рджрд┐рди рд╕реЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рддрдХ рд╣реИред
рд▓рд╛рдн : рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди, рд╕рдВрдХрд▓рдХ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░рддрд╛, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдШрдЯрдХреЛрдВ рдХрд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред void scalar_mul(int n, const float *a, const float *b, float *result) { for (int i = 0; i < n; ++i) result[i] = a[i] * b[i]; }
рдЯреАрд╡реАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рддрдерд╛рдХрдерд┐рдд рдмреЙрдбреА (рд╕рд╛рдЗрдХрд┐рд▓ рдмреЙрдбреА) рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдСрдкрд░реЗрдЯрд░ () рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
using namespace tbb; class ApplyMul { public: void operator()( const blocked_range<size_t>& r ) const { float *a = my_a; float *b = my_b; float *result = my_result; for( size_t i=r.begin(); i!=r.end(); ++i ) result[i] = a[i] * b[i]; } ApplyMul( float a[], float b[], float result []) : my_a(a), my_b(b), my_result(result) {} };
рдЬрд╣рд╛рдВ block_range tbb рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИред
рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЖрдк tbb parallel_for рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
void parallel_mul ( float a[], float b[],float result[], int n ) { parallel_for(blocked_range<size_t>(0,n), ApplyMul(a, b, result)); }
ArBB (рдРрд░реЗ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕)ред
рдЧрд░реНрд▓рдлреНрд░реЗрдВрдб рдореЗрдВ - рд╕реАрдЯреА, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмреНрд▓реЙрдЧ рдкрд░ рдЫрд┐рдкрдХрд▓реА рд▓рд┐рдЦреА рдереА ред рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдЗрдВрдЯреЗрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред
Intel ArBB рд╡рд┐рдВрдбреЛрдЬ * рдФрд░ рд▓рд┐рдирдХреНрд╕ * рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЬреЛ Intel, Microsoft Visual C ++ рдФрд░ GCC рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрдпреБрдХреНрдд рд░рди-рдиреАрдо рд╣реИ, рддреЛ рдпрд╣ GPU рдФрд░
рдЖрдЧрд╛рдореА Intel MIC рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рд▓рд╛рдн : рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреВрд░реНрдг рд╕реНрдЯреНрд░реАрдо рд╕реБрд░рдХреНрд╖рд╛ (рдбреЗрдЯрд╛ рд░реЗрд╕ рдХреА рдХрдореА) рдЕрдкрдиреЗ рдЕрдВрджрд░ рдЯреАрдмреАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг : рдЕрдлрд╕реЛрд╕, рд▓реИрдХреЛрдирд┐рдХ, рдЙрджрд╛рд╣рд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред
рдЯреАрдмреАрдмреА рд╕реНрддрд░ рдкрд░ -
рдорд╛рд╕реНрдЯрд░рд┐рдВрдЧ / рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдард┐рдирд╛рдИ ред
рдиреБрдХрд╕рд╛рди:рдЕрднреА рднреА рдмреАрдЯрд╛ рдореЗрдВ рд╣реИред
рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдУрд╡рд░рд╣реЗрдб рдХреЗ рдХрд╛рд░рдг рдЫреЛрдЯреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП рдХреБрдЦреНрдпрд╛рдд ArBB рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ _for рдореЗрдВред рд▓реЗрдХрд┐рди рдирд╣реАрдВред _ ArBB рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ArBB рдореЗрдВ рдХреЛрдИ "рд╕рдорд╛рдирд╛рдВрддрд░" рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рд╡рд╣реА
void scalar_mul(int n, const float *a, const float *b, float *result) { for (int i = 0; i < n; ++i) result[i] = a[i] * b[i]; }
void parallel_mul(dense<f32> a, dense<f32> b, dense<f32> &result) { result = a * b; }
рдПрдХ рдЪреБрдиреМрддреА рдХреЗ рд╕рд╛рде
dense<f32> va; bind (va, a, n); dense<f32> vb; bind (vb, b, n); dense<f32> vres; bind (vres, result, n); call(parallel_mul)(va, vb, vres);
рд╕рд╛рд░рд╛рдВрд╢ рдирдВрдмрд░ рез
рдкрд┐рд╡рдЯ рдЯреЗрдмрд▓ рдЪрдпрдиред

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