[CUDA & Modern C++로 GPU 프로그래밍 시작하기] #1: 개발 환경 세팅과 “Hello, GPU!” 예제

 

이 시리즈는 총 10개의 글로 진행됩니다. 이번 첫 글에서는 Ubuntu 기반의 개발 환경을 준비하고, 가장 단순한 CUDA 예제를 통해 “Hello, GPU!”를 출력해보겠습니다. Windows 환경 설정에 대한 언급도 곁들이니, OS에 관계없이 따라 할 수 있을 거예요. 앞으로 진행될 10개의 단계 중 첫 번째 스텝으로, "내 GPU에 손을 흔들어보기"라고 생각해주세요!

이 시리즈를 시작하며

GPU 프로그래밍은 처음 접하면 조금 낯설게 느껴질 수 있습니다. 하지만 CPU 프로그래밍을 시작할 때 “Hello, World!”를 먼저 찍어봤듯이, CUDA에서도 비슷하게 기초부터 천천히 쌓아나갈 수 있습니다. 앞으로 이 시리즈를 통해 다음 단계들을 차근차근 진행할 예정입니다:

  1. 개발 환경 설정 (Ubuntu & Windows), 간단한 “Hello, GPU!” 예제
  2. Host(CPU)와 Device(GPU) 코드 구조 이해하기
  3. CUDA 메모리 관리와 커널 런칭 기초
  4. 스레드, 블록, 그리드 개념 정리
  5. 간단한 벡터 연산 예제
  6. 비동기 스트림과 기본 최적화 기법 맛보기
  7. CMake를 통한 현대적 빌드 설정 (C++20/23 & 최신 CUDA 특징)
  8. 디버깅 및 성능 프로파일링 기초 소개
  9. 간단한 실전 예제를 통한 개념 정리
  10. 마무리 및 다음 단계(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) 코드 구조를 좀 더 자세히 파헤쳐보고, 기본적인 데이터 전송과 커널 런칭 개념을 익혀볼 예정입니다.

유용한 링크 & 리소스

반응형