рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╕рд░рдгреА рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрди рднрд╛рдЧреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдореВрд▓ рдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред рдЗрд╕ рдЧрдгрдирд╛ рдХреА рд░рдгрдиреАрддрд┐ рдХреЛ "
рдлреВрдЯ рдбрд╛рд▓реЛ рдФрд░ рдЬреАрддреЛ " рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣, рдЖрдк рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдиреАрдЪреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЧрдгрд┐рддреАрдп рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ - 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 ) рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдЕрдм рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгред
- рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрдкрд╛рдж, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА homomorphisms hom (+, id, 0), рдШрд░ (тЛЕ, id, 1), рдШрд░ (рдЕрдзрд┐рдХрддрдо, рдЖрдИрдбреА, тИТтИЮ) рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдШрд░ (рдиреНрдпреВрдирддрдо, рдЖрдИрдбреА, +,), рдХреНрд░рдорд╢рдГред рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдореНрд╕, рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдИрдбреА рдХрд╛ рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИ, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ (), рдИ)ред
- рд▓рдВрдмрд╛рдИ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реЛрдо (+, рдПрдХ, 0) рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ ( x ) = 1ред
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдПрдл рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рднреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╣реЛрдо (++, рдЬреА , []), рдЬрд╣рд╛рдВ рдЬреА ( рдПрдХреНрд╕ ) = [ рдПрдл ( рдПрдХреНрд╕ )]ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ ( рдПрдл ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
- рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реВрдЪреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рджреЛ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд╕реВрдЪреА ( 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 ++ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдХреАрд╡рд░реНрдб
cilk_spawn
рдФрд░ cilk_sync
(рдкрд╣рд▓рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), cilk_for
рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cilk_for
рдХреАрд╡рд░реНрдб,- рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдкрд░реЛрдмреЙрдЬреЗрдХреНрдЯреНрд╕
- рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
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 рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
- рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ
cilk/reducer_opadd.h
рдФрд░ cilk/cilk.h
рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ - рдкреНрд░рдХрд╛рд░
reducer_opadd<int>
, cilk_for
for
рдкрд░рд┐рд╡рд░реНрддрди,- рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
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
рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ рдореЛрдиреЛрдЗрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
reduce(T *left, T *right)
рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ *left = *left OP *right
,identity(T *p)
p
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рддрдЯрд╕реНрде рддрддреНрд╡ рдмрдирд╛рддрд╛ рд╣реИ,destroy(T *p)
p
рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рддрд╛ рд╣реИ,allocate(size)
рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рд╛рдЗрдЬрд╝ size
рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдореЗрдореЛрд░реА рдПрд░рд┐рдпрд╛ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,deallocate(p)
p
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдпрд╣
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;