본문 바로가기

Computer Science/NVIDIA

GPU Architecture

자, GPU의 구조는 다음과 같습니다. (엔비디아의 Tesla, Fermi, Kepler, Maxwell, Pascal, Volta, Ampere, Hopper , Ada Lovelace까지 매우 구조가 다양하긴 합니다ㅠ)

매우 어려워 보입니다.

그래서 예를 들도록 하겠습니다.

가장 최신 GPU인 L4 GPU를 예로 들겠습니다.(글쓰는 2023.12 기준)

출처: 위키피디아

(맨 앞글자때문에 A100이 Ada Lovelace 계열인 줄...1시간 헤맴..)

그래픽 카드의 이름과, GPU 아키텍처의 이름, GPU code name을 헷갈리지 않도록합시다.

출처: Nvidia Doc

위 그림에 따라, 우리는 최신 GPU인 AD104의 아키텍처에 대해 뜯어보도록 합시다.


1. L4 GPU의 구조

출처: Nvidia Doc-ADA GPU

으음....역시 매우 복잡합니다.

찬찬히 살펴보면,

ADA의 GPC는 1개당 Raster Engine과, 6개의 TPC, 12개의 SM, 16개의 ROP가 있습니다.

GPU는 여러 개의 GPC(Graphics Processing Cluster)로 분할되며, 각 GPC에는 여러 개의 SM(Streaming Multiprocessor)과 하나의 Raster Engine이 있습니다.

1) GPC(Graphics Processing Cluster)

컴퓨팅, 래스터화, 쉐이딩 및 텍스처링을 위한 전용 하드웨어 블록.

GPC는 모든 AD10x Ada 계열 GPU 내에서 지배적인 고급 하드웨어 블록이며, 모든 주요 그래픽 처리 장치가 GPC 내에 상주합니다. 각 GPC는 여러 개의 SM과 하나의 Raster Engine을 가지며, 각 GPC간의 교차 연결(통신이나 동기화)을 위한 Crossbar가 존재합니다. 이 때 Crossbar는 GPC간의 연결 외에도 ROP(Render Output Unit)등과의 연결에도 쓰입니다.

**래스터화란?

-벡터 그래픽 형식(쉐이프)으로 설명된 이미지를 래스터 이미지(픽셀, 점 또는 선 시리즈, 함께 표시될 때 도형을 통해 표현된 이미지를 생성하는 작업)로 변환하는 작업

삼각형의 래스터화

**Shading이란?

-3차원 컴퓨터 그래픽스 분야의 렌더링 과정에서, 또는 소묘 과정에서 빛의 거리와 각도에 따라 물체 표면의 조도를 변화시키는 기법

**ROP란?

-ROP(raster operations pipeline 혹은 render output unit) : GPU의 데이터가 지나가는 통로라 생각하면 되는데 통로이기보다는 손에 가깝습니다. ROP을 통해 데이터가 디스플레이에 그려집니다. 그렇기 때문에 ROP의 숫자가 크면 클수록 세세하게 처리됩니다. ROP*코어클럭수 만큼 픽셀을 화면에 출력할 수 있습니다.

쉽게 말해서 픽셀(점)을 찍는 유닛

**Crossbar Switch란?

-DP Unit과 실행 Unit(CUDA 코어, LD&ST, SFU)사이에서 다중으로 입출력되는 경로를 제공하는 장치

2) Raster Engine

각 GPC에는 자체 래스터 엔진이 있습니다.

Raster: 컴퓨터 모니터나 TV수상기의 화면 표시장치에 영상이 재생되는 영역을 의미합니다. 표시 영역을 고르게 덮고있는 직사각형의 래스터 패턴.edge/triangle setup, 래스터화, z-culling 등을 파이프라인 방식으로 수행합니다.

Raster Engine은 수신한 삼각형에서 작동하며 해당 섹션의 픽셀 정보를 생성합니다(백페이스 컬 및 Z-cull도 처리합니다).

  • edge/triangle setup
  • 래스터화
  • z-culling
  • 백페이스

3) TPC(Texture Processing Cluster)

