GPU рдкрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рдирд┐рдХ-рд▓реМрдХрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдареАрдХ рджрд┐рди, рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдФрд░ рдореИрдВрдиреЗ рдирдП, рддрдм CUDA рддрдХрдиреАрдХ рдХреЛ рджреЗрдЦрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ GTX8800 рдкрд░ рдЙрд╕ рд╕рдордп рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдб рдерд╛, рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХреЗ рдХрд╛рд░реНрдп рднреА рдереЗред
рдЬрд┐рд╕рдиреЗ рднреА GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдХреНрд╡реЗрд░реА рдкреВрд▓рд┐рдВрдЧ, рдмреИрдВрдХ рд╕рдВрдШрд░реНрд╖ рдФрд░ рдЙрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк CUDA рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ [1] рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред GTX8800 рдХрд╛рд░реНрдб, рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдЕрдЪреНрдЫрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ CUDA рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдФрд░ рд╕рдорд░реНрдерд┐рдд рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рдерд╛ рдЬрдм рдмреИрдВрдХ рд╕рдВрдШрд░реНрд╖ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕рдВрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордп рдмрдврд╝ рдЧрдпрд╛ рд╣реИ рдмрд╛рд░ред рдпрд╣ рд╕рдм рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдирдП рдореЙрдбрд▓ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рдФрд░ рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди, рдХреИрд╢, рдбрд╛рдпрдиреЗрдорд┐рдХ рдХрдВрд╕реЗрдВрдЯрд░, рдЖрджрд┐ рджрд┐рдЦрд╛рдИ рджрд┐рдПред
рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рд╕реНрдкреЛрдЯ-рдЯреЗрдореНрдкреЛрд░рд▓ рдЗрдореЗрдЬ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреНрд╖рдорддрд╛ = 1.0 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдФрд░ рдирдП рдлреАрдЪрд░реНрд╕ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред
рд╕рдЯреАрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рджрдорди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдЧреНрд░рд╣реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдпрд╛ рдЕрдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддреА рд╣реИред



рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ


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

рдХрдИ рдкрд┐рдЫрд▓реЗ рдлрд╝реНрд░реЗрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдирдП рдЖрдЧрдорди рд╡рд╛рд▓реЗ рдлреНрд░реЗрдо рдХреЛ рд╕рдлреЗрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдлреНрд░реЗрдо рдкрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛, рдЙрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмрддрд╛ рджреЗрдВ рдХрд┐ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдлреНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ N рд╣реИ, рддреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдЕрдиреБрдорд╛рди рдХреЛ рдХреБрдЫ рд╡рдЬрд╝рди рдХреЗ рд╕рд╛рде рдлрд╝реНрд░реЗрдо рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧреБрдгрд╡рддреНрддрд╛ рдорд╛рдирджрдВрдб рдлреНрд░реЗрдо рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рд░реВрдк рд╣реИ:

рдирдореВрдирд╛ рд╕рд╣рд╕рдВрдмрдВрдз рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:

рдФрд░ рджрд╛рдИрдВ рдУрд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рд░реВрдк рд╣реИ:

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

рд╕рдВрджрд░реНрдн рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдлреНрд░реЗрдо рд╢рд┐рдлреНрдЯрд┐рдВрдЧ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрди рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреБрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ a (t) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

рдЬрд╣рд╛рдВ ╬▒ рдбрд┐рдЧреНрд░реА n рдХреЗ рдмрд╣реБрдкрдж рдХрд╛ рдЧреБрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, is рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рдЫреЛрдЯреА рдорд╛рддреНрд░рд╛ рд╣реИ, E рдкрд╣рдЪрд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред


GPU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рджреВрд╕рд░реА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред GPU рдкрд░, рд╕рдлреЗрдж рдлреНрд░реЗрдо рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдлреНрд░реЗрдо рдСрдлрд╝рд╕реЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реИред рдЬреНрдЮрд╛рдд рдкрд╛рд░рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╢реНрд╡реЗрддрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдп рд╣реИред
рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рд╕рд╣реА рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХрдорд┐рдпреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдо рддрдп рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝реНрд░реЗрдо рдХрд╛ рдПрдХ рдХреНрд░рдо рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GPU рдореЗрдореЛрд░реА рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЪреБрдиреЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ GPU рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред
float **h_array_list, **d_array_list; h_array_list = ( float** )malloc( num_arrays * sizeof( float* )); cudaMalloc((void**)&d_array_list, num_arrays * sizeof( float * )); for ( int i = 0; i < num_arrays; i++ ) cudaMalloc((void**)&h_array_list[i], data_size); cudaMemcpy( d_array_list, h_array_list, num_arrays * sizeof(float*), cudaMemcpyHostToDevice ); 


рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рде, рдПрдХ рдорд╛рдореВрд▓реА рджреЛрд╖ рд╣реИред рдпрджрд┐ рдЖрдк рдлреНрд░реЗрдо рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрдврд╝рддреЗ рд╣реИрдВ
 int bx = blockIdx.x; int by = blockIdx.y; int tx = threadIdx.x; int ty = threadIdx.y; int aBegin = nx * BLOCK_SIZE * by + BLOCK_SIZE * bx; float a = inFrame[ j ][ aBegin + nx * ty + tx] 

рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреНрд╖рдорддрд╛ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕рдВрдпреБрдХреНрдд рдирд╣реАрдВ рдереЗред

рдпрд╣ рдЕрдм рдПрдХ рдХреИрд╢ рд╣реИ рдФрд░ рдлрд╝реНрд░реЗрдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕рдореЗрдВ рдЬрдорд╛ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рдЗрди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА (рдЬреЛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ) рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд░реЗрдВ:
 float **h_array_list, **d_array_list; h_array_list = ( float** )malloc( 16 * num_arrays * sizeof( float* ) ); cudaMalloc((void**)&d_array_list, 16 * num_arrays * sizeof(float *)); for ( int i = 0; i < num_arrays; i++ ) { cudaMalloc((void**)&h_array_list[i*16], data_size); for( int j = 1; j < 16; j++ ) h_array_list[ i*16 + j ] = h_array_list[ i*16 ]; } cudaMemcpy( d_array_list, h_array_list, 16*num_arrays * sizeof(float*), cudaMemcpyHostToDevice ); 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╕рдВрдпреБрдХреНрдд рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдЧрддрд┐ рдореЗрдВ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗред
GPU рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдХреЛ рд╕рдлреЗрдж рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 __global__ void kernelWhite( float * out, float ** inFrame, float *at, int nx, int mem ) { int bx = blockIdx.x; int by = blockIdx.y; int tx = threadIdx.x; int ty = threadIdx.y; int aBegin = nx * BLOCK_SIZE * by + BLOCK_SIZE * bx; __shared__ float frame1 [BLOCK_SIZE][BLOCK_SIZE]; __shared__ float a [32]; int i = ty * BLOCK_SIZE + tx; //    if( i < mem ) a[ i ] = at[ i ]; __syncthreads (); frame1 [ty][tx] = 0; //         for( int j = 0; j < mem; j++ ) { frame1 [ty][tx] += a[ j ]*inFrame[ j*16 + tx ][ aBegin + nx * ty + tx]; } //   out [ aBegin + nx * ty + tx ] = inFrame[ mem*16 + tx ][ aBegin + nx * ty + tx] - frame1 [ty][tx]; } 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдо рдлреНрд░реЗрдо рдХреЛ рд╕рдлреЗрдж рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдЧреБрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдЗрди рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдлреНрд░реЗрдо рдХреЛ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдмреНрд▓реЙрдХ рдХреЛ рднреА рдирд╣реАрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд░реИрдЦрд┐рдХ рдПрдХ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдХреНрд░рдордг рдореЗрдВ рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред
рд╢рд┐рдлреНрдЯ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рдгреА [2] рдХреЗ рдпреЛрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЧреБрдгрд╛рдВрдХ рд░рд┐рдЬ, рдЬреАрдЖрдИрдЬ, рд╣рд┐рдЬ рдХреЛ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЙрдкрд░реЛрдХреНрдд рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреЛрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

__global__ рд╢реВрдиреНрдп рдХрд░реНрдиреЗрд▓рд╢рдлрд╝реНрдЯ (рдлрд╝реНрд▓реЛрдЯ * рдЗрдирдлреНрд░реИрдо, рдлрд╝реНрд▓реЛрдЯ * рдЗрдирдлрд╝реНрд░реИрдо, рдлрд╝реНрд▓реЛрдЯ * рдЖрдЙрдЯрдбреЗрдЯрд╛, рдЗрдВрдЯ рдПрдирдПрдХреНрд╕)
 __global__ void kernelShift ( float *inFrameR, float *inFrame, float *outData, int nx ) { int bx = blockIdx.x; int by = blockIdx.y; int tx = threadIdx.x; int ty = threadIdx.y; int aBegin = nx * BLOCK_SIZE * by + BLOCK_SIZE * bx; //        __shared__ float rij [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float gij [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float hij [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float tmp [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float p [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float q [BLOCK_SIZE*BLOCK_SIZE]; __shared__ float frame1 [BLOCK_SIZE][BLOCK_SIZE]; //    shared memeory frame1 [ty][tx] = inFrameR [ aBegin + nx * ty + tx]; //  __syncthreads (); int i = ty * BLOCK_SIZE + tx; //   gij, hij, rij   1414. if( tx > 0 && > 0 && tx < BLOCK_SIZEm1 && ty < BLOCK_SIZEm1 ) { gij[ i ] = ( frame1[ty + 1][tx] - frame1[ty - 1][tx] )/2.0; hij[ i ] = ( frame1[ty][tx + 1] - frame1[ty][tx - 1] )/2.0; rij[ i ] = ( frame1[ty][tx] + frame1[ty][tx + 1] + frame1[ty][tx - 1] + frame1[ty + 1][tx] + frame1[ty - 1][tx] )/5.0; } else { gij[ i ] = 0; hij[ i ] = 0; rij[ i ] = 0; } //  __syncthreads (); //    shared memeory frame1 [ty][tx] = inFrame [ aBegin + nx * ty + tx] - rij[i]; //  p, q p [i] = gij [i]*frame1 [ty][tx]; q [i] = hij [i]*frame1 [ty][tx]; //  u tmp [i] = hij [i]*hij [i]; //  v rij[i] = hij [i]*gij [i]; //  w hij [i] = gij [i]*gij [i]; __syncthreads (); for ( int s = BLOCK_SIZEhalfqrt; s > 32; s >>= 1 ) { if ( i < s ) { p [i] += p [i + s]; q [i] += q [i + s]; tmp [i] += tmp [i + s]; rij [i] += rij [i + s]; hij [i] += hij [i + s]; } __syncthreads (); } if ( i < 32 ) { p [i] += p [i + 32]; p [i] += p [i + 16]; p [i] += p [i + 8]; p [i] += p [i + 4]; p [i] += p [i + 2]; p [i] += p [i + 1]; q [i] += q [i + 32]; q [i] += q [i + 16]; q [i] += q [i + 8]; q [i] += q [i + 4]; q [i] += q [i + 2]; q [i] += q [i + 1]; tmp [i] += tmp [i + 32]; tmp [i] += tmp [i + 16]; tmp [i] += tmp [i + 8]; tmp [i] += tmp [i + 4]; tmp [i] += tmp [i + 2]; tmp [i] += tmp [i + 1]; rij [i] += rij [i + 32]; rij [i] += rij [i + 16]; rij [i] += rij [i + 8]; rij [i] += rij [i + 4]; rij [i] += rij [i + 2]; rij [i] += rij [i + 1]; hij [i] += hij [i + 32]; hij [i] += hij [i + 16]; hij [i] += hij [i + 8]; hij [i] += hij [i + 4]; hij [i] += hij [i + 2]; hij [i] += hij [i + 1]; } if ( i == 0 ) { outData [ by*gridDim.x + bx ] = p[0]; outData [ by*gridDim.x + bx + gridDim.x*gridDim.y] = q[0]; outData [ by*gridDim.x + bx + 2*gridDim.x*gridDim.y] = tmp [0]; outData [ by*gridDim.x + bx + 3*gridDim.x*gridDim.y] = rij [0]; outData [ by*gridDim.x + bx + 4*gridDim.x*gridDim.y] = hij [0]; } }; 


рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд▓рд╛рднрджрд╛рдпрдХ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╢рд┐рдлреНрдЯ рдХреА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдПрдХ рдХреЛрд░ рдлрд┐рд▓реНрдЯрд░ рдлреНрд░реЗрдо рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдФрд░ рдЖрдпрд╛рдо рдЬреЛрдбрд╝рдХрд░ рд╕рднреА рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдпрджрд┐ рдлреНрд░реЗрдо рдЫреЛрдЯрд╛ рд╣реЛред
 //    . int numbCoeff = regInfo->nx / threads.x*regInfo->nx / threads.y; cudaMemcpy( coeffhost, coeffdev, numbCoeff*5* sizeof ( float ), cudaMemcpyDeviceToHost ); float q = 0, p = 0; float u = 0, v = 0, w = 0; for( int i = 0; i < numbCoeff; i++ ) { p += coeffhost[ i ]; q += coeffhost[ i + numbCoeff]; u += coeffhost[ i + 2*numbCoeff]; v += coeffhost[ i + 3*numbCoeff]; w += coeffhost[ i + 4*numbCoeff]; } dx = ( q * w - p * v )/( u * w - v * v ); dy = ( p * u - q * v )/( u * w - v * v ); 


рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВред
1. рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдорд┐рд▓рддрд╛ рд╣реИред
2. рд╕рдВрджрд░реНрдн рдлреНрд░реЗрдо рд░рд┐рдЬ, рдЬреАрдЖрдИрдЬреЗ, рд╣рд┐рдЬ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдЖрдЗрдП рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдпреБрдХреНрдд рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВред
рдСрдлрд╕реЗрдЯ рдЦреЛрдЬ рдХрд░реНрдиреЗрд▓:
рдСрдлрд╕реЗрдЯ рдЦреЛрдЬ рдХреЛрд░ред
рд╕рдлреЗрдж рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓:
рд╡рд╛рдЗрдЯрдирд┐рдВрдЧ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ред

рдЙрддреНрдерд╛рди рдФрд░ рдЕрдиреБрдХреВрд▓рди


рдЪреВрдВрдХрд┐ рдкреБрд░рд╛рдирд╛ GTX8800 рдПрдХ рдЕрд▓рдЧ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдерд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣реАрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ GTX рдЯрд╛рдЗрдЯрди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реВрдВред
512x512 рдЖрдХрд╛рд░ рдХреЗ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╕рдордп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗред рдХрддрд░рдиреА рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрд░ 60 ╬╝s рд▓реЗрддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдЧреБрдгрд╛рдВрдХ рдФрд░ рдЕрдВрддрд┐рдо рдпреЛрдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 130 ╬╝ рдорд┐рд▓рддреЗ рд╣реИрдВред 20 рдлреНрд░реЗрдо рдХреА рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░рдорд╢рдГ 2.6 рдПрдордПрд╕ рд╣реИред рд╡рд╛рдЗрдЯрдирд┐рдВрдЧ рдлреНрд░реЗрдо рдХрд╛ рдХрд╛рд░реНрдп 156 ╬╝s рд▓реЗрддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИ, рдпрд╣ рдПрдХ рдФрд░ 50 ╬╝ рд╣реИред рдХреБрд▓ рдореЗрдВ, 2.806 рдПрдордПрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддрджрдиреБрд╕рд╛рд░, рд╕реАрдкреАрдпреВ рдкрд░, рдкрд╛рд░рд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдореЗрдВ 40 рдПрдордПрд╕ рд▓рдЧрддрд╛ рд╣реИ, рдлреНрд░реЗрдо 30 рдПрдордПрд╕ рдХреА рд╕рдлреЗрджреА рдФрд░ рдЕрдиреНрдп 50 ╬╝s рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рд╣реЛрддреА рд╣реИред рдХреБрд▓ рдореЗрдВ, рдпрд╣ 70 рдПрдордПрд╕ рдирд┐рдХрд▓рд╛, рдЬреЛ рдХрд┐ рдЬреАрдкреАрдпреВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 25 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред

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

рд╕рдВрд╢реЛрдзрд┐рдд рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 //       if ( i == 0 ) { atomicAdd( &outData[0], p[0] ); atomicAdd( &outData[1], q[0] ); atomicAdd( &outData[2], tmp[0] ); atomicAdd( &outData[3], rij[0] ); atomicAdd( &outData[4], hij[0] ); } //  CPU   float p = coeffhost[ 0 ]; float q = coeffhost[ 1 ]; float u = coeffhost[ 2 ]; float v = coeffhost[ 3 ]; float w = coeffhost[ 4 ]; dx = ( q * w - p * v )/( u * w - v * v ); dy = ( p * u - q * v )/( u * w - v * v ); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╕рдордп, 66 ╬╝s рд▓реЗрддрд╛ рд╣реИред

рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрд░реНрдиреЗрд▓ рд▓рд┐рдЦрдХрд░ рдХрдИ рд░рд┐рдЧрд┐рдВрдЧ рд░рд┐рдЬ, рдЬреАрдЖрдИрдЬреЗ, рд╣рд┐рдЬ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рддреАрди рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрджрд░реНрдн рдлреНрд░реЗрдо рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рддреАрди рдлреНрд░реЗрдо рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╢рд┐рдлреНрдЯреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреЛрд░ рдХреЗ рдЕрдВрджрд░ рдлреНрд░реЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд▓реВрдк рдмрдирд╛рдХрд░ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдерд╛ рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдИ рдмрд╛рд░ рдЧреБрдард▓реА рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЧреБрдард▓реА рдЖрдо рддреМрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддреНрд╡рд░рдг 25 рдЧреБрдирд╛ рддрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВрдЧреЗ:


GPU рдкрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд╕рдордп рдХреА рдПрдХ рдЫреЛрдЯреА рдЕрд╡рдзрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдХреА рдХреА рджреЗрд░реА, рдореЗрдореЛрд░реА рдФрд░ рдЕрдиреНрдп рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рди рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, 11.5 рдПрдордПрд╕ рд╕рднреА рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛рд╡ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕реАрдкреАрдпреВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд╡рд░рдг рдХреЗрд╡рд▓ 6 рдЧреБрдирд╛ рдерд╛ред рд╣рдо рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЧреБрдард▓реА рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд▓реВрдк рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
 for( int j = 0; j < regressInfo->memory - 1; j++ ) kernelShift<<< SKblocks, SKthreads >>> ( тАж ); 


рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд╕реНрд╡реАрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред


рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реБрдЖ, рдареАрдХ рд╣реИ? .. рдЕрдм рдкрд╛рд▓реА рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╣рд┐рд╕реНрд╕рд╛ 11.5 рдПрдордПрд╕ рдХреЗ рдмрдЬрд╛рдп 1.40 рдПрдордПрд╕ рд▓реЗрддрд╛ рд╣реИред 4 ╬╝ рдХреЗ рдмрд░рд╛рдмрд░ рдХреЛрд░ рдХреЗ рдмреАрдЪ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдВрддрд░рд╛рд▓ рдмрдирд╛ рд░рд╣рд╛, рдЬреЛ рдПрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдм рдЪрд▓реЛ рд╡рд┐рднрд┐рдиреНрди рдзрд╛рдЧреЗ рдореЗрдВ рдЧреБрдард▓реА рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
 // stream for( int it = 0; it < 4; it++ ) cudaStreamCreate( &streamTX[it] ); тАжтАж for( int j = 0; j < regressInfo->memory - 1; j++ ) kernelShift<<< SKblocks, SKthreads, 0, streamTX[j%4] >>> (тАж); 


рдЕрдм рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдРрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдЕрдВрддрд░рд╛рд▓ 1.22 рдПрдордПрд╕ рд╣реИред



рдФрд░ рдпрд╣ 0.66 рдПрдордПрд╕ рд╕реЗ 0.066 * 20 = 1.320 рд╕реЗ рднреА рдХрдо рд╣реИред
рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб 84% рд╣реИред



рдирддреАрдЬрддрди, рдХреБрд▓ рд╕рдордп 1.22ms + 50 ╬╝s + 156 ╬╝s = 1.426 ms рд╣реИ, рдЬреЛ CPU рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 50 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред
рдмреЗрд╢рдХ, рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд░ рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрдХреВрд▓рди рдорд╛рд░реНрдЧ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдорд╛рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрдо рдХрд░рдХреЗ рдирд╣реАрдВ рдЖрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк GPU рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди GPU рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдХрд░реНрдиреЗрд▓ рдХреЛ рдЬрд┐рддрдирд╛ рдХрдо рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░рд╛рд▓ рдЙрддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реАрдкреАрдпреВ рдкрд░ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИред

рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░рд┐рдгрд╛рдо


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд░реЛрдВ рд╡рд╛рд▓реЗ рдЖрдХрд╛рд╢ рдХреА рддрд╕реНрд╡реАрд░реЗрдВ рд▓реА рдЧрдИрдВ, рдПрдХ рдордВрдж рдордВрдж рд╡рд╕реНрддреБ, рдЫреЛрдЯреЗ рдХрдВрдкрди рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╢реЛрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ:

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж:

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ:

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж:


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдлрд╝реНрд░реЗрдо рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрд╣реБрдд рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЦреБрдж рдХреЗ рдмрд╛рдж рдирд┐рд╢рд╛рди рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкрд╛рдардХреЛрдВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА, рддреЛ рдореИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред

PS рдореБрдЭреЗ рдПрдХ рд╡рд╛рдЗрдб-рдПрдВрдЧрд▓ рдХреИрдорд░рд╛ рд╕реЗ 4GB 10Mpix рдлреНрд░реЗрдо рдорд┐рд▓рд╛ред рдореИрдВ рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

1. CUDA рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
2. CUDA рдкрд░ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред

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


All Articles