Microsoft рдХреЗ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ,
Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдореЗрдВ рд╕рдорд╡рд░реНрддреА рдФрд░ рд╕рдордиреНрд╡рдп рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдзреНрд╡рдирд┐ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп (рдФрд░ рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ) рд░реЛрдмреЛрдЯ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдирд┐рдореНрди рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдХреНрдЯрд░ рдмреА (1 ├Ч n рддрддреНрд╡реЛрдВ) рджреНрд╡рд╛рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ A (m ├Ч n рддрддреНрд╡реЛрдВ) рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдКрдВрдЧрд╛:

ред рд╡реЗрдХреНрдЯрд░ C (m ├Ч 1 рддрддреНрд╡реЛрдВ) рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ ith рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдЙрд╕рдХреЗ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕реВрддреНрд░реЛрдВ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
1. Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп
Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдореЗрдВ рдХрдИ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рд╕рдорд╡рд░реНрддреА рдФрд░ рд╕рдордиреНрд╡рдп рд░рдирдЯрд╛рдЗрдо (CCR) рдкреБрд╕реНрддрдХрд╛рд▓рдп - рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдВрджреЗрд╢ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ;
- рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реЗрд╡рд╛рдПрдБ (DSS) - рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд░реЛрдмреЛрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдк-рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрд╛рддрдЪреАрдд рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ;
- рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕рд┐рдореБрд▓реЗрд╢рди рдкрд░реНрдпрд╛рд╡рд░рдг (VSE) - рдПрдХ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░реНрдпрд╛рд╡рд░рдг рдЬреЛ рдЖрдкрдХреЛ рд░реЛрдмреЛрдЯ рдореЙрдбрд▓, рдкрд░реАрдХреНрд╖рдг рд░реЛрдмреЛрдЯ рдирд┐рдпрдВрддреНрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- рд╡рд┐рдЬрд╝реБрдЕрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (VPL) рдПрдХ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░реЛрдмреЛрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред
Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдХреБрдВрдЬреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ:
- рд╕реЗрд╡рд╛ - Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди;
- рд╕рдВрджреЗрд╢ - рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг;
- port - FIFO рдкреНрд░рдХрд╛рд░ (рдкрд╣рд▓реЗ-рдкрд╣рд▓реЗ-рдкрд╣рд▓реЗ) рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдХрддрд╛рд░, рд╕рдВрджреЗрд╢ рдмрдВрджрд░рдЧрд╛рд╣ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреЛрд░реНрдЯ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреЛрд░реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛:
Port<int> p = new Port<int>();
рдкреЛрд░реНрдЯ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛:
p.Post(1);
- рд░рд┐рд╕реАрд╡рд░ - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рддреА рд╣реИ:
- рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреЛрд░реНрдЯ;
- рдПрдХ рд╡рд┐рдзрд┐ (рдпрд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ) рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ);
- рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐ рдЬреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред
рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╡рд┐рд╡рд░рдг:
Arbiter.Receive(<_>, <>, <_>); : Activate( Arbiter.Receive(false, intPort, delegate(int n) { Console.WriteLine(" : " + n.ToString()); } ) );
рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЗрдВрдЯрдкреЛрд░реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдЖрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЕрд╕реНрдерд╛рдпреА рдФрд░ рд╕реНрдерд╛рдпреА (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдЕрд╕реНрдерд╛рдпреА рд╣реИ)ред рд╕рдВрджреЗрд╢ (рдпрд╛ рдХрдИ рд╕рдВрджреЗрд╢реЛрдВ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЯрд╛рд╕реНрдХ рд▓реЙрдиреНрдЪ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбрд┐рд╕реНрдкреИрдЪрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдпрдг рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рд╕рдХреНрд░рд┐рдпрдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рдмрдВрджрд░рдЧрд╛рд╣ рджреНрд╡рд╛рд░рд╛ рд░рд╕реАрдж рд╣реЛ рд╕рдХрддреА рд╣реИ), рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛рд░реНрдп рдХреЛ рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рдПрдХ рдереНрд░реЗрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреВрд▓ рдореЗрдВ рджреЛ рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рд╡рд┐рд╡рд░рдг:
Dispatcher d = new Dispatcher(2, "MyPool");
рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрддрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВ:
DispatcherQueue dq = new DispatcherQueue("MyQueue", d);
2. рдПрдХ рд╕реЗрд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛
рд╕рд░реНрд╡рд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ Microsoft рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдЯреИрдм рдкрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЪрд┐рддреНрд░ 1 рджреЗрдЦреЗрдВ)ред

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