AD102는 GPC 1개 당 6개의 TPC를 갖고 있습니다. 따라서 GPC 총 12개를 갖고 있으니, 72개의 TPC를 갖게 되겠죠.

TPC는 한개의 PolyMorph Engine과 2개의 SM을 갖고 있습니다.

TPC란 여러 SM과 Texture unit 그리고 약간의 로직 컨트롤로 구성된 그룹입니다.

TPC는 다음을 포함합니다. 

  • PolyMorph Engine
  • Streaming Multiprocessors (SMs)
  • Since Volta/Turing: Tensor Core
  • Since Turing: Ray Tracing Core

**Texture unit이란?

연산처리된 비트맵 이미지에 텍스터(질감, 색 등)을 입히는 유닛

4) SM(Streaming Multiprocessor)

SM(Streaming Multiprocessor)는 작업의 병렬 처리, 작업 예약, 산술 연산을 담당하는 GPU의 핵심 처리 장치입니다. GPU의 구조는아래와 같습니다.

AD-102 SM 블록 다이어그램

AD10x SM은 4개의 처리 파티션으로 나뉘며 각 파티션에는 
① 64KB 레지스터 파일,
② L0 명령 캐시(L0 i-Cache, L0 instruction Cache)
③ 1개의 warp 스케줄러,
④ 1개의 Dispatch unit,
FP32 또는 INT32 작업(클럭당 16개의 FP32 작업 또는 16개의 INT32 작업)을 처리할 수 있는 16개의 CUDA 코어,

⑥ FP32 작업(클럭당 최대 16개의 FP32 작업)을 처리할 수 있는 16개의 CUDA 코어,
⑦ 1개의 ADA 4세대 텐서 코어,
⑧ 4개의 Load/Store 유닛,
⑨ 초월함수, Pixel arrtibute 보간 등의 연산 수행, 그래픽 보간법 명령을 실행하는 Special Function Unit(SFU)

으로 구성되어 있습니다.

SM의 속성은 다음과 같습니다.

  • 병렬처리(Parallel Processing): SM은 수천 개의 작은 스레드를 동시에 실행하여 병렬 처리 작업에서 GPU의 효율성을 높이는 역할을 합니다. 이러한 병렬 처리는 그래픽 렌더링, 복잡한 시뮬레이션 수행, 딥 러닝 등과 같은 작업에 유용합니다.
  • 스레드 실행: SM은 여러 스레드를 동시에 실행할 수 있으므로 계산 및 메모리 액세스가 겹치고 대기 시간이 숨겨지며 처리량이 늘어납니다.
  • 작업 예약(Task Scheduling): SM은 작업 예약 및 리소스 할당을 처리하고 최적의 성능을 위해 사용 가능한 코어에 스레드를 배포합니다. 각 스레드에 대한 명령 실행을 관리하고 레지스터 및 공유 메모리와 같은 리소스를 할당합니다.
  • Specialized Processing Units(SPU): S M에는 수학 및 산술 연산에 최적화되어 광범위한 계산 작업에 적합한 산술 논리 장치(ALU, Arithmetic Logic Units ) 및 부동 소수점 장치(FPU, Floating-Point Units)와 같은 특수 처리 장치가 포함되어 있습니다.
  • 메모리 계층 구조: SM에는 로컬 레지스터, 공유 메모리 및 캐시를 포함한 자체 메모리 계층 구조가 있어 데이터 액세스를 효율적으로 관리하고 주 메모리에서 데이터를 기다리는 데 소요되는 시간을 최소화할 수 있습니다.

위의 번호를 하나하나 파헤쳐봅시다.

 

① 64KB 레지스터 파일

각 워프에는 워프 인덱스로 인덱싱된 전용 아키텍처 레지스터 세트가 있습니다. 아키텍처 레지스터와 물리적 레지스터 간에는 일대일 Mapping을 합니다. 레지스터 파일은 다수의 포트를 제공하는 복잡함 없이 큰 대역폭을 제공하기 위해 병렬로 동작하는 다수의 단일 포트 레지스터 Bank로 구성됩니다. Bank설계는 서로 다른 Bank를 대상으로 하는 경우 여러 개의 동시 동작을 허용합니다.

