반응형
시리즈의 열 번째이자 마지막 글입니다. 지금까지 1편부터 9편에 걸쳐 Vulkan을 이용한 GPGPU 프로그래밍 기초를 다뤘습니다. CUDA에 익숙한 분들을 대상으로 Vulkan의 준비 과정, Compute 셰이더 파이프라인 구성, 메모리 및 디스크립터 관리, 디버깅 및 프로파일링 기법 등을 차근차근 설명했으며, 간단한 벡터 덧셈 예제를 통해 전체 흐름을 체험해보았습니다. 이제 이 입문 시리즈를 마무리하며, 이후 Intermediate/Advanced 주제로 나아갈 때 참고할 만한 자료와 도전 과제들을 간단히 정리하고자 합니다.입문 시리즈 마무리이 시리즈를 통해 다음과 같은 과정들을 이해하고 실습했습니다.Vulkan 환경 설정(Ubuntu/Windows), CMake를 통한 빌드인스턴스, 물리 디바이스,..
이제 10개의 글에 걸친 “CUDA & Modern C++로 GPU 프로그래밍 시작하기” 시리즈를 마칠 시점입니다. 첫 글에서는 단순히 “Hello, GPU!”를 출력하는 예제부터 시작했지만, 이제는 Host-Device 메모리 관리, 스레드/블록/그리드 개념, 비동기 스트림, 메모리 계층(Shared/Constant), CMake 기반의 현대적 빌드, Modern C++ 기능 적용, 디버깅 및 프로파일링까지 다양한 주제를 맛보았습니다. 마지막으로 이 시리즈를 정리하며, 앞으로 여러분이 확장해나갈 수 있는 주제들을 안내하겠습니다.시리즈 정리환경 설정 & Hello GPU!: CUDA 개발환경(드라이버, 툴킷) 세팅 및 간단한 출력 예제를 통해 기본 틀을 잡았습니다.Host vs Device 코드 구조 이..
지난 글에서는 2D 데이터 처리와 비동기 스트림(Asynchronous Streams)을 통해 Host와 Device 간 연산이 겹칠 수 있음을 확인했습니다. 이제는 GPU 메모리 계층을 살짝 들여다보고, 성능 최적화를 위해 왜 이러한 구조가 존재하는지 알아볼 차례입니다. 오늘 다룰 주제는 Shared Memory와 Constant Memory라는 특별한 메모리 공간들입니다. 이들은 단순한 글로벌 메모리(Global Memory) 접근보다 훨씬 더 빠르거나 특정 상황에서 효율적인 접근을 가능하게 해줍니다.메모리 계층 구조 이해하기GPU 메모리는 단순하지 않습니다. 성능을 극대화하기 위해 다양한 메모리 종류가 존재합니다.Global Memory(전역 메모리): 우리가 지금까지 cudaMalloc로 할당한 ..
C++23에서는 컴파일러에게 특정 코드 경로가 절대 도달하지 않을 것임을 알리는 새로운 함수인 std::unreachable()가 도입되었습니다. 이번 글에서는 std::unreachable()의 개념과 사용법, 그리고 이전 버전과 비교하여 어떻게 개선되었는지 알아보겠습니다. std::unreachable()란 무엇인가요?std::unreachable()는 코드 상에서 절대 실행될 수 없는 경로임을 컴파일러에 알려주는 함수입니다. 이는 정의되지 않은 동작(Undefined Behavior)을 발생시키며, 컴파일러가 이 정보를 활용하여 해당 코드 경로를 제거하거나 최적화할 수 있게 합니다. 예를 들어, switch 문의 default 분기가 절대 발생하지 않는 경우나 특정 조건이 항상 참이라 이외의 경로로..
C++23에서는 컴파일러에게 특정 조건이 항상 참임을 알려주는 새로운 속성(attribute)인 [[assume]]가 도입되었습니다. 이번 글에서는 [[assume]] 속성의 개념과 사용법, 그리고 이전 버전과 비교하여 어떻게 개선되었는지 알아보겠습니다.[[assume]]란 무엇인가요?[[assume]]는 조건식이 항상 참(true) 이라고 컴파일러에게 알려주는 속성입니다. 이를 통해 컴파일러는 해당 조건에 기반한 최적화(Optimization)를 더욱 적극적으로 수행할 수 있게 됩니다. 예를 들어, 특정 분기를 제거하거나, 조건 검사 코드를 생략하는 등의 최적화를 기대할 수 있습니다.이전 버전에서는 어떻게 했나요?C++23 이전에는 조건이 항상 참임을 컴파일러에게 명시적으로 전달할 표준화된 방법이 없었..
C++20에서는 코드의 성능과 가독성을 향상시키기 위한 다양한 기능이 도입되었습니다. 그중에서도 [[likely]]와 [[unlikely]] 속성은 조건문의 분기 예측을 컴파일러에 힌트로 제공하여 최적화를 도울 수 있습니다. 이번 글에서는 이 속성들의 개념과 사용법, 그리고 이전 버전과 비교하여 어떻게 개선되었는지 알아보겠습니다.[[likely]]와 [[unlikely]]란 무엇인가요?[[likely]]와 [[unlikely]]는 C++20에서 도입된 속성(attribute)으로, 조건문에서 어떤 분기(branch)가 더 자주 실행될 것인지 컴파일러에 힌트를 제공하는 역할을 합니다. 이를 통해 컴파일러는 분기 예측(branch prediction)을 최적화하여 실행 성능을 향상시킬 수 있습니다.이전 버전..