CUDA, ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
CUDA

CUDA, ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๐Ÿ’กCUDA

CUDA(Computed /unified Device Architecture)๋Š” NVIDIA์—์„œ ๊ฐœ๋ฐœํ•œ GPU ๊ฐœ๋ฐœ ํˆด๋กœ ๊ณ ์„ฑ๋Šฅ ํ™˜๊ฒฝ๊ณผ GPU ๊ฐ€์†๊ธฐ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๊ฐœ๋ฐœ ํˆด์ด๋‹ค. CUDA๋Š” CPU๊ฐ€ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํŠน์ • ์˜์—ญ์„ GPU ๊ฐ€์†๊ธฐ์— ํ• ๋‹นํ•ด์„œ ๊ฐ€์†๊ธฐ ์ชฝ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๋ชจ๋ธ๋กœ ๊ตฌ์„ฑ๋ผ์žˆ๋‹ค. NVIDIA์—์„œ ์ƒ์‚ฐํ•œ GPU ์ œํ’ˆ๊ตฐ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Serial ์ฝ”๋“œ์—์„œ๋Š” ์–ด๋–ค ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฝ”์–ด ํ•˜๋‚˜๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ,

CUDA๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” CPU์ชฝ์—์„œ ๊ณ„์‚ฐ์„ ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ๋ฃจํ”„๋‚˜ hostpot ๊ฐ™์€ ๋ถ€๋ถ„์„ ํ• ๋‹น ๋ฐ›์•„์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ ๊ฐ’์„ returnํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๋กœ ๊ณ„์‚ฐ์ด ์ง„ํ–‰๋œ๋‹ค.

๐Ÿ’กHeterogeneous System

  1. CPU์—์„œ ๋ฉ”์ธ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰
  2. GPU์—์„œ hostpot์ด๋‚˜ loop ๊ฐ™์€ ๋ถ€๋ถ„์„ ํ• ๋‹นํ•˜๊ณ  ๊ณ„์‚ฐ ์ˆ˜ํ–‰
  3. CPU์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๋ฆฌํ„ด

CPU ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ GPU ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ๋…๋ฆฝ๋œ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค. CPU์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์–ด๋–ค ํŠน์ •ํ•œ ๋ถ€๋ถ„์„ GPU์ชฝ์œผ๋กœ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ทธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋„ ๊ฐ™์ด ์ „๋‹ฌํ•ด์ค˜์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ CPU ๋ฉ”๋ชจ๋ฆฌ์™€ GPU ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์— ๋ฐ์ดํ„ฐ ์นดํ”ผ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ „์†ก ๋ถ€๋ถ„์ด ํ•„์š”ํ•˜๋ฉฐ

  1. CPU์˜ ๋ฐ์ดํ„ฐ๋ฅผ GPU ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณต์‚ฌํ•˜๊ณ 
  2. ๊ณ„์‚ฐ๊ฐ’์„ ๋‹ค์‹œ 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 ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œปํ•จ, ์ปค๋„ ๋‹จ์œ„๋กœ ์‹คํ–‰

 

๊ฐ•์˜

kisti.re.kr

'CUDA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Thread Hierarchy, CUDA Kernel  (4) 2024.02.14
GPU Architecture, CUDA Compiler  (0) 2024.02.14