여러 연산이 동일한 뱅크에 레지스터를 타겟으로 할 때 뱅크 충돌이 발생하여 연산이 직렬화됩니다.  4개의 뱅크에 걸쳐 분할된 SM당 128KB의 레지스터 파일 크기를 가지고 있습니다. 뱅크는 각각 128비트 너비의 8개의 서브 뱅크로 구성됩니다.

같은 워프에 있는 32개의 스레드에 속하는 32개의 레지스터는 모두 동일한 엔트리 인덱스를 가진 연속된 서브 뱅크(한 뱅크)에 정적으로 할당됩니다. 따라서 워프 내의 모든 스레드에 대한 전체 레지스터는 한 뱅크의 엔트리를 사용하여 스트라이프할 수 있으므로 한 주기로 작동할 수 있습니다. 각 뱅크는 최대 256개의 워프 레지스터를 저장할 수 있습니다.

SIMT를 실행시킬때 문제중의 하나가 memory access입니다. GPU에서는 동시에 여러개의 데이터를 처리해야하기 때문에, 동시에 여러개의 데이터에 access를 허용합니다. 이것을 하기 위해서 GPU는 shared memory를 각 warp마다 일정 갯수의 memory bank로 나누어 두었는데, 각각의 bank는 bank단위로 동시에 접근할 수 있습니다. 이때 bank conflict란 프로그래밍 잘못으로 동시에 서로 다른 thread가 특정 bank를 access할때 발생하는 문제입니다.

서로 다른 thread가 하나의 특정 bank에 access하게 되면, 각각의 thread는 해당 bank에 접근하기 위해서 순차적으로 변하게 되고, 이는 병렬적으로 처리하려고 했던 의도를 벗어나게됩니다. 즉, 의도하지 않은 행동이 된다는 것입니다.(GPU의 장점이 사라짐)

이것은 GPU를 이용한 병렬처리에서 속도를 낮추게 하는 문제를 일으킵니다. 추후 Bank conflict에 대해 다루겠습니다.


② L0 명령 캐시(L0 i-Cache, L0 instruction Cache)

일반적으로 작은 숫자-Cache는 코어와 가깝고, 빠르지만, 작습니다.(L0 Cache, L1 Cache, L2 Cache...)


③ 1개의 warp 스케줄러

CUDA Core에게 Thread들을 나눠주고, 워프들을 관리하고, 수행할 명령들을 Dispatch Unit에 전달하는 역할. 

PASCAL의 Warp Scheduler

*Warp : 같은 명령어로 동시에 실행되는 32개의 Thread의 모음으로 NVIDIA에서는 이를 'Warp'라고 칭함 (AMD의 'Wavefront'와 동일한 개념)  추가적으로 Warp가 존재한다는 것은 한 명령어로 여러 Thread가 실행됨을 의미함으로, 이 동작을 'SIMT(Single Instruction Multi Thread)'라고 함.


④ 1개의 Dispatch unit

warp scheduler에 따라 순서화된 warp(32개의 Thread 모음)들을 CUDA 코어로 내려주는 역할.

Warp는 32개의 스레드로 이루어져 있는데, 왜 스레드를 처리하는 CUDA 코어는 16개씩 그룹지어져 있는가?

-->SM의 실행 유닛은 CUDA 코어, LOAD&STORE, SFU가 Warp scheduler의 두배 클럭으로 동작하기 때문.


 FP32 또는 INT32 작업(클럭당 16개의 FP32 작업 또는 16개의 INT32 작업)을 처리할 수 있는 16개의 CUDA 코어

스트림 프로세서를 Nvidia는 CUDA 코어라고 부르고, AMD는 그대로 Stream Processor라고 부릅니다.

단지 CUDA 코어와 SP의 숫자비교를 통해 성능을 비교할 수는 없습니다. 왜냐하면 두 회사의 칩셋 설계와 데이터 처리방식, 아키텍처가 다르게 개발되었기 때문입니다.

GPU 상에서 CUDA Cores가 하는 일은 근본적으로 CPU 내부의 Core가 하는 일과 유사합니다.

