From 2004c9757d650bd152d1255c2ff440b0066ebf8e Mon Sep 17 00:00:00 2001 From: qazal <77887910+Qazalin@users.noreply.github.com> Date: Sun, 31 Aug 2025 18:24:44 +0300 Subject: [PATCH] tracing: add default clock (#11935) --- tinygrad/device.py | 7 +++---- tinygrad/engine/realize.py | 5 ++--- tinygrad/helpers.py | 8 +++++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tinygrad/device.py b/tinygrad/device.py index 6380660010..9a021c6a38 100644 --- a/tinygrad/device.py +++ b/tinygrad/device.py @@ -2,7 +2,7 @@ from __future__ import annotations from dataclasses import dataclass, replace from collections import defaultdict from typing import Any, Generic, TypeVar, Iterator -import importlib, inspect, functools, pathlib, os, platform, contextlib, sys, re, atexit, pickle, decimal, time +import importlib, inspect, functools, pathlib, os, platform, contextlib, sys, re, atexit, pickle, decimal from tinygrad.helpers import CI, OSX, LRU, getenv, diskcache_get, diskcache_put, DEBUG, GlobalCounters, flat_mv, PROFILE, temp, colored, \ Context, DISABLE_COMPILER_CACHE, ALLOW_DEVICE_USAGE, MAX_BUFFER_SIZE, cpu_events, ProfileEvent, ProfilePointEvent, dedup from tinygrad.dtype import DType, ImageDType, PtrDType, dtypes, _to_np_dtype @@ -138,15 +138,14 @@ class Buffer: if not self.device.startswith("DISK"): GlobalCounters.mem_used += self.nbytes if PROFILE: self._prof_num = num = len(Buffer.profile_events) - ts = decimal.Decimal(time.perf_counter_ns())/1000 - Buffer.profile_events.append(ProfilePointEvent(self.device, "alloc", ts, num, {"dtype":self.dtype, "sz":self.size})) + Buffer.profile_events.append(ProfilePointEvent(self.device, "alloc", num, {"dtype":self.dtype, "sz":self.size})) return self def deallocate(self): assert hasattr(self, '_buf'), "buffer must be allocated to deallocate" if DEBUG is not None and DEBUG >= 7: print(f"buffer: deallocate {self.nbytes} bytes on {self.device}") if self._base is None and (self.options is None or self.options.external_ptr is None): if GlobalCounters is not None and not self.device.startswith("DISK"): GlobalCounters.mem_used -= self.nbytes - if PROFILE: Buffer.profile_events.append(ProfilePointEvent(self.device, "free", decimal.Decimal(time.perf_counter_ns())/1000, self._prof_num)) + if PROFILE: Buffer.profile_events.append(ProfilePointEvent(self.device, "free", self._prof_num)) self.allocator.free(self._buf, self.nbytes, self.options) elif self._base is not None: self._base.allocated_views -= 1 del self._buf diff --git a/tinygrad/engine/realize.py b/tinygrad/engine/realize.py index 15e8ddf63c..bcf032fcc6 100644 --- a/tinygrad/engine/realize.py +++ b/tinygrad/engine/realize.py @@ -1,5 +1,5 @@ from typing import cast, Generator, Callable -import time, pprint, decimal, random, itertools, math +import time, pprint, random, itertools, math from dataclasses import dataclass, replace, field from tinygrad.helpers import all_same, colored, DEBUG, GlobalCounters, ansilen, BEAM, NOOPT, all_int, CAPTURING, Metadata, TRACEMETA, TracingKey from tinygrad.helpers import DEVECTORIZE, time_to_str, VALIDATE_WITH_CPU, getenv, cpu_profile, PROFILE, ProfilePointEvent, cpu_events, prod @@ -162,8 +162,7 @@ class ExecItem: def run(self, _var_vals:dict[Variable, int]|None=None, wait=False, jit=False, do_update_stats=True) -> float|None: var_vals = self.fixedvars if _var_vals is None else (_var_vals|self.fixedvars) bufs = [cast(Buffer, x) for x in self.bufs] if jit else [cast(Buffer, x).ensure_allocated() for x in self.bufs] - if PROFILE: cpu_events.append(ProfilePointEvent(self.prg.device, "exec", decimal.Decimal(time.perf_counter_ns())/1000, self.prg.display_name, - {"metadata":self.metadata, "var_vals":var_vals})) + if PROFILE: cpu_events.append(ProfilePointEvent(self.prg.device, "exec", self.prg.display_name, {"metadata":self.metadata, "var_vals":var_vals})) et = self.prg(bufs, var_vals, wait=wait or DEBUG >= 2) if do_update_stats: GlobalCounters.kernel_count += 1 diff --git a/tinygrad/helpers.py b/tinygrad/helpers.py index 3a5f9d70b9..84b8c4b8c7 100644 --- a/tinygrad/helpers.py +++ b/tinygrad/helpers.py @@ -192,6 +192,7 @@ class Profiling(contextlib.ContextDecorator): colored(_format_fcn(fcn).ljust(50), "yellow"), colored(f"<- {(scallers[0][1][2]/tottime)*100:3.0f}% {_format_fcn(scallers[0][0])}", "BLACK") if scallers else '') +def perf_counter_us() -> decimal.Decimal: return decimal.Decimal(time.perf_counter_ns())/1000 @dataclass(frozen=True) class TracingKey: @@ -205,15 +206,16 @@ class ProfileEvent: pass class ProfileRangeEvent(ProfileEvent): device:str; name:str|TracingKey; st:decimal.Decimal; en:decimal.Decimal|None=None; is_copy:bool=False # noqa: E702 @dataclass(frozen=True) -class ProfilePointEvent(ProfileEvent): device:str; name:str; ts:decimal.Decimal; key:Any; arg:dict=field(default_factory=dict) # noqa: E702 +class ProfilePointEvent(ProfileEvent): device:str; name:str; key:Any; arg:dict=field(default_factory=dict); \ + ts:decimal.Decimal=field(default_factory=perf_counter_us) # noqa: E702 cpu_events:list[ProfileEvent] = [] @contextlib.contextmanager def cpu_profile(name:str|TracingKey, device="CPU", is_copy=False, display=True) -> Generator[ProfileRangeEvent, None, None]: - res = ProfileRangeEvent(device, name, decimal.Decimal(time.perf_counter_ns()) / 1000, is_copy=is_copy) + res = ProfileRangeEvent(device, name, perf_counter_us(), is_copy=is_copy) try: yield res finally: - res.en = decimal.Decimal(time.perf_counter_ns()) / 1000 + res.en = perf_counter_us() if PROFILE and display: cpu_events.append(res) # *** universal database cache ***