From 333bd93e1adf514cbac7a53f5fc0b42e4708803b Mon Sep 17 00:00:00 2001 From: Ayush Ranjan Date: Tue, 23 May 2023 16:59:27 -0700 Subject: [PATCH] Add support for Nvidia Hopper GPU architecture. With this change, we can now run simple CUDA applications on H100 GPUs. ``` $ docker run --runtime=runsc --gpus all nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubi8 [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done ``` Note that this was tested with 525.60.13 driver version. Updates #14 PiperOrigin-RevId: 534607359 --- pkg/abi/nvgpu/classes.go | 16 ++++++++++++++-- pkg/abi/nvgpu/ctrl.go | 6 ++++-- pkg/sentry/devices/nvproxy/frontend.go | 8 ++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pkg/abi/nvgpu/classes.go b/pkg/abi/nvgpu/classes.go index a167384b6..5d9a13b37 100644 --- a/pkg/abi/nvgpu/classes.go +++ b/pkg/abi/nvgpu/classes.go @@ -34,11 +34,14 @@ const ( TURING_CHANNEL_GPFIFO_A = 0x0000c46f AMPERE_CHANNEL_GPFIFO_A = 0x0000c56f TURING_DMA_COPY_A = 0x0000c5b5 - AMPERE_DMA_COPY_A = 0x0000c6b5 - AMPERE_DMA_COPY_B = 0x0000c7b5 TURING_COMPUTE_A = 0x0000c5c0 + HOPPER_USERMODE_A = 0x0000c661 + AMPERE_DMA_COPY_A = 0x0000c6b5 AMPERE_COMPUTE_A = 0x0000c6c0 + AMPERE_DMA_COPY_B = 0x0000c7b5 + HOPPER_DMA_COPY_A = 0x0000c8b5 ADA_COMPUTE_A = 0x0000c9c0 + HOPPER_COMPUTE_A = 0x0000cbc0 ) // NV0005_ALLOC_PARAMETERS is the alloc params type for NV01_EVENT_OS_EVENT, @@ -197,3 +200,12 @@ type NV_GR_ALLOCATION_PARAMETERS struct { Size uint32 Caps uint32 } + +// NV_HOPPER_USERMODE_A_PARAMS is the alloc param type for HOPPER_USERMODE_A, +// from src/common/sdk/nvidia/inc/nvos.h. +// +// +marshal +type NV_HOPPER_USERMODE_A_PARAMS struct { + Bar1Mapping uint8 + Priv uint8 +} diff --git a/pkg/abi/nvgpu/ctrl.go b/pkg/abi/nvgpu/ctrl.go index 69a4d0a4f..04547ccd1 100644 --- a/pkg/abi/nvgpu/ctrl.go +++ b/pkg/abi/nvgpu/ctrl.go @@ -53,8 +53,9 @@ const ( // From src/common/sdk/nvidia/inc/ctrl/ctrl0000/ctrl0000system.h: const ( - NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION = 0x101 - NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS = 0x136 + NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION = 0x101 + NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS = 0x136 + NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_MATRIX = 0x13a ) // +marshal @@ -160,6 +161,7 @@ const ( NV2080_CTRL_CMD_GPU_GET_ENGINES_V2 = 0x20800170 NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS = 0x2080018b NV2080_CTRL_CMD_GPU_GET_COMPUTE_POLICY_CONFIG = 0x20800195 + NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO = 0x208001a3 ) // From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080gr.h: diff --git a/pkg/sentry/devices/nvproxy/frontend.go b/pkg/sentry/devices/nvproxy/frontend.go index 65984a3c8..a8f4c78db 100644 --- a/pkg/sentry/devices/nvproxy/frontend.go +++ b/pkg/sentry/devices/nvproxy/frontend.go @@ -547,6 +547,7 @@ func rmControl(fi *frontendIoctlState) (uintptr, error) { nvgpu.NV0000_CTRL_CMD_GPU_GET_MEMOP_ENABLE, nvgpu.NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_INFO, nvgpu.NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS, + nvgpu.NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_MATRIX, nvgpu.NV0080_CTRL_CMD_FB_GET_CAPS_V2, nvgpu.NV0080_CTRL_CMD_GPU_GET_NUM_SUBDEVICES, nvgpu.NV0080_CTRL_CMD_GPU_QUERY_SW_STATE_PERSISTENCE, @@ -572,6 +573,7 @@ func rmControl(fi *frontendIoctlState) (uintptr, error) { nvgpu.NV2080_CTRL_CMD_GPU_GET_ENGINES_V2, nvgpu.NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS, nvgpu.NV2080_CTRL_CMD_GPU_GET_COMPUTE_POLICY_CONFIG, + nvgpu.NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO, nvgpu.NV2080_CTRL_CMD_GR_SET_CTXSW_PREEMPTION_MODE, nvgpu.NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_SIZE, nvgpu.NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER, @@ -769,10 +771,12 @@ func rmAlloc(fi *frontendIoctlState) (uintptr, error) { return rmAllocSimple[nvgpu.NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS](fi, &ioctlParams, isNVOS64) case nvgpu.TURING_CHANNEL_GPFIFO_A, nvgpu.AMPERE_CHANNEL_GPFIFO_A: return rmAllocSimple[nvgpu.NV_CHANNEL_ALLOC_PARAMS](fi, &ioctlParams, isNVOS64) - case nvgpu.TURING_DMA_COPY_A, nvgpu.AMPERE_DMA_COPY_A, nvgpu.AMPERE_DMA_COPY_B: + case nvgpu.TURING_DMA_COPY_A, nvgpu.AMPERE_DMA_COPY_A, nvgpu.AMPERE_DMA_COPY_B, nvgpu.HOPPER_DMA_COPY_A: return rmAllocSimple[nvgpu.NVB0B5_ALLOCATION_PARAMETERS](fi, &ioctlParams, isNVOS64) - case nvgpu.TURING_COMPUTE_A, nvgpu.AMPERE_COMPUTE_A, nvgpu.ADA_COMPUTE_A: + case nvgpu.TURING_COMPUTE_A, nvgpu.AMPERE_COMPUTE_A, nvgpu.ADA_COMPUTE_A, nvgpu.HOPPER_COMPUTE_A: return rmAllocSimple[nvgpu.NV_GR_ALLOCATION_PARAMETERS](fi, &ioctlParams, isNVOS64) + case nvgpu.HOPPER_USERMODE_A: + return rmAllocSimple[nvgpu.NV_HOPPER_USERMODE_A_PARAMS](fi, &ioctlParams, isNVOS64) case nvgpu.GF100_SUBDEVICE_MASTER, nvgpu.TURING_USERMODE_A: