Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

NVIDIAがGPUのKernel Modulesを公開したので、ソースコード解析をしてみる(その9)

はじめに

NVIDIAGPUの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_ada.c は、Ada Lovelace 用のようです。

HopperとAda Lovelaceの違いは、仮想アドレス(VA)が 57bit vs 49 bit のようです。

Hopper

    // 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)

H100のレジスタ関連は、ここ

おわりに

Hopper と Ada Lovelace の情報をみてみました。