ROCm ์์ธ
๊ฐ์
ROCm(Radeon Open Compute)์ AMD๊ฐ 2016๋ ์ ๋์ ํ ์คํ์์ค GPU ์ปดํจํ ํ๋ซํผ์ผ๋ก, AMD Instinct ๋ฐ์ดํฐ์ผํฐ GPU์ Radeon GPU์์ HPC(High Performance Computing) ๋ฐ AI ์ํฌ๋ก๋๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํ ์ํํธ์จ์ด ์คํ์ ์ ๊ณตํ๋ค. ROCm์ ์ฃผ๋ก ์คํ์์ค ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋๋ฉฐ, NVIDIA CUDA์ ์ ์ฌํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ธ HIP(Heterogeneous-compute Interface for Portability)๋ฅผ ํตํด ๊ธฐ์กด CUDA ์ฝ๋์ ํฌํ ์ ์ง์ํ๋ค.
ROCm์ ํต์ฌ ์ค๊ณ ์ฒ ํ์ ์คํ์์ค ํฌ๋ช ์ฑ๊ณผ ํ๋์จ์ด ์ด์์ฑ(portability)์ด๋ค. ๊ฐ๋ฐ์๋ ROCm์ ํตํด AMD GPU์ ์ฑ๋ฅ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, MIT ๋ผ์ด์ ์ค ๊ธฐ๋ฐ์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ฉํ์ฌ AI ์ถ๋ก /ํ๋ จ, ๊ณผํ ๊ณ์ฐ, ์๋ฎฌ๋ ์ด์ ๋ฑ ๋ค์ํ ์ํฌ๋ก๋๋ฅผ ๊ฐ์ํํ ์ ์๋ค. ROCm์ ํ์ฌ MI250X(CDNA2), MI300X/MI300A(CDNA3), ๊ทธ๋ฆฌ๊ณ ์ต์ MI350(CDNA4) ์ํคํ ์ฒ๋ฅผ ์ง์ํ๋ฉฐ, PyTorch, TensorFlow, JAX ๋ฑ ์ฃผ์ ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์์ ํตํฉ์ ์ง์์ ์ผ๋ก ํ๋ํ๊ณ ์๋ค.
ํต์ฌ ๊ฐ๋
ROCm ์ํํธ์จ์ด ์คํ ์ํคํ ์ฒ
ROCm์ ๋ค์ธต ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๊ณ์ธต์ด ํน์ ์ญํ ์ ์ํํ๋ค:
| ๊ณ์ธต | ๊ตฌ์ฑ ์์ | ์ค๋ช |
|---|---|---|
| ํ๋ ์์ํฌ | PyTorch, TensorFlow, JAX | ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ ์ ๋ฐ ํ๋ จ/์ถ๋ก |
| ompiler | hipcc, clang, FLANG | HIP/C++ ์ฝ๋๋ฅผ AMD GPU ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผ |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | MIOpen, rocBLAS, RCCL, MIGraphX | ๊ณ ์ฑ๋ฅ ์ฐ์ฐ ์ปค๋ |
| ๋ฐํ์ | HIP Runtime, ROCr (ROCR Runtime) | GPU ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฐ ์ปค๋ ์คํ |
| ๋๋ผ์ด๋ฒ | KFD (Kernel Fusion Driver) | ํ๋์จ์ด ์ ๊ทผ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ |
| ํ๋์จ์ด | AMD Instinct MI250X/MI300X/MI350 | GPU ํ๋์จ์ด |
HIP ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
HIP(Heterogeneous-compute Interface for Portability)๋ ROCm์ ํต์ฌ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค๋ก, CUDA C/C++๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ AMD GPU์์ ๋ณ๋ ฌ ์ปค๋์ ์์ฑํ ์ ์๊ฒ ํ๋ค.
HIP ์ปค๋ ์ ์ธ:
__global__ void myKernel(float* data, int n) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (idx < n) {
data[idx] = data[idx] * 2.0f;
}
}
// ์ปค๋ ํธ์ถ
hipLaunchKernelGGL(myKernel, dim3(gridSize), dim3(blockSize), 0, 0, d_data, n);
HIP ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ API:
| ํจ์ | ์ค๋ช | CUDA ๋์ |
|---|---|---|
hipMalloc() |
GPU ๋ฉ๋ชจ๋ฆฌ ํ ๋น | cudaMalloc() |
hipMemcpy() |
ํธ์คํธ-๋๋ฐ์ด์ค ๊ฐ ๋ฐ์ดํฐ ๋ณต์ฌ | cudaMemcpy() |
hipFree() |
GPU ๋ฉ๋ชจ๋ฆฌ ํด์ | cudaFree() |
hipMemcpyAsync() |
๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ณต์ฌ | cudaMemcpyAsync() |
hipMemset() |
GPU ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ | cudaMemset() |
HIP ์ค๋ ๋ ๋๊ธฐํ:
| ํจ์ | ์ค๋ช |
|---|---|
__syncthreads() |
๋ธ๋ก ๋ด ์ค๋ ๋ ๋๊ธฐํ |
__syncwarp() |
์ํ ๋ด ์ค๋ ๋ ๋๊ธฐํ |
hipDeviceSynchronize() |
ํธ์คํธ์์ ๋๋ฐ์ด์ค ๋๊ธฐํ ๋๊ธฐ |
ROCm ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ
ROCm์ ๋ค์ํ ๋๋ฉ์ธ์ ํนํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํธ๋ฅผ ์ ๊ณตํ๋ค:
์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ฅ | NVIDIA ๋์ |
|---|---|---|
| rocBLAS | ๊ธฐ๋ณธ ์ ํ๋์ (GEMM, GEMV, TRSM) | cuBLAS |
| hipBLAS | rocBLAS/CUBLAS ํธํ ์ธํฐํ์ด์ค | cuBLAS (ํฌํ ํธ์) |
| hipBLASLt | ๋ฐฐ์น GEMM, ์ค์ผ์ค๋ง ์ต์ ํ | cuBLASLt |
| rocSOLVER | ์ ํ๋ฐฉ์ ์/๊ณ ์ ๊ฐ ๋ถ์ | cuSOLVER |
| rocSPARSE | ํฌ์ ํ๋ ฌ ์ฐ์ฐ | cuSPARSE |
| rocFFT | ํธ๋ฆฌ์ ๋ณํ | cuFFT |
| rocRAND | ๋์ ์์ฑ | cuRAND |
๋ฅ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ฅ | NVIDIA ๋์ |
|---|---|---|
| MIOpen | ๋ฅ ๋ฌ๋ ํ๋ฆฌ๋ฏธํฐ๋ธ (Conv, Pool, BN, Activation) | cuDNN |
| MIGraphX | ์ถ๋ก ๊ทธ๋ํ ์ต์ ํ ์์ง | TensorRT |
| Composable Kernel | ์ปค์คํ ๊ณ ์ฑ๋ฅ ์ปค๋ ์์ฑ | CUTLASS |
ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ฅ | NVIDIA ๋์ |
|---|---|---|
| RCCL | ๋ค์ค GPU/๋ ธ๋ ๊ฐ All-Reduce ๋ฑ ์ง์ฝ ํต์ | NCCL |
| rocSHMEM | ๋ถ์ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ | NCCL SHMEM |
| hipCUB | ๋ณ๋ ฌ ํ๋ฆฌ๋ฏธํฐ๋ธ (Scan, Reduce, Sort) | CUB |
์ปดํจํฐ ๋น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ฅ |
|---|---|
| MIVisionX | ์ปดํจํฐ ๋น์ ๋ฐ ML ํ๋ฆฌ๋ฏธํฐ๋ธ |
| RPP | ROCm Performance Primitives (์ด๋ฏธ์ง ์ฒ๋ฆฌ) |
ROCm ๊ฐ๋ฐ ๋๊ตฌ
ROCm์ ๊ฐ๋ฐ, ๋๋ฒ๊น , ํ๋กํ์ผ๋ง์ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค:
์ปดํ์ผ ๋๊ตฌ:
| ๋๊ตฌ | ๊ธฐ๋ฅ |
|---|---|
| hipcc | HIP/C++ ์ปดํ์ผ๋ฌ (clang ๊ธฐ๋ฐ) |
| hipify-perl / hipify-cuda | CUDA ์ฝ๋๋ฅผ HIP ์ฝ๋๋ก ์๋ ๋ณํ |
| cmake | ๋น๋ ์์คํ (CMake ํจํค์ง ์ง์) |
ํ๋กํ์ผ๋ง ๋๊ตฌ:
| ๋๊ตฌ | ๊ธฐ๋ฅ |
|---|---|
| rocprofiler-SDK | ํ๋์จ์ด ์นด์ดํฐ ๋ฐ ํธ๋ ์ด์ฑ |
| ROCm Compute Profiler | ์ปค๋ ์คํ ํ๋กํ์ผ๋ง |
| rocminfo | GPU ํ๋์จ์ด ์ ๋ณด ์กฐํ |
| AMD SMI | GPU ์ํ ๋ชจ๋ํฐ๋ง (์จ๋, ์ ๋ ฅ, ํด๋ญ) |
๋๋ฒ๊น ๋๊ตฌ:
| ๋๊ตฌ | ๊ธฐ๋ฅ |
|---|---|
| ROCgdb | GPU ๋๋ฒ๊ฑฐ (GDB ๊ธฐ๋ฐ) |
| ROCdbgapi | GPU ๋๋ฒ๊น API |
ROCm ํ๋์จ์ด ์ง์
ROCm์ ์ฌ๋ฌ ์ธ๋์ AMD GPU ์ํคํ ์ฒ๋ฅผ ์ง์ํ๋ค:
| ์ํคํ ์ฒ | GPU ๋ชจ๋ธ | ์ถ์ | ํน์ง |
|---|---|---|---|
| CDNA | MI60, MI50 | 2019 | ์ต์ด CDNA, 7nm |
| CDNA2 | MI250X, MI250 | 2021 | 6nm, HBM2e, IF 8๋งํฌ |
| CDNA3 | MI300X, MI300A | 2023 | 5nm/6nm, HBM3, APU ์ต์ |
| CDNA4 | MI350 | 2025 | 3nm, HBM3e, 288GB |
| RDNA3 | RX 7900 XTX | 2022 | ๊ฒ์ด๋ฐ/์ฝํ ์ธ ํฌ๋ฆฌ์์ด์ |
| RDNA4 | RX 9070 XT | 2025 | ray tracing ๊ฐํ |
์ง์ ์ด์์ฒด์ :
- Linux: Ubuntu, RHEL, SLES, Oracle Linux, Debian, Rocky Linux
- Windows: HIP SDK (์ ํ์ ์ง์)
- Docker: ๊ณต์ ROCm ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ ๊ณต
๋น๊ต/๋ถ์
ROCm vs CUDA ๋น๊ต
| ํญ๋ชฉ | ROCm | CUDA |
|---|---|---|
| ๋ผ์ด์ ์ค | ์คํ์์ค (MIT) | ๋น๊ณต๊ฐ (๋ถ๋ถ ๊ณต๊ฐ) |
| ํ๋์จ์ด | AMD GPU (Instinct, Radeon) | NVIDIA GPU ์ ์ฉ |
| ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ | HIP (CUDA ์ ์ฌ) | CUDA C/C++ |
| ์ปดํ์ผ๋ฌ | hipcc (clang ๊ธฐ๋ฐ) | nvcc |
| ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | MIOpen, rocBLAS, RCCL | cuDNN, cuBLAS, NCCL |
| ์ถ๋ก ์์ง | MIGraphX | TensorRT |
| ํ๋กํ์ผ๋ง | rocprofiler-SDK, AMD SMI | Nsight, nvprof |
| ๋๋ฒ๊น | ROCgdb | cuda-gdb, compute-sanitizer |
| ็ๆ ๊ณ ์ฑ์๋ | 8๋ + (์ฑ์ฅ ์ค) | 17๋ + (๊ฐ์ฅ ์ฑ์) |
| ์ปค๋ฎค๋ํฐ ํฌ๊ธฐ | ์ค๊ฐ (๋น ๋ฅด๊ฒ ์ฑ์ฅ) | ๊ฐ์ฅ ํผ |
| ๋น์ฉ | ๋ฌด๋ฃ | ๋ฌด๋ฃ (ํ๋์จ์ด vendor lock-in) |
ROCm ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฑ๋ฅ ๋น๊ต
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ROCm (MIOpen/rocBLAS) | NVIDIA (cuDNN/cuBLAS) | ๋น๊ณ |
|---|---|---|---|
| GEMM (FP32) | ์ฐ์ (MI300X ์ต์ ํ) | ์ฐ์ | ํ๋์จ์ด ์์กด |
| GEMM (FP16/BF16) | ์ฐ์ | ์ฐ์ | MI300X Matrix Core ํ์ฉ |
| Conv2D | good (Winograd ์ง์) | ์ฐ์ (๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ) | cuDNN์ด ๋ ๋ค์ํ conv ์ ํ ์ง์ |
| Attention | good (Flash Attention ์ง์) | ์ฐ์ | Flash Attention 2/3 CUDA ๋ค์ดํฐ๋ธ |
| ์ถ๋ก ๊ทธ๋ํ | MIGraphX | TensorRT | TensorRT๊ฐ ํ๋ก๋์ ์์ ๋ ์ฑ์ |
ROCm vs CUDA ํฌํ ์์
CUDA ์ฝ๋:
__global__ void vectorAdd(float* a, float* b, float* c, int n) {
int i = threadIdx.x + blockIdx.x * blockDim.x;
if (i < n) c[i] = a[i] + b[i];
}
int main() {
float *d_a, *d_b, *d_c;
cudaMalloc(&d_a, n * sizeof(float));
cudaMalloc(&d_b, n * sizeof(float));
cudaMalloc(&d_c, n * sizeof(float));
vectorAdd<<<grid, block>>>(d_a, d_b, d_c, n);
cudaDeviceSynchronize();
}
HIP ์ฝ๋ (๋ณํ ํ):
__global__ void vectorAdd(float* a, float* b, float* c, int n) {
int i = threadIdx.x + blockIdx.x * blockDim.x;
if (i < n) c[i] = a[i] + b[i];
}
int main() {
float *d_a, *d_b, *d_c;
hipMalloc(&d_a, n * sizeof(float));
hipMalloc(&d_b, n * sizeof(float));
hipMalloc(&d_c, n * sizeof(float));
hipLaunchKernelGGL(vectorAdd, dim3(grid), dim3(block), 0, 0, d_a, d_b, d_c, n);
hipDeviceSynchronize();
}
hipify ์๋ ๋ณํ:
hipify-perl vectorAdd.cu -o vectorAdd.cpp
# ๋๋
hipify-cuda vectorAdd.cu --output-dir=hipified/
๋์ ์๋ฆฌ
ROCm ์คํ ๋์ ํ๋ฆ
-
์์ค ์ฝ๋ ์ปดํ์ผ:
-hipcc๊ฐ HIP/C++ ์ฝ๋๋ฅผ LLVM(clang) ๊ธฐ๋ฐ์ผ๋ก ์ปดํ์ผ
- AMDGPU ๋ฐฑ์๋๋ฅผ ํตํด AMD GPU ๋ค์ดํฐ๋ธ ISA๋ก ๋ณํ
- HSA(Heterogeneous System Architecture) ํธํ ์ค๋ธ์ ํธ ์ฝ๋ ์์ฑ -
๋ฐํ์ ๋ก๋:
- HIP ๋ฐํ์์ด ์ปดํ์ผ๋ ์ปค๋์ GPU ๋๋ฐ์ด์ค์ ๋ก๋
- ROCr(ROCR Runtime)๊ฐ HSA ์ปค๋ ๋์คํจ์น ์ธํฐํ์ด์ค ์ ๊ณต
- KFD(Kernel Fusion Driver)๊ฐ ํ๋์จ์ด ๋ฆฌ์์ค ๊ด๋ฆฌ -
์ปค๋ ์คํ:
- GPU ์ค์ผ์ค๋ฌ๊ฐ ์ปค๋์ Compute Unit์ ๋ฐฐ์น
- Wavefront(64 ์ค๋ ๋) ๋จ์๋ก SIMD ์คํ
- Matrix Core๋ฅผ ํตํ ํ๋ ฌ ์ฐ์ฐ ๊ฐ์ -
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ:
- ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ๊ธฐ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- HMM(Heterogeneous Memory Management)์ ํตํ ํต์ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
- ํ์ด์ง ํด๋ง์ ํตํ ๋ฉ๋ชจ๋ฆฌ ์๋ ๋ง์ด๊ทธ๋ ์ด์
HIP ์ปค๋ ์คํ ์์ธ
AMD GPU์ CDNA ์ํคํ ์ฒ์์ HIP ์ปค๋์ ๋ค์๊ณผ ๊ฐ์ด ์คํ๋๋ค:
Compute Unit (CU) ๋์:
- ๊ฐ CU๋ 64๊ฐ์ Stream Processor(SIMD32 x 2)๋ฅผ ๊ฐ์ง
- Wavefront ์ค์ผ์ค๋ฌ๊ฐ ์ฌ๋ฌ Wavefront๋ฅผ ๋์์ ์ค์ผ์ค๋ง
- ๋ฉ๋ชจ๋ฆฌ ์ง์ฐ ์๊ฐ ์จ๊น(latency hiding)์ ์ํ ๋ค์ค Wavefront ํ์ฑํ
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ฒฝ๋ก:
1. ๋ ์ง์คํฐ โ Matrix Core/VALU โ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(LDS)
2. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ โ L2 ์บ์ โ HBM
3. Infinity Fabric์ ํตํ ์๊ฒฉ GPU ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
4. HMM์ ํตํ CPU-GPU ํต์ผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ ๊ทผ
ROCm ์ปจํ ์ด๋ ๋ฐ ๋ฐฐํฌ
ROCm์ Docker ๊ธฐ๋ฐ ๋ฐฐํฌ๋ฅผ ๊ถ์ฅํ๋ฉฐ, ๊ณต์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ค:
# ๊ณต์ ROCm ์ปจํ
์ด๋ ์ด๋ฏธ์ง
docker pull rocm/rocm-terminal:latest
docker pull rocm/pytorch:latest
docker pull rocm/tensorflow:latest
# MI300X์์ PyTorch ์คํ
docker run -it --device=/dev/kfd --device=/dev/dri \
--group-add video --cap-add SYS_PTRACE \
rocm/pytorch:latest
์ฅ๋จ์
์ฅ์
- ์คํ์์ค ํฌ๋ช ์ฑ: MIT ๋ผ์ด์ ์ค ๊ธฐ๋ฐ ์์ ํ ์คํ์์ค๋ก, ์์ค ์ฝ๋ ๊ฒ์ฆ๊ณผ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅ
- CUDA ํธํ์ฑ: HIP๋ฅผ ํตํ ๋์ ์์ค์ CUDA ํธํ์ฑ์ผ๋ก ๊ธฐ์กด ์ฝ๋ ํฌํ ์ฉ์ด
- ๋ฉ๋ชจ๋ฆฌ ์ฉ๋/๋์ญํญ: MI300X 192GB HBM3(5.3 TB/s) ๋ฑ AMD GPU์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ํ์ฉ
- ๋น์ฉ ํจ์จ์ฑ: ๋ผ์ด์ ์ค ๋น์ฉ ์์, AMD GPU์ ๊ฐ์ฑ๋น ์ฐ์
- ์ง์์ ์ธ ๋ฐ์ : ROCm 7.x๊น์ง ๊พธ์คํ ์ ๋ฐ์ดํธ, MI350(CDNA4) ์ง์ ์ค๋น
- ํ๋ ์์ํฌ ํตํฉ: PyTorch, TensorFlow, JAX ๋ฑ ์ฃผ์ ํ๋ ์์ํฌ ๊ณต์ ์ง์
๋จ์
- ์ํ๊ณ ์ฑ์๋: CUDA ๋๋น 10๋ ์ด์์ ๊ฒฉ์ฐจ, ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฑ๋ฅ ๊ฒฉ์ฐจ
- ๋๊ตฌ ์ง์: Nsight, TensorRT ๋ฑ NVIDIA ๊ณ ๊ธ ๋๊ตฌ ๋๋น ์ ํ์
- ์ปค๋ฎค๋ํฐ ๊ท๋ชจ: NVIDIA ๋๋น ์๋์ ์ผ๋ก ์์ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ
- ๋๋ผ์ด๋ฒ ์์ ์ฑ: ์ผ๋ถ ํ๊ฒฝ์์ ๋๋ผ์ด๋ฒ ์ด์ ๋ณด๊ณ
- ํ๋์จ์ด ์ง์ ๋ฒ์: NVIDIA GPU ๋๋น ์๋์ ์ผ๋ก ์ ํ๋ GPU ๋ผ์ธ์
- ํ๋ก๋์ ๊ฒ์ฆ: ๋๊ท๋ชจ ํ๋ก๋์ ๋ฐฐํฌ ์ฌ๋ก๊ฐ ์์ง ์ถ์ ์ค
๊ด๋ จ ๊ธฐ์
์ฐธ๊ณ ํ์ค ๋ฐ ์๋ฃ
- AMD ROCm Documentation (https://rocm.docs.amd.com)
- AMD HIP Programming Guide
- HSA (Heterogeneous System Architecture) Specification
- AMD Instinct MI300X Datasheet
- AMD CDNA Architecture Whitepaper
- LLVM AMDGPU Backend Documentation
๊ด๋ จ ๋ฌธ์
- AMD GPU ์์ธ
- CUDA ์์ธ
- AI ์ํํธ์จ์ด ์คํ ๊ฐ์
- AI ๊ฐ์๊ธฐ ๊ฐ์
- ํผํฉ ์ ๋ฐ๋ ํ๋์จ์ด
- ํ ์ ์ฝ์ด ์ํคํ ์ฒ
- GPU ๋ฉ๋ชจ๋ฆฌ ์ํคํ ์ฒ ๊ธฐ์ด
- ์ถ๋ก vs ํ๋ จ
ํต์ฌ ์ ๋ฆฌ
-
ROCm์ AMD์ ์คํ์์ค GPU ์ปดํจํ ํ๋ซํผ์ผ๋ก, HIP ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ํตํด CUDA ์ฝ๋์ ๋์ ํธํ์ฑ์ ์ ๊ณตํ๋ฉด์๋ AMD GPU์ ํ๋์จ์ด ์ด์ ์ ํ์ฉํ ์ ์๋ค.
-
ROCm ์คํ์ ํ๋ ์์ํฌ-์ปดํ์ผ๋ฌ-๋ผ์ด๋ธ๋ฌ๋ฆฌ-๋ฐํ์-๋๋ผ์ด๋ฒ์ ๋ค์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋๋ฉฐ, MIOpen, rocBLAS, RCCL ๋ฑ ๋ค์ํ ๊ณ ์ฑ๋ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด AI/HPC ์ํฌ๋ก๋๋ฅผ ๊ฐ์ํํ๋ค.
-
HIP๋ CUDA C/C++๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ๊ธฐ์กด CUDA ์ฝ๋๋ฅผ AMD GPU๋ก ํฌํ ํ ์ ์๊ฒ ํ๋ฉฐ,
hipify๋๊ตฌ๋ฅผ ํตํ ์๋ ๋ณํ๋ ์ง์ํ๋ค. -
ROCm์ MI250X(CDNA2), MI300X(CDNA3), MI350(CDNA4) ๋ฑ ์ฌ๋ฌ ์ธ๋์ AMD Instinct GPU๋ฅผ ์ง์ํ๋ฉฐ, PyTorch, TensorFlow, JAX ๋ฑ ์ฃผ์ ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์์ ํตํฉ์ ์ง์์ ์ผ๋ก ํ๋ํ๊ณ ์๋ค.
-
ROCm์ ์ฃผ์ ๊ฐ์ ์ ์คํ์์ค ํฌ๋ช ์ฑ, CUDA ํธํ์ฑ, AMD GPU์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋/๋์ญํญ ํ์ฉ์ด๋ฉฐ, ์ํ๊ณ ์ฑ์๋์ ๋๊ตฌ ์ง์์ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์๋ ๊ณผ์ ์ด๋ค.