| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- import unittest
- import time
- import numpy as np
- from tinygrad import Tensor, dtypes
- from tinygrad.engine.schedule import create_schedule
- from tinygrad.engine.realize import lower_schedule_item, run_schedule
- class TestFusionOp(unittest.TestCase):
- def test_contiguous_add(self):
- def test(contig=False):
- bt = Tensor(np.arange(16), dtype=dtypes.float32).reshape(4,4)
- x = bt.permute(1,0)
- if contig: x = x.contiguous()
- return (x.permute(1,0) + bt).data()
- assert test() == test(True)
- def test_expand_fuse(self):
- bt = Tensor(np.ones((10, 1)), dtype=dtypes.float32)
- out = (bt*2).expand(10,10).sum(1)
- sched = create_schedule([out.lazydata], None)
- run_schedule(sched)
- outd = out.tolist()
- assert all(x == 20.0 for x in outd)
- def test_recursive_add(self):
- st = time.perf_counter()
- a = Tensor([1,2,3,4])
- for _ in range(24): a = a + a
- sched = create_schedule([a.lazydata], None)
- ei = lower_schedule_item(sched[-1])
- self.assertLess(time.perf_counter()-st, 1.0)
- assert len(ei.prg.p.src.splitlines()) < 250
- def test_recursive_add_cmp(self):
- st = time.perf_counter()
- a = Tensor([1,2,3,4])
- for _ in range(24): a = a + a
- sched1 = create_schedule([a.lazydata], None)
- b = Tensor([1,2,3,4])
- for _ in range(24): b = b + b
- sched2 = create_schedule([b.lazydata], None)
- c = Tensor([1,2,3,4])
- for _ in range(23): c = c + c
- sched3 = create_schedule([c.lazydata], None)
- assert sched1[-1].ast == sched2[-1].ast
- assert sched1[-1].ast != sched3[-1].ast
- self.assertLess(time.perf_counter()-st, 1.0)
- if __name__ == '__main__':
- unittest.main(verbosity=2)
|