bugfix do not reset shapetracker of 0 size lazybuffer (#3096)

it might be coming from an expand, and resetting results incorrect stride. caught by interpreted backend
This commit is contained in:
chenyu
2024-01-11 23:22:52 -05:00
committed by GitHub
parent 13e872b53f
commit 7086d77db1
3 changed files with 9 additions and 2 deletions

View File

@@ -1149,7 +1149,8 @@ class TestIndexing(unittest.TestCase):
# this isn't technically necessary, but matches NumPy stride calculations.
# TODO not too sure about this
# numpy_testing_assert_equal_helper((60, 20, 5), z.lazydata.st.real_strides())
self.assertTrue(z.lazydata.st.contiguous)
# TODO: should this be contiguous?
# self.assertTrue(z.lazydata.st.contiguous)
# TODO bool indexing
# TODO data_ptr()

View File

@@ -50,5 +50,11 @@ class TestLazyBuffer(unittest.TestCase):
b = Tensor([1, 2, 3], f"{Device.DEFAULT}:0")
assert a.device == b.device
def test_shrink_const_into_zero(self):
a = Tensor.zeros(4,4,4).shrink((None, (0,0), None))
b = Tensor.zeros(4,1,4)
c = a.cat(b, dim=1)
np.testing.assert_allclose(c.numpy(), np.concatenate((a.numpy(), b.numpy()), axis=1))
if __name__ == "__main__":
unittest.main()

View File

@@ -18,7 +18,7 @@ sys.setrecursionlimit(10000)
lazycache: Dict[Any, ReferenceType[LazyBuffer]] = {}
def create_lazybuffer(device:str, st:ShapeTracker, dtype:DType, op:Optional[Op]=None, arg:Any=None, srcs:Tuple[LazyBuffer, ...]=(),
base:Optional[LazyBuffer]=None, enable_cache=bool(getenv("LAZYCACHE", 1))):
if st.size == 0: st, op, arg, srcs, base = ShapeTracker.from_shape(st.shape), LoadOps.CONST, 0, (), None
if st.size == 0: op, arg, srcs, base = LoadOps.CONST, 0, (), None
cache_key = (device, st, dtype, op, arg, tuple(ref(x) for x in srcs)) if base is None else (st, ref(base))
if (rret := lazycache.get(cache_key, None)): return cast(LazyBuffer, rret()) # NOTE: this should always be a live reference