рдЗрдВрдЯреЗрд▓ Cilk рдкреНрд▓рд╕ рдореЗрдВ рдмрд╛рддрдЪреАрдд

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

рдЗрд╕ рддрд░рд╣, рдЖрдк рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдиреАрдЪреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЧрдгрд┐рддреАрдп рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ - Intel Cilk Plus рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЧрд░реНрдорд┐рдпреЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рджрд┐рдиреЛрдВ рдореЗрдВ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реЛрдВ рдФрд░ C ++ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ habrakat рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред



Monoids рдФрд░ homomorphism


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

рдПрдХ рдореЛрдиреЙрдЗрдб рдПрдХ рдЯреНрд░рд┐рдкрд▓ ( рдПрдо , oid, рдИ ) рд╣реИ, рдЬрд╣рд╛рдВ рдПрдо рдПрдХ рдиреЙрдирдорд┐рдкреНрдЯ рд╕реЗрдЯ рд╣реИ, тЛЕ рд╕реЗрдЯ рдПрдо рдкрд░ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рд╛рд╣рдЪрд░реНрдп рд╕рдВрдЪрд╛рд▓рди рд╣реИ, рдИ рдСрдкрд░реЗрд╢рди рдПрдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕реЗрдЯ рдПрдо рдХрд╛ рдПрдХ рддрдЯрд╕реНрде рддрддреНрд╡ рд╣реИред

