반응형
모던 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 등 다양한 언어 기능을 통해 코드 품질을 높..
이번 글은 Vulkan C API보다 더 모던한 C++ 스타일로 Vulkan을 활용할 수 있는 Vulkan-HPP에 대한 소개 글입니다. 단순히 함수 포인터를 나열하는 수준에 머무르지 않고, Vulkan을 C++ RAII(Resource Acquisition Is Initialization) 패턴, 강타입(Enum class), 예외 처리 등을 활용해 더 안전하고 깔끔하게 사용할 수 있다는 점에 초점을 둡니다. 또한, 최소 예제 코드와 CMake 설정을 통해 실제로 빌드해볼 수 있는 예시를 제시하겠습니다.Vulkan-HPP란 무엇인가?Vulkan-HPP는 Vulkan C API를 C++ 스타일로 감싸는 헤더만의 래퍼(wrapper) 라이브러리입니다. Khronos 그룹이 공식적으로 관리하며, vulkan..
시리즈의 열 번째이자 마지막 글입니다. 지금까지 1편부터 9편에 걸쳐 Vulkan을 이용한 GPGPU 프로그래밍 기초를 다뤘습니다. CUDA에 익숙한 분들을 대상으로 Vulkan의 준비 과정, Compute 셰이더 파이프라인 구성, 메모리 및 디스크립터 관리, 디버깅 및 프로파일링 기법 등을 차근차근 설명했으며, 간단한 벡터 덧셈 예제를 통해 전체 흐름을 체험해보았습니다. 이제 이 입문 시리즈를 마무리하며, 이후 Intermediate/Advanced 주제로 나아갈 때 참고할 만한 자료와 도전 과제들을 간단히 정리하고자 합니다.입문 시리즈 마무리이 시리즈를 통해 다음과 같은 과정들을 이해하고 실습했습니다.Vulkan 환경 설정(Ubuntu/Windows), CMake를 통한 빌드인스턴스, 물리 디바이스,..
시리즈의 아홉 번째 글입니다. 지금까지 인스턴스 설정, 물리 디바이스 선택, 로지컬 디바이스와 큐 확보, 커맨드 버퍼 & 큐를 통한 명령 전달, 메모리 관리, Compute 파이프라인 & 디스크립터 설정, 그리고 벡터 덧셈 예제로 GPGPU 전체 흐름을 익혀보았습니다. 또한 디버깅과 프로파일링에 대해 간단히 살펴봤습니다. 이번 글에서는 지금까지 다룬 내용을 좀 더 실전적 관점에서 정리하고, 다음 단계(Intermediate/Advanced)로 넘어가기 전 고려할 만한 주제들을 언급하겠습니다.여기까지 다룬 내용 정리환경 설정 & 기본 예제:Vulkan SDK, 드라이버 설치가장 단순한 “Hello Vulkan!”로 인스턴스 생성 확인CMake를 통한 빌드 예제물리 디바이스 & 로지컬 디바이스 & 큐:GPU..
아래는 이 시리즈의 여덟 번째 글입니다. 지난 글(#7)에서는 벡터 덧셈 예제를 통해 Vulkan을 활용한 GPGPU 연산의 전체 흐름을 체험해보았습니다. 이제 어느 정도 기본 개념과 실전 예제를 익혔다면, 개발 과정에서 마주할 수 있는 문제들을 어떻게 디버깅하고, 성능을 프로파일링할 수 있는지 알아볼 차례입니다. 이번 글에서는 디버깅, 검증 레이어(Validation Layers)와 성능 프로파일링 기초를 살펴보며, 복잡한 Vulkan 생태계에서 발생할 수 있는 다양한 이슈를 어떻게 추적하고 최적화할 수 있을지 소개하겠습니다.왜 디버깅과 프로파일링이 중요한가?Vulkan은 로우레벨 API이기 때문에 초기화, 메모리 관리, 파이프라인 설정, 디스크립터 업데이트 등 다양한 단계에서 실수가 발생하기 쉽습니다..
지난 글(#6)에서는 Compute 셰이더를 SPIR-V로 컴파일하고, 이를 기반으로 Compute 파이프라인을 만들고, 디스크립터를 활용해 셰이더에 데이터를 연결하는 방법을 살펴봤습니다. 이제 이 모든 준비 과정을 종합해 실제로 GPGPU 연산을 수행하는 간단한 예제를 만들어보겠습니다. 이번 글에서는 벡터 덧셈(Vector Addition) 예제를 통해, 호스트에서 데이터를 준비하고 GPU로 전달한 뒤, Compute 셰이더를 통해 연산을 수행하고 결과를 다시 가져오는 전체 흐름을 정리해볼 것입니다.CUDA에서 벡터 덧셈은 대략 cudaMalloc, cudaMemcpy, kernel>>, cudaMemcpy라는 단순한 과정을 거치며, 커널 코드도 data[idx] = a[idx] + b[idx];처럼 ..
안녕하세요! 오늘은 미국에서 인기 있는 투자 플랫폼인 로빈후드(Robinhood)에서 계좌를 만드는 방법에 대해 자세히 알아보겠습니다. 로빈후드는 사용이 간편하고 수수료가 없어 초보 투자자들에게 특히 인기가 있습니다. 그럼 지금부터 단계별로 로빈후드 계좌 개설 과정을 살펴보겠습니다.1. 로빈후드 앱 다운로드먼저 로빈후드 앱을 다운로드해야 합니다. iOS 사용자는 App Store에서, Android 사용자는 Google Play Store에서 'Robinhood'를 검색하여 앱을 설치할 수 있습니다. 웹 브라우저를 통해서도 계좌를 만들 수 있지만, 모바일 앱을 사용하는 것이 더 편리합니다.2. 계정 생성하기앱을 설치한 후, 'Sign Up' 버튼을 눌러 계정 생성을 시작합니다. 이메일 주소, 비밀번호, ..
안녕하세요, 엔지니어링 분야에 관심 있는 여러분! 오늘은 Levels.fyi의 최신 업데이트에 대해 소개해드리려고 합니다. 이 흥미진진한 소식을 하나씩 자세히 살펴보겠습니다.우선, Levels.fyi에 대해 모르시는 분들을 위해 간단히 설명드리겠습니다. Levels.fyi는 원래 소프트웨어 엔지니어들을 위한 급여 정보 공유 플랫폼으로 시작했습니다. 이 플랫폼은 기술 업계의 급여 투명성을 높이는 데 큰 역할을 해왔으며, 엔지니어들이 자신의 가치를 정확히 평가하고 협상에 활용할 수 있도록 도와왔습니다.Levels.fyi의 새로운 확장최근 Levels.fyi 팀은 플랫폼의 범위를 대폭 확장했습니다. 이제 소프트웨어 엔지니어링을 넘어 다양한 엔지니어링 분야의 전문가들을 위한 서비스를 제공하기 시작했습니다. 이는..