본문 바로가기
Tech Insights

CUDA 프로그래밍 - Hello CUDA!

by Kudos IT Daily 2024. 3. 2.
반응형

 

 

CUDA 프로그래밍 - Hello CUDA!

 

목차

  • Driver API, Runtime API
  • CUDA 사용 가능 GPU 확인하기
  • CUDA 개발 환경 설정
  • Hello CUDA

 

 

안녕하세요! 오늘 포스팅에서 처음으로 CUDA를 사용해 보도록 하겠습니다. CUDA 프로그래밍을 활용해 'Hello CUDA!' 프로젝트를 생성하고 빌드 및 실행까지 해보겠습니다.

 

 

Driver API, Runtime API

CUDA는 Compute Unified Device Architecture의 약자로, 엔비디아(NVIDIA)에서 GPU를 GPUGPU 목적으로 사용할 수 있게 제공하는 프로그래밍 인터페이스입니다. CUDA는 드라이버 API(driver API)와 런타임 API(runtime API) 두 가지의 API를 제공합니다.

 

드라이버 API는 런타임 API 대비 더 세밀한 저수준(low-level) 제어 기능을 제공합니다. 그러나 런타임 API도 대부분의 제어 기능을 제공하며 드라이버 API 대비 사용이 간단하기 때문에, 대부분의 응용 프로그램들은 런타임 API를 사용하는 편입니다. 하지만 세부 제어를 통한 성능 극대화 등 특수한 경우 드라이버 API 사용이 필요한 경우도 있습니다.

 

드라이버 API는 CUDA 문맥(context) 및 모듈(module) 로드 등에 대해 더 세밀한 제어 기능을 제공합니다. 세밀한 제어를 지원하는 만큼 CUDA 커널(kernel) 실행을 위한 구현 방법이 런타임 API에 비해 복잡합니다. 예를 들어 실행 구성 및 커널 매개 변수 설정을 함수 호출을 통해 명시적으로 지정해야 합니다. 런타임 API에서는 이러한 설정을 자동으로 해주지만, 프로그램에 포함된 모든 커널이 프로그램 시작과 함께 초기화 및 로드되고 프로그램이 종료될 때까지 유지됩니다.

 

드라이버 API를 사용하면 자원(메모리 등)을 더 효율적으로 사용할 수 있습니다. 또한, 드라이버 API는 언어에 비종속적으로, 코드를 컴파일한 cubin(CUDA binary) 오브젝트 파일을 통해 다양한 언어에서 해당 모듈을 사용할 수 있습니다.

 

대부분의 경우, 런타임 API를 통해 CUDA 프로그래밍을 수행합니다. 하지만 사용 가능한 자원이 제한적인 경우, 작성 CUDA 모듈을 다양한 프로그래밍 언어에서 사용하고 싶은 경우에는 드라이버 API를 사용하는 편이 좋을 수 있습니다.

 

 

GPU 확인하기

CUDA는 엔비디아의 GPU 사용을 위해 제공하는 프로그래밍 인터페이스입니다. 따라서, 엔비디아 GPU에서만 사용 가능합니다. 엔비디아 GPU 중에서도 CUDA를 지원하는 GPU를 사용해야 합니다. CUDA를 지원하는 대표적인 GPU 모델로 지포스(GeForce) 및 RTX 시리즈(게임용 GPU), Quadro 시리즈(가시화용), Tesla 시리즈(데이터 센터용), Jetson 시리즈(임베디드 시스템용) 등이 있습니다. CUDA 지원 여부는 엔비디아 공식 페이지에서 확인할 수 있습니다.

 

CUDA GPUs - Compute Capability 공식 페이지

 

CUDA GPUs - Compute Capability

Explore your GPU compute capability and CUDA-enabled products.

developer.nvidia.com

 

엔비디아 공식 페이지 - compute capability

 

 

