CUDA рдФрд░ рд░рд┐рдореЛрдЯ GPU

CUDA рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ Nvidia рд╕реЗ рд╣рд╛рде рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рд▓реИрдкрдЯреЙрдк рдкрд░ рдХреЛрдИ рдПрдирд╡реАрдбрд┐рдпрд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рди рд╣реЛ? рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?


рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ rCUDA (рд░рд┐рдореЛрдЯ CUDA) рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдПрдирд╡реАрдбрд┐рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╣реЛрдиреЗ рдкрд░ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдорд╢реАрди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕ рдкрд░ CUDA рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


TLDR

rCUDA (рд░рд┐рдореЛрдЯ CUDA) - рдПрдХ рдРрд╕рд╛ рдврд╛рдВрдЪрд╛ рдЬреЛ CUDA API рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд░рд┐рдореЛрдЯ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЙрдкрд▓рдмреНрдз рд╣реИред RCUDA рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп CUDA рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕рдВрдЧрддрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд╡рд┐рд╢реЗрд╖ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВред


RCUDA рдХреНрдпрд╛ рд╣реИ


rCUDA (рд░рд┐рдореЛрдЯ CUDA) рдПрдХ рдРрд╕рд╛ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ CUDA API рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк CUDA рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рдорд╢реАрди рдкрд░ рд╕реНрдерд┐рдд рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд▓реЗрдВрд╕рд┐рдпрд╛ рдХреЗ рдкреЙрд▓рд┐рдЯреЗрдХреНрдирд┐рдХ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп ( рдЖрд░рд╕реАрдпреВрдбреАрдП-рдЯреАрдо ) рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд ред


рдкреНрд░рддрд┐рдмрдВрдз


рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ GNU / Linux рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрд╡рд▓рдкрд░реНрд╕ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рд╕рдорд░реНрдерди рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред RCUDA, 18.03beta рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг, CUDA 5-8 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдЕрд░реНрдерд╛рдд CUDA 9 рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ CUDA рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕рдВрдЧрддрддрд╛ рдШреЛрд╖рд┐рдд рдХреАред


рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ


  1. рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ CUDA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдирд╛ рдЬрдм рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдпрд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХрд┐рд╕реА рд╣реЛрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реЛрддреА рд╣реИрдВред
  2. рдЕрд╕рддрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд▓реИрдкрдЯреЙрдкред
  3. рдХрдИ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб (рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЯреАрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд░реНрджреЗрд╢


рдкрд░реАрдХреНрд╖рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди


рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


рд╕рд░реНрд╡рд░:
Ubuntu 16.04, GeForce GTX 660


рдЧреНрд░рд╛рд╣рдХ:
рдЕрд╕рддрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЙрдмрдВрдЯреВ 16.04 рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиред


RCUDA рд╣реЛ рд░рд╣реА рд╣реИ


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


CUDA рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ CUDA рдЯреВрд▓рдХрд┐рдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рдПрдирд╡реАрдбрд┐рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рди рд╣реЛ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 8 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рд╕реЗ .run рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред


chmod +x cuda_8.0.61_375.26_linux.run ./cuda_8.0.61_375.26_linux.run 

рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рдЖрдкрдХреЛ рдПрдирд╡реАрдбрд┐рдпрд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, CUDA рдЯреВрд▓рдХрд┐рдЯ / usr / рд╕реНрдерд╛рдиреАрдп / рдХреЛрдбрд╛ / рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред CUDA рдирдореВрдиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


RCUDA рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╣рдорд╛рд░реЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдирдкреИрдХ рдХрд░реЗрдВрдЧреЗред


 tar -xvf rCUDA*.tgz -C ~/ mv ~/rCUDA* ~/rCUDA 

рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдкрд░ рдпреЗ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕рд░реНрд╡рд░ рдкрд░ rCUDA рдбреЗрдорди рд╢реБрд░реВ рдХрд░рдирд╛


 export PATH=$PATH/usr/local/cuda/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/home/<XXX>/rCUDA/lib/cudnn cd ~/rCUDA/bin ./rCUDAd 

рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде <XXX> рдмрджрд▓реЗрдВред рдпрджрд┐ рдЖрдк рд╡рд░реНрдмреЛрдЬрд╝ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ/rCUDAd -iv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗрдЯрдЕрдк


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


 export PATH=$PATH/usr/local/cuda/bin export LD_LIBRARY_PATH=/home/<XXX>/rCUDA/lib/:$LD_LIBRARY_PATH export RCUDA_DEVICE_COUNT=1 #    (),     export RCUDA_DEVICE_0=<IP  >:0 #     

рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рд▓реЙрдиреНрдЪ


рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


рдЙрджрд╛рд╣рд░рдг 1


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рдмрд╕ рдПрдХ рд╕рдВрдЧрдд рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП CUDA рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░рд┐рдореЛрдЯ GTX660 рд╣реИред


 cd <YYY>/NVIDIA_CUDA-8.0_Samples/1_Utilities/deviceQuery make EXTRA_NVCCFLAGS=--cudart=shared 

рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдмрд┐рдирд╛ EXTRA_NVCCFLAGS = - cudart = рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛
CUDA рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп CUDA рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдХреЗ рд╕рд╛рде <YYY> рдмрджрд▓реЗрдВред


рдЗрдХрдЯреНрдареЗ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдПрдВ:


 ./deviceQuery 

рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:


рдкрд░рд┐рдгрд╛рдо
 ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GTX 660" CUDA Driver Version / Runtime Version 9.0 / 8.0 CUDA Capability Major/Minor version number: 3.0 Total amount of global memory: 1994 MBytes (2090991616 bytes) ( 5) Multiprocessors, (192) CUDA Cores/MP: 960 CUDA Cores GPU Max Clock rate: 1072 MHz (1.07 GHz) Memory Clock rate: 3004 Mhz Memory Bus Width: 192-bit L2 Cache Size: 393216 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 660 Result = PASS 

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЬреЛ рд╣рдореЗрдВ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП:


Device0 = GeForce GTX 660
рдкрд░рд┐рдгрд╛рдо = рдкрд╛рд╕

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рд╣рдо рдПрдХ рдЕрд╕рддрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдорд╢реАрди рдкрд░ CUDA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред


рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдлреЙрд░реНрдо рдХреА рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:


 mlock error: Cannot allocate memory rCUDA warning: 1007.461 mlock error: Cannot allocate memory 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ "/etc/security/limits.conf" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


 * hard memlock unlimited * soft memlock unlimited 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ (*) рдЕрд╕реАрдорд┐рдд (рдЕрд╕реАрдорд┐рдд) рдЕрд╡рд░реБрджреНрдз рдореЗрдореЛрд░реА (рдореЗрдореЙрдХ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рд╡рд╛рдВрдЫрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде * рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдФрд░ рдЕрд╕реАрдорд┐рдд рдХреЗ рдмрдЬрд╛рдп рдХрдо рд╡рд╕рд╛ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред


рдЙрджрд╛рд╣рд░рдг 2


рдЪрд▓рд┐рдП рдЕрдм рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬреЗрд╢рди ("рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ CUDA рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА" рд╕реИрдВрдбрд░реНрд╕ рдЬреЗред рдХреЗрдВрдбреНрд░реЛрдЯ рдИред 5.3.1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕реАрдкреАрдпреВ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЖрдпрд╛рдо 33 * 1024 рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред


dotProd.cu
 #include <stdio.h> #define imin(a,b) (a<b?a:b) const int N = 33 * 1024; const int threadsPerBlock = 256; const int blocksPerGrid = imin(32, (N+threadsPerBlock-1) / threadsPerBlock); __global__ void dot(float* a, float* b, float* c) { __shared__ float cache[threadsPerBlock]; int tid = threadIdx.x + blockIdx.x * blockDim.x; int cacheIndex = threadIdx.x; float temp = 0; while (tid < N){ temp += a[tid] * b[tid]; tid += blockDim.x * gridDim.x; } // set the cache values cache[cacheIndex] = temp; // synchronize threads in this block __syncthreads(); // for reductions, threadsPerBlock must be a power of 2 // because of the following code int i = blockDim.x/2; while (i != 0){ if (cacheIndex < i) cache[cacheIndex] += cache[cacheIndex + i]; __syncthreads(); i /= 2; } if (cacheIndex == 0) c[blockIdx.x] = cache[0]; } int main (void) { float *a, *b, c, *partial_c; float *dev_a, *dev_b, *dev_partial_c; // allocate memory on the cpu side a = (float*)malloc(N*sizeof(float)); b = (float*)malloc(N*sizeof(float)); partial_c = (float*)malloc(blocksPerGrid*sizeof(float)); // allocate the memory on the gpu cudaMalloc((void**)&dev_a, N*sizeof(float)); cudaMalloc((void**)&dev_b, N*sizeof(float)); cudaMalloc((void**)&dev_partial_c, blocksPerGrid*sizeof(float)); // fill in the host memory with data for(int i=0; i<N; i++) { a[i] = i; b[i] = i*2; } // copy the arrays 'a' and 'b' to the gpu cudaMemcpy(dev_a, a, N*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, b, N*sizeof(float), cudaMemcpyHostToDevice); dot<<<blocksPerGrid, threadsPerBlock>>>(dev_a, dev_b, dev_partial_c); // copy the array 'c' back from the gpu to the cpu cudaMemcpy(partial_c,dev_partial_c, blocksPerGrid*sizeof(float), cudaMemcpyDeviceToHost); // finish up on the cpu side c = 0; for(int i=0; i<blocksPerGrid; i++) { c += partial_c[i]; } #define sum_squares(x) (x*(x+1)*(2*x+1)/6) printf("GPU - %.6g \nCPU - %.6g\n", c, 2*sum_squares((float)(N-1))); // free memory on the gpu side cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_partial_c); // free memory on the cpu side free(a); free(b); free(partial_c); } 

рдмрдирд╛рдПрдБ рдФрд░ рдЪрд▓рд╛рдПрдБ:


 /usr/local/cuda/bin/nvcc --cudart=shared dotProd.cu -o dotProd ./dotProd 

рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ:


GPU - 2.57236e + 13
CPU - 2.57236e + 13

рдЙрджрд╛рд╣рд░рдг 3


рдПрдХ рдФрд░ рдорд╛рдирдХ CUDA- рдореИрдЯреНрд░рд┐рдХреНрд╕рдореВрд▓рдХреНрд▓рд╛рд╕ рдкрд░реАрдХреНрд╖рдг (рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди) рдЪрд▓рд╛рдПрдБред


 cd < YYY>/NVIDIA_CUDA-8.0_Samples/0_Simple/matrixMulCUBLAS make EXTRA_NVCCFLAGS=--cudart=shared ./matrixMulCUBLAS 

рдкрд░рд┐рдгрд╛рдо

[рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХреБрдмреНрд▓рд╛рд╕] - рд╢реБрд░реВ ...
GPU рдбрд┐рд╡рд╛рдЗрд╕ 0: рдЧрдгрдирд╛ рдХреНрд╖рдорддрд╛ 3.0 рдХреЗ рд╕рд╛рде "GeForce GTX 660"


рдореИрдЯреНрд░рд┐рдХреНрд╕ (640,480), рдореИрдЯреНрд░рд┐рдХреНрд╕ (480,320), рдореИрдЯреНрд░рд┐рдХреНрд╕ (640,320)
CUBLAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо ... рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдкреНрд░рджрд░реНрд╢рди = 436.24 GFlop / s, рд╕рдордп = 0.451 msec, рдЖрдХрд╛рд░ = 196608000 рдСрдкреНрд╕
рд╣реЛрд╕реНрдЯ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо ... рдХрд┐рдпрд╛ рдЧрдпрд╛ред
CPU рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде CUBLAS рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: рдкрд╛рд╕


рдиреЛрдЯ: CUDA рдирдореВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдк рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред GPU рдмреВрд╕реНрдЯ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдо рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк:


рдкреНрд░рджрд░реНрд╢рди = 436.24 GFlop / s,
CPU рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде CUBLAS рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: рдкрд╛рд╕

рд╕реБрд░рдХреНрд╖рд╛


рдореБрдЭреЗ rCUDA рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рдЬреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдмрдВрджрд░рдЧрд╛рд╣ (8308) рддрдХ рдкрд╣реБрдВрдЪ рдЦреЛрд▓рдирд╛ рд╣реИред


Iptables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 iptables -A INPUT -m state --state NEW -p tcp -s < > --dport 8308 -j ACCEPT 

рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред


рд╕реНрд░реЛрдд рдФрд░ рд▓рд┐рдВрдХ

[рез] http://www.rcuda.net/pub/rCUDA_guide.pdf
[реи] http://www.rcuda.net/pub/rCUDA_QSG.pdf
[рей] рд╕реАред рд░реАрдиреЛ, рдПрдлред рд╕рд┐рд▓реНрд▓рд╛, рдЬреАред рд╢реАрдирд░ рдФрд░ рдПрд╕ред рд╢реБрд▓реНрддреНрд╕, "рдЗрдВрдЯрд░рдиреЗрд╢рдирд▓ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЙрдиреНрдлреНрд░реЗрдВрд╕, рд╡реИрдВрдХреВрд╡рд░, рдмреАрд╕реА, рдХрдирд╛рдбрд╛, рджрд┐рд╕рдВрдмрд░ реирежрезрел рдХреА рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдореЗрдВ EDR 100G InfiniBand рдХреЗ рд╕рд╛рде рд▓реЛрдХрд▓ рдФрд░ рд░рд┐рдореЛрдЯ GPU рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред
[рек] рд╕реАред рд░реАрдиреЛ рдФрд░ рдПрдлред рд╕рд┐рд▓рд╛, "рдПрдХ рдкреНрд░рджрд░реНрд╢рди рддреБрд▓рдирд╛ CUDA рд░рд┐рдореЛрдЯ GPU рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ", рдХреНрд▓рд╕реНрдЯрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рд╢рд┐рдХрд╛рдЧреЛ, рдЖрдИрдПрд▓, рдпреВрдПрд╕рдП, рд╕рд┐рддрдВрдмрд░ реирежрезрел рдХреЛ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рд╕рдореНрдореЗрд▓рди рдХреА рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдореЗрдВред

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


All Articles