GPU 커널
보통 CPU에서 실행되는 함수는 그냥 함수(Function)라고 부른다. 반면, GPU에서 실행되도록 작성된 함수는 특별히 커널(Kernel)이라고 한다.
GPU는 수천 개의 스레드를 동시에 실행할 수 있기 때문에, 커널을 작성해주면 각 스레드가 같은 코드를 실행하면서 서로 다른 데이터를 처리한다.
예를 들어 배열의 모든 원소를 제곱한다고 해보자.
- CPU: for 루프로 하나씩 계산
- GPU: 커널을 실행하면 수천 개의 스레드가 동시에 각 원소를 제곱한다.
병렬 처리에 특화되어있어 GPU가 대규모 연산에 강력한 성능을 발휘한다.
GPU 커널 구현
GPU 커널은 하드웨어와 플랫폼에 따라 여러 방식으로 작성할 수 있다.
- CUDA (NVIDIA): C/C++ 확장 문법, 가장 널리 쓰임 딥러닝, 과학 연산
- OpenCL: C 기반, 범용 표준, 다양한 하드웨어 지원 멀티 플랫폼
- DirectCompute (MS): DirectX 일부, Windows 전용 게임, 그래픽
- Vulkan Compute: Vulkan API 포함 Compute Shader 게임+연산
CUDA와 GPU 커널
CUDA 프로그래밍에서는 __global__ 키워드를 붙여 GPU 커널을 정의한다.
__global__ void square(float *data, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
data[idx] = data[idx] * data[idx];
}
}
위 함수는 GPU 위에서 실행되며, 각 스레드는 idx라는 고유 번호를 받아 배열의 다른 위치를 동시에 처리한다.
파이썬에서의 GPU 커널
순수 파이썬 코드만으로는 GPU 커널을 직접 짤 수 없지만, 몇 가지 도구를 사용하면 파이썬 안에서 GPU 커널을 작성하고 실행할 수 있다.
1. Numba (CUDA JIT)
파이썬 함수에 @cuda.jit 데코레이터를 붙이면, Numba가 CUDA 커널로 변환해준다.
from numba import cuda
import numpy as np
@cuda.jit
def square(a):
idx = cuda.grid(1)
if idx < a.size:
a[idx] = a[idx] * a[idx]
arr = np.arange(10, dtype=np.float32)
square[1, 10](arr) # [block, threads]
print(arr)
파이썬 문법 그대로 GPU 병렬 실행이 가능하다.
2. PyCUDA
CUDA 코드를 문자열로 작성하고, 파이썬에서 런타임에 컴파일해 실행한다.
import pycuda.autoinit
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import numpy as np
mod = SourceModule("""
__global__ void square(float *a) {
int idx = threadIdx.x;
a[idx] = a[idx] * a[idx];
}
""")
square = mod.get_function("square")
a = np.arange(10, dtype=np.float32)
square(cuda.InOut(a), block=(10,1,1))
print(a)C 스타일 CUDA 코드를 직접 작성해야 하지만, 파이썬 환경에서 바로 실행 가능하다.
3. CuPy
NumPy와 거의 똑같이 쓰이지만, 내부적으로 GPU 연산(CUDA 커널)을 호출한다.
import cupy as cp
x = cp.arange(10, dtype=cp.float32)
y = x ** 2
print(y)별도의 커널 작성 없이 NumPy 코드처럼 간단하게 GPU 활용 가능하다.
4. 딥러닝 프레임워크
파이토치와 텐서플로우는 내부적으로 이미 최적화된 커널을 사용하므로, 파이썬 코드만으로 GPU 연산을 쉽게 사용 가능하다.
'컴퓨터공학' 카테고리의 다른 글
| Git 커밋 메시지 잘 쓰는 법 (2) | 2025.09.14 |
|---|---|
| [Svelte] 개발 환경 세팅하기 (1) | 2025.09.09 |
| [Clean Architecture] - SOLID 원칙 DIP (5) (0) | 2025.01.28 |
| [Clean Architecture] - SOLID 원칙 ISP (4) (0) | 2025.01.28 |
| [Clean Architecture] - SOLID 원칙 LSP (3) (0) | 2025.01.28 |