아래의 그림은 제가 사용하는 GeForce RTX 4060Ti GPU의 상세 사양을 보여줍니다. CUDA 코어 수는 GPU가 가진 연산 코어의 수를 나타냅니다. RTX 4060Ti는 CUDA 코어의 수가 4,352개인 것을 확인할 수 있고, 4,352개의 스레드가 동시에 연산을 수행할 수 있다는 의미입니다. 대체로 CUDA 코어의 수가 많을수록 기본 연산 성능이 높다고 생각하면 됩니다.

 

메모리 크기 및 대역폭(bandwidth) 또한 중요한 GPU 성능 지표 중 하나입니다. 메모리가 클수록 GPU가 한 번에 많은 작업을 처리할 수 있습니다. 대역폭은 CUDA 코어에 한 번에 공급할 수 있는 데이터 양이며, 데이터 공급이 빠를수록 CUDA 코어의 활용 효율이 높아집니다.

 

 

엔비디아 GeForce RTX 4060 시리즈의 상세 사양

 

 

앞서 설명드린 공식 페이지 링크의 Compute capability를 보시면 사용하는 GPU에 따라 compute capability를 확인할 수 있습니다. GeForce RTX 4060Ti의 경우, compute capability 8.9입니다. Compute capability는 GPU가 제공하는 기능과 구성을 보여주고, GPGPU 관점에서 해당 GPU의 성능을 가늠할 수 있습니다. compute capability에 따라 지원하는 CUDA  API에도 차이가 있을 수 있어 확인하는 것이 좋습니다.

 

아래의 그림은 compute capability에 따른 상세 기술 사양을 보여줍니다. 해당 내용은 아래의 링크 16.2. Features and Technical Specification 에서 확인할 수 있습니다.

 

 

CUDA C++ Programming Guide - compute-capabilities

 

CUDA C++ Programming Guide

Texture memory is read from kernels using the device functions described in Texture Functions. The process of reading a texture calling one of these functions is called a texture fetch. Each texture fetch specifies a parameter called a texture object for t

docs.nvidia.com

 

Technical Specification per Compute Capability

 

 

CUDA 개발 환경 설정

CUDA 프로그램을 작성하고 컴파일하기 위해 CUDA 툴킷(Toolkit), 통합 개발 환경(Integrated Devlopment Environment, IDE)을 설치하도록 하겠습니다.

 

