TA/TACampus-Com2us

[TACampus] 4주차 과제 - GPU 대역폭과 최적화 방법

EveryDay.DevUp 2025. 6. 15. 21:28

서론: 왜 대역폭이 중요한가?

현대 실시간 렌더링에서 GPU 메모리 대역폭은 그래픽 품질과 성능을 결정짓는 핵심 자원입니다. 고해상도 텍스처, 복잡한 3D 모델, 정교한 셰이더 등 시각적 충실도를 높이는 모든 요소는 이 한정된 대역폭을 차지하기 위해 경쟁합니다. 대역폭이 부족하면 GPU는 데이터를 기다리며 유휴 상태에 빠지고, 이는 프레임 속도 저하, 화면 끊김(stuttering)으로 직결됩니다. 따라서 대역폭 관리는 단순히 성능을 개선하는 작업을 넘어, 주어진 하드웨어 제약 내에서 최상의 시각적 경험을 구현하기 위한 필수 기술입니다.

Part I: 기초 원리 및 성능 분석

섹션 1: 현대 GPU 아키텍처와 대역폭 병목

1.1. GPU 메모리 계층 구조

GPU 성능의 핵심은 여러 단계로 나뉜 메모리 계층 구조를 이해하는 것입니다. 최적화의 목표는 데이터가 가능한 한 가장 빠른 메모리(캐시)에 머무르도록 하는 것입니다.

  • L1 캐시: 각 처리 코어(SM)에 내장된 가장 빠르고 작은 캐시. 접근 지연 시간이 극히 짧습니다.
  • L2 캐시: 여러 SM이 공유하는 더 큰 용량의 캐시. L1보다는 느리지만 VRAM보다는 훨씬 빠릅니다. 최신 GPU일수록 L2 캐시 용량을 늘려 실효 대역폭을 높이는 추세입니다.
  • VRAM (Video RAM): 대용량 데이터를 저장하는 주 메모리. GPU 칩 외부에 위치하여 접근 속도가 가장 느립니다.

모든 최적화의 근본 목표는 비싼 VRAM 접근을 최소화하고, L1 및 L2 캐시의 적중률(hit rate)을 극대화하는 것입니다. 캐시 히트는 성능 향상과 전력 소비 감소로 이어지지만, 캐시 미스는 심각한 성능 저하를 유발합니다.

1.2. 메모리 대역폭의 정의와 계산

GPU 메모리 대역폭은 이론적으로 대역폭(GB/s) = (메모리 클럭 × 버스 폭) ÷ 8 공식을 통해 계산할 수 있습니다.

  • 메모리 클럭(Memory Clock): VRAM이 데이터를 전송하는 속도입니다.
  • 메모리 버스 폭(Memory Bus Width): GPU와 VRAM 사이의 데이터 통로 너비입니다. 도로의 차선처럼 넓을수록 병목이 줄어듭니다.

하지만 이 공식은 이론적인 최대치일 뿐, 실제 유효 대역폭은 AMD의 Infinity Cache나 NVIDIA의 대용량 L2 캐시와 같은 온칩 캐시 아키텍처에 큰 영향을 받습니다. 이러한 캐시들은 VRAM 접근 자체를 줄여주므로, 원시 대역폭 수치가 낮더라도 더 높은 실질 성능을 보일 수 있습니다.

1.3. 성능 프로파일링의 기술

효과적인 최적화는 추측이 아닌 데이터에 기반해야 합니다. 최적화의 첫 단계는 애플리케이션의 성능 병목이 어디에 있는지 정확히 진단하는 프로파일링(profiling)입니다.

  • CPU 바운드 vs. GPU 바운드: 한 프레임을 렌더링하는 데 CPU와 GPU 중 어느 쪽 시간이 더 오래 걸리는지 파악하는 것이 시작입니다. Unreal Engine의 stat unit과 같은 명령어로 쉽게 확인할 수 있습니다.
  • 전문 프로파일링 도구:
    • 하드웨어 공급사 도구: NVIDIA Nsight, AMD Radeon GPU Profiler (RGP)
    • 그래픽스 API 디버거: RenderDoc, PIX on Windows
    • 게임 엔진 내장 도구: Unreal GPU Visualizer, Unity Profiler

효과적인 최적화는 가설 설정 → 프로파일링 → 분석 → 최적화 적용 → 재프로파일링의 순환 고리를 통해 이루어져야 합니다. 신뢰할 수 있는 데이터 없이는 최적화 노력이 시간 낭비가 되거나 새로운 문제를 유발할 수 있습니다.

섹션 2: 렌더 타겟 및 프레임 페이싱 관리

동적 해상도 조절 (DRS)

