CUDA

CUDA와 CUDAExtension


1. CUDA란?

Cuda는 NVIDIA에서 개발한 GPU 개발 툴. Cuda사용 목적은 많은 양의 연산을 동시에 처리하는 것으로 딥러닝이나 채굴에 사용된다.
nvidia-driver,CUDA,CUDNN만 설치하면 딥러닝 개발 환경 구축이 가능하다. 일단 c나 c++로 작성한 후 CUDA확장명(.cu)을 가진 C로 작성한다.
그리고 CUDAExtension을 사용하면 GPU연산이 가능해진다.

2. CUDAExtension

cuda지원 운영체제를 PyTorch와 병합한다.

from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CUDAExtension

setup(name='swin_window_process',
    ext_modules=[
        CUDAExtension('swin_window_process', [
            'swin_window_process.cpp',
            'swin_window_process_kernel.cu',
        ])
    ],
    cmdclass={'build_ext': BuildExtension})

swin_window_process는 cpp로 작성되어 있는 파일, swin_window_procesS_kernel.cu는 CUDA확장자 파일. 이 두개를 CUDAExtension하면 Pytorch에서 swin_window_process라는 모듈로 import해와서 사용할 수 있게됨.

2.1. cpp파일

#include <stdio.h>

void hello(void) {
	printf("Hello, World!\n");
}

int main(void) {
	hello();

	return 0;
}

2.2. cuda파일

2.1의 cpp를 cuda로 바꾸면…

#include <stdio.h>

__global__ void hello(void) {
	printf("Hello, CUDA! %d \n", threadIdx.x);
}

int main(void) {
	hello <<<1, 10>>> ();

	return 0;
}

2.2.1. global

해당 함수를 GPU에서 돌아가도록 지정해줌. 이렇게 GPU에서 실행되는 함수를 kernel(커널) 이라고 부른다.

2.2.2. «<1,1»>

«<스레드 그룹의 갯수(block),각 스레드 그룹에서 몇개의 스레드를 실행할지»>
«<M , T »> : M * T = 사용할 코어의 수

2.2.3. 예시

#include <stdio.h>

__global__ void hello(void) {
	printf("Hello, CUDA! %d \n", threadIdx.x);
}

int main(void) {
	hello <<<1, 10>>> ();

	return 0;
}

«<1,10»> : 1개의 스레드 그룹이 있고 그 그룹 내에서 10개의 스레드 실행
image

«<2,10»> : 2개의 스레드 그룹이 있고 각 그룹 내에서 10개의 스레드를 실행
image

참고

3. CUDA thread

image

  • 가장 작은 각설탕 : Thread
  • 초록 격자 : Block
  • 초롤 격자의 묶음 : Grid
    참고