рд╕рдорд╛рдирд╛рдВрддрд░ C ++ 17 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЕрджреНрднреБрдд рдкреНрд░рджрд░реНрд╢рдиред рдорд┐рдердХ рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛?

рд╢реБрдн рд╕рдВрдзреНрдпрд╛

рд╣рдорд╛рд░реЗ рдкрд╛рдареНрдпрдХреНрд░рдо "рд╕реА ++ рдбреЗрд╡рд▓рдкрд░" рд╕реЗ рд╣рдо рдЖрдкрдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдзреНрдпрдпрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

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

рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрд░рд┐рдЪрдп



C ++ 17 рд╕рдмрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдиреАрддрд┐ рд╕реЗрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  • sequenced_policy - рдирд┐рд╖реНрдкрд╛рджрди рдиреАрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░реАрдХрд░рдг рдЕрд╕рдВрднрд╡ рд╣реИ: рд╕рдВрдмрдВрдзрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ std::execution::seq ;
  • рд╕рдорд╛рдирд╛рдВрддрд░_рдкреЙрд▓рд┐рд╕реА - рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рд╖реНрдкрд╛рджрди рдиреАрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрднрд╡ рд╣реИ: рд╕рдВрдмрдВрдзрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ std::execution::par ;
  • рд╕рдорд╛рдирд╛рдВрддрд░_рдЕрдиреБрдХреНрд░рдорд┐рдд_рдкреЙрд▓рд┐рд╕реА - рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдФрд░ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рд╖реНрдкрд╛рджрди рдиреАрддрд┐: рд╕рдВрдмрдВрдзрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ std::execution::par_unseq ;

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

  • std::execution::seq рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ std::execution::seq рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП std::execution::seq ;
  • std::execution::par рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ std::execution::par рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std::execution::par (рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдереНрд░реЗрдб рдкреВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдереНрд░реЗрдб рдкреВрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ);
  • рд╡реЗрдХреНрдЯрд░ рдХрдорд╛рдВрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SSE, AVX) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП std::execution::par_unseq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдПрдХ рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЙрд▓ std::sort рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ std::sort рдХрд░реЗрдВ:

 std::sort(std::execution::par, myVec.begin(), myVec.end()); // ^^^^^^^^^^^^^^^^^^^ //   

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ! рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдЧрддрд┐ рдмрдврд╝рд╛рдПрдЧрд╛? рдпрд╛ рдХреЛрдИ рдордВрджреА рд╣реИ?

