mirror of
https://github.com/tinygrad/tinygrad.git
synced 2026-09-05 16:46:14 +00:00
more typing work [pr] (#8345)
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
from typing import Union, Tuple
|
||||
from collections import defaultdict
|
||||
from tinygrad.engine.schedule import ScheduleItem
|
||||
from tinygrad.device import Device, Buffer
|
||||
@@ -7,7 +6,7 @@ from tinygrad.ops import Ops
|
||||
|
||||
# **************** memory planning ****************
|
||||
|
||||
def _internal_memory_planner(buffers:list[Union[list[Buffer], tuple[Buffer, ...]]], noopt_buffers=None, debug_prefix="") -> dict[Buffer, Buffer]:
|
||||
def _internal_memory_planner(buffers:list[list[Buffer]|tuple[Buffer, ...]], noopt_buffers=None, debug_prefix="") -> dict[Buffer, Buffer]:
|
||||
if NO_MEMORY_PLANNER: return {}
|
||||
first_appearance, last_appearance = {}, {}
|
||||
for i,u in enumerate(buffers):
|
||||
@@ -18,7 +17,7 @@ def _internal_memory_planner(buffers:list[Union[list[Buffer], tuple[Buffer, ...]
|
||||
|
||||
# Sort buffers by size in descending order, prioritizing largest buffers for allocation first.
|
||||
# Track free segments, each containing (start, stop, and buffer that could be reused on this segment).
|
||||
free_segs: dict[Tuple, list[tuple[int, int, Buffer]]] = defaultdict(list) # dict[buffer key, tuple[start, end, buffer to reuse on the seg]]
|
||||
free_segs: dict[tuple, list[tuple[int, int, Buffer]]] = defaultdict(list) # dict[buffer key, tuple[start, end, buffer to reuse on the seg]]
|
||||
def find_replace_buffer(buf, st, en):
|
||||
key = (buf.device, buf.dtype, buf.options) + ((buf.nbytes,) if not hasattr(Device[buf.device].allocator, "offset") else tuple())
|
||||
|
||||
|
||||
+11
-12
@@ -1,7 +1,6 @@
|
||||
import sys, atexit, functools, pickle
|
||||
from collections import defaultdict, deque
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Optional, DefaultDict
|
||||
from tinygrad.ops import GroupOp, UOp, Ops, PatternMatcher, UPat, Variable, can_pad, graph_rewrite, resolve, track_rewrites, view_left, merge_views
|
||||
from tinygrad.ops import identity_element, buffers, exec_alu
|
||||
from tinygrad.helpers import Context, Metadata, all_int, all_same, colored, diskcache_put, merge_dicts, prod, dedup, getenv, unwrap
|
||||
@@ -46,7 +45,7 @@ class ScheduleContext:
|
||||
allbufs: dict[UOp, UOp] = field(default_factory=dict) # this maps BUFFER uops the actual op
|
||||
ops_metadata: dict[UOp, Metadata] = field(default_factory=dict) # this maps fused ops to Metadata
|
||||
contiguous: dict[UOp, UOp] = field(default_factory=dict) # this maps roots to places they are made contiguous
|
||||
children: DefaultDict[UOp, dict[UOp, None]] = field(default_factory=lambda: defaultdict(dict))
|
||||
children: defaultdict[UOp, dict[UOp, None]] = field(default_factory=lambda: defaultdict(dict))
|
||||
|
||||
def to_uop(buf:UOp, ctx:ScheduleContext, cache:dict[UOp, UOp]) -> UOp:
|
||||
if (r:=cache.get(buf)) is not None: return r
|
||||
@@ -96,7 +95,7 @@ def reduceop_view_right(r:UOp, v:UOp, src:UOp) -> UOp:
|
||||
output_shape = swizzle_st.reduce(r.axis_arg)
|
||||
return src.r(r.arg[0], tuple(i for i,(s,u) in enumerate(zip(src.shape, output_shape)) if s != u)).view(ShapeTracker.from_shape(output_shape))
|
||||
|
||||
def elementwise_view_right(root:UOp) -> Optional[UOp]:
|
||||
def elementwise_view_right(root:UOp) -> UOp|None:
|
||||
if len(swizzles:=[x for x in root.src if x.base is not x]) == 0: return None
|
||||
assert all(x.base.st is not None for x in swizzles), f"found shapeless VIEW src in {root}"
|
||||
assert all_same([x.base.size for x in swizzles]), f"swizzle inputs must have the same size {swizzles}"
|
||||
@@ -142,7 +141,7 @@ class ScheduleItemContext:
|
||||
metadata: set[Metadata] = field(default_factory=set)
|
||||
assign_adj: dict[UOp, list[UOp]] = field(default_factory=dict)
|
||||
|
||||
def _append_st_vars(ctx:ScheduleItemContext, x:UOp) -> Optional[UOp]:
|
||||
def _append_st_vars(ctx:ScheduleItemContext, x:UOp) -> UOp|None:
|
||||
if (st:=unwrap(x.st)) in ctx.sts: return None
|
||||
st, var_vals = st.simplify().unbind()
|
||||
ctx.var_vals.update(var_vals)
|
||||
@@ -217,7 +216,7 @@ def uval(u:UOp) -> UOp:
|
||||
assert is_scheduled(u), f"must be a scheduled op {u}"
|
||||
return r.src[0] if (r:=u.src[1]).op is Ops.CONTIGUOUS and not (r.src[0].base.op is Ops.VIEW and len(r.src[0].base.src) == 2) else r
|
||||
|
||||
def recursive_group(tr:UOp, st:ShapeTracker, r:UOp, children:DefaultDict[UOp, dict[UOp, None]], allbufs:dict[UOp, UOp], realizes:dict[UOp, UOp],
|
||||
def recursive_group(tr:UOp, st:ShapeTracker, r:UOp, children:defaultdict[UOp, dict[UOp, None]], allbufs:dict[UOp, UOp], realizes:dict[UOp, UOp],
|
||||
reduce_for_op:dict[UOp, UOp], group:dict[UOp, None], cache:dict[tuple[UOp, ShapeTracker], None]) -> None:
|
||||
"""recursively search the uop for groupable children, realize the UOp if a child can't group"""
|
||||
if (tr, st) in cache: return
|
||||
@@ -235,7 +234,7 @@ def recursive_group(tr:UOp, st:ShapeTracker, r:UOp, children:DefaultDict[UOp, di
|
||||
if len(st_childs:=dedup(unwrap(x.st) for x in tr_next_uop.src if is_scheduled(x.base) and x.base.buf_uop == tr)) > 1: return group.setdefault(r)
|
||||
recursive_group(tr_next, st+st_childs[0], r, children, allbufs, realizes, reduce_for_op, group, cache)
|
||||
|
||||
def get_isolated_children(r:UOp, reduce_for_op:dict[UOp, UOp], children:DefaultDict[UOp, dict[UOp, None]], allbufs:dict[UOp, UOp],
|
||||
def get_isolated_children(r:UOp, reduce_for_op:dict[UOp, UOp], children:defaultdict[UOp, dict[UOp, None]], allbufs:dict[UOp, UOp],
|
||||
realizes:dict[UOp, UOp], group:dict[UOp, None]) -> dict[UOp, None]:
|
||||
rc_parents, cache = deque(group), set()
|
||||
while rc_parents:
|
||||
@@ -307,7 +306,7 @@ def group_realizes(ctx:ScheduleContext) -> list[list[UOp]]:
|
||||
if len(kernel_children) == 0: continue
|
||||
for tr in group: del ctx.realizes[tr]
|
||||
# group BUFFER uops into kernels
|
||||
output_groups: DefaultDict[UOp, list[UOp]] = defaultdict(list)
|
||||
output_groups: defaultdict[UOp, list[UOp]] = defaultdict(list)
|
||||
for ubuf in ctx.realizes: output_groups[reduce_for_op.get(ubuf, ubuf)].append(ubuf)
|
||||
return list(output_groups.values())
|
||||
|
||||
@@ -326,7 +325,7 @@ def _as_const(u:UOp, val:ConstType) -> UOp:
|
||||
st = (base:=ShapeTracker.from_shape(())).reshape((1,)*len(u.shape)).expand(u.shape)
|
||||
return UOp(Ops.VIEW, u.dtype, (u.buf_uop, UOp.const(u.dtype, val)), base).view(st)
|
||||
|
||||
def simplify_reduceop(reduce:UOp, x:UOp) -> Optional[UOp]:
|
||||
def simplify_reduceop(reduce:UOp, x:UOp) -> UOp|None:
|
||||
# remove reduce on unmasked const
|
||||
if all_int(x.shape) and x.is_unrealized_unmasked_const():
|
||||
prshape = prod(unwrap(x.st).shape[i] for i in reduce.arg[1])
|
||||
@@ -435,12 +434,12 @@ def realize_view(ctx:ScheduleContext, view:UOp, src:UOp, b:UOp, **kwargs) -> Non
|
||||
# otherwise safety check pads
|
||||
return None if (all(v.mask is None for v in st.views) or can_pad(src, ctx.realizes, set())) else realize(ctx, b, src)
|
||||
|
||||
def fold_img_cast(ctx:ScheduleContext, xb:UOp, view:UOp, b:UOp, to_cast:UOp, **kwargs) -> Optional[UOp]:
|
||||
def fold_img_cast(ctx:ScheduleContext, xb:UOp, view:UOp, b:UOp, to_cast:UOp, **kwargs) -> UOp|None:
|
||||
if not isinstance(xb.dtype, ImageDType) or b not in ctx.realizes or xb not in ctx.realizes or uval(to_cast).op in GroupOp.Meta: return None
|
||||
del ctx.realizes[b]
|
||||
return to_cast.view(unwrap(view.st))
|
||||
|
||||
def init_big_graph(sink:UOp) -> Optional[UOp]:
|
||||
def init_big_graph(sink:UOp) -> UOp|None:
|
||||
new_src = tuple(x.base for x in sink.src if is_scheduled(x.base) and x.base.src[1].op is not Ops.CONST)
|
||||
return None if new_src == sink.src else UOp(Ops.NOOP) if len(new_src) == 0 else UOp.sink(*new_src)
|
||||
|
||||
@@ -520,8 +519,8 @@ def create_schedule_with_vars(outs:list[UOp]) -> tuple[list[ScheduleItem], dict[
|
||||
prescheduled.append(schedule_uop(UOp.sink(*stores), ctx))
|
||||
# do BFS
|
||||
schedule_targets = {out:si for si in prescheduled for out in si.outputs}
|
||||
graph: DefaultDict[ScheduleItem, list[ScheduleItem]] = defaultdict(list)
|
||||
in_degree: DefaultDict[ScheduleItem, int] = defaultdict(int)
|
||||
graph: defaultdict[ScheduleItem, list[ScheduleItem]] = defaultdict(list)
|
||||
in_degree: defaultdict[ScheduleItem, int] = defaultdict(int)
|
||||
for si in prescheduled:
|
||||
# realize outputs before a parent is assigned to
|
||||
parents_assigns = dedup(xsi for x in si.assign_preloads if (xsi:=schedule_targets.get(x.buffer)) and xsi is not si)
|
||||
|
||||
+2
-3
@@ -1,5 +1,4 @@
|
||||
from __future__ import annotations
|
||||
from typing import Optional
|
||||
import functools, itertools, operator
|
||||
from tinygrad.helpers import all_same, all_int, dedup, prod, DEBUG, RING, getenv
|
||||
from tinygrad.dtype import DType
|
||||
@@ -44,7 +43,7 @@ def to_sharded(lbs:list[UOp], axis:int, bounds: tuple[tuple[int, int], ...]) ->
|
||||
return [lb.shrink(tuple((0,s) if a != axis else bound for a,s in enumerate(lb.shape))) for i, (bound, lb) in enumerate(zip(bounds, lbs))]
|
||||
|
||||
class MultiLazyBuffer(MathTrait):
|
||||
def __init__(self, lbs:list[UOp], axis:Optional[int], real:Optional[list[bool]]=None):
|
||||
def __init__(self, lbs:list[UOp], axis:int|None, real:list[bool]|None=None):
|
||||
assert all(isinstance(x, UOp) for x in lbs) and len(lbs), "all lbs must be LazyBuffers, and we need at least one of them"
|
||||
assert all_same([x.dtype for x in lbs]), f"all multilazybuffer needs same dtype, getting {[x.dtype for x in lbs]}"
|
||||
self.lbs, self.axis, self.dtype, self.device, self.real = lbs, axis, lbs[0].dtype, tuple(x.device for x in lbs), real or [True]*len(lbs)
|
||||
@@ -64,7 +63,7 @@ class MultiLazyBuffer(MathTrait):
|
||||
def __repr__(self): return f"<MLB {self.axis=} {self.real=} {chr(10)}{chr(10).join([f'{x.device} {x.st}' for x in self.lbs])}>"
|
||||
|
||||
@staticmethod
|
||||
def from_sharded(lb:UOp, devices:tuple[str, ...], axis:Optional[int], bounds:Optional[tuple[tuple[int, int], ...]]):
|
||||
def from_sharded(lb:UOp, devices:tuple[str, ...], axis:int|None, bounds:tuple[tuple[int, int], ...]|None):
|
||||
assert (axis is None) == (bounds is None), "must specify bounds iff axis is specified"
|
||||
lbs = [lb] * len(devices)
|
||||
sharded_lbs = [lb.copy_to_device(d) for lb,d in zip(to_sharded(lbs, axis, bounds) if axis is not None and bounds is not None else lbs, devices)]
|
||||
|
||||
+16
-17
@@ -1,6 +1,5 @@
|
||||
from __future__ import annotations
|
||||
import math
|
||||
from typing import Optional, Union
|
||||
from tinygrad.tensor import Tensor, dtypes
|
||||
from tinygrad.device import is_dtype_supported
|
||||
from tinygrad.helpers import prod, make_tuple, flatten
|
||||
@@ -34,8 +33,8 @@ class BatchNorm:
|
||||
def __init__(self, sz:int, eps=1e-5, affine=True, track_running_stats=True, momentum=0.1):
|
||||
self.eps, self.track_running_stats, self.momentum = eps, track_running_stats, momentum
|
||||
|
||||
self.weight: Optional[Tensor] = Tensor.ones(sz) if affine else None
|
||||
self.bias: Optional[Tensor] = Tensor.zeros(sz) if affine else None
|
||||
self.weight: Tensor|None = Tensor.ones(sz) if affine else None
|
||||
self.bias: Tensor|None = Tensor.zeros(sz) if affine else None
|
||||
|
||||
self.num_batches_tracked = Tensor.zeros(1, dtype='long' if is_dtype_supported(dtypes.long) else 'int', requires_grad=False)
|
||||
if track_running_stats: self.running_mean, self.running_var = Tensor.zeros(sz, requires_grad=False), Tensor.ones(sz, requires_grad=False)
|
||||
@@ -61,7 +60,7 @@ class BatchNorm:
|
||||
return x.batchnorm(self.weight, self.bias, batch_mean, batch_var.add(self.eps).rsqrt())
|
||||
BatchNorm2d = BatchNorm3d = BatchNorm
|
||||
|
||||
def Conv1d(in_channels:int, out_channels:int, kernel_size:int, stride=1, padding:Union[int, str]=0, dilation=1, groups=1, bias=True) -> Conv2d:
|
||||
def Conv1d(in_channels:int, out_channels:int, kernel_size:int, stride=1, padding:int|str=0, dilation=1, groups=1, bias=True) -> Conv2d:
|
||||
"""
|
||||
Applies a 1D convolution over an input signal composed of several input planes.
|
||||
|
||||
@@ -95,7 +94,7 @@ class Conv2d:
|
||||
print(t.numpy())
|
||||
```
|
||||
"""
|
||||
def __init__(self, in_channels:int, out_channels:int, kernel_size:Union[int, tuple[int, ...]], stride=1, padding:Union[int, tuple[int, ...], str]=0,
|
||||
def __init__(self, in_channels:int, out_channels:int, kernel_size:int|tuple[int, ...], stride=1, padding:int|tuple[int, ...]|str=0,
|
||||
dilation=1, groups=1, bias=True):
|
||||
self.kernel_size = make_tuple(kernel_size, 2)
|
||||
if isinstance(padding, str):
|
||||
@@ -106,7 +105,7 @@ class Conv2d:
|
||||
self.stride, self.dilation, self.groups, self.padding = stride, dilation, groups, padding
|
||||
scale = 1 / math.sqrt(in_channels * prod(self.kernel_size))
|
||||
self.weight = Tensor.uniform(out_channels, in_channels//groups, *self.kernel_size, low=-scale, high=scale)
|
||||
self.bias: Optional[Tensor] = Tensor.uniform(out_channels, low=-scale, high=scale) if bias else None
|
||||
self.bias: Tensor|None = Tensor.uniform(out_channels, low=-scale, high=scale) if bias else None
|
||||
|
||||
def __call__(self, x:Tensor) -> Tensor: return x.conv2d(self.weight, self.bias, self.groups, self.stride, self.dilation, self.padding)
|
||||
|
||||
@@ -145,7 +144,7 @@ class ConvTranspose2d(Conv2d):
|
||||
print(t.numpy())
|
||||
```
|
||||
"""
|
||||
def __init__(self, in_channels:int, out_channels:int, kernel_size:Union[int, tuple[int, ...]], stride=1, padding=0, output_padding=0,
|
||||
def __init__(self, in_channels:int, out_channels:int, kernel_size:int|tuple[int, ...], stride=1, padding=0, output_padding=0,
|
||||
dilation=1, groups=1, bias=True):
|
||||
super().__init__(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias)
|
||||
scale = 1 / math.sqrt(in_channels * prod(self.kernel_size))
|
||||
@@ -197,8 +196,8 @@ class GroupNorm:
|
||||
"""
|
||||
def __init__(self, num_groups:int, num_channels:int, eps=1e-5, affine=True):
|
||||
self.num_groups, self.num_channels, self.eps = num_groups, num_channels, eps
|
||||
self.weight: Optional[Tensor] = Tensor.ones(num_channels) if affine else None
|
||||
self.bias: Optional[Tensor] = Tensor.zeros(num_channels) if affine else None
|
||||
self.weight: Tensor|None = Tensor.ones(num_channels) if affine else None
|
||||
self.bias: Tensor|None = Tensor.zeros(num_channels) if affine else None
|
||||
|
||||
def __call__(self, x:Tensor) -> Tensor:
|
||||
# reshape for layernorm to work as group norm
|
||||
@@ -228,8 +227,8 @@ class InstanceNorm:
|
||||
"""
|
||||
def __init__(self, num_features:int, eps=1e-5, affine=True):
|
||||
self.num_features, self.eps = num_features, eps
|
||||
self.weight: Optional[Tensor] = Tensor.ones(num_features) if affine else None
|
||||
self.bias: Optional[Tensor] = Tensor.zeros(num_features) if affine else None
|
||||
self.weight: Tensor|None = Tensor.ones(num_features) if affine else None
|
||||
self.bias: Tensor|None = Tensor.zeros(num_features) if affine else None
|
||||
|
||||
def __call__(self, x:Tensor) -> Tensor:
|
||||
x = x.reshape(x.shape[0], self.num_features, -1).layernorm(eps=self.eps).reshape(x.shape)
|
||||
@@ -253,11 +252,11 @@ class LayerNorm:
|
||||
print(t.mean().item(), t.std().item())
|
||||
```
|
||||
"""
|
||||
def __init__(self, normalized_shape:Union[int, tuple[int, ...]], eps=1e-5, elementwise_affine=True):
|
||||
def __init__(self, normalized_shape:int|tuple[int, ...], eps=1e-5, elementwise_affine=True):
|
||||
self.normalized_shape: tuple[int, ...] = make_tuple(normalized_shape, 1)
|
||||
self.axis, self.eps, self.elementwise_affine = tuple(-1-i for i in range(len(self.normalized_shape))), eps, elementwise_affine
|
||||
self.weight: Optional[Tensor] = Tensor.ones(*self.normalized_shape) if elementwise_affine else None
|
||||
self.bias: Optional[Tensor] = Tensor.zeros(*self.normalized_shape) if elementwise_affine else None
|
||||
self.weight: Tensor|None = Tensor.ones(*self.normalized_shape) if elementwise_affine else None
|
||||
self.bias: Tensor|None = Tensor.zeros(*self.normalized_shape) if elementwise_affine else None
|
||||
|
||||
def __call__(self, x:Tensor) -> Tensor:
|
||||
assert self.normalized_shape == x.shape[-len(self.normalized_shape):], f"last dimensions of {x.shape} must match {self.normalized_shape}"
|
||||
@@ -338,10 +337,10 @@ class LSTMCell:
|
||||
stdv = 1.0 / math.sqrt(hidden_size)
|
||||
self.weight_ih = Tensor.uniform(hidden_size*4, input_size, low=-stdv, high=stdv)
|
||||
self.weight_hh = Tensor.uniform(hidden_size*4, hidden_size, low=-stdv, high=stdv)
|
||||
self.bias_ih: Optional[Tensor] = Tensor.zeros(hidden_size*4) if bias else None
|
||||
self.bias_hh: Optional[Tensor] = Tensor.zeros(hidden_size*4) if bias else None
|
||||
self.bias_ih: Tensor|None = Tensor.zeros(hidden_size*4) if bias else None
|
||||
self.bias_hh: Tensor|None = Tensor.zeros(hidden_size*4) if bias else None
|
||||
|
||||
def __call__(self, x:Tensor, hc:Optional[tuple[Tensor, Tensor]]=None) -> tuple[Tensor, Tensor]:
|
||||
def __call__(self, x:Tensor, hc:tuple[Tensor, Tensor]|None=None) -> tuple[Tensor, Tensor]:
|
||||
if hc is None: hc = (Tensor.zeros(x.size(0), self.weight_hh.size(1), dtype=x.dtype, device=x.device),)*2
|
||||
gates = x.linear(self.weight_ih.T, self.bias_ih) + hc[0].linear(self.weight_hh.T, self.bias_hh)
|
||||
i, f, g, o = gates.chunk(4, dim=1)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from typing import Optional
|
||||
from tinygrad.dtype import DType, PtrDType, dtypes
|
||||
from tinygrad.ops import UOp, Ops, PatternMatcher, UPat
|
||||
from tinygrad.renderer.cstyle import CStyleLanguage, base_rewrite, extra_pm
|
||||
@@ -18,7 +17,7 @@ def packed_store(bidx:UOp, var:UOp):
|
||||
return UOp.store(UOp(Ops.INDEX, bidx.dtype, (bidx.src[0], bidx.src[1]//(4//var.dtype.itemsize))), ((buf & mask) | new_v.cast(dtypes.uint32)))
|
||||
|
||||
# load for char: sign_extend(buf[idx/4] >> ((idx%4)*8))
|
||||
def packed_load(root:UOp, bidx:UOp, dtype:DType, var:Optional[UOp]=None):
|
||||
def packed_load(root:UOp, bidx:UOp, dtype:DType, var:UOp|None=None):
|
||||
div_idx = bidx.src[1]//(4//dtype.itemsize)
|
||||
shift_am = (bidx.src[1].cast(dtypes.uint32)%UOp.const(dtypes.uint32, 4//dtype.itemsize))*UOp.const(dtypes.uint32, 8*dtype.itemsize)
|
||||
if var is not None: load = UOp.load(UOp(Ops.INDEX, bidx.dtype, (bidx.src[0], div_idx)), var, root.src[2], dtype=dtypes.uint32, arg=root.arg)
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
from typing import Optional
|
||||
import ctypes, subprocess, pathlib, tempfile
|
||||
from tinygrad.device import Compiled, Compiler, MallocAllocator
|
||||
from tinygrad.helpers import cpu_time_execution, cpu_objdump
|
||||
from tinygrad.renderer.cstyle import ClangRenderer
|
||||
|
||||
class ClangCompiler(Compiler):
|
||||
def __init__(self, cachekey="compile_clang", args:Optional[list[str]]=None, objdump_tool='objdump'):
|
||||
def __init__(self, cachekey="compile_clang", args:list[str]|None=None, objdump_tool='objdump'):
|
||||
self.args = ['-march=native'] if args is None else args
|
||||
self.objdump_tool = objdump_tool
|
||||
super().__init__(cachekey)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from __future__ import annotations
|
||||
import ctypes, ctypes.util, functools
|
||||
from typing import Optional
|
||||
from tinygrad.helpers import DEBUG, getenv, from_mv, init_c_var, init_c_struct_t
|
||||
from tinygrad.device import Compiled, BufferSpec, LRUAllocator
|
||||
from tinygrad.renderer.cstyle import CUDARenderer
|
||||
@@ -19,7 +18,7 @@ def encode_args(args, vals) -> tuple[ctypes.Structure, ctypes.Array]:
|
||||
ctypes.cast(ctypes.pointer(ctypes.c_size_t(ctypes.sizeof(c_args))), ctypes.c_void_p), ctypes.c_void_p(0))
|
||||
return c_args, vargs
|
||||
|
||||
def cu_time_execution(cb, enable=False) -> Optional[float]:
|
||||
def cu_time_execution(cb, enable=False) -> float|None:
|
||||
if not enable: return cb()
|
||||
evs = [init_c_var(cuda.CUevent(), lambda x: cuda.cuEventCreate(ctypes.byref(x), 0)) for _ in range(2)]
|
||||
cuda.cuEventRecord(evs[0], None)
|
||||
@@ -110,7 +109,7 @@ class CUDADevice(Compiled):
|
||||
CUDADevice.peer_access = True
|
||||
|
||||
self.arch = f"sm_{major.value}{minor.value}"
|
||||
self.pending_copyin: list[tuple[int, int, Optional[BufferSpec]]] = []
|
||||
self.pending_copyin: list[tuple[int, int, BufferSpec|None]] = []
|
||||
CUDADevice.devices.append(self)
|
||||
|
||||
from tinygrad.runtime.graph.cuda import CUDAGraph
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
from typing import Any
|
||||
from dataclasses import dataclass
|
||||
import tinygrad.runtime.autogen.libc as libc
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ElfSection: name:str; header:libc.Elf64_Shdr; content:bytes # noqa: E702
|
||||
|
||||
def elf_loader(blob:bytes, force_section_align:int=1) -> tuple[memoryview, list[ElfSection], Any]:
|
||||
def elf_loader(blob:bytes, force_section_align:int=1) -> tuple[memoryview, list[ElfSection], list[tuple]]:
|
||||
def _strtab(blob: bytes, idx: int) -> str: return blob[idx:blob.find(b'\x00', idx)].decode('utf-8')
|
||||
|
||||
header = libc.Elf64_Ehdr.from_buffer_copy(blob)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from __future__ import annotations
|
||||
from typing import Optional, Dict, cast, Type, TypeVar, Generic, Any
|
||||
from typing import Optional, cast, Type, TypeVar, Generic, Any
|
||||
import contextlib, decimal, statistics, time, ctypes, array
|
||||
from tinygrad.helpers import PROFILE, from_mv, getenv, to_mv, round_up
|
||||
from tinygrad.renderer import Renderer
|
||||
@@ -308,7 +308,7 @@ class HCQCompiled(Compiled, Generic[SignalType]):
|
||||
self.timeline_signal:SignalType = self.signal_t(value=0, timeline_for_device=self)
|
||||
self._shadow_timeline_signal:SignalType = self.signal_t(value=0, timeline_for_device=self)
|
||||
self.sig_prof_records:list[tuple[HCQSignal, HCQSignal, str, bool]] = []
|
||||
self.raw_prof_records:list[tuple[decimal.Decimal, decimal.Decimal, str, bool, Optional[Dict]]] = []
|
||||
self.raw_prof_records:list[tuple[decimal.Decimal, decimal.Decimal, str, bool, Optional[dict]]] = []
|
||||
self.dep_prof_records:list[tuple[decimal.Decimal, decimal.Decimal, HCQCompiled, bool, decimal.Decimal, decimal.Decimal, HCQCompiled, bool]] = []
|
||||
|
||||
from tinygrad.runtime.graph.hcq import HCQGraph
|
||||
|
||||
Reference in New Issue
Block a user