반응형
SYCL 입문 시리즈의 일곱 번째 글입니다. 지금까지 총 여섯 편에 걸쳐 SYCL을 이용한 C++ 기반 GPGPU 프로그래밍 기초를 다루었습니다. CPU, NVIDIA GPU, Qualcomm GPU 등 다양한 벤더의 디바이스에서 동일 코드를 실행하는 전략, CMake 빌드 시스템, Conda 및 Windows 환경 설정, 메모리 모델, ND-Range 설정, 로컬 메모리, USM, 성능 분석 기초까지 폭넓은 개념을 살펴보았습니다.이번 글에서는 지금까지 다룬 내용을 종합 정리하고, 다음 단계(Intermediate/Advanced)로 나아갈 때 참고할 만한 자료나 라이브러리, 그리고 Conda나 Windows 환경에서의 확장 방안을 제안합니다. 이 글로 입문 시리즈를 마무리하면서, 독자들이 이후 더 깊은..
SYCL 입문 시리즈의 여섯 번째 글입니다. 지금까지 SYCL 기초 개념(메모리 모델, 커널 작성), 다양한 디바이스(NVIDIA, Qualcomm GPU) 지원 전략, ND-Range와 로컬 메모리, USM 등 최적화 개념까지 살펴보았습니다. 이번 글에서는 이제까지 익힌 내용을 기반으로 간단한 벤치마크를 수행하고, 성능 차이를 관찰하는 방법을 소개합니다. 또한, 디버깅/프로파일링 도구(RenderDoc, Nsight Graphics, Intel VTune 등)를 간단히 연계해, SYCL 코드의 성능 분석 기초를 다뤄보겠습니다.목표이전 글에서 만든 매트릭스 곱(또는 벡터 연산) 예제를 반복 실행하며 시간 측정ND-Range 워크그룹 크기 변화, 로컬 메모리 사용 여부에 따라 성능 차이 관찰간단한 타이머(..
SYCL 입문 시리즈의 다섯 번째 글입니다. 이전 글(#4)에서 ND-Range 활용, USM(United Shared Memory) 소개, 로컬 액세서 등 성능 최적화의 기초 개념을 다뤄보았습니다. 이제는 지금까지 습득한 개념을 종합해 조금 더 실용적인 예제를 만들어보겠습니다. 이번 글에서는 매트릭스 곱(Matrix Multiplication) 연산을 SYCL로 구현하고, ND-Range 설정, 로컬 메모리(로컬 액세서), USM 혹은 버퍼 기반 접근을 통해 성능을 개선하는 아이디어를 제시합니다.목표매트릭스 곱(행렬 A( MxK ) × B( KxN ) = C( MxN ))를 SYCL 커널로 구현ND-Range 설정을 통해 워크그룹 크기, 워크아이템 분배 조정로컬 액세서(local_accessor) 활용..
SYCL 입문 시리즈의 네 번째 글입니다. 지난 글(#3)에서 SYCL의 메모리 모델과 커널 작성 패턴, 워크아이템/워크그룹 개념을 다뤄봤습니다. 이제 한 걸음 더 나아가, SYCL에서 ND-Range(nd_range) 구성을 활용하고, 더 복잡한 메모리 관리 기법(예: 다양한 메모리 속성, USM(United Shared Memory) 소개) 등 성능 최적화 전략의 기초를 살펴보겠습니다. 이 글은 여전히 입문자를 대상으로 하며, 모든 단계를 가능한 한 자세히 설명하므로, 독자가 직접 따라 해볼 수 있습니다.다만, USM 등 일부 개념은 SYCL 1.2.1 표준 이후 확장된 기능으로, 구현체(예: oneAPI DPC++, hipSYCL)마다 지원 상황이 다를 수 있으므로, 실습 전에 구현체 문서를 참고하..
SYCL 입문 시리즈의 세 번째 글입니다. 이전 글(#2)에서 NVIDIA GPU나 Qualcomm GPU를 대상으로 SYCL 코드를 실행하기 위한 백엔드 선택, 디바이스 셀렉터 사용 방법을 살펴봤습니다. 이제 한 단계 더 나아가, SYCL의 메모리 모델과 커널 작성 패턴을 자세히 다루겠습니다. 이 글은 여전히 입문자를 대상으로 하며, 가능한 한 모든 단계를 구체적으로 설명하여, 독자가 직접 따라 할 수 있도록 합니다.SYCL에서 메모리와 커널(디바이스 코드) 작성은 SYCL이 제공하는 추상화 덕분에 C++ 람다 표기법을 활용하고, 버퍼(buffer)와 액세서(accessor)를 통해 호스트-디바이스 데이터를 쉽게 관리할 수 있습니다. 또한 워크아이템(work-item), 워크그룹(work-group),..
모던 Vulkan (C++ 버전) 시리즈의 아홉 번째 글입니다. 지금까지 인스턴스 생성, 디바이스/큐 확보, 커맨드 버퍼, 메모리 관리, Compute 파이프라인 및 디스크립터 구성, 벡터 덧셈 예제, 디버깅/프로파일링 전략까지 모든 단계를 Modern C++와 Vulkan-HPP를 활용해 재정비했습니다. 이번 글에서는 지금까지 다룬 내용을 정리하고, 앞으로 Intermediate/Advanced 주제로 나아갈 때 고려할 만한 확장 방향성을 소개하겠습니다.여기까지 다룬 내용 요약이 시리즈에서는 기존 입문 시리즈에서 C 스타일 Vulkan 코드를 사용해 다루었던 주제들을 모두 C++17 이상과 Vulkan-HPP, 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를 통해 자원..