рд╕рдорд╛рдирд╛рдВрддрд░ std::transform

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ std::transform рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд┐рдзрд┐рдпреЛрдВ ( std::transform_reduce , for_each , scan , sort ...) рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 std::transform(execution_policy, // par, seq, par_unseq inVec.begin(), inVec.end(), outVec.begin(), ElementOperation); 

рдорд╛рди рд▓реЗрдВ рдХрд┐ ElementOperation рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдб рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ ElementOperation рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЧрдгрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдЖрджреЗрд╢ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрддреНрд╡реЛрдВ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдереНрд░реЗрдб (рд╕рдВрднрд╡рддрдГ рдПрдХ рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ) рд╕реНрдкреЙрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

  • рд╡реЗрдХреНрдЯрд░ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЖрдХрд╛рд░ рдмрдбрд╝рд╛ рдпрд╛ рдЫреЛрдЯрд╛ рд╣реИ;
  • рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ;
  • рдЕрдзрд┐рдХ рдЕрдВрдХрдЧрдгрд┐рдд (ALU) рд╕рдВрдЪрд╛рд▓рди;
  • рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ ALUред

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

рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдиреЛрдЯ

рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2017, 15.8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдЪреВрдВрдХрд┐ рдпрд╣ рд▓реЛрдХрдкреНрд░рд┐рдп / рдПрд╕рдЯреАрдПрд▓ рд╕рдВрдХрд▓рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдордп (рдирд╡рдВрдмрд░, 2018) (рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЬреАрд╕реАрд╕реА!)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ execution::par рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ execution::par рдмрд╛рдж рд╕реЗ execution::par_unseq MSVC рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ (рдпрд╣ execution::par рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ execution::par )ред

рджреЛ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИрдВ:

  • i7 8700 - рдкреАрд╕реА, рд╡рд┐рдВрдбреЛрдЬ 10, i7 8700 - 3.2 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ, 6 рдХреЛрд░ / 12 рдзрд╛рдЧреЗ (рд╣рд╛рдЗрдкрд░рдереНрд░реЗрдбрд┐рдВрдЧ);
  • i7 4720 - рд▓реИрдкрдЯреЙрдк, рд╡рд┐рдВрдбреЛрдЬ 10, i7 4720, 2.6 GHz, 4 рдХреЛрд░ / 8 рдзрд╛рдЧреЗ (рд╣рд╛рдЗрдкрд░рдереНрд░реЗрдбрд┐рдВрдЧ)ред

рдХреЛрдб рдХреЛ x64 рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдЬрд╛рд░реА рдХрд░реЗрдВ, рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рдХрд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ, рдореИрдВрдиреЗ рдХрдорд╛рдВрдб (SSE2) рдФрд░ рдУрдкрдирдПрдордкреА (2.0) рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрдЯ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред

рдХреЛрдб рдореЗрд░реЗ рдЧрд┐рддреБрдм рдореЗрдВ рд╣реИ : github / fenbf / ParSTLTests / TransformTests / Transformsests.pp

OpenMP (2.0) рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

 #pragma omp parallel for for (int i = 0; ...) 

рдореИрдВ 5 рдмрд╛рд░ рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдиреНрдпреВрдирддрдо рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддрд╛ рд╣реВрдВред

рдЪреЗрддрд╛рд╡рдиреА : рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рдореЛрдЯреЗ рдЕрд╡рд▓реЛрдХрди рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рдкрд░рд┐рд╡реЗрд╢ рдореЗрд░рд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ MSVC рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рдмрд┐рд▓ рдУ'рдиреАрд▓ рдХреА рдирд╡реАрдирддрдо рд░рд┐рдкреЛрд░реНрдЯ CppCon 2018 (MSVC рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд╕рдЯреАрдПрд▓ рд▓рд╛рдЧреВ) рдХреЗ рд╕рд╛рде рд╣реИред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

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

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 std::transform(std::execution::par, vec.begin(), vec.end(), out.begin(), [](double v) { return v * 2.0; } ); 

рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдВ 6 рдпрд╛ 4 рдХреЛрд░ рд╣реИрдВ ... рдХреНрдпрд╛ рдореИрдВ 4..6 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ (рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп):

рдЖрдкрд░реЗрд╢рдирд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░i7 4720 (4 рдХреЛрд░)i7 8700 (6 рдХреЛрд░)
рдирд┐рд╖реНрдкрд╛рджрди :: seq10k0.0027630.001924
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░10k0.0098690.008983
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░10k0.0031580.002246
рдирд┐рд╖реНрдкрд╛рджрди :: seq100k0.0513180.028872
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░100k0.0430280.025664
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░100k0.0225010.009624
рдирд┐рд╖реНрдкрд╛рджрди :: seq1000kрез.ремреп,релрежрео.релреи,рекрезреп
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░1000kрез.ремрел,релремрез0.359619
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░1000kрез.релреж,ремренрео0.344863

рдПрдХ рддреЗрдЬрд╝ рдорд╢реАрди рдкрд░, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 1 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡ рд▓рдЧреЗрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░, рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рд╕рднреА рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзреАрдорд╛ рдереЗред

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

рдРрд╕рд╛ рдХреНрдпреЛрдВ?

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

рдПрдХ рдЪрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдЧрднрдЧ 2-3 рдЪрдХреНрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдХреИрд╢ рдирд╣реАрдВ рд╣реИ рддреЛ рдХрдИ рд╕реМ рдЪрдХреНрд░ред
https://www.agner.org/optimize/optimizing_cpp.pdf

рдЖрдк рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдореЛрд░реА рдирд┐рд░реНрднрд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдзрд┐рдХ рдЧрдгрдирд╛

рдЪреВрдВрдХрд┐ рдореЗрдореЛрд░реА рдмреИрдВрдбрд╡рд┐рдбреНрде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЪреАрдЬреЛрдВ рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ... рдЖрдЗрдП рдЧрдгрдирд╛ рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝рд╛рдПрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, sqrt(sin*cos) (рдпреЗ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рд░реВрдк рдореЗрдВ рд╕рд╢рд░реНрдд рдЧрдгрдирд╛ рд╣реИрдВ, рдмрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рд╣рдо sqrt , sin рдФрд░ cos рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ ~ 20 рдкреНрд░рддрд┐ sqrt рдФрд░ ~ 100 рдкреНрд░рддрд┐ рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рдлрдВрдХреНрд╢рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЧрдгрдирд╛ рдХреА рдпрд╣ рд░рд╛рд╢рд┐ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рд╡рд┐рд▓рдВрдм рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреА рд╣реИред

рдЯреАрдо рджреЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Agner Fogh рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдкрд░рдлреЗрдХреНрдЯ рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВред

рдпрд╣рд╛рдБ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛрдб рд╣реИ:

 std::transform(std::execution::par, vec.begin(), vec.end(), out.begin(), [](double v) { return std::sqrt(std::sin(v)*std::cos(v)); } ); 

рдФрд░ рдЕрдм рдХреНрдпрд╛? рдХреНрдпрд╛ рд╣рдо рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣рд╛рдБ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ (рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп):

рдЖрдкрд░реЗрд╢рдирд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░i7 4720 (4 рдХреЛрд░)i7 8700 (6 рдХреЛрд░)
рдирд┐рд╖реНрдкрд╛рджрди :: seq10k0.1050050.070577
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░10k0.055661.режрей,резренрем
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░10k0.0963210.024702
рдирд┐рд╖реНрдкрд╛рджрди :: seq100kрез.режрео,ренрелрел0.707048
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░100k0.259354.резрен,резрепрел
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░100k0.8984650.189915
рдирд┐рд╖реНрдкрд╛рджрди :: seq1000k10.5159рен.резрем,реирелрек
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░1000kреи.рекрек,рекренреирез.резреж,режрепреп
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░1000kрек.ренрео,ремреорезрез.реореп,режрезрен

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдЪреНрдЫреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ :)

1000 рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП (рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛), рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЧрдгрдирд╛ рд╕рдордп рд╕рдорд╛рди рдереЗ, рдЗрд╕рд▓рд┐рдП 1000 рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рджреЗрдЦрддреЗ рд╣реИрдВред

100 рд╣рдЬрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП, рддреЗрдЬреА рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╕реАрд░рд┐рдпрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 9 рдЧреБрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдЗрд╕реА рддрд░рд╣ OpenMP рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП)ред

