Files
TheRock/rocm-libraries/shared/tensile/Tensile/Utils.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

245 lines
8.4 KiB
Python

################################################################################
#
# Copyright (C) 2019-2024 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
################################################################################
import functools
import sys
import time
from typing import List
from .Common import DeveloperWarning, printWarning
class ProgressBar:
"""A class for displaying a progress bar in the console.
This class provides a simple way to display and update a progress bar in the console
to indicate the progress of a long-running operation. The progress bar can be updated
incrementally and supports displaying a completion message and time upon finishing.
Attributes:
char: The character used to fill the progress bar.
maxValue: The maximum value the progress bar can represent.
width: The total width of the progress bar, including borders.
maxTicks: The maximum number of ticks (fill characters) within the progress bar.
priorValue: The value of the progress bar during the last update.
fraction: The fraction of the progress bar that is filled.
numTicks: The current number of ticks (fill characters) in the progress bar.
createTime: The timestamp when the progress bar was created.
message: The message displayed alongside the progress bar.
"""
def __init__(self, maxValue: int, desc: str, width=40):
self.char: str = '.'
self.maxValue: int = maxValue
self.width: int = width
self.maxTicks: int = self.width - 10 # Adjusted for better alignment
self.priorValue: int = 0
self.fraction: float = 0
self.numTicks: int = 0
self.createTime: float = time.time()
self.message: str = "# " + desc
def increment(self, value=1):
"""Increments the progress bar by a given value and updates the display."""
self.update(self.priorValue + value)
def update(self, value):
"""Updates the progress bar to a specific value and refreshes the display."""
currentFraction = 1.0 * value / self.maxValue
currentNumTicks = int(currentFraction * self.maxTicks)
if currentNumTicks > self.numTicks:
self.numTicks = currentNumTicks
self.fraction = currentFraction
self.printStatus()
self.priorValue = value
def printStatus(self):
"""Prints the current status of the progress bar to the console."""
progress_bar = self.char * self.numTicks + ' ' * (self.maxTicks - self.numTicks)
status_msg = f"{self.message} {progress_bar} {self.fraction * 100:.1f}%"
if self.numTicks == 0:
sys.stdout.write(status_msg)
else:
sys.stdout.write('\r' + ' ' * len(status_msg) + '\r' + status_msg)
sys.stdout.flush()
def finish(self):
"""Marks the operation as done, cleans up the display, and prints the completion time."""
stopTime = time.time()
sys.stdout.write(f" (took {stopTime - self.createTime:.1f} secs)\n")
sys.stdout.flush()
class SpinnyThing:
"""A class to display a spinning indicator in the console for long-running operations.
This class provides a simple way to visually indicate that a long-running operation
is in progress by displaying a spinning character in the console. The spinner is
updated at regular intervals, and a completion message with the elapsed time is
displayed when the operation finishes.
Attributes:
msg: The message displayed alongside the spinner.
chars: The sequence of characters used for the spinner animation.
index: The current index in the `chars` list for the spinner.
count: A counter to control the update frequency of the spinner.
createTime: The timestamp when the spinner was created.
"""
def __init__(self, desc: str):
self.message: str = "# " + desc
self.chars: List[str] = ['|', '/', '-', '\\']
self.index: int = 0
self.count: int = 0
self.createTime: float = time.time()
def increment(self):
"""Increments the spinner's position and updates the display if necessary."""
self.count += 1
if self.count % 3 != 0:
return
sys.stdout.write('\r' + ' ' * (len(self.message) + 10))
sys.stdout.flush()
sys.stdout.write('\r' + self.message + " " + self.chars[self.index])
sys.stdout.flush()
self.index = (self.index + 1) % len(self.chars)
def finish(self):
"""Clears the spinner and displays a completion message with the elapsed time."""
sys.stdout.write('\r' + ' ' * (len(self.message) + 10))
sys.stdout.flush()
stopTime = time.time()
elapsedTime = stopTime - self.createTime
sys.stdout.write('\r' + self.message + f'... Done in {elapsedTime:.1f} secs\n')
sys.stdout.flush()
def iterate_progress(obj, *args, **kwargs):
if 'desc' not in kwargs:
printWarning("No message provided for TQDM progress bar/spinner", DeveloperWarning)
kwargs['desc'] = 'Processing unknown function'
if 'total' in kwargs:
progress = ProgressBar(kwargs['total'], kwargs['desc'])
else:
try:
progress = ProgressBar(len(obj), kwargs['desc'])
except TypeError:
progress = SpinnyThing(kwargs['desc'])
for o in obj:
yield o
progress.increment()
progress.finish()
try:
from tqdm import tqdm
except ImportError:
tqdm = iterate_progress
def state(obj):
if hasattr(obj, 'state'):
return obj.state()
if hasattr(obj.__class__, 'StateKeys'):
rv = {}
for key in obj.__class__.StateKeys:
attr = key
if isinstance(key, tuple):
(key, attr) = key
rv[key] = state(getattr(obj, attr))
return rv
if isinstance(obj, dict):
return dict([(k, state(v)) for k,v in list(obj.items())])
if any([isinstance(obj, cls) for cls in [str, int, float]]):
return obj
try:
obj = [state(i) for i in obj]
return obj
except TypeError:
pass
return obj
def state_key_ordering(cls):
def tup(obj):
return tuple([getattr(obj, k) for k in cls.StateKeys])
def lt(a, b):
return tup(a) < tup(b)
def eq(a, b):
return tup(a) == tup(b)
cls.__lt__ = lt
cls.__eq__ = eq
return functools.total_ordering(cls)
def hash_combine(*objs, **kwargs):
shift = 1
if 'shift' in kwargs:
shift = kwargs['shift']
if len(objs) == 1:
objs = objs[0]
rv = 0
try:
it = iter(objs)
rv = next(it)
for value in it:
rv = (rv << shift) ^ value
except TypeError:
return objs
except StopIteration:
pass
return rv
def hash_objs(*objs, **kwargs):
return hash(tuple(objs))
def ceil_divide(numerator, denominator):
# import pdb
# pdb.set_trace()
try:
if numerator < 0 or denominator < 0:
raise ValueError
except ValueError:
print("ERROR: Can't have a negative register value")
return 0
try:
div = int((numerator+denominator-1) // denominator)
except ZeroDivisionError:
print("ERROR: Divide by 0")
return 0
return div
def roundUpToNearestMultiple(numerator, denominator):
return ceil_divide(numerator,denominator)*int(denominator)