CUDA: Compute Unified Device Architecture

쿠다 코어는 너무 중요해서 따로 빼서 정리하겠습니다. 간단하게 CUDA 코어란,

그래픽 처리 장치(GPU)에서 병렬 처리를 수행하는 단위.

CPU에서 해야할 영상처리라던지 그래픽 관련 작업을 GPU가 뺏어와서 하는데 쓰이는 코어의 갯수라 생각하면 됩니다. 그만큼 CPU의 부담을 덜어주고 뛰어난 GPU의 성능을 더 활용해서 더 높은 수준의 영상연산을 할 수 있게 만드는 기술.

CUDA의 데이터 흐름


⑥ FP32 작업(클럭당 최대 16개의 FP32 작업)을 처리할 수 있는 16개의 CUDA 코어

FP(Floating point)

두 개의 4x4 행렬곱을 합한 값이 FP32입니다.


⑦ 1개의 ADA 4세대 Tensor core

https://www.nvidia.com/en-us/data-center/tensor-cores/

Tensor cores란 NVIDIA에서 개발한 행렬 곱셈 프로세스를 가속하는 처리 장치입니다.

CUDA Cores가 1 Core Clock에 하나의 fp32 부동소수점 연산을 수행하는 것에 비해 Tensor Cores는 같은 Term 동안 4 x 4 크기의 fp16 행렬 두 개를 곱하고 그 결과를 4 x 4 fp32 행렬에 더하는 Matrix multiply-accumulate 연산(A와 B를 곱하고 C를 더하는 과정을 하나의 연산으로 수행)을 수행합니다.

모든 마이크로 프로세서는 산술 및 논리 연산을 수행합니다. 이 중 중요도가 높은 산술 연산 중 하나는 바로 행렬 곱셈 입니다. 하지만 2개의 4 x 4 행렬의 곱셈을 수행하려면 이론적으로 64개의 곱셈 연산과 48개의 덧셈 연산이 필요합니다. 그렇기 때문에 NVIDIA는 연산의 정확도를 희생하여 더 많은 연산을 빠르게 수행할 수 있는 Tensor Cores를 출시하였습니다. NVIDIA의 Volta Architecture에서 이 기술이 최초로 적용되었으며 그 이후의 Architecture에도 이를 적용하여 훨씬 빠르게 연산을 수행할 수 있게 되었습니다.


⑧ 4개의 Load/Store 유닛

CUDA 코어에서 수행된 연사 결과를 외부 메모리에 저장하거나 대상 주소를 불러오는 기능

1) LOAD명령어: 메모리에 있는 값을 레지스터로 가져오는 명령어

2) STORE명령어: 레지스터에 연산이 완료된 값을 메모리 지정된 주소에 저장을 해주는 명령어


Special Function Unit(SFU)

SFU는 sin, cosine, recipal, square root과 같은 함수 명령어를 실행.

각 SFU는 하나의 스레드에서 하나의 명령어를 실행하며, 워프는 8개의 클럭을 실행합니다. SFU가 점유되는 동안 디스패치 유닛은 SFU 파이프라인을 분리하여 다른 실행 유닛으로 발행할 수 있습니다.


헥헥...끝을 향해 달려가고 있습니다..

5) L1 Cache

 

Ada SM에는 128KB의 Level 1 캐시가 포함되어 있습니다. 이 캐시는 워크로드에 따라 L1 데이터 캐시 또는 공유 메모리로 기능하도록 구성할 수 있는 통합 아키텍처가 특징입니다. 전체 AD102 GPU에는 18432KB의 L1 캐시가 포함되어 있습니다(GA102의 10752KB와 비교).

Ampere와 비교했을 때, ADA의 레벨 2 캐시는 상당부분 개조되었습니다.

AD102에는 9,8304KB의 L2 캐시가 탑재되어 있는데, 이는 GA102에 탑재되었던 6144KB에 비해 16배 향상되었습니다. 모든 응용 프로그램은 빠른 캐시 메모리 풀을 사용할 수 있어서 장점이 되고, Ray-Tracing(경로 추적)과 같은 복잡한 작업이 가장 큰 이점입니다.

