рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдбреЗрд╡рд▓рдкрд░: рдХреИрд╕реЗ рд╡реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рд╣реИ?


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

рддреЛ, рдЖрдк рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ "рдкреЛрд╖рд┐рдд" рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ:



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

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

#include <immintrin.h> double A[100], B[100], C[100]; for (int i = 0; i < 100; i += 4) { __m256d a = _mm256_load_pd(&A[i]); __m256d b = _mm256_load_pd(&B[i]); __m256d c = _mm256_add_pd(a, b); _mm256_store_pd(&C[i], c); } 

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

рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ:

 #include <dvec.h> // 4 elements per vector * 25 = 100 elements F64vec4 A[25], B[25], C[25]; for(int i = 0; i < 25; i++) C[i] = A[i] + B[i]; 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдХреЛрдб рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, F64 рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рдлреНрд▓реЛрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ 64 рдмрд┐рдЯреНрд╕, рдФрд░ vec4 рдЗрдВрдЯреЗрд▓ AVX (SSE рдХреЗ рд▓рд┐рдП vec2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред

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

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

 double A[1000], B[1000], C[1000], D[1000], E[1000]; for (int i = 0; i < 1000; i++) E[i] = (A[i] < B[i]) ? C[i] : D[i]; 

рдпрджрд┐ рд╣рдо рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓реЗрдЧрд╛:
 double A[1000], B[1000], C[1000], D[1000], E[1000]; for (int i = 0; i < 1000; i += 2) { __m128d a = _mm_load_pd(&A[i]); __m128d b = _mm_load_pd(&B[i]); __m128d c = _mm_load_pd(&C[i]); __m128d d = _mm_load_pd(&D[i]); __m128d e; __m128d mask = _mm_cmplt_pd(a, b); e = _mm_or_pd( _mm_and_pd (mask, c), _mm_andnot_pd(mask, d)); _mm_store_pd(&E[i], e); } 

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ... рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░ рдЦреБрдж рдЙрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖ "рдЯреНрд░рд┐рдХреНрд╕" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #pragma ivdep рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд▓реВрдк рдореЗрдВ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ #pragma рд╡реЗрдХреНрдЯрд░ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреА "рджрдХреНрд╖рддрд╛ рдиреАрддрд┐" рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рдЕрдХреНрд╕рд░ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЪрдХреНрд░ рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЕрдХреНрд╖рдо рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рд╣реИ) рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди "рд╢рд╛рдпрдж рдорджрдж" рдХреА рд╢реНрд░реЗрдгреА рд╕реЗ рдпреЗ рдирд┐рд░реНрджреЗрд╢ред рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓реВрдк рдХреЛ рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдкреНрд░рд╛рдЧреНрдо рдЖрдЗрд╡реАрдбреАрдк рд╣реЛред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛, рдЬреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЗ рдХрдИ рдЕрдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВред рдпреЗ рдХреНрд░рдорд╢рдГ рдирдП рдорд╛рдирдХ OpenMP 4.0 рдФрд░ Inte Cilk Plus #pragma omp simd рдФрд░ #pragma simd рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред рд╡реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рднреВрд▓" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдХрд╣реЗ рдЧрдП рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬрд┐рдореНрдореЗрджрд╛рд░реА, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕рдХреЗ рдХрдВрдзреЛрдВ рдФрд░ рд╕рд┐рд░ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

 base[first:length:stride] 

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

 double A[1000], B[1000], C[1000], D[1000], E[1000]; E[:] = (A[:] < B[:]) ? C[:] : D[:]; 

рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдмрддрд╛рддреЗ рд╣реИрдВ рдпрд╣ рдХреЛрдб

 for (i = 0; i < 5; i++) A[(i*2) + 1] = B[(i*1) + 1]; 

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

 int A[10], *B; A[1:5:2] = B[1:5]; 

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

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


All Articles