Vengineerの妄想

人生を妄想しています。

Blackwell RTXシリーズは、MIG対応できるんですか?

はじめに

昨日の続きです。

vengineer.hatenablog.com

昨日は上記のように、DIGITS GB10 の GPU chiplet であろう GB10B についてでした。

今日は、Blackwell RTX シリーズの GB202/203/205/206/207 についてです。

GB202/203/205/206/207

の、ここ に、GB202の情報があります。GB203/205/206/207 についても、GB202 の下にあります。

結構長いですが、下記の機能をサポートしています。

const CLASSDESCRIPTOR *
gpuGetClassDescriptorList_GB202(POBJGPU pGpu, NvU32 *pNumClassDescriptors)
{
    static const CLASSDESCRIPTOR halGB202ClassDescriptorList[] = {
        { ACCESS_COUNTER_NOTIFY_BUFFER, ENG_GR(0) },
        { ACCESS_COUNTER_NOTIFY_BUFFER, ENG_GR(1) },
        { ACCESS_COUNTER_NOTIFY_BUFFER, ENG_GR(2) },
        { ACCESS_COUNTER_NOTIFY_BUFFER, ENG_GR(3) },
        { AMPERE_CHANNEL_GPFIFO_A, ENG_KERNEL_FIFO },
        { AMPERE_USERMODE_A, ENG_GPU },
        { BLACKWELL_B, ENG_GR(0) },
        { BLACKWELL_B, ENG_GR(1) },
        { BLACKWELL_B, ENG_GR(2) },
        { BLACKWELL_B, ENG_GR(3) },
        { BLACKWELL_CHANNEL_GPFIFO_A, ENG_KERNEL_FIFO },
        { BLACKWELL_CHANNEL_GPFIFO_B, ENG_KERNEL_FIFO },
        { BLACKWELL_COMPUTE_B, ENG_GR(0) },
        { BLACKWELL_COMPUTE_B, ENG_GR(1) },
        { BLACKWELL_COMPUTE_B, ENG_GR(2) },
        { BLACKWELL_COMPUTE_B, ENG_GR(3) },
        { BLACKWELL_COMPUTE_B, ENG_GR(4) },
        { BLACKWELL_COMPUTE_B, ENG_GR(5) },
        { BLACKWELL_COMPUTE_B, ENG_GR(6) },
        { BLACKWELL_COMPUTE_B, ENG_GR(7) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(0) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(1) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(2) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(3) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(4) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(5) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(6) },
        { BLACKWELL_DMA_COPY_B, ENG_CE(7) },
        { BLACKWELL_INLINE_TO_MEMORY_A, ENG_GR(0) },
        { BLACKWELL_INLINE_TO_MEMORY_A, ENG_GR(1) },
        { BLACKWELL_INLINE_TO_MEMORY_A, ENG_GR(2) },
        { BLACKWELL_INLINE_TO_MEMORY_A, ENG_GR(3) },
        { BLACKWELL_USERMODE_A, ENG_GPU },
        { FERMI_CONTEXT_SHARE_A, ENG_KERNEL_FIFO },
        { FERMI_TWOD_A, ENG_GR(0) },
        { FERMI_TWOD_A, ENG_GR(1) },
        { FERMI_TWOD_A, ENG_GR(2) },
        { FERMI_TWOD_A, ENG_GR(3) },
        { FERMI_VASPACE_A, ENG_DMA },
        { G84_PERFBUFFER, ENG_BUS },
        { GF100_DISP_SW, ENG_SW },
        { GF100_HDACODEC, ENG_HDACODEC },
        { GF100_SUBDEVICE_INFOROM, ENG_GPU },
        { GF100_SUBDEVICE_MASTER, ENG_GPU },
        { GF100_TIMED_SEMAPHORE_SW, ENG_SW },
        { GF100_ZBC_CLEAR, ENG_KERNEL_MEMORY_SYSTEM },
        { GP100_UVM_SW, ENG_SW },
        { HOPPER_CHANNEL_GPFIFO_A, ENG_KERNEL_FIFO },
        { HOPPER_SEC2_WORK_LAUNCH_A, ENG_SEC2 },
        { HOPPER_USERMODE_A, ENG_GPU },
        { KEPLER_CHANNEL_GROUP_A, ENG_KERNEL_FIFO },
        { KEPLER_DEVICE_VGPU, ENG_GPU },
        { MMU_FAULT_BUFFER, ENG_GR(0) },
        { MMU_FAULT_BUFFER, ENG_GR(1) },
        { MMU_FAULT_BUFFER, ENG_GR(2) },
        { MMU_FAULT_BUFFER, ENG_GR(3) },
        { NV0060_SYNC_GPU_BOOST, ENG_GPU },
        { NV01_MEMORY_LOCAL_USER, ENG_SW },
        { NV01_MEMORY_VIRTUAL, ENG_DMA },
        { NV04_DISPLAY_COMMON, ENG_KERNEL_DISPLAY },
        { NV04_SOFTWARE_TEST, ENG_SW },
        { NV50_DEFERRED_API_CLASS, ENG_SW },
        { NV50_MEMORY_VIRTUAL, ENG_DMA },
        { NV50_P2P, ENG_BUS },
        { NV50_THIRD_PARTY_P2P, ENG_BUS },
        { NVA081_VGPU_CONFIG, ENG_GPU },
        { NVA084_KERNEL_HOST_VGPU_DEVICE, ENG_GPU },
        { NVC372_DISPLAY_SW, ENG_KERNEL_DISPLAY },
        { NVC77F_ANY_CHANNEL_DMA, ENG_KERNEL_DISPLAY },
        { NVCA70_DISPLAY, ENG_KERNEL_DISPLAY },
        { NVCA71_DISP_SF_USER, ENG_KERNEL_DISPLAY },
        { NVCA73_DISP_CAPABILITIES, ENG_KERNEL_DISPLAY },
        { NVCA7A_CURSOR_IMM_CHANNEL_PIO, ENG_KERNEL_DISPLAY },
        { NVCA7B_WINDOW_IMM_CHANNEL_DMA, ENG_KERNEL_DISPLAY },
        { NVCA7D_CORE_CHANNEL_DMA, ENG_KERNEL_DISPLAY },
        { NVCA7E_WINDOW_CHANNEL_DMA, ENG_KERNEL_DISPLAY },
        { NVCFB0_VIDEO_DECODER, ENG_NVDEC(0) },
        { NVCFB0_VIDEO_DECODER, ENG_NVDEC(1) },
        { NVCFB0_VIDEO_DECODER, ENG_NVDEC(2) },
        { NVCFB0_VIDEO_DECODER, ENG_NVDEC(3) },
        { NVCFB7_VIDEO_ENCODER, ENG_NVENC(0) },
        { NVCFB7_VIDEO_ENCODER, ENG_NVENC(1) },
        { NVCFB7_VIDEO_ENCODER, ENG_NVENC(2) },
        { NVCFB7_VIDEO_ENCODER, ENG_NVENC(3) },
        { NVCFD1_VIDEO_NVJPG, ENG_NVJPEG(0) },
        { NVCFD1_VIDEO_NVJPG, ENG_NVJPEG(1) },
        { NVCFD1_VIDEO_NVJPG, ENG_NVJPEG(2) },
        { NVCFD1_VIDEO_NVJPG, ENG_NVJPEG(3) },
        { NVCFFA_VIDEO_OFA, ENG_OFA(0) },
        { NV_CONFIDENTIAL_COMPUTE, ENG_CONF_COMPUTE },
        { RM_USER_SHARED_DATA, ENG_GPU },
        { TURING_CHANNEL_GPFIFO_A, ENG_KERNEL_FIFO },
        { TURING_USERMODE_A, ENG_GPU },
        { VOLTA_CHANNEL_GPFIFO_A, ENG_KERNEL_FIFO },
        { VOLTA_USERMODE_A, ENG_GPU },
    };

    #define HALGB202_NUM_CLASS_DESCS (sizeof(halGB202ClassDescriptorList) / sizeof(CLASSDESCRIPTOR))

    #define HALGB202_NUM_CLASSES 68

    ct_assert(NV0080_CTRL_GPU_CLASSLIST_MAX_SIZE >= HALGB202_NUM_CLASSES);

    *pNumClassDescriptors = HALGB202_NUM_CLASS_DESCS;
    return halGB202ClassDescriptorList;
}