6) Ray-Tracing Core

Ray tracing이란 빛의 물리적 행동을 시뮬레이션하는 그래픽 렌더링의 한 방법. 광원 추적 가속 하드웨어.

RT 코어는 실제로 이 BVH 구조 내에서 광선 교차점을 찾습니다. BVH 내 테스트에 따라 광선이 교차하는지 여부는 관련 픽셀 셰이더의 값에 영향을 미칩니다.

 레이 트레이싱은 ray와 충돌하는 지점(intersection point) 삼각형 정보를 알아내는 것입니다. 존재하는 모든 오브젝트들을 검사하여 intersection point를 조사할 수 있지만 비효율적입니다. 이를 위해 BVH로 검사할 단위를 나누어 진행하는 것입니다.

RT Core는 RTX 시리즈의 그래픽 카드를 구성하는 Ray tracing을 위한 핵심 unit입니다. 레이 트레이싱의 주 병목 지점은 광선과 물체가 충돌하는 지점(intersection point)를 검출해 내는 교차 검사(intersection testing)입니다.  이를 CUDA같은 GPGPU 기법을 사용하더라도 SW로 구현되는 이상 한계가 있습니다. 그래서 NVIDIA에서 이러한 작업들을 하드웨어로 구현한 것이 RT Core이다. RT Core는 개발 단계에서 원래 TTU(Tree Traversal Unit)라는 이름이었습니다. 

번역해보면 트리를 탐색(순회)하는 장치입니다. RT Core가 하는 일은 2가지로 다음과 같습니다

1) Tree traversal (트리 탐색)

2) Intersection testing (교차 검사)

Tree로 공간을 분할하여, 광선과 물체가 충돌하는 지점을 찾는다.(교차 검사를 한다.)

cf) BVH(Bounding Volume Hierarchy)

공간을 분할하는 자료구조로 k-d tree, octree, BSP 트리 등이 있지만 레이 트레이싱에선 오브젝트 단위로 분할하는
BVH(Bounding Volume Hierarchy)를 사용합니다. BVH는 레이 트레이싱에서 빠른 계산(가속)을 위한 자료구조로
acceleration structure라고도 불립니다. RT Core에서 BVH 자료구조를 지원하여 이를 기반으로 트리를 traversal 합니다. k-d tree와 같은 공간 분할 트리와의 차이점은 <좌표를 기준으로 공간을 분할하는 것>이 아닌 오브젝트 단위로 분리합니다. 

아래 왼쪽 그림과 같이 각 오브젝트를 감싸는 박스 혹은 볼륨을 바운딩 박스 or 볼륨이라 하는데 BVH는 각각의 바운딩 박스를 노드로 가집니다. 이처럼 바운딩 박스를 계층 형태로 만든 것이 BVH입니다. 각각의 바운딩 박스들은 서로 겹칠 수 있음을 확인합시다!

6.1) RT Core의 동작 순서

1) Building: RT Core가 광원을 추적하기 앞서, BVH가 미리 생성되어 있어야한다.
BVH를 빌딩하고 ray를 생성하는 작업은 GPU의 SM(Streaming Multiprocessor)가 담당.

2) RT Core가 데이터를 일정 단위로 가져와(fetch) BVH와 ray의 교차 검사를 진행한다. 바운딩 박스 혹은 삼각형과의 교차 검사가 필요하다. 따라서 RT Core는 다음과 같이 두 가지의 검사 단위를 가진다.

-박스 교차 검사

-삼각형 교차 검사

바운딩 박스 내부에 더 이상 바운딩 박스가 존재하지 않으면 물체와 검사를 진행해야 하므로, 하나의 바운딩 박스에 너무 많은 물체가 있으면 성능이 하락할 것입니다. 바운딩 박스를 정의하는 방법은 여러가지가 있지만 레이 트레이싱에선 AABB(Axis-Aligned Bounding Box) 모델을 사용합니다. 쉽게 말하면 기준 축과 평행한 면들로 이루어진 박스입니다.

 

제가 준비한 내용은 여기까지 입니다.

감사합니다,