はじめに
NVIDIAがGPUのKernel Modulesを公開したので、ソースコード解析をしてみる(その8)の続き。
にて、520.61.05 にて、H100が追加されたようです。
H100 対応
nvidia-uvm (Universal Virtual Memory 関連)の
- clc86f.h : HOPPER__CHANNEL_GPFIFO
- clc8b5.h : HOPPER_DMA_COPY
が追加されました。
clcX6f.h は、CHANNEL_GPFIFO 関連 clcXb5.h は、DMA_COPY 関連
nvidia-uvm/uvm_hopper_fault_buffer.c
- nvidia-uvm/uvm_hopper_ce.c
- nvidia-uvm/uvm_hopper_host.c
- nvidia-uvm/uvm_hopper_mmu.c
- nvidia-uvm/uvm_hopper.c
- nvidia-uvm/uvm_ada.c
も追加されました。
nvidia-uvm/uvm_ada.c は、Ada Lovelace 用のようです。
HopperとAda Lovelaceの違いは、仮想アドレス(VA)が 57bit vs 49 bit のようです。
// A single top level PDE on Hopper covers 64 PB and that's the minimum // size that can be used. parent_gpu->rm_va_base = 0; parent_gpu->rm_va_size = 64ull * 1024 * 1024 * 1024 * 1024 * 1024; parent_gpu->uvm_mem_va_base = parent_gpu->rm_va_size + 384ull * 1024 * 1024 * 1024 * 1024; parent_gpu->uvm_mem_va_size = UVM_MEM_VA_SIZE; parent_gpu->peer_copy_mode = g_uvm_global.peer_copy_mode; // All GR context buffers may be mapped to 57b wide VAs. All "compute" units // accessing GR context buffers support the 57-bit VA range. parent_gpu->max_channel_va = 1ull << 57; parent_gpu->max_host_va = 1ull << 57;
Ada Lovelace は、
// A single top level PDE on Ada covers 128 TB and that's the minimum size // that can be used. parent_gpu->rm_va_base = 0; parent_gpu->rm_va_size = 128ull * 1024 * 1024 * 1024 * 1024; parent_gpu->uvm_mem_va_base = 384ull * 1024 * 1024 * 1024 * 1024; parent_gpu->uvm_mem_va_size = UVM_MEM_VA_SIZE; parent_gpu->peer_copy_mode = g_uvm_global.peer_copy_mode; // Not all units on Ada support 49-bit addressing, including those which // access channel buffers. parent_gpu->max_channel_va = 1ULL << 40; parent_gpu->max_host_va = 1ULL << 40;
Ada Lovelace の 49bit は、Ampere と同じようです。
各アーキテクチャ間の違いは、uvm_hal.c を見ればいいようです。
ここを見ると、Ada Lovelace は、基本的にはAmpere と同じようです。
{ .id = NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_AD100, .parent_id = NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GA100, .u.arch_ops = { .init_properties = uvm_hal_ada_arch_init_properties, }, },
一部、以下の部分が追加されたようです。
// See uvm_mmu.h for mapping placement parent_gpu->flat_vidmem_va_base = 136ull * 1024 * 1024 * 1024 * 1024; parent_gpu->flat_sysmem_va_base = 256ull * 1024 * 1024 * 1024 * 1024;
UVMのVAのレイアウトは、uvm-mmu.h に、Hopper, Ampere/Volta/Pascal, Maxwell の3種類が載っています。Maxwellの時はNVLINK無かった。HopperではNVLINK-C2Cもある。
GPUの最大物理メモリ容量は、256GBのようです。
// Maximum memory of any GPU. #define UVM_GPU_MAX_PHYS_MEM (256ull * 1024 * 1024 * 1024)
おわりに
Hopper と Ada Lovelace の情報をみてみました。