CUDA 프로그래밍 가이드
개발자가 NVIDIA GPU에서 실행되는 고성능 코드를 작성하는 방법을 배우고 CUDA 프로그래밍 모델을 이해할 수 있도록 하는 공식이고 종합적인 자료입니다. 이 안내서에서는 플랫폼 아키텍처, 프로그래밍 인터페이스, 고급 하드웨어 기능 및 기술 사양에 대해 다룹니다.
수업
강좌 개요
📚 콘텐츠 요약
개발자가 NVIDIA GPU에서 실행되는 고성능 코드를 작성하기 위해 CUDA 프로그래밍 모델을 배우는 공식이고 종합적인 자료. 이 가이드는 플랫폼 아키텍처, 프로그래밍 인터페이스, 고급 하드웨어 기능 및 기술 사양을 다룹니다.
업계 표준인 NVIDIA CUDA 안내서를 통해 병렬 컴퓨팅의 예술을 마스터하세요.
저자: NVIDIA Corporation
감사의 말: 저작권 © 2007-2024 NVIDIA Corporation 및 계열사. 모든 권리 보유.
🎯 학습 목표
- 이질적 시스템 내에서 호스트(클라이언트)와 디바이스(그래픽 처리 장치)의 역할을 정의합니다.
- SIMT 프로그래밍 모델과 스레드, 블록, 격자 간의 계층적 조직 구조를 설명합니다.
- PTX(병렬 스레드 실행)와 바이너리 코드(cubins)의 차이점을 구분하고, 즉시 컴파일(JIT) 컴파일이 호환성을 어떻게 지원하는지 설명합니다.
- CUDA 커널 개발 및 컴파일: global 함수 작성, 삼중 화살표 표기법을 사용한 실행 구성, NVCC 컴파일 워크플로우 관리.
- 메모리 및 데이터 이동 최적화: 유니티드, 명시적, 매핑된 메모리 모델의 차이점을 구분하고, 효율적인 전송을 위한 페이지 잠금 호스트 메모리 구현.
- 병렬 실행 관리: CUDA 스트림, 이벤트, 협력 그룹을 활용하여 비동기 작업을 관리하고 CPU-GPU 연산을 동기화합니다.
- 복잡한 포인터 산술 수행 및 아키텍처적 성능 저하 요인(본 네만 대비 하버드 구조) 식별.
- 프로그래밍 기반 의존성 커널 실행 및 이질적 버치 메모리 전송과 같은 고급 CUDA 실행 패턴 구현.
- 스레드 범위, 비동기 프록시, 파이프라인과 같은 하드웨어 전용 기능을 활용하여 동시성 최대화.
- 프리패칭, 사용 힌트, 페이지 크기 관리 등을 통해 유니티드 메모리 성능을 구성하고 튜닝.
🔹 수업 1: CUDA 기본 및 아키텍처 개요
개요: 본 수업에서는 CUDA 병렬 컴퓨팅 플랫폼과 그 기반 하드웨어 아키텍처를 소개합니다. 이질적 시스템이 CPU와 GPU를 어떻게 활용하는지, SIMT(Single Instruction, Multiple Threads) 프로그래밍 모델과 스레드, 블록, 격자의 계층적 구조를 탐색하며, 또한 컴파일 워크플로우, 특히 바이너리 및 미래 호환성을 보장하는 PTX, cubins, fatbins의 역할을 다룹니다.
학습 결과:
- 이질적 시스템 내에서 호스트(클라이언트)와 디바이스(그래픽 처리 장치)의 역할을 정의합니다.
- SIMT 프로그래밍 모델과 스레드, 블록, 격자의 계층적 조직 구조를 설명합니다.
- PTX(병렬 스레드 실행)와 바이너리 코드(cubins)의 차이점을 구분하고, 즉시 컴파일(JIT) 컴파일이 호환성을 어떻게 지원하는지 설명합니다.
🔹 수업 2: 핵심 GPU 프로그래밍 및 실행 관리
개요: 본 수업은 CUDA C++를 이용한 GPU 프로그래밍의 기초 및 고급 요소를 다룹니다. 기본 커널 정의와 NVCC 컴파일 워크플로우에서 시작해, SIMT 커널 설계, 공유 메모리 뱅크 충돌, 스트림과 이벤트를 이용한 비동기 실행과 같은 복잡한 실행 관리 주제로 전개됩니다. 학생들은 유니티드 메모리 대비 명시적 메모리 모델의 균형을 맞추고, 고성능 컴퓨팅을 위한 하드웨어 점유율을 최적화하는 방법을 배웁니다.
학습 결과:
- CUDA 커널 개발 및 컴파일: global 함수 작성, 삼중 화살표 표기법을 사용한 실행 구성, NVCC 컴파일 워크플로우 관리.
- 메모리 및 데이터 이동 최적화: 유니티드, 명시적, 매핑된 메모리 모델의 차이점을 구분하고, 효율적인 전송을 위한 페이지 잠금 호스트 메모리 구현.
- 병렬 실행 관리: CUDA 스트림, 이벤트, 협력 그룹을 활용하여 비동기 작업을 관리하고 CPU-GPU 연산을 동기화.
🔹 수업 3: 고급 메모리 로직 및 멀티 GPU 시스템
개요: 본 수업에서는 기본 메모리 아키텍처와 포인터 로직에서 고급 GPU 가속 기술로의 전환을 탐구합니다. 하드웨어 수준 실행 모델(SIMT, 독립적 스레드 스케줄링), 정교한 동기화 메커니즘(비동기 장벽, 범위 기반 원자적 연산), 그리고 런타임 및 드라이버 API를 사용한 멀티 GPU 시스템 조정을 다룹니다.
학습 결과:
- 복잡한 포인터 산술 수행 및 아키텍처적 성능 저하 요인(본 네만 대비 하버드 구조) 식별.
- 프로그래밍 기반 의존성 커널 실행 및 이질적 버치 메모리 전송과 같은 고급 CUDA 실행 패턴 구현.
- 스레드 범위, 비동기 프록시, 파이프라인과 같은 하드웨어 전용 기능을 활용하여 동시성 최대화.
🔹 수업 4: 최적화, 그래프 및 하드웨어 가속기
개요: 본 수업에서는 고성능 CUDA 프로그래밍 기법을 다루며, 데이터 이동 및 실행 흐름 최적화에 초점을 맞춥니다. 스트림 기반 실행에서 지속적인 CUDA 그래프로의 전환, 프리패칭 및 힌트를 통한 유니티드 메모리의 세밀한 제어, 그리고 텐서 메모리 가속기(TMA)와 L2 캐시 지속성과 같은 하드웨어 전용 가속기를 활용하는 방법을 탐색합니다. 또한 고급 동기화 패턴, 그린 컨텍스트를 통한 리소스 분할, 현대 이질적 컴퓨팅을 위한 다양한 API 간 상호 운용성에 대해 자세히 설명합니다.
학습 결과:
- 프리패칭, 사용 힌트, 페이지 크기 관리를 통해 유니티드 메모리 성능을 구성하고 튜닝.
- CUDA 그래프 생성, 업데이트 및 실행, 메모리 노드 및 디바이스 측 실행 사용 포함.
- 비동기 장벽과 생산자-소비자 패턴을 활용한 고급 동기화 구현.
🔹 수업 5: 기술 참조 및 언어 확장
개요: 본 수업은 CUDA 프로그래밍 모델의 참조 사양 및 C++ 언어 확장에 대한 깊이 있는 기술적 탐구를 제공합니다. 컴퓨팅 능력을 통한 하드웨어-소프트웨어 인터페이스, 런타임 제어를 위한 환경 변수, 그리고 최신 C++ 기준, 협력 그룹, 특수 하드웨어 인트린식을 활용한 고성능 디바이스 코드 작성에 필요한 구문 요구 사항을 다룹니다.
학습 결과:
- GPU 컴퓨팅 능력 버전에 따라 하드웨어 제약 조건 및 기능 세트 식별.
- 시스템 수준 환경 변수를 사용하여 CUDA 실행 환경 및 JIT 컴파일 구성.
- 장치 측 제한 사항을 준수하면서도, 애노테이션, 람다, 템플릿 등 C++ 언어 확장 적용.