nVidia GPU 아키텍처 변천사 (Turing)

이전 글 두편을 통해 Tesla 부터 Volta 아키텍처까지 nVidia GPU의 아키텍처 변천사를 Streaming Multiprocessor(SM) 구조를 바탕으로 살펴봤습니다. 이전 글을 쓴지 어느새 4년 반 가량이 지났는데, 조금 늦은감이 있지만 그 사이에 발표된 Turing과 Ampere 아키텍처를 마저 살펴보겠습니다. 분량 관계상 이 글에서는 먼저 Turing 아키텍처만을 다루고 Ampere 아키텍처는 다음 글에서 다루겠습니다.

이전 글 1 : nVidia GPU 아키텍처 변천사 (상편)

이전 글 2 : nVidia GPU 아키텍처 변천사 (하편)

먼저 Volta와 Turing 아키텍처의 발표로 GPU 아키텍처의 계보가 조금 복잡해 졌습니다. Tesla부터 Maxwell까지는 하나의 아키텍처 계보가 이어져 왔지만 Pascal 아키텍처부터 High Performance Computing(HPC)용과 그래픽용으로 SM의 구조가 나뉘기 시작하더니 Pascal의 HPC 분야 후속 아키텍처는 Volta, 그래픽용 후속 아키텍처는 Turing이 되었습니다. 이후 제일 최근의 Ampere 아키텍처에서 다시 하나의 아키텍처로 통합됩니다.

 

Ray Tracing

2018년에 발표된 Turing 아키텍처의 가장 큰 특징은 Ray Tracing가속을 위한 RT 코어가 추가된 것입니다. Ray Tracing은 글자 그대로 3D 그래픽 공간상의 광원에서 나온 빛이 물체들에 의해 반사되고 굴절되어 스크린의 각 픽셀에 도달하여 만들어내는 색을 계산하여 3D 이미지를 표현하는 방법입니다. 광원에서 출발한 모든 빛들이 스크린에 도달하는 것은 아니기 때문에 실제 렌더링시에는 거꾸로 카메라의 시점에서 광원까지의 경로를 추적하여 이미지를 표현하는데 꼭 필요한 광선(Ray)에 대해서만 색을 계산하게 됩니다. (왼쪽 아래 그림)

Ray Tracing은 빛을 물리법칙대로 계산해서 이미지를 만들어내기 때문에 빛의 반사나 굴절에 의해 발생하는 효과를 사실적으로 묘사할 수 있지만 기존의 rasterization 방식에 비해 계산량이 상당히 많아지게 됩니다. 오른쪽 아래 그림을 통해 이유를 알 수 있는데, 카메라의 시점에서 출발한 하나의 광선이 굴절과 반사를 겪으면서 여러개의 광선으로 늘어나기 때문입니다. 빛의 반사를 무한히 따라갈수는 없으므로 눈으로 보기에 큰 차이가 없는 선에서 반사의 단계를 제한하게 됩니다. 이에 더해 하나의 픽셀당 하나의 광원에서 하나의 경로로만 광선이 도달하는 것이 아니기 때문에 이런 계산을 픽셀당 적어도 수천번을 해야 눈으로 보기에 결점이 없는 이미지를 얻을 수 있습니다.

이미지 출처 (왼쪽 – https://en.wikipedia.org/wiki/Ray_tracing_(graphics), 오른쪽 – https://old.hotchips.org/hc31/HC31_2.12_NVIDIA_final.pdf)

앞에서 설명한 것과 같이 Ray Tracing으로 모든 렌더링을 처리하기에 계산량이 너무 많기 때문에 nVidia는 Ray Tracing을 실시간으로 처리하기 위해 하이브리드 렌더링을 제안 했습니다. 1) 대부분의 렌더링은 기존의 방식대로 rasterization 렌더링으로 처리하되, 2) 물이나 거울, 유리등과 같이 사실적인 빛 반사 효과가 필요한 부분에만 Ray Tracing을 적용하고, 3) Ray Tracing 결과물의 부족한 해상도는 AI denoising으로 해결하는 방식인데, 이를 위해 Turing 아키텍처는 아래의 3부분으로 크게 나뉘게 됩니다.

  1. Turing SM – 이전 아키텍처들과 공통적인 Streaming Multiprocessor로 rasterization 렌더링을 주로 처리
  2. RT Core – Ray Tracing을 가속하기 위해 3D object와 광선의 교차점 계산을 가속
  3. Tensor Core – Volta 아키텍처부터 추가된 AI 가속을 위한 4×4 행렬 곱셈 계산기

