
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ рдореИрдВрдиреЗ
рд▓рд┐рдпреВ рдХрд┐рдХреНрд╕рд┐рди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдЬреНрдЮрд╛рди рдХрдерд╛ рдЙрдкрдиреНрдпрд╛рд╕
"рдж рдереНрд░реА-рдмреЙрдбреА рдкреНрд░реЙрдмреНрд▓рдо" рдкрдврд╝рд╛ред рдЗрд╕рдореЗрдВ, рдХреБрдЫ рдПрд▓рд┐рдпрдВрд╕ рдХреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА - рд╡реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рдХреИрд╕реЗ, рдЙрдирдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде, рдЕрдкрдиреЗ рдШрд░ рдЧреНрд░рд╣ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдорд╛рд░реЗ рд╡рд┐рдкрд░реАрдд, рд╡реЗ рдПрдХ рддреАрди рд╕рд┐рддрд╛рд░рд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд░рд╣рддреЗ рдереЗ, рдФрд░ рдЧреНрд░рд╣ рдкрд░ "рдореМрд╕рдо" рдЕрдкрдиреЗ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рд╕реНрдерд╛рди рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рдерд╛ - рдЧрд░реНрдореА рдХреА рдмрдврд╝рддреА рдЧрд░реНрдореА рд╕реЗред рдФрд░ рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдШрдЯрдирд╛ рдХрд╛ рднреМрддрд┐рдХреА
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛ рдХреЗ рднреМрддрд┐рдХреА рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рджреЛ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдЖрдХрд░реНрд╖рдХ рдмрд▓ рдХреЛ
рдиреНрдпреВрдЯрди рдХреЗ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рд╡реА рдИ рд╕реА рдПрдл ( рд╡реА рдИ рд╕реА рдЖрд░ 1 , рд╡реА рдИ рд╕реА рдЖрд░ 2 ) = - рдЬ реА рдореАрдЯрд░ 1 рдореАрдЯрд░ 2 рдЪ рдЖрд░ рдПрдХ рд╕реА рд╡реА рдИ рд╕реА рдЖрд░ 1 - рд╡реА рдИ рд╕реА рдЖрд░ 2 рд╡реА рдИ рд╕реА рдЖрд░ | 1 - v e c r 2 | 3 ,
рдЬрд╣рд╛рдБ
v e c r 1 , v e c r 2 - рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдкрд┐рдВрдбреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐,
рдПрдо 1 , рдПрдо 2 - рдирд┐рдХрд╛рдпреЛрдВ рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди,
рдЬ реА - рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рд╕реНрдерд┐рд░ред
рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдореЗрдВ
рдП рдПрди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдирд┐рдХрд╛рдп рдмрд╛рдХреА рд╕реЗ рдЖрдХрд░реНрд╖рдг рдмрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧрд╛, рдЬреЛ рд╕рдореАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
\ vec {F} _n = -G \ sum_ {k \ neq n} m_n m_k \ frac {\ vec {r} _n - \ vec {r} _k} {| \ vec [r} _n - \ vec {r } _k | ^ 3} |
рдиреНрдпреВрдЯрди рдХреЗ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
\ vec {a} _n = \ vec {F} _n / m_n = -G \ sum_ {k \ neq n} m_k \ frac {\ vec {r} _n - \ vec {r_ _c} {\ _cc r} _n - \ vec {r} _k | ^ 3}ред
рдЙрд╕ рддреНрд╡рд░рдг рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП рд╕рдордиреНрд╡рдп рдХрд╛ рджреВрд╕рд░реА рдмрд╛рд░ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдирд╛, рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдХреНрд░рдо рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдВрддрд░ рд╕рдореАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
\ frac {\ рдЖрдВрд╢рд┐рдХ ^ 2 \ vec {r} _n} {\ рдЖрдВрд╢рд┐рдХ t ^ 2} = f_n = -G \ sum_ {k \ neq n} m_k \ frac {\ vec {r} _n_ \ vec {r } _k} {| \ vec {r} _n - \ vec {r} _k | ^ 3} |
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛
fn рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
O(N2) рдФрд░ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдмрдврд╝ рдЬрд╛рддреА рд╣реИред
рдЧрдгрд┐рдд
рдЕрдВрддрд░ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдФрд░ рд╕рд░рд▓ рд╡рд┐рдзрд┐
рдИрд▓рд░ рд╡рд┐рдзрд┐ рд╣реИ , рдЬрд┐рд╕реЗ рдлреЙрд░реНрдо рдХреЗ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
fracрдбрд╛рдИdx=f(x,y)ред
рдЕрд╕рддрдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
yi=yiтИТ1+hf(xiтИТ1,yiтИТ1), quadi=1,2,3, dots,m,
рдЬрд╣рд╛рдБ
рдЬ рдПрдХреАрдХрд░рдг рдХрджрдо рд╣реИ, рдФрд░
рдПрдо - рдПрдХреАрдХрд░рдг рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
T рддреЛ рд╣рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
m=T/h рдПрдХреАрдХрд░рдг рдХреЗ рдХрджрдоред рдпрд╣рд╛рдВ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ - рдпрджрд┐
T рдмрдбрд╝реЗ, рддреЛ рд╣рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХреАрдХрд░рдг рдХрджрдо рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдпреВрд▓рд░ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рдкреНрд░рдердо-рдХреНрд░рдо рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ - рдХрдг рд╡реЗрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ:
frac рдЖрдВрд╢рд┐рдХ vecvn рдЖрдВрд╢рд┐рдХt=fn, frac рдЖрдВрд╢рд┐рдХ vecrn рдЖрдВрд╢рд┐рдХt= vecvnред
рд╡рд┐рднреЗрджрдХ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рд╕рдЯреАрдХрддрд╛ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╣реИред рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХреАрдХрд░рдг рдЪрд░рдг рдХреЛ рдХрдо рдХрд░рдХреЗ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдХреЗред рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╢рд╛рд╕реНрддреНрд░реАрдп
рдЪреМрдереЗ рдХреНрд░рдо рд░рди-рдХреБрдЯреНрдЯрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
fn рд╣рд░ рдХрджрдо рдкрд░, рд▓реЗрдХрд┐рди рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдХреНрд░рдо рд╣реИ
O(h4) (рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдпреВрд▓рд░ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдХреНрд░рдо рд╣реИ
O(h) рдФрд░ рдПрдХ рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
fn )ред рд╕рдорд╛рдзрд╛рди рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рднреА рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдлреИрд╕рд▓реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП
рдПрди рдЯреЗрд▓реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдХреЗ рд▓рд┐рдП рд╣реИ
рдПрди=2 , рд▓реЗрдХрд┐рди рдпрд╣ рднреА рддрд░реАрдХреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рд╕реЗ рдЕрднрд┐рдХрд▓рди рд╕рдордп рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреА рд╕реАрдорд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рд╣реИ: рдПрдХреАрдХрд░рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╣рдо
рд╕рдВрд░рдХреНрд╖рдг рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрдгрдирд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рднреА рдмрдврд╝рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рд╕рднреА рдХрдгреЛрдВ рдХреЗ рд╕рдВрд╡реЗрдЧ рдпрд╛ рдХреЛрдгреАрдп рд╕рдВрд╡реЗрдЧ рдХреА рдЧрдгрдирд╛ рд╕реЗ рдХреНрд░рдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛрддреА рд╣реИ
O(N) , рдЬрдмрдХрд┐ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреА рдХреБрд▓ рдКрд░реНрдЬрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ
O(N2)рдХреБрд▓ рдКрд░реНрдЬрд╛ рдХреА рдЧрдгрдирд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреБрд▓ рдКрд░реНрдЬрд╛ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ - рдЧрддрд┐рдЬ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдКрд░реНрдЬрд╛ред рдХрд╛рдЗрдиреЗрдЯрд┐рдХ рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рднреА рдирд┐рдХрд╛рдпреЛрдВ рдХреА рдЧрддрд┐рдЬ рдКрд░реНрдЬрд╛ рдХрд╛ рдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рдКрд░реНрдЬрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реЗрд╖ рдХрдгреЛрдВ рдХреЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдКрд░реНрдЬрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдУ ( рдПрди 2 ) рд╢рд░реНрддреЛрдВред рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рд╢рдмреНрдж рдмрд╣реБрдд рдЕрд▓рдЧ рдХреНрд░рдо рдХреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЛрд╣рд░реЗ-рд╕рдЯреАрдХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рдЗрд╕ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ
рдХреЗ рд▓рд┐рдП
, рдХрд╣рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рд░рд╛рдВрд╢ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рдЕрдВрдЬреАрд░ред 1. рдПрдХ рдЕрдгреНрдбрд╛рдХрд╛рд░ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
рдкреГрдереНрд╡реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЕрдгреНрдбрд╛рдХрд╛рд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЙрдкрдЧреНрд░рд╣ рдХреЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЙрдкрдЧреНрд░рд╣ рдкреГрдереНрд╡реА рдХреЗ рдХрд░реАрдм рдЖрддрд╛ рд╣реИ, рдЙрд╕рдХреА рдЧрддрд┐ рдмрдврд╝рддреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкреГрдереНрд╡реА рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рдШрдЯрддрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрджрдиреБрд╕рд╛рд░, рдХрдХреНрд╖рд╛ рдХреЗ рд╣рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╕рдордп рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреЗ рдЪрд░рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд▓рд╛рд▓ рдФрд░ рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рддрд╛рд▓рд┐рдХрд╛ 1. рдЕрдВрддрд░ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдВрдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рдЬреНрдЮрд╛рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдХрд╛рдпреЛрдВ рдХреА рджреЛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдЯрдХреНрдХрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ
N=512 рдФрд░ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ
рдХреБрд▓ рдКрд░реНрдЬрд╛ ,
рдЧрддрд┐ рдФрд░ рдЙрд╕рдХреЗ
рдХреНрд╖рдг рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдорд╛рдкреЗрдВ (рдЕрдзрд┐рдХрддрдо рд╕рд┐рдореБрд▓реЗрд╢рди рд╕рдордп
TрдЕрдзрд┐рдХрддрдо=2.5 )ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХреАрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЪрд░рдг рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ
fn , рдХреНрд░рдорд╢рдГ, рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрдо рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛, рд╣рдо рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рдиреЗрдВрдЧреЗред