рдЕрдВрдЬреАрд░ред 2. рд╕реЗрд╡рд╛ рд╕реЗрдЯрдЕрдк
рдПрдХ рд╕реЗрд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ:
- ParallelProcessing.cs - рд╕реЗрд╡рд╛ рдХрд╛ рдореВрд▓;
- ParallelProcessingTypes.manifest.xml - рд╕реЗрд╡рд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DSS рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрдЯрди;
- ParallelProcessingTypes.cs - рдореЗрдВ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред
рд╕реЗрд╡рд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, dll рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдПрдХ рдкреНрд░рдХрдЯрди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдореИрдирд┐рдлреЗрд╕реНрдЯ - рдПрдХреНрд╕рдПрдордПрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╕реЗрд╡рд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреА рд╣реИред рд╕реЗрд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реЗрд╡рд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рд░реНрдорд┐рдд dll рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ \ bin рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПред
рд╕реЗрд╡рд╛ рдХреЛ dsshost рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдХрдЯ рдФрд░ рдЙрд╕рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
3. рд╕реЗрд╡рд╛ рд╕рдВрд░рдЪрдирд╛
рд╕реЗрд╡рд╛ рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдбреАрдПрд╕ рдиреЛрдб (dsshost.exe) рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдПрдВ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рд╛рд░рдВрдн рд╡рд┐рдзрд┐ рдореЗрдВ рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВ):
protected override void Start() { base.Start();
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддреАрди рдбреАрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ:
- ParallelProcessing.Y2013.M02.dll - рд╕реЗрд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреБрд╕реНрддрдХрд╛рд▓рдп;
- ParallelProcessing.Y2013.M02.proxy.dll рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- ParallelProcessing.Y2013.M02.transform.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред DSS рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдкрдиреЗ рдЖрдк рд▓реЛрдб рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЖрдк рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рди рдХреЗрд╡рд▓ F5 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯ рдореЗрдиреВ \ MRDS рдореЗрдВ "DSS рдХрдорд╛рдВрдб рдкреНрд░реЙрдореНрдкреНрдЯ" рдЪреБрдиреЗрдВред рдирддреАрдЬрддрди, рд╢реЗрд▓ рд╡рд┐рдВрдбреЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА, рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
dsshost /p:50000 /t:50001 /m:"< >"
4. рдЕрдиреБрдорд╛рдирд┐рдд рдиреЗрддреГрддреНрд╡ рд╕рдордп
рд╕реНрдЯреЙрдкрд╡реЙрдЪ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
Stopwatch sWatch = new Stopwatch(); sWatch.Start(); < > sWatch.Stop(); Console.WriteLine(sWatch.ElapsedMilliseconds.ToString());
5. рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
5.1ред рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛
рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдП, рд╡реИрдХреНрдЯрд░ рдмреА рдФрд░ рд╕реА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЪрд░:
int[,] A; int[] B; int[] C; int m; int n;
TestFunction () рд╡рд┐рдзрд┐ рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ рдореЗрдВ, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдЧрдгрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЖрд░рдВрднрд┐рдХ рд╣реИрдВ:
nc = 2;
рдореИрдЯреНрд░рд┐рдХреНрд╕ A рдФрд░ рд╡реЗрдХреНрдЯрд░ B рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ:
Random r = new Random(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) A[i, j] = r.Next(100); } for (int j = 0; j < n; j++) B[j] = r.Next(100);
5.2ред рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЧреБрдгрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
Stopwatch sWatch = new Stopwatch(); sWatch.Start(); for (int i = 0; i < m; i++) { C[i] = 0; for (int j = 0; j < n; j++) C[i] += A[i, j] * B[j]; } sWatch.Stop(); Console.WriteLine(" = {0} .", sWatch.ElapsedMilliseconds.ToString());
5.3ред рд╕рдорд╛рдирд╛рдВрддрд░ рдЧреБрдгрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╡рд┐рдзрд┐ рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдБ рдЪрд▓рд╛рдХрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднрд╛рдЧ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, InputData рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
public class InputData { public int start;
рдХрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрдн / рд╕реНрдЯреЙрдк рдлрд╝реАрд▓реНрдб рд╡реЗрдХреНрдЯрд░ C рдХреЗ рдкреНрд░рд╛рд░рдВрдн / рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рдЧрдгрдирд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред
ParallelMul рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЕрдЧрд▓рд╛, рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ:
рдПрдХ рдбрд┐рд╕реНрдкреИрдЪрд░ рджреЛ рдзрд╛рдЧреЛрдВ рдХреЗ рдкреВрд▓ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d);
рдЙрд╕ рдкреЛрд░реНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧрдгрдирд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓ () рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ:
Port<int> p = new Port<int>();
Arbiter.Activate рд╡рд┐рдзрд┐ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрддрд╛рд░ рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп (рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг) рдбрд╛рд▓рддрд╛ рд╣реИ:
for (int i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul));
Arbiter.Activate рд╡рд┐рдзрд┐ рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрддрд╛рд░ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛, рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╣реИред
Arbiter.MultipleItemReceive рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдХрд╛рд░реНрдп (рд░рд┐рд╕реАрд╡рд░) рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреЛрд░реНрдЯ рдкреА рдкрд░ рджреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ:
Arbiter.Activate(Environment.TaskQueue, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { Console.WriteLine(" "); }));
рдЧрдгрдирд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╕реАрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреЛрд░реНрдЯ рдкреА рдкрд░ рджреЛ рд╕рдВрджреЗрд╢ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ, рдЖрдк рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореВрд▓ () рд╡рд┐рдзрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЛ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рддреА рд╣реИ:
void Mul(InputData data, Port<int> resp) { Stopwatch sWatch = new Stopwatch(); sWatch.Start(); for (int i = data.start; i < data.stop; i++) { C[i] = 0; for (int j = 0; j < n; j++) C[i] += A[i, j] * B[j]; } sWatch.Stop(); Console.WriteLine(" тДЦ {0}: = {1} .", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); resp.Post(1); }
рдореВрд▓ () рд╡рд┐рдзрд┐ рдХреЗ рджреЛ рдорд╛рдкрджрдВрдб рд╣реИрдВ:
1) рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рддрддреНрд╡ рдХрд╛ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
2) рдкреВрд░реНрдгрддрд╛ рдХрд╛ рдмрдВрджрд░рдЧрд╛рд╣, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧрдгрдирд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореВрд▓ рд╡рд┐рдзрд┐ рдкреЛрд░реНрдЯ p рдкрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рднреЗрдЬрддрд╛ рд╣реИ (рднреЗрдЬрд╛ рдЧрдпрд╛ рдореВрд▓реНрдп рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред
рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдВрдЬреАрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред 3ред

рдЕрдВрдЬреАрд░ред 3. рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо
рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