곧 찾아올 것입니다. 언젠가 노트북이나 서버, 또는 휴대폰에 탑재될 수도 있겠지만, 매년 SiFive 같은 회사들로부터 개발 보드만 받는 느낌입니다. 하지만 한 가지 알아야 할 점이 있습니다. Nvidia는 2024년에 일반적인 컴퓨팅용 칩은 아닐지라도, 10억 개 이상의 RISC-V 코어를 출하했다고 생각합니다.
구체적으로 말하자면, 이 RISC-V 코어들은 Nvidia의 GPU에 포함되어 있지만, 셰이더 코어에는 포함되어 있지 않습니다. 대신, 그래픽 처리 주변에서 온갖 종류의 추가 작업을 수행하는 작은 관리 프로세서들의 집합체에 들어있으며, Nvidia는 모델에 따라 각 GPU당 10개에서 40개가 있다고 추정합니다.
사용자는 이 코어들을 프로그래밍할 수 없으며, 실제로 민감한 코어들은 암호학적으로 검증되어 변조된 경우 GPU 펌웨어가 부팅되는 것조차 허용하지 않습니다. 하지만 예전에는 그래픽 드라이버가 하던 엄청난 양의 작업을 수행하는 특정 코어가 하나 있는데, 이 코어는 2018년부터 그렇게 해오고 있습니다.
Nvidia의 GPU는 10년 동안 독점 마이크로컨트롤러를 사용했습니다
Fast Logic Controller가 많은 역할을 했습니다
RISC-V가 Nvidia 시리즈에 도입되기 전, 이 회사는 Falcon이라는 약어(FAst Logic CONtroller)을 사용했으며, 처음 등장한 것은 G98 세대 무렵인 2005년경이었습니다. 당시에는 Nvidia가 VP2 비디오 디코딩용으로 사용하던 Tensilica Xtensa 코어를 대체했습니다. 이는 가변 길이 명령어 세트를 지원하는 파이프라인 디자인으로, 완전히 독점적이며, 순수한 속도보다는 낮은 다이 면적과 긴 메모리 지연 시간에 맞춰 구축되었습니다. Nvidia는 GPU가 복잡해짐에 따라 계속해서 더 많은 것을 추가했습니다.
2016년까지 Falcon은 단일 칩에 15개 이상의 다양한 엔진으로 발견될 수 있었으며, Nvidia는 이 기간 동안 약 30억 개의 Falcon을 출하한 것으로 추정했습니다. 이들은 비디오 디코딩 및 인코딩, 전력 관리, 보안 엔진 등 매우 많은 기능을 수행하고 있었습니다. 이들은 어디에나 존재했으며, 온칩 부트 ROM이 실행 전에 서명된 펌웨어를 검증한다는 점을 고려할 때, 당시 Nvidia 아키텍처의 핵심 부분이었습니다.
바로 그 서명 요구 사항이 리눅스 사용자들에게 문제를 일으킨 원인이었습니다. 2014년 9월부터 Nvidia는 Falcon이 처음 개발된 지 10년이 지난 시점에도 불구하고, 자신이 요청받은 작업을 수행할 수 없다고 말했습니다.
Nvidia가 주변을 알아보고 Arm이 패배하다
다른 회사들도 역시 패배했다
Nvidia는 왜 더 이상 Falcon을 사용하지 않는지에 대해 상당히 직설적으로 이야기해 왔습니다. 2024년, Nvidia의 하드웨어 엔지니어링 부문 부사장인 Frans Sijstermans는
Arm의 Cortex-A53는 주로 다이 면적(die area) 문제로 실패했습니다. 이 코어는 16nm 공정에서 0.1mm^2 미만으로 구현되어야 했지만, 이를 달성할 수 없었습니다. 게다가 확장 가능한 ISA가 필요하다는 점도 문제가 되었습니다. Cortex-A9와 Cortex-R5 역시 64비트 주소 지정(addressing)의 필요성을 포함하여 여러 이유로 실패했습니다. Synopsys ARC HS는 보안 및 주소 지정 문제에서 실패했습니다. 심지어 Nvidia 자체의 Falcon조차 성능 목표나 주소 공간을 충족시키기 어려웠습니다.
실제로 RISC-V가 모든 분야를 장악한 것은 아니었습니다. Nvidia는 Berkeley의 레퍼런스 코어인 Rocket도 테스트했지만, 이는 타이트하게 결합된 메모리(tightly-coupled memory)와 기능적 시뮬레이션 모델 부재 문제로 실패했습니다. RISC-V의 명령어 집합 구조(instruction set)가 이 코어를 차별화하는 요소였습니다. 그 결과 탄생한 코어는 기존 Falcon 코어보다 월등히 뛰어나, 면적은 두 배 증가했을 뿐인데 성능은 세 배에 달성할 수 있었습니다.
단일 Nvidia 칩에 수십 개의 RISC-V 코어가 탑재될 수 있다
Nvidia의 다양한 유형의 RISC-V 코어가 존재한다
2024년, Sijstermans는 자신의 '개인적이고 비공식적인 추정치(guesstimate)'에 대해 언급했습니다. 따라서 이 내용은 참고만 해주세요. 그는 적어도 그 근거를 설명하며
실제로 이 내용은 Nvidia의 오픈 커널 모듈인 rmlsfm.h 헤더 파일에서 확인할 수 있습니다. 이 파일은 드라이버가 인식하는 모든 마이크로컨트롤러 목록을 담고 있으며, 총 32개의 개별 항목이 포함되어 있습니다. 처음 12개는 모두 Falcon 유닛이지만, 나머지 20개 중 14개가 RISC-V 엔진입니다. 여기에는 GSP_RISCV, PMU_RISCV, NVDEC_RISCV 등이 포함됩니다. 흥미롭게도 Nvidia의 오픈 커널 모듈은 Blackwell 이후 아키텍처인 Rubin에 대한 레지스터 헤더를 이미 갖추고 있습니다. dev_riscv_pri.h는 rubin/gr100 및 rubin/gr102용으로 존재합니다.
여기에는 모두 Nvidia가 설계한 세 가지 주요 코어 디자인이 사용됩니다. NV-RISCV32는 순차적(in-order) RV32I-MU 코어이며, NV-RISCV64는 비순차적(out-of-order) 코어로 더 크며, RV64I-MSU를 기반으로 비트 조작, 원자성(atomics), 대칭형 병렬 처리(symmetric multiprocessing) 지원 기능을 갖추고 있습니다. 마지막으로, NV-RVV는 1024비트 벡터 유닛이 연결된 32비트 코어이며 Deep Learning Accelerator의 일부입니다. 각 코어는
Turing 이후 모든 세대에서 리소스 관리자(resource manager)가 두 부분으로 분리됩니다. CPU-RM은 프로세서에서 실행되고, GSP-RM은 GPU의 RISC-V 코어에서 실행되며, 이 둘은 RPC 메시징 큐를 통해 통신합니다. 그러면 호스트의 커널 드라이버는 GSP에 고수준 명령을 보낼 수 있고, GSP가 초기화, 전력 관리, 클럭 속도 등을 포함한 기능들을 처리합니다. 다시 말해, 사용자가 설치하는 GPU 드라이버 상당 부분이 컴퓨터가 자신의 GPU 내부에 있는 또 다른 컴퓨터로 명령을 보내도록 활성화하는 것입니다.
저는 펌웨어 파일인 nvidia/ga102/gsp/gsp-535.113.01.bin을 분석했는데, 매우 흥미롭습니다. 이 파일은 총 36.3MB 크기로 네 개의 분리된 4KB RSA 서명 섹션을 포함하고 있으며, 각각 Ampere GA10x, Ada AD10x, Hopper GH100, 그리고 H100의 기밀 컴퓨팅(confidential-compute) 변형에 대한 것입니다. 이 파일 자체는 EM_RISCV를 대상으로 하는 ELF64입니다.
이 펌웨어에서 저는 libos-v3.1.0에 대한 참조와 함께 partitions[partitionOwner].pmp[...] 및 PmpEntryFree에 대한 테스트들을 발견했습니다. LibOS는 Nvidia의 마이크로커널(microkernel)이며, 표준 RISC-V 물리 메모리 보호 메커니즘인 PMP를 사용하여 파티션을 격리합니다. 또한 nvidia/tu102/gsp/gsp-535.113.01.bin에서도 문자열들이 동일하다는 것을 확인하여, Turing의 GSP 역시 RISC-V 기반임을 알 수 있었습니다.
Nvidia가 이런 방식을 사용하는 이유는 호스트에 노출되는 MMIO 통신 표면적을 크게 줄이면서 하드웨어 내부 자원에 낮은 지연 시간(lower-latency access)으로 접근할 수 있게 하기 위함입니다. GSP가 분리 커널(separation kernel)을 실행함으로써, 단일 물리 GPU를 하이퍼바이저(hypervisor)의 경로 없이 게스트 VM으로 파티션할 수 있습니다. Nvidia의 vGPU 소프트웨어는 주로 기업용 솔루션이라 일반 소비자가 이용하기 어렵지만, 사용자들은 소비자용 카드에서도 vGPU를 활성화하는 방법을 알아냈으며, GSP가 이러한 분리를 가능하게 하는 중요한 부분입니다.
개방된 명령어 세트가 개방된 GPU를 의미하지는 않는다
RISC-V를 여전히 폐쇄적으로 다룰 수 있다
RISC-V는 개방형 ISA(Instruction Set Architecture)이지만, 안타깝게도 Nvidia의 GPU들은 그렇지 않습니다. 이 네 개의 RSA 서명 블록이 많은 작업을 수행하고 있습니다. 우선, GSP는 해당 GPU 제품군에 대한 서명이 유효하지 않은 이미지는 실행할 수 없으며, 부팅 체인 자체가 보안 엔진이 런타임 펌웨어를 시작하기 전에 인증하도록 구성되어 있습니다. RISC-V가 개방형 표준이라는 사실은 이를 바꾸지 못하며, Nvidia는 RISC-V를 선택한 이유 중 일부로 그 격리(isolation) 및 메모리 보호 기능 덕분에 이러한 종류의 잠금(lockdown)을 구축하기가 더 쉬웠다는 점을 상당히 명확히 했습니다.
nouveau 개발자들에게 이것은 (이해할 만하게도) 좌절스러웠습니다. 이전에 개방되어 있던 많은 제어 로직이 안정적인 ABI(Application Binary Interface)와 문서화되지 않은 호출이 있는 불투명한 바이너리로 이동했고, 그 결과 펌웨어 이미지는 Nvidia 카드를 사용하는 Linux 머신에서 크고 비대해졌습니다. 밝은 면으로는, 이것이 부분적으로 개방형 드라이버가 적어도 괜찮게 작동하는 이유입니다. 왜냐하면 Nvidia가 이제 nouveau가 로드할 수 있도록 서명된 GSP 펌웨어를 공급하기 때문입니다.
이를 통해 개방형 드라이버는 Nvidia GPU의 클럭 속도를 제어하고, 2014년 Maxwell 출시 이후 Linux 사용자들로부터 박탈되었던 최대 속도로 구동할 수 있게 되었습니다. RISC-V 프로세서에 더 많은 제어권을 부여함으로써, 개방형 드라이버는 그렇지 않았다면 할 수 없었을 더 많은 일을 GPU로 수행할 수 있게 되었습니다.
Rust 기반의 nouveau 후속작인 Nova는 GSP를 명시적으로 지원하며, 부팅 중에 올라오는 코어를 선택하기 위한
Nvidia가 GPU에 수십 개의 마이크로컨트롤러를 통합하는 방향으로 나아간 것이 독특한 것은 아니며, AMD도 같은 시도를 했습니다. 차이점은 AMD는 공통의 명령어 세트(instruction set) 없이 서로 관련 없는 아키텍처들의 집합을 구동한다는 것입니다. 공개된 리버스 엔지니어링 자료에 따르면 이들 중 어느 것도 RISC-V 기반은 아니지만, 이 부분에 대해서는 AMD로부터 정보가 완전히 부족합니다. 요즘 사용되는 플랫폼 보안 프로세서(Platform Security Processor)는 Arm Cortex-A5와 TrustZone을 사용하는 것으로 보이며, 시스템 관리 장치(System Management Unit)는 Tensilica Xtensa인 것으로 보이지만, 이전 세대에서는 LatticeMico32를 사용했던 것 같습니다.
AMD 카드에서 GPU의 커맨드 큐(command queue)에서 작업을 가져오는 명령어 프로세서(command processors), PFP, ME, MEC 유닛 모두 AMD가 'F32'라고 부르는 것을 구동합니다. 게다가, 이것은 fail0verflow가 이를 위한 디어셈블러를 작성했기 때문에 우리가 알 수 있는 전부입니다. 이는 범용 ISA(ISA)에서 얻을 수 있는 가장 근접한 수준일 것이며, 본질적으로 GPU 프런트엔드 역할을 하도록 설계된 CPU와 다름없습니다. 심지어 레지스터조차도 그렇습니다.
F32에서는 r0 레지스터가 0으로 하드와이어링(hardwired)되어 있고, r1은 읽을 때마다 GPU의 커맨드 큐에서 dword를 꺼내며, r2는 현재 명령어 패킷 헤더를 담고 있습니다. 또한 펌웨어에 저장된 점프 테이블(jump table)에서 패킷 유형을 찾아 분기하는 전용 btab 명령어가 존재합니다.
AMD 역시 RISC-V를 피하고 있는 것은 아닙니다. 이 회사는 RISC-V International의 회원사이며 2020년부터 회원 자격을 유지해 왔습니다. Vivado 2024.1과 함께 출시된 MicroBlaze V는 진정한 RV32I 프로세서로, AMD가 자체 독점적인 MicroBlaze 코어의 대체품으로 FPGA 고객에게 판매하는 제품입니다. 두 회사 모두 어딘가에서 사내 ISA(in-house ISA)를 RISC-V로 교체했지만, Nvidia는 아무도 살 수 없는 눈에 보이지 않는 내부 구조에서 그렇게 했습니다.