рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛, рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛! Openmp 4.0



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

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

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

рд╡реЗ рд╣рдореЗрдВ рджреЛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЧрддрд┐ рджреЗрддреЗ рд╣реИрдВ:


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

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

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

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

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

рдореИрдВ рдкрд╣рд▓реЗ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ Cilk Plus рдореЗрдВ рдХреИрд╕реЗ рдерд╛ред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрдХреНрд░ рд╣реИ:

void add_floats(float *a, float *b, float *c, float *d, float *e, int n){ int i; for (i=0; i<n; i++){ a[i] = a[i] + b[i] + c[i] + d[i] + e[i]; } } 

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

  #pragma simd for (i=0; i<n; i++){ a[i] = a[i] + b[i] + c[i] + d[i] + e[i]; 

рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡реЙрдЗрд▓рд╛ - рдЪрдХреНрд░ рд╕рджрд┐рд╢ рд╣реИ! рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ - рдпрд╣ рдЗрдВрдЯреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдЕрдм, рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдУрдкрдирдПрдордкреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ, рдХреЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢ рдЕрдзрд┐рдХ "рдкрд░рд┐рдЪрд┐рдд" рд░реВрдк рдореЗрдВ рдмрди рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:

 #pragma omp simd 

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

 #pragma omp parallel for simd 

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

рдПрдХ рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдЬреЛрдбрд╝реА рдЧрдИ рдереА - рддрдерд╛рдХрдерд┐рдд рдореМрд▓рд┐рдХ рдХрд╛рд░реНрдпред рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд▓реВрдк рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред Cilk Plus рдиреЗ рдореИрдЬрд┐рдХ __declspec (рд╡реЗрдХреНрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ - рдПрдХ рдЬреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ "рдмрд╛рд╣рд░ рджреЗрдирд╛" рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЗрд╕реЗ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдлрд▓ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЗ рд╕рд╛рдеред OpenMP рдореЗрдВ, рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 #pragma omp declare simd 

рдФрд░ рдЕрдм рдлреЛрд░рдЯреНрд░рд╛рди рдкрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦреБрд╢реА рдордирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдерд╛ (рдЕрдВрддрд┐рдо рд╕рдордп рддрдХ рд╕реА / рд╕реА ++ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреНрд▓рд╕)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рддреНрд╡рд░рдХ рдХреЗ рд╕рд╛рде "рд╣рд╛рдЗрдмреНрд░рд┐рдб" рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓, рдЬреЛ рдЕрдм рдмреЗрд╣рдж рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддреНрд╡рд░рдХ рд╣реИ - рдЪрд╛рд╣реЗ рд╡рд╣ GPU рд╣реЛ, рдпрд╛ рдЕрдиреНрдп рдЕрдЬреНрдЮрд╛рдд рдЬрд╛рдирд╡рд░ - рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдореЙрдбрд▓ рдЕрдм рдбреЗрд╡рд▓рдкрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдпрд╣ рдирдП OpenMP рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрдм рд╣рдо рддреНрд╡рд░рдХ рдкрд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЗрдЬрдмрд╛рди рдкрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #pragma omp target map(to(b:count)) map(to(c,d)) map(from(a:count)) { #pragma omp parallel for for (i=0; i<count; i++) a[i] = b[i] * c + d; } 

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

рдПрдХ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг OpenMP рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╢рд╛рд╕реНрддреНрд░реАрдп рд░реВрдк рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣реИ ред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, 30 рджрд┐рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред рддреЛ OpenMP 4.0 рдХреА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

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


All Articles