반응형
모던 Vulkan (C++ 버전) 시리즈의 아홉 번째 글입니다. 지금까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, Compute 파이프라인 및 디스크립터 구성, 벡터 덧셈 예제, 디버깅/프로파일링 전략까지 모든 단계를 Modern C++와 Vulkan-HPP를 활용해 재정비했습니다. 이번 글에서는 지금까지 다룬 내용을 정리하고, 앞으로 Intermediate/Advanced 주제로 나아갈 때 고려할 만한 확장 방향성을 소개하겠습니다.여기까지 다룬 내용 요약이 시리즈에서는 기존 입문 시리즈에서 C 스타일 Vulkan 코드를 사용해 다루었던 주제들을 모두 C++17 이상과 Vulkan-HPP, RAII 패턴, 예외 처리를 활용해 Modern C++ 스타일로 다시 구현했습니다.인스턴스 ..
안녕하세요! 지난 글에서는 OpenCL을 활용한 이미지 처리 예제를 다루며, 실제로 GPU 가속의 이점을 경험해봤습니다. 이제부터는 좀 더 깊은 주제로 들어가, 성능 최적화(Performance Optimization)에 대한 기본 개념을 살펴보려 해요. 입문자 수준에서 모든 최적화를 다루기는 어렵지만, 워크그룹(work-group) 설정, 메모리 접근 패턴 개선, 그리고 프로파일링(profiling) 도구 활용으로 성능을 개선할 수 있는 아이디어를 얻을 수 있습니다.이번 글에서는 다음 내용을 다룹니다.워크아이템(work-item), 워크그룹(work-group) 개념과 성능 관계메모리 계층(global, local, private memory)과 접근 패턴 최적화프로파일링을 통한 병목 지점 확인CUDA..
들어가며이 시리즈에서 우리는 다음과 같은 단계를 거쳐왔습니다.C++ 환경에서 LibTorch 사용법 익히기 (기초 텐서 연산, TorchScript 모델 로드)Python에서 학습한 모델을 C++로 가져와 추론하기pybind11을 통해 C++ 코드를 Python에 바인딩하기C++과 Python 사이에서 텐서를 자유롭게 교환하는 기법 살펴보기이제 여기까지 배운 내용을 종합하여, 하나의 일관된 파이프라인을 구축해봅시다. 최종적으로 다음과 같은 흐름을 구현할 예정입니다.Python에서 텐서(입력 데이터) 준비pybind11로 바인딩된 C++ 함수를 호출해 TorchScript 모델 추론 수행결과 텐서를 Python으로 되돌려 받아 후처리 및 시각화이 과정을 통해 C++ 성능과 Python의 편리함을 동시에 누..
지난 글(#4)에서는 큐(Queue)와 커맨드 버퍼(Command Buffer) 개념을 정리하며, Vulkan이 GPU에 명령을 전달하는 독특한 방식을 살펴봤습니다. 이제 GPU에게 할 일을 시킬 수 있는 준비는 되었지만, 정작 우리가 처리할 데이터(배열, 이미지 등)를 GPU 메모리에 올려놓는 과정은 아직 다루지 않았습니다. 이번 글에서는 Vulkan 메모리 관리의 기초인 메모리 할당, 버퍼(Buffer), 이미지(Image) 객체를 다뤄보겠습니다.CUDA를 사용해보신 분이라면 cudaMalloc과 cudaMemcpy 정도로 GPU 메모리 관리가 비교적 단순했다는 기억이 있을 겁니다. 반면 Vulkan에서는 메모리 할당이 좀 더 “수작업”에 가깝고, 어떤 메모리 타입을 쓸지 직접 결정하고, 버퍼나 이미..