рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдПрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдпреБрдЧ рдореЗрдВ рдореМрдЬреВрджрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдХрд▓рди-рдЧрд╣рди рдорд╢реАрди-рд▓рд░реНрдирд┐рдВрдЧ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рдЙрднрд░рддреА рдорд╛рдВрдЧ рд╣реИред рдРрд╕рд╛ рдХреЛрдб рдЖрдорддреМрд░ рдкрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рд╣реЗрд░рдлреЗрд░ рдЬреИрд╕реА рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд▓реВрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред OpenMP рдХрд╛ SIMD рд╡рд┐рд╕реНрддрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╡реЗрдХреНрдЯрд░ рдЗрдХрд╛рдИ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЫреЛрд░реЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдореЗрдВ рд╕реА / рд╕реА ++ рдУрдкрдирдПрдордкреА рд╕рд┐рдордб рд╡реИрд░рд┐рдлрд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдЧрд░реНрд╡ рд╣реИред
OpenMP C / C ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ 1990 рдХреЗ рджрд╢рдХ рдореЗрдВ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдУрдкрдирдПрдордкреА рдорд╛рдирдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрд╛рд░реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг, SIMD рд╡реЗрдХреНрдЯрд░рдХрд░рдг, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдСрдлрд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред 2005 рд╕реЗ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдиреЗ рдУрдкрдирдПрдордкреА 2.0 рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рджреБрдирд┐рдпрд╛ рдПрдХ рдПрдЖрдИ рдпреБрдЧ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реА рд╣реИ, рд╣рдо рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдУрдкрдирдПрдордкреА рдорд╛рдирдХ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдврд╝рддрд╛ рдЕрд╡рд╕рд░ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо OpenMP SIMD рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдХрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдореЗрдВ рдЕрдкрдиреА рдпрд╛рддреНрд░рд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

