[Vulkan으로 GPGPU 시작하기] #1: Vulkan 소개와 시리즈 개요

들어가며

많은 개발자들이 GPU를 활용한 병렬 연산(GPGPU)에 대해 관심을 가지고 있습니다. 일반적으로 GPGPU를 떠올리면 가장 먼저 CUDA를 연상하는 경우가 많습니다. NVIDIA GPU 상에서 폭넓은 지원과 고성능 라이브러리를 제공하는 CUDA는 확실히 GPGPU 분야의 강자입니다. 그렇다면 Vulkan은 어떨까요?

 

Vulkan은 Khronos 그룹이 정의한, 차세대 저수준(low-level) 그래픽 및 컴퓨팅 API로 잘 알려져 있습니다. 흔히 “OpenGL의 다음 세대 솔루션”이라고 부르며, 높은 이식성과 멀티플랫폼 지원을 장점으로 합니다. 그러나 Vulkan은 단순히 그래픽 렌더링뿐만 아니라, GPGPU 연산(Compute Shader)에도 활용할 수 있는 범용 플랫폼이기도 합니다.

 

이 시리즈는 Vulkan을 GPGPU 목적으로 사용하는 방법을 단계별로 안내합니다. 특히 CUDA에 익숙한 독자들을 위해, 다양한 시점에서 Vulkan과 CUDA를 비교하는 팁과 관점을 제공하겠습니다.

왜 Vulkan으로 GPGPU?

  1. 멀티벤더 지원:
    CUDA는 NVIDIA GPU 전용이라면, Vulkan은 AMD, Intel, NVIDIA 등 다양한 벤더의 GPU를 폭넓게 지원합니다. 즉, 특정 하드웨어에 종속되지 않고 멀티플랫폼 개발이 가능해집니다.
  2. 저수준 접근 및 높은 유연성:
    CUDA는 NVIDIA에서 제공하는 상대적으로 추상화된 병렬 프로그래밍 모델을 통해 편리함을 제공하지만, Vulkan은 더 저수준에 가까운 API로, GPU 리소스 제어를 세밀하게 할 수 있습니다. 이는 초기 설정이 복잡할 수 있으나, 보다 다양한 상황에서 최적화 여지가 커집니다.
  3. 그래픽과 컴퓨팅의 통합:
    Vulkan은 원래 그래픽 API지만, Compute Shader를 통해 GPGPU 연산도 수행할 수 있습니다. 이는 렌더링과 계산을 하나의 파이프라인 안에서 자연스럽게 섞을 수 있음을 의미합니다. 예를 들어, 렌더링된 이미지에 바로 GPU 연산을 적용하는 워크플로우가 수월해집니다.
  4. SPIR-V 기반 셰이더:
    Vulkan은 셰이더를 SPIR-V라는 중간 표현으로 다룹니다. CUDA의 NVCC/PTX와 달리, 표준화된 중간 표현을 통해 서로 다른 프론트엔드(예: GLSL, HLSL)로부터 유연하게 접근 가능하며, 이식성이 높습니다.

이 시리즈에서 다룰 내용 (총 10편)

  1. Vulkan 소개 및 시리즈 개요 (현재 글)
    • Vulkan 개념, GPGPU 활용 가능성, 앞으로의 로드맵 제시
    • CUDA와 Vulkan의 고레벨 비교 포인트 제안
  2. 개발 환경 설정 (Ubuntu 기반, Windows 언급)
    • Vulkan SDK 설치, 드라이버 설정, 기본 툴 준비
    • CUDA 개발 환경과 비교: 멀티벤더 지원을 위한 셋업 특징 강조
  3. Vulkan 인스턴스와 디바이스 초기화
    • VkInstance 생성, 물리 디바이스 및 로지컬 디바이스 선택
    • CUDA에서 GPU 디바이스를 직접 선택하는 과정과의 비교
  4. 큐(Queue)와 커맨드 버퍼 이해하기
    • GPU 명령 전달 구조 파악, 큐 패밀리 개념
    • CUDA의 스트림(Stream) 개념과 Vulkan 큐 개념 비교
  5. 메모리 관리와 버퍼/이미지 객체
    • Vulkan 메모리 할당 및 버퍼 관리 기초
    • CUDA 메모리 할당(cudaMalloc) 모델과 Vulkan 메모리 모델 비교
  6. 셰이더(Shader) 및 컴퓨트 파이프라인(Compute Pipeline) 구성
    • SPIR-V 컴퓨트 셰이더 작성 및 파이프라인 설정
    • CUDA 커널 함수 구성 및 NVCC 활용 방식과의 비교
  7. 간단한 컴퓨트 셰이더 예제: 벡터 덧셈
    • Vulkan 컴퓨트 파이프라인을 이용한 벡터 연산 예제 구현
    • CUDA에서의 벡터 덧셈 예제와 대조: 코드 복잡성, 설정 과정 비교
  8. 동기화(Synchronization)와 이벤트, 배리어
    • GPU 연산 순서 제어를 위한 Vulkan 동기화 기법
    • CUDA 이벤트(Event), 스트림 동기화와 Vulkan의 동기화 모델 비교
  9. 디버깅, 검증 레이어(Validation Layers) 및 성능 프로파일링
    • Vulkan Validation Layer 활용, Nsight Graphics/Compute 사용 예고
    • CUDA 디버깅/프로파일링 툴과의 차이점 및 유사점
  10. 고급 주제로 넘어가기
    • 멀티 디바이스, 고급 최적화 기법, 다른 컴퓨팅 프레임워크와의 결합 아이디어
    • CUDA와 Vulkan을 혼합 사용하거나, Vulkan 기반의 ML/데이터 처리 워크플로우 확장성 논의

앞으로의 방향성

이 시리즈는 GPGPU에 초점을 맞추고 있으며, 가능한 한 CUDA 경험자들에게 자연스럽게 Vulkan 개념을 연결해나갈 것입니다. CUDA에서 해오던 작업을 Vulkan에서 어떻게 재현하고, 어떤 추가 이점(또는 단점)이 있는지 수시로 언급할 예정입니다. 이렇게 하면 기존에 GPU 프로그래밍 경험이 있는 독자들이 Vulkan을 더 쉽게 이해하고, 나아가 멀티벤더 환경에서 GPU를 활용하는 능력을 갖출 수 있을 것입니다.

다음 글 예고

다음 글(#2)에서는 Ubuntu를 기준으로 Vulkan SDK를 설치하고, 필요한 드라이버 및 라이브러리를 준비하는 방법을 알아봅니다. 또한 Windows 환경에 대한 짧은 가이드도 제시하고, CUDA 개발 환경과는 어떻게 다른지 짚어볼 예정입니다.

유용한 링크 & 리소스

반응형