AMD 폴라리스 아키텍처의 진화 포인트는 스케줄링
AMD는 라데온 RX 400 (Polaris) 시리즈의 GPU 아키텍처에서 하드웨어 스케줄러(Hardware Scheduler : HWS)를 도입했습니다. 이것은 GPU의 프론트 엔드에서 작업 스케줄링을 수행하는 하드웨어입니다. 지금까지의 GPU의 경우 상위 작업 수준의 스케줄링은 CPU에서 소프트웨어로 처리했습니다.
라데온 RX 480 (Polaris 10)의 프론트 엔드. 하드웨어 스케줄러가 더해졌습니다.
이로 인해 AMD GPU는 대기 시간이 짧고 신속하게 작업 스케줄링이 가능하며, 실시간 태스크의 실행 등 다양한 스케줄링을 할 수있습니다. GPU에서 다수의 컴퓨팅 작업과 그래픽스 태스크를 병행 실행하기가 쉬워졌습니다. 또한 큰 흐름에서 보면 하드웨어 스케줄러의 탑재는 GPU를 CPU에 예속시키는 보조 프로세서의 위치가 아닌, 보다 독립적인 프로세서로 진행하게 됐습니다.
하드웨어적으로 보면 GPU 프론트 엔드의 명령 프로세서(Command Processor : CP) 군이 더욱 복잡해졌습니다. AMD는 구조적으로 GPU의 이 부분에 주력하고 있습니다. 더 크기가 작은 작업을 병렬로 여럿 실행시킬 수있는 아키텍처로 나아가는 개혁을 추진하고 있습니다.
GPU의 사령탑인 명령 프로세서
GPU는 간접 프로그래밍 모델을 사용합니다. CPU에서 실행하는 GPU의 디바이스 드라이버 소프트웨어 스택은 다양한 GPU의 제어를 실행합니다. 디바이스 드라이버 상위 언어에서 GPU의 네이티브 명령으로 컴파일하지만, 그것 외에도 OS가 드라이버를 통해 GPU의 다양한 제어를 수행합니다. 기존의 GPU는 다양한 제어를 CPU에 맡기고 있기에, 실시간 처리가 필요한 작업 스케줄링은 어렵습니다.
여기에서 중요한 것이 명령 프로세서입니다. 명령 프로세서는 GPU 특유의 프로세서로 GPU의 프론트 엔드에 해당합니다. CPU 측의 디바이스 드라이버에서 생성된 명령 스트림은 메모리에서 명령 버퍼에 기록합니다. 명령 버퍼는 GPU 측에서 자동으로 인출됩니다. 이 때 GPU에서 명령을 페치하는 하드웨어가 명령 프로세서입니다. 명령 프로세서는 명령 스트림을 가져 오는 작업 그룹을 생성하고 그것을 AMD GPU의 실행 단위인 CU(Compute Unit)에 파견합니다.
AMD GPU의 실행 모델
AMD GPU의 흐름
AMD의 CU는 다수의 쉐이더 엔진을 구성하고 배차 쉐이더 엔진에 작업 그룹을 할당합니다. 쉐이더 엔진은 작업 그룹 중에서 실행하는 쓰레드를 배치하는 웨이브 프론트를 실행합니다. 쉐이더 엔진에서 실행된 웨이브프론트는 각각의 CU로 보내져어 실행된니다.
명령 프로세서는 GPU의 파이프 라인에서 최상위 프론트 엔드를 맡는 하드웨어입니다. GPU 내 연산 코어 군이 악기를 연주하는 오케스트라라면 그것을 제어하는 명령 프로세서는 지휘자에 해당합니다.
폴라리스 10의 쉐이더 엔진
전통적으로 명령 프로세서는 GPU가 수행하는 모든 작업을 처리합니다. 복잡한 제어를 위한 다양한 기능을 갖추고 있지요. GCN 아키텍처의 경우 명령 프로세서는 메모리와 캐시의 읽기, 아토믹 오퍼레이션 온 칩 공유 메모리인 GDS를 읽고 쓰는 그래픽 제어 흐름의 실행 및 기타 커널 출시에 필요한 것은 모두 실행합니다.
또한 명령 프로세서는 쉐이더 엔진에 디스패치 워크 그룹을 추적하여 동기화 등을 제어합니다. 지금의 AMD GPU 세대의 경우 선점에 의한 컨텍스트 스위칭을 제어합니다. 또한 명령 프로세서 자체는 프로그램에서 펌웨어를 실행시킵니다.
라데온 RX 480(폴라리스 10)의 전체 구성
명령 프로세서의 실체는 사용자 정의 마이크로 컨트롤러
복잡하고 강력한 명령 프로세서의 실체는 사용자 정의된 마이크로 컨트롤러 (MCU)입니다. 아래는 AMD가 GCN 아키텍처 발표 후 개최한 2012 년의 AMD Fusion Developer Summit(AFDS)에서 나온 슬라이드입니다. AFDS에서 설명하길, 때로는 CPU처럼 일반적인 명령 세트를 갖춘 임베디드 MCU가 명령 프로세서로 구현되어 있다고 하네요.
GCN의 첫번째 세대 명령 프로세서
즉, 병렬 프로세서인 GPU의 쉐이더 코어와는 별도로 스칼라 코어 제어 명령 프로세서로 GPU에 탑재된 것입니다. 벡터 명령은 GPU 코어로 GPU 전체와 쉐이더 어레이를 제어하는 스칼라 명령은 명령 프로세서에서 실행합니다. 이전의 GPU는 전체 칩에서 1개의 명령 프로세서를 탑재하고 있었습니다. 그러나 AMD는 GCN 아키텍처가 된 이후 명령 프로세서의 강화를 추진해 왔습니다.
명령 프로세서는 그래픽스 태스크와 컴퓨팅 작업을 모두 처리할 수 있습니다. 그러나 AMD는 GPU의 범용화를 목표로하는 가운데, 많은 컴퓨팅 작업을 병렬로 실행할 수 아키텍처를 쓰는 것이 중요하다고 판단했습니다. 그래서 기본 명령 프로세서 외에 컴퓨팅 작업 전용 명령 프로세서 ACE (Asynchronous Compute Engine)를 넣었습니다. CPU에 빗대 설명한다면 명령 프로세서를 멀티 코어 화한 것이 GCN입니다.
GCN은 그래픽스 태스크와 컴퓨팅 작업을 동시에 처리할 수 있게 됐습니다.
ACE는 명령 프로세서의 기능 한정판
ACE의 실체는 명령 프로세서의 기능 축소 버전입니다. GPU 컴퓨팅 작업만을 처리하도록 제한된 것이죠. 현재 ACE는 각각 최대 8 개의 작업 큐를 생성할 수 있으며, 여러 명령 스트림을 처리할 수 있습니다. 말하자면 각 ACE가 각각 8 스레드를 실행하는 멀티 스레드 코어와 같은 구성으로 되어 있다고 Mike Mantor(Senior Fellow Architect, RTG, AMD)는 비유합니다. 즉, AMD는 프론트 엔드의 제어 MCU를 멀티 코어화 하면서 멀티 스레딩으로 (실제로는 큐를 바꾸는 것만) 확장도 수행한 것입니다.
GCN 아키텍처 발표 시 ACE의 설명. 실시간 스케줄링과 컨텍스트 스위칭이 포함됩니다.
AMD의 APU 13 당시의 슬라이드. 여기에는 일부 잘못된 내용이 있는 데, 웨이브 프론트를 보내는 것이 ACE는 아니라네요.
8 태스크 큐를 가진 ACE를 늘려 더 많은 컴퓨팅 작업을 시작하고 관리할 수 있게 됩니다. 지금은 하이엔드 AMD GPU에서 1 명령 프로세서 + 8ACE 미드 레인지, AMD GPU에서 1 명령 프로세서 + 4ACE로 균형을 잡았습니다. 컴퓨팅을 중시하는 경우는 ACE의 수를 늘립니다. AMD GCN 아키텍처의 PS4가 미들 레인지 급의 GPU에 8개의 ACE를 조합한 것은 PS4의 목적을 명확하게 보여주고있습니다.
AMD는 계속해서 프론트 엔드의 강화를 계속하고 있습니다. 현재 GCN 아키텍처의 경우 주요 일반 명령 프로세서가 1개, 컴퓨팅을위한 ACE의 수는 GPU의 크기에 따라 최대 8개입니다. 또한 명령 프로세서 / ACE를 제어하는 GPU의 실행 모드도 확장하고 선제 컨텍스트 스위치를 지원하게 됐습니다.
대략적으로 말하면 명령 프로세서 / ACE와 그 하류의 구조는, GPU의 내부에서 작업을 분해한 후 스케줄링을 제어하는 것입니다. 또한 명령 프로세서 / ACE 자체는 작업 큐에서 인출할 때 작업의 우선 순위 제어 및 실시간 제어를 수행하는 스펙이 됐습니다. 그러나 GPU에 전달하는 단계에서 작업 단위 예약 및 제어 우선 순위와 실시간 처리는 지금까지 드라이버 쪽에서 제어했습니다.
새로운 컨트롤러 코어가 2개 추가
AMD의 최신 폴라리스 아키텍처는 명령 프로세서 및 ACE 이외에 두 개의 하드웨어 스케줄러 코어가 추가됐습니다. 하드웨어 스케줄러는 명령 프로세서 및 ACE가 핸들 작업 스케줄링 제어만을 전용 수행합니다. 하드웨어 스케줄러는 2개이며, 동시에 2 콘텍스트의 스케줄링을 처리할 수 있다고 AMD는 설명합니다. 물리적으로 하드웨어 스케줄러도 새로운 마이크로 컨트롤러이라고 추측됩니다.
AMD는 GCN 아키텍처가 되면서 ACE를 탑재해 더 세밀하고 작은 GPU 컴퓨팅 작업도 효율적으로 병렬 실행할 수 있도록 했습니다. ACE를 늘려 병렬 실행할 수 있는 작업의 수를 늘렸습니다. 또한 선제 컨텍스트 스위칭을 지원함으로써 GPU 리소스 분할을 쉽게 할 수 있도록 했습니다. 현재 AMD GPU는 그래픽과 컴퓨팅 모두에서 커널 프로그램의 실행 도중에 작업을 중단하고 작업을 전환할 수있습니다.
그러나 컨텍스트의 양이 많은 GPU의 경우 선제 컨텍스트 스위칭은 스토어 / 복원의 지연 시간이 상대적으로 길어 다용도로 쓸 수 없습니다. 따라서 GPU에서 많은 작업을 원활히 실행할 경우에는 고급 스케줄링이 필요합니다. GPU의 자원을 작업의 중요도에 따라 유연하게 할당하는 구조 말이죠.
원래 AMD GCN의 ACE는 기능적으로는 우선 순위 스케줄링과 실시간 스케줄링을 할 수 있습니다. 그러나 지금까지는 그러한 스케줄링을 행하는 경우, 일정을 제어하는 프로그램을 CPU 쪽에서 실행했습니다. 따라서 GPU의 상태에 따라 레이턴시를 낮추기가 어려웠습니다.
폴라리스 하드웨어 스케줄러는 이러한 문제를 해결하는 구조입니다. GPU에서 작업 스케줄링을 실행하며, 명령 프로세서와 ACE를 제어하는 새로운 컨트롤러입니다. 작업에 따라 우선 순위 제어를 행하고, 레이턴시가 중요한 작업이 우선적으로 낮은 지연 시간에 실행되도록 제어합니다. 또한 실시간 처리가 필요한 작업은 GPU 자원을 고정적으로 예약해 응답성을 확보합니다. 이러한 제어를 GPU 측의 컨트롤러만으로 행하는 것이 하드웨어 스케줄러입니다.
GPU의 소프트웨어 / 하드웨어의 전체 흐름을 보면 하드웨어 스케줄러는 CPU 측에서 실행하는 커널 모드 드라이버의 처리 중 일부를 GPU 측의 마이크로 컨트롤러에 옮겨온 것입니다. CPU와 GPU의 역할 분담 중 GPU 측의 몫이 늘어났습니다. GPU 하드웨어가 더 한층 진화한 것을 나타내는 아키텍처입니다. 또한 GPU의 프론트 엔드를 지속적으로 확장해 온 AMD 아키텍처에서는 당연한 목표라 할 수 있습니다.
프론트 엔드에 2개의 하드웨어 스케줄러를 더한 폴라리스 아키텍처
하드웨어 스케줄러는 오른족의 우선 순위 큐가 낮은 레이턴시로 작동