mirror of
https://github.com/tinygrad/tinygrad.git
synced 2026-02-12 07:35:16 -05:00
always give BUFFER uops Buffers [pr] (#8572)
* always give BUFFER uops Buffers [pr] * add test_buffer_only_after_realize
This commit is contained in:
@@ -2229,5 +2229,49 @@ class TestTensorUOpSpec(unittest.TestCase):
|
||||
t = graph_rewrite(a.lazydata.sink(), remove_movement_ops+merge_views)
|
||||
create_schedule_with_vars(list(t.src))
|
||||
|
||||
class TestBufferUOp(unittest.TestCase):
|
||||
# BUFFER has a ShapeTracker of shape=(n,) and stride=(1,)
|
||||
def test_buffer_has_buffer(self):
|
||||
buf = Tensor.empty(10)
|
||||
self.assertIsNotNone(buf.lazydata.buffer)
|
||||
self.assertEqual(buf.lazydata.st, ShapeTracker.from_shape((10,)))
|
||||
# the device Buffer remains unallocated until it's we run the schedule
|
||||
self.assertFalse(buf.lazydata.buffer.is_allocated())
|
||||
add = buf+1
|
||||
sched = add.schedule()
|
||||
self.assertFalse(buf.lazydata.buffer.is_allocated())
|
||||
run_schedule(sched)
|
||||
self.assertTrue(buf.lazydata.buffer.is_allocated())
|
||||
|
||||
def test_buffer_has_unique_buffer(self):
|
||||
buf = Tensor.empty(10)
|
||||
buf1 = buf.lazydata.buffer
|
||||
buf2 = buf.lazydata.buffer
|
||||
self.assertIs(buf1, buf2)
|
||||
|
||||
# we also allow VIEW(BUFFER) to access the underlying device Buffer, as long as it's contiguous
|
||||
def test_buffer_view_allowed(self):
|
||||
add = Tensor.empty(1, 1)+Tensor.empty(1, 1)
|
||||
add.realize()
|
||||
self.assertIsNotNone(add.lazydata.buffer)
|
||||
self.assertEqual(add.lazydata.shape, (1, 1))
|
||||
|
||||
def test_buffer_view_not_allowed(self):
|
||||
permuted_view = Tensor.empty(1, 2, 3).permute(0, 2, 1)
|
||||
merged = graph_rewrite(permuted_view.lazydata, remove_movement_ops)
|
||||
with self.assertRaisesRegex(AssertionError, "VIEW only works here if it's contiguous"):
|
||||
merged.buffer # cannot access Buffer of a non contiguous VIEW
|
||||
|
||||
def test_buffer_only_after_realize(self):
|
||||
a = Tensor([1])+Tensor([2])
|
||||
# accessing realized will return None
|
||||
self.assertIsNone(a.lazydata.realized)
|
||||
# accessing Buffer will assert
|
||||
with self.assertRaisesRegex(AssertionError, "must be BUFFER"):
|
||||
a.lazydata.buffer # there is no BUFFER on an unrealized ADD
|
||||
# Buffer only exists once we realize it
|
||||
a.realize()
|
||||
self.assertIsNotNone(a.lazydata.buffer)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(verbosity=2)
|
||||
|
||||
Reference in New Issue
Block a user