рдкрд╛рдпрдерди рдореЗрдВ рдУрдкрдирд╕реАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛ рдордЬрдмреВрддреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рд▓реЗрдЦ рдЖрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЦреБрдж рдХреЛ рддрдХрдиреАрдХ рдХреЗ рд╕рддрд╣реА рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддрд╛ рд╣реВрдВред рдЬреАрдкреАрдЬреАрдкреАрдпреВ - рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЕрд░реНрдерд╛рддреНред рд╕реАрдзреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВред рдХреБрдЫ рдЖрдзреБрдирд┐рдХ рдЦреЗрд▓реЛрдВ рдореЗрдВ рднреМрддрд┐рдХреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдирд╡реАрдбрд┐рдпрд╛ рдлрд┐рдЬрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдпрд╣ рддрдХрдиреАрдХ рдЗрд╕ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдХрд┐ рдЬреАрдкреАрдпреВ рдХрдИ рдзрд╛рдЧреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдзрд╛рдЧреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрд╛рдлреА рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдПрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рд░реИрдо рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЯреНрд░рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: CUDA (Nvidia, рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП), OpenCL (рд╡рд┐рд╖рдо рд╕рдореВрд╣, рд╡рд┐рд╖рдо рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ AMD FireStream ред рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдУрдкрдирд╕реАрдПрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

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

рд╕реНрдерд╛рдкрдирд╛


рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдирд╡реАрдбрд┐рдпрд╛ рдХрд╛рд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП, OpenCL рдХрд╛ рд╕рдорд░реНрдерди CUDA SDK рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЕрднреА рддрдХ рдиреЛрд╡реНрдпреВ рдореЗрдВ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рд╣реИ, рдЬреАрдПрдирдпреВ / рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред ArchLinux рдХреЗ рд▓рд┐рдП, рдпреЗ рд╕рдВрдХреБрд▓ cuda-toolkit, cuda-sdk, nvidia, nvidia-utils, nvidia-opencl рд╣реИрдВред рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЗрдВрдЯреЗрд▓ рдУрдкрдирд╕реАрдПрд▓ рдПрд╕рдбреАрдХреЗ рд╣реИ, рдПрдПрдордбреА рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рдПрд╕рдбреАрдХреЗ рднреА рд╣реИред

CUDA SDK рдореЗрдВ oclDeviceQuery рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ OpenCL рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╕рдореБрджреНрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╕рдордЧреНрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬред

рдЕрдВрддрд┐рдо рдХреЙрд░реНрдб рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, NumPy рдФрд░, рджреВрд╕рд░реА рдмрд╛рдд, PyOpenCL рдХреЛ рд╕реНрд╡рдпрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреБрдЫ рдЕрднреНрдпрд╛рд╕ рдиреЛрдЯреНрд╕


рджрд░рдЕрд╕рд▓, рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣рд╛рд▓ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рдереАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдореИрдВ PyOpenCL рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ GPU рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдорд╛рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдкреНрд░рджрд░реНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╕реАрдкреАрдпреВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡реЗ рдереЛрдбрд╝реЗ рднрд╛рд░реА рд▓реЛрдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдмрд╣реБрдд рд╣рд▓реНрдХреЗ рдзрд╛рдЧреЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрдореЛрд░реА рдирд┐рдпрдВрддреНрд░рдХ рдХреЗрд╡рд▓ рдЗрд╕ рд╢рд░реНрдд рдкрд░ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ Gb / s рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреАрдкреАрдпреВ рдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдк рдбреЗрд░рд╛ рдбрд╛рд▓реЗ рд╣реБрдП рдЬрд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдЖрдк рд░реИрдо рдпрд╛ рдбрд┐рд╕реНрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рдПрдВрдЧреЗ, рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рддреАрд╕рд░рд╛, рд╕рд╢рд░реНрдд рдХреВрдж рдЕрдм рдмрд╣реБрдд рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдкреНрд░рд╛рд░рдВрдн


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

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реЛрд╕реНрдЯ рдХреЛрдб
import pyopencl as cl import numpy set_simple_args(model_params) set_device() create_buffers(np.array(particles, dtype=np.float64)) program = cl.Program(self.context, open('worker.cl').read()).build() def set_device(): device = cl.get_platforms()[settings.DEVICE_NUM].get_devices(getattr(cl.device_type, settings.CL_DEVICE))[0] context = cl.Context(devices=[device], dev_type=None) cqueue = cl.CommandQueue(self.context) def set_simple_args(mp): #       numpy #       ,   OpenCL   central_size = numpy.float64(mp['central size']) dt = numpy.float64(mp['dt']) skip = numpy.int32(mp['skip']) q_e = numpy.float64(mp['e charge']) q_i = numpy.float64(mp['ion charge']) ion_m = numpy.float64(mp['ion mass']) def create_buffers(particles): # particles -      mf = cl.mem_flags buf_particles_1 = cl.Buffer(self.context, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=particles) buf_particles_2 = cl.Buffer(self.context, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=particles) buf_charge = cl.Buffer(self.context, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=np.float64(0.0)) buf_q_e = cl.Buffer(self.context, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=np.int32(0.0)) buf_q_i = cl.Buffer(self.context, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=np.int32(0.0)) 

рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рд╕рд░рд▓" рддрд░реНрдХ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╡рд╛рдВрдЫрд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред settings.DEVICE_NUM - рдбрд┐рд╡рд╛рдЗрд╕ рдирдВрдмрд░, settings.CL_DEVICE - рдкреНрд░рдХрд╛рд░ (GPU, CPU рдпрд╛ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рджреЗрд╢реА)ред рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдмрдлрд╝рд░ рдЕрдм рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдЪрд░рдг рдХреЗрд╡рд▓ рд╕рд░рдгрд┐рдпреЛрдВ, рд╕рд╛рде рд╣реА рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдХрд░реНрдиреЗрд▓ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВред рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб)ред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд╕рдВрдХрд▓рдХ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдФрд░ рдЕрдиреНрдп рдмрдХрд╡рд╛рд╕ рднреА рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ export PYOPENCL_COMPILER_OUTPUT=1 .bashrc рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЗрдВрдЯреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдирд╡рд┐рдбрд┐рдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдпреВрдирд┐рдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИред рд╣рдорд╛рд░реЗ рддрд░реНрдХ рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рдлрд╝рдВрдХреНрд╢рди (__call __ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ)ред рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдирдпрд╛ рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рд╣реИред

рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рд╣реЛрд╕реНрдЯ рдХреЛрдб
 def iterate(): program.dust_plasma(cqueue, [global_size], None, buf_particles_1, buf_particles_2, buf_charge, buf_q_e, buf_q_i, q_e, q_i, ion_m, central_size, outer_boundary, dt, skip) output_particles, cur_charge = empty_particles, numpy.empty_like(numpy.float64(0.0)) #   output_particles   buf_particles_2 cl.enqueue_copy(cqueue, output_particles, buf_particles_2) cl.enqueue_copy(cqueue, cur_charge, buf_charge) return output_particles, cur_charge 

рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ OpenCL рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ C рдЬреИрд╕рд╛ рд╣реИ):