| 
|
рдХ) | рдЦ) |
рдЪрд┐рддреНрд░рд╛ 2. рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдП), рдЧрддрд┐ рдмреА), рд╕рд┐рд╕реНрдЯрдо рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ N=512 рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рдп fn рджреЛрд╣рд░реА рд╕рдЯреАрдХрддрд╛ |
рдЪрд┐рддреНрд░рд╛ 2 рдХреЗ рд░реЗрдЦрд╛рдВрдХрди рд╕реЗ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдкрд╛рдд
fn рдФрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рдХреНрд░рдо рдХреЗ рдПрдбрдореНрд╕ рдФрд░ рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреА рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐
fn рдкреНрд░рдгрд╛рд▓реА рдХреА рдЧрддрд┐ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдКрд░реНрдЬрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рджрд╣рд▓реАрдЬ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ
dE/E0<10тИТ12 ред рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЕрдм рддрд░реАрдХреЛрдВ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдФрд░ рд╡реГрджреНрдзрд┐ рдХреЗрд╡рд▓ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреА рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд╣реА рд╕рдВрднрд╡ рд╣реИред

| 
|
рдХ) | рдЦ) |
рдЕрдВрдЬреАрд░ред 3. рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдП), рдЧрддрд┐ рдмреА), рд╕рд┐рд╕реНрдЯрдо рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ N=512 рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рдп fn рдЪреМрдЧреБрдиреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде (__float128) |
рдЖрдВрдХрдбрд╝реЗ 3 рдП рдФрд░ 3 рдмреА рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЪреМрдЧреБрдиреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдкреЗрдХреНрд╖ рдКрд░реНрдЬрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ
10тИТ23 , рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рд╕рдордп рдбрдмрд▓ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рдорд╛рдг рдХреЗ рджреЛ рдЖрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдбрдмрд▓-рд╕рдЯреАрдХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдЯреАрдХрддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдкрд╛рдд рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
fn рдкрд╛рдВрдЪрд╡реЗрдВ рдХреНрд░рдо рдХреЗ рдПрдбрдореНрд╕ рдФрд░ рдбреЙрд░рдорди-рдкреНрд░рд┐рдВрд╕ рдХреЗ рдкрд╛рд╕ред
рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рдФрд░ рд╡рд░реНрдирд░
рд╡рд┐рдзрд┐рдпрд╛рдВ рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рд╕рдЯреАрдХрддрд╛ рдХреЗ рдЙрдЪреНрдЪ рдФрд░ рдирд┐рдореНрди рдХреНрд░рдо рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, 5 рдФрд░ 4 рдХреЗ рдЖрджреЗрд╢, рдФрд░ рд╡рд░реНрдирд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, 6 рдФрд░ 5 рдХрд╛ рдЖрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ)ред рдпрджрд┐ рдпреЗ рджреЛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдПрдХреАрдХрд░рдг рдХрджрдо рдХреЛ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдПрдХреАрдХрд░рдг рдЪрд░рдг рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдХ рд▓рдВрдмреЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдкрд╛рдВрдЪрд╡реЗ рдХреНрд░рдо рдХреЗ рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕, рд╡рд░реНрдирд░ рдФрд░ рдПрдбрдореНрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░реЗрдВред
TрдЕрдзрд┐рдХрддрдо=300 )ред

|
рдХ) рдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдКрд░реНрдЬрд╛, рдЧрддрд┐ рдФрд░ рдЙрд╕рдХреЗ рдХреНрд╖рдг рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди
|

|
рдЦ) рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ fn рд╕рд┐рдореБрд▓реЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ DeltaT=0.3
|
рдЕрдВрдЬреАрд░ред 4. рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреМрддрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рд░реНрднрд░рддрд╛ fn рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рдЪрд░-рдЪрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдордп-рд╕рдордп рдкрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ h=10тИТ5 dots10тИТ9
|

|
рдХ) рдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдКрд░реНрдЬрд╛, рдЧрддрд┐ рдФрд░ рдЙрд╕рдХреЗ рдХреНрд╖рдг рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди
|

|
рдЦ) рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ fn рд╕рд┐рдореБрд▓реЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ DeltaT=0.3
|
рдЕрдВрдЬреАрд░ред 5. рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреМрддрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рд░реНрднрд░рддрд╛ fn рдПрдХ рдЪрд░ рдЪрд░рдг рдХреЗ рд╕рд╛рде рд╡рд░реНрдирд░ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдмрдирд╛рдо рд╕рдордп h=10тИТ5 dots10тИТ9
|

|
рдЕрдВрдЬреАрд░ред 6. рдПрдХ рдЪрд░рдг рдореЗрдВ рдкрд╛рдВрдЪрд╡реЗрдВ рдХреНрд░рдо рдХреЗ рдПрдбрдореНрд╕-рдмрд╛рд╢рдлреЛрд░реНрдЯ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдКрд░реНрдЬрд╛, рдЧрддрд┐ рдФрд░ рдЙрд╕рдХреЗ рдХреНрд╖рдг рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди h=10тИТ6
|

