
рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣рдордиреЗ рдирдИ рд╕реЗрд▓реЗрдЧрд▓ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА -
рдПрдлрдкреАрдЬреАрдП рддреНрд╡рд░рдХ рдкрд░ рдХреНрд▓рд╛рдЙрдб-рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдирдП рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдлреНрд░реИрдЧрд▓ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЧрдгрд┐рддреАрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдлрдкреАрдЬреАрдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд╛рдирддреЗ рд╣реИрдВред рд▓реЗрдЦ рдиреЗ
рдпреВрд▓рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдЧреНрд░рджреВрдд
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЫ рд╢рдмреНрджред рдПрдХ FPGA рддреНрд╡рд░рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░рдгрд╛рд▓реА - рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ PCIe рдПрдбреЗрдкреНрдЯрд░ рд╣реИ, рдЬреЛ F64A рдЪрд┐рдк рдХреЗ рд╕рд╛рде x64 рд╕рд░реНрд╡рд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдПрдХреНрд╕реЗрд▓реЗрд░реЗрдЯрд░ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ x64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рдорд╛рдг рдХреЗ рдХрдИ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ x64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ 100 рд╣рдЬрд╛рд░ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдПрдХ FPGA рдкрд░ 100 рд╣рдЬрд╛рд░ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдгрдирд╛ рдЪрдХреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рддрддреНрд╡, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд╕рд╛рдзрди, рд╕рдВрдЪрд╛рд░ рд▓рд┐рдВрдХ, FPGA рдЪрд┐рдкреНрд╕ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕рд┐рд▓рд┐рдХреЙрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд╕рд┐рд▓рд┐рдХреЙрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдЬрд┐рд╕рд╕реЗ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╛рдореВрд▓реА рдмрд┐рдЬрд▓реА рдХреА рдЦрдкрдд рд╣реЛрддреА рд╣реИред
рдЖрдЬ, FPGA рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рджрд╣рд▓реАрдЬ рднреА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд▓рдн рд╣реИ - FPGA рддреНрд╡рд░рдХ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ (SDK) рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рдЙрдЪрд┐рдд рдореВрд▓реНрдп (рддрдерд╛рдХрдерд┐рдд "рдХреНрд▓рд╛рдЙрдб BPGA") рдХреЗ рд▓рд┐рдП Selectel рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдХрд┐рд░рд╛рдП рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ FPGA рдореЗрдВ рдУрдкрди CL рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ C рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, FPGA рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддреИрдпрд╛рд░ рдФрд░ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЧреЗ рджреЗрдЦреЗрдВ: рдХрд╛рдо рдкрд░ FPGA рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдореИрдВрдбреЗрд▓рдмреНрд░реЛрдЯ рд╕реЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрдпрди
рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдИ рднреА рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреЛрдб рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪрдпрдирдХрд░реНрддрд╛ Intel Arria 10 FPGA рддреНрд╡рд░рдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрд╡рд░ рддрдХ рджреВрд░рд╕реНрде рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, OpenCL рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ, рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдХреЗ рдФрд░ рдмреАрдПрд╕рдкреА рдЯреВрд▓, рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб (рд╕рд░реНрд╡рд░ рдХреЗ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рддреИрдирд╛рдд рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛрдИ рд▓рд╛рдЧреВ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕рдорд╛рдирддрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд╡рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдкрд╛рдардХ FPGA рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдо рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдорд╛рд░реНрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрджреНрдпрддрди : 2018 рдХреЗ рд╡рд╕рдВрдд рдореЗрдВ, рдЗрдВрдЯреЗрд▓ рдиреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдкреНрд░реЛрд╕реЗрд╕рд░ Xeon Gold 6138P рдХреЛ рдПрдХреАрдХреГрдд Arria 10 FPGA рдЪрд┐рдк рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ред 2018 рдХреЗ рдЕрдВрдд рддрдХ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрдВрдЯреЗрд▓ рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рд╕реЗрд▓реЗрд▓ рдореЗрдВ рд╣рдо рдЗрд╕ рдЪрд┐рдк рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдЕрджреНрд╡рд┐рддреАрдп рдирдП рдЙрддреНрдкрд╛рдж рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
FPGA рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП OpenCL рдорд╛рдирдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
OpenCL рдорд╛рдирдХ рдХреЛ рдХреНрд░реЛрдиреЛрд╕ рдЧреНрд░реБрдк рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рджреБрдирд┐рдпрд╛ рдХреА рдкреНрд░рдореБрдЦ рдЪрд┐рдк рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЗрдВрдЯреЗрд▓, рдПрдПрдордбреА, рдПрдкреНрдкрд▓, рдПрдЖрд░рдПрдо, рдПрдирд╡реАрдбрд┐рдпрд╛, рд╕реЛрдиреА рдХрдВрдкреНрдпреВрдЯрд░ рдПрдВрдЯрд░рдЯреЗрдирдореЗрдВрдЯ рдФрд░ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ FPGA рд╕рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред OpenCL рдорд╛рдирдХ рдореЗрдВ C99 рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд C тАЛтАЛрдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ (C99 рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг ISO / IEC 9899: 1999 / Cor 3: 2007 рд╕реЗ 2007-11-15) рдФрд░ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░рд┐рд╡реЗрд╢ рд╣реИред
рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЦреБрд▓рд╛ рдорд╛рдирдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдУрдкрдирд╕реАрдПрд▓ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдмреНрд░рд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╣реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
OpenCL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: Habr рдкрд░ OpenCL рдХрд╛ рдкрд░рд┐рдЪрдп ред
рдереЛрдбрд╝рд╛ рд╕рд╛ рдЗрддрд┐рд╣рд╛рд╕ - FPGA рдбрд┐рдЬрд╛рдЗрди рдорд╛рд░реНрдЧ рдЬреЛ рдУрдкрдирд╕реАрдПрд▓ рдорд╛рдирдХ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдерд╛, рдмреЗрд╣рдж рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдерд╛, рдЬрдмрдХрд┐ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рдХрд╕реНрдЯрдо-рдЪрд┐рдк рдбрд┐рдЬрд╛рдЗрди (рдПрдПрд╕рдЖрдИрд╕реА, рдПрдкреНрд▓рд┐рдХреЗрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреАрдХреГрдд рд╕рд░реНрдХрд┐рдЯ, "рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдпреЛрдЬрди рдПрдХреАрдХреГрдд рд╕рд░реНрдХрд┐рдЯ") рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдерд╛ред FPGA рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЧрд╣рди рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ (HDL) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рд╕рддреНрдпрд╛рдкрди рдорд╛рд░реНрдЧ рдХрд╛ рдХрдмреНрдЬрд╝рд╛ рдПрдХ рдРрд╕реА рдХрд▓рд╛ рд░рд╣реА рд╣реИ, рдЬреЛ рдЪрд░рдо рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕реАрдорд┐рдд рджрд╛рдпрд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
FPGAs рдХреЗ рд▓рд┐рдП рдЗрдВрдЯреЗрд▓ рдХреЗ OpenCL рд╕рдорд░реНрдерди рдЯреВрд▓рдХрд┐рдЯ рдХреЗ рдЖрдЧрдорди рдиреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП FPGA рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдкрд╣реБрдВрдЪ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдФрд░ рд╕реА рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рддреЛ FPGA рдХреЗ рд▓рд┐рдП рдЗрдВрдЯреЗрд▓ рдУрдкрдирд╕реАрдПрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рдЗрдирд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреНрд╡рд░рдХ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдЪрд┐рдд рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдпрд╛ рдорд╛рдирдХ gcc рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд░рдХрд╛рд░ рдХрд╛ред Exe, рдореБрдЦреНрдп x64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд), рдЬрдмрдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдорд░реНрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдПрд╕рдбреАрдХреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ FPGA рдлрд░реНрдорд╡реЗрдпрд░ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЛ рдЪрд┐рдк рдХреЛрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд▓реНрдкрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
FPGA (FPGA) рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд░рд┐рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдмрд▓ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓рд╛рдЦреЛрдВ рддрд░реНрдХ рддрддреНрд╡, рд╣рдЬрд╛рд░реЛрдВ рдбреАрдПрд╕рдкреА рд╕рд┐рдЧреНрдирд▓ рдЗрдХрд╛рдЗрдпрд╛рдВ рдФрд░ рдСрди-рдмреЛрд░реНрдб рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рджрд╕рд┐рдпреЛрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ рдХреИрд╢, рд╕рд░реНрд╡рд░ рдХреЗ рдореБрдЦреНрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рд╣реИрдВред рдлрд╛рд╕реНрдЯ I / O рдЗрдВрдЯрд░рдлреЗрд╕ (10GE, 40GE, 100GE, PCIe Gen 3, рдЖрджрд┐) рдЖрдкрдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдореБрдЦреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
OpenCL рдорд╛рдирдХ рд╡рд┐рд╖рдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИред рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:
- рд╣реЛрд╕реНрдЯ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ - рд╕рд░реНрд╡рд░ рдХреЗ рдореБрдЦреНрдп рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬреЛ C / C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ OpenCL API рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣реЛрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕реНрд░реЛрдд рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ FPG рддреНрд╡рд░рдХ рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддрд╛ рд╣реИред
- рддреНрд╡рд░рдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ - рдУрдкрдирд╕реАрдПрд▓ рд╕реА рднрд╛рд╖рд╛ (рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕реА рднрд╛рд╖рд╛) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдЬрд┐рд╕реЗ рдПрдлрдкреАрдЬреАрдП рдЪрд┐рдк рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд░реНрд╡рд░ рдПрдХ x64- рдЖрдзрд╛рд░рд┐рдд рдХрдВрдкреНрдпреВрдЯрд░ (рд╣реЛрд╕реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ FPGA рддреНрд╡рд░рдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ PCI-Express рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ Selectel Lab рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
FPGA рддреНрд╡рд░рдХ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рд╕рдВрдХрд▓рди рдЕрдиреБрдХреНрд░рдо рджреЛ рдЪрд░рдгреЛрдВ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, * .exe) рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдПрдХ рдорд╛рдирдХ рд╕рдВрдХрд▓рдХ (рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реА ++, рдЬреАрд╕реАрд╕реА) рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред FPGA рддреНрд╡рд░рдХ (рдХрд░реНрдиреЗрд▓, рдХрд░реНрдиреЗрд▓) рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ AOC рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ SDK рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ (* .aocx) рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рд╣реЛрддреА рд╣реИред рдпрд╣ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдл рдПрдХреНрд╕реАрд▓рд░реЗрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред

рдЕрдВрдЬреАрд░ред OpenCL рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдВрдХрд▓рди рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рдмрдбрд╝реЗ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
(
рдкреАрдПрд╕ рдкрд┐рдпрд╛рдиреЛрд╡рд╛рджрдХ рдХреЛ рдЧреЛрд▓реА рдордд рдЪрд▓рд╛рдирд╛ - рдЗрд╕рдХреЗ рдмрд╛рдж рдпреВрд▓рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ):
void inc (float *a, float c, int N) { for (int i = 0; i<N; i++) a[i] = a[i] + c; } void main() { ... inc(a,c,N); ... }
_kernel void inc (_global float *a, float c) { int i = get_global_id(0); a[i] = a[i] + c; } void main() { ... clEnqueueNDRangeKernel(...,&N,...) ... }
рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрдб рдЗрд╕ рдмрд╛рдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕реА рдореЗрдВ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдХреЗрд▓рд░ рддрддреНрд╡реЛрдВ рдХреА рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЧрдгрдирд╛ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ FPGA рддреНрд╡рд░рдХ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ OpenCL рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд▓реВрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЧрдгрдирд╛ рд▓реВрдк рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИред рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╕рд░рдгреА рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрди рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдкреА рдХрд╛ рдЕрдкрдирд╛ рдЗрдВрдбреЗрдХреНрд╕ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд▓реВрдк рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╣реЛрд╕реНрдЯ рд╕реЗ рд░рд┐рдЯреНрд░реАрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред Itter рдХреНрд░рд┐рдпрд╛ get_global_id () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ 0 тЙд рдЗрдВрдбреЗрдХреНрд╕ <N рдХреЗ рднреАрддрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╛рдПрдВ: рдПрдХ рднрдЧреНрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдореИрдВрдбреЗрд▓рдмреНрд░реЙрдЯ рд╕реЗрдЯ рдЬрдЯрд┐рд▓ рд╡рд┐рдорд╛рди рдкрд░ "рд╕реА" рдЕрдВрдХ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Z0 = 0 рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдмрдВрдз Zn + 1 = Zn 1 + c рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╣рдо Zn = Zn + IYn, рдФрд░ c = p + iq рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ:
Xn + 1 = Xn┬▓ + Yn + + p
Yn + 1 = 2XnYn + q
рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╕реЗрдЯ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреА рдЧрдгрдирд╛ рд╕рдореАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ
Xn X + Yn┬▓ <4ред
рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдореИрдВрдбреЗрд▓рдмреНрд░реЛрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рдпрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рдпрджрд┐ рдЕрд╕рдорд╛рдирддрд╛ рдХрд┐рд╕реА рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд░рд╣рддреА рд╣реИ, рддреЛ рдмрд┐рдВрджреБ рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдпрджрд┐ рдЕрд╕рдорд╛рдирддрд╛ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореВрд▓реНрдп n = N рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░рдВрдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЗрдЬрдмрд╛рди рдкрд░ рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:
- рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ mandel_pixel () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред
- рдЫрд╡рд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЧрдгрдирд╛ рдХреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░рдХреИрд▓рд┐рдХреЗрдЯрдлреНрд░реЗрдо () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░рд╛рд▓, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд░рдг рдФрд░ рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд░рдВрдЧ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ (Width * theHight) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
- рдбреЙрдЯ рдХреЗ рд░рдВрдЧ рдХреЛSoftColorTable рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:
inline unsigned int mandel_pixel( double x0, double y0, unsigned int maxIterations ) { // variables for the calculation double x = 0.0; double y = 0.0; double xSqr = 0.0; double ySqr = 0.0; unsigned int iterations = 0; // perform up to the maximum number of iterations to solve // the current point in the image while ( xSqr + ySqr < 4.0 &&iterations < maxIterations ) { // perform the current iteration xSqr = x*x; ySqr = y*y; y = 2*x*y + y0; x = xSqr - ySqr + x0; // increment iteration count iterations++; } // return the iteration count return iterations; }
int softwareCalculateFrame( double aStartX, double aStartY, double aScale, unsigned int* aFrameBuffer ) { // temporary pointer and index variables unsigned int * fb_ptr = aFrameBuffer; unsigned int j, k, pixel; // window position variables double x = aStartX; double y = aStartY; double cur_x, cur_y; double cur_step_size = aScale; // for each pixel in the y dimension window for ( j = 0, cur_y = y; j < theHeight; j++, cur_y -= cur_step_size ) { // for each pixel in the x dimension of the window for ( cur_x = x, k = 0; k< theWidth; k++, cur_x += cur_step_size ) { // set the value of the pixel in the window pixel = mandel_pixel(cur_x, cur_y, theSoftColorTableSize); if ( pixel == theSoftColorTableSize ) *fb_ptr++ = 0x0; else *fb_ptr++ = theSoftColorTable[pixel]; } } return 0; }
рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред FPGA рддреНрд╡рд░рдХ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ SIMD рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреИрд▓реЗрдЯ рд╕реЗ рд░рдВрдЧ рдХреЛрдб рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг)ред рдЫрд╡рд┐ рдмрдлрд╝рд░ рдкрд░ рджреЛ рдиреЗрд╕реНрдЯреЗрдб рдЫреЛрд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдкрд░реЗрд╢рди (Width * theHight) рдЪрд▓рд╛рдХрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдиреАрдЪреЗ рджреА рдЧрдИ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЛ рд╡рд░реНрдХ-рдЖрдЗрдЯрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдкреЗрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ __kernel рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
- рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ - рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред
- рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкрд╣рд▓реЗ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рднреМрддрд┐рдХ рдЧреНрд░рд┐рдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдиреЛрдбреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдЫрд╡рд┐ рдХреЗ рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред
- рдЪреМрдерд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдордВрдбреЗрдмреНрд░реЛрдЯ рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓реВрдкрд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдкрд╛рдВрдЪрд╡рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдЙрдЯрдкреБрдЯ рд░рдВрдЧ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред
- __Global рдХреАрд╡рд░реНрдб рдореЗрдореЛрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдлрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдпрд╣ рддреНрд╡рд░рдХ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп DDR (QDR) рдореЗрдореЛрд░реА рд╣реИред
- рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХреАрд╡рд░реНрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдмрдлрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рджреЗрддрд╛ рд╣реИред
- 6 рд╡реЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рдкреИрд▓реЗрдЯ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- __Constant рдХреАрд╡рд░реНрдб, рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ рдмрдлрд░ рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред
рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг x64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд░реАрдм рд╣реИред рдпрд╣рд╛рдВ, рд╡рд░реНрддрдорд╛рди рдХрд░реНрдиреЗрд▓ рдЙрджрд╛рд╣рд░рдг рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ get_global_id рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдпрд╛рдо рд╕рдВрдЦреНрдпрд╛ (0, 1) рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП, рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рд▓реВрдк рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдмреНрд▓реЙрдХ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдПрдХ рдПрдХреНрд╕реАрд▓рд░реЗрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд┐рдк рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ "рдкреАрдЫреЗ рдореБрдбрд╝рдХрд░ рджреЗрдЦрдирд╛" рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ FPGA рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрдХреНрд░ред
//////////////////////////////////////////////////////////////////// // mandelbrot_kernel.cl : Hardware implementation of the mandelbrot algorithm //////////////////////////////////////////////////////////////////// // Amount of loop unrolling. #ifndef UNROLL #define UNROLL 20 #endif // Define the color black as 0 #define BLACK 0x00000000 __kernel void hw_mandelbrot_frame ( const double x0, const double y0, const double stepSize, const unsigned int maxIterations, __global unsigned int *restrict framebuffer, __constant const unsigned int *restrict colorLUT, const unsigned int windowWidth) { // Work-item position const size_t windowPosX = get_global_id(0); const size_t windowPosY = get_global_id(1); const double stepPosX = x0 + (windowPosX * stepSize); const double stepPosY = y0 - (windowPosY * stepSize); // Variables for the calculation double x = 0.0; double y = 0.0; double xSqr = 0.0; double ySqr = 0.0;</code> <code>unsigned
OpenCL рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП Intel FPGA SDK рдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдЬрдмрд╛рди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреВрд░реНрд╡-рд╕реНрдерд╛рдкрд┐рдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ, рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд╡рд░рдХ рдмреЛрд░реНрдб рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдмреАрдПрд╕рдкреА (рдмреЛрд░реНрдб рд╕рдкреЛрд░реНрдЯ рдкреИрдХреЗрдЬ) рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, Intel Quartus Prime Pro 16.1 рдХреЛ OpenCL рдФрд░ BSP рдХреЗ Euler рдереНрд░реЗрдб рдПрдХреНрд╕реАрд▓реЗрд░реЗрдЯрд░ (Intel Arria 10) рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрде рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИред рдЪрд░ ALTERAOCLSDKROOT рдореЗрдВ рдЗрдВрдЯреЗрд▓ FPGA SDK рдХрд╛ рдкрде рд╣реИ, рдЪрд░ AOCL_BOARD_PACKAGE_ROOT рдореЗрдВ рддреНрд╡рд░рдХ BSP рдХреЗ рд▓рд┐рдП рдкрде рд╕рдорд╛рд╣рд┐рдд рд╣реИред
set ALTERAOCLSDKROOT=C:\intelFPGA_pro\16.1\hld set AOCL_BOARD_PACKAGE_ROOT=C:\intelFPGA_pro\16.1\hld\board\euler_thread set path=%path%;C:\intelFPGA_pro\16.1\hld\bin set path=%path%;C:\intelFPGA_pro\16.1\quartus\bin64 set path=%path%;C:\intelFPGA_pro\16.1\hld\board\a10_ref\windows64\bin set path=%path%;C:\intelFPGA_pro\16.1\hld\host\windows64\bin set path=%path%;C:\intelFPGA_pro\16.1\qsys\bin set path=%path%;C:\Program Files (x86)\GnuWin32\bin\
рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП, рдПрд╕рдбреАрдХреЗ рд╕реЗ рдПрдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
aoc mandelbrot_kernel.cl -o mandelbrot_kernel.aocx --board thread -v -v --report
рд╣рдо рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВ: mandelbrot_kernel.cl - рд╕реНрд░реЛрдд рдкрд╛рда рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓, mandelbrot_kernel.aocx - рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ FPGA, рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ - BSP рдкреИрдХреЗрдЬ рд╕реЗ рддреНрд╡рд░рдХ рдХрд╛ рдирд╛рдоред --Report рд╕реНрд╡рд┐рдЪ рдПрдХ FPGA рд╕рдВрд╕рд╛рдзрди рдЙрдкрдпреЛрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред -V рд╕реНрд╡рд┐рдЪ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рд░рд┐рдкреЛрд░реНрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
+ ------------------------------------------------- ------------------- +
; рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд╕рд╛рдзрди рдЙрдкрдпреЛрдЧ рд╕рд╛рд░рд╛рдВрд╢;
+ ---------------------------------------- + -------- ------------------- +
; рд╕рдВрд╕рд╛рдзрди + рдЙрдкрдпреЛрдЧ;
+ ---------------------------------------- + -------- ------------------- +
; рддрд░реНрдХ рдЙрдкрдпреЛрдЧ; 49%;
; ALUTs; 26%;
; рд╕рдорд░реНрдкрд┐рдд рддрд░реНрдХ рд░рдЬрд┐рд╕реНрдЯрд░; 25%;
; рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ; 21%;
; рдбреАрдПрд╕рдкреА рдмреНрд▓реЙрдХ; 16%;
+ ---------------------------------------- + -------- -------------------;
рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Microsoft SDK 7.1 рд╕реНрдерд╛рдкрд┐рдд Microsoft Visual Studio 2010 рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, x64 рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдмрд╛рд╣рд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯреЗрд▓ FPGA рдПрд╕рдбреАрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ = $ (ALTERAOCLSDKROOT) \ host \ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ;
рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ = $ (AOCL_BOARD_PACKAGE_ROOT) \ windows64 \ lib;
$(ALTERAOCLSDKROOT)\host\windows64\lib;
рддреНрд╡рд░рдХ рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧреА:
- рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ;
- рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд▓реЛрдб рдХрд░реЗрдВ;
- рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЗрдирдкреБрдЯ рдмрдлрд╝рд░реНрд╕ рднреЗрдЬреЗрдВ;
- рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдЪрд▓рд╛рдПрдВ;
- рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдкрдврд╝реЗрдВ;
- рдореБрдХреНрдд рд╕рдВрджрд░реНрднред
рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕реАрдзреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рддреЛ, рдПрдХ рдХреЛрд░ рдЫрд╡рд┐ рдХреЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рдПрди рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрди рдЫрд╡рд┐ рдореЗрдВ рдкрд┐рдХреНрд╕рд▓ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдиреАрдЪреЗ, рд╣рдо рдорд╛рдорд▓реЗ рдХреЛ рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╕рд░реНрд╡рд░ рдореЗрдВ рдХрдИ рддреНрд╡рд░рдХ рдмреЛрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдп рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЗрдЯрд░ рдореЗрдВ, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдлрд╝рд╛рдЗрд▓ mandelbrot_kernel.aocx)ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рддреНрд╡рд░рдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реИ, рдФрд░ рдЫрд╡рд┐ рд░реЗрдЦрд╛рдПрдВ рд╕рднреА рддреНрд╡рд░рдХ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ:
#define MAXDEV 10 static cl_context theContext; static cl_program theProgram; static cl_kernel theKernels[MAXDEV]; //.. // Create the program object theProgram = createProgramFromBinary( theContext, "mandelbrot_kernel.aocx", theDevices, numDevices); // Create the kernels for ( unsigned i = 0; i < numDevices; ++i ) theKernels[i] = clCreateKernel( theProgram, "hw_mandelbrot_frame", &theStatus ); // Create output pixel buffers for every kernel for( unsigned i = 0; i < numDevices; ++i ) thePixelData[i] = clCreateBuffer(theContext, CL_MEM_WRITE_ONLY, thePixelDataWidth*rowsPerDevice[i]*sizeof(unsigned int), NULL, &theStatus); // Preparing and writing palette buffer to every device theHardColorTable = clCreateBuffer(theContext, CL_MEM_READ_ONLY, aColorTableSize*sizeof(unsigned int), NULL, &theStatus); for( unsigned i = 0; i < numDevices; i++ ) theStatus = clEnqueueWriteBuffer(theQueues[i], theHardColorTable, CL_TRUE, 0, aColorTableSize*sizeof(unsigned int), aColorTable, 0, NULL, NULL); // Preparing kernels and run unsigned rowOffset = 0; for ( unsigned i = 0; i < numDevices; rowOffset += rowsPerDevice[i++] ) { // Create ND range size size_t globalSize[2] = { thePixelDataWidth, rowsPerDevice[i] }; // Set the arguments unsigned argi = 0; theStatus = clSetKernelArg (theKernels[i], argi++, sizeof(cl_double), (void*) &aStartX ); const double offsetedStartY = aStartY - rowOffset * aScale; theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_double), (void*)&offsetedStartY); theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_double), (void*)&aScale); theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_uint), (void*)&theHardColorTableSize); theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_mem), (void*)&thePixelData[i]); theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_mem), (void*)&theHardColorTable); theStatus = clSetKernelArg(theKernels[i], argi++, sizeof(cl_uint), (void*)&theWidth); // Launch kernel theStatus = clEnqueueNDRangeKernel(theQueues[i], theKernels[i], 2, NULL, globalSize, NULL, 0, NULL, NULL); } rowOffset = 0; for( unsigned i = 0; i < numDevices; rowOffset += rowsPerDevice[i++] ) { // Read the output theStatus = clEnqueueReadBuffer(theQueues[i], thePixelData[i], CL_TRUE, 0, thePixelDataWidth*rowsPerDevice[i]*sizeof(unsigned int), &aFrameBuffer[rowOffset * theWidth], 0, NULL, NULL); } / / . .
- CreateProgramFromBinary рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ OpenCL рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
- рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- ThePixelData рдмрдлрд╝рд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
- рдПрдХ рдкреИрд▓реЗрдЯ рдХреЛ рд░рдВрдЧ рдкреИрд▓реЗрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддреНрд╡рд░рдХ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдХрд░реНрдиреЗрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдмрдВрдзрди clSetK рдЧрд┐рд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрдХрд╛рд░ рд╕рд░рдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдерд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдп рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рд░рдгреА рдПрдХ-, рджреЛ- рдпрд╛ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╣реЛ рд╕рдХрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП, рдПрдХ рдЖрдпрд╛рдо рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ рдЖрдпрд╛рдо рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдп-рд╡рд╕реНрддреБ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдкрд┐рдХреНрд╕реЗрд▓ рдкрдВрдХреНрддрд┐ рддрддреНрд╡ рд╣реИ, рджреВрд╕рд░рд╛ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдЫрд╡рд┐ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕реЗрдЯ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ, рд▓рд╛рдЗрди рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдирдВрдмрд░ get_global_id (0) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рд╛рдЗрди рдирдВрдмрд░ get_global_id (1) рд╣реИред GlobalSize рдЪрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП clEnqueueNDRangeKernel рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдкрд┐рдХреНрд╕реЗрд▓ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлрд╝реНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ - рдкрд░рд┐рдгрд╛рдо рд╕реЗрд▓реЗрдЯрд▓рдЯреЗрдХрдбреЗ рд╕рдореНрдореЗрд▓рди ( рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рджреЗрдЦреЗрдВ ) рдкрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рджрд░реНрд╢рди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ FPGA рддреНрд╡рд░рдХ рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдкрд░рд┐рдорд╛рдг рдХреЗ рдХреНрд░рдо рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рд╕реАрдорд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдЙрджрд╛рд╣рд░рдг рдХрд╛ FPGA рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИред
рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдЦрди - рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ - рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдЧреВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдЙрдЪреНрдЪ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ FPGA рдЪрд┐рдк рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░ рдХреЗрд╡рд▓ рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреА рд╣реИред рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡реИрд╕реЗ, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореЙрдбрд▓ рдЖрдкрдХреЛ рд╣реЛрд╕реНрдЯ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ FPGA рддреНрд╡рд░рдХ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдорд╣рдВрдЧрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред
рд╣реЛрд╕реНрдЯ (рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рддреНрд╡рд░рдХ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛) рдФрд░ рдХрдорд╛рдВрдб рдХрддрд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдПрдХ рдПрдХрд▓ рд╣реЛрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬрд┐рд╕рдореЗрдВ FPGA рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХреЗрдВрджреНрд░ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рддреНрд╡рд░рдХ рдкрд░ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
KERNEL1 => рд╕рд╣рд╛рдпрдХ рдП
KERNEL2 => рд╕рд╣рд╛рдпрдХ рдмреА
рдлрд┐рд░ рднреА, FPGA рдПрдХреНрд╕реЗрд▓реЗрд░реЗрдЯрд░ рдХреЛ рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ - рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдпрд╣ рддрдХрдиреАрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛрддреА рдЬрд╛ рд░рд╣реА рд╣реИ: рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧрдгрд┐рдд рдФрд░ рднреМрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдореЗрдВ рджреВрд░рд╕рдВрдЪрд╛рд░, рдЬреИрд╡ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА, рдмрд┐рдЧ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛, рд╕рд┐рдЧреНрдирд▓ рдФрд░ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧред
рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
www.altera.com рдЗрдВрдЯреЗрд▓ FPGA рдХреЛрд░ рд╕рдВрд╕рд╛рдзрди рд╣реИред
www.eulerproject.com рдпреВрд▓рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реИред
рдПрд▓реНрдЯрд░ + рдУрдкрдирд╕реАрдПрд▓: рд╣рдо рд╡реАрдПрдЪрдбреАрдПрд▓ / рд╡реЗрд░рд┐рд▓реЛрдЧ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдПрдлрдкреАрдЬреАрдП рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рддреЗ рд╣реИрдВ - рд╣реИрдмрд░ рдкрд░ рдПрдХ рд▓реЗрдЦред