CUDA 툴킷은 CUDA로 작성한 프로그램을 컴파일하기 위한 NVCC 컴파일러, 실행하기 위한 라이브러리, 그리고 관련 유틸리티 및 문서들을 포함하는 패키지입니다. CUDA 툴킷은 공식 홈페이지(https://developer.nvidia.com/cuda-toolkit)에서 다운로드할 수 있습니다. 아래와 같이 운영체제, 시스템 아키텍처, 운영체제 버전, 설치 타입을 선택하여 설치하면 됩니다.

 

 

CUDA Toolkit Downloads

 

 

한 가지 주의할 점이 있습니다. 만약 비주얼 스튜디오(Microsoft Visual Studio)를 사용할 경우, 반드시 비주얼 스튜디오가 미리 설치된 상태에서 CUDA 툴킷을 설치해야 CUDA 프로그래밍 환경이 연동됩니다. CUDA 툴킷 설치를 진행하면 비주얼 스튜디오를 자동으로 인식하고 IDE에 확장 기능으로 CUDA 컴파일이 추가됩니다.

 

이번 포스팅에서는 윈도우 환경, 비주얼 스튜디오 IDE 기준으로 설치 방법을 소개하겠습니다. 리눅스 환경의 설치 방법은 추후 포스팅을 통해 설명할 수 있도록 하겠습니다. 만약, 비주얼 스튜디오 IDE가 설치되어 있지 않은 경우, 무료로 사용 가능한 비주얼 스튜디오 커뮤니티 버전 설치(https://visualstudio.microsoft.com/ko/vs/community/)를 권장드립니다.

 

비주얼 스튜디오가 설치된 상황에서 앞서 설치한 CUDA 툴킷을 설치합니다. CUDA 툴킷 설치를 완료하면 아래의 화면을 확인할 수 있습니다.

 

 

CUDA Toolkit 설치 완료 화면

 

 

Hello CUDA!

CUDA 툴킷 설치가 완료되면 비주얼 스튜디오의 새로운 프로젝트 생성 템플릿(template)에 CUDA 항목이 추가됩니다.

 

 

비주얼 스튜디오 CUDA 프로젝트 템플릿

 

 

추가 설정으로 CUDA 파일 확장자 .cu 및 .cuh를 IDE에서 인식하도록 설정하면 좋습니다. 비주얼 스튜디오에서 C/C++ 확장자로 .cu, .cuh를 추가하면 프로그래밍 시, IDE의 도움을 받을 수 있습니다. 확장자 추가는 [도구] - [옵션] - [텍스트 편집기] - [파일 확장명]에 아래 그림과 같이 추가합니다.

 

 

비주얼 스튜디오 .cu, .cuh 확장자 추가

 

 

이제 비주얼 스튜디오에서 'Hello CUDA' 프로젝트를 생성하겠습니다. 비주얼 스튜디오를 실행하고 아래와 같이 새로운 CUDA 프로젝트를 생성합니다.

 

 

Hello CUDA 프로젝트 생성

 

 

CUDA 버전에 따라 프로젝트가 생성될 때, kernel.cu와 같이 샘플 코드가 생성되는 경우가 있습니다. 이런 경우, 해당 파일을 삭제합니다. 다음 프로젝트에서 아래와 같이 hello_cuda.cu 소스 파일을 생성합니다. 소스파일은 [프로젝트 우클릭] - [추가] - [새 항목]으로 생성합니다.

 

 

 

 

소스파일이 생성하고, 아래의 소스 코드를 작성합니다. cuda_runtime.h와 device_launch_parameters.h는 CUDA 런타임 API를 사용해서 프로그램을 작성하기 위한 주요 정의가 포함된 헤더 파일입니다. 소스코드의 __global__, <<<1, 10>>>은 CUDA에서 추가된 문법적 요소로, 앞으로 CUDA 프로그래밍을 하면서 알아보도록 하겠습니다.

 

 

#include <stdio.h>

// CUDA Runtime API
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

// CUDA Kernel에서 호출되는 함수
__global__ void HelloCUDA() {
	printf("Hello CUDA from GPU!\n");
}

int main() {
	printf("Hello CUDA from CPU!\n");

	// HelloCUDA<<<블록의 수, 스레드의 수>>>();
	// 호스트에서 디바이스로 함수를 호출
	HelloCUDA<<<1, 10>>>();

	// Synchronize 함수 - 디바이스에서 실행되는 함수가 모두 끝날 때까지 기다림
	cudaDeviceSynchronize();
	return 0;
}

 

 

위 코드를 수행하면 아래와 같은 수행 결과가 나타납니다. "Hello CUDA from CPU!"가 호스트(host)에서 호출되고, "Hello CUDA from GPU!"가 디바이스(device, GPU)에서 호출됩니다. 호스트, 디바이스와 같은 개념은 다음 포스팅에서 이어서 설명할 수 있도록 하겠습니다.

 

 

hello_cuda.cu 실행 결과

 

 

마치며

오늘 포스팅에서는 CUDA 사용을 위한 GPU 정보 확인 방법, CUDA 툴킷 설치 방법, Hello CUDA 프로젝트 생성에 대한 내용을 다뤘습니다. Hello CUDA 프로젝트를 생성하고 실행하는 동안, 언급되었던 CUDA 프로그래밍 문법적 요소, 호스트, 디바이스 등 새로운 개념에 대해서는 다음 포스팅에서 다룰 수 있도록 하겠습니다.

 

오늘 글도 도움이 되셨기를 바라면서 글 마치도록 하겠습니다. 고맙습니다.

 

 

Reference

1. CUDA 기반 GPU 병렬 처리 프로그래밍 - 기초부터 성능 최적화 전략까지

2. CUDA C++ Programming Guide

반응형