|
рдЕрдВрдЬреАрд░ 7. рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ fn рдкрд╛рдБрдЪрд╡реЗрдВ рдХреНрд░рдо рдХреЗ рдПрдбрдореНрд╕, рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рдФрд░ рд╡рд░реНрдирд░ рд╕рд┐рдореБрд▓реЗрд╢рди рд╕рдордп рд╕реЗ
|
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ (
T<25 ) рд╕рднреА рддреАрди рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдШрдЯрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдореБрдЦреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ (рдХреБрд▓ рдКрд░реНрдЬрд╛, рдЧрддрд┐ рдФрд░ рдЗрд╕рдХреА рдЧрддрд┐) рддреЗрдЬреА рд╕реЗ рдХреВрджрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдбреЙрд░реНрдорди-рдкреНрд░рд┐рдВрд╕ рдФрд░ рд╡рд░реНрдирд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде "рдЬрдЯрд┐рд▓" рдЦрдВрдбреЛрдВ рдореЗрдВ рдПрдХреАрдХрд░рдг рдХрджрдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ
fn рдЬреИрд╕рд╛ рдХрд┐ рдЖрдВрдХрдбрд╝реЗ 4 рдмреА рдФрд░ 5 рдмреА рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛
fn рдиреЗрд╕реНрдЯреЗрдб рддрд░реАрдХреЗ рдПрдбрдореНрд╕-рдмрд╛рд╢рдлреЛрд░реНрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдЫреЛрдЯреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд┐рддреНрд░ 7 рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрди рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ
|
рд╡реАрдбрд┐рдпреЛ 1. 512 рдирд┐рдХрд╛рдпреЛрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЙрдбрд▓рд┐рдВрдЧред рдбреЛрд░реЗрдореЙрди-рдкреНрд░рд┐рдВрд╕ рд╡рд┐рдзрд┐ред рдЧрддрд┐рд╢реАрд▓ рдХрджрдо h=10тИТ5 dots10тИТ9
|
рд╡реАрдбрд┐рдпреЛ рд╕рдордп рдореЗрдВ рдЙрд╕ рдмрд┐рдВрджреБ рддрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
T=25 рдЧрддрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╢рд╛рдВрдд рд╣реИ, рдФрд░ "рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛рдУрдВ" рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рдЯрдХрд░рд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдореЗрдВ рддреЗрдЬ рдмрджрд▓рд╛рд╡ рдФрд░ рдХреБрдЫ рдХрдгреЛрдВ рдХреЗ рд╡реЗрдЧ рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рд╡реГрджреНрдзрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдорд╛рдзрд╛рди рдХреА рд╕рдЯреАрдХрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХреАрдХрд░рдг рдЪрд░рдг рдХреЛ рдХрдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИрдВ; рд░реЗрдЦрд╛рдВрдХрди рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ, рдПрдХреАрдХрд░рдг рдХрджрдо рдХреЛ рдкрд░рд┐рдорд╛рдг рдХреЗ рд▓рдЧрднрдЧ рджреЛ рдЖрджреЗрд╢реЛрдВ рд╕реЗ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
10тИТ5 рдХреЛ
h=10тИТ7 ред рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреВрд░реЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдПрдбрдореНрд╕ рдкрджреНрдзрддрд┐ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рдгрд╛рдо
рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХреАрдХрд░рдг рдЪрд░рдг рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреЗ "рдЬрдЯрд┐рд▓" рдЦрдВрдбреЛрдВ рдкрд░ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдЙрдЪреНрдЪрддрдо рдЖрджреЗрд╢ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рди рдХрд░реЗрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ 'рдбрдмрд▓' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╡реЗ рдЕрдкрдиреА рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдмрд╣реБрдд рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред
рд╕реАрдкреАрдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм рдЬрдмрдХрд┐ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдЗрдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЗ рд▓рд┐рдП рдмрд╛рддрдЪреАрдд рдмрд▓ рдХреА рдЧрдгрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╣рдо рд╕рднреА рдХрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЛрд╣рд░рд╛ рдЪрдХреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб 'рд╕рд░рд▓'for(size_t body1 = 0; body1 < count; ++body1) { const nbvertex_t v1(rx[ body1 ], ry[ body1 ], rz[ body1 ]); nbvertex_t total_force; for(size_t body2 = 0; body2 != count; ++body2) { if(body1 == body2) { continue; } const nbvertex_t v2(rx[ body2 ], ry[ body2 ], rz[ body2 ]); const nbvertex_t force(m_data->force(v1, v2, mass[body1], mass[body2])); total_force += force; } frx[body1] = vx[body1]; fry[body1] = vy[body1]; frz[body1] = vz[body1]; fvx[body1] = total_force.x / mass[body1]; fvy[body1] = total_force.y / mass[body1]; fvz[body1] = total_force.z / mass[body1]; }
рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдмрд▓реЛрдВ рдХреА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЪрдХреНрд░ рд╕реЗ рдкрд╣рд▓реЗ рдУрдкрдирдПрдордкреА рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
'Openmp' рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ #pragma omp parallel for for(size_t body1 = 0; body1 < count; ++body1)
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рд░реИрдо рдХреЗ рд╕рд╛рде рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдмрд╛рддрдЪреАрдд рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдХреИрд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреЗ рднрд╛рдЧ рдХреЛ рдХреИрд╢ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб 'рдУрдкрдиреИрдВрдк + рдмреНрд▓реЙрдХ' #pragma omp parallel for for(size_t n1 = 0; n1 < count; n1 += BLOCK_SIZE) { nbcoord_t x1[BLOCK_SIZE]; nbcoord_t y1[BLOCK_SIZE]; nbcoord_t z1[BLOCK_SIZE]; nbcoord_t m1[BLOCK_SIZE]; nbvertex_t total_force[BLOCK_SIZE]; for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { size_t local_n1 = b1 + n1; x1[b1] = rx[local_n1]; y1[b1] = ry[local_n1]; z1[b1] = rz[local_n1]; m1[b1] = mass[local_n1]; } for(size_t n2 = 0; n2 < count; n2 += BLOCK_SIZE) { nbcoord_t x2[BLOCK_SIZE]; nbcoord_t y2[BLOCK_SIZE]; nbcoord_t z2[BLOCK_SIZE]; nbcoord_t m2[BLOCK_SIZE]; for(size_t b2 = 0; b2 != BLOCK_SIZE; ++b2) { size_t local_n2 = b2 + n2; x2[b2] = rx[local_n2]; y2[b2] = ry[local_n2]; z2[b2] = rz[local_n2]; m2[b2] = mass[n2 + b2]; } for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { const nbvertex_t v1(x1[ b1 ], y1[ b1 ], z1[ b1 ]); for(size_t b2 = 0; b2 != BLOCK_SIZE; ++b2) { const nbvertex_t v2(x2[ b2 ], y2[ b2 ], z2[ b2 ]); const nbvertex_t force(m_data->force(v1, v2, m1[b1], m2[b2])); total_force[b1] += force; } } } for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { size_t local_n1 = b1 + n1; frx[local_n1] = vx[local_n1]; fry[local_n1] = vy[local_n1]; frz[local_n1] = vz[local_n1]; fvx[local_n1] = total_force[b1].x / m1[b1]; fvy[local_n1] = total_force[b1].y / m1[b1]; fvz[local_n1] = total_force[b1].z / m1[b1]; } }
рдЖрдЧреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдореБрдЦреНрдп рдЪрдХреНрд░ рдореЗрдВ рдмрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рд╢рд░реАрд░ рджреНрд░рд╡реНрдпрдорд╛рди m1 [b1] рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЧреБрдгрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рд╣рдордиреЗ рдЧрдгрдирд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЪрдХреНрд░ рдкрд░ рдПрд╕рдПрд╕рдИ рдФрд░ рдПрд╡реАрдПрдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб 'рдУрдкрдиреИрдВрдк + рдмреНрд▓реЙрдХ + рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди' #pragma omp parallel for for(size_t n1 = 0; n1 < count; n1 += BLOCK_SIZE) { nbcoord_t x1[BLOCK_SIZE]; nbcoord_t y1[BLOCK_SIZE]; nbcoord_t z1[BLOCK_SIZE]; nbcoord_t total_force_x[BLOCK_SIZE]; nbcoord_t total_force_y[BLOCK_SIZE]; nbcoord_t total_force_z[BLOCK_SIZE]; for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { size_t local_n1 = b1 + n1; x1[b1] = rx[local_n1]; y1[b1] = ry[local_n1]; z1[b1] = rz[local_n1]; total_force_x[b1] = 0; total_force_y[b1] = 0; total_force_z[b1] = 0; } for(size_t n2 = 0; n2 < count; n2 += BLOCK_SIZE) { nbcoord_t x2[BLOCK_SIZE]; nbcoord_t y2[BLOCK_SIZE]; nbcoord_t z2[BLOCK_SIZE]; nbcoord_t m2[BLOCK_SIZE]; for(size_t b2 = 0; b2 != BLOCK_SIZE; ++b2) { size_t local_n2 = b2 + n2; x2[b2] = rx[local_n2]; y2[b2] = ry[local_n2]; z2[b2] = rz[local_n2]; m2[b2] = mass[n2 + b2]; } for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { for(size_t b2 = 0; b2 != BLOCK_SIZE; ++b2) { nbcoord_t dx = x1[b1] - x2[b2]; nbcoord_t dy = y1[b1] - y2[b2]; nbcoord_t dz = z1[b1] - z2[b2]; nbcoord_t r2(dx * dx + dy * dy + dz * dz); if(r2 < NBODY_MIN_R) { r2 = NBODY_MIN_R; } nbcoord_t r = sqrt(r2); nbcoord_t coeff = (m2[b2]) / (r * r2); dx *= coeff; dy *= coeff; dz *= coeff; total_force_x[b1] -= dx; total_force_y[b1] -= dy; total_force_z[b1] -= dz; } } } for(size_t b1 = 0; b1 != BLOCK_SIZE; ++b1) { size_t local_n1 = b1 + n1; frx[local_n1] = vx[local_n1]; fry[local_n1] = vy[local_n1]; frz[local_n1] = vz[local_n1]; fvx[local_n1] = total_force_x[b1]; fvy[local_n1] = total_force_y[b1]; fvz[local_n1] = total_force_z[b1]; } }
рддрд╛рд▓рд┐рдХрд╛ 2. рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) рдХреА рдирд┐рд░реНрднрд░рддрд╛ fn рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрди рд╡рд┐рднрд┐рдиреНрди CPU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдПрдПрди | 2048 | 4096 | 8192 | 16384 | 32768 |
---|
рд╕рд░рд▓ | 0.0425 | 0.1651 | 0.6594 | 2.65 | 10.52 |
OpenMP | 0.0078 | 0.0260 | 0.1079 | 0.417 | 1.655 |
Openmp + рдмреНрд▓реЙрдХ + рдЕрдиреБрдХреВрд▓рди | 0.0037 | 0.0128 | 0.0495 | 0.194 | 0.774 |
рд╕рд┐рд╕реНрдЯрдо рдкреИрд░рд╛рдореАрдЯрд░:- рдкреНрд░рдгрд╛рд▓реА: рдбреЗрдмрд┐рдпрди 9, рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i7-5820K (6 рдХреЛрд░)
- рд╕рдВрдХрд▓рдХ: рдЬреАрд╕реАрд╕реА 6.3.0
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдУрдкрдирдПрдордкреА рд╕рдорд░реНрдерди рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЫрд╣ рдмрд╛рд░ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рджреЛ рдмрд╛рд░ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХрд▓-рд╕реНрдЯреНрд░реАрдо рдЧрдгрдирд╛ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдиреЗ 3.6 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрд╕реНрдХрд░рдг (рдУрдкрдирдореНрдк) рдореЗрдВ рдЗрд╕рдиреЗ рдЖрд╡реГрддреНрддрд┐ рдХреЛ 3.4 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкрд░ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛, рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реНрдб (рдУрдкрдирдПрдореНрдк + рдмреНрд▓реЙрдХ + рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди) рдореЗрдВ рдпрд╣ рдШрдЯрдХрд░ 3.3 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдиреЗ рдЙрд╕реЗ 13.6 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрд╛ред рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рд╕рдордп рдореЗрдВ рд╡реГрджреНрдзрд┐ рджреНрд╡рд┐рдШрд╛рдд рд╣реИ, рдФрд░ рдЖрдЧреЗ рдХреА рд╡реГрджреНрдзрд┐
рдПрди рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдмрдирд╛рддрд╛ рд╣реИред
GPU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд▓реЗрдХрд┐рди рдЧрдгрдирд╛рдУрдВ рдХреЛ рдФрд░ рднреА рддреЗрдЬ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИред рддреНрд╡рд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рджрд┐рд╢рд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: GPU рдЕрднрд┐рдХрд▓рди, рдлрд╝рдВрдХреНрд╢рди рд╕рдиреНрдирд┐рдХрдЯрди
fn ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, GPU рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ OpenCL рддрдХрдиреАрдХ рдХреЛ рдЪреБрдирд╛ред рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП,
CLHPP рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдЬреАрдкреАрдпреВ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд▓реЗрдЦрди рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
Oclgrind рдЯреВрд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЧрд▓рдд OpenCL API рдХреЙрд▓ рдФрд░ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
OpenCL
рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрд▓рдмреНрдз рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЖрдо рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдПрдПрдордбреА, рдЗрдВрдЯреЗрд▓ рдФрд░ рдПрдирд╡реАрдбрд┐рдпрд╛ рд╣реИрдВред
рдХреЛрдб std::vector<cl::Platform> platforms; cl::Platform::get(&platforms);
рдЕрдЧрд▓рд╛, рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЙрд╕ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
рдХреЛрдб const cl::Platform& platform(platforms[platform_n]); std::vector<cl::Device> all_devices; platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
рдФрд░ рддреИрдпрд╛рд░реА рдХреЗ рдЪрд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╕рдВрджрд░реНрдн рдФрд░ рдХрддрд╛рд░ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджрд░реНрдн рдЬреЛ рдЪрдпрдирд┐рдд рдордВрдЪ рдХреЗ рд╕рднреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдкреНрд░рд╕рдВрдЧ рдФрд░ рдХрддрд╛рд░ рдирд┐рд░реНрдорд╛рдг рд╕рдВрд╣рд┐рддрд╛ cl::Context context(all_devices); std::vector<cl::CommandQueue> queues; for(cl::Device device: all_devices) queues.push_back(cl::CommandQueue(context, device));
рдПрдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП cl :: рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд░реНрдЧ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред
рдХрд░реНрдиреЗрд▓ рд╕рдВрдХрд▓рди рдХреЛрдб std::vector< std::string > source_data; cl::Program::Sources sources; for(int i = 0; i != files.size(); ++i) { source_data.push_back(load_program(files[i]));
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди (рдХрд░реНрдиреЗрд▓) рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕реАрдПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ: make_kernelред
рдЗрдВрдЯрд░рдПрдХреНрд╢рди рддрд╛рдХрдд рдЧрдгрдирд╛ рдХрд░реНрдиреЗрд▓ рдЙрджрд╛рд╣рд░рдг typedef cl::make_kernel< cl_int, cl_int,
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХрд░реНрдиреЗрд▓ рдХреЗ рдирд╛рдо рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рдХреЛрдб ComputeBlock fcompute(prog, "ComputeBlockLocal"); cl::NDRange global_range(device_data_size); cl::NDRange local_range(block_size); cl::EnqueueArgs eargs(ctx.m_queue, global_range, local_range); fcompute(eargs, ... );
рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рд▓рд┐рдП рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХреЛрд░ рд╕реАрдкреАрдпреВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЗрд╡рд▓ рд╕реАрдкреАрдпреВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП 'рдУрдкрдирдПрдореНрдк + рдмреНрд▓реЙрдХ + рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди' рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реИ, рдкрд╣рд▓рд╛ рдЪрдХреНрд░ рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд╛рдЗрдХрд┐рд▓ рд░реЗрдВрдЬ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛрдб рд╕реЗ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХрд░рдВрдЯ рдЗрдЯреНрд░рд┐рд╢рди рдирдВрдмрд░ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ get_global_id (0))ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢рд░реАрд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рд╕рдореВрд╣ рдореЗрдВ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рд╡реИрд╢реНрд╡рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ, рдЧрдгрдирд╛ рдмрд╣реБрдд рддреЗрдЬ рд╣реИредрдХрд░реНрдиреЗрд▓ рдХреЛрдб __kernel void ComputeBlockLocal(int offset_n1, int offset_n2, __global const nbcoord_t* mass, __global const nbcoord_t* y, __global nbcoord_t* f, int yoff, int foff, int points_count, int stride) { int n1 = get_global_id(0) + offset_n1; __global const nbcoord_t* rx = y + yoff; __global const nbcoord_t* ry = rx + stride; __global const nbcoord_t* rz = rx + 2 * stride; __global const nbcoord_t* vx = rx + 3 * stride; __global const nbcoord_t* vy = rx + 4 * stride; __global const nbcoord_t* vz = rx + 5 * stride; __global nbcoord_t* frx = f + foff; __global nbcoord_t* fry = frx + stride; __global nbcoord_t* frz = frx + 2 * stride; __global nbcoord_t* fvx = frx + 3 * stride; __global nbcoord_t* fvy = frx + 4 * stride; __global nbcoord_t* fvz = frx + 5 * stride; nbcoord_t x1 = rx[n1]; nbcoord_t y1 = ry[n1]; nbcoord_t z1 = rz[n1]; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; __local nbcoord_t x2[NBODY_DATA_BLOCK_SIZE]; __local nbcoord_t y2[NBODY_DATA_BLOCK_SIZE]; __local nbcoord_t z2[NBODY_DATA_BLOCK_SIZE]; __local nbcoord_t m2[NBODY_DATA_BLOCK_SIZE];
CUDA
NVidia CUDA рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди OpenCL рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрддрд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рддрдм рддрдХ рдЬрдм рддрдХ рд╣рдо рдмрд╣реБ-рдЬреАрдкреАрдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ)ред OpenCL рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ GPU рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЖрдк рдпрд╣рд╛рдВ CUDA рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ редCUDA рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рдХреЛрдб dim3 grid(count / block_size); dim3 block(block_size); size_t shared_size(4 * sizeof(nbcoord_t) * block_size); kfcompute <<< grid, block, shared_size >>> (... ...);
OpenCL рдХреЗ рд╡рд┐рдкрд░реАрдд, CUDA рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (OpenCL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ global_range рд╣реИ), рд▓реЗрдХрд┐рди рдЧреНрд░рд┐рдб рдореЗрдВ рдЧреНрд░рд┐рдб рдЖрдХрд╛рд░ рдФрд░ рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддрджрдиреБрд╕рд╛рд░ рд╡рд░реНрддрдорд╛рди рд╢рд░реАрд░ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рдХрд░реНрдиреЗрд▓ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде OpenCL рдХреЗ рд╕рдорд╛рди рд╣реИред рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ред CUDA рдХреА рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред OpenCL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЦрдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдмреНрд▓реЙрдХ рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВредCUDA рдХрд░реНрдиреЗрд▓ рдХреЛрдб __global__ void kfcompute(int offset_n2, const nbcoord_t* y, int yoff, nbcoord_t* f, int foff, const nbcoord_t* mass, int points_count, int stride) { int n1 = blockDim.x * blockIdx.x + threadIdx.x; const nbcoord_t* rx = y + yoff; const nbcoord_t* ry = rx + stride; const nbcoord_t* rz = rx + 2 * stride; nbcoord_t x1 = rx[n1]; nbcoord_t y1 = ry[n1]; nbcoord_t z1 = rz[n1]; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; extern __shared__ nbcoord_t shared_xyzm_buf[]; nbcoord_t* x2 = shared_xyzm_buf; nbcoord_t* y2 = x2 + blockDim.x; nbcoord_t* z2 = y2 + blockDim.x; nbcoord_t* m2 = z2 + blockDim.x; for(int b2 = 0; b2 < points_count; b2 += blockDim.x) { int n2 = b2 + offset_n2 + threadIdx.x;
рддрд╛рд▓рд┐рдХрд╛ 3. рдЧрдгрдирд╛ рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) рдлрд╝рдВрдХреНрд╢рди рдХреА рдирд┐рд░реНрднрд░рддрд╛ fn рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ N рд╡рд┐рднрд┐рдиреНрди GPU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдмреЗрд╣рддрд░ CPU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдПN | 4096 | 8192 | 16384 | 32768 | 65536 | 131,072 |
---|
рдУрдкрди + рдмреНрд▓реЙрдХ + рдЕрдиреБрдХреВрд▓рди | 0.0128 | 0.0495 | 0.194 | 0.774 | --- | --- |
рдУрдкрдирд╕реАрдПрд▓ + рдЖрдзрд╛ рдПрдирд╡реАрдбрд┐рдпрд╛ рдХреЗ 80 | 0.004 | 0.008 | 0.026 | 0.134 | 0.322 | 1.18 |
рдХреНрдпреВрдбрд╛ + рдЖрдзрд╛ рдПрдирд╡реАрдбрд┐рдпрд╛ K80 | 0.004 | 0.008 | 0.0245 | 0.115 | 0.291 | 1.13 |
рдПрдирд╡реАрдбрд┐рдпрд╛ K80 рдХрд╣рд╛рдВ рд╕реЗ рд▓рд╛рдПрдВOpenCL CUDA
Colab Google, NVidia K80.
.
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ, рд╕реАрдкреАрдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ 5-6 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдкреВрд░реЗ K80 рдкрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рд╣рдореЗрдВ 12 рдЧреБрдирд╛ рддрдХ рддреНрд╡рд░рдг рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рддрдм рд╕реЗ рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рджреНрд╡рд┐рдШрд╛рдд рд╣реИ, рддреЛ рдПрдХ рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рд╣рдо 32768 рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди 131072, рдЬреЛ рдХреЗрд╡рд▓ 4 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИредрд╕рдорд╛рд░реЛрд╣ рд╕реНрд╡реАрдХреГрддрд┐ fn
рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рджреЛ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдЖрдХрд░реНрд╖рдХ рдмрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рджреВрд░реА рдХреЗ рд╕рд╛рде рджреНрд╡рд┐рдШрд╛рдд рд░реВрдк рд╕реЗ рдШрдЯрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд░реАрдмреА рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдмреАрдЪ рдФрд░ рд▓рдЧрднрдЧ рджреВрд░ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд▓ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреАред рдмрд╛рд░реНрдиреНрд╕ рдФрд░ рдкреАред рд╣реИрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЯреНрд░реЗрдмреНрд▓реЙрд╕рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ ред рдСрдХреНрдЯреЛ- рдЯреНрд░реА рдХреЛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рд╕реНрдкреЗрд╕ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИрдпреБрдХреНрдд рд╢рд░реАрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рджреНрд░рд╡реНрдпрдорд╛рдиреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдкрддреНрддреЛрдВ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдиреЛрдбреНрд╕ рдореЗрдВ рджреНрд░рд╡реНрдпрдорд╛рди рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рдХрд╛ рдХреБрд▓ рджреНрд░рд╡реНрдпрдорд╛рди рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡рд░реНрдгрд┐рдд рдЧреЛрд▓реЗ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ред рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕рднреА рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХрд╛ рдХреЗрдВрджреНрд░, рдЙрдирдХрд╛ рдХреБрд▓ рджреНрд░рд╡реНрдпрдорд╛рди рдФрд░ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡рд░реНрдгрд┐рдд рдЧреЛрд▓реЗ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рд╣реЛрддреА рд╣реИред рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛ рдмрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рд╕реЗ рджреВрд░реА рдХреЛ рдкрд╣рд▓реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдиреЛрдб рд╕реЗ рдЙрд╕рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреА рджреВрд░реА рдХрд╛ рдЕрдиреБрдкрд╛рдд рдХреБрдЫ рд╕реНрдерд┐рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ╬╗crit , рдлрд┐рд░ рд░реВрдЯ рдХреЛ рдПрдХ рдирд┐рдХрд╛рдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд░реВрдк рджрд┐рд╢рд╛рдУрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рдорддреБрд▓реНрдп рд╕рдорддреБрд▓реНрдп рдкрд┐рдВрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдкрд┐рдВрдбреЛрдВ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдпреЛрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рджреНрд░рд╡реНрдпрдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ рдЕрдиреБрдкрд╛рдд рдХреЗ рдмрд░рд╛рдмрд░ рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рд╣реЛрддрд╛ рд╣реИ ╬╗crit, рдлрд┐рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдПрдХ рдкрддреНрддрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╛рддрдЪреАрдд рдмрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдПрдХ рд╢рд░реАрд░ рдХреЛ рдЕрдиреНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рдореВрд╣ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕рдореВрд╣ рдХреЛ рдПрдХ рд╢рд░реАрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рддрдЪреАрдд рдмрд▓ рдХреА рдЧрдгрдирд╛ рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рддрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╢рд░реАрд░ рддрдХ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИO(N2) рдХреЛ O(Nlog(N))рд╕рдЯреАрдХрддрд╛ рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рдХреА рдХреАрдордд рдкрд░редрдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдореИрдВрдиреЗ рдСрдХреНрдЯреНрд░реА рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ , рд▓реЗрдХрд┐рди рдХреЗрдбреА рдЯреНрд░реА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдСрдХреНрдЯреНрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реНрдЯреЛрд░реЗрдЬ рдУрд╡рд░рд╣реЗрдб рд╣реИредрдЪрд▓реЛ рд╕реАрдкреАрдпреВ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рдХреЗрдбреА-рдЯреНрд░реА рдиреЛрдб рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рд╡рдВрд╢ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:рдХреЗрдбреА рд╡реГрдХреНрд╖ рдиреЛрдб class node { node* m_left;
рдкреЗрдбрд╝ рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреА рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЗрдбрд╝ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдпрд╛ рддреЛ рд╕реНрдкрд╖реНрдЯ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рд╕реНрд╡рдпрдВ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдмрд╕ рдЧрдпрд╛редрдПрдХ рдкреЗрдбрд╝ рдкрд░ рдЪрдврд╝рдХрд░ рдмрд╛рддрдЪреАрдд рдмрд▓ рдХреА рдЧрдгрдирд╛ nbvertex_t force_compute(const nbvertex_t& v1, const nbcoord_t mass1) { nbvertex_t total_force; node* stack_data[MAX_STACK_SIZE] = {}; node** stack = stack_data; node** stack_head = stack; *stack++ = m_root; while(stack != stack_head) { node* curr = *--stack; const nbcoord_t distance_sqr((v1 - curr->m_mass_center).norm()); if(distance_sqr > curr->m_radius_sqr) {
рдЬреИрд╕рд╛ рдХрд┐ "рд╕рдЯреАрдХ" рд╕реАрдкреАрдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдмрд▓ рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред OpenMP рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рдЪрдХреНрд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдкрдбрд╝реЛрд╕реА рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреЗрдбрд╝ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХрд╛ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рдореВрд▓ рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдирд┐рдХрд╛рдп kd-tree рдХреА рдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддрдм рдкрдбрд╝реЛрд╕реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рдЙрди рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрд┐рдд рд╣реЛрдВрдЧреА рдЬреЛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХрд░реАрдм рд╣реИрдВ, рдФрд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкрдереЛрдВ рдХреЗ рд╕рд╛рде рдкреЗрдбрд╝ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗредрдкреЗрдбрд╝ рдХреА рдкрддреНрддреА рдХрд╛ рдлрдВрджрд╛ template<class Visitor> void traverse(Visitor visit) { node* stack_data[MAX_STACK_SIZE] = {}; node** stack = stack_data; node** stack_head = stack; *stack++ = m_root; while(stack != stack_head) { node* curr = *--stack; if(curr->m_radius_sqr > 0) {
рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреЗрдбрд╝ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ рдПрдХ рд░реИрдЦрд┐рдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рд╡рдВрд╢ рдХреЗ рднрдВрдбрд╛рд░рдг рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЬрдм рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛1 рдпрджрд┐ рдиреЛрдб рд╕реЗрд▓ рдирдВрдмрд░ рдореЗрдВ рд╣реИ i , рддрдм рдЙрд╕рдХрд╛ рдмрд╛рдпрд╛ рдмрдЪреНрдЪрд╛ рд╕реЗрд▓ рдореЗрдВ рд╣реИ 2i , рд╕реЗрд▓ рдореЗрдВ рд╕рд╣реА рдмрдЪреНрдЪрд╛ рд╣реИ 2i+1 , рдФрд░ рд╕реЗрд▓ рдореЗрдВ рдЬрдирдХ i/2 ред
рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдИрдВ рдУрд░ рджрд╛рдПрдВ рдиреЛрдб i рдПрдХ рдирдВрдмрд░ рд╣реЛрдЧрд╛ i+1 ред
рд╕рд░рдгреА рдореЗрдВ рд╣реА рдПрдХ рд▓рдВрдмрд╛рдИ рд╣реЛрдЧреА 2N , рдФрд░ рд╕рднреА рдкрддреНрддреА рдиреЛрдбреНрд╕ рдЖрдЦрд┐рд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ Nрд╕реЗрд▓, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рд░реАрдХреА рд╕реЗ рд╕реНрдерд┐рдд рдиреЛрдбреНрд╕ рд╕рд░рдгреА рдХреЗ рдХрд░реАрдмреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдлрд╝рдВрдХреНрд╢рди рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛:рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдХреЛ рдХрд╛рдЯрдХрд░ рдмрд▓ рдХреА рдЧрдгрдирд╛ nbvertex_t force_compute(const nbvertex_t& v1, const nbcoord_t mass1) { nbvertex_t total_force; size_t stack_data[MAX_STACK_SIZE] = {}; size_t* stack = stack_data; size_t* stack_head = stack; *stack++ = NBODY_HEAP_ROOT_INDEX; while(stack != stack_head) { size_t curr = *--stack; const nbcoord_t distance_sqr((v1 - m_mass_center[curr]).norm()); if(distance_sqr > m_radius_sqr[curr]) { total_force += force(v1, m_mass_center[curr], mass1, m_mass[curr]); } else { size_t left(left_idx(curr)); size_t rght(rght_idx(curr)); if(rght < m_body_n.size()) { *stack++ = rght; } if(left < m_body_n.size()) { *stack++ = left; } } } return total_force; }
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЦреБрд▓рддрд╛ рд╣реИ - рд╣рдо рд░реЗрдВрдЧрдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдХреЛ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рд╢рд╛рдЦрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдиреЛрдб рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдЧрд▓реЗ рдиреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (nextup ), рдФрд░ рдЙрд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрдВрдЯрд░реИрдХреНрд╢рди рдлреЛрд░реНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдЧрд▓реЗ рдиреЛрдб рдХреА рдЧрдгрдирд╛ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдмрдЯреНрд░реА рд╕реНрдХреАрдк рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ( skipdown )ред
рд╡рд░реНрддрдорд╛рди рд╕рдмрдЯреНрд░реА рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░реВрдЯ (рджрд┐рд╢рд╛) рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ D ), рдЬрдмрдХрд┐ рд╣рдо рджрд╛рдПрдВ рд╡рдВрд╢ рдореЗрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рд╣рдо рдмрд╛рдИрдВ рдУрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рджрд╛рдПрдВ рдЙрдк-рд╡рд░реНрдЧ (рджрд┐рд╢рд╛) рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ R ), рдпрджрд┐ рд╣рдо рдЬрдбрд╝ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдкреЗрдбрд╝ рдХрд╛ рдЪрдХреНрдХрд░ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрд╕рдмрдЯреНрд░реА рд╕реНрдХрд┐рдк рдлрдВрдХреНрд╢рди рдХреЛрдб index_t skip_down(index_t idx) {
рдЪрд┐рддреНрд░рд╛ 8. рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд▓рдВрдШрди skipdown редрдЕрдЧрд▓реЗ рдиреЛрдб рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдкрд░ рдЬрд╛рдПрдВ (рджрд┐рд╢рд╛)рдпреВ ), рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 'рдиреАрдЪреЗ' рд╕реЗ рдЕрдЧрд▓реЗ рдиреЛрдб рдкрд░ рдЬрд╛рдПрдВ skipdown ред
рдЕрдЧрд▓реЗ рдиреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВ index_t next_up(index_t idx, index_t tree_size) { index_t left = left_idx(idx); if(left < tree_size) { return left; } return skip_down(idx); }
рдЪрд┐рддреНрд░рд╛ 9. рдЕрдЧрд▓реЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг nextup редрдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд░рд┐рдХрд░реНрд╕рди рдХреЛ рд▓реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИwhile рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ skipdown , рдФрд░ рдРрд╕рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдиреЛрдб рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ iрд╕рд╣реА рд╡рдВрд╢рдЬред рдпрд╣ рдмрд╕ рдЗрд╕рдХреА рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ (рд╕рд╣реА рдмрдЪреНрдЪрд╛ рд╕реЗрд▓ рдореЗрдВ рд╣реИ) рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ2i+1 ), рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ i&1 ред рдпрд╛рдиреА
рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ iрджреЛ рдЕрдЧрд░ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдПрдХ рдкрд░ рд╕реЗрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд▓реВрдк рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдПрдХ рдкрд╣рд▓рд╛ рд╕реЗрдЯ рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдмрд┐рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╣рдо рд▓реВрдк рдХреЛ рдЪрд╛рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВредрдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реНрдб рд╕реНрдХрд┐рдк рд╕рдмрдЯреНрд░реА рдлрдВрдХреНрд╢рди рдХреЛрдб index_t skip_down(index_t idx) { idx = idx >> (__builtin_ffs(~idx) - 1); return left2right(idx); }
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реНрдЯреИрдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ skipdown+nextup , рдЙрд╕рдХреЗ рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдФрд░ рднреА рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:рдПрдХ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдХреЛ рдкреАрдЫреЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрд▓ рдХреА рдЧрдгрдирд╛ nbvertex_t force_compute(const nbvertex_t& v1, const nbcoord_t mass1) const { nbvertex_t total_force; size_t curr = NBODY_HEAP_ROOT_INDEX; size_t tree_size = m_mass_center.size(); do { const nbcoord_t distance_sqr((v1 - m_mass_center[curr]).norm()); if(distance_sqr > m_radius_sqr[curr]) { total_force += force(v1, m_mass_center[curr], mass1, m_mass[curr]); curr = skip_down(curr); } else { curr = next_up(curr, tree_size); } } while(curr != NBODY_HEAP_ROOT_INDEX); return total_force; }
рдХреБрд▓ рдореЗрдВ, рд╣рдореЗрдВ рдкреЗрдбрд╝ рдХреА рдЫрд▓ рдФрд░ рдмрд▓ рдЧрдгрдирд╛ рдХреЗ рдЫрд╣ рд╕рдВрдпреЛрдЬрди рдорд┐рд▓реЗред рдЧрдгрдирд╛ рд╕рдордп рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рд╣рдо 100 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдкреНрд░рдгрд╛рд▓реА рдХреА рдХреБрд▓ рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред рдПрдХ рдореЙрдбрд▓ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рджреЛ рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ "рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛рдУрдВ" рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирд╛рддреЗ рд╣реИрдВ16384рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдХрд╛рдпредрддрд╛рд▓рд┐рдХрд╛ 4. рдкреЗрдбрд╝ рдХреА рддреНрд░реИрдорд╛рд╕рд┐рдХ рд╡рд┐рдзрд┐ рдФрд░ рдмрд▓ рдЧрдгрдирд╛ рдХрд╛ рд╕рдВрдпреЛрдЬрдирдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ / рдмрд▓ рдЧрдгрдирд╛ рдкреНрд░рдХрд╛рд░ | рдвреЗрд░ рдХреЗ рд╕рд╛рде рдкреЗрдбрд╝ | рдвреЗрд░ рдХреЗ рд╕рд╛рде 'рдвреЗрд░' | рдвреЗрд░ рдХреЗ рдмрд┐рдирд╛ 'рд╣реАрдк' |
---|
рд╢рд░реАрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди | рдЪрдХреНрд░ + рд╡реГрдХреНрд╖ | рдЪрдХреНрд░ + рдвреЗрд░ | рдЪрдХреНрд░ + рдвреЗрд░ |
---|
рдкрддреНрддреА рдмрд╛рдИрдкрд╛рд╕ | nestedtree + рд╡реГрдХреНрд╖ | рдиреЗрд╕реНрдЯрдЯреНрд░реА + рдвреЗрд░ | рдиреЗрд╕реНрдЯрдЯреНрд░реА + рд╣реАрдкрд╕реНрдЯреИрдХрд▓реЗрд╕ |
---|

| 
|
рдП) рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ fn рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА рдХреЗ рдЕрдиреБрдкрд╛рдд рд╕реЗ ( ╬╗crit )ред | рдЦ) рдЯреНрд░реА рдиреЛрдб рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА рдХреЗ рдЕрдиреБрдкрд╛рдд рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рд░реНрднрд░рддрд╛ ( ╬╗crit )ред |
рдЪрд┐рддреНрд░рд╛ 10. рд╕рдорд╛рд░реЛрд╣ рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо fn рд╕реАрдкреАрдпреВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ (рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) N=32768 ) |
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 'рдиреЗрд╕реНрдЯрдЯреНрд░реА + рдЯреНрд░реА' рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреА рдЙрдореНрдореАрдж рддреЗрдЬреА рд╕реЗ рдкреАрдЫреЗ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рд╕рд░рдгреА рдореЗрдВ рдЯреНрд░реА рдиреЛрдбреНрд╕ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдкреНрд░рдореБрдЦ рд╣реИрдВред рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирдЧрдгреНрдп рд╣реИ╬╗crit>1 ред
рдЕрдВрдЬреАрд░ рдореЗрдВ рднреАред 10a рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ (рдХреЗ рд▓рд┐рдП╬╗crit<10 ) рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ fn рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рдЧрдгрдирд╛ ('рдУрдкрдирдореНрдк + рдмреНрд▓реЙрдХ + рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди') рдХреЗ рд╕рдмрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЧрддрд┐ рд╕реЗ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдПрдВ ╬╗crit рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдЯреАрдХ рд╕рдВрд╕реНрдХрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВредGPU рдкреЗрдбрд╝ рдЯреНрд░реИрд╡рд░реНрд╕рд▓
рдореИрдВрдиреЗ OpenCL рддрдХрдиреАрдХ рдФрд░ CUDA рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GPU рдкрд░ рдкреЗрдбрд╝ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рддреБрд░рдВрдд рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реАрдкреАрдпреВ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИредOpenCL рдХрд░реНрдиреЗрд▓ рдПрдХ рдкреЗрдбрд╝ (рдирдВрдмрд░рд┐рдВрдЧ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдЯреНрд░рд╛рд╡рд░реНрд╕рд▓) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП __kernel void ComputeTreeBH(int offset_n1, int points_count, int tree_size, __global const nbcoord_t* y, __global nbcoord_t* f, __global const nbcoord_t* tree_cmx, __global const nbcoord_t* tree_cmy, __global const nbcoord_t* tree_cmz, __global const nbcoord_t* tree_mass, __global const nbcoord_t* tree_crit_r2) { int n1 = get_global_id(0) + offset_n1; int stride = points_count; __global const nbcoord_t* rx = y; __global const nbcoord_t* ry = rx + stride; __global const nbcoord_t* rz = rx + 2 * stride; __global const nbcoord_t* vx = rx + 3 * stride; __global const nbcoord_t* vy = rx + 4 * stride; __global const nbcoord_t* vz = rx + 5 * stride; __global nbcoord_t* frx = f; __global nbcoord_t* fry = frx + stride; __global nbcoord_t* frz = frx + 2 * stride; __global nbcoord_t* fvx = frx + 3 * stride; __global nbcoord_t* fvy = frx + 4 * stride; __global nbcoord_t* fvz = frx + 5 * stride; nbcoord_t x1 = rx[n1]; nbcoord_t y1 = ry[n1]; nbcoord_t z1 = rz[n1]; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; int stack_data[MAX_STACK_SIZE] = {}; int stack = 0; int stack_head = stack; stack_data[stack++] = NBODY_HEAP_ROOT_INDEX; while(stack != stack_head) { int curr = stack_data[--stack]; nbcoord_t dx = x1 - tree_cmx[curr]; nbcoord_t dy = y1 - tree_cmy[curr]; nbcoord_t dz = z1 - tree_cmz[curr]; nbcoord_t r2 = (dx * dx + dy * dy + dz * dz); if(r2 > tree_crit_r2[curr]) { if(r2 < NBODY_MIN_R) { r2 = NBODY_MIN_R; } nbcoord_t r = sqrt(r2); nbcoord_t coeff = tree_mass[curr] / (r * r2); dx *= coeff; dy *= coeff; dz *= coeff; res_x -= dx; res_y -= dy; res_z -= dz; } else { int left = left_idx(curr); int rght = rght_idx(curr); if(left < tree_size) { stack_data[stack++] = left; } if(rght < tree_size) { stack_data[stack++] = rght; } } } frx[n1] = vx[n1]; fry[n1] = vy[n1]; frz[n1] = vz[n1]; fvx[n1] = res_x; fvy[n1] = res_y; fvz[n1] = res_z; }
рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╡реГрдХреНрд╖реЛрдВ рдХреА рдХрдЯрд╛рдИ рдореВрд▓ рд╕рд░рдгреА рдореЗрдВ рд╢рд╡реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИ, рдЗрд╕рд▓рд┐рдП рдкрдбрд╝реЛрд╕реА рдзрд╛рдЧреЗ рдиреЗ рдкреЗрдбрд╝ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ GPU рдореЗрдореЛрд░реА рдХреИрд╢ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рджреВрд╕рд░реЗ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рдкреЗрдбрд╝ рдХреЗ рдКрдкрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдбрд╝реЛрд╕реА рдзрд╛рдЧреЗ рдЙрд╕реА рд░рд╛рд╕реНрддреЗ рд╕реЗ рдкреЗрдбрд╝ рдХреЛ рдкреАрдЫреЗ рд╣рдЯрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрдбрд╝реЛрд╕реА рдкреЗрдбрд╝ рдХреЗ рд╢реАрд░реНрд╖ рдкрд╛рд╕ рдФрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╣реИрдВред рдпрд╣ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЯреНрд░реА рдиреЛрдбреНрд╕ рдХреЗ рдПрд░реЗ рдореЗрдВ рдирдВрдмрд░рд┐рдВрдЧ рдХреЛ рдЪреБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреНрд░реА рдХреА рдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд░рдгреА рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ tn1 рджреНрд╡рд╛рд░рд╛ рдореЗрдореЛрд░реА рдХреЗ рдмрд░рд╛рдмрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗредOpenCL рдХрд░реНрдиреЗрд▓ рдПрдХ рдкреЗрдбрд╝ рдХреА рдХрдЯрд╛рдИ рдХрд░рдХреЗ рддрд╛рдХрдд рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП (рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдирдВрдмрд░рд┐рдВрдЧ рдиреЛрдбреНрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ) __kernel void ComputeHeapBH(int offset_n1, int points_count, int tree_size, __global const nbcoord_t* y, __global nbcoord_t* f, __global const nbcoord_t* tree_cmx, __global const nbcoord_t* tree_cmy, __global const nbcoord_t* tree_cmz, __global const nbcoord_t* tree_mass, __global const nbcoord_t* tree_crit_r2, __global const int* body_n) { int tree_offset = points_count - 1 + NBODY_HEAP_ROOT_INDEX; int stride = points_count; int tn1 = get_global_id(0) + offset_n1 + tree_offset; int n1 = body_n[tn1]; nbcoord_t x1 = tree_cmx[tn1]; nbcoord_t y1 = tree_cmy[tn1]; nbcoord_t z1 = tree_cmz[tn1]; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; int stack_data[MAX_STACK_SIZE] = {}; int stack = 0; int stack_head = stack; stack_data[stack++] = NBODY_HEAP_ROOT_INDEX; while(stack != stack_head) { int curr = stack_data[--stack]; nbcoord_t dx = x1 - tree_cmx[curr]; nbcoord_t dy = y1 - tree_cmy[curr]; nbcoord_t dz = z1 - tree_cmz[curr]; nbcoord_t r2 = (dx * dx + dy * dy + dz * dz); if(r2 > tree_crit_r2[curr]) { if(r2 < NBODY_MIN_R) { r2 = NBODY_MIN_R; } nbcoord_t r = sqrt(r2); nbcoord_t coeff = tree_mass[curr] / (r * r2); dx *= coeff; dy *= coeff; dz *= coeff; res_x -= dx; res_y -= dy; res_z -= dz; } else { int left = left_idx(curr); int rght = rght_idx(curr); if(left < tree_size) { stack_data[stack++] = left; } if(rght < tree_size) { stack_data[stack++] = rght; } } } __global const nbcoord_t* vx = y + 3 * stride; __global const nbcoord_t* vy = y + 4 * stride; __global const nbcoord_t* vz = y + 5 * stride; __global nbcoord_t* frx = f; __global nbcoord_t* fry = frx + stride; __global nbcoord_t* frz = frx + 2 * stride; __global nbcoord_t* fvx = frx + 3 * stride; __global nbcoord_t* fvy = frx + 4 * stride; __global nbcoord_t* fvz = frx + 5 * stride; frx[n1] = vx[n1]; fry[n1] = vy[n1]; frz[n1] = vz[n1]; fvx[n1] = res_x; fvy[n1] = res_y; fvz[n1] = res_z; }
рдЯреНрд░реА рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХреНрд░рдо рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рд╕реБрдзрд╛рд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдореГрддрд┐ рдЬрд┐рд╕рдореЗрдВ рдЯреНрд░реА рдиреЛрдбреНрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ , рд╕рд╛рдЭрд╛ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ , рдЕрд░реНрдерд╛рддред рдПрдХ рд╕рдореВрд╣ рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдерд┐рдд рд╢рдмреНрджреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдПрдХ рд╣реА рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╕рдореВрд╣ рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рд╣рдо рдкреЗрдбрд╝ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдкрдбрд╝реЛрд╕реА рдзрд╛рдЧреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдореЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рдХрдИ рдмрд╛рд░ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рд╕реНрдореГрддрд┐ред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕реНрддрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрд░реАрдм рд╕реНрдореГрддрд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрд╛рдиреА
рдЬрдм рдкреЗрдбрд╝ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛрд░ рдХреЗ рдкрдбрд╝реЛрд╕реА рдзрд╛рдЧреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рдорд╛рди рдиреЛрдбреНрд╕ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрд╛рд░реАрдХреА рд╕реЗ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕рдЪрд░ рдореЗрдореЛрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд░реЛрдбрд╝рд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдмрдирд╛рд╡рдЯ рджреЛрд╣рд░реЗ рд╕рдЯреАрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ (рд╣рдо рд╕рд╣реА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди CUDA рдореЗрдВ рдПрдХ __hiloint2double рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдПрдХ рдбрдмрд▓-рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИредрдПрдХ рдмрдирд╛рд╡рдЯ рднрдВрдбрд╛рд░рдг рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдбрдмрд▓ рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХреЛрдб template<> struct nb1Dfetch<double> { typedef double4 vec4; static __device__ double fetch(cudaTextureObject_t tex, int i) { int2 p(tex1Dfetch<int2>(tex, i)); return __hiloint2double(py, px); } static __device__ vec4 fetch4(cudaTextureObject_t tex, int i) { int ii(2 * i); int4 p1(tex1Dfetch<int4>(tex, ii)); int4 p2(tex1Dfetch<int4>(tex, ii + 1)); vec4 d4 = {__hiloint2double(p1.y, p1.x), __hiloint2double(p1.w, p1.z), __hiloint2double(p2.y, p2.x), __hiloint2double(p2.w, p2.z) }; return d4; } };
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдП рдЧрдП рдереЗ, рдкреЗрдбрд╝ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ (рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб, рдЯреНрд░реА_рдХреНрд░рд┐рдЯ_рдЖрд░ 2) рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдиреЛрдб рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рдХрдо рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╣рд╛рд▓рдд r2> tree_crit_r2 [рд╡рдХреНрд░] рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ , рддреЛ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред CUDA рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ L1 рдХреИрд╢ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА ( cudaFuncSetCacheConfig ) рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ ред рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо L1 рдХреИрд╢ рдХреЛ рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВредCUDA рдХрд░реНрдиреЗрд▓ рдПрдХ рдкреЗрдбрд╝ рдХреА рдХрдЯрд╛рдИ рдХрд░рдХреЗ рддрд╛рдХрдд рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдХреНрд░рдо рдХреНрд░рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ) __global__ void kfcompute_heap_bh_tex(int offset_n1, int points_count, int tree_size, nbcoord_t* f, cudaTextureObject_t tree_xyzr, cudaTextureObject_t tree_mass, const int* body_n) { nb1Dfetch<nbcoord_t> tex; int tree_offset = points_count - 1 + NBODY_HEAP_ROOT_INDEX; int stride = points_count; int tn1 = blockDim.x * blockIdx.x + threadIdx.x + offset_n1 + tree_offset; int n1 = body_n[tn1]; nbvec4_t xyzr = tex.fetch4(tree_xyzr, tn1); nbcoord_t x1 = xyzr.x; nbcoord_t y1 = xyzr.y; nbcoord_t z1 = xyzr.z; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; int stack_data[MAX_STACK_SIZE] = {}; int stack = 0; int stack_head = stack; stack_data[stack++] = NBODY_HEAP_ROOT_INDEX; while(stack != stack_head) { int curr = stack_data[--stack]; nbvec4_t xyzr2 = tex.fetch4(tree_xyzr, curr); nbcoord_t dx = x1 - xyzr2.x; nbcoord_t dy = y1 - xyzr2.y; nbcoord_t dz = z1 - xyzr2.z; nbcoord_t r2 = (dx * dx + dy * dy + dz * dz); if(r2 > xyzr2.w) { if(r2 < NBODY_MIN_R) { r2 = NBODY_MIN_R; } nbcoord_t r = sqrt(r2); nbcoord_t coeff = tex.fetch(tree_mass, curr) / (r * r2); dx *= coeff; dy *= coeff; dz *= coeff; res_x -= dx; res_y -= dy; res_z -= dz; } else { int left = nbody_heap_func<int>::left_idx(curr); int rght = nbody_heap_func<int>::rght_idx(curr); if(left < tree_size) { stack_data[stack++] = left; } if(rght < tree_size) { stack_data[stack++] = rght; } } } f[n1 + 3 * stride] = res_x; f[n1 + 4 * stride] = res_y; f[n1 + 5 * stride] = res_z; }
рдПрдирд╡реАрдЯреАрдПрдл рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкреЗрдбрд╝ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рд╡рдЯ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдкрд░ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд╛рд░ рд╣реИредрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, CUDA рдореЗрдВ, 'рдЧрдгрдирд╛' рдкрддреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд╕реНрдЯреИрдХ рдЬреЛ рдкреЗрдбрд╝ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдЪрд┐рдк рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреИрдХ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ рд░рди рдереНрд░реЗрдб, рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереНрд░реЗрдб рд╣реИрдВредрд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреЗрдбрд╝ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд▓реЗ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рдХреА рдЧрдгрдирд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХреЛрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдХрд░реНрдиреЗрд▓, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИредрдПрдХ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреЗрдбрд╝ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдХреЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП CUDA рдХреЛрд░ __global__ void kfcompute_heap_bh_stackless(int offset_n1, int points_count, int tree_size, nbcoord_t* f, cudaTextureObject_t tree_xyzr, cudaTextureObject_t tree_mass, const int* body_n) { nb1Dfetch<nbcoord_t> tex; int tree_offset = points_count - 1 + NBODY_HEAP_ROOT_INDEX; int stride = points_count; int tn1 = blockDim.x * blockIdx.x + threadIdx.x + offset_n1 + tree_offset; int n1 = body_n[tn1]; nbvec4_t xyzr = tex.fetch4(tree_xyzr, tn1); nbcoord_t x1 = xyzr.x; nbcoord_t y1 = xyzr.y; nbcoord_t z1 = xyzr.z; nbcoord_t res_x = 0.0; nbcoord_t res_y = 0.0; nbcoord_t res_z = 0.0; int curr = NBODY_HEAP_ROOT_INDEX; do { nbvec4_t xyzr2 = tex.fetch4(tree_xyzr, curr); nbcoord_t dx = x1 - xyzr2.x; nbcoord_t dy = y1 - xyzr2.y; nbcoord_t dz = z1 - xyzr2.z; nbcoord_t r2 = (dx * dx + dy * dy + dz * dz); if(r2 > xyzr2.w) { if(r2 < NBODY_MIN_R) { r2 = NBODY_MIN_R; } nbcoord_t r = sqrt(r2); nbcoord_t coeff = tex.fetch(tree_mass, curr) / (r * r2); dx *= coeff; dy *= coeff; dz *= coeff; res_x -= dx; res_y -= dy; res_z -= dz; curr = nbody_heap_func<int>::skip_idx(curr); } else { curr = nbody_heap_func<int>::next_up(curr, tree_size); } } while(curr != NBODY_HEAP_ROOT_INDEX); f[n1 + 3 * stride] = res_x; f[n1 + 4 * stride] = res_y; f[n1 + 5 * stride] = res_z; }
GPU рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЙрди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рд░рдЬрд┐рд╕реНрдЯрд░, рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред рдЖрдкрдХреЛ рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп, рджреВрд╕рд░рд╛ рдереНрд░реЗрдб shader рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде, рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдЯрд╛рдЗрдо рдЧрдгрдирд╛рдУрдВ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХреЛрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдПрдирд╡реАрдбрд┐рдпрд╛ K80 рд╕реЗ рдЖрдзреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рддреБрд▓рдирд╛ рдХрд░реЗрдВредрддрд╛рд▓рд┐рдХрд╛ 5. рдЧрдгрдирд╛ рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) рдлрд╝рдВрдХреНрд╢рди рдХреА рдирд┐рд░реНрднрд░рддрд╛ fn GPU N=131072 ╬╗crit=10/ | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 |
---|
opencl+dense | 5.77 | 2.84 | 1.46 | 1.13 | 1.15 | 1.14 | 1.14 | 1.13 |
cuda+dense | 5.44 | 2.55 | 1.27 | 0.96 | 0.97 | 0.99 | 0.99 | - |
opencl+heap+cycle | 5.88 | 5.65 | 5.74 | 5.96 | 5.37 | 5.38 | 5.35 | 5.38 |
opencl+heap+nested | 4.54 | 3.68 | 3.98 | 5.25 | 5.46 | 5.41 | 5.48 | 5.31 |
cuda+heap+nested | 3.62 | 2.81 | 2.68 | 4.26 | 4.84 | 4.75 | 4.8 | 4.67 |
cuda+heap+nested+tex | 2.6 | 1.51 | 0.912 | 0.7 | 1.85 | 1.75 | 1.69 | 1.61 |
cuda+heap+nested+tex+stackless | 2.3 | 1.29 | 0.773 | 0.5 | 0.51 | 0.52 | 0.52 | 0.52 |
6. ( ) fn GPU N=1M ╬╗crit=4/ | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 |
---|
opencl+dense | 366 | 179 | 89.9 | 69.3 | 70.3 | 69.1 | 68.9 | 68.0 |
cuda+dense | 346 | 162 | 79.6 | 60.8 | 60.8 | 60.7 | 59.6 | - |
opencl+heap+cycle | 16.2 | 18.2 | 20.1 | 21.2 | 21.2 | 21.3 | 21.2 | 21.1 |
opencl+heap+nested | 10.5 | 7.63 | 6.38 | 8.23 | 9.95 | 9.89 | 9.65 | 9.66 |
cuda+heap+nested | 8.67 | 6.44 | 5.39 | 5.93 | 8.65 | 8.61 | 8.41 | 8.27 |
cuda+heap+nested+tex | 6.38 | 3.57 | 2.13 | 1.44 | 3.56 | 3.46 | 3.30 | 3.29 |
cuda+heap+nested+tex+stackless | 5.78 | 3.19 | 1.83 | 1.21 | 1.11 | 1.10 | 1.11 | 1.13 |
рдПрдХ рдХрдард┐рди рд╕реНрдерд┐рддрд┐, рд▓реЗрдХрд┐рди, рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд╕реАрдкреАрдпреВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдХреВрд▓рди рдХрджрдо рдореВрд░реНрдд рдкрд░рд┐рдгрд╛рдо рд▓рд╛рддрд╛ рд╣реИред рдкреВрд░реНрдг рд╕рдорд╛рд░реЛрд╣ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдЯреАрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 'рдУрдкреЗрдВрд╕реЗрд▓ + рд╣реАрдк + рдЪрдХреНрд░' рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдЧрднрдЧ 6 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИfn ред
'рдСрдкрдирдХрд▓ + рд╣реАрдк + рдиреЗрд╕реНрдЯреЗрдб' рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдХреА рдХрдЯрд╛рдИ рдкрдбрд╝реЛрд╕реА рдиреЛрдбреНрд╕ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1.4 рдЧреБрдирд╛ рддреЗрдЬ, рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢ рдореЗрдореЛрд░реА рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред + рдХреНрдпреВрдбрд╛ + рд╣реАрдк + рдиреЗрд╕реНрдЯреЗрдб тАЩрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрд▓ 1 рдХреИрд╢ рдХреЛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреА рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдЧрддрд┐ рдореЗрдВ 1.4 рдЧреБрдирд╛ рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рдереА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдбрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░реНрдиреЗрд▓ рдЕрдзрд┐рдХ рдЖрд╢рд╛рд╡рд╛рджреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛ (enc opencl + denseтАЩ рдФрд░ uda cuda рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ) + рдШрдиреЗ 'рдХреЛрд░ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдХреЛрдбрд╛ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд░реНрд╢рди ~ 1.2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ)ред рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧрддрд┐ (3.8 рдЧреБрдирд╛) рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рддрдм рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬрдм рдкреЗрдбрд╝ рдмрдирд╛рд╡рдЯ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЯреНрд░реА рдиреЛрдб рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред 'рдХреЛрдбрд╛ + рдвреЗрд░ + рдиреЗрд╕реНрдЯреЗрдб + рдЯреЗрдХреНрд╕ + рд╕реНрдЯреИрдХрд▓реЗрд╕' рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 1.4 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИредрдЗрд╕рдореЗрдВ, рдореЗрдореЛрд░реА рдмрд╕ рдХреЗ рдкреВрд░реЗ рдмреИрдВрдбрд╡рд┐рдбреНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЗ рд╕рд╛рде╬╗crit=10 рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреВрд░реНрдг рдЧрдгрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рдмрд╛рд░ рддреНрд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ fn ред рд▓реЗрдХрд┐рди
╬╗crit=10 рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рдмрдбрд╝реЗ рдореВрд▓реНрдп, рд╕реАрдкреАрдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рд╕реЗ рдЗрд╕рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА рдХреЗ рдЕрдиреБрдкрд╛рдд рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдКрд░реНрдЬрд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЧреНрд░рд╛рдл рдкрд░, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ╬╗critрд╕рдЯреАрдХрддрд╛ рдХреЗ рдПрдХ рджреГрд╢реНрдп рд╣рд╛рдирд┐ рдХреЗ рдмрд┐рдирд╛ред рдЪрд▓реЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ╬╗crit рдЗрд╖реНрдЯрддрдо рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
| 
|
рдХ) N=128K
| рдЦ) N=1M
|
рдЕрдВрдЬреАрд░ред 11. рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рд╕рдордп рдХреА рдирд┐рд░реНрднрд░рддрд╛ред fn рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА рдХреЗ рдЕрдиреБрдкрд╛рдд рд╕реЗ ( ╬╗crit ) рд╡рд┐рднрд┐рдиреНрди GPU рдЯреНрд░реА рд╡реЙрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП
|
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП ╬╗crit рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХреЗ рд╕рднреА рддрд░реАрдХреЗ fnрдирдЬрджреАрдХреА рдорд╛рдиреЛрдВ рдкрд░ рдЬрд╛рдПрдВ, рдХреЗрдбреА-рдкреЗрдбрд╝ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ GPU рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рдХреБрд▓ рд╕рдордп рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ╬╗critтЙд4, рддреЛ рдпрд╣ рд╕рдордп рдЙрдкреЗрдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХрдмN=128K рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд░ рд╕реЗ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ ╬╗crit=1024рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ GPU рдХреЗ рд╕рднреА рдзрд╛рдЧреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдкреЗрдбрд╝ рдХреЗ рдЪрдХреНрдХрд░ рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ, рдЬреЛ L1 рдХреИрд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ 'рд╢рд╛рдЦрд╛ рд╡рд┐рдЪрд▓рди' рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди (рдХреНрдпреВрдбрд╛ + рд╣реАрдк + рдиреЗрд╕реНрдЯреЗрдб + рдЯреЗрдХреНрд╕ + рд╕реНрдЯреИрдХрд▓реЗрд╕), рдпрд╣ рд▓рдЧрднрдЧ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред1.4тИТ1.5рдмрд╛рд░ред рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдИ рдмрд╛рд░ рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде GPU рдкрд░ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗредGeForce GTX 1080 Ti (рдПрдХрд▓ рд╕рдЯреАрдХрддрд╛) рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ7. ( ) fn GPU N=1M ╬╗crit=4/ | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 |
---|
opencl+dense | 47.8 | 23.4 | 11.6 | 11.59 | 12.8 | 12.8 | 12.8 | 12.8 |
cuda+dense | 49.0 | 23.8 | 11.9 | 11.8 | 11.7 | 11.7 | 11.7 | 11.7 |
opencl+heap+cycle | 7.48 | 8.26 | 7.73 | 7.36 | 7.33 | 7.27 | 7.25 | 7.26 |
opencl+heap+nested | 1.33 | 1.20 | 1.41 | 2.46 | 2.53 | 2.49 | 2.44 | 2.47 |
cuda+heap+nested | 1.23 | 1.10 | 1.31 | 2.28 | 2.29 | 2.28 | 2.23 | 2.25 |
cuda+heap+nested+tex | 0.88 | 0.68 | 0.654 | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 |
cuda+heap+nested+tex+stackless | 0.71 | 0.47 | 0.45 | 0.43 | 0.43 | 0.42 | 0.41 | 0.395 |

