рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реЛрдирд╛ред "рдкреВрд░реНрдг рд╕рдорд╛рдирддрд╛" рдХрд╛ рдорд╛рдорд▓рд╛ред рднрд╛рдЧ 1

рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг



рдкрд░рд┐рдЪрдп


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдЙрди рд╕рдлрд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЫреЛрд░реЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬрдм рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдо рдРрд╕реЗ рддрдВрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП .NET 4.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП рдФрд░ рдЗрди рддрдВрддреНрд░реЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реИрдВред







рдХреБрдЫ рдЪрдХреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. for ( int i = 0 ; i < upperBound ; i ++ ) { // ... }



  2. for ( int i = 0 ; i < upperBound ; i ++ ) { // ... }



  3. for ( int i = 0 ; i < upperBound ; i ++ ) { // ... }



  4. for ( int i = 0 ; i < upperBound ; i ++ ) { // ... }





рдпрджрд┐ рдЪрдХреНрд░ рдХреЗ рд╢рд░реАрд░ рдХрд╛ рддрд░реНрдХ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЪрдХреНрд░ "рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХреЛрд░ред



рд╕рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рд╕рдорд╛рди рдлрд╝реЙрд░реЗрд╕реНрдЯ рд▓реВрдк рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред



рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реВрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдЪрд▓реЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрдХреНрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдХрд┐рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред



рддреЛ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:



  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп ParallelFor ( int рд╕реЗ, int рд╕реЗ, рдХреНрд░рд┐рдпрд╛ < int > рд╢рд░реАрд░ ) ;




рдпрд╣ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рддреЗ рд╣реБрдП, рд╕реЗ рд▓реЗрдХрд░ (рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕рд╣рд┐рдд) рддрдХ рдХреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реАрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реИ?



рд╕рдорд╛рдирддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг


рдПрдХ рдзреНрд╡рдирд┐ рдирд┐рд░реНрдгрдп рд╣реИ рдХрд┐ рдЗрд╕ рдорд╢реАрди рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдЗрд╕ рдирд┐рд░реНрдгрдп рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реЛрдЧреАред рдЕрдзрд┐рдХ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрди рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдХрдо рдХреЗ рд╕рд╛рде - рдХреБрдЫ рдХреЛрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдВрдЧреЗред



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



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдПрдХ рдзрд╛рдЧрд╛ рдкреНрд░рддрд┐ рдХреЛрд░" рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред



рдЙрдкрд▓рдмреНрдз рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо System.Environment.ProcessorCount рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╣рд╛рдЗрдкрд░-рдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдПрдХ "рддрд╛рд░реНрдХрд┐рдХ", рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛрдЧреБрдиреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред



рдкреВрд░реНрд╡рдЧрд╛рдореА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣рд╛рдВ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ (рдХреБрдЫ рд╣рдж рддрдХ рднреЛрд▓реА) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп ParallelFor ( int рд╕реЗ, int рд╕реЗ, рдХреНрд░рд┐рдпрд╛ < int > рд╢рд░реАрд░ )
  2. {
  3. // рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
  4. int size = to - рд╕реЗ ;
  5. int numProcs = рдкрд░реНрдпрд╛рд╡рд░рдгред ProcessorCount;
  6. int range = size / numProcs ;
  7. // рдбреЗрдЯрд╛ рдХреЛ рддреЛрдбрд╝реЗрдВ, рд╕рднреА рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
  8. var рдереНрд░реЗрдб = рдирдИ рд╕реВрдЪреА < рдереНрд░реЗрдб > ( numProcs ) ;
  9. ( int p = 0 ; p < numProcs ; p ++ )
  10. {
  11. int start = p * range + from ;
  12. int end = ( p == numProcs - 1 ) ?
  13. рд╕реЗ : рдкреНрд░рд╛рд░рдВрдн + рд╕реАрдорд╛ ;
  14. рдзрд╛рдЧреЗред рдЬреЛрдбрд╝реЗрдВ ( рдирдпрд╛ рд╕реВрддреНрд░ ) ( ) => {
  15. for ( int i = start ; i < end ; i ++ ) рдмреЙрдбреА ( i ) ;
  16. } ) ) ;
  17. }
  18. foreach ( рдереНрд░реЗрдб рдореЗрдВ рдереНрд░реЗрдб ) рдереНрд░реЗрдбред рдкреНрд░рд╛рд░рдВрдн ( ) ;
  19. foreach ( рдереНрд░реЗрдб рдореЗрдВ рдереНрд░реЗрдб ) рдереНрд░реЗрдбред рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрдВ ( ) ;
  20. }




рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рд╣рд░ рдмрд╛рд░ рдирдП рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг / рдкреВрд░реНрдгрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдкрд░ 1M рдореЗрдореЛрд░реА рд░рдЦрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕ рдкрд░ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реЛ)ред



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



рд╕реНрдереИрддрд┐рдХ Iteration рд╡рд┐рддрд░рдг


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

  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп ParallelFor ( int рд╕реЗ, int рд╕реЗ, рдХреНрд░рд┐рдпрд╛ < int > рд╢рд░реАрд░ )
  2. {
  3. int size = to - рд╕реЗ ;
  4. int numProcs = рдкрд░реНрдпрд╛рд╡рд░рдгред ProcessorCount;
  5. int range = size / numProcs ;
  6. int рд╢реЗрд╖ = numProcs ;
  7. // рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ, рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  8. ( ManualResetEvent mre = new ManualResetEvent ( рдЧрд▓рдд ) ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  9. {
  10. // рд╕рднреА рдХрд╛рд░реНрдп рдмрдирд╛рдПрдВ
  11. ( int p = 0 ; p < numProcs ; p ++ )
  12. {
  13. int start = p * range + from ;
  14. int end = ( p == numProcs - 1 ) ? рд╕реЗ : рдкреНрд░рд╛рд░рдВрдн + рд╕реАрдорд╛ ;
  15. ThreadPoolред QueueUserWorkItem ( рдкреНрд░рддрд┐рдирд┐рдзрд┐ {
  16. for ( int i = start ; рдореИрдВ < рдЕрдВрдд ; рдореИрдВ ++ )
  17. рд╢рд░реАрд░ ( i ) ;
  18. / / рдЕрдЧрд░ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
  19. рдЕрдЧрд░ ( рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡реГрджреНрдзрд┐ ( рд╢реЗрд╖ рд╢реЗрд╖ ) == 0 )
  20. MREред рд╕реЗрдЯ ( ) ;
  21. } ;
  22. }
  23. // рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ
  24. MREред WaitOne ( ) ;
  25. }
  26. }


рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддреНрдпрдзрд┐рдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдореБрдХреНрдд рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рдЗрд╕ рдЪрдХреНрд░ рдХреЗ рд╕рдмрд╕реЗ рддреЗрдЬреА рд╕реЗ рд╕рдВрднрд╡ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ?



рдпрджрд┐ рд╕рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕рдордп рдореЗрдВ рдЫреЛрдЯреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рдВрдЧрд╛ рд╣реИрдВ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╖реНрдЯрддрдо рдХреЗ рдХрд░реАрдм рд╣реИред



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



рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдиреНрдпреВрдирддрдо рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдордп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

рдЧрддрд┐рд╢реАрд▓ Iteration рд╡рд┐рддрд░рдг


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



рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп ParallelFor ( int рд╕реЗ, int рд╕реЗ, рдХреНрд░рд┐рдпрд╛ < int > рд╢рд░реАрд░ )
  2. {
  3. int numProcs = рдкрд░реНрдпрд╛рд╡рд░рдгред ProcessorCount;
  4. // рд╢реЗрд╖ рд╕рдВрдЦреНрдпрд╛
  5. int рдмрдЪреЗ рд╣реБрдП рдХрд╛рдо рдХреЗ рд▓рд┐рдП = numProcs ;
  6. int nextIteration = from ;
  7. ( ManualResetEvent mre = new ManualResetEvent ( рдЧрд▓рдд ) ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  8. {
  9. // рдХрд╛рд░реНрдп рдмрдирд╛рдПрдВ
  10. ( int p = 0 ; p < numProcs ; p ++ )
  11. {
  12. ThreadPoolред QueueUserWorkItem ( рдкреНрд░рддрд┐рдирд┐рдзрд┐)
  13. {
  14. рдЗрдВрдЯ рдЗрдВрдбреЗрдХреНрд╕ ;
  15. // рдкреНрд░рддрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  16. рдЬрдмрдХрд┐ ( ( рдЗрдВрдбреЗрдХреНрд╕ = рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡реГрджреНрдзрд┐ ( рд░реЗрдл рдиреЗрдХреН рдЯрд░реЗрд╢рди ) - 1 ) < )
  17. {
  18. рд╢рд░реАрд░ ( рд╕реВрдЪрдХрд╛рдВрдХ ) ;
  19. }
  20. рдЕрдЧрд░ ( рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЧрд┐рд░рд╛рд╡рдЯ ( рд╢реЗрд╖ рд╢реЗрд╖ рджреЗрдЦреЗрдВ ) == 0 )
  21. MREред рд╕реЗрдЯ ( ) ;
  22. } ;
  23. }
  24. // рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
  25. MREред WaitOne ( ) ;
  26. }
  27. }




рдпрд╣ рдХреЛрдб рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рд▓рдВрдмреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреЗрдЬрд╝ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВред



рд╕рдВрддреБрд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐, рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрдХреНрд░ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдереНрд░реЗрдбреНрд╕ рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реНрдереИрддрд┐рдХ рдЕрд▓рдЧрд╛рд╡ рдХреА рдПрдХ рд░рдгрдиреАрддрд┐ рд▓рд╛рднрдкреНрд░рдж рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрддреБрд▓рд┐рдд рд░рдгрдиреАрддрд┐ рд╕рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред



рдпрд╣рд╛рдБ рдЗрд╕рдХреЗ рдХреЛрдб рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ "рднрд╛рдЧ" рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рд╕реЗ рдХреБрдЫ рдЕрдзрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рддрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдоред



  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп ParallelFor ( int рд╕реЗ, int рд╕реЗ, рдХреНрд░рд┐рдпрд╛ < int > рд╢рд░реАрд░ )
  2. {
  3. int numProcs = рдкрд░реНрдпрд╛рд╡рд░рдгред ProcessorCount;
  4. int рдмрдЪреЗ рд╣реБрдП рдХрд╛рдо рдХреЗ рд▓рд┐рдП = numProcs ;
  5. int nextIteration = from ;
  6. // рдбреЗрдЯрд╛ рдХреЗ "рд╣рд┐рд╕реНрд╕реЗ" рдХрд╛ рдЖрдХрд╛рд░
  7. const int рдмреИрдЪрд╕рд╛рдЗрдЬрд╝ = 3 ;
  8. ( ManualResetEvent mre = new ManualResetEvent ( рдЧрд▓рдд ) ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  9. {
  10. ( int p = 0 ; p < numProcs ; p ++ )
  11. {
  12. ThreadPoolред QueueUserWorkItem ( рдкреНрд░рддрд┐рдирд┐рдзрд┐ {
  13. рдЗрдВрдЯ рдЗрдВрдбреЗрдХреНрд╕ ;
  14. рдЬрдмрдХрд┐ ( ( рдЗрдВрдбреЗрдХреНрд╕ = рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдРрдб ( рд░реЗрдл рдиреЗрдХреНрд╕реНрдЯрдЗрдВрдЯрд░реЗрд╢рди, рдмреИрдЪрд╕рд╛рдЗрдЬрд╝ ) - рдмреИрдЪрд╕рд╛рдЗрдЬрд╝ ) < рд╕реЗ )
  15. {
  16. int end = index + batchSize ;
  17. рдЕрдЧрд░ ( рдЕрдВрдд > = )
  18. рдЕрдВрдд = рдХреЛ ;
  19. for ( int i = index ; рдореИрдВ < рдЕрдВрдд ; i ++ )
  20. рд╢рд░реАрд░ ( i ) ;
  21. }
  22. рдЕрдЧрд░ ( рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЧрд┐рд░рд╛рд╡рдЯ ( рд╢реЗрд╖ рд╢реЗрд╖ рджреЗрдЦреЗрдВ ) == 0 )
  23. MREред рд╕реЗрдЯ ( ) ;
  24. } ;
  25. }
  26. MREред WaitOne ( ) ;
  27. }
  28. }




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



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


рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдмрдбрд╝реЗ "рд╕рд░реНрд╡рд┐рдВрдЧреНрд╕" рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ .NET .NET рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реВрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред



PS рдпрд╣ рд▓реЗрдЦ " рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдСрдлрд╝ рд▓реЛрдХрд▓ рдкреНрд░реЛрдЧреНрд░реЗрд╕рд┐рдВрдЧ: рдЕрдВрдбрд░рдЧреНрд░рд╛рдЙрдВрдбрд┐рдВрдЧ рдПрдВрдб рдЕрдкреНрд▓рд╛рдИрд┐рдВрдЧ рдкреИрд▓реЗрдЯреЗрд▓ рдкреИрдЯрд░рдПрдирдПрд╕ рд╡рд┐рдж рдж рдиреЗрдЯ рдлреНрд░реИрдорд╡рд░реНрдХ 4 рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реА " рдкреБрд╕реНрддрдХ рдХреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



______________________

рдкрд╛рда рдХреЛ Blog Editor рдореЗрдВ ┬й SoftCoder.ru рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ




UPD: рджреВрд╕рд░рд╛ рднрд╛рдЧ - рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ: habrahabr.ru/blogs/net/104103



All Articles