
рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд░реЗрдЦрд╛рдкреБрдВрдЬ рдкрд░ рдЬреБрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ, рдЬреЛ рдореИрдВрдиреЗ
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╣рд╛ рдерд╛ред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕реА рдЧрддрд┐ рдХрд╣рд╛рдБ рд╣реИ; рдЕрдм рд╣рдо рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП 4096 рддрдХ 4096 рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде "рдЯреВрдЯреЗрдВрдЧреЗ"ред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдФрд░ рдореВрд▓ рд╡рд┐рдзрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рд╢реЛрдз "рд╣рдо рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдЖрддрд╛ рд╣реИ"ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, CUDA рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ "рдмрд╣реБрдд рд╕рд░рд▓" рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп
рдмрд╛рдЗрдирд░реА рд░реИрд╕реНрдЯрд░ (рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд░рдВрдЧ рдХреЗрд╡рд▓ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рд╣реЛрддреЗ рд╣реИрдВ) рдкрд░ рд╕рднреА рдХрдиреЗрдХреНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗред рдмреЗрд╢рдХ, рдкрддреНрд░рд╛рдЪрд╛рд░ "рд░рдВрдЧ - рд╡рд╕реНрддреБ рд╕реВрдЪрдХрд╛рдВрдХ" рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдмрд┐рдВрджреБ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд▓рдВрдмрд╡рдд рдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ (рдЪрд╛рд░-рдЬреБрдбрд╝реЗ) рдкрдбрд╝реЛрд╕реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрда-рдЬреБрдбрд╝реЗ рдорд╛рдорд▓реЗ (рдпрд╣ рдореБрдЦреНрдп рдмрд╛рдд рдирд╣реАрдВ рд╣реИ) рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдЪрд┐рддреНрд░:

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рдмрдбрд╝реА рдЫрд╡рд┐рдпреЛрдВ (16384x16384 рддрдХ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдХреЗ рдкрд╛рда рдореЗрдВ рдХрдо рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ?
рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИ, рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреМрди рд╕реА рд╡рд┐рдзрд┐ рдЗрд╖реНрдЯрддрдо рд╣реЛрдЧреА, рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреНрдпрд╛ рд╕реАрдорд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рд╢реНрд░рдорд╕рд╛рдзреНрдпрддрд╛ рдХреНрдпрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХрднреА-рдХрднреА "рдмрд╣реБрдд рдЕрдзрд┐рдХ", рдЗрд╕рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдЦрд░рд╛рдм "рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛"
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рдХреЛрдб 8192x8192 рдХреА рдЫрд╡рд┐ рдкрд░ рдХрдм рддрдХ рдЪрд▓реЗрдЧрд╛:
for ( int x = 0; x < dims[0]; x++)
{
for ( int y = 0; y < dims[1]; y++)
{
image[x + dims[0]*y] = 0;
}
}
рд╣рд╛рдВ, рдЪрдХреНрд░ рдХреЛ рдПрдХ рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕реЗ "рдЕрдиреБрдХреВрд▓рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЙрдЪрд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддрд╛рдХрд┐ рдЕрдиреБрдХреНрд░рдордг рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕реЗ рдХреБрдЫ "рдФрд╕рдд" рдкреНрд░реЛрд╕реЗрд╕рд░ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрд░ 2 рдбреБрдУ E8400) рдкрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рд▓рдЧрднрдЧ
680-780 рдПрдордПрд╕ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдо рд╣реИ рдпрд╛ рдереЛрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рддреЗрдЬреА рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл рд▓рдЧрддрд╛ рд╣реИ; рдХреНрдпреЛрдВрдХрд┐ "рд╕рднреА рд╕рд╛рдзрди рдЕрдЪреНрдЫреЗ рд╣реИрдВ" рдФрд░ рдРрд╕реА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИрдВ; рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, CUDA рддрдХрдиреАрдХ, рдЬрд┐рд╕рдореЗрдВ рдЧрд╣рдирддрд╛ рд╕реЗ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП
рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИ, рд╣рдорд╛рд░реА рдмрд╣реБрдд рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рдФрд╕рдд GTX460 рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкрд░, рд╣рдореЗрдВ рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдЧрднрдЧ
40 рдЬреАрдмреА / рдПрд╕ рдмрдирд╛рдо
2 рдЬреАрдмреА / рдПрд╕ рдХреА рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧрддрд┐ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдорд╛рдирддрд╛ рдФрд░ рдХрд╛рдлреА рддреЗрдЬ рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИред
рдлреВрдЯ рдбрд╛рд▓реЛ рдФрд░ рдЬреАрддреЛ
рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рдЧрдгрдирд╛ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд╛рд░реНрдп рдХрд╛ рдкреГрдердХреНрдХрд░рдг рдХрд╛рдлреА рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдХреЛрдИ рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ, рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рддреЗрдЬ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдирд╣реАрдВ рд╣реИ, рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╣реИред
рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдЗрд╕реЗ рдЫреЛрдЯреЗ "рд╡рд░реНрдЧреЛрдВ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдпрд╣ CUDA рдЧрдгрдирд╛ рдореЙрдбрд▓ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ (рдЬреЛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
UID = threadIdx.x + blockDim.x * blockIdx.x
рддрдм рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рд╡рд╛рд╣ (рдпреВрдЖрдИрдбреА) рдХреЗ рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрдерд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рдВ, рд╣рдо рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХреЛ рддреЛрдбрд╝рдирд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП (рд░рдВрдЧреЛрдВ рдХрд╛ рджрдВрдЧрд╛ рд▓реЗрдЦрдХ рдХреА рд╢реИрд▓реА рд╣реИ, рдФрд░ рдврд╛рд▓ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдпреВрдЖрдИрдбреА рдЕрд▓рдЧ рд╣реИрдВ) рд╣рдо рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ рдореЗрдВ 32 x 32ред рдлрд┐рд░, рдХреБрдЫ рддреБрд▓реНрдпрдХрд╛рд▓рди рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИ
рдЧрдгрд┐рдд рдореЗрдВ, рдПрдХ рдЕрджреНрднреБрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: "рдпрджрд┐ рдХреБрдЫ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ", рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ "рдмрд╛рдж рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ" рдХреЛ "рдкреАрдЫреЗ" рдзрдХреЗрд▓ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ред
рд╣рдо рд╕рд░рд▓рддрдо
рдлрд╝рд┐рд▓реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░, рд╕реАрдорд╛ рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдЕрднреА рддрдХ рднрд░рд╛ рдирд╣реАрдВ рд╣реИ)ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЙрди рдЫрд╡рд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рднрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ:

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

рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдо рддрд╕реНрд╡реАрд░ рдореЗрдВ "рдЧреНрд░рд┐рдб" рдХреЗ рд╕рд╛рде рдЬреАрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ:

рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдмреЙрдХреНрд╕ рдХреЗ рднреАрддрд░, рдЬреБрдбрд╝реЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░ рдПрдХ рд░рдВрдЧ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВ, рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЕрд▓рдЧ рд╣реИрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП O (n ^ 3) рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рд╣рд╛рдВ, рдореИрдВрдиреЗ рдлрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдирд╛), рдЬрд┐рдирдореЗрдВ рд╕реЗ (imageSize.x / n) * (imageSize.y / n) рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдПрдХ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдзрд╛рдЧреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЖрдорддреМрд░ рдкрд░ рд▓рдЧрднрдЧ 256)ред
рдЖрд╕реНрдердЧрд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ
рдпрд╣ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░, рдЙрдкрдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рд╕реНрддреНрд░реАрдп рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧ рдПрдХ рд╣реА рдЬреБрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЧреНрд░рд┐рдб рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВ (рдЪрд┐рддреНрд░ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдлреЗрдж рд░рдВрдЧ рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдХреЗ рдкрд┐рдХреНрд╕рд▓ рддрддреНрдХрд╛рд▓ рдкрдбрд╝реЛрд╕реА рд╣реИрдВред рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рджреЛрдиреЛрдВ рд░рдВрдЧреЛрдВ рдХрд╛ рдЕрд░реНрде рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд)ред
рд╕рд░рд▓ рдЕрдВрдХрдЧрдгрд┐рдд рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд┐рдб рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдЫрд╡рд┐ рдХреА рдкрд░рд┐рдзрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ - рд╣рдореЗрдВ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрдирдХреА рд╕реАрдорд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рд░рдВрдЧ рдорд┐рд▓рд╛рди рдорд╛рдирдЪрд┐рддреНрд░ (c
1 == c
2 == c
3 ...) рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЧрддрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди
рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ "рдЕрдбрд╝рдЪрди" рдореБрдЦреНрдп рдореЗрдореЛрд░реА рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рд╣реИ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ:
START_ACTION( "Allocating GPU memory: image... " );
unsigned int * data_cuda;
cutilSafeCall( cudaMalloc(( void **)&data_cuda, data_cuda_size) );
END_ACTION(data_cuda_size);
START_ACTION( "Copying input data to GPU memory: image... " );
cutilSafeCall( cudaMemcpy(data_cuda, image, data_cuda_size, cudaMemcpyHostToDevice) );
END_ACTION(data_cuda_size);
рдкрд░рд┐рдгрд╛рдореА
2 рдЬреАрдмреА / рдПрд╕ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд░реИрдо рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЧрддрд┐ рд╣реИред рдЬрд┐рди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдпреЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реИрдВ, рдбрд░рд╛рд╡рдиреЗ рдирд╣реАрдВред
рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп):
START_ACTION( "Calling CUDA kernel... " );
cutilSafeCall( cudaThreadSynchronize() );
processKernelCUDA<<<GRID, THREADS>>>(data_cuda, dims[0], dims[1]);
cutilSafeCall( cudaThreadSynchronize() );
END_ACTION(data_cuda_size);
рдирд┐рд╖реНрдХрд░реНрд╖ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ:
Calling CUDA kernel... 26.377720 msecs.
Throughput = 2.36942 GBytes/s
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ (рдЫрд╡рд┐) рдХреЗ
рдХрдо рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, рд╕рднреА рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкреВрд░реНрддрд┐ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рднрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪреБрдирд╛, рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рдмрдирд╛рдпрд╛ред рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдЖрдк рддрдп рдХрд░реЗрдВ :)
рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛, рдХрдерди рд╕рдВрднрд╡рддрдГ рдЕрдзреВрд░рд╛ рд░рд╣реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдкреНрдпрд╛рд░ рдФрд░ рдЕрдиреБрдЧреНрд░рд╣ рдХрд░реЗрдВ:
__global__ void processKernelCUDA(unsigned int * image, int dim_x, int dim_y)
{
// Full task size: image dimensions
int TASK_SIZE = dim_x * dim_y;
// Max UID for full task (really count of 'quads')
int MAX_UID = TASK_SIZE / QUAD_SIZE / QUAD_SIZE;
// calculate UID by CUDA implicit parameters; WORKERS = GRID*THREADS
for ( int UID = threadIdx.x + blockDim.x * blockIdx.x; UID < MAX_UID; UID += WORKERS)
{
// count of quads for x-dimension
int quads_x = dim_x / QUAD_SIZE;
// current quad index form UID
int curr_quad_x = UID % quads_x;
int curr_quad_y = UID / quads_x;
// offset in global task
int offset = curr_quad_x * QUAD_SIZE + dim_x * curr_quad_y * QUAD_SIZE;
// id of 'color' to mark block, have to be >= 2
int COLOR_ID = 2 + UID;
do
{
// means that fill is not started yet
bool first_shot = true ;
// process quad starting with specified 'offset'
bool done_something;
do // fill step
{
done_something = false ;
for ( int local_y = 0; local_y < QUAD_SIZE; local_y++) // step by y
{
// calcluate point index in whole image
int start_x = offset + local_y * dim_x;
for ( int pos = start_x; pos < start_x + QUAD_SIZE; pos++) // step by x
{
if (image[pos] == 1) // is not marked with ID, is not blank
{
if ( first_shot /* start fill */ // else check neighbors:
|| image[pos-1] == COLOR_ID // x--
|| image[pos+1] == COLOR_ID // x++
|| local_y > 0 && image[pos-dim_x] == COLOR_ID // y--
|| local_y < QUAD_SIZE && image[pos+dim_x] == COLOR_ID ) // y++
{
image[pos] = COLOR_ID; // mark with ID
first_shot = false ; // fill already started
done_something = true ; // fill step does something
}
}
}
}
} while (done_something); // break if fill have no results
if (first_shot)
{
// no more work in this block, exit
break ;
}
else
{
// next iteration: restart block with different color ID
COLOR_ID += MAX_UID;
}
} while ( true );
}
}
рдЗрдирдкреБрдЯ рддрд╕реНрд╡реАрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдФрд░ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХреЗ рдЕрдВрджрд░ рддрд╕реНрд╡реАрд░ рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╣реИред рд╕рдмрд╕реИрдХ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╕рдмрд╕реНрдХреЙрдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд░реНрдЧ рдХреА рдСрдлрд╕реЗрдЯ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рднрд░рд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рд╕рдлрд▓рддрд╛ рдХрд╛ рд░рд╛рдЬ
рдмреЗрд╢рдХ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рдРрд╕реЗ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реЗ рдХрдо рд╕рдордп рдореЗрдВ рд╣рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ред рдФрд░ рднрд╛рдЧреНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдФрд░ рддрд░реНрдХ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛, рдЬрд┐рд╕рдиреЗ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рд╕реЗ рдХрдо рд╕рдордп рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо (рдкреНрд░рдХрд╛рд░) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред
рдкреБрдирд╢реНрдЪ рдПрдХ рдмрдбрд╝рд╛ рдЕрдиреБрд░реЛрдз, рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдХреЙрдкреА рди рдХрд░реЗрдВ рдФрд░ рдореЗрд░реА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рди рдХрд░реЗрдВ (рдореИрдВ рд╡рд┐рдзрд┐ рдХрд╛ рд▓реЗрдЦрдХ рд╣реВрдВ)ред