рдХрд░реНрдиреЗрд▓ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ
 __kernel void dust_plasma(__global double4* particles_1, //      __global double4* particles_2, //    __global double* dust_charge, __global int* charge_new_e, __global int* charge_new_i, __const double charge_e, __const double charge_i, //     __const double ion_mass, //   __const double central_size, // ,  __const double outer_boundary, //  __const double dt, __const unsigned skip) { int id = get_global_id(0); // ... for(unsigned i = 0; i < skip; i++) { //printf("Iteration %i\n", i); params.previous = &particles_1; params.next = &particles_2; one_iteration_rk2(&params); params.previous = &particles_2; params.next = &particles_1; one_iteration_rk2(&params); } barrier(CLK_GLOBAL_MEM_FENCE); // ... } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдмрд╣реБрдд рдкрд░реНрдпрд╛рдкреНрдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдЖрдк pyopencl@tiker.net рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рдХрд╛ рд╕рдореБрджрд╛рдп рдХрд╛рдлреА рдЬреАрд╡рдВрдд рд╣реИ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЙрджрд╛рд░ рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдУрдкрдирд╕реАрдПрд▓ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдореИрдиреБрдЕрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рд▓рд┐рдЦрдирд╛, рдЬреИрд╕рд╛ рдХрд┐ C99 рдореЗрдВ рд╣реИ, рдХрднреА-рдХрднреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП (рдпрджрд┐ рдХреБрдЫ рднреА, рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛) рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрддреНрддреАред рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ рдлреНрд▓реЛрдЯ 4 (рдПрдХ рдЪрд░ рдЬрд┐рд╕рдореЗрдВ 4 рдЕрд▓рдЧ рдлреНрд▓реЛрдЯ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ 4 рд╕реЗ рдЕрд▓рдЧ рдлрд╝реНрд▓реЛрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реИ)ред

рдореИрдВ рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░рд┐рдпрд╛рд╕ рдХреНрд▓реЛрдХрдирд░ рдирд╛рдо рдХреЗ PyOpenCL рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рднреА рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЕрдиреБрд░реЛрдз 1) рдкрд╛рда рдореЗрдВ рдЯрд╛рдЗрдкреЛрд╕ / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2) рдкреАрдПрдо рдореЗрдВред

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ




рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдлрд┐рдХреНрд╕реНрдб рдЯрд╛рдЗрдкреЛред

рд▓реЗрдЦ рдХрд╛ рдкрд╛рда рдПрдХ рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рдПрдЯреНрд░реАрдмреНрдпреВрд╢рди-рд╢реЗрдпрд░рдПрд▓рд╛рдЗрдХ 3.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ , рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯреНрд╕ - рдПрдордЖрдИрдЯреА рдХреЗ рддрд╣рдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реИ ред

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


All Articles