diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 566239c826..f0968522fa 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -187,13 +187,13 @@ jobs: PYTHONPATH=. ./extra/hcq/hcq_smi.py amd kill_pids PYTHONPATH=. ./extra/hcq/hcq_smi.py nv kill_pids - name: UsbGPU boot time - run: sudo -E PYTHONPATH=. DEBUG=2 AM_RESET=1 AMD=1 AMD_IFACE=USB time python3.11 test/test_tiny.py TestTiny.test_plus + run: sudo -E PYTHONPATH=. GMMU=0 DEBUG=2 AM_RESET=1 AMD=1 AMD_IFACE=USB time python3.11 test/test_tiny.py TestTiny.test_plus - name: UsbGPU tiny tests - run: sudo -E PYTHONPATH=. AMD=1 AMD_IFACE=USB python3.11 test/test_tiny.py + run: sudo -E PYTHONPATH=. GMMU=0 AMD=1 AMD_IFACE=USB python3.11 test/test_tiny.py - name: UsbGPU copy speeds - run: sudo -E PYTHONPATH=. AMD=1 AMD_IFACE=USB python3.11 test/external/external_test_usb_asm24.py TestDevCopySpeeds + run: sudo -E PYTHONPATH=. GMMU=0 AMD=1 AMD_IFACE=USB python3.11 test/external/external_test_usb_asm24.py TestDevCopySpeeds #- name: UsbGPU openpilot test - # run: sudo -E PYTHONPATH=. AMD=1 AMD_IFACE=USB GRAPH_ONE_KERNEL=1 python3.11 examples/openpilot/compile3.py https://github.com/commaai/openpilot/raw/9118973ed03c1ae1d40cf69a29507ec2cc78efd7/selfdrive/modeld/models/supercombo.onnx + # run: sudo -E PYTHONPATH=. GMMU=0 AMD=1 AMD_IFACE=USB GRAPH_ONE_KERNEL=1 python3.11 examples/openpilot/compile3.py https://github.com/commaai/openpilot/raw/9118973ed03c1ae1d40cf69a29507ec2cc78efd7/selfdrive/modeld/models/supercombo.onnx - name: UsbGPU (USB4/TB) boot time run: PYTHONPATH=. DEBUG=3 NV=1 NV_IFACE=PCI NV_NAK=1 time python3.11 test/test_tiny.py TestTiny.test_plus - name: UsbGPU (USB4/TB) tiny tests @@ -638,9 +638,9 @@ jobs: echo "CACHEDB=/tmp/staging.db" >> $GITHUB_ENV rm -f /tmp/staging.db /tmp/staging.db-shm /tmp/staging.db-wal - name: openpilot compile3 0.10.1 driving_vision - run: BENCHMARK_LOG=usbgpu_openpilot_0_10_1_vision PYTHONPATH="." DEV=AMD AMD_LLVM=1 AMD_IFACE=USB ASSERT_MIN_STEP_TIME=50 python3 examples/openpilot/compile3.py https://github.com/commaai/openpilot/raw/720392c9a5b986981fdbed1bb8c47a6c5573a50e/selfdrive/modeld/models/driving_vision.onnx + run: BENCHMARK_LOG=usbgpu_openpilot_0_10_1_vision PYTHONPATH="." GMMU=0 DEV=AMD AMD_LLVM=1 AMD_IFACE=USB ASSERT_MIN_STEP_TIME=50 python3 examples/openpilot/compile3.py https://github.com/commaai/openpilot/raw/720392c9a5b986981fdbed1bb8c47a6c5573a50e/selfdrive/modeld/models/driving_vision.onnx - name: openpilot load_pickle 0.10.1 driving_vision - run: BENCHMARK_LOG=usbgpu_openpilot_0_10_1_vision_load_pickle PYTHONPATH="." DEV=AMD AMD_IFACE=USB ASSERT_MIN_LOAD_TIME=15 python3 examples/openpilot/load_pickle.py + run: BENCHMARK_LOG=usbgpu_openpilot_0_10_1_vision_load_pickle PYTHONPATH="." GMMU=0 DEV=AMD AMD_IFACE=USB ASSERT_MIN_LOAD_TIME=15 python3 examples/openpilot/load_pickle.py testreddriverbenchmark: name: AM Benchmark diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index be1b2e27f6..7f23ea7c8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -699,7 +699,7 @@ jobs: - name: Run test_tiny on MOCKAM run: python test/test_tiny.py - name: Run test_tiny on MOCKAM USB - run: AMD_IFACE=USB python test/test_tiny.py + run: GMMU=0 AMD_IFACE=USB python test/test_tiny.py - name: Run test_hcq on MOCKAM run: python -m pytest test/device/test_hcq.py diff --git a/tinygrad/runtime/ops_amd.py b/tinygrad/runtime/ops_amd.py index 26eeb7c319..01d1fe5501 100644 --- a/tinygrad/runtime/ops_amd.py +++ b/tinygrad/runtime/ops_amd.py @@ -885,7 +885,7 @@ class PCIIface(PCIIfaceBase): class USBIface(PCIIface): def __init__(self, dev, dev_id): # pylint: disable=super-init-not-called - self.dev, self.pci_dev = dev, USBPCIDevice(dev.__class__.__name__[:2], f"usb:{dev_id}") + self.dev, self.pci_dev, self.vram_bar = dev, USBPCIDevice(dev.__class__.__name__[:2], f"usb:{dev_id}"), 0 self.dev_impl = AMDev(self.pci_dev) self._compute_props() self.pci_dev.usb._pci_cacheable += [self.pci_dev.bar_info(2)] # doorbell region is cacheable @@ -903,9 +903,8 @@ class USBIface(PCIIface): self.sys_next_off += size return self.sys_buf.offset(self.sys_next_off - size, size) - mapping = self.dev_impl.mm.valloc(size:=round_up(size, 4 << 10), uncached=uncached, contiguous=cpu_access) - barview = self.pci_dev.map_bar(bar=0, off=mapping.paddrs[0][0], size=mapping.size) if cpu_access else None - return HCQBuffer(mapping.va_addr, size, meta=PCIAllocationMeta(mapping, has_cpu_mapping=False), view=barview, owner=self.dev) + # force devmem + return super().alloc(size, host=host, uncached=uncached, cpu_access=cpu_access, contiguous=contiguous, force_devmem=True, **kwargs) def create_queue(self, queue_type, ring, gart, rptr, wptr, eop_buffer=None, cwsr_buffer=None, ctl_stack_size=0, ctx_save_restore_size=0, xcc_id=0, idx=0): diff --git a/tinygrad/runtime/support/memory.py b/tinygrad/runtime/support/memory.py index b3ef1a329e..ac7239b769 100644 --- a/tinygrad/runtime/support/memory.py +++ b/tinygrad/runtime/support/memory.py @@ -231,7 +231,16 @@ class MemoryManager: assert cls.va_allocator is not None, "must be set" return cls.va_allocator.alloc(size, max((1 << (size.bit_length() - 1)), align)) + @functools.cache # pylint: disable=method-cache-max-size-none + def identity_va(self, uncached:bool) -> int: + self.map_range(va:=self.alloc_vaddr(self.vram_size, self.vram_size), self.vram_size, [(0, self.vram_size)], AddrSpace.PHYS, uncached=uncached) + return va + def valloc(self, size:int, align=0x1000, uncached=False, contiguous=False) -> VirtMapping: + if not getenv("GMMU", 1): + paddr = self.palloc(size:=round_up(size, 0x1000), align, zero=False) + return VirtMapping(self.identity_va(uncached) + paddr, size, [(paddr, size)], aspace=AddrSpace.PHYS, uncached=uncached) + # Alloc physical memory and map it to the virtual address va = self.alloc_vaddr(size:=round_up(size, 0x1000), align) @@ -255,6 +264,8 @@ class MemoryManager: return self.map_range(va, size, paddrs, aspace=AddrSpace.PHYS, uncached=uncached) def vfree(self, vm:VirtMapping): + if not getenv("GMMU", 1): return self.pfree(vm.paddrs[0][0]) + assert self.va_allocator is not None, "must be set" self.unmap_range(vm.va_addr, vm.size) self.va_allocator.free(vm.va_addr)