MCPcopy
hub / github.com/tinygrad/tinygrad / buffer

Method buffer

tinygrad/uop/ops.py:783–823  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

781
782 @property
783 def buffer(self) -> Buffer|MultiBuffer:
784 if self.op in {Ops.CONTIGUOUS, Ops.RESHAPE, Ops.DETACH, Ops.AFTER}: return self.src[0].buffer
785 # this buffer can process disk tensors and simple movement ops
786 if self is not self.base:
787 buf = self.base.buffer
788 assert isinstance(buf, Buffer), "must be a Buffer for movement ops"
789 offset = self.contiguous_view_offset()
790 if offset is None: raise RuntimeError(f"non-contiguous view is not supported for {buf.device} buffer")
791 return buf.view(prod(self.max_shape), self.dtype, offset*self.dtype.itemsize)
792 if self.op is Ops.BITCAST:
793 buf = self.src[0].buffer
794 assert isinstance(buf, Buffer), "must be a Buffer for BITCAST"
795 return buf.view(prod(self.max_shape), self.dtype, 0)
796 if self.op is Ops.BUFFER_VIEW:
797 if (cret:=buffers.get(self)) is not None: return cret
798 buf = self.src[0].buffer
799 if isinstance(buf, MultiBuffer):
800 mbuf = MultiBuffer.__new__(MultiBuffer)
801 mbuf.bufs = [b.view(self.arg[0], self.dtype, self.arg[1] * self.dtype.itemsize) for b in buf.bufs]
802 buffers[self] = mbuf
803 return mbuf
804 assert isinstance(buf, Buffer), "must be a Buffer for BUFFER_VIEW"
805 buffers[self] = bv = buf.view(self.arg[0], self.dtype, self.arg[1] * self.dtype.itemsize)
806 return bv
807 if self.op is Ops.MSELECT:
808 ret = self.src[0].buffer
809 assert isinstance(ret, MultiBuffer)
810 return ret.bufs[self.arg]
811 if self.op is Ops.MSTACK:
812 ret = MultiBuffer.__new__(MultiBuffer)
813 ret.bufs = [cast(Buffer, x.buffer) for x in self.src]
814 assert all_same([(x.size, x.dtype) for x in ret.bufs]), "multibuffers mismatch buffers"
815 return ret
816 assert self.op is Ops.BUFFER, f"must be BUFFER {self.op}"
817 assert self.src[0].op is Ops.UNIQUE, f"buffer src[0] must be UNIQUE, not {self.src[0].op}"
818 if (cret:=buffers.get(self)) is not None: return cret
819 rdtype = self.dtype if isinstance(self.dtype, ImageDType) else self.dtype.base
820 if isinstance(self.device, tuple): ret = MultiBuffer(self.device, self.arg, rdtype).ref(1)
821 else: ret = Buffer(self.device, self.arg, rdtype).ref(1)
822 buffers[self] = ret
823 return ret
824 @property
825 def realized(self) -> Buffer|MultiBuffer|None:
826 # only these can be realized

Callers

nothing calls this directly

Calls 10

prodFunction · 0.90
all_sameFunction · 0.90
MultiBufferClass · 0.90
BufferClass · 0.90
castFunction · 0.85
viewMethod · 0.45
getMethod · 0.45
__new__Method · 0.45
refMethod · 0.45

Tested by

no test coverage detected