이 시리즈는 총 10개의 글로 진행됩니다. 이번 첫 글에서는 Ubuntu 기반의 개발 환경을 준비하고, 가장 단순한 CUDA 예제를 통해 “Hello, GPU!”를 출력해보겠습니다. Windows 환경 설정에 대한 언급도 곁들이니, OS에 관계없이 따라 할 수 있을 거예요. 앞으로 진행될 10개의 단계 중 첫 번째 스텝으로, "내 GPU에 손을 흔들어보기"라고 생각해주세요!
이 시리즈를 시작하며
GPU 프로그래밍은 처음 접하면 조금 낯설게 느껴질 수 있습니다. 하지만 CPU 프로그래밍을 시작할 때 “Hello, World!”를 먼저 찍어봤듯이, CUDA에서도 비슷하게 기초부터 천천히 쌓아나갈 수 있습니다. 앞으로 이 시리즈를 통해 다음 단계들을 차근차근 진행할 예정입니다:
- 개발 환경 설정 (Ubuntu & Windows), 간단한 “Hello, GPU!” 예제
- Host(CPU)와 Device(GPU) 코드 구조 이해하기
- CUDA 메모리 관리와 커널 런칭 기초
- 스레드, 블록, 그리드 개념 정리
- 간단한 벡터 연산 예제
- 비동기 스트림과 기본 최적화 기법 맛보기
- CMake를 통한 현대적 빌드 설정 (C++20/23 & 최신 CUDA 특징)
- 디버깅 및 성능 프로파일링 기초 소개
- 간단한 실전 예제를 통한 개념 정리
- 마무리 및 다음 단계(Intermediate/Advanced)로의 길잡이
오늘은 첫 발자국, 즉 환경 세팅과 “Hello, GPU!” 출력하기에 집중하겠습니다.
개발 환경 준비하기 (Ubuntu 기준)
필요한 것들:
- Ubuntu (LTS 버전 사용 권장, 예: 20.04 이상)
- NVIDIA GPU 및 해당 드라이버
- CUDA Toolkit (최신 버전 권장)
- 최신 C++ 컴파일러 (GCC 11 이상 또는 Clang 14 이상, C++20/23 지원)
- CMake (3.20 이상 권장)
NVIDIA 드라이버 설치
Ubuntu에서 드라이버 설치는 비교적 간단합니다. "소프트웨어 & 업데이트" → "추가 드라이버" 탭에서 NVIDIA 드라이버를 선택하거나, 터미널에서 다음 명령을 사용할 수 있습니다:
sudo apt update
sudo apt install nvidia-driver-535
(535는 예시 버전이니, 설치 가능한 최신 안정 버전을 선택하세요.)
CUDA Toolkit 설치
NVIDIA 공식 CUDA 다운로드 페이지에서 Ubuntu용 .deb 파일을 받아 설치하거나 아래 명령어로도 설정 가능합니다:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
sudo apt update
sudo apt install cuda
설치 후 nvcc --version 명령으로 CUDA 버전을 확인할 수 있습니다.
Windows 사용자라면?
Windows 사용자는 NVIDIA CUDA Toolkit 공식 페이지에서 Windows용 인스톨러를 받아 설치하면 됩니다. 이후 Visual Studio(2022 권장)나 CMake 기반의 환경을 통해 동일한 CUDA 프로젝트를 빌드하고 실행할 수 있습니다.
CMake로 현대적 C++ & CUDA 빌드하기
과거에는 NVCC 컴파일러 옵션을 직접 세팅하고 Makefile을 수작업으로 관리하곤 했습니다. 이제는 CMake를 통해 한 번에 C++ 표준 설정(C++20/23) 및 CUDA 코드 컴파일을 깔끔하게 할 수 있습니다.
Before (예전 방식):
nvcc -std=c++11 -arch=sm_70 -o hello_cu hello.cu
- 명시적으로 C++11 표준 지정
- 아키텍처 옵션 직접 설정
After (CMake 시대):
CMakeLists.txt에서 프로젝트 언어에 CUDA를 추가하면, CXX/CUDA 표준 설정도 한 번에 처리할 수 있습니다.
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
project(hello_cuda LANGUAGES CXX CUDA)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CUDA_STANDARD 20)
add_executable(hello_cu main.cu)
이제 CMake가 알아서 NVCC를 호출하고, C++20/23 지원을 적용한 현대적 CUDA 코드를 빌드합니다.
첫 번째 CUDA 예제: Hello, GPU!
자, 이제 정말 기초 중의 기초 예제 코드입니다. GPU 커널 내에서 printf를 호출해 “Hello, GPU!”를 화면에 출력하는 간단한 프로그램을 작성해봅시다. 이를 통해 컴파일-실행 파이프라인이 제대로 동작하는지 확인할 수 있습니다.
main.cu 예제 코드:
#include <cstdio>
// GPU에서 실행되는 커널 함수
__global__ void hello_kernel() {
printf("Hello from the GPU!\\n");
}
int main() {
// GPU 커널 런칭: 1개의 블록, 1개의 스레드
hello_kernel<<<1,1>>>();
// GPU 연산이 완료될 때까지 동기화
cudaDeviceSynchronize();
return 0;
}
빌드 & 실행
위 코드와 CMakeLists.txt를 같은 디렉토리에 두고 다음 명령을 실행합니다:
mkdir build
cd build
cmake ..
make
빌드가 완료되면 ./hello_cu를 실행해보세요:
./hello_cu
출력:
Hello from the GPU!
축하합니다! 이제 GPU 코드가 성공적으로 동작했습니다. 이 작은 예제가 의미하는 바는 간단합니다: 당신의 개발 환경이 제대로 갖춰졌고, GPU 코드가 정상적으로 컴파일·실행되었다는 것입니다.
Before vs After: 현대적 C++와 CUDA
이전에는 C++11 정도의 제한된 기능만 활용하거나, 옵션을 직접 관리해야 했습니다. 하지만 이제 C++20/23 문법, 람다, 콘셉트(Concept) 등 최신 기능을 CUDA 코드에서도 활용할 수 있습니다. 빌드 설정은 CMake를 통해 직관적으로 관리합니다.
Before (C++11 시대):
- 복잡한 빌드 스크립트
- 제한된 C++ 기능 활용
After (C++20/23 & CMake 시대):
- 현대적 C++ 기능을 GPU 코드에도 적극 활용 가능
- 직관적인 CMake 설정으로 유지보수성 향상
정리 및 다음 글 예고
오늘은:
- NVIDIA 드라이버 & CUDA Toolkit 설치
- CMake를 통한 현대적 빌드 설정
- 가장 단순한 CUDA 예제("Hello, GPU!") 실행
까지 마쳤습니다. 이제 기본 환경에서 GPU 코드가 동작하는 것을 확인했으니, 다음 글에서는 Host(CPU) 코드와 Device(GPU) 코드 구조를 좀 더 자세히 파헤쳐보고, 기본적인 데이터 전송과 커널 런칭 개념을 익혀볼 예정입니다.