๐กCUDA
CUDA(Computed /unified Device Architecture)๋ NVIDIA์์ ๊ฐ๋ฐํ GPU ๊ฐ๋ฐ ํด๋ก ๊ณ ์ฑ๋ฅ ํ๊ฒฝ๊ณผ GPU ๊ฐ์๊ธฐ ํ๊ฒฝ์ ์ํ ๊ฐ๋ฐ ํด์ด๋ค. CUDA๋ CPU๊ฐ ๊ณ์ฐ์ ํ๋ ๋ถ๋ถ์์ ํน์ ์์ญ์ GPU ๊ฐ์๊ธฐ์ ํ ๋นํด์ ๊ฐ์๊ธฐ ์ชฝ์์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๋ชจ๋ธ๋ก ๊ตฌ์ฑ๋ผ์๋ค. NVIDIA์์ ์์ฐํ GPU ์ ํ๊ตฐ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ผ๋ฐ์ ์ผ๋ก Serial ์ฝ๋์์๋ ์ด๋ค ๊ณ์ฐ์ ์ํํ ๋ ์ฝ์ด ํ๋๊ฐ ์์ฐจ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์์ ๋ฐ๋ผ์ ๊ณ์ฐ์ ์ํํ์ง๋ง,
CUDA๊ฐ์ ๊ฒฝ์ฐ์๋ CPU์ชฝ์์ ๊ณ์ฐ์ ํ๋ค๊ฐ ์ค๊ฐ์ ๋ฃจํ๋ hostpot ๊ฐ์ ๋ถ๋ถ์ ํ ๋น ๋ฐ์์ ๋ ๋ฆฝ์ ์ผ๋ก ์ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ returnํด์ฃผ๋ ๊ตฌ์กฐ๋ก ๊ณ์ฐ์ด ์งํ๋๋ค.
๐กHeterogeneous System
- CPU์์ ๋ฉ์ธ ๊ณ์ฐ์ ์ํ
- GPU์์ hostpot์ด๋ loop ๊ฐ์ ๋ถ๋ถ์ ํ ๋นํ๊ณ ๊ณ์ฐ ์ํ
- CPU์์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฆฌํด
CPU ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ GPU ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ ๋ฆฝ๋ ๊ตฌ์กฐ๋ก ๋์ด์๋ค. CPU์์ ํ๋ก๊ทธ๋จ์ ์งํํ๋ค๊ฐ ์ด๋ค ํน์ ํ ๋ถ๋ถ์ GPU์ชฝ์ผ๋ก ํ ๋นํ๋ ค๊ณ ํ ๋ ๊ทธ์ ํ์ํ ๋ฐ์ดํฐ๋ ๊ฐ์ด ์ ๋ฌํด์ค์ผํ๋ค. ๊ทธ๋์ CPU ๋ฉ๋ชจ๋ฆฌ์ GPU ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๋ฐ์ดํฐ ์นดํผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ก ๋ถ๋ถ์ด ํ์ํ๋ฉฐ
- CPU์ ๋ฐ์ดํฐ๋ฅผ GPU ๋ฉ๋ชจ๋ฆฌ์์ ๋ณต์ฌํ๊ณ
- ๊ณ์ฐ๊ฐ์ ๋ค์ CPU ๋ฉ๋ชจ๋ฆฌ๋ก ์ ๋ฌํ๋ค
์ด์ฒ๋ผ ๋ฉ์ธ ํ๋ก๊ทธ๋จ์ CPU์์ ์งํํ๋, ๊ณ์ฐ ์์์ด ๋ง์ด ํ์ํ ๋ถ๋ถ์ GPU์ชฝ์ ํ ๋นํ๋ ๊ตฌ์กฐ๋ฅผ ์คํ๋ก๋๋ผ๊ณ ํ๋ค
๐กHello World: Serial
#include <stdio.h>
void printhello(void){
printf("Hello World on CPU\n");
}
int main(void){
int i;
for(i=0; i<4; i++){
printhello();
}
return 0;
}
๊ฒฐ๊ณผ
Hello World on CPU
Hello World on CPU
Hello World on CPU
Hello World on CPU
Serial ํ๋ก๊ทธ๋จ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ํ๋์ ์ฝ์ด๊ฐ 4๊ฐ์ ํ๋ฆฐํธ๋ฌธ์ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค
๐กHello Wolrd: CUDA
#include <stdio.h>
__global__ void helloFromGPU(void){
printf("Hello World From GPU\n");
}
int main(void){
printf("Hello World from CPU\n");
helloFromGPU<<<1,10>>>();
cudaDeviceReset();
return 0;
}
๊ฒฐ๊ณผ
Hello World from CPU
Hello World From GPU
Hello World From GPU
Hello World From GPU
...
Hello World From GPU
Hello World From GPU
Hello World From GPU
10๊ฐ์ ์ฝ์ด๋ฅผ ์ฌ์ฉํ ์์ ๋ก ์ฌ๋ฌ ์ฝ์ด๊ฐ ๋์์ ์ํ๋๋ ๊ตฌ์กฐ์ด๋ค.
์ฌ๊ธฐ์ ์ฌ์ฉ๋ ํ๋ฆฐํธ ํจ์์ธ __global__ void helloFromGPU(void)์ ์ปค๋ ํจ์๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ปค๋ ํจ์๋ GPU ์ฅ์น์์ ์คํ์ ํ๋ค. ์ด๋ฌํ ๊ฐ์๊ธฐ ๋๋ GPU๋ฅผ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋จ์ ์ํํ๋ ๊ฒ๋ค์ heterogenous ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ค.
๐ก CUDA ๊ตฌ์กฐ
- ๋งจ ์๋์ GPU ํ๋์จ์ด ์ฅ์น๊ฐ ์กด์ฌํ๋ค
- GPU๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํด CUDA ๋๋ผ์ด๋ฒ๊ฐ ํ์ํ๋ค
- ๊ทธ ๋ค์์๋ Runtime API๊ฐ CUDA GPU๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Runtime function ๊ฐ์ ๊ฒ๋ค์ด ํฌํจ๋๋ค
- ๊ทธ ์์ ๊ณ์ฐ ๋ฑ์ ์ํํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์กด์ฌํ๋ค
- ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ์๋ Runtime API๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค
- API ๋ ๋ฒจ์์๋ ๋๋ผ์ด๋ฒ์ Runtime์ด ํ์ํ๊ณ CUDA ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์์ ๋ฐ๋ผ ํ์ฉ์ ํ ์ ์๋ค.
๐ก CPU vs GPU
๐ CPU์ ํน์ง
- ์ง์ฐ ์๊ฐ์ด ์๋ค
- ์ฐ์ฐ์ ํ๋ ์ ๋์ธ ALU๊ฐ ์ฐจ์งํ๋ ๋ถ๋ถ์ด GPU์ ๋นํด ์๋ค
- ํ์ง๋ง ์ง์ฐ์ ์ค์ด๊ธฐ ์ํ ์บ์ ๋ถ๋ถ์ด๋ ๋ณต์กํ ์ฐ์ฐ์ ์ํํ ์ ์๋ ์ปจํธ๋กค๋ฌ ๊ฐ์ ๋ถ๋ถ์ด ์๋น์์ ์์ญ์ ์ฐจ์งํ๋ค
- ๋ฐ๋ผ์ ๋ณต์กํ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ ๋น ์์ฐจ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ฅ์ ์ด๋ค
- ์ฃผ๋ก 100๊ฐ ์ดํ์ ์ฝ์ด๋ฅผ ๊ฐ๋๋ค
๐ GPU์ ํน์ง
- GPU๋ ALU์ ๊ฐ์ ์ฐ์ฐ ์ ๋์ด ๋๋ถ๋ถ์ ์ฐจ์งํ๋ค
- ์ปจํธ๋กค์ด๋ ์บ์ ์์ญ์ ์ต์ํ์ ์์ญ์ ์ฐจ์งํ์ฌ ์ง์ฐ์ ์ค์ผ ์ ์๋ ์์ญ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ ์๋๋ CPU๋ณด๋ค ๋๋ฆฌ๋ค
- ๋ง์ ์ฐ์ฐ์ ๋์์ ์ํํ ์ ์๋ค
- ์ฝ์ด์ ๊ฐ์๊ฐ ๋ช ์ฒ์์ ๋ช ๋ง๊ฐ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ ์ ๊ฐ์๊ฐ ๋ง๋ค
๐ก ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ
Host: CPU์ CPU์ ์๋ ์์คํ ๋ฉ๋ชจ๋ฆฌ(DRAM)๋ฅผ ๋ปํจ
Device: GPU์ GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ปํจ, ์ปค๋ ๋จ์๋ก ์คํ
๊ฐ์
'CUDA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thread Hierarchy, CUDA Kernel (4) | 2024.02.14 |
---|---|
GPU Architecture, CUDA Compiler (0) | 2024.02.14 |