반응형
모던 Vulkan (C++ 버전) 시리즈의 아홉 번째 글입니다. 지금까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, Compute 파이프라인 및 디스크립터 구성, 벡터 덧셈 예제, 디버깅/프로파일링 전략까지 모든 단계를 Modern C++와 Vulkan-HPP를 활용해 재정비했습니다. 이번 글에서는 지금까지 다룬 내용을 정리하고, 앞으로 Intermediate/Advanced 주제로 나아갈 때 고려할 만한 확장 방향성을 소개하겠습니다.여기까지 다룬 내용 요약이 시리즈에서는 기존 입문 시리즈에서 C 스타일 Vulkan 코드를 사용해 다루었던 주제들을 모두 C++17 이상과 Vulkan-HPP, RAII 패턴, 예외 처리를 활용해 Modern C++ 스타일로 다시 구현했습니다.인스턴스 ..
모던 Vulkan (C++ 버전) 시리즈의 여덟 번째 글입니다. 지금까지 RAII와 Vulkan-HPP를 활용해 인스턴스부터 디바이스, 파이프라인, 커맨드 버퍼, 메모리 관리, 벡터 덧셈 예제까지를 Modern C++ 스타일로 재정비했습니다. 이제 개발 과정에서 필수적인 디버깅, Validation Layer, 그리고 성능 프로파일링에 대해 다시 한번 점검해보겠습니다.입문 시리즈에서 Validation Layer와 RenderDoc, Nsight Graphics, Nsight Systems 등의 툴을 간단히 언급한 바 있습니다. 이번에는 RAII 코드 기반으로 디버깅할 때 어떤 장점이 있는지, 그리고 Modern C++ 예외 처리와 결합해서 에러나 경고 메시지를 더 명확하게 처리하는 방법, 성능 프로파일..
모던 Vulkan (C++ 버전) 시리즈의 일곱 번째 글입니다. 이제까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, 버퍼 생성, Compute 파이프라인 및 디스크립터 구성까지 모두 C++ RAII 패턴과 Vulkan-HPP를 활용해 재정비했습니다. 이제 드디어 실제 GPGPU 연산을 수행하는 벡터 덧셈 예제를 Modern C++ 스타일로 완성해봅시다.입문 시리즈에서 C 스타일로 구현했던 벡터 덧셈 과정(Host에서 A, B를 준비한 뒤 GPU로 올리고, Compute 셰이더로 A+B를 C에 기록, 다시 Host로 결과를 가져오는 과정)을 이제 Vulkan-HPP 기반 C++ RAII 패턴, 예외 처리, STL 컨테이너와 함께 사용해 깔끔하게 재작성하겠습니다.목표호스트에서 std::..
모던 Vulkan (C++ 버전) 시리즈의 여섯 번째 글입니다. 지난 글(#5)에서는 메모리 관리와 버퍼 생성 과정을 Vulkan-HPP, RAII, 예외 처리를 활용해 재정립했습니다. 이제 GPGPU 연산을 수행하기 위해 필요한 Compute 파이프라인(Compute Pipeline)과 디스크립터(Descriptor) 관련 설정을 Modern C++ 스타일로 다시 구현해보겠습니다.입문 시리즈에서 SPIR-V 셰이더 모듈을 로드하고, 파이프라인 레이아웃과 컴퓨트 파이프라인을 생성한 뒤, 디스크립터 풀과 디스크립터 셋을 통해 버퍼를 셰이더에 바인딩하는 과정을 다뤘습니다. 이번에는 Vulkan-HPP를 활용해 RAII 기반의 vk::UniqueShaderModule, vk::UniquePipeline, vk..
모던 Vulkan (C++ 버전) 시리즈의 다섯 번째 글입니다. 지난 글(#4)에서 커맨드 버퍼, 커맨드 풀, 큐 제출 과정을 Modern C++ 스타일로 재작성했다면, 이번에는 메모리 관리와 버퍼 생성 과정을 Vulkan-HPP와 RAII를 활용해 더 단순화해보겠습니다. 이전 입문 시리즈에서는 C 스타일로 메모리 타입을 찾고, vkAllocateMemory, vkMapMemory, vkBindBufferMemory 등을 호출하는 방식을 썼습니다. 이제는 Vulkan-HPP를 통한 강타입 enum, RAII 객체, 예외 처리로 메모리 관리 로직을 개선하고, 코드 가독성을 높일 것입니다.목표Vulkan-HPP의 vk::BufferCreateInfo, vk::UniqueBuffer를 활용해 RAII 버퍼 객..
모던 Vulkan (C++ 버전) 시리즈의 네 번째 글입니다. 지난 글(#3)에서 물리 디바이스 선택 및 로지컬 디바이스, 큐 확보를 C++ RAII, 예외 처리 모드로 재작성했습니다. 이제 GPU에 명령을 전달하기 위한 커맨드 버퍼(Command Buffer)와 커맨드 풀(Command Pool), 그리고 큐 제출 과정을 Modern C++ 스타일로 다시 구현해봅시다.입문 시리즈에서는 C 스타일로 vkCreateCommandPool, vkAllocateCommandBuffers, vkQueueSubmit 등을 호출했지만, 이번에는 vk::UniqueCommandPool, vk::UniqueCommandBuffer, vk::SubmitInfo 등 Vulkan-HPP를 적극 활용하고, RAII를 통해 자원..
모던 Vulkan (C++ 버전) 시리즈의 세 번째 글입니다. 지난 글(#2)에서는 Vulkan-HPP와 Modern C++ 스타일을 적용해 인스턴스를 생성하고 Validation Layer와 익스텐션 설정 과정을 간소화했습니다. 이제 인스턴스가 준비되었으니, 시스템에 장착된 GPU(물리 디바이스)를 탐색하고, Compute 또는 Graphics에 적합한 큐 패밀리를 선택한 뒤 로지컬 디바이스를 생성하고 큐를 확보하는 과정을 C++ RAII 패턴을 활용해 다시 구현해보겠습니다.입문 시리즈에서 C 스타일 코드로 했던 과정을 이제 Vulkan-HPP와 RAII(Unique*), 예외 처리 등을 통해 더 깔끔하고 유지보수하기 쉬운 형태로 재작성합니다.목표인스턴스가 준비되었다고 가정하고, 물리 디바이스(Phys..
모던 Vulkan (C++ 버전) 시리즈의 두 번째 글입니다. 이번 글에서는 인스턴스를 생성하는 과정을 Vulkan-HPP와 Modern C++ 스타일로 재작성해보겠습니다. 이전 입문 시리즈에서 C 스타일로 인스턴스를 만들고 Validation Layer를 설정했던 과정을 다시 돌아보며, 이번에는 RAII를 활용한 vk::UniqueInstance, 예외 처리 모드 등을 적용하여 더 깔끔하고 유지보수하기 쉬운 코드를 작성하는 방법을 제시합니다.목표Vulkan C API 스타일로 작성했던 인스턴스 생성 코드를 Vulkan-HPP 기반 C++ 코드로 재구성vk::ApplicationInfo, vk::InstanceCreateInfo 등을 이용하여 Application, Engine, API 버전 정보 설정v..
왜 Vulkan-HPP인가?이전 입문 시리즈에서는 주로 C 스타일 Vulkan API를 사용했습니다. C 스타일 API는 다음과 같은 특징을 갖습니다.함수 포인터 기반 호출: vkCreateInstance, vkEnumeratePhysicalDevices 등리소스 관리의 수동성: vkDestroy* 함수를 일일이 호출해야 함타입 안전성 부족: 단순 enum, void* 기반 핸들, 에러 처리 시 VK_SUCCESS 등을 if문으로 체크이런 패턴은 어느 정도 익숙해지면 사용할 수 있지만, 실수하기 쉽고 코드량이 많아집니다. Modern C++(C++17 이상)에서는 RAII, 스마트 포인터, enum class, std::optional, std::variant 등 다양한 언어 기능을 통해 코드 품질을 높..
시리즈의 열 번째이자 마지막 글입니다. 지금까지 1편부터 9편에 걸쳐 Vulkan을 이용한 GPGPU 프로그래밍 기초를 다뤘습니다. CUDA에 익숙한 분들을 대상으로 Vulkan의 준비 과정, Compute 셰이더 파이프라인 구성, 메모리 및 디스크립터 관리, 디버깅 및 프로파일링 기법 등을 차근차근 설명했으며, 간단한 벡터 덧셈 예제를 통해 전체 흐름을 체험해보았습니다. 이제 이 입문 시리즈를 마무리하며, 이후 Intermediate/Advanced 주제로 나아갈 때 참고할 만한 자료와 도전 과제들을 간단히 정리하고자 합니다.입문 시리즈 마무리이 시리즈를 통해 다음과 같은 과정들을 이해하고 실습했습니다.Vulkan 환경 설정(Ubuntu/Windows), CMake를 통한 빌드인스턴스, 물리 디바이스,..