diff --git a/README.md b/README.md index 9ac39e23..043b8131 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,140 @@ Verify registration: kubectl get node -o jsonpath='{.metadata.annotations.hami\.io/node-amd-register}' ``` +## Operating modes + +The plugin follows HAMi's Ascend vNPU model: one plugin registration, per-pod mode +selection. Every device is registered in both forms and the scheduler picks the +form per pod based on the pod annotation `hami.io/amd-mode`: + +- absent or `rocm` (default): soft mode. The device is published as a CU-maskable + device (Count 10) and the scheduler allocates CU slices via the amd-hami-core + hook library (`HSA_CU_MASK`, `HIP_DEVICE_MEMORY_LIMIT`, `LD_AUDIT`). +- `spx`, `cpx`, `dpx` or `qpx`: hard partition mode. The same XCP compute + partition is published as a whole device (Count 1, ID `#`) + and the scheduler allocates it exclusively without a CU mask. The node must be + switched to the matching compute partition profile first, e.g.: + + ```bash + echo spx > /sys/class/drm/card0/device/current_compute_partition + echo nps1 > /sys/class/drm/card0/device/current_memory_partition + reboot # partition changes require a reset + ``` + + Physical Instinct parts expose XCP compute partitions and serve both modes, + discrete GPUs and AI MAX APUs (MI300A/MI350A) alike. Virtio Instinct devices + (SR-IOV VFs) and partition-less embedded APUs register no hard entries and + only serve rocm mode; `hami.io/amd-mode: spx` cannot be scheduled there. + +The register annotation (`hami.io/node-amd-register`) carries one entry per +form: soft entries have `Mode` empty, hard entries carry `Mode` equal to the +compute partition type. The scheduler branches on `Mode` exactly like HAMi +branches on the NVIDIA `MigMode` and the Ascend `huawei.com/vnpu-mode` values. +Allocated devices must be written back as the published `DeviceInfo.ID` +(`amd-smi` UUID for whole GPUs, `GPU-` or `#` for +partitions); the plugin resolves all of them. + +Whole-GPU devices whose KFD `unique_id` is 0 (embedded APUs without a PCI +Device Serial Number) cannot be addressed by `GPU-`; ROCr addresses +them by agent index and the plugin publishes that index as the ROCr-visible +id. Such nodes expose no XCP partitions and only serve rocm mode; parts with a +PCI Device Serial Number register by `GPU-` instead. + +### Partition profiles + +An Instinct GPU can be carved into compute partitions; which partitions exist +and how they split the silicon depends on the selected profile. MI355X-class +GPUs (8 XCCs) support four profiles, reported per GPU by +`amd-smi partition -g --json`: + +| profile | type | memory caps | partitions x XCC | +|---------|------------|-------------|-------------------| +| 0 | SPX (default) | NPS1 | 1 x 8 | +| 1 | DPX | NPS1,NPS2 | 2 x 4 | +| 2 | QPX | NPS1 | 4 x 2 | +| 3 | CPX | NPS1 | 8 x 1 | + +- `profile` is the `profile_index` passed to the AMD SMI setter + (`amdsmi_set_gpu_accelerator_partition_profile`). The amd-smi CLI marks the + current profile with `*` (SPX here). +- `partitions x XCC` is what the profile yields: e.g. QPX splits the GPU into + 4 partitions of 2 XCCs each. Every partition appears as an XCP device + (`/sys/devices/platform/amdgpu_xcp_*`) and is registered by the plugin as a + hard entry of that mode. +- `memory caps` lists the NPS modes the profile can run with (DPX also works + under NPS2; the others are NPS1-only on this part). + +Changing the profile requires the GPU to be idle (no workloads; see the +`amdsmi_set_gpu_*_partition` docs). Compute partition changes are per-GPU and +take effect live - the XCP devices appear without a reset. A memory partition +change requires an amdgpu driver reload, which resets the device nodes of +every GPU on the node: that is a node-wide quiet-window operation, not a +single-GPU one. + +Each XCP entry is published with an even share of the whole-GPU capacity: +VRAM and CU count divided by the number of XCP partitions of that GPU. Floor +division is used, so the advertised values under-commit rather than +over-commit. Soft entries keep the whole-GPU capacity; soft mode slices it +with CU masks. + +The plugin registers the partitions of the mode each GPU is currently in, and +advertises the available profiles per GPU (`partitionProfiles` in +DeviceInfo.CustomInfo of the register annotation) so schedulers can see which +modes a GPU can be switched to. + +### Profile storage + +Profile data is stored in this plugin's register annotation +(`hami.io/node-amd-register`), in the same shape HAMi's NVIDIA device plugin +uses for MIG profiles (that plugin lives in the Project-HAMi/HAMi scheduler +repository, not here). It queries NVML at registration and publishes per-GPU +MIG profile capacity as `migProfiles` inside each device entry of +`hami.io/node-nvidia-register`; the scheduler reads the annotation and never +queries hardware. This plugin does the same on the AMD side: it discovers the +profiles from AMD SMI at registration and publishes them per whole GPU under +`custominfo.partitionProfiles`, one entry per profile with `profile_index`, +partition type, memory caps, partition count and XCC per partition. + +Both MIG and AMD partition switching require an idle GPU. HAMi's NVIDIA +plugin start-up refuses to reset MIG-enabled GPUs that still have running +allocations, and the AMD SMI setter rejects the switch when workloads are +running. What differs is when switching happens and what it costs: + +- MIG: enablement is a one-time node-level operation at plugin start-up and + resets the GPU; afterwards instances are carved on demand from the fixed + NVML profile menu. +- AMD: a compute partition switch is per-GPU and live - the XCP devices + appear without a reset; a memory partition switch requires a node-wide + amdgpu driver reload. + +In both cases the stored profiles are a static menu of what the silicon can +do. The annotation carries the current mode (the device entries themselves, +with their `Mode` and `partitionProfile` fields) alongside the modes the GPU +can be switched to (`custominfo.partitionProfiles`). Allocation state stays +in the pod annotations, as XCP device IDs for hard partitions and +`hami.io/amd-cu-allocated` CU ranges in soft mode. + +### Memory partitions are not an allocation mechanism + +Memory partitions (NPS1/NPS2/NPS4/NPS8) are a NUMA-domain knob: they control +how the GPU's memory is interleaved across NUMA nodes at the system level, +not which pods get which bytes. They are fixed at boot (BIOS/PSP) and +changing them requires an amdgpu driver reload that resets the device nodes +of every GPU on the node. + +HAMi does not read or change the memory partition. Per-pod memory limits are +enforced in software (`HIP_DEVICE_MEMORY_LIMIT` and the `libamvgpu.so` +hook), so the NPS mode has no effect on what the scheduler can allocate. +The allocation-relevant memory number is the per-XCP slice described above, +derived at plugin start from the whole-GPU capacity and the current +partition count. + +Using memory partitions for scheduling would only make sense if workloads +needed OS-level NUMA locality per partition (NPS2 halves the NUMA node +size). For HAMi's slicing model that benefit is rarely worth the cost - a +boot-time setting and a node-wide driver reload to change - so the plugin +treats NPS as a fixed node property. + ## Memory-isolation compatibility CU isolation and device visibility use ROCr interfaces and are independent of the workload image's libc. Fractional-memory enforcement is different: it depends on loading `/usr/local/vgpu/libamvgpu.so` through glibc `LD_AUDIT`. diff --git a/cmd/k8s-device-plugin/main.go b/cmd/k8s-device-plugin/main.go index a45eef1a..7f400528 100644 --- a/cmd/k8s-device-plugin/main.go +++ b/cmd/k8s-device-plugin/main.go @@ -76,9 +76,12 @@ func getResourceList(resourceNamingStrategy ResourceNamingStrategy) ([]string, e } } } else { - // Heterogeneous node reports resources based on partition types if strategy is mixed. Heterogeneous is not allowed if Strategy is single + // Heterogeneous node reports resources based on partition types if strategy is mixed. With the single + // strategy the kubelet list still carries every device, so mixed styles (e.g. one busy GPU stuck in spx + // while the rest flipped to qpx) must not abort the plugin; the devices register under "gpu" as-is. if resourceNamingStrategy == StrategySingle { - return resources, fmt.Errorf("Partitions of different styles across GPUs in a node is not supported with single strategy. Please start device plugin with mixed strategy") + glog.Warningf("Partitions of different styles across GPUs in a node; reporting all devices under %q", "gpu") + resources = []string{"gpu"} } else if resourceNamingStrategy == StrategyMixed { for partitionType, count := range partitionCountMap { if count > 0 { diff --git a/docs/user-guide/configuration.md b/docs/user-guide/configuration.md index d7aace5f..6f00f922 100644 --- a/docs/user-guide/configuration.md +++ b/docs/user-guide/configuration.md @@ -9,6 +9,35 @@ The device plugin can be configured using the following environment variables: | Environment Variable | Type | Default | Description | |-----|------|---------|-------------| | `AMD_GPU_DEVICE_COUNT` | Integer | Auto-detected | Number of AMD GPUs available on the node | +| `OPERATING_MODE` | String | `cu` | Registration mode: `cu` (soft whole-GPU + CU slices) or `partition` (hard compute partitions). Overridable per node via the `hami.io/amd-operating-mode` node annotation. | + +## Operating Modes + +The plugin registers AMD GPUs in one of two modes: + +- **cu mode (default)**: each whole GPU registers as a soft device (default + split count, `Mode` empty) and is sliced by CU and memory. This is the + historical HAMi behavior. +- **partition mode**: devices register as hard compute partitions with a + `#` suffix (`GPU-xxx#spx`, `GPU-xxx#qpx`), `Mode` set to the + partition type and `Count: 1`. The kubelet-facing device list publishes + only the hard entries (no soft splits). Whole GPUs with more than one + partition (dpx/qpx/cpx) are replaced by their `amdgpu_xcp_*` partitions; + single-partition (spx) whole GPUs register as one hard device. + +Mode resolution, lowest to highest precedence: + +1. Default `cu` when nothing is set. +2. `OPERATING_MODE` environment variable (chart value `dp.operatingMode`). +3. The `hami.io/amd-operating-mode` node annotation, which overrides the env + per node (the NVIDIA `nvidia.com/mig.config` pattern). + +The annotation is read once at plugin start; changing it requires a plugin +pod restart. The plugin logs the resolved mode as `operating mode: `. + +Partition counts are per GPU: `amd-smi set -g --compute-partition qpx` +flips a single GPU; mix spx and qpx GPUs on one node. See +[MI355X Partitioning](mi355x-partitioning.md) for kernel caveats. ### Why Limit GPU Exposure? diff --git a/docs/user-guide/mi355x-partitioning.md b/docs/user-guide/mi355x-partitioning.md new file mode 100644 index 00000000..42b7b449 --- /dev/null +++ b/docs/user-guide/mi355x-partitioning.md @@ -0,0 +1,73 @@ +# MI355X (gfx950) Partitioning + +The MI355X splits into hardware compute partitions with `amd-smi set`: + +| Profile | Partitions per GPU | CUs per partition | Mode suffix | +|---------|--------------------|-------------------|-------------| +| spx | 1 | 256 | `#spx` | +| dpx | 2 | 128 | `#dpx` | +| qpx | 4 | 64 | `#qpx` | +| cpx | 8 | 32 | `#cpx` | + +Each GPU has 256 CUs and 294896 MiB of VRAM (288 GB). Partition mode +requires the plugin's `partition` operating mode; see +[Configuration](configuration.md#operating-modes). + +## Registration by kernel + +Whether the plugin registers whole GPUs or `amdgpu_xcp_*` partitions depends +on the kernel's KFD topology, not on the plugin: + +- **Kernels whose KFD topology exposes XCP render minors** (the platform + devices under `/sys/devices/platform/amdgpu_xcp_*` have `renderD` minors + listed in `/sys/class/kfd/kfd/topology/nodes`): each partition registers + as a hard `#` device with an even share of VRAM and CUs (qpx: 4 + devices of 73728 MiB and 64 CUs per GPU). This is the full XCP path. +- **Kernels without XCP render minors in KFD topology** (observed on + kernel 6.8.0-136 in spx mode): the plugin's KFD-validity gates drop every + `amdgpu_xcp_*` entry. Only the 8 whole-GPU nodes register. Note that the + KFD topology changes after a hardware partition flip: on 6.8.0-136, after + the plugin flips a GPU to qpx, the XGMI reset re-probes KFD and 3 of the 4 + partition nodes per GPU appear (21 XCP entries for 7 qpx GPUs, verified + live). The missing 4th node is dropped by the same render-minor gate. + Additionally, the partitions of one GPU share a single ROCr unique_id on + this kernel, so the scheduler sees 3 devices with one ID and can only + allocate one partition per GPU safely; distinct per-partition unique_ids + need a kernel/driver that reports them. + +## Known kernel caveat: 6.8.0-136 + +> On 6.8.0-136 the KFD topology lacks XCP render minors, so QPX/DPX nodes +> register one hard whole-GPU `#qpx` entry per GPU (full 256 CU / 294896 MiB +> capacity), not 4 XCP partitions. The registration and capacity math are +> ready for XCPs on a kernel that exposes them; until then a QPX pod +> requesting 64 cores / 73728 MiB still pins one GPU and gets memory- and +> CU-limited correctly. + +The capacity divisor for XCP entries comes from the AMD SMI partition +profile's `NumPartitions` for the current compute type, not from counting +`amdgpu_xcp_*` children (gfx950 exposes 7 XCD chiplets per GPU regardless of +partition mode, so child counts are wrong divisors). + +## Verifying on a node + +```bash +# KFD topology node count and simd counts; XCP partitions appear as nodes +# with simd_count 256 (qpx) and a render node in the same topology. +cat /sys/class/kfd/kfd/topology/nodes/*/properties | grep -E "simd_count|gfx_target_version" + +# Platform partition devices and their render minors: +ls /sys/devices/platform/amdgpu_xcp_*/drm/ + +# Current compute partition per GPU: +amd-smi static -g 0 | grep "Compute Part" + +# Flip one GPU to qpx (per GPU, not per node): +amd-smi set -g 0 --compute-partition qpx +``` + +After a plugin restart, the node annotation +`hami.io/node-amd-register` shows the registered devices: soft entries +(`Count: 10`, empty `Mode`) in cu mode, hard entries (`Count: 1`, `Mode: +qpx`, `#qpx` suffix) in partition mode. The plugin log reports +`operating mode: ` and `ListAndWatch: sending N split devices`. diff --git a/example/vllm-qpx-serve/README.md b/example/vllm-qpx-serve/README.md new file mode 100644 index 00000000..acee0009 --- /dev/null +++ b/example/vllm-qpx-serve/README.md @@ -0,0 +1,52 @@ +# vLLM serving on QPX hard partitions (MI355X) + +QPX splits each MI355X GPU into 4 compute partitions of 64 CUs and +73728 MiB (288 GB / 4). Pods request a whole partition by asking for +the full per-partition memory and core count: + +- `amd.com/gpu: 1` (one partition) +- `amd.com/gpumem: 73728` (MiB, one QPX partition) +- `amd.com/gpucores: 64` (CUs, one QPX partition) + +## Prerequisites + +1. Device plugin in `partition` mode with QPX as the target partition. + The plugin flips the GPUs itself through the AMD SMI API at startup; + no manual `amd-smi set` on the node is needed. Either set the chart + values (`dp.operatingMode: partition`, `dp.computePartition: qpx`), + or per node: + + ``` + kubectl annotate node hami.io/amd-operating-mode=partition + kubectl annotate node hami.io/amd-compute-partition=qpx + kubectl delete pod -n kube-system -l ... # restart the device-plugin pod + ``` + + The annotations override the chart values on that node (the NVIDIA + `nvidia.com/mig.config`-style per-node switch). GPUs with running + workloads fail to flip and keep their current mode; the plugin logs + each per-GPU result and registers whatever mode the hardware is in. + +2. HAMi scheduler device config with the `amd` section (see + device-config.yaml). On kernels whose KFD topology does not expose + amdgpu_xcp_ nodes (e.g. 6.8.0-136), each GPU registers one hard + `#qpx` device instead of 4 XCP partitions; requesting a full + partition still pins one GPU and limits memory and CUs correctly. + +## Deploy + +``` +kubectl apply -f hf_token.yaml +kubectl apply -f deployment.yaml +kubectl apply -f service.yaml +``` + +## Test + +``` +kubectl get svc +curl http://:80/v1/models +curl http://:80/v1/completions \ + -H "Content-Type: application/json" \ + -d '{"model": "mistralai/Mistral-7B-v0.3", "prompt": "San Francisco is a", "max_tokens": 7, "temperature": 0}' +``` diff --git a/example/vllm-qpx-serve/deployment.yaml b/example/vllm-qpx-serve/deployment.yaml new file mode 100644 index 00000000..8ae45390 --- /dev/null +++ b/example/vllm-qpx-serve/deployment.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mistral-7b + namespace: default + labels: + app: mistral-7b +spec: + replicas: 1 + selector: + matchLabels: + app: mistral-7b + template: + metadata: + labels: + app: mistral-7b + spec: + volumes: + # vLLM needs to access the host's shared memory for tensor parallel inference. + - name: shm + emptyDir: + medium: Memory + sizeLimit: "8Gi" + hostNetwork: true + hostIPC: true + containers: + - name: mistral-7b + image: rocm/vllm:rocm6.2_mi300_ubuntu20.04_py3.9_vllm_0.6.4 + securityContext: + seccompProfile: + type: Unconfined + runAsGroup: 44 + capabilities: + add: + - SYS_PTRACE + command: ["/bin/sh", "-c"] + args: [ + "vllm serve mistralai/Mistral-7B-v0.3 --port 8888 --trust-remote-code --enable-chunked-prefill --max_num_batched_tokens 1024" + ] + env: + - name: HUGGING_FACE_HUB_TOKEN + valueFrom: + secretKeyRef: + name: hf-token-secret + key: token + ports: + - containerPort: 8888 + resources: + limits: + cpu: "10" + memory: 20G + amd.com/gpu: "1" + amd.com/gpumem: "73728" + amd.com/gpucores: "64" + requests: + cpu: "6" + memory: 6G + amd.com/gpu: "1" + amd.com/gpumem: "73728" + amd.com/gpucores: "64" + volumeMounts: + - name: shm + mountPath: /dev/shm diff --git a/example/vllm-qpx-serve/device-config.yaml b/example/vllm-qpx-serve/device-config.yaml new file mode 100644 index 00000000..b08d49e9 --- /dev/null +++ b/example/vllm-qpx-serve/device-config.yaml @@ -0,0 +1,27 @@ +# HAMi scheduler device config for QPX mode. +# +# Merge the `amd` block below into the `device-config.yaml` data of the +# kube-system/hami-scheduler-device ConfigMap that the hami chart renders, +# or point the chart at this file, then let the checksummed scheduler +# rollout pick it up: +# +# kubectl edit cm -n kube-system hami-scheduler-device +# # or: kubectl create configmap hami-scheduler-device --from-file=... +# +# The scheduler reads /device-config.yaml from this ConfigMap; changing it +# rolls the hami-scheduler Deployment. +apiVersion: v1 +kind: ConfigMap +metadata: + name: hami-scheduler-device + namespace: kube-system +data: + device-config.yaml: | + version: v1 + amd: + resourceCountName: "amd.com/gpu" + resourceMemoryName: "amd.com/gpumem" + resourceCoreName: "amd.com/gpucores" + deviceSplitCount: 1 + defaultCores: 0 + defaultMemory: 0 diff --git a/example/vllm-qpx-serve/hf_token.yaml b/example/vllm-qpx-serve/hf_token.yaml new file mode 100644 index 00000000..2549ddc0 --- /dev/null +++ b/example/vllm-qpx-serve/hf_token.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: hf-token-secret + namespace: default +type: Opaque +data: + token: "" diff --git a/example/vllm-qpx-serve/service.yaml b/example/vllm-qpx-serve/service.yaml new file mode 100644 index 00000000..36bf15f3 --- /dev/null +++ b/example/vllm-qpx-serve/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: mistral-7b + namespace: default +spec: + ports: + - name: http-mistral-7b + port: 80 + protocol: TCP + targetPort: 8888 + selector: + app: mistral-7b + sessionAffinity: None + type: ClusterIP diff --git a/helm/amd-gpu/templates/deviceplugin-daemonset.yaml b/helm/amd-gpu/templates/deviceplugin-daemonset.yaml index 749577e0..54edd683 100644 --- a/helm/amd-gpu/templates/deviceplugin-daemonset.yaml +++ b/helm/amd-gpu/templates/deviceplugin-daemonset.yaml @@ -53,6 +53,10 @@ spec: fieldPath: spec.nodeName - name: HOST_HOOK_PATH value: {{ .Values.dp.hostHookPath | quote }} + - name: OPERATING_MODE + value: {{ .Values.dp.operatingMode | quote }} + - name: COMPUTE_PARTITION + value: {{ .Values.dp.computePartition | quote }} securityContext: {{- toYaml .Values.dp.securityContext | nindent 12 }} volumeMounts: diff --git a/helm/amd-gpu/values.yaml b/helm/amd-gpu/values.yaml index 737bf2b1..fc73ef79 100644 --- a/helm/amd-gpu/values.yaml +++ b/helm/amd-gpu/values.yaml @@ -1,17 +1,26 @@ dp: image: - repository: ghcr.io/project-hami/amd-device-plugin + repository: ghcr.io/fishman/amd-device-plugin # Overrides the image tag whose default is the chart appVersion. - tag: "0.0.1" + tag: "0.0.17" pullPolicy: IfNotPresent serviceAccount: create: true name: "" annotations: {} # The plugin queries host GPU devices and passes them to workloads. + # "cu" registers whole GPUs as soft devices sliced by CU (default); + # "partition" registers hard compute partitions (id#mode, Count 1). + # A node annotation hami.io/amd-operating-mode: cu|partition overrides + # this per node. + operatingMode: "cu" + # Target compute partition type (spx/dpx/qpx/cpx) the plugin applies to + # every GPU via the AMD SMI API at startup, only when operatingMode is + # "partition". Empty leaves the hardware mode untouched. A node annotation + # hami.io/amd-compute-partition overrides this per node. + computePartition: "" securityContext: privileged: true - allowPrivilegeEscalation: false capabilities: drop: - ALL @@ -31,7 +40,8 @@ dp: rollingUpdate: maxUnavailable: 1 -imagePullSecrets: [] +imagePullSecrets: + - name: ghcr-fishman tolerations: - key: CriticalAddonsOnly diff --git a/internal/pkg/allocator/besteffort_policy.go b/internal/pkg/allocator/besteffort_policy.go index 38828659..685d945b 100644 --- a/internal/pkg/allocator/besteffort_policy.go +++ b/internal/pkg/allocator/besteffort_policy.go @@ -61,7 +61,12 @@ func NewBestEffortPolicy() *BestEffortPolicy { func (b *BestEffortPolicy) getDevicesFromIds(ids []string) []*Device { var res []*Device for _, id := range ids { - res = append(res, b.devicesMap[id]) + d, ok := b.devicesMap[id] + if !ok { + glog.Warningf("GPA policy: device id %q is not registered by this plugin; a second device plugin is likely running on this node and kubelet merged its devices. Disable the other plugin (or drain the node) and restart this plugin", id) + continue + } + res = append(res, d) } return res } diff --git a/internal/pkg/amdgpu/amdgpu.go b/internal/pkg/amdgpu/amdgpu.go index e7e9028f..55be9fcf 100644 --- a/internal/pkg/amdgpu/amdgpu.go +++ b/internal/pkg/amdgpu/amdgpu.go @@ -72,6 +72,7 @@ import ( "os" "path/filepath" "regexp" + "sort" "strconv" "strings" @@ -144,6 +145,16 @@ type DeviceCapacity struct { CUCount int32 } +// PartitionCapacity divides whole-GPU capacity across a GPU's XCP partitions. +// Floor division under-advertises rather than over-committing. +func PartitionCapacity(whole DeviceCapacity, partitions int) DeviceCapacity { + if partitions > 1 { + whole.VRAMMiB /= int32(partitions) + whole.CUCount /= int32(partitions) + } + return whole +} + // GetDeviceCapacity reads VRAM and active CU count through libdrm_amdgpu for // one DRM card. It intentionally avoids node-scoped labels so heterogeneous // nodes and SR-IOV virtual functions retain per-device values. @@ -215,19 +226,24 @@ func GetDevIdsFromTopology(topoRootParam ...string) map[int]string { } // GetAMDGPUs return a map of AMD GPU on a node identified by the part of the pci address -func GetAMDGPUs() map[string]map[string]interface{} { - if _, err := os.Stat("/sys/module/amdgpu/drivers/"); err != nil { +func GetAMDGPUs(sysfsRoot ...string) map[string]map[string]interface{} { + root := "/sys" + if len(sysfsRoot) == 1 { + root = sysfsRoot[0] + } + + if _, err := os.Stat(filepath.Join(root, "module/amdgpu/drivers/")); err != nil { glog.Fatalf("amdgpu driver unavailable. exiting with exit code 2. error: %s", err) } //ex: /sys/module/amdgpu/drivers/pci:amdgpu/0000:19:00.0 - matches, _ := filepath.Glob("/sys/module/amdgpu/drivers/pci:amdgpu/[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]:*") + matches, _ := filepath.Glob(filepath.Join(root, "module/amdgpu/drivers/pci:amdgpu/[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]:*")) devID := "" devices := make(map[string]map[string]interface{}) card, renderD, nodeId := 0, 128, 0 - renderDevIds := GetDevIdsFromTopology() - renderNodeIds := GetNodeIdsFromTopology() + renderDevIds := GetDevIdsFromTopology(filepath.Join(root, "class/kfd/kfd")) + renderNodeIds := GetNodeIdsFromTopology(filepath.Join(root, "class/kfd/kfd")) for _, path := range matches { computePartitionFile := filepath.Join(path, "current_compute_partition") @@ -287,7 +303,7 @@ func GetAMDGPUs() map[string]map[string]interface{} { // certain products have additional devices (such as MI300's partitions) //ex: /sys/devices/platform/amdgpu_xcp_30 - platformMatches, _ := filepath.Glob("/sys/devices/platform/amdgpu_xcp_*") + platformMatches, _ := filepath.Glob(filepath.Join(root, "devices/platform/amdgpu_xcp_*")) for _, path := range platformMatches { glog.Info(path) @@ -594,6 +610,51 @@ func GetROCrUUIDsFromTopology(topoRootParam ...string) map[int]string { return uuids } +// GetROCrIndexesFromTopology returns the ROCr agent index of every KFD GPU +// node with unique_id 0, which ROCr addresses by index instead of GPU-. +func GetROCrIndexesFromTopology(topoRootParam ...string) map[int]int { + topoRoot := "/sys/class/kfd/kfd" + if len(topoRootParam) == 1 { + topoRoot = topoRootParam[0] + } + + type nodeInfo struct { + num int + renderD int + uniqueID uint64 + } + var nodes []nodeInfo + paths, err := filepath.Glob(topoRoot + "/topology/nodes/*/properties") + if err != nil { + glog.Errorf("glob KFD topology nodes: %v", err) + return nil + } + for _, p := range paths { + num, err := strconv.Atoi(filepath.Base(filepath.Dir(p))) + if err != nil { + continue + } + renderMinor, err := ParseTopologyProperties(p, topoDrmRenderMinorRe) + if err != nil || renderMinor <= 0 { + continue + } + uniqueID, err := parseTopologyUniqueID(p) + if err != nil { + continue + } + nodes = append(nodes, nodeInfo{num: num, renderD: int(renderMinor), uniqueID: uniqueID}) + } + sort.Slice(nodes, func(i, j int) bool { return nodes[i].num < nodes[j].num }) + + indexes := make(map[int]int) + for i, n := range nodes { + if n.uniqueID == 0 { + indexes[n.renderD] = i + } + } + return indexes +} + func parseTopologyUniqueID(path string) (uint64, error) { f, err := os.Open(path) if err != nil { diff --git a/internal/pkg/amdgpu/amdgpu_test.go b/internal/pkg/amdgpu/amdgpu_test.go index 641d3624..6ccf8a3e 100644 --- a/internal/pkg/amdgpu/amdgpu_test.go +++ b/internal/pkg/amdgpu/amdgpu_test.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "os" "path/filepath" "reflect" "regexp" @@ -54,7 +55,9 @@ func TestFirmwareVersionConsistent(t *testing.T) { parseDebugFSFirmwareInfo("/sys/kernel/debug/dri/" + card[4:] + "/amdgpu_firmware_info") featVersion, fwVersion, err := GetFirmwareVersions(card) if err != nil { - t.Errorf("Fail to get firmware version %s", err.Error()) + // Device exists but the DRM node is not usable (e.g. accel not + // working on handheld/APU kernels); nothing to compare. + t.Skipf("Skipping, DRM device %s not usable: %s", card, err.Error()) } for k := range featVersion { @@ -275,3 +278,135 @@ func TestROCrUUIDsFromTopology(t *testing.T) { t.Errorf("ROCr UUIDs = %#v, want %#v", got, want) } } + +func writeTopologyProperties(t *testing.T, root string, node int, renderMinor, uniqueID uint64) { + t.Helper() + dir := filepath.Join(root, "topology", "nodes", fmt.Sprintf("%d", node)) + if err := os.MkdirAll(dir, 0o755); err != nil { + t.Fatal(err) + } + content := fmt.Sprintf("simd_count 24\ndrm_render_minor %d\nunique_id %d\n", renderMinor, uniqueID) + if err := os.WriteFile(filepath.Join(dir, "properties"), []byte(content), 0o644); err != nil { + t.Fatal(err) + } +} + +// mi355xSysfs is the captured sysfs tree of an 8x MI355X node in SPX/NPS1 on +// kernel 6.8.0-136 (testdata/sysfs-mi355x-spx/README.md). +const mi355xSysfs = "../../../testdata/sysfs-mi355x-spx/sys" +const mi355xKFD = mi355xSysfs + "/class/kfd/kfd" + +func TestGetAMDGPUsFromFixture(t *testing.T) { + devices := GetAMDGPUs(mi355xSysfs) + + want := map[string]struct { + card, renderD, nodeId, numaNode int + devID string + }{ + "0000:75:00.0": {card: 1, renderD: 128, nodeId: 8, numaNode: 0, devID: "0000:75:00:0"}, + "0000:05:00.0": {card: 9, renderD: 136, nodeId: 9, numaNode: 1, devID: "0000:05:00:0"}, + "0000:65:00.0": {card: 17, renderD: 144, nodeId: 10, numaNode: 3, devID: "0000:65:00:0"}, + "0000:15:00.0": {card: 25, renderD: 152, nodeId: 11, numaNode: 2, devID: "0000:15:00:0"}, + "0000:f5:00.0": {card: 33, renderD: 160, nodeId: 12, numaNode: 4, devID: "0000:f5:00:0"}, + "0000:85:00.0": {card: 41, renderD: 168, nodeId: 13, numaNode: 5, devID: "0000:85:00:0"}, + "0000:e5:00.0": {card: 49, renderD: 176, nodeId: 14, numaNode: 7, devID: "0000:e5:00:0"}, + "0000:95:00.0": {card: 57, renderD: 184, nodeId: 15, numaNode: 6, devID: "0000:95:00:0"}, + } + if len(devices) != len(want) { + t.Fatalf("GetAMDGPUs returned %d devices, want %d: %v", len(devices), len(want), devices) + } + for bdf, exp := range want { + dev, ok := devices[bdf] + if !ok { + t.Errorf("missing device %s", bdf) + continue + } + if dev["card"] != exp.card || dev["renderD"] != exp.renderD || dev["nodeId"] != exp.nodeId || dev["numaNode"] != exp.numaNode { + t.Errorf("%s: got card=%v renderD=%v nodeId=%v numaNode=%v, want card=%d renderD=%d nodeId=%d numaNode=%d", + bdf, dev["card"], dev["renderD"], dev["nodeId"], dev["numaNode"], exp.card, exp.renderD, exp.nodeId, exp.numaNode) + } + if dev["devID"] != exp.devID { + t.Errorf("%s: devID=%v, want %s", bdf, dev["devID"], exp.devID) + } + if dev["computePartitionType"] != "spx" || dev["memoryPartitionType"] != "nps1" { + t.Errorf("%s: partition=%v/%v, want spx/nps1", bdf, dev["computePartitionType"], dev["memoryPartitionType"]) + } + } + for key := range devices { + if strings.HasPrefix(key, "amdgpu_xcp_") { + t.Errorf("unexpected XCP entry %s: this kernel does not publish XCP render minors in KFD topology", key) + } + } +} + +func TestGetDevIdsFromTopologyMI355X(t *testing.T) { + got := GetDevIdsFromTopology(mi355xKFD) + want := map[int]string{ + 128: "0000:75:00:0", 136: "0000:05:00:0", 144: "0000:65:00:0", 152: "0000:15:00:0", + 160: "0000:f5:00:0", 168: "0000:85:00:0", 176: "0000:e5:00:0", 184: "0000:95:00:0", + } + if !reflect.DeepEqual(got, want) { + t.Errorf("renderDevIds = %#v, want %#v", got, want) + } +} + +func TestGetROCrUUIDsFromTopologyMI355X(t *testing.T) { + got := GetROCrUUIDsFromTopology(mi355xKFD) + want := map[int]string{ + 128: "GPU-08da82c12ef81b5d", + 136: "GPU-c62ac130ee448403", + 144: "GPU-8aa2810481bf6315", + 152: "GPU-f32cb37ceef6feb5", + 160: "GPU-e88fa10fb8782ebc", + 168: "GPU-cf10e0d8795d487e", + 176: "GPU-6402daab8ae76e4e", + 184: "GPU-1303b4d1d1d0c537", + } + if !reflect.DeepEqual(got, want) { + t.Errorf("ROCr UUIDs = %#v, want %#v", got, want) + } +} + +func TestGetROCrIndexesFromTopology(t *testing.T) { + root := t.TempDir() + // node 0 is the CPU (no renderD), node 1 is an APU with unique_id 0, + // node 2 is a discrete GPU with a real unique_id. + writeTopologyProperties(t, root, 0, 0, 0) + writeTopologyProperties(t, root, 1, 128, 0) + writeTopologyProperties(t, root, 2, 129, 5) + + got := GetROCrIndexesFromTopology(root) + if idx, ok := got[128]; !ok || idx != 0 { + t.Errorf("index for renderD128 = %d, %v; want 0, true", idx, ok) + } + if _, ok := got[129]; ok { + t.Error("renderD129 has a real unique_id and must not get an index fallback") + } +} + +func TestPartitionCapacity(t *testing.T) { + // MI355X whole-GPU values: 294896 MB VRAM (amdsmi-static fixture) and + // 304 CUs (8 XCCs x 38). + whole := DeviceCapacity{VRAMMiB: 287984, CUCount: 304} + + tests := []struct { + name string + partitions int + wantVRAMMiB int32 + wantCUCount int32 + }{ + {"SPX", 1, 287984, 304}, + {"DPX", 2, 143992, 152}, + {"QPX", 4, 71996, 76}, + {"CPX", 8, 35998, 38}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := PartitionCapacity(whole, tt.partitions) + if got.VRAMMiB != tt.wantVRAMMiB || got.CUCount != tt.wantCUCount { + t.Errorf("PartitionCapacity(%d) = %d MiB, %d CUs; want %d MiB, %d CUs", + tt.partitions, got.VRAMMiB, got.CUCount, tt.wantVRAMMiB, tt.wantCUCount) + } + }) + } +} diff --git a/internal/pkg/amdgpu/amdsmi.go b/internal/pkg/amdgpu/amdsmi.go index 55f9f47d..c5d80e68 100644 --- a/internal/pkg/amdgpu/amdsmi.go +++ b/internal/pkg/amdgpu/amdsmi.go @@ -58,6 +58,80 @@ static amdsmi_status_t amdsmi_product_name_for_bdf(const char *bdf_text, snprintf(market_name, AMDSMI_MAX_STRING_LENGTH, "%s", asic_info.market_name); return AMDSMI_STATUS_SUCCESS; } + +static amdsmi_status_t amdsmi_set_partition_for_bdf(const char *bdf_text, + unsigned int profile_index) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_set_gpu_accelerator_partition_profile(processor, profile_index); +} + +static amdsmi_status_t amdsmi_partition_profiles_for_bdf( + const char *bdf_text, amdsmi_accelerator_partition_profile_config_t *config) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_get_gpu_accelerator_partition_profile_config(processor, config); +} + +static uint32_t amdsmi_nps_cap_mask(amdsmi_nps_caps_t caps) { + return caps.nps_cap_mask; +} + +static amdsmi_status_t amdsmi_memory_partition_for_bdf(const char *bdf_text, + char *memory_partition) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_get_gpu_memory_partition(processor, memory_partition, + AMDSMI_MAX_STRING_LENGTH); +} */ import "C" @@ -70,10 +144,64 @@ import ( var amdSMIMu sync.Mutex -// GetAMDSMIUUIDs resolves AMD SMI UUIDs by PCI BDF. AMD SMI initialization is -// process-global, so calls are serialized and always balanced with shut_down. -// An individual BDF failure does not discard UUIDs obtained for other devices. +// amdSMICache serves AMD SMI lookups that are static per card layout (device +// UUID, product name, partition profiles): the first call fetches and stores +// them, later calls serve the cache and only fetch BDFs never seen before +// (e.g. a GPU hotplugged after boot). The current memory partition is NOT +// cached: it changes with the partition configuration. +type amdSMICache[T any] struct { + mu sync.Mutex + data map[string]T + fetcher func([]string) (map[string]T, error) +} + +func newAMDSCache[T any](fetcher func([]string) (map[string]T, error)) *amdSMICache[T] { + return &amdSMICache[T]{data: make(map[string]T), fetcher: fetcher} +} + +func (c *amdSMICache[T]) Get(bdfs []string) (map[string]T, error) { + c.mu.Lock() + defer c.mu.Unlock() + missing := make([]string, 0, len(bdfs)) + for _, bdf := range bdfs { + if _, ok := c.data[bdf]; !ok { + missing = append(missing, bdf) + } + } + if len(missing) > 0 { + fresh, err := c.fetcher(missing) + for k, v := range fresh { + c.data[k] = v + } + if err != nil { + // Keep what succeeded; retry the failures on the next call. + return c.data, err + } + } + out := make(map[string]T, len(bdfs)) + for _, bdf := range bdfs { + if v, ok := c.data[bdf]; ok { + out[bdf] = v + } + } + return out, nil +} + +var ( + amdSMICUUIDs = newAMDSCache(fetchAMDSUUIDs) + amdSMIProduct = newAMDSCache(fetchAMDSMIProductNames) + amdSMIPartitions = newAMDSCache(fetchAMDGPUPartitionProfiles) +) + +// GetAMDSMIUUIDs resolves AMD SMI UUIDs by PCI BDF, cached after the first +// call. AMD SMI initialization is process-global, so calls are serialized and +// always balanced with shut_down. An individual BDF failure does not discard +// UUIDs obtained for other devices. func GetAMDSMIUUIDs(bdfs []string) (map[string]string, error) { + return amdSMICUUIDs.Get(bdfs) +} + +func fetchAMDSUUIDs(bdfs []string) (map[string]string, error) { amdSMIMu.Lock() defer amdSMIMu.Unlock() @@ -112,9 +240,14 @@ func GetAMDSMIUUIDs(bdfs []string) (map[string]string, error) { return uuidByBDF, nil } -// GetAMDSMIProductNames resolves the AMD SMI ASIC market_name by PCI BDF. -// This is the user-facing product name reported in DeviceInfo.Type. +// GetAMDSMIProductNames resolves the AMD SMI ASIC market_name by PCI BDF, +// cached after the first call. This is the user-facing product name reported +// in DeviceInfo.Type. func GetAMDSMIProductNames(bdfs []string) (map[string]string, error) { + return amdSMIProduct.Get(bdfs) +} + +func fetchAMDSMIProductNames(bdfs []string) (map[string]string, error) { amdSMIMu.Lock() defer amdSMIMu.Unlock() @@ -150,6 +283,217 @@ func GetAMDSMIProductNames(bdfs []string) (map[string]string, error) { return namesByBDF, nil } +// GetAMDSCurrentMemoryPartitions resolves the current memory partition (NPS1, +// NPS2, ...) by PCI BDF through the AMD SMI C API, lowercased for the +// sysfs spelling used in topology device data. +func GetAMDSCurrentMemoryPartitions(bdfs []string) (map[string]string, error) { + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + partitionByBDF := make(map[string]string, len(bdfs)) + var failures []string + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" { + continue + } + cBDF := C.CString(bdf) + var partition [C.AMDSMI_MAX_STRING_LENGTH]C.char + status := C.amdsmi_memory_partition_for_bdf(cBDF, &partition[0]) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + continue + } + if value := strings.ToLower(strings.TrimSpace(C.GoString(&partition[0]))); value != "" { + partitionByBDF[bdf] = value + partitionByBDF[rawBDF] = value + } + } + if len(failures) > 0 { + return partitionByBDF, fmt.Errorf("AMD SMI memory-partition lookup failed for %s", strings.Join(failures, ", ")) + } + return partitionByBDF, nil +} + +// PartitionProfile describes one accelerator partition profile a GPU can be +// set to: the profile_index passed to amdsmi_set_gpu_accelerator_partition_profile, +// the partition type, the memory partition modes it supports and the resulting +// partition geometry. +type PartitionProfile struct { + ProfileIndex int + Type string + MemoryCaps string + NumPartitions int + XCCPerPartition int +} + +// GetAMDGPUPartitionProfiles resolves the accelerator partition profiles each +// GPU supports (SPX/DPX/QPX/CPX with partition counts), keyed by BDF. The +// profile list is static per card, so it is cached after the first call. +func GetAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, error) { + return amdSMIPartitions.Get(bdfs) +} + +func fetchAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, error) { + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + profilesByBDF := make(map[string][]PartitionProfile, len(bdfs)) + var failures []string + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" { + continue + } + profiles, err := partitionProfilesForBDF(bdf) + if err != nil { + failures = append(failures, fmt.Sprintf("%s (%v)", bdf, err)) + continue + } + profilesByBDF[bdf] = profiles + profilesByBDF[rawBDF] = profiles + } + if len(failures) > 0 { + return profilesByBDF, fmt.Errorf("AMD SMI partition-profile lookup failed for %s", strings.Join(failures, ", ")) + } + return profilesByBDF, nil +} + +// partitionProfilesForBDF resolves the accelerator partition profiles for a +// single BDF. The caller holds amdSMIMu. +func partitionProfilesForBDF(bdf string) ([]PartitionProfile, error) { + cBDF := C.CString(bdf) + var config C.amdsmi_accelerator_partition_profile_config_t + status := C.amdsmi_partition_profiles_for_bdf(cBDF, &config) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("partition-profile lookup failed (status %d)", status) + } + profiles := make([]PartitionProfile, 0, int(config.num_profiles)) + for i := 0; i < int(config.num_profiles); i++ { + profile := config.profiles[i] + profiles = append(profiles, PartitionProfile{ + ProfileIndex: int(profile.profile_index), + Type: acceleratorPartitionTypeString(profile.profile_type), + MemoryCaps: npsCapsString(C.amdsmi_nps_cap_mask(profile.memory_caps)), + NumPartitions: int(profile.num_partitions), + XCCPerPartition: xccPerPartition(config, profile.profile_index), + }) + } + return profiles, nil +} + +// SetGPUComputePartitions flips every GPU to the given compute partition +// type (spx/dpx/qpx/cpx) through the AMD SMI C API. The profile index comes +// from the accelerator partition profiles each GPU supports. A GPU with +// running processes fails (busy) and is reported per BDF; the rest still +// flip. GPUs already in the target mode are left untouched. +func SetGPUComputePartitions(bdfs []string, computeType string) error { + if len(bdfs) == 0 { + return nil + } + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + var failures []string + seen := make(map[string]bool) + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" || seen[bdf] { + continue + } + seen[bdf] = true + profiles, err := partitionProfilesForBDF(bdf) + if err != nil { + failures = append(failures, fmt.Sprintf("%s (profiles: %v)", bdf, err)) + continue + } + profileIndex := -1 + for _, profile := range profiles { + if strings.EqualFold(profile.Type, computeType) { + profileIndex = profile.ProfileIndex + break + } + } + if profileIndex < 0 { + failures = append(failures, fmt.Sprintf("%s (no %s profile)", bdf, computeType)) + continue + } + cBDF := C.CString(bdf) + status := C.amdsmi_set_partition_for_bdf(cBDF, C.uint(profileIndex)) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + } + } + if len(failures) > 0 { + return fmt.Errorf("compute-partition set failed for %s", strings.Join(failures, ", ")) + } + return nil +} + +func xccPerPartition(config C.amdsmi_accelerator_partition_profile_config_t, profileIndex C.uint) int { + for j := 0; j < int(config.num_resource_profiles); j++ { + res := config.resource_profiles[j] + if res.profile_index == profileIndex && res.resource_type == C.AMDSMI_ACCELERATOR_XCC { + return int(res.partition_resource) + } + } + return 0 +} + +func acceleratorPartitionTypeString(t C.amdsmi_accelerator_partition_type_t) string { + switch t { + case C.AMDSMI_ACCELERATOR_PARTITION_SPX: + return "SPX" + case C.AMDSMI_ACCELERATOR_PARTITION_DPX: + return "DPX" + case C.AMDSMI_ACCELERATOR_PARTITION_TPX: + return "TPX" + case C.AMDSMI_ACCELERATOR_PARTITION_QPX: + return "QPX" + case C.AMDSMI_ACCELERATOR_PARTITION_CPX: + return "CPX" + } + return "" +} + +func npsCapsString(mask C.uint) string { + caps := make([]string, 0, 4) + if mask&1 != 0 { + caps = append(caps, "NPS1") + } + if mask&2 != 0 { + caps = append(caps, "NPS2") + } + if mask&4 != 0 { + caps = append(caps, "NPS4") + } + if mask&8 != 0 { + caps = append(caps, "NPS8") + } + return strings.Join(caps, ",") +} + func normalizeBDF(bdf string) string { bdf = strings.ToLower(strings.TrimSpace(bdf)) // KFD topology uses domain:bus:device:function, while AMD SMI expects diff --git a/internal/pkg/amdgpu/partition_templates.go b/internal/pkg/amdgpu/partition_templates.go new file mode 100644 index 00000000..c47593d7 --- /dev/null +++ b/internal/pkg/amdgpu/partition_templates.go @@ -0,0 +1,141 @@ +package amdgpu + +import ( + "fmt" + "strings" + + "github.com/golang/glog" +) + +// PartitionTemplate is one apply-ready combination for a GPU: the compute +// partition style, the NPS memory mode, and the physical memory partition +// count that mode exposes (1/4/8 HBM stacks on gfx950-class cards). +type PartitionTemplate struct { + Compute string `json:"computePartition"` + Memory string `json:"memoryPartition"` + PhysicalMemory int `json:"physicalMemory"` + Current bool `json:"current"` +} + +// DevicePartitionTemplates is the boot-time template catalog for one GPU. +type DevicePartitionTemplates struct { + BDF string `json:"bdf"` + Product string `json:"product"` + CurrentComputePartition string `json:"currentComputePartition"` + CurrentMemoryPartition string `json:"currentMemoryPartition"` + CurrentPhysicalMemory int `json:"currentPhysicalMemory"` + NumANode int `json:"numaNode"` + CUCount int32 `json:"cuCount"` + VRAMMiB int32 `json:"vramMiB"` + Templates []PartitionTemplate `json:"templates"` +} + +// NPSMemoryTable maps the physical memory partition count each NPS mode +// exposes, per product family. This is the lookup table used to translate an +// NPS mode into memory domains for scheduling and Allocate. +// ponytail: counts are for the MI300/MI355 class; add new families here +// before scheduling a new generation. +var NPSMemoryTable = map[string]map[string]int{ + "gfx950": {"nps1": 1, "nps4": 4, "nps8": 8}, + "gfx942": {"nps1": 1, "nps4": 4, "nps8": 8}, + "gfx90a": {"nps1": 1, "nps2": 2, "nps4": 4}, +} + +// partitionCombos lists the valid compute x memory combinations per family. +// Compute styles: spx (single), dpx (dual), qpx (quad partition). +// ponytail: firmware-gated; unlisted combos simply get no template. +var partitionCombos = map[string][]struct { + Compute, Memory string +}{ + "gfx950": { + {"spx", "nps1"}, {"spx", "nps4"}, {"spx", "nps8"}, + {"dpx", "nps1"}, {"dpx", "nps4"}, + {"qpx", "nps1"}, + }, + "gfx942": { + {"spx", "nps1"}, {"spx", "nps4"}, {"spx", "nps8"}, + {"dpx", "nps1"}, {"dpx", "nps4"}, + {"qpx", "nps1"}, + }, + "gfx90a": { + {"spx", "nps1"}, {"spx", "nps2"}, {"spx", "nps4"}, + {"dpx", "nps1"}, {"dpx", "nps2"}, + }, +} + +func familyFromProduct(product string) string { + p := strings.ToLower(product) + switch { + case strings.Contains(p, "mi355"), strings.Contains(p, "gfx950"): + return "gfx950" + case strings.Contains(p, "mi300"), strings.Contains(p, "gfx942"): + return "gfx942" + case strings.Contains(p, "mi210"), strings.Contains(p, "mi250"), strings.Contains(p, "gfx90a"): + return "gfx90a" + } + // ponytail: unknown products default to the gfx950 table; add the family + // above before scheduling a new generation. + return "gfx950" +} + +// GeneratePartitionTemplates builds the per-card template catalog from live +// sysfs partition state and the product-family tables. Each card gets one +// entry per valid combination, with the currently active one flagged. +func GeneratePartitionTemplates() ([]DevicePartitionTemplates, error) { + gpus := GetAMDGPUs() + bdfs := make([]string, 0, len(gpus)) + for _, data := range gpus { + if bdf, ok := data["devID"].(string); ok { + bdfs = append(bdfs, bdf) + } + } + products, err := GetAMDSMIProductNames(bdfs) + if err != nil { + glog.Warningf("AMD SMI product lookup incomplete; templates fall back to family defaults: %v", err) + } + + var out []DevicePartitionTemplates + for key, data := range gpus { + compute, _ := data["computePartitionType"].(string) + memory, _ := data["memoryPartitionType"].(string) + if compute == "" { + compute = "spx" + } + if memory == "" { + memory = "nps1" + } + product := "" + if bdf, ok := data["devID"].(string); ok { + product = products[strings.ToLower(bdf)] + } + family := familyFromProduct(product) + memoryTable := NPSMemoryTable[family] + combos := partitionCombos[family] + + card, _ := data["card"].(int) + numa, _ := data["numaNode"].(int) + capacity, _ := GetDeviceCapacity(fmt.Sprintf("card%d", card)) + + entry := DevicePartitionTemplates{ + BDF: key, + Product: product, + CurrentComputePartition: compute, + CurrentMemoryPartition: memory, + CurrentPhysicalMemory: memoryTable[memory], + NumANode: numa, + CUCount: capacity.CUCount, + VRAMMiB: capacity.VRAMMiB, + } + for _, combo := range combos { + entry.Templates = append(entry.Templates, PartitionTemplate{ + Compute: combo.Compute, + Memory: combo.Memory, + PhysicalMemory: memoryTable[combo.Memory], + Current: combo.Compute == compute && combo.Memory == memory, + }) + } + out = append(out, entry) + } + return out, nil +} + diff --git a/internal/pkg/amdgpu/partition_templates_test.go b/internal/pkg/amdgpu/partition_templates_test.go new file mode 100644 index 00000000..6051e626 --- /dev/null +++ b/internal/pkg/amdgpu/partition_templates_test.go @@ -0,0 +1,35 @@ +package amdgpu + +import "testing" + +func TestFamilyFromProduct(t *testing.T) { + cases := map[string]string{ + "AMD Instinct MI355X": "gfx950", + "AMD Instinct MI300X": "gfx942", + "AMD Instinct MI210": "gfx90a", + "AMD Instinct MI250": "gfx90a", + "unknown vendor part": "gfx950", + } + for product, want := range cases { + if got := familyFromProduct(product); got != want { + t.Errorf("familyFromProduct(%q) = %q, want %q", product, got, want) + } + } +} + +// Every combo's memory mode must have a physical count in the NPS table. +func TestCombosResolveInNPSMemoryTable(t *testing.T) { + for family, combos := range partitionCombos { + table := NPSMemoryTable[family] + if table == nil { + t.Errorf("family %q missing from NPSMemoryTable", family) + continue + } + for _, combo := range combos { + if table[combo.Memory] == 0 { + t.Errorf("family %q combo %s/%s: memory mode %q missing from NPSMemoryTable", + family, combo.Compute, combo.Memory, combo.Memory) + } + } + } +} diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index d5a4d62f..a5600d91 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -47,29 +47,88 @@ import ( const defaultSplitCount = 10 +// ModeAnnotation selects the allocation mode per pod: absent or "rocm" is +// soft CU masking, a compute partition type ("spx"/"cpx"/...) whole partitions. +const ModeAnnotation = "hami.io/amd-mode" + +func IsPartitionMode(mode string) bool { + switch mode { + case "spx", "cpx", "dpx", "qpx": + return true + } + return false +} + +func stripPartitionModeSuffix(id string) string { + if idx := strings.LastIndex(id, "#"); idx > 0 && IsPartitionMode(id[idx+1:]) { + return id[:idx] + } + return id +} + // Plugin is identical to DevicePluginServer interface of device plugin API. type AMDGPUPlugin struct { - AMDGPUs map[string]map[string]interface{} - Heartbeat chan bool - signal chan os.Signal - disableWatchAndRegister chan bool - ackDisableWatchAndRegister chan bool - deviceCache []*utils.DeviceInfo - Resource string - devAllocator allocator.Policy - allocatorInitError bool + AMDGPUs map[string]map[string]interface{} + // sysfsRoot overrides the /sys mount root used by device discovery; tests + // point it at testdata, empty means /sys. + sysfsRoot string + // amdsmiUUIDLookup, amdsmiProductNameLookup and amdsmiMemoryPartitionLookup + // are injectable for tests; nil means the AMD SMI cgo implementation. + amdsmiUUIDLookup, amdsmiProductNameLookup, amdsmiMemoryPartitionLookup func([]string) (map[string]string, error) + // amdsmiPartitionProfileLookup is injectable for tests; nil means the AMD + // SMI cgo implementation. + amdsmiPartitionProfileLookup func([]string) (map[string][]amdgpu.PartitionProfile, error) + Heartbeat chan bool + signal chan os.Signal + disableWatchAndRegister chan bool + ackDisableWatchAndRegister chan bool + deviceCache []*utils.DeviceInfo + Resource string + devAllocator allocator.Policy + allocatorInitError bool + // operatingMode is "cu" (soft whole-GPU + CU slices, default) or + // "partition" (hard compute partitions only). Resolved in Start() from + // the OPERATING_MODE env, overridable per node via the + // hami.io/amd-operating-mode annotation. + operatingMode string + // computePartition is the target compute partition type (spx/dpx/qpx/cpx) + // the plugin applies through the AMD SMI API at startup; empty leaves the + // hardware mode untouched. Only applied in partition mode. Resolved like + // operatingMode (COMPUTE_PARTITION env, hami.io/amd-compute-partition + // annotation). + computePartition string // amdSMIUUIDToTopology maps the stable AMD SMI device UUID published in // DeviceInfo.ID back to the local topology key required during Allocate. amdSMIUUIDToTopology map[string]string // amdSMIUUIDToROCrUUID maps the scheduler-facing AMD SMI UUID to the UUID // spelling understood by ROCR_VISIBLE_DEVICES. amdSMIUUIDToROCrUUID map[string]string + // rocrUUIDToTopology maps ROCr-visible ids (GPU-, or the agent + // index on APUs without a Device Serial Number) to topology keys. + rocrUUIDToTopology map[string]string + // sortedBDFs holds the registered PCI BDFs in list order (sorted topology + // keys). Upstream HAMi invents flat "AMDGPU-" device ids over node + // capacity; device i resolves to GPU sortedBDFs[i/defaultSplitCount]. + sortedBDFs []string + // partitionTemplates is the boot-time catalog of compute x NPS + // combinations per card, with the NPS->physical memory lookup applied. + // Held in memory only; never written to disk (immutable-OS friendly). + partitionTemplates []amdgpu.DevicePartitionTemplates + // bdfToROCrUUID maps a topology key to its ROCr UUID, for resolving + // whole-GPU allocations from kubelet device ids. + bdfToROCrUUID map[string]string } type AMDGPUPluginOption func(*AMDGPUPlugin) func NewAMDGPUPlugin(options ...AMDGPUPluginOption) *AMDGPUPlugin { - amdGpuPlugin := &AMDGPUPlugin{} + amdGpuPlugin := &AMDGPUPlugin{operatingMode: "cu"} + if mode := os.Getenv("OPERATING_MODE"); mode != "" { + amdGpuPlugin.operatingMode = mode + } + if partition := os.Getenv("COMPUTE_PARTITION"); partition != "" { + amdGpuPlugin.computePartition = partition + } for _, option := range options { option(amdGpuPlugin) } @@ -93,6 +152,29 @@ func WithResource(res string) AMDGPUPluginOption { } } +func WithSysfsRoot(root string) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.sysfsRoot = root + } +} + +// WithAmdSMI injects the AMD SMI lookups so registration runs without AMD SMI. +func WithAmdSMI(uuidLookup, productNameLookup, memoryPartitionLookup func([]string) (map[string]string, error)) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.amdsmiUUIDLookup = uuidLookup + p.amdsmiProductNameLookup = productNameLookup + p.amdsmiMemoryPartitionLookup = memoryPartitionLookup + } +} + +// WithAMDSPartitionProfiles injects the accelerator partition profile lookup +// so registration runs without AMD SMI. +func WithAMDSPartitionProfiles(lookup func([]string) (map[string][]amdgpu.PartitionProfile, error)) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.amdsmiPartitionProfileLookup = lookup + } +} + // Start is an optional interface that could be implemented by plugin. // If case Start is implemented, it will be executed by Manager after // plugin instantiation and before its registration to kubelet. This @@ -110,7 +192,39 @@ func (p *AMDGPUPlugin) Start() error { p.ackDisableWatchAndRegister = make(chan bool, 1) } signal.Notify(p.signal, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) - err := p.devAllocator.Init(getDevices(), "") + // Per-node operating-mode override; must resolve before allocator and + // registration use it. + if node, err := utils.GetNode(os.Getenv(utils.NodeNameEnvName)); err == nil { + if mode, ok := node.Annotations[operatingModeAnnotation]; ok && mode != "" { + p.operatingMode = mode + } + if partition, ok := node.Annotations[computePartitionAnnotation]; ok && partition != "" { + p.computePartition = partition + } + } else { + glog.Warningf("operating-mode: cannot read node annotations, keeping %q: %v", p.operatingMode, err) + } + glog.Infof("operating mode: %s, compute partition: %s", p.operatingMode, p.computePartition) + + // In partition mode with a target compute partition set, flip the GPUs + // through the AMD SMI API before any registration reads the current + // hardware mode. Busy GPUs fail and keep their current mode; the rest + // still flip. + if p.operatingMode == "partition" && p.computePartition != "" { + var bdfs []string + for _, deviceData := range amdgpu.GetAMDGPUs() { + if bdf, ok := deviceData["devID"].(string); ok && bdf != "" { + bdfs = append(bdfs, bdf) + } + } + flipStart := time.Now() + if err := amdgpu.SetGPUComputePartitions(bdfs, p.computePartition); err != nil { + glog.Warningf("compute-partition flip to %s incomplete: %v", p.computePartition, err) + } + glog.V(2).Infof("compute-partition flip to %s took %s", p.computePartition, time.Since(flipStart)) + } + + err := p.devAllocator.Init(p.getDevices(), "") if err != nil { glog.Errorf("allocator init failed. Falling back to kubelet default allocation. Error %v", err) p.allocatorInitError = true @@ -125,12 +239,32 @@ func (p *AMDGPUPlugin) Start() error { return fmt.Errorf("initialize device cache: %w", err) } + // Boot-time partition template catalog: per card, the valid compute x NPS + // combinations and the NPS->physical-memory lookup. In-memory only; + // regenerated on every boot. + p.partitionTemplates, err = amdgpu.GeneratePartitionTemplates() + if err != nil { + glog.Warningf("partition template generation failed: %v", err) + } + for _, t := range p.partitionTemplates { + glog.Infof("partition templates for %s (%s): current %s/%s physicalMemory=%d, %d combos", + t.BDF, t.Product, t.CurrentComputePartition, t.CurrentMemoryPartition, t.CurrentPhysicalMemory, len(t.Templates)) + } + return nil } const ( registerAnnosKey = "hami.io/node-amd-register" NodeLockName = "hami.io/mutex.lock" + // operatingModeAnnotation overrides the OPERATING_MODE env per node: + // "cu" or "partition". NVIDIA's MIG config uses the same per-node + // annotation pattern (nvidia.com/mig.config). + operatingModeAnnotation = "hami.io/amd-operating-mode" + // computePartitionAnnotation is the target compute partition type + // (spx/dpx/qpx/cpx) the plugin applies via the AMD SMI API at startup. + // Overrides the COMPUTE_PARTITION env per node. + computePartitionAnnotation = "hami.io/amd-compute-partition" ) func (p *AMDGPUPlugin) RegisterInAnnotation() error { @@ -155,58 +289,173 @@ func (p *AMDGPUPlugin) RegisterInAnnotation() error { return err } +// isSchedulableTopologyKey: in cu mode every whole-GPU key registers (CU +// slicing over the full GPU); XCP partition keys only register in partition +// mode. In partition mode a whole-GPU key registers only when the GPU has at +// most one partition (spx): a QPX/DPX whole GPU is replaced by its XCP +// partitions, and on kernels where KFD does not expose XCP nodes the whole +// GPU registers as a hard single-partition device with its capacity unshared. +func (p *AMDGPUPlugin) isSchedulableTopologyKey(key string, deviceData map[string]interface{}, partitionsByBDF map[string]int) bool { + if strings.HasPrefix(key, "amdgpu_xcp_") { + return p.operatingMode == "partition" + } + if p.operatingMode == "partition" { + bdf, _ := deviceData["devID"].(string) + return partitionsByBDF[bdf] <= 1 + } + return true +} + +// numPartitionsForMode returns how many compute partitions the current +// compute type creates, from the AMD SMI profile table; 1 when unknown. +// This is the correct capacity divisor (amdgpu_xcp_ child counts are wrong: +// gfx950 exposes 7 XCD chiplets per GPU regardless of partition mode). +func numPartitionsForMode(profiles []amdgpu.PartitionProfile, computeType string) int { + for _, profile := range profiles { + if strings.EqualFold(profile.Type, computeType) { + return profile.NumPartitions + } + } + return 1 +} + +// Registers the whole-partition form of a device. In partition mode every +// schedulable device (whole GPU with a compute type, or XCP partition) gets +// a hard "id#mode" entry; in cu mode only XCP partitions do. +func (p *AMDGPUPlugin) registerHardEntry(key string, deviceData map[string]interface{}, info *utils.DeviceInfo) bool { + if p.operatingMode != "partition" && !strings.HasPrefix(key, "amdgpu_xcp_") { + return false + } + computePartitionType, ok := deviceData["computePartitionType"].(string) + if !ok || computePartitionType == "" { + return false + } + info.ID = info.ID + "#" + computePartitionType + info.Mode = computePartitionType + info.Count = 1 + return true +} + func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { - p.AMDGPUs = amdgpu.GetAMDGPUs() + root := p.sysfsRoot + if root == "" { + root = "/sys" + } + uuidLookup, nameLookup, memoryPartitionLookup := p.amdsmiUUIDLookup, p.amdsmiProductNameLookup, p.amdsmiMemoryPartitionLookup + if uuidLookup == nil { + uuidLookup = amdgpu.GetAMDSMIUUIDs + } + if nameLookup == nil { + nameLookup = amdgpu.GetAMDSMIProductNames + } + if memoryPartitionLookup == nil { + memoryPartitionLookup = amdgpu.GetAMDSCurrentMemoryPartitions + } + partitionProfileLookup := p.amdsmiPartitionProfileLookup + if partitionProfileLookup == nil { + partitionProfileLookup = amdgpu.GetAMDGPUPartitionProfiles + } + p.AMDGPUs = amdgpu.GetAMDGPUs(root) - // Resolve a stable per-device UUID through the AMD SMI C API. Unlike the - // node labeller, this is not an aggregated node-level value and supports - // SR-IOV virtual functions. + // Whole-GPU capacity is read once per GPU through libdrm. XCP partitions + // share their parent's PCI BDF and get an even share of that capacity. + wholeCardByBDF := make(map[string]int) + for key, deviceData := range p.AMDGPUs { + if strings.HasPrefix(key, "amdgpu_xcp_") { + continue + } + if bdf, ok := deviceData["devID"].(string); ok && bdf != "" { + wholeCardByBDF[bdf], _ = deviceData["card"].(int) + } + } + capacityByBDF := make(map[string]amdgpu.DeviceCapacity, len(wholeCardByBDF)) + for bdf, card := range wholeCardByBDF { + if capacity, err := amdgpu.GetDeviceCapacity(fmt.Sprintf("card%d", card)); err != nil { + glog.Warningf("libdrm capacity lookup failed for GPU %s (card%d): %v", bdf, card, err) + } else { + capacityByBDF[bdf] = capacity + } + } + + keys := make([]string, 0, len(p.AMDGPUs)) + for key := range p.AMDGPUs { + keys = append(keys, key) + } + sort.Strings(keys) + + // Maps must exist even when empty so Allocate never dereferences nil. + p.amdSMIUUIDToTopology = make(map[string]string, len(p.AMDGPUs)) + p.amdSMIUUIDToROCrUUID = make(map[string]string, len(p.AMDGPUs)) + p.rocrUUIDToTopology = make(map[string]string, len(p.AMDGPUs)) + p.sortedBDFs = make([]string, 0, len(p.AMDGPUs)) + p.bdfToROCrUUID = make(map[string]string, len(p.AMDGPUs)) + glog.Infof("topology keys registered: %v", keys) + + // Resolve a stable per-device UUID through the AMD SMI C API for whole + // GPUs. XCP partitions share the parent PCI BDF, so the BDF-keyed AMD SMI + // lookup would collide; their IDs are ROCr UUIDs (unique per KFD node). bdfs := make([]string, 0, len(p.AMDGPUs)) for _, deviceData := range p.AMDGPUs { if bdf, ok := deviceData["devID"].(string); ok { bdfs = append(bdfs, bdf) } } - amdSMIUUIDs, err := amdgpu.GetAMDSMIUUIDs(bdfs) + amdSMIUUIDs, err := uuidLookup(bdfs) if err != nil { glog.Warningf("AMD SMI UUID lookup incomplete; GPUs without an AMD SMI UUID will not be registered: %v", err) } - p.amdSMIUUIDToTopology = make(map[string]string, len(amdSMIUUIDs)) - p.amdSMIUUIDToROCrUUID = make(map[string]string, len(amdSMIUUIDs)) - rocrUUIDs := amdgpu.GetROCrUUIDsFromTopology() - amdSMIProductNames, err := amdgpu.GetAMDSMIProductNames(bdfs) + rocrUUIDs := amdgpu.GetROCrUUIDsFromTopology(filepath.Join(root, "class/kfd/kfd")) + rocrIndexes := amdgpu.GetROCrIndexesFromTopology(filepath.Join(root, "class/kfd/kfd")) + amdSMIProductNames, err := nameLookup(bdfs) if err != nil { glog.Warningf("AMD SMI product-name lookup incomplete; using amd-gpu where necessary: %v", err) } + memoryPartitions, err := memoryPartitionLookup(bdfs) + if err != nil { + glog.Warningf("AMD SMI memory-partition lookup incomplete; keeping sysfs values: %v", err) + } + partitionProfiles, err := partitionProfileLookup(bdfs) + if err != nil { + glog.Warningf("AMD SMI partition-profile lookup incomplete: %v", err) + } - keys := make([]string, 0, len(p.AMDGPUs)) - for key := range p.AMDGPUs { - keys = append(keys, key) + // Per-GPU partition count of the current compute type; the capacity + // divisor for XCP entries and the schedulability gate for whole GPUs. + partitionsByBDF := make(map[string]int, len(p.AMDGPUs)) + for key, deviceData := range p.AMDGPUs { + if strings.HasPrefix(key, "amdgpu_xcp_") { + continue + } + bdf, _ := deviceData["devID"].(string) + if bdf == "" { + continue + } + computeType, _ := deviceData["computePartitionType"].(string) + if profiles, ok := partitionProfiles[strings.ToLower(bdf)]; ok { + partitionsByBDF[bdf] = numPartitionsForMode(profiles, computeType) + } } - sort.Strings(keys) - out := make([]*utils.DeviceInfo, 0, len(keys)) + out := make([]*utils.DeviceInfo, 0, len(keys)*2) for _, key := range keys { deviceData := p.AMDGPUs[key] + if !p.isSchedulableTopologyKey(key, deviceData, partitionsByBDF) { + glog.Infof("skip topology entry %s (no allocatable capacity)", key) + continue + } card, _ := deviceData["card"].(int) numa, _ := deviceData["numaNode"].(int) - capacity, capacityErr := amdgpu.GetDeviceCapacity(fmt.Sprintf("card%d", card)) - if capacityErr != nil { - glog.Warningf("libdrm capacity lookup failed for GPU %s (card%d): %v", key, card, capacityErr) - } - bdf, ok := deviceData["devID"].(string) if !ok || bdf == "" { glog.Errorf("skip GPU %s: missing PCI BDF in topology", key) continue } - uuid, found := amdSMIUUIDs[strings.ToLower(bdf)] - if !found || uuid == "" { - // Do not fall back to a node/BDF-derived ID. The scheduler must only - // see stable, hardware-bound AMD SMI UUIDs. - glog.Errorf("skip GPU %s: AMD SMI did not return a UUID for topology BDF %s", key, bdf) - continue + capacity := capacityByBDF[bdf] + if strings.HasPrefix(key, "amdgpu_xcp_") { + // XCP partitions advertise an even share of the whole GPU's + // VRAM and CU count, not the full-GPU capacity. + capacity = amdgpu.PartitionCapacity(capacity, partitionsByBDF[bdf]) } renderD, ok := deviceData["renderD"].(int) if !ok || renderD <= 0 { @@ -215,23 +464,56 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { } rocrUUID, found := rocrUUIDs[renderD] if !found || rocrUUID == "" { - glog.Errorf("skip GPU %s: no ROCr UUID found for renderD%d", key, renderD) - continue + // APUs without a PCI Device Serial Number report unique_id 0 and + // ROCr addresses them by agent index instead of a GPU- UUID. + if idx, ok := rocrIndexes[renderD]; ok { + rocrUUID = strconv.Itoa(idx) + } else { + glog.Errorf("skip GPU %s: no ROCr UUID found for renderD%d", key, renderD) + continue + } + } + p.rocrUUIDToTopology[rocrUUID] = key + p.bdfToROCrUUID[key] = rocrUUID + p.sortedBDFs = append(p.sortedBDFs, key) + + // Soft entry ID: AMD SMI UUID for whole GPUs, ROCr UUID for partitions. + infoID := rocrUUID + if !strings.HasPrefix(key, "amdgpu_xcp_") { + uuid, found := amdSMIUUIDs[strings.ToLower(bdf)] + if !found || uuid == "" { + // Do not fall back to a node/BDF-derived ID. The scheduler must + // only see stable, hardware-bound AMD SMI UUIDs. + glog.Errorf("skip GPU %s: AMD SMI did not return a UUID for topology BDF %s", key, bdf) + continue + } + p.amdSMIUUIDToTopology[uuid] = key + p.amdSMIUUIDToROCrUUID[uuid] = rocrUUID + infoID = uuid + // AMD SMI reports the current memory partition for whole GPUs; + // prefer it over the sysfs read used for XCP fallback. + if partition, ok := memoryPartitions[strings.ToLower(bdf)]; ok && partition != "" { + deviceData["memoryPartitionType"] = partition + } + } + + customInfo := map[string]any{"pciBDF": strings.ToLower(bdf)} + if strings.HasPrefix(key, "amdgpu_xcp_") { + memoryPartitionType, _ := deviceData["memoryPartitionType"].(string) + computePartitionType, _ := deviceData["computePartitionType"].(string) + customInfo["partitionProfile"] = computePartitionType + "_" + memoryPartitionType + } else if profiles, ok := partitionProfiles[strings.ToLower(bdf)]; ok { + // Whole GPUs advertise the modes they can be set to; XCP entries + // advertise the mode they are currently partitioned into. + customInfo["partitionProfiles"] = profiles } - // Keep BDF in the annotation for consumers that need to locate the - // device node. Allocate uses the in-memory UUID -> topology map below. - p.amdSMIUUIDToTopology[uuid] = key - p.amdSMIUUIDToROCrUUID[uuid] = rocrUUID - // key is the standard PCI BDF spelling (domain:bus:device.function). - // The KFD topology bdf above uses a fourth colon-separated component. - customInfo := map[string]any{"pciBDF": strings.ToLower(key)} deviceType := "amd-gpu" if productName, ok := amdSMIProductNames[strings.ToLower(bdf)]; ok && productName != "" { deviceType = productName } - out = append(out, &utils.DeviceInfo{ - ID: uuid, + soft := &utils.DeviceInfo{ + ID: infoID, Index: uint(card), Count: defaultSplitCount, Devmem: capacity.VRAMMiB, @@ -242,7 +524,11 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { Health: true, DeviceVendor: "amd", CustomInfo: customInfo, - }) + } + out = append(out, soft) + if p.registerHardEntry(key, deviceData, soft) { + glog.Infof("registered hard partition device %s (mode %s) alongside soft device %s", soft.ID, soft.Mode, infoID) + } } return out @@ -304,14 +590,47 @@ func (p *AMDGPUPlugin) WatchAndRegister(disableWatchAndRegister <-chan bool, ack } } -func getDevices() []*allocator.Device { +func kubeletDeviceID(key string, splitIdx int) string { + return fmt.Sprintf("%s#%d", key, splitIdx) +} + +func hardKubeletDeviceID(key string, deviceData map[string]interface{}) string { + if computePartitionType, _ := deviceData["computePartitionType"].(string); computePartitionType != "" { + return fmt.Sprintf("%s#%s", key, computePartitionType) + } + return "" +} + +func (p *AMDGPUPlugin) getDevices() []*allocator.Device { devices := amdgpu.GetAMDGPUs() var deviceList []*allocator.Device + // partitionsByBDF gates whole GPUs in partition mode; the profile lookup + // is not injectable here, so a GPU without profiles stays schedulable + // (spx default) instead of disappearing. + partitionsByBDF := make(map[string]int) for id, deviceData := range devices { - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - device := &allocator.Device{ - Id: fmt.Sprintf("%s#%d", id, splitIdx), + if !p.isSchedulableTopologyKey(id, deviceData, partitionsByBDF) { + continue + } + if p.operatingMode != "partition" { + for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { + device := &allocator.Device{ + Id: kubeletDeviceID(id, splitIdx), + Card: deviceData["card"].(int), + RenderD: deviceData["renderD"].(int), + DevId: deviceData["devID"].(string), + ComputePartitionType: deviceData["computePartitionType"].(string), + MemoryPartitionType: deviceData["memoryPartitionType"].(string), + NodeId: deviceData["nodeId"].(int), + NumaNode: deviceData["numaNode"].(int), + } + deviceList = append(deviceList, device) + } + } + if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { + deviceList = append(deviceList, &allocator.Device{ + Id: hardID, Card: deviceData["card"].(int), RenderD: deviceData["renderD"].(int), DevId: deviceData["devID"].(string), @@ -319,8 +638,7 @@ func getDevices() []*allocator.Device { MemoryPartitionType: deviceData["memoryPartitionType"].(string), NodeId: deviceData["nodeId"].(int), NumaNode: deviceData["numaNode"].(int), - } - deviceList = append(deviceList, device) + }) } } return deviceList @@ -439,6 +757,43 @@ func (p *AMDGPUPlugin) PreStartContainer(ctx context.Context, r *pluginapi.PreSt return &pluginapi.PreStartContainerResponse{}, nil } +// kubeletDevicesFor publishes defaultSplitCount soft slice slots plus one +// whole-partition device for XCP entries; the pod annotation picks per pod. +func (p *AMDGPUPlugin) kubeletDevicesFor(id string, deviceData map[string]interface{}) []*pluginapi.Device { + numas := []int64{int64(deviceData["numaNode"].(int))} + glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) + + numaNodes := make([]*pluginapi.NUMANode, len(numas)) + for j, v := range numas { + numaNodes[j] = &pluginapi.NUMANode{ + ID: int64(v), + } + } + + devs := make([]*pluginapi.Device, 0, defaultSplitCount+1) + if p.operatingMode != "partition" { + for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { + devs = append(devs, &pluginapi.Device{ + ID: kubeletDeviceID(id, splitIdx), + Health: pluginapi.Healthy, + Topology: &pluginapi.TopologyInfo{ + Nodes: numaNodes, + }, + }) + } + } + if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { + devs = append(devs, &pluginapi.Device{ + ID: hardID, + Health: pluginapi.Healthy, + Topology: &pluginapi.TopologyInfo{ + Nodes: numaNodes, + }, + }) + } + return devs +} + // ListAndWatch returns a stream of List of Devices // Whenever a Device state change or a Device disappears, ListAndWatch // returns the new list @@ -448,7 +803,7 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin glog.Infof("Found %d AMDGPUs", len(p.AMDGPUs)) - devs := make([]*pluginapi.Device, 0, len(p.AMDGPUs)*defaultSplitCount) + devs := make([]*pluginapi.Device, 0, len(p.AMDGPUs)*(defaultSplitCount+1)) var isHomogeneous bool isHomogeneous = amdgpu.IsHomogeneous() // Initialize a map to store partitionType based device list @@ -457,59 +812,42 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin if isHomogeneous { // limit scope for hwloc func() { + // partitionsByBDF gates whole GPUs in partition mode. The device + // map here has no partition-profile lookup; leave empty so whole + // GPUs stay schedulable (spx default) instead of disappearing. for id, device := range p.AMDGPUs { - numas := []int64{int64(device["numaNode"].(int))} - glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) - - numaNodes := make([]*pluginapi.NUMANode, len(numas)) - for j, v := range numas { - numaNodes[j] = &pluginapi.NUMANode{ - ID: int64(v), - } - } - - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - dev := &pluginapi.Device{ - ID: fmt.Sprintf("%s#%d", id, splitIdx), - Health: pluginapi.Healthy, - Topology: &pluginapi.TopologyInfo{ - Nodes: numaNodes, - }, - } - devs = append(devs, dev) + if !p.isSchedulableTopologyKey(id, device, map[string]int{}) { + continue } + devs = append(devs, p.kubeletDevicesFor(id, device)...) } }() + glog.Infof("ListAndWatch: sending %d split devices (homogeneous)", len(devs)) s.Send(&pluginapi.ListAndWatchResponse{Devices: devs}) } else { func() { for id, device := range p.AMDGPUs { - numas := []int64{int64(device["numaNode"].(int))} - glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) - - numaNodes := make([]*pluginapi.NUMANode, len(numas)) - for j, v := range numas { - numaNodes[j] = &pluginapi.NUMANode{ - ID: int64(v), - } + if !p.isSchedulableTopologyKey(id, device, map[string]int{}) { + continue } - partitionType := device["computePartitionType"].(string) + "_" + device["memoryPartitionType"].(string) - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - dev := &pluginapi.Device{ - ID: fmt.Sprintf("%s#%d", id, splitIdx), - Health: pluginapi.Healthy, - Topology: &pluginapi.TopologyInfo{ - Nodes: numaNodes, - }, - } - // Append a split device belonging to this partition type. + for _, dev := range p.kubeletDevicesFor(id, device) { resourceTypeDevs[partitionType] = append(resourceTypeDevs[partitionType], dev) } } }() // Send the appropriate list of devices based on the partitionType if devList, exists := resourceTypeDevs[p.Resource]; exists { + glog.Infof("ListAndWatch: sending %d split devices for resource %s", len(devList), p.Resource) + s.Send(&pluginapi.ListAndWatchResponse{Devices: devList}) + } else { + // Mixed node under the single strategy: the resource name is + // "gpu", not a partition type, so publish every device. + devList := make([]*pluginapi.Device, 0) + for _, devs := range resourceTypeDevs { + devList = append(devList, devs...) + } + glog.Infof("ListAndWatch: sending %d split devices for resource %s (mixed node)", len(devList), p.Resource) s.Send(&pluginapi.ListAndWatchResponse{Devices: devList}) } } @@ -553,10 +891,21 @@ loop: func (p *AMDGPUPlugin) GetPreferredAllocation(ctx context.Context, req *pluginapi.PreferredAllocationRequest) (*pluginapi.PreferredAllocationResponse, error) { response := &pluginapi.PreferredAllocationResponse{} for _, req := range req.ContainerRequests { + glog.Infof("GetPreferredAllocation: available=%v must=%v size=%d", req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, req.AllocationSize) allocated_ids, err := p.devAllocator.Allocate(req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, int(req.AllocationSize)) if err != nil { - glog.Errorf("unable to get preferred allocation list. Error:%v", err) - return nil, fmt.Errorf("unable to get preferred allocation list. Error:%v", err) + // kubelet passes its checkpoint-persisted ids (bare BDFs from the + // pre-fork plugin), which the split-keyed allocator cannot map. + // GPA is advisory; Allocate resolves the pod annotation, so echo + // kubelet's own ids instead of failing admission. + glog.Warningf("preferred allocation failed (%v); echoing kubelet device ids", err) + allocated_ids = req.MustIncludeDeviceIDs + for _, id := range req.AvailableDeviceIDs { + if len(allocated_ids) >= int(req.AllocationSize) { + break + } + allocated_ids = append(allocated_ids, id) + } } resp := &pluginapi.ContainerPreferredAllocationResponse{ DeviceIDs: allocated_ids, @@ -568,22 +917,67 @@ func (p *AMDGPUPlugin) GetPreferredAllocation(ctx context.Context, req *pluginap // deviceDataFromAllocationUUID resolves the AMD SMI UUID published in // DeviceInfo.ID to the local topology required to prepare a container. +// parseAMDGPUIndex extracts the flat counter from upstream HAMi's +// "-AMDGPU-" device ids, or -1 for any other id spelling. +func parseAMDGPUIndex(id string) int { + idx := strings.LastIndex(id, "AMDGPU-") + if idx < 0 { + return -1 + } + n, err := strconv.Atoi(id[idx+len("AMDGPU-"):]) + if err != nil { + return -1 + } + return n +} + func (p *AMDGPUPlugin) deviceDataFromAllocationUUID(uuid, _ string) (map[string]interface{}, error) { + uuid = stripPartitionModeSuffix(uuid) if topoKey, ok := p.amdSMIUUIDToTopology[uuid]; ok { if d, found := p.AMDGPUs[topoKey]; found { return d, nil } return nil, fmt.Errorf("AMD SMI UUID %q resolves to unavailable topology key %q", uuid, topoKey) } - - return nil, fmt.Errorf("no local GPU topology entry for AMD SMI UUID %q", uuid) + if topoKey, ok := p.rocrUUIDToTopology[uuid]; ok { + if d, found := p.AMDGPUs[topoKey]; found { + return d, nil + } + return nil, fmt.Errorf("ROCr UUID %q resolves to unavailable topology key %q", uuid, topoKey) + } + if i := parseAMDGPUIndex(uuid); i >= 0 { + // Upstream HAMi device i is the i-th split slot in registration order. + gpuIdx := i / defaultSplitCount + glog.Infof("resolving upstream AMDGPU id %s: index=%d gpuIdx=%d splitCount=%d sortedBDFs=%d", uuid, i, gpuIdx, defaultSplitCount, len(p.sortedBDFs)) + if gpuIdx < len(p.sortedBDFs) { + if d, found := p.AMDGPUs[p.sortedBDFs[gpuIdx]]; found { + return d, nil + } + glog.Infof("resolved gpuIdx %d -> %s but missing from AMDGPUs", gpuIdx, p.sortedBDFs[gpuIdx]) + } + } + return nil, fmt.Errorf("no local GPU topology entry for device id %q", uuid) } func (p *AMDGPUPlugin) rocrUUIDFromAllocationUUID(uuid string) (string, error) { + // XCP partitions publish ROCr UUIDs as DeviceInfo.ID, optionally with a + // "#" hard-entry suffix. + uuid = stripPartitionModeSuffix(uuid) + if strings.HasPrefix(uuid, "GPU-") { + return uuid, nil + } if rocrUUID, ok := p.amdSMIUUIDToROCrUUID[uuid]; ok && rocrUUID != "" { return rocrUUID, nil } - return "", fmt.Errorf("no ROCr UUID for AMD SMI UUID %q", uuid) + if i := parseAMDGPUIndex(uuid); i >= 0 { + gpuIdx := i / defaultSplitCount + if gpuIdx < len(p.sortedBDFs) { + if rocrUUID, ok := p.bdfToROCrUUID[p.sortedBDFs[gpuIdx]]; ok && rocrUUID != "" { + return rocrUUID, nil + } + } + } + return "", fmt.Errorf("no ROCr UUID for device id %q", uuid) } // Allocate is called during container creation so that the Device @@ -592,75 +986,55 @@ func (p *AMDGPUPlugin) rocrUUIDFromAllocationUUID(uuid string) (string, error) { func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) { response := &pluginapi.AllocateResponse{} - // resolve device allocation from annotation glog.Infof("Allocate request: %+v", r) nodename := os.Getenv(utils.NodeNameEnvName) + hostHookPath := os.Getenv("HOST_HOOK_PATH") + + // Whole-GPU allocations (upstream HAMi 2.9, Usedcores=0) carry no cores, so + // kubelet device ids are resolved when the annotation path is unavailable. current, err := utils.GetPendingPod(ctx, nodename) if err != nil { - return &pluginapi.AllocateResponse{}, err + glog.Warningf("no pending pod on %s, falling back to kubelet device ids: %v", nodename, err) } - podDevices := current.Annotations[utils.DeviceAllocation] - podCuAllocList := map[string]string{} - if raw := strings.TrimSpace(current.Annotations[utils.CuAllocation]); raw != "" { - if err := json.Unmarshal([]byte(raw), &podCuAllocList); err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("parse existing %s: %w", utils.CuAllocation, err) + var podDevices string + var podCuAllocList map[string]string + var cuAllocationSnapshot map[string]cuallocation.Allocation + if current != nil { + podDevices = current.Annotations[utils.DeviceAllocation] + podCuAllocList = map[string]string{} + if raw := strings.TrimSpace(current.Annotations[utils.CuAllocation]); raw != "" { + if err := json.Unmarshal([]byte(raw), &podCuAllocList); err != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, fmt.Errorf("parse existing %s: %w", utils.CuAllocation, err) + } } - } - // Pod annotations are the source of truth. The scheduler keeps the node - // locked until this allocation is persisted, so a direct API read gives us - // the complete bitmap committed by all preceding Pods without depending on - // informer delivery. - cuAllocationSnapshot, err := p.rebuildCUAllocations(ctx, nodename) - if err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("rebuild CU allocation for node %s: %w", nodename, err) - } - hostHookPath := os.Getenv("HOST_HOOK_PATH") - glog.Infof("Allocate pod name is %s/%s, annotation is %+v", current.Namespace, current.Name, current.Annotations) - - for idx := range r.ContainerRequests { - currentCtr, devreq, err := utils.GetNextDeviceRequest("amd", *current) - glog.Infof("deviceAllocateFromAnnotation(container=%s)=%+v", currentCtr.Name, devreq) + // Pod annotations are the source of truth: the scheduler holds the node + // lock until the allocation persists, so a direct read beats informer delivery. + cuAllocationSnapshot, err = p.rebuildCUAllocations(ctx, nodename) if err != nil { utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, err - } - if len(devreq) != len(r.ContainerRequests[idx].DevicesIDs) { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("device number not matched") + return &pluginapi.AllocateResponse{}, fmt.Errorf("rebuild CU allocation for node %s: %w", nodename, err) } + glog.Infof("Allocate pod name is %s/%s, annotation is %+v", current.Namespace, current.Name, current.Annotations) + } + for idx := range r.ContainerRequests { car := pluginapi.ContainerAllocateResponse{ Envs: map[string]string{}, } - rocrVisibleDevices := make([]string, 0, len(devreq)) + rocrVisibleDevices := make([]string, 0, len(r.ContainerRequests[idx].DevicesIDs)) - // KFD + DRI from annotation UUID topology. car.Devices = append(car.Devices, &pluginapi.DeviceSpec{ HostPath: "/dev/kfd", ContainerPath: "/dev/kfd", Permissions: "rw", }) - for _, d := range devreq { - glog.Infof("Allocating device from annotation UUID: %s", d.UUID) - deviceData, topoErr := p.deviceDataFromAllocationUUID(d.UUID, nodename) - if topoErr != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, topoErr - } + appendDeviceNodes := func(deviceData map[string]interface{}) error { cardMinor, cok := deviceData["card"].(int) renderMinor, rok := deviceData["renderD"].(int) if !cok || !rok { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("invalid card/renderD in topology for UUID %q", d.UUID) - } - rocrUUID, rocrErr := p.rocrUUIDFromAllocationUUID(d.UUID) - if rocrErr != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, rocrErr + return fmt.Errorf("invalid card/renderD in topology") } - rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) for _, pair := range []struct { kind string minor int @@ -675,15 +1049,68 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques Permissions: "rw", }) } + return nil } - err = utils.EraseNextDeviceTypeFromAnnotation("amd", *current) - if err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, err + var devreq utils.ContainerDevices + currentCtrName := "" + fromAnnotation := false + if current != nil { + if ctr, d, rerr := utils.GetNextDeviceRequest("amd", *current); rerr == nil && len(d) == len(r.ContainerRequests[idx].DevicesIDs) { + currentCtrName, devreq, fromAnnotation = ctr.Name, d, true + } } + glog.Infof("deviceAllocateFromAnnotation(container=%s)=%+v fromAnnotation=%v", currentCtrName, devreq, fromAnnotation) + + if fromAnnotation { + for _, d := range devreq { + glog.Infof("Allocating device from annotation UUID: %s", d.UUID) + deviceData, topoErr := p.deviceDataFromAllocationUUID(d.UUID, nodename) + if topoErr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, topoErr + } + if nerr := appendDeviceNodes(deviceData); nerr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, fmt.Errorf("topology for UUID %q: %w", d.UUID, nerr) + } + rocrUUID, rocrErr := p.rocrUUIDFromAllocationUUID(d.UUID) + if rocrErr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, rocrErr + } + rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) + } + } else { + // Whole-GPU fallback: resolve kubelet's own device ids ("BDF#slot"). + for _, id := range r.ContainerRequests[idx].DevicesIDs { + bdf := strings.SplitN(id, "#", 2)[0] + deviceData, found := p.AMDGPUs[bdf] + if !found { + return &pluginapi.AllocateResponse{}, fmt.Errorf("no topology entry for kubelet device id %q", id) + } + if nerr := appendDeviceNodes(deviceData); nerr != nil { + return &pluginapi.AllocateResponse{}, fmt.Errorf("topology for kubelet device id %q: %w", id, nerr) + } + rocrUUID, ok := p.bdfToROCrUUID[bdf] + if !ok || rocrUUID == "" { + return &pluginapi.AllocateResponse{}, fmt.Errorf("no ROCr UUID for kubelet device id %q", id) + } + rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) + } + } + car.Envs["ROCR_VISIBLE_DEVICES"] = strings.Join(rocrVisibleDevices, ",") + + // CU slicing applies only when the scheduler handed out cores. Upstream + // HAMi's AMD driver always requests whole GPUs (Usedcores=0), so the CU + // mask, memory limit and LD_AUDIT hook are skipped there. + if fromAnnotation && len(devreq) > 0 && devreq[0].Usedcores > 0 { + err = utils.EraseNextDeviceTypeFromAnnotation("amd", *current) + if err != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, err + } - if len(devreq) > 0 { hsaCuSets := make([]string, 0, len(devreq)) for _, d := range devreq { if d.UUID == "" { @@ -734,9 +1161,6 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques } } car.Envs["HSA_CU_MASK"] = strings.Join(hsaCuSets, ";") - // ROCr renumbers devices after this list is applied. HSA_CU_MASK uses - // those container-local indices, so it is built in the same order. - car.Envs["ROCR_VISIBLE_DEVICES"] = strings.Join(rocrVisibleDevices, ",") car.Envs["HIP_DEVICE_MEMORY_LIMIT"] = fmt.Sprintf("%vm", devreq[0].Usedmem) car.Envs["LD_AUDIT"] = "/usr/local/vgpu/libamvgpu.so" } @@ -778,8 +1202,10 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques } } + if current != nil { + utils.PodAllocationTrySuccess(nodename, podDevices, NodeLockName, current) + } glog.Infoln("Allocate Response", response.ContainerResponses) - utils.PodAllocationTrySuccess(nodename, podDevices, NodeLockName, current) return response, nil } diff --git a/internal/pkg/plugin/plugin_test.go b/internal/pkg/plugin/plugin_test.go index b4d12a38..c38ee600 100644 --- a/internal/pkg/plugin/plugin_test.go +++ b/internal/pkg/plugin/plugin_test.go @@ -17,9 +17,14 @@ package plugin import ( + "encoding/json" + "os" + "path/filepath" + "strconv" "strings" "testing" + "github.com/Project-HAMi/amd-device-plugin/internal/pkg/amdgpu" "github.com/Project-HAMi/amd-device-plugin/internal/pkg/cuallocation" "github.com/Project-HAMi/amd-device-plugin/internal/pkg/utils" corev1 "k8s.io/api/core/v1" @@ -159,3 +164,381 @@ func assertAllocationWord(t *testing.T, allocations map[string]cuallocation.Allo t.Fatalf("allocation word for %s = %#x, want %#x", uuid, allocation[0], want) } } + +func TestIsSchedulableTopologyKey(t *testing.T) { + wholeGPU := map[string]interface{}{"devID": "0000:05:00.0", "computePartitionType": "spx", "memoryPartitionType": "nps1"} + qpxParent := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "qpx", "memoryPartitionType": "nps1"} + noPartition := map[string]interface{}{"devID": "0000:75:00.0", "computePartitionType": "", "memoryPartitionType": ""} + xcp := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "qpx", "memoryPartitionType": "nps1"} + // partitionsByBDF: spx=1, qpx=4, none=0 (unknown -> spx default). + partitions := map[string]int{"0000:05:00.0": 1, "0000:15:00.0": 4} + + cu := &AMDGPUPlugin{operatingMode: "cu"} + if !cu.isSchedulableTopologyKey("0000:05:00.0", wholeGPU, partitions) { + t.Error("cu mode: SPX whole GPU should be schedulable") + } + if !cu.isSchedulableTopologyKey("0000:15:00.0", qpxParent, partitions) { + t.Error("cu mode: QPX whole GPU should be schedulable (CU slicing over the whole GPU)") + } + if cu.isSchedulableTopologyKey("amdgpu_xcp_30", xcp, partitions) { + t.Error("cu mode: XCP partition must not register") + } + if !cu.isSchedulableTopologyKey("0000:75:00.0", noPartition, partitions) { + t.Error("cu mode: GPU without partition support should be schedulable") + } + + partition := &AMDGPUPlugin{operatingMode: "partition"} + if !partition.isSchedulableTopologyKey("0000:05:00.0", wholeGPU, partitions) { + t.Error("partition mode: SPX whole GPU (1 partition) should register as a hard device") + } + if partition.isSchedulableTopologyKey("0000:15:00.0", qpxParent, partitions) { + t.Error("partition mode: QPX whole GPU is replaced by its XCP partitions") + } + if !partition.isSchedulableTopologyKey("amdgpu_xcp_30", xcp, partitions) { + t.Error("partition mode: XCP partition should register") + } + if !partition.isSchedulableTopologyKey("0000:75:00.0", noPartition, partitions) { + t.Error("partition mode: GPU without partitions has no hard form but still registers soft") + } +} + +func TestHardEntryRegistration(t *testing.T) { + xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + noPartition := map[string]interface{}{"computePartitionType": "", "memoryPartitionType": ""} + wholeGPU := map[string]interface{}{"computePartitionType": "spx", "memoryPartitionType": "nps1"} + + soft := &utils.DeviceInfo{ID: "GPU-466450b96fbde849", Count: defaultSplitCount, Mode: ""} + if !(&AMDGPUPlugin{operatingMode: "cu"}).registerHardEntry("amdgpu_xcp_30", xcp, soft) { + t.Fatal("XCP partition should register a hard entry") + } + if soft.ID != "GPU-466450b96fbde849#cpx" || soft.Mode != "cpx" || soft.Count != 1 { + t.Fatalf("hard entry = %+v, want suffixed ID, Mode=cpx, Count=1", soft) + } + + soft = &utils.DeviceInfo{ID: "uuid-1", Count: defaultSplitCount} + if (&AMDGPUPlugin{operatingMode: "cu"}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { + t.Fatal("cu mode: GPU parents must not get a hard entry") + } + soft = &utils.DeviceInfo{ID: "uuid-2", Count: defaultSplitCount} + if (&AMDGPUPlugin{operatingMode: "partition"}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { + if soft.ID != "uuid-2#spx" || soft.Mode != "spx" || soft.Count != 1 { + t.Fatalf("partition-mode hard entry = %+v, want ID uuid-2#spx, Mode=spx, Count=1", soft) + } + } else { + t.Fatal("partition mode: SPX whole GPU should get a hard entry") + } + soft = &utils.DeviceInfo{ID: "uuid-3", Count: defaultSplitCount} + if (&AMDGPUPlugin{operatingMode: "partition"}).registerHardEntry("0000:75:00.0", noPartition, soft) { + t.Fatal("GPU without a compute partition type should not get a hard entry") + } +} + +func TestStripPartitionModeSuffix(t *testing.T) { + for id, want := range map[string]string{ + "GPU-466450b96fbde849#cpx": "GPU-466450b96fbde849", + "GPU-466450b96fbde849#spx": "GPU-466450b96fbde849", + "GPU-466450b96fbde849": "GPU-466450b96fbde849", + "GPU-466450b96fbde849#0": "GPU-466450b96fbde849#0", + "8eff74b5-0000-1000-801b-b56457addd1b": "8eff74b5-0000-1000-801b-b56457addd1b", + } { + if got := stripPartitionModeSuffix(id); got != want { + t.Errorf("stripPartitionModeSuffix(%q) = %q, want %q", id, got, want) + } + } +} + +func TestHardKubeletDeviceID(t *testing.T) { + xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + if got := hardKubeletDeviceID("amdgpu_xcp_30", xcp); got != "amdgpu_xcp_30#cpx" { + t.Errorf("hardKubeletDeviceID(xcp) = %q", got) + } + if got := hardKubeletDeviceID("0000:75:00.0", map[string]interface{}{}); got != "" { + t.Errorf("hardKubeletDeviceID(whole) = %q, want empty", got) + } +} + +// hasAMDGPU mirrors the amdgpu package gate: real hardware required. +func hasAMDGPU() bool { + vendorFiles, _ := filepath.Glob("/sys/class/drm/card[0-9]*/device/vendor") + for _, vendorFile := range vendorFiles { + b, err := os.ReadFile(vendorFile) + if err == nil && strings.TrimSpace(string(b)) == "0x1002" { + return true + } + } + return false +} + +func TestRocmModeRegistrationOnHardware(t *testing.T) { + if !hasAMDGPU() { + t.Skip("no AMD GPU on this machine") + } + p := &AMDGPUPlugin{} + devices := p.getAPIDevices() + if len(devices) == 0 { + t.Fatal("rocm mode registered no devices on a machine with an AMD GPU") + } + for _, d := range devices { + if d.ID == "" { + t.Errorf("device with empty ID: %+v", d) + } + if d.Mode != "" { + t.Errorf("rocm mode device %s has Mode=%q, want empty", d.ID, d.Mode) + } + if d.Count != defaultSplitCount { + t.Errorf("device %s Count=%d, want %d", d.ID, d.Count, defaultSplitCount) + } + t.Logf("registered: %s (count=%d, CUs=%d, mem=%dMiB, type=%s)", d.ID, d.Count, d.Devcore, d.Devmem, d.Type) + } +} + +type amdsmiGolden struct { + UUID string `json:"uuid"` + Type string `json:"type"` +} + +func loadAmdsmiGolden(t *testing.T, path string) map[string]amdsmiGolden { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + golden := map[string]amdsmiGolden{} + if err := json.Unmarshal(b, &golden); err != nil { + t.Fatal(err) + } + return golden +} + +// flexibleInt tolerates the amd-smi JSON quirk of "" for header fields on +// resource-only rows. +type flexibleInt int + +func (f *flexibleInt) UnmarshalJSON(b []byte) error { + s := strings.Trim(string(b), `"`) + if s == "" { + *f = 0 + return nil + } + v, err := strconv.Atoi(s) + *f = flexibleInt(v) + return err +} + +// loadPartitionProfilesGolden parses a raw amd-smi partition -g capture into +// PartitionProfile. Profile rows carry the header fields; the following rows +// only detail other resource types (DECODER/DMA/JPEG) and are skipped. +func loadPartitionProfilesGolden(t *testing.T, path string) []amdgpu.PartitionProfile { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var raw struct { + PartitionProfiles []struct { + ProfileIndex flexibleInt `json:"profile_index"` + MemoryCaps string `json:"memory_partition_caps"` + AcceleratorType string `json:"accelerator_type"` + NumPartitions flexibleInt `json:"num_partitions"` + ResourceType string `json:"resource_type"` + ResourceInstances flexibleInt `json:"resource_instances"` + } `json:"partition_profiles"` + } + if err := json.Unmarshal(b, &raw); err != nil { + t.Fatal(err) + } + profiles := []amdgpu.PartitionProfile{} + for _, row := range raw.PartitionProfiles { + if row.AcceleratorType == "" { + continue + } + profiles = append(profiles, amdgpu.PartitionProfile{ + ProfileIndex: int(row.ProfileIndex), + Type: strings.TrimSuffix(row.AcceleratorType, "*"), + MemoryCaps: row.MemoryCaps, + NumPartitions: int(row.NumPartitions), + XCCPerPartition: int(row.ResourceInstances), + }) + } + return profiles +} + +func TestPartitionProfilesFromFixture(t *testing.T) { + profiles := loadPartitionProfilesGolden(t, "../../../testdata/amdsmi-partition-g3-mi355x.json") + want := []amdgpu.PartitionProfile{ + {ProfileIndex: 0, Type: "SPX", MemoryCaps: "NPS1", NumPartitions: 1, XCCPerPartition: 8}, + {ProfileIndex: 1, Type: "DPX", MemoryCaps: "NPS1,NPS2", NumPartitions: 2, XCCPerPartition: 4}, + {ProfileIndex: 2, Type: "QPX", MemoryCaps: "NPS1", NumPartitions: 4, XCCPerPartition: 2}, + {ProfileIndex: 3, Type: "CPX", MemoryCaps: "NPS1", NumPartitions: 8, XCCPerPartition: 1}, + } + if len(profiles) != len(want) { + t.Fatalf("parsed %d profiles, want %d: %+v", len(profiles), len(want), profiles) + } + for i := range want { + if profiles[i] != want[i] { + t.Errorf("profile[%d] = %+v, want %+v", i, profiles[i], want[i]) + } + } +} + +// fixtureBDF converts the topology spelling (0000:75:00:0) to the PCI +// spelling (0000:75:00.0) used as the amdsmi fixture key. +func fixtureBDF(bdf string) string { + if i := strings.LastIndex(bdf, ":"); i >= 0 { + return bdf[:i] + "." + bdf[i+1:] + } + return bdf +} + +// loadMemoryPartitionGolden reads the raw amd-smi partition -m capture; the +// file is gpu_id-keyed, so it can only confirm uniformity, not per-BDF values. +func loadMemoryPartitionGolden(t *testing.T, path string) []string { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var raw struct { + MemoryPartition []struct { + GPUID int `json:"gpu_id"` + Current string `json:"current_memory_partition"` + } `json:"memory_partition"` + } + if err := json.Unmarshal(b, &raw); err != nil { + t.Fatal(err) + } + parts := make([]string, len(raw.MemoryPartition)) + for _, g := range raw.MemoryPartition { + parts[g.GPUID] = strings.ToLower(g.Current) + } + return parts +} + +// TestRegistrationFromFixture drives the full registration flow against the +// captured MI355X sysfs tree (kernel 6.8.0-136) with an injected AMD SMI +// golden, so it runs on machines without GPUs or AMD SMI. On this kernel the +// XCP render minors are absent from KFD topology, so discovery yields only +// the 8 whole-GPU entries. cu mode registers them as soft devices (Count 10, +// unsuffixed); partition mode registers one hard #spx device per GPU +// (Count 1). XCP partition registration on this kernel is impossible by +// construction; it appears on kernels whose KFD topology exposes XCP nodes. +func TestRegistrationFromFixture(t *testing.T) { + root := "../../../testdata/sysfs-mi355x-spx/sys" + golden := loadAmdsmiGolden(t, "../../../testdata/amdsmi-mi355x.json") + memoryPartitions := loadMemoryPartitionGolden(t, "../../../testdata/amdsmi-partition-m-mi355x.json") + for i, partition := range memoryPartitions { + if partition != "nps1" { + t.Fatalf("fixture GPU %d memory partition %q, want nps1", i, partition) + } + } + profiles := loadPartitionProfilesGolden(t, "../../../testdata/amdsmi-partition-g3-mi355x.json") + profileBDFs := map[string]bool{} + + newPlugin := func(mode string) *AMDGPUPlugin { + p := NewAMDGPUPlugin( + WithSysfsRoot(root), + WithAmdSMI( + func(bdfs []string) (map[string]string, error) { + uuidByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + uuidByBDF[bdf] = entry.UUID + } + } + return uuidByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + namesByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + namesByBDF[bdf] = entry.Type + } + } + return namesByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + partitionsByBDF := map[string]string{} + for _, bdf := range bdfs { + partitionsByBDF[bdf] = memoryPartitions[0] + } + return partitionsByBDF, nil + }, + ), + WithAMDSPartitionProfiles(func(bdfs []string) (map[string][]amdgpu.PartitionProfile, error) { + profilesByBDF := map[string][]amdgpu.PartitionProfile{} + for _, bdf := range bdfs { + profileBDFs[bdf] = true + profilesByBDF[bdf] = profiles + } + return profilesByBDF, nil + }), + ) + p.operatingMode = mode + return p + } + + cu := newPlugin("cu") + cuDevices := cu.getAPIDevices() + if len(cuDevices) != 8 { + t.Fatalf("cu mode: registered %d devices, want 8: %+v", len(cuDevices), cuDevices) + } + for _, d := range cuDevices { + if d.Count != defaultSplitCount || d.Mode != "" || strings.Contains(d.ID, "#") { + t.Fatalf("cu mode device = %+v, want Count=%d, Mode empty, unsuffixed ID", d, defaultSplitCount) + } + } + + partition := newPlugin("partition") + partitionDevices := partition.getAPIDevices() + if len(partitionDevices) != 8 { + t.Fatalf("partition mode: registered %d devices, want 8: %+v", len(partitionDevices), partitionDevices) + } + for _, d := range partitionDevices { + if d.Count != 1 || d.Mode != "spx" || !strings.HasSuffix(d.ID, "#spx") { + t.Fatalf("partition mode device = %+v, want Count=1, Mode=spx, #spx ID", d) + } + } + + for key, deviceData := range cu.AMDGPUs { + if strings.HasPrefix(key, "amdgpu_xcp_") { + t.Error("XCP entries must not reach registration on this kernel") + } + if cpt, _ := deviceData["computePartitionType"].(string); cpt != "spx" { + t.Errorf("%s: computePartitionType %q, want spx", key, cpt) + } + if mpt, _ := deviceData["memoryPartitionType"].(string); mpt != "nps1" { + t.Errorf("%s: memoryPartitionType %q, want nps1 from amd-smi", key, mpt) + } + } + if len(profileBDFs) != 8 { + t.Errorf("partition-profile lookup consulted %d BDFs, want 8: %v", len(profileBDFs), profileBDFs) + } +} + +func TestDeviceDataFromROCrUUID(t *testing.T) { + p := &AMDGPUPlugin{ + AMDGPUs: map[string]map[string]interface{}{ + "amdgpu_xcp_30": {"card": 8, "renderD": 136}, + }, + rocrUUIDToTopology: map[string]string{ + "GPU-466450b96fbde849": "amdgpu_xcp_30", + }, + } + + for _, uuid := range []string{"GPU-466450b96fbde849", "GPU-466450b96fbde849#cpx"} { + device, err := p.deviceDataFromAllocationUUID(uuid, "node-a") + if err != nil { + t.Fatalf("resolve ROCr UUID %q: %v", uuid, err) + } + if device["card"] != 8 { + t.Fatalf("resolved device = %#v, want card 8", device) + } + rocrUUID, err := p.rocrUUIDFromAllocationUUID(uuid) + if err != nil { + t.Fatalf("resolve ROCr UUID %q: %v", uuid, err) + } + if rocrUUID != "GPU-466450b96fbde849" { + t.Fatalf("rocrUUID = %q, want passthrough of the partition ID", rocrUUID) + } + } +} diff --git a/internal/pkg/utils/types.go b/internal/pkg/utils/types.go index 874bc8b8..97b1aba6 100644 --- a/internal/pkg/utils/types.go +++ b/internal/pkg/utils/types.go @@ -102,17 +102,17 @@ const ( ) type DeviceInfo struct { - ID string `json:"id,omitempty"` - Index uint `json:"index,omitempty"` - Count int32 `json:"count,omitempty"` - Devmem int32 `json:"devmem,omitempty"` - Devcore int32 `json:"devcore,omitempty"` - Type string `json:"type,omitempty"` - Numa int `json:"numa,omitempty"` - Mode string `json:"mode,omitempty"` - Health bool `json:"health,omitempty"` - DeviceVendor string `json:"devicevendor,omitempty"` - CustomInfo map[string]any `json:"custominfo,omitempty"` + ID string `json:"id,omitempty"` + Index uint `json:"index,omitempty"` + Count int32 `json:"count,omitempty"` + Devmem int32 `json:"devmem,omitempty"` + Devcore int32 `json:"devcore,omitempty"` + Type string `json:"type,omitempty"` + Numa int `json:"numa,omitempty"` + Mode string `json:"mode,omitempty"` + Health bool `json:"health,omitempty"` + DeviceVendor string `json:"devicevendor,omitempty"` + CustomInfo map[string]any `json:"custominfo,omitempty"` } type ContainerDevice struct { @@ -157,7 +157,12 @@ var ( func init() { InRequestDevices = make(map[string]string) - InRequestDevices["amd"] = DeviceToAllocate + // Upstream HAMi (>= 2.9) writes the committed allocation under + // hami.io/amd-devices-allocated. The fork's own scheduler writes the same + // payload under hami.io/amd-devices-to-allocate first. Read both; the + // second key is only consulted when the first has no payload. + InRequestDevices["amd"] = DeviceAllocation + InRequestDevices["amd-pending"] = DeviceToAllocate SupportDevices = make(map[string]string) SupportDevices["amd"] = DeviceAllocation } @@ -257,4 +262,4 @@ func EncodePodDevices(checklist map[string]string, pd PodDevices) map[string]str } glog.Infof("Encoded pod Devices %s\n", res) return res -} \ No newline at end of file +} diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index d8eaeeb6..a5459bf4 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -292,13 +292,15 @@ func GetNextDeviceRequest(dtype string, p corev1.Pod) (corev1.Container, Contain klog.Infof("pod annotation decode value is %+v", pdevices) res := ContainerDevices{} - pd, ok := pdevices[dtype] - if !ok { - return corev1.Container{}, res, fmt.Errorf("device request not found") - } - for ctridx, ctrDevice := range pd { - if len(ctrDevice) > 0 { - return p.Spec.Containers[ctridx], ctrDevice, nil + for _, key := range []string{dtype, dtype + "-pending"} { + pd, ok := pdevices[key] + if !ok { + continue + } + for ctridx, ctrDevice := range pd { + if len(ctrDevice) > 0 { + return p.Spec.Containers[ctridx], ctrDevice, nil + } } } return corev1.Container{}, res, fmt.Errorf("device request not found") @@ -309,26 +311,29 @@ func EraseNextDeviceTypeFromAnnotation(dtype string, p corev1.Pod) error { if err != nil { return err } - res := PodSingleDevice{} - pd, ok := pdevices[dtype] - if !ok { - return fmt.Errorf("erase device annotation not found") - } - found := false - for _, val := range pd { - if found { - res = append(res, val) - } else { - if len(val) > 0 { - found = true - res = append(res, ContainerDevices{}) - } else { + for _, key := range []string{dtype, dtype + "-pending"} { + pd, ok := pdevices[key] + if !ok || len(pd) == 0 { + continue + } + res := PodSingleDevice{} + found := false + for _, val := range pd { + if found { res = append(res, val) + } else { + if len(val) > 0 { + found = true + res = append(res, ContainerDevices{}) + } else { + res = append(res, val) + } } } + klog.Infoln("After erase res=", res) + newannos := make(map[string]string) + newannos[InRequestDevices[key]] = EncodePodSingleDevice(res) + return PatchPodAnnotations(&p, newannos) } - klog.Infoln("After erase res=", res) - newannos := make(map[string]string) - newannos[InRequestDevices[dtype]] = EncodePodSingleDevice(res) - return PatchPodAnnotations(&p, newannos) -} \ No newline at end of file + return fmt.Errorf("erase device annotation not found") +} diff --git a/labeller.Dockerfile b/labeller.Dockerfile index 65858284..f31bf9ff 100644 --- a/labeller.Dockerfile +++ b/labeller.Dockerfile @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM docker.io/golang:1.23.6-alpine3.21 +FROM docker.io/golang:1.25.13-alpine3.23 RUN apk --no-cache add git pkgconfig build-base libdrm-dev wget RUN mkdir -p /go/src/github.com/Project-HAMi/amd-device-plugin ADD . /go/src/github.com/Project-HAMi/amd-device-plugin @@ -25,7 +25,7 @@ RUN echo "73A2, C0, AMD Radeon Pro W6900X" >> /go/src/github.com/Project-HAMi/ RUN echo "73AB, C0, AMD Radeon Pro W6800X" >> /go/src/github.com/Project-HAMi/amd-device-plugin/cmd/k8s-node-labeller/amdgpu.ids RUN echo "74BC, 00, AMD Instinct MI308X HF VF" >> /go/src/github.com/Project-HAMi/amd-device-plugin/cmd/k8s-node-labeller/amdgpu.ids -FROM alpine:3.21.3 +FROM alpine:3.23 LABEL \ org.opencontainers.image.source="https://github.com/Project-HAMi/amd-device-plugin" \ org.opencontainers.image.authors="Project-HAMi maintainers" \ diff --git a/testdata/amdsmi-mi355x.json b/testdata/amdsmi-mi355x.json new file mode 100644 index 00000000..25b9f4db --- /dev/null +++ b/testdata/amdsmi-mi355x.json @@ -0,0 +1,10 @@ +{ + "0000:05:00.0": {"uuid": "c6ff75a3-0000-1000-802a-c130ee448403", "type": "AMD Instinct MI355X"}, + "0000:15:00.0": {"uuid": "f3ff75a3-0000-1000-802c-b37ceef6feb5", "type": "AMD Instinct MI355X"}, + "0000:65:00.0": {"uuid": "8aff75a3-0000-1000-80a2-810481bf6315", "type": "AMD Instinct MI355X"}, + "0000:75:00.0": {"uuid": "08ff75a3-0000-1000-80da-82c12ef81b5d", "type": "AMD Instinct MI355X"}, + "0000:85:00.0": {"uuid": "cfff75a3-0000-1000-8010-e0d8795d487e", "type": "AMD Instinct MI355X"}, + "0000:95:00.0": {"uuid": "13ff75a3-0000-1000-8003-b4d1d1d0c537", "type": "AMD Instinct MI355X"}, + "0000:e5:00.0": {"uuid": "64ff75a3-0000-1000-8002-daab8ae76e4e", "type": "AMD Instinct MI355X"}, + "0000:f5:00.0": {"uuid": "e8ff75a3-0000-1000-808f-a10fb8782ebc", "type": "AMD Instinct MI355X"} +} diff --git a/testdata/amdsmi-partition-g0-mi355x.json b/testdata/amdsmi-partition-g0-mi355x.json new file mode 100644 index 00000000..4ab0ba3f --- /dev/null +++ b/testdata/amdsmi-partition-g0-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 0, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 0, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g1-mi355x.json b/testdata/amdsmi-partition-g1-mi355x.json new file mode 100644 index 00000000..b27a5952 --- /dev/null +++ b/testdata/amdsmi-partition-g1-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 1, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 1, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g2-mi355x.json b/testdata/amdsmi-partition-g2-mi355x.json new file mode 100644 index 00000000..87d4cc7e --- /dev/null +++ b/testdata/amdsmi-partition-g2-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 2, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 2, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g3-mi355x.json b/testdata/amdsmi-partition-g3-mi355x.json new file mode 100644 index 00000000..7df265e5 --- /dev/null +++ b/testdata/amdsmi-partition-g3-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 3, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 3, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g4-mi355x.json b/testdata/amdsmi-partition-g4-mi355x.json new file mode 100644 index 00000000..35abc9b2 --- /dev/null +++ b/testdata/amdsmi-partition-g4-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 4, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 4, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g5-mi355x.json b/testdata/amdsmi-partition-g5-mi355x.json new file mode 100644 index 00000000..ca677a09 --- /dev/null +++ b/testdata/amdsmi-partition-g5-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 5, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 5, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g6-mi355x.json b/testdata/amdsmi-partition-g6-mi355x.json new file mode 100644 index 00000000..18131e3d --- /dev/null +++ b/testdata/amdsmi-partition-g6-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 6, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 6, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g7-mi355x.json b/testdata/amdsmi-partition-g7-mi355x.json new file mode 100644 index 00000000..c93bbbee --- /dev/null +++ b/testdata/amdsmi-partition-g7-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 7, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 7, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-m-mi355x.json b/testdata/amdsmi-partition-m-mi355x.json new file mode 100644 index 00000000..16e1d1de --- /dev/null +++ b/testdata/amdsmi-partition-m-mi355x.json @@ -0,0 +1,44 @@ +{ + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ] +} diff --git a/testdata/amdsmi-partition-mi355x.json b/testdata/amdsmi-partition-mi355x.json new file mode 100644 index 00000000..b5ce2d5d --- /dev/null +++ b/testdata/amdsmi-partition-mi355x.json @@ -0,0 +1,2538 @@ +{ + "current_partition": [ + { + "gpu_id": 0, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 1, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 2, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 3, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 4, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 5, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 6, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 7, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 0, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 1, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 2, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 3, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 4, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 5, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 6, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 7, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-static-mi355x.json b/testdata/amdsmi-static-mi355x.json new file mode 100644 index 00000000..efae3a97 --- /dev/null +++ b/testdata/amdsmi-static-mi355x.json @@ -0,0 +1,2400 @@ +{ + "gpu_data": [ + { + "gpu": 0, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xC62AC130EE448403", + "oam_id": 6, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:05:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011231", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 1, + "affinity": 1, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "16-31" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "144-159" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "102 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 1, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xF32CB37CEEF6FEB5", + "oam_id": 7, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:15:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000244", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 2, + "affinity": 2, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "32-47" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "160-175" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "101 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 2, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x8AA2810481BF6315", + "oam_id": 5, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:65:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524014648", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 3, + "affinity": 3, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "48-63" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "176-191" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "95 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 3, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x08DA82C12EF81B5D", + "oam_id": 4, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:75:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525001464", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 0, + "affinity": 0, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "0-15" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "128-143" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "94 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 4, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xCF10E0D8795D487E", + "oam_id": 2, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:85:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011384", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 5, + "affinity": 5, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "80-95" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "208-223" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "115 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 5, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x1303B4D1D1D0C537", + "oam_id": 3, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:95:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000354", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 6, + "affinity": 6, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "96-111" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "224-239" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "96 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 6, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x6402DAAB8AE76E4E", + "oam_id": 1, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:e5:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011434", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 7, + "affinity": 7, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "112-127" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "240-255" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "105 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "41 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 7, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xE88FA10FB8782EBC", + "oam_id": 0, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:f5:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000358", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 4, + "affinity": 4, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "64-79" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "192-207" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "95 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + } + ] +} diff --git a/testdata/amdsmi-topology-mi355x.json b/testdata/amdsmi-topology-mi355x.json new file mode 100644 index 00000000..79b77684 --- /dev/null +++ b/testdata/amdsmi-topology-mi355x.json @@ -0,0 +1,882 @@ +[ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + } + ] + } +] diff --git a/testdata/amdsmi-xgmi-mi355x.json b/testdata/amdsmi-xgmi-mi355x.json new file mode 100644 index 00000000..a9ac1e81 --- /dev/null +++ b/testdata/amdsmi-xgmi-mi355x.json @@ -0,0 +1,976 @@ +{ + "xgmi_metric": [ + [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 17933, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 17936, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35721, + "unit": "KB" + }, + "write": { + "value": 17853, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17926, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17929, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17930, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35856, + "unit": "KB" + }, + "write": { + "value": 17929, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17837, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17932, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 35881, + "unit": "KB" + }, + "write": { + "value": 17947, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17935, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35880, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17870, + "unit": "KB" + }, + "write": { + "value": 17874, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17939, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 35867, + "unit": "KB" + }, + "write": { + "value": 17923, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 17939, + "unit": "KB" + }, + "write": { + "value": 17945, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 17935, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35866, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17944, + "unit": "KB" + }, + "write": { + "value": 17934, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17870, + "unit": "KB" + }, + "write": { + "value": 17871, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17861, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17928, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 35846, + "unit": "KB" + }, + "write": { + "value": 17945, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17842, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17938, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17930, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17929, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17870, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17944, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17923, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17930, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17932, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17870, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17921, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17953, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 35880, + "unit": "KB" + }, + "write": { + "value": 17932, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": "N/A", + "write": "N/A" + } + ] + } + } + ] + ], + "link_status": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + } + ] +} diff --git a/testdata/sysfs-mi355x-spx/README.md b/testdata/sysfs-mi355x-spx/README.md new file mode 100644 index 00000000..1eff3652 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/README.md @@ -0,0 +1,36 @@ +Captured from nodepool-gpu-7b3016af2911 (144.202.57.22), kernel 6.8.0-136-generic, +8x AMD Instinct MI355X (gfx950, device_id 0x75a3) in SPX/NPS1, kubelet +device-plugin daemonset on 2026-08-19. + +Mirrors the /sys layout the plugin reads: + +- sys/class/kfd/kfd/topology/nodes/*/properties: KFD topology, trimmed to the + nodes/*/properties files the discovery code parses (drm_render_minor, + location_id, unique_id). +- sys/module/amdgpu/drivers/pci:amdgpu//: one dir per whole GPU with the + compute/memory partition state and the drm entry names (card, controlD, + renderD placeholders). +- sys/devices/platform/amdgpu_xcp_*/: 56 XCD devices (7 per GPU), each with + uevent, modalias and its drm card/renderD names. On this kernel the XCP + render minors are absent from KFD topology, so discovery skips them. + +Sibling fixtures with the same node's data: + +- amdsmi-mi355x.json: AMD SMI UUIDs and market names for the 8 BDFs (UUIDs + from the node register annotation, market names from amd-smi static). +- amdsmi-static-mi355x.json: raw `amd-smi static --json` output (asic serial, + vram, clocks, RAS, xgmi links). +- amdsmi-xgmi-mi355x.json: raw `amd-smi xgmi --json` output (per-GPU xGMI + link metrics). +- amdsmi-topology-mi355x.json: raw `amd-smi topology --json` output (per-GPU + link matrix with weights, hops, bandwidth and coherence). +- amdsmi-partition-mi355x.json: raw `amd-smi partition --json` output + (current memory/compute partition per GPU, partition profiles and resources). +- amdsmi-partition-m-mi355x.json: raw `amd-smi partition -m --json` output + (per-GPU memory partition capabilities and current setting). +- amdsmi-partition-g0..g7-mi355x.json: raw `amd-smi partition -g --json` + output, one file per GPU. Identical except gpu_id: 4 profiles (SPX, DPX, + QPX, CPX) with per-profile partition counts, XCC instances and other + resource instances. amd-smi GPU IDs follow the sorted BDF order (ID 0 = + 0000:05:00.0 ... ID 7 = 0000:f5:00.0), same order the plugin sorts topology + keys. diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties new file mode 100644 index 00000000..c40e455d Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties new file mode 100644 index 00000000..5c60c582 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties new file mode 100644 index 00000000..46e7c0e8 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties new file mode 100644 index 00000000..a01e00dd Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/12/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/12/properties new file mode 100644 index 00000000..a983ff99 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/12/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties new file mode 100644 index 00000000..f4c7095d Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties new file mode 100644 index 00000000..898a3fe7 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties new file mode 100644 index 00000000..618f4eec Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties new file mode 100644 index 00000000..959b6ab0 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties new file mode 100644 index 00000000..56653faf Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties new file mode 100644 index 00000000..840b6fca Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties new file mode 100644 index 00000000..cbe29a13 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties new file mode 100644 index 00000000..1db7703e Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/7/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/7/properties new file mode 100644 index 00000000..d46c9108 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/7/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties new file mode 100644 index 00000000..eaa8f585 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties new file mode 100644 index 00000000..70f046f9 Binary files /dev/null and b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties differ diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/card2 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/card2 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/renderD129 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/renderD129 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias new file mode 100644 index 00000000..7f8019c3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_0 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent new file mode 100644 index 00000000..e569a6ff --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_0 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/card3 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/card3 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/renderD130 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/renderD130 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias new file mode 100644 index 00000000..2b514268 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_1 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent new file mode 100644 index 00000000..f06a40e9 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_1 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/card13 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/card13 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/renderD140 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/renderD140 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias new file mode 100644 index 00000000..e93b1e4e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_10 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent new file mode 100644 index 00000000..ba344bc9 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_10 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/card14 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/card14 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/renderD141 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/renderD141 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias new file mode 100644 index 00000000..0cb77f07 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_11 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent new file mode 100644 index 00000000..4bc6ad7e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_11 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/card15 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/card15 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/renderD142 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/renderD142 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias new file mode 100644 index 00000000..fd2f0e13 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_12 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent new file mode 100644 index 00000000..8508841a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_12 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/card16 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/card16 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/renderD143 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/renderD143 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias new file mode 100644 index 00000000..31808b11 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_13 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent new file mode 100644 index 00000000..14decb5f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_13 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/card18 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/card18 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/renderD145 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/renderD145 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias new file mode 100644 index 00000000..191a269e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_14 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent new file mode 100644 index 00000000..197b0ad7 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_14 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/card19 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/card19 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/renderD146 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/renderD146 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias new file mode 100644 index 00000000..04f9f8c1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_15 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent new file mode 100644 index 00000000..3e899b1a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_15 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/card20 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/card20 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/renderD147 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/renderD147 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias new file mode 100644 index 00000000..f3683aac --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_16 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent new file mode 100644 index 00000000..13f01b7d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_16 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/card21 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/card21 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/renderD148 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/renderD148 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias new file mode 100644 index 00000000..e0223436 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_17 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent new file mode 100644 index 00000000..2f66a86f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_17 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/card22 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/card22 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/renderD149 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/renderD149 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias new file mode 100644 index 00000000..a1418969 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_18 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent new file mode 100644 index 00000000..3365d032 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_18 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/card23 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/card23 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/renderD150 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/renderD150 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias new file mode 100644 index 00000000..32762592 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_19 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent new file mode 100644 index 00000000..d496da5a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_19 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/card4 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/card4 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/renderD131 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/renderD131 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias new file mode 100644 index 00000000..90124db4 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_2 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent new file mode 100644 index 00000000..7fd17f88 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_2 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/card24 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/card24 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/renderD151 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/renderD151 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias new file mode 100644 index 00000000..e2221537 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_20 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent new file mode 100644 index 00000000..4c29a858 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_20 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/card26 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/card26 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/renderD153 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/renderD153 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias new file mode 100644 index 00000000..a454716f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_21 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent new file mode 100644 index 00000000..b2f689ea --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_21 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/card27 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/card27 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/renderD154 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/renderD154 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias new file mode 100644 index 00000000..ca885797 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_22 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent new file mode 100644 index 00000000..7fb0cfe8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_22 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/card28 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/card28 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/renderD155 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/renderD155 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias new file mode 100644 index 00000000..7375599e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_23 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent new file mode 100644 index 00000000..03fd5dd8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_23 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/card29 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/card29 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/renderD156 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/renderD156 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias new file mode 100644 index 00000000..8f77723f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_24 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent new file mode 100644 index 00000000..63c1d498 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_24 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/card30 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/card30 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/renderD157 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/renderD157 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias new file mode 100644 index 00000000..5d5ae6fe --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_25 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent new file mode 100644 index 00000000..e6c8f8ff --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_25 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/card31 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/card31 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/renderD158 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/renderD158 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias new file mode 100644 index 00000000..799f53ce --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_26 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent new file mode 100644 index 00000000..45afd1a7 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_26 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/card32 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/card32 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/renderD159 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/renderD159 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias new file mode 100644 index 00000000..b2919d0b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_27 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent new file mode 100644 index 00000000..a4b42c68 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_27 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/card34 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/card34 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/renderD161 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/renderD161 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias new file mode 100644 index 00000000..a2d8201d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_28 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent new file mode 100644 index 00000000..8ea851a0 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_28 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/card35 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/card35 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/renderD162 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/renderD162 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias new file mode 100644 index 00000000..be5f57ae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_29 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent new file mode 100644 index 00000000..91494426 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_29 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/card5 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/card5 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/renderD132 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/renderD132 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias new file mode 100644 index 00000000..dca702df --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_3 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent new file mode 100644 index 00000000..91b40a0a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_3 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/card36 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/card36 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/renderD163 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/renderD163 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias new file mode 100644 index 00000000..e75282af --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_30 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent new file mode 100644 index 00000000..d212323b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_30 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/card37 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/card37 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/renderD164 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/renderD164 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias new file mode 100644 index 00000000..917f649c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_31 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent new file mode 100644 index 00000000..605d2272 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_31 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/card38 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/card38 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/renderD165 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/renderD165 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias new file mode 100644 index 00000000..2635db15 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_32 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent new file mode 100644 index 00000000..425474a2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_32 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/card39 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/card39 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/renderD166 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/renderD166 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias new file mode 100644 index 00000000..e62bd731 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_33 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent new file mode 100644 index 00000000..994aeede --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_33 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/card40 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/card40 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/renderD167 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/renderD167 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias new file mode 100644 index 00000000..c7fd3e31 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_34 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent new file mode 100644 index 00000000..9190fb47 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_34 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/card42 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/card42 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/renderD169 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/renderD169 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias new file mode 100644 index 00000000..fa48c831 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_35 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent new file mode 100644 index 00000000..639c2e7c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_35 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/card43 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/card43 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/renderD170 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/renderD170 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias new file mode 100644 index 00000000..6bbba2e6 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_36 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent new file mode 100644 index 00000000..09606724 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_36 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/card44 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/card44 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/renderD171 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/renderD171 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias new file mode 100644 index 00000000..1aa8bd8c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_37 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent new file mode 100644 index 00000000..e93514f1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_37 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/card45 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/card45 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/renderD172 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/renderD172 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias new file mode 100644 index 00000000..bfb2ac37 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_38 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent new file mode 100644 index 00000000..a7552a4b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_38 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/card46 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/card46 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/renderD173 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/renderD173 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias new file mode 100644 index 00000000..aa263bc8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_39 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent new file mode 100644 index 00000000..0e498cb5 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_39 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/card6 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/card6 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/renderD133 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/renderD133 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias new file mode 100644 index 00000000..569e7edc --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_4 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent new file mode 100644 index 00000000..ed56a94a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_4 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/card47 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/card47 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/renderD174 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/renderD174 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias new file mode 100644 index 00000000..2b6a7b65 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_40 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent new file mode 100644 index 00000000..c5319378 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_40 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/card48 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/card48 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/renderD175 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/renderD175 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias new file mode 100644 index 00000000..55703a19 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_41 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent new file mode 100644 index 00000000..46194321 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_41 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/card50 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/card50 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/renderD177 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/renderD177 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias new file mode 100644 index 00000000..732fe641 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_42 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent new file mode 100644 index 00000000..7c3c7e2d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_42 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/card51 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/card51 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/renderD178 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/renderD178 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias new file mode 100644 index 00000000..295e83bf --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_43 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent new file mode 100644 index 00000000..720bf722 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_43 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/card52 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/card52 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/renderD179 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/renderD179 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias new file mode 100644 index 00000000..f2138962 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_44 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent new file mode 100644 index 00000000..ec1c42db --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_44 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/card53 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/card53 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/renderD180 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/renderD180 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias new file mode 100644 index 00000000..a9058e80 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_45 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent new file mode 100644 index 00000000..87c865ed --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_45 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/card54 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/card54 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/renderD181 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/renderD181 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias new file mode 100644 index 00000000..4d6fe0c2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_46 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent new file mode 100644 index 00000000..76a57a94 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_46 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/card55 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/card55 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/renderD182 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/renderD182 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias new file mode 100644 index 00000000..fe27fe90 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_47 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent new file mode 100644 index 00000000..f04b194e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_47 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/card56 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/card56 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/renderD183 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/renderD183 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias new file mode 100644 index 00000000..7163091c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_48 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent new file mode 100644 index 00000000..3a413fb2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_48 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/card58 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/card58 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/renderD185 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/renderD185 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias new file mode 100644 index 00000000..29db1033 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_49 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent new file mode 100644 index 00000000..553387e8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_49 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/card7 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/card7 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/renderD134 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/renderD134 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias new file mode 100644 index 00000000..2c505964 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_5 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent new file mode 100644 index 00000000..55bc239d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_5 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/card59 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/card59 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/renderD186 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/renderD186 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias new file mode 100644 index 00000000..551cb5f3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_50 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent new file mode 100644 index 00000000..b0083457 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_50 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/card60 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/card60 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/renderD187 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/renderD187 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias new file mode 100644 index 00000000..7fe63fcd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_51 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent new file mode 100644 index 00000000..34f49073 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_51 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/card61 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/card61 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/renderD188 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/renderD188 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias new file mode 100644 index 00000000..2a23629a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_52 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent new file mode 100644 index 00000000..06a210f2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_52 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/card62 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/card62 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/renderD189 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/renderD189 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias new file mode 100644 index 00000000..1f3771d3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_53 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent new file mode 100644 index 00000000..a1d17002 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_53 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/card63 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/card63 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/renderD190 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/renderD190 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias new file mode 100644 index 00000000..46f5ff15 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_54 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent new file mode 100644 index 00000000..ccdd026f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_54 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/card192 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/card192 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/renderD191 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/renderD191 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias new file mode 100644 index 00000000..e8cd2348 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_55 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent new file mode 100644 index 00000000..64207169 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_55 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/card8 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/card8 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/renderD135 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/renderD135 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias new file mode 100644 index 00000000..d432ac5f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_6 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent new file mode 100644 index 00000000..db26aa78 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_6 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/card10 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/card10 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/renderD137 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/renderD137 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias new file mode 100644 index 00000000..a1aea587 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_7 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent new file mode 100644 index 00000000..96815496 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_7 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/card11 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/card11 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/renderD138 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/renderD138 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias new file mode 100644 index 00000000..1b917441 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_8 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent new file mode 100644 index 00000000..683f7105 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_8 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/card12 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/card12 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/renderD139 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/renderD139 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias new file mode 100644 index 00000000..c97c489b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_9 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent new file mode 100644 index 00000000..469085fd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_9 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/card9 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/card9 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/controlD73 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/controlD73 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/renderD136 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/renderD136 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node @@ -0,0 +1 @@ +1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/card25 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/card25 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/controlD89 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/controlD89 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/renderD152 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/renderD152 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node new file mode 100644 index 00000000..0cfbf088 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node @@ -0,0 +1 @@ +2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/card17 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/card17 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/controlD81 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/controlD81 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/renderD144 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/renderD144 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node new file mode 100644 index 00000000..00750edc --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node @@ -0,0 +1 @@ +3 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/card1 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/card1 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/controlD65 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/controlD65 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/renderD128 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/renderD128 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node @@ -0,0 +1 @@ +0 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/card41 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/card41 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/controlD105 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/controlD105 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/renderD168 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/renderD168 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node new file mode 100644 index 00000000..7ed6ff82 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node @@ -0,0 +1 @@ +5 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/card57 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/card57 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/controlD121 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/controlD121 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/renderD184 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/renderD184 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node new file mode 100644 index 00000000..1e8b3149 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node @@ -0,0 +1 @@ +6 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/card49 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/card49 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/controlD113 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/controlD113 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/renderD176 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/renderD176 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node new file mode 100644 index 00000000..7f8f011e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node @@ -0,0 +1 @@ +7 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/card33 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/card33 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/controlD97 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/controlD97 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/renderD160 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/renderD160 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node new file mode 100644 index 00000000..b8626c4c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node @@ -0,0 +1 @@ +4