반응형
안녕하세요! 지난 글에서는 C++20/23 문법과 OpenCL C++ Wrapper를 활용해 OpenCL 코드를 훨씬 깔끔하게 만드는 방법을 살펴봤습니다. 이번 글에서는 실제로 유용할 수 있는 간단한 이미지 처리 예제를 통해 OpenCL의 이미지 기능을 체험해보려 합니다. 기본적인 버퍼 연산만 다뤘던 것에서 한 단계 나아가, GPU 가속을 활용한 이미지 변환(예: 컬러 이미지를 그레이스케일로 변환)을 시도해보죠.이번 글에서는 다음 내용을 다룹니다.이미지 객체를 사용한 데이터 처리호스트 측에서 이미지 로딩(예: stb_image 사용)OpenCL 커널에서 read_imagef, write_imagef 함수 활용결과 확인을 위한 이미지 저장CUDA와 비교: CUDA 텍스처/서피스와 유사한 개념1. 준비사항이..
안녕하세요! 지난 글들에서 OpenCL의 기본 사용법을 어느 정도 파악하셨다면, 이제는 조금 더 현대적인 C++ 문법과 래퍼(wrapper) 라이브러리를 활용해 코드를 깔끔하게 정리하는 방법을 살펴보려고 해요. OpenCL 기본 API는 C 스타일 함수들로 구성되어 있고, 초기화 및 에러 처리 로직이 장황해지는 경우가 많은데, C++20/23 기능을 적극 활용하면 가독성과 유지보수성을 크게 높일 수 있습니다.이번 글에서는 다음 내용을 다룹니다.OpenCL C++ Wrapper(CL.hpp) 라이브러리 소개스마트 포인터, 범위 기반 for문, 구조적 바인딩 등 C++20/23 기능 활용에러 처리와 RAII(Resource Acquisition Is Initialization) 패턴 적용CUDA와 비교: C..
안녕하세요! 지난 글에서는 OpenCL 커널 작성법과 빌드 과정을 살펴보았습니다. 이제 커널에서 다룰 데이터가 어떻게 GPU나 CPU 디바이스 메모리에 올라가는지, 즉 OpenCL 메모리 모델과 그 핵심 요소인 버퍼(Buffer)와 이미지(Image)에 대해 알아볼 차례예요. 또한 커널에 파라미터(인자)를 전달하는 다양한 패턴에 대해서도 간단히 짚어보겠습니다.이번 글에서는 다음 내용을 다룹니다.OpenCL 메모리 모델 개요버퍼(Buffer)와 이미지(Image)의 특징과 사용 예커널 파라미터 설정 방법 심화CUDA의 메모리 관리 방식과 비교추가 참고 자료 (유튜브)1. OpenCL 메모리 모델 개요OpenCL 프로그램에서는 호스트(Host)가 디바이스(Device)에 연산을 시킵니다. 이 때, 데이터를 ..
지난 글(#4)에서는 큐(Queue)와 커맨드 버퍼(Command Buffer) 개념을 정리하며, Vulkan이 GPU에 명령을 전달하는 독특한 방식을 살펴봤습니다. 이제 GPU에게 할 일을 시킬 수 있는 준비는 되었지만, 정작 우리가 처리할 데이터(배열, 이미지 등)를 GPU 메모리에 올려놓는 과정은 아직 다루지 않았습니다. 이번 글에서는 Vulkan 메모리 관리의 기초인 메모리 할당, 버퍼(Buffer), 이미지(Image) 객체를 다뤄보겠습니다.CUDA를 사용해보신 분이라면 cudaMalloc과 cudaMemcpy 정도로 GPU 메모리 관리가 비교적 단순했다는 기억이 있을 겁니다. 반면 Vulkan에서는 메모리 할당이 좀 더 “수작업”에 가깝고, 어떤 메모리 타입을 쓸지 직접 결정하고, 버퍼나 이미..
이제 우리는 Host(CPU)와 Device(GPU) 코드 구조를 이해하고, 간단한 커널 호출 예제를 통해 GPU 코드가 어떻게 동작하는지 살펴봤습니다. 이번 글에서는 실제로 데이터를 GPU로 보내고, 연산한 뒤 다시 결과를 가져오는 과정을 좀 더 구체적으로 다뤄볼 예정입니다. 즉, Host Device 메모리 전송(cudaMemcpy) 및 메모리 할당(cudaMalloc) 방법을 배우고, 이를 활용한 간단한 벡터 덧셈 예제를 통해 GPU 병렬 연산의 기본을 체험해보겠습니다.Host와 Device 메모리 관리의 기본앞서 말했듯 Host와 Device는 별개의 메모리 공간을 사용합니다. 이는 마치 서로 다른 섬에 사는 두 존재가 다리를 통해 상자를 옮기는 상황과 비슷합니다. 여기서 상자는 데이터, 다리는..