반응형
모던 Vulkan (C++ 버전) 시리즈의 여섯 번째 글입니다. 지난 글(#5)에서는 메모리 관리와 버퍼 생성 과정을 Vulkan-HPP, RAII, 예외 처리를 활용해 재정립했습니다. 이제 GPGPU 연산을 수행하기 위해 필요한 Compute 파이프라인(Compute Pipeline)과 디스크립터(Descriptor) 관련 설정을 Modern C++ 스타일로 다시 구현해보겠습니다.입문 시리즈에서 SPIR-V 셰이더 모듈을 로드하고, 파이프라인 레이아웃과 컴퓨트 파이프라인을 생성한 뒤, 디스크립터 풀과 디스크립터 셋을 통해 버퍼를 셰이더에 바인딩하는 과정을 다뤘습니다. 이번에는 Vulkan-HPP를 활용해 RAII 기반의 vk::UniqueShaderModule, vk::UniquePipeline, vk..
시리즈의 열 번째이자 마지막 글입니다. 지금까지 1편부터 9편에 걸쳐 Vulkan을 이용한 GPGPU 프로그래밍 기초를 다뤘습니다. CUDA에 익숙한 분들을 대상으로 Vulkan의 준비 과정, Compute 셰이더 파이프라인 구성, 메모리 및 디스크립터 관리, 디버깅 및 프로파일링 기법 등을 차근차근 설명했으며, 간단한 벡터 덧셈 예제를 통해 전체 흐름을 체험해보았습니다. 이제 이 입문 시리즈를 마무리하며, 이후 Intermediate/Advanced 주제로 나아갈 때 참고할 만한 자료와 도전 과제들을 간단히 정리하고자 합니다.입문 시리즈 마무리이 시리즈를 통해 다음과 같은 과정들을 이해하고 실습했습니다.Vulkan 환경 설정(Ubuntu/Windows), CMake를 통한 빌드인스턴스, 물리 디바이스,..
지난 글(#6)에서는 Compute 셰이더를 SPIR-V로 컴파일하고, 이를 기반으로 Compute 파이프라인을 만들고, 디스크립터를 활용해 셰이더에 데이터를 연결하는 방법을 살펴봤습니다. 이제 이 모든 준비 과정을 종합해 실제로 GPGPU 연산을 수행하는 간단한 예제를 만들어보겠습니다. 이번 글에서는 벡터 덧셈(Vector Addition) 예제를 통해, 호스트에서 데이터를 준비하고 GPU로 전달한 뒤, Compute 셰이더를 통해 연산을 수행하고 결과를 다시 가져오는 전체 흐름을 정리해볼 것입니다.CUDA에서 벡터 덧셈은 대략 cudaMalloc, cudaMemcpy, kernel>>, cudaMemcpy라는 단순한 과정을 거치며, 커널 코드도 data[idx] = a[idx] + b[idx];처럼 ..
지난 글(#5)에서 우리는 Vulkan에서 GPU 메모리를 관리하고, 버퍼나 이미지를 생성하고, 이를 GPU 메모리에 할당하는 기초를 다뤘습니다. 이제는 GPGPU의 핵심인 Compute 셰이더(Compute Shader)를 사용하기 위한 준비 단계로 넘어가겠습니다. Vulkan에서 Compute 셰이더를 실행하려면, 셰이더 코드를 SPIR-V로 컴파일하고, 이를 Compute 파이프라인(Compute Pipeline)에 등록한 뒤, 디스크립터(Descriptor)를 통해 버퍼, 이미지 등 자원을 셰이더에 연결해야 합니다.CUDA에서는 .cu 파일에 커널 코드를 작성하고 nvcc로 컴파일한 뒤 >> 표기법으로 커널을 호출하는 방식에 익숙할 것입니다. 하지만 Vulkan에서는 셰이더를 GLSL/HLSL로 ..
환경 설정이전 글(#1)에서 Vulkan을 GPGPU용으로 활용할 수 있다는 개념적 소개를 했습니다. 이제 실제 코드를 다루려면 환경이 제대로 갖춰져야 합니다. Ubuntu를 예로 들어 Vulkan SDK 설치, 드라이버 설정, CMake 및 기타 툴 설치 방법을 정리하고, Windows 사용자를 위한 간단한 가이드도 제공하겠습니다. 또한 CUDA 경험자들이 Vulkan 환경 구축을 이해하기 쉽도록 CUDA와의 차이점도 다시 상기시켜드리겠습니다.Ubuntu에서 Vulkan 환경 설정1. GPU 드라이버 설치:NVIDIA의 경우:sudo apt updatesudo ubuntu-drivers devicessudo ubuntu-drivers autoinstallAMD/Intel의 경우에는 Mesa 드라이버가 ..