OpenMP SIMD, рдЬреЛ рдкрд╣рд▓реЗ OpenMP 4.0 рдорд╛рдирдХ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд▓реВрдк рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдм рддрдХ рд╣рдорд╛рд░реЗ рд╢реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдУрдкрдирдПрдордкреА рдлреАрдЪрд░ рд╣реИред OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реВрдк рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд▓реВрдк рд╡реЗрдХреНрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрдИ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИред
#pragma omp simd for (i = 0; i < count; i++) { a[i] = b[i] + 1; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ C ++ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА #pragma рд╡реЗрдХреНрдЯрд░ рдФрд░ #pragma ivdep рдЬреИрд╕реЗ рдиреЙрди-рдУрдкрдиMP рд▓реВрдк рдкреНрд░реИрдЧреНрдорд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрдкрд╛рдЗрд▓рд░ OpenMP SIMD рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рдХрд┐рд╕реА рднреА рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред
- / fp: рдлрд╛рд╕реНрдЯ рд▓реВрдк рдХреЗ рднреАрддрд░ рд╕рдХреНрд╖рдо рд╣реИред
- рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд▓реВрдкреНрд╕ рд╡реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
- рдмрд╛рд╣рд░реА рдЫреЛрд░реЛрдВ рд╕рджрд┐рд╢ рд╣реИрдВред
- рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗрдХреНрдЯрд░рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд╣рд╛рдЗрдмреНрд░рд┐рдб рддреНрд╡рд░рдг рдореЛрдЯреЗ рддреМрд░ рдкрд░ рджрд╛рдиреЗрджрд╛рд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рдареАрдХ- рджрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдореНрдкреНрдЯ рдХреЗ рд▓рд┐рдП #pragma omp рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд▓реЙрдЬрд╝ рдХреЛ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
- simdlen ( рд▓рдВрдмрд╛рдИ ): рд╡реЗрдХреНрдЯрд░ рд▓реЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
- safelen ( рд▓рдВрдмрд╛рдИ ): рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрднрд░рддрд╛ рджреВрд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
- рд░реИрдЦрд┐рдХ ( рд╕реВрдЪреА [ : рд░реИрдЦрд┐рдХ-рдХрджрдо] ): рд▓реВрдк рдкреНрд░реЗрд░рдг рдЪрд░ рд╕реЗ рд╕рд░рдгреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд░реЗрдЦреАрдп рдорд╛рдирдЪрд┐рддреНрд░рдг
- рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ ( рд╕реВрдЪреА [ : рд╕рдВрд░реЗрдЦрдг] ): рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрд░реЗрдЦрдг
- рдирд┐рдЬреА ( рд╕реВрдЪреА ): рдбреЗрдЯрд╛ рдирд┐рдЬреАрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
- рд▓рд╛рд╕реНрдЯрдкрд╛рдЗрдк ( рд╕реВрдЪреА ): рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдирд┐рдЬреАрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
- рдХрдореА ( рдХрдореА-рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ : рд╕реВрдЪреА ): рдЕрдиреБрдХреВрд▓рд┐рдд рдХрдореА рд╕рдВрдЪрд╛рд▓рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
- рдкрддрди ( рдПрди ): coalescing рдкрд╛рд╢ рдШреЛрдВрд╕рд▓рд╛
рдирдпрд╛ -openmp: рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕реНрд╡рд┐рдЪ
рдПрдХ OpenMP-SIMD- рдПрдиреЛрдЯреЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирдП CL рд╕реНрд╡рд┐рдЪ -openmp рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ : рдкреНрд░рд╛рдпреЛрдЧрд┐рдХред рдпрд╣ рдирдпрд╛ рд╕реНрд╡рд┐рдЪ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрдкрдирдПрдордкреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрдбрд░- рдЬреЗрди рдирд╣реАрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЬрдмрдХрд┐ рдЗрд╕ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдирд╛рдо "рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ" рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реНрд╡рд┐рдЪ рд╣реИ, рдФрд░ рдпрд╣ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдФрд░ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рд╣реИред рдирд╛рдо рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдкреВрд░реНрдг рдЙрдк-рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ OpenMP рдорд╛рдирдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдЗрд╕ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддрд┐рд░рд┐рдХреНрдд OpenMP рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП OpenMP- рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред -Openmp: рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реНрд╡рд┐рдЪ -openmp рд╕реНрд╡рд┐рдЪ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА OpenMP 2.0 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ SIMD рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдЗрд╕рдХреЗ рдЦрдВрдб рдХреЛ -openmp рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрди рд▓реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдиреАрдЪреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
cl -O2 -openmp: рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ mycode.cpp
mycode.cpp (84): рдЬрд╛рдирдХрд╛рд░реА C5002: OMP simd рд▓реВрдк рдХрд╛ рдХрд╛рд░рдг '1200' рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ
mycode.cpp (90): рдЬрд╛рдирдХрд╛рд░реА C5002: OMP simd рд▓реВрдк рдХрд╛ рдХрд╛рд░рдг '1200' рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ
рд╡реЗрдХреНрдЯрд░ рдХрд┐рдП рдЧрдП рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рддрдм рддрдХ рдЪреБрдк рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд┐рдВрдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрд╡рд┐рдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
cl -O2 -openmp: рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ -Qvec- рд░рд┐рдкреЛрд░реНрдЯ: 2 mycode.cpp
mycode.cpp (84): рдЬрд╛рдирдХрд╛рд░реА C5002: OMP simd рд▓реВрдк рдХрд╛ рдХрд╛рд░рдг '1200' рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ
mycode.cpp (90): рдЬрд╛рдирдХрд╛рд░реА C5002: OMP simd рд▓реВрдк рдХрд╛ рдХрд╛рд░рдг '1200' рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ
mycode.cpp (96): рдЬрд╛рдирдХрд╛рд░реА C5001: OMP simd рд▓реВрдк рд╡реЗрдХреНрдЯрд░рдХреГрдд
OpenMP SIMD рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдордиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдирдП рд╕реНрд╡рд┐рдЪ рдХреЗ рддрд╣рдд рдмреИрдХреЗрдВрдб рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде SIMD pragma рдХреЛ рдЭреБрдХрд╛ рджрд┐рдпрд╛ рд╣реИред рд╣рдордиреЗ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдПрд▓рд┐рдпрд╛рд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдХреЗ рдЕрдВрддрд░рддрдо рдЫреЛрд░реЛрдВ рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдореЗрдВ рдХреЛрдИ рднреА SIMD рдХреНрд▓реЙрд╕ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛
рдЪреЗрддрд╛рд╡рдиреА C4849: OpenMP 'simdlen' рдЦрдВрдб 'simd' рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП:
#pragma omp simd simdlen(8) for (i = 1; i < count; i++) { a[i] = a[i-1] + 1; b[i] = *c + 1; bar(i); }
OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реВрдк рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╡рд╛рджреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдХреЗ рдРрд╕реЗ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреА рд╕реНрдкрд╖реНрдЯ рд╡реИрдзрддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЬрдм рд╡реЗрдХреНрдЯрд░рдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реВрдк рдПрдиреЛрдЯреЗрдЯ рдХрд░рдХреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрдИ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ SIMD рдпрд╛ рд╡реЗрдХреНрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдорд╛рдирддрд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рд▓рд╛рдн рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕реЗ рдПрдХрд▓ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд▓реВрдк рдХреЛ OpenMP SIMD рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкреВрд░реНрдг рд╕рдорд╛рдирддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ [i] рд╕реЗ [i-1] рддрдХ рдПрдХ рдкрд┐рдЫрдбрд╝реА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди SIMD рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрднреА рднреА рдкрд╣рд▓реЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред
#pragma omp simd for (i = 1; i < count; i++) { a[i] = a[i-1] + 1; b[i] = *c + 1; bar(i); }
рдЗрд╕рд▓рд┐рдП, рд▓реВрдк рдХреЗ рдирд┐рдореНрди рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╡реЗрдХреНрдЯрд░ рд░реВрдк рдХрд╛рдиреВрдиреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ [i] рдХреЛ [-1] рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, b [i] рдПрдХ [i] рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрд╛рд░ рдореЗрдВ рдХреЙрд▓ рдЕрдВрддрд┐рдо рд╕рдордп рдкрд░ рд╣реЛрддрд╛ рд╣реИред
#pragma omp simd for (i = 1; i < count; i+=4) { a[i:i+3] = a[i-1:i+2] + 1; b[i:i+3] = *c + 1; bar(i); bar(i+1); bar(i+2); bar(i+3); }
рдпрджрд┐ рдпрд╣ рдПрдХ [i] рдпрд╛ b [i] рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рд░реЗрдлрд░реЗрдВрд╕ рдХреЛ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдирд╛ рдЧреИрд░рдХрд╛рдиреВрдиреА рд╣реИред рдпрджрд┐ рдпрд╣ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдореВрд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдХрдердиреЛрдВ рдХреЛ рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рднреА рдЕрд╡реИрдз рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрди рд░реВрдкрд╛рдВрддрд░рд┐рдд рд▓реВрдк рдХрд╛рдиреВрдиреА рдирд╣реАрдВ рд╣реИ ред
c = b; t = *c; #pragma omp simd for (i = 1; i < count; i+=4) { a[i:i+3] = a[i-1:i+2] + 1; bar(i); // illegal to reorder if bar[i] depends on b[i] b[i:i+3] = t + 1; // illegal to move *c out of the loop bar(i+1); bar(i+2); bar(i+3); }
рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдПрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рд╣рдо рдЖрдкрдХреЛ рдЗрд╕ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ OpenMP SIMD рд▓реВрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЖрдк рд╡реЗрдХреНрдЯрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВред рд╣рдо рдИрдореЗрд▓ ( visualcpp@microsoft.com ), рдЯреНрд╡рд┐рдЯрд░ (@visualc), рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рд╕рдореБрджрд╛рдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рд╣рдо Visual Studio рдореЗрдВ рдЧреБрдо OpenMP рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕реБрдирдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ 2.0 рдорд╛рдирдХ рдХреЗ рдмрд╛рдж рд╕реЗ рдУрдкрдирдПрдордкреА рдореЗрдВ рдХрдИ рдкреНрд░рдореБрдЦ рд╡рд┐рдХрд╛рд╕ рд╣реБрдП рд╣реИрдВ, рдУрдкрдирдПрдордкреА рдореЗрдВ рдЕрдм рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЬрдмрд░рджрд╕реНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдУрдкрдирдПрдордкреА 3.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред Heterogenous рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ (CPU + рддреНрд╡рд░рдХ) OpenMP 4.0 рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдЙрдиреНрдирдд SIMD рд╡реИрд╢реНрд╡реАрдХрд░рдг рдФрд░ DOACROSS рд▓реВрдк рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдорд░реНрдерди рдЕрдм рдирд╡реАрдирддрдо OpenMP рдорд╛рдирдХ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдХреГрдкрдпрд╛ OpenMP рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ: https://www.openmp.org рд╕реЗ рд╕рдВрдкреВрд░реНрдг рдорд╛рдирдХ рд╕рдВрд╢реЛрдзрди рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗрдЯ рджреЗрдЦреЗрдВ ред рд╣рдо рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдУрдкрдирдПрдордкреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдпрд╣ рднреА рд╕реБрдирдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ Visual Studio рдореЗрдВ OpenMP рд╕рдорд░реНрдерди рдХреА рджрд┐рд╢рд╛ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