목표 프레임 속도를 유지하기 위해 실시간으로 렌더링 해상도를 조절합니다. 부하가 높을 땐 해상도를 낮춰 프레임 드랍을 막고, 여유가 있을 땐 높여 품질을 향상시킵니다.

대역폭 영향: 렌더링 결과물(프레임버퍼)의 크기가 줄어들어, 매 프레임 GPU가 읽고 써야 하는 데이터 양이 직접적으로 감소합니다. 해상도는 2차원 평면이므로, 가로/세로를 절반으로 줄이면 전체 픽셀 수는 1/4로 감소하여 대역폭 요구량도 1/4로 줄어듭니다.

프레임 레이트 제한

프레임 속도를 특정 목표치(예: 60fps)로 고정하여 시스템 안정성을 높이고 일관된 사용자 경험을 제공합니다. 이는 프레임 간 시간 간격의 일관성, 즉 '프레임 페이싱'을 개선하는 핵심 수단입니다.

대역폭 영향: 초당 화면 갱신 횟수를 줄여, 시간당 평균 대역폭 사용량을 직접적으로 감소시킵니다. 이는 불필요한 전력 소모와 발열을 줄여 특히 휴대용 기기에서 매우 중요합니다.

섹션 3: 오버드로우 감소를 통한 중복 셰이딩 제거

오버드로우(Overdraw)는 화면에 최종적으로 보이지 않는 픽셀을 GPU가 불필요하게 렌더링하는 현상으로, 막대한 GPU 연산과 메모리 대역폭을 낭비하는 주범입니다.

Z-프리패스 (Depth-Only Pass)

본격적인 컬러 렌더링에 앞서, 씬의 깊이 정보만 먼저 기록하는 예비 단계를 실행합니다. 이를 통해 메인 렌더링 패스에서 다른 물체에 의해 가려지는 픽셀의 비싼 프래그먼트 셰이더 실행을 조기에 건너뛸 수 있습니다(조기 깊이 테스트).

트레이드오프: 지오메트리를 두 번 처리하므로 버텍스 처리 비용은 증가하지만, 프래그먼트 셰이더가 매우 무겁고 오버드로우가 심한 씬에서 막대한 대역폭을 절약하여 오히려 전체 성능을 향상시킵니다.

아키텍처적 해결책: 타일 기반 렌더링 (TBR)

모바일 GPU에서 주로 사용하는 아키텍처로, 화면을 작은 타일로 나누어 처리합니다. 각 타일에 대한 모든 렌더링이 칩 내의 빠른 온칩 메모리에서 완료된 후, 최종 결과만 VRAM에 한 번 쓰기 때문에 구조적으로 오버드로우와 대역폭 사용량이 매우 적습니다.

대역폭 영향: TBR은 중간 단계의 렌더 타겟 데이터를 VRAM에 쓰는 과정을 대부분 생략함으로써 메모리 대역폭을 극적으로 절약합니다. 데스크톱과 모바일의 최적화 전략이 다른 핵심적인 이유입니다.

섹션 4: 밉매핑, 압축, 스트리밍

밉맵(Mipmap) 사용

거리에 따라 다른 해상도의 텍스처를 사용합니다. 이는 대역폭을 절약할 뿐만 아니라, 텍스처 캐시 효율성을 극대화하고 앨리어싱 현상을 줄여 시각적 품질도 향상시키는 필수 기법입니다.

대역폭 영향: 멀리 있는 객체에 고해상도 텍스처 대신 작은 밉맵을 사용하므로, VRAM에서 GPU 캐시로 전송되는 데이터 양이 수백 배까지 줄어들 수 있습니다. 캐시 히트율을 높여 실질적인 성능을 크게 향상시킵니다.

텍스처 압축

GPU가 하드웨어로 실시간 압축 해제할 수 있는 형식(ASTC, BCn)을 사용합니다. 이는 VRAM 점유율과 대역폭을 동시에 절약하는 가장 근본적인 최적화 중 하나입니다.

대역폭 영향: 텍스처를 압축하면 메모리에서 읽는 데이터 양 자체가 1/4~1/8로 줄어, 실질 대역폭을 몇 배로 증폭시키는 효과가 있습니다. 압축 해제는 전용 하드웨어 디코더가 처리하므로 성능 부하가 거의 없습니다.

텍스처 스트리밍

카메라 시점에 따라 필요한 밉맵 레벨만 동적으로 로드/언로드하는 시스템입니다. 방대한 월드를 가진 게임에서 VRAM 예산을 효율적으로 관리하기 위해 사용됩니다.