рдПрдХ рд▓рд╛рдЦ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо 5 рдпрд╛ 8 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред
рдРрд╕реА рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ "рд░реИрдЦрд┐рдХ" рддреНрд╡рд░рдг рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ред рдЬрд┐рд╕рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдереАред

рдлреНрд░реЗрд╕реНрдиреЗрд▓ рдФрд░ рддреАрди рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░

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




рд╡рд┐рдХрд┐рдореАрдбрд┐рдпрд╛ рд╕реЗ рдлреЛрдЯреЛ

рдПрдХ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рд╡рд┐рд╡рд░рдг рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рд╛ред

GLM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ glm рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ OpenGl рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

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

рдХреЙрдирди рдлрд╝рд╛рдЗрд▓:

 [requires] glm/0.9.9.1@g-truc/stable [generators] visual_studio 

рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди (рдпрд╣ рдкреНрд░реЙрдкрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ)

 conan install . -s build_type=Release -if build_release_x64 -s arch=x86_64 

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ

рдореИрдВрдиреЗ glat рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ scratchapixel.com рд╕реЗ рд▓рд┐рдпрд╛ :

 //    https://www.scratchapixel.com float fresnel(const glm::vec4 &I, const glm::vec4 &N, const float ior) { float cosi = std::clamp(glm::dot(I, N), -1.0f, 1.0f); float etai = 1, etat = ior; if (cosi > 0) { std::swap(etai, etat); } //  sini     float sint = etai / etat * sqrtf(std::max(0.f, 1 - cosi * cosi)); //    if (sint >= 1) return 1.0f; float cost = sqrtf(std::max(0.f, 1 - sint * sint)); cosi = fabsf(cosi); float Rs = ((etat * cosi) - (etai * cost)) / ((etat * cosi) + (etai * cost)); float Rp = ((etai * cosi) - (etat * cost)) / ((etai * cosi) + (etat * cost)); return (Rs * Rs + Rp * Rp) / 2.0f; } 

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

рдмреЗрдВрдЪрдорд╛рд░реНрдХ:

 std::transform(std::execution::par, vec.begin(), vec.end(), vecNormals.begin(), //   vecFresnelTerms.begin(), //  [](const glm::vec4& v, const glm::vec4& n) { return fresnel(v, n, 1.0f); } ); 

рдФрд░ рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо (рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп) рд╣реИрдВ:

рдЖрдкрд░реЗрд╢рдирд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░i7 4720 (4 рдХреЛрд░)i7 8700 (6 рдХреЛрд░)
рдирд┐рд╖реНрдкрд╛рджрди :: seq1k0.0327640.016361
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░1k0.0311860.028551
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░1k0.0055260.007699
рдирд┐рд╖реНрдкрд╛рджрди :: seq10k0.2467220.169383
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░10k0.0907940.067048
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░10k0.0497390.029835
рдирд┐рд╖реНрдкрд╛рджрди :: seq100kреи.рекреп,ренреиреирез.ремреп,ренремрео
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░100k0.5301570.283268
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░100k0.4950240.291609
рдирд┐рд╖реНрдкрд╛рджрди :: seq1000k25.082816.9457
рдирд┐рд╖реНрдкрд╛рджрди :: рдмрд░рд╛рдмрд░1000kрел.резрел,реирейрелреи.рейрей,ренремрео
рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░1000kрел.резрез,реорежрезреи.репрел,репрежрео

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

рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдУрдкрдирдПрдордкреА рдФрд░ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдП: рдПрдордПрд╕рд╡реАрд╕реА рдФрд░ рдУрдкрдирдПрдордкреА рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖

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

рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рддреЗрдВ:

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

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JFT рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ:


рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: рдЗрдВрдЯреЗрд▓ рд╕рдорд╛рдирд╛рдВрддрд░ STL рдФрд░ C ++ 17 рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдВ

рдЕрдВрдд

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

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


All Articles