|
| 1 | +#!/bin/bash |
| 2 | +# Launch QEMU with N CXL Type-2 accelerator contexts attached to one host VM. |
| 3 | +# Used by the Splash multi-GPU scaling sweep. |
| 4 | +# |
| 5 | +# Environment: |
| 6 | +# NUM_TYPE2 - Number of Type-2 accelerators to attach (1, 2, 4, 6, 8). |
| 7 | +# Default: 1. |
| 8 | +# QEMU_BINARY - Path to qemu-system-x86_64. |
| 9 | +# DISK_IMAGE - Path to the guest rootfs image (relative CWD). |
| 10 | +# KERNEL_IMAGE - Path to bzImage. |
| 11 | +# SSH_PORT - hostfwd guest:22 -> host:${SSH_PORT}. Default 10022. |
| 12 | +# HETGPU_BACKEND - 0 auto / 3 nvidia / 5 simulation. Default 5. |
| 13 | +# HETGPU_LIB - Path to libnvcuda.so. |
| 14 | +# CXL_TYPE2_CACHE_SIZE / CXL_TYPE2_MEM_SIZE - per-device sizes. |
| 15 | +# DIRECTORY_ENTRIES - snoop filter capacity (0 uses device default). |
| 16 | +# MONITOR_SOCK - QEMU monitor unix socket path. |
| 17 | +# VM_LOG - File to redirect serial console + stderr. |
| 18 | + |
| 19 | +set -e |
| 20 | + |
| 21 | +NUM_TYPE2=${NUM_TYPE2:-1} |
| 22 | +QEMU_BINARY=${QEMU_BINARY:-/home/victoryang00/CXLMemSim/lib/qemu/build/qemu-system-x86_64} |
| 23 | +DISK_IMAGE=${DISK_IMAGE:-qemu1.img} |
| 24 | +DISK_IMAGE_PATH=${DISK_IMAGE_PATH:-} |
| 25 | +# If no absolute path provided, default to <repo>/build/<DISK_IMAGE> which is |
| 26 | +# the canonical location, independent of the invoker's working directory. |
| 27 | +if [ -z "${DISK_IMAGE_PATH}" ]; then |
| 28 | + DISK_IMAGE_PATH="/home/victoryang00/CXLMemSim/build/${DISK_IMAGE}" |
| 29 | +fi |
| 30 | +KERNEL_IMAGE=${KERNEL_IMAGE:-/home/victoryang00/cxl/arch/x86/boot/bzImage} |
| 31 | +SSH_PORT=${SSH_PORT:-10022} |
| 32 | +HETGPU_BACKEND=${HETGPU_BACKEND:-5} |
| 33 | +HETGPU_LIB=${HETGPU_LIB:-/home/victoryang00/hetGPU/target/debug/libnvcuda.so} |
| 34 | +CXL_TYPE2_CACHE_SIZE=${CXL_TYPE2_CACHE_SIZE:-128M} |
| 35 | +CXL_TYPE2_MEM_SIZE=${CXL_TYPE2_MEM_SIZE:-4G} |
| 36 | +DIRECTORY_ENTRIES=${DIRECTORY_ENTRIES:-0} |
| 37 | +MONITOR_SOCK=${MONITOR_SOCK:-/tmp/qemu-mon.sock} |
| 38 | +VM_LOG=${VM_LOG:-/home/victoryang00/CXLMemSim/artifact/splash_sweep/vm1.log} |
| 39 | +CXL_MEMSIM_HOST=${CXL_MEMSIM_HOST:-127.0.0.1} |
| 40 | +CXL_MEMSIM_PORT=${CXL_MEMSIM_PORT:-9999} |
| 41 | + |
| 42 | +if ! [[ "$NUM_TYPE2" =~ ^[0-9]+$ ]] || [ "$NUM_TYPE2" -lt 1 ] || [ "$NUM_TYPE2" -gt 8 ]; then |
| 43 | + echo "NUM_TYPE2 must be an integer between 1 and 8" >&2 |
| 44 | + exit 1 |
| 45 | +fi |
| 46 | + |
| 47 | +RP_OPTS=() |
| 48 | +T2_OPTS=() |
| 49 | +for i in $(seq 0 $((NUM_TYPE2-1))); do |
| 50 | + PORT=$((13 + i)) |
| 51 | + RP_ID="root_port${PORT}" |
| 52 | + T2_ID="cxl-type2-hetgpu${i}" |
| 53 | + SN=$(printf "0x%x" $((0x10 + i))) |
| 54 | + RP_OPTS+=( -device "cxl-rp,port=${i},bus=cxl.1,id=${RP_ID},chassis=0,slot=${i}" ) |
| 55 | + T2_OPTS+=( -device "cxl-type2,bus=${RP_ID},cache-size=${CXL_TYPE2_CACHE_SIZE},mem-size=${CXL_TYPE2_MEM_SIZE},sn=${SN},cxlmemsim-addr=${CXL_MEMSIM_HOST},cxlmemsim-port=${CXL_MEMSIM_PORT},coherency-enabled=true,gpu-mode=2,hetgpu-lib=${HETGPU_LIB},hetgpu-device=0,hetgpu-backend=${HETGPU_BACKEND},directory-entries=${DIRECTORY_ENTRIES},id=${T2_ID}" ) |
| 56 | +done |
| 57 | + |
| 58 | +exec "${QEMU_BINARY}" \ |
| 59 | + --enable-kvm -cpu qemu64,+xsave,+rdtscp,+avx,+avx2,+sse4.1,+sse4.2,+avx512f,+avx512dq,+avx512ifma,+avx512cd,+avx512bw,+avx512vl,+avx512vbmi,+clflushopt \ |
| 60 | + -kernel "${KERNEL_IMAGE}" \ |
| 61 | + -append "root=/dev/vda rw console=ttyS0,115200 nokaslr systemd.mask=cxl-numa-setup.service" \ |
| 62 | + -netdev "user,id=net0,hostfwd=tcp::${SSH_PORT}-:22" \ |
| 63 | + -device virtio-net-pci,netdev=net0,mac=52:54:00:00:00:02 \ |
| 64 | + -device virtio-rng-pci \ |
| 65 | + -drive file="${DISK_IMAGE_PATH:-./${DISK_IMAGE}}",if=none,id=disk0,format=raw \ |
| 66 | + -device virtio-blk-pci,drive=disk0,bus=pcie.0 \ |
| 67 | + -M q35,cxl=on -m 16G,maxmem=32G,slots=8 -smp 4 \ |
| 68 | + -device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \ |
| 69 | + "${RP_OPTS[@]}" \ |
| 70 | + "${T2_OPTS[@]}" \ |
| 71 | + -monitor "unix:${MONITOR_SOCK},server,nowait" \ |
| 72 | + -D /dev/null \ |
| 73 | + -nographic > "${VM_LOG}" 2>&1 |
0 commit comments