diff --git a/CHANGELOG.md b/CHANGELOG.md index 3df2d095c..637085453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ # CUTLASS 4.x +## [4.5.3](https://github.com/NVIDIA/cutlass/releases/tag/v4.5.3) (2026-07-03) + +### CuTe DSL +* Bug fixing and improvements + - Fixed a compilation time regression issue in 4.5.0. Compilation times now match those in the 4.4 and 4.6 branches. + ## [4.5.2](https://github.com/NVIDIA/cutlass/releases/tag/v4.5.2) (2026-05-22) ### CuTe DSL diff --git a/README.md b/README.md index fdbb6f3db..ce30fc562 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ ![ALT](./media/images/gemm-hierarchy-with-epilogue-no-labels.png "Complete CUDA GEMM decomposition") # Overview -# CUTLASS 4.5.2 +# CUTLASS 4.5.3 -_CUTLASS 4.5.2 - May 2026_ +_CUTLASS 4.5.3 - July 2026_ CUTLASS is a collection of abstractions for implementing high-performance matrix-matrix multiplication (GEMM) and related computations at all levels and scales within CUDA. It incorporates strategies for @@ -75,6 +75,7 @@ To get started quickly - please refer : - Fixed Jax int64 stride divisibility issue - Fixed issues for SM120 blockscaled MMAs - added missing MXFP8MMAOP and MXF8F6F4MMAOP for sm120. + - Fixed a compilation time regression issue. * More examples of authorizing peak-performance kernels - MOE examles diff --git a/include/cutlass/version.h b/include/cutlass/version.h index 9df7e9d51..5e60ae5f5 100644 --- a/include/cutlass/version.h +++ b/include/cutlass/version.h @@ -40,7 +40,7 @@ #define CUTLASS_MAJOR 4 #define CUTLASS_MINOR 5 -#define CUTLASS_PATCH 2 +#define CUTLASS_PATCH 3 #ifdef CUTLASS_VERSIONS_GENERATED #include "cutlass/version_extended.h" diff --git a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py index 4e2af99c6..0f8e87554 100644 --- a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py +++ b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py @@ -58,6 +58,9 @@ def _find_user_frame(start_frame: types.FrameType | None) -> types.FrameType | N Returns the first frame whose file is not under the DSL package root. Falls back to start_frame if no user frame is found (e.g. all frames are library code). """ + if not _ENABLE_FRAME_FILTERING: + return start_frame + frame = start_frame while frame is not None: if not _is_framework_frame(frame.f_code.co_filename): diff --git a/python/CuTeDSL/cutlass/base_dsl/dsl.py b/python/CuTeDSL/cutlass/base_dsl/dsl.py index c136b595a..162f9068d 100644 --- a/python/CuTeDSL/cutlass/base_dsl/dsl.py +++ b/python/CuTeDSL/cutlass/base_dsl/dsl.py @@ -474,7 +474,7 @@ def new_from_mlir_values(obj: Any, values: Any, *, structured: bool = False) -> new_from_mlir_values(x, v, structured=True) for x, v in zip(obj, values) ] obj_ty = type(obj) - if hasattr(obj_ty, '_make'): + if hasattr(obj_ty, "_make"): return obj_ty._make(res) return obj_ty(res) elif isinstance(obj, SimpleNamespace): @@ -497,7 +497,7 @@ def new_from_mlir_values(obj: Any, values: Any, *, structured: bool = False) -> res.append(new_from_mlir_values(x, values[:n_items])) values = values[n_items:] obj_ty = type(obj) - if hasattr(obj_ty, '_make'): + if hasattr(obj_ty, "_make"): return obj_ty._make(res) return obj_ty(res) elif isinstance(obj, SimpleNamespace): @@ -854,23 +854,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): return pipeline return None - @staticmethod - def log_additions( - func_type: Any, operands: Any = None, types: Any = None, arg_attrs: Any = None - ) -> None: - if operands is not None and operands != []: - log().debug( - f"Added {func_type} operands: [%s]", ", ".join(map(str, operands)) - ) - if types is not None: - log().debug( - f"Added {func_type} arg_types: [%s]", ", ".join(map(str, types)) - ) - if arg_attrs is not None: - log().debug( - f"Added {func_type} arg_attrs: [%s]", ", ".join(map(str, arg_attrs)) - ) - def mangle_name( self, function_name: str, args: tuple[Any, ...], sig: inspect.Signature ) -> str: @@ -976,7 +959,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): else: ir_arg = ir_arg[0] - self.log_additions(ir_arg) return ir_arg, iv_block_args fop_args = list(fop.regions[0].blocks[0].arguments) @@ -993,8 +975,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): ) ir_kwargs[name] = ir_arg - log().debug("execution args: %s", ", ".join(map(str, ir_args))) - log().debug("execution kwargs: %s", ", ".join(map(str, ir_kwargs))) return ir_args, ir_kwargs @abstractmethod @@ -1228,9 +1208,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): compile_only=compile_only, ) - log().debug("Execution Arguments: %s", ", ".join(map(str, exe_args))) - log().debug("Types: %s", ", ".join(map(str, types))) - assert ( compile_only or self.envar.enable_tvm_ffi or len(exe_args) == len(types) ), "expects the same number of arguments and function parameters" @@ -2395,10 +2372,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): ) ) - log().debug("Final kernel_operands: %s", ", ".join(map(str, kernel_operands))) - log().debug("Final kernel_arg_types: %s", ", ".join(map(str, kernel_arg_types))) - log().debug("Final kernel_arg_attrs: %s", ", ".join(map(str, kernel_arg_attrs))) - assert len(kernel_operands) == len(kernel_arg_types) == len(kernel_arg_attrs), ( "Size of kernel_operands, kernel_arg_types and kernel_arg_attrs must be equal" ) diff --git a/python/CuTeDSL/requirements-cu13.txt b/python/CuTeDSL/requirements-cu13.txt index 8486beced..b471507c1 100644 --- a/python/CuTeDSL/requirements-cu13.txt +++ b/python/CuTeDSL/requirements-cu13.txt @@ -1,3 +1,3 @@ # Use `pip install -r requirements-cu13.txt` with the present file to install a # wheel consistent with the present state of the github repository -nvidia-cutlass-dsl[cu13]==4.5.2 +nvidia-cutlass-dsl[cu13]==4.5.3 diff --git a/python/CuTeDSL/requirements.txt b/python/CuTeDSL/requirements.txt index 83175d1de..295f8063f 100644 --- a/python/CuTeDSL/requirements.txt +++ b/python/CuTeDSL/requirements.txt @@ -1,3 +1,3 @@ # Use `pip install -r requirements.txt` with the present file to install a # wheel consistent with the present state of the github repository -nvidia-cutlass-dsl==4.5.2 +nvidia-cutlass-dsl==4.5.3 diff --git a/python/cutlass_cppgen/__init__.py b/python/cutlass_cppgen/__init__.py index 2928b3b71..1f91069c6 100644 --- a/python/cutlass_cppgen/__init__.py +++ b/python/cutlass_cppgen/__init__.py @@ -133,7 +133,7 @@ def get_option_registry(): this._option_registry = OptionRegistry(device_cc()) return this._option_registry -this.__version__ = '4.5.2' +this.__version__ = '4.5.3' from cutlass_cppgen.backend import create_memory_pool from cutlass_cppgen.emit.pytorch import pytorch diff --git a/python/setup_cutlass.py b/python/setup_cutlass.py index 31fa5b0f7..599e54122 100644 --- a/python/setup_cutlass.py +++ b/python/setup_cutlass.py @@ -51,7 +51,7 @@ setup_pycute.perform_setup() setup( name='cutlass_cppgen', - version='4.5.2', + version='4.5.3', description='CUTLASS Pythonic Interface', package_dir={'': '.'}, packages=[ diff --git a/python/setup_library.py b/python/setup_library.py index 534723ca2..316247d84 100644 --- a/python/setup_library.py +++ b/python/setup_library.py @@ -36,7 +36,7 @@ from setuptools import setup def perform_setup(): setup( name='cutlass_library', - version='4.5.2', + version='4.5.3', description='CUTLASS library generation scripts', packages=['cutlass_library'] ) diff --git a/python/setup_pycute.py b/python/setup_pycute.py index de04dd92c..490496f8a 100644 --- a/python/setup_pycute.py +++ b/python/setup_pycute.py @@ -36,7 +36,7 @@ from setuptools import setup def perform_setup(): setup( name='pycute', - version='4.5.2', + version='4.5.3', description='Python implementation of CuTe', packages=['pycute'], )