이제 부터는 순서대로 Turing 아키텍처의 구성요소를 살펴보도록 하겠습니다.

 

Turing SM (Streaming Multiprocessor)

Turing SM은 1년 먼저 발표된 Volta SM과 비슷한 부분이 많습니다. 하나의 SM안에 독립적인 Warp 스케쥴러와 레지스터파일을 가진 4개의 서브코어를 포함하는 점이 동일하며, 각 서브코어 마다 16개의 FP32코어(이전 아키텍처의 CUDA코어), 16개의 INT32코어, 2개의 Tensor코어를 탑재하고 있다는 점도 같습니다. 다만 Volta 아키텍처는 HPC용 아키텍처이기 때문에 Volta SM은 각 서브코어마다 8개의 FP64코어를 탑재하지만 그래픽용으로 FP64연산은 거의 필요없기 때문에 Turing SM에서는 빠져있습니다. 아래 그림에는 표시되어 있지 않지만 AnandTech의 기사에 따르면 호환성을 위해 Turing SM전체를 통틀어 두개의 FP64코어가 포함되어 있다고 합니다. FP64코어가 제거된 관계로 Volta SM 대비 Turing SM쪽의 LD/ST의 유닛의 개수가 반으로 줄었고 L1 cache의 크기도 Volta의 128KB 대비 96KB로 작습니다. 대신에 Turing SM은 Volta SM에는 없는 RT코어를 가지고 있는데 이에 대해서는 다음 단락에서 설명하겠습니다.

Volta와 Turing SM 구조 비교 (그림 출처 좌 – NVIDIA TESLA V100 GPU ARCHITECTURE white paper, 우 – NVIDIA TURING GPU ARCHITECTURE white paper)

RT Core

Ray Tracing 렌더링을 위해서는 카메라에서 출발한 광선이 3D 그래픽 공간상의 물체에 부딪히고 반사되어 광원까지 도달하는 경로를 계산할 필요가 있습니다. 이미지의 각 픽셀마다 카메라에서 출발한 광선을 따라갈 경우 빛이 부딪히는 물체에 따라 어떤 식으로 반사, 굴절, 산란되는지는 변하더라도 특정 지점에서 특정 방향으로 출발한 광선이 3D 그래픽 공간상의 물체에 부딪히는지 아닌지에 대한 계산 자체는 공통적인 연산이 됩니다. RT 코어의 역할은 Ray Tracing의 기본이되는 연산인 광선과 물체의 교차점을 찾는 계산을 가속하는 것입니다.

그 동안의 3D 그래픽 분야의 연구결과가 쌓인 결과 Ray Tracing을 가속하기 위한 알고리즘으로 Bounding Volume Hierarchy(BVH)가 사실상의 표준이 되었는데, BVH 알고리즘은 물체를 둘러싸고 있는 박스(Bounding Volume)로 공간을 나눕니다. 나눠진 박스중에 물체가 포함된 박스는 다시 서브박스로 분할하여 물체가 포함된 부분과 포함되지 않은 부분으로 나누는데 물체와 빈 공간이 서브 박스들에 의해 충분히 분리될 때 까지 이 단계를 반복합니다.

BVH 알고리즘을 사용하면 광선이 물체를 둘러싸지 않은 박스를 지난다고 판단되면 바로 더 이상의 계산 없이 바로 다음 광선에 대한 계산을 시작할 수 있어 Ray Tracing을 가속할 수 있습니다. BVH의 각 박스는 아래 그림과 같이 tree node의 형태로 저장이 되는데, tree node를 따라가면서 가장 작은 박스까지 내려가도 광선이 물체가 포함된 박스를 지난다고 판단되면 실제 물체를 구성하는 폴리곤의 기본단위인 삼각형과 광선의 교차점을 계산합니다. (아래그림 참조) BVH tree node를 search하는 작업과 광선과 삼각형의 교차점을 계산하는 작업은 Turing SM에서 수행하면 수천개의 명령어가 필요하지만 이 작업에 특화된 RT 코어를 사용하면 Turing SM에서 수행할 때 보다 7배 정도의 성능향상을 달성할 수 있다고 합니다. (관련자료 – “RTX ON: THE NVIDIA TURING GPU“의 22페이지) BVH 알고리즘의 구체적인 계산 방법이 궁금하다면 링크의 수업 영상을 보실 것을 추천합니다.