대역폭 영향: 렌더링 루프의 실시간 대역폭보다는, 디스크-메모리 간의 데이터 전송을 관리합니다. VRAM에 꼭 필요한 데이터만 유지하여 캐시 효율을 높이고, LOD 시스템과 연계하여 불필요한 고해상도 밉맵 로드를 방지합니다.

섹션 5: LOD 및 드로우 콜 감소

LOD (Level of Detail)

거리에 따라 폴리곤 수가 다른 모델을 사용하여 원거리 오브젝트의 정점 데이터 처리량을 줄입니다. 이산적 LOD(Discrete) 방식이 주로 사용되며, 전환 시 '툭' 튀는 현상(popping)을 완화하는 것이 중요합니다.

대역폭 영향: 처리해야 할 버텍스 데이터의 총량이 줄어들어, 메모리에서 정점 버퍼를 읽는 데 필요한 대역폭이 직접적으로 감소합니다. 이는 텍스처 스트리밍 시스템의 부하를 줄이는 데도 간접적으로 기여합니다.

드로우 콜 감소 (배칭 & 인스턴싱)

CPU가 GPU에 내리는 렌더링 명령(드로우 콜)의 횟수를 줄여 CPU 병목을 해소합니다. 최신 렌더링에서는 여러 복제본을 한 번의 명령으로 처리하는 GPU 인스턴싱이 가장 효율적입니다.

대역폭 영향: CPU 부하 감소가 주 목적이지만, 더 크고 연속적인 데이터 덩어리를 전송하게 하여 메모리 버스 사용 효율을 높입니다. CPU 병목이 해소되면 GPU가 유휴 상태 없이 작동하여 전체 성능이 향상됩니다.

섹션 6: 현대적 최적화 패러다임

메쉬 셰이더 (Mesh Shaders)

기존의 고정된 지오메트리 파이프라인을 대체하는 유연한 프로그래밍 모델입니다. GPU가 직접 지오메트리를 생성하거나 컬링할 수 있어, 개발자에게 전례 없는 수준의 제어권을 부여합니다.

대역폭 영향: VRAM에서 거대한 버텍스/인덱스 버퍼를 읽어오는 과정을 크게 줄일 수 있습니다. GPU가 온칩 메모리에서 '메쉬렛(meshlet)'이라는 작은 단위로 지오메트리를 직접 생성하므로, 대역폭 사용 방식을 근본적으로 바꿉니다.

가변 속도 셰이딩 (VRS)

화면의 모든 픽셀을 동일한 품질로 셰이딩하는 대신, 시각적 중요도에 따라 셰이딩 속도를 동적으로 조절하는 기술입니다. 예를 들어, 모션 블러가 심한 영역은 낮은 품질로 셰이딩합니다.

대역폭 영향: 프래그먼트 셰이더 연산 비용을 줄이는 것이 주 목적이지만, 메모리 대역폭에도 긍정적 영향을 줍니다. 여러 픽셀이 하나의 셰이더로 처리되면, 텍스처 샘플링과 같은 메모리 접근 횟수도 그만큼 줄어들어 대역폭을 절감합니다.

🎯 결론: 핵심 원칙 요약 및 최종 정리

성공적인 GPU 대역폭 최적화는 단일 기법의 적용이 아니라, 전체 렌더링 파이프라인에 걸친 종합적인 균형 맞추기 작업입니다.

  1. 과학적 접근: 최적화는 추측이 아닌, 프로파일링을 통한 정밀한 데이터 분석으로 시작해야 합니다.
  2. 캐시 우선: 모든 기법의 근본 목표는 비싼 VRAM 접근을 최소화하고, 빠른 온칩 캐시 사용을 극대화하는 것입니다.
  3. CPU-GPU 상호작용 이해: CPU 병목이 GPU의 성능을 제한할 수 있음을 인지하고, 드로우 콜과 같은 CPU 부하를 함께 관리해야 합니다.
  4. 트레이드오프 인지: 모든 최적화에는 장단점이 존재합니다. Z-프리패스는 버텍스 비용을 늘리고, 정적 배칭은 메모리 사용량을 늘립니다. 프로젝트 상황에 맞는 최적의 균형점을 찾아야 합니다.

하드웨어 성능이 발전함에 따라 4K 해상도, 실시간 레이 트레이싱 등 시각적 요구 수준 또한 기하급수적으로 증가하고 있습니다. 결론적으로, 지능적이고 아키텍처를 고려한 최적화는 고품질 게임 개발의 성공을 좌우하는 영원한 과제로 남을 것이며, 본 보고서에서 다룬 기법들은 개발자가 이러한 도전에 맞서기 위해 반드시 갖추어야 할 필수적인 도구입니다.