BLACKWELL_COMPUTE_B

下記のように、BLACKWELL_COMPUTE_B が8個あります。ちなみに、GB100/GB102/GB10B は、これが BLACKWELL_COMPUTE_A になります。

メモリやCOMPUTEを

  • FULL
  • HALF
  • QUARTER
  • EIGHTH

に分割できます。GB100 と同じ用に分割できるようです。

        { BLACKWELL_COMPUTE_B, ENG_GR(0) },
        { BLACKWELL_COMPUTE_B, ENG_GR(1) },
        { BLACKWELL_COMPUTE_B, ENG_GR(2) },
        { BLACKWELL_COMPUTE_B, ENG_GR(3) },
        { BLACKWELL_COMPUTE_B, ENG_GR(4) },
        { BLACKWELL_COMPUTE_B, ENG_GR(5) },
        { BLACKWELL_COMPUTE_B, ENG_GR(6) },
        { BLACKWELL_COMPUTE_B, ENG_GR(7) },

8個あるということは、MIG対応になるということです。MIG対応は、ここにあります。

kmigmgrIsGPUInstanceFlagValid_GB202
(
    OBJGPU *pGpu,
    KernelMIGManager *pKernelMIGManager,
    NvU32 gpuInstanceFlag
)
{
    NvU32 memSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG,
                                _MEMORY_SIZE, gpuInstanceFlag);
    NvU32 computeSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG,
                                    _COMPUTE_SIZE, gpuInstanceFlag);
    NvU32 gfxSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG,
                                    _GFX_SIZE, gpuInstanceFlag);

    switch (memSizeFlag)
    {
        case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL:
        case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF:
        case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER:
            break;
        case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH:
            return NV_FALSE;
        default:
            NV_PRINTF(LEVEL_ERROR, "Unrecognized GPU mem partitioning flag 0x%x\n",
                      memSizeFlag);
            return NV_FALSE;
    }

    switch (computeSizeFlag)
    {
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER:
            break;
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_06:
        case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_07:
            return NV_FALSE;
        default:
            NV_PRINTF(LEVEL_ERROR, "Unrecognized GPU compute partitioning flag 0x%x\n",
                      computeSizeFlag);
            return NV_FALSE;
    }

おわりに

RTX5090 は現状、32GBのメモリです。これを 1/8 とかにしてもあまりおいしくないですが、RTX 6000 シリーズとして、GB202 を使うと、メモリは倍の64GBを実装してくると思います。これなら 1/8 にしても 8GB になるので、使えそうですね。GDDR7だと、1個3GBというものも出てくるようなので、そうなると、96GB となり、H100と同じ容量になっちゃいますね。

Ada Lovelace までは、RTXシリーズで MIG 対応していなかったのに、Blackwell で MIG 対応したのは何か理由があるのですかね。。。

と言っても、NVIDIAの公式からは、MIG対応できるという発表はされていませんね。