์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
CUDA | |
์ต์ ๋ฒ์ | 11.2.0 2020๋ 12์ ์ ๋ฐ์ดํธ |
์น์ฌ์ดํธ | |
1. ๊ฐ์[ํธ์ง]
Compute Unified Device Architecture
NVIDIA๊ฐ ๋ง๋ ๋ณ๋ ฌ ์ปดํจํ ํ๋ซํผ ๋ฐ API ๋ชจ๋ธ๋ก, ๋ณดํต '์ฟ ๋ค'๋ผ๊ณ ๋ฐ์ํ๋ค. CUDA ํ๋ซํผ์ GPU ์ ๊ฐ์ ๋ช ๋ น์ด์ ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ์ํํธ์จ์ด ๋ ์ด์ด์ด๋ฉฐ, NVIDIA๊ฐ ๋ง๋ CUDA ์ฝ์ด๊ฐ ์ฅ์ฐฉ๋ GPU์์ ์๋ํ๋ค.
2006๋ 11์์ G80 ๋ง์ดํฌ๋ก์ํคํ ์ฒ์ ํจ๊ป ์ฒ์ ๋ฐํ๋ ํ, 2007๋ 6์ 23์ผ์ CUDA SDK๊ฐ ์ฒ์ ๋ฐฐํฌ๋์๋ค. ์ด๊ธฐ์๋ C, C++๋ง ์ง์ํ์ง๋ง 10์ฌ ๋ ์ด ์ง๋ ์ง๊ธ์ ํฌํธ๋์ด๋ C# ๋ฑ ๋ค์ํ ์ธ์ด์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ฒ์ ์ ๋ณด๋ ์ด๊ณณ์์ ํ์ธํ ์ ์๋ค.
์๋ก์ด ๋ง์ดํฌ๋ก์ํคํ ์ฒ ํน์ ์๋ก์ด GPU๊ฐ ๋์ฌ ๋๋ง๋ค CUDA Compute Capability๊ฐ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ์ค๋๋ GPU์ ๊ฒฝ์ฐ CUDA Compute Capability๊ฐ ๋ฎ์์ ์ผ๋ถ CUDA ๊ธฐ๋ฐ ์์ฉํ๋ก๊ทธ๋จ๊ณผ ํธํ์ด ์๋ ์ ์์ผ๋, ๊ณผ๊ฑฐ์ ๊ฐ๋ฐ๋ CUDA ๊ธฐ๋ฐ ์์ฉํ๋ก๊ทธ๋จ์ ์ต์ GPU์์๋ ์ ์๋ํ๋ค. ๋ํ, CUDA๊ฐ ๋๋๋๋ฉด์ 2007๋ ์ GPGPU ์ ์ฉ์ธ TESLA[1] ์ ํ๊ตฐ ์ด ๋์๋๋ฐ, TESLA ์ ํ๊ตฐ์ ECC ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค์ด๊ฐ์ ์ค๋ฅ ๋ฐ์ ํ๋ฅ ์ ๋ฎ์ถฐ์ฃผ๊ณ GeForce์์ ์ฐ์ด๋ ๊ฐ์ ์ํคํ ์ฒ ์นฉ์ ์ด๋ผ๋ ์ถ๊ฐ ๋ช ๋ น์ด ๋ช ๊ฐ๋ฅผ ๋ ์ง์ํ๋ค. ๋ค๋ง ์ฐจ์ธ๋ ์ํคํ ์ฒ์ GeForce์์ ์ด์ ์ธ๋์ CUDA ๋ช ๋ น์ด๋ฅผ ์ ๋ถ ํก์ํ์ฌ ์ง์ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ต์ GeForce ์ ํ์ ์จ๋ ์ด์ ์ธ๋์ Tesla ์ ์ฉ ๋ช ๋ น์ด๋ฅผ ์ธ ์ ์๋ค.
GPU์ ๋ฐ๋ฅธ CUDA Compute Capability๋ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ฉฐ, ์๋๋ ์ํคํ ์ฒ ๋๋ GPU๋ณ๋ก ๋๋ต์ ์ผ๋ก ์ ๋ํ์๋ค. CUDA SDK ๋ฒ์ ๊ณผ๋ ๋ค๋ฅด๋ฏ๋ก ๊ตฌ๋ถํ ๋ ์ฃผ์ํ ๊ฒ.
NVIDIA๊ฐ ๋ง๋ ๋ณ๋ ฌ ์ปดํจํ ํ๋ซํผ ๋ฐ API ๋ชจ๋ธ๋ก, ๋ณดํต '์ฟ ๋ค'๋ผ๊ณ ๋ฐ์ํ๋ค. CUDA ํ๋ซํผ์ GPU ์ ๊ฐ์ ๋ช ๋ น์ด์ ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ์ํํธ์จ์ด ๋ ์ด์ด์ด๋ฉฐ, NVIDIA๊ฐ ๋ง๋ CUDA ์ฝ์ด๊ฐ ์ฅ์ฐฉ๋ GPU์์ ์๋ํ๋ค.
2006๋ 11์์ G80 ๋ง์ดํฌ๋ก์ํคํ ์ฒ์ ํจ๊ป ์ฒ์ ๋ฐํ๋ ํ, 2007๋ 6์ 23์ผ์ CUDA SDK๊ฐ ์ฒ์ ๋ฐฐํฌ๋์๋ค. ์ด๊ธฐ์๋ C, C++๋ง ์ง์ํ์ง๋ง 10์ฌ ๋ ์ด ์ง๋ ์ง๊ธ์ ํฌํธ๋์ด๋ C# ๋ฑ ๋ค์ํ ์ธ์ด์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ฒ์ ์ ๋ณด๋ ์ด๊ณณ์์ ํ์ธํ ์ ์๋ค.
์๋ก์ด ๋ง์ดํฌ๋ก์ํคํ ์ฒ ํน์ ์๋ก์ด GPU๊ฐ ๋์ฌ ๋๋ง๋ค CUDA Compute Capability๊ฐ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ์ค๋๋ GPU์ ๊ฒฝ์ฐ CUDA Compute Capability๊ฐ ๋ฎ์์ ์ผ๋ถ CUDA ๊ธฐ๋ฐ ์์ฉํ๋ก๊ทธ๋จ๊ณผ ํธํ์ด ์๋ ์ ์์ผ๋, ๊ณผ๊ฑฐ์ ๊ฐ๋ฐ๋ CUDA ๊ธฐ๋ฐ ์์ฉํ๋ก๊ทธ๋จ์ ์ต์ GPU์์๋ ์ ์๋ํ๋ค. ๋ํ, CUDA๊ฐ ๋๋๋๋ฉด์ 2007๋ ์ GPGPU ์ ์ฉ์ธ TESLA[1] ์ ํ๊ตฐ ์ด ๋์๋๋ฐ, TESLA ์ ํ๊ตฐ์ ECC ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค์ด๊ฐ์ ์ค๋ฅ ๋ฐ์ ํ๋ฅ ์ ๋ฎ์ถฐ์ฃผ๊ณ GeForce์์ ์ฐ์ด๋ ๊ฐ์ ์ํคํ ์ฒ ์นฉ์ ์ด๋ผ๋ ์ถ๊ฐ ๋ช ๋ น์ด ๋ช ๊ฐ๋ฅผ ๋ ์ง์ํ๋ค. ๋ค๋ง ์ฐจ์ธ๋ ์ํคํ ์ฒ์ GeForce์์ ์ด์ ์ธ๋์ CUDA ๋ช ๋ น์ด๋ฅผ ์ ๋ถ ํก์ํ์ฌ ์ง์ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ต์ GeForce ์ ํ์ ์จ๋ ์ด์ ์ธ๋์ Tesla ์ ์ฉ ๋ช ๋ น์ด๋ฅผ ์ธ ์ ์๋ค.
GPU์ ๋ฐ๋ฅธ CUDA Compute Capability๋ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ฉฐ, ์๋๋ ์ํคํ ์ฒ ๋๋ GPU๋ณ๋ก ๋๋ต์ ์ผ๋ก ์ ๋ํ์๋ค. CUDA SDK ๋ฒ์ ๊ณผ๋ ๋ค๋ฅด๋ฏ๋ก ๊ตฌ๋ถํ ๋ ์ฃผ์ํ ๊ฒ.
- G80 : 1.0
- G84, G86, G92, G94, G96, G98 : 1.1
- GT215, GT216, GT218 : 1.2
- GT200 : 1.3
- Fermi : 2.0~2.1
- Kepler 1.0 : 3.0~3.7
- Kepler 2.0 : 3.5~3.7
- Maxwell 1.0 : 5.0~5.3
- Maxwell 2.0 : 5.2~5.3
- Pascal : 6.0~6.2
- Volta : 7.0
- Turing : 7.5
CUDA์ ๋น์ทํ GPGPU ๊ธฐ์ ๋ก OpenCL๊ณผ DirectCompute๊ฐ ์์ง๋ง ์ด๋ค์ ํ์ค์ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ก์ฐ ๋ ๋ฒจ API์ ํ๋์จ์ด์ ์๋ ๊ณ ๊ธ ๊ธฐ๋ฅ๊น์ง ์ฌ์ฉํ์ฌ ํ๊ณ๊น์ง ์ฑ๋ฅ์ ๋์ด๋ด๊ธด ์ด๋ ต๋ค. ์ฆ, ๋ค๋ฅธ ๊ธฐ์ ์ D3D API ๋ฑ์ ๊ฒฝ์ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง ์ฟ ๋ค๋ ๋ฐ๋ก ํ๋์จ์ด์ ์์ธ์คํ์ฌ ์ปจํธ๋กค ํ ์ ์๋ค.
ํ์ง๋ง ์ด๋ ์ฟ ๋ค์ ๋จ์ ์ผ๋ก ์ด์ด์ง๋๋ฐ, ๊ทธ๋ํฝ ๊ธฐ๋ฅ๊ณผ์ ์ฐ๋์ ์ ์ ๋ก ๋ง๋ค์ด์ง DirectCompute์ ๋นํด ๊ทธ๋ํฝ ์ถ๋ ฅ ์ฉ๋๋ก ์ฌ์ฉ์ ์ค๋ฒํค๋๊ฐ ์ปค์ง๋ค.
๊ทธ๋ํฝ ์นด๋์ GPU๋ ๋๋์ ๋ฐ์ดํฐ์ ํ ๊ฐ์ง ์ฐ์ฐ์ ์ ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋จ์ํ๋ ์ฐ์ฐ ์ ๋(์ฝ์ด)์ ์ฒ์ฌ ๊ฐ์ฉ ํ์ฌํ๊ณ ์๋ค.[2] ๋ฐ๋ผ์ SIMD(Single Instruction Multiple Data) ํํ์ ๋ณ๋ ฌํ๊ฐ ๊ฐ๋ฅํ ์ฐ์ฐ์ GPU๋ฅผ ํ์ฉํด์ ์๋๋ฅผ ์ฌ๋ฆฌ๋ ค๋ ์๋๋ ์์ ๋ถํฐ ์์ด ์๋ค. ๊ทธ๋ฌ๋ ์๋ ๊ทธ๋ํฝ์ ์ฒ๋ฆฌํ๋ผ๊ณ ์ค๊ณ๋ ๊ทธ๋ํฝ์ค ํ์ดํ๋ผ์ธ์ ๊ฐ์ง๊ณ ์ผ๋ฐ์ ์ธ ๋ณ๋ ฌ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ ๋งค์ฐ ๊ณจ์น์ํ ์ผ์ด์๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์ผ์ผํ GPU์ ์ธ๋ถ ์ฌํญ์ ๋ค ์ ๊ฒฝ์จ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
CUDA ํ๋ก๊ทธ๋จ์ ์คํธ๋ฆผ ํ๋ก์ธ์ฑ[3]์ ๊ธฐ๋ฐํ๋ฉฐ, ๊ทธ ์์ฑ์๋ C/C++ ์ธ์ด์ ๋์์ ์คํํ ์ฐ๋ ๋ ๊ฐ์ ๋ฑ์ ์ ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ CUDA ์ ์ฉ ๋ฌธ๋ฒ์ ์ถ๊ฐํ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค. CUDA ์ฝ๋๋ ๋๋ต GPU ์์์๋ง ๋์๊ฐ๋ ํจ์(์ปค๋์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค)๋ฅผ ํธ์คํธ(CPU)์์ ํธ์ถํ๋ ํํ๋ก ๋์ด ์๋ค.
CUDA๋ GPU์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ถ์ํํด์ ์ข ๋ ํธํ๊ฒ GPU์ ์ด์ฉํ ์ ์๋๋ก ํ๋ค. ํ์ง๋ง ์ฌ์ ํ CUDA๋ก ์ต๋ํ์ ์๋ ์ฆ๊ฐ๋ฅผ ์ป์ผ๋ ค๋ฉด GPU์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด์ ์ ์์์ผ ํ๋ค. ์๋์ฐ ํ์ ์ผ๋ก CUDA ํ๋ก๊ทธ๋๋ฐ์ ๊ท์ฐฎ์์ ๋์ด ์ฃผ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง BSGP(Bulk-Synchronous GPU Programming)๋ผ๋ ๋ ์์ด ์กด์ฌํ๋ค. BGSP๋ CUDA์ ๊ธฐ๊ณ์ด ๋ช ๋ น๋ฒ์ญ์ ์ฌ์ฉํ ๋ณ๋ ์ธ์ด๋ค. ๋ ์ด ํธ๋ ์ด์ฑ ๋ฅ์ coherence๊ฐ ๋ฎ์ ์์ ์์ CUDA๋ณด๋ค ์ฑ๋ฅํฅ์์ด ์๋ค. ๋ค๋ง BGSP๊ฐ ๋ง๋ฅ์ ์๋๋ค. ๋ฐ๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ฐ์์ฑ์ด ๊ฐํ ์์ ์์ CUDA๋ณด๋ค ์ฑ๋ฅ์ด ๋ฎ์์ง๋ค.
์ต๊ทผ์ CUDA๋ฅผ ๋ ๋ณด์ํ OpenACC๋ผ๋ ๊ฒ ๋์๋ค. ์ข ๋ ์ถ์ํ๊ฐ ๋ผ์์ด์ ์ฝ๋ฉํ๊ธฐ ๋ ํธํ๋ค๊ณ ํ๋ค. ๋ง์ดํฌ๋ก์ํํธ์์๋ C++ AMP๋ผ๋ ๊ฑธ ๋ง๋ค์๋๋ฐ OpenACC์ DirectCompute ๋ฒ์ ์ ๋๋ผ ๋ณผ ์ ์๋ค. ๊ทธ๋๋ ์์ง์ ์ผ๋ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ ์ง์ ์์ด ๋ค๋น ๋งํ ๋์ด๋๋ ์๋๋ค. ๋จ์ง ์ ์ ๋นํด ์ง์ ์ฅ๋ฒฝ์ด ๋ง์ด ๋ฎ์์ก์ ๋ฟ.
R337 ๋๋ผ์ด๋ฒ ์ดํ๋ถํฐ๋ Geforce ์ ํ๊ตฐ์์์ CUDA ๊ธฐ๋ฐ ๋น๋์ค ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ญ์ ๋์๋ค. NVENC[4]๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ผ๋๋ฐ(์ด์ ์ ์ฟ ๋ค ์ธ์ฝ๋๋ฅผ ๋์ฒด) Tesla๋ Quadro ์ ํ๊ตฐ์ ์ ์์ ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด์ CUDA ๊ฐ์์ ์ฌ์ฉํ๋ ์ฝ๋ฑ์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํด์ง๊ฑฐ๋, ์ด์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋ฐ๋ก ๋ฃ์ง ์์ผ๋ฉด ๋ฏธ๋์ด ํธ์ง ํ๋ก๊ทธ๋จ๋ค์์์ ํธํ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
๋ฅ๋ฌ๋์ ๋์์ฃผ๋ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ CUDA์ ํจ๊ป ์ ๊ณต๋๋ค. cuDNN, Convolution ์ฐ์ฐ์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ฃผ๋ cuFFT[5], ์ ํ๋์ ๋ชจ๋์ธ cuBLAS ๋ฑ ์ฌ์ค์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋๋ถ๋ถ ๊ตฌํ๋์ด ์๋ค.
2. ์ ์ฌ ๊ฐ๋ [ํธ์ง]
NVIDIA ์ด์ธ์ ๊ทธ๋ํฝ์นด๋์์ ์๋ํ์ง ์๋๋ค. ๋ฐ๋ผ์ NVIDIA ์ธ์ ๊ทธ๋ํฝ์นด๋์ ๋ณ๋ ฌ ์ฐ์ฐ์ ์ํค๊ณ ์ถ๋ค๋ฉด OpenCL์ ์ฌ์ฉํ๋ฉด ๋๋ค.[6] CUDA์ ๋ฌธ๋ฒ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋น์ทํ๋ฐ ์ฝ๋ฉํ๊ธฐ๋ ์ด ์ชฝ์ด ์กฐ๊ธ ๋ ๋๋ฝ๋ค. ์ถ์ํ๊ฐ ๋ ๋ ๋๋. ์ ํ, ์ธํ
, AMD, ARM๋ฑ ์์๋ NVIDIA๋ฅผ ๊ฒฌ์ ํ๊ธฐ ์ํด ์ด ๋
์์ ๋ฐ๊ณ ์๋ค.
[1] ์ ๊ธฐ์ฐจ ํ์ฌ ํ
์ฌ๋ผ์๋ ๊ด๊ณ๊ฐ ์๋ค
[2] CPU๋ ๋ณต์กํ ๊ณ์ฐ์ 2~4๊ฐ ์ ๋ ๋์์ ์ํํ ์ ์๋ค๋ฉด, GPU๋ ๋จ์ ๋ฐ๋ณต ๊ณ์ฐ ์๋ฐฑ~์์ฒ ๊ฐ๋ฅผ ๋์์ ์ํํ ์ ์๋ค.
[3] ๋ณ๋ ฌ์ฒ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ์ ์ผ์ข
.
[4] ํ๋์จ์ด ๊ธฐ๋ฐ ๊ฐ์์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค
[5] FFT๋ ๊ณ ์ ํธ๋ฆฌ์ ๋ณํ์ ์ฝ์์ด๋ค. Convolution ์ฐ์ฐ์ ํ๋ ๋ฐ์๋ MN์ ์๊ฐ์ด ํ์ํ๋ฐ, FFT๋ฅผ ์ด์ฉํ๋ฉด MlogN์ ์๊ฐ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
[6] ๊ทธ๋ฌ๋ ๋์จ ์ง ๊ฝค ๋์๋๋ฐ๋ ์์ง ๋ถ์์ ํ๋ค. ์ ์ด์ ์ผ๊ฐ ํ๋ก์ ํธ๋ก ์ปค๋ฒํ๋ ค๋ ๋ฒ์๊ฐ ๋๋ฌด ๋๋ค.