MCPcopy
hub / github.com/tinygrad/tinygrad / alloc

Method alloc

tinygrad/runtime/ops_amd.py:748–776  ·  view source on GitHub ↗
(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, cpu_addr=None)

Source from the content-addressed store, hash-verified

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)

Callers 11

__init__Method · 0.95
mapMethod · 0.95
bindMethod · 0.45
bindMethod · 0.45
_submitMethod · 0.45
bindMethod · 0.45
__init__Method · 0.45
_allocMethod · 0.45
allocMethod · 0.45
__init__Method · 0.45
create_queueMethod · 0.45

Calls 5

mapMethod · 0.95
MMIOInterfaceClass · 0.90
HCQBufferClass · 0.90
anon_mmapMethod · 0.45
mmapMethod · 0.45

Tested by

no test coverage detected