Bounding Volume Hierarchy 알고리즘의 동작 (그림 출처 – NVIDIA TURING GPU ARCHITECTURE white paper)

 

Tensor Core

앞에서 Ray Tracing으로 사람의 눈으로 보기에 흠이 없는 결과를 얻기 위해서는 픽셀 당 수천개의 광선을 계산해야 된다고 했는데, RT 코어가 탑재되더라도 적어도 30fps 이상의 실시간 Ray Tracing을 수행하기 위해서는 픽셀당 1~2개 정도의 광선만을 계산할 수 있습니다. 이 때문에 Ray Tracing의 결과는 픽셀이 중간중간 빠진 결과가 되는데 이러한 결과물로부터 고해상도의 결과물을 얻기 위해 AI denoising 알고리즘을 수행할 필요가 있습니다. 아래 그림에서 왼쪽은 AI denoising 알고리즘을 수행하기전의 결과물, 오른쪽은 수행후의 결과물입니다. AI denoising을 위한 AI 추론(inference) 연산을 가속하기 위해 Turing SM은 3D 그래픽용 아키텍처임에도 불구하고 Tensor 코어를 탑재하고 있습니다.

AI Desnoising (그림 출처 – “RTX ON: THE NVIDIA TURING GPU, HotChips, 2019)

Turing의 Tensor 코어는 Volta의 Tensor 코어와 마찬가지로 매 cycle 마다 FP16 precision의 4×4 행렬을 곱한 후 그 결과를 FP32 precision을 가진 4×4 행렬에 더하는 계산을 수행할 수 있으며 Turing SM의 서브코어 마다 두개씩 탑재가 되어 있습니다. Volta의 Tensor 코어와 비교하여 개선된 점은 AI 추론 성능 향상을 위한 INT8/INT4/INT1 precision에 대한 지원의 추가이며 FP16 모드에 비해 INT8 모드는 2배, INT4 모드는 4배의 throughput으로 4×4 행렬계산을 수행할 수 있습니다. Tensor 코어는 SM의 서브코어에 탑재된 INT32/FP32 코어들과 레지스터 파일을 공유하며 서브코어내의 Warp 스케줄러가 각 쓰레드들에 대해 (1개의 Warp는 32개의 쓰레드로 이루어짐) 어떤 쓰레드가 Tensor 코어를 사용할지 관리합니다. 아래는 Turing의 Tensor 코어에서 이루어지는 연산을 표현한 그림입니다.

Turing Tensor 코어 (그림 출처 – “RTX ON: THE NVIDIA TURING GPU, HotChips, 2019)

 

마무리

Turing 아키텍처의 발표와 함께 nVidia는 Ray Tracing 지원을 강조하기 위해 그동안 GTX로 불리던 그래픽 카드라인업의 이름을 RTX로 바꾸었습니다. 점점 향상되는 GPU 성능을 기존 rasterization 기반의 렌더링을 더 고해상도와 빠른 프레임으로 지원하는 대신 Ray Tracing을 통해 보다 사실적인 이미지를 표현하는데 쓰기로 한 결단입니다. 순수한 Ray Tracing 기반의 렌더링을 실시간으로 처리하기에는 여전히 GPU 성능이 충분하지 않은 상황에서 Turing SM/ RT 코어/Tensor 코어를 함께 사용하는 하이브리드 렌더링의 제안을 통해 실시간 Ray Tracing을 구현한 것은 탄탄한 게이밍 API 생태계를 가지고 있는 nVidia만이 할 수 있는 일이 아니었나 싶습니다. GeForce RTX 공식 런칭행사에서 nVidia의 젠슨황 CEO는 1개의 RTX GPU 상에서 돌아가는 SOL demo를 공개 했는데, 이미 보신 분들도 많겠지만 아직 볼 기회가 없었다면 감상을 추천하며 글을 마무리 합니다.

 

– 2022년 2월 13일 업데이트

다음 글 : nVidia GPU 아키텍처 변천사 (Ampere)

 

You may also like...

댓글 남기기