반응형
지난 글에서는 2D 데이터 처리와 비동기 스트림(Asynchronous Streams)을 통해 Host와 Device 간 연산이 겹칠 수 있음을 확인했습니다. 이제는 GPU 메모리 계층을 살짝 들여다보고, 성능 최적화를 위해 왜 이러한 구조가 존재하는지 알아볼 차례입니다. 오늘 다룰 주제는 Shared Memory와 Constant Memory라는 특별한 메모리 공간들입니다. 이들은 단순한 글로벌 메모리(Global Memory) 접근보다 훨씬 더 빠르거나 특정 상황에서 효율적인 접근을 가능하게 해줍니다.메모리 계층 구조 이해하기GPU 메모리는 단순하지 않습니다. 성능을 극대화하기 위해 다양한 메모리 종류가 존재합니다.Global Memory(전역 메모리): 우리가 지금까지 cudaMalloc로 할당한 ..
이번 글에서는 지금까지 배운 스레드/블록/그리드 개념을 2차원 데이터에 적용하고, GPU의 비동기(Asynchronous) 기능을 살짝 맛보며 최적화를 향한 첫걸음을 내딛어보겠습니다. 이미지 처리나 행렬 연산 같은 2D 데이터 처리는 실제 GPU 활용 분야에서 매우 흔하고도 중요한 영역입니다. 또한 비동기 스트림을 활용하면 Host와 Device 사이의 작업을 겹치게 만들어 전체 처리 시간을 단축할 수 있다는 점을 알아볼 것입니다.2D 데이터 처리를 위한 블록/그리드 설정지금까지는 1차원 데이터(예: 벡터)에 대한 처리를 주로 다뤘습니다. 하지만 이미지(2D 배열)나 행렬을 다룬다면 2차원적으로 스레드와 블록을 배치하는 것이 직관적일 수 있습니다.2D 스레드 인덱스 계산 예제예를 들어, M x N 크기의..
왜 이렇게 복잡할까?CUDA에 익숙한 분이라면 cudaSetDevice() 하나로 GPU를 선택하고, 바로 커널을 실행했던 기억이 있을 겁니다. 하지만 Vulkan은 조금 다릅니다. Vulkan은 다소 “하드코어”한 API라 할 수 있습니다. CUDA가 “GPU는 NVIDIA 것이고, 나머지는 다 내가 알아서 할게”라고 말해주는 친절한 셰프라면, Vulkan은 “냉장고는 저쪽, 칼은 여기, 조리대는 저기 있으니 필요한 걸 직접 꺼내서 써”라고 말하는 요리학원 선생님 같은 느낌이에요. 초반에 해야 할 준비가 많지만, 그만큼 다양한 하드웨어와 상황에 대처할 수 있는 큰 자유를 줍니다.물리 디바이스(Physical Device) 열람하기인스턴스를 만든 상태라면, 이제 시스템에 장착된 GPU 목록(물리 디바이스..
지난 글에서는 Host-Device 메모리 전송, cudaMalloc, cudaMemcpy 등을 활용하여 벡터 덧셈 예제를 성공적으로 구동해봤습니다. 이제 GPU 병렬 프로그래밍의 핵심인 스레드, 블록, 그리고 그리드 개념을 파고들 차례입니다. 이 개념들은 GPU 상에서 대규모 병렬 연산을 구성하는 뼈대와 같습니다. 오늘은 스레드와 블록, 그리고 이들을 묶어 전체 문제를 분할하는 방식인 그리드(Grid)에 대해 차근차근 살펴보며, "내가 원하는 만큼 병렬화"하는 방법을 이해해보겠습니다.스레드(Thread)란?스레드는 GPU 병렬 연산의 최소 실행 단위입니다. CPU에서도 멀티스레딩을 통해 병렬 처리를 하지만, GPU에서는 수백만 개의 스레드를 가볍게 실행할 수 있습니다. 각각의 스레드는 독립적으로 실행되..
이제 우리는 Host(CPU)와 Device(GPU) 코드 구조를 이해하고, 간단한 커널 호출 예제를 통해 GPU 코드가 어떻게 동작하는지 살펴봤습니다. 이번 글에서는 실제로 데이터를 GPU로 보내고, 연산한 뒤 다시 결과를 가져오는 과정을 좀 더 구체적으로 다뤄볼 예정입니다. 즉, Host Device 메모리 전송(cudaMemcpy) 및 메모리 할당(cudaMalloc) 방법을 배우고, 이를 활용한 간단한 벡터 덧셈 예제를 통해 GPU 병렬 연산의 기본을 체험해보겠습니다.Host와 Device 메모리 관리의 기본앞서 말했듯 Host와 Device는 별개의 메모리 공간을 사용합니다. 이는 마치 서로 다른 섬에 사는 두 존재가 다리를 통해 상자를 옮기는 상황과 비슷합니다. 여기서 상자는 데이터, 다리는..
앞선 첫 글에서는 개발 환경을 설정하고, GPU 상에서 “Hello, GPU!” 문자열을 출력하는 예제를 통해 CUDA 코드가 동작하는 것을 확인했습니다. 이제 두 번째 단계로, Host 코드와 Device 코드의 역할을 파악해보겠습니다. 이 개념을 확실하게 알아야 앞으로 진행될 벡터 덧셈이나 메모리 전송, 블록/스레드 개념을 자연스럽게 이해할 수 있습니다.Host 코드와 Device 코드란?Host 코드(호스트 코드): CPU에서 실행되는 코드우리가 평소에 작성하는 일반적인 C++ 코드와 크게 다르지 않습니다.메모리 할당, 입출력, CUDA 커널 호출 등의 작업을 담당합니다.Device 코드(디바이스 코드): GPU에서 실행되는 코드병렬 계산을 수행하는 부분입니다.“커널 함수(Kernel Functio..
이 시리즈는 총 10개의 글로 진행됩니다. 이번 첫 글에서는 Ubuntu 기반의 개발 환경을 준비하고, 가장 단순한 CUDA 예제를 통해 “Hello, GPU!”를 출력해보겠습니다. Windows 환경 설정에 대한 언급도 곁들이니, OS에 관계없이 따라 할 수 있을 거예요. 앞으로 진행될 10개의 단계 중 첫 번째 스텝으로, "내 GPU에 손을 흔들어보기"라고 생각해주세요!이 시리즈를 시작하며GPU 프로그래밍은 처음 접하면 조금 낯설게 느껴질 수 있습니다. 하지만 CPU 프로그래밍을 시작할 때 “Hello, World!”를 먼저 찍어봤듯이, CUDA에서도 비슷하게 기초부터 천천히 쌓아나갈 수 있습니다. 앞으로 이 시리즈를 통해 다음 단계들을 차근차근 진행할 예정입니다:개발 환경 설정 (Ubuntu & W..