(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, cpu_addr=None)
| 746 | self.queue_event_arr_ptr = ctypes.addressof(self.queue_event_arr) |
| 747 | |
| 748 | def alloc(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, cpu_addr=None) -> HCQBuffer: |
| 749 | flags = kfd.KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE | kfd.KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE | kfd.KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE |
| 750 | |
| 751 | if uncached: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_COHERENT | kfd.KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED | kfd.KFD_IOC_ALLOC_MEM_FLAGS_GTT |
| 752 | else: flags |= (kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR if host else kfd.KFD_IOC_ALLOC_MEM_FLAGS_VRAM) |
| 753 | |
| 754 | # Make mapped cpu address to be uncachable |
| 755 | if cpu_addr is not None: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_COHERENT | kfd.KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED |
| 756 | |
| 757 | if cpu_access or host: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC |
| 758 | |
| 759 | if flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR: |
| 760 | buf = addr = cpu_addr or FileIOInterface.anon_mmap(0, size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | mmap.MAP_ANONYMOUS, 0) |
| 761 | else: buf, addr = 0, FileIOInterface.anon_mmap(0, size, 0, mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS | MAP_NORESERVE, 0) |
| 762 | |
| 763 | try: mem = kfd.AMDKFD_IOC_ALLOC_MEMORY_OF_GPU(self.kfd, va_addr=addr, size=size, gpu_id=self.gpu_id, flags=flags, mmap_offset=buf) |
| 764 | except OSError as e: |
| 765 | if e.errno == errno.EINVAL and (flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_VRAM) and cpu_access: |
| 766 | raise MemoryError("Cannot allocate host-visible VRAM. Ensure the resizable BAR option is enabled on your system.") from e |
| 767 | if e.errno == errno.ENOMEM: raise MemoryError(f"Cannot allocate {size} bytes: no memory is available.") from e |
| 768 | raise |
| 769 | |
| 770 | if not (flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR): |
| 771 | buf = self.drm_fd.mmap(mem.va_addr, mem.size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | MAP_FIXED, mem.mmap_offset) |
| 772 | assert addr == buf == mem.va_addr |
| 773 | |
| 774 | view = MMIOInterface(mem.va_addr, mem.size, fmt='B') if cpu_access or host else None |
| 775 | self.map(hcqbuf:=HCQBuffer(mem.va_addr, mem.size, meta=mem, view=view, owner=self.dev)) |
| 776 | return hcqbuf |
| 777 | |
| 778 | def free(self, mem): |
| 779 | gpus = (ctypes.c_int32 * 1)(self.gpu_id) |
no test coverage detected