рдЪреВрдВрдХрд┐ рдСрдкрд░реЗрд╢рди any рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА x , y рдФрд░ z рдХреЗ рд▓рд┐рдП M рд╕реЗ рд╣реИред рдпрд╣ рд╕рддреНрдп рд╣реИ рдХрд┐ x тЛЕ ( y тЛЕ z ) = ( x ) y ), z рд╣реИ , рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ x 1 тЛЕ x 2 computing рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо ... тЛЕ x n рдХреЛрд╖реНрдардХ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХреЛрд╖реНрдардХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдп (рдФрд░ рд╕рд╛рде рд╣реА рдмрд╛рдж рдХреЗ рд╕рднреА рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдп) рдХрд╛ рдкреНрд░рдорд╛рдг рдХреБрдЫ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрдЪреНрдЪ рдмреАрдЬрдЧрдгрд┐рдд рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЦреБрдж рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреВрд▓ рдХреА рдЫрдареА рдХрдХреНрд╖рд╛ рд╕реЗ, рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рд╕реЗрдЯ ( Z , +, 0) рдПрдХ рдореЛрдиреЙрдЗрдб рд╣реИред рдПрдХ рдореЛрдиреЙрдЗрдб рдХрд╛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реВрдЪреА рдореЛрдиреЙрдЗрдб рд╣реИред рдЕрд░реНрдерд╛рддреН, рдПрдХреНрд╕ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕реЗрдЯ рд╣реЛрдиреЗ рджреЗрдВ, рд╣рдо рдПрдХреНрд╕ by рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдПрдХреНрд╕ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рдкрд░рд┐рдорд┐рдд рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЦрд╛рд▓реА рдХреНрд░рдо рд╕рд╣рд┐рдд []], + + рджреНрд╡рд╛рд░рд╛ рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдШрдЯрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЯреНрд░рд┐рдкрд▓ ( рдПрдХреНрд╕ ++, ++, []) рдПрдХ рдореЛрдиреЙрдпрдб рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕рдорд░реВрдкрддрд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Let ( M , ( M , e M ) рдФрд░ ( N , тЛЕ N , e N ) рджреЛ рдордирдорд╛рдиреЗ рдореЛрдиреЙрдпрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдлрд╝рдВрдХреНрд╢рди h : M тЖТ N рдХреЛ рдПрдХ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ h ( x ) M y ) = h ( x )) N h ( y ) рд╕реЗ M рдФрд░ y рд╕реЗ рдХрд┐рд╕реА рднреА x рдФрд░ y рдХреЗ рд▓рд┐рдП ( e M ) = e Nред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рд╢рд┐рдерд┐рд▓ рд░реВрдк рд╕реЗ рдмреЛрд▓рдирд╛, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рдорд░реВрдкрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░рдг рдПрдХ рд╕рдорд░реВрдкрддрд╛рд╡рд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдХреВрд▓ рдФрд░ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЧрдгрд┐рдд рд╕реЗ рд╣рд░ рдХреЛрдИ рд╣реЛрдорд░реЙрдлрд┐рдЬреНрдо рдХреЗ рдХрдИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдЬрд╛рдирддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рдж рд▓рдШреБрдЧрдгрдХ рд▓рдШреБрдЧрдгрдХ рдХреЗ рдпреЛрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ , ln ( xy ) = ln x + ln y , рдФрд░ рд╣рдорд╛рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдореИрдк ln рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдореЛрдиреЛрдб рд╕реЗ рдПрдХ рд╕рдорд░реВрдкрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЧреБрдгрд╛ ( R + , тЛЕ, 1) рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЧреБрдгрд╛ рдореЗрдВ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ( рдЖрд░ , +, 0)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдЙрддреНрдкрд╛рдж рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдХ рдЗрди рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдХреЛрдВ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ , det ( AB ) = det A B det B , рдпрд╛рдиреА, mapping det рдПрдХ рдЧреБрдгрд╛ (mat n ( R ),,, I ) рдХреЗ рдореЛрдиреЙрдЗрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреНрд╡рд╛рдпрд░ рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рдореЛрдиреЛрдб рд╕реЗ рдПрдХ рд╕рдорд░реВрдкрддрд╛ рд╣реИред рдЧреБрдгрди рд╕рдВрдЦреНрдпрд╛ ( R , тЛЕ, 1)ред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЕрдм рд╣рдо рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЛрдиреЙрдЗрдб ( X ++, ++, []) рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ monoid ( M , (, e ) рдХреА рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдореНрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧреА рдЧреБрдг рд╣реИрдВред [ X 1 , x 2 , ..., x n ] рдХреЛ рдПрдХ рдордирдорд╛рдиреА рд╕реВрдЪреА рд╣реЛрдиреЗ рджреЗрдВ, рдлрд┐рд░ h ([ x 1 , x 2 , ..., x n ]) = h ([ x 1 ] ++ [ x 2 ] ++ ... + + [ x n ]) = h ([ x 1 ]) [ h ([ x 2 ]) тЛЕ ... x h ([ x n ])ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдИ рднреА рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред рддреЛ, f : X тЖТ M рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреИрд╕реЗ рдХрд┐ f ( x ) = h ([ x ]), рддреЛ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реВрдЪреА homomorphism h рдХреЛ рдлреЙрд░реНрдо рд╣реЛрдо (тЛЕ, f , e ) рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЕрдм рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгред
  1. рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрдкрд╛рдж, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА homomorphisms hom (+, id, 0), рдШрд░ (тЛЕ, id, 1), рдШрд░ (рдЕрдзрд┐рдХрддрдо, рдЖрдИрдбреА, тИТтИЮ) рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдШрд░ (рдиреНрдпреВрдирддрдо, рдЖрдИрдбреА, +,), рдХреНрд░рдорд╢рдГред рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдореНрд╕, рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдИрдбреА рдХрд╛ рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИ, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ (), рдИ)ред
  2. рд▓рдВрдмрд╛рдИ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реЛрдо (+, рдПрдХ, 0) рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ ( x ) = 1ред
  3. рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдПрдл рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рднреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╣реЛрдо (++, рдЬреА , []), рдЬрд╣рд╛рдВ рдЬреА ( рдПрдХреНрд╕ ) = [ рдПрдл ( рдПрдХреНрд╕ )]ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ ( рдПрдл ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рджреЛ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд╕реВрдЪреА ( x ) = [ x ] рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рд╕рдорд░реВрдкрддрд╛ рдЧреГрд╣ (рдорд░реНрдЬ, рд╕реВрдЪреА, []) рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪреА рд╕рдорд░реВрдкрддрд╛ рд╣реЛрдЧреАред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджреНрдпрдкрд┐ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рд╕реВрдЪреА рдЧреГрд╣рд╡рд┐рдЬреНрдЮрд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реВрдЪреА рдХрд╛ рдорддрд▓рдм рдордХреНрдЦреА рдкрд░ рдЙрддреНрдкрдиреНрди рд╕рд░рдгрд┐рдпреЛрдВ, рддрд╛рд░реЛрдВ рдпрд╛ рдЕрдиреБрдХреНрд░рдореЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм, рд╣рдо рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рдореЗрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддреАрди рдЙрдкрдпреЛрдЧреА рдмрдпрд╛рди рджреЗрддреЗ рд╣реИрдВред

рдкрд╣рд▓рд╛ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рдореЗрдпред рдХрд┐рд╕реА рднреА рд╕реВрдЪреА homomorphism рдХреЛ рдПрдХ рдХрдВрдкреЛрдЬрд┐рд╢рди рд╣реЛрдо ( f , f , e ) = рдХрдо ( f , e ) (рдореИрдк ( f ) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдпрд╣ рдЗрд╕ рд╕рд░рд▓ рдЕрд╡рд▓реЛрдХрди рдкрд░ рд╣реИ рдХрд┐ MapReduce рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред MapReduce рдХрд╛ рдПрдХ рд╕рд░рд▓ рдкрд░рд┐рдЪрдп MapReduce habrastas рдпрд╛ рдореЗрдореЛрд░реА рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЧрдгрдирд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВ zaumi рдХреЗ рдмрд┐рдирд╛ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛) рдФрд░ MapReduce: рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрджрд╛рд╣рд░рдг, рд╣рдо zaumi рдХреЗ рдмрд┐рдирд╛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ ред

рдЖрдЬреНрдЮрд╛ рджреЗрдВ [ x 1 , x 2 , ..., x n ] рдПрдХ рдордирдорд╛рдиреА рд╕реВрдЪреА, рдлрд╝рдВрдХреНрд╢рди рдлреЛрд▓реНрдб (, L , e L ) ([ x 1 , x 2 , ..., x n ]) = (... (e L) тЛЕ L x 1 ) x L x 2 ) тЛЕ L ... n L x n ), рдФрд░ рджрд╛рдИрдВ рдУрд░ рдлрдВрдХреНрд╢рди рдлреЛрд▓реНрдбрд░ (the R , e R ) ([ x 1 , x 2 , ..., x n ]) = ( x 1) рд╣реИ тЛЕ R ( x 2 ... R ... 2 R ( x n R R e R R ...))ред рджреВрд╕рд░рд╛ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рдореЗрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрддрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд╕рдорд░реВрдкрддрд╛ рдкреНрд░рдореЗрдп ред рдХрд┐рд╕реА рднреА рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХрдирд╡рд▓реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣реЛрдо (, f , e ) = foldl (тЛЕ L , e ) = foldr (, R , e ), рдЬрд╣рд╛рдВ x тЛЕ L y = x ph f ( y ), x y R y = f ( x ) x y ред

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

рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╕реВрдЪреА homomorphism h = hom ( f , f , e) рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЧрдгрдирд╛ рдХреА рд╡рд┐рдзрд┐ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо h ( x ++ y ) = h ( x ), h ( y ) рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рдорд╛рдирд╛рдВрддрд░, рдЧрдгрдирд╛ h ( x ) рдФрд░ h ( y ), рдФрд░ рддрдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА h ( x ++ y ) рдХреЗ рдЕрдВрддрд┐рдо рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА x рдФрд░ y рдХреЛ рднреА рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрдирдХреЗ рд▓рд┐рдП рдПрдЪ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ рдпрд╣ рд╡рд┐рднрд╛рдЬрди рдФрд░ рд░рдгрдиреАрддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдСрдкрд░реЗрд╢рди тЛЕ рдХреА рдЧрдгрдирд╛ рдирд┐рд░рдВрддрд░ рд╕рдордп C рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ , рдФрд░ рд╕реВрдЪреА x рдореЗрдВ n рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред рдмрд╛рдПрдВ рдХрдирд╡рд▓реНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрд╢рди рдХреА рдЧрдгрдирд╛ рдареАрдХ рд╕реЗ n рдмрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрд░реНрдерд╛рдд, Cn рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ p рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ, рддреЛ рд╣рдо рд╕реВрдЪреА x рдХреЛ p рдмрд░рд╛рдмрд░ рднрд╛рдЧреЛрдВ x i рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп x / p рдХреЗ рд▓рд┐рдП h рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ x i рдХреЗ рд▓рд┐рдП рдмрд╛рдПрдВ рдХрдирд╡рд▓реНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ C рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ 2 p рд╣рдо рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреБрд▓ рд╕рдордп C ( n / p + log 2 p ) рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рддреАрд╕рд░реЗ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рдореЗрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИред

рддреАрд╕рд░рд╛ рд╕рдорд░реВрдкрддрд╛ рдкреНрд░рдореЗрдпред рдпрджрд┐ рдПрдХ рд╕реВрдЪреА рдореЛрдиреЙрдЗрдб рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЛрдиреЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдПрдВ рдлреЛрд▓реНрдб (, L , e ) рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рд╕рд╣реА рдХрдирд╡рд▓реНрд╢рди рдлреЛрд▓реНрдбрд░ (, R , e ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рдпрд╣ рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИред

рдЗрди рддреАрди рдкреНрд░рдореЗрдпреЛрдВ рдХреЗ рд╕рд╛рдХреНрд╖реНрдп рдЬреЗрд░реЗрдореА рдЧрд┐рдмрдиреНрд╕ рдХреЗ рд▓реЗрдЦ рдж рдерд░реНрдб рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рдореЗрдп рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо Intel Cilk Plus рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдЗрдВрдЯреЗрд▓ Cilk рдкреНрд▓рд╕ рдореЗрдВ рдмрд╛рддрдЪреАрдд


Intel Cilk Plus рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП C ++ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  1. рдХреАрд╡рд░реНрдб cilk_spawn рдФрд░ cilk_sync (рдкрд╣рд▓рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ),
  2. cilk_for рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cilk_for рдХреАрд╡рд░реНрдб,
  3. рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдкрд░реЛрдмреЙрдЬреЗрдХреНрдЯреНрд╕
  4. рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ c[:] = a[:] + b[:] ред

рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдЕрдВрдХ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗред Intel Cilk Plus рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА http://software.intel.com/en-us/articles/intel-cilk-plus/ рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рддреЛ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
 int sum = 0; for (int i = 0; i < n; ++i) { sum += a[i]; } std::cout << sum << std::endl; 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдмрд╛рдПрдВ рдХрдирд╡рд▓реНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред Intel Cilk Plus рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
  1. рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ cilk/reducer_opadd.h рдФрд░ cilk/cilk.h рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
  2. рдкреНрд░рдХрд╛рд░ reducer_opadd<int> ,
  3. cilk_for for рдкрд░рд┐рд╡рд░реНрддрди,
  4. рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП get_value() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 #include <cilk/cilk.h> #include <cilk/reducer_opadd.h> ... cilk::reducer_opadd<int> sum; cilk_for (int i = 0; i < n; ++i) { sum += a[i]; } std::cout << sum.get_value() << std::endl; 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛ред рд╕рдВрдХрд▓рдХ cilk_for рдЪрдХреНрд░ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рдгрдиреАрддрд┐ рдХреЛ cilk_for рд╣реИ; рдпрд╣ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
 void run_loop(first, last) { if ((last - first) < grainsize) { for (int i = first; i < last; ++i) { LOOP_BODY; } } else { int mid = (last - first) / 2; cilk_spawn run_loop(first, mid); run_loop(mid, last); } } 

рдФрд░ рдЪреВрдВрдХрд┐ рдпреЛрдЧ рдЪрд░ рдПрдХ reducer рд╣реИ, рдзрд╛рдЧреЗ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрдЪреНрдЪрд╛ рдкреБрд░рд╛рдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдорд┐рд▓реЗрдЧрд╛, рджреЛрдиреЛрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

reducer_opadd рдЕрддрд┐рд░рд┐рдХреНрдд reducer_opadd Intel Cilk Plus Reducers рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: reducer_list_append , reducer_list_prepend , reducer_min , reducer_max , reducer_min_index , reducer_max_index , reducer_opor , reducer_opand , reducer_ostream рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Reducer рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ Monoid рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ Monoid рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ рдореЛрдиреЛрдЗрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдпрд╣ cilk::monoid_base<T> рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ cilk::monoid_base<T> рд╡рд░реНрдЧ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ reduce() рдФрд░, рд╕рдВрднрд╡рддрдГ, identity() ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, reducer рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдореЗрдВ cilk::reducer<Monoid> imp_ рдФрд░ рдЗрд╕ рд╣рд╛рдЗрдкрд░реЛрдмреЙрдЬрд╝ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдПрдХ рд╕рд░рдгреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЧреБрдгрдирдлрд▓ рдЬреНрдЮрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ reducer рд▓рд┐рдЦреЗрдВрдЧреЗред
 #include <cilk/reducer.h> #include <cilk/cilk.h> #include <iostream> class reducer_prod { public: struct Monoid: cilk::monoid_base<double> { void reduce(double *left, double *right) const { *left *= *right; } void identity(double* p) const { new ((void*) p) double(1.0); } }; reducer_prod(): imp_(1.0) { } reducer_prod &operator*=(const double &v) { imp_.view() *= v; return *this; } double get_value() const { return imp_.view(); } private: cilk::reducer<Monoid> imp_; }; 


 reducer_prod prod; cilk_for (int i = 0; i < n; ++i) { prod *= a[i]; } std::cout << prod.get_value() << std::endl; 

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


All Articles