|
12. fn ( ╬╗crit ) GPU
|
рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП GeForce GTX 1080 Ti рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкреЗрдбрд╝ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдПрдХ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рджреЛ рдмрд╛рд░ рддрдХ рд╣реЛрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╣рдо рдЙрд╕ рд╕рдордп рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рддрдереНрдп рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ GPU рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПред 5-7 рдХреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХрд▓ рдЗрд╖реНрдЯрддрдо рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди GPU рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдгрдирд╛ рд╕рдордп рдЕрдВрддрд░ рдХрдИ рдмрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рд╕реАрдорд╛ рдорд╛рдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦреЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓рдВрдмреА рдЧрдгрдирд╛ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИредрдореБрдЦреНрдп рдЪреАрдЬ рдЬреЛ рд╣рдордиреЗ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ, рд╡рд╣ рдПрдХ рд▓рд╛рдЦ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдЬреЛрдбрд╝реАрджрд╛рд░ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ (220) рдПрдХ рдкрд░ рдПрдХ рдЙрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП, рдирд╡реАрдирддрдо GPU рдирд╣реАрдВред рдирдП GPU (рдЯреЗрд╕реНрд▓рд╛ V100) рдкрд░, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ рджреЛ рдорд┐рд▓рд┐рдпрди рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рдВрдЧ рдмреЙрдбреА рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЯреЗрд╕реНрд▓рд╛ K80 рдХреЗ рдЖрдзреЗ рд╕реЗ рд▓рдЧрднрдЧ рдЪрд╛рд░ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред рдпрджреНрдпрдкрд┐ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдмреМрдиреА рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рдЫреЛрдЯреЗ рдореИрдЧреЗрд▓реИрдирд┐рдХ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рднреА рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓рдиреАрдп рд╣реИ , рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рд╡рд┐рднреЗрджрдХ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбреЗрдб рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдордп рдХреА рд▓рд╛рдЧрдд рдкрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпреБрдЧреНрдордХ рдЖрдХрд░реНрд╖рдг рдмрд▓реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рд╣рдореЗрдВ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рдХреЙрд▓реЛрд╕рд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рддреАрди-рд╢рд░реАрд░ рдХрд╛рд░реНрдп" рд╕реЗ рдПрд▓рд┐рдпрдВрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВN рдирд┐рдХрд╛рдпреЛрдВ, рдФрд░ рд╢рд░реАрд░ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреВрд░реЗ рд╕реНрдЯрд╛рд░ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рдХреА рдХреАрдордд рдкрд░редрджреГрд╢реНрдп
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдВрдд рддрдХ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдореИрдВ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рд╡реАрдбрд┐рдпреЛ рджреВрдВрдЧрд╛редрджреЛ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛рдУрдВ рдХреЗ рдЯрдХрд░рд╛рдиреЗ рдХрд╛ рдЕрдиреБрдХрд░рдгред рдирд┐рдХрд╛рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ 60 рд╣рдЬрд╛рд░ рд╣реИредрдПрдХ рд▓рд╛рдЦ рддрд╛рд░реЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛ред рдХреЗрдВрджреНрд░ рдореЗрдВ рдХреБрд▓ 99% рджреНрд░рд╡реНрдпрдорд╛рди рд╡рд╛рд▓рд╛ рдПрдХ рдирд┐рдХрд╛рдп рд╣реИред рдПрдХрд▓ рдХрдг рд▓рдЧрднрдЧ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд░рд▓ рдХреА рдПрдХ рдмреВрдВрдж рдореЗрдВ рдПрдХ рд▓рд╣рд░ рдХреА рддрд░рд╣ред рдЧрддрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░рдВрдЧреАрдиред рдХрдо рдЧрддрд┐ - рдиреАрд▓рд╛, рдордзреНрдпрдо - рд╣рд░рд╛, рдЙрдЪреНрдЪ - рд▓рд╛рд▓ред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЗрдВрджреНрд░ рдореЗрдВ рдЧрддрд┐ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд┐рдирд╛рд░реЛрдВ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рднреВрдордзреНрдпрд░реЗрдЦреАрдп рддрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдоредрдПрдХ рд▓рд╛рдЦ-рд╕рд┐рддрд╛рд░рд╛ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ 'рдЧрддрд┐рд╢реАрд▓' рдЕрдиреБрдХрд░рдгред рдХреЗрдВрджреНрд░ рдореЗрдВ рдХреБрд▓ 10% рджреНрд░рд╡реНрдпрдорд╛рди рд╡рд╛рд▓рд╛ рдПрдХ рд╢рд░реАрд░ рд╣реЛрддрд╛ рд╣реИред рдХреЗрдВрджреНрд░реАрдп рдирд┐рдХрд╛рдп рдмрд╛рдХреА рдХреЛ рдХрд╛рдлреА рдХрдо рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рд╕рд┐рддрд╛рд░реЗ" рдЕрд▓рдЧ рдЙрдбрд╝рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдЗрдХрдЯреНрдард╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВредрдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд▓рдЧрднрдЧ 5% "рд╕рд┐рддрд╛рд░реЛрдВ" рдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред10 рд╡реЗрдВ рд╕реЗрдХрдВрдб рдореЗрдВ, рдпрд╣ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдЯрд╡реНрд╣реАрд▓ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛ рдЬреБрд▓рддрд╛ рд╣реИ редрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдЬреАрдердм рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред