From 9fba3195f96db261ce802761505cb167f1cee370 Mon Sep 17 00:00:00 2001 From: Junkai-Wu Date: Sun, 25 Jan 2026 00:46:17 +0800 Subject: [PATCH] v4.4 update. (#2979) --- CHANGELOG.md | 80 +- CMakeLists.txt | 10 +- README.md | 164 +- examples/111_hopper_ssd/111_hopper_ssd.cu | 849 +++++++ examples/111_hopper_ssd/CMakeLists.txt | 41 + examples/111_hopper_ssd/README.md | 67 + examples/111_hopper_ssd/collective/common.hpp | 174 ++ .../collective/sm90_ssd_epilogue.hpp | 838 +++++++ .../sm90_ssd_gemm_tma_warpspecialized.hpp | 1146 +++++++++ examples/111_hopper_ssd/device/ssd.hpp | 273 ++ .../kernel/sm90_ssd_kernel_builder.hpp | 116 + .../sm90_ssd_kernel_tma_warpspecialized.hpp | 553 ++++ .../kernel/sm90_ssd_tile_scheduler.hpp | 132 + .../reference/reference_ssd.hpp | 345 +++ .../reference/reference_ssd_cumsum.hpp | 194 ++ .../112_blackwell_ssd/112_blackwell_ssd.cu | 850 +++++++ .../112_blackwell_ssd/CMakeLists.txt | 48 +- examples/112_blackwell_ssd/README.md | 65 + .../collective/sm100_ssd_epilogue.hpp | 535 ++++ .../sm100_ssd_gemm_tma_warpspecialized.hpp | 1145 +++++++++ examples/112_blackwell_ssd/device/ssd.hpp | 272 ++ .../kernel/sm100_ssd_kernel_builder.hpp | 259 ++ .../sm100_ssd_kernel_tma_warpspecialized.hpp | 519 ++++ .../kernel/sm100_ssd_tile_scheduler.hpp | 132 + .../reference/reference_ssd.hpp | 341 +++ .../reference/reference_ssd_cumsum.hpp | 194 ++ examples/112_blackwell_ssd/utils/pipeline.h | 225 ++ .../55_hopper_int4_bf16_gemm.cu | 38 +- .../55_hopper_int4_fp8_gemm.cu | 42 +- examples/60_cutlass_import/CMakeLists.txt | 2 +- .../77_blackwell_fmha_gen.cu | 4 +- .../77_blackwell_fmha/77_blackwell_mla.cu | 10 +- examples/77_blackwell_fmha/CMakeLists.txt | 2 +- examples/77_blackwell_fmha/README.md | 2 + .../kernel/fmha_kernel_bwd_convert.hpp | 2 +- ...00_fmha_bwd_kernel_tma_warpspecialized.hpp | 3 +- ...mha_bwd_mla_kernel_tma_warpspecialized.hpp | 3 +- ...00_fmha_fwd_kernel_tma_warpspecialized.hpp | 3 +- .../sm100_fmha_gen_kernel_warpspecialized.hpp | 3 +- .../sm100_fmha_mla_tma_warpspecialized.hpp | 3 +- .../81_blackwell_gemm_blockwise/README.md | 2 +- .../89_sm103_fp4_ultra_gemm.cu | 4 +- .../90_sm103_fp4_ultra_grouped_gemm.cu | 4 +- .../CMakeLists.txt | 36 + .../figures/acc2.png | Bin 0 -> 989344 bytes .../figures/cta.png | Bin 0 -> 1146701 bytes .../figures/fmax.png | Bin 0 -> 633844 bytes .../figures/fsum.png | Bin 0 -> 887782 bytes .../figures/tgv_gqa.png | Bin 0 -> 1003248 bytes .../93_blackwell_low_latency_gqa/readme.md | 73 + .../93_blackwell_low_latency_gqa/tgv_gqa.cu | 750 ++++++ .../93_blackwell_low_latency_gqa/tgv_gqa.cuh | 2215 +++++++++++++++++ examples/94_ada_fp8_blockwise/CMakeLists.txt | 32 + .../94_ada_fp8_blockwise/ada_fp8_blockwise.cu | 489 ++++ examples/CMakeLists.txt | 5 +- .../dense_gemm_persistent_dynamic.py | 1832 ++++++++++++++ .../python/CuTeDSL/cute/export/export_to_c.py | 107 + .../CuTeDSL/cute/export/load_in_python.py | 79 + .../cute/export/run_with_dynamic_loading.cpp | 254 ++ .../cute/export/run_with_dynamic_loading.sh | 80 + .../cute/export/run_with_static_linking.cpp | 124 + .../cute/export/run_with_static_linking.sh | 76 + .../python/CuTeDSL/cute/tvm_ffi/aot_export.py | 12 +- .../cute/tvm_ffi/aot_use_in_cpp_bundle.cpp | 75 +- .../cute/tvm_ffi/aot_use_in_cpp_bundle.sh | 12 +- .../CuTeDSL/cute/tvm_ffi/aot_use_in_jax.py | 2 +- .../CuTeDSL/cute/tvm_ffi/aot_use_in_torch.py | 6 +- .../CuTeDSL/cute/tvm_ffi/error_reporting.py | 3 +- .../cute/tvm_ffi/jit_and_use_in_jax.py | 2 +- .../cute/tvm_ffi/jit_and_use_in_torch.py | 6 +- .../CuTeDSL/cute/tvm_ffi/requirements.txt | 2 +- .../python/CuTeDSL/jax/cutlass_call_basic.py | 260 ++ .../python/CuTeDSL/jax/cutlass_call_export.py | 168 ++ .../CuTeDSL/jax/cutlass_call_sharding.py | 140 ++ .../CuTeDSL/jax/elementwise_apply_example.py | 329 +++ include/cute/arch/config.hpp | 3 + include/cute/arch/mma_sm100_desc.hpp | 2 +- include/cute/arch/mma_sm100_umma.hpp | 258 +- include/cute/arch/mma_sm120.hpp | 24 + include/cute/arch/mma_sm120_sparse.hpp | 23 + include/cute/atom/copy_traits_sm90_tma.hpp | 19 +- include/cute/atom/mma_traits_sm100.hpp | 709 +++++- include/cute/container/array.hpp | 12 + include/cute/container/array_subbyte.hpp | 12 + include/cute/container/tuple.hpp | 12 + include/cute/container/type_list.hpp | 12 + include/cute/numeric/arithmetic_tuple.hpp | 12 + include/cutlass/arch/barrier.h | 124 +- include/cutlass/arch/mma_sm100.h | 2 + include/cutlass/arch/mma_sm70.h | 2 + include/cutlass/arch/mma_sm75.h | 2 + include/cutlass/arch/mma_sm80.h | 2 + include/cutlass/arch/mma_sm89.h | 2 + include/cutlass/arch/mma_sm90.h | 2 + include/cutlass/arch/mma_sparse_sm80.h | 2 + include/cutlass/arch/mma_sparse_sm89.h | 2 + include/cutlass/arch/synclog.hpp | 25 + include/cutlass/arch/wmma_sm70.h | 2 + include/cutlass/arch/wmma_sm72.h | 2 + include/cutlass/arch/wmma_sm75.h | 2 + include/cutlass/array.h | 18 + include/cutlass/complex.h | 31 + include/cutlass/cutlass.h | 6 +- .../detail/collective/mixed_input_utils.hpp | 37 +- .../detail/sm100_blockscaled_layout.hpp | 22 +- .../detail/sm103_blockscaled_layout.hpp | 22 +- .../collective/builders/sm100_builder.inl | 34 + .../cutlass/epilogue/collective/detail.hpp | 14 +- .../sm100_epilogue_array_nosmem.hpp | 12 +- ...0_epilogue_array_planar_complex_nosmem.hpp | 345 +++ ...ray_planar_complex_tma_warpspecialized.hpp | 1161 +++++++++ ...100_epilogue_array_tma_warpspecialized.hpp | 1 + .../collective/sm100_epilogue_nosmem.hpp | 12 +- ...gue_planar_complex_tma_warpspecialized.hpp | 897 +++++++ include/cutlass/epilogue/dispatch_policy.hpp | 44 +- .../cutlass/epilogue/threadblock/epilogue.h | 2 + .../epilogue/threadblock/epilogue_base.h | 2 + include/cutlass/functional.h | 45 + ...xBF16_interleaved_complex_umma_builder.inl | 298 +++ .../builders/sm100_9xBF16_umma_builder.inl | 59 +- .../sm100_blockscaled_umma_builder.inl | 2 +- .../builders/sm100_blockwise_umma_builder.inl | 7 +- .../gemm/collective/builders/sm100_common.inl | 194 +- ...sm100_interleaved_complex_umma_builder.inl | 264 ++ .../sm100_planar_complex_umma_builder.inl | 182 ++ .../gemm/collective/collective_builder.hpp | 13 +- .../gemm/collective/collective_mma.hpp | 18 +- .../sm100_blockscaled_mma_warpspecialized.hpp | 9 +- ...blockscaled_sparse_mma_warpspecialized.hpp | 8 +- ...ecialized_interleaved_complex_emulated.hpp | 1197 +++++++++ ...rpspecialized_interleaved_complex_tf32.hpp | 987 ++++++++ ...a_array_warpspecialized_planar_complex.hpp | 963 +++++++ ...ecialized_interleaved_complex_emulated.hpp | 1072 ++++++++ ...rpspecialized_interleaved_complex_tf32.hpp | 875 +++++++ ...100_mma_warpspecialized_planar_complex.hpp | 829 ++++++ .../sm120_blockscaled_mma_array_tma.hpp | 4 +- .../collective/sm120_blockscaled_mma_tma.hpp | 4 +- .../sm120_blockscaled_sparse_mma_tma.hpp | 6 +- .../gemm/collective/sm120_sparse_mma_tma.hpp | 2 +- ..._warpspecialized_fp8_blockwise_scaling.hpp | 3 +- include/cutlass/gemm/device/gemm_blockwise.h | 761 ++++++ .../cutlass/gemm/device/gemm_universal_base.h | 2 + include/cutlass/gemm/dispatch_policy.hpp | 107 + include/cutlass/gemm/kernel/gemm_blockwise.h | 223 ++ .../gemm/kernel/gemm_universal_blockwise.h | 359 +++ include/cutlass/gemm/kernel/gemv.h | 4 +- ...ay_tma_warpspecialized_input_transform.hpp | 5 +- ...mm_tma_warpspecialized_input_transform.hpp | 53 +- .../gemm/kernel/sm100_tile_scheduler.hpp | 2 +- .../kernel/sm100_tile_scheduler_stream_k.hpp | 2 +- ...kscaled_gemm_array_tma_warpspecialized.hpp | 8 + ...3_blockscaled_gemm_tma_warpspecialized.hpp | 8 + .../kernel/sm90_tile_scheduler_stream_k.hpp | 2 +- .../gemm/threadblock/default_mma_core_sm80.h | 1 + .../default_mma_multistage_blockwise.h | 212 ++ .../cutlass/gemm/threadblock/mma_multistage.h | 3 + .../threadblock/mma_multistage_blockwise.h | 449 ++++ include/cutlass/layout/permute.h | 2 + include/cutlass/numeric_conversion.h | 1253 ++++++++-- include/cutlass/platform/platform.h | 18 +- include/cutlass/predicate_vector.h | 2 + .../kernel/sm90_sparse_gemm_compressor.hpp | 19 +- include/cutlass/workspace.h | 3 + media/docs/cpp/blackwell_functionality.md | 4 +- media/docs/cpp/functionality.md | 14 +- media/docs/cpp/pipeline.md | 2 +- media/docs/pythonDSL/cute_dsl.rst | 2 + .../docs/pythonDSL/cute_dsl_api/changelog.rst | 2 +- .../cute_dsl_general/compile_with_tvm_ffi.rst | 45 +- .../pythonDSL/cute_dsl_general/debugging.rst | 19 + .../dsl_ahead_of_time_compilation.rst | 239 ++ .../cute_dsl_general/dsl_control_flow.rst | 40 + .../dsl_jit_compilation_options.rst | 6 +- media/docs/pythonDSL/deprecation.rst | 56 + media/docs/pythonDSL/limitations.rst | 28 +- media/docs/pythonDSL/overview.rst | 2 +- media/docs/pythonDSL/quick_start.rst | 29 +- python/CuTeDSL/cutlass/__init__.py | 7 + python/CuTeDSL/cutlass/base_dsl/__init__.py | 10 + .../cutlass/base_dsl/_mlir_helpers/arith.py | 16 +- .../cutlass/base_dsl/_mlir_helpers/op.py | 22 +- python/CuTeDSL/cutlass/base_dsl/arch.py | 2 - .../CuTeDSL/cutlass/base_dsl/ast_helpers.py | 143 +- .../cutlass/base_dsl/ast_preprocessor.py | 234 +- .../CuTeDSL/cutlass/base_dsl/cache_helpers.py | 206 +- python/CuTeDSL/cutlass/base_dsl/common.py | 34 +- python/CuTeDSL/cutlass/base_dsl/compiler.py | 11 +- python/CuTeDSL/cutlass/base_dsl/dsl.py | 253 +- .../CuTeDSL/cutlass/base_dsl/env_manager.py | 40 +- .../cutlass/base_dsl/export/__init__.py | 19 +- .../base_dsl/export/c_header_generator.py | 119 +- .../CuTeDSL/cutlass/base_dsl/export/export.py | 272 +- .../base_dsl/export/external_binary_module.py | 126 + .../CuTeDSL/cutlass/base_dsl/jit_executor.py | 589 ++++- .../CuTeDSL/cutlass/base_dsl/runtime/cuda.py | 10 + .../base_dsl/runtime/tensor_descriptor.py | 8 + .../base_dsl/tvm_ffi_builder/call_provider.py | 13 +- .../base_dsl/tvm_ffi_builder/mlir_builder.py | 13 +- .../cutlass/base_dsl/tvm_ffi_builder/spec.py | 22 +- .../tvm_ffi_builder/tvm_ffi_builder.py | 246 +- python/CuTeDSL/cutlass/base_dsl/typing.py | 3 +- .../CuTeDSL/cutlass/base_dsl/utils/numpy.py | 90 + .../utils}/tree_utils.py | 125 +- python/CuTeDSL/cutlass/cute/__init__.py | 18 +- .../cute/_tvm_ffi_args_spec_converter.py | 2 + python/CuTeDSL/cutlass/cute/arch/__init__.py | 20 + python/CuTeDSL/cutlass/cute/arch/clc.py | 116 + python/CuTeDSL/cutlass/cute/arch/elect.py | 2 + python/CuTeDSL/cutlass/cute/arch/mbar.py | 24 +- .../cutlass/cute/arch/numeric_conversion.py | 33 + .../cutlass/cute/arch/nvvm_wrappers.py | 822 +++++- python/CuTeDSL/cutlass/cute/arch/tmem.py | 78 +- python/CuTeDSL/cutlass/cute/atom.py | 61 +- python/CuTeDSL/cutlass/cute/core.py | 491 +++- .../cutlass/cute/experimental/__init__.py | 14 + .../CuTeDSL/cutlass/cute/export/__init__.py | 47 +- .../CuTeDSL/cutlass/cute/export/aot_config.py | 172 ++ .../cutlass/cute/export/c_header_generator.py | 111 +- python/CuTeDSL/cutlass/cute/export/export.py | 55 + python/CuTeDSL/cutlass/cute/export/load.py | 19 + python/CuTeDSL/cutlass/cute/nvgpu/__init__.py | 13 +- python/CuTeDSL/cutlass/cute/nvgpu/common.py | 64 +- .../cutlass/cute/nvgpu/cpasync/copy.py | 278 ++- .../cutlass/cute/nvgpu/cpasync/helpers.py | 74 +- python/CuTeDSL/cutlass/cute/nvgpu/helpers.py | 63 +- .../cutlass/cute/nvgpu/tcgen05/copy.py | 35 +- .../cutlass/cute/nvgpu/tcgen05/helpers.py | 22 +- .../CuTeDSL/cutlass/cute/nvgpu/tcgen05/mma.py | 287 +-- .../cutlass/cute/nvgpu/warp/__init__.py | 4 + .../CuTeDSL/cutlass/cute/nvgpu/warp/copy.py | 146 +- python/CuTeDSL/cutlass/cute/nvgpu/warp/mma.py | 286 ++- .../cutlass/cute/nvgpu/warpgroup/mma.py | 30 +- python/CuTeDSL/cutlass/cute/runtime.py | 135 +- python/CuTeDSL/cutlass/cute/tensor.py | 84 +- python/CuTeDSL/cutlass/cute/testing.py | 362 ++- python/CuTeDSL/cutlass/cute/tuple.py | 168 +- python/CuTeDSL/cutlass/cute/typing.py | 15 +- .../CuTeDSL/cutlass/cutlass_dsl/__init__.py | 2 + .../cutlass/cutlass_dsl/cuda_jit_executor.py | 44 +- python/CuTeDSL/cutlass/cutlass_dsl/cutlass.py | 339 ++- .../cutlass_dsl/cutlass_ast_decorators.py | 19 +- .../cutlass/cutlass_dsl/tvm_ffi_provider.py | 61 +- python/CuTeDSL/cutlass/jax/__init__.py | 70 + python/CuTeDSL/cutlass/jax/compile.py | 302 +++ python/CuTeDSL/cutlass/jax/ffi.py | 139 ++ python/CuTeDSL/cutlass/jax/primitive.py | 309 +++ python/CuTeDSL/cutlass/jax/testing.py | 258 ++ python/CuTeDSL/cutlass/jax/types.py | 425 ++++ python/CuTeDSL/cutlass/pipeline/__init__.py | 6 +- python/CuTeDSL/cutlass/pipeline/helpers.py | 70 +- python/CuTeDSL/cutlass/pipeline/sm100.py | 659 ++++- python/CuTeDSL/cutlass/pipeline/sm90.py | 241 +- python/CuTeDSL/cutlass/torch.py | 43 +- python/CuTeDSL/cutlass/utils/README.md | 1 + python/CuTeDSL/cutlass/utils/__init__.py | 35 +- .../cutlass/utils/blackwell_helpers.py | 115 +- .../cutlass/utils/blockscaled_layout.py | 1 + python/CuTeDSL/cutlass/utils/distributed.py | 64 +- .../dynamic_persistent_tile_scheduler.py | 276 ++ python/CuTeDSL/cutlass/utils/gemm/__init__.py | 16 + python/CuTeDSL/cutlass/utils/gemm/sm100.py | 917 +++++++ python/CuTeDSL/cutlass/utils/gemm_helper.py | 0 .../grouped_gemm_persistent_tile_scheduler.py | 1035 ++++++++ .../cutlass/utils/mixed_input_helpers.py | 572 ++++- .../utils/static_persistent_tile_scheduler.py | 57 +- .../cutlass/utils/tensormap_manager.py | 59 +- .../CuTeDSL/cutlass/utils/tmem_allocator.py | 80 +- python/CuTeDSL/cutlass/utils/version_info.py | 22 + python/CuTeDSL/requirements.txt | 2 +- python/cutlass_library/emit_kernel_listing.py | 63 +- python/cutlass_library/generator.py | 233 +- python/cutlass_library/library.py | 16 +- test/self_contained_includes/CMakeLists.txt | 4 +- .../device/gemm_testbed_3x_planar_complex.hpp | 482 ++++ ...mm_testbed_3x_ptr_array_planar_complex.hpp | 536 ++++ ...planar_cbf16_cbf16_cbf16_tensor_op_cf32.cu | 163 ++ ...ar_cbf16_cbf16_cbf16_tensor_op_cf32_2sm.cu | 163 ++ ...6_cbf16_tensor_op_cf32_conjugate_layout.cu | 211 ++ ..._cbf16_tensor_op_cf32_preferred_cluster.cu | 165 ++ ...16_cbf16_cbf16_tensor_op_cf32_ptr_array.cu | 282 +++ ...mm_planar_cf16_cf16_cf16_tensor_op_cf32.cu | 163 ++ ...lanar_cf16_cf16_cf16_tensor_op_cf32_2sm.cu | 163 ++ ...16_cf16_tensor_op_cf32_conjugate_layout.cu | 212 ++ ...6_cf16_tensor_op_cf32_preferred_cluster.cu | 165 ++ ...cf16_cf16_cf16_tensor_op_cf32_ptr_array.cu | 282 +++ .../device/testbed_sparse_gemm_compressor.hpp | 24 +- tools/library/CMakeLists.txt | 13 + tools/library/src/reference/gemm_f6_f8_f32.cu | 84 + .../grouped_gemm_operation_profiler.h | 26 +- .../block_scaled_gemm_operation_profiler.cu | 47 +- .../src/blockwise_gemm_operation_profiler.cu | 47 +- .../src/grouped_gemm_operation_profiler.cu | 853 ++++--- .../cutlass/util/mixed_dtype_utils.hpp | 101 +- 293 files changed, 46344 insertions(+), 2996 deletions(-) create mode 100644 examples/111_hopper_ssd/111_hopper_ssd.cu create mode 100644 examples/111_hopper_ssd/CMakeLists.txt create mode 100644 examples/111_hopper_ssd/README.md create mode 100644 examples/111_hopper_ssd/collective/common.hpp create mode 100644 examples/111_hopper_ssd/collective/sm90_ssd_epilogue.hpp create mode 100644 examples/111_hopper_ssd/collective/sm90_ssd_gemm_tma_warpspecialized.hpp create mode 100644 examples/111_hopper_ssd/device/ssd.hpp create mode 100644 examples/111_hopper_ssd/kernel/sm90_ssd_kernel_builder.hpp create mode 100644 examples/111_hopper_ssd/kernel/sm90_ssd_kernel_tma_warpspecialized.hpp create mode 100644 examples/111_hopper_ssd/kernel/sm90_ssd_tile_scheduler.hpp create mode 100644 examples/111_hopper_ssd/reference/reference_ssd.hpp create mode 100644 examples/111_hopper_ssd/reference/reference_ssd_cumsum.hpp create mode 100644 examples/112_blackwell_ssd/112_blackwell_ssd.cu rename test/utils/device_info.py => examples/112_blackwell_ssd/CMakeLists.txt (61%) create mode 100644 examples/112_blackwell_ssd/README.md create mode 100644 examples/112_blackwell_ssd/collective/sm100_ssd_epilogue.hpp create mode 100644 examples/112_blackwell_ssd/collective/sm100_ssd_gemm_tma_warpspecialized.hpp create mode 100644 examples/112_blackwell_ssd/device/ssd.hpp create mode 100644 examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_builder.hpp create mode 100644 examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_tma_warpspecialized.hpp create mode 100644 examples/112_blackwell_ssd/kernel/sm100_ssd_tile_scheduler.hpp create mode 100644 examples/112_blackwell_ssd/reference/reference_ssd.hpp create mode 100644 examples/112_blackwell_ssd/reference/reference_ssd_cumsum.hpp create mode 100644 examples/112_blackwell_ssd/utils/pipeline.h create mode 100644 examples/93_blackwell_low_latency_gqa/CMakeLists.txt create mode 100644 examples/93_blackwell_low_latency_gqa/figures/acc2.png create mode 100644 examples/93_blackwell_low_latency_gqa/figures/cta.png create mode 100644 examples/93_blackwell_low_latency_gqa/figures/fmax.png create mode 100644 examples/93_blackwell_low_latency_gqa/figures/fsum.png create mode 100644 examples/93_blackwell_low_latency_gqa/figures/tgv_gqa.png create mode 100644 examples/93_blackwell_low_latency_gqa/readme.md create mode 100644 examples/93_blackwell_low_latency_gqa/tgv_gqa.cu create mode 100644 examples/93_blackwell_low_latency_gqa/tgv_gqa.cuh create mode 100644 examples/94_ada_fp8_blockwise/CMakeLists.txt create mode 100644 examples/94_ada_fp8_blockwise/ada_fp8_blockwise.cu create mode 100644 examples/python/CuTeDSL/blackwell/dense_gemm_persistent_dynamic.py create mode 100644 examples/python/CuTeDSL/cute/export/export_to_c.py create mode 100644 examples/python/CuTeDSL/cute/export/load_in_python.py create mode 100644 examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.cpp create mode 100755 examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.sh create mode 100644 examples/python/CuTeDSL/cute/export/run_with_static_linking.cpp create mode 100755 examples/python/CuTeDSL/cute/export/run_with_static_linking.sh create mode 100644 examples/python/CuTeDSL/jax/cutlass_call_basic.py create mode 100644 examples/python/CuTeDSL/jax/cutlass_call_export.py create mode 100644 examples/python/CuTeDSL/jax/cutlass_call_sharding.py create mode 100644 examples/python/CuTeDSL/jax/elementwise_apply_example.py create mode 100644 include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_nosmem.hpp create mode 100644 include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_tma_warpspecialized.hpp create mode 100644 include/cutlass/epilogue/collective/sm100_epilogue_planar_complex_tma_warpspecialized.hpp create mode 100644 include/cutlass/gemm/collective/builders/sm100_9xBF16_interleaved_complex_umma_builder.inl create mode 100644 include/cutlass/gemm/collective/builders/sm100_interleaved_complex_umma_builder.inl create mode 100644 include/cutlass/gemm/collective/builders/sm100_planar_complex_umma_builder.inl create mode 100644 include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_emulated.hpp create mode 100644 include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_tf32.hpp create mode 100644 include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_planar_complex.hpp create mode 100644 include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_emulated.hpp create mode 100644 include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_tf32.hpp create mode 100644 include/cutlass/gemm/collective/sm100_mma_warpspecialized_planar_complex.hpp create mode 100644 include/cutlass/gemm/device/gemm_blockwise.h create mode 100644 include/cutlass/gemm/kernel/gemm_blockwise.h create mode 100644 include/cutlass/gemm/kernel/gemm_universal_blockwise.h create mode 100644 include/cutlass/gemm/threadblock/default_mma_multistage_blockwise.h create mode 100644 include/cutlass/gemm/threadblock/mma_multistage_blockwise.h create mode 100644 media/docs/pythonDSL/cute_dsl_general/dsl_ahead_of_time_compilation.rst create mode 100644 media/docs/pythonDSL/deprecation.rst create mode 100644 python/CuTeDSL/cutlass/base_dsl/export/external_binary_module.py create mode 100644 python/CuTeDSL/cutlass/base_dsl/utils/numpy.py rename python/CuTeDSL/cutlass/{cutlass_dsl => base_dsl/utils}/tree_utils.py (86%) create mode 100644 python/CuTeDSL/cutlass/cute/arch/clc.py create mode 100755 python/CuTeDSL/cutlass/cute/experimental/__init__.py create mode 100644 python/CuTeDSL/cutlass/cute/export/aot_config.py create mode 100644 python/CuTeDSL/cutlass/cute/export/export.py create mode 100644 python/CuTeDSL/cutlass/cute/export/load.py create mode 100644 python/CuTeDSL/cutlass/jax/__init__.py create mode 100644 python/CuTeDSL/cutlass/jax/compile.py create mode 100644 python/CuTeDSL/cutlass/jax/ffi.py create mode 100644 python/CuTeDSL/cutlass/jax/primitive.py create mode 100644 python/CuTeDSL/cutlass/jax/testing.py create mode 100644 python/CuTeDSL/cutlass/jax/types.py create mode 100644 python/CuTeDSL/cutlass/utils/dynamic_persistent_tile_scheduler.py create mode 100644 python/CuTeDSL/cutlass/utils/gemm/__init__.py create mode 100644 python/CuTeDSL/cutlass/utils/gemm/sm100.py delete mode 100644 python/CuTeDSL/cutlass/utils/gemm_helper.py create mode 100644 python/CuTeDSL/cutlass/utils/grouped_gemm_persistent_tile_scheduler.py create mode 100644 python/CuTeDSL/cutlass/utils/version_info.py create mode 100644 test/unit/gemm/device/gemm_testbed_3x_planar_complex.hpp create mode 100644 test/unit/gemm/device/gemm_testbed_3x_ptr_array_planar_complex.hpp create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_2sm.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_conjugate_layout.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_preferred_cluster.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_ptr_array.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_2sm.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_conjugate_layout.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_preferred_cluster.cu create mode 100644 test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_ptr_array.cu diff --git a/CHANGELOG.md b/CHANGELOG.md index fe5c4d7a..21814c68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,67 @@ # CUTLASS 4.x +## [4.4.0](https://github.com/NVIDIA/cutlass/tree/main) (2026-01-23) + +### CuTe DSL +* New features + - Ahead of Time (AoT) compilation is now available! + + Refer to files under https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/cute/export for example usage + - JAX support - you can now use CuTeDSL along with JAX + + Refer to files under https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/jax for example usage + - Introduced versioning support in DSL: + + cutlass.__version__ for a string representation of DSL version + + cutlass.CUDA_VERSION for a version class to tell the CUDA version used for DSL + - Added CopyDsmemStoreOp to store data to distributed shared memory with explicit synchronization. + +* Bug fixing and improvements + - Fixed `cute.printf` with f-string + - Fixed an issue that cutlass.cuda.initialize_cuda_context() silently kills python + +* API changes + - Deprecate get_num_tmem_alloc_cols from blackwell_helpers.py. Use the one from tmem_allocator.py instead. + - Deprecate SM100_TMEM_CAPACITY_COLUMNS and SM100_TMEM_MIN_ALLOC_COLUMNS. + - LdMatrix16x16x8bOp and StMatrix16x8x8bOp now require explicit transpose=True when calling __init__, to avoid ambiguity in data transposition. + - LdMatrix16x16x8bOp copy traits updated to be faithful to PTX without permutations. Permuted variant is renamed to LdMatrix16x8x8bOp. + - group_bulk_copy_modes in async bulk copy example is now deprecated, use group_modes directly instead. + - cute.arch.calc_packed_f32x2_op default enable ftz to default disable ftz + +### CUTLASS C++ +* Add Hopper e2m1 to fp32 optimized conversion and e2m1 * TF32 tensor core GEMM. + - Set MmaType to tfloat32_t for FP32 mode. + - TF32 provides FP32 inputs with reduced precision (19-bit vs 32-bit) + - Set TileShapeK=64 for TF32 (K must be multiple of 8) + - Shuffle optimization enabled via `compute_memory_reordering_atom()` + - E2M1 -> FP32 -> TF32 TC path for mixed-precision GEMM + - Enable [example 55](https://github.com/NVIDIA/cutlass/tree/main/examples/55_hopper_mixed_dtype_gemm) with TF32 support +* Add [example 93](https://github.com/NVIDIA/cutlass/tree/main/examples/93_blackwell_low_latency_gqa/) for Blackwell low latency generation phase GQA kernel. + - Kernel design details please check [Readme](https://github.com/NVIDIA/cutlass/tree/main/examples/93_blackwell_low_latency_gqa/readme.md). +* Add [example 94](https://github.com/NVIDIA/cutlass/tree/main/examples/94_ada_fp8_blockwise/) for Ada FP8xFP8 -> BF16 GEMM with blockwise dequantization of input matrices in the MMA loop with FP32 accumulation. + - Generate additional device/kernel/threadblock files in CUTLASS include directory that add functionality to carry the scaling tensors + use them in MMA loop. + - Add gemm_blockwise to include files in [default_mma_core_sm80](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/gemm/threadblock/default_mma_core_sm80.h) +* Add Hopper SM90 State Space Decomposition (SSD) kernel in [example 111](https://github.com/NVIDIA/cutlass/tree/main/examples/111_hopper_ssd). +* Add Blackwell SM100 State Space Decomposition (SSD) kernel in [example 112](https://github.com/NVIDIA/cutlass/tree/main/examples/112_blackwell_ssd). +* Add support for arbitrary application-provided strides for block-scale tensors. + - Users and applications now must pass valid block-scale strides in all cases, even when the tensor is packed. +* Support 4x blockscaled public ptx for CUDA 13.1. +* Allow non-static `TmaGbasis` in `AuxTmaParams`. + - Some cases in attention kernel may require non-static `tma_gbasis`. + - Relax the restriction on `TmaGbasis` parameter of `AuxTmaParams` and users are allowed to manually construct a dynamic gbasis. +* Fix some kernel issues: + - Fix MSVC pre process issue. + - Fix a self assign issue in GEMV kernel. + - Fix a TMA descriptor bug where the CUDA driver is not properly setting the OOB address gen mode correctly. + - Fix memory fence for clc scheduler in Blackwell SM120 pingpong kernel. + - Fix missing SMEM alignment in Blackwell SM120 scale factors. +* Fix some profiler issues: + - Refactor L1 functional test generation logic to reduce the L1 test cases to avoid timeout. + - Fix a core dump issue for nvfp4 grouped GEMM kernel. + - Fix inconsistent GEMM verification logic. + - Rework grouped gemm verification logic for different types. +* Fix some broken links under `media/docs`. +* Various improvements and fixes from the community and CUTLASS team. Thanks to everyone who submitted PRs! +* Optimal code generation with CUDA toolkit versions 13.1. + ## [4.3.5](https://github.com/NVIDIA/cutlass/releases/tag/v4.3.5) (2026-01-09) ### CuTe DSL @@ -405,7 +466,7 @@ - Sorting performance results by GFLOPs/second: Users can now sort the final performance report based on GFLOPs/second, making it easier to identify the most efficient kernels. - Exhaustive search for best kernel performance in GFLOPs/second: The profiler now searches for the best-performing kernel across a range of problem sizes, swizzle sizes, rasterization orders, and dynamic cluster configurations to maximize performance. - Performance search under a fixed GEMM shape: Enables exhaustive tuning within a fixed GEMM shape, exploring various kernel parameters to find the best configuration. - - More detailed introductions and examples to leverage this feature can be found in [profiler.md](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/profiler.html#exhaustive-search-mode-and-top-k-output-ranking-according-to-performance-in-gflopss). + - More detailed introductions and examples to leverage this feature can be found in [profiler.md](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/profiler.html#exhaustive-search-mode-and-top-k-output-ranking-according-to-performance-in-gflops-s). * Support `void` as the D element in sm100 kernel epilogues. * Various improvements and fixes from the community and CUTLASS team. Thanks to everyone who submitted PRs! * Optimal code generation with CUDA toolkit versions 12.8U1. @@ -494,7 +555,7 @@ - [An improved mixed input GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/55_hopper_mixed_dtype_gemm/README.md) and a [lookup table implementation](https://github.com/NVIDIA/cutlass/tree/main/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_fp8_gemm.cu) for `INT4`x`FP8` scale-only mode. - [EVT nodes for Top-K selection and softmax](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/fusion/sm90_visitor_topk_softmax.hpp) and [GEMM example using those](https://github.com/NVIDIA/cutlass/tree/main/examples/61_hopper_gemm_with_topk_and_softmax/61_hopper_gemm_with_topk_and_softmax.cu). - [Programmatic Dependent Launch](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/arch/grid_dependency_control.h) (PDL) that leverages a new Hopper feature to speedup two back-to-back kernels, and its corresponding [documentations](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/dependent_kernel_launch.html). -- [A new debugging tool, synclog](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/arch/synclog.hpp), for dumping out all synchronization events from within a kernel to a file. Please see [synclog documentation](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/utilities.html#debugging-asynchronous-kernels-with-cutlasss-built-in-synclog-tool) for details. +- [A new debugging tool, synclog](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/arch/synclog.hpp), for dumping out all synchronization events from within a kernel to a file. Please see [synclog documentation](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/utilities.html#debugging-asynchronous-kernels-with-cutlass-s-built-in-synclog-tool) for details. - A new TMA-enabled [epilogue](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/collective/sm90_epilogue_array_tma_warpspecialized.hpp) for grouped GEMM that brings significant performance improvement, as well as its EVT support. - A SIMT-enabled pointer-array [epilogue](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/collective/sm70_epilogue_vectorized_array.hpp). - A new [Ping-Pong kernel schedule for Grouped GEMM](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/gemm/kernel/sm90_gemm_array_tma_warpspecialized_pingpong.hpp) and some other optimizations. @@ -617,7 +678,7 @@ * [Batched B2B GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/13_two_tensor_op_fusion) now can run multiple Back-to-Back GEMM with the same problem size in parallel. * [Batched Strided GEMV](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemv.cu) support both row major and column major input matrix. * [Permute + GEMM fusion](https://github.com/NVIDIA/cutlass/tree/main/examples/39_gemm_permute) can fuse Permute with following GEMM now. Before, we only support fusing GEMM with Permute in the epilogue. -* [Row Broadcast](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/threadblock/predicated_tile_iterator_row_broadcast.h) can be fused in the epilogue. +* [Row Broadcast](https://github.com/NVIDIA/cutlass/blob/8236f30675bbe98f81d11c05764b77bfcb25b8cc/include/cutlass/epilogue/threadblock/predicated_tile_iterator_row_broadcast.h) can be fused in the epilogue. * The GitHub branch is renamed from `master` to `main` in this release. * Optimal performance using [**CUDA 12.1**](https://developer.nvidia.com/cuda-downloads) * Updates and bugfixes from the community (thanks!) @@ -632,7 +693,7 @@ * Extensions to CUTLASS profiler to support threadblock cluster shapes in library and profiler tile configurations. * [CUTLASS library integration](https://github.com/NVIDIA/cutlass/tree/main/tools/library/src/gemm_operation_3x.hpp) for 3.x API kernels built through the new `CollectiveBuilder` API, enabling CUTLASS profiler. * Support for [Hopper GEMMs](https://github.com/NVIDIA/cutlass/tree/main/examples/48_hopper_warp_specialized_gemm) through the new 3.0 API with CuTe-based exposure of the Hopper [Tensor Memory Accelerator](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async-bulk-tensor) and [WGMMA Tensor Core](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#asynchronous-warpgroup-level-matrix-instructions) features. -* Set of examples that demonstrate the usage of the new 3.0 API to easily build GEMM kernels targeting Hopper: examples [48](https://github.com/NVIDIA/cutlass/tree/main/examples/48_hopper_warp_specialized_gemm), [49](https://github.com/NVIDIA/cutlass/tree/main/examples/49_hopper_gemm_schedules_with_collective_builder), and [50](https://github.com/NVIDIA/cutlass/tree/main/examples/50_hopper_gemm_with_epilogue_swizzle). +* Set of examples that demonstrate the usage of the new 3.0 API to easily build GEMM kernels targeting Hopper: examples [48](https://github.com/NVIDIA/cutlass/tree/main/examples/48_hopper_warp_specialized_gemm), [49](https://github.com/NVIDIA/cutlass/tree/main/examples/49_hopper_gemm_with_collective_builder), and [50](https://github.com/NVIDIA/cutlass/tree/main/examples/50_hopper_gemm_with_epilogue_swizzle). # CUTLASS 2.x @@ -662,7 +723,7 @@ * [CUTLASS Python](https://github.com/NVIDIA/cutlass/tree/main/examples/40_cutlass_py) now supports GEMM, CONV, Group GEMM for different data types as well as different epilogue flavours. * Optimizations for CUTLASS's [Grouped GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/24_gemm_grouped/gemm_grouped.cu) kernel. Threadblock scheduling part is improved. Some computation can be moved to the host side if applicable. [Grouped Syr2k](https://github.com/NVIDIA/cutlass/tree/main/examples/38_syr2k_grouped/syr2k_grouped.cu) kernels are added, too. * Optimizations for [GEMM+Softmax](https://github.com/NVIDIA/cutlass/tree/main/examples/35_gemm_softmax). All the reduction computation is fused into the previous GEMM. More template arguments are provided to fine tune the performance. -* [Grouped GEMM for Multihead Attention](https://github.com/NVIDIA/cutlass/tree/main/examples/41_multi_head_attention). This general group gemm based MHA does not require the sequence length of all GEMMs to be the same which makes it most useful for natural language processing. +* [Grouped GEMM for Multihead Attention](https://github.com/NVIDIA/cutlass/tree/main/examples/41_fused_multi_head_attention). This general group gemm based MHA does not require the sequence length of all GEMMs to be the same which makes it most useful for natural language processing. * [GEMM + Layer norm fusion for Ampere](https://github.com/NVIDIA/cutlass/tree/main/examples/37_gemm_layernorm_gemm_fusion/) splits the layernorm into two parts and both of them can be fused into the GEMMs before and after separately. In addition to use square sum to compute variance of layernorm, [Shift-K](https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Computing_shifted_data) is provided if square sum raise numerical issues. * [GEMM Epilogue Permutation Fusion](https://github.com/NVIDIA/cutlass/tree/main/examples/39_gemm_permute) can apply user provided permutation layout mapping in the GEMM epilogue. * [Grouped convolution targeting implicit GEMM](https://github.com/NVIDIA/cutlass/tree/main/test/unit/conv/device/group_conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.cu) introduces the first group convolution implementation to CUTLASS. It is an Analytical implementation, not an Optimized. The restrictions are: 1) input and output channel number should be multiple of group number. 2) split-K is not supported. The implementation has 2 modes: @@ -689,7 +750,7 @@ * [TRMM](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/trmm_f32n_f32t_f32t_tensor_op_fast_f32_ls_sm80.cu) with [emitter](https://github.com/NVIDIA/cutlass/tree/main/python/cutlass_library/trmm_operation.py) * [Unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/testbed_rank_k_universal.h) * [CUTLASS Python](https://github.com/NVIDIA/cutlass/tree/main/examples/40_cutlass_py) demonstrating JIT compilation of CUTLASS kernels and a Python-based runtime using [CUDA Python](https://developer.nvidia.com/cuda-python) - * [Python-based runtime](https://github.com/NVIDIA/cutlass/tree/main/tools/library/scripts/rt.py) interoperable with existing emitters + * [Python-based runtime](https://github.com/NVIDIA/cutlass/blob/d572cc1aabfcbd45944219fb8690f0e49e22b5a3/tools/library/scripts/rt.py) interoperable with existing emitters * [GEMM + Softmax example](https://github.com/NVIDIA/cutlass/tree/main/examples/35_gemm_softmax) * [Gather and Scatter Fusion with GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/36_gather_scatter_fusion) can gather inputs and scatters outputs based on indices vectors in the same GEMM kernel. * It can select random rows in a row major matrix. @@ -811,7 +872,7 @@ ## [2.3.0](https://github.com/NVIDIA/cutlass/releases/tag/v2.3.0) (2020-09-23) * [NVIDIA Ampere Architecture features](https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/) * [Sparse Tensor Core GEMM kernels](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16n_f32t_tensor_op_f32_sparse_sm80.cu): - * Direct access to Sparse Tensor Cores and maximum performance via [`mma.sp.sync`](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-mma-and-friends) + * Direct access to Sparse Tensor Cores and maximum performance via [`mma.sp.sync`](https://docs.nvidia.com/cuda/parallel-thread-execution/#warp-level-matrix-instructions) * Fast SGEMM targeting GeForce RTX 30-series CUDA Cores * Minor Features: * [Activation functions](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/thread/activation.h) such as [GeLU](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/thread/linear_combination_gelu.h) and [Sigmoid](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/epilogue/thread/linear_combination_sigmoid.h) @@ -825,7 +886,7 @@ ## [2.2.0](https://github.com/NVIDIA/cutlass/releases/tag/v2.2.0) (2020-06-08) * [NVIDIA Ampere Architecture features](https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/) * Fast Tensor Core operations: - * Maximum performance via [`mma.sync`](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-mma-and-friends) + * Maximum performance via [`mma.sync`](https://docs.nvidia.com/cuda/parallel-thread-execution/#warp-level-matrix-instructions) * Tensor Float 32, BFloat16, and double-precision data types * Mixed integer data types (int8, int4, bin1) * Asynchronous copy for deep software pipelines via [`cp.async`](https://docs.nvidia.com/cuda/parallel-thread-execution) @@ -874,9 +935,6 @@ ## [1.3.2](https://github.com/NVIDIA/cutlass/releases/tag/v1.3.2) (2019-07-09) * Performance improvement for Volta Tensor Cores TN and TT layouts. -## [1.3.1](https://github.com/NVIDIA/cutlass/releases/tag/v1.3.1) (2019-04-09) - * Corrected NVRTC unit tests. - ## [1.3.0](https://github.com/NVIDIA/cutlass/releases/tag/v1.3.0) (2019-03-20) * Efficient GEMM kernel targeting Volta Tensor Cores via `mma.sync` instruction added in CUDA 10.1. diff --git a/CMakeLists.txt b/CMakeLists.txt index c941d5aa..0c9c35d3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -267,6 +267,10 @@ if (WIN32) # Disable warning on Unicode characters list(APPEND CUTLASS_CUDA_NVCC_FLAGS -Xcompiler=/wd4819) + # Disable warning on macro expansion producing 'defined' has undefined behavior + list(APPEND CUTLASS_CUDA_NVCC_FLAGS -Xcompiler=/wd5105) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd5105") + # Disable excess x86 floating point precision that can lead to results being labeled incorrectly list(APPEND CUTLASS_CUDA_NVCC_FLAGS -Xcompiler=/fp:strict) endif(WIN32) @@ -620,8 +624,8 @@ if (MSVC) # # See https://developercommunity.visualstudio.com/t/msvc-incorrectly-defines-cplusplus/139261 - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus") - set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler /Zc:__cplusplus") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus /Zc:preprocessor") + set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler /Zc:__cplusplus -Xcompiler /Zc:preprocessor") endif() @@ -1134,6 +1138,8 @@ function(cutlass_generate_profiler_tests NAME) endif() endforeach() + message(STATUS "Finished processing ${CUTLASS_PROFILER_REGRESSION_LIST_FILE} to generate profiler-based tests.") + cutlass_add_executable_tests( ${NAME} cutlass_profiler diff --git a/README.md b/README.md index af692c80..b7b32ee7 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.3.5 +# CUTLASS 4.4.0 -_CUTLASS 4.3.5 - Jan 2026_ +_CUTLASS 4.4.0 - Jan 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 @@ -43,116 +43,64 @@ To get started quickly - please refer : - [CUTLASS C++ Quick Start Guide](https://docs.nvidia.com/cutlass/latest/media/docs/cpp/quickstart.html). - [CuTe DSL Quick Start Guide](https://docs.nvidia.com/cutlass/latest/media/docs/pythonDSL/quick_start.html). -# What's New in CUTLASS 4.3 +# What's New in CUTLASS 4.4 -## CuTe DSL -* New features: - - Supported Apache [TVM-FFI](https://tvm.apache.org/ffi/index.html) for further reduced host runtime overhead for JIT functions, better PyTorch and ML frameworks interopability - - Added fake tensor and stream to decouple compile jit function with "from_dlpack" flow. Now we no longer require users to have real tensor when compile jit function. - - Added FastDivmodDivisor with Python operator overloads, new APIs, Cute dialect integration, and optimized static tile scheduler performance for faster index mapping. - - Added l2 cache evict priority for tma related ops. Users could do fine-grain l2 cache control. - - Added Blackwell SM103 support. - - Multiple dependent DSOs in the wheel have been merged into one single DSO. - - New env var `CUTE_DSL_CACHE_DIR` to specify the path for dumping caches. - - Supported namedtuple and kwargs for JIT function arguments in tvm-ffi. - - Supported variadic tuples for JIT function argument in tvm-ffi. - - Added PDL support along with example [Kernel launch with Programmatic Dependent Launch](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/programmatic_dependent_launch.py) -* Debuggability improvements: - - Supported source location tracking for DSL APIs (Allow tools like ``nsight`` profiling to correlate perf metrics with Python source code) - - Supported dumping PTX and CUBIN code: [Hello World Example](https://github.com/NVIDIA/cutlass/blob/main/examples/python/CuTeDSL/notebooks/hello_world.ipynb) -* More examples and notebooks to get started with CuTe DSL: - - Improved performance of [elementwise example](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/ampere/elementwise_apply.py): - + Generalize code to handle list of input tensors - + Generalize TV layout computation to handle different data types - - Improved [Blackwell SM100 persistent dense GEMM with static scheduling](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/dense_gemm_persistent.py): - + To demonstrate usage of new Pipeline APIs `PipelineProducer` and `PipelineConsumer` to simplify code without explicit pipeline state management (Exiting APIs are still maintained) - + Separated epilogue code for non-TMA and TMA implementation - - [Tutorial for Blackwell GEMM: Basic Blackwell SM100 GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/tutorial_gemm) - + [Baseline Blackwell GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/tutorial_gemm/fp16_gemm_0.py) achieves 84% SOL performance with MNK 8K - + More examples are coming for demo of optimization: `Baseline + X` - - [Tutorial for Async Pipeline API](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/notebooks/async_pipeline.ipynb) - - Reworked [elementwise add notebook](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/notebooks/elementwise_add.ipynb) with more details and detailed explanation about TV layout - + Updated implementation to handle general data type and multiple inputs - + Updated explanation for TV layout in simpler language - + Added visualization of TV Layout with 3rd party utils - - [Benchmark and autotune demonstration](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/notebooks/benchmark_autotune.ipynb) -* More examples of authorizing peak-performance kernels: - - [Blackwell SM100 mixed-input GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/mixed_input_gemm.py) - - [Blackwell SM100 persistent blockwise dense GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/blockwise_gemm/blockwise_gemm.py) - - [Blackwell SM100 persistent blockwise contiguous grouped dense GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/blockwise_gemm/contiguous_grouped_gemm.py) - - [Blackwell SM100 persistent blockwise masked grouped dense GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/blockwise_gemm/masked_grouped_gemm.py) - - [Blackwell SM100 fmha bwd](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/fmha_bwd.py) - - [Blackwell SM100 mla](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/mla.py) - - [Hopper SM90 persistent dense GEMM with static scheduling](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/hopper/dense_gemm_persistent.py) - - [Blackwell GeForce batched dense GEMM](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell_geforce/dense_gemm.py) - - [Ampere HSTU Attention](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/ampere/hstu_attention.py) -* API updates: - - Please refer to [DSL API changelog](https://docs.nvidia.com/cutlass/latest/media/docs/pythonDSL/cute_dsl_api/changelog.html) for details -* Bug fixings and improvements - - Add mma_tiler_n=64 and mma_tiler_n=192 support in [Blackwell SM100 persistent dense blockscaled GEMM with static scheduling](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/dense_blockscaled_gemm_persistent.py). - - Fixed ``TensorSSA.reduce`` to support static value as initial value - - Updated docstring for following APIs to be more concise and easier to understand: - - ``make_layout_tv`` - - ``is_static`` - - ``PipelineAsync`` - - ``SmemAllocator`` - - Fixed documentation for ``pipeline``, ``utils`` and ``cute.math`` - - Added overlapping accumulator optimization for block tile N = 256 case for better epilogue latency hiding in [Blackwell SM100 persistent dense blockscaled GEMM with static scheduling](https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/blackwell/dense_blockscaled_gemm_persistent.py). - - Fixed TensorSSA.__getitem__ indexing to match CuTe's indexing convention - - Fixed an issue with cutlass.max and cutlass.min - - Fixed an issue with mark_compact_shape_dynamic - - Fixed device reset issue with tvm-ffi - - Fixed tvm-ffi export compiled function - - Fixed an issue of CUDA JitExecutor when unloading kernels - - Fixed an issue of allocating max smem when there's statically allocated smem - - Fixed an issue when JIT function argument with union type annotation for tvm-ffi - - Clearer error message for the case of runtime error cudaErrorInsufficientDriver - - Fixed a frame refcnt issue with cuda graph - - Enhancement for tvm-ffi AoT case for earlier module unload - - Fixed order issue in make_smem_layout_a in utils/hopper_helpers.py - - Fixed the unexpected CPU overhead issue introduced by 4.3.4 -* Update copyright to 2026. +### CuTe DSL +* New features + - Ahead of Time (AoT) compilation is now available! + + Refer to files under https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/cute/export for example usage + - JAX support - you can now use CuTeDSL along with JAX + + Refer to files under https://github.com/NVIDIA/cutlass/tree/main/examples/python/CuTeDSL/jax for example usage + - Introduced versioning support in DSL: + + cutlass.__version__ for a string representation of DSL version + + cutlass.CUDA_VERSION for a version class to tell the CUDA version used for DSL + - Added CopyDsmemStoreOp to store data to distributed shared memory with explicit synchronization. -## CUTLASS C++ -* Further enhance Blackwell SM100 Attention kernels in [example 77](https://github.com/NVIDIA/cutlass/tree/main/examples/77_blackwell_fmha/). - - Add softmax skip correction. - - Fix a shared memory allocation bug where it needs to opt in maximum dynamics shared memory explicitly once it exceeds 48KB. - - Fix a dead hang issue caused by early return warp. -* Add support through cmdline argument lists for `batch`, `no_verif`, `cluster_shape` and `cluster_shape_fallback` in [example 89](https://github.com/NVIDIA/cutlass/tree/main/examples/89_sm103_fp4_ultra_gemm/). -* Add Ragged Contiguous Grouped gemm kernel in [example 92](https://github.com/NVIDIA/cutlass/tree/main/examples/92_blackwell_moe_gemm/). - - This kernel uses a TMA 3D load to load the weights matrix and use the tensormap update method to load activations. -* Add 256x128 tile size support for Hopper SM90 deepgemm in [example 67](https://github.com/NVIDIA/cutlass/tree/main/examples/67_hopper_fp8_warp_specialized_gemm_with_blockwise_scaling/). - - Performance is optimized to align with Deepseek implementation. -* Simplification of API for MoE gemms. - - Instead of requiring users to call several cute utilities to set up the stride, API `moe_stride_utils` is introduced to help setup strides in the kernel. - - Instead of requiring users to set vectors like `problem_shapes_device` and `problem_shapes_hosts`, a new problem shape struct called `MoEProblemShape` is introduced which takes in max_m, max_n, max_k and counts vector as input and deduce problem shapes internally whenever required. -* Enable GEMM_K = 0 in grouped gemm. -* Optimize group gemm kernels by enabling async TMA desc update. -* Support Blackwell SM100 convolution stream-K kernel. - - Unit tests: [fprop_streamK](https://github.com/NVIDIA/cutlass/tree/main/test/unit/conv/device_3x/fprop/sm100_conv3d_fprop_implicit_gemm_f16_f16_f16_tensorop_f16_streamk.cu), [dgrad_streamK](https://github.com/NVIDIA/cutlass/tree/main/test/unit/conv/device_3x/dgrad/sm100_conv3d_dgrad_implicit_gemm_f16_f16_f16_tensorop_f16_streamk.cu), [wgrad_streamK](https://github.com/NVIDIA/cutlass/tree/main/test/unit/conv/device_3x/wgrad/sm100_conv2d_wgrad_implicit_gemm_f16_f16_f16_tensorop_f16_streamk.cu). -* Add Blackwell SM100 sparse gemm compressor unit tests. - - Unit tests: [compressor_fp16](https://github.com/NVIDIA/cutlass/tree/main/test/unit/transform/device/sm100_sparse_gemm_compressor_f16.cu). - - Add sub-bytes and runtime data type support in compressor unit test testbed. -* Add profiler support for: - - Blackwell SM100 and SM120 blockscaled sparse kernels. - - New MoE grouped gemm API. - - Blackwell SM100 cpasync kernel. +* Bug fixing and improvements + - Fixed `cute.printf` with f-string + - Fixed an issue that cutlass.cuda.initialize_cuda_context() silently kills python + +* API changes + - Deprecate get_num_tmem_alloc_cols from blackwell_helpers.py. Use the one from tmem_allocator.py instead. + - Deprecate SM100_TMEM_CAPACITY_COLUMNS and SM100_TMEM_MIN_ALLOC_COLUMNS. + - LdMatrix16x16x8bOp and StMatrix16x8x8bOp now require explicit transpose=True when calling __init__, to avoid ambiguity in data transposition. + - LdMatrix16x16x8bOp copy traits updated to be faithful to PTX without permutations. Permuted variant is renamed to LdMatrix16x8x8bOp. + - group_bulk_copy_modes in async bulk copy example is now deprecated, use group_modes directly instead. + - cute.arch.calc_packed_f32x2_op default enable ftz to default disable ftz + +### CUTLASS C++ +* Add Hopper e2m1 to fp32 optimized conversion and e2m1 * TF32 tensor core GEMM. + - Set MmaType to tfloat32_t for FP32 mode. + - TF32 provides FP32 inputs with reduced precision (19-bit vs 32-bit) + - Set TileShapeK=64 for TF32 (K must be multiple of 8) + - Shuffle optimization enabled via `compute_memory_reordering_atom()` + - E2M1 -> FP32 -> TF32 TC path for mixed-precision GEMM + - Enable [example 55](https://github.com/NVIDIA/cutlass/tree/main/examples/55_hopper_mixed_dtype_gemm) with TF32 support +* Add [example 93](https://github.com/NVIDIA/cutlass/tree/main/examples/93_blackwell_low_latency_gqa/) for Blackwell low latency generation phase GQA kernel. + - Kernel design details please check [Readme](https://github.com/NVIDIA/cutlass/tree/main/examples/93_blackwell_low_latency_gqa/readme.md). +* Add [example 94](https://github.com/NVIDIA/cutlass/tree/main/examples/94_ada_fp8_blockwise/) for Ada FP8xFP8 -> BF16 GEMM with blockwise dequantization of input matrices in the MMA loop with FP32 accumulation. + - Generate additional device/kernel/threadblock files in CUTLASS include directory that add functionality to carry the scaling tensors + use them in MMA loop. + - Add gemm_blockwise to include files in [default_mma_core_sm80](https://github.com/NVIDIA/cutlass/tree/main/include/cutlass/gemm/threadblock/default_mma_core_sm80.h) +* Add Hopper SM90 State Space Decomposition (SSD) kernel in [example 111](https://github.com/NVIDIA/cutlass/tree/main/examples/111_hopper_ssd). +* Add Blackwell SM100 State Space Decomposition (SSD) kernel in [example 112](https://github.com/NVIDIA/cutlass/tree/main/examples/112_blackwell_ssd). +* Add support for arbitrary application-provided strides for block-scale tensors. + - Users and applications now must pass valid block-scale strides in all cases, even when the tensor is packed. +* Support 4x blockscaled public ptx for CUDA 13.1. +* Allow non-static `TmaGbasis` in `AuxTmaParams`. + - Some cases in attention kernel may require non-static `tma_gbasis`. + - Relax the restriction on `TmaGbasis` parameter of `AuxTmaParams` and users are allowed to manually construct a dynamic gbasis. * Fix some kernel issues: - - Fix a race check issue of Blackwell SM103 kernels by adding missing elect one for prefetch barrier initialization. - - Allow user to directly specify the number of stages for Hopper sm90 mixed input gemm. - - Remove warnings caused by cuda vector type alignment setting in CUDA 13. - - Remove problematic `cutlass::int8_t` and replace it with `int8_t`. - - Fix a few bugs in distributed gemm API and examples. - - Fix handling negative zero in sparse compressor. - - Add missing `wait_on_dependent_grids` for PDL use case. - - Work around a driver bug which will cause occasionally errors when executing kernels. - - Use CUDA Driver Get Version Runtime APIs Rather than Driver APIs. + - Fix MSVC pre process issue. + - Fix a self assign issue in GEMV kernel. + - Fix a TMA descriptor bug where the CUDA driver is not properly setting the OOB address gen mode correctly. + - Fix memory fence for clc scheduler in Blackwell SM120 pingpong kernel. + - Fix missing SMEM alignment in Blackwell SM120 scale factors. * Fix some profiler issues: - - Add some missing reference kernels. - - Support VoidC reference kernels. - - Add calculation of scale factor A and B in function `bytes_with_problem_shape` of block scaled profiler. - - Fix an issue when epilogue tile N is not divided by default subtile N. -* Update copyright to 2026. + - Refactor L1 functional test generation logic to reduce the L1 test cases to avoid timeout. + - Fix a core dump issue for nvfp4 grouped GEMM kernel. + - Fix inconsistent GEMM verification logic. + - Rework grouped gemm verification logic for different types. +* Fix some broken links under `media/docs`. Note: CUTLASS 4.x builds are known to be down on Windows platforms for all CUDA toolkits. CUTLASS team is working on a fix. diff --git a/examples/111_hopper_ssd/111_hopper_ssd.cu b/examples/111_hopper_ssd/111_hopper_ssd.cu new file mode 100644 index 00000000..78d77530 --- /dev/null +++ b/examples/111_hopper_ssd/111_hopper_ssd.cu @@ -0,0 +1,849 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#include +#include "cutlass/util/command_line.h" + +#include "cutlass/cutlass.h" + +#include "cute/tensor.hpp" +#include "cute/layout.hpp" +#include "cutlass/kernel_hardware_info.hpp" + +#include "thrust/universal_vector.h" +#include "cutlass/util/distribution.h" +#include "cutlass/util/host_tensor.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/util/reference/host/tensor_fill.h" +#include "cutlass/util/reference/host/tensor_copy.h" +#include "cutlass/util/reference/host/tensor_compare.h" +#include "cutlass/util/reference/device/tensor_fill.h" +#include "cutlass/util/reference/device/tensor_compare.h" + +#if defined(CUTLASS_ARCH_MMA_SM90_SUPPORTED) + +#include "reference/reference_ssd_cumsum.hpp" +#include "reference/reference_ssd.hpp" + +#include "cutlass/transform/device/transform_universal_adapter.hpp" + +#include "device/ssd.hpp" +#include "kernel/sm90_ssd_kernel_builder.hpp" + +using namespace cute; + +// Command line options parsing +struct Options { + + using Element = cutlass::bfloat16_t; + using ElementAcc = float; + using ElementDA = float; + static constexpr bool D_HAS_HDIM = true; + static constexpr bool HAS_D = true; + static constexpr bool HAS_Z = true; + + bool help; + bool error; + + // All static number now + int G = 2; + int B = 3; + int E = 2; + int H = 2; + // Reference kernel doesn't support dynamic C now. + static constexpr auto C = Int<8>{}; + static constexpr auto D = Int<64>{}; + static constexpr auto L = Int<128>{}; + static constexpr auto N = Int<128>{}; + int EH = E * H; + + int iterations; + bool verify; + bool verbose; + + int warmups; + bool measure; + + Options(): + help(false), + error(false), + iterations(1), verify(true), + measure(false), warmups(3) + {} + + // Parses the command line + void parse(int argc, char const **args) { + cutlass::CommandLine cmd(argc, args); + + Options defaults; + + if (cmd.check_cmd_line_flag("help")) { + help = true; + return; + } + + cmd.get_cmd_line_argument("iterations", iterations, defaults.iterations); + cmd.get_cmd_line_argument("G", G, defaults.G); + cmd.get_cmd_line_argument("B", B, defaults.B); + cmd.get_cmd_line_argument("E", E, defaults.E); + cmd.get_cmd_line_argument("H", H, defaults.H); + verbose = cmd.check_cmd_line_flag("verbose"); + verify = !(cmd.check_cmd_line_flag("without_verify")); + + EH = E*H; + + if (iterations > 1) { + measure = true; + verbose = true; + } + + auto problem_shape = cute::make_tuple(G, B, EH, C, L, D, N); + cute::print("problem_shape : "); cute::print(problem_shape); cute::print("\n"); + } + + /// Prints the usage statement. + std::ostream & print_usage(std::ostream &out) const { + + out << "111_hopper_ssd\n\n" + << "Options:\n\n" + << " --help If specified, displays this usage statement\n\n" + << " --iterations= Benchmarking iterations.\n" + << " --without_verify Don't verify the results.\n" + << " --verbose Print execution time per kernel\n" + << " --G= Group\n" + << " --B= Batch\n" + << " --E= Expanded factor\n" + << " --H= Number of heads\n" + << "\n"; + + return out; + } + + + auto get_problem_shape() const { + return cute::make_tuple(G, B, EH, C, L, D, N); + } + + // acceptable layout by cuDNN + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + + auto layoutX() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutDelta() const { + auto layout = make_layout(make_shape(L, C, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutDeltaA() const { + auto layout = make_layout(make_shape(L, C, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutB() const { + auto layout = make_layout(make_shape(L, C, N, G, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutC() const { + auto layout = make_layout(make_shape(L, C, N, G, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutY() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutF() const { + auto layout = make_layout(make_shape(N, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutD() const { + if constexpr (D_HAS_HDIM) { + auto layout = make_layout(make_shape(D, EH)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + else { + auto layout = make_layout(make_shape(Int<1>{}, EH)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + } + + auto layoutZ() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + // transformed layout for kernel parameters + + auto layoutX_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(D,L,int32_t(C),EH*B), + make_stride( + stride<2>(layout), + stride<0>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutB_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),N,G*B)); + return make_layout( + make_shape(L,N,int32_t(C),G*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutC_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),N,G*B)); + return make_layout( + make_shape(L,N,int32_t(C),G*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutDelta_transformed() const { + return make_layout(make_shape(L,int32_t(C),EH*B)); + } + + auto layoutY_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(L,D,int32_t(C),EH*B), // (M,K,L,...) + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutF_transformed() const { + auto layout = make_layout(make_shape(N,D,EH*B)); + return make_layout( + make_shape(D,N,EH*B), + make_stride( + stride<1>(layout), + stride<0>(layout), + stride<2>(layout) + ) + ); + } + + auto layoutD_transformed() const { + if constexpr (D_HAS_HDIM) { + return make_layout(make_shape(D, EH)); + } + else { + return make_layout(make_shape(Int<1>{}, EH)); + } + } + + auto layoutZ_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(L,D,int32_t(C),EH*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + +}; + +template +static void +initialize_values( + thrust::universal_vector& dst_ptr, + cutlass::Distribution::Kind dist_kind, + uint64_t seed, + Element var = Element(1.f)) { + if (cutlass::Distribution::Uniform == dist_kind) { + int scope = 2; + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, scope, -scope, 0); + } + else if (cutlass::Distribution::AllZeros == dist_kind) { + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, 0, 0, 0); + } + else if (cutlass::Distribution::AllOnes == dist_kind) { + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, 1, 1, 0); + } + else if (cutlass::Distribution::Gaussian == dist_kind) { + cutlass::reference::device::BlockFillRandomGaussian( + dst_ptr.data().get(), dst_ptr.size(), seed, (Element) 0, var); + } + else if (cutlass::Distribution::Sequential == dist_kind) { + cutlass::reference::host::BlockFillSequential(dst_ptr.data().get(), dst_ptr.size()); + } + else { + std::cerr << "Invalid distribution kind!\n."; + exit(1); + } +} + +template < + class Options_ +> +struct TestBed { + using Option = Options_; + using Element = typename Option::Element; + using ElementDA = typename Option::ElementDA; + using ElementAcc = typename Option::ElementAcc; + + thrust::universal_vector tensor_X; + thrust::universal_vector tensor_DeltaA; + thrust::universal_vector tensor_DeltaA_cumsum; + thrust::universal_vector tensor_Delta; + thrust::universal_vector tensor_B; + thrust::universal_vector tensor_C; + thrust::universal_vector tensor_D; + thrust::universal_vector tensor_Y; + thrust::universal_vector tensor_Z; + thrust::universal_vector tensor_Y_ref_0; + thrust::universal_vector tensor_Y_ref_1; + thrust::universal_vector tensor_F; + thrust::universal_vector tensor_F_ref_0; + thrust::universal_vector tensor_F_ref_1; + + cutlass::Distribution::Kind init_X = cutlass::Distribution::Uniform; + cutlass::Distribution::Kind init_DeltaA = cutlass::Distribution::Gaussian; + cutlass::Distribution::Kind init_Delta = cutlass::Distribution::Gaussian; + cutlass::Distribution::Kind init_B = cutlass::Distribution::Uniform; + cutlass::Distribution::Kind init_C = cutlass::Distribution::Uniform; + + using TileShape = decltype(make_shape(Options::L, Options::D, Options::N)); // (L, D, N) + using SsdOperation = cutlass::ssd::device::SSD< + typename cutlass::ssd::kernel::Sm90SsdBuilder< + Element, ElementDA, ElementAcc, Element, + TileShape, + Option::HAS_D, Option::D_HAS_HDIM, Option::HAS_Z + >::Kernel>; + using CumsumKenrel = cutlass::ssd::kernel::CumsumKernel; + using CumsumOperation = cutlass::transform::device::TransformUniversalAdapter; + + bool initialize(Options const& options, const cutlass::KernelHardwareInfo& hw_info, uint64_t seed = 2023) { + auto [g, b, eh, c, l, d, n] = options.get_problem_shape(); + assert(g == 1 && "Only group size == 1 is supported") ; + + auto size_X = b * eh * c * l * d; + auto size_DeltaA = b * eh * c * l; + auto size_Delta = b * eh * c * l; + auto size_B = g * b * c * n * l; + auto size_C = g * b * c * n * l; + auto size_Y = b * eh * c * l * d; + auto size_F = b * eh * d * n; + + tensor_X .resize(sizeof(Element) * size(options.layoutX())); + tensor_DeltaA .resize(sizeof(Element) * size(options.layoutDeltaA())); + tensor_Delta .resize(sizeof(Element) * size(options.layoutDelta())); + tensor_B .resize(sizeof(Element) * size(options.layoutB())); + tensor_C .resize(sizeof(Element) * size(options.layoutC())); + tensor_D .resize(sizeof(Element) * size(options.layoutD())); + tensor_Z .resize(sizeof(Element) * size(options.layoutZ())); + tensor_Y .resize(sizeof(Element) * size(options.layoutY())); + tensor_Y_ref_0.resize(sizeof(Element) * size(options.layoutY())); + tensor_Y_ref_1.resize(sizeof(Element) * size(options.layoutY())); + tensor_F .resize(sizeof(Element) * size(options.layoutF())); + tensor_F_ref_0.resize(sizeof(Element) * size(options.layoutF())); + tensor_F_ref_1.resize(sizeof(Element) * size(options.layoutF())); + + tensor_DeltaA_cumsum.resize(sizeof(ElementDA) * size(options.layoutDeltaA())); + + // Limit distribution to reduce skew between hosts and devices + initialize_values(tensor_X, init_X, seed); + initialize_values(tensor_DeltaA, init_DeltaA, seed + 1, Element(0.05f)); + initialize_values(tensor_Delta, init_Delta, seed + 3, Element(0.05f)); + initialize_values(tensor_B, init_B, seed + 5); + initialize_values(tensor_C, init_C, seed + 7); + initialize_values(tensor_D, init_C, seed + 9); + initialize_values(tensor_Z, init_X, seed); + + cudaError_t result; + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the Initialization kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + } + + // apply cumsum(device) before kernel launch + typename CumsumOperation::Arguments arguments{ + make_shape(int(b), int(eh), int(c), int(l)), + { + tensor_DeltaA.data().get(), + tensor_DeltaA_cumsum.data().get(), + }, + hw_info + }; + + CumsumOperation op; + + size_t workspace_size = CumsumOperation::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = op.can_implement(arguments); + if (status != cutlass::Status::kSuccess) { + std::cerr << "This kernel is not supported. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + status = op.initialize(arguments, workspace.get()); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to initialize the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + // may be used uninitialized + cudaEvent_t start; + cudaEvent_t end; + cudaEventCreate(&start); + cudaEventCreate(&end); + + // warm up + if (options.measure) { + for (int i = 0; i < options.warmups; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + } + result = cudaEventRecord(start); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + // Run + for (int i = 0; i < options.iterations; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + result = cudaEventRecord(end); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + return false; + } + + float runtime_ms = 0; + result = cudaEventElapsedTime(&runtime_ms, start, end); + if (result != cudaSuccess) { + std::cerr << "cudaEventElapsed() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + runtime_ms /= static_cast(options.iterations); + + if (options.verbose) { + printf("[iters = %d, warmups = %d] cumsum kernel runtime_ms = %.4f\n", options.iterations, options.warmups, runtime_ms); + } + + return true; + } + + bool sufficient() const { + int device_idx; + cudaError_t result = cudaGetDevice(&device_idx); + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDevice() API call failed."); + } + + int max_smem_size; + result = cudaDeviceGetAttribute(&max_smem_size, cudaDevAttrMaxSharedMemoryPerBlockOptin, device_idx); + if (result != cudaSuccess) { + throw std::runtime_error("cudaDeviceGetAttribute() failed"); + } + + return true; + } + + bool run(Options const& options, const cutlass::KernelHardwareInfo& hw_info) { + if (!sufficient()) { + std::cerr << "Test waived due to insufficient CUDA device.\n"; + return true; + } + + if (!initialize(options, hw_info)) { + std::cerr << "Failed to initialize the test.\n"; + return true; + }; + + auto [g, b, eh, c, l, d, n] = options.get_problem_shape(); + typename SsdOperation::Arguments arguments{ + make_shape(int(g), int(b), int(eh), int(c), int(l), int(d), int(n)), + { + tensor_X.data().get(), + tensor_DeltaA_cumsum.data().get(), + tensor_Delta.data().get(), + tensor_B.data().get(), + tensor_C.data().get(), + options.layoutX_transformed(), + options.layoutB_transformed(), + options.layoutC_transformed(), + options.layoutDelta_transformed() + }, + { + tensor_Y.data().get(), + tensor_F.data().get(), + tensor_D.data().get(), + tensor_Z.data().get(), + options.layoutY_transformed(), + options.layoutF_transformed(), + options.layoutD_transformed(), + options.layoutZ_transformed() + }, + hw_info + }; + + SsdOperation op; + + size_t workspace_size = SsdOperation::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = op.can_implement(arguments); + if (status != cutlass::Status::kSuccess) { + std::cerr << "This kernel is not supported. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + status = op.initialize(arguments, workspace.get()); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to initialize the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + cudaError_t result; + // may be used uninitialized + cudaEvent_t start; + cudaEvent_t end; + cudaEventCreate(&start); + cudaEventCreate(&end); + + // warm up + if (options.measure) { + for (int i = 0; i < options.warmups; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + } + result = cudaEventRecord(start); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + // Run + for (int i = 0; i < options.iterations; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + result = cudaEventRecord(end); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + return false; + } + + float runtime_ms = 0; + result = cudaEventElapsedTime(&runtime_ms, start, end); + if (result != cudaSuccess) { + std::cerr << "cudaEventElapsed() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + runtime_ms /= static_cast(options.iterations); + + if (options.verbose) { + printf("[iters = %d, warmups = %d] ssd kernel runtime_ms = %.4f\n", options.iterations, options.warmups, runtime_ms); + printf("smem size = %d\n", SsdOperation::Kernel::SharedStorageSize); + } + // Matrix + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + auto mY_ref_0 = cute::make_tensor(tensor_Y_ref_0.data().get(), options.layoutY()); + auto mY_ref_1 = cute::make_tensor(tensor_Y_ref_1.data().get(), options.layoutY()); + auto mY_res = cute::make_tensor(tensor_Y.data().get(), options.layoutY()); + auto mF_ref_0 = cute::make_tensor(tensor_F_ref_0.data().get(), options.layoutF()); + auto mF_ref_1 = cute::make_tensor(tensor_F_ref_1.data().get(), options.layoutF()); + auto mF_res = cute::make_tensor(tensor_F.data().get(), options.layoutF()); + auto mX = cute::make_tensor(tensor_X.data().get(), options.layoutX()); + auto mB = cute::make_tensor(tensor_B.data().get(), options.layoutB()); + auto mC = cute::make_tensor(tensor_C.data().get(), options.layoutC()); + auto mD = cute::make_tensor(tensor_D.data().get(), options.layoutD()); + auto mZ = cute::make_tensor(tensor_Z.data().get(), options.layoutZ()); + auto mDelta = cute::make_tensor(tensor_Delta.data().get(), options.layoutDelta()); + auto mDeltaA = cute::make_tensor(tensor_DeltaA.data().get(), options.layoutDeltaA()); + + // Reference Device kernel + if (options.verify) { + ssd_reference( + mY_ref_1, + mF_ref_1, + mX, + mDelta, + mDeltaA, + mB, + mC, + mD, + mZ, + options + ); + } + + bool passed = true; + + if (options.verify) { + printf("[TensorY]verifying...\n"); + passed &= compare_reference<5>(mY_ref_1, mY_res); + printf("[TensorF]verifying...\n"); + passed &= compare_reference<4>(mF_ref_1, mF_res); + } + + return passed; + } + + template< + int TensorDim, + class Engine, class Layout + > + static constexpr bool + compare_reference( + cute::Tensor const& reference, + cute::Tensor const& computed, + float epsilon = 0.05f) { + if (size(reference) != size(computed)) { + return false; + } + + bool passed = true; + if (epsilon == 0.0f) { + // fast refcheck w/o epsilon + for (size_t i = 0; i < size_t(size(reference)); ++i) { + if (reference(i) != computed(i)) { + passed = false; + printf("[%llu] %f, %f\n", static_cast(i), + float(reference(i)), float(computed(i))); + break; + } + } + } + else { + // refcheck with epsilon + for (size_t i = 0; i < size_t(size(reference)); ++i) { + auto ref = static_cast(reference(i)); + auto act = static_cast(computed(i)); + auto abs_error = std::abs(act - ref); + auto rel_error = abs_error / (std::max(std::abs(act), std::abs(ref)) + 0.00001f); + if (std::isnan(abs_error) || std::isnan(rel_error) || + std::min(rel_error, abs_error) > epsilon) { + passed = false; + printf("[%llu] %f, %f\n", static_cast(i), + float(reference(i)), float(computed(i))); + break; + } + } + } + if (not passed) { + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + auto m = cute::shape<2>(reference); + auto n = cute::shape(reference); + printf("reference:\n"); + for (int mi = 0; mi < m; ++mi) { + for (int ni = 0; ni < n; ++ni) { + if constexpr (TensorDim == 5) { + printf("%.4f ", static_cast(reference(0,0,mi,2,ni))); + } + else { + printf("%.4f ", static_cast(reference(0,0,mi,ni))); + } + } + printf("\n"); + } + printf("\n"); + printf("computed:\n"); + for (int mi = 0; mi < m; ++mi) { + for (int ni = 0; ni < n; ++ni) { + if constexpr (TensorDim == 5) { + printf("%.4f ", static_cast(computed(0,0,mi,2,ni))); + } + else { + printf("%.4f ", static_cast(computed(0,0,mi,ni))); + } + } + printf("\n"); + } + printf("\n"); + } + return passed; + } +}; + +#endif // defined(CUTLASS_ARCH_MMA_SM90_SUPPORTED) + +int main(int argc, char const **args) { + + cudaDeviceProp props; + + cudaError_t error = cudaGetDeviceProperties(&props, 0); + if (error != cudaSuccess) { + std::cerr << "cudaGetDeviceProperties() returned an error: " << cudaGetErrorString(error) << std::endl; + return -1; + } + + if (__CUDACC_VER_MAJOR__ < 12 || props.major < 9) { + std::cout + << "This example requires a GPU of NVIDIA's Hopper Architecture or " + << "later (compute capability 90 or greater) and CUDA 12.0 or greater.\n"; + return 0; + } + else if (__CUDACC_VER_MAJOR__ < 12 || (props.major != 9 || props.minor != 0)) { + std::cout + << "This example requires a GPU of NVIDIA's Hopper Architecture " + << "(compute capability 90) and CUDA 12.0 or greater.\n"; + return 0; + } + +#if defined(CUTLASS_ARCH_MMA_SM90_SUPPORTED) + + // + // Parse options + // + + Options options; + + options.parse(argc, args); + + if (options.help) { + options.print_usage(std::cout) << std::endl; + return 0; + } + + if (options.error) { + std::cerr << "Aborting execution." << std::endl; + return -1; + } + + // Execute kernel + + printf("start testing....\n"); + + // The KernelHardwareInfo struct holds the number of SMs on the GPU with a given device ID. This + // information is used by the underlying kernel. + cutlass::KernelHardwareInfo hw_info; + + // Change device_id to another value if you are running on a machine with multiple GPUs and wish + // to use a GPU other than that with device ID 0. + hw_info.device_id = 0; + hw_info.sm_count = cutlass::KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + + // Check Device/Host ref kernel + TestBed testbed{}; + bool passed = testbed.run(options, hw_info); + + if (passed) { + printf("everything is ok.\n"); + } + else { + printf("something is wrong!!!!!\n"); + } + +#endif // defined(CUTLASS_ARCH_MMA_SM90_SUPPORTED) + + return 0; +} diff --git a/examples/111_hopper_ssd/CMakeLists.txt b/examples/111_hopper_ssd/CMakeLists.txt new file mode 100644 index 00000000..e1962109 --- /dev/null +++ b/examples/111_hopper_ssd/CMakeLists.txt @@ -0,0 +1,41 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set_property( + SOURCE 111_hopper_ssd.cu + PROPERTY COMPILE_FLAGS "--use_fast_math" + ) + +cutlass_example_add_executable( + 111_hopper_ssd + 111_hopper_ssd.cu + ) + +if(NOT WIN32 AND (NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))) + +endif() diff --git a/examples/111_hopper_ssd/README.md b/examples/111_hopper_ssd/README.md new file mode 100644 index 00000000..7f5f1aa1 --- /dev/null +++ b/examples/111_hopper_ssd/README.md @@ -0,0 +1,67 @@ +# NVIDIA Hopper SSD (State Space Decomposition) CUDA Example + +## Overview + +This example demonstrates the implementation of State Space Decomposition (SSD) operations on NVIDIA's Hopper GPU architecture. It showcases the use of CUTLASS library components for high-performance tensor computations that efficiently leverage Hopper's advanced hardware capabilities, including TMA (Tensor Memory Accelerator) and warp specialization. + +## System Requirements ++ NVIDIA GPU with Hopper Architecture (compute capability 9.0) ++ CUDA Toolkit 12.0 or newer ++ C++17 compatible compiler + +## Build the example +Follow the cutlass example building. + +## Command Line Options +The example supports the following command line options: +--help: Display the usage statement +--iterations=: Number of iterations for benchmarking (default: 1) +--without_verify: Skip result verification +--verbose: Print execution time per kernel +--G=: Group size (default: 2) +--B=: Batch size (default: 3) +--E=: Expanded factor (default: 2) +--H=: Number of heads (default: 2) + +## Limitation ++ Only support LxDxN = 128x64x128 ++ Uses bfloat16 precision for input/output tensors + +## Performance ++ Utilizes TMA (Tensor Memory Accelerator) for efficient memory access ++ Implements warp-specialized kernels for optimal resource utilization ++ Limited by the SEGSUM (segment sum) computation part ++ ALU bound operation + +# Copyright + +Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +``` + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + diff --git a/examples/111_hopper_ssd/collective/common.hpp b/examples/111_hopper_ssd/collective/common.hpp new file mode 100644 index 00000000..a1842e0f --- /dev/null +++ b/examples/111_hopper_ssd/collective/common.hpp @@ -0,0 +1,174 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/kernel_hardware_info.h" +#include "cute/tensor.hpp" + +namespace cutlass::ssd::collective { + +using namespace cute; + +template +CUTE_DEVICE void gemm_reset_zero_acc(Atom& atom, TA const& tA, TB const& tB, TC&& tC) { + constexpr int rA = decltype(rank(tA))::value; + constexpr int rB = decltype(rank(tB))::value; + constexpr int rC = decltype(rank(tC))::value; + if constexpr (rA == 2 && rB == 2 && rC == 1) { + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<1>(tA); k_block++) { + cute::gemm(atom, tA(_,k_block), tB(_,k_block), tC); + atom.accumulate_ = GMMA::ScaleOut::One; + } + } + else { + static_assert(rA == 3 && rB == 3 && rC == 3); + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tA); k_block++) { + cute::gemm(atom, tA(_,_,k_block), tB(_,_,k_block), tC); + atom.accumulate_ = GMMA::ScaleOut::One; + } + } +} + +template +CUTE_DEVICE void gemm_zero_acc(Atom& atom, TA const& tA, TB const& tB, TC&& tC) { + atom.accumulate_ = GMMA::ScaleOut::Zero; + gemm_reset_zero_acc(atom, tA, tB, tC); +} + +template class Primitive, cute::GMMA::Major tA, cute::GMMA::Major tB, cute::GMMA::ScaleIn sA, cute::GMMA::ScaleIn sB> +inline auto __device__ constexpr convert_to_gmma_rs(cute::MMA_Atom> const& tiled_mma) { + using Atom = cute::MMA_Atom>; + using ElementA = typename Atom::ValTypeA; + using ElementB = typename Atom::ValTypeB; + using ElementC = typename Atom::ValTypeC; + using Shape_MNK = typename Atom::Shape_MNK; + using RS = decltype(cute::GMMA::rs_op_selector()); + return cute::MMA_Atom{}; +} + +template class Primitive, cute::GMMA::ScaleIn sA, cute::GMMA::ScaleIn sB> +inline auto __device__ constexpr convert_to_gmma_rs(cute::MMA_Atom> const& tiled_mma) { + using Atom = cute::MMA_Atom>; + using ElementA = typename Atom::ValTypeA; + using ElementB = typename Atom::ValTypeB; + using ElementC = typename Atom::ValTypeC; + using Shape_MNK = typename Atom::Shape_MNK; + constexpr auto tA = cute::GMMA::Major::K; + constexpr auto tB = cute::GMMA::Major::K; + using RS = decltype(cute::GMMA::rs_op_selector()); + return cute::MMA_Atom{}; +} + +template +CUTE_DEVICE auto constexpr convert_to_gmma_rs(cute::TiledMMA const& tiled_mma) { + return cute::TiledMMA{}; +} + +template +CUTE_DEVICE auto constexpr convert_c_layout_to_a_layout(CLayout const& c, AValueShape const& a) { + return make_layout( + make_shape(a, shape<1>(c), make_shape(shape<2>(c), size<0>(c) / size(a))), + make_stride(stride<0>(c), stride<1>(c), make_stride(stride<2>(c), size<2>(a) * stride<0,2>(c)))); +} + +template +CUTE_DEVICE constexpr auto unstageSmemLayout(Layout const& layout, Stages stages = {}) { + return composition(layout, make_tuple(_, _, make_layout(stages))); +} + +template +CUTE_DEVICE auto make_acc_into_op(Accumulator const& acc, OperandLayout_TV const& operand_layout_tv) { + Tensor operand = make_fragment_like(convert_c_layout_to_a_layout(acc.layout(), shape<1>(operand_layout_tv))); + Tensor operand_as_acc = make_tensor(operand.data(), acc.layout()); + + cute::copy(acc, operand_as_acc); + + if constexpr (sizeof(Element) == 1) { + + // 00 11 22 33 00 11 22 33 acc layout + // 00 00 11 11 22 22 33 33 operand layout + // BB AA AA BB AA BB BB AA conflict-free exchange pattern + // 16-bit exchange; so process two at a time potentially + int tid = threadIdx.x % 4; + auto values_u32 = recast(operand); + + CUTE_UNROLL + for (int n = 0; n < size<1>(values_u32); n++) { + CUTE_UNROLL + for (int k = 0; k < size<2>(values_u32); k++) { + CUTE_UNROLL + for (int ii = 0; ii < 8; ii += 4) { + + uint32_t values_tmp_0 = values_u32(ii / 2 + 0, n, k); + uint32_t values_tmp_1 = values_u32(ii / 2 + 1, n, k); + + // step A: + // t 1 v 0 -> t 0 v 1 + // t 2 v 0 -> t 1 v 0 + // t 0 v 1 -> t 2 v 0 + // t 3 v 1 -> t 3 v 1 + + int v_to_send = tid == 1 || tid == 2 ? 0 : 1; + int v_to_recv = v_to_send; + int t_to_recv_from = (0x3021 >> (tid * 4)) & 0xF; + + uint32_t values_tmp_a = v_to_send == 0 ? values_tmp_0 : values_tmp_1; + + values_tmp_a = __shfl_sync(0xFFFFFFFF, values_tmp_a, t_to_recv_from, 4); + + // step B: + // t 0 v 0 -> t 0 v 0 + // t 3 v 0 -> t 1 v 1 + // t 1 v 1 -> t 2 v 1 + // t 2 v 1 -> t 3 v 0 + + v_to_send = 1 - v_to_send; + v_to_recv = 1 - v_to_recv; + t_to_recv_from = (0x2130 >> (tid * 4)) & 0xF; + + uint32_t values_tmp_b = v_to_send == 0 ? values_tmp_0 : values_tmp_1; + + values_tmp_b = __shfl_sync(0xFFFFFFFF, values_tmp_b, t_to_recv_from, 4); + + values_u32(ii / 2 + 0, n, k) = __byte_perm(values_tmp_a, values_tmp_b, v_to_send == 0 ? 0x1054 : 0x5410); + values_u32(ii / 2 + 1, n, k) = __byte_perm(values_tmp_a, values_tmp_b, v_to_send == 0 ? 0x3276 : 0x7632); + } + } + } + } + + return operand; +} + +} // namespace cutlass::fmha::collective diff --git a/examples/111_hopper_ssd/collective/sm90_ssd_epilogue.hpp b/examples/111_hopper_ssd/collective/sm90_ssd_epilogue.hpp new file mode 100644 index 00000000..9d2ef017 --- /dev/null +++ b/examples/111_hopper_ssd/collective/sm90_ssd_epilogue.hpp @@ -0,0 +1,838 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cutlass/fast_math.h" + +namespace cutlass::ssd::collective { +using namespace cute; + +template< + class ElementAcc_, + class Element_, + class TileShape_, + class EpilogueTile_, + class SmemLayoutX_, + class SmemLayoutY_, + class SmemLayoutPartialY_, + class SmemLayoutP_, + class SmemLayoutZ_, + int StagesD_, + int StagesY_, + int StagesZ_, + bool HAS_D_, + bool D_HAS_HDIM_, + bool HAS_Z_> +struct SsdEpilogue { + + using TileShape = TileShape_; + using ElementAcc = ElementAcc_; + using Element = Element_; + using ElementY = Element_; + using ElementP = Element_; + using ElementD = Element_; + using ElementX = Element_; + using ElementZ = Element_; + using EpilogueTile = EpilogueTile_; + using SmemLayoutX = SmemLayoutX_; + using SmemLayoutY = SmemLayoutY_; + using SmemLayoutPartialY = SmemLayoutPartialY_; + using SmemLayoutP = SmemLayoutP_; + using SmemLayoutZ = SmemLayoutZ_; + + static constexpr int StagesD = StagesD_; + static constexpr int StagesY = StagesY_; + static constexpr int StagesZ = StagesZ_; + static constexpr bool HAS_D = HAS_D_; + static constexpr bool D_HAS_HDIM = D_HAS_HDIM_; + static constexpr bool HAS_Z = HAS_Z_; + + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + static constexpr auto L = get<0>(TileShape{}); + static constexpr auto D = get<1>(TileShape{}); + static constexpr auto N = get<2>(TileShape{}); + + constexpr static size_t SmemAlignmentY = cutlass::detail::alignment_for_swizzle(SmemLayoutY{}); + + struct CollectiveStorage { + alignas(SmemAlignmentY) ArrayEngine> smem_y_partial; + alignas(SmemAlignmentY) ArrayEngine> smem_y; + alignas(SmemAlignmentY) ArrayEngine> smem_z; + }; + + using EpiloadPipelineD = cutlass::PipelineTmaAsync; + using EpiloadPipelineZ = cutlass::PipelineTmaAsync; + static constexpr int kEpiloadDBytes = D_HAS_HDIM ? D * sizeof(ElementD) : 0; + static constexpr int kEpiloadZBytes = HAS_Z ? cosize_v * sizeof(ElementZ) : 0; + + // TMA pipeline for storing D + using StorePipeline = cutlass::PipelineTmaStore; + using StorePipelineState = cutlass::PipelineState; + + // TMA pipeline for storing P + using StorePPipeline = cutlass::PipelineTmaStore<1>; + using StorePPipelineState = cutlass::PipelineState<1>; + + using CooperatePipeline = cutlass::PipelineAsync; + using CooperatePipelineState = cutlass::PipelineState; + + struct SharedStorage { + using TensorStorage = CollectiveStorage; + TensorStorage tensors; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + + using StrideY = cute::tuple<_1, int, int, int>; // (L,D,C,B) + using StrideP = cute::tuple; // (D,N,B) + using StrideZ = cute::tuple<_1, int, int, int>; // (L,D,C,B) + + using LayoutY = decltype(make_layout(make_shape(L, D, int32_t(0), int32_t(0)), + make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,D,C,B) + using LayoutP = decltype(make_layout(make_shape(D, N, int32_t(0)), make_stride(N, _1{}, D*N))); // (D,N,B) + + using LayoutD_2D = decltype(make_layout(make_shape(D, int32_t(0)), make_stride(_1{}, D))); // (D,EH) + using LayoutD_1D = decltype(make_layout(make_shape(_1{}, int32_t(0)), make_stride(_0{}, _1{}))); // (D,EH) + using LayoutD = cute::conditional_t< + D_HAS_HDIM, + LayoutD_2D, + LayoutD_1D + >; + using LayoutZ = decltype(make_layout(make_shape(L, D, int32_t(0), int32_t(0)), + make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,D,C,B) + + struct Arguments { + ElementY* ptr_Y{nullptr}; + ElementP* ptr_P{nullptr}; + const ElementD* ptr_D{nullptr}; + const ElementZ* ptr_Z{nullptr}; + LayoutY layout_Y{}; + LayoutP layout_P{}; + LayoutD layout_D{}; + LayoutZ layout_Z{}; + }; + + using CopyOpS2G = SM90_TMA_STORE; + using CopyOpG2S = SM90_TMA_LOAD; + + struct Params { + using TMA_Y = decltype(make_tma_atom( + CopyOpS2G{}, + make_tensor(make_gmem_ptr(static_cast(nullptr)),LayoutY{}), + take<0,2>(SmemLayoutY{}), + EpilogueTile{})); + using TMA_P = decltype(make_tma_atom( + CopyOpS2G{}, + make_tensor(make_gmem_ptr(static_cast(nullptr)),LayoutP{}), + take<0,2>(SmemLayoutP{}), + make_tile(shape<1>(TileShape{}), shape<2>(TileShape{})))); + using TMA_Z = decltype(make_tma_atom( + CopyOpG2S{}, + make_tensor(make_gmem_ptr(static_cast(nullptr)),LayoutZ{}), + take<0,2>(SmemLayoutZ{}), + make_tile(shape<0>(TileShape{}), shape<1>(TileShape{})))); + using TensorD = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutD{})); + + TMA_Y tma_store_y; + TMA_P tma_store_p; + TMA_Z tma_load_z; + TensorD tensor_d; + }; + + template + static Params to_underlying_arguments(ProblemShape const& problem_size, Arguments const& args, void* workspace = nullptr) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + auto tensor_y = make_tensor(make_gmem_ptr(args.ptr_Y), args.layout_Y); + auto tensor_p = make_tensor(make_gmem_ptr(args.ptr_P), args.layout_P); + auto tensor_d = make_tensor(make_gmem_ptr(args.ptr_D), args.layout_D); + auto tensor_z = make_tensor(make_gmem_ptr(args.ptr_Z), args.layout_Z); + + auto tma_store_y = make_tma_atom( + CopyOpS2G{}, + tensor_y, + take<0,2>(SmemLayoutY{}), + EpilogueTile{}); + auto tma_store_p = make_tma_atom( + CopyOpS2G{}, + tensor_p, + take<0,2>(SmemLayoutP{}), + make_tile(shape<1>(TileShape{}), shape<2>(TileShape{}))); + auto tma_load_z = make_tma_atom( + CopyOpG2S{}, + tensor_z, + take<0,2>(SmemLayoutZ{}), + make_tile(shape<0>(TileShape{}), shape<1>(TileShape{}))); + return Params{ + tma_store_y, + tma_store_p, + tma_load_z, + tensor_d + }; + } + + template< + class Params, class ProblemShape, + class EpiloadPipeline, class PipelineState, + class TensorStorage + > + CUTLASS_DEVICE + void load_d( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + EpiloadPipeline& pipeline, PipelineState& pipeline_state, + TensorStorage& shared_tensors) { + + if constexpr (D_HAS_HDIM) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + + auto& gD = params.tensor_d; + + ElementD* ptr_d = shared_tensors.smem_d.data(); + auto smem_layout = make_layout(make_shape(get<1>(TileShape{}), Int{})); // (D,) + auto sD = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_d), smem_layout)); + + auto bulk_atom = Copy_Atom{}; + + int write_stage = pipeline_state.index(); + + // LOCK pipeline_state for _writing_ + pipeline.producer_acquire(pipeline_state); + + using BarrierType = typename EpiloadPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(pipeline_state); + copy(bulk_atom.with(*tma_barrier), gD(_,blk_coord), sD(_,write_stage)); + + // Advance pipeline_state + ++pipeline_state; + } + } + + } + + template< + class EpiloadPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_d_tail(EpiloadPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + pipeline.producer_tail(pipeline_state); + } + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_z_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mZ_mkl = params.tma_load_z.get_tma_tensor(make_shape(L,D,C,EH*B)); + Tensor gZ_mkl = local_tile(mZ_mkl, TileShape{}, make_coord(_,_,_), Step<_1,_1,X>{}); + + return make_tuple(gZ_mkl); + } + + template< + class Params, class ProblemShape, + class EpiLoadPipeline, class PipelineState, + class GTensor, + class TensorStorage + > + CUTLASS_DEVICE + void load_z( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + EpiLoadPipeline& pipeline, PipelineState& pipeline_state, + cute::tuple const& load_inputs, + TensorStorage& shared_tensors) { + + if constexpr (HAS_Z) { + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + Tensor sZ_ = make_tensor(make_smem_ptr(shared_tensors.smem_z.begin()), SmemLayoutZ{}); + Tensor sZ = as_position_independent_swizzle_tensor(sZ_); + + // + // Prepare the TMA loads for Z + // + + Tensor gZ_mkl = get<0>(load_inputs); + + // Partition the inputs based on the current block coordinates. + Tensor gZ = gZ_mkl(_,_,_0{},_0{},_,blk_coord); + + auto oprands = tma_partition(params.tma_load_z, Int<0>{}, Layout<_1>{}, + group_modes<0,2>(sZ), group_modes<0,2>(gZ)); // (TMA,k) and (TMA,PIPE) + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + auto tZgZ = get<0>(oprands); + auto tZsZ = get<1>(oprands); + + // Disable multicast + uint16_t mcast_mask_z = 0; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage = pipeline_state.index(); + + // LOCK pipeline_state for _writing_ + pipeline.producer_acquire(pipeline_state); + + using BarrierType = typename EpiLoadPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(pipeline_state); + + copy(params.tma_load_z.with(*tma_barrier, mcast_mask_z), tZgZ(_,chunk_idx), tZsZ(_,write_stage)); + + // Advance pipeline_state + ++pipeline_state; + } + } + } + } + + template< + class EpiLoadPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_z_tail(EpiLoadPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(pipeline_state); + } + } + + template< + class Params, class ProblemShape, + class CooperatePipeline, class CooperatePipelineState, + class TensorIntra, + class TiledMma, + class TensorStorage + > + CUTLASS_DEVICE + auto store_intra( + int& chunk, int const& blk_coord, Params const& params, ProblemShape const& problem_size, + CooperatePipeline& cooperate_pipeline, CooperatePipelineState& cooperate_pipe_producer_state, + TensorIntra& tIntra, + TiledMma tiled_mma, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mY_mn = params.tma_store_y.get_tma_tensor(make_shape(L,D,C,B*EH)); + Tensor gY_mn = local_tile(mY_mn, take<0,2>(TileShape{}), make_coord(_,_,_))(_,_,_0{},_0{},chunk,blk_coord); + // Apply epilogue subtiling + Tensor gY_epi = flat_divide(gY_mn, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + auto epi_tile_m = size<0>(EpilogueTile{}); + auto epi_tile_n = size<1>(EpilogueTile{}); + auto partial_m = Int<128>{}; + auto partial_n = Int{}; + + auto ptr_sY = shared_tensors.smem_y_partial.begin(); + Tensor sY_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sY), + tile_to_shape(UMMA::Layout_K_SW64_Atom{}, make_shape(partial_m, partial_n, Int<2>{})))); + using CopyAtomC = Copy_Atom; + TiledCopy tiled_copy_C_atom = make_tiled_copy_C_atom(CopyAtomC{}, tiled_mma); + using CopyOpR2S = SM90_U16x8_STSM_T; + TiledCopy tiled_r2s = make_tiled_copy_S(Copy_Atom{}, tiled_copy_C_atom); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_rIntra = thread_r2s.retile_S(tIntra); // ((R2S,R2S_V),MMA_M,MMA_N) + + // Hard code + static constexpr int FragmentSize = 4; + auto tRS_rY = make_tensor(shape(sY_epi(thread_idx,_,_0{}))); + Tensor tRS_rIntra_frg = recast>(tRS_rIntra); + Tensor tRS_sY_frg = recast>(sY_epi(thread_idx,_,_)); + Tensor tRS_rY_frg = recast>(tRS_rY); + + auto mma_tile_m = size<0>(TileShape{}) / size<1>(tRS_rIntra); + auto mma_tile_n = size<1>(TileShape{}) / size<2>(tRS_rIntra); + + // For each output tile + CUTLASS_PRAGMA_UNROLL + for (int epi_n = 0; epi_n < size<3>(gY_epi); ++epi_n) { + CUTLASS_PRAGMA_UNROLL + for (int epi_m = 0; epi_m < size<2>(gY_epi); ++epi_m) { + + int mma_m = epi_m; + int mma_n = (epi_n * size<1>(EpilogueTile{})) / mma_tile_n; + Tensor tRS_rIntra_frg_mn = tRS_rIntra_frg(_,mma_m,mma_n); + + // Vectorized fragment loop with visitor callback entry point + // Epilogue op + int epi_n_in_mma = epi_n % (mma_tile_n / epi_tile_n); + int r2s_v = epi_n_in_mma * size(tRS_rY_frg); + + CUTLASS_PRAGMA_UNROLL + for (int epi_v = 0; epi_v < size(tRS_rY_frg); ++epi_v) { + tRS_rY_frg(epi_v) = tRS_rIntra_frg_mn(r2s_v + epi_v); + } + + cooperate_pipeline.producer_acquire(cooperate_pipe_producer_state); + + copy(tRS_rY_frg, tRS_sY_frg(_,cooperate_pipe_producer_state.index())); + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to Cooperate warps + + cooperate_pipeline.producer_commit(cooperate_pipe_producer_state); + ++cooperate_pipe_producer_state; + } + } + } + + template< + class Params, + class EpiloadPipeline, class EpiloadPipelineState, + class TiledMma, + class TensorStorage + > + CUTLASS_DEVICE + auto update_d( + int const& blk_coord, Params params, + bool is_first_iteration, + EpiloadPipeline& epi_load_pipeline, EpiloadPipelineState& epi_load_pipe_consumer_state, + TiledMma tiled_mma, + TensorStorage& shared_tensors + ) { + + int thread_idx = int(threadIdx.x % 128); + + int read_stage = epi_load_pipe_consumer_state.index(); + // Load delta for epilogue + auto row_layout = make_layout(make_shape(get<0>(TileShape{}), get<1>(TileShape{}), Int{}), make_stride(_0{}, _1{}, get<1>(TileShape{}))); + auto c_tv_layout = typename TiledMma::LayoutC_TV{}; + auto tile_mn = make_shape(tile_size<0>(tiled_mma), tile_size<1>(tiled_mma)); + auto d_layout = zipped_divide(row_layout, tile_mn); + auto d_tv_layout = composition(d_layout, make_tuple(c_tv_layout,_)); + + auto sD = make_tensor(make_smem_ptr(shared_tensors.smem_d.data()), d_tv_layout)(make_coord(thread_idx,_), make_coord(_,_,read_stage)); + auto tSR_sD = as_position_independent_swizzle_tensor(sD); + auto tSR_rD = make_tensor(shape(sD)); + auto tD = make_tensor(shape(sD)); + + if constexpr (D_HAS_HDIM) { + if (is_first_iteration) { + epi_load_pipeline.consumer_wait(epi_load_pipe_consumer_state); + } + copy(tSR_sD, tSR_rD); + type_convert(tSR_rD, tD); + } + else if constexpr (HAS_D) { + auto& gD = params.tensor_d; + auto value = static_cast(gD(_0{}, blk_coord)); + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tSR_rD); ++ii) { + tD(ii) = value; + } + } + + return make_tuple(tD); + } + + template< + class Params, class ProblemShape, + class StorePipeline, class StorePipelineState, + class CooperatePipeline, class CooperatePipelineState, + class MainloopPipelineX, class PipelineStateX, + class EpiloadPipelineZ, class PipelineStateZ, + class TensorInter, class TensorDeltaA, class TensorD, + class TiledMma, + class TensorStorage, class TensorStorageX + > + CUTLASS_DEVICE + auto store( + int& chunk, int const& blk_coord, Params const& params, ProblemShape const& problem_size, + StorePipeline& store_pipeline, StorePipelineState& store_pipe_producer_state, + CooperatePipeline& cooperate_pipeline, CooperatePipelineState& cooperate_pipe_consumer_state, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_state_x, + EpiloadPipelineZ& pipeline_z, PipelineStateZ& pipeline_state_z, + TensorInter& tInter, TensorDeltaA& tDeltaA, TensorD& tD, + TiledMma tiled_mma, + TensorStorage& shared_tensors, TensorStorageX& shared_tensors_x) { + + int thread_idx = int(threadIdx.x % 128); + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mY_mn = params.tma_store_y.get_tma_tensor(make_shape(L,D,C,B*EH)); + Tensor gY_mn = local_tile(mY_mn, take<0,2>(TileShape{}), make_coord(_,_,_))(_,_,_0{},_0{},chunk,blk_coord); + + // Apply epilogue subtiling + Tensor gY_epi = flat_divide(gY_mn, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + // Construct the corresponding pipelined smem tensors + auto ptr_sY = shared_tensors.smem_y.begin(); + Tensor sY_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sY), SmemLayoutY{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + auto ptr_sX = shared_tensors_x.smem_x.data(); + Tensor sX_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sX), SmemLayoutX{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + auto ptr_sZ = shared_tensors.smem_z.begin(); + Tensor sZ_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sZ), SmemLayoutZ{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + auto epi_tile_m = size<0>(EpilogueTile{}); + auto epi_tile_n = size<1>(EpilogueTile{}); + auto partial_m = Int<128>{}; + auto partial_n = Int{}; + + auto ptr_sY_partial = shared_tensors.smem_y_partial.begin(); + Tensor sY_epi_partial = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sY_partial), + tile_to_shape(UMMA::Layout_K_SW64_Atom{}, make_shape(partial_m, partial_n, Int<2>{})))); + + using CopyAtomC = Copy_Atom; + TiledCopy tiled_copy_C_atom = make_tiled_copy_C_atom(CopyAtomC{}, tiled_mma); + + using CopyOpR2S = SM90_U16x8_STSM_T; + TiledCopy tiled_r2s = make_tiled_copy_S(Copy_Atom{}, tiled_copy_C_atom); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + + Tensor tRS_rInter = thread_r2s.retile_S(tInter); // ((R2S,R2S_V),MMA_M,MMA_N) + Tensor tRS_rDeltaA = thread_r2s.retile_S(tDeltaA); // ((R2S,R2S_V),MMA_M,MMA_N) + Tensor tRS_rD = thread_r2s.retile_S(tD); // ((R2S,R2S_V),MMA_M,MMA_N) + Tensor tRS_sY = thread_r2s.partition_D(sY_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + + using CopyOpS2R = SM75_U16x8_LDSM_T; + TiledCopy tiled_s2r = make_tiled_copy_S(Copy_Atom{}, tiled_copy_C_atom); + ThrCopy thread_s2r = tiled_s2r.get_slice(thread_idx); + Tensor tSR_sX = thread_s2r.partition_S(flat_divide(sX_epi, EpilogueTile{})); + Layout tSR_rX_layout = make_layout(take<0,3>(shape(thread_s2r.partition_D(flat_divide(sX_epi, EpilogueTile{}))))); + Tensor tSR_rX = make_tensor(tSR_rX_layout); + Tensor tRS_rX = make_tensor(tSR_rX_layout); + + using CopyOpS2R_Z = SM75_U16x8_LDSM_T; + TiledCopy tiled_s2r_z = make_tiled_copy_S(Copy_Atom{}, tiled_copy_C_atom); + ThrCopy thread_s2r_z = tiled_s2r_z.get_slice(thread_idx); + Tensor tSR_sZ = thread_s2r_z.partition_S(flat_divide(sZ_epi, EpilogueTile{})); + Layout tSR_rZ_layout = make_layout(take<0,3>(shape(thread_s2r_z.partition_D(flat_divide(sZ_epi, EpilogueTile{}))))); + Tensor tSR_rZ = make_tensor(tSR_rZ_layout); + Tensor tRS_rZ = make_tensor(tSR_rZ_layout); + + // Hard code + static constexpr int FragmentSize = 4; + // Allocate Y registers + Layout tRS_rY_layout = make_layout(take<0,3>(shape(thread_r2s.partition_S(sY_epi)))); + Tensor tRS_rY = make_tensor(tRS_rY_layout); // (R2S,R2S_M,R2S_N) + Tensor tRS_rY_frg = recast>(tRS_rY); + Tensor tRS_rX_frg = recast>(tRS_rX); + Tensor tRS_rZ_frg = recast>(tRS_rZ); + // Tensor tRS_rIntra_frg = recast>(tRS_rIntra); + Tensor tRS_rInter_frg = recast>(tRS_rInter); + Tensor tRS_rDeltaA_frg = recast>(tRS_rDeltaA); + Tensor tRS_rD_frg = recast>(tRS_rD); + Tensor tRS_rCompute = make_tensor(tRS_rY_layout); // (R2S,R2S_M,R2S_N) + Tensor tRS_rCompute_frg = recast>(tRS_rCompute); + + auto tSR_rY = make_tensor(shape(sY_epi_partial(thread_idx,_,_0{}))); + Tensor tSR_sY_frg = recast>(sY_epi_partial(thread_idx,_,_)); + Tensor tSR_rY_frg = recast>(tSR_rY); + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + auto oprands = tma_partition(params.tma_store_y, Int<0>{}, Layout<_1>{}, + group_modes<0,2>(sY_epi), group_modes<0,2>(gY_epi)); // (TMA,k) and (TMA,PIPE) + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + auto bSG_gY = get<0>(oprands); + auto bSG_sY = get<1>(oprands); + + auto mma_tile_m = size<0>(TileShape{}) / size<1>(tRS_rInter); + auto mma_tile_n = size<1>(TileShape{}) / size<2>(tRS_rInter); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0) && chunk == 0) { + print("tRS_rInter : ");print(tRS_rInter);print("\n"); + print("tRS_sY : ");print(tRS_sY);print("\n"); + print("bSG_sY : ");print(bSG_sY);print("\n"); + print("bSG_gY : ");print(bSG_gY);print("\n"); + + print("tRS_rY_frg : ");print(tRS_rY_frg);print("\n"); + print("tSR_rY_frg : ");print(tSR_rY_frg);print("\n"); + print("tRS_rInter_frg : ");print(tRS_rInter_frg);print("\n"); + print("tRS_rCompute_frg : ");print(tRS_rCompute_frg);print("\n"); + } +#endif + + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); }; + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = (thread_idx / NumThreadsPerWarp) == 0; + + int epi_m_prev = 0, epi_n_prev = 0; + + auto tma_store_fn = [&] (int epi_m, int epi_n) { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_y, bSG_sY(_,store_pipe_producer_state.index()), bSG_gY(_,epi_m,epi_n)); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + synchronize(); + }; + + static constexpr bool DelayTmaStore = true; + int subtile_idx = -1; + + if constexpr (HAS_Z) { + pipeline_z.consumer_wait(pipeline_state_z); + } + + // For each output tile + CUTLASS_PRAGMA_UNROLL + for (int epi_n = 0; epi_n < size<3>(gY_epi); ++epi_n) { + CUTLASS_PRAGMA_UNROLL + for (int epi_m = 0; epi_m < size<2>(gY_epi); ++epi_m) { + bool is_first_iteration = epi_m == 0 && epi_n == 0; + bool is_last_iteration = epi_m == size<2>(gY_epi)-1 && epi_n == size<3>(gY_epi)-1; + + if (subtile_idx != -1 && (epi_n * static_cast(size<2>(gY_epi)) + epi_m) != subtile_idx) { + continue; + } + + if constexpr (HAS_D) { + // load x + copy(tiled_s2r, tSR_sX(_,_,_,epi_m,epi_n,pipeline_state_x.index()), tSR_rX); + type_convert(tSR_rX, tRS_rX); + } + + if constexpr (HAS_Z) { + // load x + copy(tiled_s2r_z, tSR_sZ(_,_,_,epi_m,epi_n,pipeline_state_z.index()), tSR_rZ); + type_convert(tSR_rZ, tRS_rZ); + // SiLu + cutlass::epilogue::thread::SiLu op; + for (int ii = 0; ii < size(tRS_rZ); ++ii) { + tRS_rZ(ii) = op(tRS_rZ(ii)); + } + } + + cooperate_pipeline.consumer_wait(cooperate_pipe_consumer_state); + + copy(tSR_sY_frg(_,cooperate_pipe_consumer_state.index()), tSR_rY_frg); + + cooperate_pipeline.consumer_release(cooperate_pipe_consumer_state); + ++cooperate_pipe_consumer_state; + + cutlass::arch::fence_view_async_shared(); + synchronize(); + + int mma_m = epi_m; + int mma_n = (epi_n * size<1>(EpilogueTile{})) / mma_tile_n; + // Tensor tRS_rIntra_frg_mn = tRS_rIntra_frg(_,mma_m,mma_n); + Tensor tRS_rInter_frg_mn = tRS_rInter_frg(_,mma_m,mma_n); + Tensor tRS_rDeltaA_frg_mn = tRS_rDeltaA_frg(_,mma_m,mma_n); + Tensor tRS_rD_frg_mn = tRS_rD_frg(_,mma_m,mma_n); + + // Vectorized fragment loop with visitor callback entry point + // Epilogue op + int epi_n_in_mma = epi_n % (mma_tile_n / epi_tile_n); + int r2s_v = epi_n_in_mma * size(tRS_rCompute_frg); + CUTLASS_PRAGMA_UNROLL + for (int epi_v = 0; epi_v < size(tRS_rCompute_frg); ++epi_v) { + tRS_rCompute_frg(epi_v) = tRS_rDeltaA_frg_mn(r2s_v + epi_v) * tRS_rInter_frg_mn(r2s_v + epi_v) + tSR_rY_frg(epi_v); + if constexpr (HAS_D) { + tRS_rCompute_frg(epi_v) = tRS_rD_frg_mn(r2s_v + epi_v) * tRS_rX_frg(epi_v) + tRS_rCompute_frg(epi_v); + } + if constexpr (HAS_Z) { + tRS_rCompute_frg(epi_v) = tRS_rCompute_frg(epi_v) * tRS_rZ_frg(epi_v); + } + } + + // The latest we can delay the TMA store is right before the smem store of the next iteration + // since the current TMA store needs to be committed before we can acquire the next smem buffer + if constexpr (DelayTmaStore) { + // Issue TMA stores for the previous subtile + if (not is_first_iteration and subtile_idx == -1) { + tma_store_fn(epi_m_prev, epi_n_prev); + } + epi_m_prev = epi_m; + epi_n_prev = epi_n; + } + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tRS_rY_frg); ++i) { + tRS_rY_frg(i) = cutlass::NumericArrayConverter{}(tRS_rCompute_frg(i)); + } + + copy(tiled_r2s, tRS_rY, tRS_sY(_,_,_,store_pipe_producer_state.index())); + + if constexpr (not DelayTmaStore) { + // Issue TMA stores for this subtile + tma_store_fn(epi_m, epi_n); + } + + } // for epi_m + } // for epi_n + + pipeline_x.consumer_release(pipeline_state_x); + ++pipeline_state_x; + pipeline_z.consumer_release(pipeline_state_z); + ++pipeline_state_z; + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the last subtile + tma_store_fn(epi_m_prev, epi_n_prev); + } + + } + + template< + class Params, class ProblemShape, + class StorePipeline, class StorePipelineState, + class TensorStorage + > + CUTLASS_DEVICE + auto store_p( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + StorePipeline& store_pipeline, StorePipelineState& store_pipe_producer_state, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mP_mn = params.tma_store_p.get_tma_tensor(make_shape(D,N,B*EH)); + Tensor gP_mn = local_tile(mP_mn, take<1,3>(TileShape{}), make_coord(_,_,blk_coord)); + auto gP_epi = gP_mn(_,_,_0{},_0{}); + + // Construct the corresponding pipelined smem tensors + auto ptr_sP = shared_tensors.smem_p.begin(); + Tensor sP_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sP), SmemLayoutP{})); // (EPI_TILE_M,EPI_TILE_N) + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + auto oprands = tma_partition(params.tma_store_p, Int<0>{}, Layout<_1>{}, + group_modes<0,2>(sP_epi), group_modes<0,2>(gP_epi)); // (TMA,k) and (TMA,PIPE) + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + auto bSG_gY = get<0>(oprands); + auto bSG_sY = get<1>(oprands); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("sP_epi : ");print(sP_epi);print("\n"); + print("gP_epi : ");print(gP_epi);print("\n"); + print("bSG_sY : ");print(bSG_sY);print("\n"); + print("bSG_gY : ");print(bSG_gY);print("\n"); + } +#endif + + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + // Use the reserved named barrier `streamkbarrier` since this kernel doesn't support streamk + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::StreamkBarrier0); }; + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = (thread_idx / NumThreadsPerWarp) == 0; + + auto tma_store_fn = [&] () { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_p, bSG_sY, bSG_gY); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + // don't need pipeline + synchronize(); + }; + + tma_store_fn(); + } + + template< + class ElementSrc, class ElementDst, + class TensorSrc, class TensorDst + > + CUTLASS_DEVICE + auto type_convert( + TensorSrc& tS, + TensorDst& tD) { + + static constexpr int FragmentSize = 2; + NumericArrayConverter converter; + + auto tS_frg = recast>(tS); + auto tD_frg = recast>(tD); + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tS_frg); ++ii) { + tD_frg(ii) = converter(tS_frg(ii)); + } + } +}; + +} // namespace cutlass::fmha::collective + diff --git a/examples/111_hopper_ssd/collective/sm90_ssd_gemm_tma_warpspecialized.hpp b/examples/111_hopper_ssd/collective/sm90_ssd_gemm_tma_warpspecialized.hpp new file mode 100644 index 00000000..81b37f17 --- /dev/null +++ b/examples/111_hopper_ssd/collective/sm90_ssd_gemm_tma_warpspecialized.hpp @@ -0,0 +1,1146 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "../collective/common.hpp" + +namespace cutlass::ssd::collective { + +using namespace cute; + +template< + class Element_, + class ElementDA_, + class ElementAcc_, + class ElementD_, + class TileShape_, + int Stages_ +> +struct SsdMainloopTmaWarpSpecialized { + + using Element = Element_; + using ElementDA = ElementDA_; + using ElementAcc = ElementAcc_; + using TileShape = TileShape_; // (L,D,N) + + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + static constexpr auto L = get<0>(TileShape{}); + static constexpr auto D = get<1>(TileShape{}); + static constexpr auto N = get<2>(TileShape{}); + + using TileShapeIntraBMM1 = decltype(make_shape(L, L, N)); // (L,L,N) + using TileShapeIntraBMM2 = decltype(make_shape(L, D, N)); // (L,D,L) + using TileShapeInterBMM1 = decltype(make_shape(N, D, L)); // (N,D,L) + using TileShapeInterBMM2 = decltype(make_shape(L, D, N)); // (L,D,N) + + using ClusterShape = Shape<_1, _1, _1>; + + // 16B alignment lets us use TMA + static constexpr int Alignment = 16 / sizeof(Element); + + using Stages = cutlass::gemm::collective::StageCount; + // IntraMma1 NT + using CollectiveIntraMma1 = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm90, cutlass::arch::OpClassTensorOp, + Element, cutlass::layout::ColumnMajor, Alignment, + Element, cutlass::layout::RowMajor, Alignment, + ElementAcc, + TileShapeIntraBMM1, ClusterShape, Stages, + cutlass::gemm::KernelTmaWarpSpecialized>::CollectiveOp; + // IntraMma2 TN + using CollectiveIntraMma2 = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm90, cutlass::arch::OpClassTensorOp, + Element, cutlass::layout::RowMajor, Alignment, + Element, cutlass::layout::ColumnMajor, Alignment, + ElementAcc, + TileShapeIntraBMM2, ClusterShape, Stages, + cutlass::gemm::KernelTmaWarpSpecialized>::CollectiveOp; + // InterMma1 TN + using CollectiveInterMma1 = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm90, cutlass::arch::OpClassTensorOp, + Element, cutlass::layout::RowMajor, Alignment, + Element, cutlass::layout::ColumnMajor, Alignment, + ElementAcc, + TileShapeInterBMM1, ClusterShape, Stages, + cutlass::gemm::KernelTmaWarpSpecialized>::CollectiveOp; + // InterMma2 NN + using CollectiveInterMma2 = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm90, cutlass::arch::OpClassTensorOp, + Element, cutlass::layout::ColumnMajor, Alignment, + Element, cutlass::layout::ColumnMajor, Alignment, + ElementAcc, + TileShapeInterBMM2, ClusterShape, Stages, + cutlass::gemm::KernelTmaWarpSpecialized>::CollectiveOp; + + using TiledMmaIntra1 = typename CollectiveIntraMma1::TiledMma; + using TiledMmaIntra2 = decltype(convert_to_gmma_rs(typename CollectiveIntraMma2::TiledMma{})); + using TiledMmaInter1 = decltype(convert_to_gmma_rs(typename CollectiveInterMma1::TiledMma{})); + using TiledMmaInter2 = typename CollectiveInterMma2::TiledMma; + + using SmemLayoutX = typename CollectiveIntraMma2::SmemLayoutB; + using SmemLayoutC = typename CollectiveIntraMma1::SmemLayoutA; + using SmemLayoutB = typename CollectiveIntraMma1::SmemLayoutB; + + // Use 1 stage buffer since it is immediate result by the previous gemm + using SmemLayoutP_Ref = typename CollectiveInterMma2::SmemLayoutB; + using SmemLayoutP = decltype(take<0,2>(SmemLayoutP_Ref{})); + + using MainloopPipelineX = cutlass::PipelineTmaAsync; + using MainloopPipelineB = cutlass::PipelineTmaAsync; + using MainloopPipelineC = cutlass::PipelineTmaAsync; + using MainloopPipelineDelta = cutlass::PipelineTmaAsync; + + static constexpr int kXLoadBytes = size(SmemLayoutX{}(_,_,_0{})) * sizeof(Element); + static constexpr int kBLoadBytes = size(SmemLayoutB{}(_,_,_0{})) * sizeof(Element); + static constexpr int kCLoadBytes = size(SmemLayoutC{}(_,_,_0{})) * sizeof(Element); + static constexpr int kDeltaLoadBytes = get<0>(TileShape{}) * sizeof(Element); + static constexpr int kDeltaALoadBytes = get<0>(TileShape{}) * sizeof(ElementDA); + + struct SharedStorage : cute::aligned_struct<128, _0> { + cute::array_aligned> smem_x; + cute::array_aligned> smem_b; + cute::array_aligned> smem_c; + cute::array_aligned> smem_p; + cute::array_aligned(TileShape{}) * Stages::value> smem_delta; + cute::array_aligned(TileShape{}) * Stages::value> smem_delta_a; + cute::array_aligned(TileShape{}) * Stages::value> smem_d; + }; + + using LayoutX = decltype(make_layout(make_shape(D, L, int32_t(0), int32_t(0)), make_stride(int32_t(0), _1{}, L, int32_t(0)))); // (D,L,C,B) + using LayoutB = decltype(make_layout(make_shape(L, N, int32_t(0), int32_t(0)), make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,N,C,B) + using LayoutC = decltype(make_layout(make_shape(L, N, int32_t(0), int32_t(0)), make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,N,C,B) + using LayoutDelta = decltype(make_layout(make_shape(L, int32_t(0), int32_t(0)), make_stride(_1{}, L, int32_t(0)))); // (L,C,B) + + // Not support Mcast + using GmemTiledCopyX = cute::SM90_TMA_LOAD; + using GmemTiledCopyB = cute::SM90_TMA_LOAD; + using GmemTiledCopyC = cute::SM90_TMA_LOAD; + + struct Arguments { + const Element* ptr_X{nullptr}; + const ElementDA* ptr_DeltaA{nullptr}; + const Element* ptr_Delta{nullptr}; + const Element* ptr_B{nullptr}; + const Element* ptr_C{nullptr}; + LayoutX layout_X{}; + LayoutB layout_B{}; + LayoutC layout_C{}; + LayoutDelta layout_Delta{}; + }; + + struct Params { + using TMA_X = decltype(make_tma_copy( + GmemTiledCopyX{}, + make_tensor(static_cast(nullptr), LayoutX{}), + SmemLayoutX{}(_,_,cute::Int<0>{}), + make_shape(shape<1>(TileShapeIntraBMM2{}), shape<2>(TileShapeIntraBMM2{})), + _1{})); + using TMA_B = decltype(make_tma_copy( + GmemTiledCopyB{}, + make_tensor(static_cast(nullptr), LayoutB{}), + SmemLayoutB{}(_,_,cute::Int<0>{}), + make_shape(shape<0>(TileShapeIntraBMM1{}), shape<2>(TileShapeIntraBMM1{})), + _1{})); + using TMA_C = decltype(make_tma_copy( + GmemTiledCopyC{}, + make_tensor(static_cast(nullptr), LayoutC{}), + SmemLayoutC{}(_,_,cute::Int<0>{}), + make_shape(shape<1>(TileShapeIntraBMM1{}), shape<2>(TileShapeIntraBMM1{})), + _1{})); + using TensorDelta = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutDelta{})); + using TensorDeltaA = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutDelta{})); + + TMA_X tma_load_x; + TMA_B tma_load_b; + TMA_C tma_load_c; + TensorDelta tensor_delta; + TensorDeltaA tensor_delta_a; + }; + + template + static bool can_implement(ProblemShape const& problem_size, Arguments const& args) { + return true; + } + + template + static Params to_underlying_arguments(ProblemShape const& problem_size, Arguments const& args, void* workspace) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor tensor_x = make_tensor(make_gmem_ptr(args.ptr_X), args.layout_X); + Tensor tensor_b = make_tensor(make_gmem_ptr(args.ptr_B), args.layout_B); + Tensor tensor_c = make_tensor(make_gmem_ptr(args.ptr_C), args.layout_C); + Tensor tensor_delta = make_tensor(make_gmem_ptr(args.ptr_Delta), args.layout_Delta); + Tensor tensor_delta_a = make_tensor(make_gmem_ptr(args.ptr_DeltaA), args.layout_Delta); + +#if 0 + print("tensor_x : ");print(tensor_x);print("\n"); + print("smem_X : ");print(SmemLayoutX{});print("\n"); + print("tensor_b : ");print(tensor_b);print("\n"); + print("smem_b : ");print(SmemLayoutB{});print("\n"); + print("tensor_c : ");print(tensor_c);print("\n"); + print("smem_c : ");print(SmemLayoutC{});print("\n"); + print("tensor_delta : ");print(tensor_delta);print("\n"); + print("tensor_delta_a: ");print(tensor_delta_a);print("\n"); + print("tile : ");print(TileShape{});print("\n"); + print("tileIntra1 : ");print(TileShapeIntraBMM1{});print("\n"); + print("tileIntra2 : ");print(TileShapeIntraBMM2{});print("\n"); + print("tileInter1 : ");print(TileShapeInterBMM1{});print("\n"); + print("tileInter2 : ");print(TileShapeInterBMM2{});print("\n"); +#endif + + typename Params::TMA_X tma_load_x = make_tma_copy( + GmemTiledCopyX{}, + tensor_x, + SmemLayoutX{}(_,_,cute::Int<0>{}), + make_shape(shape<1>(TileShapeIntraBMM2{}), shape<2>(TileShapeIntraBMM2{})), + _1{}); + typename Params::TMA_B tma_load_b = make_tma_copy( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,cute::Int<0>{}), + make_shape(shape<0>(TileShapeIntraBMM1{}), shape<2>(TileShapeIntraBMM1{})), + _1{}); + typename Params::TMA_C tma_load_c = make_tma_copy( + GmemTiledCopyC{}, + tensor_c, + SmemLayoutC{}(_,_,cute::Int<0>{}), + make_shape(shape<1>(TileShapeIntraBMM1{}), shape<2>(TileShapeIntraBMM1{})), + _1{}); + + return Params{ + tma_load_x, + tma_load_b, + tma_load_c, + tensor_delta, + tensor_delta_a + }; + } + + CUTLASS_DEVICE + static void prefetch_tma_descriptors(Params const& params) { + cute::prefetch_tma_descriptor(params.tma_load_x.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_c.get_tma_descriptor()); + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_x_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mX_mkl = params.tma_load_x.get_tma_tensor(make_shape(D,L,C,EH*B)); + Tensor gX_mkl = local_tile(mX_mkl, TileShapeIntraBMM2{}, make_coord(_,_,_), Step{}); // (BLK_M,BLK_K,m,k,l) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("mX_mkl : ");print(mX_mkl);print("\n"); + print("gX_mkl : ");print(gX_mkl);print("\n"); + } +#endif + return make_tuple(gX_mkl); + } + + template< + class Params, class ProblemShape, + class MainloopPipeline, class PipelineState, + class GTensor, + class TensorStorage + > + CUTLASS_DEVICE + void load_x( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + MainloopPipeline& pipeline, PipelineState& pipeline_state, + cute::tuple const& load_inputs, + TensorStorage& shared_tensors) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + Tensor sX_ = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); // (BLK_M,BLK_K,PIPE) + Tensor sX = as_position_independent_swizzle_tensor(sX_); // (BLK_M,BLK_K,PIPE) + + // + // Prepare the TMA loads for X + // + + Tensor gX_mkl = get<0>(load_inputs); + + // Partition the inputs based on the current block coordinates. + Tensor gX = gX_mkl(_,_,_0{},_0{},_,blk_coord); // (BLK_M,BLK_K,k) + + // no multicast + auto tma_load_x = params.tma_load_x.get_slice(_0{}); + // Applies the mapping from block_tma_a + Tensor tXgX = tma_load_x.partition_S(gX); // (TMA,TMA_M,TMA_K,k) + Tensor tXsX = tma_load_x.partition_D(sX); // (TMA,TMA_M,TMA_K,PIPE) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("tXgX : ");print(tXgX);print("\n"); + print("tXsX : ");print(tXsX);print("\n"); + } +#endif + // Disable multicast + uint16_t mcast_mask_x = 0; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage = pipeline_state.index(); + + // LOCK pipeline_state for _writing_ + pipeline.producer_acquire(pipeline_state); + + // + // Copy gmem to smem for chunk + // + + using BarrierType = typename MainloopPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(pipeline_state); + + copy(params.tma_load_x.with(*tma_barrier, mcast_mask_x), tXgX(_,_,_,chunk_idx), tXsX(_,_,_,write_stage)); + + // Advance pipeline_state + ++pipeline_state; + } + } + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + template< + class MainloopPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_x_tail(MainloopPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(pipeline_state); + } + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_b_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mB_mkl = params.tma_load_b.get_tma_tensor(make_shape(L,N,C,G*B)); + Tensor gB_mkl = local_tile(mB_mkl, TileShapeIntraBMM1{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M,BLK_K,m,k,l) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("mB_mkl : ");print(mB_mkl);print("\n"); + print("gB_mkl : ");print(gB_mkl);print("\n"); + } +#endif + return make_tuple(gB_mkl); + } + + template< + class Params, class ProblemShape, + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineC, class PipelineStateC, + class GTensorB, class GTensorC, + class TensorStorage + > + CUTLASS_DEVICE + void load_b_c( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_state_b, + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_state_c, + cute::tuple const& load_inputs_b, + cute::tuple const& load_inputs_c, + TensorStorage& shared_tensors) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + Tensor sB_ = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutB{}); // (BLK_M,BLK_K,PIPE) + Tensor sB = as_position_independent_swizzle_tensor(sB_); // (BLK_M,BLK_K,PIPE) + Tensor sC_ = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); // (BLK_M,BLK_K,PIPE) + Tensor sC = as_position_independent_swizzle_tensor(sC_); // (BLK_M,BLK_K,PIPE) + + // + // Prepare the TMA loads for B + // + + Tensor gB_mkl = get<0>(load_inputs_b); + Tensor gB = gB_mkl(_,_,_0{},_0{},_,blk_coord); // (BLK_M,BLK_K,k) + // no multicast + auto tma_load_b = params.tma_load_b.get_slice(_0{}); + // Applies the mapping from block_tma_a + Tensor tBgB = tma_load_b.partition_S(gB); // (TMA,TMA_M,TMA_K,k) + Tensor tBsB = tma_load_b.partition_D(sB); // (TMA,TMA_M,TMA_K,PIPE) + + // + // Prepare the TMA loads for X + // + + Tensor gC_mkl = get<0>(load_inputs_c); + Tensor gC = gC_mkl(_,_,_0{},_0{},_,blk_coord); // (BLK_M,BLK_K,k) + // no multicast + auto tma_load_c = params.tma_load_c.get_slice(_0{}); + // Applies the mapping from block_tma_a + Tensor tCgC = tma_load_c.partition_S(gC); // (TMA,TMA_M,TMA_K,k) + Tensor tCsC = tma_load_c.partition_D(sC); // (TMA,TMA_M,TMA_K,PIPE) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("tCgC : ");print(tCgC);print("\n"); + print("tCsC : ");print(tCsC);print("\n"); + print("tBgB : ");print(tBgB);print("\n"); + print("tBsB : ");print(tBsB);print("\n"); + } +#endif + // Disable multicast + uint16_t mcast_mask_b = 0; + uint16_t mcast_mask_c = 0; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage_b = pipeline_state_b.index(); + int write_stage_c = pipeline_state_c.index(); + + // Load B + pipeline_b.producer_acquire(pipeline_state_b); + + using BarrierTypeB = typename MainloopPipelineB::ProducerBarrierType; + BarrierTypeB* tma_barrier_b = pipeline_b.producer_get_barrier(pipeline_state_b); + + copy(params.tma_load_b.with(*tma_barrier_b, mcast_mask_b), tBgB(_,_,_,chunk_idx), tBsB(_,_,_,write_stage_b)); + + // Advance pipeline_state + ++pipeline_state_b; + + // Load C + pipeline_c.producer_acquire(pipeline_state_c); + + using BarrierTypeC = typename MainloopPipelineC::ProducerBarrierType; + BarrierTypeC* tma_barrier_c = pipeline_c.producer_get_barrier(pipeline_state_c); + + copy(params.tma_load_c.with(*tma_barrier_c, mcast_mask_c), tCgC(_,_,_,chunk_idx), tCsC(_,_,_,write_stage_c)); + + // Advance pipeline_state + ++pipeline_state_c; + } + } + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_c_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mC_mkl = params.tma_load_c.get_tma_tensor(make_shape(L,N,C,G*B)); + Tensor gC_mkl = local_tile(mC_mkl, TileShapeIntraBMM1{}, make_coord(_,_,_), Step{}); // (BLK_M,BLK_K,n,k,l) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("mC_mkl : ");print(mC_mkl);print("\n"); + print("gC_mkl : ");print(gC_mkl);print("\n"); + } +#endif + return make_tuple(gC_mkl); + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + template< + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineC, class PipelineStateC + > + CUTLASS_DEVICE void + load_b_c_tail(MainloopPipelineB pipeline_b, PipelineStateB pipeline_state_b, + MainloopPipelineC pipeline_c, PipelineStateC pipeline_state_c) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline_b.producer_tail(pipeline_state_b); + pipeline_c.producer_tail(pipeline_state_c); + } + } + + template< + class Params, class ProblemShape, + class MainloopPipeline, class PipelineState, + class TensorStorage + > + CUTLASS_DEVICE + void load_delta( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + MainloopPipeline& pipeline, PipelineState& pipeline_state, + TensorStorage& shared_tensors) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + + auto& gDelta = params.tensor_delta; + auto& gDeltaA = params.tensor_delta_a; + + Element* ptr_delta = shared_tensors.smem_delta.data(); + ElementDA* ptr_delta_a = shared_tensors.smem_delta_a.data(); + auto smem_layout = make_layout(make_shape(get<0>(TileShape{}), Int{})); + auto sDelta = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_delta), smem_layout)); + auto sDeltaA = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_delta_a), smem_layout)); + + auto bulk_atom_dt = Copy_Atom{}; + auto bulk_atom_dA = Copy_Atom{}; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage = pipeline_state.index(); + + // LOCK pipeline_state for _writing_ + pipeline.producer_acquire(pipeline_state); + + using BarrierType = typename MainloopPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(pipeline_state); + copy(bulk_atom_dt.with(*tma_barrier), gDelta(_,chunk_idx,blk_coord), sDelta(_,write_stage)); + copy(bulk_atom_dA.with(*tma_barrier), gDeltaA(_,chunk_idx,blk_coord), sDeltaA(_,write_stage)); + + // Advance pipeline_state + ++pipeline_state; + } + } + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + template< + class MainloopPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_delta_tail(MainloopPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(pipeline_state); + } + } + + template< + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineC, class PipelineStateC, + class TensorStorage + > + CUTLASS_DEVICE + auto mma_intra_1( + int& chunk, + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_state_b, + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_state_c, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + + int read_b_stage = pipeline_state_b.index(); + int read_c_stage = pipeline_state_c.index(); + + TiledMmaIntra1 tiled_mma; + auto thr_mma = tiled_mma.get_thread_slice(thread_idx); + + // Mainloop setup QK + Tensor sB = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutB{}); + Tensor sC = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); + + Tensor tCsC = thr_mma.partition_A(sC); // (MMA,MMA_M,MMA_K,PIPE) + Tensor tBsB = thr_mma.partition_B(sB); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tCrC = thr_mma.make_fragment_A(tCsC); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tBrB = thr_mma.make_fragment_B(tBsB); // (MMA,MMA_M,MMA_N,PIPE) + + Tensor accumulator = partition_fragment_C(tiled_mma, take<0, 2>(TileShapeIntraBMM1{})); + + auto barrier_token_b = pipeline_b.consumer_try_wait(pipeline_state_b); + auto barrier_token_c = pipeline_c.consumer_try_wait(pipeline_state_c); + + pipeline_b.consumer_wait(pipeline_state_b, barrier_token_b); + pipeline_c.consumer_wait(pipeline_state_c, barrier_token_c); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0) && chunk == 0) { + print("tBsB : ");print(tBsB);print("\n"); + print("tCsC : ");print(tCsC);print("\n"); + print("tBrB : ");print(tBrB);print("\n"); + print("tCrC : ");print(tCrC);print("\n"); + print("accumulator : ");print(accumulator);print("\n"); + } +#endif + + warpgroup_fence_operand(accumulator); + warpgroup_arrive(); + gemm_zero_acc(tiled_mma, tCrC(_,_,_,read_c_stage), tBrB(_,_,_,read_b_stage), accumulator); + warpgroup_commit_batch(); + + warpgroup_wait<0>(); + + // Maybe delay + pipeline_b.consumer_release(pipeline_state_b); + ++pipeline_state_b; + pipeline_c.consumer_release(pipeline_state_c); + ++pipeline_state_c; + + return make_tuple(accumulator); + } + + template< + class MainloopPipelineDelta, class PipelineStateDelta, + class TensorIntra1, + class TensorStorage + > + CUTLASS_DEVICE + auto pre_intra_2( + int& chunk, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_state_delta, + TensorIntra1& tIntra1, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + int read_delta_stage = pipeline_state_delta.index(); + + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::TransformBarrier); }; + + TiledMmaIntra1 mma; + + auto ts0 = size<0>(TileShape{}); + + Layout row_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_0{}, _1{}, ts0)); + Layout col_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_1{}, _0{}, ts0)); + + Tensor sDelta_row = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta.data()), row_layout)); + Tensor sDeltaA_row = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), row_layout)); + Tensor sDeltaA_col = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), col_layout)); + Tensor coord_tensor = make_coord_tensor(make_identity_layout(make_shape(ts0, ts0))); + + ThrMMA thr_mma = mma.get_slice(thread_idx); + + Tensor tDelta_row = thr_mma.partition_C(sDelta_row)(_,_,_,read_delta_stage); + Tensor tDeltaA_row = thr_mma.partition_C(sDeltaA_row)(_,_,_,read_delta_stage); + Tensor tDeltaA_col = thr_mma.partition_C(sDeltaA_col)(_,_,_,read_delta_stage); + Tensor tC = thr_mma.partition_C(coord_tensor); + + auto tSR_Delta_bf16 = make_tensor(shape(tDelta_row)); + auto tSR_DeltaA_row_bf16 = make_tensor(shape(tDeltaA_row)); + auto tSR_DeltaA_col_bf16 = make_tensor(shape(tDeltaA_col)); + + auto tSR_Delta = make_tensor(shape(tDelta_row)); + auto tSR_DeltaA_row = make_tensor(shape(tDeltaA_row)); + auto tSR_DeltaA_col = make_tensor(shape(tDeltaA_col)); + + auto barrier_token = pipeline_delta.consumer_try_wait(pipeline_state_delta); + pipeline_delta.consumer_wait(pipeline_state_delta, barrier_token); + + // Load delta/delta_a + copy(tDelta_row, tSR_Delta_bf16); + copy(tDeltaA_row, tSR_DeltaA_row_bf16); + copy(tDeltaA_col, tSR_DeltaA_col_bf16); + + pipeline_delta.consumer_release(pipeline_state_delta); + ++pipeline_state_delta; + + // Data convert + type_convert(tSR_Delta_bf16, tSR_Delta); + type_convert(tSR_DeltaA_row_bf16, tSR_DeltaA_row); + type_convert(tSR_DeltaA_col_bf16, tSR_DeltaA_col); + + // SegSum + #pragma unroll + for (int ii = 0; ii < size(tIntra1); ++ii) { + ElementAcc tmp(0.f); + auto [m,n] = tC(ii); + if (m >= n) { + tmp = expf(tSR_DeltaA_col(ii) - tSR_DeltaA_row(ii)); + } + tIntra1(ii) = tmp * tSR_Delta(ii) * tIntra1(ii); + } + + synchronize(); + + return make_tuple(tIntra1); + } + + + template< + class MainloopPipelineX, class PipelineStateX, + class TensorIntra1, + class TensorStorage + > + CUTLASS_DEVICE + auto mma_intra_2( + int& chunk, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_state_x, + TensorIntra1& tIntra1, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + + Tensor sX = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); + + TiledMmaIntra2 tiled_mma; + auto thr_mma = tiled_mma.get_thread_slice(thread_idx); + Tensor tCsX = thr_mma.partition_B(sX); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tCrX = thr_mma.make_fragment_B(tCsX); // (MMA,MMA_N,MMA_K,PIPE) + + auto tCrIntra = make_acc_into_op(tIntra1, typename TiledMmaIntra2::LayoutA_TV{}); + auto accumulator = partition_fragment_C(tiled_mma, take<0, 2>(TileShapeIntraBMM2{})); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0) && chunk == 0) { + print("tCsX : ");print(tCsX);print("\n"); + print("tCrX : ");print(tCrX);print("\n"); + print("tIntra1 : ");print(tIntra1);print("\n"); + print("tCrIntra : ");print(tCrIntra);print("\n"); + print("accumulator : ");print(accumulator);print("\n"); + } +#endif + + int read_stage = pipeline_state_x.index(); + + auto barrier_token = pipeline_x.consumer_try_wait(pipeline_state_x); + pipeline_x.consumer_wait(pipeline_state_x, barrier_token); + + // Delay the X pipeline release + warpgroup_wait<0>(); + warpgroup_fence_operand(tCrIntra); + warpgroup_fence_operand(accumulator); + + gemm_zero_acc(tiled_mma, tCrIntra, tCrX(_,_,_,read_stage), accumulator); + + warpgroup_commit_batch(); + + // May delay + warpgroup_wait<0>(); + + pipeline_x.consumer_release(pipeline_state_x); + ++pipeline_state_x; + + return make_tuple(accumulator); + } + + template< + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineDelta, class PipelineStateDelta, + class TensorStorage + > + CUTLASS_DEVICE + auto pre_inter_1( + int& chunk, + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_state_b, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_state_delta, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + + // Different from the original SmemB + using SmemLayoutB = typename CollectiveInterMma1::SmemLayoutA; + + Tensor sB_ = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutB{}); + Tensor sB = as_position_independent_swizzle_tensor(sB_); + + int read_delta_stage = pipeline_state_delta.index(); + int read_b_stage = pipeline_state_b.index(); + + auto barrier_token_b = pipeline_b.consumer_try_wait(pipeline_state_b); + auto barrier_token_delta = pipeline_delta.consumer_try_wait(pipeline_state_delta); + + // construct + TiledMmaInter1 tiled_mma; + auto thr_mma = tiled_mma.get_thread_slice(thread_idx); + Tensor tCrB_mma = thr_mma.partition_fragment_A(sB(_,_,Int<0>{})); + Tensor tCrB_load_bf16 = make_fragment_like(tCrB_mma); + Tensor tCrB_load = make_fragment_like(tCrB_mma); + + // using CopyAtom = Copy_Atom; + using CopyAtom = Copy_Atom; + auto smem_tiled_copy_B = make_tiled_copy_A(CopyAtom{}, tiled_mma); + auto smem_thr_copy_B = smem_tiled_copy_B.get_thread_slice(thread_idx); + Tensor tCrB_copy_view = smem_thr_copy_B.retile_D(tCrB_load_bf16); + Tensor tCsB = smem_thr_copy_B.partition_S(sB); + + // load delta/delta_a + auto ts0 = size<0>(TileShape{}); + + Layout row_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_0{}, _1{}, ts0)); + + Tensor sDelta = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta.data()), row_layout)); + Tensor sDeltaA = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), row_layout)); + + Tensor tDelta = thr_mma.partition_A(sDelta)(_,_,_,read_delta_stage); + Tensor tDeltaA = thr_mma.partition_A(sDeltaA)(_,_,_,read_delta_stage); + + auto tSR_Delta_bf16 = make_tensor(shape(tDelta)); + auto tSR_DeltaA_bf16 = make_tensor(shape(tDeltaA)); + + auto tSR_Delta = make_tensor(shape(tDelta)); + auto tSR_DeltaA = make_tensor(shape(tDeltaA)); + + pipeline_b.consumer_wait(pipeline_state_b, barrier_token_b); + + // load B + copy(smem_tiled_copy_B, tCsB(_,_,_,read_b_stage), tCrB_copy_view(_,_,_)); + + pipeline_delta.consumer_wait(pipeline_state_delta, barrier_token_delta); + + // Load delta/delta_a + copy(tDelta, tSR_Delta_bf16); + copy(tDeltaA, tSR_DeltaA_bf16); + + // data conver + type_convert(tSR_Delta_bf16, tSR_Delta); + type_convert(tSR_DeltaA_bf16, tSR_DeltaA); + type_convert(tCrB_load_bf16, tCrB_load); + + // xxx : This is specific to GMMA and it depends on the known TV partitioner. + // Only work for 128x64x128 tile as the layout is ((REG_N,REG_M,REG_N_REP),ATOM_M_REP,ATOM_N_REP). + // So we can use ((-1,_,-1),_,-1) to iterate the last column process (here -1 means the last coordinate) + static_assert(cute::rank(tSR_DeltaA) == Int<3>{}, "The rank of Tensor is mismatched"); + static_assert(cute::rank<0>(tSR_DeltaA) == Int<3>{}, "The rank of MMA_ATOM is mismatched"); + static_assert(std::is_same::value, "Only ALayout_64x16 is supported"); + // get last column + bool last_thread_per_row = thread_idx % 4 == 3; + ElementAcc last_column = ElementAcc(0.f); + if (last_thread_per_row) { + auto coord0 = get<0>(shape<0>(tSR_DeltaA)) - _1{}; + auto coord1 = get<2>(shape<0>(tSR_DeltaA)) - _1{}; + auto coord2 = get<2>(shape(tSR_DeltaA)) - _1{}; + auto tSR_DeltaA_slice = tSR_DeltaA(make_coord(coord0,_,coord1),_,coord2); + last_column = tSR_DeltaA_slice(_0{}); + } + + // broadcast the last column + last_column = __shfl_sync(0xFFFFFFFF, last_column, 3, 32); + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tSR_DeltaA); ++ii) { + tSR_DeltaA(ii) = expf(last_column - tSR_DeltaA(ii)); + } + + // Delta*DeltaA + auto tCompute = make_tensor(tCrB_mma.layout()); + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tCompute); ++ii) { + tCompute(ii) = tSR_DeltaA(ii) * tSR_Delta(ii); + } + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tCompute); ++ii) { + tCompute(ii) = tCrB_load(ii) * tCompute(ii); + } + + copy(tCompute, tCrB_mma); + + // release B buffer + pipeline_b.consumer_release(pipeline_state_b); + ++pipeline_state_b; + return make_tuple(tCrB_mma, last_column); + } + + template< + class MainloopPipelineX, class PipelineStateX, + class TensorB, + class TensorStorage + > + CUTLASS_DEVICE + auto mma_inter_1( + int& chunk, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_state_x, + TensorB tCrB, + TensorStorage& shared_tensors) { + + Tensor sX = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); + + int thread_idx = int(threadIdx.x % 128); + TiledMmaInter1 tiled_mma; + auto thr_mma = tiled_mma.get_thread_slice(thread_idx); + + Tensor tCsX = thr_mma.partition_B(sX); + Tensor tCrX = thr_mma.make_fragment_B(tCsX); + + Tensor accumulator = partition_fragment_C(tiled_mma, take<0, 2>(TileShapeInterBMM1{})); + + int read_stage = pipeline_state_x.index(); + + auto barrier_token_x = pipeline_x.consumer_try_wait(pipeline_state_x); + pipeline_x.consumer_wait(pipeline_state_x, barrier_token_x); + + warpgroup_fence_operand(accumulator); + warpgroup_arrive(); + gemm_zero_acc(tiled_mma, tCrB, tCrX(_,_,_,read_stage), accumulator); + warpgroup_commit_batch(); + + warpgroup_wait<0>(); + + return make_tuple(accumulator); + } + + template< + class TensorStorage + > + CUTLASS_DEVICE + auto state_init(TensorStorage& shared_tensors) { + TiledMmaInter1 tiled_mma; + Tensor tensor_state = partition_fragment_C(tiled_mma, take<0, 2>(TileShapeInterBMM1{})); + + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::TransposeBarrier); }; + int thread_idx = int(threadIdx.x % 128); + + Tensor sP_ = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutP{}); // (D, N) + // Transpose + auto sP_tmp = make_tensor(sP_.data(), make_layout(reverse(shape(sP_)), reverse(stride(sP_)))); // (N, D) + Tensor sP = as_position_independent_swizzle_tensor(sP_tmp); + + using CopyAtomC = Copy_Atom; + TiledCopy tiled_r2s_atom = make_tiled_copy_C(CopyAtomC{}, tiled_mma); + + using CopyOpR2S = SM90_U16x8_STSM_T; + TiledCopy tiled_r2s = make_tiled_copy_S(Copy_Atom{}, tiled_r2s_atom); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_rP = make_tensor(shape(thread_r2s.partition_S(sP))); + Tensor tRS_sP = thread_r2s.partition_D(sP); + + clear(tRS_rP); + clear(tensor_state); + // Store P + copy(tiled_r2s, tRS_rP, tRS_sP); + + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + + return make_tuple(tensor_state); + } + template< + class TensorInter1, + class TensorState + > + CUTLASS_DEVICE + void pre_inter_2( + ElementAcc& last_column, + TensorInter1& tInter1, + TensorState& tState) { + + // Apply the state + for (int ii = 0; ii < size(tInter1); ++ii) { + tInter1(ii) = tInter1(ii) + expf(last_column) * static_cast(tState(ii)); + } + // Update the state + copy(tInter1, tState); + + } + + template< + class TensorState, + class TensorStorage + > + CUTLASS_DEVICE + void post_inter_2( + TensorState& tState, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::TransposeBarrier); }; + + Tensor sP_ = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutP{}); // (D, N) + // Transpose + auto sP_tmp = make_tensor(sP_.data(), make_layout(reverse(shape(sP_)), reverse(stride(sP_)))); // (N, D) + Tensor sP = as_position_independent_swizzle_tensor(sP_tmp); + auto tP = make_tensor(shape(tState)); + + type_convert(tState, tP); + + synchronize(); // ensure all threads have issued their async fence + + using CopyAtomC = Copy_Atom; + TiledMmaInter1 tiled_mma; + TiledCopy tiled_r2s_atom = make_tiled_copy_C(CopyAtomC{}, tiled_mma); + + using CopyOpR2S = SM90_U16x8_STSM_T; + TiledCopy tiled_r2s = make_tiled_copy_S(Copy_Atom{}, tiled_r2s_atom); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_rP = thread_r2s.retile_S(tP); + Tensor tRS_sP = thread_r2s.partition_D(sP); + + // Store P + copy(tiled_r2s, tRS_rP, tRS_sP); + + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + } + + template< + class MainloopPipelineC, class PipelineStateC, + class MainloopPipelineDelta, class PipelineStateDelta, + class TensorStorage + > + CUTLASS_DEVICE + auto mma_inter_2( + int& chunk, + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_state_c, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_state_delta, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + + int read_c_stage = pipeline_state_c.index(); + + TiledMmaInter2 tiled_mma; + auto thr_mma = tiled_mma.get_thread_slice(thread_idx); + + // Mainloop setup QK + Tensor sP = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutP{}); + Tensor sC = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); + + Tensor tCsC = thr_mma.partition_A(sC); // (MMA,MMA_M,MMA_K,PIPE) + Tensor tPsP = thr_mma.partition_B(sP); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tCrC = thr_mma.make_fragment_A(tCsC); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tPrP = thr_mma.make_fragment_B(tPsP); // (MMA,MMA_M,MMA_N,PIPE) + + Tensor accumulator = partition_fragment_C(tiled_mma, take<0, 2>(TileShapeInterBMM2{})); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0) && chunk == 0) { + print("sP : ");print(sP);print("\n"); + print("sC : ");print(sC);print("\n"); + print("tCsC : ");print(tCsC);print("\n"); + print("tPsP : ");print(tPsP);print("\n"); + print("tCrC : ");print(tCrC);print("\n"); + print("tPrP : ");print(tPrP);print("\n"); + print("accumulator : ");print(accumulator);print("\n"); + } +#endif + + auto barrier_token_c = pipeline_c.consumer_try_wait(pipeline_state_c); + pipeline_c.consumer_wait(pipeline_state_c, barrier_token_c); + + warpgroup_fence_operand(accumulator); + warpgroup_arrive(); + gemm_zero_acc(tiled_mma, tCrC(_,_,_,read_c_stage), tPrP, accumulator); + warpgroup_commit_batch(); + + // release C + warpgroup_wait<0>(); + + pipeline_c.consumer_release(pipeline_state_c); + ++pipeline_state_c; + + int read_delta_stage = pipeline_state_delta.index(); + // Load delta for epilogue + auto col_layout = make_layout(make_shape(get<0>(TileShape{}), get<0>(TileShape{}), Int{}), make_stride(_1{}, _0{}, get<0>(TileShape{}))); + auto c_tv_layout = typename TiledMmaInter2::LayoutC_TV{}; + auto tile_mn = make_shape(tile_size<0>(tiled_mma), tile_size<1>(tiled_mma)); + auto delta_col_layout = zipped_divide(col_layout, tile_mn); + auto delta_a_col_tv_layout = composition(delta_col_layout, make_tuple(c_tv_layout,_)); + + auto tDeltaA_col_ = make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), delta_a_col_tv_layout)(make_coord(thread_idx,_), make_coord(_,_,read_delta_stage)); + auto tDeltaA_col = as_position_independent_swizzle_tensor(tDeltaA_col_); + auto tSR_DeltaA_col = make_tensor(shape(tDeltaA_col)); + + copy(tDeltaA_col, tSR_DeltaA_col); + + pipeline_delta.consumer_release(pipeline_state_delta); + ++pipeline_state_delta; + + for (int ii = 0; ii < size(tSR_DeltaA_col); ++ii) { + tSR_DeltaA_col(ii) = expf(tSR_DeltaA_col(ii)); + } + + return make_tuple(accumulator, tSR_DeltaA_col); + } + + template< + class ElementSrc, class ElementDst, + class TensorSrc, class TensorDst + > + CUTLASS_DEVICE + auto type_convert( + TensorSrc& tS, + TensorDst& tD) { + + static constexpr int FragmentSize = 2; + NumericArrayConverter converter; + + auto tS_frg = recast>(tS); + auto tD_frg = recast>(tD); + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tS_frg); ++ii) { + tD_frg(ii) = converter(tS_frg(ii)); + } + } +}; + +} // namespace cutlass::fmha::collective diff --git a/examples/111_hopper_ssd/device/ssd.hpp b/examples/111_hopper_ssd/device/ssd.hpp new file mode 100644 index 00000000..21e9f07a --- /dev/null +++ b/examples/111_hopper_ssd/device/ssd.hpp @@ -0,0 +1,273 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +// common +#include "cutlass/cutlass.h" +#include "cutlass/device_kernel.h" + +#if !defined(__CUDACC_RTC__) +#include "cutlass/cluster_launch.hpp" +#include "cutlass/trace.h" +#endif // !defined(__CUDACC_RTC__) + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::ssd::device { + +//////////////////////////////////////////////////////////////////////////////// +////////////////////////////// CUTLASS 3.x API ///////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +class SSD { +public: + using Kernel = Kernel_; + + static int const kThreadCount = Kernel::MaxThreadsPerBlock; + + /// Argument structure: User API + using Arguments = typename Kernel::Arguments; + /// Argument structure: Kernel API + using Params = typename Kernel::Params; + +private: + + /// Kernel API parameters object + Params params_; + + bool is_initialized(bool set = false) { + static bool initialized = false; + if (set) initialized = true; + return initialized; + } + +public: + + /// Access the Params structure + Params const& params() const { + return params_; + } + + /// Determines whether the GEMM can execute the given problem. + static Status + can_implement(Arguments const& args) { + if (Kernel::can_implement(args)) { + return Status::kSuccess; + } + else { + return Status::kInvalid; + } + } + + /// Gets the workspace size + static size_t + get_workspace_size(Arguments const& args) { + size_t workspace_bytes = 0; + workspace_bytes += Kernel::get_workspace_size(args); + return workspace_bytes; + } + + /// Computes the grid shape + static dim3 + get_grid_shape(Params const& params) { + return Kernel::get_grid_shape(params); + } + + /// Computes the maximum number of active blocks per multiprocessor + static int maximum_active_blocks(int /* smem_capacity */ = -1) { + CUTLASS_TRACE_HOST("Universal::maximum_active_blocks()"); + int max_active_blocks = -1; + int smem_size = Kernel::SharedStorageSize; + + // first, account for dynamic smem capacity if needed + cudaError_t result; + if (smem_size >= (48 << 10)) { + CUTLASS_TRACE_HOST(" Setting smem size to " << smem_size); + result = cudaFuncSetAttribute( + device_kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, + smem_size); + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST( + " cudaFuncSetAttribute() returned error: " + << cudaGetErrorString(result)); + return -1; + } + } + + // query occupancy after setting smem size + result = cudaOccupancyMaxActiveBlocksPerMultiprocessor( + &max_active_blocks, + device_kernel, + Kernel::MaxThreadsPerBlock, + smem_size); + + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST( + " cudaOccupancyMaxActiveBlocksPerMultiprocessor() returned error: " + << cudaGetErrorString(result)); + return -1; + } + + CUTLASS_TRACE_HOST(" max_active_blocks: " << max_active_blocks); + return max_active_blocks; + } + + /// Initializes GEMM state from arguments. + Status + initialize(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + CUTLASS_TRACE_HOST("Universal::initialize() - workspace " + << workspace << ", stream: " << (stream ? "non-null" : "null")); + + // Initialize the workspace + Status status = Kernel::initialize_workspace(args, workspace, stream); + if (status != Status::kSuccess) { + return status; + } + + // Initialize the Params structure + params_ = Kernel::to_underlying_arguments(args, workspace); + + if (is_initialized()) return Status::kSuccess; + + // account for dynamic smem capacity if needed + int smem_size = Kernel::SharedStorageSize; + printf("[Usage] smem : %d\n", smem_size); + if (smem_size >= (48 << 10)) { + CUTLASS_TRACE_HOST(" Setting smem size to " << smem_size); + cudaError_t result = cudaFuncSetAttribute( + device_kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, + smem_size); + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST(" cudaFuncSetAttribute() returned error: " << cudaGetErrorString(result)); + return Status::kErrorInternal; + } + } + + is_initialized(true); + + return Status::kSuccess; + } + + /// Update API is preserved in 3.0, but does not guarantee a lightweight update of params. + Status + update(Arguments const& args, void* workspace = nullptr) { + CUTLASS_TRACE_HOST("Universal()::update() - workspace: " << workspace); + + size_t workspace_bytes = get_workspace_size(args); + if (workspace_bytes > 0 && nullptr == workspace) { + return Status::kErrorWorkspaceNull; + } + + params_ = Kernel::to_underlying_arguments(args, workspace); + return Status::kSuccess; + } + + /// Primary run() entry point API that is static allowing users to create and manage their own params. + /// Supplied params struct must be construct by calling Kernel::to_underling_arguments() + static Status + run(Params& params, cudaStream_t stream = nullptr) { + CUTLASS_TRACE_HOST("Universal::run()"); + dim3 const block = Kernel::get_block_shape(); + dim3 const grid = get_grid_shape(params); + + // configure smem size and carveout + int smem_size = Kernel::SharedStorageSize; + + Status launch_result; + // Use extended launch API only for mainloops that use it + if constexpr(Kernel::ArchTag::kMinComputeCapability >= 90) { + dim3 cluster(cute::size<0>(typename Kernel::ClusterShape{}), + cute::size<1>(typename Kernel::ClusterShape{}), + cute::size<2>(typename Kernel::ClusterShape{})); + void const* kernel = (void const*) device_kernel; + void* kernel_params[] = {¶ms}; + launch_result = ClusterLauncher::launch(grid, cluster, block, smem_size, stream, kernel, kernel_params); + } + else { + launch_result = Status::kSuccess; + device_kernel<<>>(params); + } + + cudaError_t result = cudaGetLastError(); + if (cudaSuccess == result && Status::kSuccess == launch_result) { + return Status::kSuccess; + } + else { + CUTLASS_TRACE_HOST(" Kernel launch failed. Reason: " << result); + return Status::kErrorInternal; + } + } + + // + // Non-static launch overloads that first create and set the internal params struct of this kernel handle. + // + + /// Launches the kernel after first constructing Params internal state from supplied arguments. + Status + run(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + Status status = initialize(args, workspace, stream); + if (Status::kSuccess == status) { + status = run(params_, stream); + } + return status; + } + + /// Launches the kernel after first constructing Params internal state from supplied arguments. + Status + operator()(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + return run(args, workspace, stream); + } + + /// Overload that allows a user to re-launch the same kernel without updating internal params struct. + Status + run(cudaStream_t stream = nullptr) { + return run(params_, stream); + } + + /// Overload that allows a user to re-launch the same kernel without updating internal params struct. + Status + operator()(cudaStream_t stream = nullptr) { + return run(params_, stream); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::device + +//////////////////////////////////////////////////////////////////////////////// diff --git a/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_builder.hpp b/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_builder.hpp new file mode 100644 index 00000000..d285b002 --- /dev/null +++ b/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_builder.hpp @@ -0,0 +1,116 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "../collective/sm90_ssd_epilogue.hpp" +#include "../collective/sm90_ssd_gemm_tma_warpspecialized.hpp" +#include "../kernel/sm90_ssd_kernel_tma_warpspecialized.hpp" +#include "../kernel/sm90_ssd_tile_scheduler.hpp" + +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/collective/collective_builder.hpp" + +namespace cutlass::ssd::kernel { + +template< + class Element_, + class ElementDA_, + class ElementAcc_, + class ElementY_, + class TileShape_, + bool HAS_D_, + bool D_HAS_HDIM_, + bool HAS_Z_ +> +struct Sm90SsdBuilder { + + using Element = Element_; + using ElementDA = ElementDA_; + using ElementAcc = ElementAcc_; + using ElementY = ElementY_; + using TileShape = TileShape_; + + static constexpr bool HAS_D = HAS_D_; + static constexpr bool D_HAS_HDIM = D_HAS_HDIM_; + static constexpr bool HAS_Z = HAS_Z_; + + static constexpr int StagesY = 2; + static constexpr int StagesX = 2; + static constexpr int StagesZ = 1; // smem size limitation + using EpilogueTileType = cutlass::epilogue::collective::EpilogueTileAuto; + using Schedule = cutlass::epilogue::TmaWarpSpecialized; + using EpilogueTile = decltype(cutlass::epilogue::collective::detail::sm90_compute_tile_shape_or_override< + ElementY, EpilogueTileType, Schedule, TileShape>()); + + using SmemLayoutAtomY = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + cute::GMMA::Major::MN, ElementY, decltype(get<0>(EpilogueTile{})), decltype(get<1>(EpilogueTile{}))>()); + using SmemLayoutY = decltype(tile_to_shape( + SmemLayoutAtomY{}, + make_shape(size<0>(EpilogueTile{}), size<1>(EpilogueTile{}), Int{}), + Step<_2,_1,_3>{})); + + using SmemLayoutAtomX = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + cute::GMMA::Major::MN, Element, decltype(get<0>(TileShape{})), decltype(get<1>(TileShape{}))>()); + using SmemLayoutX = decltype(tile_to_shape( + SmemLayoutAtomY{}, + make_shape(size<0>(TileShape{}), size<1>(TileShape{}), Int{}), + Step<_2,_1,_3>{})); + + using SmemLayoutAtomZ = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + cute::GMMA::Major::MN, Element, decltype(get<0>(TileShape{})), decltype(get<1>(TileShape{}))>()); + using SmemLayoutZ = decltype(tile_to_shape( + SmemLayoutAtomZ{}, + make_shape(size<0>(TileShape{}), size<1>(TileShape{}), Int{}), + Step<_2,_1,_3>{})); + + static constexpr auto epi_tile_m = size<0>(EpilogueTile{}); + static constexpr auto epi_tile_n = size<1>(EpilogueTile{}); + static constexpr auto partial_m = Int<128>{}; + static constexpr auto partial_n = Int{}; + + using SmemLayoutAtomPartialY = typename GMMA::Layout_K_SW64_Atom; + using SmemLayoutPartialY = decltype(tile_to_shape( + SmemLayoutAtomPartialY{}, + make_shape(partial_m, partial_n, Int{}))); + + using CollectiveMainloop = cutlass::ssd::collective::SsdMainloopTmaWarpSpecialized; + using CollectiveEpilogue = cutlass::ssd::collective::SsdEpilogue< + ElementAcc, ElementY, TileShape, + EpilogueTile, SmemLayoutX, SmemLayoutY, SmemLayoutPartialY, typename CollectiveMainloop::SmemLayoutP, SmemLayoutZ, + StagesX, StagesY, StagesZ, + HAS_D, D_HAS_HDIM, HAS_Z>; + using TileScheduler = cutlass::ssd::kernel::PersistentTileScheduler; + using Kernel = cutlass::ssd::kernel::SsdKernelTmaWarpSpecialized; + +}; + +} diff --git a/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_tma_warpspecialized.hpp b/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_tma_warpspecialized.hpp new file mode 100644 index 00000000..0619e8db --- /dev/null +++ b/examples/111_hopper_ssd/kernel/sm90_ssd_kernel_tma_warpspecialized.hpp @@ -0,0 +1,553 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/arch/reg_reconfig.h" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/arch/arch.h" + +namespace cutlass::ssd::kernel { + +using namespace cute; + +template< + class CollectiveMainloop, + class CollectiveEpilogue, + class TileScheduler +> +struct SsdKernelTmaWarpSpecialized { + + static const int NumLoadWarpGroups = 1; + // hard code + static constexpr int NumMmaWarpGroups = 2; + + // TileShape: LDN + using TileShape = typename CollectiveMainloop::TileShape; + // Force to use 1x1x1 + using ClusterShape = typename CollectiveMainloop::ClusterShape; + + // Pipeline for Tensor X + using MainloopPipelineX = typename CollectiveMainloop::MainloopPipelineX; + using PipelineParamsX = typename MainloopPipelineX::Params; + using PipelineStateX = typename cutlass::PipelineState; + + // Pipeline for Tensor Delta && DeltaA + using MainloopPipelineDelta = typename CollectiveMainloop::MainloopPipelineDelta; + using PipelineParamsDelta = typename MainloopPipelineDelta::Params; + using PipelineStateDelta = typename cutlass::PipelineState; + + // Pipeline for Tensor X + using MainloopPipelineB = typename CollectiveMainloop::MainloopPipelineB; + using PipelineParamsB = typename MainloopPipelineB::Params; + using PipelineStateB = typename cutlass::PipelineState; + + // Pipeline for Tensor X + using MainloopPipelineC = typename CollectiveMainloop::MainloopPipelineC; + using PipelineParamsC = typename MainloopPipelineC::Params; + using PipelineStateC = typename cutlass::PipelineState; + + // Pipeline for cooperate-warps + using CooperatePipeline = typename CollectiveEpilogue::CooperatePipeline; + using PipelineParamsCo = typename CooperatePipeline::Params; + using PipelineStateCo = typename cutlass::PipelineState; + + // Pipeline for Tensor D + using EpiloadPipelineD = typename CollectiveEpilogue::EpiloadPipelineD; + using PipelineParamsD = typename EpiloadPipelineD::Params; + using PipelineStateD = typename cutlass::PipelineState; + + // Pipeline for Tensor Z + using EpiloadPipelineZ = typename CollectiveEpilogue::EpiloadPipelineZ; + using PipelineParamsZ = typename EpiloadPipelineZ::Params; + using PipelineStateZ = typename cutlass::PipelineState; + + struct TensorStorage { + typename CollectiveMainloop::SharedStorage mainloop; + typename CollectiveEpilogue::TensorStorage epilogue; + }; + + struct SharedStorage { + TensorStorage tensors; + + using PipelineStorageX = typename MainloopPipelineX::SharedStorage; + using PipelineStorageDelta = typename MainloopPipelineDelta::SharedStorage; + using PipelineStorageB = typename MainloopPipelineB::SharedStorage; + using PipelineStorageC = typename MainloopPipelineC::SharedStorage; + using PipelineStorageCo = typename CooperatePipeline::SharedStorage; + using PipelineStorageD = typename EpiloadPipelineD::SharedStorage; + using PipelineStorageZ = typename EpiloadPipelineZ::SharedStorage; + + // pipeline + alignas(16) PipelineStorageX pipeline_storage_x; + alignas(16) PipelineStorageDelta pipeline_storage_delta; + alignas(16) PipelineStorageB pipeline_storage_b; + alignas(16) PipelineStorageC pipeline_storage_c; + alignas(16) PipelineStorageCo pipeline_storage_co; + alignas(16) PipelineStorageD pipeline_storage_d; + alignas(16) PipelineStorageZ pipeline_storage_z; + }; + + static constexpr int SharedStorageSize = sizeof(SharedStorage); + // [G, B, EH, C, L, D, N] + using ProblemShape = cute::tuple; + + struct Arguments { + ProblemShape problem_size; + typename CollectiveMainloop::Arguments mainloop; + typename CollectiveEpilogue::Arguments epilogue; + KernelHardwareInfo hw_info; + }; + + struct Params { + ProblemShape problem_size; + typename CollectiveMainloop::Params mainloop; + typename CollectiveEpilogue::Params epilogue; + typename TileScheduler::Params tile_scheduler; + }; + + static const int MinBlocksPerMultiprocessor = 1; + static const int MaxThreadsPerBlock = (NumMmaWarpGroups + NumLoadWarpGroups) * cutlass::NumThreadsPerWarpGroup; + using ArchTag = cutlass::arch::Sm90; + + // CTA reconfig (TBD) + static constexpr uint32_t LoadRegisterRequirement = 40 - 2 * 8; + static constexpr uint32_t TotalRegisterSupply = (64*1024 / MaxThreadsPerBlock / MinBlocksPerMultiprocessor / 8) * 8 * MaxThreadsPerBlock / cutlass::NumThreadsPerWarpGroup; + static constexpr uint32_t MmaRegisterRequirement = ((TotalRegisterSupply - LoadRegisterRequirement) / NumMmaWarpGroups / 8) * 8; + // static constexpr uint32_t LoadRegisterRequirement = 40; + // static constexpr uint32_t MmaRegisterRequirement = 232; + + static size_t get_workspace_size(Arguments const& args) { return 0; } + static cutlass::Status initialize_workspace(Arguments const&, void*, cudaStream_t) { + return cutlass::Status::kSuccess; + } + + static bool can_implement(Arguments const& args) { + return CollectiveMainloop::can_implement(args.problem_size, args.mainloop); + } + + static dim3 get_grid_shape(Params const& params) { + return TileScheduler::get_grid_shape(params.tile_scheduler); + } + + static dim3 get_block_shape() { + dim3 block(MaxThreadsPerBlock, 1, 1); + return block; + } + + static Params to_underlying_arguments(Arguments const& args, void* workspace) { + return Params{ + args.problem_size, + CollectiveMainloop::to_underlying_arguments(args.problem_size, args.mainloop, workspace), + CollectiveEpilogue::to_underlying_arguments(args.problem_size, args.epilogue, workspace), + TileScheduler::to_underlying_arguments(args.problem_size, args.hw_info, ClusterShape{}, TileShape{}) + }; + } + + CUTLASS_DEVICE void operator()(const Params ¶ms, char* smem) { + + // TBD + enum class WarpGroupRole { + Producer = 0, + Consumer0 = 1, + Consumer1 = 2 + }; + // TBD + enum class ProducerWarpRole { + LoadX = 0, + LoadDelta = 1, + LoadBC = 2, + LoadZ = 3 + }; + + + // Parameters + // [G, B, EH, C, L, D, N] + auto C = get<3>(params.problem_size); + + // Shared memory. + auto& storage = *reinterpret_cast(smem); + + int lane_idx = cutlass::canonical_lane_idx(); + int warp_idx = cutlass::canonical_warp_idx_sync(); + int warp_idx_in_warp_group = warp_idx % cutlass::NumWarpsPerWarpGroup; + int warp_group_idx = cutlass::canonical_warp_group_idx(); + auto warp_group_role = WarpGroupRole(warp_group_idx); + auto producer_warp_role = ProducerWarpRole(warp_idx_in_warp_group); + int lane_predicate = cute::elect_one_sync(); + uint32_t block_rank_in_cluster = cute::block_rank_in_cluster(); + + // Issue Tma Descriptor Prefetch from a single thread + if ((warp_idx == 0) && lane_predicate) { + CollectiveMainloop::prefetch_tma_descriptors(params.mainloop); + } + + // Pipeline (TBD) + PipelineParamsX pipeline_params_x; + pipeline_params_x.transaction_bytes = CollectiveMainloop::kXLoadBytes; + pipeline_params_x.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadX); + pipeline_params_x.num_consumers = cutlass::NumThreadsPerWarpGroup * NumMmaWarpGroups; + pipeline_params_x.initializing_warp = 4; + + PipelineParamsDelta pipeline_params_delta; + pipeline_params_delta.transaction_bytes = CollectiveMainloop::kDeltaLoadBytes + CollectiveMainloop::kDeltaALoadBytes; + pipeline_params_delta.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadDelta); + pipeline_params_delta.num_consumers = cutlass::NumThreadsPerWarpGroup * NumMmaWarpGroups; + pipeline_params_delta.initializing_warp = 5; + + PipelineParamsB pipeline_params_b; + pipeline_params_b.transaction_bytes = CollectiveMainloop::kBLoadBytes; + pipeline_params_b.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadBC); + pipeline_params_b.num_consumers = cutlass::NumThreadsPerWarpGroup * NumMmaWarpGroups; + pipeline_params_b.initializing_warp = 6; + + PipelineParamsC pipeline_params_c; + pipeline_params_c.transaction_bytes = CollectiveMainloop::kCLoadBytes; + pipeline_params_c.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadBC); + pipeline_params_c.num_consumers = cutlass::NumThreadsPerWarpGroup * NumMmaWarpGroups; + pipeline_params_c.initializing_warp = 7; + + PipelineParamsCo pipeline_params_co; + pipeline_params_co.producer_arv_count = cutlass::NumThreadsPerWarpGroup; + pipeline_params_co.consumer_arv_count = cutlass::NumThreadsPerWarpGroup; + pipeline_params_co.initializing_warp = 8; + + PipelineParamsD pipeline_params_d; + pipeline_params_d.transaction_bytes = CollectiveEpilogue::kEpiloadDBytes; + pipeline_params_d.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadDelta); + pipeline_params_d.num_consumers = cutlass::NumThreadsPerWarpGroup; + pipeline_params_d.initializing_warp = 9; + + PipelineParamsZ pipeline_params_z; + pipeline_params_z.transaction_bytes = CollectiveEpilogue::kEpiloadZBytes; + pipeline_params_z.is_leader = lane_predicate && (producer_warp_role == ProducerWarpRole::LoadZ); + pipeline_params_z.num_consumers = cutlass::NumThreadsPerWarpGroup; + pipeline_params_z.initializing_warp = 10; + + if (warp_group_role == WarpGroupRole::Producer && producer_warp_role == ProducerWarpRole::LoadX) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Producer && producer_warp_role == ProducerWarpRole::LoadDelta) { + pipeline_params_delta.role = MainloopPipelineDelta::ThreadCategory::Producer; + pipeline_params_d.role = EpiloadPipelineD::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Producer && producer_warp_role == ProducerWarpRole::LoadBC) { + pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Producer; + pipeline_params_c.role = MainloopPipelineC::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Producer && producer_warp_role == ProducerWarpRole::LoadZ) { + pipeline_params_z.role = EpiloadPipelineZ::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Consumer0 || warp_group_role == WarpGroupRole::Consumer1) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Consumer; + pipeline_params_delta.role = MainloopPipelineDelta::ThreadCategory::Consumer; + pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Consumer; + pipeline_params_c.role = MainloopPipelineC::ThreadCategory::Consumer; + } + if (warp_group_role == WarpGroupRole::Consumer0) { + pipeline_params_co.role = CooperatePipeline::ThreadCategory::Producer; + } + if (warp_group_role == WarpGroupRole::Consumer1) { + pipeline_params_co.role = CooperatePipeline::ThreadCategory::Consumer; + pipeline_params_d.role = EpiloadPipelineD::ThreadCategory::Consumer; + pipeline_params_z.role = EpiloadPipelineZ::ThreadCategory::Consumer; + } + + MainloopPipelineX pipeline_x(storage.pipeline_storage_x, pipeline_params_x, Shape<_1,_1,_1>{}); + PipelineStateX mainloop_pipe_x_consumer; + PipelineStateX mainloop_pipe_x_producer = cutlass::make_producer_start_state(); + + MainloopPipelineDelta pipeline_delta(storage.pipeline_storage_delta, pipeline_params_delta, Shape<_1,_1,_1>{}); + PipelineStateDelta mainloop_pipe_delta_consumer; + PipelineStateDelta mainloop_pipe_delta_producer = cutlass::make_producer_start_state(); + + MainloopPipelineB pipeline_b(storage.pipeline_storage_b, pipeline_params_b, Shape<_1,_1,_1>{}); + PipelineStateB mainloop_pipe_b_consumer; + PipelineStateB mainloop_pipe_b_producer = cutlass::make_producer_start_state(); + + MainloopPipelineC pipeline_c(storage.pipeline_storage_c, pipeline_params_c, Shape<_1,_1,_1>{}); + PipelineStateC mainloop_pipe_c_consumer; + PipelineStateC mainloop_pipe_c_producer = cutlass::make_producer_start_state(); + + CooperatePipeline pipeline_co(storage.pipeline_storage_co, pipeline_params_co); + PipelineStateCo cooperate_pipe_consumer_state; + PipelineStateCo cooperate_pipe_producer_state = cutlass::make_producer_start_state(); + + EpiloadPipelineD pipeline_d(storage.pipeline_storage_d, pipeline_params_d, Shape<_1,_1,_1>{}); + PipelineStateD epi_load_pipe_d_consumer; + PipelineStateD epi_load_pipe_d_producer = cutlass::make_producer_start_state(); + + EpiloadPipelineZ pipeline_z(storage.pipeline_storage_z, pipeline_params_z, Shape<_1,_1,_1>{}); + PipelineStateZ epi_load_pipe_z_consumer; + PipelineStateZ epi_load_pipe_z_producer = cutlass::make_producer_start_state(); + + // Epilogue Store pipeline + using EpiStorePipeline = typename CollectiveEpilogue::StorePipeline; + typename EpiStorePipeline::Params epi_store_pipeline_params; + epi_store_pipeline_params.always_wait = true; + EpiStorePipeline epi_store_pipeline(epi_store_pipeline_params); + + PipelineState epi_store_pipe_producer_state = cutlass::make_producer_start_state(); + + // Epilogue Store P pipeline + using EpiStorePPipeline = typename CollectiveEpilogue::StorePPipeline; + typename EpiStorePPipeline::Params epi_store_p_pipeline_params; + epi_store_p_pipeline_params.always_wait = true; + EpiStorePPipeline epi_store_p_pipeline(epi_store_p_pipeline_params); + + PipelineState epi_store_p_pipe_producer_state = cutlass::make_producer_start_state(); + + // We need this to guarantee that the Pipeline init is visible + // To all producers and consumer blocks in the Cluster + // and to finish smem init + if constexpr (size(ClusterShape{}) > 1) { + cute::cluster_arrive_relaxed(); + cute::cluster_wait(); + } + else { + __syncthreads(); + } + + // Kernel implement(TBD) + + CollectiveMainloop collective_mainloop; + CollectiveEpilogue collective_epilogue; + + if (warp_group_role == WarpGroupRole::Producer) { + // disable reg dealloc to enable print + cutlass::arch::warpgroup_reg_dealloc(); + if (producer_warp_role == ProducerWarpRole::LoadX) { + // use local variable to avoid STL/LDL + TileScheduler tile_scheduler{params.tile_scheduler}; + auto load_input = collective_mainloop.load_x_init(params.mainloop, params.problem_size); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord(); + // Load X + collective_mainloop.load_x( + blk_coord, params.mainloop, params.problem_size, + pipeline_x, mainloop_pipe_x_producer, + load_input, + storage.tensors.mainloop + ); + } + collective_mainloop.load_x_tail( + pipeline_x, mainloop_pipe_x_producer + ); + } + else if (producer_warp_role == ProducerWarpRole::LoadDelta) { + TileScheduler tile_scheduler{params.tile_scheduler}; + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord(); + auto blk_coord_eh = tile_scheduler.get_block_coord_eh(); + // Epiload + collective_epilogue.load_d( + blk_coord_eh, params.epilogue, params.problem_size, + pipeline_d, epi_load_pipe_d_producer, + storage.tensors.mainloop + ); + // Load Delta + // Load DeltaA + collective_mainloop.load_delta( + blk_coord, params.mainloop, params.problem_size, + pipeline_delta, mainloop_pipe_delta_producer, + storage.tensors.mainloop + ); + } + collective_mainloop.load_delta_tail( + pipeline_delta, mainloop_pipe_delta_producer + ); + } + else if (producer_warp_role == ProducerWarpRole::LoadBC) { + TileScheduler tile_scheduler{params.tile_scheduler}; + auto load_input_b = collective_mainloop.load_b_init(params.mainloop, params.problem_size); + auto load_input_c = collective_mainloop.load_c_init(params.mainloop, params.problem_size); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord_b(); + // Load B + collective_mainloop.load_b_c( + blk_coord, params.mainloop, params.problem_size, + pipeline_b, mainloop_pipe_b_producer, + pipeline_c, mainloop_pipe_c_producer, + load_input_b, + load_input_c, + storage.tensors.mainloop + ); + } + collective_mainloop.load_b_c_tail( + pipeline_b, mainloop_pipe_b_producer, + pipeline_c, mainloop_pipe_c_producer + ); + } + else if (producer_warp_role == ProducerWarpRole::LoadZ) { + // use local variable to avoid STL/LDL + TileScheduler tile_scheduler{params.tile_scheduler}; + auto load_input = collective_epilogue.load_z_init(params.epilogue, params.problem_size); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord(); + // Load X + collective_epilogue.load_z( + blk_coord, params.epilogue, params.problem_size, + pipeline_z, epi_load_pipe_z_producer, + load_input, + storage.tensors.epilogue + ); + } + collective_epilogue.load_z_tail( + pipeline_z, epi_load_pipe_z_producer + ); + } + } + // Warpgroup1 for Intra + // Warpgroup2 for Inter + else if (warp_group_role == WarpGroupRole::Consumer0) { + TileScheduler tile_scheduler{params.tile_scheduler}; + cutlass::arch::warpgroup_reg_alloc(); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + for (int chunk = 0; chunk < C; ++chunk) { + auto blk_coord = tile_scheduler.get_block_coord(); + // IntraBMM1 + // Wait B + // Wait C + auto [tIntra1] = collective_mainloop.mma_intra_1( + chunk, + pipeline_b, mainloop_pipe_b_consumer, + pipeline_c, mainloop_pipe_c_consumer, + storage.tensors.mainloop + ); + // Pre Intra2 + auto [tPreIntra2] = collective_mainloop.pre_intra_2( + chunk, + pipeline_delta, mainloop_pipe_delta_consumer, + tIntra1, + storage.tensors.mainloop + ); + // IntraBMM2 + auto [tIntra2] = collective_mainloop.mma_intra_2( + chunk, + pipeline_x, mainloop_pipe_x_consumer, + tPreIntra2, + storage.tensors.mainloop + ); + collective_epilogue.store_intra( + chunk, blk_coord, params.epilogue, params.problem_size, + pipeline_co, cooperate_pipe_producer_state, + tIntra2, + typename CollectiveMainloop::TiledMmaIntra2{}, + storage.tensors.epilogue + ); + } + } + } + else if (warp_group_role == WarpGroupRole::Consumer1) { + TileScheduler tile_scheduler{params.tile_scheduler}; + cutlass::arch::warpgroup_reg_alloc(); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto [tState] = collective_mainloop.state_init(storage.tensors.mainloop); + auto blk_coord_eh = tile_scheduler.get_block_coord_eh(); + bool is_first_iteration = true; + for (int chunk = 0; chunk < C; ++chunk) { + auto blk_coord = tile_scheduler.get_block_coord(); + // Pre Inter1 + // Wait delta + // Wait deltaA + auto [tPreInter1, last_column] = collective_mainloop.pre_inter_1( + chunk, + pipeline_b, mainloop_pipe_b_consumer, + pipeline_delta, mainloop_pipe_delta_consumer, + storage.tensors.mainloop + ); + // InterBMM1 + // Wait X + auto [tInter1] = collective_mainloop.mma_inter_1( + chunk, + pipeline_x, mainloop_pipe_x_consumer, + tPreInter1, + storage.tensors.mainloop + ); + collective_mainloop.pre_inter_2( + last_column, + tInter1, + tState + ); + // InterBMM2 + auto [tInter2, tDelta] = collective_mainloop.mma_inter_2( + chunk, + pipeline_c, mainloop_pipe_c_consumer, + pipeline_delta, mainloop_pipe_delta_consumer, + storage.tensors.mainloop + ); + // Pre Inter2 + collective_mainloop.post_inter_2( + tState, + storage.tensors.mainloop + ); + // update_d + auto [tD] = collective_epilogue.update_d( + blk_coord_eh, params.epilogue, + is_first_iteration, + pipeline_d, epi_load_pipe_d_consumer, + typename CollectiveMainloop::TiledMmaInter2{}, + storage.tensors.mainloop + ); + is_first_iteration = false; + // Epilogue TensorY store + collective_epilogue.store( + chunk, blk_coord, params.epilogue, params.problem_size, + epi_store_pipeline, epi_store_pipe_producer_state, + pipeline_co, cooperate_pipe_consumer_state, + pipeline_x, mainloop_pipe_x_consumer, + pipeline_z, epi_load_pipe_z_consumer, + tInter2, tDelta, tD, + typename CollectiveMainloop::TiledMmaInter2{}, + storage.tensors.epilogue, storage.tensors.mainloop + ); + } + + if constexpr (CollectiveEpilogue::D_HAS_HDIM) { + // update the barrier + pipeline_d.consumer_release(epi_load_pipe_d_consumer); + ++epi_load_pipe_d_consumer; + } + + auto blk_coord = tile_scheduler.get_block_coord(); + // Epilogue Fstate store + collective_epilogue.store_p( + blk_coord, params.epilogue, params.problem_size, + epi_store_p_pipeline, epi_store_p_pipe_producer_state, + storage.tensors.mainloop + ); + } + } + } +}; + +} // namespace cutlass::fmha::kernel diff --git a/examples/111_hopper_ssd/kernel/sm90_ssd_tile_scheduler.hpp b/examples/111_hopper_ssd/kernel/sm90_ssd_tile_scheduler.hpp new file mode 100644 index 00000000..20a2e509 --- /dev/null +++ b/examples/111_hopper_ssd/kernel/sm90_ssd_tile_scheduler.hpp @@ -0,0 +1,132 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/fast_math.h" +#include "cutlass/kernel_hardware_info.h" + +namespace cutlass::ssd::kernel { + +//////////////////////////////////////////////////////////////////////////////// + +struct PersistentTileScheduler { + + struct Params { + int num_blocks; + int num_groups; + FastDivmod divmod_eh; + FastDivmod divmod_ngroup_ratio; + + KernelHardwareInfo hw_info; + }; + + int block_idx = 0; + Params params; + + CUTLASS_DEVICE + PersistentTileScheduler(Params const& params) : block_idx(blockIdx.x), params(params) {} + + template + static Params to_underlying_arguments( + ProblemSize const& problem_size, KernelHardwareInfo hw_info, + ClusterShape const& cluster_shape, TileShape const& tile_shape) + { + using namespace cute; + auto [G, B, EH, C, L, D, N] = problem_size; + + // Get SM count if needed, otherwise use user supplied SM count + int sm_count = hw_info.sm_count; + if (sm_count <= 0) { + CUTLASS_TRACE_HOST(" WARNING: Arguments do not include a valid SM count.\n" + " For optimal performance, populate the arguments KernelHardwareInfo struct with the SM count."); + sm_count = KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + } + + CUTLASS_TRACE_HOST("to_underlying_arguments(): Setting persistent grid SM count to " << sm_count); + hw_info.sm_count = sm_count; + + int num_blocks = B * EH; + int ngroup_ratio = EH / G; + + return Params { + num_blocks, + G, + {EH}, + {ngroup_ratio}, + hw_info + }; + } + + static dim3 get_grid_shape(Params const& params) { + dim3 grid(std::min(params.num_blocks, params.hw_info.sm_count), 1, 1); + return grid; + } + + CUTLASS_DEVICE + bool is_valid() { + return block_idx < params.num_blocks; + } + + CUTLASS_DEVICE + auto get_block_coord() { + return block_idx; + } + + CUTLASS_DEVICE + auto get_block_coord_b() { + using namespace cute; + int eh_idx, b_idx; + int g_idx, rest_idx; + params.divmod_eh(b_idx, eh_idx, block_idx); + params.divmod_ngroup_ratio(g_idx, rest_idx, eh_idx); + return (params.num_groups * b_idx + g_idx); + } + + CUTLASS_DEVICE + auto get_block_coord_eh() { + using namespace cute; + int eh_idx, b_idx; + params.divmod_eh(b_idx, eh_idx, block_idx); + return eh_idx; + } + + CUTLASS_DEVICE + PersistentTileScheduler& operator++() { + block_idx += gridDim.x; + return *this; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::ssd::kernel diff --git a/examples/111_hopper_ssd/reference/reference_ssd.hpp b/examples/111_hopper_ssd/reference/reference_ssd.hpp new file mode 100644 index 00000000..05a524df --- /dev/null +++ b/examples/111_hopper_ssd/reference/reference_ssd.hpp @@ -0,0 +1,345 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cute/tensor.hpp" + +// training or inference phase (not used yet) +// PHASE 0 : training +// PHASE 1 : inference +#define PHASE 0 + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template< + bool transA, + bool transB, + class Element, + class TensorA, + class TensorB, + class TensorC +> +void mma( + TensorA tA, + TensorB tB, + TensorC tC) { + using namespace cute; + + int M = transA ? int(shape<1>(tA)) : int(shape<0>(tA)); + int N = transB ? int(shape<1>(tB)) : int(shape<0>(tB)); + int K = transA ? int(shape<0>(tA)) : int(shape<1>(tA)); + for (int mi = 0; mi < M; ++mi) { + for (int ni = 0; ni < N; ++ni) { + for (int ki = 0; ki < K; ++ki) { + float a = static_cast(Element(transA ? tA(ki, mi) : tA(mi, ki))); + float b = static_cast(Element(transB ? tB(ki, ni) : tB(ni, ki))); + tC(mi, ni) += a * b; + } + } + } + +} + +template< + class Element, + class Tensor +> +auto segsum(Tensor tensor) { + using namespace cute; + auto C = shape<0>(tensor); + auto L = shape<1>(tensor); + auto cum_sum = make_tensor(make_shape(C,L)); + // cum_sum + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + if (li == 0) { + cum_sum(ci, li) = tensor(ci, li); + } + else { + cum_sum(ci, li) = cum_sum(ci, li - 1) + tensor(ci, li); + } + } + } + auto seg_sum_out = make_tensor(make_shape(C, L, L)); + // seg_sum + // [ 1, 0, 0] + // [ e^y, 1, 0] + // [e^(y+z), e^z, 1] + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < L; ++i) { + for (int j = 0; j < L; ++j) { + if (j < i) { + float tmp = static_cast(cum_sum(ci, i)) - static_cast(cum_sum(ci, j)); + seg_sum_out(ci, i, j) = expf(tmp); + } + else if (j == i) { + seg_sum_out(ci, i, j) = 1.f; + } + else { + seg_sum_out(ci, i, j) = 0.f; + } + } + } + } + + return seg_sum_out; +} + +template< + class Element, + class Tensor +> +auto cumsum( + Tensor tensor) { + using namespace cute; + auto C = shape<0>(tensor); + auto L = shape<1>(tensor); + auto cum_sum = make_tensor(make_shape(C,L)); + auto cum_sum_out = make_tensor(make_shape(C,L)); + auto cum_sum_exp_out = make_tensor(make_shape(C, L)); + auto cum_sum_exp_out_last = make_tensor(make_shape(C, L)); + auto last_column = make_tensor(make_shape(C)); + // [x, x+y, x+y+z, ..] + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + if (li == 0) { + cum_sum(ci, li) = tensor(ci, li); + } + else { + cum_sum(ci, li) = cum_sum(ci, li - 1) + tensor(ci, li); + } + // cum_sum_out(ci, li) = static_cast(cum_sum(ci, li)); + } + } + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + last_column(ci) = static_cast(cum_sum(ci, L-1)); + CUTLASS_PRAGMA_UNROLL + for (int li = 0; li < L; ++li) { + cum_sum_exp_out_last(ci, li) = expf(static_cast(last_column(ci) - cum_sum(ci, li))); + cum_sum_exp_out(ci, li) = expf(static_cast(cum_sum(ci, li))); + } + } + + return make_tuple(cum_sum_exp_out_last, last_column, cum_sum_exp_out); +} + +template< + bool HAS_D, + bool D_HAS_HDIM, + bool HAS_Z, + class TensorY, + class TensorF, + class TensorX, + class TensorDelta, + class TensorDeltaA, + class TensorB, + class TensorC, + class TensorD, + class TensorZ, + class Params +> +void ssd_reference_impl( + TensorY mY, TensorF mF, + TensorX mX, TensorDelta mDelta, TensorDeltaA mDeltaA, + TensorB mB, TensorC mC, TensorD mD, TensorZ mZ, + Params params) { + + using namespace cute; + using Element = typename Params::Element; + using ElementAcc = typename Params::ElementAcc; + + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + // d [ eh, d] + auto [G, B, EH, C, L, D, N] = params.get_problem_shape(); + int group_ratio = EH / G; + for (int b = 0; b < B; ++b) { + for (int eh = 0; eh < EH; ++eh) { + int g = eh / group_ratio; + auto tY = mY(b,eh,_,_,_); + auto tF = mF(b,eh,_,_); + auto tX = mX(b,eh,_,_,_); + auto tDelta = mDelta(b,eh,_,_); + auto tDeltaA = mDeltaA(b,eh,_,_); + auto tB = mB(b,g,_,_,_); + auto tC = mC(b,g,_,_,_); + auto tD = mD(eh,_); + auto tZ = mZ(b,eh,_,_,_); + // IntraBMM1 BxC, LxLxN, NT + // B: [n, c, l] + // C: [n, c, l] + // O: [c, l, l] + auto tIntraBMM1_out = make_tensor(make_shape(C,L,L)); + for (int ci = 0; ci < C; ++ci) { + mma(tC(_,ci,_), tB(_,ci,_), tIntraBMM1_out(ci,_,_)); + } + // Pre_IntraBMM2 DeltaA_IntraBMM2 x Delta x IntraBMM_out + // DeltaA_xxx : [c, l, l] + // Delta : [c, l, _] + // IntraBMM1_out: [c, l, l] + auto tDeltaA_IntraBMM2 = segsum(tDeltaA); + auto tIntraBMM2_inp = make_tensor(make_shape(C, L, L)); + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < L; ++i) { + for (int j = 0; j < L; ++j) { + tIntraBMM2_inp(ci, i, j) = tDeltaA_IntraBMM2(ci, i, j) * tDelta(ci, j) * tIntraBMM1_out(ci, i, j); + } + } + } + // IntraBMM2 IntraBMM2_inp x X, LxDxL, TT + // IntraBMM2_inp: [c, l, l] + // X : [d, c, l] + // IntraBMM2_out: [c, l, d] + auto tIntraBMM2_out = make_tensor(make_shape(C,L,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tIntraBMM2_inp(ci,_,_), tX(_,ci,_), tIntraBMM2_out(ci,_,_)); + } + // Pre_InterBMM1 DeltaA_InterBMM1 x Delta x B + // DeltaA_xxx : [c, l] + // Delta : [c, l] + // IntraBMM1_out: [c, n, l] + auto [tDeltaA_InterBMM1, tLast, tCumsum_exp] = cumsum(tDeltaA); + auto tInterBMM1_inp = make_tensor(make_shape(C, N, L)); + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < N; ++i) { + for (int j = 0; j < L; ++j) { + tInterBMM1_inp(ci, i, j) = tDeltaA_InterBMM1(ci, j) * tDelta(ci, j) * tB(i, ci, j); + } + } + } + // InterBMM1 InterBMM1_inp x X, NxDxL, swapAB, TT + // InterBMM1_inp: [c, n, l] + // X : [d, c, l] + // InterBMM1_out: [c, n, d] + auto tInterBMM1_out = make_tensor(make_shape(C,N,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tInterBMM1_inp(ci,_,_), tX(_,ci,_), tInterBMM1_out(ci,_,_)); + } + // Initialize state + // PreInterBMM2 + // InterBMM1_out: [c, n, d] + // Last : [c] + auto tInterBMM2_inp = make_tensor(make_shape(C, N, D)); + for (int ci = 0; ci < C; ++ci) { + for (int ni = 0; ni < N; ++ ni){ + for (int di = 0; di < D; ++di) { + if (ci == 0) { + tInterBMM2_inp(ci, ni, di) = 0; + } + else { + tInterBMM2_inp(ci, ni, di) = tInterBMM1_out(ci - 1, ni, di) + expf(tLast(ci - 1)) * tInterBMM2_inp(ci - 1, ni, di); + } + } + } + } + // InterBMM2 InterBMM2_inp x C, LxDxN, NT + // C : [n, c, l] + // InterBMM2_inp: [c, n, d] + // InterBMM2_out: [c, l, d] + auto tInterBMM2_out = make_tensor(make_shape(C,L,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tC(_,ci,_), tInterBMM2_inp(ci,_,_), tInterBMM2_out(ci,_,_)); + } + // Epilogue Cumsum_exp x InterBMM2_out + IntraBMM2_out + // InterBMM2_out: [c, l, d] + // IntraBMM2_out: [c, l, d] + // Cumsum_exp : [c, l] + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + for (int di = 0; di < D; ++di) { + float y = tInterBMM2_out(ci, li, di) * tCumsum_exp(ci, li) + tIntraBMM2_out(ci, li, di); + float scale; + if constexpr (D_HAS_HDIM) { + scale = static_cast(tD(di)); + } + else { + scale = static_cast(tD(_0{})); + } + if constexpr (HAS_D) { + y = y + static_cast(tX(di, ci, li)) * scale; + } + else { + y = y; + } + if constexpr (HAS_Z) { + float z = static_cast(tZ(di, ci, li)); + // y = y * z * (1 / (1 + exp(-z))); + y = y * z * (1 / (1 + exp(-z))); + } + tY(di, ci, li) = static_cast(y); + } + } + } + // Epilogue Fstate(last C) + for (int ni = 0; ni < N; ++ ni){ + for (int di = 0; di < D; ++di) { + tF(di, ni) = static_cast(tInterBMM1_out(C - 1, ni, di) + expf(tLast(C - 1)) * tInterBMM2_inp(C - 1, ni, di)); + } + } + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template< + bool HAS_D, + bool D_HAS_HDIM, + bool HAS_Z, + class TensorY, + class TensorF, + class TensorX, + class TensorDelta, + class TensorDeltaA, + class TensorB, + class TensorC, + class TensorD, + class TensorZ, + class Params +> +void ssd_reference( + TensorY mY, TensorF mF, + TensorX mX, TensorDelta mDelta, TensorDeltaA mDeltaA, + TensorB mB, TensorC mC, TensorD mD, TensorZ mZ, + Params params) { + ssd_reference_impl(mY, mF, mX, mDelta, mDeltaA, mB, mC, mD, mZ, params); +} + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/examples/111_hopper_ssd/reference/reference_ssd_cumsum.hpp b/examples/111_hopper_ssd/reference/reference_ssd_cumsum.hpp new file mode 100644 index 00000000..124052f8 --- /dev/null +++ b/examples/111_hopper_ssd/reference/reference_ssd_cumsum.hpp @@ -0,0 +1,194 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include +#include + +#include "cutlass/coord.h" +#include "cutlass/util/host_tensor.h" +#include "cutlass/tensor_view.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/reference/host/gemm.h" +#include "cutlass/arch/arch.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +#include "cute/int_tuple.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "cute/util/debug.hpp" +#include "cute/config.hpp" + +namespace cutlass::ssd::kernel { + +using namespace cute; + +template< + class Element_, + class ElementD_, + class TileShape_> +struct CumsumKernel { + using Element = Element_; + using ElementD = ElementD_; + using TileShape = TileShape_; // L,D,N + + // Required by `device_kernel` + static constexpr int MaxThreadsPerBlock = 128; + static constexpr int MinBlocksPerMultiprocessor = 1; + using ArchTag = arch::Sm90; + + static constexpr int AlignmentBytes = 16; + + struct SharedStorage { + /* empty, no smem needed */ + }; + + static constexpr int SharedStorageSize = sizeof(SharedStorage); + + struct TransformArguments { + const Element* ptr_DeltaA; + ElementD* ptr_Cumsum; + }; + + struct TransformParams { + const Element* ptr_DeltaA; + ElementD* ptr_Cumsum; + }; + + using ProblemShape = cute::tuple; // b, eh, c, l + struct Arguments { + ProblemShape problem_shape{}; + TransformArguments transform{}; + KernelHardwareInfo hw_info{}; + }; + + struct Params { + ProblemShape problem_shape{}; + TransformParams transform{}; + KernelHardwareInfo hw_info{}; + }; + + static Params + to_underlying_arguments(Arguments const& args, void* workspace) { + return Params{ + ProblemShape{args.problem_shape}, + TransformParams{args.transform.ptr_DeltaA, args.transform.ptr_Cumsum}, + KernelHardwareInfo{args.hw_info}}; + } + + static Status + can_implement(Arguments const& args) { + return Status::kSuccess; + } + + static size_t + get_workspace_size(Arguments const& args) { + return size_t(0); + } + + static Status + initialize_workspace(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr, + CudaHostAdapter *cuda_adapter = nullptr) { + return Status::kSuccess; + } + + static dim3 + get_grid_shape(Params const& params) { + auto [B, EH, C, L] = params.problem_shape; + return dim3(B*EH, 1, 1); + } + + static dim3 + get_block_shape() { + return dim3(MaxThreadsPerBlock, 1, 1); + } + + CUTE_HOST_DEVICE + void + operator()(Params params, [[maybe_unused]] char* smem_buf = nullptr) { + auto [B, EH, C, L] = params.problem_shape; + + auto layout = make_layout(make_shape(L, C, EH*B)); + + auto mD_bcl = make_tensor(make_gmem_ptr(params.transform.ptr_DeltaA), make_layout(reverse(layout.shape()), reverse(layout.stride()))); + auto mC_bcl = make_tensor(make_gmem_ptr(params.transform.ptr_Cumsum), make_layout(reverse(layout.shape()), reverse(layout.stride()))); + auto cD_bcl = make_identity_tensor(shape(mD_bcl)); + + int blk_idx = blockIdx.x; + int thread_idx = threadIdx.x; + + auto tD = logical_divide(mD_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + auto tC = logical_divide(mC_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + auto cD = logical_divide(cD_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + + static constexpr int NumPacked = AlignmentBytes / sizeof(ElementD); + using PackedTypeDeltaA = uint_bit_t * NumPacked>; + using PackedTypeCumsum = uint_bit_t * NumPacked>; + +#if 0 + if (thread_idx % 128 == 0 && blk_idx == 0) { + print("tD : ");print(tD);print("\n"); + print("tC : ");print(tC);print("\n"); + print("cD : ");print(cD);print("\n"); + } +#endif + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < shape<0>(tD); ++i) { + float last_element = 0.f; + auto crd = cD(i,_0{}); + auto tD_recast = recast(tD); + auto tC_recast = recast(tC); + if (elem_less(crd, shape(mD_bcl))) { + for (int j = 0; j < shape<1>(tD_recast); ++j) { + auto tD_slice = make_tensor(make_shape(Int{})); + auto tC_slice = make_tensor(make_shape(Int{})); + auto tD_slice_recast = recast(tD_slice); + auto tC_slice_recast = recast(tC_slice); + + tD_slice_recast(_0{}) = tD_recast(i,j); + for (int k = 0; k < NumPacked; ++ k) { + last_element += static_cast(tD_slice(k)); + tC_slice(k) = static_cast(last_element); + } + tC_recast(i,j) = tC_slice_recast(_0{}); + } + } + } + } + +private: + +}; + +} // End namespace cutlass diff --git a/examples/112_blackwell_ssd/112_blackwell_ssd.cu b/examples/112_blackwell_ssd/112_blackwell_ssd.cu new file mode 100644 index 00000000..ba2b1cbb --- /dev/null +++ b/examples/112_blackwell_ssd/112_blackwell_ssd.cu @@ -0,0 +1,850 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#include +#include "cutlass/util/command_line.h" + +#include "cutlass/cutlass.h" + +#include "cute/tensor.hpp" +#include "cute/layout.hpp" +#include "cutlass/kernel_hardware_info.hpp" + +#include "thrust/universal_vector.h" +#include "cutlass/util/distribution.h" +#include "cutlass/util/host_tensor.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/util/reference/host/tensor_fill.h" +#include "cutlass/util/reference/host/tensor_copy.h" +#include "cutlass/util/reference/host/tensor_compare.h" +#include "cutlass/util/reference/device/tensor_fill.h" +#include "cutlass/util/reference/device/tensor_compare.h" + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +#include "reference/reference_ssd_cumsum.hpp" +#include "reference/reference_ssd.hpp" + +#include "cutlass/transform/device/transform_universal_adapter.hpp" + +#include "device/ssd.hpp" +#include "kernel/sm100_ssd_kernel_builder.hpp" + +using namespace cute; + +// Command line options parsing +struct Options { + + using Element = cutlass::bfloat16_t; + using ElementAcc = float; + using ElementDA = float; + static constexpr bool D_HAS_HDIM = true; + static constexpr bool HAS_D = true; + // Blackwell SSD doesn't support Z now(huge perf drop). + static constexpr bool HAS_Z = false; + + bool help; + bool error; + + // All static number now + int G = 2; + int B = 3; + int E = 2; + int H = 2; + // Reference kernel doesn't support dynamic C now. + static constexpr auto C = Int<8>{}; + static constexpr auto D = Int<64>{}; + static constexpr auto L = Int<128>{}; + static constexpr auto N = Int<128>{}; + int EH = E * H; + + int iterations; + bool verify; + bool verbose; + + int warmups; + bool measure; + + Options(): + help(false), + error(false), + iterations(1), verify(true), + measure(false), warmups(3) + {} + + // Parses the command line + void parse(int argc, char const **args) { + cutlass::CommandLine cmd(argc, args); + + Options defaults; + + if (cmd.check_cmd_line_flag("help")) { + help = true; + return; + } + + cmd.get_cmd_line_argument("iterations", iterations, defaults.iterations); + cmd.get_cmd_line_argument("G", G, defaults.G); + cmd.get_cmd_line_argument("B", B, defaults.B); + cmd.get_cmd_line_argument("E", E, defaults.E); + cmd.get_cmd_line_argument("H", H, defaults.H); + verbose = cmd.check_cmd_line_flag("verbose"); + verify = !(cmd.check_cmd_line_flag("without_verify")); + + EH = E*H; + + if (iterations > 1) { + measure = true; + verbose = true; + } + + auto problem_shape = cute::make_tuple(G, B, EH, C, L, D, N); + cute::print("problem_shape : "); cute::print(problem_shape); cute::print("\n"); + } + + /// Prints the usage statement. + std::ostream & print_usage(std::ostream &out) const { + + out << "112_blackwell_ssd\n\n" + << "Options:\n\n" + << " --help If specified, displays this usage statement\n\n" + << " --iterations= Benchmarking iterations.\n" + << " --without_verify Don't verify the results.\n" + << " --verbose Print execution time per kernel\n" + << " --G= Group\n" + << " --B= Batch\n" + << " --E= Expanded factor\n" + << " --H= Number of heads\n" + << "\n"; + + return out; + } + + + auto get_problem_shape() const { + return cute::make_tuple(G, B, EH, C, L, D, N); + } + + // acceptable layout by cuDNN + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + + auto layoutX() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutDelta() const { + auto layout = make_layout(make_shape(L, C, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutDeltaA() const { + auto layout = make_layout(make_shape(L, C, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutB() const { + auto layout = make_layout(make_shape(L, C, N, G, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutC() const { + auto layout = make_layout(make_shape(L, C, N, G, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutY() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutF() const { + auto layout = make_layout(make_shape(N, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + auto layoutD() const { + if constexpr (D_HAS_HDIM) { + auto layout = make_layout(make_shape(D, EH)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + else { + auto layout = make_layout(make_shape(Int<1>{}, EH)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + } + + auto layoutZ() const { + auto layout = make_layout(make_shape(L, C, D, EH, B)); + return make_layout(reverse(layout.shape()), reverse(layout.stride())); + } + + // transformed layout for kernel parameters + + auto layoutX_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(D,L,int32_t(C),EH*B), + make_stride( + stride<2>(layout), + stride<0>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutB_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),N,G*B)); + return make_layout( + make_shape(L,N,int32_t(C),G*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutC_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),N,G*B)); + return make_layout( + make_shape(L,N,int32_t(C),G*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutDelta_transformed() const { + return make_layout(make_shape(L,int32_t(C),EH*B)); + } + + auto layoutY_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(L,D,int32_t(C),EH*B), // (M,K,L,...) + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + + auto layoutF_transformed() const { + auto layout = make_layout(make_shape(N,D,EH*B)); + return make_layout( + make_shape(D,N,EH*B), + make_stride( + stride<1>(layout), + stride<0>(layout), + stride<2>(layout) + ) + ); + } + + auto layoutD_transformed() const { + if constexpr (D_HAS_HDIM) { + return make_layout(make_shape(D, EH)); + } + else { + return make_layout(make_shape(Int<1>{}, EH)); + } + } + + auto layoutZ_transformed() const { + auto layout = make_layout(make_shape(L,int32_t(C),D,EH*B)); + return make_layout( + make_shape(L,D,int32_t(C),EH*B), + make_stride( + stride<0>(layout), + stride<2>(layout), + stride<1>(layout), + stride<3>(layout) + ) + ); + } + +}; + +template +static void +initialize_values( + thrust::universal_vector& dst_ptr, + cutlass::Distribution::Kind dist_kind, + uint64_t seed, + Element var = Element(1.f)) { + if (cutlass::Distribution::Uniform == dist_kind) { + int scope = 2; + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, scope, -scope, 0); + } + else if (cutlass::Distribution::AllZeros == dist_kind) { + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, 0, 0, 0); + } + else if (cutlass::Distribution::AllOnes == dist_kind) { + cutlass::reference::host::BlockFillRandomUniform( + dst_ptr.data().get(), dst_ptr.size(), seed, 1, 1, 0); + } + else if (cutlass::Distribution::Gaussian == dist_kind) { + cutlass::reference::device::BlockFillRandomGaussian( + dst_ptr.data().get(), dst_ptr.size(), seed, (Element) 0, var); + } + else if (cutlass::Distribution::Sequential == dist_kind) { + cutlass::reference::host::BlockFillSequential(dst_ptr.data().get(), dst_ptr.size()); + } + else { + std::cerr << "Invalid distribution kind!\n."; + exit(1); + } +} + +template < + class Options_ +> +struct TestBed { + using Option = Options_; + using Element = typename Option::Element; + using ElementDA = typename Option::ElementDA; + using ElementAcc = typename Option::ElementAcc; + + thrust::universal_vector tensor_X; + thrust::universal_vector tensor_DeltaA; + thrust::universal_vector tensor_DeltaA_cumsum; + thrust::universal_vector tensor_Delta; + thrust::universal_vector tensor_B; + thrust::universal_vector tensor_C; + thrust::universal_vector tensor_D; + thrust::universal_vector tensor_Y; + thrust::universal_vector tensor_Z; + thrust::universal_vector tensor_Y_ref_0; + thrust::universal_vector tensor_Y_ref_1; + thrust::universal_vector tensor_F; + thrust::universal_vector tensor_F_ref_0; + thrust::universal_vector tensor_F_ref_1; + + cutlass::Distribution::Kind init_X = cutlass::Distribution::Uniform; + cutlass::Distribution::Kind init_DeltaA = cutlass::Distribution::Gaussian; + cutlass::Distribution::Kind init_Delta = cutlass::Distribution::Gaussian; + cutlass::Distribution::Kind init_B = cutlass::Distribution::Uniform; + cutlass::Distribution::Kind init_C = cutlass::Distribution::Uniform; + + using TileShape = decltype(make_shape(Options::L, Options::D, Options::N)); // (L, D, N) + using SsdOperation = cutlass::ssd::device::SSD< + typename cutlass::ssd::kernel::Sm100SsdBuilder< + Element, ElementDA, ElementAcc, Element, + TileShape, + Option::HAS_D, Option::D_HAS_HDIM + >::Kernel>; + using CumsumKenrel = cutlass::ssd::kernel::CumsumKernel; + using CumsumOperation = cutlass::transform::device::TransformUniversalAdapter; + + bool initialize(Options const& options, const cutlass::KernelHardwareInfo& hw_info, uint64_t seed = 2024) { + auto [g, b, eh, c, l, d, n] = options.get_problem_shape(); + assert(g == 1 && "Only group size == 1 is supported") ; + + auto size_X = b * eh * c * l * d; + auto size_DeltaA = b * eh * c * l; + auto size_Delta = b * eh * c * l; + auto size_B = g * b * c * n * l; + auto size_C = g * b * c * n * l; + auto size_Y = b * eh * c * l * d; + auto size_F = b * eh * d * n; + + tensor_X .resize(sizeof(Element) * size(options.layoutX())); + tensor_DeltaA .resize(sizeof(Element) * size(options.layoutDeltaA())); + tensor_Delta .resize(sizeof(Element) * size(options.layoutDelta())); + tensor_B .resize(sizeof(Element) * size(options.layoutB())); + tensor_C .resize(sizeof(Element) * size(options.layoutC())); + tensor_D .resize(sizeof(Element) * size(options.layoutD())); + tensor_Z .resize(sizeof(Element) * size(options.layoutZ())); + tensor_Y .resize(sizeof(Element) * size(options.layoutY())); + tensor_Y_ref_0.resize(sizeof(Element) * size(options.layoutY())); + tensor_Y_ref_1.resize(sizeof(Element) * size(options.layoutY())); + tensor_F .resize(sizeof(Element) * size(options.layoutF())); + tensor_F_ref_0.resize(sizeof(Element) * size(options.layoutF())); + tensor_F_ref_1.resize(sizeof(Element) * size(options.layoutF())); + + tensor_DeltaA_cumsum.resize(sizeof(ElementDA) * size(options.layoutDeltaA())); + + // Limit distribution to reduce skew between hosts and devices + initialize_values(tensor_X, init_X, seed); + initialize_values(tensor_DeltaA, init_DeltaA, seed + 1, Element(0.05f)); + initialize_values(tensor_Delta, init_Delta, seed + 3, Element(0.05f)); + initialize_values(tensor_B, init_B, seed + 5); + initialize_values(tensor_C, init_C, seed + 7); + initialize_values(tensor_D, init_C, seed + 9); + initialize_values(tensor_Z, init_X, seed); + + cudaError_t result; + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the Initialization kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + } + + // apply cumsum(device) before kernel launch + typename CumsumOperation::Arguments arguments{ + make_shape(int(b), int(eh), int(c), int(l)), + { + tensor_DeltaA.data().get(), + tensor_DeltaA_cumsum.data().get(), + }, + hw_info + }; + + CumsumOperation op; + + size_t workspace_size = CumsumOperation::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = op.can_implement(arguments); + if (status != cutlass::Status::kSuccess) { + std::cerr << "This kernel is not supported. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + status = op.initialize(arguments, workspace.get()); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to initialize the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + // may be used uninitialized + cudaEvent_t start; + cudaEvent_t end; + cudaEventCreate(&start); + cudaEventCreate(&end); + + // warm up + if (options.measure) { + for (int i = 0; i < options.warmups; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + } + result = cudaEventRecord(start); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + // Run + for (int i = 0; i < options.iterations; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + result = cudaEventRecord(end); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + return false; + } + + float runtime_ms = 0; + result = cudaEventElapsedTime(&runtime_ms, start, end); + if (result != cudaSuccess) { + std::cerr << "cudaEventElapsed() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + runtime_ms /= static_cast(options.iterations); + + if (options.verbose) { + printf("[iters = %d, warmups = %d] cumsum kernel runtime_ms = %.4f\n", options.iterations, options.warmups, runtime_ms); + } + + return true; + } + + bool sufficient() const { + int device_idx; + cudaError_t result = cudaGetDevice(&device_idx); + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDevice() API call failed."); + } + + int max_smem_size; + result = cudaDeviceGetAttribute(&max_smem_size, cudaDevAttrMaxSharedMemoryPerBlockOptin, device_idx); + if (result != cudaSuccess) { + throw std::runtime_error("cudaDeviceGetAttribute() failed"); + } + + return true; + } + + bool run(Options const& options, const cutlass::KernelHardwareInfo& hw_info) { + if (!sufficient()) { + std::cerr << "Test waived due to insufficient CUDA device.\n"; + return true; + } + + if (!initialize(options, hw_info)) { + std::cerr << "Failed to initialize the test.\n"; + return true; + }; + + auto [g, b, eh, c, l, d, n] = options.get_problem_shape(); + typename SsdOperation::Arguments arguments{ + make_shape(int(g), int(b), int(eh), int(c), int(l), int(d), int(n)), + { + tensor_X.data().get(), + tensor_DeltaA_cumsum.data().get(), + tensor_Delta.data().get(), + tensor_B.data().get(), + tensor_C.data().get(), + options.layoutX_transformed(), + options.layoutB_transformed(), + options.layoutC_transformed(), + options.layoutDelta_transformed() + }, + { + tensor_Y.data().get(), + tensor_F.data().get(), + tensor_D.data().get(), + // tensor_Z.data().get(), + options.layoutY_transformed(), + options.layoutF_transformed(), + options.layoutD_transformed(), + // options.layoutZ_transformed() + }, + hw_info + }; + + SsdOperation op; + + size_t workspace_size = SsdOperation::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = op.can_implement(arguments); + if (status != cutlass::Status::kSuccess) { + std::cerr << "This kernel is not supported. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + status = op.initialize(arguments, workspace.get()); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to initialize the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + + cudaError_t result; + // may be used uninitialized + cudaEvent_t start; + cudaEvent_t end; + cudaEventCreate(&start); + cudaEventCreate(&end); + + // warm up + if (options.measure) { + for (int i = 0; i < options.warmups; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + } + result = cudaEventRecord(start); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + // Run + for (int i = 0; i < options.iterations; i++) { + status = op.run(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "Failed to launch the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(cudaGetLastError()) << std::endl; + return false; + } + } + result = cudaEventRecord(end); + if (result != cudaSuccess) { + std::cerr << "cudaEventRecord() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + std::cerr << "Error running the CUTLASS kernel. Last CUDA error is: " + << cudaGetErrorString(result) << std::endl; + return false; + } + + float runtime_ms = 0; + result = cudaEventElapsedTime(&runtime_ms, start, end); + if (result != cudaSuccess) { + std::cerr << "cudaEventElapsed() failed: " << cudaGetErrorString(result) << std::endl; + return false; + } + runtime_ms /= static_cast(options.iterations); + + if (options.verbose) { + printf("[iters = %d, warmups = %d] ssd kernel runtime_ms = %.4f\n", options.iterations, options.warmups, runtime_ms); + printf("smem size = %d\n", SsdOperation::Kernel::SharedStorageSize); + } + // Matrix + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + auto mY_ref_0 = cute::make_tensor(tensor_Y_ref_0.data().get(), options.layoutY()); + auto mY_ref_1 = cute::make_tensor(tensor_Y_ref_1.data().get(), options.layoutY()); + auto mY_res = cute::make_tensor(tensor_Y.data().get(), options.layoutY()); + auto mF_ref_0 = cute::make_tensor(tensor_F_ref_0.data().get(), options.layoutF()); + auto mF_ref_1 = cute::make_tensor(tensor_F_ref_1.data().get(), options.layoutF()); + auto mF_res = cute::make_tensor(tensor_F.data().get(), options.layoutF()); + auto mX = cute::make_tensor(tensor_X.data().get(), options.layoutX()); + auto mB = cute::make_tensor(tensor_B.data().get(), options.layoutB()); + auto mC = cute::make_tensor(tensor_C.data().get(), options.layoutC()); + auto mD = cute::make_tensor(tensor_D.data().get(), options.layoutD()); + auto mZ = cute::make_tensor(tensor_Z.data().get(), options.layoutZ()); + auto mDelta = cute::make_tensor(tensor_Delta.data().get(), options.layoutDelta()); + auto mDeltaA = cute::make_tensor(tensor_DeltaA.data().get(), options.layoutDeltaA()); + + // Reference Device kernel + if (options.verify) { + ssd_reference( + mY_ref_1, + mF_ref_1, + mX, + mDelta, + mDeltaA, + mB, + mC, + mD, + mZ, + options + ); + } + + bool passed = true; + + if (options.verify) { + printf("[TensorY]verifying...\n"); + passed &= compare_reference<5>(mY_ref_1, mY_res); + printf("[TensorF]verifying...\n"); + passed &= compare_reference<4>(mF_ref_1, mF_res); + } + + return passed; + } + + template< + int TensorDim, + class Engine, class Layout + > + static constexpr bool + compare_reference( + cute::Tensor const& reference, + cute::Tensor const& computed, + float epsilon = 0.05f) { + if (size(reference) != size(computed)) { + return false; + } + + bool passed = true; + if (epsilon == 0.0f) { + // fast refcheck w/o epsilon + for (size_t i = 0; i < size_t(size(reference)); ++i) { + if (reference(i) != computed(i)) { + passed = false; + printf("[%llu] %f, %f\n", static_cast(i), + float(reference(i)), float(computed(i))); + break; + } + } + } + else { + // refcheck with epsilon + for (size_t i = 0; i < size_t(size(reference)); ++i) { + auto ref = static_cast(reference(i)); + auto act = static_cast(computed(i)); + auto abs_error = std::abs(act - ref); + auto rel_error = abs_error / (std::max(std::abs(act), std::abs(ref)) + 0.00001f); + if (std::isnan(abs_error) || std::isnan(rel_error) || + std::min(rel_error, abs_error) > epsilon) { + passed = false; + printf("[%llu] %f, %f\n", static_cast(i), + float(reference(i)), float(computed(i))); + break; + } + } + } + if (not passed) { + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + auto m = cute::shape<2>(reference); + auto n = cute::shape(reference); + printf("reference:\n"); + for (int mi = 0; mi < m; ++mi) { + for (int ni = 0; ni < n; ++ni) { + if constexpr (TensorDim == 5) { + printf("%.4f ", static_cast(reference(0,0,mi,0,ni))); + } + else { + printf("%.4f ", static_cast(reference(0,0,mi,ni))); + } + } + printf("\n"); + } + printf("\n"); + printf("computed:\n"); + for (int mi = 0; mi < m; ++mi) { + for (int ni = 0; ni < n; ++ni) { + if constexpr (TensorDim == 5) { + printf("%.4f ", static_cast(computed(0,0,mi,0,ni))); + } + else { + printf("%.4f ", static_cast(computed(0,0,mi,ni))); + } + } + printf("\n"); + } + printf("\n"); + } + return passed; + } +}; + +#endif // defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +int main(int argc, char const **args) { + + cudaDeviceProp props; + + cudaError_t error = cudaGetDeviceProperties(&props, 0); + if (error != cudaSuccess) { + std::cerr << "cudaGetDeviceProperties() returned an error: " << cudaGetErrorString(error) << std::endl; + return -1; + } + + if (__CUDACC_VER_MAJOR__ < 12 || props.major < 10) { + std::cout + << "This example requires a GPU of NVIDIA's Blackwell Architecture or " + << "later (compute capability 100 or greater) and CUDA 12.0 or greater.\n"; + return 0; + } + else if (__CUDACC_VER_MAJOR__ < 12 || (props.major != 10 || props.minor != 0)) { + std::cout + << "This example requires a GPU of NVIDIA's Blackwell Architecture " + << "(compute capability 100) and CUDA 12.0 or greater.\n"; + return 0; + } + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + + // + // Parse options + // + + Options options; + + options.parse(argc, args); + + if (options.help) { + options.print_usage(std::cout) << std::endl; + return 0; + } + + if (options.error) { + std::cerr << "Aborting execution." << std::endl; + return -1; + } + + // Execute kernel + + printf("start testing....\n"); + + // The KernelHardwareInfo struct holds the number of SMs on the GPU with a given device ID. This + // information is used by the underlying kernel. + cutlass::KernelHardwareInfo hw_info; + + // Change device_id to another value if you are running on a machine with multiple GPUs and wish + // to use a GPU other than that with device ID 0. + hw_info.device_id = 0; + hw_info.sm_count = cutlass::KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + + // Check Device/Host ref kernel + TestBed testbed{}; + bool passed = testbed.run(options, hw_info); + + if (passed) { + printf("everything is ok.\n"); + } + else { + printf("something is wrong!!!!!\n"); + } + +#endif // defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + + return 0; +} diff --git a/test/utils/device_info.py b/examples/112_blackwell_ssd/CMakeLists.txt similarity index 61% rename from test/utils/device_info.py rename to examples/112_blackwell_ssd/CMakeLists.txt index 00294399..0a924e07 100644 --- a/test/utils/device_info.py +++ b/examples/112_blackwell_ssd/CMakeLists.txt @@ -1,20 +1,20 @@ # Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: BSD-3-Clause - +# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: - +# # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. - +# # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. - +# # 3. Neither the name of the copyright holder nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. - +# # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -26,34 +26,20 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +if (CUTLASS_NVCC_ARCHS MATCHES 100a) -def _get_device_compute_capability(): - try: - import cuda.bindings.driver as drv - from cuda.bindings.driver import CUdevice_attribute as dev_attr +set_property( + SOURCE 112_blackwell_ssd.cu + PROPERTY COMPILE_FLAGS "--use_fast_math" + ) - def drv_api(api_name, *args): - ret_code, *result = getattr(drv, api_name)(*args) - if ret_code: - raise ValueError(f"CUDA error: {ret_code}") - return result[0] if len(result) == 1 else result +cutlass_example_add_executable( + 112_blackwell_ssd + 112_blackwell_ssd.cu + ) - drv_api("cuInit", 0) - device = drv_api("cuDeviceGet", 0) - major = drv_api( - "cuDeviceGetAttribute", - dev_attr.CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, - device, - ) - minor = drv_api( - "cuDeviceGetAttribute", - dev_attr.CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, - device, - ) - return f"{major}{minor}" - except Exception as e: - print(f"Failed to get CUDA compute capability: {e}") - return None +if(NOT WIN32 AND (NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))) +endif() -compute_capability = _get_device_compute_capability() +endif() diff --git a/examples/112_blackwell_ssd/README.md b/examples/112_blackwell_ssd/README.md new file mode 100644 index 00000000..0768503a --- /dev/null +++ b/examples/112_blackwell_ssd/README.md @@ -0,0 +1,65 @@ +# NVIDIA Blackwell SSD (State Space Decomposition) CUDA Example + +## Overview + +This example demonstrates the implementation of State Space Decomposition (SSD) operations on NVIDIA's Blackwell GPU architecture. It showcases the use of CUTLASS library components for high-performance tensor computations that efficiently leverage Blackwell's advanced hardware capabilities. + +## System Requirements ++ NVIDIA GPU with Blackwell Architecture (compute capability 10.0) ++ CUDA Toolkit 12.8 or newer ++ C++17 compatible compiler + +## Build the example +Follow the cutlass example building. + +## Command Line Options +The example supports the following command line options: +--help: Display the usage statement +--iterations=: Number of iterations for benchmarking (default: 1) +--without_verify: Skip result verification +--verbose: Print execution time per kernel +--G=: Group size (default: 2) +--B=: Batch size (default: 3) +--E=: Expanded factor (default: 2) +--H=: Number of heads (default: 2) + +## Limitation ++ Only support LxDxN = 128x64x128 ++ Require all TMEM at once and no more cta on the same SM + +## Performance ++ Limited by the SEGSUM part. ++ Low MMA utils ++ ALU bound. + +# Copyright + +Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +``` + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` diff --git a/examples/112_blackwell_ssd/collective/sm100_ssd_epilogue.hpp b/examples/112_blackwell_ssd/collective/sm100_ssd_epilogue.hpp new file mode 100644 index 00000000..9bad8faa --- /dev/null +++ b/examples/112_blackwell_ssd/collective/sm100_ssd_epilogue.hpp @@ -0,0 +1,535 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/collective/collective_builder.hpp" + +namespace cutlass::ssd::collective { +using namespace cute; + +template< + class ElementAcc_, + class Element_, + class ElementDA_, + class TileShape_, + class EpilogueTile_, + class SmemLayoutY_, + class SmemLayoutP_, + class SmemLayoutX_, + int StagesInput, + int StagesOutput, + bool HasScaleD_, + bool HasBlockScaleD_> +struct SsdEpilogue { + + using TileShape = TileShape_; + using ElementAcc = ElementAcc_; + using Element = Element_; + using ElementD = Element_; + using ElementDA = ElementDA_; + using ElementY = Element_; + using ElementP = Element_; + using EpilogueTile = EpilogueTile_; + using SmemLayoutY = SmemLayoutY_; + using SmemLayoutP = SmemLayoutP_; + using SmemLayoutX = SmemLayoutX_; + + static constexpr bool HasScaleD = HasScaleD_; + static constexpr bool HasBlockScaleD = HasBlockScaleD_; + + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + static constexpr auto L = get<0>(TileShape{}); + static constexpr auto D = get<1>(TileShape{}); + static constexpr auto N = get<2>(TileShape{}); + + constexpr static int ThreadCount = 128; + constexpr static size_t SmemAlignmentY = cutlass::detail::alignment_for_swizzle(SmemLayoutY{}); + + struct CollectiveStorage { + alignas(SmemAlignmentY) ArrayEngine> smem_y; + }; + + // TMA pipeline for storing D + using StorePipeline = cutlass::PipelineTmaStore; + using StorePipelineState = cutlass::PipelineState; + + using StorePPipeline = cutlass::PipelineTmaStore<1>; + using StorePPipelineState = cutlass::PipelineState<1>; + + using CooperatePipeline = cutlass::PipelineAsync; + using CooperatePipelineState = cutlass::PipelineState; + + using EpiloadPipelineD = cutlass::PipelineTmaAsync; + static constexpr int kEpiloadDBytes = HasBlockScaleD ? D * sizeof(ElementD) : 0; + + struct SharedStorage { + using TensorStorage = CollectiveStorage; + TensorStorage tensors; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + + using LayoutY = decltype(make_layout(make_shape(L, D, int32_t(0), int32_t(0)), + make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,D,C,B) + using LayoutP = decltype(make_layout(make_shape(D, N, int32_t(0)), make_stride(N, _1{}, D*N))); // (D,N,B) + using LayoutD_2D = decltype(make_layout(make_shape(D, int32_t(0)), make_stride(_1{}, D))); // (D,EH) + using LayoutD_1D = decltype(make_layout(make_shape(_1{}, int32_t(0)), make_stride(_0{}, _1{}))); // (D,EH) + using LayoutD = cute::conditional_t< + HasBlockScaleD, + LayoutD_2D, + LayoutD_1D + >; + + struct Arguments { + ElementY* ptr_Y{nullptr}; + ElementP* ptr_P{nullptr}; + const ElementD* ptr_D{nullptr}; + LayoutY layout_Y{}; + LayoutP layout_P{}; + LayoutD layout_D{}; + }; + + using StrideY = cute::tuple<_1, int, int, int>; // (L,D,C,B) + using StrideP = cute::tuple; // (D,N,B) + + using CopyOpS2G = SM90_TMA_STORE; + + struct Params { + using TMA_Y = decltype(make_tma_copy( + CopyOpS2G{}, + make_tensor(make_gmem_ptr(static_cast(nullptr)), + repeat_like(StrideY{}, int32_t(0)), StrideY{}), + take<0,2>(SmemLayoutY{}), + EpilogueTile{}, + _1{})); + using TMA_P = decltype(make_tma_copy( + CopyOpS2G{}, + make_tensor(make_gmem_ptr(static_cast(nullptr)), + repeat_like(StrideP{}, int32_t(0)), StrideP{}), + take<0,3>(SmemLayoutP{}), + make_shape(shape<1>(TileShape{}), shape<2>(TileShape{})), // (D,N) + _1{})); + using TensorD = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutD{})); + + TMA_Y tma_store_y; + TMA_P tma_store_p; + TensorD tensor_d; + }; + + template + static Params to_underlying_arguments(ProblemShape const& problem_size, Arguments const& args, void* workspace = nullptr) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + auto tensor_y = make_tensor(make_gmem_ptr(args.ptr_Y), args.layout_Y); + auto tensor_p = make_tensor(make_gmem_ptr(args.ptr_P), args.layout_P); + auto tensor_d = make_tensor(make_gmem_ptr(args.ptr_D), args.layout_D); + + auto tma_store_y = make_tma_copy_C_sm90( + CopyOpS2G{}, + tensor_y, + take<0,2>(SmemLayoutY{}), + EpilogueTile{}); + auto tma_store_p = make_tma_copy_C_sm90( + CopyOpS2G{}, + tensor_p, + take<0,2>(SmemLayoutP{}), + make_shape(shape<1>(TileShape{}), shape<2>(TileShape{}))); + return Params{ + tma_store_y, + tma_store_p, + tensor_d + }; + } + + template< + class Params, class ProblemShape, + class EpiloadPipeline, class PipelineState, + class TensorStorage + > + CUTLASS_DEVICE + void load_d( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + EpiloadPipeline& pipeline, PipelineState& pipeline_d_producer_state, + TensorStorage& shared_tensors) { + + if constexpr (HasBlockScaleD) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + + auto& gD = params.tensor_d; + + ElementD* ptr_d = shared_tensors.smem_d.data(); + auto smem_layout = make_layout(make_shape(get<1>(TileShape{}), Int{})); // (D,) + auto sD = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_d), smem_layout)); + + auto bulk_atom = Copy_Atom{}; + + int write_stage = pipeline_d_producer_state.index(); + + // LOCK pipeline_state for _writing_ + pipeline.producer_acquire(pipeline_d_producer_state); + + using BarrierType = typename EpiloadPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(pipeline_d_producer_state); + copy(bulk_atom.with(*tma_barrier), gD(_,blk_coord), sD(_,write_stage)); + + // Advance pipeline_state + ++pipeline_d_producer_state; + } + } + + } + + template< + class Params, class ProblemShape, + class MainloopPipelineIntra, class PipelineStateIntra, + class MainloopPipelineAcc, class PipelineStateAcc, + class MainloopPipelineDelta, class PipelineStateDelta, + class MainloopPipelineX, class PipelineStateX, + class EpiloadPipelineD, class PipelineStateD, + class FragmentC_Intra_1, class FragmentC_Intra_2, + class FragmentC_Inter_1, class FragmentC_Inter_2, + class MainloopStorage, class EpilogueStorage + > + CUTLASS_DEVICE + auto store( + int& chunk, int const& blk_coord, int const& blk_coord_eh, + Params const& params, ProblemShape const& problem_size, + MainloopPipelineIntra& pipeline_intra, PipelineStateIntra& pipeline_intra_consumer_state, + MainloopPipelineAcc& pipeline_acc, PipelineStateAcc& pipeline_acc_consumer_state, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_delta_consumer_state, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_x_consumer_state, + EpiloadPipelineD& pipeline_d, PipelineStateD& pipeline_d_producer_state, + StorePipeline& store_pipeline, StorePipelineState& store_pipe_producer_state, + cute::tuple& acc_intra, + cute::tuple& acc_inter, + MainloopStorage& mainloop_tensors, EpilogueStorage& epilogue_tensors, + bool is_first_iteration) { + + using CopyOpT2R = SM100_TMEM_LOAD_16dp256b4x; + using CopyOpR2S = SM90_U16x8_STSM_T; + using CopyOpS2R = SM75_U16x8_LDSM_T; + + // Epilogue + + int thread_idx = int(threadIdx.x % 128); + int warp_idx = thread_idx / 32; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mY_mn = params.tma_store_y.get_tma_tensor(make_shape(L,D,C,B*EH)); + Tensor gY_mn = local_tile(mY_mn, take<0,2>(TileShape{}), make_coord(_,_,_))(_,_,_0{},_0{},chunk,blk_coord); + + auto ptr_sY = epilogue_tensors.smem_y.begin(); + Tensor sY_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sY), SmemLayoutY{})); + auto ptr_sX = mainloop_tensors.smem_x.data(); + Tensor sX_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sX), SmemLayoutX{})); + + auto ts0 = size<0>(TileShape{}); + auto ts1 = size<1>(TileShape{}); + Layout col_layout = make_layout(make_shape ( ts0, ts1, Int{}), + make_stride(_1{}, _0{}, ts0)); + Tensor sDeltaA = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(mainloop_tensors.smem_delta_a.data()), col_layout)); + auto tDeltaA = sDeltaA(_,_,pipeline_delta_consumer_state.index()); + Layout row_layout = make_layout(make_shape ( ts0, ts1, Int{}), + make_stride(_0{}, _1{}, ts1)); + Tensor sD = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(mainloop_tensors.smem_d.data()), row_layout)); + auto tD = sD(_,_,pipeline_d_producer_state.index()); + + auto accumulator_intra_2 = get<1>(acc_intra); + auto accumulator_inter_2 = get<1>(acc_inter); + auto tIntra = accumulator_intra_2(make_coord(_,_),_0{},_0{},_0{}); + auto tInter = accumulator_inter_2(make_coord(_,_),_0{},_0{},_0{}); + Tensor tIntra_epi = flat_divide(tIntra, EpilogueTile{}); + Tensor tInter_epi = flat_divide(tInter, EpilogueTile{}); + Tensor tDeltaA_epi = flat_divide(tDeltaA, EpilogueTile{}); + Tensor tD_epi = flat_divide(tD, EpilogueTile{}); + Tensor gY_epi = flat_divide(gY_mn, EpilogueTile{}); + + TiledCopy tiled_t2r = make_tmem_copy(CopyOpT2R{}, tIntra_epi(_,_,_0{},_0{})); + ThrCopy thread_t2r = tiled_t2r.get_slice(thread_idx); + Tensor tTR_tIntra = thread_t2r.partition_S(tIntra_epi); + Tensor tTR_tInter = thread_t2r.partition_S(tInter_epi); + Tensor tTR_tDeltaA = thread_t2r.partition_D(tDeltaA_epi); + Tensor tTR_tD = thread_t2r.partition_D(tD_epi); + Tensor tTR_sY = thread_t2r.partition_D(sY_epi(_,_,_0{})); + Tensor tTR_rIntra = make_tensor(shape(thread_t2r.partition_D(gY_epi))); + // Tensor tTR_rInter = make_tensor(shape(thread_t2r.partition_D(gY_epi))); + + // Tensor tTR_rIntra = make_tensor(shape(tTR_sY)); + Tensor tTR_rInter = make_tensor(shape(tTR_sY)); + Tensor tTR_rY = make_tensor(shape(tTR_sY)); + Tensor tTR_rDeltaA = make_tensor(shape(tTR_sY)); + Tensor tTR_rD = make_tensor(shape(tTR_sY)); + Tensor tTR_rD_Acc = make_tensor(shape(tTR_sY)); + Tensor tTR_rX = make_tensor(shape(tTR_sY)); + Tensor tTR_rX_Acc = make_tensor(shape(tTR_sY)); + + // (t)hread-partition for (r)egister to (s)mem copy (tRS_) + TiledCopy tiled_r2s = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_sY = thread_r2s.partition_D(sY_epi); + Tensor tRS_rY = thread_r2s.retile_S(tTR_rY); + Tensor tRS_rDeltaA = thread_r2s.retile_S(tTR_rDeltaA); + Tensor tRS_rD = thread_r2s.retile_S(tTR_rD); + Tensor tRS_rCompute = make_tensor(shape(tRS_rY)); + + TiledCopy tiled_s2r = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_s2r = tiled_s2r.get_slice(thread_idx); + Tensor tSR_sX = thread_s2r.partition_S(flat_divide(sX_epi, EpilogueTile{})); + Tensor tSR_rX = thread_s2r.retile_D(tTR_rX); + + constexpr int FragmentSize = 4; + // Tensor tTR_rIntra_frg = recast>(coalesce(tTR_rIntra)); + // Tensor tTR_rInter_frg = recast>(coalesce(tTR_rInter)); + Tensor tTR_rY_frg = recast>(coalesce(tTR_rY)); + Tensor tRS_rY_frg = recast>(coalesce(tRS_rY)); + Tensor tRS_rDeltaA_frg = recast>(coalesce(tRS_rDeltaA)); + Tensor tRS_rD_frg = recast>(coalesce(tRS_rD)); + Tensor tRS_rCompute_frg = recast>(coalesce(tRS_rCompute)); + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + ThrCopy thrblk_s2g = params.tma_store_y.get_slice(Int<0>{}); + Tensor bSG_sY = thrblk_s2g.partition_S(sY_epi); + Tensor bSG_gY = thrblk_s2g.partition_D(gY_epi); + + auto synchronize = [] () { cutlass::arch::NamedBarrier::sync(ThreadCount, cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); }; + [[maybe_unused]] bool issue_smem_store = true; + [[maybe_unused]] bool issue_tma_store = warp_idx == 0; + + // The TMA store sequence for one subtile iteration + auto tma_store_fn = [&] (int epi_m, int epi_n) { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_y, bSG_sY(_,_,_,store_pipe_producer_state.index()), bSG_gY(_,_,_,epi_m,epi_n)); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + synchronize(); + }; + + // Require Acc + pipeline_intra.consumer_wait(pipeline_intra_consumer_state); + copy(tiled_t2r, tTR_tIntra, tTR_rIntra); + + cutlass::arch::fence_view_async_tmem_load(); + + pipeline_intra.consumer_release(pipeline_intra_consumer_state); + ++pipeline_intra_consumer_state; + + // Require Inter Acc + pipeline_acc.consumer_wait(pipeline_acc_consumer_state); + + CUTLASS_PRAGMA_UNROLL + for (int iter_n = 0; iter_n < size<3>(gY_epi); ++iter_n) { + CUTLASS_PRAGMA_UNROLL + for (int iter_m = 0; iter_m < size<2>(gY_epi); ++iter_m) { + int epi_m = iter_m, epi_n = iter_n; + + Tensor tTR_rIntra_mn = tTR_rIntra(_,_,_,epi_m,epi_n); + Tensor tTR_tInter_mn = tTR_tInter(_,_,_,epi_m,epi_n); + Tensor tTR_tDeltaA_mn = tTR_tDeltaA(_,_,_,epi_m,epi_n); + Tensor tTR_tD_mn = tTR_tD(_,_,_,epi_m,epi_n); + + copy(tiled_t2r, tTR_tInter_mn, tTR_rInter); + cutlass::arch::fence_view_async_tmem_load(); + + copy(tTR_tDeltaA_mn, tTR_rDeltaA); + + if constexpr (HasScaleD) { + copy(tiled_s2r, tSR_sX(_,_,_,epi_m,epi_n,pipeline_x_consumer_state.index()), tSR_rX); + type_convert(tTR_rX, tTR_rX_Acc); + } + + if constexpr (HasBlockScaleD) { + if (is_first_iteration) { + pipeline_d.consumer_wait(pipeline_d_producer_state); + } + copy(tTR_tD_mn, tTR_rD); + type_convert(tTR_rD, tTR_rD_Acc); + } + else if constexpr (HasScaleD) { + auto& gD = params.tensor_d; + auto value = static_cast(gD(_0{}, blk_coord_eh)); + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tTR_rD_Acc); ++ii) { + tTR_rD_Acc(ii) = value; + } + } + // ? + synchronize(); + + NumericArrayConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tRS_rCompute); ++ii) { + tRS_rCompute(ii) = tTR_rIntra_mn(ii) + tTR_rInter(ii) * expf(tTR_rDeltaA(ii)); + if constexpr (HasScaleD) { + tRS_rCompute(ii) += tTR_rD_Acc(ii) * tTR_rX_Acc(ii); + } + } + + CUTLASS_PRAGMA_UNROLL + for (int epi_v = 0; epi_v < size(tTR_rY_frg); ++epi_v) { + tRS_rY_frg(epi_v) = converter(tRS_rCompute_frg(epi_v)); + } + + copy(tiled_r2s, tRS_rY, tRS_sY(_,_,_,store_pipe_producer_state.index())); + + tma_store_fn(epi_m, epi_n); + } + } + + pipeline_acc.consumer_release(pipeline_acc_consumer_state); + ++pipeline_acc_consumer_state; + pipeline_x.consumer_release_from_threads(pipeline_x_consumer_state); + ++pipeline_x_consumer_state; + + pipeline_delta.consumer_release_from_threads(pipeline_delta_consumer_state); + ++pipeline_delta_consumer_state; + } + + template< + class Params, class ProblemShape, + class StorePipeline, class StorePipelineState, + class TensorStorage + > + CUTLASS_DEVICE + auto store_p( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + StorePipeline& store_pipeline, StorePipelineState& store_pipe_producer_state, + TensorStorage& shared_tensors) { + + int thread_idx = int(threadIdx.x % 128); + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mP_mn = params.tma_store_p.get_tma_tensor(make_shape(D,N,B*EH)); + Tensor gP_mn = local_tile(mP_mn, take<1,3>(TileShape{}), make_coord(_,_,blk_coord)); + auto gP_epi = gP_mn(_,_,_0{},_0{}); + + // Construct the corresponding pipelined smem tensors + auto ptr_sP = shared_tensors.smem_p.begin(); + Tensor sP_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sP), SmemLayoutP{}))(_,_,_0{}); // (EPI_TILE_M,EPI_TILE_N) + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + auto oprands = tma_partition(params.tma_store_p, Int<0>{}, Layout<_1>{}, + group_modes<0,2>(sP_epi), group_modes<0,2>(gP_epi)); // (TMA,k) and (TMA,PIPE) + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + auto bSG_gY = get<0>(oprands); + auto bSG_sY = get<1>(oprands); + +#if 0 + if (threadIdx.x % 128 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("mP_mn : ");print(mP_mn);print("\n"); + print("gP_mn : ");print(gP_mn);print("\n"); + print("sP_epi : ");print(sP_epi);print("\n"); + print("gP_epi : ");print(gP_epi);print("\n"); + print("bSG_sY : ");print(bSG_sY);print("\n"); + print("bSG_gY : ");print(bSG_gY);print("\n"); + } +#endif + + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + // Use the reserved named barrier `streamkbarrier` since this kernel doesn't support streamk + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::StreamkBarrier0); }; + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = (thread_idx / NumThreadsPerWarp) == 0; + + auto tma_store_fn = [&] () { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_p, bSG_sY, bSG_gY); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + // don't need pipeline + synchronize(); + }; + + tma_store_fn(); + } + + template< + class ElementSrc, class ElementDst, + class TensorSrc, class TensorDst + > + CUTLASS_DEVICE + auto type_convert( + TensorSrc& tS, + TensorDst& tD) { + + static constexpr int FragmentSize = 2; + NumericArrayConverter converter; + + auto tS_frg = recast>(tS); + auto tD_frg = recast>(tD); + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tS_frg); ++ii) { + tD_frg(ii) = converter(tS_frg(ii)); + } + } +}; + +} // namespace cutlass::fmha::collective diff --git a/examples/112_blackwell_ssd/collective/sm100_ssd_gemm_tma_warpspecialized.hpp b/examples/112_blackwell_ssd/collective/sm100_ssd_gemm_tma_warpspecialized.hpp new file mode 100644 index 00000000..43a11d8d --- /dev/null +++ b/examples/112_blackwell_ssd/collective/sm100_ssd_gemm_tma_warpspecialized.hpp @@ -0,0 +1,1145 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/collective/collective_builder.hpp" + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/gemm/gemm.h" + +#include "../utils/pipeline.h" + +namespace cutlass::ssd::collective { + +using namespace cute; + +template< + class Element_, + class ElementDA_, + class ElementAcc_, + class ElementD_, + class TileShape_, + int StagesInput_, + int StagesOutput_, + class TiledMmaIntra1_, + class TiledMmaIntra2_, + class TiledMmaInter1_, + class TiledMmaInter2_, + class SmemLayoutX_, + class SmemLayoutB_, + class SmemLayoutC_, + class SmemLayoutP_, + class SmemLayoutBT_, + class SmemLayoutPT_, + class SmemLayoutQ_, + class TmemLayoutB_, + class TmemLayoutQ_ +> +struct SsdMainloopTmaWarpSpecialized { + + + using Element = Element_; + using ElementDA = ElementDA_; + using ElementAcc = ElementAcc_; + static constexpr int StagesInput = StagesInput_; + static constexpr int StagesOutput = StagesOutput_; + + using TileShape = TileShape_; // (L,D,N) + + // avoid "warning #3357-D: capturing structured bindings is a C++20 feature" + static constexpr auto L = get<0>(TileShape{}); + static constexpr auto D = get<1>(TileShape{}); + static constexpr auto N = get<2>(TileShape{}); + + using TileShapeIntraBMM1 = decltype(make_shape(L, L, N)); // (L,L,N) + using TileShapeIntraBMM2 = decltype(make_shape(L, D, N)); // (L,D,L) + using TileShapeInterBMM1 = decltype(make_shape(N, D, L)); // (N,D,L) + using TileShapeInterBMM2 = decltype(make_shape(L, D, N)); // (L,D,N) + + // 16B alignment lets us use TMA + static constexpr int Alignment = 16 / sizeof(Element); + + using TiledMmaIntra1 = TiledMmaIntra1_; + using TiledMmaIntra2 = TiledMmaIntra2_; + using TiledMmaInter1 = TiledMmaInter1_; + using TiledMmaInter2 = TiledMmaInter2_; + using SmemLayoutX = SmemLayoutX_; + using SmemLayoutB = SmemLayoutB_; + using SmemLayoutC = SmemLayoutC_; + using SmemLayoutP = SmemLayoutP_; + using SmemLayoutBT = SmemLayoutBT_; + using SmemLayoutPT = SmemLayoutPT_; + using TmemLayoutB = TmemLayoutB_; + using TmemLayoutQ = TmemLayoutQ_; + using SmemLayoutQ = SmemLayoutQ_; + + using ClusterShape = Shape<_1, _1, _1>; + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout( + ClusterShape{}), + make_tile(typename TiledMmaIntra1::AtomThrID{}))); + + using AtomThrShapeMNK = Shape(typename TiledMmaIntra1::ThrLayoutVMNK{})), _1, _1>; + + using MainloopPipelineX = cutlass::PipelineTmaMultiConsumersAsync< + StagesInput, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineB = cutlass::PipelineTmaMultiConsumersAsync< + StagesInput, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineC = cutlass::PipelineTmaMultiConsumersAsync< + StagesInput, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineDelta = cutlass::PipelineTmaMultiConsumersAsync< + StagesInput, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineIntra = cutlass::PipelineUmmaAsync<1, AtomThrShapeMNK>; + using MainloopPipelineInter = cutlass::PipelineUmmaAsync<1, AtomThrShapeMNK>; + using AccumulatorPipeline = cutlass::PipelineUmmaAsync<1, AtomThrShapeMNK>; + using AccumulatorPipelineState = typename AccumulatorPipeline::PipelineState; + + static constexpr int kXLoadBytes = size(SmemLayoutX{}(_,_,_,_0{})) * sizeof(Element); + static constexpr int kBLoadBytes = size(SmemLayoutB{}(_,_,_,_0{})) * sizeof(Element); + static constexpr int kCLoadBytes = size(SmemLayoutC{}(_,_,_,_0{})) * sizeof(Element); + static constexpr int kDeltaLoadBytes = get<0>(TileShape{}) * sizeof(Element); + static constexpr int kDeltaALoadBytes = get<0>(TileShape{}) * sizeof(ElementDA); + + struct TensorStorage : cute::aligned_struct<128, _0> { + cute::array_aligned> smem_x; + cute::array_aligned> smem_b; + cute::array_aligned> smem_c; + cute::array_aligned> smem_p; + cute::array_aligned(TileShape{}) * StagesInput> smem_delta; + cute::array_aligned(TileShape{}) * StagesInput> smem_delta_a; + cute::array_aligned(TileShape{}) * StagesInput> smem_d; + }; + + // TMEM management (for LDN = 128x64x128) + static constexpr uint32_t tmem_intra_1_Acc = 0; + static constexpr uint32_t tmem_intra_2_A = tmem_intra_1_Acc + 128; + static constexpr uint32_t tmem_intra_2_Acc = tmem_intra_2_A + 64; + static constexpr uint32_t tmem_inter_1_A = tmem_intra_2_Acc + 64; + static constexpr uint32_t tmem_inter_1_Acc = tmem_inter_1_A + 64; + static constexpr uint32_t tmem_inter_2_Acc = tmem_inter_1_Acc + 64; + + using StrideX = cute::tuple; // (D,L,C,B) + using StrideB = cute::tuple<_1, int, int, int>; // (L,N,C,B) + using StrideC = cute::tuple<_1, int, int, int>; // (L,N,C,B) + using StrideDelta = cute::tuple<_1, int, int>; // (L,C,B) + + using LayoutX = decltype(make_layout(make_shape(D, L, int32_t(0), int32_t(0)), make_stride(int32_t(0), _1{}, L, int32_t(0)))); // (D,L,C,B) + using LayoutB = decltype(make_layout(make_shape(L, N, int32_t(0), int32_t(0)), make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,N,C,B) + using LayoutC = decltype(make_layout(make_shape(L, N, int32_t(0), int32_t(0)), make_stride(_1{}, int32_t(0), L, int32_t(0)))); // (L,N,C,B) + using LayoutDelta = decltype(make_layout(make_shape(L, int32_t(0), int32_t(0)), make_stride(_1{}, L, int32_t(0)))); // (L,C,B) + + // Not support Mcast + using GmemTiledCopyX = cute::SM90_TMA_LOAD; + using GmemTiledCopyB = cute::SM90_TMA_LOAD; + using GmemTiledCopyC = cute::SM90_TMA_LOAD; + + struct Arguments { + const Element* ptr_X{nullptr}; + const ElementDA* ptr_DeltaA{nullptr}; + const Element* ptr_Delta{nullptr}; + const Element* ptr_B{nullptr}; + const Element* ptr_C{nullptr}; + LayoutX layout_X{}; + LayoutB layout_B{}; + LayoutC layout_C{}; + LayoutDelta layout_Delta{}; + }; + + template + static constexpr auto + get_tma_load_x_instance(TensorX const& tensor_x, ClusterShapeVMNK const& cluster_shape_vmnk) { + return make_tma_atom_B_sm100( + GmemTiledCopyX{}, + tensor_x, + SmemLayoutX{}(_,_,_,cute::Int<0>{}), + TileShapeIntraBMM2{}, + TiledMmaIntra2{}, + cluster_shape_vmnk); + } + + template + static constexpr auto + get_tma_load_b_instance(TensorB const& tensor_b, ClusterShapeVMNK const& cluster_shape_vmnk) { + return make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShapeIntraBMM1{}, + TiledMmaIntra1{}, + cluster_shape_vmnk); + } + + template + static constexpr auto + get_tma_load_c_instance(TensorC const& tensor_c, ClusterShapeVMNK const& cluster_shape_vmnk) { + return make_tma_atom_A_sm100( + GmemTiledCopyC{}, + tensor_c, + SmemLayoutC{}(_,_,_,cute::Int<0>{}), + TileShapeIntraBMM1{}, + TiledMmaIntra1{}, + cluster_shape_vmnk); + } + + struct Params { + using TMA_X = decltype(get_tma_load_x_instance( + make_tensor( + make_gmem_ptr(recast_ptr(nullptr)), + LayoutX{}), + ClusterLayout_VMNK{})); + using TMA_B = decltype(get_tma_load_b_instance( + make_tensor( + make_gmem_ptr(recast_ptr(nullptr)), + LayoutB{}), + ClusterLayout_VMNK{})); + using TMA_C = decltype(get_tma_load_c_instance( + make_tensor( + make_gmem_ptr(recast_ptr(nullptr)), + LayoutC{}), + ClusterLayout_VMNK{})); + using TensorDelta = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutDelta{})); + using TensorDeltaA = decltype(make_tensor( + make_gmem_ptr(static_cast(nullptr)), + LayoutDelta{})); + + TMA_X tma_load_x; + TMA_B tma_load_b; + TMA_C tma_load_c; + TensorDelta tensor_delta; + TensorDeltaA tensor_delta_a; + }; + + template + static bool can_implement(ProblemShape const& problem_size, Arguments const& args) { + return true; + } + + template + static Params to_underlying_arguments(ProblemShape const& problem_size, Arguments const& args, void* workspace) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor tensor_x = make_tensor(make_gmem_ptr(args.ptr_X), args.layout_X); + Tensor tensor_b = make_tensor(make_gmem_ptr(args.ptr_B), args.layout_B); + Tensor tensor_c = make_tensor(make_gmem_ptr(args.ptr_C), args.layout_C); + Tensor tensor_delta = make_tensor(make_gmem_ptr(args.ptr_Delta), args.layout_Delta); + Tensor tensor_delta_a = make_tensor(make_gmem_ptr(args.ptr_DeltaA), args.layout_Delta); + +#if 0 + print("tensor_x : ");print(tensor_x);print("\n"); + print("smem_X : ");print(SmemLayoutX{});print("\n"); + print("tensor_b : ");print(tensor_b);print("\n"); + print("smem_b : ");print(SmemLayoutB{});print("\n"); + print("tensor_c : ");print(tensor_c);print("\n"); + print("smem_c : ");print(SmemLayoutC{});print("\n"); + print("tensor_delta : ");print(tensor_delta);print("\n"); + print("tensor_delta_a: ");print(tensor_delta_a);print("\n"); + print("tile : ");print(TileShape{});print("\n"); + print("tileIntra1 : ");print(TileShapeIntraBMM1{});print("\n"); + print("tileIntra2 : ");print(TileShapeIntraBMM2{});print("\n"); + print("tileInter1 : ");print(TileShapeInterBMM1{});print("\n"); + print("tileInter2 : ");print(TileShapeInterBMM2{});print("\n"); +#endif + + typename Params::TMA_X tma_load_x = get_tma_load_x_instance( + tensor_x, + ClusterLayout_VMNK{}); + typename Params::TMA_B tma_load_b = get_tma_load_b_instance( + tensor_b, + ClusterLayout_VMNK{}); + typename Params::TMA_C tma_load_c = get_tma_load_c_instance( + tensor_c, + ClusterLayout_VMNK{}); + + return Params{ + tma_load_x, + tma_load_b, + tma_load_c, + tensor_delta, + tensor_delta_a + }; + } + + CUTLASS_DEVICE + static void prefetch_tma_descriptors(Params const& params) { + cute::prefetch_tma_descriptor(params.tma_load_x.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_c.get_tma_descriptor()); + } + + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_x_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mX_mkl = params.tma_load_x.get_tma_tensor(make_shape(D,L,C,EH*B)); + Tensor gX_mkl = local_tile(mX_mkl, TileShapeIntraBMM2{}, make_coord(_,_,_), Step{}); // (BLK_M,BLK_K,m,k,l) + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("mX_mkl : ");print(mX_mkl);print("\n"); + print("gX_mkl : ");print(gX_mkl);print("\n"); + print("tma_desc_ : ");print(params.tma_load_x.tma_desc_);print("\n"); + } +#endif + return make_tuple(gX_mkl); + } + + template< + class Params, class ProblemShape, + class MainloopPipelineX, class PipelineStateX, + class MainloopPipelineDelta, class PipelineStateDelta, + class GTensorX, + class TensorStorage + > + CUTLASS_DEVICE + void load_x_delta( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_x_producer_state, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_delta_producer_state, + cute::tuple const& load_inputs, + TensorStorage& shared_tensors) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + + auto& gDelta = params.tensor_delta; + auto& gDeltaA = params.tensor_delta_a; + + Element* ptr_delta = shared_tensors.smem_delta.data(); + ElementDA* ptr_delta_a = shared_tensors.smem_delta_a.data(); + auto smem_layout = make_layout(make_shape(get<0>(TileShape{}), Int{})); + auto sDelta = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_delta), smem_layout)); + auto sDeltaA = cute::as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(ptr_delta_a), smem_layout)); + + auto bulk_atom_dt = Copy_Atom{}; + auto bulk_atom_dA = Copy_Atom{}; + + Tensor sX_ = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); // (BLK_M,BLK_K,PIPE) + Tensor sX = as_position_independent_swizzle_tensor(sX_); // (BLK_M,BLK_K,PIPE) + + ThrMMA cta_mma = TiledMmaIntra2{}.get_slice(blockIdx.x % size(typename TiledMmaIntra2::AtomThrID{})); + + Tensor gX_mkl = get<0>(load_inputs); + Tensor tCgX_mk = cta_mma.partition_B(gX_mkl); + + auto [tXgX_mk, tXsX] = tma_partition(params.tma_load_x, + group_modes<0,3>(sX), group_modes<0,3>(tCgX_mk)); + auto tXgX = tXgX_mk(_,_0{},_0{},_,blk_coord); + + // Disable multicast + uint16_t mcast_mask_x = 0; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage_x = pipeline_x_producer_state.index(); + int write_stage_delta = pipeline_delta_producer_state.index(); + + using BarrierTypeX = typename MainloopPipelineX::ProducerBarrierType; + BarrierTypeX* tma_barrier_x = pipeline_x.producer_get_barrier(pipeline_x_producer_state); + using BarrierTypeDelta = typename MainloopPipelineDelta::ProducerBarrierType; + BarrierTypeDelta* tma_barrier_delta = pipeline_delta.producer_get_barrier(pipeline_delta_producer_state); + + pipeline_x.producer_acquire(pipeline_x_producer_state); + + copy(params.tma_load_x.with(*tma_barrier_x, mcast_mask_x), tXgX(_,chunk_idx), tXsX(_,write_stage_x)); + + pipeline_delta.producer_acquire(pipeline_delta_producer_state); + + copy(bulk_atom_dt.with(*tma_barrier_delta), gDelta(_,chunk_idx,blk_coord), sDelta(_,write_stage_delta)); + copy(bulk_atom_dA.with(*tma_barrier_delta), gDeltaA(_,chunk_idx,blk_coord), sDeltaA(_,write_stage_delta)); + + // Advance pipeline_state + ++pipeline_x_producer_state; + ++pipeline_delta_producer_state; + } + } + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + template< + class MainloopPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_x_tail(MainloopPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(pipeline_state); + } + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_b_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mB_mkl = params.tma_load_b.get_tma_tensor(make_shape(L,N,C,G*B)); + Tensor gB_mkl = local_tile(mB_mkl, TileShapeIntraBMM1{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M,BLK_K,m,k,l) + + return make_tuple(gB_mkl); + } + + template < + class Params, class ProblemShape + > + CUTLASS_DEVICE + auto load_c_init(Params const& params, ProblemShape const& problem_size) { + + using X = Underscore; + auto [G, B, EH, C, L, D, N] = problem_size; + + Tensor mC_mkl = params.tma_load_c.get_tma_tensor(make_shape(L,N,C,G*B)); + Tensor gC_mkl = local_tile(mC_mkl, TileShapeIntraBMM1{}, make_coord(_,_,_), Step{}); // (BLK_M,BLK_K,n,k,l) + + return make_tuple(gC_mkl); + } + + template< + class Params, class ProblemShape, + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineC, class PipelineStateC, + class GTensorB, class GTensorC, + class TensorStorage + > + CUTLASS_DEVICE + void load_b_c( + int const& blk_coord, Params const& params, ProblemShape const& problem_size, + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_b_producer_state, + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_c_producer_state, + cute::tuple const& load_inputs_b, cute::tuple const& load_inputs_c, + TensorStorage& shared_tensors) { + + int lane_predicate = cute::elect_one_sync(); + + if (lane_predicate) { + Tensor sB_ = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutB{}); // (BLK_M,BLK_K,PIPE) + Tensor sB = as_position_independent_swizzle_tensor(sB_); // (BLK_M,BLK_K,PIPE) + Tensor sC_ = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); // (BLK_M,BLK_K,PIPE) + Tensor sC = as_position_independent_swizzle_tensor(sC_); // (BLK_M,BLK_K,PIPE) + + // + // Prepare the TMA loads for B&C + // + + Tensor gB_mkl = get<0>(load_inputs_b); + Tensor gC_mkl = get<0>(load_inputs_c); + + ThrMMA cta_mma = TiledMmaIntra1{}.get_slice(blockIdx.x % size(typename TiledMmaIntra1::AtomThrID{})); + + Tensor tCgC_mk = cta_mma.partition_A(gC_mkl); + Tensor tCgB_mk = cta_mma.partition_B(gB_mkl); + + auto [tCgC_, tCsC] = tma_partition(params.tma_load_c, + group_modes<0,3>(sC), group_modes<0,3>(tCgC_mk)); + auto tCgC = tCgC_(_,_0{},_0{},_,blk_coord); + + auto [tBgB_, tBsB] = tma_partition(params.tma_load_b, + group_modes<0,3>(sB), group_modes<0,3>(tCgB_mk)); + auto tBgB = tBgB_(_,_0{},_0{},_,blk_coord); + +#if 0 + if (threadIdx.x % 32 == 0 && (blockIdx.x + blockIdx.y + blockIdx.z == 0)) { + print("gC : ");print(gC);print("\n"); + print("tCgC : ");print(tCgC);print("\n"); + print("tCsC : ");print(tCsC);print("\n"); + } +#endif + // no multicast + // Disable multicast + uint16_t mcast_mask_b = 0; + uint16_t mcast_mask_c = 0; + + auto chunk = get<3>(problem_size); + // Mainloop + CUTLASS_PRAGMA_NO_UNROLL + for (int chunk_idx = 0; chunk_idx < chunk; ++chunk_idx) { + int write_stage_b = pipeline_b_producer_state.index(); + int write_stage_c = pipeline_c_producer_state.index(); + + using BarrierTypeB = typename MainloopPipelineB::ProducerBarrierType; + BarrierTypeB* tma_barrier_b = pipeline_b.producer_get_barrier(pipeline_b_producer_state); + using BarrierTypeC = typename MainloopPipelineC::ProducerBarrierType; + BarrierTypeC* tma_barrier_c = pipeline_c.producer_get_barrier(pipeline_c_producer_state); + + pipeline_b.producer_acquire(pipeline_b_producer_state); + + copy(params.tma_load_b.with(*tma_barrier_b, mcast_mask_b), tBgB(_,chunk_idx), tBsB(_,write_stage_b)); + + pipeline_c.producer_acquire(pipeline_c_producer_state); + + copy(params.tma_load_c.with(*tma_barrier_c, mcast_mask_c), tCgC(_,chunk_idx), tCsC(_,write_stage_c)); + + // Advance pipeline_state + ++pipeline_b_producer_state; + ++pipeline_c_producer_state; + } + } + } + + /// Perform a Producer Epilogue to prevent early exit of blocks in a Cluster + template< + class MainloopPipeline, class PipelineState + > + CUTLASS_DEVICE void + load_b_c_tail(MainloopPipeline pipeline, PipelineState pipeline_state) { + int lane_predicate = cute::elect_one_sync(); + + // Issue the epilogue waits + if (lane_predicate) { + /* This helps avoid early exit of blocks in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + pipeline.producer_tail(pipeline_state); + } + } + + template< + class TiledMma, + class FragmentA, class FragmentB, + class FrgEngine, class FrgLayout + > + CUTLASS_DEVICE + auto mma( + int read_A_stage, int read_B_stage, + cute::tuple const& mma_inputs, + cute::Tensor& accumulators) { + auto [tiled_mma, tCrA, tCrB] = mma_inputs; + tiled_mma.accumulate_ = UMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tCrA); ++k_block) { + // (V,M,K) x (V,N,K) => (V,M,N) + cute::gemm(tiled_mma, tCrA(_,_,k_block,read_A_stage), tCrB(_,_,k_block,read_B_stage), accumulators); + tiled_mma.accumulate_ = UMMA::ScaleOut::One; + } + } + + CUTLASS_DEVICE auto + get_mma_intra_acc(){ + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + auto acc_shape_1 = partition_shape_C(TiledMmaIntra1{}, take<0,2>(TileShapeIntraBMM1{})); + auto accumulator_1 = TiledMmaIntra1::make_fragment_C(append(acc_shape_1, + Int<1>{})); + accumulator_1.data() = tmem_base_ptr + tmem_intra_1_Acc; + + auto acc_shape_2 = partition_shape_C(TiledMmaIntra2{}, take<0,2>(TileShapeIntraBMM2{})); + auto accumulator_2 = TiledMmaIntra2::make_fragment_C(append(acc_shape_2, + Int<1>{})); + accumulator_2.data() = tmem_base_ptr + tmem_intra_2_Acc; + return cute::make_tuple(accumulator_1, accumulator_2); + } + + CUTLASS_DEVICE auto + mma_intra_init(TensorStorage& shared_tensors) { + // Init Intra1 + TiledMmaIntra1 tiled_mma_1; + + Tensor sB = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutB{}); + Tensor sC = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); + + Tensor tCrC = tiled_mma_1.make_fragment_A(sC); + Tensor tCrB = tiled_mma_1.make_fragment_B(sB); + + // Init Intra2 + TiledMmaIntra2 tiled_mma_2; + + Tensor sX = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); + Tensor tCrQ = tiled_mma_2.make_fragment_A(shape(TmemLayoutQ{})); + Tensor tCrX = tiled_mma_2.make_fragment_B(sX); + + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + tCrQ.data() = tmem_base_ptr + tmem_intra_2_A; +#if 0 + if (threadIdx.x % 32 == 0) { + print("sB : ");print(sB);print("\n"); + print("sC : ");print(sC);print("\n"); + print("sX : ");print(sX);print("\n"); + print("tCrC : ");print(tCrC);print("\n"); + print("tCrB : ");print(tCrB);print("\n"); + print("tCrQ : ");print(tCrQ);print("\n"); + print("tCrX : ");print(tCrX);print("\n"); + } +#endif + return cute::make_tuple( + cute::make_tuple(tiled_mma_1, tCrC, tCrB), // mma intra 1 + cute::make_tuple(tiled_mma_2, tCrQ, tCrX) // mma intra 2 + ); + } + + template< + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineC, class PipelineStateC, + class MainloopPipelineX, class PipelineStateX, + class MainloopPipelineIntra, class PipelineStateIntra, + class TiledMma_1, class FragmentA_1, class FragmentB_1, + class TiledMma_2, class FragmentA_2, class FragmentB_2, + class FragmentC_1, class FragmentC_2 + > + CUTLASS_DEVICE + auto mma_intra( + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_b_consumer_state, + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_c_consumer_state, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_x_consumer_state, + MainloopPipelineIntra& pipeline_intra, PipelineStateIntra& pipeline_intra_producer_state, + cute::tuple const& mma_inputs_1, + cute::tuple const& mma_inputs_2, + cute::tuple& acc_intra) { + + auto [acc_intra_1, acc_intra_2] = acc_intra; + // require B&C + auto pipeline_b_token = pipeline_b.consumer_try_wait(pipeline_b_consumer_state); + auto pipeline_c_token = pipeline_c.consumer_try_wait(pipeline_c_consumer_state); + auto pipeline_x_token = pipeline_x.consumer_try_wait(pipeline_x_consumer_state); + pipeline_b.consumer_wait(pipeline_b_consumer_state, pipeline_b_token); + pipeline_c.consumer_wait(pipeline_c_consumer_state, pipeline_c_token); + pipeline_x.consumer_wait(pipeline_x_consumer_state, pipeline_x_token); + // do we need try wait? + pipeline_intra.producer_acquire(pipeline_intra_producer_state); + { + auto read_A_stage = pipeline_c_consumer_state.index(); + auto read_B_stage = pipeline_b_consumer_state.index(); + auto accumulator = acc_intra_1(_,_,_,_0{}); + mma(read_A_stage, read_B_stage, mma_inputs_1, accumulator); + } + // release B&C + pipeline_b.consumer_release_from_umma(pipeline_b_consumer_state); + pipeline_c.consumer_release_from_umma(pipeline_c_consumer_state); + pipeline_intra.producer_commit(pipeline_intra_producer_state); + ++pipeline_b_consumer_state; + ++pipeline_c_consumer_state; + ++pipeline_intra_producer_state; + // MMA Intra2 + pipeline_intra.producer_acquire(pipeline_intra_producer_state); + { + auto read_B_stage = pipeline_x_consumer_state.index(); + auto accumulator = acc_intra_2(_,_,_,_0{}); + mma(_0{}, read_B_stage, mma_inputs_2, accumulator); + } + pipeline_intra.producer_commit(pipeline_intra_producer_state); + pipeline_x.consumer_release_from_umma(pipeline_x_consumer_state); + ++pipeline_x_consumer_state; + ++pipeline_intra_producer_state; + } + + CUTLASS_DEVICE auto + get_mma_inter_acc(){ + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + auto acc_shape_1 = partition_shape_C(TiledMmaInter1{}, take<0,2>(TileShapeInterBMM1{})); + auto accumulator_1 = TiledMmaInter1::make_fragment_C(append(acc_shape_1, + Int<1>{})); + accumulator_1.data() = tmem_base_ptr + tmem_inter_1_Acc; + + auto acc_shape_2 = partition_shape_C(TiledMmaInter2{}, take<0,2>(TileShapeInterBMM2{})); + auto accumulator_2 = TiledMmaInter2::make_fragment_C(append(acc_shape_2, + Int<1>{})); + accumulator_2.data() = tmem_base_ptr + tmem_inter_2_Acc; + return cute::make_tuple(accumulator_1, accumulator_2); + } + + CUTLASS_DEVICE auto + mma_inter_init(TensorStorage& shared_tensors) { + // Init Inter1 + TiledMmaInter1 tiled_mma_1; + + Tensor sX = make_tensor(make_smem_ptr(shared_tensors.smem_x.data()), SmemLayoutX{}); + + Tensor tCrB = tiled_mma_1.make_fragment_A(shape(TmemLayoutB{})); + Tensor tCrX = tiled_mma_1.make_fragment_B(sX); + + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + tCrB.data() = tmem_base_ptr + tmem_inter_1_A; + + // Init Inter2 + TiledMmaInter2 tiled_mma_2; + + Tensor sC = make_tensor(make_smem_ptr(shared_tensors.smem_c.data()), SmemLayoutC{}); + Tensor sP = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutP{}); + + Tensor tCrC = tiled_mma_2.make_fragment_A(sC); + Tensor tCrP = tiled_mma_2.make_fragment_B(sP); + + return cute::make_tuple( + cute::make_tuple(tiled_mma_1, tCrB, tCrX), // mma intra 1 + cute::make_tuple(tiled_mma_2, tCrC, tCrP) // mma intra 2 + ); + } + + template< + class MainloopPipelineC, class PipelineStateC, + class MainloopPipelineX, class PipelineStateX, + class MainloopPipelineInter, class PipelineStateInter, + class MainloppPipelineAcc, class PipelineStateAcc, + class TiledMma_1, class FragmentA_1, class FragmentB_1, + class TiledMma_2, class FragmentA_2, class FragmentB_2, + class FragmentC_1, class FragmentC_2 + > + CUTLASS_DEVICE + auto mma_inter( + MainloopPipelineC& pipeline_c, PipelineStateC& pipeline_c_consumer_state, + MainloopPipelineX& pipeline_x, PipelineStateX& pipeline_x_consumer_state, + MainloopPipelineInter& pipeline_inter, PipelineStateInter& pipeline_inter_producer_state, + MainloppPipelineAcc& pipeline_acc, PipelineStateAcc& pipeline_acc_producer_state, + cute::tuple const& mma_inputs_1, + cute::tuple const& mma_inputs_2, + cute::tuple& acc_inter) { + + auto [acc_inter_1, acc_inter_2] = acc_inter; + + // require C + auto pipeline_x_token = pipeline_x.consumer_try_wait(pipeline_x_consumer_state); + auto pipeline_c_token = pipeline_c.consumer_try_wait(pipeline_c_consumer_state); + + pipeline_x.consumer_wait(pipeline_x_consumer_state, pipeline_x_token); + // MMA inter 1 + pipeline_inter.producer_acquire(pipeline_inter_producer_state); + { + auto read_B_stage = pipeline_x_consumer_state.index(); + auto accumulator = acc_inter_1(_,_,_,_0{}); + mma(_0{}, read_B_stage, mma_inputs_1, accumulator); + } + // release B&C + pipeline_x.consumer_release_from_umma(pipeline_x_consumer_state); + ++pipeline_x_consumer_state; + + pipeline_c.consumer_wait(pipeline_c_consumer_state, pipeline_c_token); + // MMA inter 2 + pipeline_acc.producer_acquire(pipeline_acc_producer_state); + { + auto read_A_stage = pipeline_c_consumer_state.index(); + auto accumulator = acc_inter_2(_,_,_,_0{}); + mma(read_A_stage, _0{}, mma_inputs_2, accumulator); + } + pipeline_c.consumer_release_from_umma(pipeline_c_consumer_state); + pipeline_inter.producer_commit(pipeline_inter_producer_state); + pipeline_acc.producer_commit(pipeline_acc_producer_state); + ++pipeline_c_consumer_state; + ++pipeline_inter_producer_state; + ++pipeline_acc_producer_state; + + } + + template< + class FragmentC_1, class FragmentC_2, + class TensorStorage + > + CUTLASS_DEVICE + auto state_init( + cute::tuple& acc_inter, + TensorStorage& shared_tensors) { + + int thread_idx = threadIdx.x % cutlass::NumThreadsPerWarpGroup; + using CopyAtomT2R = SM100_TMEM_LOAD_16dp256b8x; + using CopyOpR2S = SM90_U16x8_STSM_T; + + auto synchronize = [&] () { cutlass::arch::NamedBarrier::sync(128, cutlass::arch::ReservedNamedBarriers::TransposeBarrier); }; + + // Pre inter 2 + auto accumulator = get<0>(acc_inter); + auto tIntra = make_tensor(accumulator.data(), get<0>(accumulator.layout())); + Tensor sP = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutPT{}); + auto tiled_t2r = make_tmem_copy(CopyAtomT2R{}, tIntra); + auto thr_t2r = tiled_t2r.get_slice(thread_idx); + auto tTR_sP = thr_t2r.partition_D(sP(_,_,_0{})); + auto tTR_rP_compute = make_tensor(shape(tTR_sP)); + auto tTR_rP = make_tensor(shape(tTR_sP)); + + clear(tTR_rP); + clear(tTR_rP_compute); + + auto tiled_r2s = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + auto thr_r2s = tiled_r2s.get_slice(thread_idx); + auto tRS_sP = thr_r2s.partition_D(sP(_,_,_0{})); + auto tRS_rP = thr_r2s.retile_S(tTR_rP); + + copy(tiled_r2s, tRS_rP, tRS_sP); + cutlass::arch::fence_view_async_shared(); + + synchronize(); + return make_tuple(tTR_rP_compute); + } + + template< + class MainloopPipelineB, class PipelineStateB, + class MainloopPipelineDelta, class PipelineStateDelta, + class MainloopPipelineInter, class PipelineStateInter, + class FragmentC_1, class FragmentC_2, + class TensorState, + class TensorStorage + > + CUTLASS_DEVICE + auto pre_inter( + MainloopPipelineB& pipeline_b, PipelineStateB& pipeline_b_consumer_state, + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_delta_consumer_state, + MainloopPipelineInter& pipeline_inter, PipelineStateInter& pipeline_inter_consumer_state, + cute::tuple& acc_inter, + TensorState& tState, + TensorStorage& shared_tensors) { + + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + int thread_idx = threadIdx.x % cutlass::NumThreadsPerWarpGroup; + using CopyAtomR2T = SM100_TMEM_STORE_16dp128b16x; + using CopyAtomT2R = SM100_TMEM_LOAD_16dp256b8x; + using CoptAtomS2R = SM75_U32x4_LDSM_N; + using CopyOpR2S = SM90_U16x8_STSM_T; + + // Pipeline check + auto pipeline_b_token = pipeline_b.consumer_try_wait(pipeline_b_consumer_state); + auto pipeline_delta_token = pipeline_delta.consumer_try_wait(pipeline_delta_consumer_state); + pipeline_b.consumer_wait(pipeline_b_consumer_state, pipeline_b_token); + pipeline_delta.consumer_wait(pipeline_delta_consumer_state, pipeline_delta_token); + + // Pre inter 1 + TiledMmaInter1 tiled_mma_1; + Tensor sB = make_tensor(make_smem_ptr(shared_tensors.smem_b.data()), SmemLayoutBT{}); + Tensor tBtB = tiled_mma_1.make_fragment_A(shape(TmemLayoutB{})); + tBtB.data() = tmem_base_ptr + tmem_inter_1_A; + + auto tiled_s2t = make_tmem_copy(CopyAtomR2T{}, tBtB(_,_,_,0)); + auto thr_s2t = tiled_s2t.get_slice(thread_idx); + auto tiled_s2r = make_tiled_copy_S(Copy_Atom{}, tiled_s2t); + auto thr_s2r = tiled_s2r.get_slice(thread_idx); + + auto tBsB_s2r = thr_s2r.partition_S(sB); + auto tBtB_r2t = thr_s2t.partition_D(tBtB); + auto tBrB_r2t = make_tensor(shape(thr_s2t.partition_S(sB(_,_,_,_0{})))); + auto tBrB_s2r = thr_s2r.retile_D(tBrB_r2t); + + auto ts0 = size<0>(TileShape{}); + Layout row_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_0{}, _1{}, ts0)); + + Tensor sDelta = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta.data()), row_layout)); + Tensor sDeltaA = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), row_layout)); + + auto thr_mma = tiled_mma_1.get_thread_slice(thread_idx); + auto tCsDelta = thr_mma.partition_A(sDelta); + auto tCsDeltaA = thr_mma.partition_A(sDeltaA); + + auto tBsDelta = thr_s2t.partition_S(tCsDelta(_,_,_,pipeline_delta_consumer_state.index())); + auto tBrDelta = make_tensor(shape(tBsDelta)); + auto tBsDeltaA = thr_s2t.partition_S(tCsDeltaA(_,_,_,pipeline_delta_consumer_state.index())); + auto tBrDeltaA = make_tensor(shape(tBsDeltaA)); + + Layout linear_layout = make_layout(make_shape ( ts0, Int{}), + make_stride(_1{}, ts0)); + Tensor sDeltaA_last = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), linear_layout)); + +#if 0 + if (threadIdx.x % 128 == 0) { + print("sB : ");print(sB);print("\n"); + print("sB : ");print(SmemLayoutB{});print("\n"); + print("tBtB : ");print(tBtB);print("\n"); + print("tBsB_s2r : ");print(tBsB_s2r);print("\n"); + print("tBtB_r2t : ");print(tBtB_r2t);print("\n"); + print("tBrB_r2t : ");print(tBrB_r2t);print("\n"); + print("tBrB_s2r : ");print(tBrB_s2r);print("\n"); + print("tBsDelta : ");print(tBsDelta);print("\n"); + print("tBsDeltaA : ");print(tBsDeltaA);print("\n"); + print("tBrDelta : ");print(tBrDelta);print("\n"); + print("tBrDeltaA : ");print(tBrDeltaA);print("\n"); + } +#endif + + copy(tiled_s2r, tBsB_s2r(_,_,_,_,pipeline_b_consumer_state.index()), tBrB_s2r); + + copy(tBsDelta, tBrDelta); + copy(tBsDeltaA, tBrDeltaA); + + ElementAcc last_column = ElementAcc(0.f); + last_column = sDeltaA_last(_,pipeline_delta_consumer_state.index())(int(ts0) - 1); + + cutlass::arch::fence_view_async_shared(); + + auto tCompute = make_tensor(shape(tBrB_s2r)); + auto tBrB_Compute = make_tensor(shape(tBrB_s2r)); + auto tBrDelta_Compute = make_tensor(shape(tBrDelta)); + auto tBrDeltaA_Compute = make_tensor(shape(tBrDeltaA)); + + type_convert(tBrB_s2r, tBrB_Compute); + type_convert(tBrDelta, tBrDelta_Compute); + type_convert(tBrDeltaA, tBrDeltaA_Compute); + + auto tBrDeltaA_packed = recast(tBrDeltaA_Compute); + auto tBrDelta_packed = recast(tBrDelta_Compute); + auto tBrB_packed = recast(tBrB_Compute); + auto tCompute_packed = recast(tCompute); + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tCompute_packed); ++ii) { + tBrDeltaA_Compute(2 * ii) = expf(last_column - tBrDeltaA_Compute(2 * ii)); + tBrDeltaA_Compute(2 * ii + 1) = expf(last_column - tBrDeltaA_Compute(2 * ii + 1)); + + cute::mul(tCompute_packed(ii), tBrDelta_packed(ii), tBrDeltaA_packed(ii)); + cute::mul(tCompute_packed(ii), tBrB_packed(ii), tCompute_packed(ii)); + } + + type_convert(tCompute, tBrB_r2t); + + copy(tiled_s2t, tBrB_r2t, tBtB_r2t(_,_,_,_,_0{})); + cutlass::arch::fence_view_async_tmem_store(); + + // Pipeline update + pipeline_b.consumer_release_from_threads(pipeline_b_consumer_state); + pipeline_delta.consumer_release_from_threads(pipeline_delta_consumer_state); + pipeline_inter.consumer_release(pipeline_inter_consumer_state); + ++pipeline_b_consumer_state; + ++pipeline_delta_consumer_state; + ++pipeline_inter_consumer_state; + + // Pipeline check + pipeline_inter.consumer_wait(pipeline_inter_consumer_state); + + // Pre inter 2 + auto accumulator = get<0>(acc_inter); + auto tIntra = make_tensor(accumulator.data(), get<0>(accumulator.layout())); + Tensor sP = make_tensor(make_smem_ptr(shared_tensors.smem_p.data()), SmemLayoutPT{}); + auto tiled_t2r = make_tmem_copy(CopyAtomT2R{}, tIntra); + auto thr_t2r = tiled_t2r.get_slice(thread_idx); + auto tTR_tP = thr_t2r.partition_S(tIntra); + auto tTR_sP = thr_t2r.partition_D(sP(_,_,_0{})); + auto tTR_rP_compute = make_tensor(shape(tTR_sP)); + auto tTR_rP = make_tensor(shape(tTR_sP)); + + auto tiled_r2s = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + auto thr_r2s = tiled_r2s.get_slice(thread_idx); + auto tRS_sP = thr_r2s.partition_D(sP(_,_,_0{})); + auto tRS_rP = thr_r2s.retile_S(tTR_rP); + + copy(tiled_t2r, tTR_tP, tTR_rP_compute); + cutlass::arch::fence_view_async_tmem_load(); + + for (int ii = 0; ii < size(tTR_rP_compute); ++ii) { + tTR_rP_compute(ii) = tTR_rP_compute(ii) + expf(last_column) * static_cast(tState(ii)); + } + + type_convert(tTR_rP_compute,tTR_rP); + // Update the state + copy(tTR_rP_compute, tState); + + copy(tiled_r2s, tRS_rP, tRS_sP); + // Fence for the next iteration `pipeline_inter.consumer_release` + cutlass::arch::fence_view_async_shared(); + +#if 0 + if (threadIdx.x % 128 == 0) { + print("accumulator:");print(accumulator);print("\n"); + print("sP : ");print(sP);print("\n"); + print("sP : ");print(SmemLayoutP{});print("\n"); + print("tTR_tP : ");print(tTR_tP);print("\n"); + print("tTR_sP : ");print(tTR_sP);print("\n"); + print("tTR_rP : ");print(tTR_rP);print("\n"); + print("tRS_sP : ");print(tRS_sP);print("\n"); + print("tRS_rP : ");print(tRS_rP);print("\n"); + } +#endif + + } + + template< + class MainloopPipelineDelta, class PipelineStateDelta, + class MainloopPipelineIntra, class PipelineStateIntra, + class FragmentC_1, class FragmentC_2 + > + CUTLASS_DEVICE + auto pre_intra( + MainloopPipelineDelta& pipeline_delta, PipelineStateDelta& pipeline_delta_consumer_state, + MainloopPipelineIntra& pipeline_intra, PipelineStateIntra& pipeline_intra_consumer_state, + cute::tuple& acc_intra, + TensorStorage& shared_tensors) { + + static constexpr uint32_t tmem_base_ptr = 0; // reserved all tmem columns + int thread_idx = threadIdx.x % cutlass::NumThreadsPerWarpGroup; + using CopyAtomT2R = SM100_TMEM_LOAD_16dp256b16x; + using CopyAtomR2T = SM100_TMEM_STORE_16dp128b16x; + + // require B&C + auto pipeline_delta_token = pipeline_delta.consumer_try_wait(pipeline_delta_consumer_state); + pipeline_delta.consumer_wait(pipeline_delta_consumer_state, pipeline_delta_token); + // PreIntra2 + auto pipeline_intra_token = pipeline_intra.consumer_try_wait(pipeline_intra_consumer_state); + pipeline_intra.consumer_wait(pipeline_intra_consumer_state, pipeline_intra_token); + + TiledMmaIntra2 tiled_mma_2; + + auto accumulator = get<0>(acc_intra); + Tensor tQ = tiled_mma_2.make_fragment_A(shape(TmemLayoutQ{})); + // Tensor tQ = tiled_mma_2.make_fragment_A(shape(TmemLayoutQ{})); + tQ.data() = tmem_base_ptr + tmem_intra_2_A; + + auto tIntra = make_tensor(accumulator.data(), get<0>(accumulator.layout())); + auto tiled_t2r = make_tmem_copy(CopyAtomT2R{}, tIntra); + auto thr_t2r = tiled_t2r.get_slice(thread_idx); + auto tTR_tQ = thr_t2r.partition_S(tIntra); + auto tTR_sQ = thr_t2r.partition_D(make_tensor(make_shape(get<0>(TileShape{}), get<0>(TileShape{})))); + auto tTR_rQ = make_tensor(shape(tTR_sQ)); + + auto tiled_r2t = make_tmem_copy(CopyAtomR2T{}, tQ); + auto thr_r2t = tiled_r2t.get_slice(thread_idx); + auto tRT_rQ = make_tensor(shape(thr_r2t.partition_S(tQ))); + auto tRT_tQ = thr_r2t.partition_D(tQ); + auto tCompute = make_tensor(shape(tRT_rQ)); + + auto ts0 = size<0>(TileShape{}); + Layout row_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_0{}, _1{}, ts0)); + Layout col_layout = make_layout(make_shape ( ts0, ts0, Int{}), + make_stride(_1{}, _0{}, ts0)); + Tensor coord_tensor = make_coord_tensor(make_identity_layout(make_shape(ts0, ts0))); + + Tensor sDelta = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta.data()), row_layout)); + Tensor sDeltaA_Row = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), row_layout)); + Tensor sDeltaA_Col = as_position_independent_swizzle_tensor(make_tensor(make_smem_ptr(shared_tensors.smem_delta_a.data()), col_layout)); + + auto tQsDeltaA_Row = thr_t2r.partition_D(sDeltaA_Row)(_,_,_,pipeline_delta_consumer_state.index()); + auto tQsDeltaA_Col = thr_t2r.partition_D(sDeltaA_Col)(_,_,_,pipeline_delta_consumer_state.index()); + auto tQsDelta = thr_t2r.partition_D(sDelta)(_,_,_,pipeline_delta_consumer_state.index()); + auto tCoord = thr_t2r.partition_D(coord_tensor); + + auto tQrDeltaA_Row = make_tensor(shape(tQsDeltaA_Row)); + auto tQrDeltaA_Col = make_tensor(shape(tQsDeltaA_Col)); + auto tQrDelta = make_tensor(shape(tQsDelta)); + + auto tCrDeltaA_Row = make_tensor(shape(tQsDeltaA_Row)); + auto tCrDeltaA_Col = make_tensor(shape(tQsDeltaA_Col)); + auto tCrDelta = make_tensor(shape(tQsDelta)); + +#if 0 + if (threadIdx.x % 128 == 0) { + print("SmemLayoutQ:");print(SmemLayoutQ{});print("\n"); + print("row_layout:");print(row_layout);print("\n"); + print("col_layout:");print(col_layout);print("\n"); + print("tQ : ");print(tQ);print("\n"); + print("accumulator: ");print(accumulator);print("\n"); + print("tTR_tQ : ");print(tTR_tQ);print("\n"); + print("tTR_sQ : ");print(tTR_sQ);print("\n"); + print("tTR_rQ : ");print(tTR_rQ);print("\n"); + print("tRT_rQ : ");print(tRT_rQ);print("\n"); + print("tRT_tQ : ");print(tRT_tQ);print("\n"); + } +#endif + + copy(tiled_t2r, tTR_tQ, tTR_rQ); + cutlass::arch::fence_view_async_tmem_load(); + + copy(tQsDeltaA_Row, tQrDeltaA_Row); + copy(tQsDeltaA_Col, tQrDeltaA_Col); + copy(tQsDelta , tQrDelta); + + // Data convert + type_convert(tQsDelta, tCrDelta); + type_convert(tQrDeltaA_Row, tCrDeltaA_Row); + type_convert(tQrDeltaA_Col, tCrDeltaA_Col); + + // SegSum + #pragma unroll + for (int ii = 0; ii < size(tTR_rQ); ++ii) { + ElementAcc tmp(0); + tmp = tQrDeltaA_Col(ii) - tCrDeltaA_Row(ii); + tCompute(ii) = expf(tmp) * tCrDelta(ii) * tTR_rQ(ii); + } + #pragma unroll + for (int ii = 0; ii < size(tTR_rQ); ++ii) { + auto [m,n] = tCoord(ii); + if (m < n) { + tCompute(ii) = 0; + } + } + + type_convert(tCompute, tRT_rQ); + + copy(tiled_r2t, tRT_rQ, tRT_tQ); + cutlass::arch::fence_view_async_tmem_store(); + + // release B&C + pipeline_intra.consumer_release(pipeline_intra_consumer_state); + + ++pipeline_intra_consumer_state; + } + + template< + class ElementSrc, class ElementDst, + class TensorSrc, class TensorDst + > + CUTLASS_DEVICE + auto type_convert( + TensorSrc& tS, + TensorDst& tD) { + + static constexpr int FragmentSize = 2; + NumericArrayConverter converter; + + auto tS_frg = recast>(tS); + auto tD_frg = recast>(tD); + + CUTLASS_PRAGMA_UNROLL + for (int ii = 0; ii < size(tS_frg); ++ii) { + tD_frg(ii) = converter(tS_frg(ii)); + } + } +}; + + +} // namespace cutlass::ssd::collective diff --git a/examples/112_blackwell_ssd/device/ssd.hpp b/examples/112_blackwell_ssd/device/ssd.hpp new file mode 100644 index 00000000..ec983cb5 --- /dev/null +++ b/examples/112_blackwell_ssd/device/ssd.hpp @@ -0,0 +1,272 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +// common +#include "cutlass/cutlass.h" +#include "cutlass/device_kernel.h" + +#if !defined(__CUDACC_RTC__) +#include "cutlass/cluster_launch.hpp" +#include "cutlass/trace.h" +#endif // !defined(__CUDACC_RTC__) + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::ssd::device { + +//////////////////////////////////////////////////////////////////////////////// +////////////////////////////// CUTLASS 3.x API ///////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +class SSD { +public: + using Kernel = Kernel_; + + static int const kThreadCount = Kernel::MaxThreadsPerBlock; + + /// Argument structure: User API + using Arguments = typename Kernel::Arguments; + /// Argument structure: Kernel API + using Params = typename Kernel::Params; + +private: + + /// Kernel API parameters object + Params params_; + + bool is_initialized(bool set = false) { + static bool initialized = false; + if (set) initialized = true; + return initialized; + } + +public: + + /// Access the Params structure + Params const& params() const { + return params_; + } + + /// Determines whether the GEMM can execute the given problem. + static Status + can_implement(Arguments const& args) { + if (Kernel::can_implement(args)) { + return Status::kSuccess; + } + else { + return Status::kInvalid; + } + } + + /// Gets the workspace size + static size_t + get_workspace_size(Arguments const& args) { + size_t workspace_bytes = 0; + workspace_bytes += Kernel::get_workspace_size(args); + return workspace_bytes; + } + + /// Computes the grid shape + static dim3 + get_grid_shape(Params const& params) { + return Kernel::get_grid_shape(params); + } + + /// Computes the maximum number of active blocks per multiprocessor + static int maximum_active_blocks(int /* smem_capacity */ = -1) { + CUTLASS_TRACE_HOST("Universal::maximum_active_blocks()"); + int max_active_blocks = -1; + int smem_size = Kernel::SharedStorageSize; + + // first, account for dynamic smem capacity if needed + cudaError_t result; + if (smem_size >= (48 << 10)) { + CUTLASS_TRACE_HOST(" Setting smem size to " << smem_size); + result = cudaFuncSetAttribute( + device_kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, + smem_size); + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST( + " cudaFuncSetAttribute() returned error: " + << cudaGetErrorString(result)); + return -1; + } + } + + // query occupancy after setting smem size + result = cudaOccupancyMaxActiveBlocksPerMultiprocessor( + &max_active_blocks, + device_kernel, + Kernel::MaxThreadsPerBlock, + smem_size); + + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST( + " cudaOccupancyMaxActiveBlocksPerMultiprocessor() returned error: " + << cudaGetErrorString(result)); + return -1; + } + + CUTLASS_TRACE_HOST(" max_active_blocks: " << max_active_blocks); + return max_active_blocks; + } + + /// Initializes GEMM state from arguments. + Status + initialize(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + CUTLASS_TRACE_HOST("Universal::initialize() - workspace " + << workspace << ", stream: " << (stream ? "non-null" : "null")); + + // Initialize the workspace + Status status = Kernel::initialize_workspace(args, workspace, stream); + if (status != Status::kSuccess) { + return status; + } + + // Initialize the Params structure + params_ = Kernel::to_underlying_arguments(args, workspace); + + if (is_initialized()) return Status::kSuccess; + + // account for dynamic smem capacity if needed + int smem_size = Kernel::SharedStorageSize; + if (smem_size >= (48 << 10)) { + CUTLASS_TRACE_HOST(" Setting smem size to " << smem_size); + cudaError_t result = cudaFuncSetAttribute( + device_kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, + smem_size); + if (cudaSuccess != result) { + result = cudaGetLastError(); // to clear the error bit + CUTLASS_TRACE_HOST(" cudaFuncSetAttribute() returned error: " << cudaGetErrorString(result)); + return Status::kErrorInternal; + } + } + + is_initialized(true); + + return Status::kSuccess; + } + + /// Update API is preserved in 3.0, but does not guarantee a lightweight update of params. + Status + update(Arguments const& args, void* workspace = nullptr) { + CUTLASS_TRACE_HOST("Universal()::update() - workspace: " << workspace); + + size_t workspace_bytes = get_workspace_size(args); + if (workspace_bytes > 0 && nullptr == workspace) { + return Status::kErrorWorkspaceNull; + } + + params_ = Kernel::to_underlying_arguments(args, workspace); + return Status::kSuccess; + } + + /// Primary run() entry point API that is static allowing users to create and manage their own params. + /// Supplied params struct must be construct by calling Kernel::to_underling_arguments() + static Status + run(Params& params, cudaStream_t stream = nullptr) { + CUTLASS_TRACE_HOST("Universal::run()"); + dim3 const block = Kernel::get_block_shape(); + dim3 const grid = get_grid_shape(params); + + // configure smem size and carveout + int smem_size = Kernel::SharedStorageSize; + + Status launch_result; + // Use extended launch API only for mainloops that use it + if constexpr(Kernel::ArchTag::kMinComputeCapability >= 90) { + dim3 cluster(cute::size<0>(typename Kernel::ClusterShape{}), + cute::size<1>(typename Kernel::ClusterShape{}), + cute::size<2>(typename Kernel::ClusterShape{})); + void const* kernel = (void const*) device_kernel; + void* kernel_params[] = {¶ms}; + launch_result = ClusterLauncher::launch(grid, cluster, block, smem_size, stream, kernel, kernel_params); + } + else { + launch_result = Status::kSuccess; + device_kernel<<>>(params); + } + + cudaError_t result = cudaGetLastError(); + if (cudaSuccess == result && Status::kSuccess == launch_result) { + return Status::kSuccess; + } + else { + CUTLASS_TRACE_HOST(" Kernel launch failed. Reason: " << result); + return Status::kErrorInternal; + } + } + + // + // Non-static launch overloads that first create and set the internal params struct of this kernel handle. + // + + /// Launches the kernel after first constructing Params internal state from supplied arguments. + Status + run(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + Status status = initialize(args, workspace, stream); + if (Status::kSuccess == status) { + status = run(params_, stream); + } + return status; + } + + /// Launches the kernel after first constructing Params internal state from supplied arguments. + Status + operator()(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr) { + return run(args, workspace, stream); + } + + /// Overload that allows a user to re-launch the same kernel without updating internal params struct. + Status + run(cudaStream_t stream = nullptr) { + return run(params_, stream); + } + + /// Overload that allows a user to re-launch the same kernel without updating internal params struct. + Status + operator()(cudaStream_t stream = nullptr) { + return run(params_, stream); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::device + +//////////////////////////////////////////////////////////////////////////////// diff --git a/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_builder.hpp b/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_builder.hpp new file mode 100644 index 00000000..155abd7a --- /dev/null +++ b/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_builder.hpp @@ -0,0 +1,259 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "../collective/sm100_ssd_epilogue.hpp" +#include "../collective/sm100_ssd_gemm_tma_warpspecialized.hpp" +#include "../kernel/sm100_ssd_kernel_tma_warpspecialized.hpp" +#include "../kernel/sm100_ssd_tile_scheduler.hpp" + +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/collective/collective_builder.hpp" + +namespace cutlass::ssd::kernel::detail { + +template< + class ElementA, + class ElementB, + class ElementAccumulator, + class TileShape_MNK, + class ClusterShape_MNK, + UMMA::Major UmmaMajorA, + UMMA::Major UmmaMajorB +> +constexpr auto +sm100_make_ts_tiled_mma() { + return cutlass::gemm::collective::detail::sm100_make_1sm_ts_trivial_tiled_mma< + ElementA, ElementB, ElementAccumulator, + TileShape_MNK, ClusterShape_MNK, UmmaMajorA, UmmaMajorB>(); +} + +template< + class ElementA, + class ElementB, + class ElementAccumulator, + class TileShape_MNK, + class ClusterShape_MNK, + UMMA::Major UmmaMajorA, + UMMA::Major UmmaMajorB +> +constexpr auto +sm100_make_ss_tiled_mma() { + return cutlass::gemm::collective::detail::sm100_make_1sm_trivial_tiled_mma< + ElementA, ElementB, ElementAccumulator, + TileShape_MNK, ClusterShape_MNK, UmmaMajorA, UmmaMajorB>(); +} + +} + +namespace cutlass::ssd::kernel { + +template< + class Element_, + class ElementDA_, + class ElementAcc_, + class ElementY_, + class TileShape_, + bool HAS_D_, + bool D_HAS_HDIM_ +> +struct Sm100SsdBuilder { + + using Element = Element_; + using ElementDA = ElementDA_; + using ElementAcc = ElementAcc_; + using ElementY = ElementY_; + using TileShape = TileShape_; + using ArchTag = cutlass::arch::Sm100; + + // hard-code + using ClusterShape = Shape<_1,_1,_1>; + + static constexpr int StagesInput = 2; + static constexpr int StagesOutput = 2; + + using TileShapeIntraBMM1 = decltype(make_shape(get<0>(TileShape{}), get<0>(TileShape{}), get<2>(TileShape{}))); // (L,L,N) + using TileShapeIntraBMM2 = decltype(make_shape(get<0>(TileShape{}), get<1>(TileShape{}), get<0>(TileShape{}))); // (L,D,L) + using TileShapeInterBMM1 = decltype(make_shape(get<2>(TileShape{}), get<1>(TileShape{}), get<0>(TileShape{}))); // (N,D,L) + using TileShapeInterBMM2 = decltype(make_shape(get<0>(TileShape{}), get<1>(TileShape{}), get<2>(TileShape{}))); // (L,D,N) + + // LxLxN, NT + using TiledMmaIntra1 = decltype(detail::sm100_make_ss_tiled_mma()); + // LxNxL, TN + using TiledMmaIntra2 = decltype(detail::sm100_make_ts_tiled_mma()); + // NxDxL, TN + using TiledMmaInter1 = decltype(detail::sm100_make_ts_tiled_mma()); + // LxDxN, NN + using TiledMmaInter2 = decltype(detail::sm100_make_ss_tiled_mma()); + + // ((MMA_TILE_M,MMA_TILE_K), MMA_M, MMA_K) + using MmaShapeC_MK = decltype(partition_shape_A(TiledMmaIntra1{}, make_shape(cute::size<0>(TileShapeIntraBMM1{}), + cute::size<2>(TileShapeIntraBMM1{})))); + using MmaShapeB_NK = decltype(partition_shape_B(TiledMmaIntra1{}, make_shape(cute::size<1>(TileShapeIntraBMM1{}), + cute::size<2>(TileShapeIntraBMM1{})))); + using MmaShapeQ_MK = decltype(partition_shape_A(TiledMmaIntra2{}, make_shape(cute::size<0>(TileShapeIntraBMM2{}), + cute::size<2>(TileShapeIntraBMM2{})))); + using MmaShapeX_NK = decltype(partition_shape_B(TiledMmaIntra2{}, make_shape(cute::size<1>(TileShapeIntraBMM2{}), + cute::size<2>(TileShapeIntraBMM2{})))); + + using MmaShapeB_MK = decltype(partition_shape_A(TiledMmaInter1{}, make_shape(cute::size<0>(TileShapeInterBMM1{}), + cute::size<2>(TileShapeInterBMM1{})))); + using MmaShapeP_NK = decltype(partition_shape_B(TiledMmaInter2{}, make_shape(cute::size<1>(TileShapeInterBMM2{}), + cute::size<2>(TileShapeInterBMM2{})))); + + using GmemTiledCopyX = cute::SM90_TMA_LOAD; + using GmemTiledCopyB = cute::SM90_TMA_LOAD; + using GmemTiledCopyC = cute::SM90_TMA_LOAD; + + using BlockTileX_N = decltype(cute::size<0,0>(MmaShapeX_NK{}) * cute::size<1>(MmaShapeX_NK{})); + using BlockTileX_K = decltype(cute::size<0,1>(MmaShapeX_NK{}) * cute::size<2>(MmaShapeX_NK{})); + using SmemLayoutAtomX = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileX_N, BlockTileX_K>()); + + using BlockTileB_N = decltype(cute::size<0,0>(MmaShapeB_NK{}) * cute::size<1>(MmaShapeB_NK{})); + using BlockTileB_K = decltype(cute::size<0,1>(MmaShapeB_NK{}) * cute::size<2>(MmaShapeB_NK{})); + using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::MN, Element, BlockTileB_N, BlockTileB_K>()); + + using BlockTileBT_M = decltype(cute::size<0,0>(MmaShapeB_MK{}) * cute::size<1>(MmaShapeB_MK{})); + using BlockTileBT_K = decltype(cute::size<0,1>(MmaShapeB_MK{}) * cute::size<2>(MmaShapeB_MK{})); + using SmemLayoutAtomBT = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileBT_M, BlockTileBT_K>()); + using TmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileBT_M, BlockTileBT_K>()); + + using BlockTileC_M = decltype(cute::size<0,0>(MmaShapeC_MK{}) * cute::size<1>(MmaShapeC_MK{})); + using BlockTileC_K = decltype(cute::size<0,1>(MmaShapeC_MK{}) * cute::size<2>(MmaShapeC_MK{})); + using SmemLayoutAtomC = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::MN, Element, BlockTileC_M, BlockTileC_K>()); + + using BlockTileP_N = decltype(cute::size<0,0>(MmaShapeP_NK{}) * cute::size<1>(MmaShapeP_NK{})); + using BlockTileP_K = decltype(cute::size<0,1>(MmaShapeP_NK{}) * cute::size<2>(MmaShapeP_NK{})); + using SmemLayoutAtomP = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileP_N, BlockTileP_K>()); + + using SmemLayoutAtomPT = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::MN, Element, BlockTileP_K, BlockTileP_N>()); + + using BlockTileQ_M = decltype(cute::size<0,0>(MmaShapeQ_MK{}) * cute::size<1>(MmaShapeQ_MK{})); + using BlockTileQ_K = decltype(cute::size<0,1>(MmaShapeQ_MK{}) * cute::size<2>(MmaShapeQ_MK{})); + using SmemLayoutAtomQ = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileP_N, BlockTileP_K>()); + using TmemLayoutAtomQ = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, Element, BlockTileQ_M, BlockTileQ_K>()); + + using SmemLayoutX = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomX{}, + append(MmaShapeX_NK{}, Int{}), + Step<_2,_1,_3>{})); + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(MmaShapeB_NK{}, Int{}), + Step<_2,_1,_3>{})); + // Be consistent with SmemLayoutB + using SmemLayoutBT = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomBT{}, + append(MmaShapeB_MK{}, Int{}), + Step<_1,_2,_3>{})); + using TmemLayoutB = decltype(UMMA::tile_to_mma_shape( + TmemLayoutAtomB{}, + append(MmaShapeB_MK{}, Int<1>{}), + Step<_2,_1,_3>{})); + using SmemLayoutC = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomC{}, + append(MmaShapeC_MK{}, Int{}), + Step<_2,_1,_3>{})); + // P only need 1 stage in this case + using SmemLayoutPT = decltype(tile_to_shape( + SmemLayoutAtomPT{}, + append(make_shape(get<2>(TileShape{}), get<1>(TileShape{})), Int<1>{}))); + using SmemLayoutP = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomP{}, + append(MmaShapeP_NK{}, Int<1>{}), + Step<_2,_1,_3>{})); + using TmemLayoutQ = decltype(UMMA::tile_to_mma_shape( + TmemLayoutAtomQ{}, + append(MmaShapeQ_MK{}, Int<1>{}), + Step<_2,_1,_3>{})); + using SmemLayoutQ = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomQ{}, + append(MmaShapeQ_MK{}, Int<2>{}), + Step<_2,_1,_3>{})); + + using SmemLayoutAtomXT = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + cute::GMMA::Major::MN, Element, decltype(get<0>(TileShape{})), decltype(get<1>(TileShape{}))>()); + using SmemLayoutXT = decltype(tile_to_shape( + SmemLayoutAtomXT{}, + make_shape(size<0>(TileShape{}), size<1>(TileShape{}), Int{}), + Step<_1,_2,_3>{})); + + using EpilogueTileType = cutlass::epilogue::collective::EpilogueTileAuto; + using Schedule = cutlass::epilogue::TmaWarpSpecialized; + using EpilogueTile = Shape, Int<32>>; + + using SmemLayoutAtomY = decltype(cutlass::gemm::collective::detail::ss_smem_selector< + cute::GMMA::Major::MN, ElementY, decltype(get<0>(EpilogueTile{})), decltype(get<1>(EpilogueTile{}))>()); + using SmemLayoutY = decltype(tile_to_shape( + SmemLayoutAtomY{}, + make_shape(size<0>(EpilogueTile{}), size<1>(EpilogueTile{}), Int{}), + Step<_2,_1,_3>{})); + using SmemLayoutStoreP = decltype(tile_to_shape( + SmemLayoutAtomP{}, + append(make_shape(get<1>(TileShape{}), get<2>(TileShape{})), Int<1>{}), + Step<_2,_1,_3>{})); + + using CollectiveMainloop = cutlass::ssd::collective::SsdMainloopTmaWarpSpecialized< + Element, ElementDA, ElementAcc, ElementY, TileShape, + StagesInput, StagesOutput, + TiledMmaIntra1, TiledMmaIntra2, + TiledMmaInter1, TiledMmaInter2, + SmemLayoutX, SmemLayoutB, SmemLayoutC, SmemLayoutP, + SmemLayoutBT, SmemLayoutPT, SmemLayoutQ, + TmemLayoutB, TmemLayoutQ>; + using CollectiveEpilogue = cutlass::ssd::collective::SsdEpilogue< + ElementAcc, Element, ElementDA, TileShape, + EpilogueTile, SmemLayoutY, SmemLayoutStoreP, SmemLayoutXT, StagesInput, StagesOutput, + HAS_D_, D_HAS_HDIM_>; + using TileScheduler = cutlass::ssd::kernel::PersistentTileScheduler; + using Kernel = cutlass::ssd::kernel::SsdKernelTmaWarpSpecialized; + +}; + +} diff --git a/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_tma_warpspecialized.hpp b/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_tma_warpspecialized.hpp new file mode 100644 index 00000000..c2c428f2 --- /dev/null +++ b/examples/112_blackwell_ssd/kernel/sm100_ssd_kernel_tma_warpspecialized.hpp @@ -0,0 +1,519 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/arch/reg_reconfig.h" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/arch/arch.h" + +namespace cutlass::ssd::kernel { + +using namespace cute; + +template< + class CollectiveMainloop_, + class CollectiveEpilogue_, + class TileScheduler_ +> +struct SsdKernelTmaWarpSpecialized { + + using CollectiveMainloop = CollectiveMainloop_; + using CollectiveEpilogue = CollectiveEpilogue_; + using TileScheduler = TileScheduler_; + + // TileShape: LDN + using TileShape = typename CollectiveMainloop::TileShape; + // Force to use 1x1x1 + using ClusterShape = typename CollectiveMainloop::ClusterShape; + using ArchTag = cutlass::arch::Sm100; + + static constexpr uint32_t NumMmaThreads = NumThreadsPerWarp; // 1 warp + static constexpr uint32_t NumEpilogueThreads = CollectiveEpilogue::ThreadCount; + static constexpr uint32_t NumEpilogueWarps = NumEpilogueThreads / NumThreadsPerWarp; + + // Pipeline for Tensor X + using MainloopPipelineX = typename CollectiveMainloop::MainloopPipelineX; + using PipelineStateX = typename cutlass::PipelineState; + using PipelineParamsX = typename MainloopPipelineX::Params; + + // Pipeline for Tensor Delta && DeltaA + using MainloopPipelineDelta = typename CollectiveMainloop::MainloopPipelineDelta; + using PipelineStateDelta = typename cutlass::PipelineState; + using PipelineParamsDelta = typename MainloopPipelineDelta::Params; + + // Pipeline for Tensor X + using MainloopPipelineB = typename CollectiveMainloop::MainloopPipelineB; + using PipelineStateB = typename cutlass::PipelineState; + using PipelineParamsB = typename MainloopPipelineB::Params; + + // Pipeline for Tensor X + using MainloopPipelineC = typename CollectiveMainloop::MainloopPipelineC; + using PipelineStateC = typename cutlass::PipelineState; + using PipelineParamsC = typename MainloopPipelineC::Params; + + // Pipeline for Intra Fusion + using MainloopPipelineIntra = typename CollectiveMainloop::MainloopPipelineIntra; + using PipelineStateIntra = typename cutlass::PipelineState; + using PipelineParamsIntra = typename MainloopPipelineIntra::Params; + + // Pipeline for Inter Fusion + using MainloopPipelineInter = typename CollectiveMainloop::MainloopPipelineInter; + using PipelineStateInter = typename cutlass::PipelineState; + using PipelineParamsInter = typename MainloopPipelineInter::Params; + + // Pipeline for Accumulator + using AccumulatorPipeline = typename CollectiveMainloop::AccumulatorPipeline; + using AccumulatorPipelineState = typename CollectiveMainloop::AccumulatorPipelineState; + using PipelineParamsAcc = typename AccumulatorPipeline::Params; + + // Pipeline for Epilgoue store + using EpiStorePipeline = typename CollectiveEpilogue::StorePipeline; + using EpiStorePipelineState = typename CollectiveEpilogue::StorePipelineState; + + // Pipeline for Epilgoue load D + using EpiloadPipelineD = typename CollectiveEpilogue::EpiloadPipelineD; + using PipelineParamsD = typename EpiloadPipelineD::Params; + using PipelineStateD = typename cutlass::PipelineState; + using TmemAllocator = typename cute::TMEM::Allocator1Sm; + + struct SharedStorage { + struct PipelineStorage : cute::aligned_struct<16, _1> { + using PipelineStorageX = typename MainloopPipelineX::SharedStorage; + using PipelineStorageDelta = typename MainloopPipelineDelta::SharedStorage; + using PipelineStorageB = typename MainloopPipelineB::SharedStorage; + using PipelineStorageC = typename MainloopPipelineC::SharedStorage; + using PipelineStorageIntra = typename MainloopPipelineIntra::SharedStorage; + using PipelineStorageInter = typename MainloopPipelineInter::SharedStorage; + using PipelineStorageAcc = typename AccumulatorPipeline::SharedStorage; + using PipelineStorageD = typename EpiloadPipelineD::SharedStorage; + alignas(16) PipelineStorageX pipeline_storage_x; + alignas(16) PipelineStorageDelta pipeline_storage_delta; + alignas(16) PipelineStorageB pipeline_storage_b; + alignas(16) PipelineStorageC pipeline_storage_c; + alignas(16) PipelineStorageD pipeline_storage_d; + alignas(16) PipelineStorageIntra pipeline_storage_intra; + alignas(16) PipelineStorageInter pipeline_storage_inter; + alignas(16) PipelineStorageAcc pipeline_storage_acc; + } pipelines; + + uint32_t tmem_base_ptr; + + struct TensorStorage : cute::aligned_struct<128, _1> { + using EpilogueTensorStorage = typename CollectiveEpilogue::TensorStorage; + using MainloopTensorStorage = typename CollectiveMainloop::TensorStorage; + + EpilogueTensorStorage epilogue; + MainloopTensorStorage mainloop; + } tensors; + }; + + static constexpr int SharedStorageSize = sizeof(SharedStorage); + // [G, B, EH, C, L, D, N] + using ProblemShape = cute::tuple; + + struct Arguments { + ProblemShape problem_size; + typename CollectiveMainloop::Arguments mainloop; + typename CollectiveEpilogue::Arguments epilogue; + KernelHardwareInfo hw_info; + }; + + struct Params { + ProblemShape problem_size; + typename CollectiveMainloop::Params mainloop; + typename CollectiveEpilogue::Params epilogue; + typename TileScheduler::Params tile_scheduler; + }; + + static const int MinBlocksPerMultiprocessor = 1; + static const int MaxThreadsPerBlock = 384; + + static size_t get_workspace_size(Arguments const& args) { return 0; } + static cutlass::Status initialize_workspace(Arguments const&, void*, cudaStream_t) { + return cutlass::Status::kSuccess; + } + + static bool can_implement(Arguments const& args) { + return CollectiveMainloop::can_implement(args.problem_size, args.mainloop); + } + + static dim3 get_grid_shape(Params const& params) { + return TileScheduler::get_grid_shape(params.tile_scheduler); + } + + static dim3 get_block_shape() { + dim3 block(MaxThreadsPerBlock, 1, 1); + return block; + } + + static Params to_underlying_arguments(Arguments const& args, void* workspace) { + return Params{ + args.problem_size, + CollectiveMainloop::to_underlying_arguments(args.problem_size, args.mainloop, workspace), + CollectiveEpilogue::to_underlying_arguments(args.problem_size, args.epilogue, workspace), + TileScheduler::to_underlying_arguments(args.problem_size, args.hw_info, ClusterShape{}, TileShape{}) + }; + } + + CUTLASS_DEVICE void operator()(const Params ¶ms, char* smem) { + + using namespace cute; + using X = Underscore; + + // TBD + enum class WarpCategory : int32_t { + MMAInter = 0, + MMAIntra = 1, + DMA0 = 2, // Delta, X + DMA1 = 3, // B, C + PreInter = 4, + PreIntra = 8 + }; + + // Parameters + // [G, B, EH, C, L, D, N] + auto C = get<3>(params.problem_size); + + // Shared memory. + auto& storage = *reinterpret_cast(smem); + + int lane_predicate = cute::elect_one_sync(); + int lane_idx = cutlass::canonical_lane_idx(); + int warp_idx = cutlass::canonical_warp_idx_sync(); + auto warp_category = (WarpCategory(warp_idx) < WarpCategory::PreInter) ? + WarpCategory(warp_idx) : + (WarpCategory(warp_idx) < WarpCategory::PreIntra) ? + WarpCategory::PreInter : WarpCategory::PreIntra; + + // Issue Tma Descriptor Prefetch from a single thread + if ((warp_idx == 0) && lane_predicate) { + CollectiveMainloop::prefetch_tma_descriptors(params.mainloop); + } + + // Pipeline (TBD) + PipelineParamsX pipeline_params_x; + pipeline_params_x.transaction_bytes = CollectiveMainloop::kXLoadBytes; + pipeline_params_x.is_leader = lane_predicate && (warp_category == WarpCategory::DMA0); + pipeline_params_x.num_consumers = 1 + 1 + cutlass::NumThreadsPerWarpGroup; // MMA0 + MMA1 + PreInter + pipeline_params_x.initializing_warp = 4; + + PipelineParamsDelta pipeline_params_delta; + pipeline_params_delta.transaction_bytes = CollectiveMainloop::kDeltaLoadBytes + CollectiveMainloop::kDeltaALoadBytes; + pipeline_params_delta.is_leader = lane_predicate && (warp_category == WarpCategory::DMA0); + pipeline_params_delta.num_consumers = cutlass::NumThreadsPerWarpGroup + cutlass::NumThreadsPerWarpGroup; // PreInter + PreIntra + pipeline_params_delta.initializing_warp = 5; + + PipelineParamsB pipeline_params_b; + pipeline_params_b.transaction_bytes = CollectiveMainloop::kBLoadBytes; + pipeline_params_b.is_leader = lane_predicate && (warp_category == WarpCategory::DMA1); + pipeline_params_b.num_consumers = 1 + cutlass::NumThreadsPerWarpGroup; + pipeline_params_b.initializing_warp = 6; + + PipelineParamsC pipeline_params_c; + pipeline_params_c.transaction_bytes = CollectiveMainloop::kCLoadBytes; + pipeline_params_c.is_leader = lane_predicate && (warp_category == WarpCategory::DMA1); + pipeline_params_c.num_consumers = 1 + 1; + pipeline_params_c.initializing_warp = 7; + + PipelineParamsIntra pipeline_params_intra; + pipeline_params_intra.producer_arv_count = 1; + pipeline_params_intra.consumer_arv_count = cutlass::NumThreadsPerWarpGroup; + pipeline_params_intra.initializing_warp = 8; + + PipelineParamsIntra pipeline_params_inter; + pipeline_params_inter.producer_arv_count = 1; + pipeline_params_inter.consumer_arv_count = cutlass::NumThreadsPerWarpGroup; + pipeline_params_inter.initializing_warp = 9; + + PipelineParamsAcc pipeline_params_acc; + pipeline_params_acc.producer_arv_count = 1; + pipeline_params_acc.consumer_arv_count = cutlass::NumThreadsPerWarpGroup; + pipeline_params_acc.initializing_warp = 10; + + PipelineParamsD pipeline_params_d; + pipeline_params_d.transaction_bytes = CollectiveEpilogue::kEpiloadDBytes; + pipeline_params_d.is_leader = lane_predicate && (warp_category == WarpCategory::DMA0); + pipeline_params_d.num_consumers = cutlass::NumThreadsPerWarpGroup; + pipeline_params_d.initializing_warp = 11; + + + if (warp_category == WarpCategory::DMA0) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Producer; + pipeline_params_delta.role = MainloopPipelineDelta::ThreadCategory::Producer; + pipeline_params_d.role = EpiloadPipelineD::ThreadCategory::Producer; + } + if (warp_category == WarpCategory::DMA1) { + pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Producer; + pipeline_params_c.role = MainloopPipelineC::ThreadCategory::Producer; + } + // TBD + if (warp_category == WarpCategory::MMAInter) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Consumer; + // pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Consumer; + pipeline_params_c.role = MainloopPipelineC::ThreadCategory::Consumer; + pipeline_params_inter.role = MainloopPipelineInter::ThreadCategory::Producer; + pipeline_params_acc.role = AccumulatorPipeline::ThreadCategory::Producer; + } + if (warp_category == WarpCategory::MMAIntra) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Consumer; + pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Consumer; + pipeline_params_c.role = MainloopPipelineC::ThreadCategory::Consumer; + pipeline_params_intra.role = MainloopPipelineIntra::ThreadCategory::Producer; + } + if (warp_category == WarpCategory::PreInter) { + pipeline_params_b.role = MainloopPipelineB::ThreadCategory::Consumer; + pipeline_params_delta.role = MainloopPipelineDelta::ThreadCategory::Consumer; + pipeline_params_inter.role = MainloopPipelineInter::ThreadCategory::Consumer; + } + if (warp_category == WarpCategory::PreIntra) { + pipeline_params_x.role = MainloopPipelineX::ThreadCategory::Consumer; + pipeline_params_delta.role = MainloopPipelineDelta::ThreadCategory::Consumer; + pipeline_params_acc.role = AccumulatorPipeline::ThreadCategory::Consumer; + pipeline_params_intra.role = MainloopPipelineIntra::ThreadCategory::Consumer; + pipeline_params_d.role = EpiloadPipelineD::ThreadCategory::Consumer; + } + + MainloopPipelineX pipeline_x(storage.pipelines.pipeline_storage_x, pipeline_params_x, Shape<_1,_1,_1>{}); + PipelineStateX mainloop_pipe_x_consumer; + PipelineStateX mainloop_pipe_x_producer = cutlass::make_producer_start_state(); + + MainloopPipelineDelta pipeline_delta(storage.pipelines.pipeline_storage_delta, pipeline_params_delta, Shape<_1,_1,_1>{}); + PipelineStateDelta mainloop_pipe_delta_consumer; + PipelineStateDelta mainloop_pipe_delta_producer = cutlass::make_producer_start_state(); + + MainloopPipelineB pipeline_b(storage.pipelines.pipeline_storage_b, pipeline_params_b, Shape<_1,_1,_1>{}); + PipelineStateB mainloop_pipe_b_consumer; + PipelineStateB mainloop_pipe_b_producer = cutlass::make_producer_start_state(); + + MainloopPipelineC pipeline_c(storage.pipelines.pipeline_storage_c, pipeline_params_c, Shape<_1,_1,_1>{}); + PipelineStateC mainloop_pipe_c_consumer; + PipelineStateC mainloop_pipe_c_producer = cutlass::make_producer_start_state(); + + EpiloadPipelineD pipeline_d(storage.pipelines.pipeline_storage_d, pipeline_params_d, Shape<_1,_1,_1>{}); + PipelineStateD epi_load_pipe_d_consumer; + PipelineStateD epi_load_pipe_d_producer = cutlass::make_producer_start_state(); + + MainloopPipelineIntra pipeline_intra(storage.pipelines.pipeline_storage_intra, pipeline_params_intra, Shape<_1,_1,_1>{}); + PipelineStateIntra mainloop_pipe_intra_consumer; + PipelineStateIntra mainloop_pipe_intra_producer = cutlass::make_producer_start_state(); + + MainloopPipelineInter pipeline_inter(storage.pipelines.pipeline_storage_inter, pipeline_params_inter, Shape<_1,_1,_1>{}); + // Opposite pipeline state + PipelineStateInter mainloop_pipe_inter_consumer = cutlass::make_producer_start_state(); + PipelineStateInter mainloop_pipe_inter_producer; + + AccumulatorPipeline pipeline_acc(storage.pipelines.pipeline_storage_acc, pipeline_params_acc, Shape<_1,_1,_1>{}); + AccumulatorPipelineState mainloop_pipe_acc_consumer; + AccumulatorPipelineState mainloop_pipe_acc_producer = cutlass::make_producer_start_state(); + + // Epilogue Store pipeline + using EpiStorePipeline = typename CollectiveEpilogue::StorePipeline; + typename EpiStorePipeline::Params epi_store_pipeline_params; + epi_store_pipeline_params.always_wait = true; + EpiStorePipeline epi_store_pipeline(epi_store_pipeline_params); + + PipelineState epi_store_pipe_producer_state = cutlass::make_producer_start_state(); + + // Epilogue Store P pipeline + using EpiStorePPipeline = typename CollectiveEpilogue::StorePPipeline; + typename EpiStorePPipeline::Params epi_store_p_pipeline_params; + epi_store_p_pipeline_params.always_wait = true; + EpiStorePPipeline epi_store_p_pipeline(epi_store_p_pipeline_params); + + PipelineState epi_store_p_pipe_producer_state = cutlass::make_producer_start_state(); + + // Tmem allocator + TmemAllocator tmem_allocator{}; + // We need this to guarantee that the Pipeline init is visible + // To all producers and consumer blocks in the Cluster + // and to finish smem init + if constexpr (size(ClusterShape{}) > 1) { + cute::cluster_arrive_relaxed(); + cute::cluster_wait(); + } + else { + __syncthreads(); + } + + // ignore the tmem alloc + arch::NamedBarrier tmem_allocation_result_barrier(NumMmaThreads + NumMmaThreads + NumEpilogueThreads + NumEpilogueThreads, + cutlass::arch::ReservedNamedBarriers::TmemAllocBarrier); + if (warp_category == WarpCategory::MMAIntra) { + tmem_allocator.allocate(TmemAllocator::Sm100TmemCapacityColumns, &storage.tmem_base_ptr); + __syncwarp(); + tmem_allocation_result_barrier.arrive(); + } + if (warp_category == WarpCategory::MMAInter || warp_category == WarpCategory::PreIntra || warp_category == WarpCategory::PreInter) { + tmem_allocation_result_barrier.arrive_and_wait(); + } + + // Kernel implement(TBD) + + CollectiveMainloop collective_mainloop; + CollectiveEpilogue collective_epilogue; + TileScheduler tile_scheduler{params.tile_scheduler}; + + auto mma_output_intra = collective_mainloop.get_mma_intra_acc(); + auto mma_output_inter = collective_mainloop.get_mma_inter_acc(); + + if (warp_category == WarpCategory::DMA0) { + auto load_input = collective_mainloop.load_x_init(params.mainloop, params.problem_size); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord(); + auto blk_coord_eh = tile_scheduler.get_block_coord_eh(); + // Load D + collective_epilogue.load_d( + blk_coord_eh, params.epilogue, params.problem_size, + pipeline_d, epi_load_pipe_d_producer, + storage.tensors.mainloop + ); + // Load X + // Load Delta + // Load DeltaA + collective_mainloop.load_x_delta( + blk_coord, params.mainloop, params.problem_size, + pipeline_x, mainloop_pipe_x_producer, + pipeline_delta, mainloop_pipe_delta_producer, + load_input, + storage.tensors.mainloop + ); + } + } + else if (warp_category == WarpCategory::DMA1) { + auto load_input_b = collective_mainloop.load_b_init(params.mainloop, params.problem_size); + auto load_input_c = collective_mainloop.load_c_init(params.mainloop, params.problem_size); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord_b(); + // Load B + // Load C + collective_mainloop.load_b_c( + blk_coord, params.mainloop, params.problem_size, + pipeline_b, mainloop_pipe_b_producer, + pipeline_c, mainloop_pipe_c_producer, + load_input_b, load_input_c, + storage.tensors.mainloop + ); + } + } + else if (warp_category == WarpCategory::MMAIntra) { + auto [mma_inputs_1, mma_inputs_2] = collective_mainloop.mma_intra_init(storage.tensors.mainloop); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + for (int chunk = 0; chunk < C; ++chunk) { + collective_mainloop.mma_intra( + pipeline_b, mainloop_pipe_b_consumer, + pipeline_c, mainloop_pipe_c_consumer, + pipeline_x, mainloop_pipe_x_consumer, + pipeline_intra, mainloop_pipe_intra_producer, + mma_inputs_1, mma_inputs_2, + mma_output_intra + ); + } + } + } + else if (warp_category == WarpCategory::MMAInter) { + auto [mma_inputs_1, mma_inputs_2] = collective_mainloop.mma_inter_init(storage.tensors.mainloop); + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + for (int chunk = 0; chunk < C; ++chunk) { + collective_mainloop.mma_inter( + pipeline_c, mainloop_pipe_c_consumer, + pipeline_x, mainloop_pipe_x_consumer, + pipeline_inter, mainloop_pipe_inter_producer, + pipeline_acc, mainloop_pipe_acc_producer, + mma_inputs_1, mma_inputs_2, + mma_output_inter + ); + } + } + } + else if (warp_category == WarpCategory::PreIntra) { + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto blk_coord = tile_scheduler.get_block_coord(); + auto blk_coord_eh = tile_scheduler.get_block_coord_eh(); + bool is_first_iteration = true; + for (int chunk = 0; chunk < C; ++chunk) { + collective_mainloop.pre_intra( + pipeline_delta, mainloop_pipe_delta_consumer, + pipeline_intra, mainloop_pipe_intra_consumer, + mma_output_intra, + storage.tensors.mainloop + ); + collective_epilogue.store( + chunk, blk_coord, blk_coord_eh, params.epilogue, params.problem_size, + pipeline_intra, mainloop_pipe_intra_consumer, + pipeline_acc, mainloop_pipe_acc_consumer, + pipeline_delta, mainloop_pipe_delta_consumer, + pipeline_x, mainloop_pipe_x_consumer, + pipeline_d, epi_load_pipe_d_consumer, + epi_store_pipeline, epi_store_pipe_producer_state, + mma_output_intra, + mma_output_inter, + storage.tensors.mainloop, storage.tensors.epilogue, + is_first_iteration + ); + is_first_iteration = false; + } + if constexpr (CollectiveEpilogue::HasBlockScaleD) { + // update the barrier + pipeline_d.consumer_release(epi_load_pipe_d_consumer); + ++epi_load_pipe_d_consumer; + } + } + uint32_t free_stage_ptr = storage.tmem_base_ptr; + tmem_allocator.free(free_stage_ptr, TmemAllocator::Sm100TmemCapacityColumns); + } + else if (warp_category == WarpCategory::PreInter) { + for (; tile_scheduler.is_valid(); ++tile_scheduler) { + auto [tState] = collective_mainloop.state_init(mma_output_inter, storage.tensors.mainloop); + for (int chunk = 0; chunk < C; ++chunk) { + collective_mainloop.pre_inter( + pipeline_b, mainloop_pipe_b_consumer, + pipeline_delta, mainloop_pipe_delta_consumer, + pipeline_inter, mainloop_pipe_inter_consumer, + mma_output_inter, + tState, + storage.tensors.mainloop + ); + } + auto blk_coord = tile_scheduler.get_block_coord(); + // Epilogue Fstate store + collective_epilogue.store_p( + blk_coord, params.epilogue, params.problem_size, + epi_store_p_pipeline, epi_store_p_pipe_producer_state, + storage.tensors.mainloop + ); + } + } + } +}; + +} // namespace cutlass::ssd::kernel diff --git a/examples/112_blackwell_ssd/kernel/sm100_ssd_tile_scheduler.hpp b/examples/112_blackwell_ssd/kernel/sm100_ssd_tile_scheduler.hpp new file mode 100644 index 00000000..20a2e509 --- /dev/null +++ b/examples/112_blackwell_ssd/kernel/sm100_ssd_tile_scheduler.hpp @@ -0,0 +1,132 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/fast_math.h" +#include "cutlass/kernel_hardware_info.h" + +namespace cutlass::ssd::kernel { + +//////////////////////////////////////////////////////////////////////////////// + +struct PersistentTileScheduler { + + struct Params { + int num_blocks; + int num_groups; + FastDivmod divmod_eh; + FastDivmod divmod_ngroup_ratio; + + KernelHardwareInfo hw_info; + }; + + int block_idx = 0; + Params params; + + CUTLASS_DEVICE + PersistentTileScheduler(Params const& params) : block_idx(blockIdx.x), params(params) {} + + template + static Params to_underlying_arguments( + ProblemSize const& problem_size, KernelHardwareInfo hw_info, + ClusterShape const& cluster_shape, TileShape const& tile_shape) + { + using namespace cute; + auto [G, B, EH, C, L, D, N] = problem_size; + + // Get SM count if needed, otherwise use user supplied SM count + int sm_count = hw_info.sm_count; + if (sm_count <= 0) { + CUTLASS_TRACE_HOST(" WARNING: Arguments do not include a valid SM count.\n" + " For optimal performance, populate the arguments KernelHardwareInfo struct with the SM count."); + sm_count = KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + } + + CUTLASS_TRACE_HOST("to_underlying_arguments(): Setting persistent grid SM count to " << sm_count); + hw_info.sm_count = sm_count; + + int num_blocks = B * EH; + int ngroup_ratio = EH / G; + + return Params { + num_blocks, + G, + {EH}, + {ngroup_ratio}, + hw_info + }; + } + + static dim3 get_grid_shape(Params const& params) { + dim3 grid(std::min(params.num_blocks, params.hw_info.sm_count), 1, 1); + return grid; + } + + CUTLASS_DEVICE + bool is_valid() { + return block_idx < params.num_blocks; + } + + CUTLASS_DEVICE + auto get_block_coord() { + return block_idx; + } + + CUTLASS_DEVICE + auto get_block_coord_b() { + using namespace cute; + int eh_idx, b_idx; + int g_idx, rest_idx; + params.divmod_eh(b_idx, eh_idx, block_idx); + params.divmod_ngroup_ratio(g_idx, rest_idx, eh_idx); + return (params.num_groups * b_idx + g_idx); + } + + CUTLASS_DEVICE + auto get_block_coord_eh() { + using namespace cute; + int eh_idx, b_idx; + params.divmod_eh(b_idx, eh_idx, block_idx); + return eh_idx; + } + + CUTLASS_DEVICE + PersistentTileScheduler& operator++() { + block_idx += gridDim.x; + return *this; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::ssd::kernel diff --git a/examples/112_blackwell_ssd/reference/reference_ssd.hpp b/examples/112_blackwell_ssd/reference/reference_ssd.hpp new file mode 100644 index 00000000..0cb80e6c --- /dev/null +++ b/examples/112_blackwell_ssd/reference/reference_ssd.hpp @@ -0,0 +1,341 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include "cute/tensor.hpp" + +// training or inference phase (not used yet) +// PHASE 0 : training +// PHASE 1 : inference +#define PHASE 0 + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template< + bool transA, + bool transB, + class Element, + class TensorA, + class TensorB, + class TensorC +> +void mma(TensorA tA, TensorB tB, TensorC tC) { + using namespace cute; + + int M = transA ? int(shape<1>(tA)) : int(shape<0>(tA)); + int N = transB ? int(shape<1>(tB)) : int(shape<0>(tB)); + int K = transA ? int(shape<0>(tA)) : int(shape<1>(tA)); + for (int mi = 0; mi < M; ++mi) { + for (int ni = 0; ni < N; ++ni) { + for (int ki = 0; ki < K; ++ki) { + float a = static_cast(Element(transA ? tA(ki, mi) : tA(mi, ki))); + float b = static_cast(Element(transB ? tB(ki, ni) : tB(ni, ki))); + tC(mi, ni) += a * b; + } + } + } + +} + +template< + class Element, + class Tensor +> +auto segsum(Tensor tensor) { + using namespace cute; + auto C = shape<0>(tensor); + auto L = shape<1>(tensor); + auto cum_sum = make_tensor(make_shape(C,L)); + // cum_sum + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + if (li == 0) { + cum_sum(ci, li) = tensor(ci, li); + } + else { + cum_sum(ci, li) = cum_sum(ci, li - 1) + tensor(ci, li); + } + } + } + auto seg_sum_out = make_tensor(make_shape(C, L, L)); + // seg_sum + // [ 1, 0, 0] + // [ e^y, 1, 0] + // [e^(y+z), e^z, 1] + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < L; ++i) { + for (int j = 0; j < L; ++j) { + if (j < i) { + float tmp = static_cast(cum_sum(ci, i)) - static_cast(cum_sum(ci, j)); + seg_sum_out(ci, i, j) = expf(tmp); + } + else if (j == i) { + seg_sum_out(ci, i, j) = 1.f; + } + else { + seg_sum_out(ci, i, j) = 0.f; + } + } + } + } + + return seg_sum_out; +} + +template< + class Element, + class Tensor +> +auto cumsum(Tensor tensor) { + using namespace cute; + auto C = shape<0>(tensor); + auto L = shape<1>(tensor); + auto cum_sum = make_tensor(make_shape(C,L)); + auto cum_sum_out = make_tensor(make_shape(C,L)); + auto cum_sum_exp_out = make_tensor(make_shape(C, L)); + auto cum_sum_exp_out_last = make_tensor(make_shape(C, L)); + auto last_column = make_tensor(make_shape(C)); + // [x, x+y, x+y+z, ..] + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + if (li == 0) { + cum_sum(ci, li) = tensor(ci, li); + } + else { + cum_sum(ci, li) = cum_sum(ci, li - 1) + tensor(ci, li); + } + // cum_sum_out(ci, li) = static_cast(cum_sum(ci, li)); + } + } + CUTLASS_PRAGMA_UNROLL + for (int ci = 0; ci < C; ++ci) { + last_column(ci) = static_cast(cum_sum(ci, L-1)); + CUTLASS_PRAGMA_UNROLL + for (int li = 0; li < L; ++li) { + cum_sum_exp_out_last(ci, li) = expf(static_cast(last_column(ci) - cum_sum(ci, li))); + cum_sum_exp_out(ci, li) = expf(static_cast(cum_sum(ci, li))); + } + } + + return make_tuple(cum_sum_exp_out_last, last_column, cum_sum_exp_out); +} + +template< + bool HAS_D, + bool D_HAS_HDIM, + bool HAS_Z, + class TensorY, + class TensorF, + class TensorX, + class TensorDelta, + class TensorDeltaA, + class TensorB, + class TensorC, + class TensorD, + class TensorZ, + class Params +> +void ssd_reference_impl( + TensorY mY, TensorF mF, + TensorX mX, TensorDelta mDelta, TensorDeltaA mDeltaA, + TensorB mB, TensorC mC, TensorD mD, TensorZ mZ, + Params params) { + + using namespace cute; + using Element = typename Params::Element; + using ElementAcc = typename Params::ElementAcc; + + // x [b, eh, d, c, l] + // delta [b, eh, c, l] + // delta_A [b, eh, c, l] + // B [b, g, n, c, l] + // C [b, g, n, c, l] + // y [b, eh, d, c, l] + // fstate [b, eh, d, n] + // d [ eh, d] + auto [G, B, EH, C, L, D, N] = params.get_problem_shape(); + int group_ratio = EH / G; + for (int b = 0; b < B; ++b) { + for (int eh = 0; eh < EH; ++eh) { + int g = eh / group_ratio; + auto tY = mY(b,eh,_,_,_); + auto tF = mF(b,eh,_,_); + auto tX = mX(b,eh,_,_,_); + auto tDelta = mDelta(b,eh,_,_); + auto tDeltaA = mDeltaA(b,eh,_,_); + auto tB = mB(b,g,_,_,_); + auto tC = mC(b,g,_,_,_); + auto tD = mD(eh,_); + auto tZ = mZ(b,eh,_,_,_); + // IntraBMM1 BxC, LxLxN, NT + // B: [n, c, l] + // C: [n, c, l] + // O: [c, l, l] + auto tIntraBMM1_out = make_tensor(make_shape(C,L,L)); + for (int ci = 0; ci < C; ++ci) { + mma(tC(_,ci,_), tB(_,ci,_), tIntraBMM1_out(ci,_,_)); + } + // Pre_IntraBMM2 DeltaA_IntraBMM2 x Delta x IntraBMM_out + // DeltaA_xxx : [c, l, l] + // Delta : [c, l, _] + // IntraBMM1_out: [c, l, l] + auto tDeltaA_IntraBMM2 = segsum(tDeltaA); + auto tIntraBMM2_inp = make_tensor(make_shape(C, L, L)); + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < L; ++i) { + for (int j = 0; j < L; ++j) { + tIntraBMM2_inp(ci, i, j) = tDeltaA_IntraBMM2(ci, i, j) * tDelta(ci, j) * tIntraBMM1_out(ci, i, j); + } + } + } + // IntraBMM2 IntraBMM2_inp x X, LxDxL, TT + // IntraBMM2_inp: [c, l, l] + // X : [d, c, l] + // IntraBMM2_out: [c, l, d] + auto tIntraBMM2_out = make_tensor(make_shape(C,L,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tIntraBMM2_inp(ci,_,_), tX(_,ci,_), tIntraBMM2_out(ci,_,_)); + } + // Pre_InterBMM1 DeltaA_InterBMM1 x Delta x B + // DeltaA_xxx : [c, l] + // Delta : [c, l] + // IntraBMM1_out: [c, n, l] + auto [tDeltaA_InterBMM1, tLast, tCumsum_exp] = cumsum(tDeltaA); + auto tInterBMM1_inp = make_tensor(make_shape(C, N, L)); + for (int ci = 0; ci < C; ++ci) { + for (int i = 0; i < N; ++i) { + for (int j = 0; j < L; ++j) { + tInterBMM1_inp(ci, i, j) = tDeltaA_InterBMM1(ci, j) * tDelta(ci, j) * tB(i, ci, j); + } + } + } + // InterBMM1 InterBMM1_inp x X, NxDxL, swapAB, TT + // InterBMM1_inp: [c, n, l] + // X : [d, c, l] + // InterBMM1_out: [c, n, d] + auto tInterBMM1_out = make_tensor(make_shape(C,N,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tInterBMM1_inp(ci,_,_), tX(_,ci,_), tInterBMM1_out(ci,_,_)); + } + // Initialize state + // PreInterBMM2 + // InterBMM1_out: [c, n, d] + // Last : [c] + auto tInterBMM2_inp = make_tensor(make_shape(C, N, D)); + for (int ci = 0; ci < C; ++ci) { + for (int ni = 0; ni < N; ++ ni){ + for (int di = 0; di < D; ++di) { + if (ci == 0) { + tInterBMM2_inp(ci, ni, di) = 0; + } + else { + tInterBMM2_inp(ci, ni, di) = tInterBMM1_out(ci - 1, ni, di) + expf(tLast(ci - 1)) * tInterBMM2_inp(ci - 1, ni, di); + } + } + } + } + // InterBMM2 InterBMM2_inp x C, LxDxN, NT + // C : [n, c, l] + // InterBMM2_inp: [c, n, d] + // InterBMM2_out: [c, l, d] + auto tInterBMM2_out = make_tensor(make_shape(C,L,D)); + for (int ci = 0; ci < C; ++ci) { + mma(tC(_,ci,_), tInterBMM2_inp(ci,_,_), tInterBMM2_out(ci,_,_)); + } + // Epilogue Cumsum_exp x InterBMM2_out + IntraBMM2_out + // InterBMM2_out: [c, l, d] + // IntraBMM2_out: [c, l, d] + // Cumsum_exp : [c, l] + for (int ci = 0; ci < C; ++ci) { + for (int li = 0; li < L; ++li) { + for (int di = 0; di < D; ++di) { + float y = tInterBMM2_out(ci, li, di) * tCumsum_exp(ci, li) + tIntraBMM2_out(ci, li, di); + float scale; + if constexpr (D_HAS_HDIM) { + scale = static_cast(tD(di)); + } + else { + scale = static_cast(tD(_0{})); + } + if constexpr (HAS_D) { + y = y + static_cast(tX(di, ci, li)) * scale; + } + else { + y = y; + } + if constexpr (HAS_Z) { + float z = static_cast(tZ(di, ci, li)); + // y = y * z * (1 / (1 + exp(-z))); + y = y * z * (1 / (1 + exp(-z))); + } + tY(di, ci, li) = static_cast(y); + } + } + } + // Epilogue Fstate(last C) + for (int ni = 0; ni < N; ++ ni){ + for (int di = 0; di < D; ++di) { + tF(di, ni) = static_cast(tInterBMM1_out(C - 1, ni, di) + expf(tLast(C - 1)) * tInterBMM2_inp(C - 1, ni, di)); + } + } + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template< + bool HAS_D, + bool D_HAS_HDIM, + bool HAS_Z, + class TensorY, + class TensorF, + class TensorX, + class TensorDelta, + class TensorDeltaA, + class TensorB, + class TensorC, + class TensorD, + class TensorZ, + class Params +> +void ssd_reference( + TensorY mY, TensorF mF, + TensorX mX, TensorDelta mDelta, TensorDeltaA mDeltaA, + TensorB mB, TensorC mC, TensorD mD, TensorZ mZ, + Params params) { + ssd_reference_impl(mY, mF, mX, mDelta, mDeltaA, mB, mC, mD, mZ, params); +} + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/examples/112_blackwell_ssd/reference/reference_ssd_cumsum.hpp b/examples/112_blackwell_ssd/reference/reference_ssd_cumsum.hpp new file mode 100644 index 00000000..124052f8 --- /dev/null +++ b/examples/112_blackwell_ssd/reference/reference_ssd_cumsum.hpp @@ -0,0 +1,194 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include +#include + +#include "cutlass/coord.h" +#include "cutlass/util/host_tensor.h" +#include "cutlass/tensor_view.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/reference/host/gemm.h" +#include "cutlass/arch/arch.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +#include "cute/int_tuple.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "cute/util/debug.hpp" +#include "cute/config.hpp" + +namespace cutlass::ssd::kernel { + +using namespace cute; + +template< + class Element_, + class ElementD_, + class TileShape_> +struct CumsumKernel { + using Element = Element_; + using ElementD = ElementD_; + using TileShape = TileShape_; // L,D,N + + // Required by `device_kernel` + static constexpr int MaxThreadsPerBlock = 128; + static constexpr int MinBlocksPerMultiprocessor = 1; + using ArchTag = arch::Sm90; + + static constexpr int AlignmentBytes = 16; + + struct SharedStorage { + /* empty, no smem needed */ + }; + + static constexpr int SharedStorageSize = sizeof(SharedStorage); + + struct TransformArguments { + const Element* ptr_DeltaA; + ElementD* ptr_Cumsum; + }; + + struct TransformParams { + const Element* ptr_DeltaA; + ElementD* ptr_Cumsum; + }; + + using ProblemShape = cute::tuple; // b, eh, c, l + struct Arguments { + ProblemShape problem_shape{}; + TransformArguments transform{}; + KernelHardwareInfo hw_info{}; + }; + + struct Params { + ProblemShape problem_shape{}; + TransformParams transform{}; + KernelHardwareInfo hw_info{}; + }; + + static Params + to_underlying_arguments(Arguments const& args, void* workspace) { + return Params{ + ProblemShape{args.problem_shape}, + TransformParams{args.transform.ptr_DeltaA, args.transform.ptr_Cumsum}, + KernelHardwareInfo{args.hw_info}}; + } + + static Status + can_implement(Arguments const& args) { + return Status::kSuccess; + } + + static size_t + get_workspace_size(Arguments const& args) { + return size_t(0); + } + + static Status + initialize_workspace(Arguments const& args, void* workspace = nullptr, cudaStream_t stream = nullptr, + CudaHostAdapter *cuda_adapter = nullptr) { + return Status::kSuccess; + } + + static dim3 + get_grid_shape(Params const& params) { + auto [B, EH, C, L] = params.problem_shape; + return dim3(B*EH, 1, 1); + } + + static dim3 + get_block_shape() { + return dim3(MaxThreadsPerBlock, 1, 1); + } + + CUTE_HOST_DEVICE + void + operator()(Params params, [[maybe_unused]] char* smem_buf = nullptr) { + auto [B, EH, C, L] = params.problem_shape; + + auto layout = make_layout(make_shape(L, C, EH*B)); + + auto mD_bcl = make_tensor(make_gmem_ptr(params.transform.ptr_DeltaA), make_layout(reverse(layout.shape()), reverse(layout.stride()))); + auto mC_bcl = make_tensor(make_gmem_ptr(params.transform.ptr_Cumsum), make_layout(reverse(layout.shape()), reverse(layout.stride()))); + auto cD_bcl = make_identity_tensor(shape(mD_bcl)); + + int blk_idx = blockIdx.x; + int thread_idx = threadIdx.x; + + auto tD = logical_divide(mD_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + auto tC = logical_divide(mC_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + auto cD = logical_divide(cD_bcl(blk_idx,_,_), make_shape(Int<128>{},_))(make_coord(thread_idx,_),_); + + static constexpr int NumPacked = AlignmentBytes / sizeof(ElementD); + using PackedTypeDeltaA = uint_bit_t * NumPacked>; + using PackedTypeCumsum = uint_bit_t * NumPacked>; + +#if 0 + if (thread_idx % 128 == 0 && blk_idx == 0) { + print("tD : ");print(tD);print("\n"); + print("tC : ");print(tC);print("\n"); + print("cD : ");print(cD);print("\n"); + } +#endif + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < shape<0>(tD); ++i) { + float last_element = 0.f; + auto crd = cD(i,_0{}); + auto tD_recast = recast(tD); + auto tC_recast = recast(tC); + if (elem_less(crd, shape(mD_bcl))) { + for (int j = 0; j < shape<1>(tD_recast); ++j) { + auto tD_slice = make_tensor(make_shape(Int{})); + auto tC_slice = make_tensor(make_shape(Int{})); + auto tD_slice_recast = recast(tD_slice); + auto tC_slice_recast = recast(tC_slice); + + tD_slice_recast(_0{}) = tD_recast(i,j); + for (int k = 0; k < NumPacked; ++ k) { + last_element += static_cast(tD_slice(k)); + tC_slice(k) = static_cast(last_element); + } + tC_recast(i,j) = tC_slice_recast(_0{}); + } + } + } + } + +private: + +}; + +} // End namespace cutlass diff --git a/examples/112_blackwell_ssd/utils/pipeline.h b/examples/112_blackwell_ssd/utils/pipeline.h new file mode 100644 index 00000000..a26004cf --- /dev/null +++ b/examples/112_blackwell_ssd/utils/pipeline.h @@ -0,0 +1,225 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +#pragma once + +#include "cute/numeric/integral_constant.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cutlass/arch/barrier.h" +#include "cutlass/pipeline/sm90_pipeline.hpp" + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { + +using namespace cute; + +// Producer-consumer pipeline implementation +// for TMA producer. In this case, Multi-consumers +// (UMMAs, TransformWarps, ...) +// will arrive at the same empty barrier. +// A naive implement without mcast support. +template , class AtomThrShape_MNK_ = Shape<_1,_1,_1>> +class PipelineTmaMultiConsumersAsync { +public: + static constexpr uint32_t Stages = Stages_; + using AtomThrShape_MNK = AtomThrShape_MNK_; +private: + using Impl = PipelineTmaAsync; +public: + using FullBarrier = typename Impl::FullBarrier; + using EmptyBarrier = typename Impl::EmptyBarrier; + using ProducerBarrierType = typename Impl::ProducerBarrierType; + using ConsumerBarrierType = typename Impl::ConsumerBarrierType; + using PipelineState = typename Impl::PipelineState; + using SharedStorage = typename Impl::SharedStorage; + using ThreadCategory = typename Impl::ThreadCategory; + using Params = typename Impl::Params; + + // Helper function to initialize barriers + static + CUTLASS_DEVICE + void + init_barriers(SharedStorage& storage, Params params, ClusterShape cluster_shape) { + int warp_idx = canonical_warp_idx_sync(); + if (warp_idx == params.initializing_warp) { + constexpr int producer_arv_cnt = 1; + int const consumer_arv_cnt = params.num_consumers; + cutlass::arch::detail::initialize_barrier_array_pair_aligned( + storage.full_barrier_, storage.empty_barrier_, producer_arv_cnt, consumer_arv_cnt); + } + cutlass::arch::fence_barrier_init(); + } + + CUTLASS_DEVICE + void init_masks(ClusterShape cluster_shape) { + // Calculate consumer mask + if (params_.role == ThreadCategory::Consumer) { + is_signalling_thread_ = 1; + dst_blockid_ = 0; + } + } + + // Constructor by default initializes barriers and calculates masks. + // These operations can be explicity deferred by specifying InitBarriers and InitMasks. + // If deferred, user code needs to guarantee init_masks and/or init_barriers is/are called. + template + CUTLASS_DEVICE + PipelineTmaMultiConsumersAsync(SharedStorage& storage, Params params, ClusterShape cluster_shape, InitBarriers = {}, InitMasks = {}) + : impl_(storage, params, cluster_shape) + , params_(params) + , empty_barrier_ptr_(&storage.empty_barrier_[0]) + , full_barrier_ptr_(&storage.full_barrier_[0]) { + static_assert(cute::is_same_v || cute::is_same_v); + static_assert(size(cluster_shape) == 1, "PipelineTmaMultiConsumersAsync only supports 1x1x1 cluster shape now"); + if constexpr (cute::is_same_v) { + init_barriers(storage, params_, cluster_shape); + } + + static_assert(cute::is_same_v || cute::is_same_v); + if constexpr (cute::is_same_v) { + init_masks(cluster_shape); + } + } + + //////////////////// + // Producer APIs + //////////////////// + // Four member functions are always used in pairs: + // + // * producer_try_acquire and producer_acquire, and + // * consumer_try_wait and consumer_wait. + // + // The two functions with "try" in their names are called "try" functions, + // and the other two are conceptually "finalize" functions. + // The "try" function in each pair starts the process of waiting on the barrier to flip. + // It opportunistically waits for an implementation-dependent timeout. + // Whether or not the barrier has flipped yet, the try function will return a token. + // If the token indicates that the barrier has not flipped, + // then the token must be passed into the corresponding "finalize" function. + // The finalize function will then block until the barrier has flipped. + // If the token indicates that the barrier _has_ flipped, + // then it is still correct to pass it into the finalize function. + // The finalize function will return immediately in that case. + CUTLASS_DEVICE + ProducerToken producer_try_acquire(PipelineState state, uint32_t skip_wait = false) { + return impl_.producer_try_acquire(state, skip_wait); + } + + CUTLASS_DEVICE + void producer_acquire(PipelineState state, ProducerToken barrier_token = {BarrierStatus::WaitAgain}) { + impl_.producer_acquire(state, barrier_token); + } + + // NOP for TMA based mainloop + CUTLASS_DEVICE + void producer_commit(PipelineState state, uint32_t bytes) { + impl_.producer_commit(state, bytes); + } + + // Prevents early exit of producer blocks in Cluster. + // This should be called once before kernel exits. + CUTLASS_DEVICE + void producer_tail(PipelineState state) { + impl_.producer_tail(state); + } + + CUTLASS_DEVICE + ProducerBarrierType* producer_get_barrier(PipelineState state) { + return impl_.producer_get_barrier(state); + } + + //////////////////// + // Consumer APIs + //////////////////// + CUTLASS_DEVICE + ConsumerToken consumer_try_wait(PipelineState state, uint32_t skip_wait = false) { + return impl_.consumer_try_wait(state, skip_wait); + } + + CUTLASS_DEVICE + void consumer_wait(PipelineState state, ConsumerToken barrier_token = {BarrierStatus::WaitAgain}) { + impl_.consumer_wait(state, barrier_token); + } + + CUTLASS_DEVICE + void consumer_release_from_umma(PipelineState state) { + consumer_release_from_umma(state.index(), false); + } + + CUTLASS_DEVICE + void consumer_release_from_threads(PipelineState state) { + consumer_release_from_threads(state.index()); + } + +private: + Impl impl_; + Params params_; + uint32_t dst_blockid_ = 0; + uint32_t is_signalling_thread_ = 0; + EmptyBarrier *empty_barrier_ptr_; + FullBarrier *full_barrier_ptr_; + uint16_t block_id_mask_ = 0; + static constexpr bool is_2sm_mma = size(AtomThrShape_MNK{}) > 1; + + // Consumer signalling Producer of completion + // Ensures all blocks in the Same Row and Column get notifed. + CUTLASS_DEVICE + void consumer_release_from_umma(uint32_t stage, uint32_t skip) { + uint64_t* smem_ptr = reinterpret_cast(&empty_barrier_ptr_[stage]); + if constexpr (is_2sm_mma) { // Mma cluster shape is 2x1 + if (!skip) { + cutlass::arch::umma_arrive_multicast_2x1SM(smem_ptr, block_id_mask_); + } + } + else { + if (!skip) { + if constexpr (cute::is_static_v and size(ClusterShape{}) == 1) { + cutlass::arch::umma_arrive(smem_ptr); + } + else { + cutlass::arch::umma_arrive_multicast(smem_ptr, block_id_mask_); + } + } + } + } + + CUTLASS_DEVICE + void consumer_release_from_threads(uint32_t stage, uint32_t skip = false) { + empty_barrier_ptr_[stage].arrive(dst_blockid_, is_signalling_thread_ & (!skip)); + #ifndef NDEBUG + if (params_.role == ThreadCategory::Producer || params_.role == ThreadCategory::NonParticipant) { + asm volatile ("brkpt;\n" ::); + } + #endif + } +}; + +} diff --git a/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_bf16_gemm.cu b/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_bf16_gemm.cu index 663ba874..f4638545 100644 --- a/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_bf16_gemm.cu +++ b/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_bf16_gemm.cu @@ -115,9 +115,29 @@ using namespace cute; ///////////////////////////////////////////////////////////////////////////////////////////////// /// GEMM kernel configurations ///////////////////////////////////////////////////////////////////////////////////////////////// -using MmaType = cutlass::bfloat16_t; -using QuantType = cutlass::int4b_t; -constexpr int TileShapeK = 128 * 8 / sizeof_bits::value; + +// Select MMA type via compile flag +#if defined(CUTLASS_USE_FP16) + using MmaType = cutlass::half_t; // FP16 +#elif defined(CUTLASS_USE_TF32) + using MmaType = cutlass::tfloat32_t; // TF32 (FP32 format with reduced precision) +#else + using MmaType = cutlass::bfloat16_t; // BF16 (default) +#endif + +// Select quantization type via compile flag for this example +#if defined(CUTLASS_MIXED_DTYPE_E2M1) + using QuantType = cutlass::float_e2m1_t; // E2M1 (FP4) +#else + using QuantType = cutlass::int4b_t; // INT4 Two's Complement (default) +#endif + +// TF32 requires K to be multiple of 8; BF16/FP16 can go higher +#if defined(CUTLASS_USE_TF32) + constexpr int TileShapeK = 64; // TF32: K must be multiple of 8, use 64 for good performance +#else + constexpr int TileShapeK = 128 * 8 / sizeof_bits::value; +#endif // A matrix configuration using ElementA = MmaType; // Element type for A matrix operand @@ -139,11 +159,19 @@ using StrideB = cutlass::detail::TagToStrideB_t; // Define the CuTe layout for reoredered quantized tensor B // LayoutAtomQuant places values that will be read by the same thread in contiguous locations in global memory. // It specifies the reordering within a single warp's fragment -//using ValueShuffle = Layout<_1>; // no value reordering +#if defined(CUTLASS_MIXED_DTYPE_E2M1) || defined(CUTLASS_USE_TF32) +// E2M1 & TF32: Use simpler layout without ValueShuffle (like FP8 example) +// ValueShuffle currrently isn't enabled for E2M1 until LayoutAwareConvertImpl specializations support shuffle reordering. +// and for TF32 until we support both the K=8 vs K=16 dimensions for tiles +using LayoutAtomQuant = decltype(cutlass::compute_memory_reordering_atom()); +#else +// INT4: Use ValueShuffle for optimal performance with FP16/BF16 +// using ValueShuffle = Layout<_1>; // no value reordering using ValueShuffle = Layout, Stride<_4,_1>>; // order [0,2,4,6,1,3,5,7] int constexpr NumShuffleAtoms = 1; using MmaAtomShape = Layout>>; using LayoutAtomQuant = decltype(cutlass::compute_memory_reordering_atom()); +#endif using LayoutB_Reordered = decltype(cute::tile_to_shape(LayoutAtomQuant{}, Layout, StrideB>{})); using ElementScale = MmaType; @@ -151,7 +179,7 @@ using ElementZero = ElementScale; using LayoutScale = cutlass::layout::RowMajor; // C/D matrix configuration -using ElementC = cutlass::half_t; // Element type for C and D matrix operands +using ElementC = MmaType; // Element type for C and D matrix operands (matches MMA type) using LayoutC = cutlass::layout::RowMajor; // Layout type for C and D matrix operands constexpr int AlignmentC = 128 / cutlass::sizeof_bits::value; // Memory access granularity/alignment of C matrix in units of elements (up to 16 bytes) diff --git a/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_fp8_gemm.cu b/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_fp8_gemm.cu index 0f1839fd..7c972177 100644 --- a/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_fp8_gemm.cu +++ b/examples/55_hopper_mixed_dtype_gemm/55_hopper_int4_fp8_gemm.cu @@ -120,7 +120,15 @@ using namespace cute; /// GEMM kernel configurations ///////////////////////////////////////////////////////////////////////////////////////////////// using MmaType = cutlass::float_e4m3_t; -using QuantType = cutlass::int4b_t; + +// Select quantization type via compile flag for this example +// templatized throughout code to enable instantiating both int4 and e2m1 versions in the same program +#if defined(CUTLASS_MIXED_DTYPE_E2M1) + using QuantType = cutlass::float_e2m1_t; // E2M1 (FP4) +#else + using QuantType = cutlass::int4b_t; // INT4 Two's Complement (default) +#endif + constexpr int TileShapeK = 128 * 8 / sizeof_bits::value; // A matrix configuration @@ -315,6 +323,7 @@ struct Options : MixedDtypeOptions { ///////////////////////////////////////////////////////////////////////////////////////////////// /// Initialize operands to be used in the GEMM and reference GEMM +template void initialize(Options const& options) { auto shape_B = cute::make_shape(options.n, options.k, options.l); @@ -330,7 +339,7 @@ void initialize(Options const& options) { auto layout_B = make_layout(shape_B, stride_B); - auto a_coord = cutlass::make_Coord(options.m * options.l, options.k); + auto a_coord = cutlass::make_Coord(options.m * options.l, options.k); auto b_coord = cutlass::make_Coord(options.k, options.n * options.l); auto c_coord = cutlass::make_Coord(options.m * options.l, options.n); @@ -346,14 +355,15 @@ void initialize(Options const& options) { block_scale_packed.reset(scale_k * options.l * options.n); block_zero.reset(scale_k * options.l * options.n); + // Initialize all base tensors initialize_tensor(block_A, seed + 2022); initialize_tensor(block_B, seed + 2021); - cutlass::unified_encode_int4b(block_B.get(), block_B_modified.get(), block_B.size()); initialize_tensor(block_C, seed + 2020); initialize_scale(block_scale, options); - cutlass::pack_scale_fp8(block_scale.get(), block_scale_packed.get(), block_scale.size()); + cutlass::pack_scale_fp8(block_scale.get(), block_scale_packed.get(), block_scale.size()); initialize_zero(block_zero, options); + // Compute dequantized reference for validation BEFORE formatting block_B auto shape_scale_zero = cute::make_shape(options.n, scale_k, options.l); stride_S = cutlass::make_cute_packed_stride(StrideS{}, cute::make_shape(options.n, scale_k, options.l)); stride_S_ref = cutlass::make_cute_packed_stride(StrideS_ref{}, cute::make_shape(options.n, scale_k, options.l)); @@ -362,6 +372,28 @@ void initialize(Options const& options) { cudaStream_t stream = cudaStreamDefault; cutlass::dequantize(block_B_dq.get(), block_B.get(), layout_B, block_scale.get(), block_zero.get(), layout_scale_zero, options.g, stream); + // Format B to separate buffer, preserving original block_B in case + // it's needed by the application. + + #ifdef CUTLASS_MIXED_DTYPE_E2M1 + // E2M1: Copy to formatting buffer + cutlass::device_memory::copy_device_to_device(block_B_modified.get(), block_B.get(), block_B.size()); + #else + // INT4: Encode to formatting buffer + cutlass::unified_encode_int4b(block_B.get(), block_B_modified.get(), block_B.size()); + #endif + + + // original code + // if constexpr (cutlass::platform::is_floating_point::value || + // cute::is_same_v) { + // // E2M1: Copy to formatting buffer + // cutlass::device_memory::copy_device_to_device(block_B_modified.get(), block_B.get(), block_B.size()); + // } else { + // // INT4: Encode to formatting buffer + // cutlass::unified_encode_int4b(block_B.get(), block_B_modified.get(), block_B.size()); + // } + if (options.shuffle) { // Repeat the reorder layout atom to tile the whole tensor shape layout_B_reordered = cute::tile_to_shape(LayoutAtomQuant{}, shape_B); @@ -464,7 +496,7 @@ bool verify(Options const& options) { template int run(Options &options) { - initialize(options); + initialize(options); // Instantiate CUTLASS kernel depending on templates Gemm gemm; diff --git a/examples/60_cutlass_import/CMakeLists.txt b/examples/60_cutlass_import/CMakeLists.txt index 6a3acb98..b8d74e34 100644 --- a/examples/60_cutlass_import/CMakeLists.txt +++ b/examples/60_cutlass_import/CMakeLists.txt @@ -54,7 +54,7 @@ target_sources(example PRIVATE main.cpp) target_include_directories( example - PRIVATE + SYSTEM PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} ) diff --git a/examples/77_blackwell_fmha/77_blackwell_fmha_gen.cu b/examples/77_blackwell_fmha/77_blackwell_fmha_gen.cu index ee7eddec..de8fdb2f 100644 --- a/examples/77_blackwell_fmha/77_blackwell_fmha_gen.cu +++ b/examples/77_blackwell_fmha/77_blackwell_fmha_gen.cu @@ -730,8 +730,8 @@ int main_single(int argc, char const **args) { if (props.major != 10 || (props.minor != 0 && props.minor != 3)) { std::cout - << "This example requires a GPU of NVIDIA's Blackwell Architecture " - << "(compute capability 90) and CUDA 12.0 or greater.\n"; + << "This example requires a GPU of NVIDIA's Blackwell Datacenter-class Architecture " + << "(compute capability 100 or 103) and CUDA 12.0 or greater.\n"; return 0; } diff --git a/examples/77_blackwell_fmha/77_blackwell_mla.cu b/examples/77_blackwell_fmha/77_blackwell_mla.cu index e045ee4c..e1436080 100644 --- a/examples/77_blackwell_fmha/77_blackwell_mla.cu +++ b/examples/77_blackwell_fmha/77_blackwell_mla.cu @@ -75,7 +75,11 @@ struct Options { int split_kv = -1; // number of split along k dim. bool is_var_split_kv = false; int max_split_kv = 16; +#ifdef CPASYNC + int page = 1; +#else int page = -1; +#endif float spread = 0.2f; int iterations = 3; bool verify = false; @@ -260,7 +264,7 @@ struct ExampleResult { /////////////////////////////////////////////////////////////////////////////////////////////////// -#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) +#if (defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) || defined(CUTLASS_ARCH_MMA_SM103_SUPPORTED)) /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -751,7 +755,7 @@ void run_mla(Options const & options, cutlass::KernelHardwareInfo const& hw_info /////////////////////////////////////////////////////////////////////////////////////////////////// -#endif // defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) +#endif // defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) || defined(CUTLASS_ARCH_MMA_SM103_SUPPORTED) /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -796,7 +800,7 @@ int main_single(int argc, char const **args) { return -1; } -#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) +#if (defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) || defined(CUTLASS_ARCH_MMA_SM103_SUPPORTED)) // // Run examples diff --git a/examples/77_blackwell_fmha/CMakeLists.txt b/examples/77_blackwell_fmha/CMakeLists.txt index e3fb2096..799cf4ab 100644 --- a/examples/77_blackwell_fmha/CMakeLists.txt +++ b/examples/77_blackwell_fmha/CMakeLists.txt @@ -112,7 +112,7 @@ set(TEST_MLA_FUSE_REDUCTION --b=1 --k=4096 --split_kv=8 --page=128 --fuse_reduct set(TEST_MLA_LARGE_SPLIT_KV --verify --split_kv=20 --page=128) -if(NOT WIN32 AND (NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND (CUTLASS_NVCC_ARCHS MATCHES 100a)) +if(NOT WIN32 AND (NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND (CUTLASS_NVCC_ARCHS MATCHES 100a OR CUTLASS_NVCC_ARCHS MATCHES 103a)) foreach(PREC fp8 fp16) string(TOUPPER "${PREC}" PREC_MACRO) diff --git a/examples/77_blackwell_fmha/README.md b/examples/77_blackwell_fmha/README.md index 4db02983..06062b54 100644 --- a/examples/77_blackwell_fmha/README.md +++ b/examples/77_blackwell_fmha/README.md @@ -69,6 +69,8 @@ For detailed information on how to invoke them, check out either the tests in `C * 4.3.0: For variable sequence length, the code requires a batch of valid (but never used) padding memory ahead of the first output batch. No padding is needed for the input tensor, but it requires that the input tensor contain no NaN or Inf values. Note that users should set `total_length` to the `problem_shape`. +* 4.4.0: Added support for Blackwell Ultra (Sm103). + # Copyright Copyright (c) 2017 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. diff --git a/examples/77_blackwell_fmha/kernel/fmha_kernel_bwd_convert.hpp b/examples/77_blackwell_fmha/kernel/fmha_kernel_bwd_convert.hpp index 263a23b4..b5c6a7ce 100644 --- a/examples/77_blackwell_fmha/kernel/fmha_kernel_bwd_convert.hpp +++ b/examples/77_blackwell_fmha/kernel/fmha_kernel_bwd_convert.hpp @@ -69,7 +69,7 @@ struct FmhaKernelBwdConvert { static const int MinBlocksPerMultiprocessor = 1; static const int MaxThreadsPerBlock = 128; - using ArchTag = cutlass::arch::Sm90; + using ArchTag = cutlass::arch::Sm100; static const int kBlockSeq = 8; diff --git a/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_kernel_tma_warpspecialized.hpp b/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_kernel_tma_warpspecialized.hpp index d916f6e5..d6efb2ec 100644 --- a/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_kernel_tma_warpspecialized.hpp +++ b/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_kernel_tma_warpspecialized.hpp @@ -1508,7 +1508,8 @@ struct Sm100FmhaBwdKernelTmaWarpSpecialized { CUTLASS_DEVICE void operator()(Params const& params, char* smem) { -#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED)) +#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) && \ + ! defined(CUTLASS_ARCH_MMA_SM103A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM103F_ENABLED)) CUTE_INVALID_CONTROL_PATH("ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting.\n"); #else int warp_idx = cutlass::canonical_warp_idx_sync(); diff --git a/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_mla_kernel_tma_warpspecialized.hpp b/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_mla_kernel_tma_warpspecialized.hpp index be3ec8e7..0e63dce1 100644 --- a/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_mla_kernel_tma_warpspecialized.hpp +++ b/examples/77_blackwell_fmha/kernel/sm100_fmha_bwd_mla_kernel_tma_warpspecialized.hpp @@ -1480,7 +1480,8 @@ struct Sm100FmhaBwdMlaKernelTmaWarpSpecialized { CUTLASS_DEVICE void operator()(Params const& params, char* smem) { -#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED)) +#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) && \ + ! defined(CUTLASS_ARCH_MMA_SM103A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM103F_ENABLED)) CUTE_INVALID_CONTROL_PATH("ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting.\n"); #else int warp_idx = cutlass::canonical_warp_idx_sync(); diff --git a/examples/77_blackwell_fmha/kernel/sm100_fmha_fwd_kernel_tma_warpspecialized.hpp b/examples/77_blackwell_fmha/kernel/sm100_fmha_fwd_kernel_tma_warpspecialized.hpp index da20e7dd..b40438d8 100644 --- a/examples/77_blackwell_fmha/kernel/sm100_fmha_fwd_kernel_tma_warpspecialized.hpp +++ b/examples/77_blackwell_fmha/kernel/sm100_fmha_fwd_kernel_tma_warpspecialized.hpp @@ -251,7 +251,8 @@ struct Sm100FmhaFwdKernelTmaWarpspecialized { } CUTLASS_DEVICE void operator()(const Params ¶ms, char* smem) { -#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED)) +#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) && \ + ! defined(CUTLASS_ARCH_MMA_SM103A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM103F_ENABLED)) CUTE_INVALID_CONTROL_PATH("ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting.\n"); #else diff --git a/examples/77_blackwell_fmha/kernel/sm100_fmha_gen_kernel_warpspecialized.hpp b/examples/77_blackwell_fmha/kernel/sm100_fmha_gen_kernel_warpspecialized.hpp index 5fc99444..bbb1b58d 100644 --- a/examples/77_blackwell_fmha/kernel/sm100_fmha_gen_kernel_warpspecialized.hpp +++ b/examples/77_blackwell_fmha/kernel/sm100_fmha_gen_kernel_warpspecialized.hpp @@ -247,7 +247,8 @@ struct Sm100FmhaGenKernelWarpspecialized { } CUTLASS_DEVICE void operator()(const Params ¶ms, char* smem) { -#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED)) +#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) && \ + ! defined(CUTLASS_ARCH_MMA_SM103A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM103F_ENABLED)) CUTE_INVALID_CONTROL_PATH("ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting.\n"); #else diff --git a/examples/77_blackwell_fmha/kernel/sm100_fmha_mla_tma_warpspecialized.hpp b/examples/77_blackwell_fmha/kernel/sm100_fmha_mla_tma_warpspecialized.hpp index 1f51b5d3..083062f5 100644 --- a/examples/77_blackwell_fmha/kernel/sm100_fmha_mla_tma_warpspecialized.hpp +++ b/examples/77_blackwell_fmha/kernel/sm100_fmha_mla_tma_warpspecialized.hpp @@ -507,7 +507,8 @@ struct Sm100FmhaMlaKernelTmaWarpspecialized { CUTLASS_DEVICE void operator()(Params const& params, char* smem_raw) { -#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED)) +#if (! defined(CUTLASS_ARCH_MMA_SM100A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) && \ + ! defined(CUTLASS_ARCH_MMA_SM103A_ENABLED) && ! defined(CUTLASS_ARCH_MMA_SM103F_ENABLED)) CUTE_INVALID_CONTROL_PATH("ERROR : Arch conditional MMA instruction used without targeting appropriate compute capability. Aborting.\n"); #else diff --git a/examples/81_blackwell_gemm_blockwise/README.md b/examples/81_blackwell_gemm_blockwise/README.md index f42faec0..b5af130e 100644 --- a/examples/81_blackwell_gemm_blockwise/README.md +++ b/examples/81_blackwell_gemm_blockwise/README.md @@ -50,7 +50,7 @@ To determine the most performance Blockwise/Groupwise GEMM or Grouped GEMM kerne All Blockwise/Groupwise GEMMs and Group GEMMs with `f32` scaling of `e4m3` or runtime `f8` types can be selected by selecting a subset of kernels when configuring with CMake by passing: -`-DCUTLASS_LIBRARY_KERNELS="cutlass3x*f32xe4m3_*f32xe4m3*,cutlass3x*f32xf8_*f32xf8*"` (you can further reduce the amount of kernels generated by specifying the SFA and SFB scale granularities e.g., `cutlass3x*1x128f32xe4m3_*128x128f32xe4m3*`). +`-DCUTLASS_LIBRARY_KERNELS="cutlass3x*f32xe4m3_*f32xe4m3*,cutlass3x*f32xf8_*f32xf8*"` you can further reduce the amount of kernels generated by specifying the SFA and SFB scale granularities e.g., `cutlass3x*1x128f32xe4m3_*128x128f32xe4m3*`). The simplest way to use the profiler is to pass `m`, `n`, and `k` as well as your `scale_vec_size_m`, `scale_vec_size_n`, and `scale_vec_size_k`. Passing `enable-best-kernel-for-fixed-shape` will do some autotuning diff --git a/examples/89_sm103_fp4_ultra_gemm/89_sm103_fp4_ultra_gemm.cu b/examples/89_sm103_fp4_ultra_gemm/89_sm103_fp4_ultra_gemm.cu index 29062d8f..76ac2e88 100644 --- a/examples/89_sm103_fp4_ultra_gemm/89_sm103_fp4_ultra_gemm.cu +++ b/examples/89_sm103_fp4_ultra_gemm/89_sm103_fp4_ultra_gemm.cu @@ -32,7 +32,7 @@ /*! \file \brief A GEMM example using CUTLASS for the NVIDIA Blackwell SM103 architecture. - This example demonstrates a simple way to instantiate and run a blockscaled 3xFP4 GEMM on the NVIDIA Blackwell SM103 architecture. + This example demonstrates a simple way to instantiate and run a blockscaled ultra FP4 GEMM on the NVIDIA Blackwell SM103 architecture. Usage: @@ -269,7 +269,7 @@ struct Options { std::ostream & print_usage(std::ostream &out) const { out << "89_sm103_fp4_ultra_gemm\n\n" - << " Sm103 3xFP4 GEMM using a Warp Specialized kernel.\n\n" + << " Sm103 ultra FP4 GEMM using a Warp Specialized kernel.\n\n" << "Options:\n\n" << " --help If specified, displays this usage statement\n\n" << " --m= Sets the M extent of the GEMM\n" diff --git a/examples/90_sm103_fp4_ultra_grouped_gemm/90_sm103_fp4_ultra_grouped_gemm.cu b/examples/90_sm103_fp4_ultra_grouped_gemm/90_sm103_fp4_ultra_grouped_gemm.cu index 89850d4b..2067c45c 100644 --- a/examples/90_sm103_fp4_ultra_grouped_gemm/90_sm103_fp4_ultra_grouped_gemm.cu +++ b/examples/90_sm103_fp4_ultra_grouped_gemm/90_sm103_fp4_ultra_grouped_gemm.cu @@ -441,7 +441,7 @@ struct Options { std::ostream & print_usage(std::ostream &out) const { out << "90_sm103_fp4_ultra_grouped_gemm\n\n" - << " Sm103 3xFP4 Grouped GEMM using a Warp Specialized kernel.\n\n" + << " Sm103 ultra FP4 Grouped GEMM using a Warp Specialized kernel.\n\n" << "Options:\n\n" << " --help If specified, displays this usage statement\n\n" << " --m= Sets the M extent of the GEMM for all groups\n" @@ -963,7 +963,7 @@ int run(Options &options, bool host_problem_shapes_available = true) int main(int argc, char const **args) { std::cout << "\n====================================================" << std::endl; - std::cout << "CUTLASS 3.0 Grouped GEMM Example - 3xfp4 Block Scaled" << std::endl; + std::cout << "CUTLASS 3.0 Grouped GEMM Example - ultra fp4 Block Scaled" << std::endl; std::cout << "====================================================" << std::endl; // CUTLASS must be compiled with CUDA 12.9 Toolkit to run this example diff --git a/examples/93_blackwell_low_latency_gqa/CMakeLists.txt b/examples/93_blackwell_low_latency_gqa/CMakeLists.txt new file mode 100644 index 00000000..8f708db1 --- /dev/null +++ b/examples/93_blackwell_low_latency_gqa/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) 2014 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if (NOT MSVC AND CUTLASS_NVCC_ARCHS MATCHES "100a|100f|103a|103f") + +cutlass_example_add_executable( + 93_blackwell_low_latency_gqa + tgv_gqa.cu +) + +endif() diff --git a/examples/93_blackwell_low_latency_gqa/figures/acc2.png b/examples/93_blackwell_low_latency_gqa/figures/acc2.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e1490f9fab11788e022649029e43ea7271c965 GIT binary patch literal 989344 zcmeEuby!u~_BJUgE!`?95(XX8of6U=(j}V)0i{EbkZvR;q#G$I1p(>q*z~6P=Jwum z?>YDP`Q7t8-@iYe2lry{wbq_%%rVD!$2;C>h_a&8ZA@}Z1O$ZJGScFz2ncBB2nZ z=APqryS^Ao@*U)LTb<=c_%?N>YK2pXAyRrziI{MEh&&;#pWYSeNd}?|;+^O-q`El5 zJ9lsl$t-X5XJ=4?E1Fg_ew#^@p-5TH7KP=44GbV`c=i4|e#L-u0|YCQWP z@R6YGjh56cs=!*=kVnsJWkN=tpUS2y=wg#BG9pBeo_W2vg+M+NZLxyIm4QPgiIs9s zv>e4)IN00CnGuUF4XgZimA~`w`}6H88W*nXyricEy=xZO#_A8egD7d^<(yAPZiZYg zq3@EjNfSHBHIC(9NQZNoC)O}d#CF7KQ7z)Ws|uD5{){N%SpI29KO`wBG#c_=@a5fT zXQM#`!bQ%56fJ#Wn!C$rfzNEv9qaEg(l^fKap+OzRQaEY^?h+~ z>|yA}?)QA8*R^tVICNGaL=$&DM>Mfd`Cce5m3i@a%Onyt$uR^^jSi=Wgi&0i7|}6M zfd6Un978T`ECr|GU9~SvCgpxw4DV1bijK;MU0x{5w_FYCo{4P#43Xz#&!RCH=nKbE zS;6$ApNE~{nzYqR5GY>yMM?`j^r9usWTI8R!>>pzvuL6&P|7%P7^M=?xs$`Ia&=PM z!o;Z6oBWKDaVUz4G&voOBwv<>{oSfW=f}%0eU+z~DlEQxO|+B_&kzg|QH!k%xq6Tm z$4bv1Lh?5;ki2M-$wW{n&y)P|L%anEAQ7mj^GdUwz^RdWLwy-{CJ05eCx| zBSG`&-Yo*;V7f1~S!{NG7xVfMp2qXG&G1UcD1V;jDZ(^@N%SamZuFf%{@5=;6?FQM zs5{ES1;WBs!mDUCuRoO53h&+?&Ey*Va@!Ai7in!_zS+TCv&ZS;O2a(piTH&*{^efa z`3{pJQ5;wJqEtBe z8vLFZ9s31Qb(4Q0-Yy`(Ev;qrX0)Y*F{~`3((Rk$TB1iayUkJ*jQt+QH2B6R{NMpYX%%LX>Mp2=C6muqxQ9-~g zRZTnEBecxnL{R5fMdud%R+{mE{4CJ8fUhusJX2#`IxfQL8^>duR6p|!wQoo+i1kEl zVyxfwEU7#QngVAn23rWke6y0Wt}LXyq0K9bk+-*dE71(;)q z=*;-c$jm5mW1NzPpPk8%W@)Q6eRTZsU{l~F+2?qVHy%;vk_rj~@&jUQ+6u)_HB01e z%O>4FzkNwF`gwHcN8Kj#CgySOCjSqmf;kmmvFz`~mOfRc+SInpB_Cdep7@n3 zXdA(M+5f%ZTfs$ofl~Q4u zPh?qDSv9Rg#uQ7iw1+;+OlnN}Pm1oKPU?JCvJy5o#CE=wKxf!*VPleFqp zd%<^~ufbK@wcho!tDXy?Oa6w&I`ycng|R#6{DEog&yL}O&ge9U~`JjmR$e>YieU}AM+wP+xDpn*;P zL6>%aRYCdbz&qpK>i#NSYxlu}ruU!KvqnXWJc`!FJjMjJkhaLTJfA+MFi2*8`u^#- zZAi7vl+D!bYRzqBe$58?2F!-OlY*w?rk_3m-c#u9=u!CZ@ZaCH<1OHKpgf>@NlDGe zMb$xtMYTm`5Lrc%4{P+uN=@`g>Yq0FxH`MV){WM?*6Y;f*O$4qbdDKGl_z`}^28Ik z6kLTocK14RIqW~2hMpxP1ZY-|E0(R96n6)A*-#w*oa#@8Hgz`4yj_XitenW78UK+0 z)!De{8JbpFubF|8b;rkcPIS6&K$qDMg_m#Awt7=L1@Zk*QP7Ccs&2hR>q3i16GG?0 z`ifqNv5E8Qb{f7HeIOnIaRvP{@lY`1y!v6i*o>G(P#TUJZrE*BTu&l9l80FKlwpy# zsTy8xH=*~T%ZPj53tpBe4Q-?`qk3|GQ~EI{A4@&`xmABbViMqC;3ub91)amPaZT%J;|>=lg%({!Ee zUhW!&RNvEa@~GHfwu+s~IT@z6x*!^2w$5|uYd4)*3HEy3NT-B$yhy?U{% zx$K+xf#bOKaf#JCE4GoHJodEfV%mcF1hP}?w(!-Yyhm#TUOZustov+CUrlbW@~%1) z_irRp2-Li!cGW*=G{8#5)Ff_BP3LKG^#A_44vYGR=u%A~Mlz;&eN410D4BR6>`Rz7 zNtAx0-F}U+(S9dE{=4CK>~bh_53dC_*DBII6Y|(?^;WBGmYf!ydJmFWy)>Vf{Lp^! z>0rOGyl7LSQiG(-r@?&q16J_grI~c#g$q$UNZ>?{Rb3xuJ3q`QIr}q zUSHi>cvD1i^>oaRYw~%;#)$d;>Xgpwnjh-g>hX5>?FQz~U3A*3om)Qnew?-Y)MR=w zPW6szN1anWzi6hY$c=ngS0iAI=_Q|A?sk0zzoDC0iP%oOV87sf&o=$eS>co1-G(}0 z8{b336aUG8c(idEV@j4%vCX`3*Kv!n8t!{fs;F=Tr>ECPA?v|QF;oh93U{PjqaN~0 z3Rcf+LHA!T2{Ps|)+?H)cufm@Jlp-~m|vP6DKz83u-$)F`OHEobt#44XZFHt1a%1O zEqev~n1NHn^YO(=r*+M71KiK`pU3oGwM;v7F3FlqC03hgdY7d&5`-F=U} zrA52G+tsb{UDKv_({jXhGL^mF>{FQdu>d6DV)yW35%-*?P^dyU?IP}UV`A;2fwaNb z=1CvhOX8CqeS16mvN-l7*cGOsh`3x9YoH^mckwLuhgBZQ+pA-XY+~o+*;d? z{FGb5mEo!ln#rbISnrp)(}IvZ`TF=c>=+T07olcaGUf^j2rS?j9RUTA903&^!9Ni~ zr1;mdBq9?6@~`)i5D?y4A)x&897XU7|A_{_@N53@iu~>k0vh;>0Q^ESkp4Iu?K}hd zk7E>b@EO80H8B|(@Tz9wWM*dPY-#UOxaj^7yn*2${lXamf%rcB7g0v_-X6IBPpjuz zE?Nrmd?xm`4~CA4HJ;*BN}^82&apJ?*bk zT&xA@wG@*pWiG=o_E`!KDK5clng9AZ9i%#I0pU*So;dLYM;V|C%)+%okP}cfmwbT8S$?2d}`*;6F%@z&}j? zcm>C3FWDYFDilUQ5J8X;fA$=LxZQ-&=&E*g+QKxaN|%Y3WPwS?rIZu`d7jsw^frtB zQB3CZ=c}BiOwPzz=t+0DPVhu6-`%=>apPWQuyqL&9I6|sTf+;1v+jkV+@nRrkQPBAi1zz`AL>0bWVv&t_g(3!>VH4^*WIEq3fA3d|IWSP zr`HGjg2kT=Oj|i)b9UHOR}6(A^**R_&=o2$Z84W>&uhgyo2^<~!e;xgQy8r*DqxE7#lJYL{iR>F>np2Vb#ZcB^ufqXu{f9$azm0B^ zN#F@pb`g}=|2-y-YxK)qx0b%p>uze#2dt;QdjT{#sKi=^mwE-7e;WH=*J3y(2#ndU zXJX;jB%MQ{_S$PZx|q8WVyo=u+DL_ZS$ud|_^}Iy>gl=^?`PsZ{c7iv!Oz1X;q)q7Y3^BwiMC~C(3`8qwBN4AL{bpQl)`;ZSm34(C-t}Y-qP7v&yE@ly}qNN z)zjyuRx)E_k4eyq#9s3a}p#xA-7&x?{j(i^1FOs_XLXMo}k0A`i{)L6ZvaBU>KKo$?IX9PU!V|GHQS0~PwTyNBPNBXx$<*%4F)q+1*s3Ke z6ErW${DY&Tt-iPt(vtTBSmWf_4d-k~*LO|vNa35ap^Y`+8~5|6x$F2beb1f89oUbm zN^OvQ_}mYct9I+R^15k!1=#AA-)$W9u@BK*GSXtQzxcQJ{naR>w?Mvli&&`s%jQh} z3HpE+IY?-czd0Xo89o|ON`Kh6*M0;J@(Gm$IN9pgv#d5h=2Kg$n;5q+rh9Rfv|OKW zgfOP{?6{9N%)Ym4*r~4Sp$`iWIl28ApG4Q;8QE-phd4!^g}}!b+m*PV zCmkIdP26=|OqS^NeXowI*3vxl(yz8HHY(GvY$jh8l^h5bmWwsI?|dE~?xL_y*=;-= zJOY;Dzgm|PmSrt#tmtCD2?%`c+i{z_AJ&2Ed)l$VKX;}Gcm6GO?>{-?U!6=k!xlX8 zl;oN}d}byY9p=1Yxh9dk3^Ohx3K&7;sAVr2=b5FbT%S+c*31ltKN?KDv0oeNV{b|E zIW96VL#3SU^*tX+cjCFy)OWvswIAi%FI(?qhkg6!TY+Kz-C7fEul>#`)v;7CkPR$@ zQ&EroP7>!>5-mf2ml@abh-8P+t>Q|>`m@#KN~124mebBEX!8Yp%0H&=l5uzQ#5d%# z?tc?L?0;0*o>WDie%5a>{GhUb_yFmYjU+oh$s&!H^%5-A1?mg9<<5j8g3oK3c5Hdy zp}}zaZtm`V6T{6_;GTJGgdl-_^JtLgZWGiSN*MJUPrXO$ABhK&BYwCBJy^kphA7Gf zz86z-irrLhx*Bh?A=c^|x{jUOGs4PHrMPoQRF>AF>yRKU=Piv7&(#&w7pfxo)k}8b zZVV=E@&M}7}l!h5T4lnMJYq^+t z3~f9-`H72rEQZ5-FQ(cE1QbQ_x^*^Dktk%w9$~i`SIzU&Zs9ZrrL>gW52SmI3!^ZG z&-C+t;~J8Fz!La=+syDZAu?}maG}k2^3$YJHT(v{)%y#+)V;hf_ zaONw7pV#m{-+uPv2JY+(P-ZLdO2+&_Kk>blN>(rR9o`Ce^JXTUG8YC0aXw)$4NRobv>NeSLIsH`~8iB-H&nl$FxW zfq*I$YSrk-4B20_4a-XRa6eX8-hK31uyn-YRSH zk(2NhR6sSl#1+_UeGI}1_nUE(D8cxrla|?mhy<`o9lN^wY|W>O0rmEeSt#=DH$UD! znRXuXnuEX^<^&bX#`=E0R^ad^hGF*%L=g-rgs2PK>Inw#n~OOmcnCQ-CcH&)|An&; z40vf@$lhS!Vt$J2*o%oJ8dN?^-nf^?6|G2EIiJV0S%1L}Kt(2*f7L%tiT!jSk?95i zR+T)ma#_&~3{tyv=Moq~G3KFRBU4R}S~I{VdGH8iatPH_>5MT+`|s@ z-vhrmU>VLy&Zlw!%Lt>`wOpMPuXiV>A4J%D-L(Z-QZUYZ<>eN2hSwWHdbbRL{j_=+gtx&Od-IYx@$23p=ty#eyT&dU`h-Oa0tF9dS;MAL?ZZ!ULex7Ins zZ>ypkZu<|z5!1Tm)xdk+_y*4hCZ9x2@qE&WvV4lGhGjPf?0uZ0O0PkXixs@_1-Wl! zNXPx!zPyuoW74`z;RXbfVR&q-8r9HQxp*EGI(hom`39a3VI^+Ohp7{Z<{aN8c<#ff zOLx*dcYD99NK;j;ez0D(WE>culq5v+LhsV^gf_X+kA7WvOOtj2?y3@n#5Ld5ko}v0 zbdO^d)bTWjdZx%AINLG$snST0&0a!+(m^PEvG8NF{-;IVO1w2BGL|HH5B8{^LrlXb zlZRgZ0>H@Y6f6oD_@NKIB}A5P|cZ@%1^EPT)~@IH2#vaMNJ$74F@Jg2P^ zx<$w2Dts|9wCb>#s%pmvw<!xQ<&n2x;yDb2B~@Jk`7D_`t4J_oVsInG0Z-1%9jTLw2DvI88NK|*`r z4c_m^m*Fs_E0MNGy^9!*6YR7Y0r%w}&p2L!VqjcNCWG%IFPVEj0ps zpmq#Gby3aC)VV-7dLb%_?k7w$U7;b6`&AvAGJlqdlEn*S-SuM;^{i39(c)!l3@cK8 z`czBbdEkjUgfj|qXekwlR7OuFCUNs-+$mcx^Gh+Yp38R@qC|D3W7g}nJ89SIIiP*2 zL)AAU9N*E=^ucY`{ZK0nz>GrWA2pN|;gv9eh}>J0=QWjt&P=1O=;M6vym@#A57o7p zL69gY+Tjp9ov?`BXvPrJMol=CJ>SsT_p{wJKlN21J)evaW4D8yz7dnU#LM?A;fZ-XrK4y@F3L^tjF{5i zlQDEy%{M#rr#kFE4v!>6qOPN_wc&4LllXf?nhO|Uct_@Y?}yvE>No1RtL#zkSkGy6 zA5H)lhgEG?^gX3Vo@Z+S6{Zq?RzuCw#RaAPRg}+B_L)b!AMM&3#>rOTBdKbb^SpAW zwv8|LS!l4_KN_819uDQtUG2KLhjp{#!Eus|zvOn}PapFLVw$LfGJ; zh*$90na{oIvc>~hZIg&6s!S4xkPNCEyxPseqT!;l<`2oOJRxX4QLFuYTgAMAyehPB zv?+hhhV=cN=8Iikq;C4K2k%Oo&o|?lnQ%Z}asi=ttpHEQzR8vE`gG|K`kM0y!2TR{ zO}!`isBHm4L~Fb@H~h2vkAjrnNIsSzPL0SaE{Xe}ap8$# zc^%1UJ8lq+w+fC)Ye32OSn|fC)j?)zYy64kMvKZN!p_T|rgxQjctK+XWhZ50_BI61u2fc382JTQ))40OsE_~t(^_ ziw28SUW9E;_#S)T=3v%Zn_eleA4!$&`OvKVC?vxrPO`XqmXO$oUmhi2_ zsTIOkpe?hJ&Xdma=@}EUrT6bOw3#WYIrL8jGd`8JkX{Vjx@VE%D0vKQ{^ZRUP`!_G z9ME-2&oJeck08v7=Y+pmYz#N(;`u129Q;A4VfB#7I$Z zs3?6bv)QteF9qb2ip-hHh*h+bwb`R?m? zVJSNj{;xneYt{)<9+JCId37h3ceVw8wLUXiY`^;Ye2ZIPzV21yjql|W&05NVnBa{_ zlvG>OtjCrabbffOJ+4RiGh$sSOvbAKd8X-7GlB=k8m!tYWg z!$ZJh5!OJPoIp8^f{r&xt#rM3Ury`PBF#NdiT#`6<1OI)W$65Rah75#J?~F4mUY}$ z-aD^fsIrGXDz%DLc-ot}f>EYd`rcdl&A#y0QUG*opFi22nt3%bhY3=Yj7(T=G)WS+$j5uz-HVGa3yZ`yJ_a~ zhf~@@vw*Eh?5D>;?6Fq|LEdAjzE*O#tOWB7QYU}Q?tt$`Zo<>7($q_NkC zQ|wURYb{~@@}a{X_oR`jUI;J>7Px2iqS0H->_mOX(664@ILc|6Ow=C_u3;@LQaXE! zovhRknO2mKW&n5^MZ$XUEm%=`QqK2kL&^8++_+#QJK!SlBV@nzZvqCZ0FLW0*^Sym zWA9Qzmxk?T0n0Ic#|rbSh0R2bn*LSf$}VMJcrM_<${lG~mP`QC@DWG&a*xt+2~JMX zopS~zf%=Esq#$j`2Y60#uzdSI>6JXSXkeJR#Lbg&-4T1si}cH7MnP3AFAyvHHqhaK zVj50)eDqidBKhFU=Y2iYv;gNih0>HSAgA03V1nyBKp{3`sCw!+w8Slg5~E=T3VXX8 zUfN@ke4n=^gDV!l>r}LUxto#YyLeou`2g^o9Ek1f_SF;Sqkz6nz9Yf(R+&80i}8!g zOhc8LLI-kV>3X*g@ro-yD!X>v3kfofINg$JrsS~U2&l?I>{LB>)cC8(kvYy3>yZ2L zmP{+s?0%vZgJk!Y;JJ5ijD7rdg44bq^j) zYFSRo$P>`$76AmMO|h2%qVdL)Ro2Y;cn*pgbe+pErao^v-zXmL~CdA_CANnBl3?1 z;@Z`OY#aBxn2EHQ<7${imGVL8et5M+b0Zx?$QM-cl&$G#nAxcpw=ig7G>sm`TZkd< z1-x`qFf!yQ;A=;ILgmnkxY3TqE}yx)<7mS)Ib2v&`hmXDdr>#@hZ11MBc~u7ve-2>7>4FeNb}7y|u$feu&U z$?fxW60!kR{ak(6^-zz;g$cfv{3c5l!WS<>*YSRFxR}sofxOd);fShCjA~5uht&x$ zZ(Ws})LnFOrA`Z^vA0|vQ~`QSp7W`gdm5Y@rbm)o-PkeAM2TyJHUXaq{MtN_WoCy)h9uaLY z4THEH0~u-xm|KC<_SCkR9q)-|ubJrymOW)j?=4pca?06RFrAFhy`_9dnn2_eJMAml zo93H+dFz~Ip)*}HDSZl*DkHh@I^6rTgGNzF_{t^p2Lf|e*|PN_cc=G4it}JEERx-8 z0gD;i+G#Z95Y#*h@Wo9CYg9c|a8j7&j{V z6Ylo(1ctMPC;sV^LD zHdr@V*o9cxPng-8=Kwd!Ro0%5oG@L0#C}a?o=8`-|I;LDhr8Q-sg-XLIe|fE4NI<6+;&`J#q5%GYbs6e~5|R~L&$<= zm09T=*9!we-#VNvPj_nOnq#7ptMLmdR=CHNiC&bj2mmg?lL^{B^7*{a;ClGwxR0>d zeuxUmD6Oq`j44E zOob0-6Nu1sO$3YG?2nINytd?+0nN1UIkt2y#KQ_W8c9DcYEe^ee5dTIstUi;#roBC zShGsi>#c>?-TPla=jdb;FfMkwOf4NAwO7|&K1EQKwCq;j#Sq4d%r-zj=sBiUu+JSP zFQ{u)9bSRX)pI@9QFXPzRz@?_F2wuAz8}N*LKmsU5aNzgpmA!7AC>n^Y+9jSfaTgc z^a=Neb5%1-u+CGE9y=&Py#{;h;`LrlqzEBfx-NwV6GyAvt}>oQ*rxcSBmN&%FIWo! zw1(@~(fz*)-|&0>wNm-Y4_7!2xaYi_>-W1T)RtZyZ{E#mysn!m?T;cUPg;$g*#+iY0 zktvhB#cs>vgPHvs>91t%jfST_7WrT=p(}FG4~UTp{Ai&*fdQ;R)|XRG`?=$6Ej_(G zUjrI=zlQ$!X2d8`t-= ztp_a?XKlZ61K%d8CpozD`jV63_Y-uv6!>?l)TRS09~}o83kJm~eGqVWYVJNMV7kWW z@b3!S;ssp5$Nc4QAOW5k7jwYad$MXDX7r z(7o${uTKvQ-X>U!z980bJX4hw)OBNC@jk5f5>DJ1N9>=^~b2+}%MetAQY+gfq--LS6W#v$CS%eQj4ezsbg^PM8F zwT+)xc^+)Y+=Hy-*@3YZ_ZD9&-tJ7=~;$a#AeL-}UY zdmc*>+y_DnR_Vg|)Yw`-am~DZO;Y$ysiX?7iHuH004sZV1VB(;aGr8YW0xnIG`oqm+i4cC9EEv=>QmCNh6i(?F0$bMmV<&+xrv&%sFk z-NXorbK|)w_e-$@_u@SMW&rB&%BsRYF)rLi^5nZus#z ztYlK-#H0_JIV$u+<%IS4xZ2>Xd9<1|<&%W_4d^eJ2l?hu_ui5wMV9~Ym|5zCwq3gE z$B^(hXJ>id(zBYuwW@$&ptPNu_xyd}LZ$KD*3T`Zvdwx!s65}H8^<2dVzOpq2 zgka;HwNNzR6MF&>Eo}oQJTBXpsLQkjmfaVu`iO_lh9fI-vktC-)5=3u39r-lrXb&( zw?!}|F_LX6WE68nyklA#7FPJ9mu4)s2^}8bZr3P#yqkk+g4*xWGve}iqNv$xJVK{5 zzj0F*)+}(`u+L{(`CBAg4zwWYT30)xzZ3v>kOFs`=U-zv)p|AtxZ{6qrWS2s+Ucu) zTy=JH;O-qp5T$%h6z4Xe|M}QEdCr-Vx78kiTS^~Fu>g3}?^heAHN)NaCjBQ0!&j|` z_(Vsd=|7idihf%ycfqS=lNx)QBrrsOM+pQaZK4CF-9GDLU0V058XyID41^8S_f(NG zw&C1kC1<;qRsIes1qx-KNj8m5(C?lMbZ_N>TtbRo_{Ibyw>iA(u&MKg4Hij_LoBc4bWrVMDMwO`t`lxBuEe|VL+#C zz~LXfj)4<&!@CX8G&St-1nVO{hFgf;2Vd4L%6=1{69f-CGoo4j{P#T{*Uwicy7}BKq?}I(U|{x=>FFcRfz$u9{&#k$=^=XUtH-Phb)|D zBY-IVo@f3mB(;1CZ2GFeJ^Z&$|JO$|jDst^?(e1jmg@Tx$b}z%!vQwkQ9dO7eSG_i zv09mcuu@odUhsE9s6TA^$Mm_d1Hm3PU68sWL`T!a<7p@kA6S%Sz_Kl9(HszfJ>1ugE7<#$6E>rR+ zX4z1e5JaZZhVii2-$fV6SOn@zC4qhM^F@-D#D@*r6_3|aobv$h^}x1%BM)A9$d$ER zdwc*C!Epbhp_JK!_!?7tU!t4%g}Zw|kCg|P&ivx?ii#^_cVid$lb^sz1kxLnYrx^; zz#sf9sVn{lG=nD}!{Il)zb{!%b|coxO8H;2OP8>J%jF9D#$E@mQhu7p%U?AC>d@m6 z`HAG4DBnvH&{I zr4m@0J<8*Dtsomyzw75u_l9_-^JXs(I&tn*)JBeGuYMF2pm;>^yI|#CE(4dmDZ-_g z^#HA%+tN~B!Sy)sssOIBXKX2wS?bvOW zjn#O51HHLsZvvB{1Q+^_z=<#$FHWFC%aI__dkpV_S^=VTkox0Nh(Dat4HrgY8lwU7 zV;4Zi~A}oWZtRA#C_=aAnpzMiCE1ezX3#a1nt!G3A z#Yy!#0DW#=c9akw1trH#SFAVq)2_;zzOfEaG|nzTQ}!)_&TAj`9ZY8svQ?GaGvX$J zLU_1($}U-1(zX5*L)}jG6ajS^Dbc5g<#1q0ijBCdCw_O~+6Sn=OeK8nyAS(c06F(B zM1A`!5IV-szM|S&6aQET*X)!w?0#5bLl(pnxahUw8v)iU%rGiUQMK91mBvQA)$*TuK(Skya0lz*Up71ONgzn<8oi~8 z54y@7bYDy5hKHYtZ!Vy>(W{>TA84h+HFwLILR#6PyBj3%V$Lc*wW3Ckw>p*0dEVf1 zk))0auCR5!L#XmSDq#sM?K8Nd!a{8RTB|~luJQ3!9ALybTcFTHe;;44MDpPb*o-%9 z1_P=c{!9pHYHuGoz~GTG8Y4plhylY!KrbdP6g$w91k+4(#iS>&5;=5Dl~~uI&1^XuO!Z0M zeWww=T)_2gdeFGex!0Z%Wy=_M)l)kNdh2izw0ZVxeWlqW)b9asEg0p>TOzFZUC_X4 zxj649hR4-)bi{)}L9kU~qR;{8(Bzhps=}3!n4ZWb7A#V=i>J%1C^H@{#cF-6>rA8_ zf@@de)EP@-=ceFviA_l#G@?Ga!{xj11HVtF-rMEfP6dh#mk>xeT9LMBulE}NoD5@% zgQy4KqYr8y*pNkOz4u*VH6S~v{SxX8nt_yYPk6_E1nzx#H}MZ0)IU~^zapMUTO?P4 zJA?kK{tXoyN)R|+Fu$hHBO0@TER_EuLvBA8-VagA0lHjM=`GjEJ-DEr9qb0!$O?PN zlHZr+ML3X6lgo#B3@3Qo{9VbYBj8c0a$E?LGwu=hw1ZgWb!TLceDhH*d+u%UcaQa* z%?sdv@9(mL%@0o|<_$qRviGL)r1IA?VnQ^Pu9 z5qXmm;)(km$MMxq$Wp`zP=v)qAl~w5o;|q$(yY|xiy5dnnIiwJdn)*qR0tY=0MwUK6b~_q+ZaBh4X001M@Tku&vt7;FE|I@@Aq1+{>z>(J_$dEG5NhjY5b>_VQkes zvF&h{?3cp6?);NB4Q^>Gx_O+EC!0Bi!FujV9fg^Lau;Z!< z3Y>gK0>d=$c6c)hohijj_j!M`3b$)mGpq?w^BBY+t~o+}{Cc}qMpvnS#Sg%9C?Ko| z&3ag*x@zb{@e4^;FzF(DvF3CW?=GR9uCV*^dKxU6x&2U)%7rVp1{!cqea8ZU;cRf0 z`p#S8Le{_EfVpZia=}I$3xw~RsLTpM$GjZ+K!rO2*Qmp$;QM06zmXDT%Tv5W_Z?e1 z+5pUE;#C0TJui*DPd$Bi?e*G9K z_Y<<*-Ul+Cq0$uex~EE+&$(rZS{B`X**GOR?tZSJcu?C!x6n!Xfy%gDojGX-H6sls z*Vr!s=-wiH8&Uj~k&WZHp4-ZWu#=9daZd0v{WmtR3W6*-#lML=w)8S2=fGKMsqAMs zy(uX9^yiE4e${OJp`)GZEyv^~{K)N)wUMN-r&lYe)7%vRf#;kX zMaG%Rj+YRY1qpo#NIy$BYax0}(nZeb@prTZiSP47)D)vjQNpt?$Der<&(f#|w!Hi? zHI2);uzSouNq7r0fNxG~inq9?2z^N-2&THkR|kVjZPg#h7I737v^(cvnj}U(77V{% z2%wdw5t}|}&bq4yJ}YVe+EfpE+RnbiXC^&Pv4pOg7-5m+i5{ zF}u%_y=fQ)GMaDfi9jx1W=y3zhP|*bcOvlqjO}otr+2!b><2~YHB0*`Y$|QP0@-?3 z`Hgxer1wGldJ}vFDA?)+ssvWb=vu29WtF9(SqDyrif7cXpTey(9P+3=VVeg$; z#=`s$9(I_(ZpT8PS`eLXyx6No{A^_-QnjP`uoQNB*5?b`s{4A(3(IOj zn5PCB(G$5#I;N%z4zVvDb)%cKPqVLF+Q791ER^YdK6b2>WJr+ke`>&x@X_VI3T$Ap z4t3oN!_YX)VSR8`2)0~hgQpo$(w}YGo!UH|6%y;E8mo%%kh?;jp!YJ4`B8HJL2VH_;p7r^N8($yTiEzJ##-2N zTDrzOt*=Abuqd#3Pi-qciIy9j-mU7uYyE46!8e=@c_%~PA>jed1|?}Z5$)O;W+lWoe_RNy<&RX;3D1y)=+s2wzJ{FJAZ)$jv9qv$Dj%Dw0$ z!&ar1Y90D0SB+9bKm9R!8}*|axgSdahwmQ7yt~J*Y6B$Hqd*J$lK^ul9 zd&vL536JP&kLcYGB1^i*7kc7V{jjz&?;Y#WF!tu36(uvLbO#JXrz`by`;l&@FYJpf zB_&EXor1eni%^VM@IL z{8r4u_OB@n$3T+jQ(hbdh)j@r^BB$RN)Yz~zWvD)WSIw#QhM`J>-? zF(7oYtsZ#4_|s7?+rUn+av<-f7~>@8r0aas>-P?1;}1+f>D!+CWZDV;rY_j1M=xcL z+c#A)XIL#?Tt3K_0(Q8yv9vpC;6JUH1YCYa4UXg!$om9uQW~1ed9)%>N*1?YG}fHp zczP)=*JMQl%s(?l+?@Rr4ugx}E$kt8&>B5#B+gMFRQMi+W)e~% z`6UotZ#uxe$d~@J_R}~fYcf+($V!cx*0_;Nqa#IcNCma!so zmeP$r)j0my`wPY8H)ZsJUfpyA%vIFS%2Ud0s0p&ce-iPJ{|g`=02LO|V@*<3xVT)8 z75Wl&7ql#j;k!y6*x&y!1Q5c+%bM-I*O_8Q?T--5yz;SzSm{}-Ja!%IOrv{(?*=LC zhAF1col8c-=iFo`30?_?^C2?$xUy?dZ;mMP+nyLo_V%~K;9_4{o_5T5479HcaQT(V z>?+vrM^gySDKT>307bib?pguzrZRG(>0JcFisz(UAKP1z*m2q|V^|PZ9?A~Ux3=}2 z0g&38)-7g>`PEDmNwWEnlIgA$k>s1~n(<&5>pr z4{E8d&;x+$%Hig!fH{IUq(}HBxs4oO7SsiX`qsp#u(DkR zurLMmPrb*xPeG-_U)Y7^(20;kN`ogGfme9+R^rbAJC$BU+B6VWjI2cgHc8YWm!1O! zg{?Ts-4gwL?Dixy_D`)ybqa(s--pOaP2L)74bM=8ajBYSF(tZd z&=*nS23g#?btgw{zTP9OE5M7mJH6fXcvQ0tzFpOY5^-(9ZO)rwjd_h#XF0v6fDG*@ z*{M9ztu0u+Aj|iQvL`(p*kmisx1rJ4pp!!i2p>jrtbn$&cUmys;M?9&P#=C^yOyOE zZolB%SQk%oi1U?)z%~0_;wFvE=SI?TuelswKcYs~8q4Zo3ko4REBv~ccBL{%c-xQ% zlkjPK&d89sB`wX}Svm+Tp}JzmFyMBf6t%l4&j$`;*DPr%zxJOiA2e9*+?-joQ~Pyg}4d+AJctPN=iaZ>KPEFbF?aImOOX zK(@OiosRh|!&z^5y0yjWT&f;CD>R*50~<$%Ew*-y1B>t<(HL;TVPgN|`^EG%z)r9w9R74}4#~3Y z;tXLb7SMzkT?WM}=VO^*N>v#zYYb}64YOMpmrK41Ho9E!GTjhDQv1HVuJsQKggYa} zWb?th?#!a*`8^47?H*hb==+zxfr(0-buaPezvG1tyL^`*$^GP_lu4?%a66Tr+b}f5 z(4?iUIV8vy)65N%^^_<+BBDd=dpZu!ydRMYDtWr=A%&Jy=>?I|JmEOy+08Iq-e9~K zXY4e(G@J%m3?WKGWq!bYxJJh#eF1Ip#f*xgzPNo%bN-lNky+qu1XTGcQ^ZJbhzM&X zN2}Pvaa18>%O~BYW&3(HO}t>=i5jGB**b5B&QvZYnM(n*yqol8mpf$3@nnpaquV)X zgAnC0*~5rJH}#{)dPwMUsWpFbbJabyVxq2ijvU9T2r&5`A4ET6nL< zWW3oB-Ulm2+Xz$6$qAm0C;KEsBW)Bhc>c~+=&IF2FdX%klV$qFw-)>zwjgAY-GJcc zL=A1LT%o9aIUrN^!k_n{2|YXllpkNvYhj7yC?eS_BFrPAK?00AUDE$U*;z+bwRUZv zl8#Mx3v8s3ZZ@ePY)}b7LRz}JH{AjP(j_RJ(kTsY3F+?c&Tny^=Xu|AzITi-{vyU; zv(~y}&3n%4`b~;8>pYEDN*pzBe4_aVNN#coqIIr(XmPpSC+v3n;dzQIyj|JZZE%N9 zbeYVx_G)BpLs|M))k&W8ye88%Kst=YSiHJK&y9xObNveg!>bl~WA535Se~l2hPY8^ z$0qAQL0n95u5$Btd|&;H3NbVHqggKan~b8S#f8#hkT5&%@?o{ApZfmL1?$0iEHnr99niiCqf-zVv3Ig810dBozadxarAX3RA4O4j2W2Ypkqf;`5 z=Xz#D9H_Xts_IXvKkivF48Wyv8B0rRMHQ6KDlge*B{c88;Fxyp3 zRs3g?zQOIt@y#l1*V(tflbVE+|L}Kn(67#G#EKw@~ z`lxI!c(kMs0mo8ry^cq7+)bn$PEV%O$P3nvcjxZPzWSBum~3;WK$2PP;QAYP^^#az zcXq2xaen+JzPQt&C2(Ihnwz@V`^#Qf)C(RBKqlqfJ^mxoJ{;JS&mU*ERDb2fB0cQ3bKK zQyg=MBmig0^Ph@ypK&(ODt{G~b*g0;v{A(^I*1P%s(mqNd!+-dEyuH#=8~`t{dyQe#{*HvW!36rM;kzT1H~R^y1z%nWHq!y=k_&&S((@jH)LdNG4vg zTAQPOO$#p{ejo><>0kA0s=M{A^REDoh7^Y5PANQBNg!_>fnmqhaTV+-91Rs(g(-Mu zYQice0A)%FHP}vz%v^dul#x{4NNgY$gE3^)-A}Am&&}oTFhp|jICYsy?V;uB?$HvJ z$x3_GtMH}u%d)RAuULUwFg@Gy7smIdE`y6HFhpWNXA5|6an`TD3aO>i9(v__3$+ZB zitX@(%aH456p88Zcx087uiP1!tO|Jn={9?90hQN0Rt7E5jFYo<#>VhM06H2*73IPW z&%(1HUC7Pif_oXib5@Yp4iI(t6++_y78Ni&#m6VD%zgqF>SicoV2nV=t{3l>OVQD4 zfJr%3|0{H0MnLT7Cj6Rd<^?8a>p(x(L_Z?L-0{Nh!Eb5(aSOToLrggEEE45wFPdsI zkMQ@7n;)&u8n$nesWgH2xT`a80$zu%86Hhn-mMy7M$DqFB)e(yq*&D-Kqc}x&Q98z z?=jhCw>=kb^l+KT2%EFhK90pO9ZY_R;25uK(P}zP^^M~;J<~N=(jGqGL9YLud4F0! zEWC(i>A?Fbl_z2D&!gBW`~T zRYYdCih#xBJ1_qx?jvA|9iW#nG8`UW50UdK6=nZIxd-0cvR3Mk3f=uZ?4tFk5czji zO6me1-5+q}Pz`4})VYioHxJPdY!p|)0b#Hg)z++HyhaOF?gZ6(og_ip1t8V^2GPol zVXDz0vlPU|>Qd}Vs~MY_5D=RvI$X7+8c01{w1wF)o6G>OyFV*8HkTo1^0K@AS6^RX z^?tbla*-wIaMe2V4!tT>GKB0NN{D^Zk36}>2Ou#_S5~#tWA8=gr)dcOw6j0n0;ZY;s$j@0Abd~}Af3s> z%=adads0xB8A1q=Gr!Zw-jCBcb6LP;a>gy9#hmk6kj5Rn+iYC8v%$^Q&miqJfgCMV zwm+7qTHuMEuZ4rFlf6jrl^n0tR@tk$uu+f2%S}w~ym}o!-K+v>@^?Y_y6YfZk+-r? zanB{t5UQ8BFS?GS`yn*|~h`L1^7?jHeC1u!FX zITIHx`(-AEX#rL@GPhYf^t#Gj$rljm;cAmfQ+|1ZpKdd1_owG)ZRzI57e)#>VtkVC zkH&6&eJy3p$6R?)D5qKwlXZ{*lh^>I74%I=&2DTe**C6ANMm{QCi#``aqKXs9(r1T z#6!rZ3;SN2eW@pg)Vgw)KTwrQ#l@l=^pr}=$_)k{4CB(G=ouo-%dVEDEl7+cMqsOs z6L4)`cs)6rp>X;^oT2tUJcPgZb<8bYGSR3+`nMiAhxk7D2+Aa0HS(N%W^=$HRB_pN%(8@_RQ=)xX= zVGCpc8SYe3h2OlrlZduLT6^Xont=$EMwMD(_(eHoJz~CJ=>;?q2j&1e!{)!vyoiXx z3qXEv?iRD`hGyf@5P0&K;4d&2y_i-s)0QJjDE6BNT!AN59~$j`hbHj8&GYG7uvd*b zEt&#ZgMUHNV$7&6IuDoOdq3N7kb~mDy#q^Oh+4wF&H8Q`BWPqIW0D)*vOK-rCMDBh zpE7*fL4Fb;{9IJ=bqh%iZW^-R;TmsOSH7g13q=cL$13~+3a%Ekcj2?m=>&0D-$Qj@ z^RyHuog5CX2=~`$bxR=1T=W#yJkC(E0~B;Y*?Yl`b;5NPX5uYiqp(Q1DM)!jzc!Ug z^>TGw0#LQ05-pe3XCybRfz)7N20qYIjJc|Ep+g-bWW48T#Z|f5U8X=tW#dtJk4Fsm z0==xos{F@-Y#59oLAZX=5Hi_y_+1tFm|sNhiG`9dIrr9)=wz$)(GiuG%KOLmJng9r zPDDMi5`JE~u%FMID>!;KUM}O+_haa*6#7EM)fdc3A#d=Hn_>NtVWzloaym+N${hv- zmEmc-hWM#6S&1&4!J4*DB${5*OOmOvaY0Oi4#5|+*<(Ti zDB{Ap<3RoG^P@C#b=Ej4{Mubc6k~-L(mYFgw<}Ss|6Km6!~u_$egGX`UW;1~#>)5x z?2SP9l3mx~z6=zAQ)eBy_PDvbM-o6v^)7KFsO$OaH9;!a-F9ZW-8rle5`8)fqKkU! zh}@+Zsw5pFvn~KygOh*681$VF<|SM})hfOp1ryq_OdFe7`kJT9IVNMxLC zU@@rH=_wZS0(WJ-$;WWNUsovMiF@>5T6*e?DkDGh`q|(C#)ERQ_jn|1LE*DBM(6hJW9|R?JAjoy!^xDVGImBeqVJ(pdHldSaKOx6}2im16{#DM~ zythX^=uj8uh_Zb57wi(#0B}!vP&#&IfTJ*sM)SHiY zu>ynA*jnI$!Iw-I&Z`xxWh}+sthy|4cVk&yQN!!F8~o!IPC*zg+|qb0zwL=I@kvN% z@fQ>A>_d1@72X7SoaDg1u(i4DwXz}EXNbkZWtw1G1OP_>iZhmCCvol-lDxv*7;vv{ zY`Cy-_R!gBVRekJkUp94`e_od4ZNpu&C6kWf)D2&AY%bhoByTe^S4)_WB&Aq!m>Dy zaC`P7Xxo5@$tewy`*D)N<80Wln?p>cHn&*$M#Hz zD>$nlyibQXz9{X39}$Yy3xdzoWk~E&GpsPRV$Tc(&I_+!8qS7@;Y>_4*wu{3SnE)I z*bPH7(&t7XIczwOrn;^{lH?^X1csa%1yN$bcK1L?(Nr&~v6ewZ{On3s89w21az)HI zH)h#|L-c(N`X1+b7)$TYp%yh!VQwm~`~-c`y(?V>Xowg^r$~*a7m;sMM5*-rS zMIL5P!)3>aV^kgFfK4rJv=A=gHZ;*2NYn5&u zLyZ3f^^qJ%gC;4+N%icGo?@FX0$sFZcRDCzu9&kIj_TOwk9OfLZej$uNd#9Dl*7#s zd$pjP`iVk|L7f*X#Hff@v&934B(}t1F~aPYEl|IW`sX_n9!tJ@W7=GU5n(hMrBP=z z!*$&sF@j#;hP6I&K7fp^(#!zKz1v8Y1~@Zu?@?<`-i`<#%X_%xmqSXmp#a zoNt?{D0Ub6To`tCCbkjf)h+y&VcV6a4R0z_j6;~7PlTnGkpmJf?$9S zR|gOIAhZw>OTQEpWfkl6iD-YcSE=L5H2n8noMy3bZXi4Ip4t)mLtqoZ6*FANSVk=KFqHOJ0E=WC9wz0lfvTrzPzNDTW5p#g zb^8Nm0_7toGvD($(^TtcBisoc{J&`jaXS2R)oj1D{`qXqC;PCZ>-KOmYso1Fw?JmK zG*_)kixrk`bl6&VJbD0XI8(9d9M!)e#Ju(clPrErq5lfwyM+;tI}$;%usBA^Q7KHq z$nxa@BrN8qFjdT$Ab+aq0|{6?8~tJOWbBPuHC8+evxRb6Ut(9@k3X`-_vHQWh(1$^ zCU-pb0RToeux%MBe2q`y2?_ZU%+|09Nc}rWSKEWBAKIbN?T_=k`1z_SlL}7$O=Jd; z{$;;w{O>U0k4l~X>kT4Tl1SB20@GmC=$&q~=J(GttMuIpjN2(Xs7Mr)y9Xu@b|%*k zpqtN!IXieD_eo+YLpQb8v@)0-(!3Zf)W`vpdT7*6&>%!aBvIz&+ioGWm5svO=#P0- zSt`so$a_616=v)PV-O!sb#fv@ts+bIOnN)UQ!RYuIjU~y)hM=wD!B?hltf*&iNU(= zECgl~{e7Oix8NWVwfm$at@9o0M!-&f@sYjLJ7x@nDq;!Y?jMvAsdNPSudsJqCqr*F zw3!MXp1mYnuNXYiVKtomA(7P8M%<b$sUnpfUn@L^>>vZsT6{UU)PW0VBhzWbbP`gGF-aKAx2t?+Ny|0_r6R0(=Dz za3WA49%uJ#j}3i;kdJE|J*KUy-RD~EPj#5rAS>}aAs~l>@jF0|D92PiVI>;z{uAX$ zSXspoB3Jv`6=`c{(xr7JpVtrD4y- zbpvIAgH|KfwAEWI=a>D0*h$TJjZJd3W2c5mBXNw~$@+Q5*^N?xOnt?iWbGr&vW*DE zZSlDwL@kt;s7#+ZfSpcT@skk+USMUYv5w~W^RW6y=VRfIKWNG$(6;A@hU%dc_H!>| zFW5iyz3z$dI6^n57+6h|td;8GlbMG_UdY#v$Pzm$sG$&WD7{311Rrk{%%O+*uM)4bW*D4h~T{lR!pv^N- zm`p+^HO(a`3GJbo}E;hM!5Z#xX`Dv63tZz-7PRp_C_@A|35(TlzrP4Q{F3~(01KhVl0`lU;|Q-yxE099Fx(ofK{>xKpvVwYfAN(v?Nqwg>>Y*&<8 zah}re;3YUk;@y`ejlj>~Zt!U?bws}F99dfPdH4h1>OYc0V9aXZO}-32PMAW3in5l{ae|@1w!JYQLMnMN>JYOc1_&~mWKc&{ zmW0F7k{WoLmcJbSR^S}0ic}PwW!bq!;G5og0R(168O8U!w4`oMJ4Ns8PCoT5sXHoG^dR2TRt3x-jR zE#e?Q6i$;JqT8*=DNmWomaU%uUKyx+HvEFeiP9!F!oPOt&VvQeD7gywJo*X@l<^JJ zq8V_pB-sbtFP|gIPIVcF_96FI;|NUBc_ML784+|LKW3Y(m0xOT83s}9o6(VmDDcIT zGBd!sBp&UOA=#4>0Abca6kVyOs2b6Pp5*(Qub2ads6LmQ66q3p#)vY4LQxw@wsKXE z7$H~jixlYdD?On4PHA1LdJI(-RP`{3@kb6Lo>qmEi{DY*_E*U1xT{|RypH$Kk zu4vF-kZ&lLtNmj5okI1}vs=qTe+w_#mdS6c2#4LY|7ZFF0ZH#!mx3@!JI)>U!edf& z$}bSU*cH*ojcFob`NP0UodNAIRYq8XAjr~`zN;gr+&BU$gC~fW2AKvHi!OlgF@BK> zXb(ECQ-dtun|Jv<`V`Bs5*rG{Tc5-1@_*yqN_-`ENXq=5qSXAj&sR`&n20O4z)PS8QCRuwNk5S zWGnQ?8;Vt5#I#W$bz$5jlI|QdxIPmL!-cjK=v@<~TB zx7%Qy{ixXk?ofz*bY##CnD?D=yxjfIds$OBVcnYIR}il z?4)wRk-Gp}y=*92gY>g3K@+<{H|`d6gp3>RU<4DHh^eTpl^AyswPo$k4_T?}aw;nZCZC zV(^ai?*aTRpUbIvN2bmM*vE5Wt!B$S?}82^oew;kmg{Ypon`slfb{>dG1`(; zl|zbmYT^L+3gby=+gEM->A|nJaM*E?{@q6sIv#1`Pk(fw4665;nj#0OET+nnBIGJz zmRteEFa~6D!69p!-3PZ-Qe@DiK~Usd?g>;vJuuLC#cicqwx0W^Lmjm=aX{K}BV;OS z#H||BC=vwd&EtI;oFir1KarOub$qh>%#z{up(Ui8%s~11I<#Z7^m;jHfh(BaM68lF zqF0?%hrK}uqZHKA-b!Y*m>sk6$}xMPKI!P$#SmxIz-WjsA1>~Kk<9ZezpzD9oc~q zkt9`6y`VMggg@z(d8zkxqkIQLQVo9E3sG+2@lLX_DpP~K;Ew!Kx}|CEaF$yKZ|g_` zOys*9zFf)8=V=VF-sSVgLw<&6mYtRJhSbU*5r`Pm+1-A8>MuKeVpv-*02B?m?=cQ_ zdi-;GXZpPnt{9GqsXU@fLCi6|QD=?Y!FDO#n9R7Y268eiP&RUdin^E+uL& z`B0bhB`UWc6KgFdt^QW^3ZLY&ru@I_>P!(}W_a?!r82VDfEnKV@zGvxSjZoH@}o*M z?Dy-0!+e}G4mgeRgqUc573vB)(dE#S&Y9FkbqhNkr^FA|Hg!pm+ZI%oxf-<+p6}y=#uOtCO6<-M*)}wEWD_AU zg=Yr~Ngyh-9y&I(oaDd&1qB?db}Oiga8%niQ>Rz=nO7|s&zaY7<1LD`v(4EBI`3hI ze9GL*Y;8%nU2D%Ysr2iVNQO%TU0gHzNG-L7=PteVT9PdB(CY%Su(7F%O=-pFlL5qz zFOa2vVl&sLv!61BANvzw%ZAJGZ&6LBPvWiWo_T8x9yJEBbhDy=*?izdUBc8SNgpyw zPN0dmgs@&?VHrefzI-SbGLQC>)~{TYJ<>a8WOz}4^U@qIV)cVlptI2DRg(V}IwE55 z5gP1={-Af9s?_6fe7oLWjFwVHSo5g4FIvY`^=Z+!$WN@ysjHW`HxpN>Zd||qvLja? zNUG<3H~PKBMban=KHHo|nl0IJSMd(8Rkj3c(p$^>KQg9`nNV0;-}Na@;yv-Hy7jj- zj)Gs;>Po(3PN4OYe<)W0TZ~Pj$rv_?rZ(S;wqxaD<>VyRE)IvQJ)XY+1UR&Ec{i}w zIX6n6Ux%S|(XOl6Zv!D?&CSO#lg{A<+Zu0mC_$TJgd+3oN*Iz-v#iF?3XIO2dCZ;qLm9E_go*#bIW&Bm8*Ea@7QeZF7V;9yO}b@fQ=7OmoD1V~q1dr4EpProHy$9gaQR9Kk6@{SrL$Gc_NS-t9<%}x)v zjSCf$L)B<4z4k1{Lng>57^<{6UwMvA+fylRAnMh0C(& zn;S?Wq7$!XlIuqGb>Rjud8!C?YUC%^+iB>XZ(GOzLJVmojhB2OFVdRoSO!$caMY({ zGzk^2YsoY~E=B19EJ`WL2Y_?8dHthRfsGF>`a`nViOwF|EOEa}ad|`{_tJsF%SlH- zvbhSTJA`qKccPDTt4k@$U;41erv}B}+C)oSZ?bl?PV|XqN4ji}rbp3X4LI$a zDz7_`mLKcK$DZYNwq}5q94zchve6~} lt0AbY}^V3<2yf5bvB+5Qlx*~m4dCnJ<`lDv91>-L)^dG z*<)7hLcw;y#^^7uY)9q`l2I3Sks<+*ed(3UBz$mHE_|dKHTen{fsy&x6 z9)1kaxwma;8QlCJrx_2(eGHw+>^ zhQZ|6BQ%)VN-)Q_+082wHVonS;JaiyK2l~;x8~>m#vdldSl2uyjC8oXf~BQWl(}C# z64!ScBR4&X%Flk^f$3koYLndu6ol~csQi*M4w~OX*?;hV@hONHe27@%2p<|zRnABj zBKShnjvN1iSj^JSajuyA#S(|v&SjpO0bVj{^bUl#D)m^8SK*+OH+vA z=1+n(gE|p(M6HTXYfXoKvefh3CKe>wW>xJ% z!#;7qCd8L8uS+P;yCyihz>j@))3+3-51;7!nbGwmf?%Ho&<6(j+R_h@DMa#j`%EQq ztc2SCD!L`Pq++v$*jLi+Ik^K_<|4pjkT;BrQa!u!k9z)Q1j32adi7u;Pq3|kVlz<6 zt|EPUqCFm*H)yGMGrrT~M=oO^#(6|1wq2N8*)Hn1*b-ed!83LNRtL=+Ir(KDDW(Hb z;7)4BP=-vfCDu57F+X=N9RuY}La%uqkMaAd?^()5=|TR^--=qgIx}mK!)dW`f{PaE zUwBjjeEhqf%Hb|M`*J;?TS;7+;o2IrWoG{}?cLL%*3Y(7B+ zf>H1iZz09tTSFp$f{cy3#{ys13C+~*qjl(DN{A)h>$p#R)njNQM`F9(4=d%3J}SkT zk^4Fj1i#mA*Gr-tzaa1R%-GY#vv5ptH2{SiAzBb}i%FqI*;550^xjS`=LH*5%ae<- z42xrLF(D3}gdfY4ag+HD4;2)l7c^$R$Is#>nut&^ zwR}FyJ;fALN8%p-PMQ$zR^?b)$%W@mbC^zqkj378U6F=7AfJO9sbT2Q$Dh>aXrbvH z5kPQY+$0>{L5>Kia%M~`*RbA?_jnJ!O3|X%@_!O9h%K7zhA)n|5?(18jH-+|!+Oe< z!IaNgyDFt%=WmZZ*e4x!h`EHWlknRu2V@i8rzcEe6lt0p>@q#Jz;h_Gg_G&9zs@m# zB%3_RiB13Vo{c%j?e52GU{@_oY|>&E5qWz#M_lGo8rZU-OXddpgbl}m1q`hO2^jtn zSAUYt1Zf3eK&Jb;Xc>31ZQx*@>Snl{?!Za|)<0zu5rN;wD@L zi#OQA81}lWEXD3T2%9BYZ$5AgQozpeDiJzZjoAH;P=iT_RIr=>{Mp~APUQy@-E(AN zZ%eW&nPCzm!gGgM=WeoN+Opq4M|iTgjN7%A029wg zbXjg?18MPhK`*ecdN3L%srp0h!ofnCK<|WEQ->tdd~T9UEoT8zttu_s^WOzA(B+l- zSMw#NMQ^9=9c2aD`YZE3NG<-hnU`hY;8XAfujI9uRQQFUkfh}w>?{zjV`QTlnLNeB zTwVv=SBESh;A4WC%HcdcRHJ00K=tVrzc9NkP!D10G)K-w^dU?q`ei5`q24;hn6cn= z_jcnIU-YmR_hI8x8!R!ciq;#?}Zr!e{?;nxDo?R-E_HYIWYW5_z z7;7*d85Mp`)B@IEh$D}5YFMFk>ebyRn}2H4vq1)>5%|t2J5|x0ZlB>C=}ZW(S1G`~ zI&wHa4bq#&1~0TjR;;Hqo%pufp$JCyqf(1}D_LOXJZ`59@M=PoEY{Oixfe>+3S z7(rM=L=mGzG;{SP*)Zko!k5`km9njrvTt8i(52`6!S`U<1EA=v#bTabq!~4=9X|@V zLA{wF9l~;T*+iIIMB!yb5d%aocZm8&ZoR?YufeLX-KYx={r1!*pbueBTpIu^`v`#Z zNhrcJF|^TyRnmU^V@(TRIef(IFI~+TfKc&SJG=^@@?U|_L{u(1ho~F0^^;IldFk#i zz8%Cc`9qF)mpkKohzQUbVf3*vzz4+4R=h4?EgP6p$WyQ$^QhQU(c10$qtPUHH1Ns^ zoe_0EVNE#VxY#?8DP<9RqV5(_0D6}PieA-JR=*KTuq^PVfBFJnp8F9Y@1Az*4n=Ft zlO$uI_v)+Rm1pEK#gu`eC}7?Z>pj161qru|08Y*?SL!jfsuf z0s!egG%J9|#1=EiW58PmBcn$iW;8G{?NDHNAA8h(7j%U50H_f-7aTwE#P>kRI#%ub z>SEsDy6-AD#S&%Qd)KnV?5`S(@Dmo>AMm^ACi=**IzLOq&~7KieP@tMh$jkW2or!I zzPf*fSECp6Hy#YYKk4Wc3rf;|wE6O)k4NLDvpotJ+^u;kwjyW$RCPbP*j|%GZq&%< z$txPd;yS(=tWqrfB^Y-~MsR4dYfy}96qidFB9d3VY9YCrf1RhjcQ{pC%7rAh(do}5 z=aj-OiM`TtdmB^8jiH?)hm`vQpr4qJT+BWOcGq-%yy1ORkN^fg^Lc7HcC3j*S=FVA zFM$0rg-Cc!-3_JSux+nG6tn5@iz;}HLI3@VDA7H5wqvLEi2UUmx^%KWK6CStd%=8` zA|S4KUiIm-2#H0LM`ys+$f(YqRKN&3{*j<)9h+DY*CS5(BF&+nwSKOd zHRKytQ{u@I{<-84M0-xZJ(kfy*rbbJp0xSTg1$JojAuC%bT<{t*fGMAFtoIn3ALHf zAM2_aX*sM_S(-{00J0KRyMCX%i-}8FN1hsYqF-jY%>x?gV>cR0>wH=R>Nt_(13bp) z!)Zl)6UHOT&O^qI3X>q$M(??AmYmilloDezup>EG3tV22-INEQZ!Kr{+LaEJsNR|tEbq%I8dGOcopnc4MML{cHH zHUiLk`*oT)`6?@mlA7_CfGaaV-h^=iC*vC_fDiFRT)QUIH6p=?K+emR_z+I&tPBMc){{fj<2H;aRH!MpVedV=VF5 zIl_vMo2p+(Z1$+QYdHfb0?r@cOGrFOetyXETL3x{RSu)<{WL%{dA{55%|J0ACxu5t zPYcs%mK#uYm_9kx(u95JYXWLi1--4wC0``3`czHnXS7HPiJ4rdcug;(aC#1`>be={ zFWvfg0YcD}sKki3agk{xJNpBz=L90{+eDw%>K6y%c_BoKQXZrz`Jt0L)9)v0F7_LI zXTIxLH*W90Yp*;H$9WRR&>SC&0-?izozBlZhziaw4GpHE5S1Uk_gx)o@?79B`>@{Z z`O8&8S_%Y0K|%b_mqjfZ1RE{7cb{75k8BR=USB`dh`M?+(r&QloeM>rMQaCG5ywoHgfP2!J(gOH{k zob7O8wl^M#vL&51n6y(W`9K7eSxAIbMun(%2aV+>d`C@^g7p}y=ONkCHe zGh-r>`g=e2o?r^ADf=ppwO)Dze&L*i!v`K+X%+FaH)n$2=g&`iah{1|A^mmL=>Pd5 z`5FZ@g%>BGXexHFoMPM^NiI1$buUs7WOf!sDL4{{C!q-NsPY+Z;=&IANV29hLF=!# z1K0bJ({-pxUWHZ* zO!vtQVeEKL-pZic0rrxji(jFRR$^^Fl*3!)Gy!Wava%@BN4QEmx%ls~5oKIlYWwwL zoRE7B-T1o2sc83r4pquPH@QOf(VSL5P!VL)u*GcBY;&uN+oLt2uz)Tl?Fm@w!Gc&; zy9f_}R{dqYI#qF^*8-zr2|1FTzn}H244!yi&h?QiS|;+m4D6}gKc>)M6Usj~3gKMD zVD4clg!a2wzoM%f0EsTDc2e-<{ega7)i0vV#%AmC#tcs4>6 zfFS#aq2GPHSX;qu)u_s|j_%RFeA>s7sdd85@Np4fcoQnMWiD!dxH;c*0+7GI`xDs` zgCuoXV=+JU#?ni+TSZ6F(@O;KuLD?y+~YXNFm}WU(9|WO6ljWMgp8t{|Mx5T*G$|6 zZSL=DAU@&e=YN)rAdTbW<0IMV-VgilB_ah9qC!U>_7#FANc?MX$mtM7eLz;_c#syi z)q&uAuXpdJ;RY_PEv!Vu#KS;U|3w4|2SXj9v5CnrU@xbo5O!ECv#n_LBc`wP-Jh+0 z#`HwMVX=;`^+w@5uoIPHRu&-GQkrN7>zaUcbpe%}f{Ve{`~Ufn|7+F$dky=+Hk0&` z{#wdDOz3`_uzay&Q^xO-LPE)a;Y!S8gO--|flYf2Zb=@x`v5Qj6POI3P|zG8l!tIW zz-aMv29NOM)WKBgc#r~OX%%(QgW{dP@4wdg-*<_B?ir6iMY99bl~&s;-}SG5A5DQo zH-(9bxe3s+p)ko_AJA>D0-BOL>pvIH|LLbzTol;mgR@t3CFWlrNrXgAO zD=T&!3O+^60k!}8!~XX(SR{@11KqVA;z7T1{r9Z?zh1{*^WV;jo=*0m;>>;Et{`(9Bq4+ETbMOJ{0m0<@|LvdsZO!$NJPwvl=8s~H|L6Ps|GizR9rUsB@lTD7 zqE}Z})H~4L>wn&2G(IrAlJXMf+F$?2BK)t-0l2e6OId`c4?v?rW#IioL`J44EiKJw z(1vh)cJ}t*=p70|bEcP$j%a;DLu^P$$f*94Y729#r?$4X$7e?_)40S8<(q^VjPIsq zXNx5mNlB9!MWUU6IO}o391h52H5R0PpZ?A|%eI>&=$>*!|2QD@?MzYsyjT>(4fKT1 zpTFa*`S~GiMCHl<4H$ugsBB=Z&W_oSY)sMbi>3xbe&eg zVqeU&o3<#3Yi&KLRS~@+)~I%Ijw?u|q_()e1N=>SgepS*Ik~wndhhj@xIVFOY5KP{ zIPYu%J5Khu*99ZR+EutWUm8AI_IAw$>iRO-2xzI2`o=V(J-KLPHi$Ub_D4peanbeN zqONuQF?u{gOtd5Dr;hw2Q~!EnYT-6$^8kRMi}y|1cuI|6MnrgcP9XhIMZHODMW`d1V~M@kie+(Q zV=9=rBhjnLW5TBRhcAxqBLNBO;USU^M7fe5t!`S@n*TW`gpovYZUGYe*Vg;9vazwT zJXn&mvvc^Vpq>d4!sZDG$q!u4_3PKnkLNA6HWvB6V?mf07y=o!?$!casi=~RI4Ib5 zT$^RPtQ@()!SdnJ;aRXtp;1dZjmaaq##`H8xkBG9L$Gvh5YpSbyXyryqc@n+-d3P1X(z3sZAeP}lmcr=?huDiEvifxsQ- z*HhAnE)n7}=Up}?C3OOKSvkT(@AVWj^Yy_LC%{~-iMFBba1wJHur@hzs$|#2R4z1Vo92mw7(CQB#l21GNyg}_|d#Sft84o zQt3;f;Es0u@pY(xd!tBU$+xs7u`gpxn^=?vuQ=w$=A~D6_FfLXs@YD{&Ybj;yP;Jt zx4;n zLIf%#ATa&iitR#6`uXmZQQdVW)uLN}GV1`8AvZFel?aIcabv=lOu*UoDiz^rIm|J@C#N z{q$^Sf-p3t^DVA|?~Ek{ShyE%njz`r^XnR^1?a4V2{ik#2F3zvwr+Bc7oS$F0AIrygF}M@sg6U(P0(N3_b7Kz{aTO!=P<$-_x!u zedU`iC9t2c^ivRF&kft{-3N_#f;L(EpG}Xc_>$!?+WSjnvGBf-_$qPUim&p2AgVw1 z5VV?jCuD-RuGCaZ ztt}pe>0(}=Yntt;bUn)%kiDtxI5;^aR(DR%9K^gHL$b^Agp7Z`CVk}4oisEGQ(uy5 z=-iMPBh(A=tJ%8vGq0WDTT`UEGgenbH;DL>Y1;}!OPG;3>%WF; zB$1G^#my&iOJ6vG6#yv%=HZ2!kq{v|ccLo)nK;qv!OIGsc8zuf7~&a+#OlGy%dKxb z0%|vHyTEwm4-P65PoXqw{cjPH0tq5IyX)?xv{83tHUMJ_-~@nd9d~6FZIvxqc7lnC zn(FfJFt4uMSOaLS!JS@9yTP%vYbAWSe6vG)+uQXa^ycS6-Z-=Ui%?;CQ~r zOT7{Iys#fL0?F;M^zCg_xDRMV7dmE#9zu;0&-mBhHI(VbP4Muj5mC8G*@fS{3dQ@4 z>Ud^W+4R9*Y!JsOw>=^~vYyVRJ3@YB5Qu|4w(SHloPafGxv@wE2 zM0o3;AH2<#F%LNp83;pYeE@nw>Zg5j^ssRtLP7D*4M8~P209|~f06WUnf9G(bS)!D zIO9j&je-T!TEGEjOu@fyzmLPBzF>HhS=av<7AOwjtNVD#X{ zqIgzqiB8=d!uRFY0#FTkM3oQs18{t`94&2lxBUT<)XH6aB2Br=k?l18rsx#$)o$sC zW~_o>1j?<@P)+1Wm8Ukaq$!>pp>NRT}uA_8Vh0Vp4Du-vpdXb~HcGjvtI z=3^o&qP4urN?KK@uNjIPDHbYQDqEqw{=!1i$I6f`wDp`IdW`>@ae|S7w2hHw5H`5tHH_EQ29m2BxS3W{_PM(|&SdjTWeC zPNuqWvcw2I#&-6hCI~>(EJT9uH$+L~2ksWLaI^OEW&hwAB^d+g) zcPA%1#WQ-6$P<~;9ZRysE8x{!No*Xb&JjZ?sA5fF5kRYP03-;@8p!!1n%ep?NldRp zdCI5q;MCz@gr8oW^8y-I4OAo!Emb8UFF#K}m-!rbDq9YP)Sch&iN9(1nxUJ59z*VJ zFbcO4n@n2%dIM-;-#*Z`btp?ZEd^86p3{{Yx|c1?T)gf*KYP-Zo)EXIk{i;cy?12a z^1U|o)5q12=@_<`{D!Q+>ax3Cr0iJ{mfAne5!0($|<(R_CQu2t|%r! zUoKk*0WCSy!soSt+6y! zrcMLRW^SpUu&aRcv!s0aSz<4`k%pz)f2D8N6YRi12rhS8`flc-3^zQ#x?kyBP7TUo z5FEDTRDKBvMADv}DMi5*n)sRLODDDGug zx5^(@qZd#+BkPH0gfwgOEf!~y)MKX3v2VEjwfFjjNP~Vez;&F{wT2@ z9F}Ek)ad=ny1J}BC|IcCP`~a2G5^tle%`y7y#SYEGvHmPBH?nv7moaljqPnXqHL89 zkYvP#c$)3Rp8!K(w~Fruh~PK33NkeUXuMb+&*xdvfp0k7K{Y;9&hwp+oXcUO;^94! z4>VPlQ{@>=SGGkgXoFfK&wHO6#a=gl&)uVJxlC&)D(W@s$5_RuG^?V+@>M;xn##*r z7G0w0^sVw@ew9Pwinrqv+tQ{j2};;%W|UnL^giKt-k+D-r;0k@_hHapUM3oz@Bis7 z>PzZGw8s#$>Ob~t8Ob}H2Kk27lhjA1v`JNcZKVhWg}M>b{m%L&AGF&ulvori0g6zz z*M;7Y87QphyT!z}Gd8;UMaM>sQ}PRupkBnC$1XYfPNdo`=dJ4;SHCL$nxUTI_RXsw zL3iFvGYgI7cix3&=x={i&X|}~)p*7}@LT_Z?W7UUF;6lkmkZt~f$7dx2$sLq<^~^# zE_+N2&iIwy+f;jdw_MN3Vx|CHYF3iU)AZM$5`hjiF%(x86x zT>aE2(63>N&r-D#ys_J+d$qBlgZXmL|@L` zL)Sl0Z9q$Ria4zLvoE{6XxvxviRF;l6w_qh4DC);VXUlgZ0Iyf>&Px-QM0qxARtg0 zyG5nG@W#!Y0akG$f|RQP5lSA8a_)48#&ly&v^pG}G2$V{(Fh^C#mt1dX52}Addm=Y zaWgImm1^3+BfzJ^bwv;_2>#%cyj*y(G(l5-+JQ_W;C2Xd29ly|p+Mhxm1}?wQPgV% zx+>=mDiI6yzP%4LD6=`u9eIg&e2STe!H8_Fc-rxa^ZK@tM6MSuHXl*R+fn@U{6WI< z>mq{Y7rv1We6`Z>SX+y|uXGY-wiYpcer=gI(u4|6>qmB3^%8{I0&~MoS*AQ?Q)j8E zn-I6;1J!5Wwq|-Th!JO^$^x!pe5m7R)-m$6=YbOPx-%xsfA_>CA5;z<{`T4@g8=BLuk? z6n)TN=AXb*+;>z(EE=L=3h z4jmJ#|FU*I(CU2wghGlp)#|4zwmfZM(CY|Ba2$c zB|m4Qck=0gWVDCYTdMJDiUMx(PB9u?V^z8PgtGUbek!QCAumnkMMQz)=!d?*%(KY+ zR)NCSt(`xoml%wj3#l%@y^YXBnYM>rX07IpCKqr6U>gE9 z1yydh+03%783WVa#HSOijKy~bH2JSeoQ4K$M_E~Ua3?y#Dd4~V+)jyK{|+4MhWi1v z!WgX!N=Yeq4)j}W5JKO>^-kF+u-BEEK6l;My#~0-x%d8|1w)j5;;bnhF`2udIowaJ z@ze+gU3j179DAY1A9D0b$9^13s^VfF(+JEmOTAdDgAXvdl7yd?LyL-X(!@fd=-{iy z-t}jpJ|dW|pMtE9#ixkd2CwzceuTBYPA2QQFAUmP9$IPGkEs)k-slQ|spwIrLD|_Q zep^5L%$eQbY}psjanY!Su5owgux;=`KT4E4@#ExG6}@fhH>knI#lq{iTYBFY6P~|q z`kc|t?67txgN{^LRYfg}IFaUwi<8M6SK4x>LA=UuJ zZBfolmBnPjCYSf3nP`nt#*sj^V!ZR2uj3z$X=uxMHf|I&^L15Jn2+peoOW*=ASjMr znqMMn(SP%M{7<*W{f;?g48>AV%hqSkC8NjRWxW56YjE0ti=qy>T2LcbmT# zS@DS6yY`%$a1K#NTc#0oDaWDWH4c48sOY`=El{20={f*nQ@j*Y0h$`;Kl_tcCq9g` ztZ%EldBwua{E4l|>U|1mZiwXV`B}pp*HUPW!AVz(6Hjo{YpK#mLjqB<sxdy~xUy$_*d@9i9ZpC0#b+~42*51jpYpV#|(UDxw!9DSr; zQ}BYtYg^D0SWLXBBLBs2Unl#iJ}LuTj_Y(Qj@KM+|5XD{l^FP~lC>qFur!pk{k#M0 zp%>~g{z!L#`iZ<0Ph6?|I4)^mhjt)c)AP=@>`8$VbXv++VV>;C!*uQnIcQ~oQK7xX`tJ4%zkXMPV>Pu;X_)}E5LFDuGPHpw=ylqzkX%hp&f-YVZ9J$bT^ zdI1YAX+1TOur;IO;QXa?FloES{U3_7{W%qAgwkAae(#x-H}J0cM#`fm!93*n=(N?T z9Cr>F>X%c_O?1DU$gc*@Mh6AFnd0Y&CecaOhrI~8+|sL2cH}dIheI6lk--v%m(UBr z^a*Rx{bsvIl9cRELep~|2hGVkYvnjnfjAW(dKMHH)rK)ZT&MLLP_Mroqt>+WJPqrn z>x`PPgSJ?S?h_lt&Q-T|vbo zOV>7P7qh!dn`3A7^ggXmv8FK*`KMFkLoR_%I}c#p)JP&HI2~RO7*E!LlQqAA63ylA zey*NsR-M^B{$>>$%Q4=OfU|3Aofx=5HXfZZkT|O)1?nK)>-&l!8A#olosV}mHxzeO z3u>KSMFySWHxrvnM4v-0<{T?}g@k@rvEVH4u=TemF&-TX)TbA!@47u%cZ}y z1>4J_R@$H8_t)BbwJ^MG4Hjsd4mQeXX$>R7Pi-=u`IVJNOb2$q9Rekz8CKi=bO{tV zQJ+GEo;=}>VkU06zO+v2y^8IQyeBucXixBuI>TF?Rg=B$6q`9}6Z#gNEqj)5mlCy9t2S7Y zWb#Jj&W$F!xAj}T|I!PYWNTV8P>&{Nv~-LM2J0FdG&zT$92sYgdbJ(YwxUPw`h^u9 z6dg0nc@b0d3Ng0J$8QesRaUJ97C#jnNGS=_?q#SweAZJukQ@FQnceWS{?UYZRlX&v zI@KX!(ZN$tSGytN@$Wj-lc1w%YiU3IJp;$W+L4I!4Xkt>idT=fAj22zA?z`>X8Jg{ zEJWav*9$K*64$WP9e)NV{k07rWmf)4SiINCk_li68Q<+P%B7-w)!e$Q@om$u{Po@TZzRj~`_n04&7Lscv zo8^A#zGYd!1>5}%O*(pgsKz?zaVW)ADeWOJCEabc#%1jJt?yikxxUB5)by^|?}SI$ z06|eh@lPvomEUCQai(oS<#pk-uY5=7-hkf|`_fCyHClA{-8n>^u)7)4yHNZDd23&K zR@Pe`8ne1E;uhEMWNaN%<5t|rZ3D3K1>R0jMbu$_N6ej!qU>NRGCgkgiDbRLMsA;1 z#F7L|Aq-Pa!*FjSW#bI8vY#hG#%1I>3H*wYW{m1Jz0Zs)0Q7on7SxnmoGn#G7t8YC zhVfR2uhh29T#Xu!%|RI{9&s3FP2!J@j4B0D#Y4vDo(kI-de_l|>_<<{lo8`C4bjMZ z*%uzAsxjE}iTffwCh}?7&72qV_=fS^kT6nLp$8yk-|T{noF9o*2#XDk4$kfd{cP+6 zX(MaWD*xk^`9i7u`*BU&!tI8UKu=WGPs0r_I;OU3w67ZEu<}UKa@Jj6gW$9O+D)O_ z&iF5<`_kjjpfhhkkBLv$0C>DcAuevHDUiiupN>KN*l#7kN8jT=H-`4^R04N!Arirj z699lY=ivqQ_q6zXFTdTl6p6t?2Bu2Ts&}#T)W0umcAon(pBQzjYf#;ui^Fz#O35G7 z_qK9yCGJf@Eq+dGh?w9*K!;fSXzZy^2BMBU!>{b@4@Mz1uT6PVo`kArD7&rTi{e~T z&(sL6kl;FV>Nc0(r*pijuVaA^M7>2YNF`6H)Btt(v8bb7^;V0)bEi@2UL>T#=qx|< zVl61wS;;KRGWo{NOwv3mf{@3xjJ@@n6NnI8wuRQ6lf^jXv{rI^MPnz5ZJoDzZu7k_ z%|85{Jg1s{TuvcIAq8_{f;+qNO@VfZ-|;IC$6%?L;-5Ypx%gb4QNr&JvJZ4>LyGR@ zB&K@?)L{2MZthypXBpo->(!t-zyH9mIT5HwMDY4>oZgZbmjniS0AONPZf-; zN*{|Q-|tXrb=qTD+n(vTDNT;S4k|l16PmPmoTxY+9BN+$glvk25gxz8g%UX%-zy3} zQ)m<~Xb%kaN{`9@5kL@fCn@nU2Yt;-w};TrMPDYN*jA5;TaFlMB~!F#n$pNK`14Rl z9)S`}oG3aY_~w{9av6s{E~8318(>Rv?z+!AOs0N|#L)v-OuM)}JhsZp7lA1ns%9Cd z_%>$Oum84Ki+JcIlrdij#@Wb!x3>y6Uk zJdx1j9a8Uw?)F$L72&qkw3=LkY!vYQ>7dayIE3uh<}ED+*eAj*D$w(D-3|BI)iB$RP{fh7H!?)UziAJ70ktU8zgzK}_)*Apx zNHgZ<9+=RB9xVkejW0r>28IhN1w0l8RWw$^pWMNSkYA_?&As&a#l>C3N6!LV&e>R9 z-g=R$T2}keSgB=9{g1cewMb$nMV|o)NH*TBocmYcP6JjHk>U5P@_SLaoUYD=x^&F! zOhaqnoO>iQyxgXHZ7`Xu>ox9}X4P%;{`kVYf}HB{a?MHtp!<($}n1~60pp6OpZY!T~P$)YT(dZuyxI#Xkt z&vdhi=Tv+1$fx{1A$YC1TJO;jPRFenOx4vccs7$^GLD6!w`Qef&zA2lPv(cT&5oeF zGZn!;E-S;I%bzJA;WP+#;yUX6XYCBp*N`VtNwN4(3d#iYjkAp5OUTw3r;inPamS=- zA{wWV0qSyASlfa>)s#!fU(|atEYWZM-l@5u?0IRm=e|_u8cZ9=pBDVVp8c#i%UI*^ zTYW|1T%7Q~th~Lb(}977_@q_2jwe#eXW5!~5A`~~Gxs%Eb}8^Dhxn+i=5r;N(%XUN zZb{4>qQ6A{gouo4JpJS{Z@-g!+=;yz8K_-+QHyq^>FiW`ANv0pNunV5?x)1{Otj;S z;%8StN6rKJU_Qx9<(idRR1~Lyb9JwtQM z+x{F6$puNen3I|SM>QS(x%$Kk;!iUQ=q))p@0;-KIcafT*djVHdu0H6K}~c+L32Df zN|13~gP0utP_spOa{APTaQNuEm8IrUCsTwrR*m_u#${3+xEv<@I6!7j*Qy#T3cYy1 z?sqREC-d9q$}PXBbJ5e4{&JAhs3k#C%SDKc=c(o9yY^O{GlKg(0c}HMctTk>HtIKy zck_i02zwD_t=;|Aku7BKm77#46%)lZ-+t%-LR~4Z=YAR{i_z07X^Yg>xn%PwRjr7PJEE|cWY~MjGe;fAIipZd%9di0TB9JzA$baEgWrB{Tllbb7>`q zB_KQ{6X)lNMgH`ovCzh<-i<5`wTqq;-lx%H-njUK;m z$wRTe~cuVXC z|1Nc@`XMFMW1&lf)F`{VKuX7qP%Ol8{=C7_IXD~%(v=P9ND4zwH660)iWxUi8t?s_ zJZV@;Vrh{(xexQ7b=`ZtTF;13aw#*ULr&AWpNeZ89fq$CjGVA|SI+$s9ZaCDsr?fS zGKH;EI@uakMK|eyh6j1|uj;c}Y}r_5a+!Shsp^R}TTZC=X2qHP*-BKfYk%4=j|vG`K1%KJ~%yN~=t z2jE+5OV%~DuXg9wwr{=5^i$v$rpQ`y@wdn@G0v?<)$!m}l@_E_81v=7pHdL|zNnaN zw2X}yV>sck5~38j;N~4|&52Apbty}2$$z8pjvulgS*6nn7{^tOEZY6cn;8N-Z>7Yl zhTh-i@6b6%w*USkFQhb>DcqQF`urHh;FZOOIdXM3w7c_S37lIe zsZdfnKdxkFGZ89b{!9FC0V!6UPXDX!a(1NaUGB#_H4YShrn0t%qCtd>qwNZZ&_}Z1 z8w&TzCE42Gu{IMrzE6bp-$}4o!w4El+7G!6b0G|}hlqi_j8%6x4hjLKP3wmc2zTjb zo}j$6&Fg#b$hkd>hol`i)_x%2q~TP$#BZto=c>4_!RLHAcv8*`km>HkzSbhdg}j%y zdAKk4BXIt+z99|F4H~u(;SG;(WDE~Eu%Th3u^l7!X=6hobnCw}f;dfJ>W>=YAzRh&X0QI@8wm<&mOhRqov%tV{seWZ&wN+>=?5FIZsf-?b zbc{&ZTZ{ex|DOTgp0>MueGRPCxQ@@{P@wY}Xw2n?v3;9N&>ksXd16`D{>P}4{L@Jh z*=YW@8YrcsruzqgkYZb73AQiLL#_tGkJadn9!A|thx{Ef4y|JE!Jk@ z9~1LH+r)5)03MA+)4d&*6c2JH&_C{oMQ$vrT$a?O?6O4m_+m6J?Qew~A7oh`_{3rF z5&ZQ3*`Rct%EmzLvCa;g^gOHGTF(;<+$f^IQA0^#qc0d;ZVZiVpD4#sdc~h+#EEZwK4Crf&4RDws|?Lv%42jGE}(5PD>%V zlpCE`)`V;OgYD%d2%+fx=e`jWO@F*Lm!#E71)CCkyavGXhi(;HIRKGc|4y9NF-+MP zD|r0PC6Ojhdd)}Y&K9bBW8q2W}uhg=Gew1nDT zp~#pwWe>A`AI0sLBD{kBeHV7gGY6)lbu1&;a22}P*5FpP4^6JObY2~j2YCcJhJDlH zdw?+9zorMz`W6!c6}KGcTm|BRSW%@>>CrD9iph(Dp}BHRTd5oeUn$!-1o7Qj zk%LzI8ZJj|-XbfDi#}nS7vpMiTv53OzGZMrJFBeEmkhxN)nc+|U=94NdrjYdP>_>W z=xxy7O&m@Vwk|e36Q&>EdCZ%4SkcnDe|3jKtf<4oP&A-8E1G_B?zbj2?yVDTHxQ*! z7Ts5?68y=;?y|yo)N|JF6t9*L^Q-g^iAU`|$)=^nE04l{64!SGSxvSBye3E`M^q$q zPteAE==2OSCXC10qaCx$RFA^1Xma^&*7Dr${fp}lo6Fp1u7e*D>=!;WFS}y?6m_CM${=Y`gwB+(^vdoc<0F6QK-i<_epGO$2tD`M{kt&xdlNis~t!(T*C4prfEw1 zQlg;+mh8O%?(tUG==cVK&U9GqQSx0kT(Trd3~I(4Lym$S<6Ci_=&OovPhLw|%<9lt z-P=At(YtcGJIoFnrSQgH?pbye)&{M22Sfk6o!vkClV8j_eAVNx19SuEdvOREpIViS z8c10zPHcNwR(`x!O1>#9&N^rZ>iGOYBKl7QWeBOBhs<-;!+dt}sO+ofA>l6e%phl6 z3|5EFfV9T$cjbc%L77jtMl@o0>p-~e$FuTsHbW>{U$axJJ$DbLIV3(ufl(tcEtrn9 z?GF-D!p3oLI;}PGx*z{)qUdc=h%d>7lcVGMgxg{^zk&RE{O#$3xjTF7l%G!2jDO_( zn6~E}rQSg#-+2-Dr$iNU^06A_n`V&sfKqh}V4P$4}&?`=bPZ zoj~Kd%c-ubB_p-wBt4Z$9*K!3MP7_SpB>K;aO@G`NfMTsPq*WVk~a;3!98tlvW;}` zzdJzjNnQ^QUG@ga1a^>?*%NNq-b9a)i!Rv6A6mbjOAQ?zj5WCq98p=+RENAU*juFD zybAN~-X6)jPQ5uWGL!arnf?)aXShh7(d(Jf)CQCg3|TdtiDKm;oY%2`_wvwMBf#7& z!BN?Eu6~Sj7P!AF9A>|Kp(mmHb$xHT5?-8NRFgztl@})p=C8ju|Kj9C`M#eCzuxdk z$i8tKH5Tc)$&=J`&)m^(A>0WgL516EIV-7XK-T)5@twsjdp3(%#j>29;3a@Y2^%>3 zufl&$O(8Y0!ky<`h1_SfHPi5sU%0oOWEQV_AhTT;Tky{)dn$&4E-b<7)qIo3w#iB- zyDxV>$-Ru(fPSPaK+k;y8)kTp5}a+Evph)4ZKBsHeoeZ5K)0*=f!AVqWvKyi_An1S z>piCIYYNlNl;eBW3%RE?t#9mG2PIg zvvKEJO-rJAxNPZLKW^Ul-nH-gR+w6j5TmKGT~sjYfDcopnRCaTC#|!}c#Gix_i|21 z2nk~rtE+lv}NqU`4=P5{Cey*qL7sLEwmhI1yHo4rG%_}ShMPo!0O z+is~f^K4f7KL^6e8)4MgtZ46$iC+`2!@~WrzomYXH)~j|)$%=t4Sue%P$FW*ZIxRk z)bX{gw%TgSY2h5<`|iLc_r2)tvJ&|rO)~1!;*$Kq1iP?z8uFVPe?^-u$PAKxOY}(2 z2l9$KE&h%R_)=%qQR!8Xof+P>$cP9GZ7~}RN9tpTKN4!;(!d>P9T9nZ!i>N&Dg*L?M;oa1L-vGf`8T4{1Lsg z&XAtFHEXdPCc==qCa2kT9J^hoJ-2F}S1(z8HRa>ikN!ILT;qMoQ}41)l|$?Dwh&dy zTZeAB10Kw@1D5ySVM;Ms7|Xw68L7l#B!w^E;w^Mj(D9`_U5qnw|Lb;q5RAArQVN5J z-}=9Ck2b+b5J`fWFH7+H5a(I zci>XZ8?mdF4QI+H1bdPfbYITud`N5c;X;oQ>vj@{oR)qs&i)~{vB}`|z%L);9}lz* z`)%QHI30mkCOg*4KM}MsxuL!xO&WvV*!vP^RpQPRm~_#~Qurqy7fmvp*QD4OH?Gr* z*FpwjWd$hN=Z#Wj@XPjh8t2p&M8 zK4)1qE?UwZPVo7X?V_2BX>ZBK??i;(P{nZK&8OpnQ})&pxAzYM^ewmt(na6up1qXW z^X}{K&jI+o?Vs0S7x6R4$Mg9cM_K&b(?SX{%M3J3au)Q$bTQ37&72K#b{%H0h~BOK zXjM&p&*=S^Hl6`idb}H-SM16y3BZ0YT?a6GBkxs*)m*3-wjmIWC8K+^OdcpJu{Exn zN5c60dSi_9s7r;}r(5((;OOgO!sd;j&vDZ!vL8Sqw`6z4ba^?hx^Fv+X`*mh|gw4GT^OOR{f z8sdE693dQwj#%v$pXb(p{kovC$pBbt9O)-K;-K(?0RPgcLZo!@!z;sS7Ba$yZ)-A~ zDDk!mbdb|QeVHj}`?~sFd%qd$)RGk2kppx-h|zWN!;$y_`_}wOR}18j^*gEeNL2BS z{^5~UAznW-J94W5aB$&mc*~PFdaE4|B?-U4Ee0RDcZFORgmCv6>B&mUlzg~)M1M== zpyok~WKttHhCJ$1NZE8sZF(~2g`1DAJOL-sY}EuiawLmk)9hz!b4?tvG2NQ%&unJ4 z>)Pfwb{tEZ; zB#dhPp|Yn@>Pcc)kbkL!02V~u>TD<(PB?EdO7ij+xnp$$5pAMN`RlLizYdJznaugh z1f1p8SBi3r?c*z{A6b-xLU15sdS0HLto>J_MI^FAmHgd!AykvLJ4*(I(oa1L6m@T` z{r%Dc=?EU`j>&0u>sbtHAsW`Yey^WQ83XH@Kz2AVc>M3opqLr;@M9e^`o}qn;dKA} zmg_)Gns$_pyORA{vRL#@aNs+=*p?(<&v_hYMd2PZ$}J zd%{Dvaa z6Jig{O~;j%TOy9;-F5wPmLf;vEB=1QjlPvX5$yR~AtaR5d1SJT(OB;Kixj)4@<|f{ z1F&4HI^3^(xC=cr#Y^~#{*clzcnb>sS>SA3uV$=_0!vy^;o5Hhy5AQMyZ-X`X4&je zh=kZ4xVNxvi^gk@Ml$tMhI@-j29VocR?hCBR=agVMv?CaL>L(8-)}PbiL7JlBjRQPjq@~aEa!eV~Ihzc^a3q4sG2Fk(*+dt^UaLRO*xUJ+u^RdI`k9>;iG| z>&j}VPTgfDdrKgy+M78YhyC(s=eV1Lk;ijK^tcv&!%mH(2aa-{T>9`*_tY7R&D)OX%phHK)fnG>M{$* zY+dGYyeP=84tn^!*C!S`OAR`b){1Ry{FeGrw`#aP|0^I;^b>9Ea8JvXV0CpyM@dca zOv4DqX~OFOoa6X)Va;y(Q=bN&5tz&5QwdzT5clvMg~~sGMPe9IG_bvOa*;R48TATf zZ&h9T++FATWmu{ilzlz2#`qbB8pkST8NOq%#%T=pWII~_tjcSBkXA@T4hW^uy>F`e#ZbCFn zH-01N_$ubpsKAyBi6m_yDV+NU_I8~2Wc4S^CiE0r0$1IZZ)6joRx)<75d;tZy@JoC zpdK9IB2z)Z5A8p|CRRsysN(RJL>v*ZJw!IiKQGTLSVk~GgDT^y8pZ&WKDR!7wd<-A#mvbfg*S+KWVNLKtyvl&;nqtH3tdkhJHZiwr*@BJV zLmnwwho%qx-vIGxIci*{@AC1;PSG0{FE{>0nYFQDz%0 ze_zAXQI$07Lz%Nwqr;Y{?8`W_PtywR*{}um&|7Se3MoZjihi7-%=d@X^z4PNb~A<1 zO}!eNe*(s5!2y4m35OJ}wEMYV1@R_5vLYWRm7y;btM4#b#KHt-lEV_lUtQ1Lr5#iU zb-Db}BO#xZdGl;p9?N}IWO%$@vBl%|Ry|#zH5qNuuzm2L8q<4v&Z9J!| zU^++3zx+ZqV5~nikes0K{W*)s$bki6fV3MNTs%K67f9SN77?0q7)a`U72sO-`^=o{ zlV-k$hD}am#X&F;?8j+l18bUPdHJ;4B;1^SWOW3rK;}sSIV~@pX6;1)gK`l56>q~# z?D&_f+5&L~OvV_+kD=WRWmg)p6$J!`N*zF=`Jr%=n~0WmaERGf`V-<`&JUPF|6jni zt&|#1;XodAfxJ0GYW?Qv>xyKAzm&Pi2`icJ9(o4RirysKXf|;lV=*~o)ssE`*Cm}R zZ9^&*W;o8`bF7ghX!?0mo#y<6Jd*ZquVuN)sotZV$Q6HYbl0E@WF4#k7pFRQC%&

Olj-)S4&fh`=9VJZyF{ORlBy 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

)i<< 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

8oyt908t!OOYCdTVKLcD-Y)C|Yg(nkC7x>m` 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

-ZSXu%Il4%CkG_wH)9`^e;nCc6bAW6gv)*| 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

sr3ZJvr3izO_3u zpF}azow{0%)rx+(!5dQ^gAW=z?rg+74rbswV&qe%Au{G7{DS^cgu^42d50NDpwM>F2knE?-=+AzLuLHA7))Dw?1EE7^TWZtfM;stL zF3tJ@Lfk8rx01gNiSJ@M7@!4*_OjmwS@#L5A9C0Jv4;HPvViq5+TP!Vj=NPB+ox9M zjo74>_t(1aN_@oGor zKDWs>7#he`0!E=V6`+sgpJGjh4tZ4Xgs|@x8-W8aUbUUlV@zY>Y;VtX?%oC+a20jK zo(Z}sg3TjkGW1h4E_F*u;eIqA5rZ<2Q4aKZs)>nfdx}Pd1@A)eyq3c1b^wNQ+TS%A zj}N_|3)s!gDDUBIP_ZU1L}Au+JJo^{wH^#7#CU#0{!OT@-26X7jAv*CpE87 z^Q-|dO!y5CQU9?yro+cyR7?|O`6XtoMD_VD-^P#WNp9Ua&B?L_($UJxLwEe}AD?lW zxk+c-#FmYUj%hqyS2VY{QV@c1cmK^`X2ts7NC%fdnD^lP`ND7H2jgVLuR7uZm8v&=y8KyrF5zd1mtMxMHI6|gs(lkD zD?kw%B@+&Jye;q(6{5ywT-)CH*R(xSzm*EBRt0(S^81l!BpYdNwp_+Pba9YH5TIuGGyBM{W8k8pVPtVqWF&E^$|1sEr!+`{S3rhP08ZS=13~(d40~8{hvg3!p96 zDqu#CG)Mg^HI-PSXcPLGgDvg1h=+8$qfnJTa9pGVg5Y82jH8+wqWh+MC6Pp%4p~h` zO<)ldPMQODtfbmH5h&KD>ZQaVCb9n$q#nNTYp)~3#cn?C zvFF5gTX=!g|WVsgVKn=}fa7o{@Sq}6jRLp7^PK*$|j^B%2OnJn^q)fMm= zz27K!f|^6Nt!OI8OKO4N;m+;`hN< z?wnDRI|le!LsAh1Vq~C4j$Of_O-cqK4L+6npb{S$&p~G*AXl8ix)w-*bGF0gmN!mY>*g|z)8G|03b6Oz@19&t3BcGgO)BmTFT#U%}wvS+& zVUL$_9JbRAZZU%sSEy>$Jv1fGw0BdH<^AA~OV4hj&ZjPw=0C?mn>XOfwuKrvql4>a zz-%0t5ITluUb)T}(nj~}mRbHd_(rVE6TD*9S8YJ`$jujRBGSI@Xz3pUUS=?)D^ZZt zYp7%t#&fbWOZ)Z3uZYYSuOr&%NuQQcLV30q(34~9(U_xCDJ zzrAFQm)bQU-yRd=_PcbqJ!0!;!>6#1W@YSwvTl79AP0+%R5?D{T61`^Y_E9j^ z9qg?KC(_m*l0$|+uqG7#+Ax*e?UsM!*IHA(#T!4yxV+{M8SD?EdM9PJEN9-pD7z%e zK}p!YZnVHCDG;UXv%2W0$BHRvyEsbkN&Wzii6aQsbXgl2BJaJ0>SI;$-5=+0yg`D& zPSL8>Vcwk4?71r4w0pk zne#}pms6b5wRSVjaG(Qr=UCQlS`L(bv+hB)Gs$nP{3f}7nj!v4XE;Y}ByQq1{-biF zftA+_6$7lA{7te@qq~A@+2N^ip6i)xd0+lGo<0)FEZ<(C9X_RuTBS7pr8jt=feJWT z&u@0J)Yn*L-G7M?-Xxc}iT>d9n)ai1JYi{NY*<8{=X1bABN#Da>P}J3lSWMrlLR!g$-?a7r+HQ2wCK(;nDgqUp04dt8LutwGrcFl#MC;)PXp|XV9M^fyMkyu zVVfCtsL)!_vqy2d-|0i}yd8$X^$P#eq^Wm5@JaQwD*m$Ol^{&s`D-D?CX>D*6;#3e)H``KRmA1y$8tRjM_&5u35; zP(+^9k0# ztTFF5w%hQMEw~~nK>CCgtH8bPFgc&qhsH;}T?w+SMdXCZ-mQRa8fIfzwze0WH$NKM zMBoMXk{OqDG(m$V*jh&gVm7*XIbG_EkZAAjY%1%i4Nv7p1Nr)drU_0_mQEJR zS83H`kfqC<_hHFhlu3P4-wdpFH_P-mdd;lmNBe1-f@B3EuC+(hPB@PEo2wREQu#KmK2rjN{! zS1p~@h%l>kQj~PqKYV+wt(NPw%5rqx;;xW6B-9dIo!upLNr9ZE zwS)yTFiR^I)8&x{`-7zFVC7!kY4lUxm?3rH9V$4MXr$|wu@YK`!4VEDA*K^bxI7q~vHAC5{m_o7jbbZ(f!?g!4hl)9Vu4gWLheE`i zP#S76!HN>W-@mt&KCt+tCQ+!n#C@Ywua;XMa^<99oJH`?$dRyfs`~^$8UglMoN8o5 z;5hB_CC9_nnOOpN#CAE6%a++7d;6UFAWt3CigAfNt+$om2@!%USzyhCMLMYXr|pHu z@5Me(*JsK(5mr#^*xT|Yd&t9FQnd;26(vHyOeNFlmJ)WX`}9%})7C1+xfURHknv+) zZtm}efknf}cy_1eBChE#^O(9wrtuM?GRlZp-u z9POA_+gE;QX)KnAvfmGD)qij-ll-wYeTd$esogo$r+2}2L-Bz(LkdQJ^Q9&{L;GKF zXuTMyrD5X6y={arcBIkRX*gtN)6k@Xf{O^5ye@HRFW z-Q6nEB`VDb5d{@QN;*_ZKty_sF+>m~3`8YHN()Hm21to8RJulobmzwN;l7{m@A;kQ z`v-6i=Q^Lguj~Cv65a91-YTV+bSlFLzpA?mWuGNMPW;@|T!%_UbBx3p-N5uqWzd;6$~)|6!V4Rkd=8Yc57)ggb2 zMh`L>zy5d#RE&Xs>F~K#M#P-e=j&BPeGavCt<-^Olf$|^95fxJT(roki<0RLUD1ow zk>dp_-q+(?M=M-QNx3@D+UR$fc0=Li-%^UGkGp!2ZPDy8ATYo6gQ3KIOTCh!wSa3E08m7}7w}ZmrdQDa~ggV@Ld@+#V#7_>n8W#7!kL z?;EUtsEnt5Qr1r@tss4Tb;I&g@2VO%tB2@@d{aam=ehg=F-_OPZMlv1K%?m*^of~l z_;1%NVaY2Glqia98+n$dq4}vHS~#oXvnx%7FY>fBC|+QIX4cb!%?T#lIOAN0AL#Me zR>sf!ayNWUIa#KThUGQOfr-aU+wAwwvBI@o?87m9t1Y6y6NW!1+EA)yW|#2Tx*HUH zw{yevgITzM8?t(l;m`?Ro%&WIwLVuPcO_M zQ9p!zj>={D-~Il=aI+ zKNmoJyoFDV0l6S@Xo$SnVY}Zlnl~27EeWBj+T`YPrtOmo{)D?QL)GwSPkrqt$aSS_ ziq7vE5oms(QuJFB>sPP#v?q@S&gPRe&terFG6p)|Ui9sgC1jERgD?Mo`|cF66D_;s z&sUzF8gi+{yINOWwnyUVP{6bBgf`-ou6^yA%++AGFux>SiR1B|W4gg*kEhiSUrPiS zMnH;4P? zk)<1d$}hKTO^UKJaX4c>2;YY+{0(8FV3*|j)%-_UN#^;58lR&z__1Nj^aHA?x)tXb z!e0U+evnjXCa#45d)b{Jk3Ul$a&FciGkL_0v^^mrE<>T) z(px$Pi&hP8Aq29FnsZDsbgcfdcno&{_edc9Z?2f}0nj2a-hTeXAk-@8zSVoieOp=_ zUk0E9lrDE4gftNp2ZF37Uh|CX@!M+FCdI|Oi{xq0oeZ(gIWrOd1swgZu|W6l<*#8( z^@Avvf*DlOeLgaOeZ#=s3$CCn+$H621`1*hgBeGJReSQN|G6?s+<=!u!$hECxPVcr z1RZdPUK?G;FhoP8CFGtT>y%Q{xC87vkr4{$87u)r@x9CAXIBZ-!?7I4FBDqJ1kd91 z$y6D4^M>lMgN)GQd3)8lcU^ss#T=xCR?1!qy)Jo&c%nAP(G{0_?pFZQt1x1s5VpL$ zSk%rK=g#;s?SV)qLB2|fXG`{G_yTD=ATI&m_bsxbJ!0JO^dP-8rXh(}GK?7vd(VN(-HG90*{REg`xTj5f6X%57 zp6U(w^q}miO{x})F?p3FL@_b;jY-W5Az@|bA{|$a0%ei2@uEwp+B5L zk5XNvmkNQ&b>)Y1GSaS-u&G{hnQ>sJby~rsD_);J=NVnP@)+~Bmv$6UHAAop_UU4q zUT~l8Nq`M3&lerUKoMleu0b?hR5PmMJifF))PP-h>x8d+u=0ByVFo^OU8Rc)G2YCN zBAWGI0wT6~lcxofhi)fe7ha>b4kl@rmzVYX2=+X*{8Fi#VYkNZzpOW@=_9{?J%BAb zVz~4Yk-t?;{v|mGgT(iowaFb-aLFl@v($>E5U8B+Iw`mqJgsSIt|cG*1{_{5|dA(KWThQ${j7 z$z=?eQgmW2d*fP&7jzEi>->Y_yVJ(VWwMkODsfaG@^&ol-{og%$_$Pg9Li!cw~OOf zPFi*V?a@U26R^Y#=hQo`ycC?lldcW$;cj_-HBAm;t`9E5SMa$5E|66wgAi#IHH({i%uBC!`AL?tz z?KI%!_s4qZtY#6sa{g#+Mzc{v?mf)rqqnj+s9ebl9rAE5+<>Xq2OFFw8V$al7~a^# zeWjyrTCFu$hRx-DlqUa1v22w=F$8|PgQEMJYL*1r<<82?xqzm99p;o_F5xDI_yf<^ z8Hj*p|0M8nQVi0Fnh5uA$ki5`d=QE}eaPzAMm9aVYur$!!Z}_xcRdfTK|vLFDpquo z|I8M494W*kc0w6bbf2HFe_c6 zv0FHoYf+=FRr2jgUXk0Yi@AJEyxeqaf9aN3n4n$_doo2qvkor2A=Bwtw%xdf4Pmxa ziEvD;HZy^=VpWQ3l)aj(1T`VXhjyeVWaZ>rI(Qh)ZpVNFg>D({xZX9MrRsQe3!OGp zCP0SsiQ;tM8bP^6pHQ%0f=12=t0w^;c|4MqdI{w`&8TG0);D>8vWowwGfSh7s+o^Q+v8sN;rinRF-h?+e6j; zz(+Y1DoSCQjuj^Vj^?=)3x6Nf?_*{ee*Vk}6;c7;aUtHz`JVd`^ceoT{>M#;)wTHq z?0!}tG5sITU;B+4zYL_aB!B1yUHXag$3Yq}*Y=PqU&8y3LTo3!3mk`B2Z)C@k)RQ} z5&7vaz#ks%KjnU^BZ{u*lykvv-+l0m=}q@7mZ~%B{>{#rBctGNd8R8UNUuK;2R*hO zVBG(>9tOBHqAGu6ww=O93rrIc`MbQS^hS|xXnAobA=QFLqoSB(^#fL9iBG@w(D1h} zey334+1mq+UpJG#Wp6(N zI()R~TzdG`D%}aGcV7Q7qxK~oXNr!~N1AN&&KsqK@8G?uw2{sO_mQA}ZYh2*^Wo$7 z`ou7f{hruGAu*`|uQD|H5X?t$8h3G*9Y7ogU+>JQy80GziB1sTNDJgyG{5$XeWWY? zaH~)#l&1YucvStecnpV2;1{bhio^>g)TVDC+rj(ZA2W2n7F#NDsvTs|uD8w5V zuxe@)!R;liZaZMgYRpZ@9NqV>OhK?;VM6FNZF1%;lLo8wmO_ZsmaFtX|9JDcRYf_y z3%6$o0id#~mRCgeOs-r+1$U67iH0)Wfo3prQm5#yE@-E$&k0+jrxG3v^Jm5k3wl^r zrck;}B503vW5R3$vQD&0=LDu+cO;Cm@R=$coRtr_$9tepVgZ=rugf zB6RYzs;}z7r|iDmz~`_Kr&=A%0vQcjJXPnC}RCEg#h(Xik z$Hb-D_b0-g+Gjw{zB29O_w#p?ie;PHxQcR#&4f!>jJ#_?bpnVgAD*%N!>*6A4ulY8 zFjC>zR0*SDaEZ$`ava$foys?F!t8&}-<&EApRVKO46>mJkp9o%g~g-+2-3!1FZi8L zL4tGwS6D_Xs4?%hpDYcGK=W@?X3PO;@{GkRs!u*m<<2q)RjOM}bu+dwr9RyxX`wK? z8=<4{N_uHPnas2li%toiEZ4_5bFwP&r`Ix0oV9AHa&5j9c4HT!ktWTTbvg<4*`fzY z05{=?{ZhwqA2en43%D*`q=nb|9j;TUW?zB<3VAl#YSF0n%m}YibeMoB{i+AYB9M>I zt622v?#3Cj_8sZGRj-LU1RW2|I_V(UIYMJ`l=F*1jcARh%NW=?r#ABzo+)2O>QO|) zMK4LH-X%vZ&4RD7>YNPFhZjtkuqNca0&(OhfuJo8!7vdK$W-7@jQ! zV!#o~DM%0`WesoKz1c=;V5+C)G7i!<(1ES9i?>M(9?p1YtoySGa^UUU`Bl8I$3d2o zP$16boQvJ|kBVcGrn$4ES6Q3R6=y!64gL6<5_8J7nD$P8oETL_y3RhA>+4n~disU^ zpt(u#pf!8M$DWWYcvQI_y7W8J{xq{&*!RU1x?4Q(vOHtKG_^Z<^AEd9a-Jm>F5b>S zsQA9oF1v@jQEPnm=cR!IDc@H@6@}Trrn862uKI*lk)^b^Z<*{ZiuE5~UF>o4!c07l zthHH~)>z94y*YP+j88~)1b*#pf^YGV{SLwdN}y&e}mkBWDaLD~<@{0J2takJBq`EV+356DCb8z$`13C}0* z*RmGXmKb4-x^SJr0=85(uug_6N|&^N`M5W9jVGN5#^Uz4?pT)6Y1n$x({*z%m^MqY z?Nt+Rp;965Ljcq)XmF&RSJYTt>O=jT&l-~{|2T7?k{L%v6|}EI{0_i#`&Ys_A2z0 zV{Y3HU;6h#>V*@xZ9-Az^x7yXP{P9@pIa|vM^=VXsvLPi?;kl4W>0_Gr&>WuwXyAi zvc`k;DbhxXV^HX5h%kcv0+2uGbd2NM_MzLi>goID7X6FL%m zHCIMZ?10;ENRc=YqQZxUT;V#NF~NHB63{X(^_shNG$>l%)7#L^L+;#boh5Emc;RuU(C2BVe{k*0#EYpFCCb;(=>N+Su?isH<1-CpYSFuGwAgij3!|3CF|BXkO_weQrT8K+8 zpin7|Y@}_cqX~1MXh^`C9z*B1-b&1IDx044k%AefB;rnIv@tb#_FR2`>6&ywYDrER`_SL_wVq9VV(tA{ zldk7{@kN^-boEhb=n!#w#94r4P0Nac^j9<%;xz4lco4_^i{A(D=fZkb@k5reI-THJ zy0KtJr7%x(!yR=)L^*cy)q3KIaP|tcRNydDd#`tETT*;3xpW{q!y{O(s{Te92SK=# zxZ6tHthJ$dNnfiAo_2j>LYBV%eU%YY%IuGBNC!&7M|T)x*t3_Vgm6StQ#iA^ngkoE zK@qpD_I;k}Vw0i^D^P(bkmU%c;E=qEBo#ecBpmEW=96VpgLwJW?q`Ri?)}t74QQR| zl3`0@|J6LF0#_C`bciJ{=AO~Wkb64a`qq+hs*XpZCAd?4oaO4 zP|&ErcPPV`vvNqwYA=4L&;z*3e`u4yZ$IVH3#I&_XE&rwG!-FsilE6{>Wt^ymZSc9 z9q9Y{t=5^_CN_X9CQ7`si83^ zOO!8srh0*k$)4|^G!ydUejWdb)Ym+qwxfwwmE3grr14G->#e~v$MJFv4q<2{B^qFE z+1ZEhHAOjVK!o}G7_N9wrb2e6#c%ex@Z;Oq^>uL+O_SeY?Qy)cf@jk_HK$DnKO*5U zYe7HWVOsw%c0~4#UKD-Dd_vm(C8qcUq8%dG62bnH(4e<;iUBYgn?tykyjzek@# zmr_|W$Sdd4zrPA_(N4QSJ_J#yVf_U=N4aRaV%chD;Cv)+#x&m_riLr+Vrz$i5+$OM z3r$WH=C?jDZzD>e#_io;wXx$d_wi!zs11jBY_}7>`Zz(^R+aJy#a8Ym4BluiIQ{p) ztPL2H#XrM7lFJhMWwqJhedI?wf{Cup$Fm$!ZeGkVn(B!%uID~J*R;+$r^Bb3VCwe6 zQ>b@tY3RnaeygRcgLl7w=VUtjVX&lWb}_n4BoVhL_q27xO{I{&{iqL$2Q)9{Ax%T# z=#HgpOpiL`t)?wck*4Uj8S~(^#`{Y2Mgp!Ih8mXiK-+rK2n=qxVS7#dIYWLNY2m&wrw0xRVuH6}4`b*-A zXPp(wMSuJ%5n+j|Jeim8)0ld$Y2cKTNe?d3YGXPln1P+tAiHaO=Xl{pFJLmRDTpp`m)ot z?C3CyWqJ}O7%lmd2PfJRbfmj8*)6SY&tK%mtGUDVt=ip*`CqVIeQ4S&fgasn>!M`< zOhjx+$7I-Wo&9sO?*&X@gHt=7?sHhh`;ju*?Yq8V+g9WxR2RUyH}FE zZx`Z7&!PT_ErLd^!yoG+b=kfH2<{t>l%^eh{ShYrhl^-f(m<(2elE#Q6A%M-c|&sn zzG`>}3rbc`IID{*pBjGabY7!SL36x8!mZd(WK;R560nf@8$FU zoT-<{OpeobfM0I3*O0j)?=SP9PyQ-#s&LIxX1o(jJkDF%^gsx46qnJJlArZ)ozmDD|=LOlpSmO-#d0u z8moR=8J&$$&(#uAal*y%cAOx~m=C8cbAqoDu*lI%Q|tGEZZY_)ipih8mND@ZIXfEi zKn!h+iOLQRs4jJA4sig3I4)gvvU>MBOV3FJxYG58>F(zGYX?L+%;+p_&vz?B{{IU$ z0Pq0(2mn&M?ee@F+^Z+IR#|1(K~c#eP0;9wF}9bN z?SCVMwJ&|n0(EF23rz-03X3H;cygai`f7UHseF!79p0qcAKTD>$_^rkU zNI0{)i9NEV%7ztx&1t0%Wp&PyZmcVh6J;z8( z&++jzdwVf>Ufx(0U8b|Sp(>bzQ;J%Y+77r~YxnRkotdPHr6oqFAHu}XECtl$^aOgg z_fP;eXLUiKJGkd+KlU4Gz}5V2<{A8`WG*>BzBo*>SSkN0yhS!t(-@~|Z`(!r1=XEKLTb?I!adlIz4X@Kr@qZ37$ePr-K|Ovn-=H8s=~eG?sc zF~Tt~-9a6I3N;NkvGLheMwt=X@d%&JYlb(hh0*jG&f06{f((>2oFCMw81WtNVY|@` z$7epZ1LlMOfxJO-Oa7O>HV-Fzg=g=N^fgLjhANmNPlv#cb+2WP;dgtNr>vsz-hF|5hp%FpEEQVn9mKbc zwLm4To>wlMxP$w(@E^_3XkaG?&2P9BAQ-augO27OZSSXks|vEZ1yc?^9yGq?@t)>4 zd}OD zT)L90Y}<(dJK+^mH8$TaB#fR}v@zGH`D99P9BF*eBRWE&ciOOIn$Pz~GVQelF81Wc z3<@P|^hAC)vghScUzM4F(bh?`!RTKMrp#s7;}xGpG75U~@8;&TY&eUwo{lK%=dFcp zRI!#s6Z13A8dR^IQiY)px-IUW)Y^5*7VURehZi14Ej=g!ZB{U>>%@VegWiz)KU2o-2xeqv8%?0l`#%&O#89ks`EP;^MJrZutrMA`A?7xSb7?vl$4Fyfs)?#I zg^(1!>L8JjhC`OBD|ikbJB1~^$7h?nJox<}|Q z-Afw0cmU$=T&!uc<#AG~UmwG@ygWL{dhQB(YOTResH7V04Kb%8eRx3n^S{U#fc|{+ z+3uy^VfI(ih#-%*reeD!V5b(N8(tf3)!?G-A>}Ux3Ow9Y040?On-2nE2&`p~?nb`{ zAXHDXGrLhZdg8TyPia7w2^3Eg9AwDL;l;vn^1Lu~GSZHst)-aaR*xYAWz*Jk`Ij7X ziWvnTMmd0U-n+8!o6mvGiV{LHnbU_A12vYc`Y!-W+{=sHS}2F$c>5F~-0XPLA-5DC z!sih0#i-B`!||1*h$4mf&11>~R$WGRL>{fcvk>PsZ>gJymNmkkW+*A< zeMWQ$_`hEKn;7!v2j0S`MUUa8QpIQgk?O`IgDLxtj*gxURE)^2|2)ZXua*+(J`T}a z?UQd6I|guH(e7Y707$U)tQCwqv(b3<)9*V`v@jI141@??2U+T)>|A81b}J%f=LnK7 z@-@{7!c+Im>jQx5LHX||B{#ZJb?-)b*mR-03SV?QDRxz!l@o?4Tgv7Jg1KrB+ROoFro-k;WPcwj>6#?JeBP>T3zj{_2*RQ8)ix87Qq_ z#$4R0wK)*CU}KVIe265Vt;M!>{Iy(qF94>G+ty0<6OA;#Qg32%h*GZ7-U#hu4&=Q% zM%JELgkjtdT>u_DR&-!CzJj`ZEW<*d*Jy(Bahlh<~g#6wH zS7yWLGQKTZYOP}RL!ZQv2N$lnEA{CLl@4%yMDyecp~vZu8F;`{415Wip(j7!(|7Fe ztkQk`Fd6L#i_;Ay5gwoGV`|6$NuICGz&-;ZC8U6dP8a+Szh>t`8-1lKVJQi05w{x6Ls=N z2R2g|kj97H1uMbLpO4D{5c1UqN0AF%M1w*DO3Exd)e8Qz{h8SJh`-BRj^kzf2itR5ghNf z2;|JF7j=!IA42ZXe{*YLsf8AcPBM41zDNhzSkmUVuDc zuJ-?`A|g-7PwsK>AA=W9@0*^KcY zK}zvm0Gi0v=_G&QLq-e;Ig&vs_a(g9!Q<5~^KYj2>=M=#d7$)X2G?%*(nMryFhhEG zLS~+fBn>)dG*WNJ49WZq2#FDPVa(V(n2Vl?xg)RhlSy_iw^$awo8^mZMDj|o?Ucd; zOV4$Ky*t>jLXLsxrp+;m#Wmd(=I!`?%2_r|NwoS@Kzgui=o^B!A1kP;NWuAzc|Ej` zoMuoVs8q{>V5z~syJqLmMUV(FABnf1)6jaZFcsWZxY+PT7f>VuyiWO?ft1R|YY*yI z21nN9#rSE!N=)5{b3AH%wsv?2e%+xy!b0NPpzJxGh?3^E2i*nw0G7+A{r%OU?R_uA zid|myUkWcx7d0Y$Jb2EF(xA|JQ8kYEuwtThc+Qi|SxH_J<+A@1Wkiks+xQ%iG4rIF z_G#T@=n7d(&}~9gBEbH3eZ2=T8gX)&hCi2bh0$@FkqzzejMg>oui&7vBiJIh(k*gc&@wx@6zOgw3eS zAq*T6rz+6u|G2lyS%_$m4ej>_(`erzRf$f5#MweL(xfAo+5kly1XWPwFVe5oWf?t| z~)?#{Ug~nCDDF8efSkVXi88!masB>4+$Hb*w6-y zao`Es!v?w|SL|eCut9og4{;JbC-DM;cf=$Z$PsxWn72Ox^b?tGDgA7bkl&Q~-|(Vr zx+3JFO~7e9qfWrh>!%B8C-$QW2JAq&*65=w>>G(w@6Wdj%1Wa3rwboA3yY{g7W@f+ zOs3At0fM^afO>7rb)Eh3^=3IKP~Z2JTnlj^%%LGJ0aua1{OapveP_o2!)Hw`Zmm8y zZoxpt-#2;F4hY()=%k`A8YA2E*1mh!N|(cNI@;K7=#rss%#kWbZ;~crPg1n9xnKFO z4AXY{$g`}V&8Z|JjZEFM(q<^s7PqK zLhzvXz&u7+%^=T0`_GeG9dqSsM~7L@h=O+E?j<}7TerD4{}gVtaF}e>_bK#vOq{XP zwWKA-VFW9Rw{zI7R-88|j;^hpV)ZP@S)3mY+-DWDOYO=*QsE2X6epv9Mc63<((7u> z4VGn}%yRw?vKQlepc*dRC~LWN_EE2)#IYEMp%)JAoO-C=9l9ZP%0Rd{4zq=ICq&p! z?DMpfzMLGab8bHXqsPkdYD%jP{K1? zfEhU3A2GmNv*(oNGCs1AB_3&mR5>Y(dYl1)Ak)XGs_9%`Wa8d)PH^o7>;iLuXg4Z2 zMB&k!ZEX~f>Zuv^;PqMIid|}^HucL z*7FQ4B;#WP&`)*&da1I@c?hpahWBIo2b<)k^w81Hho#%8NmJp5WSLR3-_EOANuP{< z$4L)5Qi%!S3jgVuTr}8ySrVmsos}-JYHzB-yq)@1gZfjX=JWIHe~gx?ruHe zh^1mmwrhyS?#=X~+(4s1=SG3X%eZHeeJx4`Yb=^E!7`o*z!}LfG5pO;6J@+y?MB*A zF2Q9|M*l?}OaC&2aL`!OehYfaz9|01g4`dx38dX?pZqcj*sPv)SV$x_wz2W0lMBxM zGr9!44?$ft&2VsVuq8#=XX^Nf5mPK;3O=I#@SY!qw3d6rHC6R&5zn0o)UGDXlK~n9 z6l?78a|sxN-HBV!{ZKWx$V{KZQ@tmj4OceQ>{&Ol13OJ_p|-hn1INQ}jliSI8n3nh zUcWhb6vwE-M8}(6v9nnIN0MDC;jb3*4frVo(hn1=cYV|{orjig^d&5YR2eM{2}2ow zK3n(4u@dZ2KHbO~&l`GjizvE};BpFW)JjvO{nL0tqN75(>*5M3xW8PxsqJ?Z;dMpg z;fw3w8AWNT2Pa`PB8XUKd#}-LbGawGzhCas4dy4HW$Y>uv5LrjIls;_r(ZQqMIg=b zsiT%QS_g{7d`%5b7A^%@ooY0zSbOxq%iRkcF9hJDL)!32G&Ua$c3Nfkpv6GC++ zADVokYJN1{F(i+Md<~F!#J~<&ReAs!DZBsf1k@UA2W#?@2NO=rg%EAG(nCoL(tZA? zH-`7NBA*={ZvBt{t?M2+KQ|2mA^ndmXJ8|k$)$P#I_o76%<5KL`Gw=CLNMIRrZ3 z4&w_7)00gHV*BZ)0kJMGF1a-S?c}EzH#@b{^xTt|b4;;3_{)<$2!M#!`T~R6_RN%c zHy`Hjfoz&Q!84JE^N|z?{EubU3_yxA{Y}VAeTs88c=fPYbWrQoAoS%7xoFo;X8^jt zuuUPN-1LL^A8)?!OTSr~H4*Si|Z3~)WLHIeHtuXWxJ zmv4lFI!FQx!46K>#fi^LAQLJKkzV)e+gF|nLE2=CHBkpDxtoFJ^eR+80%)n#4(bWp z7t}~em8CO1kQ%@CI~D8kkwA4Yxas(x&cCHu8Be!;(k|XJpBYgvglvCcKe44!#j+W3Dm2PhLkmKh zlF=c(96I-MxlAtFNNnGYU{_g6Vk!Fnhs_*5yn;_Z`|@_E74zF)GhUuwL^Y(=H^k|) z&V7&&F$Elas{(B7lbLfe@3RyPnXYoCL_EqZSlVivFehED1HY*wk zSa`wv!;kJg+ljT9k#{NB__w%_Q^gk33g)3@rYQX zc`geTr{=0($Jq8FQ9F?NgV*0R(X)l4@!0!!mI|17xKb`=AGlWo0#K9E^v8>`aTk-b zO#6jqeg(7VUI+Z{m56l5KnUraer{I1+~T|AN#Vm+aOAs!IzmVv9{?nD5T!ui9J58$ z)6Y>(yN3_uf+s2Za-FNP=bVk!X@{06kGQl@{~m0p#xER}w~}VP|+doZYgNOiWt119+JYCiy5YC)>!D0DV^Wnkt9XSy{_Gmx50p;e+ul!!< z{2iCmU?GDCYqG>-w(YnqtQJ!NnSQu%()=|5C-+R%>`TC9wT{2K0YE1Bqpi6l+a{za zOBW^7DLV@E!N!}BXH9jXe3IeF=TH~dJp6vZ*(tQ#)Iw z!qvB!a7|4Dl=M8%NCtikO1-|haOjd2p{*o+%!O*wHk1^hkPi5Ym8OsV{*$rb^?2&2 znoMb^zOBdAUs3|urGhM8y@^i&E|dfBye7c}u0jlu+ZUZNxQ>=ze*G-Hi05bNhI)uB z)gJW7bu!LpzE4&7X3pH=1vHR3^J(H5Yfx3JF$n`q(T)ZxE4qsK*XU*bzc=_^$g*EF z$#_S6V{7oVyaaZ%{A+ii_n+HMA^vP7+7cpq#kE-HWIS9DS&ceVe>DFlf`ko$DjH&G zVmPER@7}S%fbJ{r3va$$=eazt4*t`s087W^GFtKn7VT2Id3ByK#hLQG+Tv!tHmw@& z_0JH?p9sTd&;TZ3u_ZJOs0rTGEltYO$@DJfgUv1aX8w9hv!`03RbnFbKj{j;)>I73 zsA6|`*avCEJR~TI<;Y-9$*U^7=?ot5j_kPm6Nc_aMJB^WlSVWlEL37_XALL-u^0?k z_={*Jer%#oWmRdd@)&b*UH$_lL2+GiXTL7LoItG}-tY2KFJl=J?!?`qU$QDM&4mL_ z2JiKYNY+VCwtxOS2buwQb8yb%Um{6s-G0-_W+u7mme?Q>eL&3GvEN4Z@bQ!sao(36 z?~U1+aqeQBn6>-{sYthQ=QKMAS{0giUhw@XSFLsPscb?NV;GVK_DDJ8Eav@YWYPg1 z&us3FCd+SbMZ1^AFECLzxl=qh$uDU^?dzhBM}kdO0U`xH?A1~E2$ZI&&Q4wQST$5I zu@QQtK7~}3Sac3dS0SDVU`QesLTK|fHxp7;%Vdi3t<#4{W_KYx@s$KgxcuyHXT0R| z-!19x%~i7@aO@u4sQ(Nq&0?Y#QldToUb#R%I=83KDkEqQ`KjTQf`2#0E`hB3KkG(v{s z-LY%o(#SszcjFXD(cgRvYV0-nI5)!_Gw?Ra1*@5WZSM`SqY#JBTZNwnCjZQ+>Z4rF za%9_j-V7eudytHI7vh__i5`O((K%NQYC<1wGwxe%cROWizxtt}pMyJ9)Js3hwb5gm zT8+GK^9>!S*c)+BjiYxbH(46*GV)%(Q>VLI!0GAyAN7q8;CgF1Em#f2ESg%(3x+Zf z;}pYlWZg(8Kg$8rrDuo&G6$ z2{TV`hzy840Lis};GCNE}ihn6Qr+k6ibH^Vt@IkL`*Cz9Ut zZ*D0hydw_X!>;Elp_E)A|EtvDW7>WY1EwlCEL^d?aUaYsk|OJ`B~B)~n5^G*@0O(` zRqoweQrPwUbUj4CTKOlWd&BOM<{1`?WD^KIHk4EQ3uRQ_lFHr}fK|;VM?^GQ`^r#l z3)^&rt@V9H@9$^}$4i79Z&c?06=ToN<$`q*x35~R`J2Vk;^Y1WjD^K6-5TK^eN$(E zSwxl$P#jTz=goY;E)i6R6~d7=lbHUj(3I}#b(qm7Bb7V7T#J4Tg1Y{wr~!-gF5Ms0 z3x$`4)(n(V&lBt_aMGM->&M=yZb(9!y7sN4q$H~U%ic2ZMz`rJnG`AmXv5D4^JaDr z|N9k}`bkT;nHQmL8-s2GDse>Paf>hIXhbEwb{DbHqvC5D2?!>%ANzdeQ%dTE^h4*P zMF+Y%$l>`zbUi?LS3fF3oZr~w<7qNeOK3Pcb-hQc8&&HBA|1oiA7tR0x7|8#8yMBn z^zlW19;JHP7LW(o`6@7SfuZT(sSfKf^Q3cq4*6jD+I+kKmu0sY08_{8C zHl%g6iMA(>IKa#lL^r-Ou*?``ws`9c&ikmj5U$3X2YJYyE2Sysg_paQ{u`^ z&5l15@cvr6VmMEUKe;;H`Z@@Dlx3`EAY`Xu<|!S%UZ&12|L6Ec?d&0B z48o?F=|cM~HFGJZrHM5A z`JP_`gZ#`3vl`(2bL;~06YSiuf(nJ7dc2Y`!}!o>fesv)G~R2TXvY5&)C%hLYLMUL z;mY-(Ql@-*Abu5}@7Nn5cI5i4Is(le!yu*O*&Z2@_paICImf3xiT-bm+*0BBQ=kq@ zJTI>{nQ|37_@>OR7IGFyeSIk!^;Vq(=$_93xc}MWrxpo#ppkHDhk($_nT7}KttAN+ z>I4J(XG-!YRHw&P@qW=Lm;yr!N3w|%Z$;8?21PT zXgTrTtsjmM8Hl}-SMhU9GaEFuWXp2ZCuQ4QLLyK3vFW+-b&cw2rA*YXQuqp~vw{hT zu4KRZ!k&egxAfL{l?DAQ0zJ%>H383gjTnF{_?l|`~xv{3-D5oxABNGF_Y{4hQZEL*al|y*OO~M za$gH1sy&?M&8)|W_{g9bwv{LY+EdQ6AFlG8A+#(l*%(s-sK0nzyP)v^8As#_U@Z1^ z(YjwcmHQYy-1op_s(KB?eo<&nluFs>kHwpOh*qdZr<02BzYnG9U#*=l@i-jW4B_`^ zlaAvbs^pVn&(9e5;v5(O0M4z?n}SpCzKvX5T^h-*pHw!;WoX7bFpFlu%;VM`Cmw=(8(jz7cxhAkv4w z#W-};zWS$Knq8XHb^EYpm?lc%YF@Dy_&L1uo&tvYOs0R-s);I;03`K|gD;9sgzJ-& z(c=^!$9>B|Btx<%hZ%_eYbv*X8p2PrEBA4))NZQE6+PO7+oG5$C(Vad~7jZVitt0wMcE!L-u>im?Z`fJyszV zAV-~^cP+MQD4w&9tqYye4CdmbKmm3dB%Qezmd8(&}sp(?^QfBi3`X{cMVZL>6$PPVqI{S>Y`f$df zHK1ZWN%A;3R=RYK(ZK$9Wi|eXyJ&OeL5~S22s3a-Gbd_#wmIj(lIOg{e+#_vYQ?it zwt8f-p--}BONI81c2vAq!J~x41L4jM+U>wMPC|-d%w5XHZyFdoyfYWLT0*jZ4r0fl zwyLKR)?cnNS@Hdl=v}U-WS82lI$-(95YxuOwM+Du{Z;=psmd*tqg}D*TRWsQ70I2F zsCTN3s*VWJxL!!p>_5J=KUL`2;hSfH_nR@DYqYF7dsL01<#WEhOdO*fIC=*8RzI-U zb9erq(z6iJiTKS4t|38U4AraC0`JKVpC^{x(Pb)HJ?!ZsFZs ze$=g>JaORWgzp|mPA-}Kn*9^XA6va^7&E=>QXW4r8c{M|l6_F*SF{gU+&AJgD9* zr^@##4tQ^8xEj8olgr+R41GRx-cXy$k|-yKUg^5@eiBZ-4865v3SGAO^4$z-V)Rt( z-#3}em~=K@JChef(b4o^)oA*h+p-YaTht;@V|ado=DYl^vlQor@mi0|tKSMyw4;cBc^J(F_ zK%^AA*{49gE&46cT6L51&3Ro$gn}l`4!fk8rk~$+DZ3`VFR*NydEoO4gdZs|Z+EAw z${O|^8-F;ZYnkt}76_*SM(Cc<_WdctqNzf66&USh7^8f-oUo~W5f3#zMB(E0r^N#^Cj z<4D=am3-;lHS)tXLDn$!4T>#g$|_*{;^4Ps+2SQ=c>@UxR@uWF!|lbLi)9#vd(V`> zDvJT8-dpv%BUYh+m-V}KLH6wNwI&+F4dFf zkb_C_af;!((CJ2}=~~9YmZ-v#$Pq>&?R`-V3f9q8AK75cy02LO)Iq5~z4fW%<(IK3 zBJ7aPA=U(e=~`AS<27rs$WDZGzt|M_w(7l&SDl4vW^WYi{Zoc9GpUwQ4IJ!eS77R~ z?}H{yztDoGxB8xa)5PpFFuHLY;m9J2bAl>55}+w>l^qT0Z7Pw<$hy54{PUw5)cp_W zoSO|>T=7BnBA>?SI0zH{33fKn3_tqez1eEH=_=P}+a}-&k1>v>(`|#TgHK4=_7ywD z^D<`N9gm_X=f^E5b-pOCZ zvFMDAipkA^J0?o;Yp@-xoluxNWD<9IF1J#@bf|v(iCtRK*Zo#>TH-$NWZx)=Y-B&N zHylYbFrGHgcz(JYfvl-qW9yTpITX;1c{(a-y*kE*rG%C`i zNH-!V%0Lhhq(P8IIyYKDLJ?4j4Nw7T=^P<~qJ&6Dj&4Se7~}Wxd*Ao@JV`Tle0V_b9$MsY|f(HU>hc;J+SGHr*#tNL=sq6?TcVr$GocJ8#!y}=+Q%=ZJ^-zq<$ z+#m_aU%*CWu8W0Duxpb%;3sGI27%30^ZZubMCNoVbdK>kK^N9mo}>N|8vp(S7mbh1wU|>u!|oF{5wG^ zss7<79Twh?xG-C^7O^VYZtFhyfpV-!FQOd$7-VSd!ivesLuwd;;Hk-SXLBz)48teL zJK&PNGqX$^H$#KYgWLcd!+q?8EJ(fsZ7;|S7%C>#-#OeYJS zi9WX{bEHdo$if7K(w6-YOvn?FY^GT)LwJHm#wBqlc;0yClb%?AK7vBO^bJ`gvig?+-WB%==P>zc>nU%-!Uc`Fbw_cI z!|zk@-etJIS`plKa&N_Uk4Vptt+9CABHbCh9lBJA0u>V&|l1*hBy%wwsb$ z0;ZVQ>$9ZUsnw&-`?ieAm6*TjNmfIr8TO1t!K+){H2R)&zTh&s#7Sc~ihG{mI&_bH zZ$JFO+}FB#o7gMOfgQ)Y3;vo&Z9}q&w*%2SDXJ7aO8zmKHX(O}r?R5fYs|3JZB3#Z#mUVRPW_0e9ZUVXu1`0(7)ueRD1VFiLB&Eoxi8$5jKrIVY~HAl}B{*V&tnu z`RwuZy$GLD_z4fId9f(o7r|~sW4D5ZUZA`_O-Dn=>gV|8bor&5a?Gso)(|elJQ5*yU^Cy;7j_ zEu6SY!r9d4>B8qPZ9d!_dT@*TOFlS3ARD#~((T}t5e58N&03bAK~(G=np3Rh7trTS zb?BYyKuXqrW`xSzqaKAz|92NWaKz;Q<+VR@ut8$ZG@u3cinlmG!_3bUI-_g1fogh2(M!;lp=-6I5|D|^ zgq|F_6P^yVuzMO0w)nGTsHM9(Yj( zj(B@bO=qVLl=IB)mRDB`vOGFP{tXvkCvwY9q9OKQZ`U|4peNCrhRY&0lQk}C&Q>(a zm<6hVprndjin&WQB^72^bQT^3G3g=bJ|DOn{=N$aks0zl40Fw=Y^tMxQ4+cf{EJjI9lCHSv%z77T2{EHI(N1+ z-CXbod%CSgQXwHS8=_?tlkZ%O2raM&k3I6!@lYqp2{*2S@PrUF@%t*0 zQG?OMS~qm;`A5mOdq17MnRtTMq&2X5U0$c%pmXfg)1>bIbn0EGlF^)&I9Rr`8gIwB zof3|U7wJ2(MHAgRYe!X?T_*umMwJC0n6#??R3lxZw2~0}i#wq#oxY70=x<}J8F@~v zk9;LA#24L8M4|kGB>7;SRHjSd=`?#mU2t0+)m*q>6J<^Ei$9A?D z=83j%3Bd{WzVw9UEGUb;InpWWydW;#eXf&re!E5%+xY9&ufs5P7&~GPn`gMnF?MO} z5-LS+iaz4Ks4S*+Pi+K74X7D&(!I}KPYS@NLA)EJqURDKr^CZ@Rq>wD%AS`fujzkb z+Ph-QuDXn9sQ`^;^GPkvzVK@7aAy!({dniN)20dpv8daZe`NSD?HuDuzwM(t=UlW{ zVfc9?n08|2ozyNp&e&ybgxUs44PG{vx9vHG^s`rVQryhhNm+{e z30w#9kA386_6K0IHpd zh3cjm>VB@)*6p*|_;nt42UKf&{-16LbUf2RA7odB)KE4E9R8zrlAIMqbX-D@!knA= zKyHKy`0_!n?eyoVLg=YXyciIh?2DfixEzWBpDNl1!46M5JK6ooKo0dsQWKKQ$Y%jbvRZf`v zdfYb+Z%2mMKismJ2^)+fs=H3VS0?-T;w}Rt`Zfe3u59!c8E??Ap zKy=>-b0uY<$-@O+NY{-@jdNNmnv9mrL zT5L59LyeUBO4LAxRE*9*KV$QiL3QtgS$-8!vhq!5#?if&E&a$Hnu+KtL;dnMW>}lx zHn1GNPKyoV=Si*MJFbHg-+QDwTV24kH{4Po|EKF!n&j&6G>vvhFrm>io;6^rUi;a; z2KsJj6d{yuBF~G!usXwAaw&}a4I0T)rG3i<^tQ^0hE?)w&s*HMh|s3`e2nQ@r1TTR zqRYDLhR~Dx?W(S8?vdW!1G<%N=QkMaJrAf)< zB4LiDU6H99qE6)L44EaT`*J~OV6A+OPT-QH+{2&IAnA3q^x~`DhwZdB^yf85pI>V@ zX~Sw-Tj!2Pflp6_b|-Ua2QMa`axor#tfNdTG zqXD6-UNTKO73eEhu9R%b1ii`VB!(_anYLf=kMK!W6Md`C7uP+C(?ky)@1>uN-ltny ztK)fBeuhRwqy?NqYrd1K)6XeslB)fk=PYA(qK(PL{v6ZnROoF|PwLlqN+{Ngep?&; zPKD+VI~z}yzUq&GjxII&XcLiIW6P?Q9JnX6ADorL*|nzF?7k~Fzm|>fSPAg1yAZ|;X2OV+Sf6{c^1Po!s-%r}t)pS@GHt;oRCylzmCb73E@ zjLg1POIxH+WHP2N{CXcp{L)HpKL2J51_akK ziAD7V*p7H{S||j-=GfZLFs%B1LaS0pI^3RTVAPP4+$2#9ilkN z6zE0vSsL)6(6OuMMoPfn^pitR<7qBIEbHCld^gxSMu|!ss)s&g2cg$Jvi~7$ z|FwAj2Xe#S0uEWBkYh(R0ZV=-gGO)j6LhkLPSfqdnl2MVj~XGwJ4>L2*L-E;(GtGM zUo)4Yrq2WalvfOAb(q93{rhq@SZ{4$R|-QLadb$j#shO1P|2i%Jo_eZCcO7Fo13h2 z{+HHAo9JDO6c2K{U(+7oAo|^{H_6ZgwaBxH8*)@&#W6QauIFH4r!Q=ApjylC3H)a$ z@*20|TWWQ_S^6y{;j%N!C!adAL(kgpo7s?SzAzI7H&K{V2O)GoN;}r2efxVE^XOH{ zvJut$or;dF2z0bwQU&Nx)^tZ8IVTSHXQRb|WvpPakm0^&1lA3AsK!GktiV%~E2Rq= zur>$2o!MkUw44uTAUJf5{TgAe0n>~`XBfAoGqcIAkWMI#klaKV=1%tHAtnkB5ubioi_D73tUkm`szp3 z$tg5;5Y*Zn^zd|@a3^-)^LcJgG)y?NN9Zj;W0&Qw_)L)T0HFkD&hplzu9)vo)fY{mkeIllPF??QWm%ORiQK)(A@fW&wc6g-J@1Oy z-VKnD*jeSPYD4p3i?%l?Vx5Cq`>Xm()Z>>0Dj$hi9p4uX+35eMCV(}Zzw%+s__R7? zh8^YgLj)y%&!@_*Zy2Gg1f5!9jC_ld{%@T;?yXqLt=SVe(3VpBVFpCMv9XX>AE3tDk zQhe!=p1&H5*ge3>J7>?A_Nq#R=%)O-JIca5sFKY1{JiG;*Q00Be6BonsgrB_=Z~ot z3+upzZtJ%ux2?bL4#L7S76Z;RpYf?XRFVBX?Bk(+4>@OzbA%h zhKa`@qDCoOI-jQ?iQdqASN3Y&-r4fzi`PJ4V}<|Ym_!#rDT+<*Xnap*nR=43B^c=m zVM$D2%-{|oiz`?_wb(`;?QF*p=H5}TX@ohdv^2R^T}A+bjge2Wrl+3iEo57##j~v? zrwnS;#cAT}C%mm0M6Vb0<{6vK0J$H+@2IVeH1l}D^w}3gA5_m?{<~^;AOxgH0sl1^D@0bhT)BLJNEUg@4)DSm;LH(r%><&g%Y{Kk2=iGG)<(>G{aun z{nky47N~{YCg9>t31Te!YXIwPe*VR?ORF}CmT-#!`m62&_8_|tu(pK z=|s`ql(TyD1ejet3=Unyr;N=bbw6lFEhri0l&iLOmCW?u-C|z1mGtwP#6rj_h1+ea zB18CE1O_4=yEw5uugtY~5x~;*W^Q*)TVS4a=h&`=7JmDS(!5}Up4axscTIduyjAiq zcm6s3+ZNjYO)&r?9NHPBsV;Jg4#oMe%3%tiBTGh<7V@x@I|4}Wr^Uz2a&9KsAKD8Q zN^|KEvidp@nu#URkhled5`A&Lv1|7x=zA*qOLSSo-P7)dJY(JYc$&#g#`M$B(sfLM ze6^Md$Nkn&XRXL%XDy_ipx@}?^XO_FkA`$~8O4{2Hz4FYRUW!c6&iKENeYiiF-_!? zM8i$}R*+}zX=+2@S|WwJasu|YZ8$j5&r4%PZZp1AO=Uk@a2(6Qa}YILVQMix3^Zy` z5fV>qzYSQp0;Mvh#FD^0LcGgCBu)HFRG;ja! z8!zJe&L3mM9SjmznT6}Xs!)=h)x83sS_U=I%b-7ZLm&L$Q`<&GxOC6T^-&|1@VZx| zok!FNwPro)#-o@?ITT>60r6e(jPlWL1!P7MQ%=#3V|H?$MFG8B{j!=QbVMClEsr5S zXJzo+Sn=m;Llhc`P-e%g6djZ;5nTq#w{$>{Rj-=(q}b=LQF6eHtt!qT?L0t&LDQN)w`?G z%w^Qrzt3i;zSNgLxWGmdYuJ%G&=xaEHq05uIlp|*fnkEc3x9c+%~&|D8YcuL7Q;^m zG*_3>ZZg;asS&lzmn%XzAq&+CEegJjAk7F#^YPGC=#<~^eWumf!y&CzpOG9+c90JL zLe|Aoa+<*l_4^f!Q~#OlLdfNSpCg^N`?;jOk^~`|1Gb=sLgV+T&i9nK7R_v8+$KMW zw5u*9;fU{todpj`FcWNrlyI~G~ z)W|wQ)!W|%3N=WAk9hnOxLk-V7OEQdq4=r}HO7{!sCp3&&{H#@w63dykA9== zgeoqH1B`6Lt0~wR(G3?O;sb#8&(`7X*y7=BRMQi7yMvcQ07TO5kgis|zo2CgD@xJq zRhMqWe#m!jpFtt-y*do1=}())8FS|rv}Jrd#wgCR6F~uC3<4C#KXz|66h4kQ)7)_( zyyNV(Nx?ODT9jAKuW)R#r84Hg0Fps;J9;??Owwzi@aO}*@6w^&a!?jtt~72Rn{103 z*~dl?4jRst+fsR3<__1YX<{jYCJn?p)Ztl?AAg;5iiJ1cRpTGLEWRH-TyFMj!5$pm z3-o7c3D}U*5WRRwxg8(Xt+aHYdBKP(A9`|`l+{qLLM&)tpCDx(*KM#@1ppQh^;!z} z)9@QnVJ41)9UCU@T@(-Et6G7~_nV47&1|czSK;Z%UG`(mtCVW9zlGIoPbtpH98+@> zDF3M9A2QfjgZSlM+HgKDYR41Mnh~N5$E$YrqP!RKCe80`)uIka@ZCmp4ajClEW}=E zIq5NY$^+(?NUJjJonKgKE2Bm7JTBji_~;K`M0AC6f*9rVN;Iz3^5ZrJKOsA_09jr+ z{g{YcL*=d@NAQ{WcyJS&=qwr%`ubXeDJA)8W(52j_5Y$3kU2mZ?1xq41{&Y#q^(RQ zva%G<`yn%B*iB|-gNolNENg?wZ)D%3^ZiZEvPFkq?HH@Fe4+MofWV>^r4c@!aSHB-2|%_%1Hg z$nl+&h~;tmG7dp3>3gXtug%J`8sw-_p3$vZ5(cv5>95^?|J82FcBbHiP#>|qNZg|$ z^!--khHT-GX@cjIN1Xo3+7aNrEc%0}ur}VgrdDr3Ak}*Y0w%g|m69%HJ8|v$!br^; zftBs!{Xg7Vo70avTtjaHCwx_j+?xiOI&16=NIze0ERcr2pdXX_jdd!F8tePaS~C8u zVQdsGN?_1%`}@U7W1BK%c7*m?5?{$LW_-5-7cdv^WI6q7PiwZjthEw6m}ezc#TPf@ zZi%PvJbUn?Zx(SE9(CRrkUDv4;~KW@d$DgMboJ{y+%rFj?PPdzo*Ah9&PPR8b}(-m zT9HkYlxXgl@kiXShF@6HUpth2w3~K=nZ{~TWD?MR47w#~Z^7>V;QDZaMm9}J0Z`=N zR^`qJ!Or}`dS^VTm0w1YHgqh7iQj^*=S217y?eA*|LThbk_3ayvpPv)xzz&ze)XS%A9IJTEZak6F&1QH9B4(e4ow$INM;g4&pv*f9?K}8#r}$Ym>+q~$~o#2Khn6Hss`bDX=iOnt2g1rphg6z z(BQ@CMuj$hx4!+AN0!~sqE|aR=fiVaPO+eK9wk2p^~6bh2WjSer1ZrJjLQ7J%rQSk zLi{w1Lc3IuJVMx?%_LDy6UHMfU{J%LvFcC4)EFY;XGqtsG0fS8M~d)lmMm80xrd z29aN!O_2}`h_3CWqvi`E|HAymZez4;ukTP(eYxMLmMoIM1+UrdcyttfHz zg@fwt1iy5p+`mgG7hVSEXoYxS!FGtTsb&wYkklz#^^Et1!#xqqiPaPHhVJAeFUoCAP6JEWPj1_o; zr=kvPGG&2dbksWzUe4Uth%gynAj!&n<&|XJ+kbEV#=HAIPIRKe?K|HL-n!_7VdOMi zuMF=am3nl_tx(wt<^lRXLb{BFHCUI-R2v_#G%IY%jibt#;(!PWbAoa5%dY>8w>bfL z+kdM;R>jpha9Nf0GTI?03fOCKoABRMYufe##kwCLs2hI}TkH}hq?Nr5n2XTa#dxV< z7zZz=rcvD~b~z_~iwxe553b_K|E-M~_K>)m7;bG7aa7Nquu$^0-A0pay6c6Mn84?B z*y|>p(^z5~73Gg3D^&c78pwIjYTM>a3VhIqQ=LX5n#11fiU#_*U*QUw4u*c$H!8Df z(%f82FKAt z@2)DO(k&G_<6G4qv8C5#swl)&$yNSbyM=B|!5{=dgJXwG0!!O?{uR+Vf`<3mtK*i>?4*bX zonB&5r*TbG@Mg%vP0_4S$jV{X?5!ZApt)pMMoF&!Q`)-UUPVe0*?MF@*^(?l_zspV za7O=_aCs&^&64r$aMjXcu9L0j4f6@H9)AC}>O}@N?w1+g6v%VVfqKX&Vpurfd$YSB zozGj60Y0LL=4$XMvU!S2>_68&MK91ug$O@pY+x9EEPMjMbyDgTMk~H|;jR_^Qj9vF z;$yQuO_QNCG7YJi9q8E!CK#We9-(CppL&y4UbP5xT!UR0J%?D}y$%c-*cP1@PXUnT zsee)athEVM*?d0h#*Uitm9Ch1r1|aF-)Mmj0IB>XbyntsdoPVym<_8?QXkc}((I2# z{ct`H`XY`<%7Yu?^YSJz1R=C{Ht7K^Lh}q8GzUSA#3aH{19x2(a;iI}iE!Z4&3D7qK^;zmzYjcMCTJ z-DP2-xpPVMSK}Mio%5EoGdhz$8JhK9bMqxokDnrZ#_!`Y+=*l+pE_4s_bk?g=O7tD;pd57q_) zvn{2XTxSVq#m|Q&DH^tZ%3fz+nL27q@Fv4uwy1AYOsM)FFv_NYi??D`DL>F3HcU&+ z1tLi@4&U0#>SsPf&o@T3>gNeC%&1nx;}P@&n<;wmQD(=(2KLC4$z$*28iOy$h=i?QIyDw!BG@Is?tgQ{S6F&D`OeJ=X?nfEOV7f2AuMj*ekM^Iwn(0*cC? z#w_nf8U~FP8=m(0YFBa85Vq{%z?qM3S%M{5dZnI4y-Q&H4fzNGwdKyWPW|UHOMd7# z8k>v;Gelm@ev}{u^72v0)Zk}2n(K%bCvFx9FEv)t7ScD0os)zUfD2&hl)AZUv-4H_ z_{=wP(8}in!;GMy;EO?Mg;azLbLZ`Ttw;m6lV^}UW)-g*(?kM5iN2-=AsmmlN-|qP zD`I?L<1q3V`e5^VII8S`C)iTJ{(zaP9+ZI4fr2yil765GKu;yOW6t*5%F`pFN0SHT zsv75K1G^zDq3I~FMPdTy0TopcU)^~L|A&3^`yG&JX9DTUTzg)Dy(K`hp!>Z7w-Q-CYI2z)y*-yfT+gnrOzs4OJOWD)a-s6|@RHPC+S zB0Yr~y?6?rT%zdNtxXP-u<;fC#va`5UAf8aD4%Fr+O>P-r)JS=J(Y6!&30$Y3&=|c zUBsuO-J$nUWTI?4g?|eD$6=aQtL+4h1uwO;!106c&sIaWpbCe>a&H3`{HX@{Ub{wq zWuydX1IRzxpoREl^77-{8{`wE7E;AxK4ND8Utn?oo$WL7$>GdhH~x+QVWH{MH=0#1 z|K02xyR6q%>!|FmRLyw6uRb~FrC5C_he=%P#Q*>pyCeScqC+vY9P{j$y~{G0tr2a&XGjdE+B*QdQ`*6SJJh9(&%%!fSDA%Ej<1`-~8;-ERX zq5Jje6eLJOX?UvTVLC$=Gu0ZI1Is8$_I5Y)nlGrXF;Mez6P+xcNdO$$WHuShUelV_ zSR>c-VIx7_)S(X*gauq&5hG<3iv-mTG=0b1d1DcD8UW4CKnkv&osy#>JwO{x+bh+bz*dnZddW8!w$eGSQZOlTj3I~cy2N<{H9s; z&9(+dK3_1Jmxt|szl2I?lXz#$5{ludNjWW8J$=~1BXA)B%&L+K?T$ESELX=vUyjEi z<>1`#@dIwKcT!rgu3i78Vx@a`k1Z-UYcahirXJ&n@~X~bw%FIaiT!j z`F9AvuFkWdhX8G{-Ncz2>dg9*BQyzm3TwHYia6gK$v9UD5J{c&38^2jKB_HQS-`*0 zgL56D$oCR2qxeY4-ZRro?Z18V9jg(90q^NdW6;WTZnDSD^b4vlJL+zRvJiYl2m)mz zw0J{}%$23p`0k4s#7sEXwHbeU_eWT|@=G@?fH<}>zE`|p`Y8hc&*qCe#qlaDQT?u% z@EL1bF2*kagiq~+1VPl|_T8x3;th&ybtM`*`_T(}qUUvKA0glqi-Xf3e_nCL19BP! zA58l}6~$}R^O;Aor1i*5{wqq<0!ZiYp6H`WT56~Z{fGRqNirR~=g1Z%c5noP%0&1l z$l|_&A{{WWw>_pzC~ECk!}ANtQ6%T~b%%0L35-11r8odWIM1U=J-m@34$O@Gp(86Z z$~|WAT0!p|70wa7`U2T|CFo&_@TZ}!D{eC-$MIYAK(A2&|b;5crp=g)iKMo8(Vd86;&47$J|!KKz;Kq1*y zu?*I*bsyDw9`z%PE<=UUdLKVh4^0W5tzyt1;WOtHz6pee>D#=6sin-ZUY6@;l)hjj z$LD5!Qca!bqlR&>a%jXqk+Mg_@w*-9X2XsJHvT7lZ9DIeZ&Z6+z%608^Cu66z>pBv z`#VEj=JzW9(l2@)K!>A=3Rit4G5K+oT=wwJl@ z|0zh@ft{Wg9|WtCZ%7y_R+u*4ILH73+n4{0S<{YF+MCb+^v)Y6e@bT05lMyA(bm&M4Rfh5x##WuR3zpbEOH^A+I}zs%}pM4CHiaGPV1AT7iJBx9o6i=4`}Tq zeh%)k%}S63CA}4={*y7mT1Ek&W#Ze43Ze`o;<%siXEoS=fnwqFMh!keUqF99;mlo1 zr8@05`ir9Y1dl|+HH)@N6{-4v^BICu(0N*EniU)F(U-r)Ul7LGXG%^Cv!L;N5 z<(po#lhL=YZt%uCz}Q^U*`QCv#~(z8HPObcx_(q?m5RTBo-EDw=wtzvxHDY=E@_O= z@rSH?)H#sS`d@n_$+?>ce|BYW?+_>Nn^yj<)WEn^lJBKyA-4j=STbbWchm$h$-rHQ zF<+E3j4dbg^XsSVY<*|9fpxDWq>@SMd>_~-UNKf1-^Hy)rp$G(pbuzIh3Ml})Xb@` zl($){6uR@;LF$?au#=9Z_6s_*ND-w+1)qc(tS*MnG*Z=T=#Rb(tXEX+uk8Nw6cinZ z(EGJwGe94HS4`G%Oha8|O-X*Le2>K$@m`gd&YLcNW zx-4YJ-n0x3=Ac1CV@UrzTHx7cSa+*lutFW|^p_1qe1cR$*}s3A7IykCpj@-sPD=le za*fQI0i4aND&-{3>RGceEb@Q2QQ^Ft)kV!m1^*Vyq~6T+&>U86YCGx zjHpe>nG1`5V#UBH=K^Z1XRy8bQjf2UdPhWliWd{^P9c7oqo}H{aCfQ44E5KM?Ji04 zJJ|=t`&*Io`{yQ)#OD6nNTAaJR)#Fv$wW%^;=Sm$@RLy^gRIoFR8lOO_w-&0#|evy zM+u?Bm;ksjJepKv^47fv*<&&7)_ioKc`ckZX&1i2Q+1Py)2HrwxVs)7SocIYK)2V`yP7A<~psL;s8& zZqUqofimbg=I!;m)6Q!N*z`q_UeLAll5&tGbxQ($YXZYJ!hu#qwkCZcw+_1C2bM!X z{qMui>BQ~JV6G;%@x+LzR8xnRerS!ZdNPazv}X>@A~leLMeIA=TU*0n8WC{|d}>h0 zUdafFW~3MjE88I(4zUdrX9EDYr$5QIWHKCQrP`Z?oPMjE+OEbCEP4^9ClTB*mAn?W z-w{W4LmgJ|lh9_u6|#f(_K>GQZ6Vk0#JNQe*dlsAeS$I(uGVomYDGYJ>lw#&KVkR3 zEtLP@|H-W~yPrJOcIT&u(%v|YrXLFbOWgsi34JuHkrCiF`5avi-U9G(3%8~>gz!ql z#a}9VS+*aQEr2ax6QGVd8Xskg{hd2ntniq^4!+{1@6Krkf-L$w1vIb-s%w(kZJ8aD zfaWS#P{rmwjes-CoKDtJV$Ilm*$Bg|!6Q_=0okapL8XniR+bwxiw=l8Yv4aDz$Bdl zyI#6)J(b9~D_ow#KkjRhd{*gT8xJZ5}q zo4oOYpO5uCi4Jzmwh@eLs&>B;q0-LKbiDCDSpeAmU9YD@_0~`P5&Imk&!UJ&UuZ3y zR3JW~-KHkLM zZWo!H?MHa)r;@DH4WBF7{k|n}_9EQ4CwF;&BAuwiTJokq=a;j-u>&f%*?;I8t^7dD zhR`p@^R;5LaKBri$C2U7l!N;nKMwcVIawKUw(w8-;RG-@8PW7j4pa&2sHIOw)v0xZy_MCt)Kjako*!D`=1dn9mlY50R? zX%~+0#Yw+5q@PQb01Zad{|KM zSw38pJ3h!QA#%hVwNgL|UI$aD?fYs6^$aC3D7kP#>$R#(Q+1RhTnh&-qdr+cQt!^z z5sZ`4u{H2E%o(8S_08&-_t);e18)ucvdC?#+(x%PhJ|Wgn&y`luw1avsN(puQOk>w znGt$Kq6p-S$7Y7yA^aGdpf8I}l{D*M4OF3~NX}uil>L9HeHFylzE(8QToXi9>@SnV%R-Qr3((;^myX?5~z@RR}DAcvMwbB{!%si>KXR6%^) z@pv<}+rH+-HYM^O(yv7Vv$kAHbwyNk-13(Z-${FY2xHiP)=q9tZ zKe5sB1aj@)DOx<(8?L1pAFf2s%_K~}SM6OGD}VsSY7hXfqbkd{yqgSe8L)C{#=Y{q z0WjxHxpYWh7kV`MG3EC;5su-QGHQEU+h@pEg`J&RR)Yv+kksP_2Hwz38NK`PsCUEV zG0l9(S!`{6b4pqfL^r1NbvW_n4i{KHDnNJWE_BgJG`5-I<%-1Z=hpf3Cq6uqOz?zX z-xTRjFQiL5ci<~K0PW5bt;m+l?d-U+8~Ap6hkXj9MDvCse07Zr+Sni@44*au>1 z_Rh5b*2hvGaPuu{D!sKT`W;oN=*S< zN}sQD%RfTv|L~p?GcOrNlb(ORrO?K-g|F5YIGcDv<)k8|<2{ub0$9`+e}u>3T=gR$ zn|YK^OtR#){PYtI&zN5pMuSfN5eL4G+*b=6K-hs$+zou}n^VPwEH~R0VT<-C==xJ` z7EZY0SZLYFnuWg@I9b0Nyn--~G&wfum-4IF{e0=gL<@XnxPZ;@FXWQ_4 z+MKcXVx`+U-jGcg-@J3<@bSrtk`oR6<3Q7GjdY@+6iXq2ac{T@tof?wx%f!@dhWFH zzy(cRn%BJ0Ymgvjr8%v8c#7iJ?q(PJ;!5ja?XdvF>gx>aHo3sNv|t$FFLRG|0~6l4 z@;dvMn+BPGI*sv5UGX+s@*3Fd(cc1ZlSc&p^LrSL{Y0JdzD>L+dkTe|yY_{~5uuxB z_F#~HSmc3YMr3Zg-gS)^IyFR^5o?C^i+sH zMYG~*MOL7tfaJFiC}ItwaiN2PFAM`duPab*cau_~9w;4$Af!SbLC&lB+So4#h)4ZX zzl9B3SiAZ_7YQ0MIiz zElB_^?qn~o7jMSiz1R?Hf2L@0Qc_;%wu)2u6TmNAtO~gpN6On>lip0U*Zq8ahq(W`uS*DAZ(Rpbq0BLa~5k;dQo9DiP><< zT&Pf~U@)TLu!*Rp;lNy&>DN}J{%56s5L|wCBGDt zCueyuraX9k?a!m$7m05`%D>XINi!mpoIwUYri;12N1Z5LW%UVI_Q&=*+)l_=p=+6Z zinLDb8@3uDuWRUR^r--o+aW_z04by!+E%`z3TWk=KawgBZdn0uq@lnqfCI^YLM)Jz zF!aM&pbyS4}{uTMjUe9?M(@$f053wZnZ&uz|O(~3Lg(%NRsF0Nwj|Q>pd)R+Miu& zMNNz!N$)rii7OhOukN}S&j@ahYlmRbxf!OdzJloTA9ZE8Ps zXBeCGsJ3aL;``(G_4ACY$;pb_H0Zcr1qM6ndVH)}8@9jfJz0CZ-kv{;zxrq3e z+wu3zhHQ8)=reO%KpNA{!R-7S=3~YK)l_OKL*m86O99N{DZi+?$HA}XZKnHj?bNK& z>ZuZGpJ}nuf!3QHn!_d)J$fM%QLZWpqg(Rqbls zonAyYq}JK}fKlIK;c-N($t}Ys`ot*-aOzDZUfwW2CHL`4@cWx?aqZWj%l$cG8W+v@ zHtKg0T6WuM$mpzZhri>A4f0VN(3TEv%4;#Z;2=5!UZLzE7ySHAy9aG=p{6)XWoEf% z$vNVUVRrd0fF`ffb@I-#M0vUuRgNk5N}x86tqwo731D*_KokxjG!`;RXWQXl(%jk& z|I*5^NdGm8+--)dCb-hkV5rqBiWn)g^=6?Zu15lM)fWCUoWwkro0^_3IK}c$>Z1H# zNGdV;I-p&zpHgGKZGA(R#a*UyrR?-eVc{-1zJ3o&Xf-SWKcf~F@j_KaOW5PXl4jnGo~=16e=V>CD^piicLa-v zq_W=ymV|_p3Ac(Dvxuv*A-mn|cDJzG|1CqgU*IhSYw;hWU>L>odh>4zJuk02WEVY= z@Y3?mifl?ngHF1oo@f~^FTLOWgi{2K#%f+QavR2kCqaP$M!xR*#H9I1UE@hAfPm_GdAsJEyGi~ zC?@E+gXKq;1WFflTX`Xe?DoKY6hV*R{>v7Esv2$<$&P+cUx6hl z-Fp`x<*xN{?_t4hkF%*+4InBdd`vA= zEIsl{Zk_P@-uCDj7$c*`@uzQWK}PAu;;c;_MU$ZQr{`T`a+gg$TpwTqg+ zu{v9a9Tk&hHYyvV3rd`i5$9<`Pe{jPX_Lv_BW}i@vWI9j zT_bOAJ}h-oH9*3RH6z{CbI)q$%(cT|F*R+M@V+WGYibMJ0X*=^uXBepM`ZbL!DU1% z|3!2DM6nc9qxsR1@6Pe2qIWlrOBRDx3sd5z+r_2kDLmTJz5mCk-1srLZd&xT;hm+7 z{4*{E@{>d$ZD#YRHI=VIkR9cG)|{tG%JSgcn@!9h1=^RE7abwnL(RSbaxki$d-O4Z ztm`a1(wLscC*pby$GbF6GT;s4FFip#sJg~Yi?&wsaAOeer!ZD!r^U%%0v7X_`pWUD8Y=!i!oL*i4EF?>o~HNQGF z2ZmTyvCHq>Y?pqdOMlX4`5CbY*5gABxN18bKclRq_~aM&&BDFs64S>>;(g5^^2HDs zv4n<)|_mIxf8*GgG@-has3IBp9lQxpJ5$+pTd2o*Zo7g{(OiAYY4^MFY;tm(dKnDjtu{G*Ny2d~w^^^CI7`hROW1{|)$ z*ddK-&g?(*%FNKZF{8#0RFP5sG}y{T*S^-XJMn`gjFOZ-%L`;YXAbg`^ca(36X-8T z^odJZ{Ni+N+mU5zJbXS_B(qE^aeX+SIyP!U)Cd+fkW`Ozt1>KqkE{{wItZsZku6^4 zkJp^#K~jSK=iA}4cm5iG8!U*NiEobgkJfCo-7?>hX-*m$`{1{dI>R0N$}ENgplD*5 za0tWIPqxTa;sE1ktzS+`QKShL#(Y52A81N%C;_$lw5LO2=v#v`@V~tTe78of)cLFg z7RWcy+tzr#WE3W&qi726Rdv+9zO7v&8<+P$v3N%S`xd6U9j17L@H60zPk`<}N=t-j zzwjXyw`KT!y3FvBoujwpZ;@SrI&UKlfdZ&n(>CX-^;B-we13YsC@*Q02T#NE1#m{O zFt4#W-Q)XQX$glg6G3?^$?kv*MQB#|nvX=`+ApfI=fD=luTtLcUK;rW@DJYj zncb#P2#c-MJ~_|p5D^Pj>Uwn0J!xe%S~)>j@k#78ErNJ*za41F3nJCxJfK~E*l0Mz z6B*KpG?U&&jK{XN)zz|yt<@$uGv3!`7SXm_#~>>HPeUE>*@XYC3tWkLeA%bN@Ur85 zR{OeNzL_x8%2U-}f;)QIQ-dWl8M0H~dmLC!eoX|_oxb799X8>5cKaM>P{r03JB|%t zGMdawk_Dt+$3aj6>O$OAg%s5^_hLGQ5x5e^jkN|r^H##^A=S85-D z8hNnUWtRe?otXz9*2meM?|@1powmy3{#NryY-yBhmgn1^!KZ<$VthYp-4H zf!M(-8NoWtg~U%E;>gfiE{rg^F&U%AU2CWSqUq{KaWX~)*ckz0%R>?-9mIU(S_Og4z~kV8s-1+vjJeGU~gN>TQ*DwsRNU zxtXz z!xlx22=pv;k70&Gj&OAL87P66EYmM{X04)Rc$CneP&>M1J0{P|*1|;iDsXGwYY9G{2^rOcc23=~?IkZYmnp}y#Ce+W(dM1UqDcq;ZR!=u7_1j0O>S~g5n~Up_b`T?b{i?5G{5@8B~MSbH`+W1 zDd~iaSKo>stFt_+sHhWcfm>5;SI{Hz+S0TDzwSFx_b*MOW!EI z|KRVv+s!YE|IiWtgOPd7p*CFTC+Q*hj{7wvD2R6QZ&CecJ=s=h z1eidx;@y{?I@}Mw$&>Q>0?On26XF&zG3~-zaB2|ha6W-tmHJ*Epd+ z>h3+nRZIr;99%=BDro>c3YjN)3Y15z`iCr^KS0+3=;@$M3zlu$A)~^_7T;~L57>cg zJR=wBZR4BUkuPqr-V*F~KhkS2hh@vgGQzTY^mtXEj#Lv`h&k zOL6raOC$>e{)o=Rwz5~*$BRX42&zMxlc6iPPL0`ax__JZ#3Fu3C#&4&)Lbf|o5ABQ z1|vIGx>aAW&T*!RtcHv!6NFhUwNB!to`{aq0Pao7|IbO6(GQAsr8>hmAAk?}C%emD zIk4_?!19HUJO|6@PWWDMkQLxoOeWIpX}`yrPWakhGouEGD-B-M#L~xF-;RBTWEo#6 zn5whxs)qq{OmaMCE~vwB@Gm#|NF0Pnd8kUs=Cr=+rqR>&*!F ziSW`gPbA#?M09=I)ca))s8dr~vP1;l-w2Pc1EdZbF*BbVwMwVOmtc*o60O^ZbOmlR zsoA04Bb?&cFMKT@bU5BJh7Sro+jCJ|SRLSCd!;s_k;n)t$F-RU{EYOe6ZsYO$eMkJ zR@;Uy%_HV$4PK!oSi_aZb)neyKuCM@9o>i89e}DKm(gPgh#IxfOzlYimBDOQ!*oZD z8=Asl#4GPoy*L2qCGM#9Lpfcf8R!Kcr;POYXj-=8$-vo@@+tm>ByUm1wRui}FE+ki z-f`2cuLz(Z4@eemE=)+%K{q*aV|K6KyAAx7MCQhGD-QA}B8=Ms#lm?{pn>&phhMIq zktp*Jx4Go%usKBXm!uA5Sr4NP_dj{J zzVXY6K3~8)u4@Yej3o3^r&KAkV@`lrym;vSv}xmUH*a@-tYiJ(3!ald#&Z&2p_pjY!Wooq30xHFd8rspJej0{}pyGUxhtt z1D<3dSsXkJY5;yD2g5nK9@Bx=o*jBol08A*`vwr^oF?Q`IX_|Faa%r{dD-)&ZPZqJl zzJM@rE9YK4>@r1dx2%gyn03ZreIFF8knaeG)3? zwL@qC`GRuLD4~UBRzs9g#J4o)y~ZK0LB%Or%t!5%$-#(cthW22ASQqqVt8GTz6q-P zgzDtscb|I_)h+pJ2>*){jHMgmj$#^7M-M)S4?UKL30$+rGF~SkwpQzk22pWmL%-|hV8D1oP~#w$LzwJA`M+(BIy1a72DX=FU6w-8p^69Tt&f4-n9 z`G^wfs5r51u~lSCZIE=X(N(Q83TKCN_K%)Yj@w9il~U^OWH8Mg)`%7!G&xruq2kGO zSx6Bm^RX{NNw?UR7ub8Qe5yLuQWN8Bn(h2=-4i1C7V7ah!^f&UX~|C-g{kp>w4!)+L5Fr7@* z^68iM$UQO$61f#mbyWqFwaC;qtSY_Dv}e2Cx@4IKUA3SXQ66nNCNVNn;cjsc;xPQx6bDe+ur8EgY zp&>rYwYwGDTvzw=6hJS+!nP?t^`D*?3wvO12z-WcsA1L z#y-O``fB|_Un%v8bi&cdeP7O~MEUwsqygNTaZr)m9{gT+@u>Ga=87`XQHL%qiM;@a zS&?dB^o(v>JN|R67~W?TF6v5kDp>5Ti10AJf^POz;tu-c{%V`N_g)0xX|8A=X?jjS zr%ElBd#BIsuiEA)JTT(a~XZ+0j~LkoL&_?wnbxEY~c@`N^R{=?oW>h<5lo6o-c4W<8j$@Kv~Zr6~3jmU3>ieBWmaU*4Dh=1E&%l=}AJ{QcI8 zdu0n}%d0u2I#szrpkJXL>sLcOhIDv+N0rJ^o0r~2kDU=_0$AUqr{7MZXq-pz%pBrE z%rbj#!QLZCbiL^vOPSx(xJK{il}Zal&`#HzCpz9Zm9m$OSk4@3hzHRu%xmwbtcAiq zZ+l^78YG;1L9o77W^;;%vDSQrwdDql0+;CSVERB6Eth~GqW|3cnbtzO=a!np=Er-B z|CM_M`57uxOfCs5s$NgzBJDfVo{*p?%PDmGo8K#<{fFj8*rOr>s0I7AE-h!Qd@mtg zyLuJ3*DI2!;hnu@@m(AtiMw0EAgE)K`Xef|HH^=Vjw6cSy-hgL^It{kX$nr|D{foQ zVRL%PaF2N;hiVb@pN0^8496{kLp8N$Nb{HK=q+s}m#EV7!^B~+aeuv5p2NY!LV~0VYZ#Ek zFxTk)QwajJccIdnAC?FT=;;ODxdX5%%NR-gPOqvt6G^u#Zgnp<_NNj;n-v@}T6reA z^HN@HunEF2_v!ru69d@Y-6pp1(Ex5oSrpt0oTo!2^W(C#Jwu4l`vcTjS1>!r_p`P| z8U)@~fsyb>cs_xa9MzX53fSIf`2H`rOla0ErSh zaL@=NWQfp1g&WG-8X<^4b{N6k_ngkWGbv_drV~@a}8!Q z;#S(cD|@snb9noB-OcpcwCLkhdGJ`&3Ag6a5B`ZKxXerAKR#S(`Og8p_UGRY_ubP? z<|F!A0mm&z#T$~O@OuC3Hm%P6;zL+nv2Hmp9F+s+I{2qR6_0k0+q9o@9)TEeRb3h+5Z6pMZ^5-{2qNog@#}|4GkeSUVFL(gPh?U(U;@Z9_zAMGn@S z_wIj88l&R;1W--KTPZ!H%i+g@Zi$2a-`}_L=&ZWrm#6(XP{AE#@I+5Fw1&np6bnDn z0E}tO+T9Q7=iQ1%A)_>X3=cI@ylJ!yjK+uglgHfM+E&pq^6Jtc&E8<5ao@1;8caX> zblZoCcyIi=Std>W(fQ}D1+|TEr+kp4It`$`(v4Be0wJ=T3CW@}A;}tyhdX~9a|FU< z7g4dU9d1MxAZG^O-1--Rnl5KF$;3RNW#f3Ecz*C#dPQY9y8xmX;I8WXYZw3$u-~Jy zw(y3V#pUX)HxBdgFVc@9E|XI()3w)GNCN`NLh$(r4YOdrDs-bBgRrM>^8$}$sZ(38 z$-opZIo92qC?z^;-AH`rQ z{LRLQs`TK_t-EaT%~Xkb&Rh}{2UBHYAaksjLs~XMYjUql+G@L&tt~?w@lrote0?gYEMID0ZR;OQ6zV$n)wI7mR}sE4 zh`Nvod;hYE%DChje!5ms^NK4s)YIX)OsEkMapo*vaT=AB+0dQV{?mdy-C(UEQ7;N2 zsg?|P+wakpF-3dYMU#_0I^GjbX2q~DEVmd>EoR*i00;82=>yS7s*_a~SRXzqQl#uH zC!w?fAhw5aWpdF~7-M2fw_B%Y5&6~8fvoB>sCDg`cpBxOIYl)zqm)t2wRvMXV| zKJMIot>u{viOy{#@^X`+CZpfAS{Wu#2+K!3IZtGH5QOIQY9Aw&rVKe%I6>9H3*5!8 zt^i6R?jO@|_@;h4hBO`5u==I$h{e-Z-4$PD3tM|Eb-MiQ`h&mG!~e~I5>*eq9AXh0 zMKv{3rXA$?qUT3ek1We*jNm?pTN&WX`|1`s2+N)mFQWLO$r4Wt*79g@(1E`%yWm>~ zeb%tc6ExPJ{^b1~W+RqPsf)5=qCx~gLB5L#k6-M>ZyilOiZ1(f_ELTR0uRkst7wey zYG~k!>N3egG_w4vq}@;4jS0?lwmhl8v|e1q>sXx#e`r(v60`l^h?;pgKb815wvfzG zbO;UUVK83q1PqT|c40qsqX%kN)-irGYXkf81>Pbu^`NH{R)Y6RJ&?anovsk_LvDSt zJX3(Q@c{PA&U6qG$W~j6mSx3u({2D($0WI%p!&k^Q;fdtF}GCPXJJX)mlv>tZ;jgS$~{)LUWz1EdPk4B3w^IMowEG(>|=m z1<;?|nnX2pF#vb|%Qxw(e);p{eXqnZy*fB0rKtLC!x(-ZR6}P8!v1SAK)b<5Y3_Qa ztzIkXXP0=ju-kXqJnWKyjARaJE&$7-rT*@7gs-Q+0_F)M%p1~_sCOR1`XD@1I1r!7 z!aDelI{jS~kV|7QkI(LaXJtby9U_&A?dtD?&ec+XMX%*5>2Qf;YVmr~wT_whkt&B> z5#F=aP^pB^y)?-kA4TEYL!4RB>7-A2YWrefErE!J1Qzt#5C+1iGa(^X$^@#lkU}f@GhcOk2qEYC&PDhJBV%h4Ca}WQ9 z$N$Sq=j1kPL>IG}n!=@HfcY-DBpEIIH2NO%yxJhN^%ewQ#OCPYrxp=a1-k#KgDWi? zto`*q!)|tAX?%s1Crt4MP7LfXzBZ-FeKSX*wJ9xn%!hG*I8$QH3i0jPEw5{spgS}^ z4w<3J{EgI8J$gt6Zb9Fj5cvnIFm3@(pIMN`Jc?TQUDyZEnY6Sw=@QzzcK#Zd*s%D* zUhA&}0#7rOen4smpstQdO)^9@E|8q;1tR!cIr|3P$qVb^ipcG%pc_T^9}Gz@b4*0$@hy4k!_xdv=z8$m?YMtu%N^e28${2|+g7j^ zylpp_IUjrF1q^TJx{s`sXXmtG^eQoba-G4dXK0Fc^MX(ClSJgK*i4&7X@)?7<<9-W zWd>gWVXoT3Vd}nCcV#FpYOi_MiB4)WWZ)MCu3z=f6%+TOa8n%pM&RjIO@^_wXL$W47D$&6ewWdfc8; zdLvvxv(;z8_KksC4gC!kU87vwfhN*o_UgY)^5}F7sB+?rb#%T+gbs%OGw>^*|Bmmh zIlPRp;~J0{nnluF%_{Hzd6qSgzw_@^NLH^iBgbKXtK32Lzu;@s|Iq$~zT>-m&G8>x zYX+Eh@amc*<}O?I>1gk2g6_eGit3EKELWU-Y(Q8l=fT70KxS&5>E;9?{me!-{6TLv zGkjj6X!#@0Oj?DGtFC*Lw--CC-Y82_q=Lv}<$=Hs;Y?`c(% zqiC-VpwN!)NGK;SrmJ!cM|38w8WMIj9; zDQh9ace^_M8jedq;f?dWrMdxbiZTZDoACs(YFb!+bkbYJ80HencYx};|6GkJtF6MI zJh;_xa#|p#mcA`k4Z3**3f#EHdAv0#o}k*Fi znVT}i0qHLl2oJ30{ojLHR`h#L%Dj_uy49>)AWvMss@ zfsP{@j8&rJOGNNbFpoO+G_cRltiC8HEqj#GpTez6!+r7MQY2G$tD5d%p}1Zv^i(8l zP1J3&P(t%$>GkDD`G@ai@e2s zeEh&=<8&255OqF6hYd0$Z)CqYJ;2_=^b(8W z$RZJLs^fZH3oY*}HKdTzK)$lFva zlo`3Uxb{L=t#r_4Y71xU+8^B@A78{z+$;qN_K&cNBv$LEBl@4zCty%N;(8q)&KrYI zbYGq3m`?fa*>|Uh#q#evOfl`4x_NEYJJX-U->0nE@;2v<=)+1UHuIr9Wrz&+r%RiR zG;3LpBw8)v6?>EdpraHT+|bqeNPmV>%g^4ju-;edW^(IljdLFJinW(8>@x0cq#&*V zu2NdNDwsm97Mb&clsq{1y-tb5&#E0BhHI#Ie8go}1k)+L{`}UON+23EEo4%!pc{z( zlQ)x^a^v~gm~vZhn+((Wx93WX6R9`)S`}Hj4yD_jz3UEr7#>NmU6d@)Mon_H^KR5qu-mYL3O?um(+E;p<72F47Tq&#bTW9UlyFG6}Xwq|2dk%9vcp%8)=cp?<{GW zO09?&;~WTbjL+W7*k0}$NBdYppj5 znvd{VIm!PX&2Wl(ulb?z??-o6_7`9nFeNT~&WM~t3DCL(nyqtozzVEoy-eB+9*hUQ zrSI{1oL*}BeYh-UCG8aj-N`_xdYmi6jk)5_he-$1P%oCVArx+4HoqF+Dm%N=k{KgP zUS+$?MD5ER{xFDPzdQU!jJ6@2C1sCoYM0c=I^}YA$oeU3HCX!8v_m&&fX2+Te1j;> ziKA`zZ5m(Pv}i9HG$Jsa+E%+uAmG;SiqqwS!r6N?n(Bv6L$z5LrDOujU%D#A=eaj1 zau@$RkC^rcTA8rEQZO!3SS5}-JGoN|HmoQ?oF|-_$Ad<$IzC>w+T7`i5(lK+o z2i@PYuOd) z0?iU4b?L^NJc>Q6-}$Sxw@qsx@+4~Oo$%EryULe+r3*`oD<*6Z=owr;e_oF$QSxuAQkOScjW7Ggy zK?qcMbd)9{3F$KxTFYkP(pT=t3)k=1+$=|JyyyFKUM6;m35W^(ugBc~JLG;s$pz3p z%=s_rO4!^-7HCN&ZC4=-?sWtEQTvZ8s~*!6vy*FU6w$O+ZJ;(w_hE^{iyG1rCnlZ@ z#Yw}0A0;z>qnnC#xzvlk?s+XuseE9?VeW&&u$F`72FSJw@_r@_vvgw)&dUU+ z7wlpv<~G0#egHmY)(`28z}iQj)g8ly_g~uxPgAKftvG?vQz_Ytc{Nl^H;wJHQm-7F z*g%(R)s z5wuK~-qT}?_!!AwW_KntVy6i)QEC11ts>t~;X?U!H*`GB0^1z5Q?MB$^Rw8})^7`U zcQZ9)lhA7&hyx@Ts3oB3b>si8TiSM z(Q29jAECHd(N*cIhcp=ldYFcmHEE$*cI*;y>jil z=UVbAYfd~P=742uI$6K7;IeLCEALyPwF&#>Jd-5GKf@Hx#S8#mQg)bllq#fQ z;W}%S6vcN~ruX68az32ddp*4JcYc=Vu9lLpP?u!EFFjC>Rr!#5OEL?lKMk&}$*?nU zRzlUfp0$Qi`(U!&$_OU0ZH3RnOUk6KVy+~RtBEnmDOTZfhaMC9eEEd6ux}&tK~E&F zLydaHo~n)tCg2kX@Z%*$;|J{}V4H==zIYnwIUSoB3k$NEqT|LlZWCO#5joOL13gv2 zpU}>c{4X8e-IlLWqB^4vTLxN8F==(`h-88yLZfiK#Lc7tz3aAWke21OtNXjuGS+XN znbwR%X9I81(5{ufG1?Vj^j`xp_g@xd;J+V|mZT-l&P-Vsk8l)G&T6MxUst zW{)bHSX17^le%f=IvBI|V*z$vKFgSkNLT`1?2C=rnmCc0`?z4~JVz$dCKg95Y8ItD zOQt8+e&VNG`CQig)SBt!(T9jDF{r+6YLHI&S?N8KGDMU+!I){ZI~@Bed*n3NU$;pz ziCMWta*oNoT6nj_!9g%)Kh97JgPJl^J%|Vn`Q*;V-OvQe7#lEN{Z;!h^eV87{%`XO zc#13lSf1<{)+&eaCHp?05i64q>4Dx^WwDD1j9Yv-h|0m-F8EW;P04$cYEaR>{Q91O zdy!=w-Tk%xU<4vdZjZxX9BRH_m2wcFG_fe>%+if?M}ct}nX&s~`2NA67@T?_X7|ETR(o?TN+Qy|_z>kpEa+ap(Ps>$_H*DaL}q zW|MOBtJCGZ3R}k+ACWlsIP&4gpFNnlS}CN@YDH=nL9PuyoBl362nd+>A+k%z%Y;9T zFb+jvk9~5?d|JRnLp&YUjuuI9Z2pcv42bBa9YCZ0sKmqQe+idmEec5X#=K9`p}A_m zk;JuRby?f+26v6ahi4it&z0(xz};xNX_Bb`wYh>XtIS2;4987$fA`w4Qj-E}9UYhY zNUjUg*x>pcUeB*=Gx%+itI(x2!pa!=F)-`i|DAQgXW0uwy2eA3vU zYRNirzq8w-!rU*v$t(eDFwWG&5aD>w#(D5Id6G7J1^d3J)sOzEcV5-%-t&whnbv&! z{KE{wQ z{v$KKMUBrt;HuMwq-V4&f>JfZXvzog28K)8XR2Korb|a}Ge(bZ?%JgM+jDDSN9{H1 zLaeYkuzqS%ZE_X(vZg%ke())WZ4PfzenZ799k+QVz4Ta2jmm60QyvlS_TfXDd6S{# zi?&U`yU*YhiSn7SX`64xl2WMqyWWqzNv9{z$Mhj5T9k4I_$+?5>rk&|bvycK+!?=s zc+fewAC@zfU#AhcLmPg)!$B~_w0e18+ta+($DJ}bEq7b^C(r+FDSe$x7Re6fPMLIO zv$HkZ2t>~xS#Q&Q`;k9#^^d( z?#+HJOz6*+-)#*re&a!(kvw?qR6%-HRG1{_ z-w%Gz0kndSW3KUVc1`34=~0bbh0&fz)fjqG3*1&-@Hi4|XlaS$JrvOlWV0x7VE$~r z8dvB*cPgn(7inwX&iaiAdP53 zul?>*Jt6`!UMq>C+q*e2UNLYNb9$S-5I?WCa7*I&b=Pe>v#dVl(>dk{_**OJ$Z1SZ z2>YV}IwF{ll%TBZ%8+pQ<6Zky!zT65_Ifz|p=`8WQAck)RgBL`g9im>cFOsskS%%+ zrh3ofR143c)lz_gRq?cVFPSd9o|<=!_bI^SD|MNu48DI!oih$w8r-)g8CJwSd_vW` zVoiVIy1?^7{kfUNAKT%8HgrJKMwkK>hIwO5<%RB)ZgA=xXcGZfe_;HLgYx~)TdIR8u|7HHRFq$|YQ~btL_mR48@cl84rC_`Lww6g(Sm|S_ zhsQ@Uf2`|;xqTp(q1C*Gn_Scn@q_xXccr(A*DkI=2(0xE}I= zD2>#ww}Eo zJ&xtRRPOHc|F8g*G>L2YZUU1yHv8j8X46YrkXrj``qssD`6I}og7phfqu}?a)S^$! zgb?}647s0@BZKsiLS5t0L1b8R`J=ZLdfLAp^`-VtewZ(kS~`hZyOT~F_=HEubAtuA zsOTXScEMf?ppw1hCWKDA53d6&3y{bCifDUax$FBjo(4H4RZyZX3UplEFHHmzK~pqm znYIU>|KNBsfzfr|scY0(wLTp0oZX>}p4|^;C`fWGS8PphuZtiR$Bh@RKfaqlo=OJ` z(xnP;f!zpJO+Dazzh6kLt=m^(1Z!J~AwsBtv*y9^y?(sTXf1N`L{>rG4D~t z?0?#5&d!Gq-#`EGcY*X6jE0_S%m%?P{-bOW4*h z9a$kACJ^Wr&DN7bamx$ zhi0Aa-~4$KJgV=$F!7Ebzaqm;%)y*DvziQj;Ddf(^L>quGCp;zD)5O*Wo^O^GMy0G zyzgW6^VV_dbb7am_4+GF`a<0Fr7BZ!V3uw=F(CD4{8ITt-f=RE-dFr=XVGsX-M%si zF{0Vd0IQJG%(8FF-u4Quht>Z2+C35oC_qnK*jM`XsP;)-7i>CvOg|tsfI>-C?FqQ4 zWpUeLcuExOC*fwHAE|Z;B!?5B!_6_Hg41dsQmK!kKAX}^>Vq*^^arkJL2O9sG1V0^bKz67Z3@HYl7trcs(@P z%o9^3jObHryzrC@rMZ;<$i2dNeR8i8_cqlMV}I`8I5lF4J34Z0TWtRlvf}hVUsb@b z$Kg8&P(}xR;OF4$-#uxsB87fT`EzGd`ES=mUY>16vn zU3n=Ry~Ww)(!>G|2``5HCUq5#P;%28JN2qg_4~?V@G(i$OGlxp;!J}vjk)|xRBTJZ zh14gRsi(!~p{+N^yLCIghs5&zTl)L^7Y+vDbf+wo4kksAHNhxi$%a>{DL_b&0O|Sh z1WiUB-*~vlwV|eMfR~gx!j5W*CR8GkFSL|#A^3bhGUboNHgI|r_d9z1a?GpqKU zweW1Il)}!k9I6Ahfp)y_tp`#UQ#F`Yqw@m=XnL;~nJ$pVER)!B-)~Ga?TQ7C4WxP% zy?9_Q3U2sOKj_`2$mQL=Gf#7NoADP9aMmB)%P_6R4#D?h8Hfo^EyO*?hfOy#wI4tt2I{ zw>-L_P5tviKPh&+NkunooHFX@Ll9_XB-r#y6sV*ssKT6_>uuCR?B zOS9W31uCq%XgPqy%5RN6la%e+_KaE-cAJ*t=os?5)+a2V_3{0WD9YXQ>#iJ!=hs7( zgRlIRjx65;AF}EpKdjSCr0+aNo3ZYnwjHF@bsBRbpNX5-CpG$gQss~Quh7Y|p5G|^ zB$Ik$L_^eEj!ps6VCuCr>ot6@|%%rds7)cYrA*;%bjqVfH z;#PQBCX*6-)oFUS{#jxe^R{0i&Jb4Vp+pHb77U>{XN%0^K_iM(&g_-2Ce zorr)7o)w<7_ZK)Y8D3iqZFKjs2W4Mb_NRT5YZB73S1*b#wSGF`EjKvUgAUkAI+q~} z5;Wc?n;qHlxHQT?1ub=r_qIjSj~BychZS_z&s&T$;_{e# zj|d~u$Ls|hON2MhWqPZ6ariy=_(=OVe_{(8J(*P5x)wzOVL%yzf#@GK6lm)%9`sQh zg#O20-q#ta8?-Ea_az8P*~V#CfZPiQ&`usyUkxz81CjAG^kAhUfa4OP)>|u%Di650 z@6H4awkI$P+(79ohLpxm1AjSxS|VKzC^Ta~1BiqAZ>l0z((cIW{Bz}hR*6q4t$9=pzc2a~Rnq`PRM*roZikRLT+&$;uQseZ)I z>rk}-!myItbXkyI8WPTBe&^#=_MN&#@1L$uUojrU|9wKjQM6PsQQs!uzFo}YfrXXd zSF;Yh0*aGf!HaUZQpCD4n5e3Pdq8u^HfVP0PMCcCz@?9#$0}RCNSoW`R4XT84Lga5 zs898F2EKb2Y$yaq^X*@x-G2#1rL?0nMfS0!D!`Y8Tz=SJf7$QP4Fe-1m8u=dHlu82 z041-`V+w@9t*(Mx1;SD?1~hkOt_l=eZ^MAgIb%phFTiAFf5G@9RH$VxAcUEw_wzdE z{vReupp z^J!3uXdn7~BXA|UOJ>Cian#ARnX-3M*6=ECP1b>zQmqbFc&mk^D zH&Qk7+X$iY*SXTqDg>Y*VJudixh4;fO1^IKSf4yb0oSPfU$ylg{&S7`23(^QS)Zf7 zzn1K*w%1_ztkLO1wPkapng0}54KIqwI?$CnOCF(Y8l`uvaD2v!s<9*~S|aa7ykRLN z0q|w&ZKEe=3!?ypgQOCB>-y~*`{48#-q%!BR=S9}%*M6Naj@P5z z$I}_EloJGxuXZUdRjWFf$zf&1AvdqzH9cOa7-iyVJ7t}Z(eF7|hOK2^b7j$lFG6?; z7d-c7wOJIQgLfS-B6kCO^8?3C(al#JCqw)>roAc7&!REe zNR6qrM4;F?%@cBe*_NXLVGt3VlO}o8=unN```qqif|H&44-9Ldm&s%q4SJ?S1 zyq)PpbXkRJhLkYkrRZpF{2~;I+tG z8%IZ>M^}#>zA=*e}AIlrWnCk$20kVByD1 zbMN7s=ZFg5me+E8#%TEoW$#%`bkw(F`Zm0eZE zrqd*hDw2Z1(g4>eR+=MoZpxu+0?zZ(pav19dDPGw#pLLPwRfOL1bmKs<4hIn40dhT zq%YhXnWQY9W*LUJ2Rv!6wFm9sRk$CESng3Z^#Xzi)eBK$QDji4FgJUkavZs;3VQmr zzJFwdYG;=ZVp!zCc|>0x?0?K8C;x4|DM z+tpi;m*O+4NyD-nj_X+FUrUC7uePn)J`B0Hiqz80ap`YxEkB%V*uK}MUnTPvZr|@a zoBca`JpURV>E~g7ZdP9Ik;xW%2$QET3_NdO96-L*&%;wbg4K`_!E>}voAx9;7k|G=jN#g; z-jOBxeC_7lUp!SZUu`$_2jwQ*HI-fp73E8x{#JISYQ%Lk!eDU+c!W6D?=#mZXtgkR z?AB+>H`bQ-ukzlC7eRBM-Mk%@6zg1Ir_F5t#Ln@v*3?{{%thRpZexnc6vQ{GAUZlp zK>c`)F8p|lz4mCQ->9?T$|5Z9p~i@v&OK~oQy~J4pVd6aUv)%N&h5Q_z5Oo{90WZb z{{6d)E_G(cPA|R{sNz;p={M%2_%~QJdn2Pa%h;kvC?ZZ}r`&r(GQ09+x&Uvx!gNAX z@@9TjzE-+0ocX1w1=wV0J4@{OITQ*Pe@pxHL{BO}JaxJ8(g6KL#`49`3A#f`?(h*a?hr0OY=gnhEee9N*e|PIjEtLecPL&o{UZ`NZUqFK zXe4=Xs0@DDy~oTB?J@bDbPe1FB%BsD^1dy2@I)&_?(6#DDKcf0|;sm zUe0F^Efw(&a*!bsw_Z7zliLdT{?ydeuw@SLA>9YjQCoaQGC}HxK#;JWfIjNGf@=RU zC)^avnmHU)Z6!1V5&XdZ%>!HqJqd@?m*#ps;DxWmsy|f#hxqh^Pym}oy=YIrX!O|Z z#jd;0Q&a@?o599;rj5ygY_as?a>9sRe{f!sIn#;XE2)q*=9iy_BoG7C4o0qzn787R z&a-&4fvPZ?Z1S)2Uq4yQNfX`V*6K`FULABdh|?ib znIy;*L$1`2g*BHoq(zTUDJ@>SSi_PyQaV&fTG~|OmQn3%(S86>81O%7Cw<9g+Hwwc zjOnG;P{kIq*ct-f9z=UsaKEf2f+nUhuP+1FNOkhbHo7QKNWCN{9u>I}ir!sLY!3*N zHp>u+$MpSFFN$mtRTtP6FWQatYcNs(BP5#TJ@W29MJSU7TtuGzp$YHlYak7A3%VT- zadBXUXKX;N*+0CfHF+x1a6e^csF_5|arU5d+DNlf`l=@ADL}wE`ATx!stdn^HTr&q z6;RYLfUXOdm1Vkw>HLFT2$nrtZmcSeCFhw1yEMK_k_nXSLOp4yt?WE894#kBGfiEu z<MK6Zbv`}&@r^E_v5IyWCsxg>8L?)k=8=mDL( zJ{Oh#bS}e_R0@aG##Mx-_4E^rRs;$0TA(to_}7XltByEp6XeSSw+UoW()|iPCF!dY z851x^4=ILa-Rl;^Irf9O@Sc@SN!Z7m?7*B{i06r8mwAfzpRf`9lFlF9qsd_FNPGw7WGpP~Ce-AuuhE$mdTHc~*CTx~_Xbc(f{dLr+t^_`Hr-Ut4O|6oE zl)M6@T;{sFNY0%HgRb0Zd=XWC^*K43A2DBNK{uvKyv;79Ni@uG@w;|OK}O_V-t`-A z{r%VMsR~wxbLDiL`Q-RbN>j?D zEkkkZ2R^e4MH*UwV#&3L%>^}K}nt4R`OXdf{b zK#ha}t#E_;QO0TS7-&ts@V~A(KIqeQAI@zF;E8K2r?@)N@M^=h%_1_FVt=A0#=M|_ zPPmI)lhEvqboP?rT7!FS_+hi(!efWjbLb^eIFXrOY@)2C+_R6PH3YroXVT z@mk@X2H+_j7rG{LWE3g;{*r3#H=<|x7nJw-XNfPq)<3x$1^;}c-%ls)?X?+}I;+() zMWVdtx{Kpj9=?q|Yek2~~>{bn@#64aD38)u<=AVsMzoG6i}NV*L+r{TR()tC%9gaHrtku8CyFqqk9xNFK#j5RyP z9k2}4`=O{kvUt~ijfYBhc89%}liz*T(?V{8DSBZ#ratdBG4BWxv814Bn5(5xPU3w#7`y`zW7l}NVJb3 zOlDal=J@DS&iiYF4g=h&RQOjEn3ud7q(0S9^$Yc@`yG2s#;%#vzpj5mDrg1$epbMI zs4|qRAa)0!&q~qVGEXqKgl)^}%G4C^utj{^%E~Dhm7P~4QKG`;(qo$D|BGD(52XyXI75jEA%OpzK*uG(uj82rt_p6;XquIQU({xLrS)##$ssOJ)& zM!aFU-ybzIl)swxC*o6rESTuD?TgW)yYUtHubG{$yt3t8k zd!Dqlf&+$rA^<06br-!Ex_~WZjx-IsX2U5P zc<@2Ij>_-W4Pz92s<+T1`e>PW;2uZ_^+1Rdu;8hc7> z6T){M?8kpD&SQ?kay*x07(XlgaEdABK2jE*NiEbjU8e)QcH4K+@A60%Rj3APVF4cG z^G#pN=&`3SD}e9{qkFZ8BYJGKZ_$J>OhO*>MQfX4*^%VoSvnJJ&oK-(#*hT^GD$r+ zQV-(!hd!kdN-G;r2l-_i7~L*UUQjK@Z06fgWJi5Ysu=+uf1(2CVJ_Q-EE5lX#UQZE z(ChcMQ$^qtd(}pJ>rS&Ipj=V=PSD@(V8+e~7Dmis*xdsfKB9HQlz05cE*-M=P|DE| z#4#|sALTg4w)^IA@O3~i*TRI{x4vY7PZE3MCpEkg!p3DihwCE_a#4iU9WL;6Vnt^) z-SN=*;}Fj1 zQq`PZ5*KL!aS#jB=E@lmyS}|v@TgjONkr9SlfwdavTO3yBUUG=?H>%z41iX&_hid} zrtq0$H;2kiH-J8BJJKyFECw&~J&Zk!Xf$Am%}b)Z+HLGeF_<2T{*Xx#B=La@%rNNp z9c;B>lxu0WdW*Mz(JJ22pB2x9f9OkS0;mUkU=}_M_wqB~R!om#l3+y7&8|sU znugm~Rhmmgel@m>`Dqof@rP;j<4=vZm-3y=QyAF=CGD;Gm0`mkuC?x-v;r+$NG0iD z))>s~p%ioeA;nRI8>t>FVGtCtM5ka$tYkS;%`%@Kesnex0h!3Is_ylprP-`)J}>h< z<7K%ZYa}R;9Gc|9#L1RJU)7dQ0D55Mqv#|sm7$roNf3jqHhC25OYIDPN)h>l6q=|` zwF98*L2!)v+`DtZGAN89aioHZZ$m+Ht?H2dS13a=6SB6t-JYWV-hu%XG#IYOx34f_ znnjq|oXr^ni_zu~g$4}ohr*$h8BW0dtVykFD3+p-%d2Oxo~Hb^gW)po^MbxNXZ8bz zP}(dYL1`D4@URNzm&~itWe9~l8wL$+s;{t5zO&OZMgW`F8KPi9qCPWR9*#f!_w%g4 z&rkQ?&odqNG)>}Ze?B6w$${jD-JGH+bX-^fQp2`V00H=~`nfKY5&^AHW=f5If-rQl zb1KxN3E{GN))wh;b_q%(LM@)msVf<*Dx%%JRUc5XOE1L5lF7z9sy?y>hu<>B&yp)q zK>z~IUy*03DE?VCd3Ud4jFbl{Ooz(Ui@x)a5HGd+a>Bvqq^4K7+@>RdY7Mm-x##kM zn}l8sC*@(+z-2~oZ@ce1n1%{>3>E4Q>t)!NDXGRAtr{ih5>ry=}* z-w_RfjgI-!oN%!``N7IhW0=O#kIs|XP(F(3$h4_~YTO=eJ?fMXDQCHS?YO}?lkkru z#*7zr=dS@(5CmJ;Wdtr5>#C6hML*l-e#WP1b3>hCSCF-ytc?mo%n~B-lA4p)ZALDB zvY%l^?DiwKL4Ac=4)Z~kl z1nZ%0zG0jnc@1cKRYfA0mnSm(b_4CNkl?WknmrpAQjgS+FfFf`!7ttR!R&xBTpSzP zPY@ay5(y1WX33#3G^*Bd(q+rkEZ$r!bWp(CF1xeAgbPU!NxEDNc~9cWJo)|izPdW4 z?GAatPpkwN@P(on{5V;AxC_^}et^$FMl>}x|N@5296D#RZw010Aje71;ydsjDWM5Rh=3d+I zBfF>Nxmp_Fi>x3$~ zyg90ha1pQrAF+o^C!+FaB_@KUD(YScEQa^4VLj|06RBmk!m$pXgh6cBdYs6Bhs&7o zKKo$cK-2oxA!SZ2;S0F2c3jKuokGsX=h38##nC3?gvKvppb*PcCutF8WHX7pJHsJ5 zi*(t;{yElGM_}!J)F9Z?Dh5UuMexBZyzW;t)I;S`GYJ}0u^rNHPBP@Ly#qZ`AUvvX z%|5w#cXv{q+@nn!-FBjv(CJV?wJ0-M<8K|6bI{-Odg{*DP(CPhEDH`h`mIXgst(dp znR)+kV8ph8e|Ef6gOyrr_|e8luIL={&HAbQrznVJyc1=^q)8uyQ~T~93?C?ct)e*s z#P{>O(vlo|K2}y&x}KTD;J+kV!4Fcp^LqpEjJ3KTR)_sscLMd}yL6L;WrK*@3ihL1 zftrs^8c#o-EtL&jqWtH%?^JUBMftx0Q2NxG;?;9>F{WEzFHcUbR6A}8$OzHE{uD0t zzq;&hdJgGd##l)rp=QpJCa{L78Lf)%rf&b$BYvZz>Lt z4c>29o~d`M`O}3wDM2T^ca4M6(wqt3boWWCnM8Jnr7gi+GmWiv-=vOP;rmwW4*w|F z!&)TbkQ&k*;2*(DPNx%F@E#z^xe^hU8^ZR_KBnjMqWt<0Nyu?2( zybV?9X=+iYI8L6v((4U9X%qLypwy3)d%Vpy-C6b>J>Jy~wA_6DWhjqvSyw>K3Ty6k zCED&?*sgeDyq4{?Fw&-O$oxgc)?W+8jt}6jUG5n{)~MB9O{ed0S9+3z2tJK3-^FPv zMDMXg_kk?LH0hgG!uN$$6&xDs05u&x7k=`h!x)C5QpIJQ7T_tLZv?j|;zs8PB8tsn zpyA?KT}tL~rF3d&XWHEBVQ>#Fn&NDZ5jQ5hz4=@F$9tac;5%73Dn!5cmqn>4{M0yU z!xG45*{Z;X+{BaI7&x7`gS#GYe{gwrc zHJ4t?|NntR2)#Vl-WfmDyzScXO}zkdAz<=X0d>V{K)}J+PIaxTNREw9RvL1vE?cb< zuOvc(EyamI?I%+9IF*^~1>G+`n_X#_3(7S)ZaU?8#)g^NAF;TfEi}M!wX)&&DhUD; zBwBJZ++X%`VW8I!mW96)fU|b7f4n-hY4o7ycOJ{7QOSl6Bnq_ij)c$p^><;<%nw*L z2|%8@NMgjsHI2Pj?hd2aLEBUAG3JVtPRgEUNS$*k+q5)uZO^V)78zI1xDTY8C&tU3 zrw|&>7$e_)4b4a;@vy!4iTX?O!k68OVQF)3iIKH`ACcFU&K0$6W+#GGpM>^gDOoeq z2eIuDZhXgAT!%+*{PNCJtb(io$k-fLv>4yK>hUWV0sE3hwoT3mTGNbpURiQf^gTCX zrN|8_H+Nq0#M{YIK@8hg@fS7#!QcRAx2Ru^v!~0}Zk~h(xfSRXI4COcF z&ND?0iRgZz(NOj4eH;w?BVAWiiHD+%iMo^F(?<@NdI2-YDV?R?h=gFwyoPVMa(o3y z`K9#o#1!`62+)i-jlLR=6E8Y`v$(@WZcR4#L+PA7VKBo@2r%mu@l7mgPRJ+{U^hBm z=U9ktnh4tU8_ZP#7Gan|Z7Ijk6l-w(K#SJL>@yf;)|;w(6pxSFw8`fw9aRG0Bv~aZ zMt*I~QCq_zh(UY6$;j1nh4%SUNlh92yQ=d(uiK<7i)xuWMRIyI{D>XjQgm_Gr(jCd z)?NH4RuujIgs*DVo0gjKwwOyB4>L!pn<#AeWA9v6IBhFccMlvj8Vh13@1TR|eu?hF z*#HBMBioZGK1{nV{=fp}?l%lV%1E^c)yaEM|Ji*5nOo&z^P78nER=llX@r4g7Z+&N z=}tHmmH{M$f?LxowwFp4egnvBMyZNXafj@)x3-y^bDcf~p-#495%(kF@R3wtiv3V5 z&nzDWwkhjh4fUzXVj!$EV(+gAvitbf55ZOdy^P!<45?Tf#igM_KiwW{I!yY@A1y98 z2unY`s;vi?VCC(&_$6u})M^4&aKeGxCNJTJrH}Niz4o2`89p6A1BGo*yD4_%yCjM5 z*$H499W>Mrqe{uwATuP)E&14-Y|cZs-s}P=fzQ+ZUdOt1-Ft3K(L=ALGUyd8 zsDf;Ikfw9i@y$qO)G_|9RY_g>1S<*VG1A`{V}{V!-uESB|+^nth0D@#h>LSM{e9^hrm&ueh__1W2B02_*B@|K(0 zEgtLaVC;QHDBqCurf8;&C^(4><5I1?l7+8HPkKQ6i%bKdP-DEm6wTq#lWInk@X)c> zcX9PdH&nPwzI~mFE}0iK%WwCjU$Q3Kv4>pI1cT&U-y?E)Sf5lHzoSUD|Zp7Dmzi1?oFwv)`mDV8S`>7>`fGcRostPQj-2L#xQ(IP(6S;`5IBt z;>x~gqCcMd4#OXc8Y}*W+o>V=qMN*Mqq`<~Pt>&{z;nVzad?+hJHNK8sMS(lG)f0L z?#jWnOg68$pYq1}d#kOD81GGMaR1)#d8H0^@tk)re1S8%o}HC5!3J9iVx?9DNH*MO z5f7(;^olp=HCz8sYv^)WFKOZ!0GpV>ttchox%AWBqEecu-9Y<%;6-JW;f*F#0ikVD z4kXDu8nzFL3sARfVn82g>vqFD0K#7Bri9m)fSIOA8E5AMkw?vz9nd|8fOv<7fmhX4e?mzczoRJJIh?X1AI(bQDOE3aPj zAoZz5pSyZ8-H+fXmJ8So{Dj~R_@Q0i`h#b!tmk-pT6;CF2m3cmwKaHDap5@U_3Pg0 z7c!*Jq9*gxL-`a{&B!ra6yxrdT&LCpfaR5oJPRy(;pus2ZC=Uqa|-y?gg)9i3)-uO zxEz4&Q=He$rsi(C?c%|5%IJ-}~7U6@7Q@4A-(S`Qqce&ji{^^6mIV#`l5)Kpq%+8}8?Q zdH*D!fUH15W25X|55Izfx&IL4%$y}ZZmeGqspm$DqB=e2)u`4sJ2p2ebcdW#rZ9a@ zrK#uduZV4xdiU)Sj12qdA)`qjh3cKOf|R%i4i)a}Y5)>TsBb-N114a9 zMAwPI**$`nuDSfFXhQs?IkyX26;R|3<+SW;iF+@tZy!8N)!4>^Jp5ROW_M#!^iEJ4 zMJXP))s<&cgI&0_BP{jY`wdx706rILRYyA|&^VzP(Vm|Rnk5i+F%(NK?=WU^@zhXt zjeTL+S0qF%Xv#3-wpLi)-JUeK z{W_Q!^3`uUfg6%i6-Xm=ZdBy@N{ zy3y0M8aDRB3+(oisvGFcH_<>1=n3DC1X(naqZRK(7RBQ&%8lClsB5p-Uu&Xc2t`64 zAF(`KyWTmm(}Uw%F2g;`JEgKRwkAJ5d{s2r^AdnpcAQ01i;LhSQ3P&Y(ew3vdy^&6 z`A3Mbhf|~cGXx{r7WOc(}&b8}hZE zleH{v4@%|!oTT*n52{8S@qQAfQe#b|-08YEBN<<+jB~sq&SbC^iE;1rq`Hk!3<$oM zb2x9zUTA6(!1kS5zwwo&Jn;PRy~R!Xfc}5NBmfddyhnB!j<$CpsV+wOv}^CmbM8qq zba2$Dpn@G^GrsCu*~#6=|D;AXGJxpHi=NPw)YU5hN!lTs;AT-)1!U#4Y7BUnpvyKX zsd=pMI_MB!NkB!UR(W%fP$ zXBZS5KG_*819bCfJvelBc23&8=A`@QF~wP)PC?K@h>26-XExrh$Mr&AnoDOvkh7*f zFmoBzzKUcd6qPPo4f-6@&O!_Vk~;vF_cAjYJX(SBx&R zh~ls*qC5RnCE}qEZ?!gP*0d4gq-p=_>U44a0fK%o)S&j{3%Z6>U6i=-tT6z1qAjLm zi*noj0mM%AJmL2vm4GP-lr-t*Fz80FN}R&M7+%dVy*CKqz(o*QxfptvEB^!5!T(^# zlAohyHxRq@ZG{dEIxvD*B{; zrKvoA>d;3M@oFl6Uag7UCCAmYjlyNZe!%VpEW(0lG-lnruiz%iTdRG*S{-0Ntev)F z8%*n|f;fl4%VI?99y?3VsIGW%t!48y%asbW(uqf7Bmzl9fB#xpwyjNuc!*f7c3gH2>bq#yc$0%0f>Z) ze7|RQM}c9=wXq@%@uf+JY<~(+IBjb@f|%SS3!>*+pHuW7=W>PGk@x)VOEZ5)NjM%4 z^}%hoXg@B=f%-`NI3TK%-drQjtxnGL{2RpKOSVCJ@mP~+N}wD_Njk1Xpn#gkK9au@ zErTQl4~Kkac*<9O$yQ3%R-?ZR2p}23oj(~pD9+gD*%oG~k_+Kxx1Q@_xecDY>5g9U zNfuu$cGzvxQ`QCN+^-=OP05SOdLiu-zGU(#iWE2rrQ!Qu1s639O^V<9@bB^-uK!}c zX^=y~U1bq=xS(5TT4_eL27k6;EOi>$gT-E?3Q?V0jXAp*Ij3;ZuOC2k-up+sO33!b z(xuCMU$xp)J+)fMl2V5yc1=Ak@jkv@SwNkI@`u_jdaWpJsjPr@EwBj5>E@0(?|=F~ zz2LLX;a~6M-M8x|kHT9SddF@%w_IZtm0Fe*(s*yNH!>9#WJA6&MgMtfDI;u8J$oqY zQ~O(Y`?EL}>}j&#{BR+C5>8x1fKXIJx(SA%~}B=7{}B1 zjdr7v)6rfKiN;Mq7$%v+^p5bt2V489nsjQP+3Ym~A3#Z; zHi43j$8bxX@YJF|uR3cDfv-DE0r>*2b0>^oD0)kCw%y}MzYpddsgwgeB|K$)S3{Qc z8a4x2JW0u?UVa$G-sc0)<4Q2}$kzp-^g)Sq+RJMwq;j12$rTKnSD*hJsUFaX7_-?P zMS3M3au({IL@Ar5feu<03icj+vs*PI$@(0*0bI5z`LWb=+7S)-e&M>GdDPl9U94F} zMa0rn^AFUbvU)ji+5diP{`Xt((iA#Z=b-&YB~U`vd)68e@aTn?PNh@a+A6(Clw7Z4 zd5NHuS4l&5aRq(d!D%U8#3jO=G?PU=RY|fHNFHVOd-8&*Vz8s|ry4B~H}{P5am#;( zdwj4Y!Q{elSdI*OFVQp=d3MHk@znjK9A(k~V&W=4OtvsXxIg?2k$WXS?2I@+a#ny| z8!le>E{S3$UMwa_&d0LZ8kwwICznI-TI2X`u;U=OEi7eDhn`u{J#&f*F5SgIWWGgJ z7*JlZ#22gndv(HIQ@O1s_QuJB536VS6v;AS^j~&&3MVCCP)xYgoK3?&%=D8DUI)q~ z3<#jKfx2EHn3_VU+3($OjiTM>50=sL2jC#*g)sciTjXqiOS}xcIl;8~Ku{D;zvJ}6 zJ!y_9J#(Vr4=POZ)^b@E8PAWihmFwd32!nzV(+E?p<3DrwG2=FMzTWv@2yin73)wz8bk5Q3qbR%Y?n8Tx zl{LupRQ3)ObV-_U=TSF$LS1s{a}?n0tnDupw<_8i3HZOJh}2?-!#bZ*Ok_l zFe$5;1xVq~^K`1i?+ouiZB7#?W_Q4~T-Dq1^m)wGw}%v)M~H_I-Wq!3;VSMmSQ*#{ zs`vOl5|QiTq$c$T+(jO^-ARIEvO}k(XR37COH_3*+-Jusir9R+oRe}bBxS74S$cAs zE*dj<`j4_$R@`TYM!>4yLV-Lfw?H;;@I(5YDF+M(-*JT;l3Teb8g;|~yvrM80TWIp zPai{+5tyAB|93>{0=PDTboKi}^`Ce?;A4<-~;DKL-wZ$yLaf{ zN9ko^6mK$;@g+FF8RFIW!b;LLa!qI#XfDO3+IG^^uL+FZka$?O?2Le)YALl=x+CqL zHVpnM7=JxY24oYlu&DQI`U&wQ9T;kvnLub$9!c9mLad(J7e z2Y`4LxpK1MFT#me48kIZ;tb~7+3laSfM*K^)q{2w&!sJvo*hbKt=lE_-NCm$2Cg_o zYTnItiH6k=zB@2{qwL3%%&GKH6>&|`hqrbfI#g-yBpDL5bcZT{=W0Pb>-k%860L~Z zpBG{=d(%j*>62OVFSOK@87|mZ$VL~kOQm~Vlw!V_MC}f{b_Bj-Nx7Rv1hX?&cLdu0 zFA_&2GG%(BQwiKFKi{!29L`NKiKmDc+7EGV#x7F)td!hg zA~xN2F3#cM8W=3}GZUwxG!mE0z?V0ej~>2m&tpC}VKCYhW135k^6=#yC06CHzH>Y^ zxPKuPv#TFbMm8^-;u~ZjuFIlUaVQfn+D8JJx9QjDb=+^Zuvgpf*Nm9?1SB3^(j)+- ztJiminLOpld;NHoFT@W!$_JVM z`T`PYfFeXqiZtL4uEPMYqblv!-%bnj^=@mwr6FX`sbjUFUXx8j&@SaE(~ZDxaMbkU zuc&L9p(eNM3RxodK5$%}8KDzz&_2E8d-DiqzR7u+{4sH4_9--&pAC{$N|4JNMdY9K z_t#?DALS(>!qmFn2VdIhk#m*N-PIr#s!42c)z)o$AP1XjnX5L=Hc#t$TERrNIL?(e z5&mUv7GZ9eb7QL6AV-#RdDZ6eA8*L{le%p~sG;B81%vVPONka(2eP0I=DXZhJ<65r zC>R(kfG@=hn{D+`4j9=+m|6iB4h89N{!Oy-kEI6ZVms95E;1pM9(Y7%?^ao5Nj3)1biFo4nr%2?Y3OUH=}KCv|&jFqy}d zdY@Al@Q5%{D zR^y@bKzHdfXD^OaWr$FX%cjg^Ix%Xsm5EJ!wf$Nw_lNO!F3!89mGyFM((oF+hQgfmk5>FwB& z>2DA03PCm+?#C$maXZ^ccjdq+wa{bxxq~lQd6El@cRJvUA^mVV!mWc^?APgo`Gqp> z$oCTp^yN{`1GU@1hLK+p(-iyZy@dZvJ<=k0> zd3T|TRouo5=qkorqeK5m)6hm}!y3=Dhiq>5GmdFGF|<6?lbNOawRM>0HuQ6lwdkkt zR^CW!^2TlQa*%xlAuOok6O)Tt05f;kKA&O}3ZhOpby}OOFP^*un8x3}#cq8Z>b*Gm zBg(u6*s6>}<;Hj-*61&h^s?LH~`baD|vl*!g zNz_PQiG82Q5Ba8j_xz{Pk|LBl`RHS&uEV}vwg?iAMu6*lm+q{Ml+j16@>-~_--*E= z)R}ihM*SiGQq8WU&eC0S$W~wXEq@f}vYM)UX1(=jj@onU(TiGiXt5TF?~9Z8Td7X3 zcr^%KE;f20*L=L*dV743T!FYy&tL0bcBtZ6%w~L94BCA)JljfvC^CUX*bneTrlA~{ zrt2d9C|_0g=d04f7baRaR4zLe=0A3?Rv_XzwNGY^w%o-XlZlffk*z)t{Myg7Ihz!B zrQ4baAsRqzdfe}gEMn8Ee?mCRvyk%PW_kOw3rf~XM;e6Zj~}ALa8)ms3vmnfgS7=v zueLQjwNCE$QCaxxw7rR+kgxoB&@cT=7X6OQ{Z?~LF+X|O_KEF{4q#K?7)x`WDNmW} zo@3Ab?_Qt(602)T4rY9~ca3@>{J*jQ9+}gKEX5zwMgyJ(=HCltg5;H>yPT@p$3=|v zt!f~f;Tn{aUhO6jb?~#pdNJg>Xqed-JE7WG2hy#}I7iGb z1ma|7D3UqJPu17O*r={n_oUgW+?jZYH-4{5FUn>RJ=+yZ-4_v#)DUJ|XoQSc2H=g$ zr?;zt(>;*v@bOnWKZ0V^w!8>bJu)zAL-Pt{`CGdL(0O$pjz8zO|@{r zZ8}4;7NR~Nf^z(NgTggg-0?<7cw$eqPk}WVatg{KY8N%2X_!z%+HD3t&Rj(s|LfC` z;hbm(4Y&i*D(w5ymNue`NL-O4d3!T%auvPU?O}Q1w+LVP2*|%Hc8IpF%ael$cSchj zGG!3#?ZCNWwTO3q4bKtzVEmx*D$>`QIoTttkaRAi2_}CcYrxRm`0WK%P!~{Jrs)M{ zh1h;-xVAA~<~~vQ1Wpstu9r$B<3R}n5wCZqx`{Eby&VUgKe_S2

n7eLOsM^$Dra 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

t2iZsSmFeOn`h=vwLto^IuT6H5xMuk7 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≤*+sfJenC%QgGo!LSA7{~A*8=#Y*k8!JZOkc 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®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 literal 0 HcmV?d00001 diff --git a/examples/93_blackwell_low_latency_gqa/figures/cta.png b/examples/93_blackwell_low_latency_gqa/figures/cta.png new file mode 100644 index 0000000000000000000000000000000000000000..17f0281fcea2a7267ecf50b5b1f27ec8133078af GIT binary patch literal 1146701 zcmbrncOcb&`#&D>PE^PV4Wm>jBPnE_G$~%;+B_r$D zLdD6hW3S)!JZ9bR`@VnQ&wc-O@;>AFdOol5xE|NzdfxX`l;k$jZlhhZX3fS^^2b%z ztfALmvxe#e&0p}BUB%LFYt}HVId%N#IR}dVw)G*p-Lo>oLygZO0-r^ks6L^dn2Oid`r==Cw1k&i9<4eDk78si#f5k%BP+_m#WY3XS zA+v+dgHpf7t`AD}wB88&HH)v3H!huRHA!)t+llp9LqSPJ!@#-l;-^4_%&LE)zjMx0 zitqmOZGsWUetTQ*T3kty3>EWhkNZrEU$yj|lPuLcSN{b3-QS&pZS#M68*XkVr%Rj6 zV5-1+hAYa2ZomE3|Ia1;{x(v8$FMEO(cBH>rCd=cl>Xno6F0{ND|8=BS6aWgcl^}m z|I?$p^1v6~X%slIaw1qYioTVzA#W&lj@m|kKz<^RI84(zsJZnC)}x3;gYb zX(_{&R=oHb+zef>|8MW1VR&EQvFZ1>Vd?2;^v4feQQly(;eXq@MPuM}rz|2&=EjKc zs@A3G`Jc9K;X$y1G_XR-*qvzM5fYS@d;Xi%{%#`6KCoom{>l`ceJ<@9x{M39s=MVH z`~RyYFT8)z;3J+;{hj2zz9D(#v~qTR+3|nh&QD2T)ow!xl}pZszPMV8qU`^;oox&} z0mHVU;x_yKcutjFlpp_V5ct>a#F~Q9JQVaSU%)@-izk{ z!#e%xkr}qi=`I;4I%6Hm(tl&#e6qOa=H{m&7TVo4)z#GlS8JZegxYC)vq@x>1#Y*@ z+UXRVVOkq~cuXSUR-cshfaSYw%kd;4jryE2?CcKO$PNk{l1X2NZ{O?iOobHR3^)54 zrh<8SW(yywj5}`153ic{>1DJM)W${b%r{-Rx3FjLbFuWJ+%9d${BQq}S@L&YJo68G z@W~I`S&@G1&L$uJ%+@#c2QL7k)n$BF}_9lSCe{t`#BC@J(tO6I4ASkH_SoJ!JhB?lYrUaLB;C>?`ztF zE1bJ3zJ0jVoMsw2=kH<45mw7|c(=ddYp!}j^jx?>I!t+Z-;XP9g1KFve>%s6O-S?9 zf4<(D61stCo9P?&YG-{&jCf6zI@=^ZFW*Spt)P7-F3CuTh{qgbBRY?gZWuV{GmnYR zHYLQzPgZFVdtME?xkifTO#ix|rKM%l(=%w(Q&W{m_ai+%-f`&iWecnE<80K^iPACB zQ)X<$@g4l`_7CutNjX1aUrgtpsTEiAVax6ywvQFN+Y`;&WtY6g4`S@>NaFaJs*`^l z2-VM}Ft-vVBW_W8iWbL+4vrb~q}}>v^F4VJN3c_fguUe*KP$(J;sxBYuT4V+>x4{e zB3~sXS!wCTWN<5mu&Tu<`3%+tw8w|HSL@RB+kJB^`g^@rAzp&w_Bpw!9E+)wgNgCn zeu?cJHp&Dolh8)@`Po!A@$0i=?dD-lMBlR8+bvo7WiZdVtgc!)opHM599Bg4I{eL> zjCZ@>>{>e7L}$j&y^q%X(K|?xQ+9|<`b9EP(U{LwbiWeI#p{wr`ddy*Yy92C5>>gW z=_u~GnchKn!IE=wwFUcg-h@f!PWNd3?ERP?9QN=>@4e|7n@@@Hf*-|e#!syl8wjsBG_UA23(Rzkj;dq=1xqd@5JMwea{codU>Jti?I`v zsr@ZJ-GsE**nNM|v$tlQ36nf>d*gQIZ{NP@Zae7nq?A?0&Bc4GaJ1YLUbX1rh@-c1 z&S{977R-*_-+AnI@t3!^B=Rwms_w*!{4HCyn7$X_f9*RMqMvmo_Hy>O!2RZSQ`s>; zdP$zn#J@=$8ie+XZK>2z;yF{LKW!|PN2}XXa-7|crssCsjL$^d+Kl2Og`5svQsc9= z=`l;-maNHFbmxxca`ilcxi1&HxBktmAqC~S&u!AG8%>FWVr^0~_5Oi_zO`+?)Ha%) z>bB{rO0jXX$K(I$KNDYD*Jv_Rmh7u$k|~G`fBsk1ykqk4FI^2M{@dcJ9Cz64G~t*& z9#T?vuo>;?w;3pU;8v+5>}CHgEK>S`oPD3XQDldaO}g(n=cy@qBb&6qqQkXEJon5F za?L75#o6xm3!BJ4^W0ZfS20|oSwE+M*lyQjmYz`1U4w@s>|DFI=FYyf87UpDrga7b zm^!7yF2m1v5CycBGIbQ-M_uvp(@`i*sGOm^`k(w0_kf8fZ!$IEnk__!Zu1ON=JY_} zpOIU$a)ga^oo)=kk#)7+sPZBG)udyYy+>Q%#`jP69DjX3tP`yq-rk=zNR>n<%2)rO zy)np`{l|x>I4enky2q4*15IgZSF?4K74+H;pSFz@oz2K&32hVj#HZbxlv?%Lmt@=c zhEQo~-=o<1`uiPrC!T4tGgl_YOgD#$*AUEgteo^!*evp!Bz*#|5`WyG!u+^m)=!Ea z^%ZyxTW3EPeCj!Fu;J{hOx7ZPVpZf|UZ;$sP0tJ|J#5e_*fx?yB8zm6jo6NP=X$nG zPE^{}b@8^UQk;TveSq6sZ~u4?zn}7WM%;Wp z{2k6$MtQWpN|2~MFl+vJisyEC&rfx^DJQE*TSC)7;@pPEbHR!VQb%v`H9c0_r=Q9 zdIZhuX}ilShRyBh8|)C28trjXt_yhLuh&`7Rv8po&_~xnH(Ctw)46Dj($2GwuRojn z2af|^zc!tdl$C9ybM3RCiWc#V+z#%T>6$iirx&+<8$PQMP7_iYIFoy+wcY%J@%oA# z4HR6D1hB2}1?HLs zCDmzVgxm(7d94&Gd{-$5+$;Hv926Jx+@nWWr?tj%?GDe{d!Mz_1R2MgZA+FHz7Zwr zXD51GRrQM33Z7zkyA)Te4RA$64K+iAAh&Ds_*;4QWni=z3+$CNwmhVC9e;Qr?RP~1|%mCam4dCgvlJ` zVfF`JzixQIafu6{LL{*(d%3a+ zsQURuS&3>EoFpB_O+!OZuf5wMT4n6-^-PAXS=L%S&gJ}>pKdkE7G%xr&*6Z!{p$9#K!INOs@ST zOnjPsqbE???8lyJGs?gA{;RFL^IadgX6)73mxdo7@d|0Is zN~s?a-W75p^=5V6-rnqb!^qaw_T0I1eAmnc(ScyY*Jm;O9v*nE;$%6U`x{f(XfMZf zucK$*K^J@^_f_!VWS93MKfs5@PB>AB=`F7C^eJq@zh4yQC6@L=OtS6HE1|Lk4PD#w zkqmY^!XGg0y<%`iS>FP6-ZWjcYq1cua^Witj@wIyBgyhq7apxXU0o*m0_QWSmom3} zWIuF8h47axGX-V-?u(l6c1$MhkaY(~{bDsuMf1qZL;N?h1%qAUBDB{7gfI5rd2E+w zLJO^S3{%Z^cJ!2<$+oc0%Zo05~vBd zJaesJbFU29zu;HOJcazbgePJzB^@IJUXRBA$?A2e&{AGqw7aEjy?~ZWc#?_H!6$2n zZOS7?Lyp`qoFWl-n(KPoD=V)2G7aXXN6^COa9vEV5)v#nXe)<^36=V6XF*|tvdQy+ zovyC#$d<%i3!pBdoHCycKX}~$1-I4PNp<=p_W7!BMg<_aU~~Tg&jfmj{^X|zFP~;k zR@&K@wqd&nA3}6|Pusq)vHO!-E7={vjDG6Mv5N@Gd3kw>=-uP_J7wLb9js6#?euQj z`!JOJI}u-@cvTn-H81f@jL6M`G}HO@%ORY8yGY69*I8Jzo7H*Usr1*A0b9v zGlcE?@x!n^&(V4?yQlQ2kdZj1wB4pw(Wvg#Ss}arM)@8V6Z_ajQ*GYNfVWgAK@=V7 zk%#s2AuR6dl8uo6iCs@y*U(U!W?I{oR;%TuK40SUuPVDc6v(T&q$bElmQK43Ml0U$e0QfTP{;BaKdM`wAG=ff>6x&ExOeyBQ=H)Z z^5D1KQgNX?fBt-hafZO(DR(w(-3*|-L?hYDOAm`f?^BV4Wt7|yJhxQby$|+qTllW! z=UjH5(^yW=#NfXYQGsZj8W$-_Baqp8eNXkh&C7<)9N(J*M9qfAurz%oG++smrH{6)YPKJ?K0$Ccp5sAzG0 z6l?z~jt;im#=n+8%p;vF{P2*wY+|JQ<(oGL2i~kAHLwvh)Q^rYdH|0ijwI12%Q_8P zc<<<~zaATN#V#16>n@cGER1-8#OdeT7942tBk%8fNdN0HFj{v)*I!^U*4-*%uKCn7 z>b+&;_21qVkwtax*l&I}s|4AmqwOaR|9?2>g-?(;aEx3hkINZnF=thF5dQZ4?WLlUHDTXn4DfC31@fRQHh%jj_DJ0nu>XCa&3 z>c;Ek{K)wrS+gv)0i5LEx$Q6boJP-fVt>Se-?sO6dXJ=x%b+COT1W5u^XJdG^)JlO zd*5e!jQzd=*m;b+LH~NDy~TyNwMGCAkhAYtmonWW)o>U+BcBtP(+PL_bBm#m#7&X^ z59?oOA@m-@-GM5kQfj;v#XbOt{6gl9$qZS8@3wzYUGOIC{Fdq?tG97VK4SQ7aCe!X z9|S&QjZiUbL+|aPi9&ZRMEZ>-MHUeSNe9;9=G=D}n8k%pS94I4&Mf_7adis?Hc19| zDD?v*rx$s7dGm*pj8^t(_8hil*{f$2IH{B6e70@jy$~wxpPJCIK8AA)_JM1*(g9L; zQ%WZX`XrAjMTwv|+6I%MkINs17rj=LQ!A)+VF~|0+pOx)Fh9rAYA8QDxaa$)XH2|z zb z`-=q5vFhi?kevni?homCwirc|J%&eby5^mZu%f!~I{^OIc0;vnL`H^)lEgq7tAt&= zXnuNf%BhG;)R^V7S$!N{Dx99lbOmP85t_(qvYQ};Y`lFdY+N0Iz@m)XM<)IrY*7(gZChaMkX1ZwA*%pn z3y^IzD)s(wvk~IB5X4R%K|%dSqTXUf@*TMFD!F07#jTg8z7Vo#X^T&@s_TNAq*Odc z#$nwXxQL2Y?ZYA*?+X?V1N)lpRl!}Vc9&lj4&NSYbcNct^S+3Ew3HUmQ|QwId@~T~ zC)UQ40f{s9^Jn5?eTq=nj|hF#B)Q)be`?8QabwhZt3FF!(jt$fnMOI_nW%Q2*FoxP z-7E9&0cjR1EJd|0ZXLS=C#rsO``;++u&p~glH@+Szuk4bZE%wgWzYUUfj_yaMDhU` z*ddlnyLua&nUkOV!(L1$6c))6mO|VjQ8n9es(aZgrS@NgEhx2epKd_`;eyTQ6V}b9 zF(p8VIF0Q($%Tzb_mEnC_u~FpQZ;YX?}%k6XvuJJnZ4)iI4k}ifswHELGCe<{1OzPygH>A-uG?esu1})3iyBOYn^3?_q#KFLr9y z{@Af&mAQ4$rE=U11g&3Fs!7l5J^7>**mI6sxjQH*qjp6o{kFK@qdIgJZcuWa^u7yp z{J}&34_BuC0=6*rsifoerDzLQJ(PWa8=3MK=lsHe+)4&l!lEzv@#Dv!!*dNfRwdIz z1s&$$tGY9jjMb;CXfbZ{QWpz7SdU!4R99a=`u&@?BBV%m#))?va||)zZcdU@y)UH> zh8>*>hZWD~_K2g0#HlieVD6B>&8rt4tQ-SQmF0?f-)QkYCZjKfIN3&it5_fxn6nGH z{3JK`gxpX%0|CXjDvYf*M%gd5N?KyDV1Dj|UNGfpwTMY8!s*m?=a*3eDcPfQ;n0?s zy9~*kk0_-2l%bj~ixBl9A)y{?1z;C;#K&daA+1`HRgCaD1+bA@ACaT=$n27HlAQ0#< zH`ycn;EBH55oEUs&ZtY+*;naxBy81Av@;)Az_<`Y7XM5JAnzX+9;26f~JCr_L> zVI=3d#*Ws2P+xy|FcV@A?gZ}vvj#p~AHIMhJMYD?t$ z>R)WpqTw6aCB@KIx?SU13GKaq7Y1A5o2~}-0d10do->!}m^dm`_w0*U?8QZJQ=jzR zv6c5yn>vj%ocvjbeC{MuKC*Kpzk)J|<*|!KV&DH`cNQy1o3;f%SW><QTnIR7x7e59Yk+_*gE6Y&ov$vY$|;q? zsO2YGc(Lq9tN#AJ0E?G!0rPv2Fg$v&oR8@~|9AeEY}wQEvqSFP6WxA($2J|=?R(_= zQ`B+l_LUgCo7wIZ#}y-Sd-+kZ1sM6A{fEj&vwOm}E1JAbOi1v7%8l;gczKf7iMF&p zaPA0aO1Fm%QZgpXj?U1#okC+J7p^`d=GQ zK=;9G#djG~fZ!?hpjg`lQFQ&z{<)d@2>V5=#8%No9w0F(OES98_UU(f?N59k7?*?> zpPML?DFy7Y74}~*#HQv{6JI$Bmor1|^L^JDtqNxCPy|b;)OR9A9h=D6q7W>B!sv$- z;(gRGgm9lzp;Z#hZW4;+rFpdk7OGh&JsHMG#9E`7iIKBfT1_lZY!~uKwGm|$JAP1z zX6-VAwD^4gTB=mvzvu)6l`;wz!BO&#QX~}G|ndG1MxzGIyM}-L4EQa6F`*r)t zNbA(#jr^oUHc64H#isjHxu`d@JAA=qeYr{36(GlMDvWJojKFMDB3L-~Z&u)AB-DlY)9m>?9)ZL#lgwU0FFaO??<_vi_CmsX{j9wq2k zWk^g{t4}z+jtca`;0OCPXGbS8iU=PN7jQO9*|cR5BtClK5wx;in==qZjFb=!inXSF z<+bcr3om|yH%{jes)tT~ScSNzzJ7<;7)oHMFazLF>Z(qD_(iTWdvjJ#m~&TFx9@#; zCSl9`(FXYr`)I6{TyP#ZauM%b$-r_QwklF4v zrf2qxN@8WLX_#by8z{6r@&Z{I&jLaHqHtTLO3HO0L&#b)_Gdv3D znB_)KD3Y8AYCBbPv1Zx$@OEMW(k zzC^#NaslK{%ei`W6rv&B#adWcY=Hj6CYhOG^MwRFd)R(e6sJOWPI_RZS3B8W^bn1ne-*BV7$yH@_?+LZtEUG)0)IaTeF&+~^z z=>+qt`53}O)Ub09Jnze~JMKo<$YG-MPAa|q>1jRJ(Ru;TA?H+4qm{r(-tZGVUuvjM zpT3y#AXYtPar4Lrz_X3Qb9K-{$A#DncB-pauNuDh-)UWcUgHFy+y+&sv6zjwLi6C9 zy1MbSu?=! zgc#T5v3Ap45`{7(W%~>(2!)k{zo7WoMV&q^WV${r@%YL%lb;i6_0T?*iJTjHf6}WZ zJ0ocSc=N^Q2#a5_&*(FFcl$&T#kJ?R_&%<^uxuL!>MjgL+APH1g&CHA@hC79zgnShjM>kLY z4>&wC1AfqK#O<0C{|ahD#z8*t-xQ->TAca3W}&tX_Y?%Oi_HloE-&lUNt8>yA!dQ$ zslFsRT0MRHHrs#(@S<;m?neM_GC>vMZk|%YoC02028oLmL<=buA}z%!W$fF-=SVR+ zVSyGX4vu_%s9Y*Bl=slW{;L6y)Crq_Q~UOJlFT_r$iv;~1ikz7bK?agkSfZ6dtxHC z*VoludhV-h*R;nCvSL}hR;sjQ_sbYac!FW>bCV9=pP9TN)M|3%H;-w%y1JsIct4}4 z)gs(rq5ki6rqBRDixr|h1HFN0rO<6md(Yejb<_HbEZvH#Ot6R71vp(oe{GMKqMTL1 zmap~_ls|scfkx=!FhQ&bFUhBFrHqS<!}%(G|bwOU2d z6WV$J+0;kfI_dQ9B8ZgH;Wn)a-l{_#@kGn`S>x5Xgs$n1dAE3|91<$SrJU`UNuf}Z z#1WcX0w~`i*pm9>2|T@~;k`XU1Lf~d(gww-+@L*S9~u5k*rXJYo)JOU-Us$dxTb3T zIu4g>%pNiWX|-KNbb{UpJ+M1|4RGj7$P_>LRn|}I>gy=O^m_ICm%n%Pd9wGfS@Z)S z533L3M5t@lX+_aLI4u}WX3r3dDBHNcn4FJXcR{C;`;!3qAG31Un18=dkG!xDGmzv3 zh<}d9j~_>=W-Rufa4#5CsBoTil92bU5uxBdKi#3e&i&`ZaBoci?4W(Y_Wkk6vT+1D z3DpBrIvrE$ksg)?`n5d>XrgX`4S|x-Ld%7`DdA=Z-Hu2a{WBCKjMp5*3Ji;`%~^;E zdjZ8gX|yh5L*8IrNU^SXvL`&e?S5eAuewTvNW><;K18wRK458qxtSiBGRR`vz^FAO zC%)VoA=N6E!PaeK+ju=js6|^{+cb(?_)2t4Dlrewl?b{q>R9Ec)8nqvm9J7a(=o^& z?IXFmL*3PVmiKR|#4?k&mOI)P_?IhtVf(z_Ez*J5h+^tT|E>&3#^Q>$zo`j+1OC4G z-R+G`HkuJnS(dYF&c15{>4cMzb0Q0G)C#FhLhi(SdCt#r7IY1&`B7}%;chet5ey2K~Il8YBSyq73VgUfZ>!A&-iixvY^9{*D+l`%LV-~nu7g;k}|-@ zj5M1iZ4t>Og%maDPd5|ZY^_ien*C`7G0YEH%6Y(9m`SH@g+|r&Qyi z&}x#>HBT8VI4{~pK>lR?ZlmZWilG}-Qlh~WGZ3&;6@4O_q<1zy}4_s!{vTNue-nfX-%KRD8g1V9W36wfYHV;wrH{M8`jCUN6}%sQXmL z?i{bRMr=z)lW}kfz5B$w2`GKop>b+TkbQ!wY=d&`CByD3PDP0Idi^Y@r!sW=5PsUS zcIS&m6TFha$W~$FVn_hfVqg7_bpbf}R8&B?a6_>bh(oQXQv;bDmJMpo+fgiO3E`F0 zeHqvJwJ06`^Knw~^E>Q8^X&A!88Z~vxt zg*&#|h3glCEY6scINb@dh(puaysrAvAYhR1$P|%iT!<&V6j0T(V=qiF_%0;&mDs#Q zXRP}BsxAi2acGrtTSC9yVXVnS#~P7k($h^Y3AF(5$;+xN8l;~4-J zT#B0=7?4lJr*FaQX-Zk)Cyi%DliYpE1q&n-3+AS>ATg8EcqNr%OPuM^X*EqJ@V)@! zbJBxZ-EY>6SY);_o4U)bB`B70Kwto^RRl57e70PF?t1*2kNcXObm)ocHuP@8w>XM5 z3a0Ai2l@SUoCngoe}&JxxO6dv-~IMPA74A3_055PitRou907-$nf*+~wy7hvB#D$eaZ9LrtFdV?MdfjFfSO7DSBHntd3DLi|G!0g&7A zIQq@U$g(onZ{eA=gb@> z*l^)mu8Mu4&@i#9(rKg{${*K5A#ViE_$2LAhU6SK6J^`=6%sopEA4lA;?*`n5n~)V=O;bY zD?k2nq>x@CP|t~|3D8iw^+$dT#&Ql2<5pf9S4jQF6n&r&5*WToG!ycCqvkO8NKNS; z##d=>AoLOC6tS_+o>nhrV9eLT$~{K|Rnj4L&8E+Ea@=*d#^jF-ED%_;+Sp&v&)x4& ziP}ObEta__9336)F3?`2-ywFOrs^=!Vs=?fzU5O9yRF5`$__-d{D&=(73z^Z{O}{G6U$oQuaF??MQ}b zZ=U0?E}$EIfajF~8BnG??hEFt8`Rp{l_&f3=eLQrI~YM4vFEuKT2wDH_1Uir(JCm` z#|hTEmTb|uL^yr43*lvTUEBInGmLtJrV*(34UcIH{R&k^t_NmYmL zbutr2UB2ztzX!qSmzIaybDZtfQ&X;xzWZ9mYAVbf^)QQ?JY5$?rmz~&s?XimBe{@ABF<6OEmz`;Mfg8+ zre4wS?r^w?p?cVOG;%9Jr1{EAP1C5yK?6gdN})ez2pdYq%CT{AMhLKAw&|It_!iWs z0%SqaknHxHzJtobP@|ktl>&K`J4Y`fyq72Xl5{r*TmAsgcqPL#1 z5OWGjpg>n?G#__Ntq{2nQMwq22)6E0pZgGq4yZ;rm$BJ@@>a#p0?4s+`4!ypDX*C> zh`StiM_>%%z5LDro60A6Qq-&Xc=PWMi+-4z5~ZET`mdPQS$@`a*y$PQJ{qTA0w9(H zg{db=j|ZFTHT2o$0kO4gkd49G)5gwpbIjjG41C3DnbFtEC1WjC9H>-gj!@S3lbQUW zyvuP6L~(Kr$SD&;5MpEDvQn5Ws2kvJq3hJcSd=GdbH$#n^}s^?a)aw zsyIyW29WuNIH;5q^JN&}SM#w9K$khSJp}+X6N+khT|!GOtdcR0lyGesdRAMpmVHk% z#@gJb2LeK94ZdOCC>`wwZ%P~)KD1poHq%;e`+n2tzC&~lwDYKVPI>#+_TnFLN$kA+ zVU*t>dRm0k&n04ZD5Yx0^o%*}hY^?^1w{E&;|ecCSQ8W3b(FiKu_Qr=gAPAGaCf70 zeAtfmQ9o#&tV_3=T%s7j$SUjGTeybik!lnIit71gc5`lY0+!-(QWS$-vt`b10;=>X zkMxA_^}0b+FEhBq#{BZ6j~C=1ffjevHC5NK*aC#q6{oAl4{y%UOOaIg`tc$XpO?x5 zpvo+1BG=eWH5meAF30;RAB!4N@JxF6x91vM;(D?Bh3g>GaELjqZq;C=scrr<%%UMZ z!_t;SS6_9qboyN7I(VZkXf%hY*`}qO%AFbVTHNyn3kL57z*O7w11SHadodG=JA2aF zKJTHfQ)@J6h}Wu6a_mnjdtv(Cx!Xt77xTBJoyvV5OuN#~LHs7A$cxtHoUT8(JtK7< zH4aojg>WKhk0f;xhx^Qkh)JH(+g~HyWo1HTJD75Z@Xj;+CNlRi50IF^2od9;9LY?$}L=wyiDMQrs7JFM0yjeX~5SwS?JhwxRs7 zhTaiW8=X-4tT&O95TusEyITUBTEs+q4&psKN}VtBZ`4j&@SA3QL$!Qs_Ko2D)`Mwt z;L2k7*#WCEC=WXNv!b`#w_3}EIDUU-U43+2$=44LyWz`Cr>-X@2!bHs^TFgW*>C)} z2BgjwzN44fQ2?Lp{w&8~A?y$uf}$`h$g$!9nxz!c?mr%Dm5|=xW#gxswcGQnPQy>A z4l=h1dNu(nXqP|wGqB7GXdJC%Cm?}L>z!+jYG<1-JybOGlN!4V7-T=9S{or5cO%jw z(%*shk{~o$6_rzzJg`bsX-CNgnV0TGq(1@%wEx{LuYC1U)JDLL(DA9y?1}ZqCeg6| zre%dF@*8^%LFO#(kU~3XsJc;Z1Foh7$ibIMCOP}hieF~x^`mrJXvw?oOD^85a2zVT zI5RxNi_hENwyLvezxTyBDB*rY--%LjDCe~997O@*ynN1ZGtAW(0sR5Bd7$6x?*=tA8V;UL#1R=B*tz-w-}RLIlgaky5eFznOM<`dfjF zSpIESblE7$34T6!JUb@oVNo@-eH~k2djg8u6w8#yEt2xbJ{k{9f7HMuk)fh~WrNA5 zr;H#ju!x*~I&kHuKV_3*eysv;o*uCDKeUPIn8CR&mV(AkdPYs#`t#k}J0?!{1Lcbp z%l&hRY#gaiayv|SCq{^$9DF0zQEyoB`3Pmmo70b4N+2$)Fbw}=LA;cRbs2f6l2F6C zw9ppVn&6|i61|5Os_yDkN+jqgSpVqpG+2!f#C;sCVU*7Zw zWw(Phcy;c|j)1E!UjyX2G7DxcmovXM;&knQEw~IJ0nn4aRGf^&pHfDU{AMw!L;re?mX0u9J|`e0()YvO(PF7 zABWa0EAbX(&_GB*3h0VUnRUz=fo3Y2N${Ny9weOJpMdF$PgQb3ES--?GY{fa?1qfW zZ@F$is{Tokw(rjm{k(%_7*k- z1mX=rBb&IhqQL~wKOOGw%#zaIpBi;V+}h-|KPm5^s(d#0yU)DG+pp(cs=uzE+9jS1 zgd4+?3)fFc&J4fvdHy5%SY)4Kun2#px8@z+cnb8``sxlC@YHP&^ zsotGJ1zS86QKqTZuR$V%xNhs*+ajXUqT|Jdzm<+ zAq5rg4K{yJG1x)^>2Mxm24=3LgJ zpmywmGr3iY`tonvF?&(z`10FR-cM3jsv|UwpIr_LtH}z(_jDKsTkN8aRfhN=e{=wZ zxQFoV*DpgykKCt+m~8|Fz7Py;Wc9wd-vtzfew{KM#8vTR0^Mr zf451Z7~0=E6a@2a3^c|N0hBpOK|#zy${~r;KQxF}cvZYw;^N<&j_lz76m-}OC*%CY z(CX^ocCc)`wcTne$4d^oXW3>KULbZ{(~xq2I;qy%()4!TW;40$<+mJRnfRemux;(S zP3HBNgFGjSnUuXrvlc-|vg;}G^SC@+)Gp=_`%6sizG1dm4%P66w5j)sRM0%8EFK6Y zTzAhILsZTLWEys25Wl{1>b{sSXe_V%$+k>2{=TFFH!>)L++Pf%u3Mn1a3k_r>^AzV zDL>)yi;=3x9bhr4Gkl=!CP-%>16U)WsFq(z_lxmC-u-5JW;rqZ$G%x?ygogUSq9`C zD-ziCLn^ceJeMBSB;FLwFbY&nTLVK|b0&liQRp*Y@{bzFgsFVP`mE z`O16AK9^0ha2HW!!YLp*muEG6pdo=i@b@kq1ORH)1DAoUZZfy@oHZ@&tJ$Q-B0jPl zzy0NK=?&WZZ*OAThDfQ@v6@d+$a;6Ul0G+imzs`!HC{*hS&H;3yjMbRR(mQ$`CG-l z%sp^Z0LR}4QKVw~g#K{9oOcAA+a={iLM&)mN&G&Q1I{AV+2*#w)vIW_Z@Tjqmt zk@Wn`FLLSy%7G7vxonX;@~+ZAnp*?vGv3+1c9R%qV&2b>NEO*E>1H6Yf8Rdsikexd zThk?KZ4B}b1vhxI=&=?|R#?4x7F+wN6?6y{#%~37JPezMuy9FOqbgKF)IvlcE+Ip^ zp$|eBo9-lM>>;CxvvO=(ARSq>6ENP&>OL$p*YYW%X&tz?2IomDwz$2E)#T58 z(7GW=v^>VIQfn-{<-R=5wfn=F=1X~MLoX+YrhxpY8F6GRK$6pLbT(PlYC`` z-jz3G87S%m%YQeur^R;wXhEz_bVcbm;3Rx84OXoqogX(z^fN%rFd-BCNPmH!8%@e= z>AMqiNf{a-mi>UnwKQj2I_B*73TA#b%>~k1<&B)&{Sqdr@zkUBKOM+IYn9!U9~XC> zoCOK!_647YLMj>?^}>;5r(cN+E4QaaaB@26`XfAon_1s`7d&P5=*8-Yqt-yom1zL~ zs^0kx1wWXfWk(H%9RPTRpxJ=z>qX|f1gP82s;f76%|q2&A^R>t?`Z)SwKsS`h5F8) zlY%7(OJ{+1?g|ah&=KHGb_OoK^d5KEQ#MgR+<|uvSS)kXt5aM=1HSZW&2F?G6FHaR{QUU4O%-TB;4o+ zxe+k(u4HKDp8#jvVO`9a^7-WU5>VrO{*l8w z>OA)@^*AZ`J6r{3perVEZo4tOV~5y(VxI=Chq zrP@87kIFx4-$_y%&b>U5c})+(x;aRzQkt*EZLvEnT>$)$R)vP1<7MPoXK9pT7$((} zrM47Iln8dcdg<#0!x_)d`)67E(`%^ucfMW6VZPRF@^U3rZ3=xce3ejqCjwxrjb-hVlN5b92?I(I7 zX}j}KD0M2jfk6{Gu5WI%ILqs=^PFxZJ)N4GvYWo@6k@wXp1}Oa?rN?m%$z$4IxiCw z6Xi+|k(ISyk6|aoImXYjEV|SOx+}j2zm>X)bA6=fK_8G?)C5o0+G$fIJ-oSemgxEd zRrxV9{b}tTz(zEkDKV9J;m87&iFPY!^+v!}g_HoQi+%A}+Xb3JU;VkCPe!1!-iKfw zUttJkhQwf&Q9piq5W$!Jr-;*nW=V7l0W5{-?W4N>y5T*qj>$}tLTKgA#OT<3X__?b&KUE znuCp@y+9T_o+dTlxu>F1e0&3!VFX5wuPy*bXojxUTs@k-k_ zTnUI&mR+9nwK>Zh4pi4>6#rAhpX`M@J75&iV(fX!?1!UCx{TN0ZXQP#27Ki-TLZ^3 zEWr8Fh^+`E7k~sA(qeGf@-MbQyay^QGlAPq-}->(=7Yz}Bpdc3juN3f7a*i7jW5nY zY4w2GphbKqwPme&*^;2qCsiZ{YZp{8ffR+5&5(e?yWp|zgKzAo6PX{da=#B?N?Nr# zJO9h|+P(zn!Xy}*yMY}uvx+OF>ctFwP%F$NYI=^^w4KukvOZEDBrQnE8`NJTFi%XWY;QES}&ps3K)?nj+T&5dkg2 z4m#$;MLNbRG+D(xB7LaW~a zg>}LY<(?Tp5Z;LJW(RvN-C9&Thq>JWtwGeMQVecVRaXyWt9|2pNZ3AzE$^kln0ayr zJ9Dxib%&0gC>u~EybNJ_$}NjiVaTIqPeedXwr}6QH+E(V5*o_JXSbngfF=U-K^)T7 zS1hoy>F6VLOvB_R!V;?u84<=)>I@A2x|bGqlVCcQ4gG;AMY@$Eey~NJq6Nk_`m9Nx z<;t?GyWbqRrt`K<_Liw#H)-c_MC?Xl?P$3&w-^fS2oI~>&`f*^Kr^jr@PYABCERfI zy2y*ezp7+72B^)-KYlcXu^DgFVHbhsyZUotktS-zF-t0q#vE`oaIfvboMVNXcg$f7 zHQ?qKMSX=-0klT}##)v+GCtEF*%hsfK!B|T6rkO}?ti#?nu0`KaWk~^v;mPMTzZ$0 ztLtwjrMn2QnA)d)LqUA^uRviXQHkDnK8N&l#)re42k+e%$l;+YjX5w03{9#tYD`{< zt30GO%7P#EG{#L}PIEw~IPO{LL*<}QiMBZU^4^gc(qWK4icdxlkKZ(w9~v>-@KlGw zXGv;$`V{Bv4kW2sfAL9;qS}7g!6|u|uYOytx1!%)IE;U3sP%H;5OJFV{g%tZpV#Y+ zGv<_Is3e!rw$u5G_x1$dt#bJ;Jdzqd%jY(7U%&Y1IyMZdCHS(xK9IWJhUuDJ=sDAE z(nno4p^Jqc#)LDSfT!>h#uamfDAy$}AgJElz19cvzchGLE?-v2&98_=s(r$e6DEC* z_@2wp`=zh=zMAn_#J_jJFPiUu63rd+?5k>44iOKB%g5S&5EEi-gh%2+%x0?0acX=B(TJ^yUmUgxTv$#!g;^6sV5sKD}9^sIMG| z2&f&9cTuR0PrS#(U5b<~uWv_}B|=ymdC4)$(*TV-_3?p+;WL*a3Bl~)4YguOu$nqo zW2Y=gz6+?}wkl74zKW|d!2oq&NH08|lZ$9<40X-;7=&ZS!ojoJ^Lst(k_MXOy?Pm;+PyU8vKKsqB>r?OUb+BMM*|Y>~jQRgg3Mo#HGixt4em>*|B-MdGgW7LaWZ==sr)^ z*HxG?%f56_o`MO?F`_;`k}z(P94>4Gk>i^wHwc|4X&r|^EUVS)3MFDiQ8hwPsGaKB z87vjE#!im16uMvL8(>u8uT47|`)AS+A}>W+HY9#QDOXEn3Q(Y;AQTU}M6;c)YtE;# ze7D-&gNY6=XzuU843f*QoW8{SK!v3@nMtLLcnZ4gL^34xV^PljKTP8q)Yr8vaIG|a z*g^$pX2xQt=2`gHHll<)HtY6!EYcDojNUL1vX0M$py?kMx?bOf+_DVgSM#o}eEvn8 zz*4%poPV-_H)k(kr{VZtV`&-PQR5wrD$(sl9d#{-2_%MuLRmtU6LeDqAB>$+8MBu{ z2ed&Qb%9mH8MQ|cnf;-G zh2$?=1_;t|hh3uqSsnz6N=B6GnHv?;qx~&uHRn;o08rpz)LM~$JB*spsI`LzGelfy zFT!YAN2Tv697;{)T2Gy!zjtNJF6C}Fki_@_xh5=;nQ#Yl+zoM#l@deVNP>$f-3j2^ zSrKXY<{JRiD(SC8B;$e8=WV9djA^cQJtdW4>k~Z<+G)ewfsFf5ipN1yJ_(@1*fZT6 zgk9r)kwFfUtY})K*K6mCfR_O5abrXZAcQNO@?T1j2MLkvCoy->3#y7Ltq2L~Uup;N z-v~88A2AcnpcsA9-#hHPg!dVEPEs7URfxE}#u+9{n(kmhS!`=|ft##BFs0>F54s$; zIR4U0PwBL}8-z~!Ujig~25mO|9mF0@RK&jY5%IzZAjC^9_mKzybs0fUpfv+py!-mI zKQy$&rbP=T70(16A`7j>dLwRiam!4enkkqcpMRtB3l#-BOEF*CLD|uTIx-l_3|^a% zqL$Zzz8fACRf8ZyFLKQYDEpszCaYQSZg2r!{kWo{;*J}igtU@f;J;VO=JJ}iUGKM< zwQ~CvjH*HtBQ$!g^~xE_v@4ERm~E6?>DeW-QU=x6+1`+&m2f92=zC>cwJ__&oK&Ld z$LzD}8_gI?fG&qM;1*-)aA-8X%s=o8&8i@JteZ}MLN>SzO}%NYk)TGbTffY6ey-q}_Eu+n@1*#zaUG@Hd$?FRf%`Bj7HLYD#=p!;% zpN{6D{m_^M(h57mbqbZWZFS3OAFE8udjCK8+#<3Mr$J1+ux<=?2#xP|Of_V_VK5I` z?*!iL#b)0sq*^Un5jYzq=*nB;{egFfj(USr!&lEOA;u!?!p3JJ3vFoaVtOzWb9FJ& z>B(xr`C+mjdH)Wj`~o*d+~b(-m1{DuK!P!@it2nQUJh5!k;6nNeMX-;Tqm7P%=;C$UUTRUskH&KL#ijdo`-LXd#A}?KTkQ9>jk=35)wiggdXlc$P zz>mmRAA-KS6zbQL^>E;ppJZpyH4aE@A|YKLQ1lac;~Pjijwrd3TlCVbNT=z71SyEi zP)(MmPJ8G$bDChD zAk!H!RNgD|J_~i$9}E)79)~%g)Y*n1@$c``Nds!-_ehOwothqgvO15FD=@i#jlhRGDhgXYRq6vIzyyQf|5R4oEl`ndC zVZ)d;4naPW^|e2!B%I_64=k7_*lyHbP7mFy_GeJ{ABJ=*?<6_n|5`NwxR6Xr_C~O; zl(ggzuhy9{yido{)M#p9dXOi?u+SuaKdEg0|QzM4wvD#O%5O( zOF}?GAfHr&ri@a*+z4Wm(3OEP>*Q=hlHc$!P(Tkgbi#!xmd zioSAob9%Jx5#a_C;}nGkMt1h&*%-#qs2jUiF$e=xmmX5KqojyhJza>AKnAD9=>(E`KZwdAQ2E~;dicTND2x-y#yt>vNU}2O?P;Ub%V zNuO< z&0~r2@t-J(>)32mm@|-y?wMzHtsSjbT%%jj2N6d zd&F;|EkAu8rpV3>h2$)C#qP@%9$tF=$C4KRNe1)?DBf59V#G16iTKPEkg}lJgYFmi z1-wvZu?9wn%m^ZRF=Sx&6o`B!AoX}S0F-h$ni;=`#2*NAqehK6L^Cp_xXmn{Q5MA9 zxm%XS+$yq^TynnN=muSw4GBc@@%85u>)iMw96^1-2j%!>aqd-~R862vl>37jL!mp0 zTSZ4_`^JqMqcpNsU0nyQ@nT9yYGfWLqur^GRocY?-C;G>;XcnQa$ctH_NA9dGh%27HfM(uVskFsp5sM6AHj<2$nS0BaZvTPL+=Y3|`<{ zZj9ZkV}bCgKtcFZ6{=0MICA(#bRLF=(;d=xi*8w*o+C#I+zTd6L|7MkP#}7=M7%Ga z31O-+NyrA~?oLuO$2_nmR67=0(91;_Gu(2Xj}23GJR7?DAdxHnHqip>?b%RjD2rP}C(uB#muA4rUi z^@2fIfd#*bctloM-px>aRG1( zGK9MBFsMbuK%P{WWwDA5yhqEkJV~}_r%Mg%ov?qKgpQz=$l?Q}(7yUd#E9|3((0kR z2Y&SRrM>|D;>#B=cIk{S=MD0UHpXiLOW(Bkl_;MCdO;QVx|P>>>#-fco07@SkZO#)(GVf*O)hW~uyqj-;^Kf}gJTZbYv%R0O4ymF(q~o}g*%~9UOiCk{BklGT@dm7!wr?o%^MOO zj#L^E__hz!AxH;a(5t_62^`K%aLpe95X2PN&iSOs`LYLrIXO8>exGBwvsls7r=dIF zP8g!$LGt3zEjRys6MOG=9Lxius9=}!}LG7aM#)#eR-aDCMvz4_nln-47fzgVpN)GBlq#pf?wmoYrAUNdih1bT=s zh-lvMI{U%yte*Wj0Xe zAwo9Upn*6-TU+T{yzWoI34%7@7I03uGh7%=SBG>N5x)om(G7> zR8~Jx{z_B$2WHbP3tb-yXw@9=hs6(hc7bv){qb*gqg9VwI zP6HEXKt&A_LA}F!Tl@UWpu*9{fRN0LBnUwHfb^K=Os;{7H}2euvuXcX1BtWa{fLpT zPRLelL2-#0u@j|WfE=>MHDoJvg2$FSxhUe~G60|<-Qlf2-x;Y+`q@!hAt~tl4q^ZP zx(#|vO3KQz;7|!_f<`x}@*f=LKobXOCy@O>9q@EJd^o$q!IWh5|FIu_ix9iAdzUWP zuI?bk0C1PDUvH*sZDU%cnNSkqppuX>+(3=SP9q?6itQuze~+~6iVKJtzr#)=Ae=wY zELvZ81AhW!0*$*Mz4Y=n{MIqYNzdO;umvwl>OTk|h>aoY?g{Y#u2u(z0zW8BN>~Gv z2_U?sdJu&f3&q17K&&%a}- zY_sC_CPMb1_;EfEC5M`M-v$O643KIY>}LjdRj>lwEb~N;W?SdY`y((r)cyx8c9{aC ze|B+_cFx;v>e!?t(~$LCAXz@%2&RQh(H|wpc`*u~h1$HK5CYU74@weGXGZ7)_8e3~EdlQ~x*4Zh_K>N8L;IHnv_<>9 z!RGBJ?KzU8X>icAbL8x$ncQku2%i-`O$q?i!V+J}DZ<-!SGM)xPZ|K?{r8dyM8H&i$@YeiM%=SBNfq(NlpE{pXAwcwHu?Z-qO-SUom=YzGu}dNCfTQ-XFN>Pm?VjEi?8oB7B69 zaj!$NMQoJh6BSSg54x_7NP&N#wrfyunGOW!Z|i22huQxVIHMt$iA)RoF)8);HNY#0 zenD<*odEkAtVGF`-V7~57;B*Wz)8inFYND3LeTy87@!q?OE*CrcTFA8smx5f=j}95 zh`$l&5B`CAQ_?kErX6|?6;AP9P!A^zB5nP3w6|8WN7CXUp#V^Tmh-YLCko5IL>i==fll=`82uwjR#S04yZ34HKasfc=jw!#QSOk@CZ=ZkMhhMKo zgDe7>6Gn(HK~kX{03E$V9X|=;62QFg;$MI)S$H^kHY>D6d+xC-n*dBXh~vkp&g25; zp?-3F2PCiIKhbmkDY(5n$5FSfW6av%0K2?ZfB)+t+r*g2EG!>9Yx0p9wl1%MX_eZvs9g+PRR`+^hNiod@HZbVv5dQsHXH<2LfV#H6B z3@Q)Pwycm{iZ%2Q&hMU$?Qe1N{v-$;+<9H`8#^My==hHRL9T`e$k*=|a;up{{;V_J zLR8l)i+@KSBL3SGnL1D9Z4f23SE=9UmXUkiT0FzsiEPzPC~Z?Dny3KM6=4K{!uC zvmrPKx8Rhv_Fw1=iQX(C(CG)Xd&dAh?j9l#dI3MXEVNSiIednHf4#S9ySsDjkKI8I z!!q}BB_Jcj*(r)dzcPNCE;p`p%+oM7BVyXacBk8si3&3_mnWfWNsNaG=^DhvddyXU&$Eb1E zn0Ru2vz<$uP9RhYs@oL5Dnr=I*KPxG$z~QD z*+G-?{}T+}vz#4!0(A!laW*g(L*JCNKq564*YG>a1cEEw<^pFxh0lM(b=f*8e(&DyCAS7L{w;CN&mC;i;~;%dTdO|v|3tP3^0&E3P+6q zrR>oCNKpxdy?APHPbnhdOD(wj z-_bdhez?SbEQ)kWx?Yk9Z2n{It?34#sT`Ma7 z|KDV2VXcIX6D^>wLghL@z6LPC0ky6g#sUHN#K(br217LaFdvUL|B|tTvT*kQ;Xx1Y z;Q9yee>qr;5wxCQQ?P)M@tg%WKc08&>t5{*mmsv-E`x!10%v3V!J5$be`;Sqla+Az zCbGt5w`?$#=ZN2iZ~(gPS(3^nXyqi`4{$fd;X>g=#}0Xa0rr8FLs@4~ z4L@)a3P*#Q67!C&8g%GlWFgh#z0E_=3vF{O0FDRB4vp0u**PN{?5IEXVe48yOC(5H zUw8)U#374ygvn_8CAOAhLel!H`Ek$o(?$RY^y6hu9_J+pM;vX@pyCU#!C>3 znK%pF3&;WikiEZT3GSvVH;erL+z&_cs2S@*(I5W^C=+u1#_<3WWG52sK4X2t-QSlm z;a}~&od?gS0gIcLfT3_3)pG9+{2|G5IUj>0Kh!&%uCq5Ofb6GI_}4HT?tVbh&RB0u zr&5p}RC$MJ`6q35XVv-U-9IwqI!6R5$^R}P@ zRQwPvf0A+6X|qy>d?FBKPSd%K+v^>F2>b#Jf7+e@D;|45?|5$RSlq+VwI3mjFQTKlWMj z@Rd!iI3WKp&LFL_yphtAAP0q6Mj>SJu!ZwScXthGO1|Z=?I91&qOwxN4J4Ycc(;?G z{Pvyk_cW>uD~fRMQfb^E{sa?LXrxaYviiy4-x#_B8dAcsca`@t+UO_5+@7c5ME`N> zZQ%KG)4WM&=B4=E_y2LY5Q>EyieZBGe1^@<*LXIP8@dgkzFvcxBVxunaK&;Lifl`T zu`1k#?U^FCC9eMvjL@3)90A&l9q;D>R4wz%`$>5Wi0IBB>ueBYBmo_D~<+r87)hrif9{}L%ZDw?om1sg-PrXXe*zNHC~L|~i-Z);`z z?ww_hp?0RE?hs)QrFWU(9~%P38tE5mD*jxb&9y(JumS{kvUG=@zM;2S`mg*F`#kJALK^vX{quH)31PjS~5v9?;MMJ8dNnsuCb&w*Tn) z*eqUyH9^7&Fr)V~&|z{I=eU3!jzqvyNn&?GmOD$_>s@ZM^B&vxw=*t!8Z7!MpT}?6 zGB`g;>_4I15x|7n{Vnw2FZZN@=4{CK92)p<#-F{)Hg-2NRJ;OG_cN5BMeq;V{Ff~O zaP%cDCa6}K|5{D6eCRK>z?wkZ320A7-y+=p)7yX%b5D~!=L&HEYGTbS(IAro+U(Q)d>s{hUd?I0RvN?fsha}*5`6!F~Ea?poukLyeLwvrl5 z=4bjv+R-$`p1>b&b9VNm95ACsKKAm1U2ztD3Z?nCr8JPkz$6m0{aVUf?liA@x!>-O zpbrf?_{6{BYgovS z)9u+g9D#9ys+@ghLzK#__Ju8WQX+8@;I#UZ^JKF^9j~^aq;z$@oo6>al=2Yp16?9I z9{Wdp6T01R$_&{^1LCtU07oY*foK|JqiqXOHP|8*hcgm@sPQ%SOxH_pI?mF?U);MT zHFQ_fMIl76Z_Tguot&YzaP~mZjDH@jR61d+XZqbK(a6rJVtw}KBwZz^Z;yY|Yv-6C z=PAQn(8GFe79c<@j9P%DS3(VVI1D#{g%OfGq_y)9HPdj~CmV~Ov*$vbf~V1Qb;fzJ8>S8pH)~cM zZq(#q8#8b9IEW65W8odiZMfVTai1VX?| z?jj(ddym+i-ZuyKc;v*=*5s%`Rk+!2jJ4xnfenw|^+x5g@co}?fZSbp0dGGqyN$7z zRX)n5GJz4;(MTD#8PFjuLzWiZ*56oTF0Oi+%*LQNo08!1Bk|gq=82_Jakba*1QK)wzsQPPvuQg=lQk@+{~W{5ZVl2 zA6TnSs!M`OrLLskzMx@muRjhIMnbTe6PYn+3}_;IhqJ?WZKIc&e9Z5oir2${wpn!2qJKRgda)h{oo_8q6hlUTyBM7H_T1dC;=0 znL28&P5?L?cuV>KnWSsj!yfPgB4xEV}7-%2Q487J2e>@ZHhg3S3?4dw)t z>yISP4$P)j2(Dh}Xt9{!&TNfrTOeP6>YTi-1rL1H00sK0EOCJ)jc4Y&2AOLd#xvhN zS=X6-R)nk62E!ivL3g^5MZjI)fL(&WF9+<^!9SftoJP5R#YF-_f~_m5ADe!0F;-;# z2n0ZagQ~4K$rQN3C|?ca&OrbGxbo0$dFb6jd&oP1Rd3%#0Vk&ody(YCA*h2q|8k!_ zgxUq#0jE9;l>smxnLB!&2hI(QnzLt6*qUKKEEVI&lu;T^`4SNo1V1aJ%Pg!q6-@J8 z;|^4)`0_TZ)8ik4!A^pUowLNLpoTu<9-_&>WZO%YV$p# za?m))0KrE~#Oi$!oGsnVa$cKJ(|R#kxSF`sr!28hys{<&CfTIveV?rj5K#8DR@M@3 z*1!yype0<^1eDbTl(Zh@s1#WEKU_X{=ldj7?~!|R$pfc;=XsHxR%&22Hh}wegzyjf z0lr4(eDtfrLn;Z=JVV#^3WiZ5{FZ-Os|vYH&0E#7&2aleS|A#pITbNY)NMQ9jYDPt zP3q5~=`f89oDLStQ2q7k$1TRfGk)~KW5e`z#U_bb48m#4h3k~hU&%7EoRH6nTHc`a zl{2$q5?rg~H*Q(iZRJ_D%H9yf1W69#6Eil@`w0Q?i4#PrP=ny*pfL_|d+a*5g$$6^ zZ{HR{uo7S{cWp`ISpCMunF*-4AEedJs{xP{7a1}%x3Q{@`(a#DLH&Mp!RF1fYi%pw zqVBa$<)i)Xs>uR9*b?&E%ozFb?uiw5`^Fk8cadO;nD^7S{gTICm(biGAbnK8|3h4N zvsGu!+q|_*^7E15LL4$`E(ASsrLVwBZ=~R-Rapq#_fNQ@84*@L{mhLyEwdNX)7G{$ zuFX&baoUU}nQ{#J&h6M0s8t1MKY&GPbyH`o=%k3#7XTZ3Ph$l1b9_w-H+-nxZ7VvQ zzu>(15v!<|{=m6Fb;)7ML3K%VUHqG)oy2P1hYzcbtwu>X`Y{gXFuaSa!WBU`X;@onDpA-&nz@Hk@{9xW8g|jJwvgsfXpLWT$ag>t-H9*>axqu_UH+J#~jR z_gBuEb`aDi7|G((qiKIjT|&Pl+i`+bp+J@#>9s}WH)$f@J$$3|g1LPq zXynyhl*G)(if0EyTV&H)hJAxg>LrJpwS0VxeCerM!Xzb<3KrWb12}nojgpscs5{i& zZCiu@?c=Zz#@}si#}{dKRMY5|otN? z5Pq0$dru|7_S&sK0;*r$BW!kr@D}64iE+7XsBfhA8wKVOvYb|p3&P>Oa!yJTj219o zXi|RSI98N8b|VC+UZX|*9~C2_Q!hL8^Qp3$HsY5z0xF{?J4}5$HfFDMt~6}6i!DO! z((%bTf=M~%_teiVn0@=U(ve`av0w_?Pa)9g0f0GTI!)PDo<}&7XxSpIqtmYSbPnV>6y;ewG}qm z-f*F~T3jGaDZ)yz{%zQNR5`#~8hz_k(;LHU=VCt|WeBV-WYjwHS$%$P*|2~astcL+y6W6A|a65JNOl)9(6iX6I&*p4W>as7TPc1sbWIv! zdT!^tepb@!J^!=|_Hs>}XBzK1n{MxjgwV&Kfz|1a<&q+g z@P){T4L5T!$mErUjk&pkiQBJ<6d?@$k=S#Iz_3EC!aS{ANKX7d@9HgO9GJyL?nl zgHTT{2Mt+G@XJ=T>M&HkknA{~Br@>)UA~@-x^;h;d6PfdvuC6KIelK!SN=sr=!e-> z7G>+Tkw(C}t%dI_Gu%yelA-HIk#tE~y zNB~A8vg#mV(gRuw&4FE34gsNo_SqKV>RGx9&4FYu6B|)6=b7)~60OR%iDPp*1G>}X z)81Xan|CMdYsy+PhMQZh=i^cVqE`g~t6+9;T3XR$*E;GD>ZCW}G*z40A|;zC+6|n! z@TS+}SLGr;0(dW@M|J>>L=VV=m4~XjvrB{amKYoK&uxbIMi5l%`zsB4$bN zb9E9IZVJstwHjdR%O$inFHNL>r%az&#sMSs`3$}ZxHuy+T*&x9t6MnIV*T^h5HoVB zD?PzLPIbHruzDDDt|l)8kY zzYv&BB(N&Vu`d1==FDB%0pjs(Jz7;?ppdN?$^3mvfMnziz#jx}f3XK8u&)BZd_I0C z$DjgQ$os)Wm^xW}%p(_{7?w?CE+s);V1XqrwYL<~0>4Bf{qe$l-X^nrr@|qZBkP;} zKi^P3pFhSpR=+wgr3ir?&^|Ujn&4Bp$vE5pfl7|@d78WvXAse+J2NYNr>W$-sUKht z_)LsEb0<@Vo?wR5*8Z{mkXdTM2{p)#xrJJEpei6y zdKFnNVwYbE;y(?CU=@Fj4eXr6n;^vT1Qt(B849|O8A0zd)U_{5MiUe9ohyX5VE*$}H$qUb30!&Co@MJ7V1?K|prnaT~zX&;w_> z>>Z0UPlaLum0n@NwW!`pxi`~?vh{R3B_zFqSduoR#0^531y)TC3phAUx=jWJxl6`a zUUp_Tr0ALap!dCyvhwPBw01WHMORY>)#TqJX*HJZ1^5=8pQBUNb%st1@f z%yAU~)xZ{}1z1xC0~ReO>MQ0w4D{1MkDATE*@X?EX*2mUyFiUM?ltLr*fl4YuvzCd zOx(x-=*U!tV656a?C;-CmS8fkUV8o@z_(Rjz3g7FELY+E#n)REQXxgak_}s54w6v# zl#-BtU3Guhs3M>1S)OJiAmnE#Qb@l`XOugW<3Nd-cZg^D0R<5WP8#eFVG+f5aK zZpsjNF*JU^%2_4n{&tn2bHU|j!dLIj9b7t7T^W=XuL z!6(ORG;D85${r4a+!9;kal2G(k%w-#CFP}jtW8buGWOk*>1cOp2- z*}qB@-a48zd6FoUC5(EGIqc{I&Lrjs!4ou~AC9H&y7)8;It=YnNu;B8$08hw%M=~K3+PrHpSl4_JaqmeRx-fu))*6n{v zY2J)Lkw)ec{2&(s;jJk>9pTPQ!UnhRdE#Q3BbUc2_;j#}JumBljmak z4uZzVFxbk1mma|*1I5Jz)_%EKXy?(!XwR_wpTj}Ed(2M_{y<*QJM_h;y0}>CZkkV5 zC1abP!2Dr43CkpP&N{I+lOIS(D5RV2#8dgDF*J#Exg%2S{WkX*zwsjc5o>ef{Pi`W z15Rn*V&x>yPjxa_gz4VtA~|2x;m*_YesZjVHgx^whc~PER!+UvU4m*1)s7iVdSxh2 z`TT`df|56YcEOaYpMjM28|IJn>$J)xjjA zmZTMYmf6|al$*0cvrT*<^gYD0!OqPc&53F;)nDA;^XIL_hQ-@R=QKxOu!K)|+3_w^ z=lg9o7%57x{tk(LqWOnq!`5JKADp>ZYGq6K6-xG}^2)RbxES?tmv3$X(eOEtjfa zdvuk~)@5~w&R8N5(Mzi^<&U>7nQ2YA>;|--8=sYANc|0QAWkR}C@WS#2BEt4*W88Rb^ z!>uG&cP^MkE51SL-Z*;OBKVIU~H#YVHj5Hw-(Ow_ApKot) z-aaed*XBa^3!5$nDT(wnx=ijXGpgO`q1-;w^_dpK@u^t4xpQgqD0OvIl0CD?gt2K0 zdRce{dBpzyIOO)L+~_1x1Isiz@E? zy5#@x$h*pS4Hk^Q70V z2*03M``Qn1|MpzjP!qsHQNWHlr|GkkJuFPic@U(i}$hI&idi3CVo!Dh9er7E zu%Ugx!ME_RT4fiZT8d-&%fnzo?6WX{g6q7VLWNIGN_yG<^LoQEp=o$q+1PE;88I3Z ze3{m-;pfL>WN&~%L61ya??SsgvNZk%0ekG1Vnm*Ajw4blPTohjfZ?}>SarPd4? zvr`&>a*ogFPEe%x)O0np_GlZ)s}_4E$^pcQA{%~=8GulhxB9XIR6fG7`^5Tmdj==l zTNBFj$>IB#p23=ezfLv2Sr&eMta#+9I6O2S&#qTy>~=G^zUss#(=}#_#)Ts^CaH07xbKnp3TclF%mRl-w^;JAW0;VHk`?2Qmp-=K z9c(CW*?zH1q9fT_{k%Qg% zk7-^9=tX%E#+|g~Mozv)nyDQ*ayNF!gzxMd9WJMiqdx>&tYvx5r!(;u8)3gT3s#$_ zImt_*)L=bH%zQT7@S7$06E|wU3*6(P{cP5w$!mETca)=v*gp48On8AtW$~)#78V7s zURM+k75#jIpL_5!GZvVmU zJ)=R51DQ~&3~}365%i>jnq6SR++)m75-zGqZF5Txb>cy(lbWQ#y#-@;Y(26NPdvL5 z&;eCDv4EM`IgibV@ZLZ>8hj?=cDJFQM4F_=)m9)rgfU7EDHUE83W;xiMrH`(aCSei z76B)s)>hsuMC8-SUcNm3@_vprrrG|;n1RmP65*iJ-3$kmZOT25P)Q;m6FkF9hY3Hh zR1mosSF%k!8((KuOypU_+=?48e&AcK($irS+!8Yyf%uT}`K`a-;!2f%C{u*#Q7si7 zUWR9OoA-_1k)59+&|9bD%dB~tJDXT?Hu|Qfy<6YJvyh`qHB8IRGd2o$V$<670{VF& zPI<|7keS)1s0e<8b+h@2rM0V$v&8)`tDjv6-!41vPsS@ix7N@)X8MyqQZ;^(dYDvD z?uzIvUc<~vqmJoZIya*V+0fm?B1KFJ$$T6d36cGrA}Iydr~GJ$n?Twmx66~xZ|>U6 zy^GBe`m1b=JRLQey+zdNW(A4I9=ByqUtr~>`&4{@uLkqL)?z=5Glw?W*9a2cU*iyt z&I3b3(GHb(nfkpGEC;m@({ND2)&_IM)(*E3@0dBz(NyT|q0#R8!~TK(@YV$>*If#5 z=5)b4lXsFX5`*MEf%*7i5z_diHBHG{J-PC(U#ML*MMq?JtiV$+S4i%n=HA0F`s(ZvlBqt_ICTw5%jzI|nL*9gz{uG?&f zk%B~o->c5~oapPSZxS^u9Iwd5Vk%TRxTG+zrDiqA5p$I~?@Vr7uWu2!Ce+o_qqW1& zE?lfq#_!o`65LwqXk*7~nVz*+y`QwyVN@kPspCc=Ek_)WT_=kQAxygyF(`7dyOGlswB}EqX>eZ8Jwg4%w&%(=wZwc-nENnf8X@j7T0O_-P`LGuKc*O=K6I zu`ij0;HPCoH1-TQoodRF~U#Rn0hN|G;ra=CX`FkxU=s=G}zwwL6-7-;_!Yw z3>QZaU#yQW+#`aCQ8%R1?$(gP`6zBI{w*v@<(-;qeK2}o&FX#(u;vV2AIxxM9_h_b zJ1r^6!tPtqS52u|K6fWT$6d#{qA6Q`)}Fl1vj7bjm>~TkeQ8iVZ@9Eo=x}UX;p1S! z&-D`?WM*dFEynw9A3_-hVY#{;wLjWgM&c2j3BW6DIgFXE?Y@m-BwstBVYwn}sB`i! z%(x~8O9=Rfl^%~EOaVC<(vF9)p^R|l+h{hG1laWpBque28!Tcz&RI)6ZmTHjsX7jDMk1NM89nNNcmz(g*`5UGjUQ3g}EZ}Cg&-7+1*f__r{KR=8Qj%HbUQgh41he^y zuWSA7X4?EDUCncBt=!1*$Ud|53m|c|G!_#+GaR3+T}EEt=MsP0JZ;@mr1exwL`}{0 z!BgSL)X|f3&W~6XF?o>L^}a<^ygyS__B~pEGqqPWTPa>mrOcQvN<;VdSuahMmvS^q zl!Ug|$kYpAR8&+X^Rsx(H=bRSBxtf{{Ys{Jf}P;`dzilk^`{||2Z3+!K8txhu2kpP zB#C{E|0tbV+O>Xcq^3T@5joEmt1#z$Rl~hj+VPWAba&pq$FD8da)GYC}<|Lx*?_3G?cJ0mh)I@p>)@|Wz$w0yNjWX-(Yk8Pm zjsiDNL(JLs@>+;7lkOvrNk3y{WraVHDrp%T8?%3pvl|aNUzpre`ga9wnb4~rj57FphUo?c^={NsAH z9^Lurk;h`CHv-@AzW@5%;-`#aL9yT)!B*FPYCJP110A%**@WU}s8fF0ZWNj<_ec*5 zljKMUP%$tV#S_tb5`FvjZPA+N?IC;{HyF(lmavWq5{VPVnAb?dxta=9qay<|BC#nP z9>qqad<<&(#X=5*ekiz#+S~oNg6|$)_18;T)3{Rb(2lbqTRBc|FxPx-$s9tfqhIJ8 zupJ70v1EfLXR|%9NisOZ;0F(R``up-Pi!E>neW9XDx!BzdGDajSdJ{|UttWn1<|oc zhFrzZO-YzRJET?rz}>u68c9LUCdcHkh*HzbjmKj3v+zz<(}-W3Vo;(b1j8A=V~J&+ z(5VHaQ9qW*EY8o0C5S3h>rgmu%UzkEoaC(3~i7s{1X9hJv(nIhzZGycHC{SCvKC?&ee=-T>MgL9mA;WFz+c%*`& zJdX1AtEKy zMPR#B!qK{KE?vBI?fSv1<_!@OMVE;T2FP&+3_EL|k==8da*VLUb!hFM5qHLJbV6=l z@7IIcoVZ}X9ySIaIW}Pv$M*6!k2~Vcn?s)z<8;OE+T;p6XY7R8|M+$$BeBD??&N*e zV$7svgy9oT&6}`B2N$0G_wu&gyVIIU51lM(GKKk?o%Y?0C!c>VC4=nV|6NJfWNRUaH(Yxc~IY;kuyH)te!)_;wZ!nvg}RY zL8lYnoZBsxbQ`8RcP%}Wfo8ME5xoLzu>~XSvHAqs*>_>h^85O;0*zrUIKuauk#Nwb zsC1$t_hB4f=-#bzs{S~J&=T@Rm)rRc2N-ya$rKXfX_pzn>mWGRT_dQlCZUtGxI8=nj3`&oUGe)*>y z{puaYLf_

5o)XB=Ih>sPet(UD!Cu=WNR;V%xRoT-21V9kZ-E+t_klc9I|a6LO;P zh+dL>ktPid4W;rKhz&3=TEjX>8sQ!Baq%iZ7x8VHOh0DBM0$YmodfN~_tR}F=}D1D z{UcNzYhu^Nk#=Y{EbmP63v!~IXhTwhq>yu@JvEyLPOI9bk=hL#C_7-M$^rDaCusK{ zt1ow6HX$w4%41D)=#E9hNp*CLG5M zmeBV6UIyQmQ?uUeM$IM)y|`a zj=D+eRCyg~=zPv=iAlesHuLg5x0c&ET@~u7DqIhH3JY?|w6g_}#30*@UrP)pj*4$SEm#tB%Sv%##>S5|-RsJMyNfM_gY;Z>a>Th! zL_Sqtzm|XlG&5F4`FOlW^$~@|+|Lxf5gxCj;zv(h_9_A(w=)3TRCn-sApg(F7xd?h z2)e`5kMf_>l6(D{rsr5%?C|Bi*!U6IbOH|>K;MC>e=8_VVsgx z$M?L@pu?d!@7F(FPVFPO8R{EiHMdc5h{VV!;E16H&o?!@-o`?w)s*?H@Y%_?v+w-d zsX2cJ^;tCv558}4r!L2jTRrXu3aVULMs&+xYfWHz({6m6?8q7biI*?@)0Ou%J}%uM zRY9-vNob`|==Io=1GMUAPqRFUQs&ZhuFTjMrz=oX2li%^Pkd0+4i4!;8D8#aUb=?U z>U0N5NJ&#A9@aMzJah;b51E)bNUAu!PV{xHM$VtHs$C4;oh%PHtQrqQv@gG#1w7k-Rq6S_sddFRD6El(|_IYW-%>B zPGA3&4~ry)U4|*r&g_lv({oo_3k)cSH}h$dYdy>9^0>cPVu?Xmi@OIzL*O6ph@vj4 z!DL)pG8IH1ga0i%{^Ae}cIzapm5$@921M60UhuZ?5@mXr&D&jLTKxsg_}qWucBI@% zRwRs+PukU3B7)-_hY2}nauD9&$VCvwNFjP(YfbuoC^_6Us=a{fi6F6Pp#w`t;pRaP zSl)?R@h`K_O+>P1UI^GaMHFQ{&Bku}_{+wRU8CQL1*D}u9uo<RiM0*A~ zbyWJK(Bod#;q^2|`Pz2x7?;{I-nLpl-8lV@16M{J)<+Z;lAe9&&7k?*@s9K6&6_h= z?1jK3xvh;k(c7c5i zc6PnF;aVY=jeI8ueI>y~W^r$s>gN8gC*2jnEH2(!bNEFuX!~# zQpo_dkr7?pUSC8+rg$HJF%;%eDv^N+l|D{MtMx zW?A2UK%}Wk+uMr_*9LoB&|-4CC4Znac1W0Bz*78j!OA{R^BRw>DtN8_rlx->y%=+j zokFi}5c|qc(e}o-1@*G)C2e57rvxpJ`t!GMX)sj!E><)4->MZZ_;8+6poqpZP{#0w z;3B$3L_`!!B2g?>$QcTSg=B(!7-L|46(V)x9KEa_!d_hAd@L97;NYM(C_c4asbZh$ z{O&t2nM~XNCSzo#o04I6Y3{>pgEZwBc0S>UCA^c2gHnrrctrQBBrEIt@O~Im{usZV&^R;m zm~h`d+K!LX9aXbM%L53p-l!$bB*+%bjwCvM;zZxrBd6GJWiJjLqx_y7DQcxE80HO} z%B1u7&ytfrqv<=gSYpfOMpjE9Ouz~FyICH41-5Jl?{|g^OW7&Ai7R*?m(1*4_)3X< zdq*LZnfT%fa`M6ZtOnn?Ch924Mmz;|%BoMy%#fS)7Msay56brFg6Y6Ot`M_zYE$xD z3GG0;r5Y8g_B^f};U=+Wz(`2vx)5An-JoNX48LRB?Wuk*cYr>OX_ZGQK}F}l#Dka; zl~qzjxH$Z>pvY(HGe4*LozC3K@>;rsc3!7e%h{4S56Fas321qX$`ci-)Mk#}#azsA zIe5~o<>!p2TXkVE`yq+4cPFdp*D@*OU`#POIPc7~TBi9KsP^4e(?F4_X)@F9JI$}IR@if5@N6b<7PbN2TS z+-j|UM{Z$u)_Pnq|ExXRM<;QDYMXMsmcBdByYeXI0=T}l9L*Wd2f)&;IhO1ejddj| z!uS>AzK98{xk3(2VpQLhUh{Boi}A?UY01i|0%AXZBO1=$sVN`*8^OI5qo=a5xk|RN z21fH{Q@*FX87?lik+F!{>}PSBf92euXu2XyU)|$=tQfGr8BBSmX?-TT3uq63FU zk|o0h)6aK5NRL(^Px1|mt7d!4;n?KyENpm0^XIZZ)#^FLHxdfgd32&mQ*t2HuFX-1NQ@AXaD6Q` zrR!h)(r)8Uyg`3pPXO!5>NQ6B%){4tczB*ae_n*@?&ACOgz38dnC6!Z%%&;EGq;J8 z?k&v1!XouSHLc^?BBu~jUY(eWAe(KXq4k+2mQ^Vkx*EafQX8K;w6CKN3FT*wYVtsb zIJ=*y{qrLNUfyKRLY4_AwTX{EwelTy(`AK(`43kVT)yN>WNZJMe+s??$Kxxy=;UO? z+0B+54@nD4ODYDn_{U~DS-K<=kxbG>J?4LfNnj`%Xx$Nm={Q*B@!3w^r{)wSK(zk zkq@a6Fu1H!1P`RY3V6@$F!9E*>O2Pr3ALAxaTl3M&=08r1ua6Q%%bwP2{oy!V;z+& zE?(=YqOY-+zK(X( zFU^IJwdJ^q3!5#|YKK)m|F~U#`Vt6(+^xhsoS?- zODK#BWY)meN+LugebQW8ZVQ=@v2nehBf1$X7kGDd5X90An?6Oz1@dGkYVnFWn&_=* z`FOs<9k2S0rra4Ag&PV0c=8eVXwv9yxuENgILE=WLQ z4lcIxf0(KEkU#!lh>c@2h_8;h@bOH00_z1~e97y}c%)&yDoG_Z`-&y=s6eH_3k2 zYu)W*Cp3?_zxMe=l~U+>hRtNV?VSHB+vN%o+iWx9&RG{qy&04B*^5}bd~*W_^{$+P zf&?+!`;!&iOMTb{zMGX7-DRa^y6$|ETqH0iA0Dx!&KGQUgt1i;97rbqbRlDMh!bc5 zq{Xp=hYvrX)T%5iW98;fRG;?@h1A2$6GF00UQAD%du2P}wzapVL2&j3luo15ru@?@ zM&*-o5ZSJr0MXGGFJ6>81O}5H;jUAem4KpaH&&&r8TZ-J5H^r4PKQZS)z`Ipm7|jz zKBxhoK6erH$qaz`AjLqDr8;!z-%nbj|74%uFJ)?U3!^^XoqmOPBzSJwq0#*8-GCbZ z<7n=CpNqiE;hCupGu@Rhd3+8JX(a3i_lY$oAG&wmMBR8W8_b^9=?k3hUu$;vdv(Q| zpc=)7P_UvgQ|lUDo_kU!-QT@n@44l%M+R~hd1*jS%}gNSAd;S1n+Ky!8h<1>hMTB;t6n(K|^43e)nM`tHg=PRbL~3Bf%wbt(6vw*G)n8~!AM9&zT;QB?W@`-4CVhRQpGGk`M-tm* zPCT6RAQ`o~a8%2Z4pc@XzvcV(qR@Y=++u&oHdZzdI#J7vDTrA)T}5O|$clCI)KBA=2A;gBx!Q`Z5J z2Bl~lokMAjeg)%)u6Kp_IGM|`Y8~h9RJFfa(nbB2Vf{y`ik%?d>008_$5?I+zAV=H zf?>U)bh5hGPbxM-#8(aK4|6im(?17;Gw|glezGRby_8`}-v5K-fK;XZ-Pw|C`I)a6 zGpQ1K>aQtGLMF|WLRLJ)%d3H^rGqlEvzdp_2)Wd~oNaZO*w1#It+qC`fow4?nfvxEb4Me(++*n+ARk z21>CF*fYsl(8v3bwS2(}3XY0CVodWjZj>^*`{BUBtZN=UiXO*O+^fCas*y}R1Xb({ z=3nXwyc#KKQl|#DlT92bn%?m^PmXBq&8)(w-g+PLgdZW|MHS~2igdYS$mwbZ!yYs> zYNgtY@q(BFPb=9vDjL+tQe<^nkPl{nVib4l;AkbLuVo#c6xtToMA>Ww;O`?$9#yu> zrx;J3Vmsnrb0QJFFy18XG5S!fHJLLgDiNvXJ5p;@N~w^zFUW)mCX_esYO#41;1v-P z6JxC3Gl|%c<$c0R=_|Y~V4Sy;AfmRB?pg|H8#(SIfYoUtq-XeeQRaXk)|VikfXvtb znlLW73+KnrLHn(~(q(v1HnI?oKjN##!c5;9+iIFa%P30iVHV@`?7P96$yKq=u5S_2 z!~m3)8uUtv?dxnM5Qw*L!^S)q)^7S3Y76jS_#S+vc`ITjb#-9yCVeovV(gG?>V(yh zYa#-Tmb70OcXya#e%jITtmu0i;`Oc1P8W5IL&%~|javK8C_NWU7AG)6mpdEVm`YFt z-{`utaPRH@*B#{V$@}{H{OY@EWaf?z;2&;0I{s-S;vQv*Btw3)L9Z7SpMJo8@X#T* z&*$g5`_qh$FhG&u-bPX(jodr4*Kx8-VT!0#>aRxEuWB=3f<+)4bIuD2W?I!-oMk;> z*WY=o=+=zLg+t2@F6Ejh_M<1|-MsJ&EtKGpN-1M8Vgw=#uA192Sy6 zE}7KnGdOs^W4NRx;k?mk#}|Uv1F2_Dz+Q}yqem5^uO0r8pn3?51E*}yG$hM95RQMu zAW=#%UE_?!LB*zak@NhtoWc`Zn^>K9waW)KzSlzd z33Rvh6_AjP@QnOGIEE_yiq&D8YVmlyQ)h7e`0;}@G>X}JrGb1l8+af^#ulZ1@ND{F zzuuBD@43_^>`-eUKIv-4PAou0=vr*KE>a9{0L;Xe+1yySwng2`Fw89Vv*I~&u7$ZY znDcvz?US=V{nMSaQr&NSpO==YQ=EP}l-EC*mtRnD>;%KYMB5<%XYJaP!&H>&tw0ru z`0jwblZQCv)Yr0fW`6uT9W?)Ey>))xYQn3_S14Stp%|0cgU9{^ua>w~x>v;3q&a5Q znA~W|9lyJ2V&O3oXBP8lvWki_0H=Y=39dx8-_G`phos{46MW)gOhN(|mu5EJw6DYA z%0sVTHhqh`!w&V`(x21c4{H6~1GOBPv#=BUT__D4a-^BRczxZEAFAauKcSjqS_xJKfT zLtl;oUzDuVkE(Xk!=3wQd>f=p)Mnag6Ot6;s70P~SUsY-AAiIkJtTE3#SQbW;AxKb zB8wdn`m23Mx4%1!I zASogp(j6+HD4>Mo0;H4<>23uilx_qhq`SMMyJOMa-M?$8dq2GIDx>iPzE^^Zvn{QW_=OF^wSSeinK4=J(WT{D_(-@Ryzb(4^Pbf`J!H9xl32v$7wB#!Bz z&)0#*%F46+>3f9^#9>ZURzH!_Tc5&w64Dx&akgaWSx&?4R&HXPy4y1+cnLx7$37ZPUr+}hlS|}(`2?d6N0JEz#`N%AWYa~ zB@LAv71}J}xC-b!7|YlGSwR&4eBXIogj8?Gx*4r;$gq2-26UYr91kljfz{#?2BWOH zS6YlmamK)8!v<#4m>qk2ztR<85|{esf3nk&+-=|fgFuiIr@$+m!t%7BfcKMmRJ8lj zgmhNiPOqtw>D8ySGLvyB#gpcHuXZA>y%3NQTvNfzk2oyAPF6Qh4IQ1XkPbhe}|dr_NDm$#+3k1t(RTUQp?Vk0?L zO<+=qTO&|=TtDVBn}9>NopzADuPX0ZWX+6&bllk2k{O;9p6Y;#in_F!Pia*)kB&6@ z0moQ@nx>LodHQOB@!{_7rtjQq-q*c!I@BB`qD3xwbbBj?EuS>efueM)BCyHAI_Ifg zkuy80ck_mt;rHWM=_w(P0$8>i1DH15?gm%T%$ZbsSD;>k(l2s?w0d2Mmidi4NX5v7 zQIEIb1=@?r&zEJUi*aN399Khj9d!rTPK$v!4WmQA8cf^PwzkQNr+p2#+(%UUykA?Y z^@jziA10RhXVAZ-BqRGA#aoLPS4y6*(%jR(y}91M9~O-{+I-E*QW##xZs^`e{Iwi& zwnck;dWfsUdLJrz<(!R-?!Kpv)@nIivwZXfJ${R*4|ZZA^u4mO7)3y2Eex)l)y2u_ zW~*)m9ria`eF*Z=wo4QLW0KaAL@;Ci&r$pL)cw^*fU4~~kFSvE3A-kElO-o1k^7G!x*;ZpoGp|U*HJU-Rt-K$$;m?znJ*6(EY|aLEHm^BMC6qV1bS} zR{fFvNMDGboP41A7-D-9k)qMX_a;-p#_nFSif7}}g$?S-W}KOcOc2>$)?Cqn*Dv-j z&y8TBJ5s?>9FD|xIFfeb=qM3>b0KPhZApp-_OtB$a`s-b-=CV0h!ck$HL3wKGAVst zSmg_&1W`R|_tjm}iQN8Ne1YzD0cz1%`bB+6GqsM6PA6K*q1a6Na{{nJiIi|r)&lo1Wr>f_Xn@s71 zDb>!H@EWvp22($3a%x-tK`JZsRx4$XSdiP>KPXcAOGt@p<=kXvX9F)O%AD&BZ*I_M zNuzu{4!XNB%h4R7hpudTf^~E^tij0r-yu6_Se8rvk`>2NMAI!XJqR`SJIy_@+~Hxm zbvlJ}3@onr&|NsrdWOksI@an5k2sL-PDu%E z2lCV5^U463)JaMX{myS3y3j_iQ~hNzX{vQvT(of1;B{zOg7~Sin`O9Srg)UugdvAc zo(Av7t(kjK`lhL_rV^uD@Jr{9pgry|YaUqQ6>U7k{tW42Y75v&e6-$f-w$Lrc+>*8 z+~7QJcw2RQN}-RP?xFNs3BM1Su@^AYZF;PMU7n;^I?-zlJXfkTjU*Uaij5oIE>++D zRb>9!M)L9C`Toxzg7-aa!h+y?CA`$Vq9A1vNBXJ&7w(X15F;ooO7?Tr)i-l3xw#fQ zAPfjimT@H|+}=Ju_lSv6`1$#->?0!sJ6owacT?|M?eL1~;_}AOtLAC=fd&Me&zTBM z0!2jafoFQHmH{S1B*1K=R_`i^Pe9Q76h^`UCQCXyS63-7^D`h$2w`?H5ax_hb~>DuC66yI`kv}paMpWZg+cAM zgyoQjf<{`UV6ROgRhkD65F{lf+pZe+-jW84!{4LyBscebAjydi>1c0XoaNVPGH%#z zJ}6mrv2Gf~*UHi;V;1_j4wqe_TjGB3V#4?5%qeu^%2F!2FY%Z!_E**qz{a(CBV*Du znX)={lLv-SA&h2`$S1$@-;OTkdVT{CPZ=cok7ef zuNDwg+&wj1l?*<-DUGuNWpEpYdOEpDmZ8{a$p2v?_>mqSmxIk=&Ey8H8!=3tHr|0$ zfnVvKcQ;(o51h``+_fZ4)OGfq~n2L(SJ8F?(eq z>*f(uHsL;_ew3&&5Vl*WH8ZUQdS%v_9u2E|lXFQA=(zUEJu-^#am%@28-tci?1M9EpicC&S3=G$%?vtyv zDTqIOL4{&Be~0a_)9ies`?S+1vBw2@bdj&ppXX_dKlVvkCcqG<`uz!lK5aoHbQXIS zloRF14M)?sO+{GzH(^Yg3ppy+gGJ6bVc(Dq-HDA7gi%`aJTc7GMI6nkezS!+2Uc>z zUd(wGJQZplCB?;7m&YHrUJN=J72_o8cbu)(y&_bs`!HCi_2b{mhA>MPLH^F!!wKOZ zBnbOZe~-?8=Xd_|e=u?&RK;?hUL&O^cyAs)RK76{I$>p?LpC+8{SrM-5o&iu5SEyz zKhL38bGkDP13Hah!)caGmjAVEqKk+BA@jxVE4@X-ToBe0?cp>-+=(M z11o#`^1TSWVrw%xWk=zZ=i-eFt@RunU@$n_>j)^Q^CZK3`+&ZLvl6 zMFfIBYE?EFb!HM0aMgBOD8Q*`kbvkN2lql!8efHX3J%}oX?QZWPV-k=s?n*_3d^3J zt|zWPki$%Ws6#3&ue4-Ir#t0Q?QhRf$Jkdq)Mng@D>?*DGrnEC5XxiDA;j$zZ+NZ|mE3B#? z6e5mzcP=gzK<4w>PH4W0c1~3}xD~csgvlaci-w=>IH7I_Mb@@KV`l({1&XFNaNdDo zz8P%#MFY_ib2i)z*yT8OyB~{V#&X2XGkS0@-EpijU%STY_S#9iZ?+ek*G*ed)QLs8 z429FIX{)`?OGEo3*%d2z0pAHPH~IDL?E1L)I(aA+a?jUNy$Gw-9ld;q389|HD)m5% zTEALYRGO_;SbdXxaY1@`WblRHKfq1`8P6&Q&dq>?r4p`2;ormc?>YPL8SD2e(TW~z z2GlV*UT$QDhlRo20yn3i)5U}fGh)t`5+D#H2Jwnre|_xswV*{yt+Qqu6 zcmwu3JcLOLc^G^MP8TR#iFLGV0Joaj`7dn3w_5s{@WH*GAh4EEkho+;6%rOE!OZUF z`+JFzAV1`+TN2J%50F!#p{?qF_6AnUy%1NjqW8*7{jTDK+LM<3Fxc)U^Onm(9qEBJ}L3J zCDLKyY`9ttuJUJSS?MFD1*ADQH$py&=Ti3adb0Vd&nj=H#XtiPkeeB?zO5KFPw=6( zU-qYxpZFpbWKhLk9&h-BPzpESN-5Yb1sckQ5l&I&$Tm6wtA~KYZbH@grKa#hIF-aV z3)>_J`rZ6v5+6JC7|HR+>Ful*-JsXjS&!Vjq8#AZ+ZqgV5Q&G{DaGMXqoYmqArLBn z92b_i-|^K+0Rr0gH!qm-4*mLKPBkB=(n->y|KGyG826Dv@ zpH9=PP4LyJ8}-S{Tb=DcD}t73(nFVV7zI7l?$4rB<##^pumYwM@QpOE18{&{r7*y2 zkkLGGnRg;dLab1iy}k_;=~mzn2#-{9%=<7|OusBNTOAIL*Fn@m+#F5Im#g&PKlrqCU|s&P=*DF{&J5cM|Dd18j1^Oyq>Km zrDn{c8OeUYGEb8pDXPVmme7TmYUX$2R;%~Hy5vM;Xs#?-gZl8EAZbnuUZtH2R``za zbRbO308bmcbc!yIG2MKvyg=0xCsYaE9n{fETqu!ZuK!X8&eAlQ4lO-fOTB1k1O9H+ zmi+O35iBYyDo^#~do`r8{NmkQa4KnETB>z#JL?nza437|w=6X@gx=w{(J`fCnl)Kg zC3X71=h1t1?P6flJvm;}Zg0;XI1{FqspZ4G@8a=TJTx9_g&LkrQn;f5XW6}TCc}e` zIOxPVDmiV>7UVC$J4)_L3Y&~9r}kxJw04)2y)Cl?!ZzN&H_!lrymQ~5nHvDR6=l!a z-(SW5-bDW~)`RP(vr~s_D!r8V(Ifu_Q?JV4M;A{Tf{~bCb@lQW@;`3)7$e9}fXUF{ z#e2Vkj*VL;a5LLkm$&x#5Dma`bZ})j$0xqyF;xH&2rpo3JO5&z)lb>A$*~)agw=G3GUERpV)uBG)1~5xQpxj8&(8t$D0y z5MlKK?!l*dw8oP<1}3xBysoay(-rB4Yjmk|=AEzo_D=qwVLi?QNXARY3TiV5U9~{{ zqjl&Bw}c`=R{7acJ7B0MrEVV(v;BQYCQUG5?h2_~nDYX5k z@WP$HxM`h7IP@g{qA@8sMJ6EMf%oCLRx!IKvd!Ia=?A50=EL4C&A1GVucqF*)AOwY652$J>>iWt>5ijGCI7 z$HHvv8y=?qC=zs8{)qe|2b89ht)r8h^k_5Y2A#=Whv5o_F$vGtkk#mZ9}6vZK*-5G zoxu5L)B$fM8^%WV-zwUFMjhB)^Ea9e{f-ofl5a>T2fRT+LLq+aUJ@3M4(;V=XkRC@ z0>i@d=g*z1)>&CDSXVvx?`QTIPw`(}Dz`s<>i-?wh*?@yoSvT7T3cCyrVJnsj52!2 zclB6`1ZFl8FTt5Ex7`pFhau5S$ly#dJy3t?HQ(rscQMp_S`uh8CnzzsC^qkEe z4B$HC5F$|qntFI5fH9@BRkelSVAiZMrz~bU%>!Vd#Iu^}nJA0ca z^YNFG&6uM(k>}nfe-eQhAUJ4E`o>1P(Cy0JY_66pQ$Eq#cQ^g(J~U^)hY73g7av)Z zJOZ@X44a)o#>i+P%eqWtcwyz8L|HuneomCl=`XWPU^$GWM)-iPIR2$5Aje^Q!V8G8 zE`xmGYzr>$q&BQ7M~dwDg6S=3E2M>6f4oIG>=C1eASMXviYHF4dqZ6fe!eGgVFR=ee zdZV>Zwpi)hh~*?sD{l+5z?qE`PKL+EW*0myX8p!ctT=o@sJOT2GtOCnyVjS`>_5!@ z#xLo5hUmMHz0ZOw`a~TZezQI4@>mA^hAGhhF~`pTh-@CJ61!x47BlZfUoxcxD;^~| z5rjF{?>D^xC9aZSa=M3yrz@(u%C&hM8X8Xm!`0*J{@h?ybKvVVX+5wq5T=X1)7S5v z_Qp!z(+aNT_QSmjW4^w=-lmi97JX^*0%Mt$rdZ)oKe5}w@-ACY8v`H#U&2QafFM8i z5yQsvYu306Cj9=4IMcED)h}CVLvz%*XAFQ2V>%csOz?qLi9HZTZjS=~nnAU?u0QDE zTFNT{D?Rs)+*&4Nnq~i_G)1Z6=U|Fqsa?D}3TiZBras_2L4xz6qPiI3bhX{j`XsO} z1beUc2nQ7F@+Js7;0SK~5@=ZB-#S3H<+s!Uh@ecjw^n3j?PW$ zJ=D-4G%a~!>*@sZmh!)3)_*l|Mtogserz=ZkHQW zP3ZA7U_U2A`3-`KDZ`Rc>8u;dSbrP6q@pzk{^0@`6@N%Pdxqo+-=K zjrqdQ&e>Z;F1M|Xr)JzBrVajCn=0rnE6dBk1o*0;yJxb~OXg?1mp?xoyG3!f6<5D0 z2(a^Pm{Pu0@peOvdN6I(47tl!BQI%zjCB-X#PM0Uz6Qcl=j0?AzCb{N{>_@iCevik z=RW}ajl|qA$Wp$bijKynv!ItZ*YP%EaJZTSOxlxt%ojvjrpt4NI}Ds57Nw{KdIzmQ znSE^BN3lI!fh!Y2(UhxR0yDEDh!6(R?}-JsemoM(Nl``bd>%7xkDJET*Ccwvn1CTq z+t!z9I7KZ%zvVo%c1!qaKI9GE+xRQuU=N)8_LR@0%k6we2g2}1`sT15A`xTGo{xce zSmUhBTL$i+Ht$Z^Em6Ey=rVhj$w^RTxJ?4%J_)iTDKhg9AZ7+nv~~7%N_>C)%L2N) zjxvD#U-;+)I`5vZ0TY9ot80ZF{!BgEAcg$o%8ztYmZ zucomg%FEm8C2p%@U6IVG>UIvwcFzN}q zroKes16TyAFEqK93G$ItNH&uVBPAS#)9^VoVFqy)I zNh@}F=`xkJsz#41T%p^NjQz~j0>;rnaMO}Nx(z|Vm-vR~ZO%L;y#%!}SYdfs=|90Q zcdmh8jUQER$wQK!TVzNaVTtXg{cGRS6Z<|N6gJ9cD`nEq`v1~-+0>lu(e`29NG*y= zkIL{S()2mF2o{!>()bxOXm)HISg_cat1oCX7V?a4^s0l+fAq&wguZLqdNu6%P1uV0 zoViE6>OOdkN83bav|cmRqImb`2jq;B0WK=Td#2jpbF6wYP9(J&MrYNF?bSbm@-?h3!Y^BA5;5cw+3{%|2ANllN&GmD-D*Txbb6$x18EWdPoj zQzaTbhmG)`y>1M|wLYeC*v`NeS{QM=o($UQM zjh*sAHd0VfNnOw9Wf21-qp9%|m_3SU58*&K#lUw+)uE9uuFUt*BZZ_~nSx=%UiFIV zNX3$;;sS43NNH8P$6;Yh_5e0VY~#1fdDnPCpDdOU1!Dp6Tsm&5+VVRB35R_f;prP! z1e(66>N{tfC^07+Mo8zsLNY0F>s0ZNdLxnYgy* zJbM|iulHvYyoV%oiKvgUo_lG^E{S77s6`wVE5w@x{2P^6QXVSL?YfuXAE~)~fw_cX zgcE(3J8`?Wu~(RC)>JhKtA)ksCJu!F+*RFkRgB;-N}yE)07N-G@DBezjyp;0aY*>+ znj*+Bpg26qunyL6Kj`729R6v<-OPqHc|h7@2L`5Y$J3PYm} zxH5H_-9y}i*yNCu@J(8W61+KBvv%;A?o4an#Q3coR;S3TskW##Ax;Jawut`JCnwj*ZR z!=L0!4?;@_?d|RT0|EkAr!o^}v?xTJ@f&uyvz`Q-!ZRq4@{ySF59D`Tc}`g@+sm&R@!*_N<4D%Kp;6nR8JnRRZv_b!&~^#^(D$Z z?`Z!Lf9xK+ab%H<`A1bxRw^g^b-+n})?}?hS@J`nEt}goLtsWrdqAL(OjIa-JOX8W zAym3HYH-)UMw%+2Wm?jX9LKk8cx{mA){hJq*u}spd4K@IGVkg^4-Vjl(xe^DD{JEK zqBt0Bj@Mta>eN%LE%llXfvTJ*nvznu$gD}o^tl{1*x><=ouYwuL3T+|iJ?GZ+zJ%5 zoGN94r3zO}V$N{!Yj3e~j5LwTw?eax@cWovIV{A3_qMOf|h7HQO!0@O~8QPQs&QAYJD4GK-P&7{$cYYEiEbzlGP z2JsT74@*YW?|*O;hNGN=vg9fvB5(fWeWL%V$uc~daD`<{e@UjA&p0tIu$ssr$JGIM zYjWAe`T0a>q@QbxgnbfikTVA7UTA*(rOA4KTMwJGB;1s!7>d_z{VMTRfk=-&C?oq6 z8d_mdh+HtP;C~qEiSgmXtVJIzic?U3`ND(UD1UQaR~+}aX2o9FM8mNl-C+W#VV+KT zPZr&2cCaD>3T|Ed%Hs>bJ?FvD$o;qc?-mn2^KLO+gyHw0ft{tSMucsle}DIn$^rP= zzj1lRmlDz!Ulk+G49+zO+2@}(o8WVG_P>x>Jmm1aX+Tujf)h(cGxZ=4sb!wL&p}%S zLfUj}g6Qp_7Xn1JW)N~@&($&B{#3<2lv2vp95WxTI;H?=)G5__pkhsi@#MrlpvZ+b zEb?6vKho%7e`B7kF6>qW;+eq1+8;i{HoKt6Zgdxg^4+&aEy+B5ykrq4E}(g+79zi& zry&im5V3GW^F*pJZ`$gt@!~YCRPY|J+E}|6zkqmQT~wLo{*g@QMI^#+6OSS^6d8xr z?}aEZKoC3n%Fy!gjJUs)mPT2QdvIqIR>)o6j~wg@G!f57H^(Ou7~P+&feFbsvnD=w zDs!e*JmEfS=b7e0?%%)*L_2C9PYui7GGLClrk|D*lCHFpu5#%R<@>&NxN&$y- zkRiJze0c~$w3Y#T48w}!C zxZ4DM<5|XM3S0@P4=$;XCx1AP7g6+T_)ks=_(;5=m<&)gsPQx>sYv zg+|i}z0(b}v&#z9;`;m6Yhphug0qvH#=YhvqNdLNZ0>>^fA&J~(yHM_Qsu^_1=<7` ze3yMfnuMJsCAf}Yc`{s{aMaX|7XoR&53@MEZo&+@eutK6*kpGtal(Xm7u!{edyVPB zs!<(Dc)-0bAKvzUb$`PH;^nb=3^X(4O_9U>Ebvo-f_8tlvVwJ#3$0wxwtDHM)cLE> z{ZTX_>iqtX_mfSzH7SK!-S)dPpMfp+$&@akZ)v0g8mL{_HV+Fs4HdurRM2oszJZL} z_OYTeMZIKo-F~{zd+J4P%o;DBhq(n$PrVERP#kmkdB-pQ28-cI|%yfF%=|A(i7eL7gB8vJP(U~{K``%rEW94`^`lN9szp7s9Nf$6}E86Qv7)z!~! zx(LnAo%pz-UU}N^pMjSiA-cF+6L4>Q+@5$HKxI&u`@9)@Ayrb*g&1KiWRt^z95srz z)`>@iXF z6_|c-#}?({iT;NRC^B0yd6{%A`1MW6aZ^5f-+Q$>d<)WZPAE0J=Ka_0p(DnvmLi6e9Q(4<_nuQt1ayOSJgFp~EuNFq!5*r@J8SSV| zs=P`85CZfrsYk6CasEv1^usHy z#KeIH1&(J)H|R;`s6^uO7!yCdg|Id}j^L{;tiO6D<)QuQ;e|dxUe@!B{}G?;5xci% zqk{*$`+GNWg}!CafcMIJRK-tny=R*uS1=)DO;tc|xrg*dBKzxJ-Qm8(1y(Qmg(07W znC&J&Qzr|r@jd5wsim8#viwC~uf#D7+-}b8pYe;Qv1BbAZw$wP;$qe7a1XSe!H0d!C&T0#}5UYys@RFWv+!@E_!ixTzWC{Re)9L z!PCw|95y1Yu;z->y`V7Wx#D%J9N-zuZ}=gclca$N3PtzP{Q(K9d}6e2wPl5*g6scH zY2j|}?y#Hb(*-zr(Q@lGT%Zq*#=KM|DJ;wrEaC=fdNKjq)!@19<@AA6H_eZ=yN{Gl zOB<~SYv;<~gw82PNCh7&74h3Ai$(q6-p>KI9j)opn@{EG>NL-Q1oTCr$^pP1xU_*N zu-bk%e(mY3s%zbQY@AF%x&mhwN}3X)F7ZOFT~y+mdY|wa+UL{bjtvmp>KJ~55#`vu zhRi1$x8hpg;ojb7AU;~C4S@U+Q zc?_2v6#z{NF`SDk5aSYm#(C(J zz+waIgz06ttbbrdy^%o zFnc#BAUT-s$9#M?Tw(Pnb(_N&GFpadva;=Wv|4Z+tzm7Z-xU2aAk|`678EQIVRlgp zSm9AOTnUx8Q%Tz&3B!?zC-ps{-pM5&1kdfe)oTw;AGG(W`B>k%D2Tt*zrDVQxoBc^68UGk_sXe4|s7!Oa1L@LfDSsLj`oksJ*QRKqLRh1)qG^)#ZJrnV16&?- z42+@fKYUB$JYi=qN=R;imJSGKraY6VGVG38pROUvxm1xJq;^{GP!PZI<)3#|3RnUw zFZ_EUD8{HGMxzL^N*L&lLj&C9eXtp@MU^?C!R|wT* z#;q)-th5-{qr6NKaVmC7E=4;M^FZBmJ%8NZ>Zp6V7zwlU``YtC{c>S^2&-|pSkA3 zX^7o%HHh;h7f|0;*zagugB;O0`1Sjq06=5tjGIL@zj^SRv00m3U6&8PYQEOz;~h+0 z+5M@uHjzCEn!<4Q`xF$xw>MXS{?RGuW(9t?2Fu{K5^;KH*{I<8Vy2zrMn?3<2^XL< z3)n1wA{-oUl5sz6g1Tt1=?o+mG-?H0b#0OS~C`u&ev?iYd-Yb;2Sd6u^1) zPbcGR-DY3(EY&=6e;i5-r*%^)9^GUn(AvueRW7ROpHuq(oAY9{ip8vaKyqS*R^{J3 z_tJxq@)h~2!g#*+z1e!vT2axSvgY~L2rRH&`ySV2XfW&9dRpi^@DixJ%9mW9E)btP ze@7+%$e4sm@g38W7D6#!AHwEGAKE7LpbDH{zb+!*Tw?w>G*m#}n#8%WmO~JmP(kk| zsQn1lK$yo*ay)1wIU&(nT3RxfdYxuMU(5N9=lgW2x8eK)(2Jf0hL!&U_bISoeLb7;R*b^~ zqa_rO*3uOrZ8DJV-tG=BU*(s#t1`h%s;-^yAofNf^%r;4E^A12T32Qg|-4!@nBdMGTNrC|*7 zCAGx7oo}25-}Yr*O~x6G#3^y zYC&PWbVupquS8~cMpIlSXE2Q8`QYvD=KS5n5LdlSp*xDLMHBzreSs<1^@Q!(az#CN zrV`uGzQGA!YPA}L2ew_PClJ<7y;r@D**FR&c!y@X zeuMcHO$n-W+P$^IfywW8MjZ2XMtd*}Mu;Im#BTFPv|`SObNLgq`Jb!if6Tt;97rHm zr+bHA75s#WuJxK^2P()R-}q}1S;b^TsviEKVN3~rz^`agYPa>ffxLYFS~iRqk&L?e zFQB_?$sX-r>E#ODI^+!uqA08Rg0|+9qw|`pxv6A*P{ZPpM=#~U)`LABW6(jmK36CF zFv~c9%EOp7w5^aKsRd>O2Qmf4-I>Q-fMxv!%36PNMKt>1Q9D5>c84ARvF~{5d?0E; zhO#O-2q`}ut;1+vD3gHT7LN~Q8O|@XRdV_~J-|j?E9fOj!kZ6M%Wr!*edjfQb z*&3(Rso_9`;td1=6$}GyqdS_NIc`GVVm=kDvbSbYK$Vi9ud>v^{acm6dXXO#Re{rAjc(cuiKs#gsv7I1QEAjuJ&pWanxJ z6I9jkPCuFDnS=DbE281z8iGXp@h9vvAZv*p+hrK+lM9k@z9VU|+k3);4hM1FWvb=f z-4Q=Y+ES|e>fQ(iyQBQUrA7e4J=NC!deHq;0oQ8B`+O=}I;@Ut$PsVC0%T_aflyiR z!Z2x&Y;$;MJyhEt*1r_!pU=kL_bEpSyCBs09jc&{fV z6b&(T4-j4iqcN*E@5TnnH#s?8Tx44J^Y*@Gm{8!;8Cl-g$d>WA&t-rHcHpv~U#N#h zo>`((xe8fgR(ske z(aU~1E!@^?b6)$s9Zaz%ur-}*0G(t*{vuB$r&Ld0&nQ_SP27VOAz)OhfP9n*#Iy^I zDgJJbKg8l$qA7J_p$v7$r+aiX;~}7pf)*@AaTj0OTnz5AkViW`k|=rf1&p|FC7)Qp zoaoY_RA2l&eDeO~0`xmzNs1@FPPohIx!N;!>x5!4=jh9+`iG5pTdKB6zh{{zAsnrR zYwhp$p)QJLCMvcvlMS!DXATti>_Gz!!^{X9M*VC+^lWA%fo^Ur8spJi*3OM*4X&B^ z3nmwdnes1y{{%nSeFmflLf@6o1;kO?lcX9?1tnIUDrM$FQAANTuEJmo{T#t!ZY$6o z^?;T2Wpd}QU+9s{PHECAmZdoMQVr$z98Ee!W6lRVE}d;a$<&r<&;CNo!p=%Y=&zo> zrp*bYTG1s35cu6Nmof&OEbqs%s36s4Y`Y=7MJ7sk0m-F3{?OG zX)ViF?ua&AwBz@dCQwq0Tq3X%yPXm-#Tr<&(JNq+H$ZYycMYn8ck>x8zkRe`7&K62 z_{&cA|I*AAq235H&;ON0{yhl)zVHPAboGTXtnOpg(`^V5MD<`d}sFpmL7nWB9JL#6eeJt4XsYtG) z4i!B@$f0kCTMK>4yNm1sO0Ja7L|Kr9ws$sRm&TS2*@?}cCd+F<_~@y`g&}K3yphro zFMLJ5uS*L=f^gbfj!PNv;f}k50ahK96=_mI#910`I@EO0=(s_cIhPkHw|Sk zT^}J3gHxTl6B9b;emeAZ$Q8nDr47yGz2FsnIY&8^ADRsv5+Q^Ftjj0!6b(t zS3fXW{N}g*kh_X0X7IbeHL3sSj}tHm$&lf=iep@}3lr>5y0)WyLmk-QzAmL|%;jG} z7fmE@h<84|r{UvMwH)TA)FQ=AXF!fGM4^k@aJ zDGq%i}t903(1!jexv_9nwj!+uog4MO|7g<{g7P_%3OSsW6VD^zcN82%iyrpuwmnNgxGQu%Gg~MT= z?Hiqs-Y$nb8yGDe3>r42*Hcb_5KK!K4gucUtT!2fRC>F>o7Vni7Q<)IxGw{`MK%uw zW!BGZY>F*HEv8pDRP!y5zhMb=1Xwap zQ`pgR?2Ln;$74?cDT3fdNHE)Y2ta^KNi`^oE5bsHk^ZQhi&MHH+)n6J&db)vd-K$Z zLUu#rBvtGZ?ma@H6&`*yo5l-Hy!cD@qB)*qA$gO&wSAvnRw zsLA5_pPBjJGq>4a+;=%>w(VbRi-t6Jk|eiv-m-D7Hn~?;nQ|-h_BCdYYkGn*+)~LW zv$g^7?D(}wXdphHuVX*?C?ldiX~WKeI%~Iot4&T|DI4}~kKh1SNKl>-mQrjoF?{WC zODCaA=Ryq{yia&jKMel}GwsF}tzM|s=&P)jrV<**l^Ef@8BEbv0QF9QX>D;&AUMSP zT20_%n%p+4-Fx-jTNJjIB0;uM_Xwo1g7l#Bsy zCBnUNhTluSTCkXL4u*&IfrzUl-z$DsF7C>g&E6std} z7lAc!>(9i4^@j{;2h(@R&`izQgI<=irL+&W2Q%Giv{#@cDEH}581yKF8tURq2No+M zAHQEm<=}r?@@Q)hl>9w5pW;anux=)A?0e~TaKuP+fi$ow&$DYq`EY_0yyQDSNrDMN zYQEm>0FVfa9!qnL+i!QVE>DR9HNt09IFhq>D8-sT zfCXV4u38UHok>w;tIOzb#19q0`uU_l>{nB^6*Kq*%=sn5G*L(GpWIk)adjgv+_x8g z%7m3TI;H|uXZ?Oupv)${?n@H>VD}Bd+WkHQSVXw;YPZH3?5<4(*5a_&tLb8~T3T9) z^E*8L6+KTYjP#11D=;V|wWdG+whwCgH4!I3k8+m)F3%?Nxo@NX8vnZTFr_}kg@8^v zv@M9E{&#B|$NUfqou!HQpo3k@w+aWDni`0|siUxjU}{e?Sj2Id2S55jfCBJM9o00r zeVr9~hktN7{ozNc}&i(gM+CHNJN69R)j`THdoP&g?_PDwV0Jxgn8Lk>hlDz zJd0NDBh6fji(Gf=SAw_W&iHpAc=mwY_Fg?VPECUcZWa6&OvHKQwFAh3P_;N8l|r2m zm417DAVYw-ulp#$z|<0H&ZT3c;05W(m!&R?r@t2p;t0gLZLSG8=G`|dA1!ub)SC?E%}%?s;XjOI79#?qj!2?08{s%yyY>z8gvI|{ZhuCj z|2J3fWy8+-ab58t*fX#XZPGozl4uxBEfQ8a1MSi}iam=*k*6aK<{8*`ni=XzPA*M9ec3{4?(3H#_ ztaBc=Isp_3Cjg<@>HlNxy#uLk|Nn7&X7B6}kr9dPQHY9UZy{yxJr0oyAv+35viDvG z*(=%mAe(HCdA`@7?z`^y{r>zuzu)hB|K*NzUgLUR*Y&)f&&TLEHP0!sXZ(CPw0y|Q z#DiK5x-+vwhQ5K-5{RAIatT&~6#0e55_d^z&>y`?!*P*k2wREPr3bs4frmn3=m`Ju z9!h1T0E`UJWPu2_ID{$eb+C;l=8s09z{JbgDn#e1g`F2$hp%Rda(xx|OAbmR_xzE) zen?YntX>jKM5GcCOzT)Y#(>P!F zY-)!UxL1DAiW`x>W}5zX{}vhW0KpruU;UnXZ-%1d3zcf8j#sy zO(uy@v0KIs3FCTEVdRD0=9Qh;cq>8Koom;A4_o7{v!bYXu+Dv>l&l3pflIqc4+Fb4?SCtPqm=Ockf{5X@&;zZzbzYVqs9e zcGJ)F_um@cCJT>2amPuvn1;oHiN1M63uv|BxW;Kt~{oe`=U}Qp(Qpb9hW;;`{hrW|xB6`zen-q1E@7)?NeP3iQ*GN-6L+gXM>o znsiA>qm3?vEpgl1+lRX>oy#1l5u+Z2wCy2E9|60+_co`xwf;NrCXlLPOlbG{f6`6T zFv|n~7h4J-JjKVw;jpu_D|{Z=dz%#f`ipuWWc4~ILQ@~bqD-&t#>xk0jQ9`Lh4{6% zNyXP&UU7ZIbykq7!;)Km%EXI(59@Vv5pSp*@I(dh27;lqj~`*7LxwG}wsiqt;%*L# zh!UcU9lv^~qw%pu@d^_cK{GIos7(Qab>ml~@Lnlx=rl}ON)8yRsSky4PB3N^FPeTw zfBINg;GyuL^8+fREVO16)VFsSFh)`UF=_AN%0>ak`>a9Ci+b3&T8#r_ij!0L4WQWB zyjKAP)`41H@>>GFsiDSIXJMWEp%p7X`IUs;rRNFAjpzf=DXMe>tX{&^sj&TYZfKc2 zCo1X3$wPt*+iwFNpX97`55md<>fdQpn;RUd0_9==*cbU;&scg=*-Tm#jAO9ELUuhR{>>-$}8Ge0E8uA+#IY7(nz5p0iAVD!N}6w6O86w0+qENyo1jlnWZIS zRI;&7Zn=D3=6eyW{lU3$5Vz5^%_1W zrl1IHlJf zGmIWbEz35i%!P_PXXwV861=eInPWAk9e6_mk-NK{*14-69sOi3i{DZfD9zdXym!YrzI?w++rJR=q{xfqe)m zkpRq5-=OI9-T=;&Kn;tuy8A8`P(1?p6Pk(iC)bAC+dfO6?xJWCG1;Vv(@h|S4o~5; z;X|MVEqf&}s$Z@8q-kFmHra3g?zS>h%CdKzjJhQXTpk6O{e8na@LyRDOCIlX)DyzO z3B9TlJZm@$mIw*pG`a}fMaL(uws!Qi z_>sMgD>4-@0_LG>zWdB;whF$H1boee3i@ zzJBFI$>^#ZA;{2{n99VYmfKo_W)D1VWe|@go(z3RVJPWu>7#h=e$SD*`o5%PjzBUG zY}%5*po1grHA6eI_nT6iV?5-CZ#=>AtjHKFb;*DJ1&CV}*rzU~{1S9D!=)2(0{$cO z-U`yFEX;$)SFJv|Pmy8|?GH=1sgs{`#@T`^BZgaHziF+ z4c1XiyYqQ|ML{V?#y&jh&qmEK^VnEx%_9gct2DCk7rs&sZlBF&fR1a|e+jhY+}z!l ze45UrweOufH70++5mt|SU6}N%_6iPGzH$(=e@bcp5ud{3;o)2HCy-!F92;DgO$dXt znv6AY{S~`~)}w03_=~#l|D4TW<(OLxyFEPPBqB< z%4hdMz}(a->K%^{YF?Mv5J_`xi9y?+B@A@dvEL$I34v}XW~X( z4g=+U^VLTy5$$cGKY*Ln%3p37rXQcuq~&NayCb@Uv4PQ`pbGc;$eH`3GkiqC!@2zq zR1_uC#9B#%j!+=(^<3Vrl_x3@V%M! zyX>trz>E4cZiraT7E8UT#)j)v0JGwIomj&&G@#l}BS`Cot@3il>*1_lMAf;p34l$M zpVB30WR$00wH38JmvQzfPHP9S-`w?d%1+|KzC(_i_Hg- zDpYvBO4_=*saOdoS5gUHx3}$fTIp(NPy+J{6P`0qU7$IjBPAg@dL&@vbK?{GH=xee zj(0^VtrVr$;YOaM57HNbZbDw6!a34UHVX-tm`gSQbs7MLq&hj;Z`t18Yh1L) z6Z{vYOA?kdO=BV>pMlem_V;s{AyB!&9A*V&=p;(J!*niF@85zD`QvFR3fJ$4#a|Vj zGta(qI!sohdhU$Ftj zQlb#6d~6)wWXe`$D{X+(EL!!+zz3R1&qJGP-x{j->w37hl9CuDy3SYh&3n1EpYmB* zyVwU=^cT75reznqw(RrGXh=JIjN6N*CEl%EC4x@+ZoNx$B#9OCb5;{&RbaGI#o? zeyXVkV`!ta=?x-pc8O2kuWy(-5RnOB+Bxuu?p(!ItjH;vzUa<=aq8N|A^i!=2pUUR zf%*MSk{oL@w!1Z3=s@8K`1W0o<2JK;m{EEvjqJjLKvFCj;Jcup(5=D!3n_=OcZ$Zc zXWlCQ%mLtxG@c!}#}yn{Iz}4Tux}6rS=j3?<(Fcl0Wh?^-4!(z6TnASioIqTVVFiP zrcZI{jm8I`E+aMjJ3+<_!HUv>EyLXjZ((pR)rh;Q_x*>es1~t(p#$h!$ytE9k>|$P zK4Wd5d8CCtrm9)*1hV}^5$8;!bN30(=P2@ZxzxVqdvDMXFQjf}f80r*oXd|~CH)VW zG^__F|4d8aAE&K3!(=rgU|5laQ$}}Kv@GfrtO72 zkm*ay3@^(N8ZGv4Y8T@7AW#FR4&}#sYJK~%40i2 zOJpv>8@5Wqlz)v5D=*EEy|e*1Y!1vD2wSD+xZoPtCOk_NOft?hw;a=`J=>h2NyIOL zgByWPSdKiM9;#ImK81>55EW4C8JuILGhPGQj*Cp&1q6@-pHQ85$&BBPZOSxYZagiE zQm&D;l?EB8NqBp zt+Uz}7nHZ_FIMxgbY7KT@(elSjkThGy86DbWQTRG)APb-f5?rk6#0Qk{vvSy-MlQ0 zdGSvMQ8~23lmrNQ zab(f`^hoyAfIccn1`gwcjaLm+tg%*tuF{Cs%4Vn(VI(SW!vZ+2`rcZ=~7F`0l9v{>d4AhdjPi#xo=I}SFgcUTk(@JdP!U|smoV{nLu>a z@68cCu0oK!Y)}IJt3@iuDxfn^6oiT%enjQ@;v%7s)$aS(fq1q=EY}D(GA(@M_Fj~T zm!3FGevKKlCd@3r%nMbY^%Iz1uzzgGL*0L41=*ju>Pyt#l)B+H@A8vIOH4z9tE{{t z8;?9A$Hd4{BBO{x4w})h6GacGE5M{i;~#wwWK{muEc_L7Dg_wdJJLW?Ffcd^b63|H z8N$FZ)k)UQk#JlhiN(BtUjo(@d2Z5-aqA&eA_ z7UVBmJN5#1+U|!^wPA}3Kx@*M&A-=I9CS%NTS1``T7(s5v48y>OQ=PAuE{1`iprV& z&W9I~8eW(yD>Fc9mycOV?|iGFUwvhHy8%e!4EI$Ue5me!N;if>VN;s2J^QtOgVfAa zyK^P>1Ya%m@NloCcpX6htA15050CRZ=2CqU3TrpUCi&(_kGE$V>~p^>X^sd z^_D`PCDthc5<_)_!Cu{;EHr zdO}h#&HRFL_=8N^ebj2SZ0FYMCmTAYLsb`-Wm4}@4<*&(3N@Foppu8mo+LUfyK{{f{{ER!!|G?1_xI-il#ayJR+3b=vOTOi6ag5 zK%10C`pN>^fz1BFfipq#F*@q3%P18ic3S2I=$+A>?+1Lu|OVH z@#>}T-18qATaX#};WAw~pYfCJVTO-Xa|CKkgFu@@T97fB5t7o_x+THIk~<>jH@U%< zZz-XYA>!n=MkLc-`PzS@i2JLx_=C*~9(HEi9!|c_75q#=ly+np1o+WMzsDG`Fp8Ic zs&8Ij!3$0=X8PjE@+DkcZaK<76|as>&~j~5N-D`U*qN8Wv9goig1|tY@W#6FD~uw1 zC7GaNHWgsl{rRf~NX(y_r=ca7FRnb#oV?IHs_gd>-OdAMzH*>cyKWx8&$B00HWKq; z+D@0&3RoxEe_p=VAyGG8r6A?ib!%IJ{c|aiR?pMi=v^+brYXKvEGDcd_cfP>03@n&jK($T;fI}`?6@XeBfJY-+J4!fip8M8u^{1lA=BPg zk8gv!#q@H*P@%GsRXpzX@_OUXKM|d(7iUHnz4ZXO8L# zk*f}z3z(hFF)^H5-6JCm>9q4V-}A3R$lq&KG8+E(1=LO5lt&Ws(Ue0-`=&eQq)e%P z7pEk#zMD!7tfR8bMF|E>9Nv$@d#Dty<3ALnA#p@_fNiOmpl3Y`KL2S+yCbY~8*JnB{A4qv0KTy%lb$qdi64i^PpB|9$4r#m! z@eRmjB=mU|qfQ^BeYBFCX!RzdE&^zYn+1|#o}#0^e}kr32x)pGy)u~NOvS2IZJ&BD zNrX9^%T~%)#O*c#3fMc1m0lU~HQ5KXYcqt-eQr>&NE1dK1>NiG+TYihKk3#708|v* zsuUYKY&UH3_lE85QGmkyAr?@T6BZE9V9wIIy?YWZ3$cz=1O_V-1XsN8-?WX$_?q4- zcMeH`=o{JI7ffv3F3DpAMUM3Q(VOc#ou<%gLXKb|l{Cul@6n_EAsFde8Cd8vOEhCFv7_`w9Duz^1^OCktru^KQR= zX!rS~iL%<@kkIZC?e~-i%Wos7B=SZWO>zX?xc5yDryuO$(enZ{PW0L=oY>}^v5C-v zq$3R%fcjad@;;(_S`1ke`n#%DehW>E;J+tir%I@}EeFq~onug(xTVlqT7(+mCj?C8 zH`TTijK8cSiR%{qWE?b4VpNL7-Moc}`!Sk-1OnWm6G~TOp4<9IADU2k{~;vyWeI;^ zt8~UpF}Lj|Yj%zOMIP$v7^&UY>nR{516jW*_n8jFWzBV-PbLRILLirk*2B9%zH?ha;l)*%f#vL}NH(Wr^!Bj@w0TcSpk_;8 zTW(}`H@5D@Mp2EP$E6E2-aPp!f_6p*V@@oJovg=JR__Vv6Q6t|`c_JM+lUL@Jh(O{ zy1Iv+>4g?={kDgN+b(!+vtk!%O}{ z_wTEmT$UOL;jw?@sNSv5>83CD?(yb_x|yQKU2i`ml%Fpew=oo-=QuhzFzpN8ex*g_ z$ZuqIW9mqMB4u>a(tyZi5g2m&nIRLAkHU+d*xNeENc4zH+2HgOo)!QqaVSjI8ONGE z#x+{!RjKb{BJ$yXg_S2N;ZKLCY;A4j5T_q`6_PY1H9z8J>g<6Rf6qqtd8F%-17^#o zL?xMT-@@!%2GkPwK0kx&oRB1~2f^WP;`D$^j!neS|M1bHOTeCyzU2KFa#>TuLHaj1 zt&K*f8fw0%yCHhOi<95Zr3YQYvz1Kv59Qw2TM+ht1F9V3t93H8$FiH4m`qy~B)bF? z4o8#u133z`=YEOBj>FM35dGYH1!jG6o$rq&9y2;Mj+^Ng01#@!(<6;lxHY9qHv*$d z>=KFRB*pW9k0zg_?&Rm1s_1@p0kw9p5h>dEam@{Pv@m~ZV#rp@DaFU_$6 zNgI`sC9oid=le^fYinjqeR(GJ&6qxFupZ~BZkx<`@A`x|0zV+bn%NrHAZx=##Ua$e zg8yC_53 zsKm^kiWGJpJDA95QPn=JHNgS3vt=?3(_3~|a2?GXn|!*{lwy}*6~YQ*>*ceAci&#e z-C~(uG4wgWO!C@#ne9-Be`b0FQI~2M+!~3?%HjeE9@GAHpoCWVqqwW9C;tMj`oi3$ zGJ9XsL<#@9vF)u^-i-X5@>03C&B@5Zi`^xz@E4xP0YChWf8m1}$HC2Tc}N3}MqLVMfr@yqOpxjYm+~ z9%Oa69ISdsv>&*A0lXp!5BefstrsKa4c9~^KC30`qD}AdoFN84gND!s6_;*!e}obQ zpe3r^W6AJ$r~_Z?7spjK8t{=q)w$RXj>#h8uir@9*!QA3U9qKp?7igiMI&e-njg{s z#RK_Fdedk}duxqg@pa}!BF*T-J(n}motRdwX(D#grsIw#_O%=*87&i2?Y@;@wO^3$ zKo{}xU?_zN@{s#Tl+!7QqO**7)$QRA4ZY+?AK-xB%*SZ2;cvg7*l{phCJn?GsYJ?h zts7&Zxd+0g7>`1gM6)FlQ_$^!#&FTT_mA<4aHC3$l4;x0g4uk@TusfN3GfR@zzk49 z!p5Z>$}?mnZH`%cez3j^BnipisjBvc$Gs2x(tmYZkcj`0d0QKUmuNf$-tYA#{X4V7 zrkLr+9)MLz`F`E?w1@hn&p5=#)8AcrC(`+#Yu^cW1gI3n*j3K0RfwF$lVveIA$uYJ z#uY8u$9g2VpM}*9-)xqHj zh6B!^_}%AoANQjY{1{+ghSpB!Vhx%0U2iY~Sr*at>W3OgngLRh$$kXqyl;aGw3wxg zi~yjXf2VRygn0;)-hZ-?)V`ZUt3Zfkstb-bl_MFjKC~K$@wO$5G3H>7uJ z?F)zdyB&H4_@jpzDvrI7B7<7Q(;ZJ+%+bly5JHim3R}|UaRJnlgc8}ctaZ6}u^K7e zWZNpDm9djk0Q%|89kpWI`xI7wKrJkUiEjA*yPa=uVd3#idDv#Xt^7v)jMi1XT2$RK zn*k#2sGeEVH%uNm7Y812<@5Vzsy$Cg7&F@zGC9)-I@UznLdXJB8e9ORLS*8e(R%%q zcwkO#J*{M_$%(l6qQ56cKj+m?0{m~Yj3WsRG)0g)afB=iZpI^pX5l1GtZs?6D4PpK z1!9jyW4I0dq7zICR@5kg=zAbgc9LozWp_ku-Sf;pHhMc*YdV656q<4@WuG0htsCe= zil*7m+!7B>;v-3&I=PVQE8>4m@<+?!W}hNvC8H1An0_<{wg=I*X<8$ac=^Dw%%nf> z4)yM|Cbg)`)sOeZyAoe(lNr>zCe;PKdkMXfdgC!;o=*9cSXoqpgtv%XD8sV{>-QTz z-yGw!c#0?IT}R7Xv!gm)fpq~2^+R_?(MJrtOZ0=yb2yS)>%S1diy}hZ^GEZQNA@;_ zT~?{LwzixE9dhC%eQSND7{LZXnBL}zsCnp`y5CaOYq_X(-FD>SK$d2iGT^_6P+SF68Fb6 z(_qK4{20EHZEs;sq&T)5IrMbauyJg*dHUV$qs={`j%!YElRcL^W2P2Bv)amP)5k za_Kreh>Eq7dtZ(%J$u#a5g$l_NHH{+j}@7=k&11#vNXx(=7qEVss%t|h(ubc-RCNG2&TOPCKYMG*CfR(f@u4j^>aHzg~=M`q`D#CY8)Qd5^Ripl6Q{C~wBf*-}v(8uG zPX-^+e~;w#8%48DZK?L}MI4c{)V-|#is)+Iu-#jdD)aW0UR;mXG^qb_Cuug-tYx!z z%MEnH#U$SHlL5cA0>T$#-R!B9YZFzPu0u@&{)agtNHJ~aGp8{XXn|DkgFLqIGvF&= z)Q9g+V%yd*5XosaJ?rxO!OikD*`562bsIc$b93>F#Tc#k-;2H6T^W)^8{_BJs-j{% zsUGr@L|ja5seMdfo3OqBFjjelH9y#nSAX}Yh;EL_=-yUrB4^}=MQSfGURh;PbSTQJsajcxs2 zYPlM+`&rV@u)^;wdxE=V?h6;SxmBd&r&2433SM$imWjg8lOaDKG67M|K7>mWzZo8@ zksgrp5JN1=!Z&{y(IGaS0orq>p)aLISYn%o&bNy8wK$bay$NB{4`^ABUXbmS58af+ z2>q1Aly1_P%aqFMZo(3LuQ8UHXe=C3-ndjCzhR1SaVxCBeqNFnve(=D!fK2m!n*Sc zKWPN!L$HZ5Gg}-*X$42bdPp$IQu{m2dT7UsGg-otMcuHFGZj z+38kuGk}ZIs&dJBZ<@ry0(3Cx9df_Vr8M>c(I8o8Ut7m58Ld#_{!Ddz0AH2?P}JS) zz!LNXRv*Dz2Z&*$8ajaiaDY=EX+qD<#a(=6$YXIZjdgS42)0{)pwr z>;uxwFCuuwo<;2MH@8kYUvn^$5Am8O(ccH8uk@aQGFak+2M;RgODqPZax5l4Kj<2= zN-7Ce&w@*X@qPznSNTUv#uvPRp-A{0hUcHe6 z0y$d%Egda6xv4F1Ufb>c z{8nID-G0!p+!~m(VG%J{4R)RjwUmcLLVPY0jfV5{H*5n~dVzTl!^t|NPn*(8sZ}Ul zEV0Ao8%s=k?B3joUi;YP3|X{C9_?MSaxOfoecvL0U070gk|Yt$bl;745|IIs3;cHc zH?i5-FuX+yv|i{on3vj>oeYT0-*v!x)16M9)uCbTpm=lO$Yi?qM)%c_%v;5uwi=VN{o2* z#J0{Y!Hi%X<3ZvIj5a`$Ny#f9U5vp_8ICAN?nP%>=V#Cy*dt8%oxLW-0=i$*2>_wy z*rAmFRdHU=4~^{dT`3uv28!XWS0ko0z4CGk*`(AL7M=?+F=aELWx{m*sl6@9FN=v%Z%si!!Jy3CcbDcd!RG+& zGHj#0;UlLwT^Urf`vRYg_kx9V!)Vk})edYQdxhfijtAj-KjWJoShzM_TA9|JGq!OG z=m(3=aU0*);x;x0;_Q4uQM=Eq6Y+R058;VUmb>4K$lb5E7Qe)7D3${R_?nKxp4A}D z#_S@{NIBgW-nr(xZ$I|_0?M;HPkMn=ln7W~gGL-H z8m@-Del6Gb6i91u+<3KEgTC=yaGF|j$D{LLiv=ld^t#2k z{hfedT9r;2?_;b( z8((hUBz!${#)<%Xw-rx7PR2^ij?H1NSuR%`nAWEPow<@grwkPGklv?em;3L{rie&l zQFu?AsQK_*y>n!=xfi5cx8JF0NdLH0>uQ?e#JJJshJV5VCv%NzWEdmoz)P7ltamC) zuazHEOsj`O47DHbCNrrK5y)=nGcM)pwn;skhiT{X>{TVU-TsxT)uvVZ0;z#2N@OoSC{H_Y zB`~be&2XbyF{1&cT$yPc>u!KAJ8UQEKQ*_0-v;uv>U#OFii~5?vHyi+Eg#Re1y96>0ZJzaUn)T@O|JE7+6>5 zo6*+NA|KSssxTj&k2|Rld9!-do-2G%7hXKas+vJx>}88wja*ji`w#PMq7D&O4P=i6B#K{|Y!UatTp zd9<6gXD=FRND)r*=?M6q@qW7N*EF%xFz}JRUh6tq=8*7b9eo}>jXlK;k;kuqy9b3J zyn)%esK4oi6WT;zSJz5h#^0gKLrlo)p{gkaB<__;`ntLZfK?SFpx+E*^+S+dJX&lD zO2RErEFmT#@k3^dK*i#dPh3>C5>)H5ZtJkZ3qi@DLlUYB3RNC@Y8#bW*r0yiXqkM> z!juF|clR0dh8spV@Ze#(4Sm0<4jvByKTKzIx6>^SsKkHWoPS2r&+wSj0=OWqiN^IA z(Z%m*3ebvHj*&wnT-9|rs&F}7raf=+W6@*dWKqC90G?s8L)PnDqS@SrR@UFBnro+$ zGX>$Z9%)`#q7eLDr9+bbkE={&Kgi7~lpr;r;>sfjZEC^<2@xlyR&HWB#UwUWqv%Ie zF&zR38&d;AKumIRQPFmj+FJQtn;UAk*a1rzfXG_R6s^=HQdGEY`szimmzVb2%PEQ( z87Qmm$V#d7k;)?~)HlN=mfIR>DSO&CHnxz4fGTx9-mN&EzPWNSX9l5uZ_pI4lvh`X|5IokGoKBx88i-N66$5&APo`>5 z>c+7&kbM(aJ9#*?MDWR4@(F49YhBbi-C2Lsrxd*;I9A`2{R@R??792^l#8D6psyuH zpKJg3*9%Lcusbx*GOX`!4XEv5;hKpe-hFi+QFkOd%lq^cpaW~bFGMv=71A`8C}y_y>V1^z1~Ahj zlB)P1+R%)QL^u&fhzTv~TsGs(j(Ot%Je9FRC}WHs;a218WbmWT3v-zNul31}22WW3 zx%H#SpP{H(j6(Y#ovMEVi=el06~Zg;7y{~-fttO(Lao>6G9h&Kl3c#y_VeZIbe~mq z8Gl-S=t-cFhHG?TOR49e>veLZ`hHsCiK#OH{_8Lf9GwFH8Y4Z7I(=E(iYn zd^B_QP)q+uD?e!TCD<~mbAhylZW1f8>$Q4Ib9{hWrmiln-$W)zP_xTSs86X}g)fLa zlROI=MM&VUh5WZN&`(8nyLdc4FYowM;GxKaQ?yntO_GPvB8LZyq6p97k_`cpYQsgL_{zMMnLJR zNv?KpXNMIqc2v4ChUx!TA5^mfbbhYAsic}bVYJmNe?H3D;QkUa{{0!jFaDR01Cyi# z#7N0g^ojBtc&;LnnP<%!aSv(`g#7Sz@D6(j01%yFszDHurt8k z++9#eblAf-`^y{2jtP3!ZvSJT{!*j`p?4`C_;r3vPdB`rV=VCdU;Vc?$y0%hr5GOl zOxYna_WNJJVHq)TBi{x2(qsKl8i!)*8U6148hhlUOrfpP|F_o*VL`UA0d3^wXw%t( z`TH%{VdCYtoyXQ+vkm$C^T4?T-6-KWH);I)w<%0*l&JKcKGvF)eNBzTJoSIvrQJ(R>hjtzFtM}uO7hcG`M-PyCP~I|h^Tud z@d7SsNvw619$%8UsKKxA!P*mrl4CQfpviz z1=(#%#uQ`w`y*1Azya)ke7^uo2=qFx2`kJ0eHEska^8QA_P>nD*+>4mo4>yRd7I}8 zz-KqK3x=B2bvHf#1#9-tmGPIb)Sp55FMVd%8yp~}S>Ms2l*DzO68yxz$KHZT3gb2o zAy7q>|6?7Y(1q0eb2a|!M*nfmzvj;$;R0qzI+(k2+v|s#o=vm=IWqqixc|>D>Gx|x z>sX;1yLA{H76AKQcL{3pfAu1M9hyu)Ee52W4PZqA-6w~G8&TXU*HX{rhbphw6`5Kaa$-zxj6@z~8G03=Qq{^b}-6a;mDNst+IXs=TSo? zOTQLT`{y#tqXC)w>so&Y5XXn$=O6m2OQBT*Re0ZBJBEE;{O>gG!ig?= zLD_7k-rrkER>v#I#>#A4UQuxI0eKf>8wttt2BHkmgBnlGD|z5(|z@2{6~npCrm67u266x?yCh6?Se6a)oTMqcESLW$q2 zOGZa(tMpCEO_P#UJ~uvUFERmjC{e#~pb%Gav@X!b;0cJ`r@Iduj2^E57|QnekM7mV zI{FNVniMA!ML3=U=0`MD)Ia|Bo*}BX?9YFJcaXymSMnkNMFnXV(upYa|2QkD?zg;b zu{v6^qP%6$S^>mRWxXLc$f?Q^-<7M&c=fiJX7`g8K++NEE?R2%k1ndY-~-Lq2s;9 z6rXc)nt&_e2GFd)OO91pPa~BUVGtUPib@QK3)ucJl`&yc+i4Oy^rhntW?*1zYtJoh zYxl@Q61Pe1OkZhfzbEX)hh+Jag^paOHH-IHOivn|F%TmM=hmhKZRu<<1ft7Yle(dhU1|H@`Fl;ulzt-5{r+(08YR`cbB z{uxu_PD!5JPvpdg4wt_-h>$>$=YodDMq^7$E>*AsBE?$9eGw;U-`s#wAs&VZWr_^vqk;MBbP3E@nR%_coO~pAf2$#dP#b^#i4!fVV(K zm_wqufvAv=+ptzo&(J;8><}nGH#zSYv@kRRHv#+atr5PDqIqc|F`n>T>7BAs(ILv5 zr=o-%J(M(Qu1CBeLd_2~SFOL#Q^Y80(tM%%^l-)3b36tueC*T%v%S3?2@rrq$TN^g z@uo~Fr6JEbVm8G~(VB+!{Zx!k^Ytwo=Y*!RpS@VoX}Eh(n1*QoFr&Tsg|#ELV%-1MC(THQ@KEk zs{ODLfDV%j3svdp&;guB-*qCeYQ0wXi6ofQQL(W~3im&=u!G@%PNkqoPXIMTBgE;6 zug<0pG2G!DKcNqNG3?W9OIX6r+DKiUnofm78axhH^2sA^@0&-K$F4uh;0Liup{2*v z3jo*{hA{Kko)Frc_q3g!*q;)J={SXPJcsTdG1+R4d+Xja>sgZ z+!6gXJ7w`&@2dKJ%7)x~n46fL@NaV(PLHSX@Q?ZZR~#W{|Jz!$!sn`}!FXz#nkFD@ zXPWK?V<8}+6eZDdvE@6q&yuuH_wDOu<{mPhp!Yv{%ltWi7l~Ir*j`8l(&adWgwGA~ zggy-qYgvsHVgheta$=@wOSDmp!gvsGm>=(H>0*{tyt{*MC6M$Mhhhsp^eL@Hb9SQ0 z&{%2kN1gg=^ismc!*9R`uBT2gTvAKe*dr%b@AB1s?1?rjgb}82CH3?KaI=c!z$MrS zbgfJ?})#F@hG>4g9C}a&F`nB~C@gtm_Aw zDT;URUj*cHq09bu zh|~SLlux$iK0%mSRMQ)6EI`MT#4fQd%o{VCxSx&VKoj~ZcB{>DYVKoPfMYD3`_On; z+U$2k5w|!m`rX(SSxZZXgfwR*olQ6!tip2N=IUgz+RmMYu6MyV9T$=hP=z*`Av6My zVFQ|mf@q}}R&M&nNk#xds0k(EkUcJ<;DbUMUR|=E$j!(=J)$2`ta|i*IL6M&N)Tu% z7y(1oOWbhlxO34e9-+O9li|0wz0cIIOh-*IWgCEn?$+rt2uWLj{lEWS%V-x>d`F^Gtktj8Ky zYQy31WUxbB+Fk0y4#+-W4&$wbqq$DHv)k0{Y5?ic8GwkW2jv2(je_!Wc#nkXN6E85 zGg3$0yMjYf2h_sgOX*3sd_(s6f%vCDLya#v&t;tBZqM~&9?1|{sV^8W5mJvNUwWrc zMdI*edHY&!Cru@VVls9%iV95Lm}IX8ker#yZp$MCXP39-Wgj0;N`oYcMy);2rpJ=m zw$iPQ+q^P(TuB-n<#Gz9Xd}RbFiAF;?ry}2{xiXJAvA>&dt2E^z4>x=?`FK@%#82bphHJB z##-uQNp3hoTdTukc+`mR#extC3=@vbhU~on^*Ej4 zC%q{Bm$SQWy_g46Qb1;GxsY=5^2e_0xhvFn*Wnz`u?YAY#xW{O+UR~fmauFig`a#4 z4ui#{v%`9q!h~MDEU-s(64f^TK-e@7t@|)T1-4BN9R_i0H`AHJ`{QZ^y{UuQLi;P9 z2N_~amK@rRypbzjz=;mI^XXG66i9d5ZFdRbFJ@+D;!#jgFs(MnPT;DOEY~c3O2BB{ z-RV=N4Lj(OMCj3t1^9EbQIOBuKY7pKxq59n%x-ktysl|M*~e6Gp>!(plO$Zs$8BDz zn&0^lIZ^Aya;J)XG7b$D$#SqPyi16818~WtXstcgYxcijUmeUd3-$&S6bgwObDHg1ia+0wtHx*6$vfJCke?*QcA7rpzrJeU^I5*{+zc;gcj z(=ZqWxQ#w*iF3asbz?L4W%=Ce%|}sYdspIrsFf1XOI~1R8GW%$Si6;ykrZE)J4O?k`>J2vNKl=QfOx!`b1o9^Hc;ixt;GLiyFJ^-dh_La6? zXpabpW2ubAz9@-&MdHTMMyH@KuYk`@1O3|u zBpP30xxN)}V!oVoA*eXOobKgX50==OJA6cU4BTVy9k=30+UksP(Yc}Kfd z;jYlrJa|3B@-E^Is8r6d(50lLTt?!PXeAB4Rk&V%>x?UH8b-KyqnN58sO&a^7Ta%M z>@H{nQ!ryVVLsbJq>{enB0u`eX80;a~e5D59(?h?Q<|$|8G*KKXYDH zzbrLWPfyRyOQ|~E{#99;dClR>vR5yoIf=X@6nVFM3tq3|v%S`sTSFK&u@l}@sHQtA z=Grj}U;h|(vE<=eP8Tn`%e(vRFak$Llc3P%lyo7J-j+JpR9sS#f<@C^ZiqS5Dn1dtWBCZH!2kH51>YIgry^>z&hO2BwB~SWPk1IV; zaSVwY<`*B*<-CAJS9UsEt4f=cyuzrs_og02X~m;v635zcBw2Iy7XL)Ix5cZ_P|TDc z9e1*cP;Xiv?$zWKtVUwOmnV2bm@?B&F!CyDuA%5)rf_%Rit3`LlJG<=Wt$S+-1yx_(LsOB;6XHq? z`RQI?aet(09V#lS@0YcynDqR7l%pO-Qfrhk8o^DSQ}buRF~|Bp>-*oqZ zPh+D-Ngghy`nDez$TK#k^ZH<*^~BCT9Io3);Ye6mPkVHk&-xA{gUNEe@qz`>>!_^D z{uy^MbVZ$)Sq}}XOZx{0XI`?uhlGX_z^_pX)+HK><8ipMY}jo{si~2>DK~~eCS0ey z`IPr1-6R>@RvwHWF6$Gg8vASp#`$ivVJ{x65?}DPzbb*4ajZT_Dzk4%*ne>&een>l6%DVAHF?-IW$NQO zO@rpTPvQYS4})e7Tbge`zPN|76HjW*wA{sczF+%E$iFgxNmxX0C!@Se4D8tQ5SW-P z5BqJGCq(-(lQ@>NgjoW%xbPa4r`dGHihVUV=HH}Eli}wx$9#aCu`{J9t)f)}?aT4Ah&%O|C7SMYirkUHXv9Mg5 zDWJ7$5s0+!YLw-hX-n8R4x#!YkV^Hq`o#}f5C6KCt_vvRr(g8r9C{``ysOmlVboUs zBlY!-M!Vq~ZL*|!mIEAX<0(k~kq!TrGlb(^_r^3O_>ZN;w+syv6Z27&w0|F+;6r>8 z%UE3I+Ht zOD#zKaPptXo#;U)d+vVmw5<&;lBDAwF(>r09WNxA%6-SiIQF|HPA-J* zCCGRvdFze~73k>0AkjDM$)!gHUcN#Qv0vTxjW3qkPO3SUU$MXGKz4zR)z@ZL6$Hivbb%puiEn`wlVA5POKiz1 zrJupj4wm6J^X18!DwL%sW2Lg9@aO-Bu&<7as^Ru#=nyIC7U`Dm2Bnei&Y`a(RAUoqZmhMmjNEcr@gOzWAjhjZg*RZ}U09Gm(7cGvqlqO^MfpzZ z)P|Elr-Zw^CFI!6!-v%uu_znu;n6Bc$zzu|!CeMsmcH0q>LPq7F5c!5!I`S3)sz01 z3(j`bau9Ogfdjhpn!H=`uDV2h!TLWbg?zQ+nN0dg)wX|RceK-~F{C><6u`@@Ir55m2HmgjCebLFH9UXJlxfp1~<`_V24j?$Gz?as#mSL@&3ZkPmR^7RZ#ujd!8 zaDn=ogQgx5P96&>q0{4H{b$FW49WF5{3%a&t52b@D|S+X^)Ugg^;z0u9i;wW1ZNp) z)A6;|Yq3uqVey?$8sh7Fo?~b+ofo66O-He$oQJhR`iOmK@vBewQafi8*h|;Hy<@!Z zk%hSrKYzf!VSXAg9ABmJZ-?~{6O~+Rbh{^8W?f6rsul8Jxb*fmqDEvn%#u2_hxFCF z_^q)8DP_0*>v4iss&|c#V;v}To=+(>ZD;xQiJ&NKoDs9$3+?2tp|+MH2Sq1rehTm99OMW4%gXjJ{}{MN+SD}hS|2lt1y^Ob zjNvU_gY8GFL%r1V6QQd(UR`=3CF}*^SPC(MLpe`^>eYuXk)}UG#d+1EX=C!OnGdw{ zgXxs|l@8LkU)Ji=QtYBpf$>HkALF0*(y)ufL00{x#Ha4xK$~p6a;`SQIM>s@!gfkk z)(@{%aBfAep z-nHA0X*goVf$j`vpExPiIRD24Qj!3!k?_4YR-2RfI}UjSm>j47_?rJ1Nq-0E|Mmrs z?~wR$mw^-!r_S346wF|4_uw~yhGBiYj(jR5nRezKj*deRH=<`Av&n7)-?ugd zQ_$eY*(mI1uducfpA+@*t4uUF+WJx3Z;yO9IHX%d(xefpLEwARUTmP zbwhRSaz``a`-W@$Cq4hH&$+MQNdf*SG=0VRoY7IolP^p36gh4)6C_vmZW`bOVm(V9 z)X%|2Uu|ke5z%%MTMGJAvku&)P41K`-%=RYT0&Qoll+ z9qbkbaE;0X))uDlLLAa*TKwD*7$oaE$+Bq%Vx${Mee*Ah;^1TGUM<_&d!0A?z|kqT zA*hJne2dUU!l4u9LPN;vq!A^fZhWI$Nhgw{D~>sLry9c zdz!S5`Y?{4NS|)b&8su-X1J}_gmZT{Iy)ko_XBOA(T{(Q-Ht9cLOV;X%!ZcaoS#%w z%vM^A%NIJ%x?61)J6QFkKR}b^9Oc|QkFzY$_K*~Ny$Z5umE3(oDbDpfH19JYOFEGlImlN@4P<`UQ5!rX;|6YH z4pZANQkYM55+$B)&|&6MewPQ;JE_4QX1YurZ5$|v%QP_WK9QcdMfG8>YN0FaBlLDO zhh=?J<#pVHApx5@oDWtB@&Wj~7Drucp$R)j%fy|po<69iYp;#l8u z+;VmWhnBpwA6lS=J1$&UVYk^+X^w&Li2iTGXPKB8&%v*?GKQjFWJ3gdX!-Z^W8 zyHo6)zB0!VmofB#a6GMIxg}3&+tb-$Bhp;7x(Jmg!Y%SHHLq2chNDIxDy-CHFh_rF zwwn?}(+m5IjNQ4t;^+L3nUBN4^eo{hEBumA*8Im|FKlarOOeWT0khNmMMlL%@!9Mc zR^TCgtcl<-mkN2l;LB!VayK@Xo|Z#WX&yVw`Uu9j-m-8Rel2f3`vknd#tF=eq3aQI z%^1EjZju5XDWP|TQtP6RA(+a=F!Uc>^Uzx+gAR8^k`4bNvk3_s4+*uiy z8e#q=%fGFU`k5;`n1%vP7BrsuxpN-{9D%CGh>U_BJV2720F7-Xy7~Ujd4sFbtjoNY z6FRw%#PYDitYUKDw&C(LjI}mN>@loP(TNhT6fna?B?1JJK=SI9Jy7(-TdlR*F)0`G zMzx(KUU~5;%eW-|JcC6prkcs&LW~c5qzqYiIiG{J<=0*6V9$gPMLub31|O6NKRZ2+ z1^c&j&yFGO;_Ei$)U}hPEsideOVkI#iZAT@@|S4wo9teE!cY1K=IqMO3m(m0ml6CA z6iS7E9sS~yPx{jlwLQ*sk3#zlAJJUj@`s45BEA;#G@qU)h?cg&Q<0o3M74VAFUi5?pXrazTo5 z_C>6=Mfla6=cMWD9~WGkM`{ZFpEw4@JU*V#>U5wE6FLA@6EWTLFX6^MQ$79Q?D=eR zQv;*?dFQn`x$BM@HMi?-_U&C}g`=anIl_0E_k|pMKAg(<*-{uORyJGf^bKy5c)8<1 zq(fY(;Il9HK29jTQy@`eED=_Z0hiTC*F60|w~HhkvLZQMAc|va#>_)Ei0B%|;eR%k za($XPKB+^|0V8`|AYwqr-D}P+YC4-$UDsAfla7fs_)X1geUg-tW8fI)FupIjx#@9X zt;q_?Ghn$8{{DU1Oy&jTd(05oh`b(ytQXnry`KAJ9OA`rDVua%^r_aYCR6c{@v`h?F^iM zh<0$D;(h@T;IcM03^g@1pAr*a!5st#!vVA$JiylU12ORU3d7c@7n8-T%KL04h6A4A z&B*4TjGerH`4PR(VPE**X&>1Gm3MEgAk6aFv0ZY8C=m&r(77DNd7sP1`0Q%6-LI9x zOJ;R?hrmTqUhgutHJ?k_m^vEu&emD&3kpB=Q*6-X5)qC%3(2HXmEIWy2w;mBL zi5>q$4sMz|T27;c-tO{kJn~TvEK+txqgAfNhD^&sJNUk@FRQHlxuQp9w$ehG z%g~Q|?m#DzXKzXHNIf>~PmoxY^yy_C9M)zOfeeX}fqK;Z7eou~Eox>~i~=9ps>W)t zi5IOsw5aL63k7fE;`9_3;@8mJ=6SYo(e3pFlCvSdUm(KcNWGhp23|4E4V>S^~UGX7n4=4mJYmj<#)T_W}oIbbL2wwK;Bn`Ayz+cY8zM7w1uox1F=x zDwEsQ#ESAWIfz-_8IG^89%KdV3M@U`KVYt3+igM267>c+{Ko8;F1kB8t}i$-4~W<$ zc2NQY(b?I2M=ko6>-8ZUYmM0)lGE%#{0L#jM3#ufXln6k-Za7$Sd!a2%1sW?QFypm z)e4kaJOXovEiFXB8*}-2{uq1SR5A51i(t@6!P{#dA0+gWXr)U(U*Ghy;iOV2&}H}8 z>8bO2AKK*AR&&K%M$YTpm7AZ;Yc?CG_`X_=?25YYsWwx=`zz>T^sJ4jvZWpTgyPPV zNF$0ma9%>%_t;{T4-dX(HsWGO$PeEWtxe45l$VHo^Wn;TMu3W&lxD-=WxHoDr5?f| z$A(vj#Z~Xwk09_gfPQ zA1o({cm$oN<@L2OnRDHf1ppIM4>1dg7Q#xI5q2E&|48=XNJHvSzhw5*i(=~d< z(+RfU9~y{6ZMi90&WxLE`!FL&CXkdTvv!1Ym}QN{hKMkZ>*v|6N-*mr(yb|!1^cO& zX$TPnjlzr$TQ@>QiScjcr5QYg)n8zU3K2me7_5d;Gkba&>XnDT?yA_2BV1MT`ljuv z;K>4F8}3}=sp?tC4cqf3#w$Pm6wUu^6=HI+c8>@1fQ5#|iVWEezrWOj`N~}e{?^9t z9)zGgcYI#NRwk`vn=}w@kodQkOh~63NVf#wTqZPLRM|4&f4=x%)cQwwq;CrUh7JCM z!1#x{7gA~fii;Xh!zll$s;18br;Wn-aw+^% zi|{!YyDhOYet*}`0g!snfYdVmYlw;lW$A0)wag;hb(wKpwCJ1)IiH5o#yVl_H&8J$ldW6Cxj<$v9HE%I%ho{({@ugHI0MPI*QFiy0#l=OAWbIYdu=Y>}we? zh}q(&xBWcv`~8pNCguY=V2lu(125ML-kDLHtrpwdW8k%l7@nw^L?1P=>kfbVJyy9e z>>g70f~rl$S&)~P0I;NJF?&%Rr{c6xteU;*F$^P}$K^N5ZYHm27+WV(VIJ>WyH9|B zy@m0>+3$kt`dpl}G1+YK?WUf14nOeh$s%Ef5Nv5>a;;`9_40oc!YoAfia8R(^}_1F zbI_MAqN8(LI1{#ABa3h}Qu|TLB<`r$5sA4WY~YMuXKKiFp*f%CCoWL=lC)1ENWaE2 zT5xg>GD*7N0T#q=Tghstw9iMry^u6sJ;L1cYPb%qUSi8Sln_y7gy8m|Ed&#@dswz^ zI&LGAZVJ1ranCI{r&UwDtEfdejnB_%L8ZK7-VG`c&1yfSSeF$-k;Tm^S)Mar93 zsf7;PZ{{04kpc#gEFuD&Vl&w;T{_d#y-;y@S+ti`-gH(=2mi7vLNW5b7HB)W-fs#R zLJW_w#fZ}=bu@omOg!|2_(UDXi@;Ei+K-LuT8l9_`bJ+ppUY*@VBdTEj+?KoFP4Gz zrneWe>|{2WN+Vd`pV8OPuZ{arj^>C!tQ~~hmqKT*JqGgkfAp)49mG03m+w?XD&}H# zt$MRdN%G9s+^D@f_##cHO3QW?KJz{)aE`y|vgh-!a8WD9!`&u=eC$K#YO$i}U2Jl4 z2P;* zT(EvNuj^dx5t<)MlLfxY!D+L~MNGUg4Q47Jr}{Kn!-ixu?bI@*B2-rAgz(_E;qFpq zqmr5}Ix8(yFPhwCJ*zBaoyA>nXi!*J@HMgF4Ix`3t|ZL z;&+w4;-1V-#>Bb1e>_Z0Z z?K+tqGCr~{1cys{)FTD&o6&5fR8t+~zxja;&_%TlHxfINr;8hQq%Z3*S(fDd5Ihy0sScrJ@>* ztLTD+NQG$1Mu|{A)sFB9iqdrLLr6lJ>o3Fmb-f&XSmb8fe}}4x@r02o>v${hn4FiQ!uPj5T!ZNX% zmZ!6X7uXsphVdQVHIQ$M*?w%{z2izI2d%v@OOlkhug8E^l`>-9N2KT6#nVIQu?%Hw zJyl(x`E0M5CbFI1*2Ov-ymOy7TjvEgel=i4)HKId=@%)uRXcKP5zO$D?TLM&68D&S zpcryI8N8o4%!{>LuJcr*aF8()uw6iR{#^%Dxc&K``wQv1KR2!DrV6&l{A&PP@@!K1 zYwD>Z!;gk1r8QU{<5Qhdb*@0Gl_pZ5^@Z&yO`{5FUztY<&#rz`3}h`yL3zAC1yPo6 za#h-?=o<;)4!?uVzHf$y+YY2#u>ZNhy8en`+wu5Axx9VydJgMwq1ZwVg|J*shOq%3 zBv;-zb|lIkwj`Djgo{W`Vdp{Ujmc3-$)h=ZxG{~-xJjHtL7KF$tR=%X6I7Qk7FrX& z%MYJfP&2E8#;L*V!Xeg;7Zeo4#@j3n=b}9(0m9NJ^+@Yl2gcU~a{ze*;fs(#+WLD= z)7&PbQjXUkQ;N=mcxOcYFp2oVmq!GY38tbvI2;+}*TV0d(Gz+Hc;+h?Y`4!xCtc8> zT+b^i$Cs$Zvk7S^c|(V3c?zHrwcAk}Cz8K4>O3*Re~9Xq$qDVIhHcq=V$$S1&L4p?Nw zf}$;>B=_jcn7b#&L4BqlcGWSE$tDIvU5= z5zHw82^r+;-meE<^FHQ3#m+d!WQxJ!;_QX5u{;I!VJ(W;cJB^nZd1d?OENvjgc;@a zt5lm)pcjXc5q{E&cK&sm_59^^KOL6!B0o3Me+_}0Cuk&pNJGPz82PCpzP;sPYWS<; zKBJE8XVej}C)VslTb4uy+71iPJWW>p{K22h;FQsSO%d(s(44-;YE&QXi5e8<}a@-c_yF3WcDXRl_#EDWBRm?_Tm@3*M$TB&+ z_oO`gNYW(e zyc&HYA0z94rusdI2S=H1Cs8&1ndJ1Ir-IvnG|bm!&+h!>FbYdhiErTBfcU)d5|4D( z@8xzO(kt*o@rBh$9bdc}tF`7W9qo7PSY2J@5Xa>5J&UDc77oe~2TkU=*vkcen_fZe z7)k)N1}ivr_Wk%B1y%^sUTR2+%F?g#+VBd2tQd0ib+T*3T&n`TvB2WH+%Cuy{HZ*$ zr)K;`zZtM{zKq`+|MJlPdW;v{i0e2vbc0G<9+p1XNiboRhBVv1F09C)@S&xwJ{Rk( z?-XtG;&eAOGM6tThqrN5*&sZ*q8qcz<%p)}5D+-F7epEMtdA1*5m(s>+n#%&b=Q+X zGjA;ITF`-PelY9;Fzg}*8|vz!0sT$<{QME}XYcPlh!>$I<|tq&kAp^zE>a~L?wRH7 z^CJgms$(Kl5U5|8QEGKl;;e0=WuNqZEfi0O}1U0$Z%G64el=f zFL>+>T+xaU@M%;SD@@Osc|(JdyEw1Z@qjK~`SqNhK3e&p_Ymz+ z2otK3{;ghW4Z0W|3tULjK7O_x#Sw%~@@1>*a|X!ehn(6uWy7tL9{%$SIDUwa2z{Sq zS2_*elvZr4i*qZw(Nk)bs<>!)gY96Sw`OYVS66>L$GN$Wyo%w>8wv?k;>C-vVQl8aM@!lA}Ls(!_Hlz`!(a*%( zqAwSJYu^DIk5n#{f>anbGfZoK5AHS*cX6q%oBVc&l-iW~xIsXJ9n?d_}6Oqg3uTh{@#i_F;NP0}CQB$QnL%Jf5Ji4S1GZ`%^+ zcd&a_r;R5!l=ZaMun{q+koU+@l?b)uGc9p^(ER{m4gyce?1PF4Nk|nxbEZ-bqmEL3Q;TfRVqr-wpQ5 zBxmWKEsPpt9xun8RQKVP5;qtH+bRR-=n^Wurklw0aD+>n76zG#@L(@?$|rJbgpN6T zdC3I^cD#M+dPnT~H#_e&*9(4UD4e{4!qYSDsgHk+uWLEx3HPk$Px+R~-GKex9_jDK z%m3BT|K9@QH+bzY@OM|ht>|=vw_@{_eRkn~({uWW@tTA@A6jrKjYTi0n?^pnXyl}d zqT*yTMS)VZ3%*MJD8U-L>G>vDb9U_uTOgTH^mE8N_K8%GfGtezOm8&+j;6@TwqvkB zH{!wE00*7Tj%64m+;ViyeW1@(%d%>0oJdM_*yLA<@<8TLD5r6|R$U{q(e#zV=lIAL z#X64H&F$?Xz`f~0ZwJ93M0kj$yi_3Z(N>C?P!XwBZx{U+jbP zvwbd+_s_j#5sdgaChS#*`6ZebTk*VObixX3TSd)LBn?7I=3R`HEj!@g(Hehi5ky#m zJ7%y`<4sJQvTbO*%j4{nsPr)MxUde3Bg10b^Y-DeXSO`gq%qO=bIf*3|G@=FIDFVl22Ze#4*CYT;5D^iB*(dO9=pud%7LtzS8rzAJ zQiugVZ%;ID1VC&lS3}o$Hwy5Wu>yN{Zi4kIR0%v}!?X_KEUO$&?x!6$l_OIS&W=e~ zgJU@dcTRTyY3@DEb(_%kC%86Z^IY68bfb855_t9kmRk!$)Hh&LyM~Zt|7^ghpV^Fp zy*o*QXj<>1`{7;LNqk5Aiws;ikE9M{ywJg@vxrTS*gZm<;g;&9$3PJ^J$1U%w0((I z;32GH-ljq|GA^B2#T`)+8feg-9R4+jHfcmYSt0nWq9E>q*60^kX2tUf+A<$N4OAnh zhh!vNS;G&bx$+}Zkzy)G1@~LBN<@i;rurAo z-)XbmdtA4f9+CqCMf!L$7fBR+!zkPm`Nxy`LPXPy%LoUIVnugGhT~J$mlS`|LlApX)Xzl*>qSxN%U*_M^F3w z!thzpCQCls7=H|yb807faeoLn^E!Jki!cfwz$UL7D_L+z?LFF3Y|?1=UGieD<&U2W zwxI?D8D8LT`TXd}L^o1--YR2o+^k-iA@$R8cb%V-)ScXhRR2rxKo@wy=3yBxkoida zhqa3TpQW4Tc>{Pi0N_ps+s< zB?d-DiFdl`JH}p`w{K0^Sj%L4Iw&i{96c-KJKM!rmY=4!-mKZedP&0`Dsev5-Tauh z1JxCXg)VsVHrQ;EM1ka=N(;cKBTti;&W~u}t%w*qi@LkLczRmhU^koehXBc`{nw4r zIvMsEIiZlYtCxM`Wy0X%8SRi@Pn7rujw@4&ust`IJ(9_-C6d=IAe}M(jie6OL~DIu z6B$s&Kfm<(6>WJ31^10o3x0h6U8Rh0e)-N9Q`sSt^xKJn{Ai%)F z!tKQj`Ab;q$}Z^wjOUS)`EnaK+u4NU-H#gEQ)z!2j2{_I&ak58KKu#n{E0Schr+*> z{r~Z!|FVMKnPx?g4L!g&jHB7@%*p~JDO7{@P44Wu7TSIo=+gDosy zc(HqQ49UseUpAE};9Gfb>}Vy5gsDe1$An^Ca5X_2U6tK)9&k;hjJbe(Su&i3sfL)E z1Mx6Q=69+6uXh9mWwKt!V@)r-mAvYVD`rOD#msD)Jff*tvp%aRFKn>CHJ{qb*GfL9 z=Y?-;z(sg4j4TGKaLj%i42(^>B_t#?GvMZq03;`(q9o7-(#idu6;x%kVyGzVvgLV8 zr8wPRDW*@i`nhXUXNJ(uLfa@j`JiYsy9s8ZPR zE7Rkl7oUPVCK#V)XH99)OQXf-GlIz*IVZEy`RDn$NlHt)e^`Z;+gbh829CYdb+V>JDk103)*jDqKrX&w_346EIwmIw-V2u+8LpW^C()Yy|W7CAX<0B`sx|*9i zZ#iN)T7hj3M=#|r}gC%RXj>h2Y_Tlg59iSo_ib8VV{}(?v*Efts|asQt&f1txCLk zVQ<1ffKI>pL-41%x$Kq^^R|kmgbDbcdx2*@hGaiqj%_b0A(`tW)*x?>bnOeazTz;# z5Bz=@kA{&exnANlm#ONmc!G3(b;#J|*gjRbabZ}mwtZgBYyK71?G|#8o!$1%|Jz1& zMC*IDI?ML0S8OhkSL>pN^x zm=1WOf zn@ev2XAn>rs%ECE{FmYZ1hInAk9fV%u>(Zn=nn0yABgGY>O|GNwPJ)FFh6baJlU(U zT(8ju`VZpfjJDJ~NqhUYyOzHyTGne0BKp0GGIx(F?pfmjA0Wtlb|{}M_O|)Bnp=-2 z!0pL#a|LzC12Q|;Poz>lg{495*g$QM!2jjEV6WoVAfrXr-`T}|Vgk8}_jq6DDRggL zA&%<#=4$g7?}HJMh_WGrg3JkK2QNar?2=A(ne80y#|^pGy8KwcY#tr&{bRBcpK~+Y z66v>AaaZ=YF2LLq3*?&oFJ`sP9_gEt9RK$10WQ_AK^7XX8UACG#WGNNz5Va}=HL0i ziF5od(0TR zzP2I?Un|}7o4H@(F2yy(2xnvRI^n~Sn)Q~7b{Xg0eF0}*lGk+B(Jaap#j{-=)EWc` zH^O9Hy}~TeqO@XluG*XBx&(_nwi+@8P+ay`im8@HeM>I)GI$sK*D9zb^~>As&WuL1 zz3Y3``Sty~OTr{0oypUaD?^tIfLLtdYYqPY5UWoD^|nK0sPo##21 zkPD7p3vzGo3c1@}3Yt1NAeEhK4lwNWqafOpGW|UC|CP3#)IjF=1YP1wnMv~eTI6V>wb9mPWHbs$v9+dwiQof>3E&$;#JP&>Y++awsA#uogAuK5|;TA62JB zmD&|wT;%K8nZ9%U?cMR{uU0k7BHRmlB1ti__6(Y|(gr0ALTtYO_bjp#;ad})SQ{wftHExL~8k(;ld zFZj(jo2u>EZC=kv#fJFI^4k;wCqCw+rem@_6@9}b{71q(g1F7lJ+~?Pn!oTzbJp7T zaNjpQ7mMn;b^5syrXMDUMilv&dM=;2&2S;8?J8k!ZR{8}MerEZ1=eH^6?c?xC;V3S zZed1Hr?sdkqJQWWzPN`6k8%b-bt1>ij#`3h+*$}iEF4Gt=*2eh*WsfM-T4w#-oPlVb{y@L5b*nTdBB%VGi8=AKdFWpU9OfD=(5wq{&of(5? zQEIi2sWnc}inwN(eb37n^#r&l`rqWI$#?SAzr?$0%rL=CY3cDTy@f4^!&>x=G55N# zu$Re&DS%Z}V|4Rx3AK9%^s1-N$q8{^zTj5HFE6*^T_1Gmi34NWnP%^O` z=;PObrC&W`Yfy%{!o;2UmQZQ$KyDeWR1~L3|kyqCwsJfa3()HTKk=-t(+~c++;DqoTh^7G%1B z#mcsP)J;!l2nh~XNAe^q4L0282ao5d7p_((*H2)Wh`nBOkGb8mm zxF{=OyO++=Fun3HbVa;(+YEVSg?6Qx+A~_A>71*nIk}iast-lbi^^F{UabRZpJ#L1M=xM0v^l9zc8T?VMlj+t z&l(sRs&gzVS-5Ekf;cQaXW?g_+aDpBYjbHK!H=koju+YJtl$AKM8N#Iz_+87Org=` zT&PJNTnLrK9|fa4D6=bitgJ;Mmemo|Yfljoc2r`gmsdtn-(a2Yv+flvkTdeXj~@?W zAG=^PB3Fd7)42wuV)z+X{pR;*sZvO7Xo_4I!-dGqQ@q`yD@ZE!&6JJE@w~|jq&$)~KVNm78#l%@f2Eq`JR|X7hRBTO8qw!AZ+AnBwQcxJ(wcUkADzB}*=XDlPLiRk@oKRiJ?ai{pN%0cT%E=2E& zvWQN>Y>zt z0ja;LSU+J}tVlfJ=a$*FJz}tr{b|dC+m!1oK)3KMFkHK_K%>(_nqb~0bO@3+_yBBf zI<=aIfeMSkZ*%#g1J?_>z{!6We29Ihho*ec%u?rG3Y2H@t0zTy?1gFIS)btPQq*KH z1cH2ywEqA;Mb}{5tS;Ahco!XB^P=fjbDq}CI4+B!k$%X)o{BM`ADJvigXO!3yxFe- zKke2UF@!mZUn9T~ix{DSwM`bVQqt@Vp0zYJ&D*dO{(U(s=+Z674&cAxN5{ZmCx(|W z4SYqnL`yU$Zh5RS1830aghubd~lpQnH-*gp@(vd}8mH9m>b zb_`IAZ_2=?mbc$UuBNlb84c_+`v#M*sTo5d_f^=`j@Fh!=CFnO2teE$d%TtUhqTb^c6`+e4^&{P9^0I`RS*()Hgj1oAA*%$jfv))2 zRQp8ce-50c7W_~3Dd_jqNcNAaY-w-*cX8p74#}eWpP%_Jo6cV|>xm8N`pfnoS=6~6 z8I6lqa*93sR<+B?|5u>=yf;Y2jWU1*;3(oKJg6EH%JW?)uSz35!waze zUmF8xk>GIFKcmzqrLgj2gZ&YgO3Xzwo|E~XFfkqvCKHvikfckvL6ArdVn1n3weuRh z#*5_Kl000wc#3|YjDgeQ2R6_dln0#Z+WA#V5BRQMxdti7Zm-X|n*y_(fWkUsb?|{n z+^)lB$T!`h$T&As?+Rc(B$p8vu(rrQmgu)*Y?J|c-&U_<-U`0=?*Rs>TELI5#mDP4 zg?93u3|wj#BzE-UMsdScS}=qQZ!65%4A9>>L-FHPGHL149ZEWfLG_yYajLWZwFt7j ztuMUW-_AsKUe$vha$?_CahW!nf)D^d6~iCwiJF9+Nhh2jvn7xZs+`S?*$*ccR>scs zy=Q|hv|^NXud**;-~%mvbR4NugUqHIGQwa*B~rx=842 zYU}n~EdfWAkYE%EtFX0~=Zfhn_)>v-hkHj0xc^%{O;@1&*T=5wOodQ&buk{$Ryyc|7t9 zYoR)pI^5id*Fl#eU`pjvg4mq(QE;+*}^XY@!;+4BrX_X^)PMFztr-xv96^`dy&)9<8pzZW=a5?4(4@q~}8d zSq52g0G|wavlBI8dYnig%g_rHwWx89HcNN9L4L56~Zu%5=ZFJ*G z2BEBJeiL(?WLR~n!RhHF1iz>zjbi9Bt7rMwFX}-7{isW2e2YVXP>aT&9*CwvsX10? zwz-f}*2nqU1a)Y5Sf-@B9RHEn+*hVS6P9sTjMIJO8t~pVz=l=!wu9?j7V!S#h>p-B z-i;9sVzfp^k?$+R^zQV5zKji^j%Z7Fv*mBpQ#R8lqtEZjf8Bl7NoN|mxV&tb?{KDf z&@OZenR=m%lw>OvbfC?LtX}%4#T0OLUm|HRbg5{{Vit{?xb2zQ|8b_l`ndN9VAjdB ztg_?o;x{ut1jJ#=Pe(yjEm1CS&>Wn8E`$LyxnLYW_`U>w$F0PaUpFrGq0r^_-1daJ z4SjnwrRUNy306@+xFGq3(qpcR)Xs4>byh2RIg|D@p?>$ zVLk?BwY+Mjvr$?5Nq4xS+8Yl^J`@WE3~z(mW69yk9ysQoNC4?1--9N3c9j*li%P2O z(7jvcrrL;x@Sh26!27<8K7W5iHuw6+;s0kA{$B?9i9USiS~nbyx_Y})nIFL5>4+I` zL;PAEJ2Dawo`ojeIe9`1GUCckz*qhHI3ul^HgWmq_13M{_Q$CL;8;>%dmWr4UKPG! zT=>R47-gKC+me_56=doAc<(ckDMZ-nc_;}mS3q64%l$PPnL#b#u$WQA+XT9`+Hp}l z_FSf|9Jb2LN22BZH5Z<-8%E|X-(?EnWGhVE!-pQ zIRj`xxpg3)M~$jWk|4%R{x(rvO!HOxXZYjugc-e;PW%Jk6Jv)A9x` zDULVJW+Z-3`vNk>LnH-%Yu8pxK)C(ax))>Bua<(krW2je45(P}-P-`C=Um=d>~uR+ zJVIzRTs-|j?`vl5UxAx9Ru}PuNj_l2W;l1d@Rm6a5qGqyqrdR z%0(YPW$VSw$+8(6qVo#~bOV2Mc8x?0VXCFAh!fx?olbEg6F_@_$=p^Lk-HdQJ8+<6 zq2b`U?r-A70?9rQA{K1la+dN?`s z6fBLLblz6C=ecEV&jOZPy88!+nc$RiRQ9u-ksO+{x23?193T&==BT3TD*IcDWx(%( zOZmE)43_TGU@;rABXxfloIm;y)V-fHbn#i-F(+SafS2+^*3dE1CZ${wje)X_nl8^H z=ZBgF*Nxkxs+{TF37~>f^$Mtii1_4S686@#F~agNyzA_suV4PFQIuce#^;55Ku|S! zs)KTdYyiFr>@||OsfE}5jT8$Hdf5iwAMQAf^OL|f`JOSKFK2w>aOD(T$YfCrF~Cp{ zSzX?(!6#()Fwze<7bwHI5v!I}xy3cHflo`v>?x7yQ*A12#nM5W3?!de#E! zeL!J2A=N2+bKqvLy1*R@5f1cW=_Ip~xB>CgG;@th$15Yag}E;9EZUQb&f*UCMi*|Hi5+JisUEGcw&Sz9(h~8A#bc|yTck0IgS$yJSzP(<2ah^ln z%c1kprh!({TOW5h7augh!GxDni!O~Pxh)V-1?6w?_P`Dpmg}L<-|=S?eY$tMzv_JI z|CvCqrmi0bKxEKR+Tft84_j@g+)l=o7WvX5)TWy;H-x9Wh`G|dO<4z_5)(P>?E_G? zpgI59<;N?atmVZgs$fz>db*#RRP zl&UAbv^rsByn+J@d%HzdJ!f>0qLGZQFi~x%uch^2R%mV=BGZ{;qA%Dp9Om2tU83#Y zmm(hg9K?V(++h@qZ_FlfyWqW31Fjaki@1hU2Smryl2f$|qlg3yto0kYtbUq!;ZSYk z0DPcX2dCrl7W}94^lWRi7sz9Ws#pcZX?F%9kOmq?*J$eU^IEeTc^~*Jc`iEqDcxG} z*(NU&YC|iXYKX87m>deo0vc6(t5;hA+&+)IuxD?ICR!*fcdEkpSOT@!KwL3DMfh0Z z$yP$Tu>?Tqd)U-xF1c#oW8ZIE-@6x_Y)4-GZK?iOe;bKrPQ}NiqR1si{HE70KB@gx z4E8Tc*T3)$KBxdb1<(hcAMH#&SLS_A)mIYtNhu;#_59Diif#1AF0Kz3 zr^#^Jo?3~BO}<7D=ks>h1arnJ08JYvGkuzlUKIlXDM;pO6iSC5{34;#fNFpfHg*m> z4^HwH!)%zHFLXXxis2`_mRF>}FbgXy(zaRHYtEgEqLLy>BO?kRT=)TS@nQiL_;gcl zud4vhpbRWMJw3juya_jGCdMP4u{qc|#e`F`0o@4$!7^{)ZTTQKB|6CT<4Ozz2KH+Q zWB!}0V7#O%rO=-FM3 zgFarbR+PC+g)h0@y70gH^2E4xH*2*yWs8qeE zs;Utznq|njGLrIkGZBA4qJ93u>kc>C6AqM0UD0l*xj_J+1HiZ%wV3%xJP4pmO*`{k z{%o&GJ5(lE@Y_p`fba|i@FrGhLbqO?7_6rFA)*y9nmx#8?YIlNV9v~iTx2CQ5p74Y z2SaHq4-qTxZaw*`Y028OCXZaZ!T3AhpKK4m+eN<^7G{f%ilTxW?UM#kzk31%C1>yt zn~@k}xG)JUw&V&!oPZ*v`>bN0!cG8LbE6Jy5N}C7WsMhIRVuWx0b1h}q!yWW7 z8INU8cC}dEug}fhqLvz3p9(>6(@ERD0O~%Sfdf=DH36?~&)bp5{W&l>X$SqPdE!=x4)WUeS^vp3s{?{Rc^fvMg3~W9eH__fgf9a!;3Qdrx3+Dkd(8Y~LC?+- zw7Zn8!D^*U0rhbAV~mHF*HAV7)F3h-rleP=*@IZWeq6<2iC+N(kaFDEzHS$nRP=P@ z-=)dCQs8Kxr~cEX2N)OGwQ|z(DSa2cBry>6SR=7Ha_vGP0NwxfJgGiy-uh3R;XuEZ z-4;_+>!J9uOk%-zQ+MV*3FGA6ZG0no@F^^wG5{-jj%DEarcv0H{?^U>@lsYh*2k%M zYIEzCTkV{9t=mq$6-fG=8)+#gn-D=; zE9ydi?ckY(JG64yy;F(JKnoz9#eoclUc?F@IPfA87i)7s*5s{ct- zWoM~!$y4vQ%tPQrR4Yk-u9gtovOAuVY zkY>)|2DOCU&{y$$@bqMaoh+oOkl5+zqX8pcfQi@C1?*wnTz7at5;w|+l|U4?@sLvG4_x+T+$C-j z9UZEiHb7I-_@uu-zLWtwx%Gv$%&D562SK|)oa^d9S7d+n@Fe0*4fi3Mv_5>g?h)U< zmFZ6|H`wyN@y77B*ueeAK=J;YmnXQjdc58H+D1M|Kr0LHb8^w}^J@)6?d$wZ1%+9} z^MX0kHzLAg4uA05Y~oyU zckc=&!o6?W@7&eQG?XfvtJnXJu(yosa_zdc>28!RrMtV4P(ivoq#LB9yFo=j=@99X z?gr`Z2I>0K4e!ZXcRu^s`}Nz>^~s;iYo23{aSSFOR~8Y^1Cz#!6STYAP4mw!?9U${ zJmJ*MT*%#!$_I+E>i8T9IQ!YSE-*sDNIbbDvXI%JVFeFb7JxcXrZ zss_cpOpo1Bvqgd#EQ)GF*#uYMs8E(p4bh%lacZ?r>p(W`1-Mi({89{pW#b=L=$d$! z*Mc_@wjfg1>U&q)1Ed+4k06<{`I9F8?Cqmrpp&pDFq2;fEz^h@SF;A00#}1g5##Dg zSH5+pKrC?}Je~G_Q9735Cif>F+R$igDE1256~}7;*nKK(+MX-~fS}uYs4K*)i%xLK zq0lwP02lBd>rGYZ#-qfikkhm8h7AtWwz%aN{mTvpk@Mhf=qPmDiCcSEzXuuM95&qa z^=&Ob4|TA5L?+>Phm+wUX$=_m!Le0K7xBg-Bn&6EYlJTKK0{d2xukEj78>a(w1!=2 zXx4@)P~AI!-T5qY8l3u#-j%BNIsTYbI?qm3nU{K-o_FRJFb!l8(C@3Q;dITQ)S8h} z)78}l5?;Uvh+j3uxJ9+PZ997lhn1-HJ@C&juAEY*)ERq`eC~-gkhJx3UZvf*NeJPw zV=kT>b93?#K*DO6;m?-dxz&Ox)soiLO{u-4s8v_i4QOoCrJ|xH$h4SaBQ*5GYpjkP zr8F7hCt3Iv+aT39FwhAWFbD8P?y4X10T3IT{<%=47+A+YxlIJzR?o;h&)6F;ry5#U zIdW_dXotrCaCA2iHF-B=y{+47c+yD9P_Yyjo4xV-Uk|?SaBJ9F^?CzySOb-&l8Z_m z&Ih6hz`zvgn)gWEYW;vQ?|i|FqOUUkA*a;0cC9k65O8t9aPx0b@uwShU0dfYQNO9* zrv-WkrL=_^`7DXMx`~2DnlK5y5VPUhsQ9bVw(RKo!nTx87vb#{6u)f;$vH`7`NC_K zJc-RQQ>9(hxOrDqKcdYs3_}l`vJV}+6?_d5u+Kdi*zGX*M3{)-U9A6S{m*o|uehxx zy1O^4M%qTX*9Go1w8Y`#I=N$h>|U9YzBCA>J{aTTwtmD&t&TmGWV_SDoz7?&qI8|4ZZGD)0*`C61Rl{P#UR zKFcpk<-h0jzfqL`r&rxK5ylJq1OVgm*eBXwy6fqLo96GamvqtT(!GQ7A4Gm(LL4OP zE(;&FCoL!FuSWRS3@4g#dOtQ>VUFtH583^kEmL+6kuPlC@pEjhS>?Pt+0lJ(D<`4m z10Qi3;jll${-h59?%!I@5Xg6m@d@y9B8Fm;NLm^pS0w*{Kpcel&czqbyS;1IlW)t7 zyHK83y(<?kL!JF6{OIwVM zbf`89L1G-=$>66iUjpuDWyC!ZsWDD9cW&dJ8yI)#pkjIcAwh9ERr;plcbYr&R5%Vy zWAMqiVM$qFwi0$T>?qv_W0}t`!tt_I_kuLW!?ju4%i%UE zlL`_F29Y=Th>5wLO;5ot?fSTs%qiW*L^nE=%=LSWD^bkYoLN_y1%2ma`~`y8(FA&x zvGy8{C61DOlOdARlMj`A7ITIBhG#R~EoYi{ftIW-sWWSs43Z zQrtS=*Dnqska^XtvU(1L%dTcy_67%mBcZF$!R2OUJm|)eYvo?U3^ty&+{Q5}(4s!A z2XeAoEYfy%EcjAu{LZy2&j`$Yrw_kf_6rF)o~jObZ|W2o)Z;ahL3C+s7&++T?*8c7 zJeuPET=;;W=5_K05Z0&un4m@==gl6byqZaB(r6vMRtrX#Zv08g{Vn~MvL&n)3;!B- zm9W|e41t-9r=znLu8)QbE!#pzLmVCE`Qw-V@m1rkfK2Fnx$5bo2UN31!9)at&hiQh zj~u5)^!CpI;~=*O&nhi~rjI!J8jd987m;Nj_apdH?D7jbvb%1ODBi%X%X#IC%uZiF z+#YqgH09+X$q6bP`G=+oaxhd7w+;-*KyDT%(+zuNTGp<*DHo`eEya=FDr}l;^u@bh zF1oS%K6sViJJG<|x*pDiW9ob0_oUB73_Paz_w$q1E(-ak>i0&-=d#i7<4HBVzq5dE z)c;zqZP{?f7TPoDeex~2xH7+-8kvGgkb2-3aIR>pgzWbTvGje2XKb}T3CE>1w6~81 zwKbX2z}!?b3-ke9-SQ$M;6YUP$^)gQJ}^ zb3{R8bop3CpD!x$ph^y%*+gtnAeIE}Zann&@u>yS5}&tS2_n5(e4 z7#H4Oz}hFF@;iS3|GY}6Z3KPa+@f1TUt78IC;lDEd<{QSN;y&#GeUAOIrDdP$ArK4H~ZwuM@mvkh+uMjZ2IZ{5AX8Ks>#KVCzrl_N0z3`lH3a=v&@q4GZ zPWKy#fSU}_W)m+ef3FtXHhQ<0E|_!~W%Y2TRU6v{3%u}xJg=msr2{>&1qB7SKP04) zj6`ny+1^0Aq)_;98qEEH@9gw5$nJYB{V_?y;;4jQfYk$RBXMwnR=PeM957 z#N^3Xkj^mtntveNoJ4;7KHu;1^zKOi;TI+Kk74|<17z%R*ssU`!&;>ajq)4ozozL5B-pwTnNR} zId-MEBHhGzdob+8W;(;G{TV7A6IL0t5qF^Qi16=U_GUjH-KKqMTK8(1&6RYNItE`l zaw$oaZ><~uGq?{fY$<%cINZ5?Vy`6#rW630@p!7iK6B7pPiaOYR?E#d+^8cYT#2gX z?nL&ftMWVn3(Dpq{KG(+Ah9z}!iuUATFNf8j;sJ1<%=^gt^+^}6bt1=RAH5=9+C>~ z`#)JPw=5cF}^tagad zB($F{;1D#2vx-f58-wr7*zl85D@R7i0(jDWlED$kQ4XCs?BcKB-HTN&n6-XMLVbl3 z_Ru|^87%8s75<0h*D zqg15msX*Qe_uhud5q!Y(D;8+k3jHVlp*8Fca{64jHdwMi)QY|yiSgg?Z{{@DNXRw7}OL?9#eaSo;74XvV~&92FG25h?4=8ot-@|FHbQ6N&*Aq=L5yG zW%S^dZZ3(hc5@UyKTjN`NdIkUbTY0WY6P07SLl9QX-xzqk^UA9skUP_%DzL~CbIaf zqXuOKP#xu(_!EyNDR8AgUzbqUD)4)u`Yp*+>9XURc65&U*+kNO!TID%H_x0wl1ZDg z85SO{Oyta6a$J1lAZ1Z#wO6tDFLPhEGcRcN3-GzKk1~)sY3JAgyO@ZEb6BFLHHtb=g^IeI-hR`cdma%`!`de0P3Tw*FsM z{|&wm=erizjq2wN`SiA`v^N`${DMa8NWbc5>$Hn_558$$+zgOvCf7w5cK=yjHPU?; z$NQ1Zr~(c9l`#i{RA}x=YzAx;N??xjeWwrYD`TL#V_h_-jMO9^TN%N$-!F*5>gfh? zPbG1UtR-`9;W^HR4-XIj-PgxqcX4si-saT|sA@_oSHR!DqdV#gG7B+{qX z{RhCEGcqVZhb~cNj8&k^TTk#MlCNRcJXR_-&dY{h8&orM-SBnS z$I&<7O;>vOukNyzo`L4)PSAV8=5=;%v0RD^Bfu?l`rEKF$|87VM3KvWiNxRE-(sqW zP@-L8G|Lt#pdmE-w3e*a_BY>$3*LKzgxy5vsdRF|HQ`>6l`i`My?T}%Y!0}a!Ew>J zNclSBsSmF2k3!>$ag(kQff^i}l0pLMkY-Y#`Iki&EZsm82W=L>JS(gH8unj*@E>y< zf~g@ELi_)xraXbt@MYmOQ}2k2{3n5CLJ2@T?h?Oe5HiPN@hE7bUO|#R6;gW!6yme! zih12hmHnRYC+-kLvs_6g-hK>3H!wWc=yx#M)0$A7Xfs~u`Ln+t_51hhN;`aiaAT}R zman?l))<8k`q~+C6P}oekAO}Xw2=4Krg$c_ra=L=4G|_N$Wy>&H^^7`4yvTi)X*CP ziO;ovlyt`1s#Gmi)uj9FNOrg4Je_;0W*j{M8o* zt^rx_M9MN?I!JiZVj95L+uJ3wJ;@EoNlFA@Wd!>jy;`jB9&Y=#UW>+|F}oKF5U?A= zfm4km(2pALFXo>Ld@5Nb3tdx^r~S*DiBF#c8j_-xPH;lWi!~EOe|aA+-Z#M34ySrB zi98`&9A{-=yuOGWy;INOO^Fik1QPpxIVY;=PD@g@9;cnd< zS+U<4*)qgHENAtMMSuZh4dhzpnL0wgKDrk}WPQid1TzcY{MzcHY>odcipls!*@~cL z2ZXeKS#I*YjIgenl5uzEqp2Y?$8LOZnSbf^@JHr%lq@g*)(jb-6s^yir%Q>6K@q?X zql<-F^jx@~22YpUJy@y6t4rJtxAj5~k+C?Ox`r0k5bNsd8Jd`6bGLn_l!2^=g_);mM<-B<6FkL=nny9!r`{5DVp;&{J(RXwe# zp#@mrtAomPKj)QYl2viyjTWt5-Q-?9=H_)o2FJk&J%m8ASg8eD7=4unaAzo|G#6z- zY}~XcaqM%vGu^iVmWALdrS$%O0M&`hMvG_%NiAdtWG9W1()A2d7oFMQfCve%3L_dk z-!oL@OZ|Ov$MmML%~SXN#RlFG4AO|rw!t=&p|(Nn7ps}uu6hcU^>wghJ~!Axrvsd| zdnFAcg&M4mJ|8_i+w}QGc4U%~ib#aq6`>Y)UE7Ccm8Vg}>XS9TLMc9J_TlkKLrP}? z8YH2P%+du~%tPnrpKj&`ijfrOXq*k^ zv0>2^7nth?4oC$&L?BC#Sl4+^Eb8u(*@Cx#vmVY>jC{Gop~@MXJYQLqsY?RX6&!=M zr}ZX#(N6TECI6xE8{_su6-c*^{aTfVS(s;L54kT%tk4M(nfo7c-OExXi^tN#ZBAP{ zGVf!@1v2lr$t|cN(fJACy3mm}lppfR9eow}h{T>(0`A#~3iy$JJSI8J_Zw>X0op`{ zexZrESD$2n9pmbSw8)mTvvYQx+#v3Dk)Jm`IZY-#z)0=g8yE)@=UAf z&WS$8R>%TIe|~n>Kl|M4dIOZe4-#q`G^3hF8h4@oy!2cOc@>J0Sy1q{_T==m;~TpP zr2Pzk^t^jX)1VCYNb=pQujYc~2C1sq2)C*7;>+XM%sSQ2lF<=hIh4m%Q!*;@;@FgF zCL*=(zE-Mko0j<3`vPP@B};^RLQpRWt(j}|RVF2dba1n>bzn-4^rwI?-LP%qqV z3oGE;xFp)=w2O;EeY{B;KdF5$ydz76dtFq;Za~BLX8W6BcAaQ(F^Vg$YtiU*MvVej zB}nRnpjmX!vuWYLrq8NzX6)(#)13P5&)?+Y8e-@#yRS!IfrX9D!yA- zxY0U3XpdXvINjl?;`3U)O6TC#gV(OCMf#qPbp&3&VT|vjWv3O<(Dy?frdJSPu!vS1 zw~dZyhL+=k*#ThHb~2&IR6^^QUuA>4OBu?Cij0K?-HC|_2PLWiTQ|wYC^Dbau6hCb zB8Kk9;?v_zO3qJYiB>TB73rK#e_k``)jtE>HZS)VNXuw1*^rV?ZpycFgJ*vE;1=}n z%{`yYEzD*7xGVs5>BaXv_VEs8v*aG$zWJEu<;#~V+uL+2N|Onn^xnQj`NeqB`dQke zxT2;UQS?JQM`gVdYx~w4Q%iy;SMqaoRna+q-#~yWD0^v(`>W8&2t$7y(_civ6Eib2 zvbe%;1KEdGE!W=x(Fm=oY2v0?IpNwf8Mgjz(TtXRaI0#~g2i^g7sy zx;kelG=wJ51v44&2?Crffe$~ck_+tY*h))Eq(Q8|*OeBZc45-A(Soy5u;AJJqumvD zdh<0q#|5pyLe989Meh?w+Iot~>*0E9d!(51W=R;1*?!j#v-t)S&t5A8qS3Ir9xK|G zYwyh@mUPs7iy`QG*t!e5$9~xKW}ByAS}Ofq_KpuqRDV5>BzvKAJxGx|vllSJR<>h{ zDCbEJ&2f@wSh_z4sJOpyVtBdGUN>vZ(VC%)`{jw%0?zV`w$iUwbO&F*!_O(gYf&NY z%5BMxt(P6jfdQUoY9oWUZJ0_}WA*?%1~jDFUaI4(=zPS|Yb7GjjTeV>;#`?b>X36 zf%=PlE-q!b$i3F#*VVl*;ZXd{T>q&6ZrQU8U!oEo3Xyp^)f{TxK&Hw9tsj`v0IEXc|HXP z_hnpP_%17a?^M<}NLYnnJyV;Y3Yjgby%KW*$(_DE`&cpN>e3nTC*Eq*>0ww&O!{es zrvnsY4%9e}RnUnCd1zsWBtfy2I#R+S(q9U_czYP)yYD;}lL3Kh(N{nC76-gO-tp$d zU;)n?6(P4?BJoO)5xf{h(m(n=6C2SHta;YU`g`!V(oHeKAzuEw_r$u7BLq?Ie-J)| z?S_d!FUlF3`Q$~Ai$Ck``vL61NEWz3(RB?DwRcn>EB8WZW#qb=YUJ8}yoqb&v6`#2 zbO+Oo{mOr}_1ws-Z5p&m9m?_;)U zyzQ;&jx2>KZ`mm_s;@a=u~a#92dKC4_c|8{^NXM@8A6Dje(BgGF6I>YuN!Dm-czOO z+AAs$14d61<{o9}x4Q2F5>3}b&TWetv{voE{?~sTNdGOP|7VlozwW7j`(CaXpRI)T z0Sh)3STxGu&ecJjBU_7{QHWV=4M0yiNL0;q!J?lB#eVvv)yPut+D@vfss}CRBTlNZ zPfMTz`^pRV`>TSTTDC{37`p=870Z8W0YZKS5e%l*i{vu9-}xM~{65=}_~K5f9kzct zqc8l!jCf;I9!eV|eu-zk?TNd`eR7hWHbg_-wr-xUm4|#Z zYxhb~t5k2>d-33%$*E1(;s_w=JcdoYg>=5T=>m*hpg(F7t zUe{gG^ez}^kU0=+3W3Lv%!ng*BaGXPRYZRwsE^5XZHzFtsk({k@QFt^9pou!QHLFC z!luD8?d?^+Mzm~av95l(ic(DC<>;exq5n)BzeCH??FvRXHq!!CjNKMl zIGsTtHzkl~dutwcT_>s%$+FP&{pS0uf=y%M)%C4Nx^&lFJ9b+4`_r^w_sbpL&)De* zP5P|W&JvK1H)lIp?+CdpunKIfTiw;f78aM#lU;44T|Br4qkDTN32{a5@M+}I1Af0y zs;wG+S6eqtAap*VGSle6*&RcQT5aEr*4Mt&0g9O{8IkO{+)yNQ#$u9QZBO`Z;JP+F za~~v_HnWqe$|P!P%oe9m3a;G=)&3~xj)I;nh{&*I9d$JbJTh!W9fnVA3CbKZQ&aj; z?r2dfL7;$4ncCrw$O13nT76D&syHm7v*78sj@gBhcXz_>gNz0AU4P0PquYCeC@N5$ zDrd3(;D!Be<)N9kva&9-dqnU$UflwquKfKY_CEJzSy=Dw?Wci(3~)H|^8qrmF}fI<|9L#!$dcT6-~P-GwN2h7brP z3UHe3wrwV5bS_m+UQOQrqPr*8wZ+Y@osQ5SLAi)?gGKUO zZ7`#)tvf6!-_2I93aymBJjr4zTiF&A+P(w2hSZuzk4QR!u+FFxpgNb`0dP(wiax&T zbL8kJ{r?gGW9=O6rdjcgfi$!1}rBURb$f*BJc z^9VJ=KObohr~U0adEQ)|b8fE;SGK2H*U;LlnK;kaUN(*?PNkD$RWB5MN~p*{0yQF5 z30~mF$dFQu-y}!grm*qrEt>2nfxRXW8k|vgnjPxK&=Z>1fh*0QZEG}H5q{ya#aStt zvuIVgV6AUL7H-HaeXD@IuAw1PX=MWa?EWl7<5T0l5Ju6Q35>q;v)?*)b?|^qE+*N) z!>8u~jjF5>akD@sgqM?(!{@w-Hk96?iSQyjk1Q49*eAEJxLb{Y#cgCBFbxp7;n?N3 z)jPovBay5v3HXWGE^2H{(Q*RJ_ELR!hX9y41S$QZrp$#Ei0s?#{nF+ZO z#)i2S&sWZaq`B0%8Kf{Wg(eHKXBleXVp8r0CRfOJ-_0=_dRGy#^t zQnDw(&W6^Slozwy0!832f7Y8GQ>u)gKh?DgZ}(=J1Ch^kfrPZtGqsXxzAU+U&1Erc zYL0Jy2a0gIJ1|AjSXo(3(4rFk+=1sDKoilI&3qi39Eun-d<53QiAR6R2&&Gg24v4m zSsR|9|pUCn@}cdvNQtS3$(8}vc5fT(pN&v4I;B5ajc@vs0Ue(v8i?_h%BSc(93 z#!1XooAyNp_je=E-ir zIBid=T^C}k-H?xNQ%S4}`3NAe8y~e11+6cWS#bkI;ytF`SCr<)zPZ&XEbZFNo`)P= z8c6M4)J9gn&2BewTqDIj2BnZ;m@Z}HZPt*0uWDI$VB3cIMn(6*yH%_#+PKBMtsTDh zHq(>cX#~l}-Hv{ZCq+t1s!M9Q?@M4HY*tnlo7n(?6g{jv3G-|H@I6>W6v&+6$Sc&W zihcCH^YoSTuVu2+dXo{()))I*$1{NS2(4?Yw_FrZ=@xHF zzyafTqlNBktV%uJ?QB6j6Cil}d2-Fu>u|ztNT8wfK42zs_g~ZmA70q8B zw?yzHPM?AHjl7C+Io3|S)(c_5C>`yZ=vHr&+%ST=&n}AMR%!OUye(uvx8l)ut3D6P z2bsGkJajY|CXWSCgBIZJ0sYVf7u3XKLTrah*s*5%GHvO#`FLM}nD$6}FCih}3MYyW z0n+)SmG+#m=c>;YpS#i56QQ;-Vd(WgzZV*P*JVVd5z(s(uopSheH;QW0}{@Dh_>&L zJWm-W1|Eb_f*gfBizj~lKt3fXX{|LoYXCu{e^h*u&CWva-XIyYDSK z=SlFy5^&Lu{~>3d3O#>*JRLX<*X#RMFD9GYeC5xM1U>~+yAs@$Q|?U0cL=rODFIhQ z+YOd-Zo@(mRh;vgdNnKo`Bk*#Y@+tLW_n9=GER%YZd;&0Y-F*NUaR2RH-Qqs%(3WmmWlP*G7c z;d$zceS4Z6T%FdkUibF))?R+T{p|jd4D8p*_RZnIVGx0hX=}5qZ_clR6PeYALm+9F zp;cj4R#Q`IP?#KC2WOJuYtN=0Fc#D+e6R@5Cj4vG5DTNYf-9Abfe&MMZm=Pa?{M&7 zJJv5RuM0e&dMsmA&m~ zhYbSuQeh*wL;D?^mviwTZi4p$NY5bWVyMb{3Q8{8Zf-V&cdK#eZ@lO zLt0pTgv79U2ufPFT2DM$FV=H!YYcV_lJur+ICSm-QeejBx`1ykDZ)Efb5R$jiWJ{WtCM-QnNYBWr6U$_q9IT9t9-^m?OVT zWw9h4*&Q?ae10)H8?nKbo+H3kj_~%Y+-oJF7USSE9+Q<7JimPh9@*=0r<{(_3U1K) zeBcrIU^)Iq7rzt1w7oj?0AZE)f*HB` z{BjSux~lIG!541ABlW%D41gm@O?Kgl+wOh`F;VayfIAbJX^E|ECQ}=-4%jI01?{UP zf#@h-i2s^Ft;-o=N-o&$1`>)_MCo>TnO6F=({%SOP%;K+_B@In2#&`$r6B_kw*XLU z9AvhnqEnIGghD}^kV`+z9nrewRDAHtNW(V!tPPC|J72HC^>u+f;;KoFs;AAJ({tmP zH1Xn1k)PjB_6<)0-8zgu@hYPMyvGRnT?UZ}Rg2QWKed48^1HMEwJ77^;c-v2@@F^5 zy%g=L_G7pJwi(Z1k%3`~;IB){mI5UIm@l9{I3jF$1v*)O zU@oli)7A={0NIKohYc;HbR~#B$4D=^6|k=>xM zg>Y`93+G8Fx@rsRO2f|WcgPVu$z|%Fg;UDlJ%1i<>eB8Gpp~DI?}`uCQ$7}yakuS( zfRaNdSEe{gr76?IHmI+6QoEXH-zUkp07h@)<#?f0dwd+6mjw>1?eI*(&2Jm?Nd7zv z`#c!J^Ob`4s6tscdl}R@eR`3UFN0^%znWoT&k~xHRG= z4?06H{((o4;Jg5GMqB@qikN#4jK7F8_YiRZ)7^$BySq|PSP`CyK zMx^ddutA~*VP2YEBz`W*Bs>`Vf%&da|A^qEc{EB$hjin27}Wd>?aidByXKtJQSPU* z)V=cjDCR+_f@bBGG&knai-I$5JR{?|{O~Qn!l~-xHni>LLA%_+?0M_y!h3gjzk<6K z3y>~ln+r54T0Uszcx3E{TQKv<>?YlYH?reKM>~1CzSaKCG@*+x=On9fY30+PZo4YY zcW0YuX%^U_zgN{=ZMG|bD9bC)OC-$#;=K=a7j!&_%L7F(xlwIGwzn#^)A3R-gz-Z+t&5az3Y)@&QF!}s#V*$)r4U`pX!^sCgIM)?B0emyfBf~_+Mi#4iM&_ojICRkjhH-$!INS`@tr0{Ck&uL=cV?J@Ap@O z1*EsLf=(Bd1Js(W15^7m3Ugno5TBq$l|P@sMS18Q9gbj+6fW&=iS12mEZpFgIcbx5(8VT<{8K#=I7FXfl zdEbL(SBnpokz(>zJTc^=F~I9$2ohDAjXv}~3v8H(CNUZH^>2lIpY-mR?(*qHJ$;q$ zByyGdPD!4B+7#g?9T22Ry9Pj>OaOKaDhSo_pWTUFsflxXoSCg?`f?w-7xXVV#l3kcC&%~XR9emc@e}O{mINY`2r^4t>{CTp)gEBH zuS9-(L`m~oTQgqQZOXt#zSG)3xAZxBa+yiS!}0rQ$P?79gR!&`CI$vD(AC>t zVo^;e03>+$6(GlScXLF(-YA(wvL&TidrtgB>o?lEG;VGeR2s+H!G;c)0afKGYN?Ti zu^At&{V1j9W@ibf^Sc^5b6(TE!@C~b8@_L$nHJxLDE&4B2(Yl;QV<8B|!?@e{Cc`>Kj zLE=C8g}knKhpu&xKa;tAIEdyNI_j8Nx}D_f<^wn>I@HtQ>2A72V^!3V#=nRvV=*BH zVrodKQ_AJ>&QvS;L1lPG$5^FH8EZ{o zLU=aPWt4Hc!E-YqY$^^eC_W z`pJq1adWJ3>zLYaGHj|Hs?USQKHK1y(`)&%1u`*-Xz6nUJOR@W-$zr0^^{zlG%>{;HIpO|&ZQwYDTGvdx=K-FW6Ig&vZz9v*Gd7i=$BGxryEysF!%Cdo-?fx;OVU?k%lm|HWG8 zypkI%;@uY4yai1ZVM;^Uz2}gM`sJ}kWrN_VbMQtKeg^!WWd9xB4Q}24fFeTO0KgKTVLEWyaP0_%C zS=HwYkaZLn$qE+f1-itbJPX?!6hl;9fHTma(J7TyFA(T?g=z&pQj}C0S~@wpjMXM_ zW0>5m8YO=XF8{|I7+}QAs2DqPt#YkBdM*rTl>#80EV$?0g&=d!Hz zL2=a(fQ{fjT|S|KPjq9*&nevBLCyZ`q$t@dXiALbRo45ps%jbA)MC?9?V=->#tvlv zwIRVH$r{01L$?iV$7NA~b{|u(R?;Kbnw_1Uc~ZFV!zvmWwR5;%O;uCf3Ebj)U9EV;e6SVQ|Fl4mO%z__d-x&XX;uzXQ$9m2$R z-U(XZ<;%$%t1JGG9Yh1gH&1Pn_`?^!3t6CUvqAY#_=POV&LJu9LSr zWWntDXomlKsS=h4QiJY*Jt|&XK*aq`4O1T%Diw=kN|VWe1$^U*pdxEWmwKTESalZ0 zS6wY0^HNA zGcn(C5+Ah8vU&m~vV*VpTH6P>%qOEQ9>z`E$*lCt#6H9&=-cLYFjkV=3(KSU|5+{9 zgI>w3*r$HZZjc-8v9_(f(5(qDNn+}zEE=X(5-1?1C1E9n;I8{K!JKYO@spIIfPOip zuFEe76H>W!eNDB6423Izu%xhtBew0a_c;=T-K0E5~=p2n@$nj@IRSvH2HxmKIh%d@@V%J?-$r?r$m*I;6_w&go#i-^paA4fBfAcTKQ@K9+VrE{gL`IE77*~OL5ZsBy4X{rB<@zE=i1Z&yGDFW4 zv!cJ5b9{82g2+F$fN!)l1yC(dM$OT!c;}d&T~OqaOg{0uzrj7~gi@i-PU^Sl*YGpy za=Jc7F1*2uumf~avPl6B7;A2<8Y0?thCCLSTeI${zV_$DJX*z1T8mn^#FaAAiq3at?&C@}SAKg@p{Cf}XL#NqjRX5tulJ@;ei0y&j zcmoxx*ygiscao=wplY2nOJpGH@M?VZ3Am9a%=m zbY^68`F=d<=9QHvtC({IP#o#elSF43O}o5|jIv&efv$4mw#gm+qqyvQ3Wlru*EE;x z^78Vvpbwh;;WILyDK4T8u?{e>OA1+6s3yW9Vo*?W;(lyOE0OBsPl!1(xJGeXcHw9Zf{sVVGQj=26d zGwkZ-ww3j_V{t`6$!}WnB4?+_d^pX)#bx6kzn{^|U^xEX+APP|sp79E%>S^V{QaN* z51$HXHNl2QVg*rsZBgJyVgJGj8zBwYg&9668P7k74#$e zcAR&05<`KoKTAROW;{*XsnVp%W{!QT@I^E_krg%#O{1(BWj+(S*JqC~-(~5IjC-*0 zZf`8YN6(JMK+S+A6(mPwoE|Y+PIrABtOH~&jpwTEqlWeilf^o`jzUcOjRY0ugVJy8 z*bUhTE@KHf5yo>BWF#fwY;0}2TqiYZWy8XhXsf5*Aq5P}eTz*xu@W<=i5|C_*Zu&p zv4+vNJ{=8tbN-JmBxJ?K1-l$4xitC+spw|)e9xziKTM3aAH=aXfYXF7<|fYrnb9fL zl%opBQ6zew`{lgalFqN_EeZEOfP{)M_rd#mr{@-{&yc|8N`3A3>Cy1fnn*Q-b(p+Q zG(70n`}b;_Ve9O3FpBRQY-c^o*_{#ltQpy>ui4JdcE(!MU13-2zzEKS>54IRrD>HY z)o)taUJE)>AMP%SZI)58%Vckejz<4@c^IuAat&u>WCW7n87%;50>|_-U>dH$BZbqf zyO!FT7rdw2&hK_5j0BszUVrNt=nnV_FM)!Z$RhE^vHX|%<<{c`fHaoU&RG>DqyjI{^63#-_S5XEFq{@s7|3;IHQZxAnh|5_B5$_98+44EQ z83}W9$~)(FO)&8ki%VCn;@$>@C;li=D)D&uhQlMTJ71*siS50vB@WAU+C63ajSIvv z3^Is0_~*|bf=I~8Nr0!bLSxgNsOIIM{o7=v_X|BdSx4O7$D7IaS+a>NFp5#E@47)O z9zMm(dxgSAap*H;pJPGr53StuzKiHdPb`mjGPSi0eu^>RzB5{L4I|Sp?6F3b(0IW) z)YydIaCz80&U^%a>r!AVEmaNG1O_$_co(=-O!BY0i*8zDHCDebg)hzb<}IaT!fOdm zA9=gSSNIYUPIc0Dz_Vy2s-9s>89Gxer}-@jEjSgdUaYWFFb!ZngJ{#D4bTYXB3t7= zYhJ)EMGo(J)Lngx;LI) zy{kWeXED()7EjsO%z+#nSF2`+w}?PlghxMqs1<85CW^7r}j5 zn60}!;l*bL%y}o3=Xkbi9!Qj+yJ}SQ(l|qs%AoeDg=|TIU7Oku?xwld zmjLNqezq=FlGW@l>iv|1yWzPfy8TXD_5{+PFQ4pmA2CY;GZX_gDB@Qk z&Bz+1Lo+A=)8NCv5&rqsjAj6zRZ&oVKD)X)K}+()QLRrY22+MQgl@Q+Z8}2QDrF*y zP4ND-%kEGG*A__y)J;3kZ>Lm0@%kqKrrr!hV?i^WvEI3*h`F#&Sb8j{6uyJPl`Y8e zPcKN8@Iu3b`tb~SA7-_1EXZhpibJJi5O+pBu#*7EL+slXsLl9ryh~vi)a`|f0r)_A zej`B*NY73KiNWQoo6Y9Hru=vY&+BZ>ldg|}&29@uGz7Afn;sGS6039SX76Yk7rgN) z8W#o`QG!|l*tqQ!;OeIPX^G&Bk&OyXvp@TyYA{J_hwN0Xf@FkDm_4cqOO@AiDs%5B zL2lHjSMa6I1t-BjH&?j5Q<;F#F#9vOX0mnLGOOP(T^4`@h5FadSUtu0#kx>MZ5^6w zJ$hV_LczquEL_E*Ndv~l6x@dm8LA>8MnNRfX15FLXY?(PIs3?nr7AJKw6RSg>LoAS zxz_BkM&A1d_556uznk2)hI9;hX!1H!j}8BfuuXyRQ7K-xqq6#C{DekuOu5&@)Q`2` zd99_;4%{K%fP~CIHCR9JRyT+o7cWCrl2+)tef;WT&))H<=`z4p5iIJUS236c{95U; z{!kyu9M)Wbx8<7F9bV&RbabLe$HIc=IL=zdf!IV?nDb-q)O{>qwSf6t3$V#M6_`O8 z-xKeD8@&o0WcHi+T$r_QYo5*KcU^yh19r@C7r+TsgobIPHzkDWBLdaw`))N37;vR7 z3-)R5B-oAm$#qW)HvQHpv%2kMBV6P#!vW54@Wb2rjGL08B1zDPhU};AC4gz(EaLZS z9wToyb9|@u;c(GyIa>S`!i#RSHFb0?4CqZ;>RWari2K>@BC4zFlxSMUWtR$bhof9W5C|K^i8 z1{$K5h`=yySK0|(UUmwYQe^`AMr}hw$5c0-?Y&O+oMJR+B#XDU37=tovhh8o$TOgf zi~^<|b9zCh20@g~6uIChY1;~JbktSRRA}|t_aC~P$T*iLJ7Z9)F|n~SrfNA!@W;6< zE0Jy@uk1d?Y$xXnUfHbXvlS=%Cd z*dDgDm84_X57>i-=Dy|3FG(K2F@}PLMP4Y^Fx?(Ftg#w5g?oUW!WNo6`B8&@+Ec{$ zcgeu>V^@H4WnQZF0@gkm)ZvV#|Btb^4$FGqw!SH8r9&E#kQ5N<6a?vzZjg}f?v_+3 z>F)0Cl5TFgL%O@(FMF-M&pPKh*YiGq5_(<2eNX3a%rQR074GKBp{utYUv_Cz{MMrP z@?i%{Y+Tdrz{u|ZU=2Qehk5Tw6FczwZ+%%g7ly^`|Lu_YBxu|bBcJWfU=>=X+>%Y#|Q66$6#_5G}&^AwWHTcERuh|BKxRk^9GEc&eD4wMjn|2SdbL~KqG zmX1TMDdL}o21lb1V0HYk03x&>@rGZN8um*W!tP>^cPs zMWw$RewcbOy|eeWdEk!%59Qp(E)5K5R`a*Kv89B&z<83aT`{F(o3^vA9xdoK9? zQZUlZZE~7_Z#soq(sU7zpCtRt7?Bd}vrJIsx`t$R^$`@x3oq>`_MYQu+ZpPLyr(qY zCP^n!U~ePJ-SpVhPAbCzvbHQJOE!aX7!R=D@@R&0e)W7(_d z$m%Iyk+sHsT4CmJ8ClJjs)@%*Twc^6&5U>q_*%7zlDhi=?#1-%tdF$?XeJi0XtxK& zn*Zv8cc5UVH4d`5FY5x0@?;vbLrpj~1t&O{T+sXebX$Stdgn}aWY1GPE?@Q`i-)~$ zB$?;Apn~qOq3G9+EtAr~L#$Cf&GVm7EP}s255SerVVdfioOS#ek1eX6Ji$NcD zC;^+e8HLxKe!I}w`F?Swf^VC>&=g$k}WC2s#CnEY=oAldyw75&bVWS(f~fU(rR6vx2&rxiK$c(zo>Zb?gc z#rBp6|CU(W8_6lJ#mb7P&qakZSex^4wj+pIj^{fxcM9x6J8CKE(&C=Kp?I~3j{T;y zd|!ZaHz9;FLFrAU_u46Y+^&8|9<(=be8Pzd+pkNiP6GQu@XE6;@idXrBU{%6m8X*2!nw1_G3rXuM5yXW$KtffkI*(Y3+ z2be(0K0OyfG?{}b9Zeg^flsKocsKGPOa!ETzzA)96o=L-SeTy|wr5jG8en6AID0=>U2rA0n5*gp7B9`~2pW)2W;S@|7aXZFhKILq+If}1u@hc>b|miLI}I(XXNiYmBx$RcNx)>y7_I^96NHUV}@DrS!`GwYxr5o~Ro9zf9X@TBYUn z-pJ_|PyR*EM|Z1tO$92!RLbYb?v#kwOBT?^RA&gvu@{QlHC5MoyYsnuy<4%WGBVraixpmIgU9_c8)8R*Hl6bhps95*fr zNH|gjQRk@@#^t=WphX`mKT|ZL%UIC?5hM(HvXWvtQ6(nWqj`Y|rE#;a9m5K#Qzf+KW~7^|BIq8j}~{eLQ_e_beLFZP~eSCr@E28-jDv*cHbo^RDYw}q4>9~vL9 z8mGWM%BwqcHTDI1%Zk5koKxJ@TAK3!aVOUyQNi(m75{9Ny|4H&72y)YV?%=~4+;kW z2wR6g^@Dx}GB3sj~G$mobm!=B)d|>3LJj1{_w40gi!KpVa#q!{+vj z%@}oyw(()Uu=QEgkP+4rDbNwx?f&7eM9|Qj5tG7ZRQDq(&(X@-AKpr)yZiet(M-@z z!gie8*$*KM*BW}F1VlEl?(OXlc6fyqJx`3UTdi(pN0E)+BAaV~59ovUSl2hb(7HqC zC$+dJUUoL>RqE9Im)T7xqcX*O0YKkG)e(M~X4O91M>1jhq#2U&%m|>Ad95`j3*Z>t_SkpZ$q}FlnDZrsz%4f^% zM$|a61e3@>M2B@Tj`-DbVD=mGhO;`5P5?}4o0V##v6hc^rtm>3{vA?NNeeuJgp3!& zY_X)$?s=KX@QHG^xlpkw28sK%b>r<&!`0!tSS*&`7WP$fC%RKvJqvpXp8K7n{T#dFi%fzZO~yEK8ZB`2Vsm zd-IDx(@C!f1{EPvus^8*QsU4FREmVEFaPHh6`(-=t@-!E|NnA&`@40@vj)a(rgL)g z{P4wxm`84GGO!A}Xkik9ecI#?am}F9ROx?fuj_2r3N7D^vawOIMO|zrIDN zMB3lLT_2tJb>_lbnQ?<2O2}!Gi9bV4M%Id`HNFLIbIhBp+GHB{3O6=Rt}cX*(Xp`^ zrKRZem$TauqYDicxzuZkv6ZMj$TAe!98I4`Rpc_9^%-3b4HXzI0Y&`HFPR zvpHEKNVh5U!Gew@(&FxOYAnna>VVs16ul(#EHjLI0M|GNrjKW;sI6z- z+3((K5RRbngd-*ppu)!oeO6aM(a^w|d$>RJTmza94wH4r^S&(1{g9v;ISLWAlgHqHa`wfLGD5qOhT^&UW%gLO~xF0R#tpToq z{`Kgj%GqQI%`hEnfY9&rQBl%of?P2z46Y?Kkz4MS$_N=r*Fu^L?Bvz2F=BKa+VT8E zUTmcZr)Dr=_RDwnpu=CCgN2stBb_^Wcyu?XW^{W4aI2j_zY zs68c-8?r_Tj-AMyniy>ppezTx4b2T_hvaX#Xr1nb)<2gMxL+!cd?#66NhfCx0 zxz$2t%+yeQZldxnyZLtEvkTnFG-Z&YafBL-M#lU%0Xa?FCeaU(oWCWxPdlBqUNd~8 z$6T?OLg%|ZG*UUA6K7rpX1K_=!-KtDZIiAT9_q$EAcxxL-;U_DZ^99a|6 zg1N{c8Z|U6mHbs=FKoJ=_8U>zv_CuL-+iNfb%IA+Kp_QL13k|NW?}fMjxhEmuYI~2 zGAgQ%Zg-)i0{XKxmZUKj>fXKl{66fSx9F@MuB49-H*BZ`9Oygz>gwto^_*=?pNavsJF3Rd!3VrxHIpSFbbNAgJcbd|vNukcMY;-2I$i{v3 z-a|B^+89_O$gq7{{PM1UWIu>&a}Q*Rz!F;MECoQFB+q|XrNACdCe}e}%-(<4qxda0 zESnq{$E&g|EtNjJu{A|r_WBuI2}4&-Jm?|6O8Oi_Yes$1h~qeK)o?XE40b|hlL;DN zG>4tEaM^I4ehFqgj*4Y9v}O~xPwQ!_psyeAVbbT8Ks3_sU|T|T?Vq7-50F$}Q9}Dz zYiST_O#1LwJ3{o9zO>SAad(`uW)NfYe%nQmHQj<_i1U?tk=)I8sHIbd_bX}rHXFfz zt*>{z$VZRfynrQ*&+GCI9*qQ5`TDWr;fsG3w*>NU^C$8vbV5som1^~W*K+@gYS#v1 ze^>mErTMSV{o{=GudK;*CpOuHgp;vHA94uWnuib{@O=3Slp*7(`$TMeU7XeQAv;MW zw3ojk66fs}Dfq_Jd9gi?fPsOL%ktS5tg|IOfA7G0d@+M6+}Aat!U7T*&qZx{><``z zw3$9Ny%GS}yVtqGuCPw9PRCD534z-1@VgFJxiM8V8Aq9?#EJ#WCwg`NqC71367i)k zqcJa$d|KRgC>Yy;StFnL`5*Pkq|{!Zv{+bRe##kV%SG@Om?{J83vh_?f)Z_kf4>tD z9o!9E4jB!~)FD=-b(-v5Tcpq>FAY3A_!yr#p42u0B5^08KNqnrbfJv20Uu&4X8C9R z)x=}0&x&o6(q$KQ}`{&dkd4CM77_ z5uO=saI{4CV$5e`_L=m{Ti9QCS~@h$lSBsKN{~L14)MR)kyFuxW4t`xr|mN&{E?6l z0*rKeZ9dPg0Q2)0Fql?AK(DR9vN0HMF)sY2Ok-$cCJ{6pLBruT*nbe!559YBLQPF}!rS?+ZJ>)i8Xmb+spUqF`IGr4I) zxG_im1l99R0@NB(FrBKI7HK`z&pBx#nB3}u{dP)HutiPX_SdhMNSk=r*jA$^t70KP ze*CbqwubiB7fJ^RE0`~vH?OiH(t#`3o(p46UMWM2({i@1rn_#{Nrg6{dNy+^>>(t| zMLvYEJwSiC^{0Etf3yJat6|Rv-#3mj-oB9;zvUA(yohbtS3tRx-olultZAbSAETIR zRweKAHq%YrLjEaV2zb<%A1WhGy$2C*s_*rSI&Xz$hUww~W=Jzcjq@kDe^j0~%$>jh zXo%5^lK1JK@>&&l$8j1sbpj74BeYJ1xUvO_rr-=@yoPu>T6qr73plN1G!8f?HYXEi zxLbP&?#CN=PHPo4qa9h1pJvV?<&&SF!lUh+=n&d_7Oh>yqk14ASWkQvnjlK6GU$)d zK}JFIb!Rowu=*roH#cNux{@~#{a}+INOj+7$dHf$Vf|2Q+#z3!_FP!aAV!2EzKt~* z`KIn17|hWYbfZOuD(T!&|mjb2bDXc*&ODU@d-X22r7}$b0q<9H8yK zG6W#9-~ITjitlb8`KSX6uB2(7_t_qyc6@02j-Fi+!uKlZ{AH$;;Ufy1Ms^^^j>hB1 z&hRfqyP|`G8Gh0Ht_rOGwyouk?nIPQM=FHyR9)@rgg-@pCE^rAjyQA|=EfJQoRS;I z7*t5(f@gN8slMz5K=0QfY&GB}S#ThXXScK%>waxWt?MNtqms|RYg>7Q z3NriOl@-0j-R)shOa}H+Fl9lALoRtsI4#Q*@nVAn8bUGOF1e~h(p}49j&)Li9PL^j zuE#$o2KMy>_*fu-be8{(#O9aq7A0|pqf;)%CY^~oI#0>UKYQx7zf-^|g?`9O>#hCU zH1^+2zJJZgt5fXn$^Vxx^CBN*$qBXl#Uoirza<=uyB+ji1!bv4;p>vFH>RkK*@MH( z64s0i)uXbktgOeU!~FUO!>333^FkV-)`eYeXQrWScP_@FTjWvfuBXF)R%aLSUHzLe zPj|g-sntc-9Ju&FR62%HGZ@$_i-SKC!@*r5^$^Mp2ifoY8HBjxShh?2h!CVVdNQmL z&a#m1BPrO<3=VbW6JL(UoCp8a`0^Czv#=QZCQt%GrcRRa9euOG;M@+~9?~`>XpB0h zw9mnX)7H@KmK|-R3&@^NcztBM-5rz->(4+oZZUNJDBub}4jj%WnNU@#)khl(NShm& ziBz(ALNk?=Gz$YmXjO(xPt+#C90iIzx`Ydpdxo!BQ~m-nVa@PO?&;5*%y+Ve@N&+2 zQ~;I%@hF}t3F{|oL_)P>sHen*Md)*a;07Vf0OVdm)Ub%@u0|F%sb^O(O~^R6TrM4$ zPJ{7SAIX;E6`~``1_L#5-2evm_Vz-!Qu%{eLt!B*XC0?3e@q(-eHLI<>m8JwmcFs3 z)(d8O@@#?L=ng=`rzv=Y0NuPf6x?uD!Y-FO%WJEE8w@M8iiX0PS=>bY*tm0{T|=Pv z<57JyzSJd%+?>|OnU0n#O3YtheW`3=Ca89>Cw<_s-@$Iazfd0y|JFW86}r)nVjJb) zk{ARrtAXkTUImfAo3>U7p{rQwD#B!|1CtWG44%XDk|^vffaWk;2XO&dhBBm$p16nC~e-mNTFlqf!!(JXrgt| z@)Wx>6Y-^W#|eNxgVi=@0|YIw_UC`4 z?$#CvVpbb$t0dOLXZRM27#h4l)Jibz3T;<9mT0>A@mj{!@$7OpuX9$}cyzjl_?I?- zVdlZuNYNfa-n2%10FYe%w{50`hX@00h74Ez4qXHz17b*ICBxH<%WK6TMZWX?Qk46K zr;umdYN*0DZFB5$WHNe^jjc6WC7V(F!Ho?(s<32#WH1ij1$Eqmxb zlm6%}QhTU(`U;T|5okWXzHM6=JJlCj=5GsUpf(*IrQTPc4ppWj<>*?KPSav6X0s>>ksTX38VBi&so&&kP|X8h~Y z_Fu!UMH@O{DMe%xOvGMfF~|SkC;0#K8(R54L;HLNg{BthNw@+Qr3y2x_x{XHHe|4`2EgA3%eWp@8)|doVjQ>4?enE=w%@t)$m^$1q>J=ay#($zqZu)K^NL zwUix40A;iKY!Xh^8!M~`dy_9+BH-lWHJusGC1u<(Z|UN~h0CZBbiNBgQI}5iT^KFY z#y<#;A4%0>3sB2=U*h02Ry+R-9_&ROm;uISuPrApK?@h6?Tc)?u2KKb#Z5pj3{iH4wsSe0VgN+@B|o}9xrn+6v^B+8N80~`EW%ch{& zs@SL~r>B24-=t6VtKDx$*mJ5Ap^%uuG+rE{Bz=Q~(4E!r*&^(jnT0*!1CHNDs1FLd z`YbgyHs}Ddb#3+sCO<#F+=h)i+Rt9g1Z}$@euTcf9`fSAoIYQm!T#kOc+Ce1KDf8W zZUKGa&Z_n21e+e*yW|GYaH4YdG8R8#H5fDGwvrI3gYR~NRi)7dslL7vZ<#H^fW`=Z zg{^(nD1=D|YI9DAx9Cf0L^nON&Y13;XAvF7>$3y5`T2uufG_>`nqX6U{7YXbjjsi#0IM zbLy=~3wY_4~dye?nUMS1Wk=Dwd;1|1#r(0%hV zPT`OfPO$t648;?hKku{mIXc}r8wBfbR!Q5_xqKJ?lJ%?LDj*VLsI2+U?$I99e-RIp z!PxJfDpHrzRCw+))QFa=IJ9xAw)jHMp&QqY^s(S*LuXB=Ov?myKwU#2UDzCo|5ZAO zr**XlY5_dJ#B0VsYcOO!;dv!&;IR+CWU^4kWi|0dP1~Kofb)+I_ zfh)hy*4~+%Wh*3UY@SA7$47<1#|vK<{_D{)0%y6$9N6rH^X`^KK=rfET$@}fY;~VstbEH`nu?)JIfH3KUlx{u-1B>T{ouJW@D?DUmyxJd{*5Q z&2^!@JO}v(QnSeJ~b!!{RIl(D5VRIs@}JHK=NyV3$a(`#>;*DlW-17)e*s8D^$<|xLN?ssi^Qb zb^kv@?8=iy=k)P6UB$o9nBG+20nP7!dxHMIxJ+9Q<-A%?N{6D zDSSQu0Wslw7UfY*w=4n~lZ-ag9$|%QbQw~OOPH{{{1|1&21>e7M2cW{zLQ)HIQ2Vo!-q0r56Re-EuD4Qts7D1p75i4xC^b%eQc0*mDy?ZJTRvr)Id45D)VDW8S51K4k_}R=xrUeQ9pPXj!>{YxvM0 z=kBFo&h~Q;>aM-u2hfvFbxaEQIzSz_D@5RybeJkZk9qARCE(vyF->zBP2Dw55fN`o>LI=V6)Q#u1Xv}6m7czF@TTDAsd=& zvRdikZ%=(Sh(UR|L87=ygWF@MUynI)uuo{79x1Jir`@E^d5eN`l~Y$drmPR7`9iTd zzxH@NXo4dbV-jlZGiuqy&oS^m5Wp<+qvYOPbC%Gt1C3CqM~Bbbho{K)iE|t?GFQj8 zsP2_wl=bcr`hU3c5puJlk!8Fh1dVCmI8>+vnE_Z5Jg;|+`ixV(J)NyGJ-(Q;q~N}N zwfr#!oR+MtZM}eJmH$12E8^@^2dQ&7X*j{D3d-DdK9Mn z+p+?-a>wMqr6=Z@k>23zBmYW*~%T&4u-5c8cHy{ZM>`%1yH*BR?ZNGbg7qU$U00PQJ z+GeJZY63$s`ZpsV^$&TVGH7Ps-f6i63Xq|@9Eu$(W@gZ&deL+(g->J1iVN&%wld0_ zktw>M5pOre`n}GC*>1YKeX&>PScf7f`047EZ9@&f(XbBh?;j*x?#U)+I1S!^6IxhP zgjWsxm7;(-wXtQ%cn1><`9OCLYuTNKz#Oo34{faSZ(l$_9pu?YaIwMYV%1B=9*wCF z^x03pDZ87BcZKLoF?SLHe4iK4wO+|Drq z7)l0r%ys7d*F$nsH6h3D22uH}EUe#u#@m>~?vKt*qEO2Zwb%2{(w;{gUXM&5{<)_; z)OsIbR}52y(Da}!%TFE#4%um1Q72E;Al=Bet6)o)H;N9>zjOq{M<2=A(y+u{d-G5n zHtQ2SYhTA37k})sN2>fH)yF|&Uoo3CUxk=D%vzact<82eO(F0{LUg~Pb8t-rJ5M98 zj?HrPe$`~7^)Lddn~pUrjh3=`@Zz_m_izS_pN&9s&o5S^7arP8sC2^?0%A7!G#sbD zicm(}Jc;xs5%|F-SVL8cHVX$tPe~8ziKrwlo zB41@MZD`oYsHTv)S(h-UAe@6}8NuH|_jL<0uzG%cdg=?7+ws5txror@WN-&>Va65` zWLj4?bD~1Q&){F5^z%YTfBJ#^>w^aj=oyv&<@4a1Xl~#v=1Al>v*6t5kKZLqhNpfp zG^2+wA*z4NZhmgu8sp5Ro- zGcY!iI&_uIp#BNzs*o*NhQ8Z3!4Qb>$c`w(<~)%okuv(s{vtsL+rWNk4zwE%A!~X0 zuh3a5m(>Rs6>;#guK}`M;i=6@EBASiz+noB!gP*efs%+nvZpvJVR)-?LhYjM${#__Mz3G)UBRrSPK}#_*%)8^I5Ebh~w$ekA2`hU@+MCb3Dkci?wt z99s`Y6(iiSwe_ac1@rrRT9>G8xTgKv)fc|^d4~!pcjPvo0`;ukbH>%Igl1$=NK#=< zD+P~*)<7ONFbL6O_d{I8~yO(B-%ysUSsI5y^UX61%2` zMk~e{FsGk&`P<~9;J>hH9TC45^q$cYr9l~fp_=<;OIM9v)TBB*OVWw&I-TG+ngZ5^ z)7hkF^1*>pw>h9<=rN!|ZtDkrq)w7FucMWfS49PDsHbQINmnO3^-2SS?Xj`HNB%-o zto?Dl<4nWxha*eeSFF!IhCB7&2eKD3Z#Kv+h3>w|t>ES2-dvF~PR}U$_Q`GNij$yV z{M*)Oi-rtiIn7>;T8iBwy%rOycGeKqlt!z>wL1b1+E*Y3u4tcaeojVP9EPgkdK zEmwW2dRBPwvl2n4Mg{%J9qrg|R=Mb;OR_KY+{t%m% z=unt*Whh~27=D(BS{ShipKR)UFLvx=oW(!a=W#mALctxmk`Jf-T;xNnnscU6@%nAV zmTw)z|K!BsW=I9M>7nD8x^h>+s3GGkD-$Ij%Z7D9tiwP#g!vlpAGbU%Q?-_;XcXJD-HS&chYJmOjb%Lm zp^yF&FKlqML14R~TE<=lWwmjp3#fMyPw@oMl-|j{ti_U=wVhM=VVAM zCntAx+(UXid&OMqay@)_5dY2u)x)CooWE(QUQ9atj-*{l+M@jmRym>#QpZ7~W@NfV z{gbe!r9g!kf3D56Uuu+F@OWW#J;=d>fnJMrGx8POKL(-IDI&*w<7Y=9s_l$_OvitG zhwK@W7@Ge-N9SK(T$ZL35HvlUq!5R(P;2z|uSDIC7&|Onex~B`m4QY}VQiCT@IqKO z+~Ze@Q&E;532SEiJV>o{wv&4#!e5XpifBG^mx z)y==H^v>j|#5X`Qa96VQoQOW)`7r6s%y)@R6NG)L(vsb!iQAv6L9=W;hR>Ex3JwZF zd>cdOPIpVb?7j2rY#ASPbv~T6s<3m;m>}4e;>Rh#_eM~!#ks~@5DcKG!wrO;3rnmxdC zTJN;bSp!{v<0zZ{%V46)$dl*+HtwruFasn;%M}3c*u-NQ&C620WM+caFaD05$%1H= zPu6iPP6|aNP5b%$NLv#Tq1PYQV<-vInvEDv`J5QIbyzfa+fIVcgN7wrOT}RaPTr$> z7W%?SJ6PZ*N=pAx&8`^aaF5&|7{>Z$^dmabADP5pf75_RwI~!-KHW+A@xp;qv(^ea zEiG+cxQ|%COK-NVcJ0XajW>ArW@JiOJ8{%+ZF7p0Xez%TW2QqY5`P!K`{|eU$72_P zx?~4^tcssydt+RQT&@JAHY;Fm182%8;9b45Sb!_mve>-DAguB1*CI-2z-vBE4w8^) z9qPYr)3-<2=XK)r_3{4n$<&4WO*IL(gJf^-ycSbLI6?SNSh^K)3mEyKPSc(sP+XH= zVzE$|&SZb?eQ$-?$5wa@{ zvc*ZxGM7fi*POTB=a8+Q`>)Fmpe9GG7h(%%_o)0Ho^rOev7HPmbD{7r3tw{5ax^3~?Rib7BVmJioSOMzl`%(Q$_abz5bvzm)HHfgIL6i9e>$+ zY<(SSIKONEBIz))bV5vadG+{h3r5LH*Eek9y~C#+N;JmIJTL`d-;P=+0`EH zos0F$y9M!A>aG!Ukx>=471mV8FiOH^a3!Q@CWp-W>Lpdo$USSrt>l-pRj=mO6L-9j z-(+!`%Gn9VZ^3HPuy0l%P9?wfR1we2Pw`pI%RGHgX}=jZEZG?|y`b{44vA?0d^`U` zYDDND&**ln_5L05(N&duk3*($%1oundJ337>|tK7>oK5_ha0W6cvA>yqf**xy7vNF z)ZbLn&fq6YlbCRpxW5-Ud>7KvRCS26qqX$$89s?wS2g2kXJS8k@c1V@D{@N7B;_m4 zU`(5#4aqMCY97D7f51nv?yLPI#}zS3`jPOhyZO8oKlqR6 zs*DdiIdgS_WKHK?ngyTGar_p}+OGbOs~aq>h?DHkkd!{*f9|HsOqiv2{HdPS`bc;% zLd)7zWRplwYwkbB^xq$dq&*pYQzbkoU03iqPeqQ& zP|exM)c@M4cJ};FfNC2`=_@_oF2qsV-gAVtr}s&5pg=^LljckX%pxxb@nkvepMt@0 z`7H63yqx6r5|quf;iy2_Vj25WuA$DZuDlxSM)$nB(`t(S`ik0Ey$UC} z=@9AN*D=3@f}fE|zU#KfK{pTdd@jeDjkgC4`9sa_w?d?&6ZBfKZ=fGZqK`HzQdC0s zI)uOELZpu4Gp6b|>)ZK!zesXikb{RGj6@>CSZZ6=0L+s{!XQW}gSf%cWJc{zjGT2k zP08v5(ympuAL;^vaTKcRC6E+W3-fg)h66^_yep`?g}XCF=j?upsRE3Wgsbg?lrj|4!mO_x7U=h$a|c1~yLVjbeNjV=|Jnnm&+k+b zA|6fat$_c~?Bq(Yd6p1PL24#Cwjq2<5ZUWjZqUD4K-%0EO3XU?nA7w2Y%Rx1X1G|~ z#=*vhrKh{IbGfXCq+`{*zw~76<7-1oZ+WqdRr^8a8%aGSmg=4Z|Aq|0L?R+Bdj73nOu$e&29uSh%X+R|?PrC&#q?R??$0ytTK(Cw z5`HI*szn;Sx{c=uKP*$aDGndd z6sV-24a|7I+w`XuAskIdK6V85=a5q}zeJ1K4V(Ota4NP0_9~THEAr;+O~RwuT=1Gr z%{|?@g1mKZbDeg!K!d+>5JfoLOttEOL_>VHUshUb=R-lELwyn!{JcGl-3;sc>cwgs zCa)ZI5ev;U&;8kW>Uv-GFG;E>dR0s|(<#3nlVHo&WzecvnyYmGdB5pmNi8#gq#86o zPsF3_&QbVC^R#OF`@AiZYssGF`80Qk)|DiCdSbPO{(JNyO~sxSwY6;>iXURi4qHmq z$`K6dXDmXnT(zY*=6c5_P<0NKBqv`Y5aMJSVv&^}Mrw0&ajPJX_A7^l*E1wE9tN6WVgqo5OUc80ufQ zE5Yt*5`CLG<{zubDPd6BmC|hUrk3r?%ZfBeV+g+C{2-L;s{l1(O_fE(_x+y++PgyV zN_d%hP7={Gleoc?qw;FXBGZQ;=a}mbg^W@*hZ+Z|1w^FT>qRA=HJXZ3cvOTc{hgpb zwDudeR8)5MFBtEI4`r``3{ra9%4i>|h_WvDG{26RFmiL<4~kY4XXrm#qRoVz#(n^T zMetAWbHlwRo7~n_OF{i>PW{J83M*@?sp1CKmA&Q6*I!5-EjjQrO{!OZDR!*%+*E$pL|E!MAZvLKcB*%G}7dEeP9eq#l zc4%~WH>q(4q9Qx-KOxb!n*(jY_i+q7FBA_ZiNPDNmNYD9KSW0}MA800iuW$d{Kj|O zY(%)V8@{H<%-*n7EdMrFy?Pmt?jW{9$!e-8yfw(XbM@KiSKV9o61?l{tVo9!drH~9 zgN^Ge`};-JYu7;{ygv~BInupbB$tOD3(jNNqo4nKvD(h;*R z`IJWM4BT(j>u+ZPrfW4qer*(FJok+!{WZX!>a8Y3TGe(s?;UZ4#={bROJjpY|8Y|xLI^P)P1ig;5HTsPdz>>-P+%#fqBj(+FbV*Odge9*mm4sRAZ z<4x84e1b2f@Rn(5w-8*9{YJ39hOk8*5(EgBanJVuM~3k zHJ^V36Z7>52;^ZiX%SIHe$xJ8Yr+y2<#suGCWEeeLOa!CA=;F0f84!1s?vPqIFQJR zWjEl0cT4b~!*|}> zQ}-h`vu`tDCR)*E7pB9}AEt>;5ms5SCa%Bt&?g|FvF?q1evqlwJve^0EG1m{%sQF6SgWeg7s9ITc|qAsc>MA`4-e@QFF!Gm z(V#8S%bkw(o|@G886KW#d)!hI;Zf`MMrn_fX!D1X@TxUkxKPlPS6VC(JU=uELg~ee zmgOsy*HVJ01nAvvGzA;1t)53YxpQqdf|ca;FI9wWF=Y6ScE66sD!miz zcPI15&ob*P;pE?ABEvUgrwSfUxW2JR$O4&Urf!BK(hj=6veqXE!ehaRs_xHUOeDq$K{;wlpI<6{U29;9qM~}dg4=Z#$p~=6)%Tx6-2zPDFn+G{&5S& zpRp|x4i3&=v9?r{7|`xF>HYn0<W{T(+IPiL~Q9$2W^!Lo5IN}s!_^sZY?{-X1MsI(9qt%Wl zN4aLra!zE&9Jhqjcs3?cd%5VE);~;pb<;7!K)sx>?|vV*k!i7elRH&QmG~Tz5Xxb5 z6jV>X5`;m~dbkFUil5p%r&4K*aW&(|Oy3oZr@Yk03o6;gA2wMo0^OOi-HZDNdi^pk zcrzABi)$F8^4^$0PV)0rY;W(CBT~ynomEZ^7R_g?C@q7!h7I=j5ElwN0Hf%|h209h zTjj7=@~or9&NrUFoUNgHepx3Y5h@{5+JEF8v6LnE;(LcFeAXhHnX zm6}Yb>%KkD;VAbK zd1e&V(B*a6Mg>n)vobKeH%vK8@0t=BqO#PgOmbz@d`w(Z$~E8CPes1JmE1Nl_=2uM zq%ktt!b_8u7gk7uOwcnJBWl(ffrppT=&E{T2z$|~9~_R|)fjTy+B2Du5HAtOV$ez| zt{~5i?uptHIjkqJg>W?5K$@;mXS2yM^jcG@GfqF}XwI@l*Y-&IZBD^d%2}cvWfWST z6Ti4N-f&%nE$M~>{oRkVA-dbqa$ySD#`o4~X{BM=V{__V_kHNj}ikh znrznYnY}2RXjK4P>pAVnQK|JJK_Pz)4iB!%r65{HDword&Q&&cFj^BeGsH&z}=xH zOP!Gvd+CcQgcQ5Vf$K@omFT|Lx3_Nh?g4vKOT%xFxj}X~2Y$x|GNNXD9pN0&nbK*{ znOB{G{#eFjD}>wD(aXD}CHphk+Tun1*DWm5v^c^Yq2qz&YntDG2Id1e@%&3ZcIer! z7~8b=(Fy)hZ=oh4BC1uxS^C*5#*h*Q7T=0rd&|3_s|)>Uwk@tFd$HTSU#F{$2!$dL zI+VEItVGc&_NBj296b-rym}3m3i!j8N4}>(E-Jx0ME9GswnzA|)}0z${f90770`Iu z+2)H-Vrgx@y0YTUs9C@4kEbOd*^M)RteToceHsi2HEi)je31Gyv40n@ja7ohq$62m zR6CpgefMIzNhK?3c&*~+#QW--uCUq^+okgooYowgNcAx)*eZFF;MdT|4WnOUG2%!} zYdmLW?XP<~ZLcocOK5VP28a2}W<4~!2W2#s`Lqnai+CL5G`}FoM^fZ1(Hv(9H@D6I^WyO~Kh!@F=%t2r(-#AyH1#}(Qrwoh zc=w!Z&^%FB(M#eLOF79~txWtz;1^F${A5@PCzR11$Mzo<9L(8{w^+f}{4zv1MIg*3Y z9hm#JM#C&gRa|qqU3IFQVkpw(I@wCUeV^7xpe@KMH+-~EDSXdUBGG{D>4~E0UGVa_ z_J@;{w^Q9k-0OE6m|PpIT(;op4hS)w#dHYh(Il{>Mog8LrqGKj;S2kt83-V|8v=M_ zsj4BH#^WupFB%dB6%T`P^;j%n&OwYhRlUZ-%GP!*dsBX_=Jge4N8|Dh>YURQC2CUg zK{%J@fzWoJ!AW9dao}bghsjdfWT83=MF5)e&-cUbFJ8RR8G2H?C);p#+_sj#jFRpO ze{p&H0Jr0$EL!k0>_@65f<@TOb9Pbo$|}r)xCD6z$s2=x*3U2Z@5Y6CXQw#Nw?vte zTK)U+&U0A)wNKwc;4(d)mT!SHs%6<+b*3;Nv;6aF_(%YqC-y&NmA@xGxE5vxKAjT2 z!LhKimbu?LOxhziKdst2&m_LaX7n>WDK4<}`hwHq4SH-fk8E}?=ZQ2K*3F~uZayek zT(EuO)Pr5jh zk1~Nmo}BWV#tWW^Wi9sMzu82qHSgN4JG-Jd&atwbVN_c{Q<*4w`d920?%Yn4pCW69 zWP@r|+=65v(cJQDYWVy)>))y4nU8~`A&|v)u(J|~U`g5whD7-~YVoDQ>1xVXi-x8X zTf#4I>_G=Z!h#`+>Ba&-4)^o^tpx}`H8wWNHac0`)i+@2g;2hNU>I*fh+^e4(6K8} z%nK?zYgn6=^n86Ys>fuJL{|#8!Od4<-ay5KQ(~0ysOgQ<+aru9b9JPy{wM*Y7R;m5 zQ-v)&u=vR)|6;Xd)JVYXDF5|*wr;G;a4E!eKatO!>)`Ma%Iz+=t*ajgVCz5juoUSq zXenf7TQxuK$WQup7p zu(RV`#?(>EaMyXUL#;e0HM!Uy8M0cCSXfzESJLU*61sMMVe#G~*4EaxxAg*h9~xuU zykJ_RRB!hCE~9E~?WKhliYXEEE}#bCtKYu-e3_q^lW%%lP-!duX5Y<1eRK08HkT0s zQ|C_ZAkD54!I!6Mnc|-(HHg?lVKjR-kNI1gtTG5!9$UvDTfU?|o*&E)O-f^O!wBV2 z*QCBriJFh|vA*t@>y>CIw(B~b6vgkD;E71#W<2Zw8aBRK9%-S!zUcn^Xoa$j8}q3I z&r$FNU&;h5zdJ8p($3=>u8L-bZ(D7bm#MDsIwze1pTDXQOCJnbIoNs^$T} z=7Q4-JTW927`()${Az(!oP_oUYqKW=wYuv-j{P7vyD8SWxooqQFL?^TED2#PV&+R0 zg!l)p?+5FiHisjZ=zi6!MQKS%aQ1kbY^|OjQ-4)BggIz7hKq&38|-8t<&4Z z#vN3=;g}z2+cJJp6X2A@Qd5`QCX+tCB5*K=`TrPu>$s@fwd>nL5JVJ_4i)L{4v~>Jd*G60)?I7`l&#DKk>@R;}|24V4xqGCC_nhIs z9t!{d#b0ARf&;Hkq`~lg3rP@*t&A|J^$Bcn6zOAk(<+};QkwWOkUOB-i zPL@N$wVU>u>25?;xm?X>#9WR0#FFRx5X5n-c7LzoZFtmTnQ3i$Iu$5>js$HbdGaxo zq#k3;5JH_2?W=OdJzY{yA@gCR0p{G(-`L%*XE_Lxm_?u8zN|9=i&Z#?!M&B@UGA3o zej!9X%XrYiHs2gPmw)mI=0F-YzJ?s&z(@Ol72|fXixjJ$Zi`=G(;ErJG;G3;s&^2( z&!R?-e2ge7?3a7?JmBF|WLEac71rVJs}^Q%S5=88E&^CInP<=T_TLe2_q=mgI_ot< z%)P1Wmv#Bm!{szTMxRrr63@`AAKA`EACmN>yekHDM1uPYwDW@pGejT*;i3w~{yO4) zY$9ni3xU%P(p3Buqc;iy*Ma`PGvC-#m?7XW4AvPI)Nvp#Ge>_ zo=?ypYOCK}I5u;~?&IKYHizj-6! z;jCn`MN?@#H==^cDONOi4|p{CV%wrA_@rO{ywt{yQh%Y>&75hY1! z44Aa@O@6?SY)_bqG^+E67iMN=M{Ar4!|J}78|gml<2x1A-$ z?qT~zS6JP1Zzxct1nhY3%Ie$Q5XNVftLvR|?V|P$kdG_$-t<1dNmH&Y_>>UJilV>B z*r<2IL+8U6&3hTzZ5ZE9hlPed5*0l`=E(5cjKul_F?q3CKG=4&D1JZ}l8{C7RpVA0 zyaR3N^2Zn5{yNEnBc^*l#b3e3njylV$F61-oO;9G`e$>zCCapd_V3hD0Y|>*hZZjb4ux9awMu(f5PhR+K$m|jiEGOYTo zX%P=KH#he}<#=~_xY`Cp{5Jql5$ihv0X^pvGwlGn z671|J?}3YifVZ7d{tnBdY!OOv9qUC8y+s@7C6(J%GW#+Gmthz%c#N{?@~NYI2C8|@ z>8&%;L(Tv+(CZ(!d)}k@`FvI>_p1$#MtflK%F;UZOBFSdBP}};W;3GlQ6lj{N|bw+ z$PXGmSD2wF^$AJWgo4@Az22C5r3avrZqE57+YsE6kN?pAUCqgzB8du|EkB5czxO`TJiAFof3!EV8@3)06zde3c47! zo;T&&Lh{VqUIA}xR=zQts56rr)tMebBjVP6W^Da0X@~S`{^wF8uduqrIUvnRh-Odbrp*0 z8Ii1rtx^StXjMF;w^ulP$*9nJ?yAz)~^#GcOq zaK)SMv=LGf%CF+zD>mO&TK5RBYZ*6_HRSK^85kyXJWp#iNq6&u7Z-o5Ebj{Y{Ept} zo1~NGA~<%Y?@wVbOhy-Hsg1R<$y{dgGBR(|lK+P$uh#Mt>TF&gDt`aJ7lePF1^-ir z|MycQSS=ZsI86_%zVjl}x0F%=( zawaJobUQ}fy3hDxsIv9wL8&y$w^ZlrQShoe>gwv)5ae&Offk8B=m`ATQhIJ~4Moo; zE9J*h7(=pVT)hS&Kpxo1nk&uw9c;7$o1)5lS<9P{P`ddkQCqW`h=bB(XfdIDwP947 zBnO^R@r`ZCt0p^OBk*K+)tT_4ZRcarvdOIVA8?zpEo%8X>nhj?cK7GWm9P4rRT0HR zMUMJAIaSC7G5-NS>@Tj)Z>VmKQPV{5qGA@U!`UnEmT<80iyMHK9wzk`DX$PiDpQuX zj3NruL%)Nt2$e-lM)uM^7@B-2Q9U~iIaoR-%jyy`3m|a%9$%D|ess<7&c+ocE;8*M zX8ZVQ4FTo>!t|pXTYp|Mo1O;{7pNbR2=wV+>==?2n^0Foppx7jB4#=f8$SxxHY1r1 zVQ(w*HVp4p{F?vXOuv3SD!cyW$tbeq)3&{}LvlZv>NOHSl&sTJ2IOuL+Js)6={Urv z*NWh~?jy|21YV()rst1hx>Nuk>;ZU^B#rE#V;mCa<+uQYF3sseN4h8MM@IU{pXRG_=-j7N4nb=K}e`)wb`6^7Kd(d*H zYi;+|y!~A~y;^~3q(mJvP#5WUy&=yh;@j>(ErTnOC>B8#{M`&mZ|eR%F=ADlj=5Dt zO!#|W&wY|>Z1%?WbNbBckWuSw3c7`rIDq#6p(@%c$h%B5ce%OL+hm^$bsz3VS<4c= z*YGB{uNikS_UEwD`R;25#c8f_dB={kp=H}`)U|k=yHNKU_i<52sugNepDWg{R>|`9 zH`do9@v&^*ouwK0*M~`A*meLdmU;LfCJxa(+G+e%a&)FQ!k@H8_x z26Nn%{WDQr@@j`IEH@^6G=u;1vE`$(K=C=+Q^xU&uf!n5)d?=7t8$tZW!JB~LKlF& z)eu)t=kW)1J5K8G2Cd%)&utn}67cBYl{{Lweg+ynCz=ApKt#3Vli$Z(%|(IfLu2eu zAG@*X?DX{O6@~8|XT6r>MGUE-x!pb8UF7*lv%bdXo2#>DVhg#HhwG)X1w4s$eAb8z z@fXS;thXUwA(+ijvoUN2C!>3P)vw27Bp>w@ZU#T*cb3uA{B~eSQ%^ypw?QzM@tqub z&d)D!ZAPy=)WU*#d2LKHy;Xett)Tn6LiytOA{JAjF-a7+r`0dU*N&qUgmg~9EwzkG z=d1HF%e^0CUX6*@t`2ZFHFFc04rckZyIITvQkcMIle()3wr5{4NWdELGx&I-u>Mh0 zC5tr^t4~r$`EV0fb>BPo15JY4Em+N7Q9N|;wN<;kzuSpeCA6{kbr_F4vV&zWv{0@% z-M_uSYd|UD!+ww9@#<@c`yeJm8;1>F(B8RY^!v{!EK2w?OZ~SaPG@onoZYK*09bg`C4EmHS_bHG8V5neB}Z=Tpp_ z37nhSk?EZtyj=e|r|%qs@x5`tlI@Yp^xY3(|2Opg*J=E}Au?AVxhUhgX!9ru93&J1 zBnAlbLthqyA6$@_>^r{B^_Kf}^IN_I-zQg+EbQ?EPg$qLo*N()UUw?J=bCrrZ!W<5 z1!mbp_|xl~rfOM&U!1{j5mNW68^wezy&*pO9aZlQ3h*_nUpgW@d?_7bSO+}&wepS( ztNR^zQ>E{f04-nX6PwwWYo3dD4R!3oe81Se)ahp|ztEd_9o1$`-Em^<#(k2sc`Y_j zqHN@fyQu~DmzGAoIN*mW1lFK}mIV8o_eUrh7PUTeSNvF|*c+?Q-dU)y8EVjm_)G54 z1n9(PYTE?I}D6vn$AKA-hmoWTC~1kjSYx^Ssg zlce+|Ke&)o7)s{v_xr}SXKS7IHjaJ!+2ps~0fhD#g-)rkghO4~6dQh4Uz}glVb?KT zmF!mZz2oe03e!X~n{OyxTwJ)lvKO)a3qCuqU+bBx1wO8Ax_4T`V~v{z2%K6ciLBGA zxj4X|kCCmWer@*89G7#(!O6F{WmD1d%QU@vDO2%{6kO_~H|^P@vny0uTquZTfp-AC zV(JYKOd36$kTr-4ETDZIKD|Jr1%r5;Cwmd0vkeym2Lv%bEiK}supzn8>`OvuH~I|K z<+qfJqHQ&Tsy(e{jd{VFy8G+bwZ_K2iYV0hu8@Vk{-2qsC>KGN8#Kx=8DPfdw6uD3 zn)mAgncw#`nkU1iImFyE_%SRyii;T!bx?8BD1ra9APTkNj&pd$xaa*d0cfPpBKBl* z5YCWZa$=ucb_Z1R=|gW&7YG} z3o#Tr)c8+{_kd&mh(%J_>}+$s@4&PzyU*N$D5+8pL7U!VAt43DUSs(K_ZoPH8sZJg zP9nb@4P=e$wT@;bID#u%VP^A6`oiaWm!L-d4H}a2_SuHE-rTiP zzY**APoLj{#pujqRhjK?7QTDLDlyLJClL#YO!Lo#zk))%{v43&SO`-JIrZyMez%8y z@qJ9>b>k}SVf0)6L!vCM37?Am9V_)G)*D|&nad)k-o^}z4L4Zc2X=Ur+|SaN94dTt zODrr9(E@e{b;iNLfli9e#=d|#Q6l$uU*yf@e#zgc`#3I{&98yoBcH3+w)YT+GbvI{ z?-;G&lXzi*VWSRZr}2@8`JX&F^=V)f2X4EKUGCj8=tY6kKb3^PGd!v*&vT3K4K0<+ zIj-c}c8RhSg-?8_PF3LYm7E)Tn;jQztjd^3DJLKx@Syo@H>xQ@Yiq#12cB+a80aPQ^*&nXVdGMKbtSMQ{QAh|a zl}vKm2A8Q$q;4|iJ5~z*Q@`!i=xzyq7DSE7q^0%fJ}I&Avlta0_XoX;z*J2v{1ZJ! z;2wYdbnL6F1-9{hlUl()bLn3vUr_d&@ALE8@V^~MY4ZP{CnOG2i)ILDnj&ZlmYoy4 zkpX)D;hWiy85Fb%RAz*7s6M@ehH@0AEJBG>>BpyNHdARvmsUbKuCMCJI<=%@cYFJz ztzO>V7-{cXEG%^i26eAT1`=Jg^J@wndf5SrV! zu(B3;+ULIEk6cAGP&{uUo1`;!wAqG(yZ?Xw4>rH!JzUx{Wx&ah%vm z7AaLiA)PTYuQvEx6RIvZ9boS8l5-WAtzc_gwBFWKs=zH~8B94`nWfG#G5+W(S{POp zgWKB+bPDNPp>BqOfG(+sn0X7}?4R-@nB{$82F&l{y3P0_$W-9u72{6NJ;v)4St1ju zK6o~6GItk#LLGk?l-CYxM@bSwcOO!cLLKjQHUZu^ysrPo=he?kO7i|q$8|i@9g>=e zpOWox*ZRh<;^x-{J2o`Vi_ETElps5(9#-y^t{F5(HP(DRgFkYyr)r}cf|RYe&VJHX zQS=7K7yE4^oXFS5ioFgj^R)n9q&J;j{g&iJV6<38tI!j(=o*lnCQR-{ogoDODYGkg z=DPe4ktu#JixQ`|_rTJ6#d7$xdgJCI7Ut=s(dB;7qtCUs)*)&J)NY4^h+{Ao1}FC1 zvzk?U1eP!wADh8l6}6;L1C(fa#dX&%?t%k87k-fiToc5B z{hf;ZBne%kE~>hT5LX7qOr-l&} zsJ&elj5xwR!uF>tZo+mDB3v(V(}PFk%MLX7U*>@bc}5B+o`#(te@s))DbUl|JjPGY z<6U|Nq2GaY6K@{T-1d_ZT8066#1Vg{|6ajZ{lwai;NcBKN zjN_fgxtoz* z7llHY`cFKxs}AhlAc6XnIT$0Fh<|TXnXAps*ynm?t@;>{EvpvTkHA2!2&-O2nNvv% zDjD-PtMMTCs9zQYuS#i}X<9YQHgAnM(1k7n4n^9{leM=#`KiUcFGwBr_Tnzal_JC| zrW0$9C#A_6=zru5OP`*Zfo(oI$hSZK+Itj9B8$i#A9&#?W?pyVkF1%4HcZ(t`_Vf& z$4thQQrvQJcX<{??6u71UcK#r8~10!OGcOYz6?CHtlwGA?=4~4 zu{Wg}9DRG=XJy4kb?yeT!AuWos)Hi*EmQHh_Ais}Ux$@+E1ob3yGq{wS*)iM-ta5^ ze|vM_k80TBxzr%$8vT}FC{wl?bG6*yfJDmPVK%RgiFhWeFLO9A*`C&aWSgZn*~4og zi4?h3VQ>bc=c8IW`Lua6616=_7jn{J$K#RJ)?kCf)q<$BzqbD&lIRyzpQm6WNG9rM z`JdfiL&o&PY?AA~lFqu|{^aq;+x6BU1Mbqr8z;|DI|;JWUHMGSA*;=&p5z)zzUW{4 zfV-}+bn?Si6S8k~31Ft0J`cbXe#9K{nZ4v{@K@E;CxiA3WicBM3A=%9+VniZzRm)M@CvDn@Y&@X-p@Dm2xs~x?+li2zGp>T`xOgk-Yke)xsp3UkVH3v^3yBt@YV4*3^`6#U8fc>wNR>(*eLMMGYUPW2 z7g)3*l3HJ@zLEIV6McM*g|R%yRuK;$(|o#)djJk23X#QzOJ32WnlO?kE(~tEJ z1s=V`6{hrG)hchHJ9VF9mgWoFHj*kgQM(f>Ode$1=;hGU-`~^bc(in31y<0>!ArI| zU-I{2eR@6tZTSQde0}vaa)espWW|q%T|mp;-VtEWWa(C#-93hgf}{ns)@``_oOSk* zBoZ1Jh40jn7{tQVF#xi*6TUvRp8l*j`9pn-JBUU>JGPbZ@+;1tcJ?kcqRtCoOVG=j8j0exT?V;z3LBe{w{}S0 zPa`7JPVCWzXNdD%(@o>y`8=uUCEpc`Oo!&$M5c)@>e42@PoWt9`6jPj z7P;LLV8VWV=fA#yZ zVi2mqVhVoQd*lP6nKT*Ftxl?=q#6iX{U)NfkT%W1St<2d-$1lrbkW&ES}5;xvvL|U zx6uI^;5z9F@f7_w(FtJek%!A=G+o`(M3{oK#=Kcdcmih!&;Cs?INi-6#WBhgL;*t0 zcKc9ng1qrM7GeKbO4k9m_NVKP>>>rjt7h#zR}bn%^hD0n>y}nlkA#KE{R4>TB-!(* za}_}nc|nT)!^f215fO$_OnP2rVPg0Id}pr%j4@N9_k~#noLvBI@(?Ly8U>A>cy|YhVeccCcWcIuSCxIh6*ka<73@zbus;au2s(|QMb+~?y zK?<@1a>C`RnyKc*p^Gm)Wvv^Zq1?)@cGyR@9ruiOHh>c<-ppxbOzxEu(%*@s3VR}A zHD{7c^rEeb=;z9UUA5Fq*0GG13`XAZR0ft66|ikqL3XE;M(?ZObW1}Sf!unnn#%W< z-NO=1C6Kf0bkr7;AuYXkuz}6yA%TJir7Yk4O~F%(egl#fmK*CbTyi{qdE5-YKE^-I z;Z8K8PUU7=dX1TC4;92;(ys+E;)au2J$j!hyz5KMJv#e%Z{{R9^GAE)?_jM?;C=Lh zFD&}+@DH0lYZ@O%W9z7}5okb(KQp$z#%#J5-qk6%<`WHpD{n&rJ`fHT>=e_&=xhXtZC88h})+`Yk$W;W<5F zfiPc4dP`mm#iBQr1Z!DX_;{=?C-ji6P5BNqD<*A(mq9Eb$-zQJ2O0TZ>04Q2kYgV> zjAV*a^Y*`jC<%bIMnucvreZ-(`2|T6*a-T&B+Fy*Wz2Pn!RBpVtqzQj36jR^8`n?o zXAl?2@4y+f&>~m>v3dc-1bnu@k>HJnqy&+*UV`@SS$Z?!7C8ef?(@ro?fhBvk`0(<0NobbZ| zgJpO6)2CWig<==Xcnm&}PZi51W9IGlW3k-R`Km@b(9LgE))DFT4zOgbroSmklTv11 zr)}3OwD>qOf5d#i@#|oZKUu=F+^9)_M160F>-3MdIp5AY)B5JwkP_a=^J&jg5D@vy z5mW|lnN`%nE-gp3Sxm_w{fmL-v%cU5p7?fOohuXz4rO=7hN9%JaMcd+jCj&;SfW=CI2pJ6e4B8oaF8{x{6~q2s`ZIF9Y@k z8TgHqN6N%5k=4gSk6X%XJO_)yv$;6sYVZK9g7bq?(&a?D;*6@RF{-u>sPx zDYeNImv7dVX4Qv$k~FF&XckRjsZ_({v}1!jNbz{l5@gmI;v+dl(s&;vcI@Vt_z^En z@w)*fr!ko?PWhmeAh1)2am80@-UCrO&y5N$?fUR3GuO#~>DR)$Z;@j?^vqQ5dt#x> zQ#P3Zm;w~YwU6Sx6ndpTfuu|Iyn;(5o@#6%AOW_qVky}>j7g1Pja|f!r_6SD4`?G} z{3-g742aIM-#R!%x@$2F;1#$Xhv`?Xu#C_C?8p_){uhySMsw}5xqWRof0?nJ84)z% z2EHeJHR)gIx77*H|Kl+FYglsPx;8@jKR@`d!6|3${s&t8;GoPapuZxyqG#l94CvRZ z>!FLlUG9i!H(SZOYtr{k6bvw{Y>;Z=P9zA<)`GVQs~{7N1Jf64r$hTS*rtQx5J^sw zclq)%-lv&4{kld?#EST|JsX)t47TF^!+gD%-~D^hR)5gPqt{k9BQ{QMM(1j)Dh8y` z6r037V&Y;_-^3nQJK+<6H161s2gR=pYDWMgPpldx1T5)P8dKmRr03O!>^|%; zFp4)F7bH#od@LZYgZS|ZAHI;k=oIvNwTKZ%?`e;S%}#~ zNxq-Hb5nva^xi6xo}XV^o$H6#n=5kHmAV=MIT_NgQu9(xn|TT{{3v#e!4sJdZfV_kt&#Au z;{X~(bUFI~iC|1Gz0h}SfF~#?I-TyXf(29eA#5rD(#LGSkRZ1S*X*j*`@0UwYrJ#_ zHtRediI8N)ZV4LvcI1ylF_;9nvSP%08I?VD?A(%`;c=&np}-!clC2a|^=o_@ zfSPS2nt$3aEOY8FM6Rx^^sd#3MvK{&G;hs7-DchdKiGz}RWxNV*Tr7jTkn3z@O-b6 zHclrHk0kQA{?YUx-tcb`iiNcyzK~UV(A6#O%$;4O@#KzrjMlc#-0K$d?;bCUIEBn3G^Q(AP9tl$9m|O8 zk*TP7>Y&AaS-j$)xRx{nkmD=RL=)wl8abkY8=MV0bp&~a^MjP)MUv4ihrFfT6ilU<8%D(CE zEf-{+Cyj%tcR<((7tSJBrJc22(|GoP8tExqh0!;cQP)tQJa z47pdN&s=vV291Rh>RIeS8A!yH&1%xq_A^lWviE$UU%5bBPuGQuAQDxs%-;iPo+Iz% zBXdtImB5(9B^Uq2j9TAI;jy@>Tc#gOBz30YB;#M5qeT12W%VAjwgl;MgGQtAi2na_ z4AlkTJy-ts9``p+`LBkS;5M~~e0=xCJU29EbLyr)TR}8P$E|)pdO#nfFnXHJCk_0hv(oX9NrH5P6y$%;h-+N7jS5OZ935kurJ&g&^P&Mjb*Zn*{mJyYSu-EJLkS7R*r zKYow8^h$Zy6lZU@=~CB7McyUxWVthehM4PqO&DOw*BWZfaMhU}x#8z1k?MWNmx|>p z1W{17b-A~tR1qrNSIbZERH=bAf%rbNNkfe;6KKaVEmH8<#b7kgyT@qn^WGoh(NEX; zb5Y?v5W~Xa95WkprFLY>J}bHkmaVxOSh0i_T5a$y=PD#o0(N)ual`taMDOc%P^*;k zhpZhvX?Ov&qnah>peV_zz($upsWgbYt2HyL&%=zarsN;@W+xiqDbX zi|6K3TlWMwbr!aD@#A#YyL1EzQhx`GSb3nOfs50W1+I4!_TI_C+WDBa-`e53tsv*= z?)p8%aZ4f2jYhLMFksKNhvXd#H}r2gdk`uDpo*K~bDETQV0<$CNSs3A!QfLnu)vV( z=c>~t^wWHzESAsYT-}1kcKCj1asr#)P>22C-pO+^sK^Oi0+Tu&ULaqDq>uWpw|WnH zY&vqegMBIAhThl#0alDlM^hz}=^kPSTc3S551THuum(AxZR`;&bimznj+~6Zr@d;e zncg=k$qTs6N`Ja{uh_ejSD&Q!)P&A#X&Lh0>7@HHHG_Pc3ZGh}TSkM%Kze%m?`I-o zkEOF_%&#Sw;>}FnFt@O{M@Q!z=5oAi_2kKulx#E~!n1JSkAaW&mB??f`#*i-sg`rQ zyo~X(5X<7!JRN5eEpD;1a_a`MN z|8>4j-*c(kG<-sMvU=mmU#$Co0^a{x)&5_*P6~*hBYUpMCHuVWODdWf4P#e5KJ5C? zVb|Uk{9p@a6a*qN%nqEl%_6`c7+P-J8I$UzyK{{@D}Nnfu&uLX7vTExVr_$EWLMVs_3;C^Ju{&e%vjb|bQ)&U3Zf>%7+Ef?*jI zU0r8AN$@ieU}I;v0Qohes# z_H*GVS}V~>2d;T45*ymmv%BDh{E20kL}>&(Q(xwDnkL&_w=lwDX=As@wJ?G23QV=~ z^)zDzJ1Op?r!&~4v-dYAl2v(7Pj)LVXchpn4dqp**lYa_b!L8@u5w^#t;WD7_wJ46 zxI~uAO(ToLH|EYJ+mt@O&#(IaBz$5Od7VUgHIzf)xsot53xpLoJA4<~i#{5nYCUQ{ z*7<|AQh4Ub?`H;5kYLh|1>f+H0$Ri1jj<2-20X)WlGw5b7q;KzdJ=F+=fhC;$0AKo*RMypnMNI;%OLMbUrBQ1DPGv z0!**ZyOqK;B@2ccK}(w&lWFDMuk`~&t$Q&0&!XLIrs3wFJhK|&9}Wm+t2Y%@%pP5I zb7f&cuaSrL-7}N(Q6G+GHCMX)%c!AvR;i@8I`dxn_(8fLa1)LFv&_=#FK}ZxaMC9B zOQ(*%HcxS?n>z*%MhEbI9o02B<4aXp8_Eqav{sJPV!MnX0<&=etU&V0vC8kSEBKh^ zWE$ORr|DQTR4;bFB8Api6HO<%ZA352hA|ZLIwNTy*@|_V@~h9D8pMkycGb6g!mKTp zO3g7&g`xn*(;>?=4t2+mEboCszPK)ba!-%WB%WPA<9X%E`#VBx%Kt`_wy&jChc^x3)u8Am62{iszP(wO|6+h9QcTzl} zBv%+3M;WR6JgdA(NXZ<30rs5n(&c(EWXNSoKU$-ULjh3i?KK|gAMqM@dA`llYEj8C zM|hSNMt9RUJK?q7AJ2tR-5efhc%qnhlDHwD04m;$YX9Iw*e4(6 zIqR(@=4`BT3nht!z0afDwx$Xl59Bru^1L}wsPjE&nS+6jU9mjYNAdHcYVD#bnY(A%n zpr{6<04%m`)`+RF*vDQm&9z}?mMMo|qob;#483?9*-hx3Kgi6EXOs%{cOr!b*s(mF zAvKa%MO0dOTIknSxyZHv*prIv!TRx;eEgIb7LQq*PE{BOKjJ|4mBb*Ra!t;sr%56_ zo=2P9ugBp~=Ksp}{1Tt&VP316TPA_;ffF!@f&NZ|x1%|6X`b>36*LMp;}tW)=Z^4O zCjfm#rSacbLON|2SEiZJ83&)8Eg)Xpq0Kd7LOc6I{ zwFOUAc4k;&ky^DQVD(D^^?QY)oIB)D4y`}r-!rn*wm_mlDdN6WO)-x=4kazKz;>Ki znA_HcC)&nz+>r#zaz{gj`?FScG{C%QK$JiMwAO&(LampO#DVJ7?IphZF8misqUzIj zY)dTc-gaF#GlkG1fMu|nRn8C7d!SQ$(ctgKc{^hzMDVG8>;{+ICSwy8 zhEN#u?6)#W_?qz4x|*Ny7#lJD#j-HZI5ScSF5$B9W@RcOHCtw(9~B z>5JHqWj~9!>xH4KVu>Ufh3dx6?3VE*0poiIO^hQpJ>$QLl^Z5eFh7Peg7@s?7;1ytlUSI8Mn|hYSs>Yme^<9ySsn7<&hBKt)6dr#-r! zIY0x& zb`o)}y-4267NPl7a29=!Mbq2ug^A1G$_Q8`)Y?akqhmxSZ{n|k-R(dgAql4NvkZ$F z_`^M7`u{vuJ|w?+HYfM>pQa&@eS7#nb8r7B*#8r2b;7@zpMwUy2=9i}x6<(Jucqx{ zK=m8*d+&h>puj<-I-PaCx@H-V6Beqd7N@+;@M!cgul`X5_OO#=bZCfc*Jk9bLx|n> z7uaPR1^ZY*5=rzid4AL|b<9@z{U1p$?AT%#J)SEucaHj!9xU$9oW-**JHTDHKYkZP zTeF9*Ukcv47oMhp`Yq497amVl8Kfp$tbBeiqFX z)qA^vFezW*dX|Xv1iiq79U$IRayvXwW6IJKDzz8?IJ%`9i*56p%6;F=kJ7&$q zcmxE`UccVQ3WNs9496{E_p7TvWPE(IGE=QmNae}NB&0XZ1vdxU3Bxf}t@6kO zG-fLD_$3=R5P_=KXg-n>MD~GaEim+7m`=DcaQu0INvlWMo-X+@HOs!$RS!(yHCqKW z9#sOKLMl^1#~ok4%VVY{oGL6{o|3(T%BnfRMYs3@V?UV%4U${D6hG~wdcVVXTPlpb ziY+K{l`>`$d{G~5ljiMPP>x0$rtJ7;UrPFVdRkWo(#H_uGZZ)6V25;8!eFIiSO*B` zE~tTPu^>gVH6Z$}fKWYk@zu~z>HyN^O3zS%Vz8o(st+P88|os@+uReuQ;xY2YG+Ef zUQf{ujv`=Zu4$KiOehDIJ+A=tLCmy^7%BePYJyD7;TkQdtE^~u?)8VSqfU3;d!Fk} ze-i~ah@nA%V65Ohw(KTIP9E=NS zbm<_M&0xk;Z|}N#K@+lDq^35y#@q zAd<+`bRV`?^ISW=$dqI>3pE6>rC(yzG{R?bXeM!uY;yv+#64}DRObkLGtK>{Bgth` ze0<6}uu%#_aqE&O-M#<#`)6WI|QlqZGxq@=6|j@v&!U(H6x;} z#Cno^F6&ywN;A!R;ys?1N2xa{f zzP&W~Np88w_Q4&eSAJ7=m__yzeAjzRoX#PlKmR-~lMJpB@f;AaiC?w2e@-YEmf_Bo z9Y$t#u8gLn=ea#sDuNG`!Y$lKsvf(6C@!B;&(w9c8T)%(#?4`z5c9e7tFt-E6XO9E z)Td2gassZslaQMF;KiC7;5^~2y3Hwv-}ai#cO%pj*({1$}L~y!85VTsDs{)2Bs7bamg;fs_i(NA=iIHPQK?)?}y-AZqPm>yP zy^;t0Him?H$E=wZO_X9}UK^Gjs9eml++bcGA1uCRZ;&Fh7dsK4@A)cZHvThe(hcW}OY1oS42mi&OMdMBw8LJ>zS+zWH}+_@QAL6LxN?v=WJA>;cAF*=r5cH~U7^KdKd-fjKbAmP0B<)lsY!~=vi*00AYVs2qBr=;ID z&a3zQ{-NA^h0rVY|maZNOBzm6sEPU`KzUmLuzIe2E;F--^sJ<`EhWvW;xjWag&HC z-Rn17y8Dj$(B9^UaXHio?$C3ei6D~m>YVgC*m+z$J>?ruuy=E5gboX7aGgsu=YBbp zmburQ3mAX9sAOVwmta`FY~pJBLT)|+eMryr9U*axml1I5do{>ALd4MNQ&AC+Z~2hQ(0k@KJ{at!k|R^20gV8UB#;HRxFmes;?NT~I_5~uo)o+^|DmNg$CXm*bO6bt9a#MykKO_WOJ}$&tvf*CRN9P9m~5NOMgp_Tj8ESj2Xu zaI=fnTr*%vT^LZGpk?`6Dblz`%yfAiRjNw=vY$4#{OgCUGVC1lS;5X2h#27YfVav`XsVF?hSMA1N1%fkusDHS>~D@LzW?O=0S#K=~8 ztVBmMR|aS7;LJ2x#FN!`%X|K3hJxdI>@3qVv2K(xd~VWFYh|A`*8< zes93`wCwn;P02268Kw39+`%D*vbgisVg*I%$#89wTsUJdk<2YE$Bo`!(b@T!<^+mx z+_Zi9#Pt}Li!+}n)G&UCILEacGcz+SRKAsLaM{_N(dP~k=huORV{$hAR;t^ET^a0z zuaA$wWayC?4agq`c5()*PD+B>d4aJCYG5@JW90sKh~PQG!Z zFzL#YYY^s(K=;s~*ui4T9yAgq#V%z zi@^TT0^%aa=#ETbq|o{;;Ng2Xu>M}RZ$(X*CbDn^IhB%0c!Da+okPyhk*q+w2jFBA zJP}x)0rvF*xC=-tU}5iza`IwKsPp1TZq&q|u0Vd}vY5zZ<)0H(7VG34doiYqOG^Wb zg!h@NguU-k^M}pW>|KdVHqMGNHXf?5hnvmWLlA1+N-`YVC3dn70VH;j?bH&}%r1P% z9xpGA5M#0=WrJU}v5n)gQ7Lo{)Cd+l2ISd0>sb8fnx`#mnjoyl+8Q=Wn7t`fqI$vm2_^K<;?uB2bO6>YshbK9Kdv#;< z>gm+?VHz?B*JQMSlTF3yBCn;ribqvifOw+!RdIPR4=RXxSrs3LvmMCkAn`j%NcS8R zQVtq4$ejx_`@HYK@aisPp@)|%C5hMBiB`+-@V%>7uRbk1|~%G2?_ z#AKAVk@*F4W&40Ju;^e&4bBChH(xzXvZbV)ZFN?Ty96^-?`W<*^>efey3?6`DRTMT zSQozq!%3=V$r7`((Vu(Kj;bf`juEdJTc<-?`Gr8*hN`rcYdD8*TvqI6VncY~O%TG- z!J_DzB1rm#I*hK!wX0qhgOQxJxz=GwjrUT~(?*IuQxe#3jswGfqVyFkr;@bwThPHNh zb7D4Ee07}LZz44PNSL2O+Tf%m)quD{?_On)`*&J@T2xJ^M1mWd)t5C?zMA2(@r;kY zSMKlHM8PjkE9W{EB}d84JV6JJrfaGVR)OJr z6?)XJm_@m7R(~c#^nG5_B;+j)50BnvAV%!AS4hC`1!c@dbywoOGrk?BkikdIx%w-D zAP&DPYv;P5*vca|mis1+Q!PS$MiJymJl^gEwm}XXCqt0?sLc5K9AtUxcJJ`f~7iudK)XR58BM#&-iEADP? zJD`>5MccbuB|ZLLK|ZJbO#a#Qnj?r(Ww!+&%#TH$;schpsm1dj+ce}IzREs zro9}xY95$bTy)|*umA9V@b|#SO4V1V?V*q(+tuWv4_cI1zS80V#b1@fsEe(5zAbMC%^U(F>`-T21)Nt^UuyPbgT7(Jn3^sZoQpgNX~vG`@z>1>$%TmmTQlNmfYhBOciL}i`i8V^h+7_W#>2+ z68zo>DQ^o%sRH@Wm)h8$b~TEfn5l)9;Oj#Q1;2P%iU(`+0d-pGdtI3G!<}6GDdG;UQ$rOwH{mtfDm4R&*gwAX;H71hf zVn><1;M1z@%DmI2Q!h&EhzOJ|X5c^(u1znQNppG1((m#4+#eo;{l5#ejr)EHb7yK%|DoJ=!5hA5+OO~eJqYaEdHAb0|vdD_10;xO+lBLB>&CHX}U zN5})?CK7w=XT@oVesgRF6!Tq(&((6!iTdm%Q`701J>vXeI)&E?pHVI2J^1P@X6jtY z`K)g@UHnp}K2wb{`bPHi=g$%`L~(dXNXXxb_?Cf(m0sJXpFe*t(jG_`3J149{{0zg zO$L`jW5ow!DD@MD|K-#NL-CoS^vb`V6IcJSN5Cg$_^*M+vD*e^fnX?)r7qL!oVaWy z=Ql4O7|y~9tFb(SbQ|BR{~4AbxP+YnZ>AEu*rwDtZ*Z$nfbx8Zda{4;wqCzXs{0%s zKE9UKc>!TcRsw-Z*a{h%L57Y$>fLS9Arc2`M~>~fpL;zIQHQQ-V5e%HqoG8?0HPzB?Fy0LuoS(^Kdpw?|58obUJga`6 zW+##y0N+>6n0Ggnu*oRj#U%XJuW`CnK^q;`#gZr@2)H)rxVh5JOLG^p?+MG0Iue8@ zJD&YsB(7l}#skeJ;7W>`9ur6Z^Wd`B&TK8HW}pf*yzle-yE!>6bbV$GuNAS(yu8F` znyf+MNM7gJYyHL&WO}i(t-rNNWB(t{z5=SM?R!_clon7@k(N|Cl~Sa;kF<12w@8;F zDF`S6(k0#9ptN)!$X@w{fouivLne8(ThIQb!ipR zRt4(5_GCOW!!eBq&WkgrOO&$kUDmwB20~64n<4CjT!NrWK~T#4gd<7RH#k>VNb5^}DTGWgR>VJ))*fC!tvH zDBseu@KE+d=1Ezo5^66Emj-7PwI}1?T|_!IL0KK_`C-`Cu9a%`TWexW+RYnsSY&8O z#15A{3JzAWUUH8c%2G(0Y%qY}559P#cxHjd*OB-tC8a=r2vl&mZ)UqIKcWJH8i3eD znC6$Y^$>i5h~I?Pa$a<+w9bL2b|<<)}#CiebxsLB`#TqPSj*!)WhA zaGxkBib|@jCnKh@&**cp;+^KHo;X}oX% z#Q?1lH9J+EYKBLbSybYoQdtJpmQ)0z)Bs>D9||GmC_lU><2<@o!SwCE!b~#k_R)FK zbyH434V`ijLLq$i=SuPbh#>Em1GU&&c_3zQ7 zmwy`^-`?;deRiXLg?)59dG@3)Q|O>%6XJb}mZeS+2#wUWg4Alg(^W!yq%lEGDSfvbf=JGUccrz7c9eAEPO02Q_O$ucST zL#8O|nDr5CH+*ClHl*(-4UZZ@)P0>rT_OPc`mjACX#BtADc^4#C|YUBICj{*Ukg8l zY3_90wo0nUO>H;{A@pHFC?n$z_fry~FwDnCt<1eVeD}qc8j%<2rrW=}l4Q$lp0L2t zb42ask8;n&ut25L_;w#NMRF-lsmK}CW$-U@v8uA3P}ODltzy<2r+cP-caL4v zXy;rqSknhdC(f#MG~)rLo(~Dei^H4&)^iHe-1Cx6-n^Mw5~hxV+v{R>DVlnBX6uav zqa*c-@w=>-7r9o1%D;2;=kxms_qfarzoi|obbVLV2k}11i2l}awoa~?Idgh}E_=4^ zh{G0>gVMEIt$DGmGqlt3Sx)m5?%8|nDo_tUwNwKNzL+zLY8BLO~z$9|;+sMBf(3%tM|_)=OLbS91TlBmHYN{-v1Gtu&m0nCu|6n@=58O^qN! z4ui3-dauTZ_fUF6B^uUr5WD7RGV z)i`q`%96BAcU@CZrF@xvAl=f^hq8!XYZYlm73WcNsD69z30`<_X+7Y~l!p3Vu@vSFe5C&fmh_lE(vZu@k_OV-WD7@AtTzA31@M4ymke| z8MX>WM8_(e-SE)p-g^7J!;X%6b+;_sw@>depuIoqc4<53fy^zo6K#u?imX)LszaX# zS2Xv|ryAJ}1PwcQeH->$9C4hy`2IrUOgO4+;BKXQ#jUsl`(Xx{a=Pg?&pb}PG)}(b zLHdyfKmx1FNjH#4?HT6aQET_K!&@Rq+JDO_J=xk)deY+n6R_-I6I)t(XsPpIQ3yQ8 zOqYsiK0n!0!#MUo#-MV&B4kr4^wpA&M3jeI6z}Y2)N^WM{eCCB=T&&3b^DagwGFt` z5pH-5a&UqMg?CYfqHsdbD5yr<#b;E8II7lmH_MIoP2D0iX_BovgQ@tfzQ$@7?~cTQ z!^JZ!NDjP6!Tsx5`jN>7QGUmr-(yv1SELWx8BFkx~gG$K7iyk<(NMi<~KUT zn9X%Mt$Ja|7o}FyFq0?YXjAGu!KItvL_AtN6$tY=wd28k*1@~z&Xy(7=@@U%UtvIL z)e@WfaDByu+Ud3HX723Mme!1f<6hV$8uz)|t-E)xe*OA&?SSw>~CJgFUkXxQt znZILa$NGQD-J_z`;smfwzl8Zhx!U5eT_{CYD zNl)#y@x1Hc9zFvAQM#5BW^{-(ZWeAueVTCj6Uf151!9YyJ$^|_K z$Crm+u#zc)dFwG-M+1_IjCM$3CKn@m$eUwa&0{F}6%uzlztSGxewImC&7ynQ@^N0qFHRFj zRD~o->XJkFgSH|s@=$kpHX~wD9ly(<@<67LM0iL0D0&fRuhl-iQEE#bATvr9CGaGK zY@|fgP-=hD+zbMOOXt;!_3-u5fmg3yJ>B5~1pd-AfV8suRZ?QKU*C{M(yVxG6Y?y? zrD7{Q3cVpDoqDUe!)Ug{aX{EiNuS~Xxju!DvZ+TQ$FW_Z)cgLx-bF4c8=j6mdXl$Z z*24aBsZYYS`q`?f8KE`~nEOex6Zz!*mA0>Z?>@lFoLMqpknLz2vVDomP&1bvM)2 zA->&F++ON?lN1Arcdu=D0M?>7{m-7E;+O^pB}Q6OOWiQcY1c#aBKCA8c7eM zkIErW93Fi`P?~w}118UYk9)shy_bBi2zg zi((=ars#oUrfAR%+ngLG0>2(6a*F0I7;e3MEg}=cJ5Vpx8r5WtsStzttFBoylc;!f zJezulez=sn13d&csjX`gtsp~qj#N?RohV=%Lz!tU1nQY{o=2P01o-$@PX1v1I`%-N zfX|qg#9l%`#4w4Ok^dFu4*v0Hx6SV-opUafa=WH97vt?-V~vP2%o+t z%&wYY6j8x9nr9TtGn-t=FCuxx{}y+WxlIJA-c&MR2xy-Sclssq+N!6^C=u!(>=(+g zr3l#7M!#}Was?@kxhOBhu{)8oXBpBHk#~hs6&JhHH|9Fal6b6NIPq8Qkrhw{KTKAS z+~PytbQ$G5-BZzCFNSfpyLr{wcOSUV7zyG+v*U|z-MZD;*Hy+y+^Ol{ShgH!SQkF9 zaotNtcXmcUxn79w?kzkNY$*W+2MVy2T%Md{*Y>e*#(oOB$!)P@FyKmpJ!zSVh>U^I z7OxILVvTdQq9|fRAHKV&(-$z}SH-WUFCj#{#l4POR*0u^WxAF{f6~m2o{)mrB(HJ8xsi95nDuKb1AOgQ$8YsQ zs;(sQqTbq%+Upcbz|5je2dp$Z**$%srf+zrlG!ThZYumN3-|9O;2Q?_1tXG|wFCIe~GgGy@JP;J4lle31 z#-uAn$*0fRMaa)?Nkvj*ANnkMycp9G55jFLdf$?UGu;w|+p$yOy!`r^>$}YOtd7Xm z)9);=;gJn+Y~i)!QWQY&-_WK00!*9q1(D)u)nXVG%|4ykX-DpS1NTTkot?(V{?spogdpD zOxW@6A0DcoF(2uP#4A6?0!_k9I}M<()6T&`nKpWj_W_^7Qm5SaN4OfY)BO!f%DCHBg5C^u~_;o-xZK$SH$w0wNWnY9JcKY&(t zw8-aE&08Ji&&GUenNSzsCBGXk4(_1kb>Ridv%Z|8lJRBsVFeuzx$q>-ojUW&%a+3w+) zav#C4IaS=}3w5j^;#C2cO{=(!h`qY%qvmJ@s8JI`17lM(R|K29ilNCo-gm^4yXQ() zHIW-iwMyp4+-za;?*x{0$UM^djIKg)qHAdE!wsh2ZB>z@=-&)~{D%G;tF0_W)EUIH z^LAvq`&!;fHGFLSp#1!ec`UQqmtrI7;b%(ZPTHgQ6sp1lXc6Gd5EbQ(-Iu!V>&hbt0a3!^c_q ztI|4M57)I6X|fnQkLrpQeWCV#hVSZ=Ur=RO%2e@|<|95AmR$7FDb{{9 zu(a@t2E+v(U{T}G^b$pZ^q<0VikDV9e?`nNmBNz0#t$*T~EO}w&U(B%rccE%0zlS`+ z)9#denmdh6YoZtPZbvS>bOw@*;1OR2DI6L5IovhC0n?L9{#U>VR^T6FL* z2^+;V($VA{xVWSk@<+e6-ANmj26BwsJ3I3>%o&(Ob56n#%bE2MhXQYkd)*Cf*BtK8 zvJh9~&8i3$@I3p9zf7)H?kc)h*OwG*mpa(f5_MIo=WO!5bwi{DWU;>!4o7_PvOowy$rr0_O}+f^Zuvz$C@2isYP_(Av$4h5gNH!0{*E6R&s@_d>=_(poZ@+r??wUR<1xqkUHU27JwcxD{8SH2_hT8(1 zBpPoP=CZxEv@&IHthNmekay|dVAM(1O(9=eZ7veA9xoy2o>D_9OB&(sP&Zd@Suj=h zw9zfJO`45yv%H^cy~E$EFJzQI`IP;z@UEG@jx|U3AaQ0s4%*t7zQ?up-Bp|x&eZ_v z?S+K+Z9pfPyY4!hQ4Z04`L zkbN|UGp>BiR$+MV(*E53S1w>sW~@MO1P^xN|EO*o<2CX9_1DtDm+~hD*6W z50zsCv9(&2MR}e-mvHWfODF1ID9SZPNkMTHE|#?1n|N_NHPu!iky3YU4bidS*n^c=K5yLiW5eH1hAHh6B#re1a|?QX{1elb(&*OHo}aOm9x1znaL~V>?Jg-J5?alp-slMP9P*?g^7+!9u7?*!wOxk ztwN@|XOy@%8Fl>hJ2au>7zO9GXIC^G2_dCPO_V5{Z=fpf#Z=wEQAfJMwX#>$)L#2a z`<|b8Hz}X{q%7-dyxLs|V>b*woT2aWgv3m`(n;T5a>9zrH9pqpIh*x-S#A5dy%OzB zQ_@>9oI|Zx=!fc3jb%%9HJD8y>REe zdY;05OjG+wlI7>Y8&MFourIC};!Z_fw@;PgeQG{pOH1Sh-!o4&+CMW= zGFSDQ5}d!4WG|(EB;p`SFT{&08g(|)8y4%c=QS09j)ov5X)(boE+Ib*k-6`n3Ku#uV{zBW9CFp=_#dWUDuV{n^rYT}Zjy<8@ zPWrLvTK;FtuR;1$(Lqs4aVY{$IaiX3Kb&i4hQRbGN4!&I_tM;vkA1CS` zBo@ECE3p>xAm^Xn7i=;=@W4Ng*CZy$=kp#}^6!SDC{7k1>Alr&F!3i$W#WPLj27tO zgvzxyD}C24vyB*EVH7e5a)!jen3(~2eg+ZiqMn zB3lL9QIEDtObWV4(MT^qs(IZqQq`D1F*s$r$~$#|KVAnwU~XxiV}G(5(X zP39x$O%LmBYHIpoVuC#)T5v2G(k(u7!>@2Q(N81A6$@Zf)H8r&;L{o_z|DvHhRGJo zjy)p9M8F`S9FLn(f6_F(Yai--gg)gj%`EK8wVAO#nlaWO3MT`At=4I{^+vl?W(Pn9 zirhCJyLwSA>N`BqsAqk1{yi0nYU+Nyz03nB%%!1mL1ATDkr40dRn#_mhv6I1)Ty>p zl>|a0ih&Fskq@3 zUyDd0<7$0tZgRIejs!u!7j_w!;8Rk=givj#&#K$FjP&rFTpKq9jHV)1zEQ^!L`8^+ zZCQ|=tv{2~j z&30~Y8L~{E8bMfnaNd0F$(Oy!2Xk%@*kgt;8W3axa-04yWL8hwl&az9djlgLcLs21 zaYBWVyrt%yHut{|?Q}s?pB~3#Z8z5xGM;F}dmS8IS=NUgsip@;C;~0j?MiQ2%}5{( zyPfj_v_ai{xWQV1S>hg@m=rJ+0tI{>qT8ml?IS|e6ybuV`W@$^PB#}3n?U*leH4(U zKeIqZS6?-{cMVoP0<~=N5h>{tG(5VL;u_GP-hpD1JN9Zx3l8WUO-g;bONb1@rgJk? zi{YFQk!g?lZ_+94S?D^Wz6bTn+v3Pid9WtP*S@5o?PP+%+kZA?TH#lgcg{~pQ2laKpoxT#kg&*djO`rkLM~E48Sy`3 z!(YDWkF)Ww4`P0piceREzbkaTrR7&v&Uh+W_12Jk`Ek2qrU()KYiZANjn@F!7N`MN zQ7ONt*_xR^f2CZ5c) zBE1SQIJ;qhAb<>LQGKe^*A{Fa^(FzG3{~$@ZMgJ2SYgx!u& zQN;N@*SqGE<<@?uv=0K}uSn|2*n*BG_pN@q02H+&N(7 zy!?UzCQ}tB_Q2S7^nJ&g3g8P`xJUFlA$C9h)V5dLTd3gqXW9?5pS+C<&R4*x+HG4i zF(D!N`1ttzVOVdq?vkO$x;{m)U?4!ZRv9#WPERMipX;GkZ?N8n{q&vCip$ZKFX+}F zNF+g-nOodi;!TtVOVd{L%!i2^8-V_On9SsDaJ{c;g{PPZ>V&RDB&B)edT^A$78yUi zOo33Cq%;gEe9K%Vuye9&@U(tctnAT9r;(l6E z!cDgnK8S)DCV{f*%XkZs6lwW}MC&-+hm9|Mg$R%ZM$%&H7CD@Fpw zs!uQ#lc2KzpjyzJZA zhT!wLY*Jk67s;jw-M}GbJ7<4OyCRX zeSLeLY|DqVjbouN*xJ^(A6V{m!+ANayEJ6NKN`PFrAP!|`Ab0}4r>0>)ctV)a|h;d z=-^nRGeYm-MDo1qO_x$cfyNitkkUJihz=(JQCwPD8jsCoQo+E$5T~|I9AMG_%(SX~ z3(6DM^3UHUNCyJ#6t|B?Mt#JwdK9|D!OJIIgYDMXT!karuZkKdRPdE18K0F>qJ3Lo z=WQ+W0}^|ppu;}2!p*N26DdNB|A=c9QqO?RtZ$i=7GsG;top+Ad_#9U{tUSqo&hI6 z6ZZxz;^!I?`yeSj|5ch=@|}QFxEy22o|1X-xVIa7p!yn~-lO_y0ZTvu|4o2dnB;6R z@&)pjK8tkcRw)3|b_F_Y4KZ9yENEw+%k5@)Y@UG&zsGEFv&FlCSg3$tuJenUFpI8- z0}eHluM7JS5^p+Nc~ziBY*I9g#92!j2MJte!;ECa)ja{Qz3q}{DNrYJlT~Efr`J2H zYffCmyi&E*Ev-bCp@H;muvyiex7i`w9P4FZpy9#V$Q)iaU!6GTql#aSlK3&Q(0~sh6HmBjhHGeO7-~$Nq4Lv=w&Srn z(SNh3V+}0DO7DXajbhIe2chFR|Jx8m?mj}_1e8WrhqH;Qoz_DE55|KBQo1XcLjaA- zeB)pXbI_+SgLfu$;b6NP1s?a=YjK@$2SVh!+r?l%-;8E#W(H-^aC~XvHEbde=)9x7 z0444a5IHG`*wt;sRZ^wWgLNTCDeET!q(|+7dl1o#Brl)DCN~|Fk0*-l4 z4z^~g0Z)_47%oB*g6I<iSS;GTEq*ic~Rt3w3 zRk2R&YVgba=nVdA-N5CLW3mthl@~4(C$?ipE)$HC#KFF(ptfd5PB4ccTHGgeZ~v7G zkh8H(r+=*SBevyz=i52POPPJ=Cug_cWTKe1_Dz8DZ!&-Qu-Ru^^%9qOImh7Y%5SLh z$$WkxL<|elF0;V5f9aEFKlvFV|9FmVUd&GVp962lKuE^#aL4^cY~prLvCqqF9(t94L~6EDv?X~6`K9zT8n)C4|!_<&DD4NcO|8#c-@%o#gK07=jt(>e`Xcbmt*u`2jY`iU731q0LQ?5}8vq_zJ2;eHnM zF#T>T_@?VYD(#T&nf8i(2gnCcAKMyS8Gmrg<1wsY&x=CZc+7u{bmj^8mHwEIH2w=y`4?K2UsL(tSnM1%QRT)m%x6mc@h^*R6l( zIXPJ{CFly{O;jNvA;lb3rfqgQIy6pB&g9tJmxjcMiS%c<_|Jp?uk7Y;i))m-MYDS# z*Tnev$Jr3EbRZ=HoNkQHk9X$a@kvQ%?4xXI zSbjRiP4NXP?a$jw<*aSDp@}2m^IvIB!m@z^`xp@*$O! zSdWta^N;^e&a%=RRieJ$oRRMJPjewgM+O~cjG)J7NdW}l%@4%1-C&pi2KVSCOeaW# z>tFm{BZP+L{oix&huQt%ZvJ)D7-hiy*<=bc_kSD5cm*hnzrGDz&}(=8jC&8~`e|tD{uwDazaKy;H8;&qboc?d$}K^`vs8xItAID2 z{?gG1?SB!+yn0oYSNkL?iFV|t@ivOyp-K7|JHE8s|7lwQlSs^p98(B{ZNk*EKJxxB zdver*ZzMeGowxtCh(>xOt$*UisdiMxrxg|>*l;+!!k#6={O`pgc8i8a?w_~${~E`0 zRuBOrSglI_TERbj1Dpj}x$xgMfZzAqzaQh*n*HAdSlBE`uM2TtEDReY$Q1;a(EAnu z-zZ}Q%>7JEOn)?U-hL!jedpgI1u%&JkKr0H-e1$RZA*lIa%!9Y<{H>@zhE7oo;J6& zNeTm@U1lyWuHjmtU(WF_KbRyZw)@W>{>MB2FJ}ACA438&Y-0w-dp21^x&-7WQp5nX z?CWQ96`_M+l~0<*w=ccskE>)GL9=d3N(wUvz}N$V-akfW60noV{=D#yIR_tpV<-9R zrT>29|H7LtJpr4F=T4{0Ek#Yt^P>$4PD50Y(^cBq!wE}FOw8jg@;g7*Dlsy!+`8IY z><3RWLjL~M%Wb-CTgrOLN;>Ss`cJ{8oz5)zwwu@g~FT=XdNT30|T9Pa~>W ziAjcNh~Gg3T`$moWcedJ@`(U3l}|*x1Xz4egT%@#MlO*ys`=X2+1S{eKN#D;rlX+* zXh{(M;1irt)5f6w@sQxdlm&7$$GupwxP&ba)R~W41O+-=oR*V&h(%AbYldT;@}0y4-=4)ed=E7 zdSg)7o4_glc;dFjYy!-Ove@g)*>nG^v}S{M9p*mbAneuw7)Co4EMrsCg)i@KJ5yv{ z`Abt!+^xIb>x{!?bE-klv_ClnNV(?j0zkto#{lTZew%fz-I-F<`#ked=dT@34327? ze>weW9G4;$9JMloQh)ohv`2(<&&HyJc7so;4S*P{1VBWD8jEiE%0DLkpQGM@a4`#0 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%0AW{S85jFGhVQ<;GXNw;Ce@F9yOf1IsL9qf; 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Ø^a7w+MWQ~AUT6F0qsDH?N=k{xEE_T4u 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

BK9tUuKddE|QU4Xbrn`NJMJb62yC~i%P0v&1Vs9 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

    4GO?uF?uvkWBTWL+DzU3NXUu|y4mn% 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

    x7_E)dUz)p3O))tV!-r5QYwvanp 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ͲE_EXM4Vi&X%JXl5c{U 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%0Dqz2y~2)l6R<4!-3X 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

    _M0E8tgHR*Ww?u%Tv9+Oc^~%#<@4h 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%0AeLH8Qe6K}A=K!9&zFT}gq!}Guh5=08m`{O@ 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%0Dx#;w_MqO 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


    rU8n^5$ll*eilcJJYlb7KiM_^ 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�{hREVm9T+(R&{o&yDw+T1dHJs=hvAS4 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 z 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

    !!4`2DU-L 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

    )Lm!Dhu|y^MwZL=`>%)p}`x6B&>hd)rNjBL)O7= zQ7GKJEncx)%Ew-4q%AwRpB3W3c6w*Gi%IHl?NIYyRiy)^<5}R`#Lu-Mv5|A_(miX< zk<5>0Spk_)k9in&1`Uxe+Ov8?tb-x%6B81ZbW>nriBk02vtj97H;%>3?w*f!re}yg z5z)2}jtU3mlB4jK(88tU8{gyEJ|m3i@EuLq?0_NLZ{2vJc1EmMw1R98YX2}>tQRwH zO(eYHtgV9y1#z&U6H}>Nw&5=+(E~;XYp(9{q-!CR{A%{+Ar2%R0!(G5BHc0XzujpH zatH-+vQrUMP)?u9HE%08F`3{+mnmaH#x@s&&KZtYcVx-Ax7XFuZ_>wJAi|r-f3zBzuYIReduPUA*c@hrr`~1TiArgffSXV zeJ3x4Y9{aG7YkNUHI`q%I)6{C;LET^3Pu6}a2qi}QZ{IYdp-Qn@dDprv-wDW5S+%z zGgi8+un~(S-z zY`_(qX;3lulzztWO~-wJeh!6olYikv$1)jkU6a~<2cRyy_=pVa-DQ>+Z=iVo0`VO{ zrBUmFoM>6)4WEe-YkYyfSS*8rFcH1^tl!2WS)tdY-j&`*unwNxF>m z_b%c}VpiQFFiw#+u;22^*!vJIOQzxp;5@CoKmzB+07?6*w_&bfhs&$M=r7t3=9nCNZTGP;sN< z)4N}^S@bK4o2q;Lduoy30(f1ul6neS%M6ntr+yTO`eHu3X7 z%K%_KsGTKL+jEkXCI|j>&NsZe9a5Lp4R(1gaxsc<&^XJeNRtzieP$Jme=vhR=MJ3Q zspqLRz(E zD3YCaYQS^XD+Ue=QO+CrcU$2#1yO_A-<3>SRVOb#J7iZoqkWBTSh?h#_nc8Jz6L){ zN&^7_nJ~mR%GoaxPQPP(P*GL1JkMT-lT(Yjv5UM%#Y_-2b8|N4V+1(zH<8PFxvLMr z=}KMWi|V?{CeyLg)>2QEm8mbt?g-%6TMpc)dGqNjy6mh}jHfp=r>#cbJ+;DuFT<(y)p1Ff ze?1*8q;vg9d+AA0)0+F%vfI_h9iL@)EhKh9#zlGIt4Ibie>X3%%JUS;dEL;F9JZg$ zd7Z15Aoo@0ydLlL;$C=gaM)9lK zRM^nNUM6X98(K_$L=1j}O746Dpt8> zDNo1Jq5SfM^+_y~t>Y%KB}FPYcGHc3Nn^oAP>5wRacsdThQ?efKta_+Ifzd=Tn~m` zC8St_t8VQHp!=-Zge*?Gj1Q77RzaUK3U`t6NtF?{mN3i)?Ot-G`) zYF`c4Y+f7E4hn_ocD^@V3GRCH$qqK|>O58>s%ZlRHcf?$=T3QCWDm ziCl!O-Tcx+cDDuhPWKSngn(=|mNpZT=}5>a?L{>78RTrEwDPU*HJ{}Gq7!|UV~+VO zjeN?=?aQ}Y59CL%ElW&nG|~y4tRG)rdo@F!h-$k@p6Z^xJ7c}!cUx$48m~YEAk_R% zV2>D{RspPo<%yLx{Zlej>~Cl4YT-q%h-Ub=sIG2Mf?!)z8#mZGU-9a^mimc2UL$_HLf63oU1sQ=p#~`p_*_H9@GVZEOQY z4bU8qYTiw)FoNGz*Qrvo-&Z3OWpLJ@rCX3;c)uBSHIAevhDk_bR6{D-0^v*TvcWGb zc|+n=?(@uJd00Ir?+%w+6(8bIFueVA-=?-aADguw6tFhZxvkP)o>Cf9B0=?D?c-cG zwx0ek506mdXLD@vi{l3}ZSzZobcpNadDnL*S4zUQYqdftYzPb#19|7@FhQ7mrkhIM zN

    IF=u*dzd6Zv%eRfpFK6e|Y@RnUu^RH48c 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 z%0D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±kARyny7Vf9* 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 z zX`%pvV^jh6S)DQ5E~O!x$kP)WPzvNTP?+)-|;x4 zrEJ^;e#0v5$J+J=^!gC`Rw8b5km*^2voqVE|C(2}tUsQo&CpXINx@xg?Sc2RgLXQo zX>{=c^d2xXq?9mlFKLbV@f+Y_j4*DX4bV=&dt&MKkbuBN8t#P`N-P(Y`b7V1=HVLQ zJ_6EJL4j{T@`r8N)Zrh|53o-d(h>)yA1?p;@Z~*o7&ZO0o}}*qP;21cS)}h&C z|7g`yB;P!TKob5J+7PDw0}Hxg1omymM(V6*M1O<>$ll^^lbdJ|K^{i7ri#qWC=+`? zUU;{1;YpEFqZY392@dv|!Djuk4kQCLSMmZ>leAZ>**g4jCZqw0ZlYb{@QQm=4@2a0 z)?OopnN9+`&*}S+zwQYKKOcdFZkbd64nZIP{&PfnB6oEmrRYzvnU{5qX97KwnOCb| zlX&v{w%iBJEqO^5Hqq4R&Fl(4L^p>G&bZi_az)3z$BP09YP|}4#?<02_~h)|i2liMl#HwUs9YORi@ zeLLyDgKQlVCYQI+;j>`Q`fZxmV-vEuVY99ZcH&JcVF0 z{?94JzimH($WJV-;dPPvFXEJahbn$=xFTz3B3P-YEJ8{eb~wWKNQeIJn}CS8PfTSK z3oooQKJkSV6%|?RO;=f@1HP7u`kad;sHxK|=`Zn&VS<3$)r+CP&NSEg>cX71%S}1x z(U2dE7WM>z0<-BDyZiX0E1U!zqzS!cB=F09U1`}%-sHZAL`Fri`o9R7i%BKC+&l&z zG#f=?cXzqFrTX-P$T<2gJuJvl#^x{jX{1Q5AUsH~5(?PU;i-o$EiI39i=lUHT0ptI z%#~F*)SD6eBsJMlmhT{+ds)W-Q(TAT<_)`%n-I>%^ZmV)I|;8ijk z=b12a=?qT_?R(iDQIJYq7AEngXJDz^DCR^P`N|1KJY4#VGt#?vI=z=;1d?Qi5$^Gg znKRQ@=-Mq3%0-wb<&s@pb>mwV9P;&^WVr5rDg%w)IMl@_#v|0=O+QI2M(@^h65V8v z28BYewh@}o-Op988@?wk<~OHK$p0YKtQb`%J?uHOaz*Bw`FXDL%9hg@F{&r;@4R&% zwtvtgSafkS?B*(gL;61g=Ir8_A0X|9shy9NIb13ct$2C}DtmOC@zoGy*FLR+~r?j-EG- z+z`JvcsVB^!iAZ)50tj859H6#O-g8tt@3rgcBGg0uLVl9Q)*V^;S+g-F%sQylc`eS z&naH>jBXSsB?5~0od@kM?a@Q=G(^S>^JVSVKg|3OOr2c7npWA0;(0|x-V{_J#+h4d zB?<)RGn9yD?WoC3-x=*&jr}F9W#zXJF%p8a2tsTU+v;I+PqfYBV;3tYoyry*-Fc#U zptY$T&8B-7(y$mv((1As->;?l-1kM$y753Kuu8#CSex3S)&hs74KXH(-r~iK{Z_yT9hjAjK?<+V{gd#C`7J8sxVy)@Gr$97o$GIFCa)>uTSGX5p zxlh!|={mh8|`ymW573pAZ=*T_JT zMkL{X3LX$moWQm73;IR+)6I#G4pZgvAt50SD?YG)VB5buHeNQ#4D$Nd4=nu9fX%=H zuRKImYWCweZh%YWP1rI9gW0f=!`*et^Ko|^nmS6(3Ym+ic0Y~-LPb1QM6iQ22Y+y91Q@_c9=6L&TbA2_YiG%S_J~;Sv;c~k;Z&{VP&eQ;=$vdo{wJ~GXCL+qx zhHfN~NsdZN&D8}S8rDWqr+bUk2JdGYHB*Ba;*iAM$m(IP#9-tkL&fTXJ829l?5%70!9 zm166WXHnsrE*P{xe38prQ?_hbG4CXc23DPAL+5Xt*ZlqD!q0x^Lzl)c+F>KCgx-6- zKMiUgF>L0279&Q;doaBu8MpUvr+;a;XLtBAHI*oVE?iE7vp#a7%-pZOw>e@#MAFwK zOU>S#@g8;X7k84G-@6MUXGR*)?VD_E?V<7z4oMC&dl_EtVw2Qs7nWyM-Y0}7LmQIEz5an@qRDYWyLh(HJeKN1ap;oo3#mA2e^w;;c~ zm&erBtD>F9ldpn2ESNVDS>b(s1sRY4g3opP;Tlhv6eAKPape2xVoafnZIP%=7qhZdM0)Sh zSK==GWC47ApRfHxJQ5vN`Qs}&S;-ITNP=r|O!W2XWyu?vOum+Jvla*e;q}s5nLAD8 zN;{t4W%7D5gz)0%^c8MFgW9`h_nZhCG%wUx&>9n+X@LQWhJAxgq1}!?76<92_!(@$ zZ|UL~Mi?|#9 z5hyKc@~taz1ZJrv^3G}wY_fI}Mq0?n&E02<)l$utc*CceO=O~dZTb)`6Q6>MLZG{6 zN=0tt-nTWPY*|Uy^dyqoe$@Labpp{ak1U_2sT$y(v~a@53e}!1cc+B=Ecy`||9bcR z2V<+o|4#FU{>FO@x+@NxeOG)ZNQ{cIR7qs*2Al}Ol63&Uy9VU5Q}ag&rT#V3>HgH` zV55ZH95gRee7RIE2hzc>;4wlIfLreq#ZNHUrQ>_s*)$yx@g&7*^_uJD*!KF4^6!WwIyfEwHGt-B%* zA&q?2rJbmX;<}hVSiSujyN-Shs5K0)WK9PoJSFoz^N9y3 zBE$v+^c4oOdEmh;iIfU|LN>~Vj;agLSrUS5I|g(Z>I>bcbs7eT6)B?0 zu@ZuaGr{Wv&z8FbLc7Vbhdp31TFmFOaL>>JtP^zmc?dS{I_`nZ*}R$R9I>3(Zu-bs z6@y7Tuu4w1&g(B_sG`|66K@W8_4#Pj7Li}NYyRVjB;21ODd><_AAy{cyZOp*3E6uo zgvUrq$G>1iJ|OqU!Bu}9KTQjryfYM~GeTKl3}eOKD-GRflCPh8J9fdy-YUDu_yy_T zh=S#x26+GlvBkp%4Gs@Y4BVdIPR`sbB|X{Cim*W1B2-z2*eL?lK| zzdkQ6dN`hta?g|CS-MYq*{(96uoG4;v@Um1;B`=Nzj*&MCzz~@Rs{Y+<{hHfAp9!r zG`8{fL|s~f2``;D{E_lOG4!eXb3r57IPt*~qdfSrZ9QDHg=zkme9YJ?C#dqDmp4C! zPUlSu&$nesYvkLH@d;tix!uugo6h5KFyX%@wM#Zl#f8B#q7pqi;kyuk)V3?C^gdArZJ+sA1rWs#HG%}&HpkvbXYPgeVWcb1Y#F9>9}l`J zR5FC~k+pX!vvrt!t{tFk5--c>stk<%Y}J5>O|MEStR=GT?;BQ>r*mAByDMiuH59HJ zsq!ZD9cxr`UebDgdF49Px#=p&AtI#}Vxt1J6>Gaw+VoNBL=Riq=bCu}&8!c`FO%+C z?PrR3bOYOzdgiex@zdkM> znN{`9HGOQq9h=H$eo*Mbqkl`9qs;EtlnlFkjuTVoB{D%^u@=x8Rno_;z|U;RsOmVXw=HCpzR%w z>HkO9S-3^nHR_%iQo2i0Lg}udL_nl01f?6KL1O6c6s0>X8k8J{p+RB*LAqn;8fwV% zu+O)z^S=8!`%i!i*0a_fzdKSI&CS3#Y-zcblGB&mt%LW?dAI*UZQ{epkvvo(v3sc+ zqm?;J%+4GG^&hJPl$&;l6E8RLBFprsqz?;JEqgBhafr~5xi+ht?)K*tw*{|AbK2D6 z?(eu`K+KZfGH^0{P{$vD$D8=T?4Y4%&7<8hLvTM|9Vj`hEx3>*QLDlXYUm{^2J9`6kql5Ov4+)*G z0t#L{Gy;kI9X~nm02$QrM2w|K$myF^(A-eiZ1 z+W6icEOo5alIc3@Ci=}6s>BL8PK(*q>Qx%EUoH0$K@&@iq2{MkwKi@0BlPJ=n5L84V6>R*4g*L}PaspZzENtszRh0+KGO>ZI#cd5GZZgD>$k@_^;MZcL9MN# z*lmLb1;TGvM3&7#=`1pCJk#?d#u#X_GqT_{dQ-jilbE2(@EwhByDzigXZE@bvuE5a ziWtFE0-*Ri0n8t95z&>@c5D>w3tzv$H9m3WyAH!RA$}hg3M}57GL9mMHboaSo;a=p5uB-U`Jo4H~~tCmFWTK@!TwICV~e?LFVZgq!u^#lw4 zRYY=^C!Mi~mZ%61hF-iHhjg1#&cNpvn`--o>i4l;;44O^NbcnL5!)KEqU@7D`8?d| zH3Y~s5rdnwRNVnu&!bYz!t_jALY<$`^Xa(Abew44T(23rGn^>+&}&+rc@ckA=N^Jt zk@;>(P?;oFGNf|D=RZ;tActQ_SVM+NrI1uWr7P5;Tw6jhK(}XsB2_T*T#{v=oi{JL z4s#uiy(Sw$(k+QH4h@HUBe|}5F%QscsZsneF$IIuw9&{FoSr`11-AywD)&HYO*6N% z5*T-~|8Qd2z7es04#KAQ@wml4{nLof2eVQKoNGw-VP6#v;7OV~sqDgdP&kr`!80P8 z-0I85wCxql+x9Sjg5Ti4>|xml;?MbkHM~Ez`T8`}ZbmqH)Dyeu^JawH+AWC(P$}R4 z`vreh0lEv8dLy$Ah<>9uX8t^yx4rrG8;vWp5NFMJ?JRdTvGw=T1M9XAR2Gc(>j; zc4i@vR7=6^Hz^_*v?p*{a6c6p@;j8*-kno1g;Zcr4Q5I90H_t5Z;SF0j`LV%1s+w7 zGZMiMG{wHJww)<-X{_w2(zUf2Qt?$1oi^fmnE`15T>wFPCVevXz3QH1-+9S*9m?$A zU@b)mPur0zuKtkfsUL%+x0Ls5f_~Akp%oVSR(3uF>*Z1)b9)FRueUhu9<3njILG~- zKZ%qB^6;t=(E<7QqdX4h0dj<>du#9LmK#?RWUDq%h-!|k`RyBAK>sbbZC_Bk=EL5W z?LW!*hFBOvbGOh6lA8u#WpJ?guaal1c2Lrg>`aAlGc#!h4U|f-HuiC3o1*2!_6n#m zAFHaHpc$1n!-Zq*Mt@9I^_1qA``aYRAq(S|THY~U{aSh2{F6WjR!zuQZ=xt4f6FLg zi{UGKZvdxJjO{xWmzrMKxN}_BPX=S4-eGGlh>f1XkK=A`*5i3?^<-QQ&W(r1k5;CA5 zQvi* zc!BwhGLa#uIsA>s3_wjYhHR=Z#ey-tXw}AkY=(ZgC|gktz2fe8|KhV# zKgL>c@EN#mk|Gc^RIb+k-54avyBpJz+iedhP4xaRg93%yj!Awo78Ud4(IDMaEA%Y< zv@8Dre4s+^w`cqL)D+zcQW;zj$>a+lRq@Z%>Fq8E82#W1;l^!;V98(~0>31R7q8Ct z=BxnX%5vw2+1Y${~z zpCj$AN_0ZhXFz*Hq+I^G=j3e~@He;AayEad8!A^XY|%{w>>@qUws}aAH&J7yu`}1K z2T})`_QyNqu6Ud+8Nk%i&X0%E{=Z=wudIceD%`DH?xFCV12`yJ=IgsLyBTl6jR5hnT( zE$$-e7iO;W0PYZiBRv|(UdPhUqFzyCLAkR*k)yvmU5{dd z`QPTzNqE!cLe}X)AkZWR%4k}$EkqhI9QnPx3#wg=mmRYIN#JwaQ4hfrcP^fM=HP8L zoZ@;8scyqId_?Mb;jx@h<9LBZ=49sV+~Yn_AjbOn=PC}?1!;$nu~+vyhvHH4Rz+TA z_g?_T1>?{DytSj1Mc5knH*}5|==FxrAofXSL677TSfPjUFEj0{jEh&a2HKF7a7o%J z4Ak|-NeXG3LdF^MTO0)bVntIMT(zz5mkW^-KL+%bT;@|n&fD`d&~S=J>x)1STY5|K zU(DJk9KC-72|S&|A0j0>L!_b#=G{&}J1wF3wvv?TN}e}v`trBK6IMy;+vF1Y@*QX9 zNv#c(0=s(=8vW#|1`gGTh1#I$1N4L`dX-1NBDZ(|rKEVjU9L-n`;HAU+Eq zxfs$VKmJwtS1kM75r7)Y^Y6G;u6GW+!gtu=m8ewcC2DM5c?cT$dTq6590=GAZU z`2`IWeDvr?ov<3W%`w!M$QXj+KPIT;=y`a4WBW3~tm@VZ5W2BYMti#v7vM|1B zjSK0LI-?4OdmY=Z<5pHs6usGj1+&>K+!H+>eiwUR@kNpy19}3E?@!SRf>o|HVYs;K zcLAc6?|_akq39OzJGLf)%rBROyOkNM*j)~*#KcI8_u2hYnpC8Jg7^$$gjZcNYRj;z zG0kkB#$ik^+lwG|Z1+Je0$wJlvv{qN#o1gbpM?`x|G=>ScUTt;7kV{QXk^pWozFU% zW=IR<{;N{EO^j7psFF-{17piD0z8a<=OZRM*DuX8pXOw)1SQh$Qw4pK>A0GlY5oIR zUhABejXpHWSZidaS5|RMs*ZFQ1>UFzNGmttx6Ax`+DRTTSiFz|U&Md20OsZ{pbh6B zC~OD+%~b;df2Md>NZP*g3@aXx1bXDb$<4hoSHI91ndcV+e6g02AfG~ZZdW60M@1#BK(soVwU6;nc@1=oZp!4hB04kWzR9vUd4`5v!0QtS! zA5+jKSS?!)_b(Jj$0D`T!Pd|vhojATj$Y>S=P!`QN-i!!stHUFQ}6+XXSj~SH5IL$ zhegDwiT{ai9E13?ox?j^J*6D>DNzsV7s?V_;?$i68X|764QX$!tgQ4qlw&ZqOVk^A z_14uBN;oNZHp|iTI*oYZ3_#c~e%3Qi)~!HG887(^WlN8)0|MS1Wv)ZY2pgqJ^)EyF zA3pT?Jx(Aj+d7=`T~LMlxe*q1FuI)J`+0_GjH{ONNQ}eIUzN6Fyvi@r@FSw`$_Bbb zRm&{Bd>Lm8jQJ7E$iiicF*Xf<(P>1tm%!g3|D;IXx~{KuL02U^V9Sql6_jt6=~HcF zuRNzsbn{-{zGeY$DtBO-VMcVpe(XXWl{E`7uI7idB^2EA6bc!a(zKa+mJ{dI7WS-8 zC2R`x#}T|_1mMcSO9zFihNHmYo&;yj2Ki+fx{)TWOuaWD?@hbEwgBXsx^s(x?NPi8Wb?h@Hpd-~X8*^=;HEzk z<8>mdNa{IOx?&LFvY!9%UW6h++p2=&IYFs{arEULwDP?v%#ltWvTyd&cH~(QAa`bg z8ShmYKjBio_>|>v_^U63nS<3&w+agA_Fj|Z4*QEU9W<$5n4U)xS4iYIkmtp zG`TLb#)VqpliuP<^M)OphW}DiM!h1XeE@|%{$c1^|87Ld@rK(y{rSehrwwBCA8PqS z&db?+WocP5zqye8mlVUR!~j|@WmoOo0`kr?`xog!sUN(FAj(6se&$=_-FaGt& z+%i(Ff@U~D*8_&<8 zzE+1C79khbj}(+kYun*Hx2GUx78KoMKV=Zjixa*88{s;>xj5B$#wFO{*%FWmpn2}M z*Nvu|^A~#zwyUv&m|+BLe|8izezXllBqg6Wvxx;TGE2+`twC4}j%Lp5RNpBz!H?RQ z*+d8yn;{zH9^!v@4!0t}LzZ3U|K!D|{vg?;dO*g(6s2QN>{ zvghWbx6^}m&8F(pnk!!_B9eg>c=u(Q%zVwN1}}{w`R}}+yZPuNP1*Y|k);AFC-v*U zK{0do^NQO|XqV&nrc4OOPdT;mMEgJ}l=`wH0RXWTNB79tT~WW-Y-$Lk5m}#+9#ix& zW1SDY^?$-F8-+$$7um&XgvZxH%~XX(Y1`}65f8a%1vq&_@q=UQC^T>+x$3FS2B@L}>-%e zu{+X5tYU)p8h>t0gy7r*eX{Azsc$_V)i~cMN?i4SXu|D$c6b<^mX?+ca2;M@E&w>B z7$9xU4orh^@c=1Mq*qV-bALk7oF}?7%8whGWxH7m$Yh+}krpd&|M@CGj^5tma zKQxSgTvHD8o+)CZ0!wUOnZ#=6XWqRXwf&tsXkU!jt|8-%*#dB>3bd`#1FlPWEnUte zGD}E35t+)9)Iy>fYRNlmq{r7^hAUDc9m&p(}J!pYZqy+uMrX*xI9nuY1`)N1X- zv85(w=Qw(Ua<&KKxhLmt8?3lxLk}tO;n-d<(tW0x;%wLw+ayH4f*xqHZ6%iEDQ?A6 zoi~gXTWFB~+I=9Obxq%NwjKO$-}UgQU$BUmpZvCO;Gr$U`w(KjJXoS7su9bC3TZ?| zH^2HP7#_=lPo~ZR_cQ0LGFH3{DXp^16Ww|w+IIWYV~w&(zEdjF4E+&$4`g-B##59P z6Ra5OS3N>&WTZpp(}3AoiVaHr3j3VYHS(nuG)!xfC^?<9(%*L3zF`H*6^pPxw*aM5 zdh5*aPjTZvn|eb2HqQQSz0>_%Al-8#aUBqM-<>oer6>h2R-YBK#+ z%Da-;{}sA@C{wv@ix$TisJb?xyGL`)_FGfgE@eT@;aH*vcoxM z^va=#f3J2d#RZfQ?<~4=a`%AK`S$~EvHot%H2VrmGv@{?H}|L^E{iU8LDfQvati-) zME_A3*Q3(*FXy_*l|xi2f3Iv4ttUj1{!BXA=OA}Ah6I&j-|^eU{b9^aU>19fi5t%l=D3Xyk~CNq0d|q2bxYqY zHMz@YEZ7;UCf!UUCd}8=cwIsr;vBSeo@qZO&^nl>^}sO7^k}j(FJ@2xqlLFd-kba& zw#ursP1R%dPggV2w>9i`{Pk^0)8T?>STOhG^J<%QAFwL;28f~uo(fY`+9d1B)2G_M z_-y7OGNczay2ifAII}!Ruz>A(>O#qKuOsxb^+3kY^{^*stag;m~IKZZD5raQ9+gSLztb#c4PTmc;~Ns& z=bY(77F;;xX+9I!i5j_qK7^+%(P5J1A0?e;rNGy-_iXhAseC2)x`KR}RkSEDH3L8J z-1ltY#WW>R{A$X-|(Vzn6;_}{1(`^RA ztaYojT`UEMkF@x{jyHJE?$V7-O9`Ir82eQ_aIOoyOE5N)U9LDJHM=@Ld_?%~($^ws zG60jEDjs^{k$Yupbbd{VeHYpA_4QpvBKs|$MAQPY;)HU8`sLNW6!RBI)PB>pz`?U8 z4i$POVGl$cT#)S+WLCO*m$x&Cv-JQiX(gQ2m~1$kJ5+=WK(sz0YN?IBn`-jjD2NmS zl9hhfCll#%z7m>Zn~fGd2{kVrziQ`nY9roKQ&9n)5b`h#B%i8uv0&i+vYk86j~x!y zdAi6~Y1C|Oxd#N(!oomPb*?L_2T$;c2X5zoo2-FINsM(s?C`ylWW@H3kD zd(nUmyq>TsQT=skejgEkke3&u$}`6bt5vF^n=Qo}pL&d_^TtIqj=6b=0Ifx%oTBMQ zZ+_Z7NH`Gn$57P>*$&;n_0V;6yZ={Z{H(J5E+kxsJ)7+cKFM@#;U2AAdTd=Wd5|{b zPdXu(*AeM%tp_-g_hpGHxM;Cdzz!H^xZ>@}DoLRsYel_G&W8DJ|)Y;2U%J| zeWrir==8{>GZEKRrxUplmI`_Y{o;!fN^(2&-e^x78ybrNE`ejEX0sOry-($so}Ni1o>DxOLP z@RlDI#QM3cu_511EK?Kn2Lz%E=A-k;J+!-;8fqQFY%pMp@Cg@uJDiDx6=Dl;o*r2v z(|@FC_#sv&%M}HQ5cpbY#ddZ>?Zw|^&Ehn5!ccVs+!vozL%OH6I$RLB=90;BB*2kF$#O->oD~bN8J8s z)zqnZfX1Z1ghuA?9_w`sqWLk+mAjaPOd=42Wbl9K$Zet{5r?))!Cc;yQ6_(yg0TnG zX(wr?SKtZP;{bkiget``N3Ti*{j(HQN^8X&S;UetP2DLVw{~_UHWKV`$SGL?Zye&m zP8DQNn)_I1fZ^2>G~+7%m1~ay!u=Rq?r`#(%LfNaTtt)CQ-2eIcR_Z7&?wD!a;6Bk zcQ5i0*e<91S+55NU0Mk%hxKFLU@bNklM;>m`E5qM6u__%y*tlT`$=)%v_T>pE3;3- zq6GCiB{aKK@$zM6+0N=j=$rK)(Y&-?i`UYkE|0oH(6u)CZ)fCzCgb|)9zH)f5s<Rs(8;g`czFVe8PzRnflag(ty(|WO0dgnzN3WlDk ztE)?SY*A(BBS08vBDghrUGR5qAh_A0k z;G>)?UPg0sb5M{8P;_@{z4jCybXO?9cNPdpB9o6PGaw?XfX5p9~$a+KUT!+2hc!u(0{-%Nh9Y z4^P|)z_o4fnIgb$$NCYzhQ6x`<9Ztd(G~p1XQm3(eR=)Al`L3v&~Gyqvc`|udzP>e^D0;wAQb|a@&6?9+Yt+-)#}yy zD8#ro>X+n5i6b4&fG?(_uYzirN(Ll{_>g4Yk>?bvx=U2b#E&CbFp!2Z{^sn2=h>9HH5&hWEZe~jyq|hT!k(Th-&-Ftit~oMv?QmG z9uUEosAeM;PuPXZjI*gp>nljt3+HF=%^;|*92YyUdiWvXGqWINrTrhw z^Ln3L=uVw1^S|1=I7)T{Q=3hac{7AxRa=%ueZmG$vF&f82{g=sCuYdlzn_=^7I)rw z6GG;s?A2Ez>QIyD~WR@bE+Wr6e{+fi-C*63X?s`*S*Lz?fH{n0}xP& zwTI6&+s^Lx3v+$eAI|n##7e>~%q8B4*jn6!r=4gx%Brr2+w12d=F;4f;J3wuResr; zh3o1VUqy6QP-islbITD14C{H2pl-3BAv8vej8nR1zR>V)`co$l{5LFR68%M3i1I+rp(pWF-Y!wy=ymcePF*j{Nz-5rd6ex z`7CPiBjdvoT{xkgc-1nKNJCoI8l?G{7ZnwkSH>0)ylp|#4|*pLG>LtMp*p`mNZ}AY z!oDgmKNiny`{+)ir_I+DnRgRZJCPYBEhZ*Lb=8!6c-CsRGi;1cO5E1j^OZnR;QFI_ ztEG!V6H|hR>@c0hr=65)-O-0sMzh*g;HiTwQfk23USc1XX*<$o*c9AXd^bSPr{H>@ zh3_3Z&0wbdd_$29K&NeuyVN%>)4L1f90<2y;u+_ zjB-Yd7O#Bf>C^fZzE&D^teZy{B{+yEZvEp&*wQJq+)r2P#}aB~;@`>)B-l%XArOg^ zf0~UqQGlP48|)d;2@pAX572;h?Yi7afH?~&yNux0TV{DbsmWZJX&Y8`8A=@DJ^Z`V zQgeU4rCGE01b~l(ox;D7>brwE++X{gB@gu33HhOaV1 z*dhYs68vxp$mMpoh2r7lBYn+?2HatWH8nK{OOY(UJr1gY835+#`c~*2mg`1KIVaNbaaDREJ8BYs)!w?Pn1T;J|5={6M=}uR+ zkeL*Mr9qH!Z0N9f8ROD?Kd0Q`NSn)-2PHeR3+!Sp(0?|q$_+k?DKYooq8qRO#E3)p zMgiZISePR6iW!RkhCH|9Wr8D>*kcV&IEUU$O zD>eP+C~e&y0PEN{7}FzlRc9sV10_&=nPkNyZIwBgYrvu2=(sndyCquR<*8=Bat%aV z4p>bU5FaC_1%BZ?TXIh=zakM`2q5jiCGF_Y0f)qLrakX?i7g9T;Cjx^}J2qCZxXbsv{X_Q#>pE|_rI)X_;fc~kwk!$1OxjBl~<(b>#$~rlm zVYK-F4U*VY1qS|Rv*VDc9N?)OKpWXo)J)ec&gpm`zX;OYb8P)~7@QfLGg^)Gv4MnTwtNZr1y@-Ugp zj(2g8%;_-{1zBI!;`yT9rp@*w7UC)gPS%8 zTRfKwt4znKpL9J2Y@N6Oz+=%rPfQeY8q2XAYpRXcn)~QhH?X+3L|Px!LzI+Teu(qJ z{+k9@`ulMDzmUD6xUWuT#WtvB<+-7!f~W03Wcm=@j&Rv)S7~ULDzqwU5^DSlpAS`A z+b_{71%{pKm_(smtQ&sPs|fk& z?Ilp{rDQmqb7mZhC2+0)-y(46aR$BJ`9<2Fbkvl{@zyl6mzH-Y7p3mkfU$p)$qp7Y zfxG3yhYuy@o(F+vMyHte*Va__)qyO1US6IcS)EKI+vS9@FR|lH9d)xzt7N(U`6O_v z$F{W?xA>UX1_I?$N0Jp`0_=Ii2_OW*n0PACpTo7FP z>WyhGH&NA#fYY5R{RWo;Xxf@?r8gFK$9dr8%mVy+&GWoPnsz8^#{AyRVq2&%uy2)N zc@XHT)kN~Yp2OsK=P=9C+hPAQo=B7PpX2sq#q|!I}(?u_C zoAKN8W*&FLiMWin7FyGHN#OvNs_N7iVe8DRm zt!-O`ZsFB`R{Zh=_lo)ok#XgYCZ&4EF!$LQT4Q;5C6hsJM$Xh>i`N-Z9sn z@;+4#vd=fuc`f8;=)~0YF}m6;9@lS56(B0~;s@q#9ebhFByXMEDr5u^*^zZH$M_3# z0vhSSc%l_hde}$$g=ufZFpM{2ZqO3@wLj2U;s*KE?Yz2jzmcR9KXwBC*U8wF*uL2v zc8^x3redOunwNoT2Ibi9wg|TQ`Er4n(KC21#udeujd0tMXN3}OuM_d#w2ZaHKas;j zAY(5{%>zydtyB9h7L+BwWLxiz2+W-o_^SBH&D(b1|G1hh{3!=&I1@ERivR)l9iBjm z`O@~8*q3!=Pt5Uv(Fg~G3ad}e2(5{%(qbUC#T_lNaG~M)!!P(1xBCJ)Z*w#&y0G&V zsARQcbq0e*4{YITU8pfUW7tWl3vY6yZ(`ad=VNC@ioPpo`bF@cuHUpZCRxRHZ3oJXi8pPo0;J zS|+|$&^6HW5fb{qI{o)OM}%60*N^wgjuy30+HxT)$6rYQSx@_gH%|q7lMeIo#sfL` zAH5rM;F9pi%j6r_tuU$9&JEq~eIoC=`~>`X-M8+rRVkt`^wP`h_jSwRRZ%@<()O?tiW1Sz*HIq7~)Sv7o;rL`rNbee#~FR>vxIkeuS`W7Jen4y z?$~K|v{qRyrS-1N`=z!yh{N|`l@ojIzM}I_5DEOkM|;BQ=NqD`{{JIe0i;8ygz_>o zAMHyT85!aD*l2(m$1aaILn}V)2gUCa4Y@C!brU(Fo;@cD6;)jL_JRX^0LP}2a7c$Q z?(OYKz-2n-MQw&Yp}fmFf@CKgjV5hxfk9P^wcno`fZ~iW(Bkau?j}@3q@McjHLA@A z3fzVBR#5bGHqBS5{0}M~3Id8X^}+na*_Ur>yUpVqS-X%UAx6{`?rk2%Isn;zNG4l3 zd~EQ{+WO0Et64KxK@B_=#ErAM1}K~eA+Sx`CBO!Rqqza#@!o9XQ5T{gKmx8pF8Fu1 zEIj@f0OrB}P_h+0;NY2MQf`}eOJ^Gk$en}pUtqL%Xdewh;1DJU>lw}FWd{#niOQfS z9^mEVn5B?%!fXq-^(F7m8l~ z5JxADb-lNjSj?ynO2&gTq}JEha@StzyfzW`NqU$&xKH$BpF2nnE=LAYndlO!95|Xq z0?|GqMt{6k5}>O>a|yuI1e51lD)fx*B#pEft_vW`cy0Nd=%maZ<8nNw$KOIK&oSD` z(hHE)X81X2idVl<9E{9vgofN&oSJlpoYBB5JsiP@$0-{lQdr^A;YXM!{erD=faJ6^ z)5TKs#Xf>=87GKamfZkvx0lW&+dl>$+XmZ`7Jl{a!4AQZ1Vnk3}Gux-QYi)?p799o4^=G3n;&j7Gml#%wM+irkMyyQFC45BlIV(n1EtfqF(N)EVBgT7ynQ7jj+n1!j2CJYsDWnqnIz9KC1%6njvxqKx`bjx5 z?HGdl@b|e?A(!t?%;aHA6)m|`z_Hv><>yBAtY*2N@Ax5dl?kbOO}y==?vzm-$rc+^ z1r_O>k@o#$a;?>D{xFzMpj-{#yVCRBs2x^UcWVb*@n^+7qIp`1b7RfjW)J_~b^T!Q z@4?fO2~jf>jwJY}tm{WZQL1(UBzL{jY(4TZ1;)JShp)c$Ms6o3C)W^_ZN>hN+mDTQ zP@91Si-_Xh?k;gkpQRy5C_a&0mE-eZ_V?VOyAI%0fXRGg-^Bo=f}_6*TVDB#)GY~< z-NDM@7`y}nrW-KPV-=48SmpzQdS$a@9F-45{`er@3-b>xVO;dIf6~J1{{)iidM}k-oSJDy_ehCybrtd98J-MWgKFj&mvPyNPYHAJRN^j z0;Ml}O9l26@2OE^@>EGkSlh_goa`Q4FO6w|1G=7EE*IIc82CkA;$lkTJh!bpg&qCW zv0>Wp?Ibhyh>wQ%H&2q9;)AY3#oji4HLKU#<*|U8WpnGpmJh*uwX4}*bUWYodgyM| z>Th{bJP8bWGx=UCg|{h``%rZ31FxxZH%pq=B;Bku?Yyz~9=E>vX*=7`BFx-{+4_w9 z6D`oFq(t2Dc*a5raShBScP`W@nYMaOr2K&k-!sjkE$QcpBqUr|QCntXIUPa;Uf5$E zfrK{ghEy+JRO&y61{La8@lGm{Q!_>d-GA~u z=IMS*TG+=V(5NrsVc!|dIX%by@qtf&ed@%m11)#oe65Z3t+pX=3V2^MZ!jx#3I&6E z_*Zl-sFHLnu=qXEQVIO`W&G=%B?J9yH`gRSNrMRF-I#3@rISLMk6(}&vp52)0{3VI zI)`#(ak4AFeIpB%rp+c{2Gao{5-g|M&79bfDO`lC-Q0&iT3F7aVU-CrH6nb*Q2j;k zy~x1Z0qf(rX0QInm7c`dwHx65@vW@v(~LO*5mKCvHmwFTZ^BhtTAEJYuK|uWG`*-~ z%93>M7Da&X#ud~@_!ws!7fP)T)Gh^pfy1C%fc*E-#wIG~p62aF8x8^Qn=&$GIb`oX zX~z*%K+gLhe+LEy$Qv%n*tC+G=|W12=&`ZaeHp~Z4l773P~GLW@;?J%|4gg@cMzQW z#C-!4z#V)M1i?kUWx$Pf~y7~bPBOtI;(w3`r6cJu7NQG$9t&5&7>JW zW}lv%$m9a2s7UUHDR?6Ru!r1fUuaf!Z#3{=8&}GnTo4`2Mj-1X9ujLYoEO^b=L<_l ztQp{5koy_SzWJ7hHz|X_!6Y8o({_2|3b%??RK<^Ur4K5*zR*A+x#iv1ml~1*! zh0~!;**zcijTu`7?O>&+I3_tB{V2z5@|6q`cP7Qew(nh>AHbOE0_8Pn26-n=HWRPN zDpX?qjh7dgS=49-1nKFpUJAjTsfCOblyq1!FYzk4M@fhmT9 zIf4z^p{sj4t}ESUw>Q^x-bT)Gy9*>NL)o}z=|kVZEhOvK*L`C!0O}vVH;KluT$lDY< zJWNsrp9=YIe?OhBL+Yxp_e0gbRtxoQtMQ%c^uU?PgoyUgI+;)?c(=7QAlb zZ&fLLe+yh`HRj5{`x_vQ5vEFhZfM&rCTNz}`(zHP1J`X&FeAUYOpSO~c9+|yA_J%m zO=NL9j{1%aJM;1jt!uI5|PWjucPk-E&3DsB43lVXm1C!_!Q#+`e+ z`Msbuq-p3mG-T&~Wn;tTc>25`_UYkeYg@eue|v?+PwXrW44Dr*j~1Ul4Z_1b%`#KJ z44?K2vY9Q;bfu5sj=Ftc1+@S+F-8&uO_2Lval*RNYdKeFCq?SX;0wg-QQOIH7neZ; zk+?o)H&;3b=;aas6mEc#?<$!X7Ov`Z^TijsX?$bWHz3-|*(Q`X|4s_|;R$^vv+1P{s^B2&s%2se^pvIy9iJe9~ zuaq3+IM2}H^PwaE)C|8E3p26dMyx*fV}{7Q-X8&HW)k;h;fAMEsh^)?YcxVevomEo zj_Tar>100FeS#wi>TkXXV@I8<`rULkT7?d^}zjgXN-l_TE|5(T1*gPuM&(wT$n4zF~ywY#&NVGp|?;~;6iY{(~Dk~DFDz*WA7693$Bz;$*Oy@=gGBEBb3Nq<*2?ZB7)NjZBwH9!e45ft zXa?F=$0W-x>x1~4veraJpqR-`n`ZX9mZuYE3}X{)vS)+(&GN$UA+=*foT4F03Q{q< z`rtrNm*Y~!?04v^Z&Gkv$r>6F%^_<@#2P7Cl{}BN5S_IRtG~fCiEyWT^UoSFu`}mA zP`@+mi8b`S?63V8B9TU<-fE~Bny=0O)=~3sk44XBbj0G#|A2nP9#v zXD3tG0_RO-_*(4}`Q=$4L2BAzZ>p`JmTTS2ghdg+pKv5D%P=5V-7t?M^_3nxctaXBS7a4Xs{(Xb-0RGT=pY+;5|v6uHd>HMz`KW z+|m*B`!lhz92NG4LQ3EDdV}x=)2Mom1nb#Sd?X{1nhH?`*ZRBPq(2kb8o-`V{jEv~L1`U(UX871SWQKX zQ%k+X%B#D3>FDX{u_*7$SKZ%-ozjI|KRQI~DOik*8a1F(tMLy#dOiua03_V`cGhdO z<4@R;SI8QUwL%S(?&}XbbH40@d4$cIKs~-In%d=r&@JQ$(i0iCS}Ro_>1o%i9vo{z zhc!*~SW}beu~v8$(=7q>Al~2hqo2k#V;1d5VQ&YGEw+aO6%~9HEU91b_x|87=@!q` zyQtW&vfX9IS`Xwfg)urcZUdJ^_xy{0%zZ5C+)dd7z3O6~Pi$ujZbH3A@7_H+XsQ(K z^ZmAwelLzb8~KYm6a~FUGqVa9+bRc6Z-JqNloN{3UFf_IkSSaZp!qBGts=-}FR`*Z zIk)nmY3>9TQAaHrNS9Cy47Wuxr|1K1ZX2k(a)BGv^9d2g(nhnnvXlJ4%eYD+$sPy0l@09)fA-=i(HO_Amf{U}Ll-_DU->77E$z{Ng9@^85;gxZ6aZ zqK~a*t1^Ov;91&V0 zeJ2@OBX*96EQlPaxZuqrBWpTTe*3mbNDUxN-1yxc?1^2=DANCEL}JopeQ+W*TYGtZ zL&e<{v_n0d2ep!WXbzxNJUhkCx{ta$n~hhmT4TH^R=d6Aie_^L-8c^N^vos}{|jruvbc^80!?8DSkJLj;z%Z6-$orO8MobYA`%oFvhz}N>4 zIkX2k6}r^L?WL&QK%!KI#+VunSFEXV{m&j1^mPysW}h>kUV>$0HL?DDYz+N7VoXH8 zu?zWHGwm?aOh`N~R4tb6h=#7}>ida{vrqZtHrhAj5=eVdAOdd~+c$1UR{GGB_0D;- zMJE5~sR6EzAUB*#If9QaYCV(`nFk2_kn<>n{k7%Nqh;c%g?7DJvrI+SK`Uk&-s5OHEX2*0 z@x|@@`9qMd7lBs2&rr1b2;)MJz@*@Qc_8kS6WUi`gc1GHeFQI00Ds%b$m?0zN1mU` z;>UnXM)|no>BMy!~O~T!#T!|mU z`ezS>4VomCN z{wtH6wHa&2F(WG*sf!0qgE9Oh4_bKR@)*OPa+mDQgct&0J2?5Y%1=s;BV)188xe`M zPU?6|0cRK5MUI-OqFEz4rTYzHu>>w`cUmmgfoA%c|L=u?RUxN`HDhzX_5K8xvt?Qw6rk#d@MgKoglX?jscL>} z|8`}Nsk-LC>Km_oCW&?~{^5k((wvy#__f|k=Nyt;Ia9MrB=fd7>xgeV+~pjy=)X<) zZAQTAPCCNNWWz74o0#~h$EQrxenuB#$qEDv5^QpNT>qo<36}Q|8_3GeVGF+Uc*u0a zg^~vxY(W>>yx6^dtTfEbBtR!w=$6m^EO)RE_)BhV0tUU~{80&jO_bNnKQptikXlNM zA_JFU*zTck!U@Riw&v%}N!b<6Z^(N^8gVumn}W|*qKa7$DF=}#~8pbFMG0x*~AoM14R7u~;}DVlAiZMU`^HCBa$ z`blkyBjNaXSG6mLtS#iLHrR{9&cj)fDMo|og0FaaZ~CvRdfEX+BTly-6lAj57g(zU zrMO{c?7{$U)HE81=X0D&`_q4nTmS1DfOY%Ar6UaAcXfecG~ZU*c<-f+1yFCrPOOMf zI+gD{-htRy6E#KLDFVP5?4~lO9jNCYp32U!18Wrm0rou?jckr!yVS4l9Y^XCg-17Z z^siv&3HpZDvP|ohQqmLYeXfjKiPxX}?6gR!VnJ4BDqzLz9ka3NU-?#O=*z*jzB4bS zwI2JDA|QE8j23W?vip-Av>}8fIM<++&BD4HeYO_A=g9;R2T#`DBG;m;L4eU3Og#jSoKz1W*Z8kigMqTd5s?A{BICX8>oUa|{IO zCrL4pC+8!9APfVk=4hYL$LJ>+e0+aTiwZ<&=iP#^yK#I-xs0%u$^U1v z2wj`pXfEpZ$PS+h<7Ohtp9f#OCchpF#&4yrzR7e!UbJKvuv(HFS$k6j>N=dvVHNS~V?egTfGP;VSncAb^J@6!XdX*6b z#tJ73bUw0G4t0s1-wdiDSq!?|w~@444g?B6aUO_lbtn^b-MhjZvI10VQl2DZqYs&G4gCUYiM9F7z4kzl}?r-`;NFC*CA0J*@(A-wTGf|YvY%)$1 z1DTnXgYanYACAmxxd#;uBA6_&rw>bhw%%gQKOa1P)Y;}68o7gmO4R)n-FJA1Px5JD z0Y@Gto}j%?9tCV!Pw(QZ`*4X^bR19AX=QTJRL&Y^+^0e=Cfz(*QFV1BVikF}KptPI;2xaac=B_QgLEwnCL`ah!z^x&D4Gs7fqU`_*ym^gQ+5 zyQ4pxj7)e%vEZYi+ZKNSQLMW9Kw`lt6?{5jH1^Ze-o#C`G56!g`-c7m!+!L_i!-so zXZGOS@~swe%3HxWm8%R(|0jDW(y+gn<@a46QVo;Nl}B)NBa*e+ZW+;@43_=gtqAHUsv>T|2V#-`iBLnyRacbS3*a1?3+b=^ABaq6+k zNEaPz`bu}>;TAZk+!BB0le)B@~N z`JarJn5n;y$>sOH8`<}vV##~j+oebqNV!2x6gd{I5Qb0pL|98xUo2I=^VF-rrw>9b z5FwKufD@61AIN$H~}O~%uHEM2VVq7Tr^55kW*vZDy25_ zFGQ)=7yq;q9Xql>ZDp`mO4kOE=ppU*QY1a=nx*-|*r>EeX@D9gx&v@v$Ql!Yd^{>K z#bvRwln0y&M7nPGH@(cPTOby=gX}=LNg5W4_-W<0p|6g5CBC84zb9eowRblAt?f?A zuqU`F{Moe5Ue|QHg=iLu5}a4myugB3pjzTmo0)|s>Su30K2-D+A6sUVn0)++8eP2E z^H=|5@dc^;30d~*H(`pyYY=t#d4&OCmG^HV047?Y1%mU7G{Fb!yOknsBs2wJzl+6h zLW5l3LVGg1AV#|e`&>?j1x*07TI$(rTjOfh;`1}qac=j-nu zGw_TN@27&*S|wwad+CpHCHcR4woNt5S|A=9GQUuF_7hK23lx6f{LH=!(!6+$oDX|c zCxlANZKT0#PmGCguo}{+#j-jnUT8eOs?K40&_+W0xXc^GPH9gPJ(47)6Cd4S8+&Z$!LCxuwWLy^{AIxCXt z(ownBYd!IH%|2YH0G9wo_PjjhdbE^r^S*tHe4v!6v|9vko-gr$%2%1xv=F_%z_63p zZJa;Ovvov4c%vfyu7$UXkc&VF`qalJH`s0BQs((P78jg3xzLLQ&!_y&@2y3ZOsrdEq-CKUz>w~a>K~AJ|K#_Us51OuH$390FRd8E)vSq~tZtbA|!ywl0 zLMU1X z{UJLCVT4mG@8aJ+de&Sp;(q(;Sv#LFzEE3--898rtyY>8AZY$JQ3PKq#VfZgJ8HfR z8gb}xN}>`vOsyrA)16(}7Pjl}-680s^o0!7>+}9b{eMW)P$exK=U4Wze!98|SToW9 z>C2wQG&i;6hhTju^qNFIe6A%3xV@F^ALmfi!^B5NM&;@6i)RL}_fu8PKnvVm;Zr}6 znIswF;^Ngn9f3$RJa`VM0Kk6%(p&r#+oR;?=l3@EaDTKQ+}g)}G!WPXaE5&j7cD}9 zjEts~PC%!Us|cCk8&JL55_$b9N=e9{oRsuq;Tj;3FS2S6dZBHxbiKoZuC*JuYjRm# z4DG;R;}U!sG=kX0Dumw(r^>bioZ&HA@YQ7HT&Bv+-waR=h-Ivp0UUkgakgjjkZl?C zbL%o*dXciLs6X3i%>w<}$8eEeXkasskfJiloAXf@z(^!}`4Ki-2O zZb{3Q#*i+i!*ZeT_4#i+M7FuMF5+jNi=+H{22All5g<;9n;HyE+^bLS*+2@DpF<<| zqZ+ISoMOkyJ*Bntq*#Y-S7Bz^L1#1e$FZ}?;qtbaE6rz*t^w0lLpHrJblIoAy4G(& z@Uyh&c0rY#@-FadP^33}z9yiiW%rfLek|hsScej?(F}E#^wo{bWO6R$YgNLN4L*@p zrqWqM0V&@JE3&ILrm8ebn0pbm0NgtupyPStMK2?~F#nP-Y-@#$12G})vBZ;S{N20> z3qCS)fHy?ZQX%cSPZjRdhkkDa4_F=x`+oV3@OyF6wmNw7NXBFmjY@hgY^hNUswRdiO~LTf(ect5YB)kN4A?N2!2?L=mtmxpr* zrI0!0UY1uma!uZUz#jX%#TR0Btk_6BeK__e+9NOI;&TjP6ZiwcC=SG9mIix z`#CJAju(8B7GYIrrJaf0A}v$JZ8O&#M@o>*P)NY;Ak(!v`zv_fsaqLqUG^G!G${ z`wa}9yXDgvwLm5TsMiRU9^#TB)l8=6>VLP|U|kkKp{j+}{2n56l@O}02-Xr2x%ofR zvcES!br3|zSh*qykAqK#ji&3osmTvO9Q8T?JB60IvUMf_1-T{if8YJ`?S1*O$TiSF zcR-pkcZ}8_6QbQ67cvoYCBri|aw(r_#!r{V^mZy#iN9{W<;E5g=1iYNvJW^`k)UZ-sgU(uvQgt3y9kNxgInYWXjgoh<(j3Vxo3EOvteGV@)2u^D8U4&)%~| z;g)cosV*|${1m4JB|DlmrqGyS4givKNDQN$E+gP<7!c=NkYVYXyRmXnX3%vsC+ zNSI9&1$%q7*}yYIBD(L1L$Edl%!O<{kAAVsGGwiGW+(@T)y_s)_iDj8zM*q_%ZVZO zKz36_kagV+vp{pjhyAuf!UL*(2k9#HOs0C8S`d8jX^9`eNJnzFSN)12X5Iu(?#XV= z6-&AXIy3>TIv-DY|9SbD++AJ;N5Xy*Ha?1_!)d)u{wbOhw9<)>gzo_|TI%ufalA-- znVi@Uj8HTZsa$4QjvQ5^us+!uJNH@f5;ETmcJ?-k7;Kl;bR9&ko!t(HU#_?Lk>Bpr ze*XL!JXK*~POixVnN=&$-PvQc?40!+@aPV&w80_}jf{(JGx=U|C2xUGP~F z)WIOu!tYSTAS3s0NYVd`#;5pSVUPaOr?p#n6)CWZ5MW!L;wdihu_IjV7wNx~XR9S2 zep24grz9aYUo|3L)h5B2Ca_Kymk@h58>B|FPxPG-`A&N1kT~53Z};}4anNNkix^Wn z*m%tycim{YIc$SA6CQXt(%*AI!Z_}&o=Rvtas?ti(Y*BMZ0NLsot32rCR$B>?@T(P zu(?8VMxUI%6B}CcM!VR=7$E~1Muor}3grT1&ljKL4DyfWgnHpm9ga*#=oaLTN!Ib- zjitu_lE{N~eZPY){)&k)KRRq9H8yoDm4h5V=}W`2(+p+9bCE-l6XIQN=6r0Isw)&Pk-3AmyJYAZ-Y=9A!T3yz>%GSC_~XeO zi)W)v)2CazWu3uE9Rgd}2*|Ax%S2`ekA+)ku%<9(J0SKv(!ItrqL z4_n24nVfn9UOXZj&)fZ{&-y$Zm=b~xtJfL>$BVWk-jIR_Hygj2e8lb+Uk_SKQjw_! zC=m;3EGvOas;Tz`{e*zfCgPpJY#D5~coRFwCJAwBPFP;rH0Emk?XhXcF{UnPwMdp$ zlh^f{EIZi39t%|<$YisY6^|r6QGXN^VLTCVy2HIsOJhZ!j)*1J_IVF4BdYm}&)=ub z?Hkr{lbV#7hf~;nIefee-HTyi(UJkA`r45bHfbK`#a;+0_aBYRe+Kk%QUE*Jio=m8 zZaU(}tn?BjynPAfGwrBwxp;&2aN0G?1^eN*iPOOQepoBG7u+|wNTPmQG5H>jcmwqi zwh3gm<}Jt8yY(jSlVa(aEH@JcJo3I<9Z~K_tB-JIfY3XaGEvN8LFUcXuH|)F-tCo=GK5gJVQyB6x>aa!GDJ}6UIAr;ph@#MKsjV?7Go-T3H10PMJzm!B zda7Qx>h^&urH>HpeG!>Y~yPE$EjSRU9f!13M;k^*cNzRdjtTGoE7qrC88W_Tc4Pz*$R8Mv%$QrKJXfGBiGDKNAd=yu9 z9zB|@o_e}c1v}=Rap!uxXbIKxtYQjLf|so#(O*g|mWMp1Iux2n#PnP{><@>!1IiMT ztf9UCB9pa#{Tp7?{sM{%X2l*E}2D^>;d+!FXSWLptgBAZuD_?mVMS4ea(Fg>KDBQ{A zQq2+AXIbt2BXFhh?4ofpo=^lyFt;{wZBG)@v$`lN5OPy@cyBbYdV&YsDmEqGMn$^h z_H=+|P9FD+_zMC>I_Os71k#O4VuFQZ-+V3`-!o78;l>DqbgzBQi3V#; z7T2G=#hi&?8bqN3!|k-+_Uxugo!a+)^#CPOoUkj_hQ+wnY$MyP;WdxTVXmWrmY=%I zvV`eAZhz835`1yYulhkU-64O2Hesra^F52Yy*~65HBU9_@663j6o4@?;Y%Gw3y*#4 z*~^6nG}{`S;i`>En1xsvW#l}5{_TD_|11e4rO_e|`FWg^gIgEuuW04>mev_qny<)v zTYRxXHxdORxP!Qc1TRP)!Rbo~%kVQnDFs-R4+!);}^r=P=+{ zb3yVC0VZ%vLzi>_5ws>DDLZ6Ijlm18U~taD7tsOXQab?TVWRtI*&fbl-FN#_>}Jxg zNnYeuW*!H3g=jOZDQWMcW62*GnnW~A~$?W;qk0BSDXxg%S+6Z=F9WDg^KqteK^my(YkQIsZ2K%C{>zMxO zi)9UY2&)MI`xssG!60ytRwS}J7}oxWzSc4~LP36VZES#I^;5=@c<+YZ9$v4RqhNPL z2Wd~N2^4(#?U=N2RLF25O_qShN{6GBd(DV%QsLqL0!}jn^17x{sr&p6o2E$wtur)7 z(ur=GVB7R1AJ2JquWnB-Yw2i-i<$FG4L)`oPw1+2xm9d4+a;5q0eG=M?T+)@l{jed ztRt&Bc~U`enMzzE1QKAvhkc^ykb9Sm-bX2Hje;Sh9s6ibP$G|9GNjf2=}XEa&3Z`K zRqb0XqRgcaw)U|iyBN{BdZEtMAB^X#b7YM-7rQGP8{9C61#CgEF5uiuBDohH9inK?SRV@1}HsQoCDH{4gCNX?c9 za&_52(yu_@Qhd5*s}%TJ?{)WDeaa@ysNJPpKaBmd%N~_|xUn$mK#9Gi_dOqOUP(M? z^!!Ntmb^>hILlQ31|wMKD#sJjt~syl-yWM>e`G6g6(qR0l#_6CeK`pF8xa;n6Zmhq z^*=;E|8~#*H~o1P^;hMnMEY#00>HQ*=L-R+%ujR6d}a-8`Rf~fy8Sr>ATh((!p0Kf zj-zUcx5ml}oR6J7+@5Tz;1A~YkMsqyW--E=ZFNDD9p51|$=HR(DpWx&Y*s9m!=XTk(By{IENDoxl9E4Ny@~MlRrD}<_z%n z#{8^Jq7J@WyA(vC;D3^|{Se%?kVGEMK%){!K=OU$>@*cqO0`EN@LCN&i$D6>AP9uL zyZbrtwtqM2Ih0$ZDGWd<<_TlmG&F*&LMIq?msF+Bow@>;Mw_)mEP;1K?oi?rn;K~? z$O_>Eh+`u2W)exya*LG|8)B7jnt1#H@a6DTb6^=(7@Ia5INZkHL@q1EIycV+P*a{~ z26ijL4IyS}I>dP29qC%G=gk}z+9XRrV)*feOa&a3Sbu9qpn+#5aV)bWN`a_)0N9yn z8NrHbJ=X@By*K@U3|&0GMttx0W+F4ZM9%ghizziMLYo9enHxYgk=Y}|p0~I_!_f1- zi3*fV{a!g91WlI|K1Y(7*One~)GC7SRgS+c+;uv+w;&M(^M{KIxE(uL>Qg@Rc%pp8 zR2D>)>%@%!I!RoxPz~{0QLM3+uy|pizQ0PCM5UW)tW`2&#Y-0RmT+*w&SP_YMiL^i z2A)H&$PMASxqZhzaN8!G<6yeK*EESxA>>dsvvUqsJK-L-<5Wqs#nw(f@h3{GlNqZu zyVSY`(MBU+rIV!fQe}tswO@eiy>ElD%fD}_cxxftChKL#`gU@}{gr$Jq1+zK+IXBV zd7R&y`8qWF&`;Ef*z1wckEch`jmoKWfOo=M#D7F5r7+-n^Ca5G&Dv zYCDw^ye$>$%ox9TGqO%3Q}c?e>D_K5?&TTLV|W$h9xW^S-m@UW^4gfM3p}Pi9%B;0 ztb2}9uk$Z#np?s)Fc&~YYhr}m_x8;6$mBqOCKyCr9dG>i@1t`dqnDR))5rdx;K$q> z_1_n^273?gh_o>svR_gLa$V+oKIUcA>o|2TL`&ZRyZ_;Egd@^Spi>4)Nr6y76kOq) zCCIp*^fkM9uWmc5Rr@*j%vf36PoMhB7djD}bt?~(m7It)Z?s?FNPjtcujd9HV z%>E&G6w{LW?vKu2s&yo9VhQs^umLAgN15lh%GrQ7L&weqh#zcfH%>vu@j$?zEeYeM zTdq4lG-&-HjU7$2br29r@*?EwU997<5RnfgU}DhhmV3zo_KxTah0 zO|V^V!fZXb;Dav!pQ;(D?8>FK>`GtYwQiUbb)FXCBh5=VtCljQxX;@j~uwkCQU@U=Val+d?8e+SJd^rqfH31oV(;-F5ioDnd2w zHn^lmLP#>-RY?!C8XlyX9tgRdP&=+Q{ymldP2$mJuI-1;sMz||<;fo3-D)VI+c>LL zg>XmMqa|k86|;mJN$C1ni`@g5#Uwx8pwUL@v#R_)0#1;xq`s?V*_8TU_)hwId?sn_$erAWbESp!MN4v`C z9Y&1lt4;zFRHN_3V2gR6>WV{pC4IV517m%xCSkgp7XF`b?%%{rT+&?lRtHbJ{)-kR zHu-n&Q~tjn&;R&{wE7!?dt1!mB`p`K>aT5-rTdKSbL z%x+6geBidcov=6lG*d@NtRif~h|)aorDbTfAQPuhJ^_Ovy6U>^qX3$oFoj(mso?TP znCF7;9v4HVumXD`;O%R|$!xH+?PxsmvGpBt$NmL`vk3ArN(tA~kvLT3f56cyz+yST zQvhz0vU-v@HeCYL_ZWf90mw+cT-PzAit`4so;MZ;qmY^^LqT*tEm6E;S5DF-yhsVO zj4#6S)vRp|+wig9yT{R1ZCz+|ZGKM#O5rBWE;`_81xQK&jJFVb5LGL>PPM`s`e)qW zK0SBW;4n!pq0Pgmf-t}h5E)Vu+UPcZy+t>b#^GxwD5BIzVhFip3*8RHdu$}-*MJoU zE91{0J+$$G&tRwe#9XH}mCN_89u(<9A!w1FKGK8q*cLA%+XtUJ{>JW*jK zIzxrpsRzkLc0&9a!+pQS=~mO|^LhlsiFD=O;dQxYKY(4e_*n8r+b95vL~b+rhp3eq z*N<52IBkcPSo)9kyOxFA?_@7977{w)R|@$6jV5@nKeFGjxmuSG$Suubn9Np$6YVp1 zFy^cwmQd8&xt$c}8qJHYA1d9ny#e$Te<2B~HPBMm>j3O4xC?hu>D@&Ib`jEx$v@X3 z`0A-%VvH4ao}s7X*4Rk6IbU~bqK-Zw8i1Ch_ic}RyK~e!=V9p+Xby+wzeEtl=7kl@p{?sn?cONb{P|-e>Q=+u}}Q)x|e3} z^@{vKNmLLFqA(Qnf}E7W)O;kzqqR;M{2`b=!b~5>&6p;nJh}|aSLpG7}13&oNI zl^{;m;M6?*+%7`l8oU0skqjto#O~UysHh+iIFt#(E6-r~)6Vl5H(`?{)gxOvx@!!BldxM z+ZMc}(lC31i=S8>x!!kEs|O<82IcXL;O@3v4{>9)e)}#E@=X!*$T?YfK^` z8Cf}?Ajd_P*?+8_xeMSLN3Q0e%BCv7p_iE6`v|9}`2x=>@_ee}X-`i{zxN9o7}}tB zD&)F&*cG;#HrHLJ1Q1!Gixh0y%B_n3CUE`#n?rBb{%-p0nqTArF)Rj%IJxR0X;*fv zJ;MuXwsBt*!Hub;Ffh{VL1HNE^$Fj&_l-`wR~6*05KDCd;=Yx*GdwHx3x6i>^Naj| z3HHP^1B1x=j+@?d$S~C}ga-{}`}GT{UxfY?JlUYcDOmwnV{g?}#|aDX-z0=M@jB9z zz7O-N?vP3qnG`K=x3EQ> z6V01@IQOzHrG3JtXU;93aClW#Sym-ECR)G4AC&LhzltNBas!mLx%vLCm0;ht-X!_# zB{(h5y(s0&1G47iv^Ii~FBIvBvw+&ORMsH=Vewg@&qX-$7)}dSll?TqYVF6SRQ(`% zlb$mIfDH<_gI=Y>D~B|*VUuEKNBVuD`$vxMiK4d0Mf#%+uiOmiUJ{Gk?vz!oCd|3^ zUL_)65g`z>mFKugrPR8SKB04-1Is~-A_&>ZupLErUSqX56eN@!P*q&;;V8|k`A<>| zPIy;B3m@^<}e(a}!o{GDcV^s9N(Y>MVuw7|dun zrr^c6TVn-UAu&JN4|?_Ct?~4ESMt3J3Pg9-JVhKvIp!7p@iui?_elrm_;NeWZ`P}xY#VUT<$&EvMh4@Og;api< zcY@zAAn>MZ$Dkd-k&4rqZmzPAl>-)AR|dYOj!I0k(%tgdEErvH|9fQMJDgk4Uu`S= zWy{>}?hn*tuv}|DW?G4WaXGg^UeBYB=0jNSq|)vh+}iCmXV#c5IIxI0=E;pT&KA0O z4F1jF*}Q_lGve@{GBQ8vaOT91lg%ujY+fk8Bcu3uhL1-p4!%{uURgxwep-#=^W7J($|1EnY> znGF?)7@B$>f*J;!HOifFvnn@C3mq5l#D<>xp&{?j)k@vF$fUs&-(I?VcytJft)Ozo ze+i92qBs*KEuH)98Ey=2o}3UJx`1$fzFe#Y`~hSuZD$Lwz>9`9eeavuVS)|wFN8&e z^JQmN_aBu4-)sP9xup35S>t?s+&(d2a9~ekY?O2meC@+#Wl_fWL;`#Y6auV%vM*Wd z{*ZdyM!q#g25&>k(Ft1$C@Yz*BiiL~)Gq7PpEW;`$<2&fu`7ZP!uv*pT#l~itC21c zu2UmxbOwX`2eldicvk#LSy!2tQ;866;|<@p_Yyy+MR@;Yc)iK;dAzSQPq zKA8}7Aq@SxJ#y`d)X=9>rcP$7aC{OvLO{LZ9^Ckfr8h31BHX@D6sJ+X6IpR%jkj0Y zHUBvSAXuNZC>-L@fZ?71z*1iA{P0d(+n@RK*#VuUhe>zUpzoE=mGIMkBos?l8v zn%hcwqf+2|dfFiJ#yGf(=8$l$OmzC58^XpRH9O9Y*g;+6dacU-#dCkPS?hRfzdK2J zB#DAg=AKt0v`oc&QciD#Or$-mYXv=c=glb8Ow`>5*2^0fQw|S-^oD%keRy+mQS|@i zCH#N87h%CkfAdqrktgMHp|@#(ukyCLnLYnrg@UUql@6tPh<3XWWhL-?O|C50(~Xj6 zJiq9Zpm7g0@)z>gz#|D65s^2Wm!}lTvoH+B@1tIEh^ow{KsNxc@m4N1Qsx$>KHwUZ z{W!BX{W0YsPk=PjQkr%&>2{gZFS{k#d+Wr^3Tvc5u+U4>t)je;GmufFQdsMd&6i+A zT1J&0LTCtb?M1q`!0h@*sf*XyfL-2Oz_s~O3h03JPvl~TygkCNX_OYrCyJa#Q$wEH zJfvc7mY%6&)Sx&c)X?ywJLW$oE0b5^YVdi#3*2dKBb(^=VYOA${M~j8Ys|x?8;S&T zyPas#p2OjJ5~WR?3&;`=Wuf?<5jGsJXgUV4)6MP~>b7q)Lk}M)b;caPcYl zotw=#(MKT}93$#axBaRQVE!G}*k(B)@9O(ftrrzeyi(-@fuuEK#_?vh+Q+ocCIymT?#ON|4#^NV%yf$8-?il#-SUj*+W^^duMK zy=4hI?9U+63MdvEoVqi}uMaXI-Ze$w!yeDa{0i4vQFzxBvO^r>!;+C_m1}PdrKo4E zIby?WF&5W_d2eS9y~I8mkG8~{Tx!UKW$^KdIS8N)=E`mAD({tn=BO9?H7K+g8F#Nq zGjGl>dVIYnA$5Cy?reA)kqwn8pKAUatQjm4+5`yU&xEWEHC^Q zFMR>*3M}?XWWDW!!|!^sCUwnxYg{EhbDK*{sual{IdOZf;B|TQCD@7JvW3 z`rOd@>;%g*K#&9(X*L@(?aI=L=sN(aP2je`S2yTqswH&2qc-G^wq;RFRxk16qf7jN z&HSs~yarDSXEPiZB@M!1*bD;umAO7W3=Q-UsrNC88l?|<$n{~J_^1d`x^QFTV4s`$BSk4#rLMLbN3N0gdDABm0l3r! z*iC#E4>Nc^Un2Cea?@R+6pN8N%_iI^{oFX1ecPMMglcMZo<-*@AtW#^k3!6GF}FX? zp+xCsDq>^C0KVC(Gv~AX3a8DDQ9^mMCn8|^88}P|^hW7CY5>pYU z@L2GPN?x?0O`(xUQ^tUn0P1h%27#Ze75hnrm`(q+@c|Jak|N9*%K-+eF!7I%+Nx?s ziR=(Jlf_q0r}nqB*5pTG5!Pk(9q>K-Y2?rA0Z7e!vY=?EysGmtG0dJ{G5lg1FB;9k zQ0%2l_G|D&t)xUEeb%P(*NTk<7BnNPOgyI%^2`=n!V-s9SnIBwfu!da*qhF7 z_GQhIsoyv2i9>~H)Zr!%wyyJllwNN8*7kZV!%)1Lwpg@J93|P{-Tp=sA*z- zWwS0h;cF2At4}2KI5&(HfN&)b_jKS)r+#tJuVx-qdsJI-jgban=FNP!i!(%k-i^Jb zcB>GK2cGFrz%D)?d4HG!f5!k&SKP9(XXxwQMho57oKoG3aKy9pHFpHUMxk*?uN9vG zUFQh-XC6p--#X@p*F@?mHT09HInue7H%>b8d<4EXvlINV%#518=5sto%GTH@Vd+%N zOBO5aziKJzZO8d8k(&wH#>_eTRoMJIVu4AV!|vL zsuD|gxxFgN`~YdCwU*dh^rjp(N-CQSNCbv5EV6%kCtRX18Z~rm|J9+99pEmd8h>|& z1ua*E4*Hn~49HH`Nc}!Aqzl`SA7y$E_L9R(=jE_CwFMZ%Dkas?God{h>z={Giq2#% z&1a@hn{BU0tfiU@j52_n?BPqo7*;;P{a0VB^r`A%o0ZCg_l&S^r1-#_T`US3&L_wC zt;qSkh(1C(JpiNhjT~s1k+J&JMCxeov%K~a1JLG1Sg5Wj(hyBA*+u9z)cB0izj9Nu z$cIv}>-ZrhKWJ|8OXS`2mj7bQJt9{fr7L1mogQk*mzVbTXGOZbsA`Fyvh%q1sDWt_ zYfV;K=`Bg?Ah#Mhw>+=QjjNm$7Jb*qNSo>v7MYiD1)~=1l`rNgDyxCHP@#EdK)?-l zj4dj0__TUR-gLVdEPG=#Ev^gHansGJ4xMjYW{lR(#CiVwl!2USkR$`8@cS>#z$!fRcNM-{^DCY~RJCL z4w?jh_4GA5Z6>(vd)$L9X#$af{h)p%Cgt}NyqCUUKuIJDn;KS&FLpj5-IY(!*G}pK zvV|USKKa7Z~W$4;sQiA{BP zzED5+jp5Ei3{GCjid#l1U<4F{(5!$mOYQHKH`3K)v*n^jwZR(U8G-2jbwHQ`FdZDR zAzPUp4$RZ0VBgv@#xcb)J14lZ8az^$vbpGkWyd}r7k)dvY0N0p8Ci~FN(f-mGxvgX z_KqQz*gW&lOD!Q?4S1DP?uhtDw<5tq#&ZWX)M`MZLY@&yOF&n``4pS&=B;1@Xo~2M z5qeLqhD6KKERL$RqLMx{Pb7%c@{>20IpKjjS4gGF|nV#ydfQU`$R~Hk`H!q?DZv;;*_WbrZQBP6JM>Ph2Y_dy53) zOUy$NYP*9S`scV%tH=!nxkXaAVHan*x71*2#G+tLICjw#$c}8;<8P!e;nrVQLDIv; z<|#G1X*6w@^>*(Ja!*1-`%uG*TlR}gb&QyxN7#lFM}k)sg6BD>O5JakbyJ1S09ifC zU@t#TbKHB+Uw(YlL*V+hGS)tSdIvK@&5t8`Jt6C`*z%KLbAq`*Y3JVrM)Y^x@iwF8 zm8hf_y(soWHq?|3=j>Q%b(|#S8M_fe#?g+{>>r`65Xj0Qf<(T2fzQF>QJt(Ew}w(J z>iHuCV^agQ`QCwR?+{w4+ZH{~4IEEIn7x&c53nV7N2V!R@6Y}K{vA?E@*}0tu1q3Z z(UnM|8uGVz18$Cr1i5PcnYx<9Du+iHA{?l^>NatqeRfMcmW%6ep)c`A7{&{e;KzR` z=Os^cS!CR?JUl#PSc93AER8=9*LJjCz)CE|vKvVufD@j-X5p-tFmsXuu_G+BN@<@O@9|496a!(0zVzD8~q0g zOFz7Q*C5jiL*bS+!&jXejDs{R{FLp$Ud{)12@Q}?sEmy@-du2K5Q$vHB>9b<&yN)C zlf8vrewC>$##>?AX`(NYw_#+eQqYdtggOI<*W?Z>)bzK?T53v|1)4kl_OI2?Pu%;{^-^US<8*?*FJ#j$~Yy1+I*auP3NHO z=R3yq272f{@aG2oV4QaPJnk(n77%a!oTpNKXHnJXYt^L@APVR9fOJqlAjt%Z9grHF zJ%|%9Wfe#T zaW=1x1OFGT>{tf1QrSKQDwoN+=r%6tev4l)8~Q66)!TFGz<*x66wM?wc<-q5eA$$%atb z`4s=Q5Z`J5d&W}0p3H&Yy6C*rP0)-^*+W{1I{{h6eV;q;3QV_R0GjEshiZ}?QR-UBTg#D5Ty?B(O6AVE^N=h_WJ3B@tTpltaamdaYMo3i(n zl#e+Slx$sXq&A1M|8~H2lRL*$+x8azbYr0#%1+c%gfLSqdI(x(V{qn)#OMPci`b@R z&j_$xBQ+AC}mI5Ekm3n>@4E>s)X09E~l!yk%x1#6p4 zp-9XW?e#Nzq*z~ZO{mpo8S|T-4;-FI^Q3V!)$ga7Xp7N|DcQ?qV{A*|oz7BS+RYD*`S?YetO6i) z>za6vB-75W3VW-lyAOBhH69IwJ59FL6{Yj%Eg)0ABor z#}bOUQH!$He_CQ4?el(P=FiAfP;*j(w_P^#xC|-pTjKb7XM1~8z#!meO|K+rkq0OV zu-~gH_UQ-OU{d_S+MdcB?GK_iiVi^HmU$V)2qHkL_;t*4#Y9DlGpRv^SBCOIGTAt> ztxOACVPxWMHN%zJXrce%Qi8jNrSpI5SakoYP<|U!p^rH-&ZtQUNd}*gAI1YjbM+5# zfjm8T)kdStke&HS(^vRirvp7twy4MYLKZPh?4*O@SI}okA%J3?7w|^8Xw7-Nti6`x zWF3<(Y{=Y7BZC%DD$-mX?5y&g`2v6LSJ74hR$$d87J#Q;{8xlcIJSTN12KViMK9c^ zL~+r`1a;*P?3Q^qO;`_wTTkxFdF`xY4Yfz!IbaJlvhp_i^kkt?+5bm_RGZ%-IR4s{=x8jr4BS2XZwQV^tAe@GdcO7-{?W9Os zI_2D+nCYMfxRF81!wMOk{!VAEjLFym4M~c2qAlucY&>+_nQ_}toJmwIGLy7lJpXWq z>Z##1mwWLpAeu}o#2Im%Z}gaM&-3PBkRV)hWsRp;@`uh!(?94+X-wNoja{(=qR-mC z$)rLDDK=jRelGWigg)H5cnRF&%lvCo1zC#zmf}rxL6x2fm(*1^$hVoQHeZ!uQ;(qg zr(U7HZBZ(B`LQ`B*IV%h@&0roB`opHj@P6+=L?mFo7p$smelKs@>GP{H#6Jmwghzj zi)oG~`0{yP@#ft2z>@tRUXQIll zS=5(kzjr7HK4({0DGYWsrBtqL>Q6v$w#DNFw0~!C-Mfd=(b3VkmLNY`^GXY6IalSa zr9JW@q2nE3guPmntD?Q?M~=9xq2PqkY%A0nE@zyR4b>qin-9E6t+YR0?#}?aQJ=C zib1E;&?Pa1(lB(x00RuodwO5bz1ID|-?gsyde`%jFMK-YIL>|Fw(Yk8$+uFXgU*lo zxSfGHEvLF%8r{w|@XzsS-x`hY~v!O;_695@IJO*@ff7=h;xKVd1-&C zdw-#k%1s~?QD`au2%*42!Frck zT69*Zv#o?;inrST?e?MV58<$Hi^8m@7I3Pahk0EF0AFLLLTtSwK6$B`MiFx<`A%|Z3(L$w%=*GB9lc%Sr9zT5BdYTGg@ey5ejT zk;JX@QRNwr-OBEa-k?_jb4!R6Co7y+uHP!l;m#il9i>1fMPkaeJDZQmz7jsgzXSRJ zf2hKrM{DqJ|NJkz#T6Ct*UTS;S4^~tfVAD0%KIIq@|60~FhruG6Igs*)Ft2G8&#gO zrM1Nd-e9>gIWy=5c%HEV#`prUhsL&%<5~EaK~wFMIWs8cdAWUyWzCE5OP6=$&pByJ zq}LTl@7I3RO>BlsPQ1J|efJHv&SGjE@_}YqH)PK~55PL+j(U9KV!IinJ5?z&y_$wZ z;*n6Yzb5Y&1iQv$VUQXGy{C1|0@u4EINR6bHYWXEnZR>UEW7Z-U#PWr z?S_91U1yt{mSqL?0TCxbAL-{oOJa9ky(jk9#zQ)W4BDMri>m?7vL$vAxzO$J!o$r8 zbH@F$GxAU0rzIOE4jfc_OCC63ho$n0;VZMDX9~NkvAKzw@DQDABi0sWug$0L-@hmI zkR!lq5Sf}h%A#Nls-mS*5@WgcU)39^DRGKe$%(@>ll18@TQNC6NB ztWL14co2o*L57;IA^UgC4m z0bvO2v~jfTMK0g{2tD(+8#j1aSn434zT8WeNGSr?W+2`63)AXNGUA`W)}`hrJ_%_o zjz{O*SRd7bu#_KmS{JjB#Hd;8xr)YHp}7|F8b0e)t2f4&;$vo|qhP?FZ; zbGP?nCOKj91+MB`pyimX!?vyfq~O4Tf>K%?TljR()y(WTqOe!;>ZdE+Tp*6Zf)5sa z2p9L=eP^Eq!uF*$YVG+|i2aftinMdIvQNMGUZyb6ZIwc%(=~n=Ad|Ct2+TmZl;q^F zYURL~pYu0ne)H#!X_Ol~AGSRX0XLeOgzd~kLIOG+<*c2Q|0G0_D6*|D1EhQ%ZnRZ! zq{=aZbq2!Pdlj9~623Va17A4`&FRq$QE^t0ilF*4f7O`nDQtEk6~A*$<~mTvVpx@W z5;*%p`1FJzmSu`*P6_FISv_t5O(GAtk_COt(k!+F!rhEoiVAQ>(P#J}x$G{umF3t0slR zzSVO7kc){uFwA^mWj1vR`t%NIX&@iA#qqkKUkiUlTMa^yisFV_O)dMC2uABu%Zwz=Uoih9I9kabe4njacH1O; z#cyyR^we4SN*aXa3f7A}%@PkeCZxDkYn*-Ga*UOkSF3(vT0}PMtz3EQ@0S%{g(|6! zo*3Vi?Cv`Ue>Ha>Gkj9P+cop4`U5Ob(dB7kmmftx(7Bcn8)8jhxh4I#^;%jp-hG0d zr3@mkX`n83832V$mED^&@{7mwCa0mag*p>1cBXd{rVe?mw@0>2otTEG z{?mFv>-+$vR+LLctVK8$+N-^13aSV zZHAnv702~&^RiuL{*gfjv2Ff(C|0JAv1_@Q#m&Se=ShIRBshv|W|#4|V!xEt-yN*f zRhp7EYuWXeXsUd0^|aTqmRlZI&1)n0B_8;nPd0uYrJC=zQz<*V4j2`;m2oatHqMNV zS?Nv0y1%!~^LolptZr34+$Tl*1(oj==G>0U&h4(t-U=z-@!%_Mf=6EX*G8W9rgSY; z`fPZLI?3i?y+c>(T#3iFB#cL=R7y?Jo$1c61-BZT7H?)Rc#u`-R5rqQ9mTIvlllug zK8y=zAaN7yFo!6-sq(fJ*P|{kv+=j$n>QRcJR+6+ht$6l4Y|fPsHt3}HtKpN|F&8W ztCxeFXtp4{*`NG*DyEHAVXN~SEid%RhA(j}ITz@5i4b~1i1W`T(~cKs-?%O=ce)Gv zZ!xG>Z^wVuNqgRV?rPJYh}et4gc|4i5qjO8-dO&wnz$$Hx?F9`DIj#NI#m=zB)5cw20Y4+Ctt9eh5t#KoU`&IQ+iOfKfO*) zKDjz@-kewcEWmJegYC{(&~siq7iX!e^|&^j?)}Mw558{u{zUzK5Y?t1|2$6r?j!9a z1;`UzFa9N}~O#5@v#;fN0X%!0XfeM%wpDlTA9l)E@&MO(Z>g`zc*a zBAE^Ny79#`U(=_3+8hc$)U#I2>{yVd85p@TDcmgh15fd$S|_u`@oXp9WShca0aF}$ zlKrmI8X-9mxPA-iX9L>homc`+J`*-c%umDeGu}w}dcrc(uP4-xx___zVT6n94!&-v zd^gAPYHct(Zm;^->@a3sNQD+T?#W)mdEixj_47jIif6rNaqTniK3l~XAds`}@zVWn zmICTtn@|`MYruX>CStU+kY<(Riz?88k}=}Z^X=DgUVy9=I$$r9#L&_zt~)pD%~jKR zeoZ5zPO5OLJf<<61ar;C*mze5zCrmjND;)T8Fd?hKpAB`THUAXFduJIQHfOYO!O59 zra6){9&WnB1M01eNm614=eIlaUUQOW} z!!T@+7q0LwGm;$6c{t;&Wh;XS^_>hMm|Q(-ZL%&M_;f9Qw}rX`&o4b)f&i;O5QqmE zM8pPg`4UIzTXg{y*sYPL33Gl7Z9iWf@PAdQ}UMUy);5>Iw>jH z8{;%L{M5CB%*(#{`~ply|G^mhuWYzK5)yZMU>~`)g3X>gW3WTkge@LxHjI^@*zOm8 zRF*~f8~<}wIN2dAA?^ooH;DlZITiQdQY1d4dtLX>EVt@1Buq*AC1}8XEMz)`@(_H z!38Z=r~8W>>kO-6m4KdVI-MAJtYCDxWqvXh{)Orr;o!*V8XaCxO239s7b!lU-Layb5UoS ztW3Xqc+;VAud6x9eg7tBgZ*93hR^1b>sDcBsiRv9EX+G%eE?cU%J-`FF%!E!KsG$G zC2|Qy&Us}Ej0HrVIZ+jV;&#|kA5wHBrWOmfQB=&>+_}epYfvTuRh!+4bq$F`Hq~4A zl8_JE3~3{f_5bl0`gcgZf&okH>u}Kb)jOd;wwh0@*?r~VjPFvM=o7o}21$cCB^kV4 zTejF^Eb;U*RpN`eUm?E0f^7jym0+m?bP*6YHh5|(i}@n&Nph*#@Fp@Z<5BSmH;eE> z@eZYH;>YrW9BWE>TH1j$Nia(zG)QTbsH{0N4zboneMwUxR6}u0lEBk9VS%o4wTCHv zw_y^uw=q;QLP~MrX1ogVR)Ll`-hdCEZzz(z1+=P#gIgHwiC*o&R6nxs*g%%&*Y~on z@X)YvxTk0uQ~UPX*QP-=!Lt-tJ>f=H8%_aPIcYVvc90|6aJyY>ozx1(jlj5_A{#H? z3YzfE$Y-}CKFxHhA|AmE&T6nxUflhmIBs9i6bHB0$M49=)tC!d7+%Yl40ztrUhsN4 z(d}(nlw-?<8kJ&%F*N88s5ylU!Q<{2XwN;H+5Be0Q6jT4PRzM1R`mz^H#+74GldF4R6uIjp zL7Gj)PXPOhw+LX?-4QWLdEvhHudU2BSF(x3u21gbuVT8Jp5zL^lym_-IiZ;bGr)=l z-zgO|$br~1=Y%lA1L!;y(&V8vA7j4G?t>aj10IFX>=1U0bDDwF`mQp+S%t5#MEg`s zNS;^^?FI<^6{G-;-zxTpnhH4-nxum^ASGpOU%@{n)?C z)IFIG4S?Ov=#f!k1EBG0L^;RRQv7UM4nb>!!f5(bNTrEeQH$FR)1L`6rt-Cm9fQ!M zv@}8ZDL{Xu0{EyjV8V&Q2}u5IPtE#lbuQj)ful=BLeZ9PF@{#o^<|2^$(8#v;*1p! zjT;0vNgU=IoGZn>6#WU0+RSmyp*C9aWU#AmAt-OBf;BzchQ>_=?LEu;7ZzP@fDjERcqvc{Aqc_ZG^~CO>)8BVe|+r2((E@k2d(A32#h;&-k%}`Wn7L)sJ|E(JD^9PYT&AT@LlA z&-Fm10NyKvAGp0fkk|!LzEQ=0ETs z@dcs#ae2t>6qA${M3~|=J0I{bgPsvqwXZq(0H$$-D!OE6zqjpl-Rm-E3j2-fe;t;8 z|L65Jz&p9RR+j(sn14?>1=w(~IHZeNhrwBW55T#S%t_{!;VLO0+En|edG_jJ(F2V1 ze@upiBuMWWWt9zWDJb662^huW3q*_Z;SrEdz}OU^;7-?{@6|MY^=Bqa-q_{1$|Xun)HGW=-KcA&r%dEz%X(>0z)(thInZSA0(u&)wW(VzAIVwIrx zw>BZKDUv^11@Vbp_hd5}GK@ygU*VmkF~9~#^%n-^F&&n;**8sux%RX_#bx}(o(I_w zTD;;5_s@1^pIpJ-HOM))X_?`e8N{6=<0QY2h~Iq0Cr4b(v;yvfe%DqDc0rc4$*b)T zmLWarB4&1uy!nU)@`y61>O#n{QT}g8^N=r8bj0J?<#!w#_@6gkq=`>=S*(HyH^tT3^~+UQ4yg!%lO_Ql;s@ zBV(N%qOc=@BMs^}NMLT<9>u*4TWV+gW@!iMpbxLB>{+4W}%edX7 z;<%fAas#YOh2c%yrv2!4Arril1AF~z2k|cvD{L?Ok{&-!&{}KMwCg7YOvhRv z>`k7dkN$3a;dBo$rRO$8xN_B#Gw^qkl99C@6Obfn zG*5FD40O6UJi&fVHEiQX6#%TX9N_~y{LP#`s>ib;8-5OS>tCB+>`+bobSp52Dc!wG zU#wZxx;|InxU&LZ@ylrygvL3Fn@KiEs-srGJ<|>;`==weo@5*9Wr1=ocg99n7bUf$ zACBlPxD)?b!e11ZdwzGf`4R&(32uA=j{?nrakT;F`?_*(Ptncus%uhYr`XWu>BJ1n4E zPyPb^77|ycptij=9++SX?l(?b*bi`R8!ZhkI%>x<&R_2TIYek_p7a{S{KBSkKt90M zge5F(1^-0<^jQn;%b>IqOtJmM>-M3drZ@fHf}}d#H=>VBa71FL$Wtn`MnY)2-^2gg zotSe4xn7nO1^BM^NjAs>TELk@=B{k{v}AJGvLhPOFb8!p!Q88(Dd#msKj8C#P7VTTXr;Srt~XX6~HsP}JJ5=C>q0)XJXU zyz#-r(hD}JVd$-I5p(SX?dIw?d;0P~hbx3|nFOK2fsBiKdkFEPtkCIFu27|<)*kJ; zw}J>?{3Q%?LI>N_5_c#Kuen9SU@Hfa#UP$6!6wlve#eP=!G{o?VGe@T-Fa_W#;i4c z#@sLc#m%%J+4NkDP+mI#+4uam22`Mo{Hm&=+#1fH}x64Ha zqIUMce|6W))eojQx0U(=z*io*L2c&_0{&~k{zDVsS?r2)!F?DbhFlRcD;4g{1X>QAGAo_A5U*&Ee(?p(*cF3t+cK)d6LfEH2wkjZe0PZ6H z5ooSe2h`8g(u)(TDUst`g%t01os#ay?yidDI$qY_ORscDBmY|$r3~H}Com7bGK}pe zK1N5ZjC!}bzs!k|ouh#-{o!DSS8VrU)|{QxD*%ZdV4hW?MY!UU3zl@7~99#yaWH^2m@8n3A^@M=!kg> zH%=>U;`dGWazl8$iD&NZa7BhT8n@@7v3hdT8p)*TFZD+yq$H!f4u8llXH-=_kk z&R$G7&SSXyIFH{hN331vmX*|d>c;XTZgGf~a+YN8XdRZh~aeKosGy=nRXDMJ1ai4uT*0>E-*YQ)R$v?tI9dAG&T z^GlHJt0g4fmQsTTu3qZQe!jTD4-LC#$npcHS5!tR!$;Y{7M*NX?A9G#aR3n5zbPok`C>6>4*Th9r zpDlu0ukR81dXiDm!lSBY`(!-?l$~conHVp~YZCzOiPzPI9|-8ylgAq#@8+I^a9;AB zFFZfxf1jxXcw<}r9Bu8XXD8Jm3*NGnXms{I-HL^(SU~JpJVsKxS;~cDppNb=633{^ zY=ZvKz;t_sNu1B_ZOpqXhhZ{X;}`Gz_pkP0d%zk9_}QK+RZBbzOvU-WiXx{Z+so~q zKh-ut$R}TxX(W~QePHSNK6szrbj;7Dg*-ti0WT{=5*B=#tl=BnG71<7~uUvlolVbm-8a;`c;m*uv_CtObRxjgC;#1jRY34K1l)XT!EU(w6Yaz$3*JQwb>o_aP{kT!SeWxv1yR7lF zCj_?Xo?;h2-jz>9Yv)6}H2cAgjm&N$W^_H^?Wl^sb)oW!EUQCGtcPrE61?Hwizv8V zAh8~uou7E^Z;r3>2O@!*%0hXRPOCf;r#=igmKN!h+2Mxq*+u)^7zk*U>x%X)T~xi= zB=IF>R{^S@2}dsmd2aAek@D&Xp@gL5{@+;g53VtoSnEbp*QIVz`6mVh56*>!Xit1y zOjv+k5VzBczP|EdZVGyh9fiPtrw+zx|`}Mu|@J=Iff4 z^T^9eS`VrQ4-WIu81osPdH>xR7y2&(Z*Nlr}n=_gYtrVtkw-cu`vZ+}igBJVuA z5Z*r0UHy!8B`P&~k_cVpIgojXo|eDPj88wd*`G|?0yMPeF3ADEi1^n0MxqWgM&x?m+qzbs~XQYHU9IfttB@ND6+e56n>_EC$!o5uaxAHBCu3c#|iGkcB=Tj zPardWR?W&C!q-f1NtQ0QsX&(6)0Q-I^DvsS9q>|Q5?Lt~MW9*kIlN4@-@AP7$RAnt zc1R__G`HKn;c{Zk_9Yeftqf6Q_tG;n7iN7M*)+)(*P3zim_;vJ!{q>r+yUGpS@6v# zH`O@7y_jD>(;(BPi)Tg(Hk+yO5MPg7DdI0l{_-5hR4WQa#sZA4O-4NIvxi?-a zuXL5%U%Hd7JG^V0!UqjXzgfu%^^_%U)=5{Y6J|+LN@Av$)n=YMA^CN^< zF*`qCQa{#}UjIQq?!MoRi^E`Gk&T?oYNGxk_rwEsl`_76u~a)hM*{u5y#sDEcMs0b zHBbI?sl;S5m)y(%Oo)VL=#L*_R8QZ)$fbJBM~qWUmB?tL*UZ6P<`TyFb4Em%h>bQQ zNXvz0Oq1xR1mbO{Babmd`6*ADk*qE@!L!we&WWm86BS0F+Pf3T@Vl)K@qlCwceCGGLWN%g zh0A94zS#rYg96?1C<%;arY^U69mRr9`YyDFCAsEtvBj_Uy#N4oH6O-WC4J(Ao#M){tD@|5?rP7a3 zDk{zvH9hn&4A^G#@4Dr?9=qrVu}xb_(&D7?q8BUG_^k8~)#>Nz-z}>@N9YtzuX85_ z(_QQt#x%XizdX2A+c4D~BhfG$57k4oN>vQ{IA?wR^MSxU>wU#bv%>TUKdV<_R=Jts z&=Gg>w__HAVpsCH#Vz{KAXPzf2J5y6GFCCDsp-3|k_O6JJ(j35QmS$*w@5U9(H#FL z$<_nIliiV*o>W_rH$C=U+YW$Za$l?Pr6rgAV{^4<y193E5P9;g$bbHE5?Gv)MszadviVsUttqD zs!yd_NHWE?6oz(osxK}gY7O&zKYnL*D0ueVB)1E9_>N)K z7igPfTmIp&qbulTDJhKZK;)*S#A}eFyY`o~%JwKE`n&m_-)31&6E%NVZqt3Abu}w< z%5U!Z&O#SGr2nAXc$Aedf%~kNwL=ts6suO2ZAE42DQFD49PyST+GgsvtfOvB z^=C<=%2VZX$|K@=}@_ zNz2xBBp1##+5{cta&A(8FV5W*BF`gte6Th2a=4TbQkqzlt3oDV&GRfXU)nfiaOO6DHSkj>+9r3;gGt69s3v0 zAMK>7>;)wDq?~L2_^KLFOUCcT2s(-ywFdxEiB!3*XLs?HFJkKfMsp+2{0|>1wXO|1 z(G~?N8NjsVOX#~eS%}c^wUwb<=DME+H?nP%zJc{;yOzSANEEw3Ha4w4XaQ=z^H~oE zFZV9h-e{HmPxIJb(_e!|39^Jm{d)E@=JvUE+SSAv!YC>7M#b+eQiGpHCdiGMiTAly z8G6(@)nf^O$?3}>J3bh6t3)W05CipfraXu_*heuTTH$k-hNc#8JGn$U)~;(=J)r4v z51!bO1^^XbHDNh~1td~YE2Yol*Rt7Dk1uWg&??;C_>;64dIJSCZJ9zVhN8x7zz72K zW9_pFgu^44i?g=?viI2@A7I&dhm43rI!MPoiz2Szskl8iN>Az3Dm6j&X`IOW58QXR z-OL+|KnPg7R59#wGb?;!S%wthHm*Z?s&e56e~o0E=@{w+OQCC`pr=}413uD{<^N?V z>pmT-T?gf=Qb7S}2(>x54NP*9Td+P^4S0YwppdTE{w#%{LZjvgf%VosSnm1v(mP?N zcUPRh(Q-!tLL^`Ue7G-mdY@~OEVZiX=_D}{4Xdqh!Ol=Yp9_aQ+SKWN_<&o{l@j)K z^*1WlrmGQ0+T}<@)GuH0xbz>Z*sCnywgUDb&8R^9>+Dlz)0rkm-Vz34mqm+@Z(ZV+jk1VgWa*A)(Jk3>n#*H`$ruqbCQ zsD{(Ws%V|`Av^qKGAnSIYjY!kYtuflR8R$(5>hE$+J{rlXBVujtn7P!GXJ#qHeZ^h z3aVvyuktMa>rZBRz3rBa_mb>GuRxcZq)zFVi9q(eEa51F5y@{_RR+sFY^UaxzmTGf7av%%M`*7!E@v1 z-d#G7CcfC?xx*%|%Y8pW&6+pH4v_VYs!HNtGgiUx$K^YTMz03?=P^&(xQp=E1!+ff4Hx@k( z+!c~PqMi%d;?J(P?V84NY5FFT7!@gL3|&aGid|2US9a7t$egOnF-aTJv<$Gm;h9fZ zA$@;?HnleG(5=tQC}j8!t7jdD-3i!h7ZaDIJ%N3#FL8P2UD4*a0=Tru1Sd-yo2ZWnh~C~q`*!F^FjEHK(c0o8AulN(Cn;f!0Mh6Y`wU?7~GjqLb2f^{m<`Z%eha8 zh;h--gp$}RM8q83c3>Hz6}dEnTmRK5tM+0>`}e`0x>Iy#St8fm_=H1Bmf2NrS&ITU zi@a6fV}g;KP%j_AoMgY%FliTA+zMFM+ndzh+(!Pkcqnj2I6#czRzy#KXh>7Jv=sGN z3ie*zW<1t_hL^5)`#B?0;$Z7$60wp`MMcgUL+5?F$Q1St37C~_@nipZ3t!>x7hU*= zmksJSIw`2q5;nUnR=GHm~q<2o*~1sdVaVa8I*+-Navd^e%EAoEn$7<&@Lc9 zq)Li7-ZpNU6?(Dx0Y>nkcV z#yblTvX_7cKQe9@0`6g>iXw6G zVuCYuB62oGpAPEF)xNr_a-+h@b$%0+7i8yz<%f|l0jhmc3~Fc?8lm)#*$;E8qb8mw zrhx#c-pqD6P;9Fo&E%&6=J6H9)UhW((R~rhV_piV@o*{lbNLI??d+`&dDxxVsXRYT zg7TwCMijzDM9G#bP5jt+xD*din1FXxxIK#=FNTN@pv z#2!+c!gjx>2n?2nX(vt7k}|v*-??cjoc8$gd9oC=Vg^01ci#-Hnk$=0cBlf})k(Jr zhn-L4>nhyWCf$wef2`byy&Q!c!izPsn9$3}iYMOlO}OhgI{V7KG3*iz1DYtev>_Jo zqCUmL3jAJxUNh_Gm{{hW)GtFFc3)H>-+f9cD;dx8wCbMlK(z-9-8Fuj6M7`cwh_7` zS{BIRvR(axU7+leGW(VUy!e1k`c;QZ?QEp1WMP}UjZo|%`az&SEex|lqBG_;L9l2z z4pTY(toC(?s6AZouC}(e%GOvh$fHiiEr!Qe?FXps70T%*(B=T%&ypK<#9P?us2|J> zxZxdkazwLZ=vwRr!f3GJpSlG4n=Fbs%Nj=lyFfz_cB=W=X83;)1o%HYxKL$5AQf{h zEBhVz3=G)-j-&EM5{vKhLX_K}vsQpab7AT;GL_)h&N7dG{V;f5lPCFsY4qG1f1)6; z@veN}D2Z*$B@@1+fOqUT@Ns9`tlf3i!5xxT;~Wjm&E&<4Mc7ti)R)A7=@V`4e}`co zgk;S|1p!r!u={2j44R!5n&vGw zr}h)AA$;ZLs%3dpZJq$v5g1N4FMPgu4(`W1ntY>CD%vIz?y4zn%9B|Jg5I4r8IrQ5t-TsCF3^HZSivjr3R$8{nXiUw@+NlqO~Y36{3~$%?Swz z6L@JYqzuxbR2{E!Yw;5%8U zqLfc-RyR7%x;LNGK$~~giXxMuasexg{w>AwIt{mV#Ow>-s7P&H~! za;7-lD=`5u;}KEIF7d~-%b0V*IAB|sM;`5D_lX2_&=tY+{uyW+?0Oea3_hg^`0wf; zYQT_35(BM526*S3R;|yiW~7Sqi8zDokZ_}^>iAB<809}I0kT|2CI3_3RN;Sp^!FZw zWB!lX7F35BxE+?Dn!r=lMaKW*}ZXkF;_NG(Va;^km@Ur76`aD#!KJ_6{Au)a9iUzFu< z!GO0t*od(qkIWOu-udJirxO^g%`snXz2_=PEI@iB>>Z#1_5t%qg*^}MsBRBiY$U75nM|)Th03!8aSFOxXCxtY9$oig$1U$RpVq&F( za`rAC%=!_tH~6D+zwL)m)v4tc2_%KHv_FVlUkO)J(EDulOQGN1N$R7pBMQ~Mhn~(e z^O}vj-}@{yh7^i9dVEn{8nUei7Yeen8z&Ac!R+#fLX60L{O40~T_c}$h{QtLkJ@3k z^xK6hxjaJ`fz;&|Sx_Ka$iTm#)iS$CL(uH>FzaU50uw0Lo;|PbDQ%$AeaSum!TVs2 zSnYoD*O0??!~R@lE~oJl4GU**J%1N>3#o5ZZP;8N6UDtZzfBdlt4c~ldNp4>qj)Id zf9HGmTN+-m6~y%L{j>zTvcQ7Yx!Rl%>6HAe=X+)<(eq#>OM2wAOzCJ zeB?9sC-_j_=P@g3iBD2^=jqr~H^GBCc*y?8dfeSOvBVb!W*B~9=!E#E*KzICoxc}fB?f1SKz$rCnnqZ>eJHa+GrlpmW!C{>`3{@Q<{0Jhs3AW z#*elMYt40z+mp*Pi?D{GtG>Hw5Hf^3+wzM#{tzM1jg8FHoW4nQ*8!_=;+#_AIuF_K z!(A|r7G67U+cHZ3&^fTEOhUrbRb)m`cq1~egfNwgG3a$&@dYq*X&2Sfw}(P^AsmQW_{)9 z?}mTAu`T!bhUn9q12zd{j0}ilimfC&b#xRA$9@7cDKXLm_rmiAlWVlpXuS)4&SvN9 zCSj;f*#(iA{cJLG6v&Y0V|MF#AH%(MjlzV^VKPf}AU4h%hODS~Owci1>xw2VkQC<9 z-->qtK~2SPSykS3aV$*ZeME|c}?NXx!-Mb++k#A2Zw}& zOsW5%!wY$G3&EAydhu5sWs<9N^4%5#ZU1#^v|6K>K*KSO-PrisF|G2bMv65Bd;)^~ z-3H7eP&nBVR7=&BJig1P7H~J#&1VR+>*bkgbjL+cmuF7_zP+RLy8y6mIj5GE=H2@& zuI@blVO|#Kxx)~dlRZ@4!te9&qsZB=KD$=xMCV#Uq-d*N{<#4txO`=E#5yjwFIl0g zS)Vqxr6fABWYD9Ums9(?FODeo$m3i4$mhC%YBfJ*Q0MeR%25GhiM}V6R6%)o^DNP| z%a?p(@Gp!$Lw2U!xAB_qL4py)a;HD?+TghBOIbZAF{6kXq0*!-!KxNTRIgd|I5eoU z^Y^Q!KxzcYHr2JN8Y}leAr(C~; zRP%=6)*?6Obp$jb53%0|W;pIQ#hEF8gj?B$=ysowv@+NyaCBDLLt8$H^LBcO?Oox8 z3Py7CB7!zexm(m)HozIc6K#ExEH`CAEsN(uK(`{cm}7nX{(ydYe6>Is#KRHZ6RXFB zYY_5*j0la2rE>>N#`jUtv)}i#tTTU$$Oj`AFPH8$T>drK-rQ4P%con?#zQRpD{R#g z1B9&z1KVEE)}sXJ6xD9K>&-yW%_`X9vZo``22_(wXq%HO+kMCWfNg%liHkR~O@IM} zRjfI%_h!G}Pp;j@d_@q~634u(^rt>6w;QW5F=TtBH|Z{dc13nHJ}>Nw zX6AfIf&JqE^X1u*8hTFA4TjPi_%g`-=JYpf1)mi)qc>R&wz4N?i!`ROH*FrrH*AE* zY#ZZx<44~?q?rVRrdODF4atlAsC$^Z&bHa5rME*-Esm@+gEl=~s zN@4x#C|d-_HSo&ex?zDkbNcfOOd8yM%u%xl)zlOxYiDIzgp#$)5q2$of8-`U{N_-3 z02fie$LoK(miC~3uSd+iD?RIww7*8DS{mw7>|RUHi8fG{8g(kG$o0+hyUCNpE8xkj z8S1s>P$Llg@~moNqCcp-PN@q;(!SW%DO^hQH~FcMHGRbC?+M<8kJLZT7L*K3OVs;m z@d0REh+GYb@ERXerItolL?XW&b?lPAtJg6Qv0u^{ntB3}xz?lyiZ-NieXk zvo(@lvX&c&3q8#rr|67jk))<){sh9};f?z&k7OxanJ*Kl%)GST&dn6bm786bX#vyne{x z#QHf^?`j$|<2&S-d2mv^&{8cQ`m*3ns>@E5()%gSMo1B;=y>j%ywV&x76(4P=A?&0 zKirYJtZLaxzu(vt8eDWX?kD}DVVlebkQMkWRQ?TxF4mViEkt7L5E>|CsFJ+254 zX&fXhB!PW;<3X{p+rb`B;Mv^GSmtcL)xMVVqK$+Cr#?~N*IjBqO>)ChLAH0m4!p3_ z_XkfU>g^j^_CE47X~UYLg@ZUq-@EE)`YNCC0>0d}zT|Sn0QpH)l8>&wu9JlJz3L%= z6|VKb7*10XQngNa%1il!kLjw#G&6-xgEWAFhDW*a_X8 zBidBg8?)H#lg0BHDBdKvvgcEe0g~|abndK=@ayOaw6P2yP-6kd$)uKt_*yG6UB*iw zmWKD<&qhRlXlnm6{K#fjVay;m#M)2Dl!k)lfmk)-&g$)7y)v#4d61d|lxgeyL-~z+ ziB@4d_^E}Q3casg0qb0{u0FnYO{?am7&GbxxWj{M?Bi@lIvwf#yuk3{#|?r4Dv%0& zz?ka_nVNieLvArE1&t5O4dG{jmYQ=_*$xe?31auKKm88InC7-(Te|?DN$?HdP0JV zj8}o+0DlViQLZ?uCDS8}``VTXXq27I5rMXGasD2o9@jG2Px< z_;&FNaAqB1>xxtC`W9%BU-ffUMuy7)0rd`>Mj^CV6Ib@i7Os4IE~cM9(+_dJ9FvcY zb0q8=_5XBR7`3NJumP%~!JSPc;eUb%3wHnz54XfI_jhWv`x6b4)!wwP)2JIP&@!4Y z+51G&Lpq;Bx|2K_%%I>2*MYgnR>KEVaxVdji?)tVxG{qi$%Cn-%3#DF6DMm+HCkJct%>7qL2n1N=i zcL{QwF;b7Ff5pFhQl$XC`g-Ub!})-&Q*+Jn38uX*t&8q1GMxJoZ$KNhWbPpyQ%WfW%$BZv$UJ5ee^y&_<7H&Ogw7c_lXsMk+{34 z>_SEyuR*KOtn(r`;G@=gyNtWp(&Qp(V#V~wP;wBP-FXJUCcfXNC}CQOg9in@2qhOr z;WkO5p)%KwjfcmNJs&xQu0gY-hI7KL3zRm)%~~HDs$ZtI{CEL1!_+Wz1;2_)*7>Sj zkuAlc?pWg=(EH*yr`ZE1y&NNfwWrWzRkj$ljdQSD`JB0jeye-@n7TLlfQy9c>3&%v z8QR@jGI#*n{!?q!2H-U>Ui&yN8mIkpX88BKjutL`pvo^qLG4fY!+A(9Tv81EYTLzu z=Kmq>y@TQY`}bdEwIF(n-X(g8x>_V5(bBZ&K_t-o4CLQ*bOyN1oNqB*@*4T~)6K&pwitbq6nqwvN4EFqAalVP?55&}C%mMs{? zAL7})=Pqp#K(AYD@BEi~68Fn}wokK^9q99iJUmkOf>Dj2iW-I1l)=ccW3hI3XQ7ZI zTn51}vNxiR=mQmveZc$YlB^Vsye~)=oikV24yeb9zkeo^--nL`>gnFp$q|^o<@jb5 z@h}WPK{4;r#Y^*-+=ZDZWLu<{o1pkTa?QVVYm8!-h4aptLk&+>WXHg$M+nx$Wr&No z$qrTWX`pTFb`@mLUJI_<>+YV@2~#0_YWOUYUpvL>v;?)%J%e3c{I1{JaiFkGs#x*I z5%mhz!$j6LWn|7J6xi@ONl*%ua<6)|Bv3a`&EH2*hbbWD%r?tD+JbYI6<8tO*?jP~ z&8}x)=h9vkBGJ;ns61MD*`Ob{VNF3ihfvnF-Es)uQ|=$@vvaIv;sVbwvTofVHlyF^qiNcebiiUa>~NDx14$QioULfHUoHOE=BM{RrI!!~E#OAk@}iQM7Zt>uT%s(* zh28ma3wQ7ML}E60XIMl$|AbncE|S&^?r^uY0eYJmRj#AATOaHz`vZGvY62(+fQtctJ3Bj{!+w?%ziy*w zXS(=+C@L-$q2VG*RzzmU!5+oIdlBMu2iEw*_vU=th>-(gpgFqVpf(l>G&~4@0{SId z`(coG?|$HA&q#1GGk;@Q|9`S?jT!m*4c-RgO6AG`q zs6+oJKeAC~ME$2)DMifu2R>j!Shw4FkKZ=temJV~2L79v1kEwFmV0jw`S&<0Ek-QUt zn7e|#GL%+<%rVFm8-&}}9F6jO`p*O6e+%~hA5cU9xf(E56YanG0VeC(zs4`9JuU64 z0=KGCT3-WC;MzPuw-WN46|DM8Dao9G*)bdO#UR?)(uD~xxBbK=S=tTU#{9gQKdE0u z>u>K-4QX(NK=k4aBiu&9ELTrWlO%Lsvpy!2c+$7_n}RQu2G6MsdPgMJB%P>mSg6Nk znMp9mQe{9r)U+wwgCY1zlU%i<*d|l*sGUT@dc*14&u?`9I!Ta`&tlaMUa)YpsA-AS zW3}Y-*}IuipRyChZ*y0DTYchKh4OJdHIP_8jR8zj5q~p6R3(T!1jRp*N+*Ia zHe#AEAv`4#vHX>46-`k+aDIcU@HU{52RiIArmc`kkg@*_-sxZ3*nCS{>?cf!t-FKs zsAQ}`Lf8BLib+{;Oh;TkvKdLGz?|1#{gnW8Vg1PaWc5nO!jN^_2suw?{w42LIG6u! z0@YH$f=veqZdV}IiA~pBe&m|ujqqm&u4WEFm2+cM9V32u+NuTFGH|-V@>rgMKu0S4 zUFnmjH9_gY8!di|-_`fPRMr`S(;A#P-{QrQFj(vEf%-{Ypy9lGAh8C7vwAES$jSt% z_@j-$vR5`z28M+LFjn+_FQ>cQKbO!v+J+v$XK34LM(vN3mPnw!o4mrH7qfT>hLtx! zRjys5{no=%e}I}WM2ZR5(&pakv>S6g#5vLqrW!&N5=s$~dbe0P zlqhJ?-oM_$T5(~&Sn`Snpbg^0>r)k`QO&5<>swX_;z4oK1CAYoewoVbW*%wWrf?wR1XboDq>ptpu|*nD%~H=dJTe~E4@G6x?Y4*h5&Zb^OS}o4=5jjHBCp@nN-%A4$cScD(}5`Y5i{)~@Lixq?_qLd(Lp4+ys35c( zP6Yvu1sY-rbg!2lLR{7wWkN-Cu04WD!Onx`>R7bHLzQv|nvm^Vlu>56_&z~}9IbwY zeh-L0$iCm|{4Pdh19| zQtoX9vQF39cc92z9)k%&|HazE4`bDO_X2=Jgf`}XdY((S=zyQ!mgn|U%Oi+qDoV!N10M}^Q<6zGR2lplCQHeixk&YJ$XLHdP76{_8_yqq;@Mfi4oZ zwzs9!<3i0^a4oRO3M>8Q&N<(IB<<$2&0PV_1MF^wP+WnP3yUNAE|Kw+2dI zBTK=`M3{vPkOeYbjAabHtfVxGSR=Eo|1u)*vO=gz#X1Z+s< zE5K6H%Y@V{KYHzlKQIp6d7-*Jcni|-zTV#|aKaUTP(00z3ICkf+Lj3jR<0cvXrn2( zwEYD$+zW3543FDwpJpzkbh2H%ZdWL^v84QUlHlWOFG0|MEP~MN-fG7tdy1le7j#eK zFot0HO<55iUoj|o;-^1>Nt2xQ?s6$Yh4I}$DsPJ6_+;E+BUw<{pU${-)XznGjxZpz zJ;DAf<(V$!QKqcZGZ;APyVyU+>Hiho81(+y$xJ3RSOA>N7&3W63|+~5Vs=q2fVROt1rF2Y%b2*^_n3+VGrs-h}f9a3j`C zq_0o~$j;Mn*94KT8d)>syu4C$GUrqeGc8#alj+1EuG~~_P(FAu#wCJr!p$`>gIFX~ z?+5qh%rDrECU$;ncsd)<>U~$}vi`S|?PWQCr_VPdiIs2giQg~qC#6L!-`$SL*@<)7 zln&cLl8qs9TG&5?I7N^x!j}Xcu>fA^iS_rdCR2q@YNk$lIL9%tOI0RW+y}aVelLmv zPBHoLJ!|D(mtrZF9idZ~4>bGd0B9HQ#%LkQ53=7T$D8)XZGp-_U0j^lu1!AyiZ~L9 zf661Y`0PYjWb4N1MgI-eB;rWLin|rqJ2L8t9v6{}TJn<1h)t6w}GwPo_62 z@X(Ie;WYIwG9a90tEA7f#K*=M3ZQemeSCV~y!OpWEW?2=+;d=`NXuG>+gh0KwN9_G zK?|3%C9;eNZ_i0!a$FeGg})-YB2F0>gN7*)yZxA z9N-LqEQZU$KY73+g$M(j9q)P86Bj#hHG4|{+aaxh4}K9cTc8FfSs+`Q@jb^nUQw>c zS0Qd=8z2Maq=9~MQyv$vxARd>x;qCDcEbeI`U@em7rC7iHUxlS z%f)zKzjE;HMCxl8wWfp)uZKA7G)|)p@l!LodbJVJqZ*%RGUk7mtq_+OiGY8C(%8)u=by(PUHcn!ugY%R0voOs&2&JyzoHq{r+oc=J!z ziG4|yfC<@tsqJk*AhANdM8%WC_>ID$bkrl>%WbNb7!4!*brky)Wp2O;kH@c>NyGPP zf#Qjbm5=~~J7wBDjjWVnOsXS24yJNRim-Sxy2WVOa$ocTA+$ruB zr|1R{d!uLVJ1@oXf?kFhWEJZ6n%5#f9=X?uuO?F(X34vCbW61TU8RzE{l+rw+l8>c z4&y^F{g+W`GhKQP{N~22M%vAI@J!af|6@ev(bdj&3chWc77-C#q<;?=`q3TQ=w1o= zli1+9^9CxBttYrK8PRh~C{tb!TW~kIrpzKP**ER?P1&#`Q5KRXmRgzIP=bu1nR~%4 z%Gh5v8hGtjIjz55dlFs%Cj+sT0sk>N{cm5QO9ZYjJn!oLNq@Xlkq+osL95EiPf)8- znC>s%_?q+N)VF|R@h0Qh)7xJu1Kr=rDn<~IS!L(@kQJf&?~JH<0k(_oW5$fxjYieT z$(fhTj#BTgi2~A)Bug8{o>N2HCS+_pnpJF#YZ#$vycIy{=g2D^prDSLJo5u(P>3b9 zg`aD0i!kRh|4d)=rKnpNr+&k}@w4`0I{0Mv9@q;GP(f;}7v;LBT2MP0BM~&*#ZQ>% zz;NAv5g5lWBnSpc9IPUtQxja`yL(0J&r&aK10tnP4!9+nZCw5T0?@N8+xOuN)^lUgJoq#1f|>4v9o0caEIPkaVRFzp*Sm!x&hJ#YG5ul zXSv1fY)*5{^6K2d_{P@ARf75kqM5T}H~-|_sS!ci)!(qG5fvGBLxQ^*9q1M7EXo5~ zuuJ$FaFyj4al92LETMGw)ycxA#+Zh99;WD=b2=>PFc6Y;aJsMBeGdAyyi7->?-v;G zL?6H2^u6pT*10fHK!af4EA-GQLa8r&`a>S}mgdEX`m3gc?gcisCzmt?`@Ckr06A81 z;dML5-(A@vD?oKG`%LC$u8u}q;DwCU;<(&ro!wQCgjnygcjU~_zv8oeA(u|wWyM_0 zC2fTCz+C`OEKUyO^ciNqB!fRiZXA{uR}8#Q#8^9(TH?CHFo|Cr-&l6Knfp}NP1)(MBx(i=tl$a4oO5njBaPRbmS!A))&B)s<5J;8!fiJvA-7+dM5FLW8Z;?>{x!iKcfmzj$e6u5{cqEyQz2 zHik#*V*z~;FPCUO-&gEn3E#hn%XT^a;eY-h6t)$xGw!cDcCqYNOJWu0ev7mMIO!CO z`Q#Y$PCLunV^9}13ZhU&r zqmDlKXax~eWQs3p#rI&e;AMiHFM@wkl!{j~!^(PJU-F-&!T zE!C1ogoi>-*-w~*x6tpNRo2VqZ8Mv>#JgGX%&wN1RksLNBdu(kX$S&Sci})OuzDcx zXZS1ioI?+zHi9V+a@*YTeo5W?i#sx8&1l(%nP^=*OA`ShN74p9`1+gbbXd*P1(@~WA=sBzT%Dy!rc5EM=} z2v19U<7m8pNAZ03EzzR12bcLTq{~XT^FwbqtoF&O*ZNBLp+%O z^1VjmP}sgjX?^tKL&Mat_m~Gh=V29K0?euy3rMww$->Y2ra2dBF{V#IQJ7(@=ncy7 ziJvL4um7^!#05^}h$;*boC$yX!QQxK|;hQWjOrYm1zGI zJDfc;kk(h!Yb|aB^3{+qQTXCUY;+fO|5+PW4(cWBGT<{ zpY-41W9)j9P8wa0a9WFKbWSgwC%+O%%O&9!&sm?8Cc8SBM^$@o8@oD^iL7$bP%D_o zM0m(nL#7sQpQ2^%abRdFQ;RNaPRGXMxqIy0@hH0Af~Gu2wR~pZ*Q<;;qnIEsI}iT6 zb$!9s;k{kIS|wM%`n@ElnO$yehj7b*5F2)ru zTq5jIWGA`EN;?#TT69aO&efrG=7Fyc@e%t2fLXj^k=0k$1#JIaW7jW|#{cU@T0(#K z0L$6mY_+UsoEn6Z)NG;*m3iTv1g#4QAyV(Ow!nr(#eLpsgNxW(LfKD_3fge0bD5PxKPZ|3M( zB{)@E8~T$ncfhxF&9H2hD!c8Dc!n#8tB*JvoAes~ebrEIQM$Kd!do|jEr zOs{ti6%>iCq=ueN`{10+NQ}*3{v0DuQ+4gr!w$W@Emy`wL3>d#`_rTdt<*GjgSTZv z$DnPw@wM05hpvFUPOX}~fASF%9q>c}^=0bi7_+z-bpz`jT%{&&s( zcls&E2aZyenj;U8Ai~e(R;M>FHX+iFSpIfD_!}lnS}p#LXh0ji;OD4}6U(}f{O){6 z{L6fzj@k0k6nbo;rW@_g|96P9u#kgRjzT|U#Rn@Y9=xNZq>$Q^@o zE1PT7bGY4Qp{U>D4<7qe-a)F2?X@b^lNt#Kt~`@ssV+<6Bx{p?=SssuUR0E0eL8mb z(7M51sLlU=^ak%7&`I|7G-s+NY~4xIt7|^PkK#k(3*e|V%=+xEZ6W8wRm)GzWj!-V z=~Vgx5a+9t=kTSHqFn1W``ncn;qoQxJ~Nlj?B}R((UF9oC3>(2=27{|=`?G+_*iKJ z`@U-CH^D27&i%1kuRuKEIiH&qKSwx^d*f8?5>;HPuT0J6+CeI!IJC8+Jv z9 zK?!O#g3-@^2tFk%&^D!3HhL_PQ-&$CI^9Yp7=A5XsIYS{qx@qWR;INjlO345|RMT|t@!5i}&2FNmG6Ck|+$?y(bc&o6nibW? zz>Iq3W@P7F*(3yrL3k9;Uvb(6U~RKf-M^`DSe-_OX87!W)%FFF-=tmjGJTerV6uQso*D?VPSE*OqsP;kDZHKL zmn&;c4T)x%g4g#paIX$%BA?3 z70856YV0X)Ob6Lyh*oIdl2xpie^)~$)ds^GlU{O0#!UGoWB|^`B~{YDoBuqeZZS@b#5zT zu$Dh#9kvF|Cq|pW4m2l6=gOPz1ZTT5+2>B6mh%R>0tuZB0vZxHWjm%&XQV3o3(E+5 zDaX^O zDV1T6V(NQlf&br6P^V^mPtu%y0c-jdq$OZPPF4qRr~KT?>LPiSr82qyB2sLZC~a5` z=O#5)^QESJlUt;&QpOW6rrLGutmxTH&yFr=;Qp<_14np$l6mFx zK3^fhZvn%x@XnVL(Ik7mFw(&w1tt_Yi0&*dt=P&ZCz(?}#miv0xMS-%NRlFq-;2WJ zcOi%x-g8=TDw>SYl@pB#-A{DR8mgc%FIkj0l{&!@y3$Q8AD68zh+ zjyneFri$95^a)rpb^Rr}Wmt22_I9AE7D8mP$d%1Bz%4pE+gIc=a6JS7zGj(Q;AgY*G z=Q=Slw#b;`hYTk*)>^TfgBLUn_h}C6N?XfB_7bX<(PWPqU6oL&&OGDkfAO-zTA3=L z0QA$7s86}|R>B#C?})hq=DpW}nI@|QmNUG$J^o)*xoXp3wf&qWZ;mLW*F)>r(UR2VKKU~YdlS&lm+_%zYT&T4t3Lc;lw)OhPa5{dsidhzSp8WVx) z%lfoP@vWRQn!5414T$ENC|!M;=HjgQ$Rh8&0i&(YT$`U zTD+5e>GY|Cq91lo6m}sLL~<*kG++7^C8T-02tRV(mlD(?H#K5wf?nbogsf}MGO$i7FW-PR&KpxQbDJ8$43ye;WfzgS{%!7>Me5!4UDOXFN)he+P_xrhm z&<__bW0glCn^BMNRMzKFWL?-MD@90&yUbq`;2ioc-whPW+a+r##uuLi`W5+4^L=rB;5C zfSwx7D->|Qqx*;1EP_Q1#W>mhWSBZYh6NG3tqsyaaDP*75aAZ$I08LOrMn-bZYv)4 zpf%>w%`#=bVEReWj|2MJ3ZMxEVN%&?m4pnWz*fLtqG(c(3d4fhh1rf#ry!A1pCFbk z@@+|*9t!-yRQffm#by_)A*?AHKfrRt1w{2dr_Rb3zm;y#S$v+@rTXSe+H#N3V^G}m zZ?8^^gBp8d6_k=xj|+cvD<@df@0|{Lrh@_!nYKUSwFvet{`n-1v}|4jaX`@RSEPgWM7hl`5iC;3sJR=)m(#>) zN|ceRA>0&Wu?L;P*6?{kcVz5mx14j*H@t}l3bkMIzB~j`qzjz6DunGE%^{!X=A*aW z!>aqqja%#JbwS&v!>k8$0O21sL60D>+X?s;`SZT2fB&NiX9!EHaz(gh#fNvwy@4;o zf}lrtaXLc{j$<#tXc!^X?Bcqt?%yAy9uV`3pyddr%GW~~hA^mL7??^}^nfDBQa?4H zZZqB-hkJ}{j!%zRp|mImPWr2ga_~==50A^=g(BTIkO|x&C%!{>pogeN`Q-G7=3<>5 z;R+~E+}2OSG6F)33luF-Ix36K{4q?0D&~6M>XG#_C-Ro*-S&ep3NGa-_L7?Z{@*fj zPO66OsPam`Xnu;qxp-P6j|JzHsA@|A!_r=Vw9Ro%dkx=MYny{$mGe!_MTQ z#c?*UDj{YrXd&TeuO3Vl6-1w(pKl*>`hig5s&-Q%;^=QNsF9O9x+RxjhR9Zr>Ae$C z<}%$qrujL2sg46so^;wC-8@ms#_|t6V`OZ7Ex{xUw4RBUnL}<%#7rOa_@t##Km+!aMdUYSk~Fkalv6^9*FTnQ~*)H+Q4es@v! zU%faabR#evC&d%*DKZ=b(C7wf(|)+JWpV}UYQG>GJeC$QC)hj3XuI0I=MmG5VMtLI zvwx$UJs3)-SpS?_**nEEPSota+Jj$h70k($DDClTx5`TT=i(bWN&aa<_DR{I`?8vJ z;PwNsH{wLdOe463=^_y+TINC@U_R%rZtCu?K!~da%~_^?5?Z=Bv&gV?<$LrPj2V=^ zk%kPkIFvmjc|D|N=2(iKmb#=w$oS|madQvd+^J^G-^W@pp=(%1lqTiO?%DmLr+K7_oxuSnHY_|4UP>+UM{I>>j~Wm=PS4iHUWjvFy!016*g6;y%VSsZwU?CAvt3&B-y@nE(~fyBiBcw5 zm)q%r`eH_Y8i_BK`+#iqlA;PzU=Czm&*MR3>_yGXYq?h6++VOiv>ARZ)s^_p3GmH; zJmAN?q?_nnpIE$^?8-BN71`fh)}CYo&Gr1*1)2?uf(;G>F{YCbG1L8zQJFIRjl@%d zDuFUCG3_F7Mt}c)=ac(~OqD8$^?pb1z^+%yJ_n;F4Vx)SZaXh%1oX0^D=Q`J(o!Xw ze|Bf9-@xy#H@<$3H1YOKnyr-&??O9i<13*gtI+u;&vnUWsEx?{Tl96LLRf6FZ0vC1 zk>;G8pMCH{_>w7PPhXR;&{K(q1tI#cXi~fv2s;lbmNQrUqJ4eD;|1kLpFx+VoY-bK z$?kpcQ@`9wcFL!tO#RF0Ey(7&V=4O`wX%RiyjN+CSCYM9Fw&17b zf_Cn+C4w%B zjAc-F{WM-kgrLs5W_tdJxD>j7zI$$}xEc<_Lg$o24;S&>K(OR}Fc2Hr3`Z<*VXsIR zlhqfW25KE5YlVz+5IGN!cijiOWqQ{Nu4(hV{q(u-j4LuSdw+oSDg!i2C=s;kO!zm) zR8qzrV36fpDbtXP`4TR1I+xb{TQ@o86Xh(k!y0b3RJktS8@$5)Y;d$P!Y_sUZiwNh z))<(pAwkeN_nYm4Ka!=Im5?Rm?JRSfahThGXiE29Wh4E_O0{{R-dyID#TW+GbzRAY zuFMvl(c2yL@ZD3IfIeFnWW6(g@^afMHPR$TjC8K%7*^kF@S}yT?K_xNWwieW+Gv%U z8K6g9NmMyYs>bgMDcLY<>gaH;;HIi`bu|wpH~;9~N=sedaQSaE>}S^+c5>)M=LYC9 z6$r6FbaF#{j%Vy$yMtQ^B2yh+8)pq|t0L)_JEpbpOQmsQ15Ua_8#D|tdo zhTnt=i@0J{ z;eEn8F;zN?IdK{qTBGQ8zZ$juuF3?vnz7HlZ57yMXVVRNiXZ5M8okmWNM9?m&T01` zo+RInp?-B!GI*0V(1kq4PWgtOcN{&wPSwSREWyE6Q($2U+$*3|8Vr}%<-QLjt z6={gz?fm`%&QwlORXyqeQD{pGy_xu(&9EU%Gr4#2&>WS9P1GH$h-;N-^9W^|=q+mR zAE@VaQ<2E~9&^h|pnbbo7g0|#Q8i;l+rcd(#v$1~cGq!#=D<;dR=}u+W3sNW)6V^6Q4M zD`>e(swk{eza>iW%9qNy>GbATyU$DOnf;`w-Lhcc$X@ey5BvuW#t6d5Vd^A>itKjm znPscmb2|#+&`Kuysi12E!I zwgr-F8#Psqys9&@VK?Vjqka1w`M!|^;cU}yoc?%~q+`sDIsPr3dzcu&FUjIscj8&) zNpy-qeXvoITWa;5;^w=-=br=62|HOOerDNTETibN$kQ8AFixQ#!G9LR zFWr_sSf1*ZGO8d# z`T(@hR&zqgsP=2~|27cJR&~7zZOm50q5`1#})4TlciHM&)8#P#ao$! zuFerOw{`^a_KhrpNa_)RN{mB6nPOXeMQshH44=jDyh9hu6dX3pY~N81W&wB*P*ep>zp6HF8V?9*58(Z{u427zaJkR zyps44g1@5ZQn0atm6t-dq#4I&VDF}*nBxX9jV0boWpWnnAEjXcMEmyQjsQ^SUa?%= zt_-9GBT_BW2y-j>2v9X6gD&kqLC&~U}%KhKIJRu}|V|7UtUede;y1a7@bJ&@# zy5_uo{Pd|HWf-Q|x!HW6{gIX5D5v{dq)Z{o`sM-?cs@^u`IbyfuC9=-=K|O9&LM{X0K?Mi&uW+wG zBH}@Hv|a7g7ctmWYg9^0!>d_?2D_CZHD759|J}Pg3(ZC>>--{!7w(}j%*WsK0P&`H zYupxG!P932m7qKDyKla!Co|_@^?~I7Z%BDqR`l~K!z-iQ_6pLnis{rmH6EnVHacoVIa}u3N_9Ft?t?% zb1hYC67`AA`b!KCT%b>m&QtJIS_vjyBPO@KL< ze+br_hvA;@sn(A#NF)2BjMTz|4;V!BU3Ad9vJcxYfMod1mWz9CO=EF0iQw3!B`eCo zfxM%CxFR8lblA^|)|f_jFRzafd!?% zt+J5(5+dSG2d|sZ{r2@jO=`-)rH2#)6<_ydAvFX=rjz+Hs`_{sI?jfh4>4~G8wv|MfQm<= z7OZ_u_TGv(2bJIT-|BQQefavE*k8F0dPOL8(+*9aCT)MS$%~>#$wfJ~#L_&$)FmUD z3UQ_ydY-xIC}sAGhT5N{#o$gV5X2n-tPHpTa3khFBku8flK`-|wm6qT2x%22o5q)0 zzEUa(`M%5HRoQWVqgJg!pntBhnRPjnHP#xyL|POF*K8NL@qKm?o~Fo667xvN;1fBR zZHl!e>A=S1AbXD9PWt;Aj8Xb80Ht089qdO-)8Zx4ruv?xkSvCS&7gW^kxjChN&c@RPo)awE!YO>5dvd7C_Dj$*DE!=GN3tp^0e*AE~ zy1+VgLUC)G{~W;Ec=3&_0yn<)gPNxDU3BEz*Dhbt19d;^Usmu!4zv3xfII7Q+lIjL zbb>5S7J|1xRa@j5KNtMrXMA}bGQTmR)sMRm zM_B%xp5J(x|354Mths{zbr|WrWMb!9rn~HD&Jc05W%Zsfn^6o> zHA&EL4h0crH7ZF>v&rvBZdsSCSH|%}W6_ke%UTC?nX@9Mu$KN@yhApIE0Pum4 z)q)b2p87E@1Z(S!R7uE?X(~0->}t+l_qw$=7dqeAl0A5=dqh;(WhoZyW09IQw_t@5 zDRF=CN3xcqk!lo3k*tUw7BZLWqH@@+opB9&Qk zI+TL>hs6hu)!kT$2?cQ$RD@^%D-ZyR_-@XLk5D2tmZRZAeG`|1q250s`gI<0+f*5D zGf+fM3~A@iuP4}GNvY>BA<6xg@Iy3_cWOPMvr|GBOQpG1VQy3I9 zf9n5!iZ65`jI_zi>g`KeFC?QcFj}Ztz6aB-DhV=+?9m1ygPx>FG>b@|`?RmW>Bwsk z;sc$2nD)tPu?=(idhl`A=7B=JW%9=;F`D*o?0qHbn z%r;)t;d1-Z0)ATsA`fiVz7tftM$9*6wI5~^HB+y!K3>PYCwMvAp18DzYl4K1tv+!U zjp`q`kJhvgeI7a?-=BY51}pKjXEp2l@V%Gak0w63Nq*3YU+8H1)^r6LxL($@cC3if zT>Z(qHP0ScnJ(%ROatLd3*#fvMMj{h?A7Qwd6n)m1U z=$zjzq?7f0X1AC8@z=FT1 zK~~d8L50%lT-p8i9=MPVpbFe+Ebq5Axhq+xARhy-)!#2%Fh{BB4WQ>V81h)&+@icV zw&+*@SQ)xo(is@T4? zefr))ySV=3BPHwg!}P%SR7KJMb5_K;FBbu>?3cyQ%yx_N{->U_>l?9uE*r>I%}_TG zLAW(+S@0PVlr6qd*B92k_H`4G%@gB^>!--?SXn^K8-TWA%_ zg+I~;+yDlI*K5J{gTNbqnO1*UcOZ}6w?I$WBn|>4ITCBV)}EPpb~-W3y%I7Mzt9@$ z3;>GF{u{dsA$V7(b$%@AaKdTx2G8i_+ zSO470d$ANW(tJNW=@dMMSL^~8EoLnHS0w0Uya8|E^RgbsQ#U*m&BTrnQY zimgV4oZidjF;n&=2rUSeka!)8-}TOy%^QSI_3 z!9k5fH3jumBiC72QCo~JOANf6U&)fZGWVrh=sH)YYWq2~&hzKg^3oY$n)0qQFVK<@ zx5l|h<*$}FZPYioHbsX6Kus^X#(4;5rGWN9nE=SZpNBe{8%>Cu= zjED=F3(;S9!-OB5Z{!s!?usC!>h+mTZY<>a_|I6J>Cfpgo||SD`-Sf9eu?V))Q}v- zw;jONikORz;_$D!D`9CGx0?$VEJaxaE>|+Jg(y2z&;<(i-2+M{6Iz5A?*8P6Y8#%#6{nVW;`^sZTc?`K(&mXSQcvv~AA0pxa3} znF0L3ARJ&;0^QWWXqsAXUX>h&ay0WM87!JFngHDl{2lu-@(mg9>8DZ15g@PT5X+Htv+=p{B~)* z1l(QFKo7|;t{pAa=zeX|voUzIy4Os^s!+5|**@U}>Z~-@G3eGqc2d?aa(}+EuBYxU z4EP4>6Z?<0ZjcaM)sGh~a=$B^&*4--R4oH#dtqNkjS;_vS8c5NegfuxF1!6q%2t{1vswW0p15Ae|+^ca&=;cyr1iXwso zP#)GC{|1)6RUNSdE{M^oOBb`^Os`gWF>a@8sW!W_wex1G{~vP?{y#RdpnKQqGu^!j z4M2UKqH`r#@1#>AmA??eXFz@oKvyTY5eTKKK_pm+?b7F2ry4c(&5&d|_DL5}rT6G3 zWTW?#3p?onj`|EKP%Q9~{S}dqxb>-GCVO46K=@h4mm-VdeGM;eVp{5sy8EY&*9x_a zA@-XD;k-B!uqlb0W*Lrvkz3%bsc;-ANYS!_MSmay=&hnVCW!Cq!*>B zv;ayCO;l7$R8&A(kSZWWKw5wR3Q~ijbOM5cO7BPy9qC0np%Z!vHPo}%`@A#%{meW2 zoaZBx;RB16>%OmFo#d-pi^%NS-G z9EjhDC0bFJt2LI5v9G9%P~^yJv&h*cE1AZ%Km0SVFC8CE3rB6glxB$HHKX*~lg3}v zahlF)eS#asQswBK@)kjm*dG9O1;wGo1x=$x5Yh5v-hQ-otFX;daCze{Q5KQ40?L2E%7F+X0jg!5(o@`(DHXqX zvPlsM9Dr+inyhpWYhdLY3)bs-r+SLO=vDE{b%(SJC0UtS;hb;1S%5&U}6&9d#LdFMm^-Cw>XQ1sA(UP8I# zz)g;3qIDtgwsh?QzFc7X{C@6;QC2qed}q-UNb1{zh1hatr%bx0N_B<)6eOp|JSd9u)Owfx1Kdlnm`{_6J^$R7# zLtLYL0fzolh_}F#>UfHy8?8Y~_YfU;lP6K`G-_^G`ViH=PS*xiM}c!uwH4!B_L@v1 z(StNrxGyX=3r+aO_nqq?;DpNbsQU?HcW%oL)Bj@HoTh?qg3qvvKePvEkD+3-Kn3r1 zht)M2nhPm2LMM`Rx-Rq|u+inu#29f)(a&{-dFtMcGkuK4+dmNDeCL%8WKW%tL{@kN zL*{38W6ks(tPb`QkyY5q#_?ztyB7 z&=ARGU^jb6h`R)~_*lo-HB)2OxXB7JwDozBkUM8aLD>6bX6+&%EZD}RzkwU3EW!KcdmfG8QcLp z%A#@DFKk_hfAyBz?%H4eARiasX7pBirBV;^cLQB%4OI7yxB=t>dk+X`&PH7mbPv4- z0`L|j_Jjr|?5L2}P#_#)`7p(wv)A=02m0}6Djn?HnjLLPu9J5`v-rw;&{y<#~4snk$dwVUDSIw3^F{}iy;L?pEF4TjnC3S#|Y;Tf|*I*EqT z=I{Iy^v>$g($0UHFA(~(3ZjjT$5X%E31e1BOVM-mz0Z~ei{uJf5Nf?^qcnwTlC@@L zz&WI1l>sH~>haL^o6Ns&dG279ccN)Ip8FOY1qu4ekJj7WUW>uQIvm!*8fl zw|@Nk%XU?PCsuY6Xr>hPzeUxmqIuYCqy64Y4TU-NoK$yi9z-T&>O6TU4hsO{;F^A6 zl&V2*OIrM>g_|l*zLmx*rHSRYPOg-!WAPWAsLwu+|LT40PFDd}mhPu~?Y`66bRS2T zm$LGv(1PfM3Eh50zOlqpT-%Lq5|+;Jgd+TP{QO#3LflZ)3qCKnHu{R6kGI2$m^P&l zf&77;zl4mc;gT5dRZC%yhRgIEQb3WSTGMdng4+!t`o3w;_vFv9gmALCp9||W*z4r3&hReA_pIJi3YvUt6(AB7W6FXwCT;_=m?iC z;Z173F=Z84{)y%m!zjnF;@kU#9pvu`x6TfJGrAxledHM~7&*VZ>+RXQ?Y*8~33gqyx9meQ5!?Ncrvj|=^R6@g z`&VM>NguPlX+MfFGhFH7vMs!lQ3V*kLUvs(2-2T5)smA_W_8-!U%A_n)l9qqg05<0 zThkrkp<_&6c<+GFGtCRqvfXH)&Q`pQvgIY9CZvmp=HG9=EQ_hRy;F+;l!qNZdo+2I zX1;5p=FaTT?t|~Ao5Tt2wYsV&gpopLa|;t*?h>CRs(C7N5`lceX1P8{$gdJ7c#YH7 zk}~=awNgBo;mV{vrx@rc!tYxtHAFhlv+A5$~JqHt>=JOq9q!uA{Sq_g$>eXea-fo^f zV)>;*m)$U_{r*>ysU^ulw!fwVu)Q!%3-jN#`*}xMptBfbd`$a1@R0UbB)#i4<0ub; z)K7ogZE4yt)1oklbK3c{a%ol5TEU3Vs}DFnPx6P{e?T`~%6f54(jL9slL1cRArLKs zsB|2f3a5+|KR8YQ;}gTIOkY(1bWP6%uu$RC-N7Sf(Q>zv=;G}T0_SwLi+ww9w6wPa zDrsq+TbBw?-61D2Z)oF@2Jzl3V1LD5F`0m8^rUW@Zf4t=;}K+334PGBv%itPf?Lyq zJrL&k4H_wpA2R-4K0U38mDT2|8;`(zXibRGn>&GBwKpRp4Y%_Z*$K{=S3pz!bm#mR zKc%|IMPtnO=(|}?KBMdN%OheKW`?FJN-pSEr7wF9XAdn+8{lQbV4V?W2X9D~-rIkb zKCJgo(sl>#a&6Vx$m-i!&%YNtg`(FW{OMvKG7A)=0mOK}k0*OXY|Rw*HuUdnQW!ea z8y9P&cw?IpU&D*E^l_YEqRL3?yF0RzPE!JXde2*_{@<$SV4Ms_Q9)~qq}?&$@?5YX zZMooxDT*HKRnhV6r(L$| zd^MCk2Y7;?pX~l`u00+UffDDmR`IciOIoAFRdT9jFI;wDSzr4Cj;b8%?@LqM21L@UtGruJ3~O-OWq{>v)l|7cBqI;CJ7U z2dER~#c8%w5f$qaf!2ExEiEnAV5rxdgMYT1<7XZh(XT#R`R$gsWa) z#}ymY9965|c|K-VEz~Kv-f;=QPPtCijeTAu;?_5J%hbdGJK)JyW?kYw36gp`cL`OC zwE!%V+1XTpmX?+Ickq(G(A?dG3uA*)`P+2yOj|I-ppRbDh<>P+_Up?@*uqQxrh0?| zs{M-Dx3tZZI&YiBG8=-&eBc3hRLPIt0>2(7dfn(W&#k_tNJ^@b-C3~e8-?g0UlN<> z4>#}hy^^|{Khh4Te(iNEb%-VZ)j{{d z6)?kx$VYafR5K)2IiM|KDd&d6z?BvY)A;3dK(s??Z}D^#@g?WYd-Tbn)FxvQga_Lo z+I$@DDbBJr9mV5ZMa~4llko>0yLAK5PTW@VyG3yWSI@rOze#tS*0vrgCrFF=!G+0J z-&U7#E%W@E^%_-sjV8Y4T2v+9a|&_ERZZBo0&V4wY?}?uKd}u5 zUyxuI3`AI1xQt@Cok0gJ&SV}eWwwGN5Dae!qDK3tjH22$Y(PCZ<)KSm`vW%5s*8B~ zF9MR~CS~a$Pwyjc-JO>bvP~)ugDb2>?tz%o@Rw2pV%zS)BO$Y+gts<@*x#GqRaVQ* zZ7Ey2+?@EGc3$UyIRbaM6e`lFq#@zAtHTMPTByzWWhao3NqJ!FNQr@O>$z=R4kd|1 zy0$Oox@HfylYNLRr6MOZ&FcRPF{abtuwzuvslC~fV%4V|myeQiKe}-+{X2&$=LG1i zx?H1@KF|W$p^{c~qKhzG$T?#$_#=YXs~-kef}3hIwg5Y+KHDjp9Vnp!LlSGh;+#>^1PbDW5(-7v;fg_937$~~coi)!f@Z*vs|J>a z6vXe>QIbSI`ah4Lvw+u;{O$Ou$K7c1D6g=|B}LPE;?s-d*tfd6&UR!6lWWcEyHEE4 z!5}Rl7@QGkN-SRZtQxpB{F4fXvLpgd_HXaLT{F1aj0G||B*uc&2K-HeR<*m3Lhld= zUu{)Wa?emr&J17)m&=tiAtyM6KywwtkE=}qN_?2E!*08_hG5Q(?ZJpfJ>a!6lD=?U z;P?>_fF@l$T`UU%xq17LvzXwtgVP$%j;T-K+IFggK&;bS(o3)eX4vR9UV~b;#8BLb zzsyU%)nt2wh5UAZc_cb5P>dqpWp&*ltCA&e;Hh3CLP-~mdyU?t2(?@ATXps(iCtSk zwPUrLh!suw;C2R~1M6Qm><*gQhYdGPba%23x?a&b1tYJzHvQ(XtlPg*b?umf98AbWXstM1C3>BJTX$kn^(8m^D z%o)(9M3X+|jK_J!k&%{o^{icYu8d)TeQE&N^&YL}DJL;~FMO{D^!cVNGoblsC?udU_$__Pj#A`acX32jap-9;;8RZER>YAlI+2 zo=tv2@~cMtc~}h}BX+0@sJzwvyiM9HsM%^V1m*Xosc=|rrG{@Ano)-?88m72t4pPl zc|@*AT9O2Pc@lEogsyOXQh)K{JHl5yXnlrNA~0A=2?^D2fd%78bH$vQefb4it6TYs z)xPf$M3-8^z3x;cHYkMfj;tk2mn(vUKQRRLK=rOVZGB-U;8@Czy9D2o$cZd4SNq|V zw?ora_#j8^iro<&0hlEY($+a6_CZ~xjB4e_pmPKWdsQh$r3IIo#nrX4X~q~s72<|5 zFoT#W+pbt}6ZOi{x0`D$_d-gGcNV^{eEJN$Lk&*D%$Cn^7&~F6pZu?4y`J*P8Da1G zL{3jnO834B7dtxojqu!RE`rOY8P=_2%1=A67u9YwyDSo+N&c7PbN1dQhfLDD`*;0H zbv)EeT{3;W1Bof01+ZUh?vWb`&Dp+=dxoHPHf9vWB=4{OGCUN`74P!vLHnm?+C}q6 zH-*5^P}23d0yMfzSHis3h(WARq@t_`|6t`O!>yq6DRg( zmqVgaM>3Br8ur-^gQQ3mWSdjSx&7tP8;=+!UzkK(D>5OZ|EKMS+5 zKq-f&@V9EdB+=)p+DuFW8SAc0UF@{fq=RAi0J7>J1^#X~4ebqetubY4CTd4?$?OLA zQX$fhibNVD*CB<`GLexJcXK@-zykV*YY2;Gl|mx2Q8_{4U;$S4V89sqF{n6%V#Lgn zBwUhR1H^xnOm>!R3d(s=|B`mTrs<=lbdq|9%%5+3dEtvO>g&-)vV`fSz>l&rL~iek z{9!?{!fT_^P6SPB3Xgnupf>ej%NdY~(Bc#1ekZWLuu2p$MHAlypccBJImMp4 z&!^r_z6NeHzizTw1nxjNjOrs`Bxj054up><_jo@O3+F&yqgOHc;iC+d^5T{#L7l_9 z)*9U+^v7y1uXlsQFFhJBDy7<&pM48$^J?a`j<++yTpDMp-*jQd*N87lY5H$vjofkE zqg}td&b{<*>8HLi&YyxN6DKkve#O_%=0;w;)Pcj&^V&UJD+Sfr#z;XEvd6&Q>nR^b} zfuFo9?iof!`1#nbJfer0u4-yIDYEaRY50ykZw zuvNEjo@Z1{(bsTFb#GecLITFsK-{Q4SV~Inz+8tT%4H*YktGu;YNVD`657jQ7j(#& z^nT1+R6uL;uBB7Ex7%Kv)n=b`>mz09_LCb{bp1i9)D`teox-|H$f+Z+ za+~L+UDlUO#qX{kO!37ReywzVP*VdMpC>GZFT3w4`0O zt@4qi*ue<^L$9TZV1evAYBW)N0Ff#wz`sG>bDgTT< z`Q8*Jx#m-^6LrgEg)RtJqsE%;QV~Bi?#P;^LqQqUm+e>B7~_D{saF-23aH{| zSJazSIH4!X9n^+r*>;d?&_n|VHy#zMy&xIcn?YOm zg#|Tw9kDCqxH4s!g?LN;8wfn+K=klY16oDyhE|ZY9$`K;E|9Y#PJQrnrNkAPdndi3 z?IS7m{Sv*sbmd@mW~(n(H8!lzykJ`g7O2Qe6c|X zNar{+bFNO%pOyZC5Q71IO+wbp8*J<`ppvE&vtOgMo}sG z*uEsbDYBci{EqfcLR@qmWxPvf@g-O<+n`XRheB)`IkkM3ob?=gEXYNcBKd0AjSqE6 zjG?p(X<#*`!B9e4?!iZQqiuQCV+{Lgn%yZdv|j5qNkFY=Yy2@cWU`?xf;MS(A28;% z>}pr0ADbqIQwjt`_0_9LB1oNv7NO1S>Mg@|YQdG`900Lph)^knB36H{&pAXGK2qkH zszKguoK^Y#)BBEJ1scmI0`vbcaIe9I7R_cYBwVTj__B&a0%qcSIoK9Uw2n7M-Gj-9 zKHz4E**#86AC!=zKy9!UGuS%Ws5DvSh{HQfgw6=lC2dMZh{?Q}$aeJPqS)tf6xQ|W zVnzV=HigyI&&FqWoWBDC9-D7-1g_D!tsKl_$9c8Gfq%;F@ePTM_5Me$`_o>L-`|IY zMY4Y=@UPxpyQrI&q>KD*!=s0{V*4+6Y6z5zB}yPhIZ%f zUD^-+?!8R-ua)M}&I%7rFJ~`gDEi$mtpz+pDSM!?NbpK?+;tRik2(+eSh+OV$r$fN zu~kq6sZ8ki=dVLMIvo|~YxqLreX-SE;gQ{}TQiz=KY}OV{7)dJy)G;|lF;S^7kJEH zo#$wl;dj!P1A~eaOh-h|Z93Y2A0%c;pS}iscU35kD|24jN?ao;JacS!Tp}K(e*2>e z^zTM32@1ij+FtrTNc@87_pG7!n3+(->1Nmja9o=a`%zj&({HMEW&{_Nv(|jsN8v~%-Tj?02Ka*n zEC8Vf&?LbVllLthKC9(IBm&xJ^ogk$xv!FRVC44Gwf!PHTu$j|IX-;#Eig8Zz~I24 z=s4G-F?zz(hT|&STcl2AbK@?(bC$q=Q0o65j9Ac2I-olY479Bd1Ex&^*@bNOoR zUBEo>#M7fbgK5Niajv#sa0kg~xaW;Y1kJ9d*RgkCo&)g->elS6;C?~bRW3f!4DZl! zk&a$ifI`V|X|!6u6YD0|XQsXK#yR`v^1kEs$r^{@otq48M?K?r4`McmSv12{H^U{~ zNEX$K-#_!q+lFAoaeeI-$mO}!qpeqz-F6%{3(0;3TG%b?5-}4?3S$sgeBZB5bRVU9 z^XMc~b0=Nj(y{Bbv`AR2&h9ZNk%9$wF$0uxZV8Rxj=1EF({oi!S@OEPp^?5)&-u}{ z7|q{Tbl68y=MsF&Z_sr3CHjj;=T~I%kvf|AefPWl)kl~F4a(mf{Dn;~9uys4R!rvO zYDbSy~-87cP~ zZ}GGmaBIFT!5zJ=rNq<^6g}e=^oAsGk1^W%h-+@_5kv5L$--p5GBp0+7H9FPJEq=_ zg6WpNjs&E=?pZLIAC^}QZPq&F^v&gJ$V(t3q(^AhH(}4Aj^qfF9@krLv~-YudHN}R z_B9Zy3zb#cmfU(4R!z7YtF4*C4~QZbxd7d))b!TIfD zTGtfg76wiDRrf>XH{WT9OVIZPFnMyM8X$oFxGxSrnj&K(zXVh`x%E6ap|w|cN(`Z9 zbCqiEQMywQsp^td@1j}9F3I8^<{3|qL_Y63mg$o_M~rtaTd8jo)AG>F$lf91Or z2ygVfL{olp?bYqDi3OnA8T_(^21I$d(Amz9j`G{$I2sc8k5}{5kj<#tR>*y^~umf@uK8jQNz>(K@3V{G+lpWkGq=JG~Jy_Y@42iZB{$5Pa)hvEpR78 zZs2isQMb$Jd}K?K*r2PR3Q}rh#M1Rh@u{^OkeRer`|WyU-klaMN6N3A8WsghHX=9n3qAD&!`e> z2Af0Rp*#_+!P+^ z9Tjh^Uf#;?<$lkwo_(9K+PP z9N=55#;urRkuu7`E|LyU9_P$;G}%lS;cdQoxPQ82OV<9>G+p9MQa#&{Kyna|w(ey? z>gKhaTv^x5c~Ho!3(8V#Q3hRCV)JE1(h1$=o$`OCF zPK1h81F6XglOON6?j^R!&|Uhdar|*m=mQb?gjogJ% z^<9JjN=nHQpL8(AE!Kidp?)$AWpkxw>14+@3Z)M4k@*y--fKT|z&3v_eap_K%kq8w z8j!^q2M3%SUWZLTMtx`4s=cV~Bf1s<*W#KoK@;2M8>f7(QH1tBDuN4z;3$6rnrm`* zm6BSv4XG#`Hh774nB!3`{jt7KBk_^0x%)sK9s2-?xFNU|%WEA;N zTqEdg9K`Rl$ifTpW_C)l^9~sP@%Ux_c7Up6ullIh1L1y%#^<_YVwcfz&kf5g+|3=< z#nEBQn`S$D8FHi9c~>dcFMND%9x}D29F<8FUh@iWJhGs%E&S#_U?khrewfsW!GK<& zumN2_u&c>){}5U>(GQVH4437=XXjFe#b~lTF>XVbWX?D&;6ZjMA3)=+ z{?z%q`@k#H$<-HbwjVW=FD!>xQ4cIFoa-1i3GH3bjCjnS)?M12cq!6-#X74;)Rk|< z?pWaLA5r;jS*1D_DIZle5vTN%=WUK|t>(%A+47As{heJTG51^w4pVzwuh3;G?2&?&l|=U} z={C3C?d$9hwXV>(N$u=GFZHYMTMC|KQM#XJ^Um*LZLfY^UpjE@1f(2iMQil%?U54? z=U*A_pt`$}86G$dY|3nJ@(g{4M4-5t{nk~o!?vCD)y$$VBNNigkrhO( z-q(6Znt!*)qOE)PX`{okWYeWCFt8uR`X8i>RsuTkDcRSTvoWreK&GyKu6)7fZr^_# zzyCm7|F8P+2Gw&=Z7lRd(!OQ$|VTr1(eh#H^#y&0niB5Wzdz&445G{)_ixa8mV9DKqB5yS775| z{=Uutle}*nARF0@u)P&yS_qn%*7V&f{S<{n>FyRRu%Fd(;p&L2TeaK0&l};!#z|yP z4tK8HN1)=qI4f}e;N2y}@b+lLKLt2-JM8kV0dnN7|5`Oe7IFnf&wEf5q+5C+dIM3|qOQQ#4Xy8`fc zvl?y^q))H1CVMcI|Zd`QdMKG|qJYY)l1*|M6=F87LgX#Lb zxL!CBZn9@|dM&z0Cs=zt+ zk8aq5I#Doir{h%*;LXubYx?s=oD$r}?8j|9QJAIILI|qg*{-0Dh=^cj(@CL~ynH}S zIoBiUCnNt;a$+EKCe4uk?y-)_fgx5yV>FmP*I4+-$O8@9ldAvu%5iKV11> zW)5N6pFA8;8LK8*(5$G^45h>AMivbY=1=bGH`b~&rnOskoH)5Dp-J^L_?xqDjBn+4 z@;rE&McatV+pqQUWk{PB=^^HGVZH1)<~Lh)++GbKU#59YxrMQT1N-XsGum6sJDj>T zMrWNlnK2d`OHTF)MR4C|*+oS<*HAzYWc#Qx*$NRP?Sotw^xTorH0DfmyC^L5Iht+ebFD&EExJ z+jc2HH-x8SC`o@)YsDkC{OP^FXmNriDkk7wAv2J{yL$bQX&@4-u&XDuBXvwzF;x?v@2eYYC#ioqxKs0h$V5Ue(%oA=WH7AA&q>l4X(DrJ|oTT z&lPlC=bpk^)z%t(wynwdgWnKkw{G%yte3FhSyv!DSYU5tw$963>!>%R)%J74*$J*{ zvtqJnGhJXdjKlda;NX}ivEE`%E3m06;lOC+(8sA%8kaybzg`V1DJw(tQF7v_?CtF9 z_B!5_G_TLeImH98OWuesfrxsaw|}^@1@`2VCVT66N;$l7^jV&Hh}K(gp@SpAA0#nT zp#Ilqr|w(avV_vk$@du?*xNw$m4oFs4o{OUE~n#BtT#UY*?fZm-j?@2U%LNRl5k$= zek^}pk5}3GI69N{z)Vaq$OqXdpSZtQQx$m3*~2Q$5g=H|nHyL5(%Mw9KxqBz&A!ss zlQ+g9Z7la$p#9VqtO3#@Au1QfF9=Q8XCLq-kra)MLicty#t!Ze^!CY_3fx7&ouBdD zhC>F*^$>|#FXn4PsgwYIwU3`djx&;zpKZC!TpMrJi(YqNJjD7HEbxt0Q1(H#8QNw7 zsQCj|3O~>?Ewlp}WlW7Mi3#$1Pl7?!6{``wntYVU=su!qMTtqLZBAAL86XT9Hoc*- z_Rw7fz4aUz>em+FuVm%zoZr%SZ7UvaUyL9ehV6O<-{K6INi1fe4Wi}b@{dkTA>Y@c z)Q)}eaiZyMpA}z5arcg{|hC*TZMOS2Y25d!kZf@DC=d+1z2 zxL1~JF0Vk~vCQ$w3E^syn*ZIqHSD}5M*#GU9DI0x{x#sZ7SV-Jzrnc zqJSpyqtMCGnCEU(p4THgVJol?3074>KvxUH;wW1zRQaA*DNs@u-&6-0MTTCn{&C_a zJ5b6vlUh1JB4wkU*zHnAU9If%NsTY-u{)l=M8dZm+&W43WOjU0 zv}agqHfGrD$8;&E?PAEBD(n~8Dp#%R`<1Wz!Ac={@s{DBP7qsveG2U36>e|o40`!i zyL3^-EUo~oA-f=T(wbTHzLQIyYBfcF3P_{r5k%|SE~rJ}`9S)EEF>FDdRg#5%V>>s zGy@t_>2(9$@>NMKKhcbe) zMvZ`&a(nk=K(5ODk;|b>Sx|-%lamUZA?t8=1V-A4xbc*4BAVT$o+0J$4GChj$D4%C zp?5)*)8QQH{#5>%w<+O$3*T8|`?jAZOOBl_+{iOIX1Ryt4aZt|lg~I!1qZ$!59(~D zp3kR*(&PPsuIw}qn^s2apIEk*gO`G+^}y>}yCH`5%pk6U5l%-IMD%HH%oG*ddpCz^i++-nW<-??sD#d^kv+On3IpfbK zCr!0GXU=FYRK5;fSyHsl!p1e-%=I^@QF37;$LCPi;%LTHlChrkGI;%~`1JaQ=dxIZ z!E86C35`ul8YckGmYBKO9#M|PXG|14Owk&?)0r}7 zAB^=O4KCN0q{!1!$Bqa5LM)}c-lu$#Qm1VY-MWxA4f3}ZBOeNpEw<+Wj(a7@z5eH? z`Py(3H{eNk9C17LP^R9OJ}@HRmVLVW6Bug$t#I!jpUx^g1j>#Z9>+Rxerd!h0oTX& zmKK^KFMyKO@3JvDQZDJBjysuV(ZKGpbI5|PTuGjd6dVAO5`xUBO2nUA-GBOlYEaH2 z@aMNDoD3oW+31;t32|D#>>-$SB?S0FpM4TJ1p+X<_P_lM5FFzF6FOf`{07JyFif$8w+&U zF2C6jF0GBu+lU$Q3B~orrwXybr5QsLtco|)8aXu{bw4Y4(55tP2R>yWKaF9oOAR3p z9AzYjyY!&T57xGA4%RmVTQ}K67v@_d^&24}iz9#N@d%V6;-&Y^7nV_|jxH9C83nA1 zSpWQ`s4E_D{}vsb5M-JFzzTclSctvNe=@QoV_h@DeSA4GaHNRk+W7^tR z)lSy%LRGvH1U_kxSLqY_>djQ*SxvF!>Et3T*m{3fHD!(K576vpyyQvF(j*p-Fq!8Zeq|_LP|JqS^LaZa!^qa|ZcUD-@>nB4$jY)_K5jjL`h> z>9gk*-geR!>JWJsevJ2=&&$nCveWsYGM3>HL5HL%GZTDk4Q@7>MaZ>p0s3+mZDn-2 z7U^xjmgen^rl)}S{rq(|aH0{eXK*59>7%avT|5frBR?;vsE!!vDLO_bls?w?9RK!h z>@q@ie-+9@@y*RVdFB0sz%zY`qgk^tC;4ua>SQNa06Zn&r3z*@@SP_2DykI%z6smR zh4N*DF)r(bqS}RR-ee~`dwK-0v>OXw-YFMLNwr zZ8j5-oA@d3PTeIp)j<5i^g~Ff7H(b;2Hm+)D6P%@HvrNu^^5voKS~7%V_NxoFi8(U zjYp3dKiJ`?o~PY_?S@uUcypd?#vi~+CfKZ16` z_gq|b56~0!t^S&{?sHAWqakEjY0)~1W7ApCS4K5|{9(%X9z(-{>=&irzV#EA1$_nJrFGo7m8KpP%h*0t_~VdjA(0y1_4>0XA)O-Ky>Gp=Ox3-2 zQCBh13JjBU1}(PMT2B=wzz|&ty#P1rGWvrPy1yeLT-*{ag>`!wF>CBrakQv)u6p4{ z=lY`Xwa0Qng#8IiAF2bhwvXEm3w+1ihyC8)JWR1NW>8o!P88 z2-ip2c*q{g{Y0&Yr%QbffAQvUXZ2C2PtK3whX0?V@Vq$r;Mw_A(6BW}ITv)w34o4g zg@GsZKz8cEVjOgqrdv+8{`fYxCW~m4i@^7!so!Z=kb6M^AQ*@q2IQ78G+5;4p%bg_ z3xE0^D@{9{vg127tj0ZH9hcC@F**`yce_^g7A!3ts4{*g%jc`q(=~hK8@$iO!S!I) zj}y&DoF`P+F0y76IJ!ZT*Rh7`5d>Q~R_?brg$h>HaaR0^^q2{eSTd)0KFY8~sY1iq z=|uIn^;*lNV~SZRto@JbJF)H8daf3t_eXAci*>&-HyCjUexl!)J7lE~mnx{>bRBT4e!KVmPAwvDK>K7(9a^l0*6)ph~+5t1ki5ThxLX{r%pu zxFrGua^o~n7Najd2d_m-tDuP#wSpZ@@HOg{;FpwlfW}Kum)`+%(Ou>mr6oIxzb=4G zSOoS`Tt5VL_@KkA8~UhLGR)~?opXqtuFIb=LEm6?&M22_IqHE_Y_-06S35*GFPF5N zltKrl2Ff%_jz3C(lQzdu0prD|!Vk_#yz0JtJzU<5hCqg~d zg?p9s?O%no2~7*7GG!J53@CYeB{AgeUoq_L-fF39dt9GjW%b44Qw*o3*c+Ke^Lx(^ z*(hzmCcp`2ejD$U2do~k86=sf`-JP3wc+C|MJ|l-c5Em0jE?6)zllAzkfV)Kio_Xj z7#qrG;}t_)04FM0Rbcb#f=S{M-<%h1$-3$e#Z8>PnD^bI2?f80G{F7w;){x!kR>kL zGyG0FCyOetzt+(QTqNAQX(PtghqfW-nJGG-&-w4#)gwss!R(Iq)1#z!BIybbw~fR* zui_4Y3@BU9^rMG@XOk`suYs;GISE=^tt&@0W1_u6p`5q5o2HY5bJ^oM-IM}G^ht{< zZHvN_Xpz_35GD&EDu3s*9IQ{?_m?sEYKxq~WM|KL6kq3^nMZL;!vz55XE>0mdW)xy zGu`2;;~YQdkFAfhHU4jZ_0aq|-=>+>dWHhHIpZro^NR>V^qibSF+6Rv^?M{r)4*VP z1(&ZePRV3m}5{8HBi@*ZT4Gj3rklPDNiv-DwD7}hB0>IUBo8ARJAXyJYjNM_EZD zeA8x}8?B1gHQ0b`X9dTFj^DR(>kJ>sN%RRqlJKg!9xu`{GzRVKCV7>psGX5vfACu_ zF_>?~*7mX^P&;Y;H|OF1rBVJL@99524Vn=p2LM)irC*PqQZ%dsX#(mVE3rlkKnCJZ zAXy~t%v*_`vfMLqP)0vwMr4J537bDYYm@SBrY4M1Y1(Q96(0N*fWh+b9wW#Jhv4a@|#W9!X0QR@t9%YR~$?$xgn%84}Svgi}C7JwCjx9!>sP zU#>QFdQ#x;?Z35<=-nl`A{)ROJP8uYtOgZAPA=v7if4D%vzgJnc}tzHLxZxsSka}x ze5dCTASV0{x^~_gpKpIdnr-V@|8RN)if4O8bW4Tv0UUhbQbPI+VeH4^{ou*6kQi=ExlSk;3)Oh3G z>uW^xV#(7RQJ4KK=jtq}O2r9W%z#k#rSaP{MsZg%d|!RQdOFP3>pIr?V8u6Xru2>u4Mvm%^-mzZ>~1N$>oq8!{DShMGEL2i{o)P)+->?`QQsMfw2 zsrCh=s_4XwDM6J&#j{<}LEX?)U+mBneIZUPd?;TOD7fJYJmRb=SQdIG&u|v5fAH{n zep|%_YC=zw-KyQHBAkR#Q7rM4LnW&-S>>EiR;m+jP8=R7bImbf6Z%7EUOYzHFn9FL zLbUL{Y1AWtjX|Q4Gi%~5%oIK>-9$WQoM-EhN_aN67xS7$$McF-Z%pHHx3L_7v?sk% zRxnDK-DHXws*xI(iuCZr=Vczdy8s2A@7Z!)DRmN9HKA|(~G*cBR^P3s< z3r6M65=6*;et4W2;@B1j6ih>UrOCIgw3*O;xZ2PH|9gZi3P|PRr@B;m=n9SUs872x zn#lOUR3LxNZB5!)D6u}u;Rj76 zUTG4`hxS&A2V|}jCNizt5KpZ9qa>5BL4?eD%Och7Ye`#T^azyP$AlI4H|0M9YpdF< zN+J30^$y@}(MvSz?kOwoZ&jV{8fGxPf|g^f$%lZJ)P24}ErqwEm?9?BDPI zXJPrTebG1m{V9H(6=<_B?1Jt-r#-#`#KJ>ThGqiK{22t)Ovh%p;??6#-lfn?#6EvZ z+a?zbPM!6Vua$%K;{Eu!7)Wn!wr+1jE^4i(O@d%f@NX;bzkV?IJlh4c?c@t-gfNCe zF01#&A6WT_R2BO91uF%YF)%H%TQz^-wRHAy!cvb324)vAD6mOL=kHBP_3WWVp|72R zmZT$7saz-WnQcf7lR)z)4%EE_$9oHVep}54TMw@F-fvD-a*s7niD^eAg>2PTSAxrR z5>qWN3WP|*qtre>z3`IeBFqS*L3W=tXj@qp^w7_bNw(7K;@S`Lty=leF+(#_5W-Ij z$l21|i~7UB5YCxr%(PU?zWYT|7cUkGjU%YjKLdSbisp@w(oFNFa|2pb2A)c{D?jsK zeceHYqg(1C97pX0v|_yd&?bqpHV*;f6Rm=OrQ4p{r%q?4;Z?%4b@gZ#EVizE0Y5@P z!3(+2IULC3#%bAfZ>EC^?ntRRX$+a+-T_i*_e-AN8lM#yZ5!RXMNVqNTUsl?HEIjV zHl`biXFWzEnIRydXd(N+OwPz7ngs|KVK+#%<(PHZ%hc-&?i#%KP+}zCWRxPY@P;&c z^z4B7!aa(IS@xjQe6 zI;GSB`6p2Ns5F(l1Px%4OW9-#rHh^Jl)%w-4ZV;sMAD2kzxmS0OdV2}xG?p?s8s*9 zK>T8@Z2*Vt-;j}O(c9WFypJ1e5BM_b|FOE@wI9p^>5>!_cCM$yi)y(~U zPfx%JJhwVMCQ&2?;*+ogVi1}Knq^#HqyXTQ1yBXXxc_pbRP0;!30+di8DB39`1l$e zDlb|yvBK9wgp9oUwRF*-ZY0g296cN+Z3t7dW{6J9ZO+U&4J9Z(Y2njO3d7!^*j0d1vF-HDc)NPJWir* zQy3asE^}GIo^di}0^5a!H^dzyDmy=P{aJCDanhk;L3{H`p(bG}Om8RN^p}gh7D8r& zn{ghfAZPlavTKz%Oq ze6RISKS~KuuE-km^J-f)^@=Pb9xVqXXq2{O8Typ3-Afv}e|HYd_SrAF8y2TeoqWPO z1SgQa&V5WY!)JT=y% z>=rj0DK)FpdqVEdm&kQ#4f9Jxp{9}`z#Z*_A9?oo7CS;N-w3-89So9jJk?hngMrc9s0ud%DWRllpD z7Tw?IAzdUO2(v4mhY#Eduq%C{OrQ!X$ko#lrtI;MjNXnji`B)A)dcUKT)^v;twIhu z?XM^4+&o)x)Q72#ei1}o?sZ_rN0urQG6D-E$Yn~m>?_?%NsPPo{0o9?%K>*&kw~}6 z$0H!#L6_pIgWQj_OjokBvfx=-&$WolDX)+iACZbQm16jhbshrzrjA9qNAT24ud1*T zv{M(vXD}pN4dkhDR_+g#Tj|;0>Qy<-JYF=a3BD|Cy(eOB`nbWvFkcDii{Ac9?7tl8 z`pI8G?x|Qac}xqj$QlJx-H(Z?p!v@-$5E+|MIMU~?&m@Us>dn1WtBF*QMYjZ^!lM! z;3s_RGunl;Os-|09bymh>V;>#3q$E0ct`9ikDhS5KM890Z=x3gjF`PZ5Y24JKHH|{ zX*2-eYZKy91AhOL^yT3Nayf{=U7P^z3#7@@^}C1=;(o5YfMaa$pFX+g!jm+qssjN6 zlN^m|-S2^#n@e!7?mIeD21LEhd-2O)Axd`FFE@cv*T$Nse)6W$@xZ%<=QhVs%&dGh zphnCTW5SM)Db5#3MyP};nLB)!DIgzFXZ%5x;(@{5h^ z3gS}iy^fCYt|fpC4_dDsd}KMGq-L-_E?_>H|BVLvk}!eg17bjTY<(S5ouW46+?i7t zG(uFdr)XBmrak9FbSX1mq^A({0Y4qEfACE1q%)3mgYzSq{#8)Q@7bW+bEGAriF)IY zuIadf23Odkpfaj^|B3iHmWe2iXn-aH5XrQH-G5JW{Xn;^Ri6+3D zobb`t7aV{c^Eqx3c%5)i^!U~;avGIm30=2oK4e6FUMQ&%CTl@H9lddWyg^<(@Er=- zdHjJVxXV;&8{A?tNUhAsM67REIu-ZM%$Se~b4iP0Joey*lCvQ84NHAm+ z!)(9z_B!Qxw&zcGDml;;6WQi9N55RlZV=Eb?XtCm(6q{r~vHJ6Me z0Y8LdRtA$nz$!&<*-O9|bl3jIIfc({u9l3T2_StAE>WH#ARP+TFQ%tK6N$F=iFkjh zx#q2MW;-7mv_ieSqnS~R`bz^7%$WqPAo4%&3sk@IVKz9`hD+QooiHn`sz6v}0Q@gu zt2S%>(%IhlyUTZ=OB<#1g0ny;wg?5^O>)d@;e3-y1|L3h1_k9&*MK>BOQ!{)#ZuPU zG1@va9g()%7N2ZlzWF1Q?$65~$pv7mK=yp1S=&hK*YFC`sga_d|Dl60?d!b7t=qE$Q1dU*lS^~4WMW!kow#IPBwDHA zL3g)@^#2yewD0>OBhq6%2^+EA|1MWJmgnnd5xLr)9r|`zBh3xTbp7+C?X||7Khe9( z1G@uG8MZTzA#|FR8_dC>)j(!sGo*2Nl5QyMZ| z(@vH%RCg1p^PKbf0D2!)ZYT9*dP-RW$(dy)*6lLt5aSWF`Q|dpl9H=TE*d>{M`pu* zZ~w;eUY5E@KiO-v!kM7;(|c{Kr6*-;74_KR?Gsx@X1(I`x7C3wBtzEI2YEWJXB9(l zxk45d|rwj+}Ub$8NW`O<%FY(f#y_uYCvb?|KJfq;oJT&rA-IM_Y z|24!I=4{R}_f*K13#U)0aYD_C5ilu-aF!Ko2o*C7VZa7;;Z!t090!0v?G2_!_u5Tm z87RWETk4AQItDS6d1My97&08}*TVhXv}X<0iDbyROdm*i#}d?4EK9kX#WpVs0i@*< zBt0DVeFzodcq$#q+y0JZyjHAFw$HR!)gesciRto}V`q9LJ^qh3I76bodaF7sQWmdC z2Yo;t-=?4i*OB0JdaItket@cS*vJL<2)BJRw9Y(>QMAPM#U;vn0mXegdTZM>ntGw=E7UbIg%~kt{L~)Kr}I<4=dH3@^Tq{3lcQf0>Q{ zdC<>~@qYC?F;B?YETB79y#;V34YkKEu1xpYPDZR4`JLsH8;@8@X?B6+rJPJ83bk`QZp%smAS=a9>~|6 zbv?=mS$Nta-q{S8R{sO{1FPNSc9#ZFl)r>>&t($VCr{9nY=z&-#B<*-e%CvIDGBIq zyv=`K<1zysZG1`6`lY2BToWJ|Wi~m9PE`!7(d$viyz|~Wj_7!r^dc&HLIn1swHwE; zib+s=g5;-d;IReF`bxz|q(*;qV=Rgj=R=GMDVe)OI??uDWhR&(@8NANwU%lLHtvL9 zt)>U9u;vMoX_-&%0#S)nb!)`r)mNL39t<;zqlc_ItClggcJa9iyQ8MBUOAAg8VWVd z&3Rw*E<7O@N|pBa;z;H7LqJ+<&loZ@ALuVHKmHorr}&6~_Hb>qSz~7qEIisqBVWas z+w$wm6y#|$g`C+C$8L*6ID8gwzK^+<185FElKCTl{maur?*!I(o_>)E^7pml1e zmmlnHgj70$+>I{xSeZl|vX3IRi~jwXK2N7BHZEY2br*EsoxVeX8=I9O_R_YeQMEp{ zw`&n<*?&cz*4L+6R5@@EsK-+s1z-7M=se>#mZ=%dG5$F@vi213SA*j4=s{c)7KR%) z?t5-_E}>sxZ=&F5Zt&!~nE3P%oHhG_+91imc*3K*fIx={qi`j7daxO60;|6fjxzR_ zWRwf!=kOtg(TfNZdMJYSTYj`ZPz0PM` z+gXuKblGdt%=gXJpCH2wNg+XaM)cIw4AB-q*zL_sxw`o6?w~{A6`7H(l+JY>IG7gj zStN*Lfld)Y)EZU1qS8*`5rD1MR^p`SieZ*-0|jJ-mS)Bnn}&wyGrW(O0k3f0zaYRH zG4R}0DGNPVHcP9RLy%uraICz|y$d#Tem_?ZLo>SfRfDTg6jQMz*!_ltr^k~z0*uQj zd5mfE@w8sV5~O&H0AD(ER1%nC4;=`#IQeD&!z|3-W3Z(>b36ga9J0H#hMS9Z>qiRi z4p_fQ(-YKjD&fuD4$PHJP1dML1AtI)670avPYB@JCNpIQ()I2IJnLQZa*2tD&HJn2vQQl+J|%CbCHf|oyErxW)GqBDOzxKFW z(e!p3eGyXdGNlzjTUI{*H>aQ>-`^?7{B^UC?wIHA6uerA^w?X^$R$n$@yR++oF6+3z>N^t%#T$IGP+-oG z#}E4w_lWhQ3V-deiP?P$B1fW7{@-+XlFUqePE0GfLEv_Dw4xpyYxg0T4>b4_r4LV zUU)~s9T&=yZ=^4{Xe$s-9lim-oGJ*d{G$!-j@y|QV54*^kNrj#??Il2Q&}&4VXEwX zYItzZ!8T-kr)s)+lkQ^`1ACCofmCTX{Xs9IKPI_p_C{Uq6lj+p+G3FQ@WN@(&-={l zTn+OS6mnUymwcM&A~`7YDQ(o?KczC1CO+*p2NPv;TJMYrTPVN0Q8zj|LY|gE-2%|W z&;?K%uC%6pcNs5|yX}vUIU~K!Y$-`;Hv3Tew1s9?-DtJ`Z1yMN8r>tC&KXskAYi{f zpkJc3HUFzZJo5s+H#%(bjojF_3}}3xSI4b%<5zs3>|_$)1hHiu+*0XvZsk*e@c! zw-k6>GGCo~N;Ad7zW!duIo9rVI?_W63Yxz92Nq+eIAdPC2nUvIDf4Ikeb1{}iI1U| zaeCjp@VnS8+3Pk{u=Z}fz9zZ1meBNG3}WQast%v?xaI&?RH59sH}OJTD%CKc(gy_~ zHkAXlf$JvrHq{CV5+)g0HIi2s-n}Ao_Rl!aU61(%y%xyjoX?2XMN1^}XBo6=z4+34 zzP$2`B{(Xyibp$xHh8Uo)yjh;-=&(a*dutCdYSXP&f)DMVUK_ngim4p!2xdXP&6xT z^9}@K`0ABE>*UPWq#eZLg5Djf!m6UKSxvnZa9={Y>Kjkuc!euzmMs<&0-R+Cuf@PG zU-jI=`u-2`UdGTOUFpYqmc{6SPg0Io6`7pk2 z2i&bWDAOVPat+9I#rm`*#~HcYrvuc3=~CWr#|lm1yESY5g{HE_7Cyb2dT~F!iwSyn z#Jd@chVU)pb`kW;LW>qWXJ0Y~p2TW~;P1SqFZP>8JJB3Q{1hnQ&d<7VgAp+RStZ3Wk$3+0!U{{)qxJpom28B8J96FpS(Y{|H`ae2a^$9Tq&K? zh*oX$Ku?;lKeg%daINbAY-TW7Pj!cz@Vz$1Oh3dul|%A>C|Uo3>HL=jaD&WW`gfCb zgy63KoG%FAxKc8N+D+q}2vf$GZ`l}K(h)LeE!})@{0g*+0BgX9T(TxLNa^Jp>>$i! zV>zo|{lfzMpK|LykyAt`fVaIPA+Nrc2oEaCMe$r0UUROPbh#RB^l$=xk%Pq@j`buZ z7m~fD#kU32b8_kit#x^x<%f8NVkBkLk>Mv{=!7;Jx@zii`OU%%w61RT2|qj`$#l$w zjAcsn19s$QGDrfDX-0CwF}2F>h^>Q!3{HGy+MxH39T+2R1U#P*X)4;~g@++EnY5}E zJ`UxI`bcAfy@&oE;)xeP}u(?&jdGCYAmoVzLU-%tW?nl@gl5tZ5uRwGZ&`L$-vNDmS@N3r z^so%Zw6He(Z?xMyKG_ev>ZR*NDmmvy{he|>ipn1a^3>x^IScI&=8oA+^}}fvUz%UF zPL$a^ef~VVKFYrl@v99~Zx+o8tE1f-EuhCsnEh!r-%X52jnnKDf;9sj+`-v&wn9g=e0hmcMx(ok$Ec zEF(-AMSnSP7a-prFhDA;bSGGz zAMb(U=i*F*$lF$`YgEgNTf3{`AP910hQaG-KY7)SZsBaQFHYTzM>8};s~a^alj2nM}r+?s*^iLSg1 znJrSU&k3ZdLc4kcLjQ7wIbQgOfKs{M_2&APRxt{HrY^J2_LfSY61fU@QDk4psb>H& z8=*(YqHu!wcaITiIH)2j;sw=I_JD})OC&))O5Y>_tVkI zH=H4h1z@@Hby6=MVKbmeRbW%V;_m&$9b(wu(n%+O1YyA%{qj>CcNdIpfK!3A@r_&_9uGyajkXRKt?ouzD3`JM#zCKRyQ%HX{Q0OEBM44KoMdM znk(u77!qJ_cwP9Nk}&nEHKrm+<3DFC zj9dv(BFFp=u1glnrP)Fwwx}yBShKur=VjO09V(5H<@!vMaS*n0F0^>Cz2z z?;tRql8A(=H7>kCWzJo6JU%Hjb0BklkWVQk)E{B$%JzK@K?0P&g7kVbLZ@uxf)K(D zccDOm0(S*S}zW)%C4G?vzKy?qr7EuDKnv(RP-r6R{+xbSHZVV z)87PK`fZ95EWMpiRVC3=z5A@s#<(T8r~t0y<{wE=2J8w1Q#g@9I->4T;3#^o92Z<& zHT=PEl=HDQ*wV*wRZyrG_1#kGf z1REX^VGQ%7gE6SHKC(pLjhuv5jDVh=o6{b1Lt-)&6dK3wXqy4uhGJ}y`13}0klbjTDN5kw3hZHo9pPZYXo~2EN%oE}Rx_}3{ zk;L4=2E#V|bbLvj$opLon!Oh{-AChngSi`cxJJ0VCU!9!(U%t96(!>u4WV48-ZfsS z+k0}+sY}lX9+ry+zg8P|Cd_uu08DVsmB)fAU0fK_t!{-v`>_FhIJc*dq8Y4hYJ z0u)02gk3Jl8#d06#p7Wl`seb=d!~u&UEn#}f?%72$HuaHN8!bC1qH!BQ9q*zHtbaW z`ihAB@3@E8zanbT`wvk{zDUTm7UY=PD=A+Pep-?B%L()G{+A>sAWI*6v62JB)>ia?Y=wXq{o1Q#~A+7h*+L%F(v^l=+I_YZpURn zw50AOKvV0tqJ5v#=w~Q8W&?ywK$oQrv?#K*k1OcfFS#Y^yVGcy6VAn!0k>k%hGWiw zO}3q&8EZ7KFW3@ktG=L>J4lyGHwap&QVcO;pL)Gz2)l{In(m7a|C@N!f6fsUEq}y> z0t#E?&dza(myJZW^lXBorzaE7Kaac=iQS|IIyG4p-!O0mMr`wZ3n<|gXPrS(+^&IB zN#v=wM=%H8Kdo7>&*~!mHu=+AnWd+V7>gO;eClY~2EQynffM-eDj(eG@LJe7slG_g ztj0u5l^o#EqP~~Nh_oX{LFCe7nfgCL-ET&08RzdwP-`2ZyllBNo}@7@t~}&7ouJ&` zSQ$zDeEnA%P5TmOpKz1j24Y>s`t%*Rr`vPq<_HpS?fqEYSGnqhic+ce6%gVAA(YJ# z%wjZjERS;EPCUlG5@7!tSDt+WyekDw`>aEw7SLrH#+VtZ@3Kd+OY8C!!1BuIW(;6_ z&DVu7qVPHKYE}T$8v_*h(PIYozgmEGRy@4UVJ#9J#qZTs!nU^BV+C~ba^7hlUE3^P z|JjgPT3X60qUcFF>$N8Cx+C_7s+$qRdn`xXUTmLC=#uUy6tdBaNcjO7*K*=chKa?Gnc{+wiNO*+P6v%*NsNZLv4+p-ocvv`LcTN#kSzs7pAw(*h6==RxlnIbMn)4I{$ zWr~AhGI?<~p__1T08_TAtg=oE5W1C~k5e^i+}~Y&4ZVy#!!(NNL*~&{kNtjb!3#1f znf|+%H|f9g4ITTF3gBe;=vLRw?$@kw{JISBZ~0E`;$Z3-3f|aGo@lQ7_vwJl z5fGJRk`A~{F1)=`=JV*6Ya*yW#=%fD*YXI1t)oMdaN#`-Rm(sTG{Az^(LhF{8Pn*{ zva^r3gRk546Xd0_adKS`4N${9;77$^SZa7^02Q zxU9yRpWUK?r4XOpG}EP}hc}x$ zS&@fq94gN|Aebvj8+&y_gjPFVkhbyMhO^$kuY@5xdu0KoIji{sL58~Q2xSu4x3&l@ zlHC&qKJ=K)y+_K2?FklPJ3l9;m>)>y?(%Wvi237e!c_Q;vb#9Y-nW)_`>vbMU27HU z-FHCZb(n;{!X4Qd!_wF0!zqu%y%hL(a;i*tP~vF>aV2{8en1ZXf)|rFX}n}3%>?n8 z;T1d2nxN{Hg8Vz%F>A`-Rp@W1yno9z@aAiD$Ny~`LCfP)r5x`h`T-)iUp)poU-f@4 zZVca(Py5a*Je%L`4zKJCJ%cY82aH}EaM(IHT#r8?KI^kJIIXmDn$va1%Za6Rs#!ju z`RFa5_U*_!Xq>(iY$=c{tN<2tg$tM2U%QTwKFEgmVw;i(`}&>H%N z;lCUjH3rqFrsj`n!XQeCfwUuD(Sgh&Q zgw29&BA`y=ow`BTsri(h8=x}!d95zBu_s@DTyey&y;~NSdR-h>4`>Sr@}^z^{eQz% z5)D8?ONXOlJrbrExpb`?H%@`g<(8i9a#Wup;UUbQ%0pi3L;wQjS{ z-TU30BUOm7amZVH)_om$(;|Y6y51Zl2#m@CKm5@4gBprWfYuRPF4Hmut4x10l9 z4KWM``~3Mc6wuc-BUfz3e<-{o`6%|)%=g5GQi1W1gmuA`%cJB@lB9qQM+mSZ>NeJl zt}Rkc7CTgRUTOZ4Pg>m4E#$LA`a`<4RlSKubWZ!JSQ^pHST^f`L&xXc;u4do`S^wh zjQA<+1!E%a+{6gmZ(410s;Xcr|-)Fh(Mdj zF}`4vTr*NW_^SZSxe7%hthbZ5tojBmimzAD+_J)ggpd;fHV=Y(z1^YHs(SFCacs!X z-%5po$0%?r!CZ^}v$7XRD?8JykDL1_9lWI-m|4f~h>hX`+zu4@+QNjh;z%F2{TC4t z(K)N_d zkLMBL4x10RCHxlZ6&#m?VgXPG5GZ!Oj#{}XGN|ent%wkzhZ(E+ofX4YToj(^;~d}` zv-@IayT)1c@~_%tMT%8Sg07!q7!;4bwSMs)aX0VYmvz=rl0C3Dj<-YmmzGPw`Uywi z!OM}C<(Zjm6rtsS8>Eab5hGiuxceI;w4B!4^h>x7Xto?PM-Wy{3I^QHBM9&W%Ba{i zOQ!DOqKfMX1_Nc9WGxuvIs=4-P1=};a|A<3lFryMWVhvgWtsm7(`qUHamwajpE36N z$aS%E3yT{iaOcogz<|fPAFjvs;^Mz~_n);&OzosVF95kpmm0<)FJb8=xx1|Y3GfHF zvpETQ^q>4MhfDxw?s}j{D++|=3Pk<_IPTx{(?Ws~Rv)Tf&8}F*Gg`h_ z$vQgr!1gm|QtP>zu{Nl<|)}bd+_0b2?-* z$@zZU*;{@eT1(-t=NnazTfuoIyA4-9l!+OVFpk}Hyx@rKAt{d$D!WgI-||Jcr>#z{ zmPOE-1M#`;s267zN8wJ#zV^lgfh_BovGm-ydN@5n#_rzfep&i0Bs2>@)2*|;TWc`OcuEQ@1D zlHE|^VP;!P*Y+ichgMf-L~^}V#h?1cDVs&CfX2eRR?dn0ic#LX?8p0@oJ$?58dZ(| zp`2Tg3s@O4QQDQ07}H%HuJ0#lr%P1`nk|bO{nw7k2bDJ?nmBn`*)*1RN%%c`tF>&p zJ>kd8X@Vm;8$d=IoC`KBoQ5{N`EBoEABM0fwF=Xg6Mav76#uRNa!wbRuv%HF}6iQ(Jto9P@I4)!heb_+h|`b_+)%ct^1+Xa(2Toa~+a zBi57uwi#$QvSOuQ(>>Tm2eVosDk!}6VJB;1XXnWuvw&x)fJ{f&F-6*)Q&MbT=6Qtb zP1leWd3udT4Ty%5Y<%ipiO93Yx)zM~q4qzXN+4lH3WTd99J^VhtjTZEmc^Ln@TMQp zXkBJ;b$P+$He(yGET4Qycp#H@gpoOQBia#iycIS(1oeAb#E2JsZZ7@=Y=%N5;+Ey) zPWlC(E~VbS-2%upr)NtF{PsH{nFIHhI>@1yIWPmui&e+!pN2Md=jSe3_lg+e5fa^@ zu_Zo6u89yJn|zMtI;Jq~-oCw%4NqEo>gVeMoA)oN9@1av+55IygH|aiD}e%JOF8V= zOKJ=FqDbl;=`C;v4l=hq7`{IHJw@Mi@mhv#^FC6z=HQb)r?l?ZJ2Wfhdt>k9Ak$Zh z)(8(8MRdKq7fFaF)zGF?U(<{yuMrx5vM&Ji0P>ru0OOh*iZYBAGQwirs!I&r$d9LI zQ#R8+mi=gW#BWC{Sd_Ff!@SJf34mTbJMs%(j*HnAftlrD`Baar42XVuTCX;bIDY_# zs}FegWhyu_JN_02{()DTMsvnMg6SjSrjO$MC9781CQyZ|9^La|tS;d3&nH~nZv*S- z9#T0lz}-@~pa^aId1;uELY4npX(A*?#L43) z8UK$V^iQ>#PZs#P$Q3K`&yc5N0Q~9_C0#ICC7&9~JA8ccu(Ca`0Bey)k^=7PdhnfteNKT<;@vsr-xVRfkj<$$AU zKnpMsz{50iFNHBSOFTGDmCc67V5d3mHPfVOE zZHn1Sl5sbCY0FSnc>`pCo>8*oqo4LEf}pg+fRRS`y}GOS2rgji`0fiyIGiwN4A`K3c!HBM9Q~w!GGcq= zvqYClPVV`;-e;AdOWY;x9*dLapfrG2^4B6q-<`7ERPs#MY-DkW7e;4Bl358j25bX2 zNXC(=D@c(-oH%{my8a8b%F~M1I-0kELl_dq=xzHLFn5JY|BIezQ+4jLm%)&CT?5#reL|IOsk!pr4z-VCtl+ArJ|593?_FttY3}as{#K>7`XGqIwFirmE``g*k|91!!h99-C0j5 zUTL&Io^9g(W<6j#Eu-UhP@tUW!bv}bwpN}Lk(J3ME!IS_(y~T1#X7eBv69W`S+PxB zOED4Ke|NizlxH#|e5mD^S#$mJPhkNZ|0P%?rI$s-ceRJPCs~|azGx>n*BTw#r-uRm zt|gj72zg+ot8gP)S0-*NBnMPGIfPriORnlbnw`|1Ht6V;w(0H1-+NmbMGJSN3ZfqX zVt34VpNm%GY=vpzR*1XgSK$$j{Y7yAtmjEQ;OjLLCcL~Wvk@*_Il!39@KJ6WgiFiX zI|!5)UHBcPi>;9$8LZqtrj zR5@zu?lUMwZAg1bLm+q&SX}M!rPi??<+CoFE=LV^lpSfK0v)fbFB?J*x5({y8Xx7Y z2rW*{a2VCEd;{jwQY)39?~-Ww)sX&uhP^x72kpPF<+&B+Mz(P`tH30iQ_{FR_O|~D zE0iUUXZ2gljvP8QG7#XyTmzN08`%@ zIWZ)prj(FsZpl^s!;wF}#eSCms4J*pU>&@I^WIH(Wvs09JJ)XoF;NhHLcY3pq0Y`{EUR#CO{_u~GunQH+$IApCVtoOJIR-~b-1l(Lkmd$$FymT7*zW*i%0%D8lh7_cm}C_o_RHUn9DM}Wh#<71wdk7} z2Ukl@Eg>8TGl2LeBe_7XBQlorK0H%tk)EkW@nevVV{S~n-1Efsdne$JV+l=4Dc68g zfwoXGgqkO2iI7937S0jgk_;C_sd)($qbgDbH-br8T|66(z%_H%1G#TZ zv`9?w={I?WSA65RMKPqU8}at&9z_^pZ0JLvH1Hx>K{8f3@XieYxGl-Sh?hW(du73~5c7 zn?k$Nt!hM7XtIA z8KdW{xXws&6#@EiMdo-mPvBRD zXmwiC0sF+1=!5sSKW;usg`Ql2+h95-p(gZzWEIl@ZY#R=q@m9sbjwo1p7jHulyIy< zdxeeCt%0%Klwc?S6Q`ZM>1oBKcoW+=7=349J>VF2@D-NTW{nP|;Zmd-EsZN?I2YW! zi5~CTe|kS|Y5^BA$p+__7u3Nn^7&(&2))Q!YfA=P6g?PDMjO2-3v)}@9v{f*+IxfH z8C4%WW-;``t(N(=TK)(>%2jRU8B)U{rt z3fJmw9?ER{)mJdbujyC7Qx7gg+*z`kcHZZE2CVcldNd}A=!lJwH(oANe}lM`54f9`e^%DoLSFnL`Ie!veM!p!-8xmFIUb0ejO9%md@>Ns4b6|R^e;CTk2M8JO_x(whF9tfVEQ-5Yk%b&BfJnhT^C{ z9hL%ZSJ?V51Zl9aQd>@ z+1UYD#B>ooLton0q$x)$hpOwlv>NVYXvtwlyAXF;8t>Te?j9P)A(IY?U2@~lg2At@ zdvYl&U0krR-?Z&tXWfm`bPnP_1r}Qsc?4{+uUQz)x>3Ha8-;rNgl=<^eHgHFNBA%T z!6T=kP{ftHljA|Kbl36w!DSsfj|$7 zu=QzBd;)$;*GJR+VD$3 zYwMRr?-?Le*>g5Tka<8_^sVUh+dpF(=JDx`gE`uJo4<+{1NAPW_Lkb4zK%)XJHeIx z{E-vcYBsFUI2Tr=cu9jn)si+fH5p+yo;`2n3o~BTBNKJKmO$-p%>XqwP`F5iwWp;` zWzrLFz659U8z%iUD5h)O4Of2ZNMm*XElxzle1qK&h1Us1-KN$~PlVW-L` z-^LnrrU@axZN{=NAp=~S0v`sRGl3R!-lb2~pf6Kz9zQYVU+{FY2~(*52JvnQBz}dC zaRFMY$_Q3#`COaE8)p69U9>-QR7p|Z@GXpobHq&n3fN{Kqshvf^Oxhz$~mGLS<=8z zLel`*A&8x#XYv$V(}9#IY60tID_ra{P z%(I*iVV;ggjUS2C)s>%Q8y6Wp@fSE{T*+wf$HocaXmWrovw$4KoekRU4 zQ7oy+tEdoWika+C=bNyp0vfg6$fA8D3J@V}R5!dQCLf5mb)!&xPa5tBQU|OYt{l0X z^1>RZcB@EM6N-$Y{D~loae4|(fUthxZ|$g1^&B$+(M#PJ&G9g)qLM8^f?@i z<~<*Nlb_iZu0EGQZe*@<;P5jc9@*Ezk+{~Q0N)b-{3b)wIEhu^9INWOGx=h9iNcTZ zP5GsT$jt2gZhj#}5=N8>mZM(+Fo6P7*KjrL!+OGLk!G`EX_G3f(Nj$x^A8A7VuI!# zPO=4dTkB`TNe{JXcD zE;lXZ>aB>)kh>436-r4i6vJtZ`Q1N9XPN!CjHs6_f45mqNN(~^@TD(*f4>r(@S>!_ zDoIe1iNcvbaeD7Pq(|}?V#|P6E{R=dzi|^vMV12q3e4bVY<&XC%uQ>6HKq7`;?uR% zEXAXCM9A*RqJ({)HB{x7^*Rej{^M|q6CUE6A6(rF;!iV^-O{@oWDWhy7)o5^j5 zzDE`Zlv$+XUX|O@PSYW9N+o_PzepFO4x)m7&Mps<0*8CbRVv%)Y9DhKNHede>YUo|M_UApMERxQ8W z_V?ax8EesN+;1}T2i4)lPBS%)Bnwb%fE|Sh?01Xi*5yhadZ0jE61WojjOwpX@v?=l z_Rr*j1UWK@Vm0tLu%jX zF;+~C1g)w&YzF>AHsqTLUKKtg;H2#<0~_IvXGv2CP1 zO$#NQN24bErp#VN+@yw0PYMyH*}0TD%D;HDbti88eClo|XVRC1J;%2aK!8S3rpCZ; zUVnmPjT*V*>&3FLYK{UrI+3$B#uCJmhTPS3S@mJ2rt_8)drsFv?}kvY1Z1Ur z!gdlxOA)W~raJwZRAO}}A}-&x7WvjkHZQa}xM6nq!VX-CA8gvEK&8Bw_~xJ9TYG3} z_};O6V2WsO|GT3D$?@e~3D4X^R$0rKSrvYG%~`vBF$yU`?wDt7k1Ai51>x?v{+R-@ z5S*7gX^WH0LAb@`U-`F;?)wHC=5BHK?$^B>NAA&3SbShv24)#j*9^E~lcz1OjClU= zn{Jc&xU)ym8mh18y-RoD!a87hYBtPquH&JX|A9sF))|%8qhDypRwjUCV))+Aa`&2< zqvoasf*-HO8n9l#%Z%OBO5tSbJ#k2xJH3GPAZ_GVb(kY%`OI>g4&>th34;8Wu7H2s z_kMscaeoI`hE1+<9{3esV`D{1HruPw(=pg^+`Tmap>2oz&T)~&m6Z$$!sZOH+Zpm+ z3=bbZ1R#t=aeD?Jr;7rH5eV_%XroPRc(*Std%yXuBd~_~pwa;>1BH566Z8nQ zm4&P?ap(f6c~x5;4T-rnp0|ZFmK;a6*^V?&)^)ZTS{Cq;BPo(Nh=_}Kdq~lK2!j`V zkTwds7~()o68KMUeC|SN%`>7A=F1qG+E^&&2wV-!2N$h74SsP}ffyBuRte>THxG@B>a zeA{+^asUBALWTwrP-#JOC_zw3MWq`F>8_zukWiEXX^~KAP->W=L5U%U?ihN89(vzC zd%x@VeSYiR`&sW_z*@|`uIoC_<2XKtrL`0W%Li_PU3bHrNQ-xS){8d-ZfhGK41%g9 z%fd-AJNMAXWCl$`%$>?&Dl_Mah6&mw&oK(3nnQ?J#&t8)mAaI~QhzSqexvt_4o)}S zE{H<=J9Zcn{`|U108C*7SJNdX^>n7P-t80gPwF;z0^h5LD2|I>&5s0H^vh_w$%L_N ztFK#l0dIVkk^_swgD%2gyI6S#>aaCs8>uZn(xAp{A; z9^+U$lRE7LV07~--E%kpIr#z{*mCW8>nckTqdM9j-2u)ty?`P1NRx#QI6mZlGjLkk zH#cJ85kQX{y^4BLi&iyLE_x=^afxT}L$e=^uT%-do$#Ai_}EOAQLdf=7gdef^8H!A zEgjbP>Jmw+o<^+hGUil0$iM@LLdc%-yX`^dCTtM71Cpb83Z)qDh(*wdn;8`|FZ9^+ z?70GzO~Vb#uZPsgr<(wbB~Y00?eMSY@vPa`b86@n_blZDlcQPwoW=Yxb7g{URJOR? z^+K%-K1nj1BN5@nJ_e;e<>TDZaJyHID(F_=RQil_;n6`HoU{U)o_l~+LrB^ z*2bZ?`W+2{kgkgtA)cpv?Ss+FZ{O1YJVarYcaN;y6#H}i^jE6N!XzQEu}{O_tUs|# zqnwXYC={_C!e&8hufLkrh4Pzcg^`tq&<09w(-mp`d^7sgHO;lAYRt?;L*pJzWtk|x zGcQql+Jj`e9B7&lu(&&`?)Vh~URM>Ca-G8B^@*oDVvkPOp5J>TZbDXHePdS1$Cn~~A1-ua_bhOcwNx0k%ZnBy=`By3!(uj-Km7>CBvQGvmly4pV>m4|q zhB0~W`0!(rlrrT_!kn$97qRTj01S$;a5EnBGo`bv$e$D}zuRYA-j<}a0?=1BLr*@| z0GsV7GK!t7(D+a3_KYKReH0wNpmd;_NXl0+`1efwGm5c1PC_oId*eZzSJj%neQtxi zp!qZXyYt?{DNGUAm_3^O*A`#&fOR2_j;{{U#L^m~?jNtf-OVV(yN5#du=hb!MX zWk4#s)T7K^y%!|Z6)`{6(iZz*-HWqM5;GayqaD1b0%z3J-W>aDo`%L{y(i|N8443#oC|H-X`rmHuTPWmy;-Q8t3Yu}>K8y0TP7;A@PvfX z;SP9{vy_<0(h$D}t=1;qB-_4+ZC?rj{|VplM=Wcjvm7XHw-Be~T9b1|#8_V;HL-%@TgiNjohhI1d`#GOYx^TUo+eS+98oMj;vZR%jpE4FD#xZG@D5C>e& zOr%qn^WT=!=TiI?0f%pP136USN6qIY@?8rmYWUym^c1njD(;rtF7RD7wu^1416FYk zUy*<;w14yXO|jU+V?yGib&}>TQv8G&bLp4<+;L^Cob=~{ah!T?i?MoEi;Q- z%7+k@%b!Vf&Ia(`6f%5gR%$%3YAD{%KrdlB$JHDtK;7$kZC~1u z3!tyULeCw)oLL)e=~nW6&{eEm(fEuz@sz=+UXegNFcM#jimW^07{Q_z1ixHnt|@f9 zllr-@W^^e-SUOVz8@3Q0=S4rs9$d0#rz6vwO*&|lDSf@>NKt9d_==xkMiYGkGO7mi zfHnbPQ8K_qr2<~Cdw=WMZD>j28(^=9msd7@?iqErVc^F5FHp7X!or2pwjcuw(m z1*k**%zGCJBT(7eOM=Q?8krsCh_AVbg4;{0s_t9*%^`vs{XF+u$T&wPX6v&?-*mW= zJg-nrur!kFP*+v87_YD-dblbz#NKk!&>;Jc<-t>f)p~jJs_P*_J%yU-;Q(NniI9-+ zOX4{W6>_NuztPuxo=`iJIMjbJz^(9#EJeHr#A0@EuGdl zMSi!T-QF_D4tM@I_^u(U&qh>Y{&TTz7WFLf^4ZQb#Ju(oEh>_X&TJIegv?=NfK0?q zPdPo4#IU|r3I(xnXT0UC8CX3uu4y+LGYT1C`u6%IiDINxM^C)2sp$+!n$A=0))HP+ zzCTh`^-L{K@3A^z4h)^T!Q~6;P3h^k3`FY?QN8!^1fYlzZx3Dl zJ81WJV(P`99^aQ4!UWkREONU1aF=AyuydhI*+GPi^(#clm4y4K4^g;GE>-a7+K+67 zC?S%xxqQM^h#g@;N>uiyU-U83BT30evA8JyOE{l5=_rSMpK0FBS0NuEOQ3aKYA}l1^QGKcNJIq;Z~%?AT74fr} zWX=0Vqg5Q5S{>Pl(%!BEzfJaGM>(n2bx!+^Tfvj9hV`5F91cV&43I}%+U~Hg50~YWWlf8_7 z5|K`C!YU1mnL&>7pLyPi1#TkFAGXV-TIGnhuA+9gErTdJJg=PkYRRrj8H?!JISDwGvyb2?^4Hhw< zI1gSQ;@z66)gjnE_jYjj7Rog~WcKnUY4rqE%5M@85fLDE0@8u(l0c!*=FoGPc`yZN zdd?rizWV^S-*I7QXSXz{&e@TqczI`1u2afoS{e>O#upz4f_Aq>B*%aZ0!uc@r)p&d zQBm69;9#O&^E$UY0wh2rhzGKKt@d!M>&ptaMML(MpLnrD7)+zhV_KZ)yhUYHR?l6o z2*Ra-*4(^Frw(k(o|6yfd)g?~s@DCEdAZu%uk|zuNh7DQU~LB9N}@h? zRw34X=BS)jeq+H#^ZYIk=O>%bIU};KGMJ1vd~H{GO3$k*7JBOYfI^kKq9WA$K!GhI z-|_SY)bfp;N@LTFOHGISzieGb0kj4*2}i+%ZhMS0BuonLZY7r z1eAfQP(J$>P*cXf?+_L1JhO}@*$)kZ+4Mso_T+fN9R2__$rVsqp7Wb_?NFp`kIqKw zbxF}KS?iCEpj#rBT=U0^#O=HKEnt~1cL6rtt&N5=)i&^hKOmdBijjS&mW-lq(V^rf zTtr#yh0iKZP0-(!^*-fB<=zD{-x0g;*;0X@htad>f|^G0B-7RfL+Gs3d5n9vd0lT( zfn5{D6(w*dYr*pu!(_%JC zdiYe*jY2;c{uU_cME5ny@{p}_ruOMMKLO*pzo+G@pvW6xke&<4h(F*W~$7I zjV-0qOHe(H?K~99Z~)$13u-#3%?~7#13d%s<_?e+ae}SY< z@31#-+(HLIgpD_(fb?6WBu|pVDAf|3b)7-Pj;F}j;@Ypi@za(mZR&kH&kwuHKg4nK zhcs^-IgO0yrh~l=g4K_-sp2^9NN)Z)h4XFD4sq~nX!8sr>&uYkA|>jjKVOl}_V^@% z{Iih)cV<5oWD{OKz@WL>Np+X8NZ6_M-})MTU&`*?E4l?mf?ao;IIN z;w3(ioXs>n^bV3?M^mHr}cf4-w(t^kC?Z^d|E?xlxv zl!R?n1qV6YgjmTA{x&Cmql_R6S_rOgthVpVii}!@Zk}w%27us z@~0^2jzY`i^fLYnB$Vs)7mqXGA33Zs1Nfv;dW0N8VAOP9Y^T6&4(6-36#A7}hdjw|g#JW! zt@=a{GKrW8h6W%ocC2>l|@~(={FvQqs5OS4m&z?Pd{PZbZd7?8o4TD*%i~*KMa#%S1;NajF7UIph0yDZ_M@M;K05lr2 z9)_hDk^XERe%(^}^S7+c`v*G?ZYr-{KTx}YACw)pU9-M(@x#-wyWS+hc#6+{1rqDj zrF6(ew6|S~h5X`~?{@~Lng=RSK10k-;!XNtTS=H_&+ODRs^-+s0w@eFUs&GV*_@1< zPqHw6ed?E)n>_qz#bUtP>W6`tR5lha<7x4|)csAGIezliwEVhoU1NQt1hQP~!e|-> zRHmdEZwOVOjR$3m85e&)?1lkwLMqJ>0!m?+^Sd3jJ~q_K5I);5{p~e9()6pQtJenE z2?vlE77g|mG43zszt}ncC<BV9H53!cmVaWn{uBrGyr<%F+HTM ztn#O&LH21C1Ly75ytqGnCZnpZilF1ye@t}LPJu_buSB<$!97wctbvPj=5%;Uf)IAREg!rM$i_U2sOI!J z&%rLB{8#4JJDUTxUCmp6^r$*h`J)(@g+p&tjgRTCQcAZqiU;ZZrggBYo3%94XEj%_ z^L{BK=`<0>KQ~bv>d%Y_c=`WPx93IP1NA;s3P@ZlCArJ!O;=vtrNl&`0T|T|od<@@ zFvE+kT;4-bJ4ZH(LTcvSPe%pDP3AJr)un_$xu3Kd{u6@09z(u#>1&wTQCr1%qdF>| z=}hqhFr3$p9R@t02pYzPf25y9f1Q^s=gcsO9-wsIRtQ zzBdfUE+|5cXJ^HHRHAKi77t^aa_>)?J`t64nOO1C(fIrtv;$?*yi0{y z;RDj3ZRSZ0vI65D&n>xG&yiF;dOOo<*(ED8r(&0{>|s9_B{qf>Z?L8WO+suVR@TeF zMUh*pgxlmE*t}7ud zfkLgHmiXl*n%(W4`$f(0L6bz9RmE_QHa-f1?7V|Xy}28L*dGzoywDx0R3_FGb}rv~ z;Yt%(5Haw6d4-{PbL^+*v6&aZl_R)|{y^17E22W{oH?BmlrF+imA)cpDw3`8(VX;) zYjJ6)9aLm8GV@;ZNshQYZm6WF;@tawFAd8Ns{Q+Zhu{Bcd-z8i&p%zz|K}{7r}>Mg zQv~O}xg667<=($IJGSoo{Gj!wfr&{;%PyUT-JRK|U6cDA7IIfW#2siy3ZrakS#&&E zHo+EVxU`C+AQ5|e9){B-X*n{UdE+}4Olx$# ziPOyFx4Q8dPB7alChNa*X4;=uA?PS|ULuX;=Ju9k+8dR*WdNq&wP|ri^V?b4KfK+- z`HTh1-IWY_q;4?FJl}6!3VDC+rqJvJqTV(RTWfkA+fTv2rrKeC7}+r!vlmBg}wvfdjn(?1^Oc|-&}MDIz^zkHXEhV55O`GPef%i z=E~7(vnig*YNrz^4a$8|CAlIu-S&|t`fSlzH%bPbUr{Ge6SX4$M0 zXzgwZ>B3`iroJ=0+TZ*D2!^T|M4^q&n#; zO<@Y_g6FmuJHG#7H2XZUWFNC2bwEKl)`K7s^spj+x2?7|X}>SMFTWwMhV|$9SpEqp zrqbwta=*uSRP%_%#8pb9GNU0b7vRs}^=ov@;Y>OH*ESKC zEI{a&?KCM1&_6O`-pe<GElFgX6|_^u`%vErFu|zDwlBoh)X7BMC5yp?OROw z$))W5ju`)#JRKX?s`)cY`X&wtlBm#=)iO?JDiR@fAtvZ^hp0Fq$lt^w98~XF&z9f$ zHX*yKta8M{W|~|M-$ZCm-|XsI4h!<4#6IPBXN(_i9tR@4zp7>S-@5jP`scSq)+bT5 z;DawoTGWTJm!u$Txwp*dk!_lXO~+fj149c$>?8w( z>G{svily||xA%MwXY6N2l;)Biu(Kj$8{ zrTP^qDU=3g&MYA!4Hb?VNX=-h1@52k-!%muzdO@DpN-S|rBSGsBdEXxPX5+Z-s}r4 zYasmnAyjD2wYhZ+W_i-eKj695^hZ<#A@FZLiT^O?hbd+QiMT7j=~K+1 zXs`dq(7_HCn`G7$K;bqyHpbKg6H)i}ez1zlNwUicx@oeyVI^>mE*nz$T|NNtvOU%!85}d*bob1VE~}0ao_a+(fSyJUEtA2PsrfRV_sgG3J0i{{H=YS&Pe-yR{ZA;`HPM zj|m~`#s1+Ci91<*yrCZVZ&g_i2wc9ZqKJV;P=(vREqpPkk>o#eN{I*!^PR-sj; zW1k#AK@>~*Ew_|Di6bv!JIX^IHbV;tR^@74BgCIHx?>OOwZcxmLr2(51vuJfM5vrx zefO&f70Wbto!*wq9EcHana00{PP^TmFF{cTz-wD zkzDwZGC!@~PtJmfX~(1>QoX(F;Hm4Q1b+JaL!Bahk*-%{UKhAR0?Cm^f6`pxDpvF* z{zqsdV7U;ybRN}u9F+IZXU05I0;q~UZp3ht{IZV#)}Kx{eP<^$0J{Vr6T0D`vSuMW zcQdCOH4M<$;HxX$SB{;klgYhkUy7b;LjVYr)Qr`&Ook;jZM^tgEHY+3ees8$sr|DP zip=#3b5`Ml2+5N&ep+*a{Utt&+15vEV+HyBd?8_ihwBG+z-plV27!o(egyENFPfErbL=lwj`c0R9_Rbgg=XtGe#4QhLxr^`*oE$0 zZOo=~5ZkSupzySm%yN^E-SOWx->__dR{bwB0V2y8r>E#e|GISLF*rM5<1ToUa`${B zG0n}CW->A`C3Hp0kd-_-F{)`d%hFq8SHY-uxdkkaCVZu+c60Bd#`X=C!L7XfDGwL{ z1GVpaUc+Z81vqvvzfr01zZ*5!<<0c2Ah1M`}HO-uG9xv49@MdErk(Yen>i zVEEn}ut+erD>U*^^YWs!rrZ!{c;k z4ojY#-rpMMnMVoH8+3n?v_Cn@(H+7lE7v2KcK_5CRamXxI$(2O3FP4`Q}}PTqyP6K z_Ppz_e59DD{owouU-IYAamo=O3XAN7J*Q|+otw?GP3v0E10qt(hlZZlIF4P9ii%oH zm;!i^l@yUKSLY_!<=-i>v9Zk+mTk@G0CfumadABYkkfmNRAgJ5GePAR1{-oEcT>=S zEA&J@@F+Lr>QXE8Bumcsnua{<$_WY(ZY?SeY?u~5X&t&EFC>YG$jM#cnS}eD#kMwr zf_Xd}GZOeL!hIc7A^n|&D0d+%5+xCC?`YoM!$b1Dy^#&i<7r#dr+n#05bp}eob@J@ zEgk_g)qzf&b3!a7JM)Q!f3W*HsX5I2*meAOV^Qb z1)u@ypijK0ZpCKxEWhTf$PT**-++#!^!3MY1wqIpdm35HTlXkP&XeL;3;JM~4irZF zV}HfCrB$XnXV42Lu>S|HEMTu|xglS>6xP^jxe%YUk?SeLN%2u`at7e=R==0tX8~s< zFjX`VEV71qNm<8UhXekUCojsIiUrOv`W$Uu4)TIF`Uft@Uw!6A$EVefFguKob`%7r z6BZ`fNZMV$g#+>t%d|)*S2es~jW&#$n6#Tl%9jZ5yc$45^s+AJf=o zS+yb`3TfX2QxX(O6q@+V!!{`{i#lYQ?as_o!ZA(aj>3&Nzm`@YJi z|M-N@UjnUwP?Q|DD=WXOfIk0RLI6l%_Z?D?XF&<4V92O)1=9rltJ2-YT16{A=xsWR zR7_u^Q(U=3`uoR@UpTy;>)&yfaIx8Gsepd^9Zn&X@%9wd&=Q30|5HTWY9?K`=d3!c zw(z&dfq0dFc2DYW*eLtGnAg1*Srwyp`Y%(O5G?WzD!WKP8D}szFpa11da93H)7_qG zWi75P!dQWwX~9~KG72wyZ=}&Q3e!ciNx@|{vBf1N?R$(p3+O*w7Wm8!r+0~*rN-53 z%03z1*?qhEg4@hM2*2e3bn1MTMc-o|v{V2n^X0zU@XeY`!t?x^!gcV_6Y$mqxk%UQ zp3q*bk<7oef^E*knCaEszHr?xV158RmyofmYP*^9;j`j zW!+>>!(5HwTC4Tk+lpOmjF6g+>3uadxq6ga30RVz42_g-a;$|<5$5NsOf}O^42g|Y zgzsio4fc~pbJm->2L2xQuJBk#nmwSoh|1M%$}UMpt# zO^EE0J*$1MCW_8AF$@3Zz>p9QooOi|shM5yJ(kb$eOCYsi=Md@ilMF%Uv2(yNeQ7l zUE}g3%*~nARD;ss&BPz|D3vJNU+~Nyzas9CcW{%U|9Cy3s9(@kuEp_RdeqUW4~|`0 zt9ehqdTie!HQXlr5E-SvnMc%(xeuJDZKvrmy5^7hG5%y5IT1VQo{4%f4{krq#nNXf zbc!}Lnny~@JMC{Ag1^1di)^<<8CwN_s*=#3{a^K8aR zASEuySWP(2QA^Swe-MNkIO8P}A$phX#RX>#P$Q*G&Ms;OqN=-J-DBuzTaSGFcbodw zW$bS(C(SmD zhI+Fj1F*0kZBH=)ZmQNx*asgDUsQT{plgFVc-jB@(0p*ivcyC9LlQw$a!1D>O_K&F zg{7Hgapf!eUb_4iOuvP9^pt5B7Sg#sR84+c+&tisETK%_Aa`9>=*nNoUjIm#$nZ2@ zM^%J5-cRc;Qi&@F1eb@dZGvj3?C-9+ab3|qeWT$8l-^!keQ2bq40Z>c&h^Yn;rGg$ zj#&E5rIP|V>XwB)(~;yPHk&1lgcO#G^4KKS81?&tltL_IqjJXi{7AmBd#2=R$sYQ9@b1PHRpHQ zxcErzNcl6xT!4&T1pal9UjMNu1{=*?m$IGhN+h__wXSpjwjgRC=*{(ZTiC%qav`GD zHvjCwlDlvdx$lfO)6mdRJCeA(Kg5h+Cp9z0CJsBvkm^fXDHpLuQDH$3Us){2HM#tn z6~q$7V(dPMHs%|eHQy$2N*g|=UtTN-+ogjzCxH<5VR4>4D=esHCMPnju#;Z*hywWuegcMcSHu{-;eLt<*OHqz_s{3eq`X`;UQMc zQi$o6WEXXv1c-z;Zk+-O7H3v=$7VUJafj7JtN%f~iF~2L-W|kw0J~X`yRb{+wj@Nt z@jB7x4$24srqo5*Gmvm1=tKKe=Y9LeC<2HnT|da#H$!6_&9A zo)0`u{p~7b%PlwXAImn+G}ZV_)jtfb-X}XlWQo19e`w80LdzDRV^fBZC@w@(Y_%f zxsdq#IHH5({K^bp1G&87|Ccs}&a&s!r9RFDvo8xbA5b>xn!i^EofwnO_j{%|-W>iW zB#X~lIBoEhyAvD0UefP8{@nbc$D=NgY_nt^fUlnOl=3#dQG$#CeYfHT0PE(Cb|XJp zv7X;j`y@TOvU&W}2y9Hn;CbJUQ$lr?!@f6b9}t;fJnkK3$Z7<<(y1GvwSIdU=8={_!JX z!ikU7keCV-Avz|8>$3>K^k-%Cjt+{3bP>}mNy7&uC6WoYL|eDWIJN&n&Yk7iR?rA$)Pco4C=5D9>3P0J+|vBoP2eiS)u-})Tx-g zAe*nQj3dvLj!pCv7sxL(VrOSFfyaYOSM&K!N}%Xv*)Fd9TC@0YcB=}_bObNus=cI7 z8JQz>FK-Na)#D+cbH%2-Tvq31uO*Qi>@|8(#YV>!P4dbvJ}{!-xxq}-dtE9E;yEpw zpxRW92r-urp|dBcYe@vY8iUFk@sf4p%11=0MVBR`>9=_fczE(E-wGiprgi3<3M^=* z-zk&e=StJpgbLK>cNm|9@RWf!PQH>Uu-}qDAy6;?w$0Jn^cf=HG{ulhpok24)d?NB z9aKg<R4vwuRvJglsZ=Tw}|mmGvJuMq-mDtQk(UVxvpQ4 zYWlD*?4@XA?TFIlkG>vI4>nr=IAeY$_?>MNCiwd?Lf!oD$ffv59m!L-X$)^TB3SLq zOmq;ZIDHQLN5bb`7*dG{$}$05>bt8Mu3zj>*^l#wOUDrkx45sd+Y23fzT!3_0VW8O z_%2L;TLaDSD(wu@m0VF4axBAER+;X|}*d*gx%| zqxw#c^8x=g4R?VoqmlIaV~lM-!(pMk0=s#saSSXwC*jhX-(rX!W#M)#T%+LLm96o} zN?tM&E$y-0k$m>5svS1?#Bwa9$;=4Ds~QriO|+?cAs2oCe=?CH8GoF3eGs6U?rT(7 z9omgQExPMJVk~CY&qnws1VC3U9$U{IV-a&Z|vl zCo;i>m;?gY_o|;~RokmITH||{G}8M)_p>A`UfHEdv1q29wfkw-rAl@Ng2+Qn9> z`}8L@d;N8Mo|VFk2Pncbv6=`LDrJ)sbfQ>6~ZJcxa}VN9uKZ|&ph=ZmN!G&a~sD&;3YDE$z* zwIpd188b?S)uyj|+^8CI{n*b5FoX(Dbafc@$lv+gyWd7ig0dci*|hd4Qbjj|2?ssx zJj@`!!ZybAmmNhF=YH@Q%zgF+DKbS_?w;icSeTt%FV^`_!u>x-A(_ADCF=LH!#%}R z0+lji5EU)K8Irj7Z&fUSsbfl&2p&F8HFgPujWKRERHuPc4eH#u%|b4`U+C*w&%*sJ zmg;jj!lM$sD?Asx!6gBpTW=o9p!ZdCNMFy5qfjN z+?`r^SwYRY|L-JbEc(s6L{h}1?Jz6sfNI$lnHJ;tI}%j^LFuoy`unbrvaa97i0!Wz zx$iDMf*+!d!Q!^>KABl79P5nGshp;n;I4ukhZGfp0QCa~ z&nixpBa|*g<(%p`=bi$oI?&A6b_|1`-uK~{3&Z53smw<)>lJBtsL;qq0)8<=?MHB< zAHvO=qA}`^kNMEPjuY;F(T6v<&X7bsWAql5G?n`VMsgcHw9}-W-8UpHa+HGf7Er|+ zXW@UQT8c&`sF%kqPW~{6sRL8`+SrT$5!H$mbIhq#Jp8U5CAIzF1g`Hj@_k~(=hN%F zs|qIK;~Ey1Rz~+sEW?#xE5~wi4YLOu8E-_hy ztSRYg1dvyo8&wMUtFaF}x$*YG@~dLmhNE@n1PJwtcwTPa@=xm#HnGlkPtKq^B%*Sk zq)*lysNZZgN6-H-Ey8USO_75FpPX;u;Qzlu5u`k!84UvigT?6gmwy%bxk6jOljCVX z>tlLPmCu=+BMY3+#w4;Z98%I=+cSG!%XwE)@+PpS?~0_L$1Qb0i7G{`MN9LIhMt&m z?6_Fi=d=Wv9XD0K=6}^6LMUHe57I%1(!8(vC1?5~v5tUqP>p5TpKj{@o_nlz49g>a z$HV-enQ(CMoaTUH`L+vJM3YmSE%5k)z_6&ht*eKdyKQ^5QI@ke(lB!|c30NdPv5QO zM-1^kcA+VpYTFYFerDrz1)BLiKFe49GxHYM_KG`*-sMdYWxx=~2C;Qk6|;E4F$Qz| z7W^!T^s&gMT&m|q?{~qi?%B7>gTz1GUvo}h0{*22nTg{S^5LGq3}Wg3ZjK- z`@Nc<*=QZ7Bs;u0+D-$(ott2w6Ndf+0oqK!Q@^lXlPZ>rA4we2Fi3OgXBF)AzTFlL zn*1(YhPRpzXn^(mwFh-3+L;Ns2Qi8TWYzY#MuVP#(@v-*=P34vW81N&&9~ZA8wtX_ ziJgAM*V%my4o3kT>NN|yjso@x;?Jk6V^&x-|7N#uZjXaSl!IJ0IcN(Ut@&7+K5ZTC zggvWB#n3%gRDu*qsx67T=rn|$>|+1{Mdii6U8Dbv(*6$}K1@;UuebB9<@d5nU%JQI z+MT(|5tq&um-8(VU?~^2ry3ej^-!QmM3g1LNR+B;Y-~8=&%wR&g9ER=ru0Zv>$;3SGbibH-rh^# zB8Et1s|0I>Rj~SS8JL9cGJ1b%kok?l-3FG5AN{KM_Bv>#v_P)+bMva!1?z(6-(he-=44#O}cxFbxzFvvc3$5CBNL_(N0|(DxkbCF5b}z z>tjW>%$;^xuYbJ6t%ryZ(&wv+M+^4KbXf{X7a7i+L=!+vTDCvc7t8F)OsjN%u($KU zND=`va~0>=wZe~04ZGW2Rm+)?>LxT9{_leov}`KM<@Ok%WY zvtwjrTmT$_QN|`3Uh(8NbL%5lVmj5iqR{$hRUQL^Qq)PaK9mntRKzZKzL7IS=ny1u z8uEShWMlb@hmLaWTlUXLwP}}wg?>7-v&G^DXmPUJu-2zr`P9E>cvM8+q2-mmTA9oN zfU&eYQGOAso%fV|zX@Y!)mvJ-bb6PjSwMn~d$yCW;{5HG`%e58h}X%Sgco9ytG2>( znW+Mki=&`Qj5LNu`g*wiZrbm7F z)V}GuCdOa17qL3c;#GJ!S}~s2y1GMNpre^toWOHda$o<$BgO0N4=3X#fdU?dlMg=r zduLK%2d_D^ROA+|Uh>gh&=-d^HD!-QQVmb-NR4&Ya>jJ|U9G&vcPU;DGNidm^y;w5 zkssme)3>(KaSTlq*{cG*do{ufTED4kHCW{p<4J}m7KP6iJrH2cT81qrq8`r>Z$tCp z0Dg6vj>gcv6)+VNK(|xZ*m~q2S_e7j`REvIJ493#Y%wUWP_!qqu6vc{3UCFrTo33M zA9v4`EOV9Kp-VI0{o{1-Sy~GcFVUTW!U7SNzz4C}u4ZB#m>Ys2C`KIQ&@Oys{i|rX z67?4*K;A40q?!oyZZHEN&!gL+eqz!|EzX(Er_<`&->_>ZP}86mAc=eu?c8N_wRD|ODrSsmAP6X@v0CLJN6Lb`*4wr;kLX0)J$(&W6dluYCxg| zs^u|z6Z+;nmaWcpKJx@MT*X0yTZTkw=I5PO?FVlGdpSiF*)S`XDn~rogMtuLP< z&BZkXV`mwgm4NlOIb)@LpcEkherzYr^Akc1qrfFwi~6BbPdV=gD^=)MT(5v#Oc3L! zqH8GLkow-A{9XSfG-s2ak>io=Yrc>;k}8g;^a?1)z7y0lWt4nnhiYG0_o1H))4icx z>(wN@&x%y+kAx2KB*i6$G*~V$#?o~bKO^Cfq-?&p26p`k7$?3{hBn~{EO24`>5THN zAe@`g#gCS~!pv=wA5uu74o68mXK}=-z{(f(=tsiM&+9TYV+U4sWDI_*VQ&l!fi5-HvR4JS4_E|s68zo`H_kSI>bY-{n-hR zQcLpxh7=>Vki4PPD<@L^M9OKL>)l3`o;t3n zri|)$0j6DT4s3*F;}QT$(r(Z9Z%gw=uQ`_d1T)J$EXlYnC?X}Mfip!bCWpkLo$AjE zKph$c+1vqV9+(Q~&Av^@-?c(u9kZ9`2Oz((4`;(b{qL)FCEeWo256pUgsbJ82|{z_ zZF;EQXjmZis)9d{OT$v70If{RUg{TO9QjV6H~?6feICHpX>0A3>K7<#8oss2y-r*! z&b0FdHGOdLK4Es6yd+R9iGInGHF{CY-`GM(E-zxQ9GK6Pu-dGjSnZc2%j0i%izr=u zxLtQPaFqeLJKGxU#f8Eyzladw0hrYAxlYVpC6G%kYKG=yo9-qZ&#E0?wiTNSImanb z4S&-TZTE`AKG5^~vq;D4=|FA89S=u^l9BicOWsatnbFjhrOMW#+N0_*_NxZWm@LIR z*J3fs%ct>{M|`33h8se#wUO$z>p+KL-`-(?q1BRT#wqVPaN73`Rg4Tw!zpT{K9~k` z&C$&xWyC3>AOE@krSy)q#bt*&w)qS-6Q*!1h-StHFYS01@C?R|V2Kky^NFltSCw<&l)%4LmN8X=;`qFlU6GI8XhuT+gC&3sCt;jMp|Ne_qJP!2E`?+^_&87-5nUusV9vq{#KlFfWM)WcA!ipoEg~#35Br>gfD`Jo`aH)xH zsckgJYCSGwzKlPoMTNdAPnw5aNB)rE`B4ATj*Q-buYn>v0}Ac?s|AQa(zSn3;!=O` zg@Qc!?_ks*zSPKebxV0`ouoiNZOzX&V9Dg+j#K_z>R}4L-n|CVb9r0Til$jy@cDD& zaE=9ei92%$gnTl}I`fV~l;Hh4X7m&4WIg-m;BiIO3;#gBCD>@-vlR1)7|!523Q=H< z7&u^>D&|+Fyh_!hpUnealHMgA#Zm1%Bsk-`5mnKJ!78bEgOoSuN&L9QKO75^+E7S< zOv4tLZHg`hNgHFC?|$7AC=75BSk?8R68)r``09RJ7p1h>NBWAE`Dp$4vt`jQh_|cF z`{E?tL(L(e#lDF-!cNhQEVIumE8vl_iMim`o~y^V+5mfk=+z45s{Q|@4{sZB=7U~tF zx7aQGE#nmNVuvfG5ogRhq6NCP4;XQ*r;*ojOc%?%o4tFJ_^z?G&z?kRMAA|Z*4JwA z%OfDfHz)JYFEIPwMbo4SS1;@;@o)@JlW8}0hoOjc`LH@vPzZLA+E+3 zDy<+_SD=<8Fj=2AeYb}+7q$5ydIecXj|93D2l%UMZOiPGkj8%c45K%t2=ON}Wz7f7 z4QC!~>ecdgH6ANZq363@V8tr3UqBh3=S^XC3%^^o3Q{!iSteSUwmmO8m|T{{3S$VR z^WIPAa7-XorSbow>^*~;`rCD3|5OnXK?MZ?5fG)TAOZ?XucAnA0YMM~gx*O61q7u_ z5u|rQ?&Bh|P2Av-*h3?-C~xllN^!w1SWi$m*n2vDK{%4;_fH_I!V5^-2Mc24e7f*+0jg z@7p-F+1Xz3CqBF|%=+nsMcT1At&c%=uqVU(RZ6xW^X+Yw4Dzd_$|o&X=l+r1N^hSm zF#(W##7vT8!A^1}c&fCG3gmY5_T4$d-yQX*uFl!}K7yL7o^4eVFBo!GYc%JjjNc{~ zEiftIr08-8v!NR%7u659pP)iJ0#oT+|>J4u0o*ZiOv;cbN?EZ*Co0 z9tU-gtR6HNH=HQ`Kh@JHzQ45hgmin7T=E5UW|J3Qbty zzZSmD&q5$>%Xn_K0BrUamcL;qmW84Z9x#>r<1thwH!nYRUAj16Q&oP+6?OTS#uswD zfqAP{)bo1|gafNb^)6dAQ+TVGk)`FcXduD=p+DJdgYWwI_@BvII;~33UIbWEN}`vn5W(NV(-uh7Ya$=_ zvq*sXkmx5E{Y@*#^?RN)!|a#c9RgmkQ>-+B@A(4z=<@HJpA6cBUq#>(V%x9BEMK}V zYI*$U6P4oi_Q$Sz-a75YCrmEOYsgZz`t(EbpSsl>K|I@{Bz2(vlfTYjSP?nHK+^O*U7 z#%o(Uc|L-pyQPVAGv!Bgp9Ij!(3Tx!@0Uxz+$Y8#Tf1C#^2G~G`h?(1I_;z{n9FlB zP`Rt_n7`ol$+zfzs`ych=`RcOAF?Uv!f~&Rg@YUgKp_IVt*llg*kr8y;?L5GFc3e& zW(124c77e!Z08vkUJ%&O`7eRc3%(stYRg|e8#drDEUx7ybbF>M|09NBJL7G}x9PN) z(3rvO4`X1lXLIu%U88=SFp4G=_RA~esm0W=9M5>S$+PU|LUIjOSy#eAK7S~@OWYI$ zXM1kDQ zAUIZqNelu>U4613Yi>QjIPpY1U9co)aKhtHgAkEnO_9A2HoH>-?2<_*#A&3Tq}zPx|%KMj@HgOF^NJ{mmk7`0+A-U|@MPC}Kmpci#6&hq$j&`Qc%?8A4Pl*gzi zfol!TZf;1b?Z+Lx?+)Bz0eZw3nv(24Y*RbT!vp(ile4<#m;N)TOds}_BBjyd@8vLa zBt<4;48B}q?BIB7WAW!`K}@o3&#CK0&=9f9%V(G=XZ0Izk`p8Rt82(|8AYc?Q&V-T z22SSF<}+HrJ2E-xkHnqy|4{fCV{@5zI8;$*=^I3k&i&z^E*dGz(2}LUQHaxL0gkbLlT}!>Muoo@Tl%N2*D8yCRDhSWWrb z+h^_gytgJj+n86B>pqU}`kr0{TV5(j%=%26pBF85A=M;KfgL(RweoWR>`!?jRlxk;M|<4J8qHzAWV9ntmk(= zB#_BZ;Diaz#0A5Ua6tiqa@%3feLNPR=z=GUnRa9nyE{5AewCuEzIE#sMYL`I?L@Ap z&KH1V4bSe|0|ByD|MPk`T-{z~n~5a1-mj$S{J(x1IrhGRNOE_v?vH&z@O+ zvk6*lj$(~p5Wn^3*5pOP!;K7gx_+)+;kKhm;Kqlxc#}96@!6D{skg8VvY@#YBzB1Y z?LtI}71PU)A&4VRlTE=5p)Y#`W`c7z&$8K%tp;-Acg;sszJCBCkCDXBMC2D6%P*bH zFe%ygL(tWZrhtjlqt(7;X^XVh)xSJRd93229u@AiI~PL+7?(J59NN|ZPU3vT2d=q< z%?NT^*U+7Sloo*Nx$v-_3@sX_Iehu>llyNOtks?QR0p4z=7G|N7(MpwvG^GC16Ck! z0skfK-7C|suG8W^js2Q*noTz;U`KPt_=Pj0l{hB{8hr-RqIni_{>ctn)_fq~`q*uE zty;w+^5r;X*@eG7scq|gdlWPTN39CT9=QjCSZeENJ;yheSC>P2CaJt$M@CrHS5AFBrSch1o4#Px#FPb-)%$eLU|j7i zyE6FWKg62*+5eptd<1#*n=mZbjqo9~;9k(IXtXUxtFe2`kka(@v_AR?NrzI?75q%M zBJEluPPb*I3A>l7ou;m^Hy_h*$ar4=b=tg15j64~FnPT7MH>i=bC%}oza=!hNX=?v zxiF@kb>5M}w7DK=usYcJ5lRy8mx&ro@CL>lAktS_RHTLWlNC>L%N}4lTlhY)cgRWp zS=j@s=u8xs-+xkt_>3k7+|H7{+$if!`544pj%UF{3=ov0 zlhW`3TKXr(#@F_Ychu7v#L1FJCnaS&gxSQmgW!8uM=Jq$*xJRCw~?hR~8`G zLKhR7(v|FL60an|HpxvRvR^XJisVy|Q>Xazig}YF%d%@U?;uX+_=L9K2`gMh9=FLB zVGX9b38AQLLWOBwpSEfKbkRsHaQI%OhRe#)g%V z7ORa>JG~=pF6!LqgNfXK*E0Ous^I{>w&1D%Y=kkY2If9Mv8xi<3mfPOmZqq%Q_rhiZBAl!< zVBQ4WLmtP(%I7_T>rJ1~T+ZM@(v|qEi=Pu#R{Zsa9Vk_>zlR8YE|r7k-Fn%F(RbFm`X`Qc*7zi5H$B%W;>kNZPeWl-cCiieaFy zMipTdLB&4Anl&)dU;BhS)xy|0&{4y3>3a(ZtDcDL}~ z9stk`##as0fH_Xa44UuvP_2*GBOqRFg)SO1*q)x@^(b>Ho++9$>+wjH5&68ri|eD2 z-YQo&U{A+-Re8EcS@A`u@Sm3F_7ld3MU(m_GPfrtw`c9a95s5UUgIz4*$*#Jy@y=1 z{2Yxu^gbVUYYXtX7JF5n`WQowI~+u=0-UYY2-4~}*2k%R#Y@6LOgD?hJi9ei7jhph zFsiXr``W*$+}~N35q5-0{m?CJ4SL#7S~DA_K9IT84~DOVce44zOoOr>k@S|3<^G{B zp)&dQCF85lGEr^9#zgWvqbeg)3+VjpjlCU8*!Pjp+vvQuGwRh;zQgmQtVv)H8DY+C z{rbB;&FLFULK*2#*yOM7q{nqzcqc>Ij79{jKfYiCVOHGW5H~*Lt1GWVdn7pOx9ZN4 zaJW9kR4i?^)HCMstwLn3BD);Xlzx-63LRbE=0vuf&C4|zL4C>A4Sy=XPW)!}`Ubgp z=i>zm;L_48u+wo(yB@XsXK~TYLiQ0jT1e=A+%n&?Yu9fKxo__Yl)hO`0`@~!B#GxS zboW~Cz`*w=e6z_3C#;Bmrc4++V3-N`7uaF}-b-Gtk> zFe^#an=;bf^q47ed&8$fiXrzpo0LW-r`pejFB#@0IZGv zATONtEG?J_4%LOAr}T>Bt7v{Mmx2RKxLE3=##&DEicF_efPC%9&NHf>WU!n}O$wvac*v{`la zQGcz>3J1PA$e%WTdF$s&c&-j=+eOP>MRoi)j!%_x+X+Q8lTy9sXHh>7oXcVzg!by^ z1>~@c<9vOQeq#Vj0;I6-fc6jYUb(HyPd&LWkW`?}91q z!QkbF)ik%@OG8iB4I565UOsvzVR)C{{7>6*sT;|Lkk^1$jVCT1di3O9nWE zp&l(&N(#DlVq88?K8b(qK~7v_tn+e@SSilVEihuGGyGx(?~_~^aLqjIawnx$lWN|N z)*G?1!ZpmCiyh3X3|U>HJl*)cNa4bxNiv|Q&U!Kb*EzCUcaR=To*Iq~;xi4#F0!Ty z`!=s%zy4kNo*u}GoW1Wcg1k83$91{vUvJ}oypsRNrG=CEju;T`zP^&eXK~)<`YYpQ zYCz+z2&sRE?oM9Ht#l-_euw(J)8DOP}&7(l#>gOft zH_yqUhiY1i)#EpodQ;`dF`7T0j?`3MXwc&sfR~QguUa|=;U_I76W;x(c$a-yD-3ci zq3#apl&$&0IQ4}Ih ztvR;sAWCE?A?*3vS>3j}Yv^>s5DetZorFK%^ptuf_jUH{+3}39WPkV#eU3fo57~f5 z`X45S7>aAlY>{PS0(1I4^AtB&#Ol;{1LNnnr2EwkKJ1(c-^#kN7Pak>LvK6{6%|6| z`hFd^2k`cNIv_i%s@7j*v0C2$w-m;Q3qsc2^x{>9cQXDe+Q1Oeq01#my)2MXt?^!U zGPdJeSZO%I3{7$D8PV)QTKbIPua_-GI%0M=!ySH%g2QFH>B(~BsczmZam{8@38Wv$ zL7acfSc=#;JzgFzi@C~>Ol!w?nAaE2mRGAXlCPoR7C{9LZjG+D9F0C~l+8157wipn zznw5uVYv3JJg5oI3-B;xpEAYAt=}JHZlwvR%2Bv0pSmDOp2Ob$>}v z`tnHV0b4fr*I+a?R#=GZI@^Oxq_W-7J6BvN94kY=B6*`YI{ENis3QNY&5Xai5<%Zz zN5ABCD*?X*6;Qvlbk0exIy;WZU&@rjJW%2C$bmn@bKQnqeR1I*D&P_r@H!*FqFGGp zZ5pWgmB_8S z?-4hp*@u9hoOUzdUmSE32ct13Oib<=9ooD9^;O*4kaUFEdmqu) z%>jnyrg}#$q>{{iDP!*DG915PZTgUjaXTg*!qBfhDm7#alw$&o-4TYq#pI*x!@Do9 zsI#r4Rleswk(@*d*fL0~TzSQ@D$wn9y&l4qPeB>9t ziKoO2;!N~umUz7XL>^$h-SeDx;SL@C;h-E1@bnCyo3nnSRm!QR>-W>!AkoJIN5fIX z;4Jua9#_M>1jhgPfzJuC#l9~eyfNv(sOG|*_aKSn^*kel0eFQz)aoR+K0pae`HqR zWwFuI;uX95Tj<0V1Sm}Mf2_x8Oh7%hy}iE7e&0fGrX=}b!T=-;c)5!dBeKy#A|eU2 zoZc_m+S-=7*dd!@){q4{_zTGSJ8=PlqA{q3hQ|B$5QazoN6u5A-!)UkMm+k1kiPE^ zL^L5&IQy!Wvtj5d?Je1Di(a!@Lnp+FJ!{e-#gZlWOXj?&Y`LdAZ$`83o|zdPoz3X6 z^YKXQyxPW&!GK01eTl`+8=-au7r%kU6Z6lz8nwP)a62ftq*~SRDg}Gs)Ov9^k`;=F z>n%5#%#bHG2V<`@Z5NHvnrCMN*^lFIMa1N+XV>@8CQh-xlGTq}8KJ*f9-QGo=dlD) zS&&dPC+BUETW{8N3=Qr-&+_%WrC;~^xC)%+rMFJ0ux>taI9H^_CLOjLx{Z8&V(XLc z&SqWrP`pOGK^9q#NR?E9kC@!I{uv^Nhz@1-7cCNWU5K${n~k~{=IkhkIg7F0Sj13v zzfX_wiqxy)ij&sQ+kZ9}d?xIDK6_%Y983#}9;!g(78nQ9Ab^Jw5+8ZL0`!_JZf=dA0rkp7qDSXH$q^$Bp2O<_`y7Kc$=Yx z%O=q|r72Rs9#U$!EzfHX60T_&E#LLAvn!e{-9Sp#9xR*!Q&7Ws+Lwqc@u8gc2Fg)# zv(ziFLtN8x_EdTtoz<0CIgrcuj@toNp$ms!EcvTv@bc?$xtN09MAeSyYsTI1z;DV7 zJ(8@&BcRFIR85%-K1Y!IbIXX ziO74x6MW2Wwx(j;P>2 zsPb~ez4p_!q$?vW&~W{{y5@xIiT$)?%|gR-r+(|{Gw`^Uvjx}TK~!wt7XgERps}*c zeJl6Pf6cMnG0B)KYDBLb;DRv15+w`!X(P{ppidqDA46_MY;aTO`IDIfLcwybU=7=u zv)LVlxqOhq`}%{rdhak?JFzg;_!rV>m1lBt2+xtSK5JCtjgx_ZZ<4G08Rqi8IlbM& zMEWgOfUVd6U>q$2=&`7~KiG0)v(ML^P+pLde@-V)kz2LsrG-!~3`-Jh@y791nUmMy zllOlv94|x|sOg-?0k-sQd##piJwv~I2CjPzoKBk7D1X8e=FYn5XPR0XhpZeH$_A~@ zPKmst*RgLr4kL@Ey~Z)kE$?(n$WQ z-_+u(I(s#$YtUd8UuWS@UWv$h;JLg0?5SdU!uymhQ6Zu6UyaoB5=op_o$9Rg7m!UU zB#6}d13L0YKb2J_W#yA@NVo8dbQWVi32OG7r{e9@i;l3*vZ`VdrmUZ*3^bhIaY-gV zz9v{{K~MLL65Jp1fAq%x{b#u!1=Whza8wo3v?!I3*m(-}tc!Y6?s(~%0n%~$NI_!X z{64#c;>hEBu1!~)0Oo4Rjq8Fq_T{!umDaD{fy-N+ri+G9&7M_1C99+K1vK4hIH*S{ zU4+iaKIRqhuB6<5ydhQPXNlCgdwWG%jz!ZZF#ST=SFDtpgBuHs%U=33m=oALqeyFe zz0NTjn-etJLz*3pA`=j28?1Hx`)(*cNf=(b@PY6y?aKK<57v6lZZTJ$>sa=_Wk&G> z5D$>^ehjbi(w&(PTIJZPdsr+2f@d-?NPHkRDO891r%z*Q(Vz%fzDK$3cbbT{|9lf; z5HO@x!au`7DmdA5C$?$9dP>jD60^zqOw&_{!v0mHYoj zB1prM)~((2OS9mzcmUa}r5iBOJIrf~;^p17(6U`y+~_w@{ct8$aaAehR}+ntX@Qx- zz80Tbjbj|J8D6B|#7rX>1G)X+SFwgC@iYW*j)V{>bM-QM`x*Q$*0gZy)$PSdBg5tj z>soP#q|D4uP-clu70i3n9&FG)1I|{}@MM8)seXXNZEDK?OW?#JGS1Y{obo_Rsj8;( zEX=rs?0znlKH#rjdfHmXC!33+?*^Q&`+!PH>~C6Hwmlc-=X$Kh>AS>5F4`~)?l)=Q z<5KIGuHto_7H25!wqH|f-!n;2{Tec%@HnLKkj+dpdL;;7>Uwr|i#ax#PxuC#Asrnt zbk6akh!Ep~LeEsq0sddKwG+P4JFkVov z(YeOotgv{nKS9yV0{qeo{X}oI@1EJm`PXmC+@`f+Z~jGSLK3~K^3TD1BsGd+8rctppS=POWRHO z1nfEa@DV8|dwDRCb4qE}OXIy>u=V@*y3+m~Ys zI)uW$jw!X7)a6x*)-;|<)8PXm>oo4>$lqmW`MUNN+4ktwKEAHS*X>w7KxgV5of=!2 zTXscBw*zV@zBv63lGemxlLI{R0&2CM=yYWQ3UaO|zry|5Z8_Lxn>Bd5E{|-c85J%^ z5v7|?ZRG3Bzhb=z3qt-O*2@-R!nSJIHFYcHQGp!52A>O1* zZ@N)b;wQOORBC_=a!BnqUiN@gkz$OGF#`3pd^RUh9^;ts>p9&jsv2sMG^2h^KHsOJ zkh4EKS@>v!l~py%T1UaZ?|aoN!Ds7qm(u-j?pxS>g%m4PX#fk1}5>{CDm9oY8)$$eu;1^FAc)Z-n3i^(N z?q3UIfBZ5WjLWUaReCkLu^Y(kNuPwuv81HWwc{`*6b zBg@SF$f6OnRNxK3#H87{_g5(-kVyu=IGBDydFDA+8+k$~HJdUORoQXWmX1}@|0U6?7JjtNQTJNeuxx!cF=Sc70zxvnh|0}03@Y{|O_n##e`2kK zTx(;z*l%)&_b%?wlYji^kEZ~rc3HapFMJE#G%l4!(#RnO>H8&DU^!NtqD%opK*&bX z`D}W?Ug?~3H$7VtewBj2LvxVuQ#&m|?(7&+Sy}$l2|;v{T13#Bd9j3-zxIDS#LE1f z$nPk>4;0%?4mx)4BtdSDLxi@UY? za^2NB?w5Ef*IQF#AF35BC~kTU*T#u~dO3qZ5i{u6|_@PrUQbLh`A?OHX7xpS< zBI3thn;@j|ceGxdwZi|0M*Kr{;1Osyme-&Z&37WXs0|~TH2kgyUL`N~reL((pm4Mz zLwmZ^{kP}lQ89;4*06Fl6O|v1)$P7pH0<<*J-Q<`LcQ5^EdiV1_WjrII|fY6+NRa? zW9OS=N_%S_iRue~%9i%Wv=jfT)tE!RML#&%&+i|SQg}5ku!}Jr?5Zg**A&cLRbw=} z?noa7Oi--hQ5WfEoKOZ4*xkVjVcwLNL$)V z$SF*mLe$SYNE+)6gvi^;vH>Q)lVryfajNvIF~6~^WBid}rA!wqA@kG4;eLn4PFSN~ zlbsj0lm7`tk}#zQ-HxalI}}!?j07#?lG&!-h8_2V`Z_9*%Yz1K30(8U&&7rnZQ#je z@Vj?e);2)1bHvs^AB4^5DS<8GVm>F`=^a;M4m{nY0;5fHwdY3d$>v|?(Rlc9U7hd! z=0P70B7Q3_x?ro+vAc1jKa$$K9gN@V@9lM&n1eJdv(!anyL5G;`MFSs3B_ogm9hdS zLS7fKDtCs3;qWGRVC%keDx6BxPtP|}YLrX1PN_@Fgav2%z@#noHlAXA(yLx%<5iJi zQRbmA^TX|DsdahNP5^AO{}aJCT7N<*d8j_l?@wGSYxOo$ovXJ@3&9Z!nWR->S7^d+ z`euownP-2!;vVB_9h6pQ$a<42k5D)ne)t5FN0Iv2PJ)~e!X|NXYB99w_$?{CF2}Mr z#VN*Z>GRh)DG{Nv!>ODprqn5)Q%4K^-R8>5QOJn2aWl`qmBIhJK5mv?2t1y@vE)y6 zKpA)tcpPR-g8a_m0lrX>_*J>NawX+FzTR7GWYw|opjx9NM8L%15XCyDhRUjUw-68z zSrie=#PNV1`~h2PwIy5(dTqkL%CL?rbHE2L8`#|^KV`u9{R0C-7EUH|;~(W}H_CP3 zBkHn$BUyhBo7L!~of0`*C#YAO#Og^J>n0H7gs{NTq!w$>du*fbrHycRq2Nc4*6$b` zm#YfS3<@6U&~!15_ia-mO=6VzG^~AkU8M}+-L%_vG+Ykk*Lb)h4gZz#3*@E7!=7z$(f6Hi*8qIL zBL^#VhKW86*Ozp7E-LQw6IJQ2V(BB9aGN;SOE-*FkTGr9k)!1^@^C?7iH)MHllOWn->&DveRn~~nyI3tNtZ4oOXV)uIJaXa8 zj@)nf5&3SpyVBDtQ2*0-UnuZBa1_=uR;qf@NB=}k)fHwi@!FV;?}^pN%bQr0WPwY$ z>hC)8w-gobl3yV7&8jy--&k@#vKY_QnYdY;J~jz#aI{@*G@Md!Mf2H;9 z`-FI35HwllP_@&<8ZM{Q?N?2+h#X{5K*9exZFf&Mh>#T%!pc=E)moP&0ILr5H0X)lt>?bg z-ZxfC7~uubDKjrMZ|{2ez%~)52aQ4-b7Kxne$5s2sO(>f

    sHORyo)~FSw6y?^1 zY-!;7&+v{FI}Rm^SkcmSFnBBWE;Gqd=qK0rTSAMc5pf=RY{ip4W91#0mDTP)tUC{g z2Bqm{JHh*7>2B3p=O0NJ!>#(7!;`1??UGX19e?2hl1`iVM{wGzavgG@WIZvJvKs=E zBDS5{J``yS!gu#>n_eWOqNPEkz-dPbJaG&(;l}L~C9wRd ziHU}c>U*Ug+i!E}{dx8cadRWY{8OC0U~bW50#o(8f8z`3a#5L$t+N?flz zFx$z-geZw>Ouyt;U;46cQugcQUEpz-u!cl6Iev&zrI9dKBRSy0?P+3airQodyXjIi zG;(5pgfx_sNtKCrjI}6H#hY~x*$tRwoJn&{wjjz%KUsx`DO1CX?!qR*tG2Yz$~&ylR%4m{*UMYrdbEU z0pJ-onhQJgTaRQ#E2HwxzO`e#CU=Z4rKiA_# z^q0i1IUebGtacm?MsWXj83cdZuZFPMxWK(InlZ77cv6e1A|Tu-(4Ov&cyec7K4gD zvo`w9I>vrl72*eW->DbAZ;$2egnlj$(T8n`TH2{N(f9L5PJl#9&J3Ef+WYY4)V>Bc z%mw>RKny9^Uv9>=a3Op|uGS47)`awusdL?K57U&Q!zUR4l|Uz*RIkr^`+i{jvak?V zr>0M@FTF`XwY2%f9%ca@FL*OLKF$jYAjZ$RbaTW;N8bTKk8_*k(tShiUgW8uxXI3b z)`rph+Lsb+p6B0di~`$Yg}j-}o0Z|Uplysv#$EqkZ?=)wMdHR?#?YIG=>?GFen~Y_ z;;_beK^(7-D%heUvgv|9=B|OyLwQObmh!r2Wvd|}x-E&>;3sXg9Ak~BTFpb)b`U4a z$b6mC8Ewc z^^}Pxzi<5SLTf;+uC8v~_3c(Al;qp6KdSNmcgtjFCCj@y^&N1(z%n8;;C+s)5AIV$ zur$w}9UoDwR|FobP;=sCu{Phf6S#14wM22-ab{Vs@xD*olHNp*m&#>lQi)-$<_e@I zKG7XEGpGH&)ugO9e#)F@S;AxQ56rgbvjYFdQi=NB-X5>8u+|9?$N%F~XisCp>%w2r zL^S}e4wI%q_wBEn(qHPc-k!ZpH|BN{ERMqt1=YC~Y!N%@|te`&S-ZserCKlk*tK*oMzjd$A_PEMg zv+urY}N>%fbRza+;a_lf0~#&WFGf*>Gsb5 z#1&Q0s?>-i2n!2)XiIz;QEC;Qfb;QM7Ngh@WoqZOr89SyZxAbUvpl#zdkNF$OXB7f zWzhOY&AH}>C1Z9mB1IFZ-T;r|6L)y~`~#7JQhFHQQ*~AWV7@~fFa%2~6g_|eGy%G~SyFn#NE;dO=K?@%kx zZMwI$N%h>PJa!_ci)|a`H@v)_Gqj>j0mo7dl+_h<8e?L5J7CSL?JPCOv!6)!#=2wrzIwLHlY zVNapnGwG9TI)3BqFM3X#hcaL#!4sz|h+Oi4ISg_4e{OC${-GfFb;p}CP3Kb~TF!J! zRt%tdX}Wz9nPyPIA#N=^qG$2i-)Y0&2^17FKKY}*5^+~~bwMcaS0&&%qK zePh_1t-k9iEUF4Jow_q7aRDDZvvr~^Y9jh6_Rm@T7P9<|mTgH+9WKt98_y`L2z0)} zJy&zirJnMPa7`bcoa?{^%^y{wzP-|NuUnfBWz8z0XW@c<-3fg_>BV3APNzXWbZxK!1F6f(1j>R9!Y^8w3O<%*eXuw|Fqq;|7XMaw@qCnGyw^1}(9!Q3Mxjm=b1ZjbTbhD|_#K zNyEIw!#^6I-kIPi8y&VK6nUB5ApQE@TWL3T&xbH5X{M(|KLqkwjxX)AtK#&+;lQKRQ%QQ%l&CQ(waAN#^oA9%7A#IoaUv#feGPnztTpUlf)H@x7P&>hUwvSKD}`YWPA}cz7(C zbgH4G6in}y>M>~qd@xjcz5e%p49nvECyc)%Eix`GO{Df{xOVxZ1Ae{acN$1fFh0dq z(H@-B+|WtZbi1+U_;ROyB%4>N!sE)jEx`@;9FY9aA%ixvP9I!1THlWP*qdQiW&Jk4 z^7$*%2LB&$L(KG?kbViYe(24+?Chm1yy;yW5&sIlC#%EyVKM zSIrhVVYot{X#POWI1EX|lchOKe$f1e!@;}*MbVPts(SJIqS(e6Z1aJey?xOs`{eAs zbtI?Dj$vKKbWyIYwRO))IGa)S0@=kVVCh>s{|S87k3`iB-Im7(NO)t|sOqdZf|rpO z8iU7?AN|3G&G|I*GFL_=!C$1_zz0Mp^PPP3Fi3#Zv*1VH3D9v^WYB+Bin`QU`xr0x zqa_fsK-5p?_u8Pd4mFKKs|JHWRgt$u!OiLAx=wLTW}!xKW#=1XZ9<7T(aFwvm)<*F6B4evQHRHaUoVTa;} zju2o%`2Rid{~JhJe)@N9g^lLCI=xB_=+*e;PCLz*Q)diheTjThxHI~tC95bWfLE20 z1bV~YNgRA6_CP)#-u1wB~a|=tqDlbn!j$JzEmp=xL-&ckxDcuvTAn zqqmYmF0Tr&-JR!MxIX0M2iWBBtOq!^yr4h}rEiBRLf4@pBQlLC*;&3sO}=id0Z(oa z^+#moDJS)rM$m|d*9~rHSn9=~?l#Yt>19Xte@X0EqEfr4ezl}^HFc#;On=LH?N{bI zlm_gmoy!_XQ+@QV<06AiVq=ECvtlw$g{1u#c~Og2hS;Zr1^!RUq-+TWKWU4Nc2@)wqe;cjkzmxk8+%W3I8L|7UT+j(;+>{TEkD_xGd;Bp#qU^#0w?yrJBgF*a&eW2L{c9nW3)J{!^G z9x;^iCr6R>kI1j^9lMd3O6Y_-Lp}~0)!MpUn(Wb>alRU~XKv|pD$}SaZ|Xb$4dbun)tTu-N9e(W_4yfRD zB-lHEDs61!xp%kMa*YwZy-wFwqd;WN(XM#1vsqB)GRlj^22$8R)_Ii<-L~=MOGzMc zWrM-74PT3DFous$t;aFCJFNvT^6_>BFPjv(-&R{BE%@T0LgJ9GiIkMblLqYxUe#foDd2jHhpuvVXpMwd=topFDD%&81Ans&TYj&YIn;=bJ;Wh3F+2%QGmh@O>|JUI0 zpX9s$_H+6%P>>G4@gVO2TTH}bSjDsR4e+DG!6{zhCyiS1w)FJ|Pd>EV%}(Uy>(Jn0 zNH@67QlAkzpQQJ*ZpSw&NtM;VE`7?*qqS9S*L7_tQ{*Q5#qx$meH)0#sIynO=63vw zz=K&A`s-!m;agm#*t@jB;;LLFf?9L<6hGKGN214)bmq0JEOlS_%{`*#F746k za-zDSYV`LhNi{92w<&I$(>f)(T={{~4?MR@0%o91+fTQ;af1B(D!>9zR_f^YCp6Vc zNuR&oCw5l%4q8E4%IL_P97oMmD0QCP_bbr_m9Bi8D&e0|>h!jA&c@Ov>ikzKc{P1DI(rfl#!!O2u`+l>;HElBQ zN3dV9D{07qC_SA zwtPuTM9IDxRdz68{2W8EH@Hk+&Ai}C*Z*_~g*^%TW%yP-Nzdta@x&x!rI}OJ)fi#r zHFRB>+xoBxRd!E%XNi)M9IXRI(^^6iTI|g8Xt=E$M7GjJc%ZPA2;q^v>OS& zHmjl%aKctoxv&yEYFe&yHzc)u%lJtMTZt-aQ^KxrI&0zV>+C)gb7CgTF?qM4nZN?( zBUkvIJErGZ=&hRcxyjtFlF3_OF}d&?H5|De7Vxh{Vhi-HnBRee&rU0?nZ-QC&esH? zn94o@$>9qA!*SegyMcljW-fL?eI{AMYr6`emt6?i!n<~(SJ}8#aCgm9RE$(*Ey4FO zEX>VKnXeVrI$ggEX-963wd?(mObBHy@wkE0=1O`%>CWV)=v`l3U0r{nS@>NI|6#`l z5#gw$mMb)QtgWp1{hMl-m!;?FX|=#p%}ag#?==d^!bS9{DtY&gST$EaSTt8=s?pr* zQdc)EMxhKmMhIPfY*MffAlUt8&DAghz55%RxBUP+ACokTqM=zta}l7mF9Ixry#V;z z!q4`fqixf6903R25=wHKm`&-cc7@Vf9z=G{Sz4H}`;zL`eohn(06>dNpeH?2lEqGs z|c{GhaCA zl_1F5nlXFKtl!H8f>{im92~yautBl9MuL`XAzRt;mrE+oXu14<2XTAC^&d!U!s(1Z zG*@);KaXYR6?kW|yjR<8QtfI{71Gq+QN-tKk{Pnlzrn`)Si3jWi-(P!;H>wW$ZXInvo{XFn z;`eox^S`;SdU^&l4Q2i5bh^yMc2av__vXRg!b;Rc_3KY~1#xG&oIwwS+aCCmwc_5z z^J!_evYM?ARU5b!HfH9#5aezw;(SO@q#pCegg#g0=u(afN})O^;JeH)1-{lu?l?ss zpsqTf)$TNKe7#f>H@>E0P$J9wJBfPb?KOGvIizV&dmP_=X$`^0rLjF30_!7QIV`Ez zyP09M8k+C8)HJ{hYv`M7U*)E9RN{CqBU-pV)b;H}@KuRxf@jK9Wfi0Q~_vu-6 z!`9r=U@)-Utof&tg>}bI`%hLxBuN3)>bqO*t7d6c*`GLwg{Q?72-YIT&8%Dj&_*I^ z{)sA{$iy5n0MS{}EMy`%osv);Z)aZsHBe0NQ4L=1&UG>q}`scpAo)9!b3NMpF5 z=VE1w?>x328&j@7F{ltj1mg@0#?_N)fGtVWpcjI)l2Ae@YcNr-Y4ok9&*aC!_0rP| zwbv?xd%Nv>WHsO@w2zr1i_I{AW-*tDU`0jLY51M|_6$-(mQ1Rvkt;t&5RhI?sR`OLOD*L=Oh4kPeO6GQIFxD%7_{pkM zi8SP^sX|;=jZ_EYzv{`qZtUM$@W1c{aGz8wjGwiC_$g+jexy#b9Z2FX8}`>$ui3Cj z3t11{*G%jS@@KWLUGXsHYve1CD1i3tSn9Ad-(zWHoUk|zqm4?yJU~;h>Pund*XV01 zEyF?{)ap+3F8nAQH4vQeLyrkg_IHJ|HT?cUH!7E-lne&v6y%x9j@hqd8Vh5JX1OFi zbH?Kndt>K>_ZsyjZ|7ykg*~s;OE|C0&^@vDI2)8;lbt-LN@THrVR%~T7`+)TU}Rv- z_naNht7c3|z)hCKZ3f*nIId`TB^X0{YlwChv{L#~Q@(Q!dh~zPEax;tVyIsKGbXrpXtG(|GYbxv729!}Jq96lU zXf{wFfIQMfieke8mI(nNfb^EoK@43PR1{I9Nwb3lLZ~4G0)iAliULwX5>Sei5Q=~h zNZx(s{YDwb86Ur2-}PPd?pZ>KQ6PtIe689*$E4WPez5;C;J3& z?e|S8&&s-}&K1Re%5Hvo-EKpihVh|b-6VPB^|+I5nS-n|gX(3ZC`=iAN{3wGZHACUnWY(w;D8)=O+FV#R={%lg*n04oYe)ZA2(-l)SW8cRU@ zMy#K<03}Xv`Df8>8LNZq=q`*dTzD6{kAS|t*>U~a3aSonhh>J>6W+}fVs8+V+97d+ z4dl%k2{_$fR4qtm$ZLNkPhWo|a94xemtY{$8E@03x4(b#N=#vm&;`#!_V-H5_b{gFRQ76G{N{Mb#K`mTquOc(Q{XQtZb74&Wj;nL+7PKUA7 zp_#tT=p{Av@?Z1bJzA>GO0&-X)h+fz`Uewi^^uY|QOU#Kx!Vb=R(2y@=1M*u{E&i(nd@eL zD10PX<`)&-B_5kj)znPAoq#u^Msbk>1hPzOufIXmWZxc7Z_;i(D^Aip$rJe<}qbvXW{QSH8|L-jSY+Ok5P)tqDku~eq z#kI7wl=*C05D=``&vTjhgR&*Pa&Uepv`=U6=ouPDEe`2&ZwqZdQg=-@byr_sA9nb- zgr7^F2RpBV6Pm}YTh!aDd0GcMF8mo|u;L0iIyv12{XiP9tTI{9H7$0JP0g6@Wroqw z>+?Yi&-b|g<8}$v-lk_2bW8co8X%P|#uZ^*=_$VVpn86MeE@ zH{f5D*4Sa_EKDdKFQnI7AyU`e9N$+Jal*jh8Z2gLV8GzWks9vG$0U*|sKwVLjb!3> zsHmJZ#+&a3$HrtIH0+UC!sFs%6XPtCKE6*U;uJhW7eUXzGuGDDCA4z>Jqo3mq!}uw zVYE(E%ml${X*unNjL$(OvIJrjS5+NYKC2&2S8zC%WZ!I@9E7F~4-ezJ1CAX#7QvkR z*!0_PKY@c9WPg;_cyv~lg8%!Q>a%q_$0+sn^*xn#*!uX!Bv(T(y8jUKHpeeLMk0{~ zkD+b)&(J@g14L8_|n^+AbdU&MaY@yIHaO1Hck~R^gWo#a$)};%-CO z9N+PKsxCbn8*74!1cMG72;Gu{ctM=ryk*PIty>Q$lE+juhmyT^Y}>YtFuIQ6XHQW- zxlf!&Yq@Q-ir^~}oO^v#Ds~H|_&I+)8ytxP8eVQpx^Y(}4T3v~lo@zeo?YbHEovu0 z8>W(~J$~&KgZs9qxkdwFMnauz)oXKSebYdj@u}hTwBu*bo<*WQ-RfGb6BQ1aX-DFv z*rbAjw#GzPye(|4YmkkXf|;ZHbAGY97uSTBhWuuq%1@VFc+;iP`8fppwn$ZU>;&3< z^v+PpYUzoaB7})b(DM;h_nf|d^WI~CJ~a{(vBP&&P1t52!KE-$6L%ZG71M8PlQq4} z9ch{U5#iya>nvYOQ96N811KHzN$hd*5@HbUexVi+e%Jz@MC;fOOqb_j{MLP!a!LYv z1J8HTGnKlLY;^0>Q(9R~jM({9H78x2pd+6x1}NhlhnesMjI=#daij0g&7153E|W-tJ1=Jm(KV`|1n9|eBjGY58l(tY+@wN)0Nkh8qxnb z%Tk(<1Nq=coi#O~Jba9eyf`^W#OpG`3()t#{K)}a0!3XNcE;q%3#5gAHNuhT!o*n7 z!^R=PKqh6?3sUJgF zXUt=eRUfFyENJc7W(EtC@_MxgGfrqtVfL?4(n!91FU1WvxI_UsE6 ztG_NHzhnRYo<{8`jd!d4ZUH8jf+TL|ey7>7t_@OBtb~t3_RgKvh}{M5)lC>to39QQE<2v)le)QWfUK~=FDv&Ot4MF5L z#*^Ca;zcd~{dKqB_=PL+dtJk#Gn)8r$J!_ z1Kaa>X=Z-YXZyKqw|)68G!TOIC{qT?>p0ArpYKXJw_DG7o0_vl=172Q9y}zKWMh(3tOF)`4Fke zDeSQDLTqG~CMSy{;jhD_$iNxssg%RMu|?L@X)bp)MUcbs$$&DP#I zI$0~limn^f0|e`yOofeCb%7kMv2V2eyqov(v>(okcv zW-Gj@(95m3?+!1Qo1UMazmu9O z*@-4HST{&MC1e?ze5BAyTrS3f#((=)i$C_(wbDKqv1Ehd^{#p~(9j!9cQlnS1XTK9^Y++2fx&IUcW z8la4FdkdTCXFE^C)g|n)>De|2nDQFJdjSR1E|Aro29fDUX%22220i4pFtM}f{B-v& zZE7poHPtqDq%6D^|J*QOG-^I|Z`ZX4uYdU>_TRb+<&uEk&DGQtJH!*}_ArFMJRLyB zkzz`|eG%(*KIs9iCJD4rFDZOaDX2kGE1jyB9{@%CKJ5ZALtN+A@!0J0L!sq?Re=zJ6ot4(JU*r7 zw^7CRs@ZAR>7BSwoD^0-Exe>KCJTM$%O|oM<^=0d8MMdd~13Z7^oQ3rtL%D z_D4SNi;41I0P<4aHh3O#OnxDpuCj|q$taahgux6%v z{LUOf>c4ZMAF$4P@cQF+1OsDMVzmI+ycKo_M$4Hv>~(O<8*0;gP#3!Mitv4@F&88sgHez|V^2G9_| zcs@I9l4t7MM@vY)h{)B`q$Owjy?QYe|3a+WqWk62{J65eQqBxSlus~HK1 zhw_Vn{NGoSk*P@+*${ZXv1JZe)RHCNd3k(sWjf+RAm9MQ8_6${gq%#Q)4Q=mkD5&m zp9&6^8Q~-sfb(BUqXh+m{TetqIjOT0e3k-QJuVbv+7O#*XR2x?v9Ho2dCeJ{6BuWv znNh4PQpfZ0dl#1`{*?bh6K>%tW&!F3T+)!E34IP|j2G#VVS$@lX1f?e=T+%*U`sK4 z?9phBjaPVdv>*d0i~u*v{8J-bD_azPzF+Iz)$Qh3fo|4WtlNvt^>Y&b{kJg`?~!Ne zm&oL$Ox}xW#!-ILn*z_r8Ohi9v3n#`_a;FVp?EhS3K{+pwSF}{qgH;WN`o#Q{-!Pc ztW>NlMebKFb^yJ{3#h_4a`(B_ihx}H*~v5=8lqooFu~?fRj+k>vzVg!E+{ksHBkrm zx++59DDFxIuh9JBG$^l`hx9gt!*Bk{VYSElEVw0_7q>-ze~HDD3k(eYyu?$lyjP zp7^6Yp-bl~!l;0_Pz4aFy=-doeQ>Kn>-Eo5)@axKx$_7M$-s|iNDCu4R59maq~e`b zk{7Ka4*0?h97TMGF<7^?5IsJiD?AF-xcCFB;CoSmwV%~qgBdz+Vu_Qfx8zKTX%5^y z*Av*eG}dJQ{qazym zT`%P6Tx)1V7pRma$<8pTL@E=dzhoa7hQ<&;j4U=t5z3Lrp*Vz(9=yES4sM#RGbvjX?E~w98xzGD&*!A}% zm{kQx1-o0e@*-daNfRT4TnX1wEbiq)UZ97q5uG9&pQJ-sWVnltp%Ea!N!0Sgua(%> z7HI0eLsPR0akOA$NJvO%d@%|W06M@bI=-RJT1Xj_f`;Eb@qA+-OUj(lGP^)u$aRi3 zHl>fZkIxrTFT?59Beijc9fEx3%sWiDqRO>!W;?nez+c}^!QK{(4;w3j4cd=a12PFoIQKT95@ly z?ILguM!WrUG2BL{P=B17n@z#b6Der23udc0b@r}-!+TrZ<$_-l0)JXK|7MOdrwy^s zCFuhyWd`B|kw0tJE;!z-a31WrPQ*DPsSQ9i<^;~26N0B3;?;xt!E7p{A5R|loIVKSP|FNK zB02Emr9t49=Ra+~8xD_^)V@?)UFS=~tHEA@FpBFNDc~A41AK}G0F;pTRl}|52(O$= zOF)J^qs0$>b9p{5RIiIDaB5V8dCVmN@~IShDoO3-CWqv$pe2xddmAuM_G0e{a#Ktq zKv9|{^4%d^ZYzYm=-!0_Jd$)7ggeTO&Z;`M?Gig81>CzGGBV@dSQt)y@806$H$*RK zKwivhJLHOKH8tE-F4U(hoXWINSlQasGnS*^))z#^BYrI%ewt)ncuXrNAFizIwglqO z8AZWXQ#MVNu|+23X6({3??F6+PtB+f6xG5oOeaK<`wRrOAUe?=1Vk*+KPJ2ny=UAl zXnM$Kssbc%vb|53dqn#UM`w0RsIgknBjR=7Y+OOrmL(^1?DF zqt6*>BbxS&W?@jZa?{j@E68(zQ_&bCr@Xa8ENEZAP(**~YLy|s`%|bJAk6RV?A#B~ zU5`jKTspV`POKA9?~w+90hNYtyf#*hNF*xH|EGEXb}0NXvFZ_(rM8wp1&w~G{4BVm zTPPMrrQ&A%xl428@=3p^Wr%E|tgV2!Mhky6I-s0QV-;<&^z$?6?5RnPkC(L!m<)$C z<^aDW4sJFGSd%o+7e0b27g~U_wsu(q9zB_l=+p(w9zA>`oBm^8ms=}I9oEEF_UvQC z$fT@`Td_=x01U6*?eDcp9B?I=X*n}#*XdAT8_vlXCV#lsox8XgklRaw7okco=E7c^ zwfnol)^@R6v4CN6z&9xv>ZhXOKV_RkMFq`-O&9GdE-HE(Xc|q&WlBj&Db3pTaq()S zwUwjBfx7bY4Tuk{4^H+LQrP+cw}gu}{eKEMmJ9R$>YLEO0}yUAv0M2kfZMpORH(2D zb;BiereqTcr$Glz6n~XO_*=Ni?UWQah}2?JwXyZZ9`8#^o0^JPO&8~?)v&DrmZg?8 zSH8G=6`WmG(>u%*T&M3+0@)>*6DV3lcmZgvKH5!vXAO&Ag(=eOkb7+w+}_>};OT9^ zgTmh<&jbVS^B6Gc+`HpN#QAXkM&<%IcF;1f7%i_bq~wl{?UH7ki7yK27Ck|&bTZr6 z(q5GQii?y%(O|WIeX-A)6ME0iBDrVuLmS8->aOKV(9VrQ}FdK{?EuR@~xXTI(p=X$7#wNF+b*gUHCf_|Cgs$2)ic) z?^F5Van}8;@ya3nT=GAy@?RbX-JBXywb*)F=tsw?XIybXM=Rys--^^X9|qQKVx{p2fhD38Hm!$bIkR$>1GnJ1ZL literal 0 HcmV?d00001 diff --git a/examples/93_blackwell_low_latency_gqa/figures/tgv_gqa.png b/examples/93_blackwell_low_latency_gqa/figures/tgv_gqa.png new file mode 100644 index 0000000000000000000000000000000000000000..6307eafebd3c6ebd401e1b3904443b59e1601396 GIT binary patch literal 1003248 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≧WPiyU)Wzv6|~vHH>=Rm=^_BpNu!VcZ|`@TQ5o~UsBcYRE1M? zR&CuRX88o!?Pl!%-d6~S3{1X7T7pmWQ%jOMejj*Yy0{X|X**94-B=*3CEWkYSld3_ z)2k5o^;T;9#mn#jgoM&JZ&NXGi%CzrZ|&4O>~?;42;{EvT>@|4psLu3oSFTly|m8l zt!o3^QWK@uCn}E_NBc*!(YkUKWh;p2sN5sMA7o~Piyi> zdNWRT3o^Svf12L-ccf;xI{aVXOU>O9qa>0O`ZNg7#avY7y%)$%_t<l$06~@PMk>QpDBD3prf4Igo?sd z^98~Aom9k$Z(mVK=r2KD#GUX~r3xHAI;h*d_}d${R94EZcmAD}V|hgk(>czrGw)09 zhNxTac^3^zOPB8tj!Pf-k_#j?u=B~I_}jA=Vfud9cF`TOB7VTiU1x=jc0AZ7ir~1> zxUuRy(B2FMgGlUsMX98t$4s+XYK`toTXj8Ek|7T!&DmjGsK?#=4KKJS=i*Ga=`6PHCǕk{000E7G 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%0DBa(NwXY)Q`zBK}nfXJHSavVr*zs~FwNhIkPi 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 M?#~H>c>S@>-oqIQ-1tCgy>G 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

    8~RgzNN?hcy*Q z76r-x;JJ^Mnh>^drDtd;5OP(HKLy;OcXabtXX(EP7iA{&&3&3*_y63&zKmnwGW8sk zy`Ur@b>%6Op83$oGG1G(KxDa{X_0xh5g=wI=K+Z7!OMkdBEVsY)_oj@c?RRW$ zoWJ{=Z;L@MGqt`fL@a?7*${>b5Nwc*twLH8owv3vXHMp;NSz2*owdCu{crMnizK2| z#h#X;|9gePwRt!Zp6tURNBwR75G{9%*g93c&fxYF*D1v(9T|y%>s#{Qfrlfcc8Ma^ zq;PwyJL`F&;o8^Tnuj|U&Odp(<-T}o zjm`8a4R+V&i%Jx2Gm_$7$NxJWRz?&bcj(;ONje1a^~dB2jaU$chbPgt zL`lYfyLFpsCH~k{ zq3n%z%-bCGyPd{p1sC;m6hA{ns`d!1ikr9|EvT%(3PQcepzo*w$U809Diz2lun3Vmzl*CDmXLZ z-7$t;7NeYWGr6@)p-||u5oYh3$2?W_*PSRXpu95aJXiwr+^E2zvFp?1Kl|B0hQi%#P0d-B-vxiTV|FdnxQrVn9!mNErRMsk?H%{|!d480>=>U99 z{GoeilsQA#Mv#i>Ad-iB zQ}iTaeI(0v>wPa%q?#1Tpw;0O+H!8`<#9!wn*cAqA3gZj{??XNMBs57)apu+L*LH! z`ZRw+t%EV^G<93fZB^xjQd{GzuQXPmX{Vj99rQzwO(hDdGH0A~lsoGu(^S;LaE= zevz;3^kL%N?Vc6U$3Ykg+;=?1MA-egp1pEdeB@%hgqP|YRDd$g(ZYYqq2-~eE+$;K zMOpu}K0o~U0on{xrC!1Im>|Me34L4UV@P~FHnc?Db*a3=5PkmU2+KV22e$MhIE1@z zXl8B|$c?1F>#UG5yU)733Hf$^c(-HzG~C}sXr1TAH){U; zBDV-T?FO#c=YrguJWxVmN!lqrkPub2fN?RT>Q?+pk8Y4z1HxΝHPb(9zA%6<|Rj zzA{qKDQ(GEt0_3|qwOpbKp@uupjQIfbEc9eGGr;oy%K8JXerFs!n0)c<_$OjOaQ|Z zH%vYx_X*}~Azc*izK=3h45wHf!_|1Im-p@7^&bg_Vj*#3!bMb(gTz9XOS;EkuhyA9 z4+U)&ulG!$(jkyNr}E-%?gudL6V&4@pw!v{0d-0GP+^uv+i!>B@sx=+Q9T8&C*w@v zd-p$Es62CVqA_51Cf|`3=M=!7Qz?|uMXTbRKHNPzR#LNmRxs*$LvqLXJw^Mfk1Z;z zSE)qw8Jr-_9BHbf-eR=m;~wA!$fkK)8pR}1`G+){AQ{6({L?JKdwQ`Z?&`16pH;bF}7V0&xa92d>Z!E#eMIp>CzV>McuN7g9L#JcC=PLzzg zLrzR0Ho6R6<%{zQUl%C^1+>_iRR1Qis|Lz)Vtd=RW;#2rBdPtDXsw6%_Tihnwo&qA z&|pDu^wVtf+k57aMxxEHsn3%om7|*g&~dHR<(j36C8#bmXA_1mZk@&NO}XdE!^s|- zfDuvqP88o|u9t|Hpm$-KGgVIJL|1B!hKlcdo10hie??s|?9x(nR>64y_7Ko75jP-J z3Y)%P_zFl;UMWE_#ZS#o)+p}13%J9FX-;nh9xFM0BQ7CbA&f7jE2j4w@(l%-3r7Z~ zZrc39pq(Vq`;m%dnB;gLjdRY3%bT}Y{t-MS44gVdmD%YEd&(4u^tEg@!xj2M@gT(k z(a|QeQ99F*WVsVD5Du{qP(W#q;j=CIr`*vxc3c$B9KY_3)X+@!GPgJNlCvSUBcX}H ze;`_s+ZF=Dkz9?0-VkC!T1r&Usr*98a`|i6gh1+joDPBf_Pxj^9}aebL`&9&;-`g+ z&$nZYzdj{r$1%vc=*ypgrmsZWT|7bd+Syz3?AH+sb|yu6ppQsyP|N5dfjHH6@JbR! zd?6g>S4mWqLc6=C4nH`z!r}i{uLWS$3*bfH`fNZ{eQ3wSzdfUALpLy@tQ_Y{Us+v&wbAcYQEjeh$6>FU$$vCUG`KTUqu-cHy;cUcP zlBs7*_5spSL{BtBlsrM|Okv~dWHuM?13HCaS9GYMVSqzW{{2P>C2+X<&?O>W=e&QG z*$pW%sed=%|F1@d{qIM%WhdI3{Sra`!_<}bKk7r)VKkxg!E1DD0F1__cc4NdT0VWM z=vv?vC4v-$s>-zt{?5wYy&pu)Sx;R%a^!mHW!DTkcu_#QHEJ*l>lJU__qN(H1QrnW zA?>6AMZ4xp=hh~Vn^F)_l#;h}=a2?tISeWaoc&gl%m~S!FF;x)C^qqt7`DOC#UF!m zrv`poSSV7nBiZ=#dD|Z{^$6uGGAcwZ_bnIUB-vkDm`&>i`0O(aWa^n|-0mV32RoHX zXJx__?XUA~bjC=OJqLMpb)vMpYm&u4;^TW^OS}RvA%Zoz1@)DX8X2|UFgDLfSK^ju zuL|Z6BP19*-i#FcPMi`7gKc>%=j?<+0%j5!%|oL3E;=G`zTD=f8bE)t5wrx#=pKe+yS&w9n_l?g2 z!}#9pel7oSOtH*!H?z0zDTEMo@$I=Ng!5^=2g;k^d(!%5E-Ayo`Rhl1y52m)4a@~@ zE*xg#Nz)6P!^sZ)x>38LfCeOyaxamYdq6 z7fBRl-u+@L&bm8;e+;xFvf2h!FSo3LMR?yLImL8~6 zGw5%PbW~Ni?Fp7#E^%DK;Z+{#Ca!kTA^Aoh5hBsZ*d^X=i%`p=q9TRq)nEM#-$`Wr z+_fxKH|-F*23e|k9taOk11Y+%OAb)K7ZqeG7z%S>G>i} zACNHQ8(+wCyH>tEv|=`_d4Su>uB8BV#GwZc5$gnw{`PV7h)LSMe9BY45FX-TFs1h* zwZs!$x19UOw8Fh&cXgfVmRWX^asTpA)y65C`bgF<7s**G?h7wjmBiCDYLB$yYfI{+9UJ zP903tR*XXvS@#>Lmd-dop|wDBx@Uj99!|Zgb}q$ zEjVNLZTV6%+i)0!J}Vt@p*zoQ$iL|g*}>i2Logd2jiy7`s^Y7RImxDoxKm|m{X6An zZJWWrDRt+Aa6GlsP>6-(Et5Jmi6reouNB1%G@LB~vl)7?VY232U8xv7+@g-RI)Hxr0teNbGt=5GT zRXFro)3|f=un9HY(x|Gn8h4q+h}&*3f~Kh;Eo_OB-cC(38vW*kCUM|DWrqnbqDJB? z3Mx#_G$tYH-5U;(f+drMEkqpAXTyVCxyBXz+^qq)d1!6t5S)1(pB}ciC5~!{J}$Ey z#pm)VIBsDxox%{LwbgzStW!f}BmF2;?J#R8CFL2FzUn2WD_g$wS~d)knLX;$<~d4K z6b!jma|gne(Ra?R0p4*~>W0_Q`{ZEW{Db*F;p)<{!Mcau3KgnO%Hti>pTAJOiooMk zwQla^@1WMUD0`W`u78lpQR)faSFFY+oolYY%Bz73eqRoM$IZXio9TyPag;`tRnA4Z zOZ;(mpB4?u0ZUC{@;Um6+U$JT4>k>paAvMw3c!Rde=XAN3x+I0&pUx2pq1Y#nh_v+ zQ*hf>G>}y(n_{+hJB~`87iszgcEd-dIwVfUSFw0iv(_4M3u)_y`|N7iSptL;ne6?Y zi(zN#i^Zso){}|$$1nSA%2#W|L9yv$wasgM@Ar#6R1J!CMET*{T2Ch%;JcUg52K51 z+mt#ts+&P7%Ae^7KEy(P2%zXpxclo*s?*;@eN;9QB9L8qKzA>4p2%4wB;-?ECv%5H zpA>5k&i_8!iy`@>tcuRrY1OzmIY|ut<6d)Xu|}Jxd-3$M|o;QuN*O$938v$T8G!SMAgnQWUnFXM`AeN)B-$h$(9D?9yXm& zy~^~vtfI(eEi4wMok-2 znyWGIfwF-Jrb9v~ntkI>;YMoq)RH}PxY&W=HQl_KD`i7nd|?3)L{DJH>Oi+u@t85i z2DjOkNP66a9Asq_W-55})@6o=_bOHz+XE_n>90}iBGI(&xxZZrR=vA6lQ9(Z41 zahPeL^&GilJ?-4^ek_QdD>fg+)e@yXtRDx{WS}9@O%8eXGMCvCv(Fmsa=@nvf)y%~W<_B{{-0m_wlo7I?WZhndTo zML>s+Qj&hiALn+G?A(v@AwM8{M-^{Wqe0wh5HU8iQG(&E8#MLpWJiuCT?MBJaDnSW zAvkd4ZjKycY^`)s(E!~gN{QC_UHL)Azqjy5Ax0nxw!@bUgsC&CalaB=BbWIq zS($bM_ZjKT1w`a`T5B{8gCQtN0r@gklboAO&`n8w`qD`;arNroC*&}Gyl z3CBVLPo}kpUJWw*8jo~p*1ruyQf};$S~rAa6Y~WrHw<0WP%;y#yh9;5??RT5?D)&L zJf$hHIVWGEn|gwUjJ;_0Chbup%x8MWi4rGBBS6}g?$2mAlSd20wVZa`AffXKkzd&r zTHA(IKg5ymxEZ122QKU6LfffMnzY(6VwPwO&Qf2jVNd3;qq0;CZekSNii)kb#to2~ zKt)v9Ic6fF=^mm^T>ReocIY8r_L1P(*uPY$HStLuTSEvn!dg@xflP`e3>%Cs)REGg^V- zX3Ey)fVAh&;j+Byz!~JBw4M=LxUP(Tv5~zIQ}LqY$fFlX9FmAf!+AyLj?8k0k(Sg; z)z3Bfbv7Dp{?75;;42?aboP0c+CkJH5{Qbalq{yK&qUA^q=;hVS|yKMDmhS z=W0Vmf9kI^1ps&QSG*_W6!QIY*iyQX$NFuxW{lAUy^%%T^>x{87(o#jaKUr78ySh7 z-K*F#=SP#F>=BvQ8OR|p4nfREWvcq90R#)Sefb5TUfJ4>p=VdepUj0!NwbA`!=!fb z!nlQ1miluW*#>*@Xw~kcHn^{2sWj6x4$o<*8fAVH4m@7@K#Hnqvngbq&YmVFuQw%0 zHEEJy@dIaZl1uc#aQV365P=LabV_R|0c?^*>-8G)Pr>QHi6DJ};B4b@X(HN z2}?Q{q0vzUD;yX5Xu7zonwN90@R^cS%_}X;G=MC?GS>Jk+EaUI5ajxL zKPyx&|LCl|38gt+xDnN{SK2&+DMO88UArPOc^WVYWpbk-s@J@cX#Uh2_PZ~ zfXrrX)LnCzZ-3bA$Ifn3AReQpX*%${H~-(00EtQeKZl0lqdk59qu52a45+dY{F^?C z${@1UU3`9)_LrjDLEtb%cKL)2hySeky;5`i*s{-$lY`v(1R3vV2{wUO1whb;rJC5u zaE$eLrbQEzhv%9p+A=Ov3e--JPh?r>$#YaX!!C9yC;i9B`h{m2QI{+Ge*Z37`^%$M zmLx-o!=>K9B`SJyU%a8nrEqjE=_oxzR`^32ccs$Aaa!xaOCG6;CoJ}s>0v)Iws(f zb>&mfH)@xL?!@a5G?9$_0jx;6(? zB+?As6TbV1QsUms7(dW zL|NERqBkg0b#mr21Hb`nck@nb5YIUCAF+56qTx+q|1kCM%mt4mE(tTR9(!AZL*3Ub z@%i>b=Reu7pb4||rksi^=GMtPS9pt96}c5L!rE4cg-BL+uk}Wine}Lz{i>rMu z1r)dnqZkMa*&YOcF-4CnsyoVc&>yYvzJ3&3h+J0Qlf3)E7POgmH6vck z5tvJ_Mg|`H;c%lI)H-MyIoz_jf$~(IGDzr6X&D+yQYjzn3t#x`isrpAGCUoNb0aWD zgo&p>-lmkyK=Z7d*3v$A1Eg{LI2^#UJ-qd1jJAqaw7yZ_E1wQW7`Ok>F>rO8rE?M{h@dHrAR?YZZixA%#^`{Y|< z#oY37=3b{1qg>oW-bS6dPXOd=V_vt*zRO%mRFh2eRX940_|q>9=ZLk0M0+iXo#y|aNee#65H#T|xngC!-~wbdE#1Ds z@#nX@@PRfH;Xf{=MLz6-#5E5R!)O(bN@j8N34){XevmZYvvM1nJ6;v+^BA5hmOL}_ zhYWrI)}}{7Y-gNyoNnI{@(b0vdF(B~N>o_a(Sso5Ngn4-&7xC!+2MdW|IUn^Lu)JE zrss}S_WR$QNvwrMa2Q8dr>}sJQoGZGAbqyR`JAgsJtn{)-!cauGCTT+${D-f#Rc7C zzJ8-^J{29Lf!H5uTVqj;+CuHu(sIOHfhHWSPU6@ZZPHjG^O86o<*_@>0+OG;XPs}@ zW?iFbVKjhljhQBf5O9f&A@4LVp??$OjoQe69S6CCRO2UyI9E~1R<2#ecHssFGz>fu1765~oUbqjjA1=;42!5A^N$obfu41Yu;T+GS zTv4l55>?9TW<@x5B^cpq8)K>sQCHw0egaf3`tXtCTp)O3^D8Vl_VkK3KK&U)b7_sY z?`pV0=5hQ{XV?_}_KNz3BWAh(>Sk%0$T(KMy=3-3;)}>F@GoaL&KvxbXuZ&;(IMst zSayDi@0S-?*N8@SmR08cw#zEHI`!)At&s-k?Hd<}-ovY#|GGa4frF}|N6PyFbkSLN zt$#L_=tC>YgyK1!->&;58%E{O&+oXC2ip*?(eUaYR;U2n=CN$VrkleOwle;;#Q9SK2 z7#K(Y>>5O__!;})jf3O62NzPr>}rZWKK-jJ1m{qBE~JT=ZDVfz?U=mOn{#-ARaBsq zvt*YF=5#pENm+=&&wTXRO?uDnA~Wx~W5=gqHYbvg$7rgWvH{fp+Hc2uWmZbF3hH>o z(vA5d`i_SC(LVHZ8=`ek=F4xzj=avjN$9GRWWTQJ>9l-;5lGX3$9j;U3Qx*pk(x49 zSN~QM>F!Wa`nN&+iwV^CNy*Or^<=v6Q2J;ze;a zFZ$*`ZmXz5(8^{PRk*TGFfKL>q1?eq@PUxbHXA7-9e(QcPNx5ItLS5WBTlA2 zNZ86l6!EH;F(50O<(ZtquJBOz?0$M|4MEa>kp{N6+=9+GV;0NaydAi0rL4$)L#ik@ zYIBRSOwAr!vK_UsbvEiOJMo3*G~DPRKM5X6lvng59Xi%LqIpY` zm73Lca~h%(Ab~!-lj;Rpk+gniQtYFP7I^)KRjHU+8veF9D3{bd@xQ568c;wo? z8a#W1kkyTfootUiJ~<_6xxKD6*bWUhXK&}u?F#pZ5XE&6C(}MQ>>{TLxd#k4UkLI@ zA4zjqXs1iO+d_|G3y_l$rJlf)7jqQzEUrnrF=b>EmM`me-*zROALQQLu|W+>GHW!= z=3iszhx}}uRgj%4mF_iT(bf{Q%@odXg;x$QkBF`0<*tB+sS=8vveVKYI@F;ovdn^$ zJ{}}}t*GwRU4(0Ew$rfSZY1U|;GOj*m_~h6S+e_Y$K|NtHIP^FO=ed1i{B>T`5Lb4 zD$x5kUBL2Clvd?Yi0`C&y(l;06qin>FDYLSfAh8Gjfb8TG^x8}jI`XOgQS#U7aQXU+{zs!o#)xGN zBOy`p4jtdA_y7Hs7IQS=6~((L{1Uxu&)a|pKgEW9j%N{@h$d`%Mbg!9EN@gSD*{;Y zt3BrcSLWT;GIq+garjt)v-L?dJ zheXRpmJd=6(D#>o_yuox7lv+uv*iiW{tKt#DH04z)y0V}hX0U4bBa4>qmOs~o`F~7 z$O?Dea<-1&x5qV**Yh-2JuR&vymc+PKs)7eZ~x2@nWn^=?Fm1G*th40_l~=thOzgM zi33DZ2i72?+@;aU&}^7}zIgAJwtxNXTT)72vouPkAdO|b5@SoPgR9^@K5uh1RH(I4 zVkuuue2l4*HX-KLo4DVv=^0J|k^@?rN{XG&Eq|4_=y;i>QG^6aOFzFnvs1-gvB%m{ z?_X#M*8l^MV1uYxg53XHC77r?l*lLwjf@0sQL|rdd;Mt3-#3l+26kEk%o*wlpP(0F zHDh|-C>Rs$B-#5~-ZIm{#YOJ2v=T1ShsQKFhC|lNy@DM{*P^|wsI2*?e?{DSAaPFY zQ4U}e;>Hd$L(k2Aj8UR=;mZ_yo^^cBfWWp3ddIf-TWA!o#evpMZ=$foP-HFlFr`l4bqHG=HJa=rEq(pvm{IT7Dw> zT0|!v&bJp+rGCY0^yxj9kPCa5V?yD_S}-tVexQwyp>59=#0zEu?>30q;ihgr3X7H|OJLu$K|?_=c$6)x;t0zyS#<0% zx6ZGXQ?m}Ur!V7Wh6#Of+B|BOQ-d=hO6h~eh?-Jxh$Xg)1c3W6g8DGNG!Vc2vrf+8 zEzVbD%`<4%cuqtJIc{3h>_k!#U>a_cf};ERdAiZfV}w#KZOo}pZ4@>^Y|~>}IMiW< zkn4zvTA6B&cN!N}P7-8vpw!}B+F87!x+e2F@7Iq1l{1qaU{v8^CRhJ2JP9pZ2o~9C zcj|8}l5i7GkmVf2+~Q*BW~2!&eSw6%i(K9WlJNvpJLc-)LUb_W7qUd*#|Ymv_9oxf zrRqXGV_BV4#kt?>rcNT2%0EvR?TjM_l4_@~a@jH-*xLETNg@2 zpX8E=#falrNVDG*M8ByUVFe#sjx;$NF^xO*PY+I5Rf*gq?L0Sjw?jRp7L4;>FDV`#f-n1UJg<1# zHkl+-bL*xH%At>cfMx5*`H#@ap%n5L=uzdoUiKAq_8FT*j!7(Np^i1``111$>nL4* zhxt)u8iu?9hkMvNAKQWuRAfZlTCeW3Mri-!0Zb!MBNi)jU!4{5nBQM>?uSmG^R-|) z^9c7tr!%!)?{1zW9nv{FS3F;%R-Kot3DOmf+Pp2M`CLxHHXdK6fl>Cx=OsS{bKX;a zddeA?t}3p+{z)NBU{oRT^InavWfyHb{|=Sd5Wf8EHw9)#4U@l!Srl}<>g9KSF2=nJ z@}#D2UiIqCKGtP@KT3y$?G$I1)bcCizrJI~+wOz7MSsL|BK(2UFIAM#)Q#>R0Q7#OXt&$>T`; z)q@S}5zQ=qqWEY_YC}rY$aXo0%PPmc1n*ymzS81245v-~>e8$yN%T5b&rJDMC3&$y z>s@NtM#tU){P2Ke;zO^BxF_QHVaU|(Me+hs`_D+oIIu(#ykpNHO`bQnLi#6ns-uxq zvZtb;(QTNQt|H`CZ;=gj4XuM#s>fLSuXSzQs3{j|>)H>?k0--GAQV%Kql z4NF#X>z@UCTo+--Ih5Z5S=>_JQI!eJzvj(<6-djDfo$(_wGwJW&L^SRNk~8P1|mjN zAZY8?(AJb2?S{Ybwf=FMlduW6-IJk$G~|#;q>%lxt;~halR0`pUayVg4p|@Py)GUd z)Scct%m~JAG4L1)S`L??xan(b%~)1vLkY@Tm-z&@-Fb0YPq@9g$ONt=6blzws0*uuU~1QGTb06qve&H` z)tP3hh5{RI8|^mNNMzv8D^b67eMcDhmIO#9Nz{XGKrJGci+>f$#V+Hu2#TreED#dZ zO1#yApQBL`#jw)X@}4Fj4EB*HoKAX@Zg2f^=HJK6QRFo{7tB9?+~E=dxqS%1M5$fU z5c9btBrUK)=&=V~U?9J7XY}}id@5HEJU5j{&e(6A{g!w~Vqi>U%16FBA5dd|hNV%` z<+x;yjsaC{8-)!mcG)N|jz_6cY&WYRsP#%(jM$$9_C^J}5WFcA{z~DG$93V;d~o_U z9i*-U4^D<1YjDv$GG$BclKIRhrdk^UI*~B(hvY+6S8}EXU7l2aCr>mw^fli8y2y}-KqiJ3D+*SybwG?y zU8`{!;&;UG4*+tJt0sy&LGqRHgc62C%8VP!jQ{NOtsuBceE+FU|Hx|}R0 zWr%Z2m;-uz&k9eWj%sNSU}BF0zaL2`z6aEWPmFYjG|iorkkuCNFYd0M64WVgoqhi? z2oBUKxcL(>7bwa`?zniv;_{|aOuj38C7!*TyTXnRj{o~nk>Mx$b04fQWt|Dh`Tpr) zvw#QA0!gNvTAl3(Li#<79Y*hwPySd~iL6is=aIA)d65zv7d(&HesW9Y=G985spL`U^pA%ZlZ=ft-fYtAPh$-d3E)B^@icmnZD6nXX=m)=g=i2>DtO8)=A! zsynA)gR(e!9Lb6b8wv?k#zp^T5d0%AF_i9!IapEj)izb6PJe6t02tXniakd-xKFWN zk`rfPn&v`@*{Ve}hBt*bX2*9|q!Mlgdv=nD8ax_%|UH|Y%gdpRKx5xkeEa@*ScKT?fB#P+_J>CX4}Alf2{rnP=5 zb594Wg@3WYCa6Y2E^xo;1bw`c8aA}qN`R#9u3dP7C1gZlTXAu^ns{1nbJqPR7f6hc zC9e`A1&10F1wTVg!}o=$(2c1#NAB~Xxo_LvD;E-zi)_BIWg4*I;ipTPVY{!zi*c3` zn|B}K4megFwnQ@MLn3`YA;#u17qy&#t^%3+U}ydSs);ta3gQOhdTXxXxyF^w^YYTQ zvv>jRl9obs^mhGO+K_{eaLvv zh(K2fb@$}6`k^7a?tn+ z`n{nBP5#}|q{}c5JDR&o4~N4KkSQ|Xy};<=)xsh^IX67%JK^@$C~_UMw#CL;eBUXU zAazfVpC+<)VO|@$hNZ24lnUx~97>o=K~t7s`)c!uU0+Pr>T`3yQC2BF+(@OaP0#J= zT8P3C4qW(E5BR$s0N<8BZfJTD%H~225^5!1K~hZH>uA@rTi0Bhd5!a<|^CO{Mr8QDw46(3Rg)}Vb3_`cb`y3FZ{;8ldg-{fJG(%G40_BNwCdR4ygSH+}7U z24%Di-{PZ5!rMiB%v%B2>P4DOqW85+Jva)Qh;N4zR&*=UnbCqfZ;1hCa^VDHXzFA2 z+OMO28`eJ5te;r3FFA4lf$tY{>7a{S_tpnY^?r(FV|YP2`4H3>ohppi@f-aZp6tLE zGzyc!6HUhD>Yy8^*39Rgb(pNPF_g>f3Js1XtdD3(^AY1GC&y}H9);D8zyg8p7=7Z~B}0lrFo^T`%2{bK-cN+m)hoDX*d7$sk^ zvl7jO;gAgRv$rU8$QfeQF7>SBE5uhsGWo-mnXZb_~J$zG7uFWI%9F2q5Y`@WedR*7IA# zKS^tESb=v!%sskHior@vlaIbuP@QCjE>5U4a|=ay`@w;0<*zlR9eF++jdfy_$77|g z1eR8;_W)x`+Ti#T^pBUt`pBntLS7;oKrDvOL^X}_xI28Q45R;5f948Gqekv=jLJ8Z7f ze(QcOdrL78YPum-lb_=9EvnScpg^gu#=Bhjr}d+}f6oINIS=ScmhL|<$sfs-_p;LLepG*PAm-~7rjs4@7ZQ1HWZnDd^kuFCM3!`;!jZCKuKi0At|xP17^f%- ztXlo%HDDLSuYb!=QdWP%Pm;`Oz!8w=V2@_e2>}fI#PROqPlKid3(PJA!h7*EG!WBJ zyc?$>bHp6$BpDIJ=tC&NKl3esRo2RD5!11Yt3TlLS2ZTYuIcl9A#Be5pmsQ=+oF}o z_iOx3fn4_UJe1?Su&rIHqUyMQI-0#HMAh*yxS?MOf@46R-fmYUu7Y{ZzXC4eUL=sP z-oCHMm6uv`3bcdoRaEvDvmmMAiny$5{1Qy!hw{%rw9d|(;woB3%+2x&MevJImhDte zIiGGraGrCLU35(C>UwnA*23{*FQIGZC{;^_mD<-P#&OalM~C+$k-0myJl+1<)qx)q zbN_zv(TE=`@5i{szYhh>sWSX104fVoCHl@zDy2rGjXjvO{6j~pCDj6^FhFaK$~HGo zY0NLO-*#NB9V!Do9;h7gN@0zFCC@Xxr$c|1sRxtOBs>K=rNd}my10|N%wF0TOw=D5 z<_sG5DL8D_ut3^2Woy`c5&;Y2X8iA6#Y2LX4`ynf*9N)w;ZPfut=__naO zkcPMTK&;zn!-0JnCSpAy*l6DwM9@pCGDZnHaU>pj`*c(5OgId;mfuXSq+M?RG7arp zvdx0SWHib1{M?pApViOoGi&1W14zCIfSSiXKnq;x#`E{Z`akS=b0J699T1R9f03^s z%`2ZF*KV`TQPP{zH%qdcQ8GHDW!a_F2%_=|K%ED1i*SGJn{@6p1^Q89?sb)>hP$lH zB+FwN5RgyWqc98IJ#K9n2Dhux;{ug9@>vXFM>E<5f(GT5pTG#M6t3`We(o8Lp^1X# z1z!kbRFxJ_3vz#Y6QGkeaCYytRaY_Fk{#>LbW?SII-H{Cp~oYtYzk$Dzd(O%os-7yuDO8P{76{fx|>NAgWe zV}`#$<3HRcp+wU9&MxPL1om*5urAYI)*Vi6orqXl&Z52GklmE1-&c<8KjdHVoSsY z=`Ia^zW~DyT$&xzDrLX-=4^aXDCG!Y6klvt`JljnlCfUP!LMys#c`2p(K^$p%@`xB zvs?l|l%9l<9N);8?Vx`t@RB{j920Xxa-2Ko{}l{D3OBr{M&R10;95 zc=&rICO|Dou0gn^e;@2qrzhq54o@(LgxR|j%ZN1f6W^k#tqvQEiRg>0HhPoM59^h* z2wkTfuta5jY61PUkcY;yHKs7B76{DGw-wx53bntqrZ)@tzpJ(q)l_0}VI0WDhCIVt zMgu7HGUD|h@OFB^7>`ZI33Q5ctN>?V|&a>};7cwg<3HOoWNFC3xbbP))9 zC50kbHGeGtr*-qRfM|`3R3Q$-$1dqeyiOLw$h9C|TRRw*dI2=Ds!hXCP>pz80AYi% zx9d>lp;9Mho4P^ho0e?v)Gnmltbu3&$ws2w{iSbEP+Y33nL(d3t^CC-*ewF=GaT3aeM`IxhGJ)fBcGLajJQOH~h<;>8N~L zV+TmxC;_piGRzQ{Oy46C7x<|*Qk(r&Z(5ZDoGlpqe7g|<+c`?B<+N=v`h_mpk(UjK z)r8bpM5y@0AB3MssV0|?y>4P7HFCdvS}6Shp^o`WwU7$IQVa~T^EAbdza={SV<0E{&C^PbUn1DdfQ0nB*cimg-c9yHN*=n= zb02PPr>{U`*WcI^0sa5-DaX`81B-%Z9DN#R0v0;;Kts)*6h}54(76g1w&2AC%7caBE-luJy&?OT6B&U<6-%a~sZ; z53?3FNhPVI{t#7l?p8Y(U;MRty<#Awjyq zR0zmeEywBCmS7}%0u!Ry0q@O1)bK1N%m68cknqb4fG^9~dDuX99!)XP6GmMpM7~{I zoEc7bTY(&?L>CEews-mb6;0VO^~Ea2RJPd*06SFz23!HLURlLzjRziO;uxDy z8@Pq;>+;3y##|FPXI%`fFpTZ)pM;L!wnaupayl&S240cpxu&XN8 zmHp2sa>X@!$D3dHfp7iwDCOVZ{eRec?|7>F|9{*#i=C?Jj~dZJ9wO32Nseq${aUxZDl4iCm!1^=+sv&TFQ~ zcc7bK_;8Djgx}jaI{Ob0X&-&)0NL&Ko$Aq4yY$r0$r=-)D5kyCzH8`NqDyG4wmS$L z=l*1@tPKAZIe5IT^5S8l0gzr&r(YqgX_6$Qs2nZhn3X=f}#dh=_n1}Kw?7g%IIxW!uanya_X&}G$_KIdhrre3Jt*aYc8X) zwsn#0jEfdt0{y34VUU>mt23NG5iw}OWh(UH)VDR4Xe!ZR{-qDFF1~agssdEfeRT`w zjP@ZRaT@+Q;^gBC{wWMg``}xi_eYu4{T_&A7s!|{^inWx{cD275`Dt#bp^nJU+P35 z)^rwv!TN6)QU&daudsI_8szp#K#FLnJa$DPypSm^Xa6Gz#GxJ+Pq|btjfWgI_g6a3 z+%(ST_@APUG9(Pj9C~Dup#vbcUXDG25VnM1uHWMprP}e@x3joDufG}($nttpAo2I_ zl}tbsH5Cz0PyM5wLH;#?AFTv!l`=;WVH%JS)J8LZlh}mEI54iNrkJ6urG(`hl_q1Z z@lEZ6RtKs8ZOs}v1lH58f;+Sfu)J>44H(5DV=cf7j3ko$sL_WH-yC=-t|xMd+nZ}; za80Bn+yc|Thy)?nCP;IaKA>2W>aY!y6Q<`hRN_sR@Dp_m&Pgz?T-9X0mh#*JG=TD2 zCaT0kSKA&2$S($pBzy~VTjx|q#h*F-mYX`vtUwrKljF|C2XlIXEEXh;DDXxLq%kIc z0kM>R7R89FQxcCXtKXbZ`*^^>O%CLg;d~`5UvAB5@(I%zw{uj&fLx?YJP}O3=XDd} z3CHVt;Xnn;iKUUOdHww(z3vk)Xq@N$5U8$V@4egy?4T0QUQ4u+Q5%PM^6 zw!&JofXx@61r=oD3qV{vEHnV1xqqHd6gl4&@1f1S|DAaGJKN?XQdYe0lI0)93+O7W z^RY2rw&4b8Sexs=clR(CyvD=Z`=;0bR($^PJYbOc^>C)x?#REtvLr5QFyJx!FS~+N zQ_E*_@wHm7hl@}Uit~U(v_}gPTo%W(pXHcMf(RHI60SixM#=gch8kD&NIA18Vl_-m z2i!@aof{`5MLky*Sp;+|tYoTaTmv3|XY_b5-_$)%gGT&pFiM=n!aqV%j~p2~>AiaW z*|Qn26_RDt{exz9p#Z=k?vGX=ij$TGN8&nmHlm_v!1r2~35fwhG+f}cC{9sbapP3> z>P&Z0S^^OGD(?CaQ*@AI)n6zS$n{Px9t%t>$bOX|^Hen$epYc&b*5n;N17`Ui66s7 zk%{4x0=Zy$bp-fn^*qSTvvt#)_alyErY6J+XRroLQcOaGXVr!AVEIe{vfIAg!5LE* zxiGB-(t}sOEi^ZF2Mh+o2dFnfq0jAPegJS-bjr6ICJI7y6OUqV$omMRBq0v{nu!;7 zsXcjOC);qAC0-lw;hWDMy#n~ld#qdu#G1{dfSm#0w>d98JZ#~anbXDl8Hypk5d8~9 zE-CjuLw{fs`v^_hkKWyK&_X6RkjW#H59i+Na1`@5#QN^-m=6NYR^%?aHV@(Pc6+7K zoZ4?MZyo1!G0fZS{NEX1Isj*YY4+~)?SI!Y`2J$>G>Ag4Ywt{?$S%xK@6<|-q-vET7o;D(=baLWp^JMW)HSRkY+n5Of+FgvlA_=5 zvBTc|_?kvQK-FK<3VXmL7A>>y8+^k^cd4G}hou3EZz^k5;eV>ey0Y*=Tp|T-@YGFZ zRPFO)u>$trekmer=Q}OD)>Hn&G`l-%A78Yp@zA#O)=}|_2!2z>7~1u`y{xOXnOu5z zN1T_VuATNCEC}b7LkZNsJjE9c9y(0A;bYVO-2E$49ra9`&}2D;$iV$Wmx?}aH`mC4 z>{YtT5!CNAqR+&F3EAj2M+#7)0yBT;4gqYBXUHnbN3kXW-Sxyz47$rXiU#k=$k^K< zBKt>sx(9li{o8b z?lA0GKa@oQB=t_>yEiY=WH1 z#+m<+3EDvwkWP!J1ScRY@iMJ1FOxuX&bRPCsT#vH)aFz8Ppk6-s!vQ@ci_`I?@Ehm z222JsOehw*Xa@rBCke+e@h%2@AE05vz^?c=*p%$iReN5RBmTk0pKu@a4B18}@C#EH za3N!(zD0fQD>9uhjH$2vc75HFHEt{*axtR|)_A-qq^3?!AVSgw#+|J@%WQ%!`NvuI zN-##3W*d0gIQOnUx~Y`?^tFhIGty4Un+yFV#fVasNi5G$es7IoC7Lot^JI@?Bo)!L z`;d|)cE|{GKi-Ij{V}WybMd;O5>+Aw4>7eMLr9x`3>UpEyY4pj-z)$=nd?1;&FKAM zwpgnt=zvI^zq}5>KamAdI7QBYyUFqD=a@wcfy&m=AJ>^r!HL9A*KSi-LN=0Rj@EGd zD#qT{wpE;Yp8wW*ty?P+zW|K3oXOgFOWL*VNGFXANv-R3Z6tOi0)#{Ja9?7vl%j@7(Ca}o%>i%ToJbGodI{4 zPsQbx5KP!1>h9+SeC$OeHtn9uqBhG%A7d&pmpBrUDH6N)$>rxB3xjI9@*2|aP>*{* zRTI$U+p>?=h&Xk$5{&MGgO{&|ZHj#;6d75DWS=*ii;!63j3kG&?Ywh!;8{g3lm_Wp(EyG<|{QccGi)%}y&+KtK`hG9K$K80~Wy}9y1vEl{(~!@R{&UnC z{XrAmQ(SUt15^@!L7i5QwOn^SXjo`}Bh_)(aF>)TdxJnE z_~SUxJ{y3(UX8ZJ1f>`S$f=!U47LeNiRJqt%lP%h`674Vp$tO~%4&C2_9c_31aAhG zWIukH_lF0Ura_c%#Yc&SNI3*ir3=2Wau6UXJe~ zj~89dIGWfJT)pcoB7(V3s&d0vv$krW&SVcRa9=#$s+j%^&EvVVC~vP-Ahq86EloZs zH1}%)hMF_Z-oseP_!V!KCKZ>#kT18Y@B8qlkoC)T7Rbnl4+d4zp`;?G(ywwyl244N1QWX6T+-sZAyofk=ETSz>gnf*tNEgl+Od8x=5St` zLgJP>i+1*De=Ly58xUw%42@NZphHc{A{|uSM+;8Tu+-g~Jb3XJ@zdLRIg^JsmrF3{ z!_*tjV&&^u>_^Rge~%$$PQJ2g_t^#60O69#$8KyFgtH$U#WW{{f$H@CI=xF6{LZT3n}v125XG)mcSUYu&rc`^5X z{Qk9{snPy%rL0Q~-4)p?PyQ8PVrc%~*B6{AZ8soT|D35}5|!lsxwmLF=YoS8HbKu0 z^Is8UB%W1C@&`Z%Tqf=y`NV77Y|L?g)}j9*!d!*gF941 z!tV*CdsZQ<4x}2jHq_{`A?e_pziHwkaC~%p{h?lza|UpTzZ0mE=iw$Uh0!8JpkZjz zMW;?6?(_?*z+ljMoKvdzu%tR$79|}o zf)OV^x1!-J(xznn5Ub(2_fy0Fnii3ce*wU=5=8DbPi;T19aDj*T*7P7{8%yG$QCF> zH!JppaBW-d@ho4>Fs|oqw!zmG;W5-RY=EB^;D?iMf56g}XG5_%ETmmN!d(MFm25tT z=C&U=mCI-6*VAXHG$MA`*rabnBF+Sb!}ET^f1xjOX}6X*Q29Gup~rHlU-RJy(EVNW zK8CO7(b+iBg{`o9Xqcfgo)VL(hEr#yceUQu5v*H83{~!`?HP|hI3r81l0=;h(*2}M zpW9-qlsLKqjpjYy>8j{Ve6`i}V_tJR3vCe5>uOf8pUbcYi${7#xD!F~xpm_A0C-L4 z(NX1SW@^1a@wE!`y=ro{SErhVB<}c2RJ|zbzpDL(-#fu`4TP7)00)=B{#gP%L(fO? zgIW>)vm59j%h9K%mkIw0JYhMic!Kr>H}7VO`4`;s6SgVlzZankKRWK!83s=alsnG>(r5-pT)q2B8TU9puX4K#E|9A{#rqS9g1KI@6O`L#Xig@K~ zUKal`%y8IuRxyvr=u>DL&VWd?tA*##9=>;j(h=9JA8zcEq*-BSE|qJy{mYN`4FfMH znGu0)L2DOvmyND7bVQ=+7VdB0kjA1M(9T=GCMs{l>;)YAuLbT68Q-(%y-e zruJ5HfiMf+KVlmRXlVTk0BI@mD)AdlPT<@L&bkU|5Q=>QRji6Nh<9E`sHz7ZARtb< z6GosL!T9Zwl;h<#@%`u4xQSvr^+-%3{@6_^YfC?kKu*8B$^0vP{^IckSf&-SYcT-S zL36`!{tHVvu#Alfoz;;dr~LRPk3F6%i1pvCIQA!EZTjiq-(vZn_sEa8B75IUA%?EOM4l7c zRIcncl6yHi+)S|*|88TT+5lCN7OsqNg?{z9b-X)_pMs)8C9GnBoQ9FK_yp}(tI<^> z=gTyhHzLd-dQ`)D7Qn_P!*A<6SG`5B?)%|=;fnmbr(uvMLow2A0TERE5R5m6yBbef zp1l6Ot(~zQ>gP5w%=tR8BjGNEg2D^lqZwy|P|wPx z@J^%`U153|hL`T?Y1utQiA|MV5UkI#hx=ayjlxtROYt|CbJ58%8mstc%36VlHq(AK zAIqni;`|2Yg1GB-ArIoKe$9CUiJ@cj_-!f67=p!ZC#%Fp<@>e>94AZag zWy}8A2M#CSgIa-{A74*avk|B=tAMJUoIEU{dFVOLmlLud`2u46cJ89&cZ|N+ebKZ6 zAw|+%_30C~#3_2$@2bOY)7B*U00M=Nh7#2>35{Lf|LjzaQ`+$N{Nmt@rbm(o7h+qH7?O?0_|MKD&67vJ3)mMZiax;az3?8yv|lu-sA*m{6ua{!wUE2D ziiPFFIxsr6cW^*|;mk&hfdWtocggZu;;&f6HT`0^0IOnCf>2CJ*TC(iX0_HxU&g%* zh{Bvh+{(WR29CC|l^hJ3g*yIy-a(`XB$mza-8o?Em|^ghx$_;KVk^e}w7r{6n5AZZ?(FLoJu z-i(AYXCzW_|NN|dpk8kTiD^W+Y|KSQ0Uu7r;OK7wZeZI`Rg4*#DLC+chhz3!yarjZ zwk@d8;o-7YHzyJt8SXn3^M=x05NFQv0xDZ^p)NX1_S-pM+S4zeUthFWt+lWOgvC4SLE#fIRk&F^qP}2nftC_My0`s!})0IKqnQ= z@E_pCWM80uXU$0~1<$`vOc(@!2@@#}NVEtBrC`)xuBUWJ*rcZ63&z&E0w9pgz zttqf|c8o!Ev~{~24Fy0r4t7f82gSMKYQd)iKt<|0`irA(MTH;kylGr5Pw8i`wZ{vxt1{tb77bilsZR?xl3?vo>Gj02Eb^eMUnM}F}JpO3e7d8c)K&d^z1k=B)OO*%XtIM*ah#eod3jd9C>3yO=N(^>{t|wW=HbZ+Pbf7+$>()?yGrbZH!_)-RQfHuz@Gc4Jc-^7J_x z@3kqEquU0?f3$3!1yj37PUG4pbjzJ*V%C&OdAFz}q)nMnC5qQ6!N0Yeu>f6hSE$_y zsUwdy%j+}O{(Xv=*bz|Z_w;n{e?XxHAsU9gFdMX(p9zvTR&UQc_wMNfMUR)36NhBz z)D9+B&@&6#ls0a|=0L`pd!H+vN2^%52z55b0uRaCWuYmg*!A+lwb24l^qJjN4`&jHRBFj)80LtlLOR@-(V|#jDd4 z9wxU3I0sp=Rzl(jFyLrA%>0)+feX)!GKuWnd)B09KOoCb!`%Wg+HePep0wOr7%Mpe zR4k2=L*$>#*fS%H1{tY|wV>fr=x&M(?OK%Lex9PDlALl>JPX2|& zTA>{<_wb)Gx7AedZ1xT09|;uu7z6-h&&PuL<7x)yNXs4t*oOnF;66Ctr`K~&{bh~ z6{{W_6hKXsdS`DKpv4m$P9^xX*C|p9vVwLKO9bjpLUhzD(u{N|%oR|hwN6^v$| zE1PHKkC@67LQnX$*Ejx@&i;}25IieaIC%9Q(g%1ljV6j&_755D{Xw^gA%$I0zNB3r zz}Bkrp5})GJo}micnLD1D8B*PDuY|XD*`?{bO66PRUnIKSf?6)>~C<;70UH8yU-mx zgUL=jakhPfYlp&ib`9JZuJDt+^QE_?`XZXnmJ1O4xXFD0&j15WOpWtmq3cIT^=raY zm-S5e2u~q4;!*~pZSCZAerozEJ*^8Ks_VQDHtvmStB(97P>88$W_@!Ym>or{6tT^M zei!S8|AANkiVfoGhczmVsHm?&o zr=8{idGyxOK*l=IbJ||gEs%iHF7J?K51_I>@|xpP`3=*RlFY~Bj&z7N4RrQodoJB} zgxuGU8q2AeFf=vvg7~PLWv3C!l5F-yN@M0X`jdN$kmm4>Bx%i!U*#IJbe7V~Dy&$4 zvcX4N2wIkrsZokoHD+|U3o7sw&tmvwa>LwVaM&vfkZS6oUeA%JH=d;mkL5I})EJ-e z!K0l2#%g+!yl>>;^G&$GQ_xYXMSpI$SF@kw6n(^)w2;CJsUN`1B)#Jh1pyj!9NyjP z1l}PPT-K>aM?c+bioAS8`bw-j7CeGiof>@0fl44HnFf)}8(JJ(v-G4OVgw;{keyiAIj z17K-XSqerh^|Ni(9vbQgUe0S|lzwsFM2%I53SHBn!i*TTkklTal_(j$ z8;vY~i&0t*uaU#1Qx4UeB9S&SRl z;kepu?0ceqW9Ef0wkU^K@uaxn<8}B&Y+RPzPJG<#)xH`v|A~{1O|c)_SxGY4cZQF) zI8j@BK9uxauyU&xdSXyBPdGZYM8*;lgU%~o8r{!&;&ma9Ll4L-?weJ5lx4?B*cvG7 zoc~@#jva}((_ep#Ce{g?6xU9;pAKiIimQDU(rJ|&bIbRrG0rlj|6ac3375kclK(1g zmN;pAxt>?QUeRSZ7)nc$bJSz`=Xye8#uu-iZw#Qa<|IWGI6&*d^=F%yhy>24#d`Q= z&m)$b@sm5KQ48-R30c%f1VLpSypd$A3g`yn-Q*jq@HFAQ(HL!=6?UT;p z9M8MbVckjc_LrA6xxKy8ljTd({lAy&|0!NXsr!dB3Fd+y=J08~YDos1ByKi_ptX;h zIRbNMJ1!%LD+nANe_v~ueGuRLKKz*A3mTTN=Iqhs`GEl^9mXs!^j*2`U%k9s_$~;7 z5u9)yUF*Fe6+eiX`yFr~L|gsOSOu8aK8zJsVMDhebGwx!Vh{nT4GhOV-I{q(6v-ci zrH1{l1~#ur5%R{$ zHIIG)TjqCpPcCgDju6PY!g#Y8B$AOoXTM4X7+{dA%)AQUxjg-~i7Zv#6na0tx*Q+v z;sgkIp9k~B54msv?^H|O6m#f>f^W)j7EhPvJ7*%EDwVaJ_tIUZ+>ZD%wuE5voqV^I z>90r#LG$Ha9yF3HmAb#p9ee8w4{_tf5p-MhqXP_YuzdU5*>TMqNr>`Qd3S4RoHVyG z^I;x9gV?rf&-wh1hPp2x#ZGI*aMlDFv*ih$0`i~!If{0BX~OvI594q`U&lcM*Bse* zmrP=5 z7ny#+RMh-dBQk;YIO0tw{NhE}5u~u_nfErmD}ZDpNP%7vFn>2RCEFhaMYdIEofbIb^s? zp^l)GiU*0sncP*4T}8q1@os|^)Yp>V>ZjAi9WsmzsyM)VWXh`3yEEVz@=KGUayUSa z=v{+dcCq}eDLD##;joy+^)<#dOsmDeK+|V}zq!Po&ZT5r2kMyO9PC(w4~U!YIlo$f-~amsXD(Qy(LOMxB}nCG!d#QD<$x&mK|rljyZbLH=c4ws5haH+4#TmEeq z1YqbG3T9=_GSbqn&1Nk?aW!7=#Qg?W-OynG$l-(RW$MNc;>a!j(7*4U;@yX1(bZ4jq?k` znT=+_j=QdTAIYuD-*T-uszVQYKTu$d@hYV1+n#F5_hjad$K4lCFUJD(%GP3lucu|u3sr3lu;8QVuZKY;f?0k`V4#MOY zv-{%WgY3zO{U&eFM_4U7G}r=I6BB351hcU21=dJ+*j` zIrzi(u(nBfMs9?Px@IC$EE1&1_k>T?1d}+h@|-kaQgxE)Ixbi3{@{0Qmf4Qn zm}lpUUY0?m)OPwl(t5%A`UN8%O%S>`UC{-rG!*@smbuS9%;GdrPQNwIu5};1=KjXI z)<8iJ{SI^n;<@Mj9HJ9gyLgB=JrtW?fPaXh1E?yZc?Ko5LRj#{4swI&r z=m3oOA8jb@Tp2plepKETrN%T89Ay4Wbblkq5c`@4y}UiMvl5Z-4gol9)mnYdQ6(*x z^nA3Nvl~$GsR0#$oIl_8KPBg&J||CEVCP$788eD$KSP?FO?7luf;*({uP-uE%+w^= zux{<95(s>NZs`klb+qY6=_(m7okf4e^c!Jx#dqoyQaB5)e*IK)E%g?q+uapUC`GUJ zgIz$sLAUI$#{rEu57un_XlKNY#kv0kahf@3-oA1R#;48+d4!o(}RB{Yx3-~9d z{4-w#i6wywL}3Nm{!k||e8`wlSRT<4Pl!^AJMOxtbO!P_WS==_?ch!Y^1q=U=ib_A zE1$|AAzsOV!%YcB!o4o>Q-vWD`Sa0mS6l@Go3&eiN)qwbxqzUAYK$!zn5&Za*_I$( z2^_LrKinX~{H8K7)2LRC8?7gEO6Zb>KWrWBzxZwF_f;{fgkC9h8PRmRBMRn;5lh&T z%^@k}gZ|XXIt(H2HIVl>gGH```vS;e~`73$qBVPCaBFS3kfC&yQ>$w>`(&AiYYq`x^( z07O2X^1a9@14L69anAQ5nU4iFmT|5Khr6NeF*klc9wl6c%AB8bJH!eY7NL10|g(G>2VYAyp~ei3NDfPopcU&=q+~p8g}e zMBEsHP1A=abEa00;Oc@H330*=&HJOsqBZw>d1^iKO$nH7YvS^%mEyZ;7M*iOCfMxV zOzK^oTn$0;3Eg=I9m7XM!IawXXyRH!P2eOn@@FT`7*;2+;Ini^`Gzg&PB>VKOa z?DaHQ##XsgxdNheOrxF|>bGr&HU151BAmeuhPyiV2!>P))EvrYjqyxb^)A2E&T5jS z`pe-AC8+42VWhe%inOPf#FxssSeR=Hn_@7b0D0oHqB&h47&_?>`m7(y`w42Fa7iAZ zWPUe*6;T84&a}tINr*u36e{&xwC0On`Xm*aP0#cfPSePFBt&izaF_=j!Yf63`;?Zg zH(4?d*lS|!@dtsF z=|_b=ByyT$IbZ(6*k|N;M5nXS;W>z8-}6kG*`fE#*D(GI8Xq#O4Q*4-r46jm}IXD}G}h z!(Hcp5$B!-C(kF^EUs|RlO;F`78t_1KRxY;0~Ae1C{JkDWVVJiFr1<>X<6s;45U0c zm0Jop+Yw^$f;gB%BcJl&;_{9}2LpP*iGZNT-FwP#RloDB8KD4Y&1VSd2U zt~|x06{1#zw~yB0JJX}y9Y3O4F9pq-Qr5L(0D3i^*bfY)QwtBL2)3n<4WxPWr(TrG zagI@I`ggJp^FVZrYsd3O{(g&)6+f7ef)=-rl3D;*+fci4F<91~*_CZn@C-*h`5e|T zrR>}Azi(d^k;<4cVS|4ZxiJyFh0u%L7{9IR-k;cFoWhC-_r*n zDqE3ADO3-c*)^{R9~x&xyC~6a!#Qtu5F(Z)4oGB?!kI)Z%WuOvaf@*gV~;IPAyx%5 zFf1m!t%N1_%Pb$+L=&RfRc;px;FV$c8J|pB&BJ@etp+#;B&t|Sh-HhlAHi%M!wZSH zZYY9&RHjBFHStI=U4e&-adb9{8M#bo?IUHR*5oc}R^AnY^3c#j$J#wXe0FhmCBH@C z`1hxXL4>zrDLES({0=Eh%yyjDO)ty#c8mE7f(l3n%Y_w?VLfN_>+`c6=*WIAFBXL3 zQDa;a9>EmIv-9NYR~9SmV!A!;A@_cG7-=bAlU{>br7z{Y-4405RCu_@9ee1vh^r(U!r(a`^Tl`fK@P4;^I0*!BwmatniM! zfJ|-W%eQ4H9TjbNB&5pG9nQHrzDl$S2&Cuq<`+0;4s3&L<#`- z1ASwa>VKVqGl0f`h=OYLIewHFWMR+240T*z&xpl3+6&sdi1)4R_}pH zs9%$m0pJ?;sPj)PQsb@H46R4PlFD1}o0TRhBn_em`=fexL|<-f;Ozqum8WUJm!EI*c`f7S{*+PSBkf>a_2c^-(%{Y?8#wJp1Cfj!- z!6%wb-GON+3S;7LkT6@er0^nQ>(It3q)8gmb($#;kxkx+Pd{FTdrh9-&Ey4yuR1w6 z#NPlftTgsvUt`K1A6Gp|ev2@{((W?_Sb|w}mO?Bg?c9>Hz?nR=9vspp`W$bZvWf(bYy z9Y#i9I4AkkguM*d0YvrDz?RJ{p63Qt3qq*93iN;f5n*B|%$T_Lp2hoi_r%zbRPDFl z8~gZo%W+Im5me#^FaE@}5?dAcl5uru!L9-SyRmzHethgpVK!^0^|M6dS_ zU&9a^xhweg9%1a;GXMaXXl&n(xg?oIN5b$=+K^%s&O`~IC?f3ThUP|y zxC@il`E@%$kG}C2NDOaW{*(x^FEi3zM*ac_<_j+45aFRka`lmI(lGqu3;>%qNfk^)zwl0*Yx21<<*9qa0=i#zvVz34$Kd zS^C^ZcU#VRkl@jL@|#V{GP85&2JaA-z^2C$c*8M$#)65l)oR1F_W}4-#2?}26@jeU zDGW0Q?Q=V*xX>%6YhFRu9CNYFlbSk#(^zh*TfGv9R ze}gI3onIt}Wh^#b{T!_}?>|EQ{DgZrA>UWGp7Y2PH7TRowpr1OOhieqUi3ADXyrc_ zpTV{pu*?E;xN+9EF5i(T*{wNli5B37`=IpC`ldB}FGapgfJ1Dl?7hk%uuD}eOcRNgdb$N}j8xAwmp!j83_5UJlnsx{ zjzr`m?yuTq9``$dePLx60K~TTYwvksHbe+I_^-0x9_w?I6=C%e=?{||W;8Zyg#PBp ziuujnH=$HME8y_y`S2A&GnvN`KgufOX)S)#ZOj5#CoCU3G_A8#Nir=X@gTabYGLa8 zr0(D#Z(-r=d8ZJ9C%TQtPA_3XaxHN@qpI3a_kR&?9b+H!XfFu3WY`U!OE~_(q`MGS&@C=E?kk-B`}!b@qi_*?pDLepnIj*n}z_Nomm-G7iFO2W51B?YG_{>)?zTM@iGu z$Si204Hm)U4Vj|#I4WNGdOB*Q`_>eziTy5VB>H$C=dt=ug1`>ee=F*da-%)~o^J3o z=m>m|&!P=ybwRZ*AYGUAy0Of=-;~d^J_J-F+I^%dWPj8ZwD$3HAsg3rceWitnVIz6 z8CKY{=WhYy@e<^;FK%k)d#m^9M8Nl*&MAZ-M>oPk1h7ril#+Cjw-reZtu(iY!BOcVhyO?JH$)IjHCvg1_saACXT@c2=#-|F74#OXe zjd#(n1ZKxFITtSHs^<%Km1yoOR$R`*)2}gbRiI{i1(d~^Cco-dr7GNfO7DcZee31gZ912| zL=gwZ;LBki&Xq#Sxi*dQ^ufUf0*YAwpZf9EAG}t2;l_W?xH4CLh5Io7BG52$@lN0E zK!(osvKbs#aqI;+FKC%89=SzOR)MZ{Q$SNY)fWJj>(}$<_+@r<#dBJ7SreTdM0NAT zuoh+EPfI|A7X+arfnU8Klr@Ln%Fi7V1V7L*T>>;i!&;Bd)Q3x+2BE3Eet}`WaAFsB zhbfOsv5t`9;l_MVB8l-0YaHWjI4oJE0HCFcYdN4lE=*O+5vdjz5SVGirKs06;%h6w zH69?ymZ05JlZeC}f;!2NGwmMZ$u2D7wHLvMcAo2|MK>U|;AX1VxiT=XH(3&1{>Zm` zK#z7X?|zr9!Yfzr%&>GHVnNU%c#H&1w(2FxjuJOJL?rw*2Fv$^Z7Pedke}3sh7+~hSWwR(CzN~5J zD;7?O59;8Iro>*(SC3s<`?%YOw|3}yo*M7MG}qEWPajaD?!T&Ptx0~-na0meI)@P< z$Z^7IfwjSk6DIF$&E|}PCc9b%3GON-IYKyfFgczLqcsXqH|^@3UPK&7u$)!4mrvxURSNrq8PS;G(_nOO-M(o5R%kk0dI@XYor z_~jv;)P34lOd!;oljatvS3iePmXGfH$lPGPWx!vz81q6Uikl|lu$T;f z9tl}nn}qGL50urM^xklsq-jP3lFh9HIfJc{A4u3^X32j8lgJ@Fg%{s|6gy+TP|ubfeHAb+(D!)S$V*v4#Y?%5-)8-5AwLj zs{fD4uGxo3_oQ5}Lpz*)qFXJCX)%&52d{MNkam-Abs>lsj`LM;1nakqGcVr zrA;9%FZ`?&#|;M%s0J|L{RgQa_5vS94IMr$?~~s#a7P;*`)DlMawa@U}iwCb;Oj|gAS(3+PiThTOL_B`#@ZD=I{uw z#naQmQU{2TJr<3U4>0PS_(B{+WMp87mRvg4-I#J_&vCkg+&2(+n|eyDs-N%q7^t)s zBlSXxc8?F&bq?5bYZPeMj$8fGc1)Em~F&k|v$ zs2|Xt3`=08?k>z;j9(^wI(o@EI~+77Kk9H8W1NgB;-ISV2{BtmtS9eIw#tn}l4W!L zVP_D^?kJMydWg^|_@BuS(~1@k2-H28a8wTinor4)Y-);k%5pl)cIN&gzjBz>hh0WFkJaeM zZAc#pJCjmc-_>s%!7?`(Cpz(@4)oBWxWUgpuy(2OyS zm?q_F##7HK8MnZGhm3B+h-aQ}PMkFuzhB!p)(exAz)1Zi$qxo^_iyHI`lVC0skeRt zIF0kqySTADg^UC4V#8rESAIc1OOoIom$(8Uh>#fZZD`5Qb|5I5K_=j7=Gf)v(9Jcd zrI*0BLP5t>2dmHOpcAnoYMJoCH}5^);PFqH&3Z)X3_Lt|LjA8Ce{$`@G|APvgBZH{ zK&mna7f;NGpiV4(01o{gRKSdKJ$KR* z{)&ZADtdY_^xpsf30nH+;8vZ zE#=s@Ce?fE#6j3CBCgRUGYgMcCU&&Q3zhqS`-1qE-4II5Ety2e|G()Ba=W#ttoJx7 z!O|mJKMl=|@>vDppLSp)z5smR=+pR>WDW1Xt4{(jAeE82IenVBN<4f8G8peakevU` z*{*8~mV>)4o_?T`tY4{c3yZxb0TVnEirO%C2?AEizy@6T7pxXn?Fzx!&3AdWx1{3_ z8{LOFf~4Z{rSrKiuxxMMb-^8lOdE4+O5TM74oBH&kU&;F3W0cH^lX>}{}|zF3Ph4W zJDdNQ-VK0>J6YusDC(NK5CSauZ5{$dzBY8nT^EYK34XnUWv{gHY7D_-I&2M+cOm20 zdnH^ha{rLK;nhQwCFQLqNJSpQ|eU6X7L7DpV< zIU(mErCl=KD8t3KRbXWk|UYcm@(t`Oxcq6VA=A%CJo*@;g7@aB;M?1$xQNu4p{|5 z@73(ivD}<&_ImZkpQX}L;tL-G*-wpYC>+<~3_0{`1urR0i)@FGr}F)QS0B*tzv-ULaKQRrkAG z&ddB0JTDwH-_D;hz|r#9)a`Us3(|&i{Cb+1Zu)RcJhQv><}(+5^?v)X{W`JCyhi8r z{df{e9(^4NyAd-=G#`{9kBajU-K&tA##Z5Pax)Q`=*EP6 zhsTp_bTv~PgOeC?^4omChY!s@!o-tb>g=SR%>^>SlAZ)jnz(16{Z9Jc0Rbt=;1_wW za$?pH%|;VjuI)O^{b8pHJ^UZK zz=W7oq2-<8eQ%>2d>})PI!!_t_;P&{n_E-%?voeLwf%io?e$8qbh+Zh5|8gXeuZ!D z!oXPjOFAs2oG)ZiR_{>CDZ~`o3yR__(T3lAd-6L@HLPlm8z_IO@uVGM3n(xxhh6sc zB_(ubr~0z-QOxQ#cGhqAcPzbF%jbJNdF3~wkif*Uhcc�dt)?* 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

    ZQ30W6waa0vJ&7{L6;fgtXG2ulWS9qF{?e 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%0DA8C>9V# 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�?sSAK#e+YcW!pO{!nObo;$ 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%0DGYIV@r-=umP1G4+d!RdCmRp%@Zr4 z$KpIZf^UsrV18f4?0abuJKwTCLZjeDk6L5z+`R)-S zxE7baGdrc3e+?3TQOED^%Ynwl+QeZg7*#=8!MIjlR1pTz9UCC zcGL1!t*3?lVFsm?%KX{yVlDPiN0+*NRk_662Cx9w0-E!R(%~+)7QDOfB|#(0x8qp+ z`h^4a#Fj88hwmi^uC3E-o_Ad@?FMHl0!_`RZ{YmQ?o_pw2X1&_`1l4VSG;n`X!n8L z$;Y#OcejrzSc~PB1-OR<%9GNlu{V5v@+n62g9dbW#A--q)}Qq>HnK9km=hW-6SnSZ zWL-X17l_tQIs4mtG)~mnlpFqvY8;eYC7uuQ`D`&CHvzM4>xrah?PgXW!_8n+(Lr|_ zso@fl25(QhwE4#fzX1L@T$}+&X0n*|4=R1L{?k;E9$+CdXEPb*!2fqH7wEy(xC(BQ z2cPt)DQdZ5qh^Ek@xbDmC?eBY#o)cy^=ZzH)}r8D1MtzRSikW7K`kX${reJRu0FR9 z1AG7njo=OPU{PT#bdUfh5=+G~fV^l0A^@r`@*QLG~w>!@tbg@yV?d>$S zlIIW{xL$oPr^%QdV7$)!kJU<>`;5l*J7VponFVw2ooG>z{VY{Crd#9sY6}$7EpjGz z(u4hO&b=l0;r92ZLnq)Nvkv=exwtzFc=P%iq2PM0EGz~TY?_3@CVS!Sma|QQdtFj{ zrW%?G5<0x&Qn{(2o-?P>m?1*U`$x3=FoRqRF~qj`Hix4SG}kYj0G-@ZWFaJ!`F*ejt3V)sal32J5n(cB@pgXLjMzrq-3Yw^Bs!FHq^541=OJm*Wg{b{uGgG- zH#PCfUc)sE$-^M8ZfRzDIjMk_ZH?rEli_t*?Q$1C$2Ja}OC@xCtdlWlJWy98-Q>ra z#FdSacS*b%ljmWQ@r>fQO7NBW0YZ)gc*BDE>ZNL@i;%2iH*>)9H!Q1sjZ%%bqu+7K z&>=;&k@QhwsbI+k*VY3!A>aE6z7o0BS;_qHT8Yc3o!4aMY|eIX%s(sU-(?WI`=p!W z;Z5aDQ_fsg7gTCF@R#EbvC4Gld3CCheN+1M6iv z&i)GO&YqT$P~1iCSWe1a>ye7GDlT4pEp96w^Y)6-*E}KR^#>jHp zD=sV(|Nf#uR-vEL_euH7G6P2Pj>%X01ypY3TO;UycL9jMmsQoQ)Q|n0lYb^$`!$Ey z5(S@xd;}R@Redo1)r(PJgWzFoTeWPMBrtZ1XYfy5j7C9(!vc!Z>6$F9b4pm-7uMec zyv(`UuIekLi*bLO*!QX+I7DC~=O1Cy&kxm=8d}$f<)>9B;0+}f#$ZHqQ5iP_Iu0|( zs}kt2X0nYHl?2P5$Jx>$b}Bqlddt|l7vaj*iFH?t5a&!I-p^TA@OT&hH9|xEHmLmE z6oN`&l!>QR&|t$LD^vm*GLdHIDd#iA(eEj@SS7Ax8-f?4^TL&{>Y)t0q4q~@pC8El zAHy;WVOTM(Z!d(znupIx=TM>qUm)=wl~~MCi|sznc0O%pq0j^efcS>K;ZaislfP`J zFKW1Z1ABeDA2uG=`vSBD$S!&zJ|h19`}@_C$R7{B-V>&o$9@!%SMDN<@C_-a8JduQ zSS)8pketx%hQ@{oZ&VaH=YSp8PUE%6)l;J}&v7uvV*V%GHsr3;-;B2|>r|i1tNk(E zr1BKjMs`tBTLl)b*kut`sQpR*Hp=djog0PaE2&J>F8hhrQmaC1i;+8z-V>Z#TVG8x z$tznzbl)Be!H)DqlZ|9sYIZa;rZ1Vt+r0POjRh(EH&0nfoVJ?D@vM+;-9-}$89o?` zK|lG(A4a@gqkKl~AO??n3m*hcFW73bh|M{p;YTdcZV{=T_Af%eKdlP~K{@OE!Xj-+ zF^YveZ>|C!b987ZkjcTF!7GfYQotx-3n)?HL9ZKO@!`_-3X5v03U@zToQykhSq@MK24&+I?_$dNS^zqn?3n~&XDo?2N0 z+H+&e^3Qz*m@516x-0=;=nU`$zyak&5s>g&r_j{%egiTQhD(-3j2{L^(bKi2xZ$Gr zC5;K|vb1DD4p5$#mf!~@2ZHe4wjW&>yD8`e^~(!b!YNcJPW~f2X$gDPd?)>-Xp;$9 z31`N_BQvc7R;tTF!A2#O%%4-vI_*=9n3#|)s@?|Ov+&ysB?V{Czz0&;qNN|5Xks#$ z<)#^N;AU?>cLiB36U92dq!)U&C{;kDdRG=MIse|~DYLki5o;@0{9X9{Nv*7Ma^mtU z($w%^1chnm^W!n4z@#`0l3zP*k$roTXS>Qs8*&v^RnX-CLZ<5n37mB4sZs`afuC;% zg~RtpOV^x;07zpvP4m(Ca=(foPr}a+=U3>!`<9)M-orA{Z>^qX!5;{jyXnw4P&H)T z3TLX9N-afLro-L|b=uWrShu@4$-HsiyGYLimAjMd3+d&K6Dof#p7L%JIvMPSXkD{v zw>7Z1tTUvVt-z(f&1%>JC5Fn~ zqEwM#*UBzFkKES}S6BkhYfKSQPa7R4UgZtdj_E!Q2u6%(j(BljkU`Hfxlu0VYh@(0 zt)n8#LU@L0nI&NPB`uYKvZbEoQU7=%lsyNnphRB( zQQx=bYc^TI;hfq8nT{lnWKHNvXkCSxE;WDKrnB8!0`yl>3YZLoN>RsDiXZ7LSqhm5 z*+DXI!K=;2C8O^uxl*|ryGGP}EI6!i)7@kLd@TMZ9zC+502;H$&w(^6^TAdt!QI?#%LXt18e)jKBL^QDH*w7iEn< z0^%O3`K>zB>k;XPO#?i_aXp`dhltNF%HK35MEtOZ9#ejCZ>dsHtVuOt7|yO7Ng17q z*i;CP`1I1brn`Ny*|G1GPCsj`yk*Y7)5&h_*9X>5hexhz^L8SV0gbj`S0e#Aies_b zmaP=aG||BV+V|8Hn+2z_$5a4n3$}lGTjf#S!@5691w$bIgDP{JuS9#s3M7c$3rTt~ z-8^v^tX9v57Re!lG-N@5e{_pY(?TAr2zm;fj*}4wp>ZIwoWgKvq?2D<};DuO`rcZ>orH5ZpaEQIe9hVRwBcv%~>|+)9s)0U337p_yzE|l94P83E^$fp0BEb2v~|)nQN2QT8MGjeIyFA>)ZQv{cpXA z)Y>^N0!_-Qif_qGDbO(xhHWr9T$CXAxl-x5oh^VJv`KD@pnfU@CZn+nWoMdFr~K>z zK6W4gE%JcWGYLQrsc!0AyM9);mMSc3!V{V)m)*b(#cj3p4;`{#8{f}s|4Yxh z(W=M1kljT|YqTzU4bvO}yrExm-s~W2^wC>BBrl&KHdhf6f0+*eL6LrPIV@*4vVv3< z4N~(JiD$F(+@OA*GSklMVBZLUsZ`cK7N~$iJQ`<-!Byo9Y zGKWjf^O{B3-4~&_lbMFzIU^iL8;~q@FS}ATgLW4*(^Af}XssZ?W4dT3(2w!%ZVJ75 zM*3W>vO#q5N#NGro!=9fsXf6zrB!dX2aXP*qd?--C^sNf0QuqG2yJ82Zgt3Txpwrn z=f50U!1k3i@6`az5#-Avd$1RNe7sC7v$RgqwaqC1NB_QM{}r#UyBoKXGHO1HUJ($UhXu1|#|dMDGH5YM7g@oxQuE*MH~lN@WTdkhWe~QsTzzo1dNk*ckweZnYqcAW@KDm;1X9XY;%nO8N{x zd}r@i)%0UxVSq$o(O_HxAN$|{K>hRHLPS)FBrNmKUV{bmlUZB6iXHNr9R7f`nJJn~ zy1%bn$3_&7RoA#nPY~(AcKbMJG77B`0Gdkt;t-l$;xEH{B81d2#|j0$m7!<^zQF#a zFL!-9NXDaEvS-sUJ5slit25niQ*_3@^6n%Ov}amC4c^PoLSIl>W(BUzJsgiA$h*#{qu_8ra+1b?^JTT7v5;mjaUWpjr3u@0PB+#L;S>S^Ao=6HPC_NIi{@39a8 z@1rp=SY{l1k@!Lnva9*{bHj+$+A#eEl9ccB#r^Zc3fuKiB$Rjb91(>4Vow ze)~KwKh4}E>NW7%c2cTuc0Z(gtj~8Ztfbm@>=N6$k)n@_+!oZ&`1u*|A#R2KohP26 z^mpgM!Vlf$^+_2c~P@1AqL6c;y zU057REW-F6fX0Lx9pp7nHOLSy0ho)^jKb}wOXOv4w%G2y94qWL||h`-L3NZdwFRo9PAladwNP7G^y zQu?-wEu5J&o(j>QmbW#U15u$LLtng(UB|o35(`kC>sYQ$&xz)5xI14rM$V`^?St&H z+9~)_4!XaNS55l9zSL=0pkIPh`1SlTYV<%`+|q^x!_=8OZA!<#q$}o9C_0Q++%M z{-);RECZN=aJ7u7@woHx_XzOQq|kQq`2a7i4AtHXx))!XBP%=ZEcg)$H5;-+n&!+X z9^MxI-`fES+d3fj3&^(F6gKU2nx2gV*sikmh_6vZ+(|J9iYz2fu;9~d9l#CPXrm#k zPfknOHWxh!MF80U)jk$XtuZ5n!X_H|3}6^ePF@&G;E06&z$$J4rUd-bbvgc|{{_vCjiK__h2KNqA{P-~u^~Fz^dg>Pqu>lwg5y(N%<9^^&JQ*5M^@ zKSfqL0u{~?D#so88>7KYgT52=#Aq>i$(VH!n~yO94X;hxdXDdqT!* zUCj_7`wWFwG6R@m6unS!@yxNh9M_eagU2h^hHb4d7`UwdNr`NPoLwK9mr(mOc4z@A zS(nWeTIQ8b^Vlo40aYPF!-&5(l!Z);Uv2W`(O9H0`u1X?f+&*sIV!?uL$5)B4F255 zs4Mo==u#?FRBmfXqt@+>mu9PTZpU(e_}%dZPS?;81$w}AvFJ}XZg?ql{$B*}|0svC zF6TL6ZuFjpc2V5fxpfxU*QeR>QxRga!UIR$$p#yHA83l4h}6>lIsx~0R+;|@>1lm! zbq(!?Tv$Q}-;Bz9YM38+HzS4!ydaDG!JttvP|oYR`#sp~GPCyL?M-hQeLsux=2k$5 zj_vC`EY_{S#qBiISE=X04Rw@@rURwfTxbrq&Puzzh~_spj`dmplXjf(RP^Nz$57`WeNifj?k>+wG$oHO-8M`_d{| zsqvIuws|WDQAz3P(M&vDs=_1wOQFU8CF(?IEs1fgvPE39O2Z4c+z!X1?AnHTJ_Y)x0oG4!59X>t;|3FJvuOM?qp%OL zGJf_posTZs`P^?+9FlCm*!Pp1W@%IOvM1wJUxk0||0X3uQ&d zoPYGn=vTq0`pR|0b$bm@-Bk9yBwZ{w|7D$9riCBVRCJbiCMl}ZI{Wxd^~^@NqeVnL zzCyieC4{M`mWdj_$h@{`c@N5Y$=qA?37pADVeZhX#@~O(Y-ieoS{~sN+5Jh5T+)Ko z;NCLrBHQUnpuALulKvF}YKTJzWFHNV4>O7VuAjRyX!Uiu$7cVX!{<3_NtP z0Z-^KJce+oQscx8sTtJ2su;AaXc-yUPj`;I`l=|u`sMcr5A?6za0DYa|3T%yL7K6}@}a96&<%q23$V?qm}~b&Q-f{IQ$0+v|*Bf~}@NDUbXW zH_1rstS0`*htbg`+cSkP<_z3v$zgV~SS3d%^GWh&l+nK>y=gzkiO$e6x8dw% zcH18Hn)QL$hAl{zqt{d3bwilGugg1bvK85+wmg!V2XHVAI4M5XTy@JTGo@xx?%|!OK)=Uo$}U_XSy1lcTgk!_Rr*Jt z^SSxB)Yf;<#e5++S~Bf-?w^?^M_z?(tot8TzNcrv28Vtb%ePrW+rkAk?Z87f3Y3+$ z%WklB+LYQGEtpaal&VtY;`eAJ#Q7B-8 zHjm=dMWL{`{`f@Q9iD@O`%&|Dnlc*&#!{i@<=!SO4-uv?FR$i(i#~y(1rs)YOq4G= z*be4Rx3*sJ=`9aWCYyNJ2M1c@E@=|{{sL=N_vCor=Yae=VnES3KANzkV+{_ixTNoJ|#PHO$4#pe%fWqPWFCqe3+FEcQOIS#x zUgIM$d(n%pcX70meg8rte(c$X<`l-@iWZu1Wj+3jW!6VGXh;oIQd-HmWJ-`P<~Qhy zrrBd!kEfPMM1C%wgQ~0BzU&K3#X&8>k=8I^SyY~C>XbdQl88H-CD~;euslJ$tz5K7wea9~FtG;n42HQ*iEcEe+<0WH8-YFG1vDaG-IE!9ppe^#ywL;R8WX7(!P}dY zqmjc$JF`F}Jo9L9;EQMOus5$gKG=_NF}1#lvG{4D!)aN3<~Fq1*veB1JO?~FnI&j_ z+WqF^!(6o0kh`e$eUCTK_Iq_sxF`)wSLvMjO{rop(rC zIYnngx97litJ84JyH4~u#VWL)itRmeWQay8-pLyx5uT0gG37jc(36|qQ73ko6?FS$ zs$HalM?Uqvh1^TjINje%&Q)7_i;d-exlL3`7jNB{jy_wfipb&?$;v>B;ylFZD+=2| zkfoMJTLa%V2(rUc&|;S`%z?^d=hX*22{tlQ{uS|Cs$2ki$ZV(YGsJ1O>!YI2&!JK*Wnkmk+lc@d5)WA}}fHRw+nQfuG#M<_-01AV%qQ?{O+||}0 zGz)Cwj5gEEnz}>RkZy>7GQbI89UATOUzAk~5B{L8V|CxNyuC*1r`|;Rtx`Mz!q{8* zIUn3?lAQL$sleaEK)0HSAFhnvR{Zw+dQ3nzq;UEX(N<nFLr!U!%HHGa2sn)`g} z%cBG%wVv#uDW~ z^f8f`A5InTp&pQj=Rex}5ftQYaeEBtRmEekvEpzK5nf1CPtf-#(LH zKHRT9H>j2xj_X)S!E01ACwQYJZX8wgH$H6;D=Uc`Pq~)a#;#sY2LzDo2g}F3Ubk0> z2)?S(a;`t3)Z!f)NCZZkGZ>R~QQRsu2f`E8uTD3Mi0qisj)ku~i)}xP1UVB5h^5o* z^)vsz4({Atb@dO>;t8w&%)6jZb{Ah&uCK=|kL+Y#@${k8MJw0Fil9!i%;+%l@2M9( zeW3BE`cyTA zI-h+=$vcZ_-`5a$UCo;=8Yk*(rDgcp=S-cvfd1VTe!h+JW-ZJ^urXQ_6*}b~?aUnH z8t9FUwc}~u6k?6jRPW-BA$2Lf%HsYsNwMe}jY2jqzmPRJ&-6L6tfTFiEmCST?Ax%3 z+X?61kfQhDCRY#&VQPIBophK_I5G&Y)?s?s#PLU*=0>~@e`XD`qLR6CmW*Niyo_QB zk{U<8SnL}{m=Y4plkF-`YUf2gPB8s4+*|X^E=y+Ggx8pLx-)F)OR194PpnH}>qTqB zTYyBihha<}iF1pgscG((4xct-F^0Pv8dJd+J7wCY!Nt%Tk)qJk+ymw8hcX?P?{XOI-1p5!CRW^*8R;iFB#VLjuknl!x zy=85JC`R<0b>uMkhf?B%yZoQ)C|rRGbXs}Rkz3@D67RzCio>`E0c~2-X5c2tHxDV) zjhot*C!bp0r-RxFzU}O0#k5)=h5M$`0G-6V^jjTZY| z;e_pd!mo;gTrJnWr(GC%?sb+fKlt$m1;4{8t8V{LS%laC(9TrWmhGz^VYa!_ESPnE z`-AXY=B+MpFo46;I+ZfmZ%EV{4KkF7@?&25#2fzvlWMWRyd;|s-kq2&XaS|kO0~^r zS!j^9PQutRy{^!_3IdSF*}&8R9#5@Vza%a!3DtjK_Cg#J5*83;)afY`=q%bATDw-) z(|GwV*R8Avu=KAiTvO;59P%<5)~S8ajN_R&ZFBc{=b^WC^Q$D7{v$5zvK4@2OeKZ> zr##V;Y3G~gex>)`#wHoqXw`b$Yk?)dS~E$tR^`YWd@nWHf8(E1`FiCz)YX4H?;F-5 zm9Z|W9=Eruka{9R5=?gpD@%>jQNFlK(pF+Np8lA6ZCIRM?F`fsIG(H=d#3dO{-CSkl8_w{9EKl8X`ayQPnIP~nZ-aP;D@3OtkihSTl^1ed+{XK?i{ot&5XjvwdP2(alwN^x78kd+8s zRdn+J`U-@4ru65%qwg`+2+31a6iRdOB_2cD=)advT@``f4-Ey}j`fny}&4eH3X| zD#Y7ZUj#*Ap8HkfRDIdN={1bfWj{v7>1F>V&K^-H1lfVOjZd{^@*DyPvp;!tzBiec z3Dd5NmJz)Ev61W}(fdBw_ceu-?b*ohlq zDqprQ(8{N}a1+k85O+)HeTsvG-*T(#s37^+@ESjoqd^PJ=W#RN=5oM*NO<=kweOow z%D*r~yJjOxxMQ>bo=*vkB@3$vxde)&0QE~lw!?SE`0tngJ=q`y0;cujlbDqYq`Iz? z-W!??MZZcs=9B7XTvPIJh%5Y0iEA(eVKz^5hICO8BdxZud)jdb{k6}kjyjvcq4v{xSmou+AOvt z1E3#Fz!)h#kHhNYQX;<1Vg>+o>n~kIF$@(dz_IZubkKKqkP2x!N%rdcT-+8#p6IPt z9P*r1=9iuK>^8yr&TtH7T2)y*Vbyrex_LnEQpPI@`u5!r61|Rdysr%!yvIRNpTqND zaOmpO?2wM6^QhVqSptnDds(3@At``{;~d{V7@UE@>}Zd)5O$l5p%|=<5T*I&?V*_0 z$SU3lwa}rWShKbOiVJbUc<5nCz<8qs+5SD)LmlFnfg+9o*WSRCSwTC+ecfCy1MSS& z{;(QA(-0yyMhFUHTLQSr5(-9rx4_*&93IesUl*lXt|(~$8WZ>L-NHh9d&k2n7W3Ce z0c94UpncqE^ftq&Pzs3zs^`UJ;qP@trVi+c^PFV9n@P(rIA}44rJ&&S`BsPdrN}(^ zsvdv5-E93z2DKMGFQAGwUCEW(U^5I(4sJbhW#q3(61eY>oT&Z2eTu3Jqxo4XKi8-_ zjiFWhPA%iJUW^{kNOuZ>s>!t+On7Ho-s`h^i(LqiYJTx!rUKqosoF?;R5A7CSKo_n zD9={=F42{ErsBlbvLxB>zmCMQ@_+<6@z!)H>>xwG5So&nS%tZ8T(*u}l*ZAf3Zt|F zLN57#;b-SIW|C7K1r&52sh~`6IM&t-11)L#E|D-~Wb6|;4F}&3a8H|{C24Vn1bST< z2=jL#PZg8&i#UZ2pQSzk^gR6uSPsN8dv@@z;arK`m%5@Z7!FN%|A(!w42yE@+MWQ0 z?q(=KQc{tj2NjeMkrwHeat0(NhDJd^LWv=jP>@s@LKwP35kUkQ8Y$_H?`H4)?B{)t z_xr`c{9tbG>$=vp)_I=mT(HcTd->;g&y&Ai>izmbb_zM04R;JIu%kT^>}4vipXVX1 zw!M9BMZKW4kpWe$N|!D`!l82qnV4EIjuqk^x-#ZgGg-i+)4|_Yp_inDq&ABK>k_ub z$&it-Xu8zMW*QLtjBcwq^(zj_^E2h$v!`2ug6>yQcbgl{j3yo(Ob89g3uK4T2h`TF zUqeCVxi;E*GdqT>(XARbm^T0ZQP#Mv`AK($hR5_xotH>3+AY4hBnq)mV-9H2SSP<1 zcw$-^94V(V8$;nPqd0KOLI_MjMW}lbdXs1g-6|IFp>y=j7BXV2!(C~KyEN^}66sH0 z$|6CutVFtQecZ>0mDFMG6D{U-DbvH=*7avF8r_Mnmy z&H!^tPI$l-f(4Wn7T9))y1-3N0E1=~f>_z@rX2glfiIhBJsh}`HR}lY8LPxyMGA$4 zfy~jG(<@_DQ$b>wr0pY)u6FS_p9ypnL@rNf;Jo6d+@~M4&ZkGa(h{If$G*pMqI)FQ<%4b!WcDCUWD&p2X&r}8*aB+w|gW?5} zcfN5fi!1zDH<>yw4cFvzvG5F<*rH-%UgL5;KZ*)r6`k_2q|r|9iP^?x%7rDao$e$P zQyMJQtq8wdOloE8ASaqN3s5|`+R??X%2{1lP=HVveKTs$A3T6CHBw; z69u%RP%A)qx6ij{DSNNtzq3SHKLMHnD~9ECpl3VmeVh8IhgkZ$y3Rm$ps%brKEC4v z(b+P$V864yPmAUQ%6q3*kJ#4^!Yrigg8kJ0%zse|?KY7@}1WFG3!-qi06*7|qi8zQ*N9 z6yIbc)>um>hTxTu2~p(_`tuORlW#zhP8bVwvuAUV#wQ0V4oUPo#-43yHwDy82QL5C zPp0P(oO)b?;DbgU>TyX)YIqIMNt%Wc zrv{vppPvl0hzwM8Q?g0N((n-JAgokD4>s;eYsM+H4!SQgAF~qRAyb#m=#`;eTm;4yx?-5|GM{Xulpp)cTlE+cA}F=99#PEmwN4&qJEq!;)}LQ1p4kdb z0!-7#e@_&E)WA5hHis0EJsj?{`<#i*?u7r z%!b&H-oc87G0*KCtFL)aX;{$;zF;@P2f3HS(ivxzZGFcq3SCoOZ=NlvFbGZ1@yA?C zmUx(6&8cxouqg_91z^Hijy^?nK6e8>(YAbPeB}V1B68orh&U>&G^9a1R^8G*3espr zZG`XeVw^DBIMt0Z=SwjD=gZ#XaL6+5<$m_L2z)K2>P*1cN zfjFF0cZ)*}#q$AeL$_haRzH00v8s-DAo##~3s#4W$9<+aYXN~uoi9kSDnrsXz}MuZf$$#mjK+3rrSLs`i? zlY9Lit$~yE4(cS?hZqIn3Qi*1Kk`I7h7)h#Ec#@5-O{Bp^W1Gf8@V{H|9QdjC0vz`{o-OR4{YuroPyw{y4#R4~;kkn$IvJ6Y2S_q{-8x!#K zL%n@w|Jq?T!3N1mv7oAO@;Rlg)In-XfSiBw%X13`Sv+0FbH76n3inJI@ zaoj7R*hL4wor-B}0(GLYo(6w+KU2K)y$?4T&4qc{nC{n%?yyu*^755~`dML3ymi9# z{btt9*EiDxaNCkOzcc$MG4{#FEyk-;r_0jFe18mMqQpl45uz<+rC55<8vv*nD$P)X!SUld8dWC`mOOmO(&{EZm?7~WSL^7no`pCaqBle zKQ2KQeOPE_Kr?4@=iP!>BFA*^Rkw^i=`Hv`93N>xg&;_ptlsD9oPKCPE>nF~Y#{fs z%Z_j?bl~|bp+}GGkDj4{$$xiUOFqUfMt^s+duZp8SdzeL^eO$5%5u%9_4xK{7AKA# zNOkB_TF9>(wZUh4{$59-Wqv<^m(`~_1R-#M9tcB)y6dLg%*LF^nsfX+pm~|j6jMlV~!S1e8 zjhSh>KFZbL>%yHsL1mx;`6uEjms-U^%0jmEJc&mmJ$f&sb-Zmg^7Sj=CwX24pO^usR6lnCr`)LQ*Em= z7MaW(wYrlrfZ}c6cc3D950Iw$rHEP|U-2K(%guNCC%!Q9HoSHX0mWH*BTSA|p zzrPbb&Wq1or3{nyRmP7d3bK;M&j#$sq(a|tQpVj;Xy7*Lx;Ne)C-rF=muV~~v0k$a z`34dQ;c%fJOnY0oB3P=FIE~Q%T(Cniul;c8reu9(;rcsdokWM$l*+u^k9y;^e%~XK_RQYf zmYI6SAm}7`ZY0;-yqT*;-aF>AwZgDU6cZu3ykR5IVfco03#BDmg!aDc{MJ2H2vWCokUD8OjjDg~8XE8Shhlr6bj~HUNzBVtZcvBy?N8g;f&R@AQ7fIP4M&eWN1vSq<>IU| z8lfE_3q!rJqZnO_I5h`XEu{g3nP3kY_T$f=A-8#Wk=Oq;&U-It6rK-V_HOrBxf&XH zdC-%x9Hom0t3_CHpnCC$f=qo0mB+sY{jT4o&$!Mv5oO5Jxy?I}FQ@=?RWee1w{kbr zUl+yrMgcnGTk9)U?qbgtH?w_b$Rf}l=R;03e^mrPVGyF2i-E}b%}CA#2$sL6Fe<`;M%v$j@rIE9plL`TF{hG1fV9)3)!Z9n*{()LQnDpZ zJFgzk`jERPyXajM96VLzJmn-bcp-1ZBA~{6$wP)~;c;3RtFWcN6OraDHCB217| z0TV{Z23=baw!_ln>VEX^{Nfc>op-)Airi_4juJQN;~aOlzua1+tiXcKi`mUbneLGJ>FWhxxw>t(2L68RA1O@sZIWTvqPJu_-!i{r=H&;VjHq>_YrkQb} zYoLcBV>z+483X!-brD_d)WVIA*ur=}uu+1CDt$*Bj%HDmKXO@~ULY>-?zDi(b+ni_ zU?@@^o?tT7Ez$(Z?zQz9?^r3nv#iMhDe>`o1xbY6URcK6r;t&vm=-ag6^Q6#T0kX)*l#`$1C zpT3npZrsb>E8rSA!ja>=L#}_F21Rmbdgbv64KJ^W{EJMh8{lrqAxJ6_q1Rhk1zggm zWU6oE-9_NW4ilfvoVQDl6hGs5bcgX~4dwe(q9y({MTM^N;rQ-*^PAnNuJgKF_Wfty zT}WJpjQvtIl}`8jZ-UBWlc1IPV%Z)JSffehHHxBEuW;n!Uy&a5XNq?O8K!UesNNf< zQskhDE$}*k6W!^U%c$0~v6<{lj_3QRvoQO-VqNixNgR0Z^>xLR*??$&kxpzOb>NZS zgZL!3%aIY}+++7jsYk0Q=<3=10Mt89X=ryXUqz42V#$6eN0ofe_ha7+!4s}XK8m2i z>u%!)1Nu1iRvA*G(x{ksp>jWb>|#X+fNeEDjBkTUf%Pnl6cgSZCS8+cPC$0td(9WI649 zzug5{(FN9b?0=b^H7ZNED-;M~Ol^WJRM8ZR`tMjQQv$(FMB(VY^_QOPW?yZl$y-Oa zNOUTe=gw;nret*|wz4NSVn8D9HJP*)CY{tc{C%;s!Dl3JsW@4bY%2m}{hVSjFCw{R zF|xelq{&V7s$-W&PQ}& zQNf$sKkTT+F~DO`W@C5nZUuJsoK{}TQs`V`B!Y4A-)kzFWm`fVt~C7^^`yMQ8uiDG ze|2m=x5Wo|*zue}gTR6NeT@r;*j_~j}5;Ak5 zY5FPq_?LFEaoMY>c`W>|F?hQ7gb{my#(_GFsamvMi2SU3j zh>070v&$Xd>t%Nzj&b#h((}^deQr!;MU6HV7iY-t$gMEq|G?mH^0i*mL+Z=x)|S4! z`7p)J=0+w-BM?ki6z#ZueEH3>i`-v$OaK#dgP6-30i$5VtHMN`X6i^n930t{kx1T9 z4-_ZyZ3gJ?936~2=~uj`J6@ioQT2SthlqU)43DJ)QFnv|&4L|Ch*k;gw1d7*dc@N2 zF)e~@hMK+aAh$rCv>Tt$v+74NVPxR2OEj{MXtB_g^kSnAB8wa)IhOU_ZfTaHq?kBP zyp#?Cvzki`S?gy-SFwi>kuDq2F7}+e1gK)^_|&^Z2%HMu$u4$%Qw6WZVI5Mthc{#e zrlvgAd&j5Y!MkP}zf$&^EvKYS7gKf=s*V>7vU6_V&|^0@7X9kM+v95aDd3j@4=py# z<;^8Z0jv9A0I{GS!z?!Uv>>NN4unGK+(zZ0Tcl_QQ1><%#fgeF-`}KRj3AD!8}-VPoi>F>&8Fi2Yh0$ zGCRi5_M_8$?nA8xc3FT+Hecuubo1y()r7(Vw&hdyW&F;1 z9{5e@h?E`0H%3<8eDRrjm>M!LEzT!NnZtqCsOCSC+JKyv_ft!+$@yyssk}ivQ6--_ zSAr5)skAdaCRmF!7J`T?u9MEGw>(8`n4ps9AVu=p^#=!;b5kXE_O4SR=7s&gFqpMJ zmrO8@Z;oexOU76|AodVX6gHM_JUen3ue6T|h{~vy>?5{m)NaO>sPKE!!uBH*a%4)Q zz_a*i@OC1(rDcgyY3}i4z}5bsMYp44+xRc~e@*V|0K9nU_o&5|N5!U?3;4#< zecc2;?VNA7f?jx13_Kz!cuD7Rj7rd$_}oi1p1Q|&FwGHVu#?sFpj6yiQI>wrE@5hR z#}>o_s-!+!C0&Amo>{X>pgLpG-8P3=EVLS1V``3jS2U~Zhf*uGByc0CK^Aj}R*s?l zF_|XaiH1K#8>ck-q*J1_j&N?)+Y^2S&AE`bGi*awzRjz1WyCAc)cnbp!t?S^1^FSl zENRKrUQop6fBNydGoGJ4FL=UO!HSO~zl17s>tpc!OfwS<+=6v;`_V9IY3;?d9E03o zkK14zpfuk5Dg8P+!ZrQcqf0RYX3lYfKK>6;4ILa#ko8yN@0! z{&Sr6e(!N9z<2Bm#1+NI5n?BhMi9~V=1FrTvgA!=O47-x z$p(h4fL+QZ+^^uN_umy}ZJDm&LCOX0ALDZ*CIXsWR%1p<2JY*23gr*}lZZXY2N{Jv zXbSp_zYcngx;c@R5QUMzaQluifH;#JEjT1Q@$!3)nTU$w*N3B|xYoIEK(6L=c5+Bh zbT$Yy#~YFNYr7r1*jxtshqWX=--_RSL3-lw<*!r^X(WPi;aBXV@rnSg;w zL!%qZ1*D}d*Gtx&knq`pFh{&3NgtR9stfB*mI=IW-*>E~#IZy&ze=Fm+Ej|MJ9<2> z7W{O7UCd1s!$<#{`>#OfVF*^hLU9bu4ONbVuX1jfWf0^^rlwQ%T_$i9NCngjaEV?f z^bxHtYZsVL7UqEG*a5H0;+Su8K}t6ixIokkY-l%PQdn~jlW+Tz5&u!YgBt5{nYs+?RplpyJVBWWgsjoRRXfWGZCq9?QCqO#0RT{PJl zCto}HskL?N3o&nR2H!X7H)S-c_!?2V{W$&B0F51su%VVZ-&9Sp6V}*jiD4@b$Wvq7>i`e>ex$JD?dNR%Q`PJUZ_8Pjur&In{ z>nt(LU;9ahF6B_bbU1`Me4@rFb8nyS7UCu2$e99VAI@&oG@(nHbt+tpdKIH%f*&4< zx|EH@{z%>qd@SJ-%z3=RPL>!+5%*)Xaq^6PTlJt6nSRxg8eIKnv@9F3I@bGpW#T?) z=m_wGzcOlQQbdBGW|oYI5eCtL3NTuMEWW*&zZM3KsG_%L<5hZOcz4=noTF8Rn~}CM z-p82l5o~+IbCzH;t=Xyvaf47?)>GGSLeAaW^%!${UvYVUksc3=XR9dA%jFy~^8$Q1 z5%DWA*^0gB4wkIxO2~G=-n;(x$Q9_EwP;31(=h>;h+mXHqj!j@)Gc6}6n~515;Nwa z{4%VJ^=w&@%|V@65arNAqe%x4lwofxJ{eXAyaIzwBOIbw4$I?i48IvImWjak`^=a_SMJTu&?Y&2%U0n6%gW za<;t2;@NTV94^vaK*7%nJ`lC-vorJO(2POtJ~q3heE*U6kcN^+D!jxzcR)6;kpHL` zt>Q4B78n-F`fL7>--)xwQ%jHgTu1WQCOBDX5Otq@P=o37W1>p&Z+<(Z+$vo0f|(0X zIg_~k6VCQmOo=^Wh5QI?QuL@REq)Yn`54b{VuHssvFP?gK!ZrS-i!Oyo~M=i^8!vY zV|ag6XOA1^ruuJOx<@XQkaRDO+1<`Il#~V|NlM>(*AVdo6s}6k41y~jYvB%^E${!L zUP;ZU!Z;-)CMC5CcP6WHjo(%f$W>16Y%F3~n~@2^*Pk}6dM&%0lY=@!iu;p=_3iQj`9{Z3 z0`JWemd0D+p@*~^m?>URJbG2;-9>VikV#Ic>o~*D$(MeX{1F#`jo;t`vmh)9<0K)x zW09UzJ=3OLW?H$5TdUo!Rg1*_FZ{nyLmD>N7ezisDH1vHv2}HRi&>E#h9$8S1@#;M zO`vr>Ag09yL>n($kKcx$)OyTok~yp2+gqO$U3>vFz;yLAyg}(>08+;VK`~(sGA`d~Aya+W%Sb+K6xyN#KJr5Lm(cbzZ?_$< zW_^$@C4ug zxE5=%5s`dqEmfbZcIVW=vf8O?OPl+yQg>(k{aYE;jIGCPv~4?`JKc>`r!}p>5RyxS zqHix>)}wD70BQ7{IdR*nomQxnL_)}Zvc>n94rdo41 z#eIgrPNxprExFWZSg&Q%z-T#is8PcqiJbEYx*mkK48z5SnePleZctY#4~DnOynTE)fcGFcovPB{M z=k)&oI~R=ah9NQpZmG64^mO7|Bn7pR+^r!NNcjfxMgkLoSy56oypklf`8xFTn5E?- z$ybj!)-v`a<*dflxI#%cVwr}AWRVKK=fIWFb(cIA%3uL{0$Psckfk1Z^cTPbFv`yv zC26VMQMMz36J4EcBm!|LTMpT}KrlQ0n(wVm5mk)i$>j-y=GpwIX9{gcb-?#x?6!G6&uM?t#x>*mzo z$9kVha@1!#sZ`B6m8UN2hyF|m zn5y^OE&DqhA%k@BAo&Ba7vY|yR-6s{5mqS9a3)XiLo1F_L)57alFh8lj-;)8B@BP{ z=~D-eQon@9W{^)NIj~ZxiODnX>y{`-5ek%8_v$}u(v+;vS_vlPx-Fxf` zpv#+~{CycgUN4*Hy>c6fJ>q#4R;K*9@^NpV?)N$0Ml_}NzrCtq-%6N&vUb85xE(XxOFaAz(e~Hyyz;XSO?L8{ch1N_w)!0gSOqj7{ zpy8Gk!wWYO{>st(GQ*4Ws7p*93Bi2{;rNOB5%NqI%MsfO0^P$-ZBRb-CJM5i;VO2X z0V6s<(jniFx>xr)sdjeg1@r@Y$EM+cuu7CbuL#{yZK3j+z^W?ju8h_gof;rIsg`Y0 zQU_Jeu?u}^HxXsfM#I|~JIc@M?gC%8RS&^YOVb>ioXr2I`DuAoVl~b2KPFQun=1YTu{Y;4GXd~&7in}fpW*6leP*bagJBKVZ&%hQG?W(8K`{p=6 zutAJFCFt$Oi~FL-S!+Dhr7^eT;KIQBjlp~E%wtRn2A((cNSNKFd$RuYr0Vf4(~E3i zPK~%6*V7U~G2b{~?lY;zAfTNy(;nkkSKOfr^L*@mrw}#W!rb==$p*!xI$ra>4BTYy zx-{b|KI?Fc9v7@aMWs|0RczSS0yfh7KGzT}q;eYbMjUY|`|RRQG|WK?Tfsa*s)Tev zU*`Z>v_fA;rXgsoHgWGMUm@Ue5Sg=Hw%8C9;dzwHJ?y>xil5|IwsIV_ln-Sdl4FmX zdpE4RVA!!Mzmps;=lET&YtV6UJyBGbWRQY1`DL2G{U*oK=2eb?(SsMgudEkeQ&3+? zd-t{G%31tI@O-2@=)hoCjDACD54{mMejN%Uxnes-OOuLaq0*T-Uz8+ycQtV+a^7_I zcSe)qHzpxVfT9DggNTt5uP-LUlkv07^ge5E3DI}7IFeav;2B1kEM4(RUor_LLKnmF za6F??StDY9%sfe2I;i;1Nt3HtRA11+-4fck`+R?tiy!KI=i;!WUHtY=AChmqso0i) zr-GG!!}zUHXxq6-e7yeG-uvrj5F))u{d#ZHm6MyHECMzGBUkEZVloDn-(bYyG|9Wi zJn5WYn>B?oXhKd{1y3|+gF2`IaQ8|gU!2=o)XVrQ72*+PDi1?!FZ3rF3QARk{0YX$ zk~B8+D?y%v2&|6mIQ)D^Pg1H`^NXhn4Phf+LA2J2IKTLymRGDHTDUJ5E1B441YpV) z=~pX`9R|;8XUZGKtqtYgd~|`I&d$w;6$I-4opSvnT@sQcw(Yz3coC=K{F4_8k;^sNYX?2;=pKH5N2gTRF0&GWz-cFaN!2W*ipNaJ4F8;8DdNT za^nJEdvwoS;||=R+x;^&1(B|@*&z8E!ti2J4WJ5gSP{zv8Bor9csQvqtQ#-4Ag60d z8Ewl0Z@A6rOORn6ZdT;~H7oZF%7vC7p9d2N$F%!ZXWQB5UHfYQwPBxsj$C`x_|JWF zW(;b2R)GWK=_h9KH#`tD(^*dU}&d~p_t%n zJx-T#5ovfre9mlAG=!)FRYyNOrBL%;UNw9pA;eowqQDrroyV4@Q90H4`BrY6_MeP2 zZ;$t`?k`|#0;^*>-2qKF-9_;<_EL~cQ%T)i&^wcB9wUPWOC6;ayO!$}vMFZ2&kDE# z2Lg$K1`SkiGd!_w!R+XO2!h^t3fd4JKr21nGoW4ks^?7h-+i+ol!Md}4`4h|MWn8F z_PZew7lVcn?Su{x*PR79mb#4myW_l^&?P)CI6gc0?16x*(H1!~?%hO%?d^&PE?IZ8 zS9_|W|14`47jbMcCDtBPf`35bm)eKFCGC!zJ^m~*Wdg&6ro00GA{0cTo0?Z9Kq%=q zz-0{*!abt7<2YI8Dqq_PZx+>CK8}F19K{K@*kS5lw)uzK zi-TI`du}Gp0M1Y}oP66Wb*dh~j_fT~faKSRr}MULVDZJ1AXSY(i#OXu@L&>(@(-3x zS)e-r-n&SN3p6Ow%|*7#A-JI?=2Z^B81mrrAbAu41Jdex{G&1-k2rwiRY~^`5(;^A zRL=&7D(0&p9pw?2AWYzF1!7=+rMFt31>etyF@v;hvu+NIya4O~7jrEEWkV zLj+c$Uh|ToP;NXByLpH`rH?d*J^s2j=VBowcyK_K&mRjvs}V_P2_cf$J$=+FW}_!X zbWveL;EhQ7COe)n={m?0Wy>wg4^X?2xIYdD63RpE zZ#9zm$MCMBebzTH3it5OThtuWFS_Ef_syEM4M|H271XEY-9s2&i;t}D!K4?+>%C#s*Y&|un z{4G(V5?VpdEBMG`GgM#mj2-An`2n_dItReEVTv{LhIHt-$)Y*XYfJv{Y-l{nd`TJ$~LQ8@jQ0}x;#KWD}nhlH8wqO`b}-|Er| zJ`Q~KN%r4lB?w6Hv98J`bu!|Gjc>Nx8rWO=*)9jeP+MKbbzO7*cE?EXon=!aQqI2j zReueNTA%=Q5!+LMG8K6H>w96M1?*X*yQq~*eQspp&XytA82&Gme}%A8XW~^9HIm5^LyRF0Dx0m2!OM9>qybhe)Mv&MzQ7y8RswLt;fSD-vyj+8NjH z&dAV?hTv`m6!NJzD^}V{MaJ$+A8TED)qX|Vc>-1KJ}H6{9`HjSTVS z1Av-m)&B-1MqgsauI_@Hu1GlIGpGUBp|MB-iO)NU6FWrF!?`zM#OSYIxKVLsF4XV{ z)G%xD#_R)g&#!cn+3uS1jhXPv&h*4lL~wA=Tlf$4fg`2p8!eDmt&y?cUb_d`EfYq8efdPfc zKS}QYEJ1aNPechcZOxZhe$dfYIFE=xVz;{mvvvE^WiAhaMxR{NtAu5Jkf;2h@^ML@ zKDZ+dfwrlJ`d>i9*QJ6Hep`0zioU2UhF>5#V3JeLMP3~`vSlXt>E=Jjptb;cG-uKm(UYq^_k`;Sc zZ2*JwCH&3k>4F%?K0mENB(#XJ(F$NS>8dahhAZDcXaRZ%76fctH`*9fl*H+&CnucG z+47*;H4QiAI{xulUS1y2fGYeFbGF(lFSGuik>b~FE<9(t|LguSehgwvoS!gVSUJ)g+Ld=E~S-`5U zk3WH0`Qh&JNPW?n)~-g4V>|?e222y~mnSL zV#EAeD{MQzay)L}-F^m?K#Eix*RKqcxnZzfU3ZRvo>zXP*r1o5!ap%5L68x&194<) z!@%XA+zG{Q`UC$bBMXb*{=jP7HIuhgXe!cx>q9S2Wk~FM>>M!O2OYSHTon^q>a|qG ziNPx94JVHMomIcIN5;MH|K@<_REPtn;fPkkc;TIwm!vJj$0U&Qh+v>#Yv_O{`VGYJ z!NS9QW5dIVLflYPb%2~HEx1*#Oea%b`Z}(eNzBw>AlSU_$$eTu2`=rme|Jp6AV5(I z#!%--L__Zo6-Q$VI%tfD(Us~>v+01%)nEeH6Z!sLs-!AF^u0vf{GAs*5)H5G|?Rbt;P*rg>`7uK@umH+WA5jnZzK_nFXKHKa@ zMCnsZ=#5MxZu;th{0(_of4QdAhW?*8u0c)Zka5+YcN*9DR1oi7BMEfHSF>22JzThN zGAV8mNRKOQBgT`kd`O*ZQ{z4o`l&>qvw*RP+*K7PF;*OU8Cd`L>DjN0t&AGiH*=|1 z&G=t<#pYcK*mM#wK3#il=!d(r>vkJ2I9SnOpzu2-qO~WQj<3jXd*R}0r=qP*PW|z5 z5;5cYqcY-^grzuG0Z16a+rPZIO(t6;^(Ed=@8bIMYV9VV%fsYAXp~M^Bj|~H?L0F( z0%esI?jh+%%<8!O?VYrr%#$TuUT=cl~pq&^caG~0+_44 zLiC%Szp^7MMjT)f(%#J`E(0LkQb5IEX+*Y{xhOMVwan(JIolau2)NJ&>&*ih2hore zxckA#K+5+w$bl4*qT|2*0?JF2K=GT^m|cQ{zMtoaFKu_Ra)|KKcP{X62)ncc>V4rVgmMVbvS0NE&b9}>UV+A^Ga`1KiVW`~n z^z`zpq?@rTj zpib6L^?H$Pnz?0SyepsMDOV-c>0Gh)b0>usNL0DRvZhjS@(sF+3xp6Oz`^kS3sZ8Efdv|d5G0B_O&{dYeiejOIXk$?Wpco{8FmNs80ef4TpWA9N)&~=zQY+flFIj{`aepYiwehE zBnLUb^qzy8``+iL`^-_83jztq_=N_gM0_ z88N$=R@g+C;jXz)m>994;0G@g_s?$7adO*B=3fhAR{ctke>vBhA)MF$8EdJzWgCRO z@oq8hW%1gS(8pU|0~Fp+fo?KJi)|9}I3e-*MAmSP@iQotvzxMslI5U%E@E`0qg>PQ z2Mbm10FNV`$0yt*#AnD`*NL^pE4;^5)vdtG`cZ_%(%aPnQb+U%d;1JCA6*xKbk zmN%^_*{sify;quj%_zTUz;gZn&gf)7P%$tenuI~4pksmp*%bdS%2^Ui9q3GOe z^t9G(?X~X3!t7V&+e-tozv|H=&K=4EEI;IhJ=ep+A|YLNu-8P(n@j8i33^`}4U<3G z3adR~>y!{|i_`<9C7RT4_)mT~rQ%`g!Rw)j;=7?b)@CG6*f)QXn|}5V1HHiM zMh(-7CvP@=5I$zYhz@kT;CQq){z>{-i0#nFNBU`Fk^ov=0n)UVzB!yC3X)s|dKVJU zIkXwAw@9;nPP{=I;oXH3nyC|j%P0J9#`PB<%e;HQ>f-8V=Dvf!c>g!{{nHM|V<~I} zAxuZV;n8W7e=`2y0zkz4xrBprEBflfyB+&dRZ~O^d+r-=)%^0;!oK!d8^0XWXcaL} z#vpLPJMt%pmXXGRs+0qdx|9ll-1W*J_@oTC5SW-1v>b$xNjCu96qV_t00?zCdZHmpKdx@ZtN@obAtomF zf}Wm!2`K;QST!d-q=l^nVt$5Tf0QZSDQ!z)Y3BAuwIO-CwqYMZTxc2SK{NP_D;2h( z?o7G7_NbZf3q|&2$L*h25@3_py~cC7E%8K>RQPP<@o|_jsGGm!G!!cqrSTLn74<$r zmQvGf9Z%WNKSi!Frgs)BMn|!J!0w&tWO7Mp@+F+X_dV9{EJvGurH=FQ%F1Z4e?*EXS~ zWoUOOXe37!`k=OboEK(6z}C6_yq+%aCE_+#u4*K%wxK@XLwWWeKJ4F6`d2bbT7(Hj zfb+jl0V|f!O3upacz$;JEl-UiUCvX$@SUF8`onnx<8lx!fum0tAnH>sf)4FN7#{-} z4A^5UT}uaeipx0d5G?j6+)3eoF8g0_R)QrXDbaGyImQh%FqX?P>ulQr!*^uggfFWp zgEA`Zd-a^0iW)kqLi{&ev3``Uw$*7zyAS>&0RSE~WWoqQ4|)-h176aDS->!jB`N{X zs}2FFOv(Q8b5FKBhh}k7o*;m`W$NjMhz%FFP|sj4fQY6NS@Qyq? zIdc;kj^zweluR)w4X(Tk#v`Tz_cL)XtV7=b?L0&-Q*CXxz&C(W{^#2o5oPaH*1*I0 z*AS#N6H5tuRluRg16~J!TYAz;B|De;P{-A^q{QfGA>(o4@Na%l#{nfE&;0*XKcpqV zh6(xf<${b#*d}iPEW54&<*&T|j*!v@9(oNhdJzE(rQ%u;th;$?F{Gu6fIUVbK=G3% zK#i9GkWa(H!n6B6kKm$8@p#_V2KxeUSmQ)@Rq?7Z7J&FS)Oa7BcPvd`-?K~2q z01hY+A14tTHnIZrGdhHd_5#2(zc2FuA{~&!5lMBnw|Dnr4U3KL1L~?r>l3xL!)cK5 z_h1k9WS=i3j_z+NPqPboqO{a0y7+?HZyOX%X;~!btoG~+H>|&4rnG@S49GMi;*x7f zJCXYpKDx?}fw2SPrEUuGZc#qTA=@ZFP?DK*uqO^g6fv^gCOIGjnYB`!79)8;c*beh ztW4sdAzzV{SbdIU9iDGNG-7D*OtGRt^RPKrDFYBU9G;*EM;#ghW7)zNGj%LeT&7qCca{67DyfaGTP49f~vgr4>!;S+( zo1Zg^?3g0U6m?(9T|dI^0!JPuE>zAKIU*r|0AYlplXm?r->c*1FKh>Gj?Ky}l%79( z##;g(u5!G0QM6RwkVBn?MeG1$px)BRIDg9liXG8d&v#)3KmX4KMtE<8RK*q_ZLAOs zLlobEtgw#Rfv@7YRm3F+01Db(M_6|KVSkoV25_WrefHnY`#oGpkq{;)s8~M4iNQ9^ zCB8xGWS!h`Dg6KJ#Qz=0y0$Mkqh~k6tw!2oSoDD?*3Jf#)B&vRNk#pwi4O@@HGFCU z@4w~!c#8}OXuz?428Y~4wTm@XeNyr6BqJlcxES;s zXo6m^q>|W#$irI7U6^+@(iZEMu;}bvOq`XY7kn(pWv11AY?M^>o2U57ILXd*(YHjx zC0o$z@K2WIKl>!f#qLioGb|IwGMIh5R9pI6OQUd4uWz;UM{|L^nm1dk*DGcgcBJg1 zcilqk#A$6Gjze=3U4GCx@1{Yc7z2|;vg((17+Zc;@a_GiETS2NGQAS~+TMH0;a%;6$k=F;VnXhwYb^5vR!3sIWo1=5b&Y1sLy zWl-gCHv|o&Gg^SRU_RhCI1iqmFbB|zK{)wZ^#2Jue_d7oVx55aQWH$+4sy2E8~&&*!HOxNBp6#UvS%@n@8fVfGsb@Qg`h87;6?O`HlKf=JCj=eZLZROhDbYQ02L4qONqm|EH?s>J zQxeFVJcX3DeaKc}|L9r8s`u44$Rl0H%J^d1 z4%=(Hu&dK!xb&$7Lm1Y*MWn{&;4)+VL-AXf_}KcpC*NzozKY2ew5;JIr``??KWRo5 zjqXr%vg_Oca&&3Qkz_rc)q+yKsa(V2(JyCZg8G}9GHoNIItoi=1to@f>RG}GF%PU* z53rK{z8rA*lbCs3G61OP01ATt$JkpyRsClB!*ohYbLegXl}_pIZcw_rTT(c5hlG@Z zG)Q*}N(f3yH_{FNhnail&irQXec!dtlC^~8L3qB;-uqLV;TB1^(ShuR)i=tK_t~?v zIsiAoX}j9UT65z^eAd4y`VU0vpMHhqoqcGtz_^CgkE`-_6fb5ki7fdmY zaQWh~F9&$Muj+Rr@j0BLV<4wR3KY-xpz99SUCvywx#1b9M_djU`O`mB-H&NC+eNy{ zYYszd6<*W+2lW`HxrtxUqKhMV2jLqW1F>a~@ROe8&!Si$dj*E}Xxu&7X9K2X;(2Yh z|2K-j7OY5)oiUwn+kt;w`GIDXL zL1JOnDW91vcLrLdG3Fz}k!1T6I!nCb`&G?HOq*6zr9GoA}3Hv7aI z8}Ok%C>xAa*aVSX7t92mq+Aw}O%j{2YTJzkqDt4-TU!4CxA<%QdH~gG)tInqzNm;+ zw;7#ByIPOX0hcj$l}!VSb>p8ODbgO0tR4ot=uw3EdEePdAN?gfo1!(RZGb{Z%cooVeBe6etHf zxJM^Xsfieh6cpoamE2(sp7l?y@xFB)R(%#K-j9mpk2v~>9KcbA3BShU?{0?)gwzW_ zE7o%a33x2b`ww>=R#Pa!Odx`mx!C883@Xh{ru&#YPg zZNG7eou|F_gU2Vjibu!Qw6?LTfkCz?A2KE+U*EA!6OILD$3Usu+Zj|DH4ZqMWpW;H zk(7fCO|E~J;r`R%_}kUs#S|p!iICcZgACL{wtxjD#b-C*)ec=~<1cdrzsBWqO_(Ls zbb)TqslfXa3f;kCmG|P!<;d4uk44D#u?U^^@vhASEf*!>Gbz75-m$?`q)r;<4HPQ<($Q&I8_jswT0Ft~8(!(m$0 z`$FV%m7|&zy#6k+uPX?i*^Ns9Ss*7A9u?xVmLP4l_3gbz4Q;4?=J7|kb`?yR-(b_R zI$RgmoOL!9A&4ldbfR{#}vx*W2T77tC?SBd)R% zMC_S8HKl=uiAf+G%#iCPt}W6U=HPA5-B}L8IdL6iBqb%kH@j{g>k)F#Q#6q*bL*5S zk@b8p01@adR<_x*|_q+Gb(i~zjIbYt(sw@%!jpt9}40| zk_tAD?YL9aZHaj@Y!=A-qf-;4m*PK8YO2@?-N-vYxGr25$rfH3fU-wg(q-Aq5!KC~rK z^9!%6H?4ADnTOXZ4wv~)R6$p!bwWpbRNfd61yT|*3K20x)_Zaa;+6V?Lf47HE;9(9 zKjk?aTIY3V#P4xSi_g-3z?)g40S4m966KOd#R*{GNY)GDF&aps-Cpljor19S z?|_-^E5n0b1tDQcl%9yrl?7NKn40*5J!s3mHlTdf0f7uG(tm?>+@F`hwM2I?8f2gO z@->6Ek_RR71y8``Z)6{kmtP91%juN5@;WMv6i|5HzMrZ5o2dA&_rd?1OE85;Jo0ck zq3}eO$7@5UKnnd0B>6qc)ZknYyy5O9f4&%aN!5A&=XXz??}Y=PJzu7L8o=1Ro9i$6D@8rwS9wWKKX;O?^&k%XynSgK zs7?SAQK%-5_C}fneibGccG)zabc(q26M&_Mrrn@HG%(^SW0*-qG6NWhuHLFTqcj)G4JOQGw zz~EyPCvbn9AJt||)mI^Bd^equOV1lXRcxDBt7R$2Umsz%p;$1eMAK$M$%{>QsIS;n zY$L;m=BzU&D8_y|P1;|*>-apJ8(L__z3Uokp5b$Vf&sZ{=Usycc(iuH@&&>CZg`7N z(Bif&{z$sA~`_yO;}sp}%BsaL^4o z_yoyh3~U051`{tWyYr=@dNWs`vCV&kTCfqHM8bRSZ*5tTaGD_q0ezzeV4Ve@u2n|- z-6!m)ZE6H&TwqP@jrstZ89|JFqkQH@{O*g*Fx00Oi>MdV3de{p!2BVvEOPgp44}rt zSj1ekGlnjBgPhXxdH+A!Sgt}q!)=#_r>w~*Gg7e(!VfnC?eOd3N;i+8YDH^nYlLTT zK|^UE71&AGYO$415yUNI``x-Ds626SS?-qxWfxH)co(aaW{pM#;;vEJxhxihP>Kli z4Yb!*;I?#I=|ye+u3n+V2Di4dYm3QW_f~hTr|P>*v6XlotvvU;bRyw7I~YIQ{~E&aa5pr692A)EU{w8#8sYosa>OEBFnFMhdW%!aCQ1#XI}@+G|o5?yof@8DfjFAf&^tOcqN znvGMCrI9}YV$BF`))X|ifRiS)ddA_e48R}#1Kr2r>(8?x!ojXKCK$f--R>2!^op=T zR|k4T7Z-JZd;Nbxg#Tkj48E-Z#}qb>EZY*hGkSXSF+@Z+1AW~4cRx}{%S@HA@?*ab zBwycwb4kh6)D(#G71N zec9UOY}n*v+U_|N{QMHK{03hb9>^LAMbT97;OcJ9cGEsp@*xdo{JCUAyFVe6`_&v~ zKt^sx6y}(Yh&YmP;_d=V2`5VPQ8f^)>PM<6RD}uIl2DYo^8CVg{}4;~2stBNP$1v+ zepyQI*vZWQ>oX!b9)v=@;G;Uefd57Y;uTmoTupAd249g}17y*0j}ZeEjC*W7^1sz!Fm11~J0pdRRla#;v2^)q2{rq*=g9U# zNmUTi%^T%{nwjpl((>XqKb_<4JOE^0Eh0!b-(EVyVQ)F{qFjZe;o~+Y?su=Ih@9$&`!os-$H~TzS4mT&`B4zrG4lYK~(a|+=!tDdjJ;L9b$C%T@ zIa~_Ao_>ixsdpA25%6HeAmcx!PJ^5hn>=bR5&OkNdjJ)U-!H4I^WW0Le>&*eIdF%q zCvmKL!MpAT(s!F84+-8c45}i+!VKJfwt~RTN_og^(q0uuE+hvd{aHr7Os&|(EpAV3 z$E5wKtEST-ENhszOp;$PgqO#B%mq|#IDFW#?b+%=rd*bBz*9%>{VM&pzT=IfR)=ccnOp77-e}6)E|>Tu#J$+q*uoXoDJ?P zIunJ`@j*Et3#<-deWhP2fm(74>=P{n+RJdz1WSW`^of*5U)*=mrqn^UUk)7`wvI?dN zlVJPh3i|b0k}?Xt}O!JW2-`xo*Lok0EQ>c)&)c}0GX7;VWX_m+{J+h$(@ehn2 z>=yibx9!qk9Csh$h71<&QMjPWOY0jfJfo^CM4QWz9$udI#XS0e`tX2Rx5#J$COP}c zwp1iT?W|w;B8tUd;_5mnM7e?#vN3$*ay&!_f@qvRz-Fg9onoP}sKw!Wa+phJ!>{Bf zrDEIf+vbyXGCDOlzd%$`Qw+jg>q13x;CK4)(~~)a{O)GSdiCv@oA&0H=fA_5TH6wM ze-NejiN4zI;w@MLgLaXdd-NXH+j@4kFH#(Ssog}+qN7U1vtBwTJgn~s2= zgf%#Tvw%-$sB=;G=q9GW3%7kIVo46cD$qbT;JOQ0RRxm|K~vcMs!osnfNlv(AUy<* zMr;#0Q9r0#QM+D>fL!oLkBq5E2Osu5(mU^njlc(Zvc)UXl#gm1qMf|w4+5g^oQ7eY zT(-VZb=xEa-klMqa2V&_pEq_y*~VSv)gO8mSA9P~=V%oLnL@?w{x`!{tN=c}doq#C1!KafI}5XGS7sxiFZ*(q z;9ej9(03fNECuY0OKv~f82#`0&w#H4Xnd6wxTN9ye+$NoA}jtImH2qvC4dSd#&Y=! zme_3i4V(Ih*bv@pSRm#I7A*NYx1dFEGgR>mQ=-QY=(Cb6sG1UJq>; zadhK>4m*Ohw|d4w05u z?>*2=Kcz%wi8qafac;jomj8*wh?`BKri_Jp{?kN__Y(xL=YxE#Rgx}o4K*nJdM5jL`301J;~!IT}^ zdD8MrvxtGBEwpRBZp`NS!C2=bx43>rSz(?kN$iSre?VCp$&4e+D;^(?E8oP#+C}ol*autj@aXKE_m5zjW=Y?LYsR)@s zKq6o<-ck_^B8Vc1u7g%}>(So2jQ-G~^NvTL6XGYb`ay^?HSl(o;&iJpegoCe+2|F_ z6!;>hI5*3&Y#gsAK!ET*kxm{ha?^Pxm1mkgbLhhu<(fpJ_N#`5Zb?}M6PN*wnrJq~i>kmo`TVJG-&AfYe_oS3`wrTF1om#Zf*`wuSYHwovs26YCg+{# zq)*b~EdON`{|8X55q$e0$T_3aop*yv`W=ZR;A_*o>*li`zB=;T1U?orOT0mjXP8r+ za1u=&VK+D+x?^J^*Y|+0SsC`SpA}+m;PS^mw$JIam4O3YP{x~fE}okN{neR&7qt94 zO3tqQSirUjo<604Jx8&S6lHNhSknrThtWcN<-`^Oh3%xYB4vjOGKcB6pxs|+(T01A z6B`>wN`BaWQyC=uxZiyZb}-|mJxRUwq*O=>&Yu|42^1Zvd@dsznO{5^L2s5ohU9ij zphp`IJ0Hpfl9MVlks}@66XX#MFjg!>VE8T;e7fa6i#VB-5K;Mls3yJp74qwoeoVdHYcJ z8dWjCk=~!*mg+@?dWNvSIkl$3FGYc#s`tS?15q>s0C$po`qqeLIl7|fRVsXZC+8j| z{1)T-D3!~LmK3G_58t!)?1EvgYv`iCH4RXdNK=rq*k6%8%`g7*wv82;ES3z_eXjmx z+>4;Vxc=~oqM>mROyy4-1V3!P_j-1^-1y=CbgHLOeX1QXxj#QH#*|r9>D~n5DyU|z zoK$gTvdjD4o_9B_kw^ll6HpZJQ2K*Im4>Tx@QgYl{FDF+N2pD0+z4qpeB$Fn;@@$r ztyg1F)`8^6vf1M>bD#l}HVDN=2p?x7r>C?5rDX-F*6KU;(8F>lmeuTM)93!zZqD^{ z?fwD_pwFu*=XA)VX|m~!#5rB?TpEHp3x~Im8mv1dbpZJ^Tf@4km^45ABQmy_}}5S11`=v+Nzv4Vpe9ztjo^h)pJK0 z=|(rZP+LHq;PQ+>bc8w`q6duuQ8?>~0kASR?5EUnaLynTIeK%>`jZFH zpMml3uS}kWgyWdlYEAQWbp}LR`u+fvDy`EM0LTf_VY(i+Xy9ThBEyaV!D8WFjL&kXIh+^l)O@!CHA=daiYM@EAs&c+ zI{~qWTcFQ#TN}g)$-;!NVGAyTQL1d$W$p=YBwpxlhHJb?+1cgXHEn9IYQ(J-2$^N#t?- z5^a1!A|dVRSkx>Zh$C92^_Ap#zzX+NZElR3^8Tit8gV8uHShvKrkeeGNPLz*h1c1f zRcW-_5tA&mpW9NHHSS~-0}bHSvJaBl zmza^!4`21IRH{g=Z-UJ=s>QuwEn%qg1x+%cW+`p`$*I|*m2cY+eG`HhL(~L<4W%wCFp%F(VxdP&*FDjop4cD2wDa|)Vt0|FT4^T;G_)Hzf zMOfX3gg>|a!5aMFGGULf`t@rV>5m}wKOLypxRtDz?coB%?Rk|5qp)@%C&UKdowy-! zHq9A-7T}RdMQM1`ez#l#ATaF&Guz2&9zMr4@Oqme_)Y%Pi5@Hw1sL;Xl@svkNubnN z_uaSl80xyhsT2V4L1SHb)-71gl^<00dN{e-gkmbxl?e9~3C2Ph#>vQg9l!eu`!1vq zYb*wEs!%^ISOK%MQE77TFcn87dfv^p%as@xqyFfzAdVxDYf+x!PCh<#Z>9eq`oJ|! zL?`=8FzLv4dV)D+3ZJ2hoN+%53`;ryUC0KC%Jl0Kad}l$RoKn1AIV&|5reV_jl6<= zK*W>7Wc$K1QOpB*(*w|?d1&E`>IQ&acyJr@&I4pM-(u@Ik&S_lB-G4S{Xe|(zm8vc zlz@~ua(#xA9<%)VBiErDzxDm?gXN)MXJP3*`>p&>+APshsyY?;318JOcvL~rk&!ak z8bvx{l0K-6lBzhWI0!83947EMq?Bzea)i&MzJIgzxjJa}+MN4HDsJX8Ca7F9w3nm5 z*pd;Rb2Fy9TA*>hC!UBNhQoRqE)gOSE|%H_7r=^%iH4TAylev8PjyDE@A^7*dNH;O z66IPr(SK1*Eh}9E?5_^w(Ma*T?-ccs7L`!qQ@(tug;i?M?BZkU3NV_p!+|)mNm)Ui z(-?sys%kj&Y-bSHd4DYr@Q=dRWKP`$7LbU(rCF|DAB1^hI)dpY0zUuwV$|jX#2WAm z#*?gB<&%*#gu@L`o|!u;3U)*GaUr*o(=W}5kav;E-b=U44>xZ0$sC4iGB?x4A9Xi>u>@KYFIho2k{@llpHLrxnRZ{n0?AnF>arh$YLa zs5YZWmq@XvJ7o1SUXsN|KVeB@W2*X^NtNTf$e~>+H3S@CbUkmMBvN~DWIQ*GeL}=9 zzA_F;x$Ier^8CvFWA-~{e;#)GtJd;5xdibrZ_Z-?E@j|~hrg7 zJp5+Nn8swZqHxVQFtp2|HrEmMP<-gjE z{t$HSb&Q<8=XPuxPbh>9N-j;hUcQW^(;19)3&y3B+X}x2vhPVIgr?O%FRv!S%jHmh zf7otB_N`@{i6=!lX!y)q=Frh+Ko*&!735Qm4e|UHK@{c#^$9(O>ij_@Mj7H=4vTpu z8I6|!Hmd#p_N1{4Yiz|a&h<$b3M-V?;^m-{c9qeK4x3boAZ_-^^7vFA$OFpD8HQ3MXoI-BnP76U=>&V#}WPTmnmPXd*53KWAv{+9G@{z$i|zR`k0F3mTH$Yv>xx+WmK>a|1Mx`=s&X= z+OQYsn>(Rvz?@rM2jOX zQQog)q9xvo7`5nSQ1$N3)6$s zDgpcm&-Lc*lQkf4O&wp%V-uEcS2+u}Y3?6XE#=X3>s+8-6qI(O>0a8;;;C z;3_eX#&lJ3bf?9ih-3uQE>?7PG(b^*i*f|NITIVnHxN%TgZ?hy{>l;amHkSQIy+iHb6Oh#~1Nv`p#^$gcDc_0X_91a1nul9O zVGy1qJOhb2i^xX-sN^zp0EmvbCzf^eas*3qVq$?0ret?nXHPm4OG3)g(Q$!ZLT9iH zTb-)T%oi*)tx_1bdIF6Lh!&maUBZrCFE<%h6KKm5GF z-zOUL`3yV^3Ttn2_efEpqUYG1^;rP>+a2EpG3u-jyR@pUjOF3*AfV*|34m2@F^bgAn`bKIp~W&?*$TB=oQlQ z36H)orn0qs{ziaaT0MISZ2#Y4q7n|^oHv%cLVdc{ML{+y{EUx`dPaRxIWXG0^iU0xnID&dyQ*eWlB>mH?fY`*_C@Hp`!^K@4a^t=2a;O9-h&e{^M=srpDr zgau%R07h|jCFv^Ua-DIlmyLqjs9qqZEr5fq$10((s%aL^cE=4*dI)|cRyzl~nuo#) zl>jP2xp=vFs}hX|L4m}HqYXFzir^Q53+<~~m2vlD%As9NUvXithPFQ6eSNjH;At@$ zG{&{oT&Cv|wb&t7nJvh?WdD;!dHhBT4WFHwLm}(K;bKIC-RqsC3s`nKZh}T)nZwP}o~FLL~pDCjI#y+fDof-9@=T zyHr>n6v|Jxc7}K;FZ$`_%7OKyzr@eWrG}9N>c(NAJLGNe+&d@vZLf!?HXqMe`Q*~n z6W{HBP+D=FwAV`(L!3Qil<9-$+*RSx4)V%O2V1SGw`6U^y2NqCNgv7Kwpo@D1V|)) za)Z#qDCP+p=J|@GPZ{%TG%%@_qdK1Y<7L^(%K1D)+{(gn{S!Ge|EM7m9~HAv z0xp|6(M>e;gZr2|A`~GniL3d~Vx?WaY}XM*5LT|BTR2YSO+DHT(T~n}Po3GpoRzNR z(|rQyo*6X^1k$Mp4m$t~Vz);8#vvsz`0bCo!nio%A%wo^6Itx#C~1ftFls26 zz#M)dH>mO$TVl8HMU!&ZjC=pLWuyd%<;vFhq=(<}X7^1|1xTzI0o249pOC&lXa8R- zDrFjuDD&7y-CDODzWey7I_G&ADoRSxB@?PN_p}8nSX@fjn4kn_r_~gYl`PZfu;Aj) zg~{(|k)>8Fx19z5!fy5(NzzqUa`oK4-WO{S>ESIWl9`-+bJ$@VIQDiNwbr)~nzYdS zlN=Qa^S{29VUz}tF2sDmgl}s=SZ$Q-d#KmJ-WT-?hBo`m>S8U=H~SHO za9yb4ePBVuhxKF-4zM#tL_65@>vKA3jk?Wv3xB`vN;8f(@<32kE%sXZ{nU=D!dMse zN!?D!d^qBb&L7N-U4TufwfVTW5s~8(sD(ipgAtE)lH+F3ab4av9^?Cd7d`~T7~6zA79^kRR_)M zoy&xpl}QeZwdETNiCJ6Rz=I~GBe7_CI~Dz_%iT}R-m9E!WNbM+uZ9sd6E8*12dhQK zhYIBie)=wJH`m*f9&xD34Z%}bXCPKl)r#p|uf%W^O=Wyt(YzuEj$M6oqKeABU;oX; zY@vnA{d%OvZx=PC6Nh>=WsAprUcJV9Q<=ZH&^CUNpn}D=r?C+Z$@ zUxT>&R{b~c0(1`4wnbK)_YaBPGwY}hNep`z8k-K%%=NKt42F2I->gu3$c7{a%)^)K zmGP)%ZOXcseZ+P9Vk`vnzYfQU9IiL6sS=*kaCu%vBjba1} z6;HsJ?!u$C;p0Cv=n8eA3>6&>jx`H|0=wm|tH{{;n5RQnCwv#)-B(5NIAW18MVT*R zzea%-f!?unt;{&^PBYJ!azT`!FWk=#`}GGV>x0n@?vR*Oncglqmh8sQ7{pu>9aW|e zK)6#p>7XK_Hs=(;L)t_o^r+~X0O=QOFk-i2BArCCuGsjhnEs;rjPV!hgRdUdTm%FO zZ(Zl?8@DfvTX~c+xccPQIqhE$(1b03opswE{zUc)IQ+E+s;Hof_HTc32n)#qJ6xVz zia-*pk94g({10?ge!9+sFDGU&k?5YT(B8$fD3Z%c-iV#a^p{@Y#}=OJt7kQ+a;Yz- zTT4%dWVbl4k{U1!9oPf-=K2f4r9j|V=7PVe?_b~XU)yBw2$*mPp=(N37$g!$N8z!1 z-|fu;s{P$C_@ZAXu-pWe=D#^{l^=JYu#Jn7prWFFM}=uZ!6hyW3oBE1KL#E>hCn+g zpOd9OE!=YD{UfI2wl}NFq4NM#Q|@LkYUm1C@j~b6O4y?1Xum?!L-MHTmn+}sY{dyE ztsDWob4VqNr$%S7FS*#4aDzx3^BR*0HRiLT&FI-$$`nHS6#p`F4t;&in}>HFR@09w z$tUO7`@@}IEp}zE6r|xm|3G-DgpiMMabH5oReNZ}rQ%7bBzN4VSEOz;X!Km1l{~~A zpqWWd$Ar~O$N6-byz=BwuFo7s#kI5gBIUznMNxrjs!oCugz;whpZu}46V0ol+rs61 znN%eY2ae*H*m;Fl(iD&VW-WA&zIqVfPbG1^5l@%1(k*zZ2VGgI+_^oQbaYw{{5tmJ~KAf7c&26ON&0fI4Y^FdLgRd2HBrx*ZSlKGWdhs%% z$bDu}uK!9FcU-b`EzMSKVredQ*tgagDw{{H6=*rV2DDDE1)4SK+j*56D58=Z7jvub z5BT593Ei)S=~T}&_as_;UXqat*pJx7qofheKzLuvY`=My_F<5vb_p6lwmV!wQHeX= zU0ko=YC4W~wX(l`+?yDx)@TGzdvn|Ral_-%z)^rYgevj#O2qMEk9o42cm$;(Z zly^1HK_P9{aHdck&o=M5lz$yGd`4p83gzfY>4(Wg%45-axyV_T#d`6&eDe*W)#u`4 ziC0x}`)|L#?oQsWdBs-LWs9AdSAkI=JCsOQFQN6Nj^soni^UWv1kq@2mhw+Bhw**h z#KS|-9X4B~C%LHgz?b`nt-yz5`~vJTZC>M59G9`hHs3SDfa)fcz&zggEcE_n!$Hp8 z&Zpu}7Eho`7hT8{TNgyFY0KimV~UTUl+wg@VPZaIE*^)GK}Vk0+a6ym35`K+5b4w` zOg`}2?>q>1+KH2l$q`$rnj!>aVnI+)@HB+AmJ$8#naC>#|KlMBL^I~a2r6oEf{^9t z3!_1C`?-ec!!B%+Bclnh8iTvY&L09|ac(~#ECMJPJxt->A8Tw>pf%Bcghn1jq8^rh zKRA2S85U5E5e_K8(K@{gDwLVkp{sp`)Ma_J!Cl_ki3*1yT-bwQt8iTB+A)diqC(EZ z*TjS+{II*!(b4{4-9TCEJ}xWe_l7W(@9SoT?oaYv`p5GAzrF@35E$2*(xq8v-$Fy4 zW6$4_TXXW&n^N%;+ykA09>h5D9s|GwfGV+X0!u_{# zb=e>!X%KWBRmR3L!(DwGtR|h~>AM04O|NXUS*ccgK14Zw7tM)H!frS8)9{H&Fjw#& z6OX`g#2tTIF_m1Inrs?|ec0dDySPj)FVl6@z~!D2Tc}2HkK<+##Zy-Q^lHHIc*i$y zNI%a`EpXCv@aE|&M0?+4v<5W;O5fPP9WmXreJ$_SLwl~3#ReC-=#e_@jiK&wo)Naj zdFqO3ZoL-yUld6wowk78 zNJGn#zC|+MSGZO(EQ=)6qzwxF_v1aNwnA_8||6Sluv)ujo)@ zoel2&T`nv=G*HdHr@Y@9eJ&&GeUH{-6tu`7)wIPOl{=1B0MVDiRHtM^k$fm*k%C zmv&av1_65g?m>FRRek;=ob1x&1H_@X^KTHA3kxjG>T+!xnD}Z47S8KZN6i zWrOK)5J(S-fYyw?;tLKHLy5Wzc;>SC4`~1Q=Mp@!GNF$(H|R4qAtCY?&%;W>`AXf| ze#x@EIrp<2&7Yr5L;b)V1RT=@Ig~-CxCZILZa^(T%GR|U!c9OXa@70u+5rl6>+bHh z_*G}E*V`qDQ#8-Z9^e5%M96#0qXJ1`bbvRmdQ5e?Zi*oH8DxIz0oWJ@AO`-iPspOB zFe0XdaBz57mG`RSGZ9G?!nVC@ZX)St9sUZQBDQ(&&75PPOdb-tm@gy@vUJaCZVO;_ ziwLXrIkU+r5A)ueYpf!0X4WXp-~7pH76c8Q=>j(YzWvKa{^|bOiLYi=Gn2U1&y2Ja zpU}oXLQ`$iP&_7HLJ==fJ5Bva<+c|0=xCq!JF5$VZM_0bZRIl`aQNk^rBIwxHNL%! z69V|8ZaaruF3}6wotZKwmXfz}89Nxg72@2o=f`PIbOm3t?z2a|AGn!xTT2zZi?UA1 zx#WI~=271n>99-2;Llh?nkaqFHpkbO7x!ycHW{sderS7c|3kqj<4;p-?TRn)`Bov< z^%#j(qVir@PmTZf2-oGh^7^+!%TqXPS{JV`bh3VlxF*SXp%{siTgWZ)<8ScQP~^PE zGV)|gIJ@IpVhR>L7L;7MjXHO+-Rt^GRw2=<&a?Wv4+=KpB@IiEv`pTlUjgdI zHpf`!uku56wp;m1F4MncBU0{(0Hfk^2xsmqakMcudl`ZC(5XGoiIN4usN`9Wb^)_{))V>oKXwv)zXxa{DI~SRW;0_@r1v@)6!* z+c^bz=PRfzYH2s;w zeA7nc zqVW+`Tzx)w)3Li>hH_Pvfx7d4(UHnI0uOYnvmu$$Ep6$Qgexd& z+O45;dZ;Y3oAYrv3U*=`DNr?~fcyQ})8>{4FWQ0O*6;82{P=M18~q;cE{^*w^S0_3 zl(W+2ef7CBu8u2?cN-5!^0l>w;yWOT0472&YBk&R*tQ_aBC%|B%%5#-rQ1p4u=v{F zHt~=_Jn=!+{_41PeT7U#5;rOF_4sj`#airD%~8qIoeNsF%oG+)@k}0D=GQEmDf@Gt zTQSM;%n6%O4X|oOMv*DJ@MCYD&`Y9-E9_PFtxP_DE{TRSOqYEt8F%$E8JU8D1|*J_ z6o+DV2~T`5bw8?_(exnGnE0OMx<21$yIBMHFsm-CP0US?*x1m!xFHE=oEBQX>sGne zGInyw&?&zr{Q+wGK>{81!-&|YwbsF2T2_qbZ{FiR%y1-nu~UbCHvi>Bz8T}lkuqee zZlT&?<8ra5Xm)bO!_jPTWEDoVIabuLlq|o0HFch~`e#e-G}t1fLsO7?0hM&|>7GXm zFoeF!o5_4>Up{`J6MNcE>bP}*i4qCjb8+cG^hDvVYCF#)Fr%y|sz$u)KEXD6=5R{L zH41pkQ^{-poq7ywyqJnVi+eUbzO%LC!YqXB22eiNjjao=NEx7bz0(%38u5G2-g-zy zj75#Lc;O^S;P|@@@8+v-wrdMI0V@=6xVxuRtl6a?3C}fw^^VNo8~eSzC>4XeYOTw^ zHj%*wQZRXzzv=Osnx9O#E_rW~ZU3w-xmQTzQew|y^@u=_p+pP@kN8ej=I@Q?O*k4x zsm{-y(dw_#zqtG;Q2!V^e9ix4Y@z8r=|r2Mz08oe7+u*alGCN%AD@{z1F{F>bJf8s zj#Dqz{}oaKXcL~n<>QZA2TODmAsjketj-|xu zi{zn48~^}`T-DK!Y3uhAvZU=iB1JnWpLTgQ4sQifW^pL-iMfO8(F9ZE{SiCuD>fpV<@4AGWsrAx2X0z9JP5YMj`JV34u^XWy zMT?6uUQ&}zR8&+7EghvvsM`y`er?YQipon#U2_)1f(v-8_GM-*`b9Ubw zz)WS?FzYv=G$l$Lbzz`?Cd*TuE~#qOt@NDSm@p%m(2LSFBO^GOLQa=Tcr9KY+wYo znNy_{zqZXBzz8isO3Lw1%eIL^r0dr|O^s)bON0)LM-u%Q-BF8(n>r9w7) z+TKZAKtD_kJ5aQm&JUru*!x-7M>UGIMppDxjBB_OqYCj>=v8bnG|6!4C+5E%by20K zoey)5A_W{Aoa=r}VCzW)#AmS&d_?vE#~j0B348^^rKF>ie(%R4GRR9r=_-H3QkEMs79Mq)~zGR)c z2Qn!4XpDocJR@%;Ygj1v{r!z&Tj|{RILAmt&VoI47qX{LPr;u@mHFo&fwt@#h#bLl z6WVN`##1uh69~L-r9>?Uk}JLT$Bno~qgdO_pZeBxX7g@GN{-zg*wv^lk`p=QtgZXq z=2E;u@v@8LOEmb$oGMytp}*6=tT0C9L)5gPz2=Ti@rnGcYAFE)o*b!vRy*WorL)#! z4jW`#%vw{2R-S6?yv5ZOoGQ3iW7aJPBd1zbYt{TjL+w-*8Ebe9Qsi7&o_nUeMHB(o zeYmd6!91V$dRZ>6MZ7!JYS^y-z=a>j>IQ3)`&>XW$QYJ8XlssD@N&-eYd<2ip8isw z>M$%pft}}a)~i*JxU$9$#MEg480}XZq!SJ6Uyp}2D_(C_F6bdRwOpqe%r_gDu`Duc zC+@r4cT4iQdu3&}Co-0>_YYGr;~;vXD#XTrUsdawKox{;F8W^>^0j%UuwI*FeEj8Y zFqSP;^*VI87)^epq0z?La`nU4FZ({zEJL2`EPruWa3h22wBR9b5eSP&Q@ zc@F3*BDKTcXzAhbzM42HTlgw>E*2d}P(*T?SR_GreAh0YSioMYm&9g`?1KMN+f}4F z&^DvNt>V`4=w{+<%(quP3J1}ddx(dZ2VBdqPNsV0MNF~NG&aa5%7r;l&_WZT>oE@kt|Ed;n2?4}KcTbP|#5ox1J|*R<%d3Bl z60T8vELKjElp@2tmHpc`#y(*X?E%XHVKly0|SSaJ#>Szu713zyTLUU}<{35L}dHtyOhil}GVS*e1Fs|CG_m%{R= zPIMMTS3NCn2<4BTSqqRCmq!{8B&3e6%3X81_g|(Yy&I?;t|=ZVD!qAK24d1Q>}HLa zr>q!@N0O&KjTz4y*v+j0+;6Q$map_G-^u^=DWE<&KDBlnt3?p~=}4=D=cO|e`3Flp~()V;(@ zPR4`sq;cLQ#_xP5$*kqJgjUOe zg#P%v0ISHRe&-ASA9JjdiG>a~G~xlLb4Gl-;zg5O+-}cE?G!EM{gQ&- zyK3pg!f|=CHPfTY>FJe-w@$5DC23x%T~t zd$Kz|1~&$nYQ!=YFF`N^DRl?isp=F9)Z5OmE20i$Og_#dlU7i)&=zExGddARYzr`6 zd{{yUBL1Rr=eX6jT!U2|b|H~hxxbp63-LfKE^vJ3ee$#jSWnTevmhiPVK(oNmG$H@ z^64L{`76Q>okWO@RWH|I%IW{J=zF+LidW?Bnvs3L^Y@Egn)os2Z31L0-FX{p`Dvw) z0s}SGCJ0I5zw_w|LA?GT)0{waBk_Oo<MXK|H@NrL zl6x4w#@hX2WZFO8Mk%khGglW!(_NVuyXcl09hKZ2$_u(I#MXXO*w?P%_G$v zy!Ly2y*O#)`JkI$mPlaxEikr)oEZ1K#aIV=%W-@rzHK7$FEK0badnUZglsqM#4&iv zVN=-fE4j_z#LRKe1!RgZFHjff$bGinKbh_c{mb1cLs^9lOgE|R-iQKgfM(-DgVv>FX&&q!HVWC2Q+d%E)Bay4FW zvD57I5zz&VHUr2K8&n~QtC0GjoX5_|$;nK$$tOR^sTN-7XLf!yb^j2Cr+xDciI%j= zX1`vP`hfh4?w)JP$E3{V!q?fqW+v`0xi03bBC-#o^ zcRYn=w0vaB3fvLB$Bfxg<;<(IlHBxri9;h+qZCIR`Ti?QgYV3;4ELkXQ5`;F(ev}l zf-%|zGECUYkbz3%;&w^OjjVXeDSN9kHly+{o71zi7bl&P6dq3RW#g=enZ4}Fy~?Clyyw0s3>A#Y;1m^iW9kp$17unh zf#KVar&V0Bi>&3hCZ71GB&Bx(Uxic1YOe(EZgM$f6*s;41XoNlssTC>9md;IHjXNz zM;X;v$pnSQ?B7$}{O~6iO++y!3-{}NI(_a~czF0Xlc1oWjl)Y$?5_$ug!bgBDm7<7 z_mtk4qJX7T?J{HF9`3W_Dx$!BYPvGYHF(gp_ym-Rc3{P^)G zxGQD~%j8}nVAaP#e;W0ok!#1G=CXI$81oWYi-17m&Du^59!~2Q(S2#ReC-w^TT4X2Y2~~)#d_h0?deGw8xdX9tUC6w>~NIJ##-G#!B`B zb%kGu+lm7Hy;y=}zPT*0qN^5|X#K?UQ{!%!;l|>`ieVyP~a$(^kLOQW|!QZ)Jr3zO`=JYT)6ObglV^ z{?)e`mN>#w))OJO0#D;Dirkw%O7j zab+<%G{%zqm4$+=PzG|N&K`*zSuY*8GDU7~Why1DA&LVBK7?84A8%|cPa%4bMM}g7 zTj{d@r_%GU$MQ2>+CH8rmG~80*h7y$OpKeN-&~#RmA?H_U!W3!;+0(ZiC7)i7skUp zA48{#g>-QHo50SZI%9mRaCvds@3G-8<_=XrVT9MV+oz{PZK8p~f*>Hy=Z@huOP9b6 z;BCG-EZ3L}Bn&z*iec7zCLP>UI?5k>ElYfPul>2!{~ z=uPx1eD{8&ci2*D*5uA!D1|pY zTPKa8lzQ9Plm#(D*3mlY;PdU~i~7#IsTR2PObsopcy#TV^ddGCrcq9f@XKT03ymAFnUJDWGCs4wl|{&k6dZpq2l3bwFV`ZrAf=elsB#0Fp-)DFqjrdgSeL; za?bqoMWLa)6YsG%=^!X9z_49Ut1vQIp3C9Zewsv2wiEh59Ke!Ede8L9XW)`fKRCoa zSvdPt-8)#&+DpYGw*sZz^mlDTrzYx4twoLS(1=MhmQgCEV>G?k&YrEsUBd)v7`4xG zksTyWByY^9w2>Bc%Fp}2)OO4Mb|u5Amer7=5z|N48gt|hmsK-G8+IFsyln2sV7+!<@LHhD zZEKx#PQtS*wyAofG6w84-Y!8+O@LvxN-L*!csg83N4HoX^p944QQMQ~r}r7RY|Ay# zns9Xbb^4Fk&HQ*Q$|SU+)|jg)FZb}Z6MVNf-_VDHV@=6@=y=jK>1;kd=2@(SasV`_ zm#XnRsoqKQ8NK?+XmMC}?QXfRUTZo_*j>!JUGu%6Q8s7ZU=0z9d_K z0nIk}*A zu&_?%rCGnH&`ieeY{n?ztDZPU?4NsQ5wNwDVmALIrIY?|u(4oQi`wjF!?{^){!kNY9ID>WaXcDYfg;ipKZL5 z(q<~Iep+K+SopQZ+iOXRLK$OLpJM3rP^0J;^(fb9O_QZVuVVZY77~B9+-8)--KVuz zONr*9rXBK*i+*%Qb5 zKrj1}N@>6BbXzGocrQ<&BgZ3~_HLrtRYTh`?i8IKDRqpw$Bk$72F?sQnPmC2X>~RW zMN2HlG$=5JV;@j4#@$o2_ZA*plVq7b@ z?_x8#QnTgLODT1kf=u2^-+K+yaY+)X@;85drl?g0C0S~hl50&rlCkc)0cAJPMsJa> zsKM&zsaO=<2)}S>Xeg<5^ULoe&|n-7f{~^}_7~QE4p&*>l@kp?h@k00#lfYtV=ab% z%$eNwLQBK|5t>n3PcIpAK^(C7r~<_&>hj0p;ikuW z>HEns#s#?cB#t)ScbRj~!)fuyz|-p7X1x@}M5`%pRvvA*j1v}{+!a5^s@;6wLS3w1 zX`ynXRdBv&uwUo1vUx)8h-j74HzhV*_YQ~bPxPywPhl(kzCU4!l;>;`wiuyqQ-M<- z6&#h}eob*vfz7P z=8|cl^cNyBgd_`Q=8;k5bE{~eicZnVbCX@QleSP-AAX16;t}VCPNtc9s9J!=^ zz2EPy^;VGZb*J(MFCE;J4&06ykXljjTZ$T9H^9GS@wlq0)44F-{*=)ZYKE=AAhFbi zOp4W2yBVy;{V32Ua?(ZU>|j92Oh61cqV=Hi-RYV276;?w2sv!#M?*gda&4UzVm661(FF$`iy{jiQd9~4f1>?v%3A9>_KC73fL@}Q$ zYKCNY_SxFnj%9G)H4!W=S85BP<(aj%bzRp2%%b+9-+akO<$=Ix5!NPs8qS3X4_oTS zL*V2`Oy^w0s_%%Zu}bIgj0jeJwZMx;72u|ir2;r}N)i``KD%*xfRfB=gq%(Chf=dL z>)h8B`lna!`u2Xa&#Szn_sXU|vi7{|4}4O^zqtU!o`bLC%nRdNch614ezLen(Wcsi zU0g98y;QKO+Ke^mm8fuTc5pqe6fHa9%Uh3PC6mONKmBOimR={PqsiY&)*?qKp;Zuy zAA@Q}im?5sy7J?C0c@*JCsf;Iip1jX<(({gS8>xrNXqBolJ6M`$<815AJ5;YPa4Z5 z$wo8!uN?|3_D@hsDeg8atK?V7@XjLTJ?d?KC3LEUYR7$Z`?Y=F{kYb?^Q+p!3tplL zEiqAXyRk&M?2$5+M;)W+`Nkk87@3?DfRP$Ilg?n(Ofk*i#W&JnPo4uqi4LgRjzQB< z8i)}&=zew%|J6!_kd$XO0QEPCw7QCHC(O9z`eK*+>7^0tj*lRTpOEsJHj9dhVMLD_ zHDeW^n0&@#*!qvQKeR?4&~e#GafoL@CHHc6vZ|0k_RsRN$^>kwn;%RXNnYq+X_Lvo z50PUkLngepPK!C9Th1{0kDjo)6pE%_ZJ$hJ=X%(5z^9%_w>i{))O6KAH%R$;srb}; zp%mJqXLNbM$+{{f&)2SVKb`wD-$%wuwr~KQv6i$c$|@kVk!aA4Wi;25G#IHOUmmCp zLvx(&znUsDqC*?1M?6JRc&t+r=SQt_)9}Zv)$}_%FRh26Z|#mxVlnOFR{2D z2a#yYA1uar35pi>Inl*Cflq#%d{oPn(>SPFFs`%}8e`{*QPY*BEsVc3);-NVUr1-m z#}Z1l^10~wsW3A`1%qU%Fr48Jm&9b2hv;H2t4;~gx0<}8GOMknizWT)y^b=N&X*te z25a@Y42~!G%i_Zm45Ml}SY8xIms1bA&MIkm|Y9+9jT8e^dk_;ZU5-VjW^{kh{wNlARd!a9Hq+QWRv0#Jr( zgNngXBLr9C&H^-S7KC zN&Y&~4OlnDupC-wI!vcQ$e!;jiy!*xs;yXFB>FUk1kOn+pMBrHJ$#+YJ)v)jTbpBA z-E?qqbP%_lx*5wV@ZQfkR4PS@A=jSYM@&$;c^=A&aeEUF(7QpWs&Il+IG-dmPsns; z>05TEruvzcX1SnYzE)-vHg;D3+%e^I%-*6L>*eweoMl+j%AL?QmRCc4O7!s(0 z2^^Ak=~2NAx}-r8sSRP1(6~MI7rjU05bCGG|E;0xQKYP_%zf%TU)5B8raeBMdqcwX zke$Qtz*4*}c?Xb!A(Bsb@7|Sl3Y(ItvbXI!K#vM#BoQ3VZAh39_fy6rky)xT^k0kZ z?CdzJ|B8N68x-8^2-tAsIAiz8jOo zYPNfpEIjLB@J!OM0$a4JAK&;EFOH?PF(qd2`m2*8vG;Rr891qLNI2H z;hVJ%8Zpkz;ww?&eCbg})*ER)&Lpc%CWNUI<2-c_7ngea?Y>;*oJ$o(Gv}i=6cOd_9@-@|yR&)A0s+D}eb7XwB4OU+OM*-?tzIw`^m5 z@Rks3UV5r=40`nMDLn^%E$LRQvCh>O;t@;X<*gKDBOCz_D>s>*<9t$Y9}fB%Qn^VM zX>-F-EQ4%BuVdo*2MJDL^+~#ib1cub`4$9E8ONLnUoVw@VaV~AUN(6t)hY)ywI+yZ zuTVR9a@H!0c4Ml;zMJOISSQ)__P0049yA?iXncNA=tWS$`eB@ zzkY#`QEc?#$6JcLCEnA%M7 z+JVCB`+p4@erx9o*}I1lLw!VYftQ4K;L&`Fx%E5dNVulqBf*ON5)#G&8UFEWlxf3YZ9kb+bQL+dhvb2WLT-_AG^m4J#~q5mKLEZ{(VIi=ivz(y33> zjTuO(RkG_fj7~0z%n!JJ+zL&3q&Iju>*150spEY&=Bq>`S_)>fPYD}elB8adD_Bks zy5*;lt;P1qdn|d0MN<2^!bp?;l)>+tbRv1qF{-=|RQ?!;;S_MyLEiAu_R zP~T&?a01*pVx}^sU727Sl7HNuxO>Trj*IJY-UDD`)`96Gl0une?0eNC+YSP&u40FF z-O}0GxPSVf_9-5N z^H^~cjd;$ztSxUQ9wnap^ga9#`<&pYFXQ1yxwm*=3N0$p+ojB&o}9mo?4zJ^fyd2f z*%92TO-n;C+)X7mA3Xa3=GD%XvOsZUAhdWSKhY`RG<5>>0Sdhw_i4&~_#u_fbwKx2 z*?YgN7AF%&)E5@kmM@ncq*#m=J z;QaPn=;m$ALZ+&zFc70NYT;nyJNfmKEazL{!MCd1$8SRGr(tv+NV2_~QU@H!1SU(T zK0Osl!j}8U_Obo?D3y*gDA8j~_-89eski;O=+9RD3+v-K;`UW3@LDFD)FnJfEapN3 zQ!>`YEetiLR7s+WPdh05U~KKoGi7`sG%GFr_-uZY*_>i&;GY)czx*C`06~t4JntI{ z2nc-l3@t4^;s+u)2&Tj6;lgOWuN{*=;{5rUJ|G7IP`!IsDC4q=&a^MR#F@G;bh1UB z`@7FfTB}_S!;tMB`U=Ow%JqZHT_#e+j7(+;ZX1z}&X%YXVq`)YxkahcrHUHblE+g} zqjybCp}w7?`gFoFAajY{|C)dDxzW5NENZm!AZ2`RcfF3gd!hkeLXujIIf-O1wh1po z>oq`?((~S6tKV+KW$|Df&$y=~wLLpI|FiOCF)WEB1dNz53>8amsv_Nx_+U;hY zCqn%5n!V8mdtQv+Wt@`Kcp_1*vt?5+$SS}S5o1S^F_zw5G`E|BV_+`R{hxZNm;M(C z?PDXed@HGO7LwHAT$)Z4+XI{1lqrpivA!QF^*Cp(9mqN*E=ZeX?c63W@Xp%Ex|a`gR_uG=`?i0`U#r+6T~E?GDX{moWlV)eS|z`4KHt z3kAS-nlPY%2EL&LzBLd%2q4 zGx_4)cf9i>IYn7H28}O0CML)FM2famUYtmt|0#YSx2>zlMu(rb==RZ!_vO68ovnF5 zWqCYtHrnZPvedS^;yn8&>_YN2ENoX&N zpISaTkyt5$yUw*TRW-jS=dvXAwAabwQ#pPfyN)pv7RfE%Lj2l6R5WQ9KIpXRzi~;b za;@Wo@=ovVu~lc@bB$R59JK*DfS#S5l}*V51}6kl(!p3BVF=#c{;LDksxc}$Itf@A z@DPS9*YlztC`XQ*y<0&f|M0hL0PjT-FY^wj^)e(KD3d7M2WLuE(ME0*s9FGZEW^5* zuzL^TWdNSeJ(k{?M)LoF6NbtwL$1iAXKG>sNn3`zU%637>zRi6`FYz)l}2SA15k`u ziV)8qu|NF%`-f*v-TYP1D3$9Sr4}W^CW;My(39c5oQxiE;$Y$`)3jubvK1LR(i9}R za>H!Al2530)I^V`hT4S{Wd!}fV*2T-FT1s%6$MRuo@v-j7Dz%-Prkk}Itkp&4X0;!Z+dcIAtX_B)E?xO59#>PNa%*rP z(I@>FL(1MbjSghKAPZCqqGh1qlK_1W2*rocg#D{5rN%v7c|}S7lruv~54q7{%!Bz8zC`4Q+G;fIkGjQ&UsJ!>qmo zqKnSLqQxq(x0}Wrfq{U&&JW<)Je3Ga)(3o-X;@`F9~|KpxXfDN{io-McSX{=;TV&S zR`yC}$iEaK))A;1s{>e2|_D#Cc@^n$x*FiZO4wlcgEemgqat z%Q)&*-2R~p*W&j;!f)Tlx1;VC!iMhm)(YMJ;6mqLTP@1;;ON!Y4{uJF1vM z=r@zEDE(q+6AF+|Yv%)t#9RY?J9fm;>(iKdr=FHiHw3a)TORHRY&}yAU|V_C)}%f| z|JeON&{`<^t9MR(v(bG>@sdj zHu0b*EY*~?dqkWTi%?U%SpvA+9dhf!GgajVFO^jcpqP?=bCGLp!RXhc2(8gRw=&be zp&<_rI|Xd5N16YZERB_0Bnt-tHVuDh<{HTsPr8?w*f*%{t7uoIw4t@{Fex%IDt#K} z$d%*eV}3~k{^LHGLxCpgK)14lz;=9W_)*|}+fxrEp38JMqGYBVGY)E=sqr=L%uy7N zs2zL~HacNyA?2aptnA-fmi8!|X~s|{P%TP&v+3alAE8qtpGb8h57A1<-%MtXyElHa z>~f;PNQB~tI!XGc4t4Y%vQa=4uz`u>Xnn`r_%OgOyOP1*Gdt0v=z-le^hCp@vXnv* z&ZZuYWiy3*YEyxYu^MsAM7cqXvAN;A=gk9wy7Gq(pLkjgLQNry5`vQxQ+d<#=7ERP zY}ti`J?E)5ay*B9_zs_?uTHdr!zrp0!8)zl&KCtlv+1fUFyTe8nUTula+OO0$_0rn{Q}}%FZ$b zy47eUa^64B_SDb%=K9OBlFCp^lMZz+XUm6k*X_W$TrJVh_B|U2;t%hEwT*(B`dOn` z&l|Bx3e?kac#~m`>;c0D3A7%-|9X#^C;9N%TZI@Wy`=k*d&}k#fFA@+-nCq8V?-AV=x7n22uLWw6rvY*hGztB(1vj=pROnga@^kw;(97r2&ul2A9f+$HbInLSCi$-yVY+n>H5y#ZL5 zE%DCBs&Q*#Tp>oQW?^Y5xuHQRf1)zIT*SNt4=u{$(CGD7<_WnF6C1b`xR>~9bW=}jW0Iz(6<#w!XK1VKsJ`c8A#OGtyp4in1=L_|bPnc4A=+J6}sJIF1- z&#zI>JY4agQ|ABd;DO)AGeLUnMAtSp3HTT(^hjejW-kG%!#KcKk7~no5>s1*9ANSp zy88Xmt7BPuLG$C?)2L8ib0-H1(F_Sa^Qa>w)3wHaO&`koZj5pOJ0Ci)XZmH3d6?d% z@s}N^O6n>!!lXJZ^6#1K$$|+Z?e3XQ5Ep%7KMwt{I(rvqY#Sl>({3bvCIHJXp#Bj&O=^|Uwesf z7!YIh8;qMRE8Xq_0hTEx^Wly~6Mj8CYdUwhrD#x&%tuwl0*lSBN$GF@nX3*y-YUHO z=Q>C=g(jB=ZC@3UB74J%X?guxRs7=>aFk3dJpM(^GTfZXYPU`VzBo67BQ}6Aw(&xR z69w6*l(vjsEB^L+Yx^T3V(s0T1j~(#`N$^}D5*)1e5WBPkA%T4xI&} zCEwN9(Y4C2pr+YN4-&_y;UfnGe)Q7o{aVHO_)e?x!pU>@^jAm-PM zqw_I#V8d~@X#Q>?w6uw+z6$82qbeM`Qmg0cPS1Gzw-Ims)gVwF`tSB4*@F(i1o|F2 z(ZJ$#aHw>`H_ik2c>%~nr*nVkxr`{9YjRI2^4gRBewY6FD2%>BJ7uebDYYNzX%&?) z>%Qow+RFAFfUF1REg<#O6BDW2DGmGrKqLxY27SDD`*c<=hN+K!UC z?Fa=KBnK#YB3;+L5tV=S z#+1hs*(1>0_uR>Ur8@CnUr;^oK;RG$zw+b1@9ZxLPUrv<*v_VtrPUs3#rVD_m(|J& zr5zQWy0c%6Lv*X@dbB$36*UQqv&Qvz^;?T?$d7k!Le2jH-=QZ_Z^)(BSOYx*jxF0N ze!3oT?HEyaiO0eLQuf%mA>>-!QKCEIPEC@Eg!Ui^`Sgxy$r;R>yS7a?t$HL9slAzi z<0T+4aM|vZz_d)XwAKrWDQS?L`M^WH!9hpI4Qh`NHC}901GDgP&L1j)y>|D)P48HL zV*hP)s390-1TsETZ|`11aHII*wtrod=mtn6k>-_hm|WFuemQAc6OT*}LMCdULv*E8Osh+|i2AseY`jNIvE8(8 z7q8kOa_PR9$i2pR;~M4Z1BuwuF3UP)oA?mbJpu|nmZ`tTO*{H185s-km;BJlk{iG1 zDnFnKc3mB2C6{IgPY?MzfEtk`2=s2R(>!*vr*k`b1xz8d3G;v#z1suN<@>qP3xD2# z0AzNAGe^f!yTwnYMD5U|WbdZJ(`ZB7CP#3c_1OU2--{~IY(P&!Wlp1DlKn(LU!ns$ zDI4%3sYE2(p|ih#_&$w64}7IM^eG}>@6l${$e--ckc^mO&#GsLw zf*|(LSTK$V^i>buE?lmVM3(BN-hh{>#B=}{{FIi3mNtGQ->w8VTDPl#dQ6T%(h9Ki z8qnjoGPJMb{_j}9uMjjP30OK(+gli|zc&G&NrGxudaGIiCSuf%_AkD-TnUtc^_$MT@Y)8DfYE3L{s*=$*c{-XzNkOBy9P3NB{`k%kY zdlSP;PK%GH%>a?Zh%D!Vu6^2f&e6H0VquzyPs?l~HIM`~hII4L)6v~!fZSv%DKK{E zoGzog3oT>x@1y&_dUOle9Sgy=y?Dx&Vloh~pg*oB36dHY5g->@I``ZiFYWUB<=5W%sTI=PhGmD2B1hc^B6# ze>`38J8$bWR9D;Q{49n#t>w?V!bl4TLy1@ONdNtQ{L=}>pC(7pw1UwYm=yvQuv@2J zGzGyAIL1I6zk_fJKwA_DjBK{A&5!aOIbtL@IyOK8qYI8ZTkDcA0|+9PSqNOawY}{@ z&2swpUcX=68J+=7YAnjhR^U$$6}3y7uHgR+7|t}94xbT(m-0q&@2D1RlzSHVJYa^= z1xmgBobnd@23dl8_UwTUBHs(}!9Ph#{r>cfP@$sSVBd91%T50LWj*8&aOwb#WDg^} zCN;kEJvXt6$nDCFZh$n&VY;V~o|RPyS{U})=oFa zhkyDqqjMByAT@-Hwb=TBwOVm#2u)JTr~m8a@)sE9e4IKB92Ci~BB+kC3YZEx)<{xf zSRGq<|Fom9bK*#l=i}0M^iMxIK8+;o+BJvwx!UePk(>@1rPB~~&Vz49O@}Qp#J$gCE;#y~k7bm;YpnbHx5<8j;gp4C|b2)=& z&;4(dR53&mS@Orv&m8{KBOdc2rge|E$M&A}fxz~AQtM8V5;X&hjN6^!GgT&+dLD2? zZ)ySnST}Fn(4=0y`9_XG2Fg??=3GBL(Wc6PdUL0``nVoYXFmhOLfI|Bm)?lrD64fPaC|Ixg-dsgtqDhszG zaNkSX<7tJgYka9!Bi|(bWv9ctHZqM+?QHD9v+o_G@POkS0qEo+9uO4wTJbhfH(yPM3rTm3V=zPl|_i=&q=+Y z7UHCG`zI{^bQMuIC|I~BZ*T?00|DoRn`@suI7@5ZBOs@lA?sD7rlHXWu3l(#EP*07 zK1q}R=HPEI?{CgUiy1EV)T^dff7$^h;@t?iU%M)CEs07mq3v7%noSUONGj&TJx-@V zNArTD0jIAeqyu}C8V~;+$Njq3|6}xXGvT8=c}MsB`8%@m9dYbr&p76k2$uC41%@>O zKdNDyhsY_HLs=JOl>cI*4GRlveEphNkp?pq8>?bamuW&B`FqfbxTpX5 zpAukouhaJY>50ZGJ);YW2RM-p$;*?)P9OjL$w3vi$}j0(`HJrD&i3Efupl@&KaV4% zmAz1&@%!<#Hy7H#B(Horrp(6hA7SEe=U&MP=iYn&_2mCu-Ty4}AHR`IAqvlew$C=; zjRnX_*z%MH@p?3o$rA`Lc!!6FC4GOMgOKDN2?>c&bL;(X=Wup3JCF%z{auDOkG%kn zZlQ_U2B|-czmXp5iPEbox;FFYUIe8QWbCw8pF-}B6MgGxaFw>?p0l%3*fSyY3T==a z@`3#Ib!rYBR)LC!iE|1X`2HHd3WQw`Vmbsn$MoF~me%K<9MY@&j{(|WHsk9CJjgRS zG&y{~dg0%860b&#V7uT}+W~OO1M`q!ar7ZfnB!?6vj~rfXayb#hrio1gw9kRNy09y zjqO0!o~+jea02x7^eWr}aa{t{|4S!sEOcPj(f_i$oo@Q=%~L8Yj7QM+8y~MG zI&NO5P`==u=x>uo`=#df;?|c3yKXj@%l98TuJ^vX`+M_<<@j^Tt)&9R6r=?eXo{8M z7av(=g%A;wqyF13M$9DS?$fVM+s6L)zYkGTphMvc1;i7tpxlT^PZe8m0~c2O`r@Rn zfdLMQ$B-$NyGGxLPDGsMa0&ILaTjHJfz+0Yi}iLk>vunIi*mXgy&Xqr0klKJB$)Z_ zAPWvcD}0Qs@WXfeqvSKsLz<9sN-FY9pf4J&sAyAOQNhQ}eZGF~&4CeJ)R${nK41Ja zI~8{Wv~_ipK!i99B~TX>U~z!Jr_-jvx5utqSuhg#0wYDzfOxy^BO0-6e8X;)K`zN> zxkDPBQ+8xwOp)xpaa(d5&J_(NGT#zmR)k3A3P&c zHn>8w6He$8jaEtFXm{l7$p~G(Y^h|bRDt`c~b(M#KiMk3VkN~|fOmH*oY z!=H^sEj?lE=mG1hE_I>YF3 zJd(sxX^Hh2Ohx4G$AyV!fu9$2kv}e~CE$RZQvb;W8O4>E=X9a?U z@YloprW*3;9&{nM#cdbYm7{3m?(S|6Y9a_zCUQ^xKF?f{CiddPBl4Z&iModq5H4z< zBk``_t&1RZbKky&o6ELgNVKU*;HprUDLFXgd4B)+M*ocrjHvQSNiEYp4ru}7@$$FJ zGB!D>>+OBq6idy2m7`Kx*?_}WTa=E_Lp_Js!AZ;PUP+m6Vi>#EyI&WS`}O*FP)Wut@k*pTPcyGK~ij z*ncA8A>kv?kZxHYR4c!;Hu@gmKUaku23jT54ykA}0@@(&80n@3SDdu8w6ta;BO;Fm z`+FliK7rf1hop#G(|oFQG9Gx#lp{YH-}S4;6P}xgc84Xg^;0~=Rc?12~wjd z7yus{w7GPCt9SGfb$U)@MCIROh%h%p0J zG+{_LJryg;_{V3Q;ypk?tj$=HgU`E89fQnwN)wtJA`^mi`a^h(~ez)eh7AQ zMn*=Y2^`^vLP}Q@H(p~)g;U}BS2I{ZA$Akwg3PTGpggM^6jTSQ5-KWp-_9N$^(V*k z#>w*_*fOv|wL|G@yk@ae&R$r0&@)N?XT#pZctj(;DgUclu;@V5%BRbDu;9d$l&9?! z7zmE;4S?{R`-hX}RV-rS;)W)sruSW2atN9Lwh(aWdwpA-2^ptI&Cs?sohcw(dUEN5 z4#KUE^kB;$PLkpdQHuQ^*JNgf1_PT2vT!e01h~2P@RHP>{Q9)lItgJBgZBLIK|$0G z@r&@HqatKhDlVNjf({<^$7J^CD>#J}3wW{m9Vkcm^)PySm?rq!y{w_F32Ao_&Iy?rcgfzGj|)cQ3mIHv)Q_8mB8WerX?y|#E&8NL zGmyQ#ePzSlySGZ`Y8hm*lyUm?WjVu8%xs19OSJclhkl0;W{7EQYrQKt6^Z|FG9%Re?;O4V6iw1vtx);wWPQ@rG zFd_E^nGr;U&JeB(@GjMbGIxz0aL(O&#IZm0HS1Vk(9G^p;D~(jmr(;nhsLZ#JLOJj zyU44lIaBgtS{T%y?Zj>(X5wtU-{J)X$vxxtlJq^WzFJNGBqLzPAadY^$ieN4l$<&N zw>V;Or@Y(*>2XCuV_X4_QN^)ew0T!Ezet#NT=DmvZNT@+uYEep6Bw%gU2$LuHaP<7x-#tnlv zlD5`b6jQqm08bGF`6=ToNw}T82j$_5C|e4 z=6Unx&0tH48!MsAKq(Lj1!-Ip6bN}pFN=o!F$gsDt)5=ugBHbOrtZ@}tL>+}Y|a61 zAQB7t0WFX{G`S__!RT7;Ar(!;4_5b1PP_rap<#+*wyw`C{O7~xRmCWo% zd>HM6IpU*^oym~IgJfO;;_UJbvZrm?^GAACrGqc7Fw-dGet5#X&iiT~S9nK-1Mcl& z?;qPJYU}8@lUGx@1K|ue636jcAifO-C-@f}|NoW>kp(h+i}Wbvk2MZ{KCgU0`5ZEb z569lx+M0mC$AALz@$#xhV%c7ORy^h(lZI;H|J;X^9p2Xm?^>CfbQgb&;mjR zIuJ?G&J&x?t!-_x$9&~U3E3;uVQ?HH3r|Z03B0#E=PAriooa)WBt5aa)LO1Oc5f&` zY7oPEbnGAgBJ(B#WyHuiFVVXvC`8Xx8X-&=%&#mu++QD%W>5WrFv=rP7IQaJxIx;P zbst;T4p_me*X9%;l5-ylTx|tWLLZBdU8)3~!-ys%PeETuMF?eAY)^+UF1 z`u6OzOA_L#FI_6K@U&yNccJU{kDbAvcX5xlUwkh~N-~huKK0mI3}^vsp>;cNPmR>G zNJ56TR1PA`!Kt4L1h$tbRF(gnsrzi*rpx-cc(4%kQr{g2SbUS1k>Q8G-F1!jq9AdQ zaOc+gBH|cG$&pwfCT2f(vy-4A>5ZVAdB!n|7!Lpobxxj4K^$VxN=1$~2ppb`_W(hT zwv*;(`Bwa0V6+@~l5UIv>sK1I6Y5^Q`r-_>>EL@v?N#IO41_ma2R6LKnv7sN%l1sk z&#wxx+Y1Zr;?dir-;D2TXv?s>^a;*zhVB)lRX8Z1s5qqG1bGnIPoV+I&}_gu;03Z* z0ctSbqPSCr=HvSjFv2Yh2G*i1XA>GVUl1*YGZ@4}e|#mafGoahzWLDjgZsEd@NysZ zyUTVB9UL4u?xifS5ZqMXgD8Aduk`B|guL)RVIw0W6oT^r$l3~Vs~Bi@x!j?5J`}oF zpusF_uVZWWiar1$D?@9b*Ylw%4T7Jc=b0QK5C0;0`S3W159B;^m!?0oKN1iZcP&7* zd{n@Ws6me65&^!1H|Ih`=F8^{KjkEnql; z`9&*fMn=Z6bDA?*s4B8fRmV3;-eR<_%D6{}(OLjyHk&U&n^&qPZe1SJRNP2FA~gCe zK$kv=@=SLZ#BKd>4Nd}uUuz^p_#V5!L2wWEA%6CpwbUU(es&s%oPFl0pMRaa!`~-g zB6sLq9(iNb@3HT{^7QNAY#UoCEj3i>B3n?CopN)@h{_?%!Js*0J>vnWkJfKkZ#4`W zd6hLVa0WU0Jcz~00YOJXzRc8a2oJ6=eCiV*4*PS+SK%m%Ey`42S@P?EB#6PdMk>Ot0s~WMM#>Lm*`)&;JhXAj zxF#7SE`XbHatECLi(nhk<}%tI91URQ`}VV-n4WE~Jg-kV?NX%rX@xNC z#RbXRW@t+ufoP0~n9LA~Y5p=35bqrZ6(1?%&X@NmI+ykS$Ie0Q2bCm?PWeSWr}w!O zrr7Cz|B}m}qgqfc`>*KW0-a?$fq4v>NlXCN;7TVGq;d)>KPL@jr_h$A=R)P40|n%4 zKoBA8N~;utx{*WRu0r--c~DSX+{ct6(tTv*U|FdQ{ZCUYG6@UsAnV__UH(YpJGo1E z-SwG@t}&nb&1~=%Z<`J?pK%L?hP|EAq%|ST?nZC@7=mVj%$x%K7{cTC%wk-8snm1l{)N)V8IZ#gFu;vB;E4s)kewpD_f&iCWu0wsV+m#3LxsK2kv`1t zi;$okuHSNR?dnRKnQ_h^`DsdTPOP{+WjJ0nc{>S0b*&l_%szWlcjvP}Ygd>Vxd<>- z<;9EO4i>WK0yJ+2u2`_{SIZ~EJ z+%cZPP@WrMlm^=+vXfxRP4FfCuYmEnV3K?H*)vbM0fm7spg=nVsh8;i8HrHMc> zs@L}?K>kWQ($gya=?K#mB`cKtiXa{1VOL8e)yQbtzT8n;GrV%%R(6> zM+8*Y2_!ZkX5FaJ_BIhm&<-%UdBM9o?w_0rs)j}#?g#1o)mB+t+@YT(JC&PczrC?6 z2{U|{&6x^55fKsV)OJ~d>l=Z0BS39UtV
    GKHvCMW=7xg|9VI>^L$dTPaFOqL}X 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 TO}>ynfIl)4Q1Sd1uf6^sp_3F! literal 0 HcmV?d00001 diff --git a/examples/93_blackwell_low_latency_gqa/readme.md b/examples/93_blackwell_low_latency_gqa/readme.md new file mode 100644 index 00000000..09c62508 --- /dev/null +++ b/examples/93_blackwell_low_latency_gqa/readme.md @@ -0,0 +1,73 @@ +# Blackwell Low Latency GQA + +This example introduces TGV GQA, a CuTe C++-based Blackwell kernel optimized for low latency (low batch) generation phase GQA. +To compile and run this example: +```bash +# in cutlass top level directory +mkdir build && cd build +cmake .. -DCUTLASS_NVCC_ARCHS=100a -DCUTLASS_ENABLE_TESTS=OFF -DCUTLASS_ENABLE_EXAMPLES=ON -DCUTLASS_ENABLE_LIBRARY=OFF +cd examples/93_blackwell_low_latency_gqa +make +./93_blackwell_low_latency_gqa --kvL 8192 --kvH 8 --qH 64 --BS 1 +``` + +Supported configs are: +- dH = 64/128 +- bf16/fp8 non block scaling kv cache, fp32/bf16/fp8 output +- QKVO are all dH major +- Arbitrary seq len and batch size +- CUDA graph support +- Flash decoding, configurable number of splits +- Cluster reduction with configurable number of reduction cta +- Attention sink and sliding window + +Unsupported features are: +- Persistent schedule +- MTP +- Paged KV cache + +## Kernel Design + +Each cluster (of size `1x1xMAX_SPLITS`) works on a single kv head in a batch. +It divides the kvL (kv sequence length) evenly into each CTA in the cluster in flash decoding style. +And the final reduction is performed by `NUM_REDUCTION_CTA` number of CTAs in the cluster in parallel. + +![cta](./figures/cta.png) + +The example figure above shows a problem size of 1 batch, 2 KV heads, 4 Q heads. +Each cluster processes 1 batch, 1 KV head, 2 Q heads. +And the KV sequence length is divided into 6 128-length tiles, and we evenly distribute the 6 tiles to 4 CTAs in the cluster. +CTA0 and CTA1 will get 2 tiles while CTA2 and CTA3 will get 1 tile each. +In the reduction phase of flash decoding, in this configuration, only 2 CTAs in the cluster will participate in the final reduction. +So each of CTA in the cluster will send their partial results (`Acc2`) to the 2 reduction CTAs in the cluster. + +We have 7 warps in total, 1 for DMA_Q, 1 for DMA_KV, 1 for MMA, 4 for EPILOG (softmax + cluster reduction). +The imagine below shows the how the data flows across the warps as well as how the control dependencies are established between the warps. + +![tgv_gqa](./figures/tgv_gqa.png) + +## Fmax Reduction Mapping + +We want to get fmax for each column (q token) of the fmax tensor. +Each thread individually get fmax for all q tokens using credux (and inter warp reduction). +Then T0,32,64,96 stores the local fmax to destination cta's dsmem for whole cluster wide fmax reduction. +Each reduction cta will hold the cluster wide fmax values of 2 q tokens (8 q tokens in total, divided by 4 reduction ctas). + +![fmax_mapping](./figures/fmax.png) + +## Fsum Reduction Mapping + +We want to get fsum for each column (q token) of the fsum tensor. +Do a reswizzle of fsum tensor in rmem through smem such that each thread holds a partial column of the fsum tensor. +Then do intra-thread and intra-warp reduction to get the fsum for each column (q token). +Then T0,32,64,96 stores the local fsum to destination cta's dsmem for whole cluster wide fsum reduction. +Each reduction cta will hold the cluster wide fsum values of 2 q tokens (8 q tokens in total, divided by 4 reduction ctas). + +![fsum_mapping](./figures/fsum.png) + +## Acc2 Reduction Mapping + +Each thread in the reduction cta will be responsible for generating 2 q tokens in the final output tensor (8 q tokens in total, divided by 4 reduction ctas). +The reduction is a scaled accumulation (similar to the correction step in attention mainloop). + +![acc2_mapping](./figures/acc2.png) diff --git a/examples/93_blackwell_low_latency_gqa/tgv_gqa.cu b/examples/93_blackwell_low_latency_gqa/tgv_gqa.cu new file mode 100644 index 00000000..90f847bb --- /dev/null +++ b/examples/93_blackwell_low_latency_gqa/tgv_gqa.cu @@ -0,0 +1,750 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Example implementation of low latency GQA for the NVIDIA Blackwell SM100/SM103 + architecture using CUTLASS 3. + + Input tensor shapes: + K has shape (kvL, dH, kvH, BS) + Q has shape ((qHLocal, qL), dH, kvH, BS) + V has shape (dH, kvL, kvH, BS) + O has shape (dH, (qHLocal, qL), kvH, BS) + kvL is max_seq_len, seq_lens[BS] is the actual seq len for each batch + sinks has shape (qHLocal * kvH), i.e. one sink per q head + + Example usage: + $ ./examples/93_blackwell_low_latency_gqa --kvL 8192 --kvH 8 --qH 64 --BS 1 +*/ + +// Standard library includes +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// Use Thrust to handle host/device allocations +#include +#include + +// Cutlass includes +#include +#include +#include + +// CuTe includes +#include // CuTe tensor implementation + +#include "tgv_gqa.cuh" + +using namespace cute; + +// K (kvL, dH, kvH, BS) +// Q ((qHLocal, qL), dH, kvH, BS) +// V (dH, kvL, kvH, BS) +// O (dH, (qHLocal, qL), kvH, BS) +// seq_lens (BS) +// Sinks ((qHLocal, qL), kvH) +template < + class TypeAcc, + int CTA_kvL, + bool NoSink, + class TensorQ, + class TensorK, + class TensorV, + class TensorO, + class TensorSinks> +void +reference_gqa( + TensorK const& tensor_K, + TensorQ const& tensor_Q, + TensorV const& tensor_V, + TensorO const& tensor_O, + int* seq_lens, + TensorSinks const& tensor_Sinks, + float softmax_scale, + int sliding_window_size) { + + using TypeQKV = typename TensorQ::element_type; + using TypeO = typename TensorO::element_type; + + using namespace cute; + int kvL = size<0>(tensor_K); + int dH = size<1>(tensor_K); + int kvH = size<2>(tensor_K); + int BS = size<3>(tensor_K); + int qHLocal = size<0>(shape<0>(tensor_Q)); + int qL = size<1>(shape<0>(tensor_Q)); + + // reference code don't handle oob either + //assert(kvL % CTA_kvL == 0); + int MaxKVBlocks = cutlass::ceil_div(kvL, CTA_kvL); + + // allocate intermediate tensors + thrust::host_vector host_Acc1(kvL * qHLocal * qL * kvH * BS); + auto tensor_Acc1 = make_tensor(host_Acc1.data(), make_layout(make_shape(kvL, make_shape(qHLocal, qL), kvH, BS))); // (kvL, (qHLocal, qL), kvH, BS) + + // CTA level fmax and fsum + thrust::host_vector host_Fmax(MaxKVBlocks * qHLocal * qL * kvH * BS); + Tensor tensor_Fmax = make_tensor(host_Fmax.data(), make_layout(make_shape(MaxKVBlocks, make_shape(qHLocal, qL), kvH, BS))); // (MaxKVBlocks, (qHLocal, qL), kvH, BS) + fill(tensor_Fmax, -cutlass::platform::numeric_limits::infinity()); + + thrust::host_vector host_Fsum(MaxKVBlocks * qHLocal * qL * kvH * BS); + Tensor tensor_Fsum = make_tensor(host_Fsum.data(), make_layout(make_shape(MaxKVBlocks, make_shape(qHLocal, qL), kvH, BS))); // (MaxKVBlocks, (qHLocal, qL), kvH, BS) + clear(tensor_Fsum); + + thrust::host_vector host_P(CTA_kvL * MaxKVBlocks * qHLocal * qL * kvH * BS); + Tensor tensor_P = make_tensor(host_P.data(), make_layout(make_shape(make_shape(CTA_kvL, MaxKVBlocks), make_shape(qHLocal, qL), kvH, BS))); // ((CTA_kvL, MaxKVBlocks), (qHLocal, qL), kvH, BS) + + thrust::host_vector host_P_converted(CTA_kvL * MaxKVBlocks * qHLocal * qL * kvH * BS); + Tensor tensor_P_converted = make_tensor(host_P_converted.data(), make_layout(make_shape(make_shape(CTA_kvL, MaxKVBlocks), make_shape(qHLocal, qL), kvH, BS))); // ((CTA_kvL, MaxKVBlocks), (qHLocal, qL), kvH, BS) + + thrust::host_vector host_Acc2(dH * qHLocal * qL * kvH * MaxKVBlocks * BS); + auto tensor_Acc2 = make_tensor(host_Acc2.data(), make_layout(make_shape(dH, make_shape(qHLocal, qL), kvH, BS, MaxKVBlocks))); // (dH, (qHLocal, qL), kvH, BS, MaxKVBlocks) + + // cluster level fmax and fsum + thrust::host_vector host_Fmax_cluster(qHLocal * qL * kvH * BS); + Tensor tensor_Fmax_cluster = make_tensor(host_Fmax_cluster.data(), make_layout(make_shape(make_shape(qHLocal, qL), kvH, BS))); // ((qHLocal, qL), kvH, BS) + + thrust::host_vector host_Beta(qHLocal * qL * kvH * MaxKVBlocks * BS); + Tensor tensor_Beta = make_tensor(host_Beta.data(), make_layout(make_shape(make_shape(qHLocal, qL), kvH, BS, MaxKVBlocks))); // ((qHLocal, qL), kvH, BS, MaxKVBlocks) + + thrust::host_vector host_Fsum_cluster(qHLocal * qL * kvH * BS); + Tensor tensor_Fsum_cluster = make_tensor(host_Fsum_cluster.data(), make_layout(make_shape(make_shape(qHLocal, qL), kvH, BS))); // ((qHLocal, qL), kvH, BS) + + float softmax_scale_log2 = softmax_scale * static_cast(M_LOG2E); + + for (int _BS = 0; _BS < BS; ++_BS) { + int seq_len = seq_lens[_BS]; + int NumKVBlocks = cutlass::ceil_div(seq_len, CTA_kvL); + int kvL_start = (sliding_window_size == 0) ? 0 : std::max(0, seq_len - sliding_window_size); + int kvBlock_start = kvL_start / CTA_kvL; + + // bmm1 s = q * k * softmax_scale_log2 + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + int start = _kvBlock * CTA_kvL; + int end = std::min(start + CTA_kvL, seq_len); + assert(start < end); + for (int _kvL = start; _kvL < end; ++_kvL) { + TypeAcc acc = TypeAcc(0.f); + for (int _dH = 0; _dH < dH; ++_dH) { + acc += tensor_K(_kvL, _dH, _kvH, _BS) * tensor_Q(make_coord(_qHLocal, _qL), _dH, _kvH, _BS); + } + tensor_Acc1(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS) = (_kvL < kvL_start) ? -INFINITY : (acc * softmax_scale_log2); + } + } + } + } + } + + // calculate m_ij + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + int start = _kvBlock * CTA_kvL; + int end = std::min(start + CTA_kvL, seq_len); + assert(start < end); + TypeAcc& fmax = tensor_Fmax(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS); + fmax = tensor_Acc1(start, make_coord(_qHLocal, _qL), _kvH, _BS); + for (int _kvL = start + 1; _kvL < end; ++_kvL) { + fmax = std::max(fmax, tensor_Acc1(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS)); + } + } + } + } + } + + // calculate p = exp2f(s - m_ij) + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + int start = _kvBlock * CTA_kvL; + int end = std::min(start + CTA_kvL, seq_len); + assert(start < end); + for (int _kvL = start; _kvL < end; ++_kvL) { + tensor_P(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS) = std::exp2f(tensor_Acc1(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS) - tensor_Fmax(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS)); + } + } + } + } + } + + // calculate l_ij = sum(p) + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + int start = _kvBlock * CTA_kvL; + int end = std::min(start + CTA_kvL, seq_len); + assert(start < end); + TypeAcc sum = TypeAcc(0.f); + for (int _kvL = start; _kvL < end; ++_kvL) { + sum += tensor_P(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS); + } + tensor_Fsum(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS) = sum; + } + } + } + } + + // convert P from fp32 to bf16/fp8 + cutlass::NumericConverter converter_p; + for (int i = 0; i < tensor_P(_,_,_,_BS).size(); i++) { + tensor_P_converted(_,_,_,_BS)[i] = converter_p(tensor_P(_,_,_,_BS)[i]); + } + + // bmm2 acc2 = v * p + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _dH = 0; _dH < dH; ++_dH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + int start = _kvBlock * CTA_kvL; + int end = std::min(start + CTA_kvL, seq_len); + assert(start < end); + TypeAcc acc = TypeAcc(0.f); + for (int _kvL = start; _kvL < end; ++_kvL) { + acc += tensor_V(_dH, _kvL, _kvH, _BS) * tensor_P_converted(_kvL, make_coord(_qHLocal, _qL), _kvH, _BS); + } + tensor_Acc2(_dH, make_coord(_qHLocal, _qL), _kvH, _BS, _kvBlock) = acc; + } + } + } + } + } + + // calculate cluster level fmax and fsum + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + TypeAcc& fmax = tensor_Fmax_cluster(make_coord(_qHLocal, _qL), _kvH, _BS); + fmax = tensor_Fmax(kvBlock_start, make_coord(_qHLocal, _qL), _kvH, _BS); + for (int _kvBlock = kvBlock_start + 1; _kvBlock < NumKVBlocks; ++_kvBlock) { + fmax = std::max(fmax, tensor_Fmax(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS)); + } + + // calculate beta + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + tensor_Beta(make_coord(_qHLocal, _qL), _kvH, _BS, _kvBlock) = std::exp2f(tensor_Fmax(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS) - fmax); + } + + // calculate fsum + TypeAcc sum = TypeAcc(0.f); + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + sum += tensor_Fsum(_kvBlock, make_coord(_qHLocal, _qL), _kvH, _BS) * tensor_Beta(make_coord(_qHLocal, _qL), _kvH, _BS, _kvBlock); + } + tensor_Fsum_cluster(make_coord(_qHLocal, _qL), _kvH, _BS) = sum; + if constexpr (!NoSink) { + tensor_Fsum_cluster(make_coord(_qHLocal, _qL), _kvH, _BS) += std::exp2f(tensor_Sinks(make_coord(_qHLocal, _qL), _kvH) * (float)M_LOG2E - fmax); + } + } + } + } + + // convert O from fp32 to bf16/fp8 + cutlass::NumericConverter converter_o; + // final reduction + for (int _kvH = 0; _kvH < kvH; ++_kvH) { + for (int _dH = 0; _dH < dH; ++_dH) { + for (int _qHLocal = 0; _qHLocal < qHLocal; ++_qHLocal) { + for (int _qL = 0; _qL < qL; ++_qL) { + TypeAcc acc = TypeAcc(0.f); + for (int _kvBlock = kvBlock_start; _kvBlock < NumKVBlocks; ++_kvBlock) { + acc += tensor_Acc2(_dH, make_coord(_qHLocal, _qL), _kvH, _BS, _kvBlock) * tensor_Beta(make_coord(_qHLocal, _qL), _kvH, _BS, _kvBlock); + } + tensor_O(_dH, make_coord(_qHLocal, _qL), _kvH, _BS) = converter_o(acc / tensor_Fsum_cluster(make_coord(_qHLocal, _qL), _kvH, _BS)); + } + } + } + } + } + + /*int example_row = 0; + int example_kvH = 0; + int example_kvBlock = 0; + int example_BS = 3; + print("tensor_Acc1:\t"); print(tensor_Acc1(_, _, example_kvH, example_BS)); print("\n"); + print("tensor_Fmax:\t"); print_tensor(tensor_Fmax(example_kvBlock,_,example_kvH,example_BS)); print("\n"); + print("tensor_P:\t"); print_tensor(tensor_P(make_coord(example_row, example_kvBlock),_,example_kvH,example_BS)); print("\n"); + print("tensor_Fsum:\t"); print_tensor(tensor_Fsum(example_kvBlock,_,example_kvH,example_BS)); print("\n"); + print("tensor_P_converted:\t"); print_tensor(tensor_P_converted(make_coord(example_row, example_kvBlock),_,example_kvH,example_BS)); print("\n"); + print("tensor_Acc2:\t"); print_tensor(tensor_Acc2(example_row,_,example_kvH,example_BS,example_kvBlock)); print("\n"); + print("tensor_Fmax_cluster:\t"); print_tensor(tensor_Fmax_cluster(_,example_kvH,example_BS)); print("\n"); + print("tensor_Beta:\t"); print_tensor(tensor_Beta(_,example_kvH,example_BS,_)); print("\n"); + print("tensor_Fsum_cluster:\t"); print_tensor(tensor_Fsum_cluster(_,example_kvH,example_BS)); print("\n"); + print("tensor_O:\t"); print_tensor(tensor_O(example_row,_,example_kvH,example_BS)); print("\n");*/ +} + +template +void +initialize_tensor(Tensor& tensor, cute::tuple value_range = {-4, 4}) { + using DataType = typename Tensor::element_type; + auto [min, max] = value_range; + for (int i = 0; i < cute::size(tensor); i++) { + tensor(i) = DataType(int((max-min)*(rand() / double(RAND_MAX)) + min)); + } +} + +// Compares two CuTe tensors with torch.allclose semantics +// Returns true if: |input_i - other_i| <= atol + rtol x |other_i| for all elements +template +bool +cute_allclose( + TensorInput const& input, + TensorOther const& other, + float rtol = 1e-05f, + float atol = 1e-08f, + bool equal_nan = false) { + using namespace cute; + + // Tensors must have the same size + if (size(input) != size(other)) { + std::cerr << "Error: Tensor sizes don't match. input size: " << size(input) + << ", other size: " << size(other) << std::endl; + return false; + } + + int mismatches = 0; + const int max_print = 10; // Only print first 10 mismatches + + for (int i = 0; i < size(input); ++i) { + float input_val = float(input(i)); + float other_val = float(other(i)); + + // Handle NaN comparison + bool input_is_nan = std::isnan(input_val); + bool other_is_nan = std::isnan(other_val); + + if (input_is_nan || other_is_nan) { + if (equal_nan && input_is_nan && other_is_nan) { + continue; // Both NaN and equal_nan is true + } + else if (input_is_nan || other_is_nan) { + if (mismatches < max_print) { + std::cerr << "Mismatch at index " << i << ": input=" << input_val + << ", other=" << other_val << " (NaN detected)" << std::endl; + } + mismatches++; + continue; + } + } + + // Check torch.allclose condition: |input - other| <= atol + rtol * |other| + float diff = std::abs(input_val - other_val); + float threshold = atol + rtol * std::abs(other_val); + + if (diff > threshold) { + if (mismatches < max_print) { + std::cerr << "Mismatch at index " << i << ": input=" << input_val + << ", other=" << other_val << ", diff=" << diff + << ", threshold=" << threshold << std::endl; + } + mismatches++; + } + } + + if (mismatches > 0) { + std::cerr << "Total mismatches: " << mismatches << " out of " << size(input) << " elements" << std::endl; + return false; + } + + return true; +} + +struct ProblemStride { + int stride_Q_kvH; + int stride_Q_qHLocal; + int stride_Q_qL; + int stride_Q_dH; + int stride_Q_BS; + + int stride_K_kvH; + int stride_K_kvL; + int stride_K_dH; + int stride_K_BS; + + int stride_V_kvH; + int stride_V_kvL; + int stride_V_dH; + int stride_V_BS; + + int stride_O_kvH; + int stride_O_qHLocal; + int stride_O_qL; + int stride_O_dH; + int stride_O_BS; +}; + +ProblemStride make_gqa_stride(int kvH, int qHLocal, int qL, int kvL, int dH, int BS) { + ProblemStride stride; + + // Q shape ((qHLocal, qL), dH, kvH, BS), where dH is contiguous + // slowest moving dim->fastest moving dim: BS, qL, kvH, qHLocal, dH + stride.stride_Q_kvH = qHLocal * dH; + stride.stride_Q_qHLocal = dH; + stride.stride_Q_qL = kvH * qHLocal * dH; + stride.stride_Q_dH = 1; + stride.stride_Q_BS = kvH * qHLocal * dH * qL; + + // K shape (kvL, dH, kvH, BS), where dH is contiguous + // slowest moving dim->fastest moving dim: BS, kvL, kvH, dH + stride.stride_K_kvH = dH; + stride.stride_K_kvL = kvH * dH; + stride.stride_K_dH = 1; + stride.stride_K_BS = kvL * dH * kvH; + + // V shape (dH, kvL, kvH, BS), where dH is contiguous + // slowest moving dim->fastest moving dim: BS, kvL, kvH, dH + stride.stride_V_kvH = dH; + stride.stride_V_kvL = kvH * dH; + stride.stride_V_dH = 1; + stride.stride_V_BS = kvL * dH * kvH; + + // O shape (dH, (qHLocal, qL), kvH, BS), where dH is contiguous + // slowest moving dim->fastest moving dim: BS, qL, kvH, qHLocal, dH + stride.stride_O_kvH = qHLocal * dH; + stride.stride_O_qHLocal = dH; + stride.stride_O_qL = kvH * qHLocal * dH; + stride.stride_O_dH = 1; + stride.stride_O_BS = kvH * qHLocal * dH * qL; + + return stride; +} + +class GQATester { +public: + // Kernel config constants + using TypeQKV = cutlass::bfloat16_t; + using TypeO = cutlass::bfloat16_t; + using TypeAcc = float; + static constexpr int CTA_qHLocal = 8; + static constexpr int CTA_qL = 1; + static constexpr int CTA_kvL = 128; + static constexpr int CTA_dH = 64; + static constexpr int BMM1_DMA_Stage = 3; + static constexpr int BMM2_DMA_Stage = 3; + static constexpr int MaxSplits = 8; + static constexpr int NumReductionCTA = 8; + static constexpr bool NoSink = true; + +private: + int kvH_, qHLocal_, qL_, kvL_, dH_, BS_; + float softmax_scale_; + ProblemStride stride_; + int sliding_window_size_; + + // Host vectors + thrust::host_vector host_Q_; + thrust::host_vector host_K_; + thrust::host_vector host_V_; + thrust::host_vector host_O_; + thrust::host_vector host_reference_O_; + thrust::host_vector host_seq_lens_; + thrust::host_vector host_sinks_; + + // Device vectors + thrust::device_vector device_Q_; + thrust::device_vector device_K_; + thrust::device_vector device_V_; + thrust::device_vector device_O_; + thrust::device_vector device_seq_lens_; + thrust::device_vector device_sinks_; + +public: + GQATester(int kvH, int qH, int qL, int kvL, int dH, int BS, float softmax_scale, int sliding_window_size) : + kvH_(kvH), qHLocal_(qH / kvH), qL_(qL), kvL_(kvL), dH_(dH), BS_(BS), softmax_scale_(softmax_scale), sliding_window_size_(sliding_window_size) { + assert(sliding_window_size_ >= 0); + // Allocate host memory + host_Q_.resize(kvH_ * qHLocal_ * qL_ * dH_ * BS_); + host_K_.resize(kvH_ * kvL_ * dH_ * BS_); + host_V_.resize(kvH_ * kvL_ * dH_ * BS_); + host_O_.resize(kvH_ * qHLocal_ * qL_ * dH_ * BS_); + host_reference_O_.resize(kvH_ * qHLocal_ * qL_ * dH_ * BS_); + host_seq_lens_.resize(BS_); + host_sinks_.resize(qHLocal_ * kvH_); // one sink per q head + + stride_ = make_gqa_stride(kvH_, qHLocal_, qL_, kvL_, dH_, BS_); + + // Create host CuTe tensors for initialization + auto host_tensor_Q = make_tensor(host_Q_.data(), TGV::gqa::make_layout_Q(kvH_, qHLocal_, qL_, dH_, BS_, stride_.stride_Q_kvH, stride_.stride_Q_qHLocal, stride_.stride_Q_qL, stride_.stride_Q_dH, stride_.stride_Q_BS)); + auto host_tensor_K = make_tensor(host_K_.data(), TGV::gqa::make_layout_K(kvH_, kvL_, dH_, BS_, stride_.stride_K_kvH, stride_.stride_K_kvL, stride_.stride_K_dH, stride_.stride_K_BS)); + auto host_tensor_V = make_tensor(host_V_.data(), TGV::gqa::make_layout_V(kvH_, kvL_, dH_, BS_, stride_.stride_V_kvH, stride_.stride_V_kvL, stride_.stride_V_dH, stride_.stride_V_BS)); + auto host_tensor_sinks = make_tensor(host_sinks_.data(), TGV::gqa::make_layout_sinks(qHLocal_, qL_, kvH_)); + + // Initialize Q, K, V tensors with random values + initialize_tensor(host_tensor_Q); + initialize_tensor(host_tensor_K); + initialize_tensor(host_tensor_V); + // have batch size matching kvL (i.e. max seq len) for now + bool test_var_seq_lens = false; + for (int i = 0; i < BS_; ++i) { + if (test_var_seq_lens) { + host_seq_lens_[i] = rand() % kvL_ + 1; + } + else { // all the batch have the same seq len + host_seq_lens_[i] = kvL_; + } + } + for (int i = 0; i < qHLocal_ * kvH_; ++i) { + host_sinks_[i] = rand() / (float)RAND_MAX; + } + + // Allocate device memory and copy H2D + device_Q_ = host_Q_; + device_K_ = host_K_; + device_V_ = host_V_; + device_O_.resize(kvH_ * qHLocal_ * qL_ * dH_ * BS_); + device_seq_lens_ = host_seq_lens_; + device_sinks_ = host_sinks_; + + gpuErrChk(cudaDeviceSynchronize()); + } + + void run_kernel(bool pdl, int pdl_count = -1, cudaStream_t stream = 0) { + TGV::gqa::gqa_host< + TypeQKV, TypeO, TypeAcc, + CTA_qHLocal, CTA_qL, CTA_kvL, CTA_dH, + BMM1_DMA_Stage, BMM2_DMA_Stage, + MaxSplits, + NumReductionCTA>( + device_K_.data().get(), device_Q_.data().get(), device_V_.data().get(), device_O_.data().get(), + device_seq_lens_.data().get(), + NoSink ? nullptr : device_sinks_.data().get(), + kvH_, qHLocal_, qL_, kvL_, dH_, BS_, + stride_.stride_K_kvH, stride_.stride_K_kvL, stride_.stride_K_dH, stride_.stride_K_BS, + stride_.stride_Q_kvH, stride_.stride_Q_qHLocal, stride_.stride_Q_qL, stride_.stride_Q_dH, stride_.stride_Q_BS, + stride_.stride_V_kvH, stride_.stride_V_kvL, stride_.stride_V_dH, stride_.stride_V_BS, + stride_.stride_O_kvH, stride_.stride_O_qHLocal, stride_.stride_O_qL, stride_.stride_O_dH, stride_.stride_O_BS, + softmax_scale_, + sliding_window_size_, + pdl, pdl_count, stream); + } + + bool verify() { + // Run the GPU kernel + run_kernel(false); + gpuErrChk(cudaDeviceSynchronize()); + + // Copy D2H + host_O_ = device_O_; + + // Create tensors for verification using helper methods + auto host_tensor_Q = make_tensor(host_Q_.data(), TGV::gqa::make_layout_Q(kvH_, qHLocal_, qL_, dH_, BS_, stride_.stride_Q_kvH, stride_.stride_Q_qHLocal, stride_.stride_Q_qL, stride_.stride_Q_dH, stride_.stride_Q_BS)); + auto host_tensor_K = make_tensor(host_K_.data(), TGV::gqa::make_layout_K(kvH_, kvL_, dH_, BS_, stride_.stride_K_kvH, stride_.stride_K_kvL, stride_.stride_K_dH, stride_.stride_K_BS)); + auto host_tensor_V = make_tensor(host_V_.data(), TGV::gqa::make_layout_V(kvH_, kvL_, dH_, BS_, stride_.stride_V_kvH, stride_.stride_V_kvL, stride_.stride_V_dH, stride_.stride_V_BS)); + auto host_tensor_O = make_tensor(host_O_.data(), TGV::gqa::make_layout_O(kvH_, qHLocal_, qL_, dH_, BS_, stride_.stride_O_kvH, stride_.stride_O_qHLocal, stride_.stride_O_qL, stride_.stride_O_dH, stride_.stride_O_BS)); + auto host_reference_tensor_O = make_tensor(host_reference_O_.data(), TGV::gqa::make_layout_O(kvH_, qHLocal_, qL_, dH_, BS_, stride_.stride_O_kvH, stride_.stride_O_qHLocal, stride_.stride_O_qL, stride_.stride_O_dH, stride_.stride_O_BS)); + auto host_seq_lens_tensor = make_tensor(host_seq_lens_.data(), make_layout(make_shape(BS_))); + auto host_tensor_sinks = make_tensor(host_sinks_.data(), TGV::gqa::make_layout_sinks(qHLocal_, qL_, kvH_)); + + gpuErrChk(cudaDeviceSynchronize()); + + print("host_seq_lens_tensor:\t"); print_tensor(host_seq_lens_tensor); + print("host_tensor_Q:\t"); print(host_tensor_Q); print("\n"); + print("host_tensor_K:\t"); print(host_tensor_K); print("\n"); + print("host_tensor_V:\t"); print(host_tensor_V); print("\n"); + print("host_tensor_O:\t"); print(host_tensor_O); print("\n"); + print("host_reference_tensor_O:\t"); print(host_reference_tensor_O); print("\n"); + print("host_tensor_sinks:\t"); print(host_tensor_sinks); print("\n"); + + // Execute reference GQA kernel + reference_gqa( + host_tensor_K, host_tensor_Q, host_tensor_V, host_reference_tensor_O, host_seq_lens_.data(), host_tensor_sinks, softmax_scale_, sliding_window_size_); + + // Compare results using torch.allclose semantics + // For bfloat16, use more relaxed tolerances due to reduced precision + bool success = cute_allclose(host_tensor_O, host_reference_tensor_O, + 1e-2f, // rtol (relative tolerance) + 1e-3f); // atol (absolute tolerance) + //print("host_tensor_O:\t"); print_tensor(host_tensor_O(_,_,0)); print("\n"); + //print("host_reference_tensor_O:\t"); print_tensor(host_reference_tensor_O(_,_,0)); print("\n"); + + std::cout << "Execution is " << ((success) ? "successful." : "failed.") << std::endl; + + return success; + } + +}; + +void benchmark_gqa(int kvH, int qH, int qL, int kvL, int dH, int BS, float softmax_scale, int sliding_window_size, bool pdl, int pdl_count, int num_testers = 4, int bench_iters = 100) { + std::cout << "=== GQA Benchmark ===" << std::endl; + std::cout << "Problem size: kvH=" << kvH << ", qH=" << qH << ", qL=" << qL << ", kvL=" << kvL << ", dH=" << dH << ", BS=" << BS << ", sliding_window_size=" << sliding_window_size << std::endl; + std::cout << "Number of testers (L2 thrashing): " << num_testers << std::endl; + std::cout << "Benchmark iterations: " << bench_iters << std::endl; + + // Create multiple tester instances to thrash L2 cache + std::vector> testers; + for (int i = 0; i < num_testers; ++i) { + testers.push_back(std::make_unique(kvH, qH, qL, kvL, dH, BS, softmax_scale, sliding_window_size)); + } + std::cout << "Created " << num_testers << " GQATester instances" << std::endl; + + // Create CUDA stream for graph capture + cudaStream_t stream; + gpuErrChk(cudaStreamCreate(&stream)); + + // Capture CUDA graph + std::cout << "Capturing CUDA graph..." << std::endl; + cudaGraph_t graph; + cudaGraphExec_t graph_exec; + + gpuErrChk(cudaStreamBeginCapture(stream, cudaStreamCaptureModeGlobal)); + // Capture round robin execution pattern + for (int iter = 0; iter < bench_iters; ++iter) { + int tester_idx = iter % num_testers; + // Note: We need to run kernels on the same stream for graph capture + // This requires modifying the kernel launch to accept a stream parameter + // For now, we'll capture a simpler pattern and measure accordingly + testers[tester_idx]->run_kernel(pdl, pdl_count, stream); + } + gpuErrChk(cudaStreamEndCapture(stream, &graph)); + gpuErrChk(cudaGraphInstantiate(&graph_exec, graph, NULL, NULL, 0)); + std::cout << "CUDA graph captured and instantiated" << std::endl; + + // Warmup: run kernels in round robin fashion + std::cout << "Starting warmup..." << std::endl; + gpuErrChk(cudaGraphLaunch(graph_exec, stream)); + gpuErrChk(cudaDeviceSynchronize()); + std::cout << "Warmup completed" << std::endl; + + // Benchmark: replay graph and measure time + std::cout << "Starting benchmark..." << std::endl; + + // Create CUDA events for timing + cudaEvent_t start_event, stop_event; + gpuErrChk(cudaEventCreate(&start_event)); + gpuErrChk(cudaEventCreate(&stop_event)); + + gpuErrChk(cudaProfilerStart()); + gpuErrChk(cudaEventRecord(start_event, stream)); + gpuErrChk(cudaGraphLaunch(graph_exec, stream)); + gpuErrChk(cudaEventRecord(stop_event, stream)); + gpuErrChk(cudaProfilerStop()); + + gpuErrChk(cudaDeviceSynchronize()); + + // Calculate timing + float total_time_ms; + gpuErrChk(cudaEventElapsedTime(&total_time_ms, start_event, stop_event)); + + float avg_time_ms = total_time_ms / bench_iters; + float avg_time_us = avg_time_ms * 1000.0f; + + // Calculate FLOPS + long long ops = 2LL * qH * qL * kvL * dH * 2LL * BS; // 2 ops per multiply-add + double gflops = (ops * bench_iters) / (total_time_ms * 1e6); + double gflops_per_iter = ops / (avg_time_ms * 1e6); + + // Calculate DRAM bandwidth + long long bytes_per_iter = ((long long)kvH * kvL * dH * 2 * sizeof(GQATester::TypeQKV) + (long long)qH * qL * dH * (sizeof(GQATester::TypeQKV) + sizeof(GQATester::TypeO))) * BS; // Q(bf16) + K(bf16) + V(bf16) + O(bf16) + float avg_dram_bw_gbps = (bytes_per_iter / (avg_time_ms / 1000.0f)) / (1024.0f * 1024.0f * 1024.0f); + + // Report results + std::cout << "\n=== Benchmark Results ===" << std::endl; + std::cout << "Average time per iteration: " << avg_time_ms << " ms (" << avg_time_us << " μs)" << std::endl; + std::cout << "GFLOPS per iteration: " << gflops_per_iter << std::endl; + std::cout << "Average DRAM bandwidth: " << avg_dram_bw_gbps << " GB/s" << std::endl; + + // Cleanup + gpuErrChk(cudaGraphExecDestroy(graph_exec)); + gpuErrChk(cudaGraphDestroy(graph)); + gpuErrChk(cudaEventDestroy(start_event)); + gpuErrChk(cudaEventDestroy(stop_event)); + gpuErrChk(cudaStreamDestroy(stream)); + + std::cout << "=== Benchmark Complete ===" << std::endl; +} + + +int main(int argc, char* argv[]) { + srand(time(NULL)); + + int kvH = 8; // num KV head + int qH = 64; // num Q head + int qL = 1; // Q sequence length + int kvL = 2048; // KV sequence length + int dH = 64; // hidden dimension + int BS = 1; // batch size + float softmax_scale = 1.0f / (float)sqrt(dH); + int sliding_window_size = 0; // when sliding_window_size = 0, it's disabled + bool pdl = false; + // don't support it yet + int pdl_count = -1; + + // arg parsing + while (1) { + static struct option long_options[] = { + {"kvL", required_argument, 0, 0}, + {"kvH", required_argument, 0, 0}, + {"qH", required_argument, 0, 0}, + {"qL", required_argument, 0, 0}, + {"BS", required_argument, 0, 0}, + {"sliding_window_size", required_argument, 0, 0}, + {0, 0, 0, 0} // denote end of array + }; + + int option_index = 0; + // M no argument + // M: required argument + // M:: optional argument + int c = getopt_long(argc, argv, "", long_options, &option_index); + + if (c==-1) break; + switch (c) { + case 0: + // Long option + if (option_index == 0) kvL = atoi(optarg); + else if (option_index == 1) kvH = atoi(optarg); + else if (option_index == 2) qH = atoi(optarg); + else if (option_index == 3) qL = atoi(optarg); + else if (option_index == 4) BS = atoi(optarg); + else if (option_index == 5) sliding_window_size = atoi(optarg); + break; + default: assert(false); + } + } + + GQATester tester(kvH, qH, qL, kvL, dH, BS, softmax_scale, sliding_window_size); + bool success = tester.verify(); + std::cout << "Correctness test " << (success ? "PASSED" : "FAILED") << std::endl; + + benchmark_gqa(kvH, qH, qL, kvL, dH, BS, softmax_scale, sliding_window_size, pdl, pdl_count, 100, 1000); +} diff --git a/examples/93_blackwell_low_latency_gqa/tgv_gqa.cuh b/examples/93_blackwell_low_latency_gqa/tgv_gqa.cuh new file mode 100644 index 00000000..303aa876 --- /dev/null +++ b/examples/93_blackwell_low_latency_gqa/tgv_gqa.cuh @@ -0,0 +1,2215 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include + +// Cutlass includes +#include +#include +#include +#include // mma/smem selector, umma::major +#include +#include + +// CuTe includes +#include // CuTe tensor implementation +#include // TMEM allocator for SM100 +#include + +#define gpuErrChk(ans) { gpuAssert2((ans), __FILE__, __LINE__); } +inline void gpuAssert2(cudaError_t code, const char *file, int line, bool abort=true) { + if (code != cudaSuccess) { + fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); + if (abort) exit(code); + } +} + +namespace TGV { +namespace gqa { + +using namespace cute; + +float constexpr Log2_E = static_cast(M_LOG2E); + +// K has shape (kvL, dH, kvH, BS) +// Q has shape ((qHLocal, qL), dH, kvH, BS) +// V has shape (dH, kvL, kvH, BS) +// O has shape (dH, (qHLocal, qL), kvH, BS) + +// flash decode triton code +/* +# bmm1 +q = tl.load(q_ptrs) # [BLOCK_qL, BLOCK_dH] +k = tl.load(k_ptrs) # [BLOCK_kvL, BLOCK_dH] +qk = tl.dot(q, k.T) * sm_scale # [BLOCK_qL, BLOCK_kvL] + +# softmax(qk), all the variable names are from FA paper +m_ij = tl.max(qk, axis=1) # [BLOCK_qL,] +p = tl.exp(qk - m_ij[:, None]) # [BLOCK_qL, BLOCK_kvL] +# l_ij = exp(qk_n0+1 - m_ij) + ... + exp(qk_n1 - m_ij) +l_ij = tl.sum(p, axis=1) # [BLOCK_qL,] + +# store m_ij and l_ij +tl.store(mij_ptrs, m_ij) +tl.store(lij_ptrs, l_ij) + +# bmm2 +v = tl.load(v_ptrs) # [BLOCK_kvL, BLOCK_dH] +acc = tl.dot(p.to(q.dtype), v) # [BLOCK_qL, BLOCK_dH] +tl.store(acc_ptrs, acc) +*/ + +// Store value to remote shared memory in the cluster +CUTE_DEVICE void +store_shared_remote_f32(float value, uint32_t dsmem_addr, uint32_t remote_barrier_addr) { + asm volatile("st.async.shared::cluster.mbarrier::complete_tx::bytes.f32 [%0], %1, [%2];" + : : "r"(dsmem_addr), "f"(value), "r"(remote_barrier_addr)); +} + +// given a smem tensor, return the dsmem tensor for the given rank, the tensor addr is in smem addr space (not generic addr space) +template +CUTE_DEVICE auto +get_dsmem_tensor(Tensor tensor, int rank) { + using T = typename decltype(tensor)::value_type; + // tensor.data().get() is the smem addr in the generic addr space, in the generic addr space a region is reserved for smem + // doing ld/st to this region of the generic addr space will be converted into ld.shared/st.shared to the smem addr space by the compiler + // the mapa (and many inline ptx) instruction's input and output addr are in the smem/dsmem addr space, so we need to explicitly convert from generic to shared addr space + uint32_t smem_addr = __cvta_generic_to_shared(tensor.data().get()); // smem addr space + // mapa to get the dsmem addr of this tensor in another CTA + uint32_t dsmem_addr = set_block_rank(smem_addr, rank); // smem addr space + return make_tensor(make_smem_ptr((T*)dsmem_addr), tensor.layout()); +} + +// Helper methods to create layouts +// K always has the shape (kvL, dH, kvH, BS) +// kvH has to be the last dim because we do mma partitioning to the first two dims (M, K) in gemm terminology +// we only index into kvH after cta level partitioning +// it can has arbitrary stride as long as dH (K in gemm terminology) is contiguous +auto make_layout_K( + int kvH, int kvL, int dH, int BS, + int stride_kvH, int stride_kvL, int stride_dH, int stride_BS +) { + assert(stride_dH == 1); + return make_layout(make_shape(kvL, dH, kvH, BS), make_stride(stride_kvL, Int<1>{}, stride_kvH, stride_BS)); +} + +// Q always has the shape ((qHLocal, qL), dH, kvH, BS), qH = kvH * qHLocal +// kvH has to be the last dim because we do mma partitioning to the first two dims (N, K) in gemm terminology +// we only index into kvH after cta level partitioning +// it can has arbitrary stride as long as dH (K in gemm terminology) is contiguous +auto make_layout_Q( + int kvH, int qHLocal, int qL, int dH, int BS, + int stride_kvH, int stride_qHLocal, int stride_qL, int stride_dH, int stride_BS +) { + assert(stride_dH == 1); + return make_layout(make_shape(make_shape(qHLocal, qL), dH, kvH, BS), make_stride(make_stride(stride_qHLocal, stride_qL), Int<1>{}, stride_kvH, stride_BS)); +} + +// V always has the shape (dH, kvL, kvH, BS) +// kvH has to be the last dim because we do mma partitioning to the first two dims (M, K) in gemm terminology +// we only index into kvH after cta level partitioning +// it can has arbitrary stride as long as dH (M in gemm terminology) is contiguous +auto make_layout_V( + int kvH, int kvL, int dH, int BS, + int stride_kvH, int stride_kvL, int stride_dH, int stride_BS +) { + assert(stride_dH == 1); + return make_layout(make_shape(dH, kvL, kvH, BS), make_stride(stride_dH, stride_kvL, stride_kvH, stride_BS)); +} + +// O always has the shape (dH, (qHLocal, qL), kvH, BS), qH = kvH * qHLocal +// kvH has to be the last dim because we do mma partitioning to the first two dims (M, N) in gemm terminology +// we only index into kvH after cta level partitioning +// it can has arbitrary stride as long as dH (M in gemm terminology) is contiguous +auto make_layout_O( + int kvH, int qHLocal, int qL, int dH, int BS, + int stride_kvH, int stride_qHLocal, int stride_qL, int stride_dH, int stride_BS +) { + assert(stride_dH == 1); + return make_layout(make_shape(dH, make_shape(qHLocal, qL), kvH, BS), make_stride(stride_dH, make_stride(stride_qHLocal, stride_qL), stride_kvH, stride_BS)); +} + +// sinks always has the shape ((qHLocal, qL), kvH) +// the real shape is (qHLocal * kvH), but we give qL stride 0 to make CTA indexing cleaner +// so different qL maps to the same sink value +auto make_layout_sinks( + int qHLocal, int qL, int kvH +) { + return make_layout(make_shape(make_shape(qHLocal, qL), kvH), make_stride(make_stride(Int<1>{}, Int<0>{}), qHLocal)); +} + +// simplified from cutlass/include/cutlass/gemm/kernel/static_tile_scheduler.hpp +// allow for easy extention to other types of tile scheduler +struct WorkTileInfo { + int BS_idx = 0; + int kvH_idx = 0; + // each cta process kv block range [kvL_idx_start, kvL_idx_end) + int kvL_idx_start = 0; + int kvL_idx_end = 0; + int dH_idx = 0; // for bmm2 tiling + int qHLocal_idx = 0; + int qL_idx = 0; + bool is_valid_tile = false; + + CUTLASS_HOST_DEVICE bool + is_valid() const { + return is_valid_tile; + } + + CUTLASS_HOST_DEVICE + static WorkTileInfo + invalid_work_tile() { + return {-1, -1, -1, -1, -1, -1, -1, false}; + } +}; + +// The shared memory buffers for Q, K, V matrices. +template < + class TypeQKV, // Tensor Q/K/V data type + class TypeAcc, // Tensor Acc data type + class KSmemLayout, // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + class QSmemLayout, // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + class VSmemLayout, // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + class SSmemLayout, // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) aka C matrix (M, N, 1) for bmm1 + class PSmemLayout, // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) aka B matrix (N, K, 1) for bmm2 + class WRSmemLayout, // (NumEpilogWarps, (CTA_qHLocal, CTA_qL)), WR stands for warp reduce + class MSMailboxSmemLayout,// (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA), MS stands max and sum + class Acc1SmemLayout, // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + class Acc2MailboxSmemLayout, // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + class SinksSmemLayout, // (CTA_qHLocal * CTA_qL / NumReductionCTA) + int BMM1_DMA_Stage, + int BMM2_DMA_Stage> +struct SharedStorage { + // for bmm1 + alignas(128) cute::ArrayEngine> K; // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + alignas(128) cute::ArrayEngine> Q; // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + // for bmm2 + alignas(128) cute::ArrayEngine> V; // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + alignas(128) cute::ArrayEngine> P; // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) + // for softmax to get CTA wide max and sum + alignas(128) cute::ArrayEngine> FmaxPartial; // (NumEpilogWarps, (CTA_qHLocal, CTA_qL)) + // for softmax to get cluster wide max and sum + alignas(128) cute::ArrayEngine> FmaxMailbox; // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + alignas(128) cute::ArrayEngine> FsumMailbox; // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + // staging bufferfor making acc1 rmem layout easier for softmax reduction + alignas(128) cute::ArrayEngine> Acc1; // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + // for final flash decode reduction + alignas(128) cute::ArrayEngine> Acc2Mailbox; // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + // for attention sinks + alignas(128) cute::ArrayEngine> Sink; // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + // BMM1 iterate over dH (i.e. K dimension) + alignas(16) cute::uint64_t tma_bmm1_full_barrier[BMM1_DMA_Stage]; // Barrier between TMA/softmax and BMM1, TMA/softmax tells BMM1 the tile is ready/full, BMM1 can start consuming it + alignas(16) cute::uint64_t tma_bmm1_empty_barrier[BMM1_DMA_Stage]; // Barrier between BMM1 and TMA, BMM1 tells TMA the tile is empty, TMA can start loading the next tile + + // BMM2 iterate over kvL (i.e. K dimension) + alignas(16) cute::uint64_t tmasoftmax_bmm2_full_barrier[BMM2_DMA_Stage]; // Barrier between TMA/softmax and BMM2, TMA/softmax tells BMM2 the tile is ready/full, BMM2 can start consuming it + alignas(16) cute::uint64_t tma_bmm2_empty_barrier[BMM2_DMA_Stage]; // Barrier between BMM2 and TMA, BMM2 tells TMA the tile is empty, TMA can start loading the next tile + + alignas(16) cute::uint64_t bmm1_softmax_full_barrier; // Barrier between BMM1 and softmax, BMM1 tells softmax the tile is ready/full, softmax can start consuming it + alignas(16) cute::uint64_t bmm2_epilog_full_barrier; // Barrier between BMM2 and epilog, BMM2 tells epilog the tile is ready/full, epilog can start consuming it + + // for cluster reduction + alignas(16) cute::uint64_t maxsum_mailbox_full_barrier; // barrier indicating the st.async of fmax and fsum are done + alignas(16) cute::uint64_t acc2_mailbox_full_barrier; // barrier indicating the st.async of acc2 are done + + alignas(16) cute::uint32_t bmm1_tmem_base_ptr; // Base pointer for TMEM allocation, BMM1 MMA will allocate TMEM here + alignas(16) cute::uint32_t bmm2_tmem_base_ptr; // Base pointer for TMEM allocation, BMM2 MMA will allocate TMEM here + + // for cp.async to write to + int seq_len; + + CUTE_DEVICE constexpr auto tensor_sK() { return make_tensor(make_smem_ptr(K.begin()), KSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sQ() { return make_tensor(make_smem_ptr(Q.begin()), QSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sV() { return make_tensor(make_smem_ptr(V.begin()), VSmemLayout{}); } + // it's the same tensor P, just different views (layouts) + CUTE_DEVICE constexpr auto tensor_sS() { return make_tensor(make_smem_ptr(P.begin()), SSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sP() { return make_tensor(make_smem_ptr(P.begin()), PSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sFmaxPartial() { return make_tensor(make_smem_ptr(FmaxPartial.begin()), WRSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sAcc1() { return make_tensor(make_smem_ptr(Acc1.begin()), Acc1SmemLayout{}); } + + // mailbox + CUTE_DEVICE constexpr auto tensor_sFmaxMailbox() { return make_tensor(make_smem_ptr(FmaxMailbox.begin()), MSMailboxSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sFsumMailbox() { return make_tensor(make_smem_ptr(FsumMailbox.begin()), MSMailboxSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sAcc2Mailbox() { return make_tensor(make_smem_ptr(Acc2Mailbox.begin()), Acc2MailboxSmemLayout{}); } + CUTE_DEVICE constexpr auto tensor_sSink() { return make_tensor(make_smem_ptr(Sink.begin()), SinksSmemLayout{}); } +}; + +// generic TMA copy device function that works on any tensor for 1 stage +template < + class GTensor, + class STensor, + class TmaAtom, + char Name, + bool DummyIter, // if true, don't issue any real tma load, only set barrier tx count to 0, keep the full/empty barrier pipeline running + bool Print, + int DMA_Stage> +CUTLASS_DEVICE void +TMA_copy( + GTensor gTensor, // ((TMA, NumTma_K), Tiles_K) + STensor sTensor, // ((TMA, NumTma_K), DMA_Stage or 1) + int k_tile, + int k_tile_base, // base index of the kblock that this CTA is going to work on + int& tma_mma_empty_barrier_phase_bit, + int tma_transaction_bytes, + TmaAtom const* tma_atom, + cute::uint64_t* tma_mma_full_barrier, + cute::uint64_t* tma_mma_empty_barrier +) { + + // a single kblock + // wait_barrier's input argument is the old phase bit + // it waits for the smem slot to be empty to start loading the next tile + wait_barrier(tma_mma_empty_barrier[k_tile % DMA_Stage], tma_mma_empty_barrier_phase_bit); + + if constexpr (Print) { + if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("[DMA_%c] barrier empty, kblock %d\n", Name, k_tile); + } + } + + if (elect_one_sync()) { + if constexpr (DummyIter) { + // set 0 transaction bytes for dummy iteration + set_barrier_transaction_bytes(tma_mma_full_barrier[k_tile % DMA_Stage], 0); + } + else { + // set the barrier transaction bytes to the number of bytes to load the tile, has to be done by a single thread + set_barrier_transaction_bytes(tma_mma_full_barrier[k_tile % DMA_Stage], tma_transaction_bytes); + // load Q tile into smem ((CTA_qHLocal, CTA_qL), CTA_dH) + copy(tma_atom->with(tma_mma_full_barrier[k_tile % DMA_Stage]), gTensor(_, k_tile_base + k_tile), sTensor(_,k_tile % DMA_Stage)); + } + } + + if ((k_tile % DMA_Stage) == (DMA_Stage - 1)) { + tma_mma_empty_barrier_phase_bit ^= 1; + } +} + +// generic MMA device function that works on any tensor for 1 stage +template < + class ATensor, + class BTensor, + class CTensor, + class TiledMMA, + char Name, + bool Print> +CUTLASS_DEVICE void +MMA_gemm( + ATensor tCrA, // ((Mma_M, Mma_K), NumMma_M, NumMma_K, DMA_Stage) + BTensor tCrB, // ((Mma_N, Mma_K), NumMma_N, NumMma_K, DMA_Stage) + CTensor tCtAcc, // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + TiledMMA tiled_mma, + int& stage_idx, + int& tma_mma_full_barrier_phase_bit, + UMMA::ScaleOut initial_accumulate, + cute::uint64_t* tma_mma_full_barrier, + cute::uint64_t* tma_mma_empty_barrier, + cute::uint64_t& mma_epilog_full_barrier +) { + int constexpr DMA_Stage = size<3>(tCrA); + + // setting it to 0 will clear the TMEM accumulator, setting it to one will reuse existing accumulator + tiled_mma.accumulate_ = initial_accumulate; + + // a single kblock + // wait for tma_mma_full_barrier to be full + wait_barrier(tma_mma_full_barrier[stage_idx], tma_mma_full_barrier_phase_bit); + + if constexpr (Print) { + if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("[MMA_%c] barrier full, kblock stage %d\n", Name, stage_idx); + } + } + + for (int k_block = 0; k_block < size<2>(tCrA); ++k_block) { + // execute a Mma_M x Mma_N x Mma_K GEMM + // for K * Q and V * P, both the B matrix has a single stage, so we can just use stage_idx = 0 for B + cute::gemm(tiled_mma, tCrA(_,_,k_block, stage_idx), tCrB(_,_,k_block, 0), tCtAcc); + // after the first mma instruction, we need to start accumulating the result + // i.e. basically do C += A * B + tiled_mma.accumulate_ = UMMA::ScaleOut::One; + } + // notify the DMA warp that the all the MMA issued prior to this tcgen05.commit is done, the smem slot is now empty and can be reused + cutlass::arch::umma_arrive(&tma_mma_empty_barrier[stage_idx]); + + stage_idx++; + // for every DMA_Stage number of iterations, we flip the phase bit such that we reuse the full barrier for another round of mma + if (stage_idx == DMA_Stage) { + tma_mma_full_barrier_phase_bit ^= 1; + stage_idx = 0; + } + + // notify the epilog warp that MMA is done, the tmem slot is now full and can be consumed + cutlass::arch::umma_arrive(&mma_epilog_full_barrier); +} + +enum class ReduceOp { + Sum, + Max, + Min +}; + +// Helper for dependent static_assert in templates +template inline constexpr bool dependent_false = false; + +// https://docs.nvidia.com/cuda/cuda-math-api/cuda_math_api/group__CUDA__MATH__SINGLE.html +template +CUTLASS_DEVICE float +reduce_op(float a, float b) { + if constexpr (Op == ReduceOp::Sum) { + return a + b; + } + else if constexpr (Op == ReduceOp::Max) { + return fmaxf(a, b); + } + else if constexpr (Op == ReduceOp::Min) { + return fminf(a, b); + } + else { + // gcc 11.2 evaluate static_assert first before instantiating the template + // so we make the condition template dependent to ensure it is evaluated after if-else branch condition is evaluated + // gcc 13.2 fixes this issue + static_assert(dependent_false, "Invalid reduce op"); + return 0; + } +} + +// generic warp reduce function that works on a single reg value +// according to semantics section of the ptx doc https://docs.nvidia.com/cuda/parallel-thread-execution/#data-movement-and-conversion-instructions-shfl-sync +// shfl.sync waits for all participating threads to reach this point, and then execute the shuffle instruction +// so we don't need to explicitly sync warp beforehand +// only supports full warp now, i.e. all 32 threads are active +template +CUTLASS_DEVICE float +warp_reduce(float val) { + // if it's doing float max or min, using the faster redux.sync instead of warp shuffle + if constexpr (Op == ReduceOp::Max) { + float result; + asm volatile("redux.sync.max.NaN.f32 %0, %1, 0xffffffff;\n" : "=f"(result) : "f"(val)); + return result; + } + else if constexpr (Op == ReduceOp::Min) { + float result; + asm volatile("redux.sync.min.NaN.f32 %0, %1, 0xffffffff;\n" : "=f"(result) : "f"(val)); + return result; + } + else { + float acc = val; + for (int i = 16; i >= 1; i /= 2) { + float new_val = __shfl_xor_sync(0xffffffff, acc, i, 32); + acc = reduce_op(acc, new_val); + } + return acc; + } +} + +// generic cta reduce function that works on a vector of reg values +// this is better than calling the same pattern on each reg value repeatedly because we coalesce the bar.sync before inter warp reduction into a single bar.sync +// the compiler can generate better pipelined code this way +// 1. do a warp reduce (redux.sync or warp shuffle) +// 2. first thread in each warp writes the warp reduce result to smem +// 3. sync across all participating warps/threads using named barrier to ensure smem write visibility +// 4. first thread in each warp reads all the warp reduce result from smem and do a reduction (separately for each warp) +// 5. first thread broadcast the cta reduce result to all threads in the warp +// this should work well when NumWarps is small, if it's big one should use another warp shuffle to do step 3 reduction +template < + ReduceOp Op, int NumWarps, + class RmemTensor, + class OTensor, + class SmemTensor> +CUTLASS_DEVICE void +cta_reduce( + RmemTensor val, // the value tensor to be reduced, we reduce each element across all participating threads + OTensor& out, // the output tensor, same shape as val, each threads hold the entire reduction result for each element + int warp_idx, // relative warp id that participate in the reduction, from 0 to NumWarps-1 + SmemTensor smem, // a tensor of shape (NumWarps, size(val)) to store the partial warp reduce result + cutlass::arch::NamedBarrier& warp_reduce_barrier +) { + + int lane_id = cutlass::canonical_lane_idx(); + for (int i = 0; i < size(val); i++) { + // step 1: do a warp reduce + float warp_reduce_result = warp_reduce(val(i)); + // step 2: first thread in each warp writes the warp reduce result to smem + if (lane_id == 0) { + smem(warp_idx, i) = warp_reduce_result; + } + } + // step 3: sync across all participating warps/threads using named barrier + // according to the ptx page, bar.sync has an implicit fence.cta to ensure smem write visibility + warp_reduce_barrier.arrive_and_wait(); + + // tried smem atomics and it's slower + for (int i = 0; i < size(val); i++) { + // step 4: first thread in each warp reads all the warp reduce result from smem and do a reduction (separately for each warp) + float acc = smem(0, i); + if (lane_id == 0) { + for (int j = 1; j < NumWarps; j++) { + acc = reduce_op(acc, smem(j, i)); + } + } + // step 5: first thread broadcast the cta reduce result to all threads in the warp + acc = __shfl_sync(0xffffffff, acc, 0, 32); + out(i) = acc; + } +} + +// this function acts on the transposed tensor of the above cta_reduce function +// what it effectively does is reducing values between all elements in val tensor and across consecutive NumThreads in the warp +template < + ReduceOp Op, + int NumThreads, // num consecutive threads to reduce + class RmemTensor> +CUTLASS_DEVICE float +cta_reduce_transposed( + RmemTensor val // per thread value tensor +) { + // 1. reduce all elements in val tensor (thread local reduction) + float acc = val(0); + for (int i = 1; i < size(val); i++) { + acc = reduce_op(acc, val(i)); + } + // 2. cross NumThreads thread reduce + for (int i = (NumThreads / 2); i >= 1; i /= 2) { + float new_val = __shfl_xor_sync(0xffffffff, acc, i, 32); + acc = reduce_op(acc, new_val); + } + return acc; +} + +// copied from SM100::TMEM::LOAD::copy_unpack cutlass/include/cute/atom/copy_traits_sm100.hpp +// what it does is given a tmem address, load the data into rmem tensor with the given tcgen05.ld copy op +template < + class CopyOp, + class TD, class DLayout> +CUTLASS_DEVICE void +tmem_load( + uint32_t tmem_addr, + Tensor& dst +) { + static_assert(is_rmem::value, "Expected RMEM dst."); + + using RegTypeDst = typename remove_extent::type; + Tensor rD = recast(dst); + + constexpr int RegNumDst = extent::value; + CUTE_STATIC_ASSERT_V(size(rD) == Int{}, + "The tcgen05.ld CopyOp's size does not match the destination tensor size."); + + detail::explode(CopyOp::copy, + &tmem_addr, seq<0>{}, + rD, make_seq{}); +} + +// copied from SM100::TMEM::STORE::copy_unpack cutlass/include/cute/atom/copy_traits_sm100.hpp +// what it does is given a tmem address, store the data in rmem tensor to the tmem address with the given tcgen05.st copy op +template < + class CopyOp, + class TS, class SLayout> +CUTLASS_DEVICE void +tmem_store( + Tensor& src, + uint32_t tmem_addr +) { + static_assert(is_rmem::value, "Expected RMEM src."); + + using RegTypeSrc = typename remove_extent::type; + Tensor rS = recast(src); + + constexpr int RegNumSrc = extent::value; + CUTE_STATIC_ASSERT_V(size(rS) == Int{}, + "The tcgen05.st CopyOp's size does not match the source tensor size."); + + detail::explode(CopyOp::copy, + rS, make_seq{}, + &tmem_addr, seq<0>{}); +} + +// issue cp.async +CUTLASS_DEVICE void +cp_async( + int* gmem_addr, + int* smem_addr +) { + uint32_t smem_int_ptr = cute::cast_smem_ptr_to_uint(smem_addr); + asm volatile("cp.async.ca.shared.global.L2::128B [%0], [%1], %2;\n" + :: "r"(smem_int_ptr), + "l"(gmem_addr), + "n"(sizeof(int))); +} + +// mapping between thread id (T) -> dH (row index of Acc2) +template +CUTLASS_DEVICE auto +make_bmm2_tmem_load_t_dH_layout() { + if constexpr (CTA_dH == 64) { + return make_layout(make_shape(Int<16>{}, Int<2>{}, Int<4>{}), make_stride(Int<1>{}, Int<0>{}, Int<16>{})); + } + else if constexpr (CTA_dH == 128) { + return make_layout(Int<128>{}); + } + else { + static_assert(dependent_false, "CTA_dH must be 64 or 128"); + return make_layout(Int<128>{}); + } +} + +// TMA load Q, guarded by griddepcontrol.wait +template < + class SharedStorage, + class WorkTileInfo, + class QTensor, + class TmaAtomQ, + class TiledBMM1, + int CTA_qHLocal, int CTA_qL, int CTA_dH> +CUTLASS_DEVICE void +DMA_Q_warp( + SharedStorage& shared_storage, + WorkTileInfo work_tile_info, + QTensor mQ, + // when passing tma descriptor as function argument, it has to be pass by pointer/reference, if pass by value, it will live on local memory (i.e. the stack) + // and the tma unit cannot access the local memory, (even if it can, the local memory is strided by thread id, the content for each thread is strided) + TmaAtomQ const* tma_atom_Q, + TiledBMM1 tiled_bmm1) { + + if (!work_tile_info.is_valid()) { + return; + } + + // tCsQ means the mma partitioned smem tensor sQ + Tensor tCsQ = shared_storage.tensor_sQ(); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + // now let's tile the gmem tensor first into the tile this CTA needs (i.e. CTA-level tiling), which is ((CTA_qHLocal, CTA_qL), CTA_dH, Num_CTA_dH) + // mQ has shape ((qHLocal, qL), dH, kvH, BS), after local_tile (without indexing), it becomes ((CTA_qHLocal, CTA_qL), CTA_dH, (Num_CTA_qHLocal, Num_CTA_qL), Num_CTA_dH, kvH, BS) + // there is only one tile on the dH dimension + Tensor gQ = local_tile(mQ, make_shape(make_shape(Int{}, Int{}), Int{}), + make_coord(make_coord(work_tile_info.qHLocal_idx, work_tile_info.qL_idx), _, work_tile_info.kvH_idx, work_tile_info.BS_idx)); // ((CTA_qHLocal, CTA_qL), CTA_dH, Num_CTA_dH) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the mma shape, to match the smem layout + ThrMMA cta_bmm1 = tiled_bmm1.get_slice(0); // 1 sm mma only has 1 thread in tiled_bmm1 + // tCgQ means the mma partitioned gmem tensor gQ + Tensor tCgQ = cta_bmm1.partition_B(gQ); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, Tiles_K) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the tma shape in preparation for tma copy + auto [tBgQ, tBsQ] = tma_partition(*tma_atom_Q, + Int<0>{}, // cta_coord: 1x1 cluster + Layout<_1>{}, // cta_layout: CTA coord -> logical multicast id, no multicast, just identity layout + group_modes<0,3>(tCsQ), group_modes<0,3>(tCgQ)); + // tBgQ: ((TMA, NumTma_N, NumTma_K), Tiles_K) get coalesced to ((TMA, NumTma_K), Tiles_K) since NumTma_N = 1 + // tBsQ: ((TMA, NumTma_N, NumTma_K), 1) get coalesced to ((TMA, NumTma_K), 1) since NumTma_N = 1 + // the shape of the TMA box is (CTA_qHLocal*CTA_qL, CTA_dH) + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("cta_bmm1:\t"); print(cta_bmm1); print("\n"); + printf("tCsQ:\t"); print(tCsQ); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + printf("gQ:\t"); print(gQ); print("\n"); // ((CTA_qHLocal, CTA_qL), CTA_dH, Num_CTA_dH) + printf("tCgQ:\t"); print(tCgQ); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, Tiles_K) + printf("tBgQ:\t"); print(tBgQ); print("\n"); // ((TMA, NumTma_K), Tiles_K) + printf("tBsQ:\t"); print(tBsQ); print("\n"); // ((TMA, NumTma_K), 1) + }*/ + + // only do griddepcontrol.wait on Q loading, Q is dependent on previous kernel + cutlass::arch::wait_on_dependent_grids(); + + int tma_transaction_bytes = sizeof(make_tensor_like(tBsQ(_,0))); + int k_tile_count = work_tile_info.kvL_idx_end - work_tile_info.kvL_idx_start; + + Tensor tCsK = shared_storage.tensor_sK(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + int constexpr DMA_Stage = size<3>(tCsK); + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("tBgQ:\t"); print(tBgQ); print("\n"); // ((TMA, NumTma_K), Tiles_K) + printf("tBsQ:\t"); print(tBsQ); print("\n"); // ((TMA, NumTma_K), 1) + printf("TmaBytes: %d\n", tma_transaction_bytes); + printf("k_tile_count: %d\n", k_tile_count); + printf("DMA_Stage: %d\n", DMA_Stage); + }*/ + + // initial phase bit for tma_mma_empty_barrier is 0, and it denotes smem slot is empty + // we wait on the "old" phase bit of 1, when it is "flipped" to 0 (the initial phase bit), the smem slot is empty + // so tma_mma_empty_barrier_phase_bit denotes the phase bit before the flip we are waiting on + // example for DMA_Stage = 2, i.e. 2 smem slots, 2 empty barriers a and b + // kblock 0: old phase bit of barrier a is 1, wait for barrier a's phase bit to change to 0 (the initial phase bit), 0 denotes slot a is empty, 1 denotes slot a is used by mma + // kblock 1: old phase bit of barrier b is 1, wait for barrier b's phase bit to change to 0 (the initial phase bit), 0 denotes slot b is empty, 1 denotes slot b is used by mma + // kblock 2: old phase bit of barrier a is 0, wait for barrier a's phase bit to change to 1 (flipped once), 1 denotes slot a is empty, 0 denotes slot a is used by mma + // kblock 3: old phase bit of barrier b is 0, wait for barrier b's phase bit to change to 1 (flipped once), 1 denotes slot b is empty, 0 denotes slot b is used by mma + // kblock 4: old phase bit of barrier a is 1, wait for barrier a's phase bit to change to 0 (flipped twice), 0 denotes slot a is empty, 1 denotes slot a is used by mma + // kblock 5: old phase bit of barrier b is 1, wait for barrier b's phase bit to change to 0 (flipped twice), 0 denotes slot b is empty, 1 denotes slot b is used by mma + // ... + int tma_mma_empty_barrier_phase_bit = 1; + + // Q0, _, _, ... + int k_tile = 0; + // fetch Q0, there is only 1 Q tile + TMA_copy(tBgQ, tBsQ, k_tile, 0, tma_mma_empty_barrier_phase_bit, tma_transaction_bytes, tma_atom_Q, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier); + k_tile++; + + // so the rest of the K tiles all share the same Q tile, so we just do dummy iterations + for (; k_tile < k_tile_count; k_tile++) { + TMA_copy(tBgQ, tBsQ, k_tile, 0, tma_mma_empty_barrier_phase_bit, tma_transaction_bytes, tma_atom_Q, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier); + } + + /*wait_barrier(shared_storage.tma_bmm1_full_barrier[0], 0); + if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("tCsQ:\t"); print_tensor(tCsQ(_,0,_,0)); print("\n"); + }*/ +} + +// TMA load K and then V, not guarded by griddepcontrol.wait +template < + class SharedStorage, + class WorkTileInfo, + class KTensor, + class VTensor, + class TmaAtomK, + class TmaAtomV, + class TiledBMM1, + class TiledBMM2, + int CTA_kvL, int CTA_dH> +CUTLASS_DEVICE void +DMA_KV_warp( + SharedStorage& shared_storage, + WorkTileInfo work_tile_info, + KTensor mK, + VTensor mV, + // when passing tma descriptor as function argument, it has to be pass by pointer/reference, if pass by value, it will live on local memory (i.e. the stack) + // and the tma unit cannot access the local memory, (even if it can, the local memory is strided by thread id, the content for each thread is strided) + TmaAtomK const* tma_atom_K, + TmaAtomV const* tma_atom_V, + TiledBMM1 tiled_bmm1, + TiledBMM2 tiled_bmm2) { + + if (!work_tile_info.is_valid()) { + return; + } + + // setup code for K tensor + // tCsK means the mma partitioned smem tensor sK + Tensor tCsK = shared_storage.tensor_sK(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + // now let's tile the gmem tensor first into the tile this CTA needs (i.e. CTA-level tiling), which is (CTA_kvL, CTA_dH, Num_CTA_kvL) + // mK has shape (kvL, dH, kvH, BS), after local_tile (without indexing), it becomes (CTA_kvL, CTA_dH, Num_CTA_kvL, Num_CTA_dH, kvH, BS) + // and this CTA works on gK(_,_,kvL_idx_start:kvL_idx_end) + Tensor gK = local_tile(mK, make_shape(Int{}, Int{}), + make_coord(_, 0, work_tile_info.kvH_idx, work_tile_info.BS_idx)); // (CTA_kvL, CTA_dH, Num_CTA_kvL) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the mma shape, to match the smem layout + ThrMMA cta_bmm1 = tiled_bmm1.get_slice(0); // 1 sm mma only has 1 thread in tiled_bmm1 + // tCgK means the mma partitioned gmem tensor gK + Tensor tCgK = cta_bmm1.partition_A(gK); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, Tiles_M) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the tma shape in preparation for tma copy + auto [tAgK, tAsK] = tma_partition(*tma_atom_K, + Int<0>{}, // cta_coord: 1x1 cluster + Layout<_1>{}, // cta_layout: CTA coord -> logical multicast id, no multicast, just identity layout + group_modes<0,3>(tCsK), group_modes<0,3>(tCgK)); + // tAgK: ((TMA, NumTma_M, NumTma_K), Tiles_M) get coalesced to ((TMA, NumTma_K), Tiles_M) since NumTma_M = 1 + // tAsK: ((TMA, NumTma_M, NumTma_K), BMM1_DMA_Stage) get coalesced to ((TMA, NumTma_K), BMM1_DMA_Stage) since NumTma_M = 1 + // the shape of the TMA box is (CTA_kvL, CTA_dH) + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("cta_bmm1:\t"); print(cta_bmm1); print("\n"); + printf("tCsK:\t"); print(tCsK); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + printf("gK:\t"); print(gK); print("\n"); // (CTA_kvL, CTA_dH, Num_CTA_kvL) + printf("tCgK:\t"); print(tCgK); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, Tiles_M) + printf("tAgK:\t"); print(tAgK); print("\n"); // ((TMA, NumTma_K), Tiles_M) + printf("tAsK:\t"); print(tAsK); print("\n"); // ((TMA, NumTma_K), BMM1_DMA_Stage) + }*/ + + // setup code for V tensor + // tCsV means the mma partitioned smem tensor sV + Tensor tCsV = shared_storage.tensor_sV(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + // now let's tile the gmem tensor first into the tile this CTA needs (i.e. CTA-level tiling), which is (CTA_dH, CTA_kvL) + // mV has shape (dH, kvL, kvH, BS), after local_tile (without indexing), it becomes (CTA_dH, CTA_kvL, Num_CTA_dH, Num_CTA_kvL, kvH, BS) + // and this CTA works on gV(_,_,kvL_idx_start:kvL_idx_end) + Tensor gV = local_tile(mV, make_shape(Int{}, Int{}), + make_coord(work_tile_info.dH_idx, _, work_tile_info.kvH_idx, work_tile_info.BS_idx)); // (CTA_dH, CTA_kvL, Num_CTA_kvL) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the mma shape, to match the smem layout + ThrMMA cta_bmm2 = tiled_bmm2.get_slice(0); // 1 sm mma only has 1 thread in tiled_bmm2 + // tCgV means the mma partitioned gmem tensor gV + Tensor tCgV = cta_bmm2.partition_A(gV); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, Tiles_K) + + // now we want to partition (give the same tensor a new view) the gmem tensor into the tma shape in preparation for tma copy + auto [tAgV, tAsV] = tma_partition(*tma_atom_V, + Int<0>{}, // cta_coord: 1x1 cluster + Layout<_1>{}, // cta_layout: CTA coord -> logical multicast id, no multicast, just identity layout + group_modes<0,3>(tCsV), group_modes<0,3>(tCgV)); + // tAgV: ((TMA, NumTma_M, NumTma_K), Tiles_K) get coalesced to ((TMA, NumTma_K), Tiles_K) since NumTma_M = 1 + // tAsV: ((TMA, NumTma_M, NumTma_K), BMM2_DMA_Stage) get coalesced to ((TMA, NumTma_K), BMM2_DMA_Stage) since NumTma_M = 1 + // the shape of the TMA box is (CTA_dH, CTA_kvL) + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("cta_bmm2:\t"); print(cta_bmm2); print("\n"); + printf("tCsV:\t"); print(tCsV); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + printf("gV:\t"); print(gV); print("\n"); // (CTA_dH, CTA_kvL, Num_CTA_kvL) + printf("tCgV:\t"); print(tCgV); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, Tiles_K) + printf("tAgV:\t"); print(tAgV); print("\n"); // ((TMA, NumTma_K), Tiles_K) + printf("tAsV:\t"); print(tAsV); print("\n"); // ((TMA, NumTma_K), BMM2_DMA_Stage) + }*/ + + int tma_K_transaction_bytes = sizeof(make_tensor_like(tAsK(_,0))); + int tma_V_transaction_bytes = sizeof(make_tensor_like(tAsV(_,0))); + int k_tile_count = work_tile_info.kvL_idx_end - work_tile_info.kvL_idx_start; + int constexpr BMM1_DMA_Stage = size<3>(tCsK); + int constexpr BMM2_DMA_Stage = size<3>(tCsV); + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("TmaKBytes: %d\n", tma_K_transaction_bytes); + printf("TmaVBytes: %d\n", tma_V_transaction_bytes); + printf("k_tile_count: %d\n", k_tile_count); + printf("BMM1_DMA_Stage: %d\n", BMM1_DMA_Stage); + printf("BMM2_DMA_Stage: %d\n", BMM2_DMA_Stage); + }*/ + + // details of how the phase bit works is in DMA_Q_warp + int tma_bmm1_empty_barrier_phase_bit = 1; + int tma_bmm2_empty_barrier_phase_bit = 1; + + int bmm1_k_tile = 0; + int bmm2_k_tile = 0; + + bool constexpr Print = false; + // iterate over kblock + // SOL order is K0, (K1, V0), (K2, V1), (K3, V2), ... + + // sw pipeline prolog + TMA_copy(tAgK, tAsK, bmm1_k_tile, work_tile_info.kvL_idx_start, tma_bmm1_empty_barrier_phase_bit, tma_K_transaction_bytes, tma_atom_K, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier); + bmm1_k_tile++; + + for (; bmm1_k_tile < k_tile_count; bmm1_k_tile++, bmm2_k_tile++) { + + TMA_copy(tAgK, tAsK, bmm1_k_tile, work_tile_info.kvL_idx_start, tma_bmm1_empty_barrier_phase_bit, tma_K_transaction_bytes, tma_atom_K, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier); + + TMA_copy(tAgV, tAsV, bmm2_k_tile, work_tile_info.kvL_idx_start, tma_bmm2_empty_barrier_phase_bit, tma_V_transaction_bytes, tma_atom_V, shared_storage.tmasoftmax_bmm2_full_barrier, shared_storage.tma_bmm2_empty_barrier); + } + + // sw pipeline epilog + TMA_copy(tAgV, tAsV, bmm2_k_tile, work_tile_info.kvL_idx_start, tma_bmm2_empty_barrier_phase_bit, tma_V_transaction_bytes, tma_atom_V, shared_storage.tmasoftmax_bmm2_full_barrier, shared_storage.tma_bmm2_empty_barrier); + + cutlass::arch::launch_dependent_grids(); +} + +// MMA warp that includes BMM1 and BMM2 +template < + class SharedStorage, + class WorkTileInfo, + class OTensor, + class TiledBMM1, + class TiledBMM2, + int CTA_qHLocal, int CTA_qL, int CTA_kvL, int CTA_dH> +CUTLASS_DEVICE void +MMA_warp( + SharedStorage& shared_storage, + WorkTileInfo work_tile_info, + OTensor mO, + TiledBMM1 tiled_bmm1, + TiledBMM2 tiled_bmm2, + cutlass::arch::NamedBarrier& tmem_allocation_barrier +) { + if (!work_tile_info.is_valid()) { + // we don't allocate tmem for invalid tiles but we still need to relinquish the allocation lock + using TmemAllocator = cute::TMEM::Allocator1Sm; + TmemAllocator tmem_allocator{}; + tmem_allocator.release_allocation_lock(); + return; + } + + // compute BMM1, S = K x Q + // smem tensor prepared by DMA_K and DMA_Q + Tensor tCsK = shared_storage.tensor_sK(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + Tensor tCsQ = shared_storage.tensor_sQ(); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + Tensor sS = shared_storage.tensor_sS(); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + + // BMM1 Fragment Allocation + ThrMMA cta_bmm1 = tiled_bmm1.get_slice(0); // 1 sm mma only has 1 thread in tiled_mma + Tensor tCrK = cta_bmm1.make_fragment_A(tCsK); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + Tensor tCrQ = cta_bmm1.make_fragment_B(tCsQ); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + // then partition it to mma shape + Tensor tCsS = cta_bmm1.partition_C(sS(_,_,0)); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + Tensor tCtAcc1 = cta_bmm1.make_fragment_C(tCsS); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + + // compute BMM2, O = V x P + // smem tensor prepared by DMA_V and softmax + Tensor tCsV = shared_storage.tensor_sV(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + Tensor sP = shared_storage.tensor_sP(); // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) + // cluster level tiling for mO, gO is what will be produced by the entire cluster + Tensor gO = local_tile(mO, make_shape(Int{}, make_shape(Int{}, Int{})), + make_coord(work_tile_info.dH_idx, make_coord(work_tile_info.qHLocal_idx, work_tile_info.qL_idx), work_tile_info.kvH_idx, work_tile_info.BS_idx)); // (CTA_dH, (CTA_qHLocal, CTA_qL)) + + // BMM2 Fragment Allocation + ThrMMA cta_bmm2 = tiled_bmm2.get_slice(0); // 1 sm mma only has 1 thread in tiled_mma + Tensor tCrV = cta_bmm2.make_fragment_A(tCsV); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + Tensor tCsP = cta_bmm2.partition_B(sP); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + Tensor tCrP = cta_bmm2.make_fragment_B(tCsP); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + // then partition it to mma shape + Tensor tCgO = cta_bmm2.partition_C(gO); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + Tensor tCtAcc2 = cta_bmm2.make_fragment_C(tCgO); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + + // TMEM Allocation + // tmem has 128 lane, 512 column, 1 word/column, each word is 4B, 256KB in total + using TmemAllocator = cute::TMEM::Allocator1Sm; + TmemAllocator tmem_allocator{}; + + int constexpr Acc1_col = CTA_qHLocal * CTA_qL; // num tmem column for tCtAcc1 + int constexpr Acc1_col_max = cute::max(Acc1_col, TmemAllocator::ColumnsPerAllocationSlice); // min allocation granularity is 32 columns + static_assert((Acc1_col_max & (Acc1_col_max - 1)) == 0, "Acc1 column size is not a power of 2"); + + int constexpr Acc2_col = CTA_qHLocal * CTA_qL; // num tmem column for tCtAcc2 + int constexpr Acc2_col_max = cute::max(Acc2_col, TmemAllocator::ColumnsPerAllocationSlice); // min allocation granularity is 32 columns + static_assert((Acc2_col_max & (Acc2_col_max - 1)) == 0, "Acc2 column size is not a power of 2"); + + // allow half of tmem to be used for overlapping with next kernel + static_assert((Acc1_col_max + Acc2_col_max) < TmemAllocator::Sm100TmemCapacityColumns / 2, "Accumulator is too large to fit in half of tmem"); + + // do two separate allocations for bmm1 and bmm2 accumulators, we waste some capacity and cycles + // if needed, in the future we can merge the two allocations into one and do some offsetting + tmem_allocator.allocate(Acc1_col_max, &shared_storage.bmm1_tmem_base_ptr); + tmem_allocator.allocate(Acc2_col_max, &shared_storage.bmm2_tmem_base_ptr); + // notify epilog warp that tmem allocation is complete + tmem_allocation_barrier.arrive(); + + // relinquish early so that prefetch cta can be launched + tmem_allocator.release_allocation_lock(); + + // update the tmem base ptr of the accumulator tensor + tCtAcc1.data() = shared_storage.bmm1_tmem_base_ptr; + tCtAcc2.data() = shared_storage.bmm2_tmem_base_ptr; + + /*if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("tCsK:\t"); print(tCsK); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + printf("tCsQ:\t"); print(tCsQ); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + printf("sS:\t"); print(sS); print("\n"); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + printf("tCsS:\t"); print(tCsS); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("Acc1_col_max:\t%d\n", Acc1_col_max); + printf("tCtAcc1:\t"); print(tCtAcc1); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("tCrK:\t"); print(tCrK); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + printf("tCrQ:\t"); print(tCrQ); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + + printf("tCsV:\t"); print(tCsV); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + printf("sP:\t"); print(sP); print("\n"); // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) + printf("tCsP:\t"); print(tCsP); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + printf("tCrV:\t"); print(tCrV); print("\n"); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + printf("tCrP:\t"); print(tCrP); print("\n"); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + printf("gO:\t"); print(gO); print("\n"); // (CTA_dH, (CTA_qHLocal, CTA_qL)) + printf("tCgO:\t"); print(tCgO); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("Acc2_col_max:\t%d\n", Acc2_col_max); + printf("tCtAcc2:\t"); print(tCtAcc2); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + }*/ + + bool constexpr Print = false; + int k_tile_count = work_tile_info.kvL_idx_end - work_tile_info.kvL_idx_start; + // iterate over kblock + // SOL order is: K0Q0, (K1Q0, V0P0), (K2Q0, V1P1), (K3Q0, V2P2), ... + + // details of how the phase bit works is in DMA_Q_warp + int tma_bmm1_full_barrier_phase_bit = 0; + int tma_bmm2_full_barrier_phase_bit = 0; + + int bmm1_stage_idx = 0; + int bmm2_stage_idx = 0; + + int k_tile = 0; + + // prolog bmm1 + // bmm1 always overwrites the accumulator, so we set it to UMMA::ScaleOut::Zero + MMA_gemm(tCrK, tCrQ, tCtAcc1, tiled_bmm1, bmm1_stage_idx, tma_bmm1_full_barrier_phase_bit, UMMA::ScaleOut::Zero, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier, shared_storage.bmm1_softmax_full_barrier); + + for (; k_tile < (k_tile_count - 1); k_tile++) { + // bmm1 of next iter + MMA_gemm(tCrK, tCrQ, tCtAcc1, tiled_bmm1, bmm1_stage_idx, tma_bmm1_full_barrier_phase_bit, UMMA::ScaleOut::Zero, shared_storage.tma_bmm1_full_barrier, shared_storage.tma_bmm1_empty_barrier, shared_storage.bmm1_softmax_full_barrier); + + // bmm2 of current iter + // for bmm2, only clear the accumulator for the first iter, for subsequent iters, we accumulate the VP result on top of corrected Acc2 + UMMA::ScaleOut bmm2_accumulate = (k_tile == 0) ? UMMA::ScaleOut::Zero : UMMA::ScaleOut::One; + MMA_gemm(tCrV, tCrP, tCtAcc2, tiled_bmm2, bmm2_stage_idx, tma_bmm2_full_barrier_phase_bit, bmm2_accumulate, shared_storage.tmasoftmax_bmm2_full_barrier, shared_storage.tma_bmm2_empty_barrier, shared_storage.bmm2_epilog_full_barrier); + } + + // epilog bmm2 + UMMA::ScaleOut bmm2_accumulate = (k_tile == 0) ? UMMA::ScaleOut::Zero : UMMA::ScaleOut::One; + MMA_gemm(tCrV, tCrP, tCtAcc2, tiled_bmm2, bmm2_stage_idx, tma_bmm2_full_barrier_phase_bit, bmm2_accumulate, shared_storage.tmasoftmax_bmm2_full_barrier, shared_storage.tma_bmm2_empty_barrier, shared_storage.bmm2_epilog_full_barrier); + + // wait for tmem deallocation signal from epilog warp + tmem_allocation_barrier.arrive_and_wait(); + + // deallocate TMEM + tmem_allocator.free(shared_storage.bmm1_tmem_base_ptr, Acc1_col_max); + tmem_allocator.free(shared_storage.bmm2_tmem_base_ptr, Acc2_col_max); +} + +// first do softmax on S, then do flash decode reduction +template < + class SharedStorage, + class WorkTileInfo, + class KTensor, + class OTensor, + class SinkTensor, + class TiledBMM1, + class TiledBMM2, + int CTA_qHLocal, int CTA_qL, int CTA_kvL, int CTA_dH, + int NumReductionCTA, + bool NoSink> +CUTLASS_DEVICE void +EPILOG_warp( + SharedStorage& shared_storage, + WorkTileInfo work_tile_info, + KTensor mK, + OTensor mO, + SinkTensor mSink, + int seq_len, + TiledBMM1 tiled_bmm1, + TiledBMM2 tiled_bmm2, + float softmax_scale_log2, + int sliding_window_size, + cutlass::arch::NamedBarrier& tmem_allocation_barrier, + cutlass::arch::NamedBarrier& epilog_barrier, + int NumSplits, + int tid, // tid local to epilog warp + int warp_idx, // warp id local to epilog warp group + int rank +) { + // bmm1 + Tensor sS = shared_storage.tensor_sS(); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + // BMM1 Fragment Allocation + ThrMMA cta_bmm1 = tiled_bmm1.get_slice(0); // 1 sm mma only has 1 thread in tiled_bmm1 + // then partition it to mma shape + // we only use 1 S buffer, it gives sufficient overlap between MMA and softmax + Tensor tCsS = cta_bmm1.partition_C(sS(_,_,0)); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + // create the tmem tensor view + Tensor tCtAcc1 = cta_bmm1.make_fragment_C(tCsS); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + + // bmm2 + // cluster level tiling for mO, gO is what will be produced by the entire cluster + Tensor gO = local_tile(mO, make_shape(Int{}, make_shape(Int{}, Int{})), + make_coord(work_tile_info.dH_idx, make_coord(work_tile_info.qHLocal_idx, work_tile_info.qL_idx), work_tile_info.kvH_idx, work_tile_info.BS_idx)); // (CTA_dH, (CTA_qHLocal, CTA_qL)) + // BMM2 Fragment Allocation + ThrMMA cta_bmm2 = tiled_bmm2.get_slice(0); // 1 sm mma only has 1 thread in tiled_bmm2 + // then partition it to mma shape + Tensor tCgO = cta_bmm2.partition_C(gO); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + // create the tmem tensor view + Tensor tCtAcc2 = cta_bmm2.make_fragment_C(tCgO); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + + // wait for tmem allocation in mma warp to complete, only do the wait for valid tiles + if (work_tile_info.is_valid()) { + tmem_allocation_barrier.arrive_and_wait(); + } + + // update tmem base ptr of the accumulator tensor + tCtAcc1.data() = shared_storage.bmm1_tmem_base_ptr; + tCtAcc2.data() = shared_storage.bmm2_tmem_base_ptr; + + // BMM1 tcgen05.ld + using TypeAcc = typename decltype(tCtAcc1)::value_type; + constexpr int acc1_col_bits = size<1>(sS) * sizeof_bits_v; + // use tcgen05.ld.32dp32bit simplifies softmax implementation, every thread just hold a row of the accumulator tensor + // softmax is applied to each column, so we do both the sum and max across all 128 threads using warp shuffle + auto bmm1_tmem_load = TMEM::op_repeater(); + TiledCopy tiled_t2r_copy_bmm1 = make_tmem_copy(bmm1_tmem_load, tCtAcc1); + // epilog tid is from 128 to 255, need to offset by -128 when getting the per thread slice + ThrCopy thr_t2r_copy_bmm1 = tiled_t2r_copy_bmm1.get_slice(tid); + + // tD means the partitioning pattern of tcgen05.ld + // now we get the per thread slice of the Acc1 for tcgen05.ld src and dst + Tensor tDtAcc1 = thr_t2r_copy_bmm1.partition_S(tCtAcc1); // (CpyS, NumCpy_M, NumCpy_N), per subpartition view of the Acc1/S tensor + Tensor tDsS = thr_t2r_copy_bmm1.partition_D(tCsS); // (CpyD, NumCpy_M, NumCpy_N), per thread slice of the Acc1/S tensor in smem, i.e. a row of the Acc1 tensor + // allocate per thread rmem space for the Acc1, the shape is the same as the post partition shape of the output tensor + Tensor tDrS = make_tensor(shape(tDsS)); // (CpyD, NumCpy_M, NumCpy_N), per thread slice of the Acc1/S tensor in rmem, i.e. a row of the Acc1 tensor + + // restructure Acc1 in rmem for faster fsum reduction + // because tcgen05.ld.32dp32bit put each row of the Acc1 tensor into 1 thread, for softmax we need cross thread reduction (reduce each column) for fsum/fmax, fmax is fine because we can use redux.sync + // so we restructure Acc1 in rmem such that each thread holds a partial column of the Acc1 tensor, so we do thread local reduction as much as possible, then do warp/cta/cluster reduction + Tensor sAcc1 = shared_storage.tensor_sAcc1(); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + Tensor tCsAcc1 = cta_bmm1.partition_C(sAcc1(_,_,0)); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + Tensor tDsAcc1 = thr_t2r_copy_bmm1.partition_D(tCsAcc1); // (CpyD, NumCpy_M, NumCpy_N), per thread slice of the output tensor + // zipped_divide partition it into (CTA_qHLocal * CTA_qL, (CTA_kvL / CTA_qHLocal / CTA_qL, (CTA_qHLocal, CTA_qL))) + // then the per thread indexing gets the shape to (CTA_qHLocal * CTA_qL) + // tFsum means the thread partitioning pattern for calculating fsum, i.e. each thread holds a partial column of the Acc1 tensor + Tensor tFsumsAcc1 = zipped_divide(sAcc1(_,_,0), Int{})(_, tid); // (CTA_qHLocal * CTA_qL) + Tensor tFsumrAcc1 = make_tensor(shape(tFsumsAcc1)); // (CTA_qHLocal * CTA_qL) + // so what we do is tmem(tDtAcc1)->rmem(tDrS)->smem(tDsAcc1/tFsumsAcc1)->rmem(tFsumrAcc1) + static_assert(CTA_kvL % (CTA_qHLocal * CTA_qL) == 0, "CTA_kvL must be divisible by CTA_qHLocal * CTA_qL"); // such that each column is held by integer number of threads + static_assert((CTA_kvL / (CTA_qHLocal * CTA_qL)) <= 32, "CTA_kvL / (CTA_qHLocal * CTA_qL) must be less than or equal to 32"); // such that fsum reduction won't cross warp boundary + + // predicate tensor for predicating S/P based on kvL + Tensor coordK = make_identity_tensor(shape(mK)); // (kvL, dH, kvH, BS) -> (kvL, dH, kvH, BS) + Tensor cK = local_tile(coordK, make_shape(Int{}, Int{}), + make_coord(_, work_tile_info.dH_idx, work_tile_info.kvH_idx, work_tile_info.BS_idx)); // (CTA_kvL, CTA_dH, Num_CTA_kvL) -> (kvL, dH, kvH, BS) + Tensor cur_kvL = cK(tid, 0, _); // (Num_CTA_kvL) -> (kvL, dH, kvH, BS) + + // BMM2 tcgen05.ld + // now we get the per thread slice of the Acc2 for tcgen05.ld src and dst + constexpr int acc2_col_bits = size<1>(gO) * sizeof_bits_v; + // use tcgen05.ld.32dp32bit simplifies correction implementation, every thread just hold a row of the accumulator tensor + // but cute will be unhappy since we use MMA_M=64 mma but load tmem with 32dp32bit, so we need to bypass cute copy completely by directly using ptx + auto bmm2_tmem_load = TMEM::op_repeater(); + // similarly, use tcgen05.st.32dp32bit to store the corrected Acc2 back to tmem + auto bmm2_tmem_store = TMEM::op_repeater(); + // allocate per thread rmem space for the reshaped Acc2 tensor, it just hold a row of the Acc2 tensor + // tAcc2 means it's the partitioning pattern where each thread holds a row of the Acc2 tensor + // for dH=64, after tcgen05.ld, thread 0-15, 32-47, 64-79, 96-111 will hold the data of Acc2(0:16,:), Acc2(32:48,:), Acc2(64:80,:), Acc2(96:112,:) + // for dH=128, after tcgen05.ld, thread 0-31, 32-63, 64-95, 96-127 will hold the data of Acc2(0:32,:), Acc2(32:64,:), Acc2(64:96,:), Acc2(96:128,:) + Tensor tAcc2rAcc2 = make_tensor(shape<1>(gO)); // (CTA_qHLocal, CTA_qL), per thread slice of the Acc2 tensor in rmem + uint32_t acc2_tmem_addr = raw_pointer_cast(tCtAcc2.data()); + // mapping between thread id (T) -> dH (row index of Acc2), different for dH=64 and dH=128 + Layout bmm2_tmem_load_t_dH_layout = make_bmm2_tmem_load_t_dH_layout(); + + // now we define the warp reduce partial results tensor for fmax + Tensor sFmaxPartial = shared_storage.tensor_sFmaxPartial(); // (NumEpilogWarps, (CTA_qHLocal, CTA_qL)) + // each element in tDrS (CTA_qHLocal, CTA_qL) is from a different column (q token) of Acc1 tensor, softmax takes column sum/max and scale each element + // each column would need a separate fmax, so the meta data max tensor has the same shape as tDrS, and the max value is the same for the same column for all threads + // this is the CTA wide fmax tensor for all kv tiles + Tensor tDrFmax = make_tensor(shape(tDsS)); // (CpyD, NumCpy_M, NumCpy_N) or (CTA_qHLocal * CTA_qL), per thread slice of the meta data max tensor + + // we do things a bit differently for fsum, each warp holds its portion of the fsum tensor, there are CTA_qHLocal * CTA_qL fsum in total for this cta + // and we evenly distribute the q tokens between all epilog warps, so each warp computes CTA_qHLocal * CTA_qL / NumEpilogWarps q tokens + int constexpr NumEpilogWarps = size<0>(sFmaxPartial); + static_assert(CTA_dH <= (NumEpilogWarps * 32), "have enough threads to hold bmm2 tcgen05.ld output"); + int constexpr NumQPerWarp = CTA_qHLocal * CTA_qL / NumEpilogWarps; + // alpha = exp2f(m_i_old - m_i) + Tensor rAlpha = make_tensor(shape(tDrS)); // (CpyD, NumCpy_M, NumCpy_N) or (CTA_qHLocal * CTA_qL), per thread slice + // this is the thread wide fsum tensor for all kv tiles + Tensor l_i = make_tensor(shape(tDrS)); // (CpyD, NumCpy_M, NumCpy_N) or (CTA_qHLocal * CTA_qL), per thread slice + // this is the CTA wide fsum tensor for all kv tiles + Tensor tDrFsum = make_tensor(Int{}); // (NumQPerWarp), per thread slice of the meta data sum tensor + // then we need a layout to represent the mapping between (warp id (T), V) -> q_idx + // T0V0 -> q_idx 0 + // T0V1 -> q_idx 1 + // T1V0 -> q_idx 2 + // T1V1 -> q_idx 3 + // ... + Layout cta_reduce_tv_q_layout = make_layout(make_shape(Int{}, Int{}), make_stride(Int{}, Int<1>{})); + + // now we do the data type conversion of S/P from fp32 to bf16/fp8 + using TypeQKV = typename decltype(sS)::value_type; + // allocate per thread rmem space for the converted S/P tensor, the shape is the same as the post partition shape of the output tensor + // the only difference with tDrAcc is here per element is TypeQKV instead of TypeAcc + Tensor tDrS_converted = make_tensor(shape(tDsS)); // (CpyD, NumCpy_M, NumCpy_N), per thread slice of the Acc1/S tensor in rmem, i.e. a row of the Acc1 tensor + // create a converter, convert 1 value at a time, from TypeAcc to TypeQKV + cutlass::NumericConverter converter_s; + + // setup for fmax and fsum cluster reduction + // each reduction participating cta handles CTA_qHLocal * CTA_qL / NumReductionCTA number of q tokens, there are NumReductionCTA participating in cluster reduction + // so we want to have a layout/mapping (reduction cta id (T), local q_idx (V)) -> q_idx + // assume we have 8 q_idx, and 2 reduction ctas, then we have the following mapping: + // (reduction cta 0, local q_idx 0) -> q_idx 0 + // (reduction cta 0, local q_idx 1) -> q_idx 1 + // (reduction cta 0, local q_idx 2) -> q_idx 2 + // (reduction cta 0, local q_idx 3) -> q_idx 3 + // (reduction cta 1, local q_idx 0) -> q_idx 4 + // (reduction cta 1, local q_idx 1) -> q_idx 5 + // (reduction cta 1, local q_idx 2) -> q_idx 6 + // (reduction cta 1, local q_idx 3) -> q_idx 7 + // we create the tv layout for cluster reduction (reduction cta id (T), local q_idx (V)) -> q_idx + Layout cluster_reduce_tv_q_layout = make_layout(make_shape(Int{}, Int{}), + make_stride(Int{}, Int<1>{})); + + // for fmax/fsum cluster reduction, ultimately we want to have a layout of (warp_id (T), V) -> (reduction cta id (T'), V') for scattering cta scope fmax/fsum values to reduction ctas + // so we do this by (warp_id (T), V) -> q_idx -> (reduction cta id (T'), V') + // we obtain q_idx -> (reduction cta id (T'), V') by taking the right inverse of cluster_reduce_tv_q_layout + // + // regarding whether we choose right-inverse or left-inverse: + // You can think of right-inverse as a truncated version of left-inverse -- truncated to the compact range of a layout. + // if there's a "hole" in the codomain/range, then the right_inverse stops there. E.g. + // (4,5):(1,5) # There's a "hole" at idx=4 + // right_inverse = 4:1 + // left_inverse = (5,5):(1,4) + // since here cluster_reduce_tv_q_layout is bijective, there is no hole, so right-inverse and left-inverse are the same + Layout cluster_reduce_q_tv_layout = right_inverse(cluster_reduce_tv_q_layout); + // (warp_id (T), V) -> (reduction cta id (T'), V') is obtained through composition + Layout cluster_reduce_tv_tv_layout = composition(cluster_reduce_q_tv_layout, cta_reduce_tv_q_layout); + + // setup for fmax cluster reduction + // thread 0 in each epilog warp will send its local portion of fmax (CTA_qHLocal * CTA_qL / NumEpilogWarps q tokens) to corresponding reduction ctas, + // i.e. the entire epilog warp group will send all fmax to all reduction ctas + // for instance we have 8 q tokens and 4 epilog warps, and 8 reduction ctas, fmax tensor is in rmem: + // warp 0: send fmax(0) (q_idx 0) to reduction cta 0 + // warp 0: send fmax(1) (q_idx 1) to reduction cta 1 + // warp 1: send fmax(0) (q_idx 2) to reduction cta 2 + // warp 1: send fmax(1) (q_idx 3) to reduction cta 3 + // warp 2: send fmax(0) (q_idx 4) to reduction cta 4 + // warp 2: send fmax(1) (q_idx 5) to reduction cta 5 + // warp 3: send fmax(0) (q_idx 6) to reduction cta 6 + // warp 3: send fmax(1) (q_idx 7) to reduction cta 7 + Tensor sFmaxMailbox = shared_storage.tensor_sFmaxMailbox(); // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + int constexpr MaxSplits = size<0>(sFmaxMailbox); + // tSRC means cluster reduction src partitioning pattern, i.e. each CTA holds a particular row of the mailbox tensor of all reduction ctas + Tensor tSRCsFmaxMailbox = sFmaxMailbox(rank,_); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + // destination dsmem tensor for each q token + decltype(tSRCsFmaxMailbox) tSRCdsFmaxMailbox[NumQPerWarp]; // send different q tokens to different reduction cta + + // setup for fsum cluster reduction + Tensor sFsumMailbox = shared_storage.tensor_sFsumMailbox(); // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + // tSRC means cluster reduction src partitioning pattern, i.e. each CTA holds a particular row of the mailbox tensor of all reduction ctas + Tensor tSRCsFsumMailbox = sFsumMailbox(rank,_); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + // destination dsmem tensor for each q token + decltype(tSRCsFsumMailbox) tSRCdsFsumMailbox[NumQPerWarp]; // send different q tokens to different reduction cta + + uint32_t dsmem_maxsum_mailbox_full_barrier_addr[NumQPerWarp]; // dsmem addr for mailbox barrier + + // do mapa and get the dsmem addr of each q token + CUTE_UNROLL + for(int i = 0; i < NumQPerWarp; i++) { + auto cluster_tv = cluster_reduce_tv_tv_layout(warp_idx, i); // it's the 1d coordinate of (reduction cta id (T'), V') + // idx2crd convertes 1d coordinate to natural coordinate, i.e. (reduction cta id (T'), V') + int dst_cta_id = get<0>(idx2crd(cluster_tv, shape(cluster_reduce_tv_q_layout))); + tSRCdsFmaxMailbox[i] = get_dsmem_tensor(tSRCsFmaxMailbox, dst_cta_id); + tSRCdsFsumMailbox[i] = get_dsmem_tensor(tSRCsFsumMailbox, dst_cta_id); + uint32_t smem_maxsum_mailbox_full_barrier_addr = __cvta_generic_to_shared(&shared_storage.maxsum_mailbox_full_barrier); + dsmem_maxsum_mailbox_full_barrier_addr[i] = set_block_rank(smem_maxsum_mailbox_full_barrier_addr, dst_cta_id); + } + + // setup for Acc2 cluster reduction + int row_id = bmm2_tmem_load_t_dH_layout(tid); + Tensor sAcc2Mailbox = shared_storage.tensor_sAcc2Mailbox(); // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + // per thread slice of the Acc2 mailbox tensor, tSRC means cluster reduction src partitioning pattern + // each thread sends each row of the Acc2 tensor to many dst CTAs + Tensor tSRCsAcc2Mailbox = sAcc2Mailbox(row_id,_,rank); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + decltype(tSRCsAcc2Mailbox) tSRCdsAcc2Mailbox[NumReductionCTA]; // send different q tokens to different reduction cta + uint32_t dsmem_acc2_mailbox_full_barrier_addr[NumReductionCTA]; // dsmem addr for mailbox barrier + // do mapa and get the dsmem addr of q token + CUTE_UNROLL + for(int i = 0; i < NumReductionCTA; i++) { + tSRCdsAcc2Mailbox[i] = get_dsmem_tensor(tSRCsAcc2Mailbox, i); + uint32_t smem_acc2_mailbox_full_barrier_addr = __cvta_generic_to_shared(&shared_storage.acc2_mailbox_full_barrier); + dsmem_acc2_mailbox_full_barrier_addr[i] = set_block_rank(smem_acc2_mailbox_full_barrier_addr, i); + } + + Tensor tCsK = shared_storage.tensor_sK(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + Tensor tCsV = shared_storage.tensor_sV(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + int constexpr BMM1_DMA_Stage = size<3>(tCsK); + int constexpr BMM2_DMA_Stage = size<3>(tCsV); + int NumKVTiles = work_tile_info.kvL_idx_end - work_tile_info.kvL_idx_start; + + // setup for cluster reduction + // because each CTA is going to produce (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA), i.e. each CTA handles CTA_qHLocal * CTA_qL / NumReductionCTA q tokens + // we further partition gO into per CTA level + static_assert(CTA_qHLocal * CTA_qL % NumReductionCTA == 0, "CTA_qHLocal * CTA_qL must be divisible by NumReductionCTA"); + Tensor tCTAgO = local_tile(gO, make_shape(Int{}, Int{}), make_coord(0, rank)); // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA) + + // now we do the data type conversion of Acc2 from fp32 to bf16/fp8 + using TypeO = typename decltype(mO)::value_type; + // create a converter, convert 1 value at a time, from TypeAcc to TypeO + cutlass::NumericConverter converter_o; + + // setup for fmax/fsum cluster reduction + int maxsum_st_async_transaction_bytes = NumSplits * CTA_qHLocal * CTA_qL / NumReductionCTA * sizeof(TypeAcc) * 2; + + // participating CTA set the barrier transaction bytes + if ((rank < NumReductionCTA) && (tid == 0)) { + set_barrier_transaction_bytes(shared_storage.maxsum_mailbox_full_barrier, maxsum_st_async_transaction_bytes); + } + + // allocate cluster wide fmax and fsum tensor + Tensor rFmaxCluster = make_tensor(size<1>(sFmaxMailbox)); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + // beta = exp2f(m_ij - m_i) + Tensor rBeta = make_tensor(make_shape(size<1>(sFmaxMailbox), size<0>(sFmaxMailbox))); // (CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + Tensor rFsumCluster = make_tensor(size<1>(sFsumMailbox)); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + // setup for Acc2 cluster reduction + int acc2_st_async_transaction_bytes = CTA_dH * CTA_qHLocal * CTA_qL / NumReductionCTA * NumSplits * sizeof(TypeAcc); + + if ((rank < NumReductionCTA) && (tid == 0)) { + set_barrier_transaction_bytes(shared_storage.acc2_mailbox_full_barrier, acc2_st_async_transaction_bytes); + } + + // final per thread (one row of the output tensor) cluster reduction result + Tensor tAcc2rO = make_tensor(size<1>(sFmaxMailbox)); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + Tensor tAcc2rO_converted = make_tensor(size<1>(sFmaxMailbox)); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + // attention sink needed by this cluster is 1 kv head + Tensor gSink = local_tile(mSink, make_shape(make_shape(Int{}, Int{}), Int<1>{}), + make_coord(make_coord(work_tile_info.qHLocal_idx, work_tile_info.qL_idx), work_tile_info.kvH_idx)); // (CTA_qHLocal, CTA_qL) + Tensor sSink = shared_storage.tensor_sSink(); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + // get the sink tensor needed for this cta, i.e. the sink value needed by each reduction cta + // we achieve this by doing a composition of the gSink tensor and the cluster_reduce_tv_q_layout (aka the tv layout for cluster reduction) + // composing with a tv layout is equivalent to reorganizing the tensor layout into shape (T, V) + // after the composition, the tensor shape is (NumReductionCTA, CTA_qHLocal * CTA_qL / NumReductionCTA) + // then we index into the rank-th row to get the sink value needed by this cta + Tensor tClustergSink = composition(gSink, cluster_reduce_tv_q_layout)(rank, _); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + static_assert(size(sSink) < NumEpilogWarps * 32, "one epilog thread loads at most 1 sink value"); + + /*if ((tid == 0) && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + printf("sS:\t"); print(sS); print("\n"); // (CTA_dH, (CTA_qHLocal, CTA_qL), 1) + printf("tCsS:\t"); print(tCsS); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("tCtAcc1:\t"); print(tCtAcc1); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("sAcc1:\t"); print(sAcc1); print("\n"); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + printf("tCsAcc1:\t"); print(tCsAcc1); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + + printf("tiled_t2r_copy_bmm1:\t"); print(tiled_t2r_copy_bmm1); print("\n"); + printf("thr_t2r_copy_bmm1:\t"); print(thr_t2r_copy_bmm1); print("\n"); + printf("tDtAcc1:\t"); print(tDtAcc1); print("\n"); // (CpyS, NumCpy_M, NumCpy_N) + printf("tDsS:\t"); print(tDsS); print("\n"); // (CpyD, NumCpy_M, NumCpy_N) + printf("tDrS:\t"); print(tDrS); print("\n"); // (CpyD, NumCpy_M, NumCpy_N) + + printf("sFmaxPartial:\t"); print(sFmaxPartial); print("\n"); + printf("tDrFmax:\t"); print(tDrFmax); print("\n"); + printf("tDrFsum:\t"); print(tDrFsum); print("\n"); + printf("cta_reduce_tv_q_layout: "); print_layout(cta_reduce_tv_q_layout); print("\n"); + + printf("tDrS_converted:\t"); print(tDrS_converted); print("\n"); // (CpyD, NumCpy_M, NumCpy_N) + + printf("tDsAcc1:\t"); print(tDsAcc1); print("\n"); // (CpyD, NumCpy_M, NumCpy_N) + printf("tFsumsAcc1:\t"); print(tFsumsAcc1); print("\n"); // ((CTA_qHLocal, CTA_qL), (CTA_kvL / CTA_qHLocal / CTA_qL, (CTA_qHLocal, CTA_qL))) + printf("tFsumrAcc1:\t"); print(tFsumrAcc1); print("\n"); // (CTA_qHLocal * CTA_qL) + + printf("coordK: "); print(coordK); print("\n"); // (kvL, dH, kvH, BS) + printf("cK: "); print(cK); print("\n"); // (CTA_kvL, CTA_dH, Num_CTA_kvL) -> (kvL, dH, kvH, BS) + printf("cur_kvL: "); print(cur_kvL); print("\n"); // (Num_CTA_kvL) -> (kvL, dH, kvH, BS) + printf("seq_len: %d\n", seq_len); + + printf("TypeAcc: %lluB\n", sizeof(TypeAcc)); + + printf("gO:\t"); print(gO); print("\n"); // (CTA_dH, (CTA_qHLocal, CTA_qL)) + printf("tCgO:\t"); print(tCgO); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("tCtAcc2:\t"); print(tCtAcc2); print("\n"); // ((Mma_M, Mma_N), NumMma_M, NumMma_N) + printf("tAcc2rAcc2:\t"); print(tAcc2rAcc2); print("\n"); // (CTA_qHLocal, CTA_qL) + + printf("cluster_reduce_tv_q_layout: "); print_layout(cluster_reduce_tv_q_layout); print("\n"); + printf("cluster_reduce_q_tv_layout: "); print_layout(cluster_reduce_q_tv_layout); print("\n"); + printf("cluster_reduce_tv_tv_layout: "); print_layout(cluster_reduce_tv_tv_layout); print("\n"); + + printf("sFmaxMailbox: "); print(sFmaxMailbox); print("\n"); // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tSRCsFmaxMailbox: "); print(tSRCsFmaxMailbox); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tSRCdsFmaxMailbox[1]: "); print(tSRCdsFmaxMailbox[1]); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("sFsumMailbox: "); print(sFsumMailbox); print("\n"); // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tSRCsFsumMailbox: "); print(tSRCsFsumMailbox); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tSRCdsFsumMailbox[1]: "); print(tSRCdsFsumMailbox[1]); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("dsmem_maxsum_mailbox_full_barrier_addr[1]: %x\n", dsmem_maxsum_mailbox_full_barrier_addr[1]); + + printf("sAcc2Mailbox: "); print(sAcc2Mailbox); print("\n"); // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + printf("tSRCsAcc2Mailbox: "); print(tSRCsAcc2Mailbox); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tSRCdsAcc2Mailbox[2]: "); print(tSRCdsAcc2Mailbox[2]); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("dsmem_acc2_mailbox_full_barrier_addr[2]: %x\n", dsmem_acc2_mailbox_full_barrier_addr[2]); + + printf("tCTAgO:\t"); print(tCTAgO); print("\n"); // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA) + + printf("NumSplits: %d\n", NumSplits); + printf("maxsum_st_async_transaction_bytes: %d\n", maxsum_st_async_transaction_bytes); + + printf("rFmaxCluster: "); print(rFmaxCluster); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("rBeta: "); print(rBeta); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + printf("rFsumCluster: "); print(rFsumCluster); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + printf("acc2_st_async_transaction_bytes: %d\n", acc2_st_async_transaction_bytes); + + printf("tAcc2rO: "); print(tAcc2rO); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tAcc2rO_converted: "); print(tAcc2rO_converted); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + printf("gSink: "); print(gSink); print("\n"); // (CTA_qHLocal, CTA_qL) + printf("sSink: "); print(sSink); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + printf("tClustergSink: "); print(tClustergSink); print("\n"); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + // test inf properties + // -inf - 2 = -inf + // exp2f(-inf) = 0 + // refer to cuda math api for full behavior ragarding inf https://docs.nvidia.com/cuda/cuda-math-api/cuda_math_api/group__CUDA__MATH__SINGLE.html#group__cuda__math__single_1ga3e2984de99de67ca680c9bb4f4427f81 + printf("-inf: %f\n", -cutlass::platform::numeric_limits::infinity()); + printf("-inf-2: %f\n", -cutlass::platform::numeric_limits::infinity() - 2.0f); + printf("exp2f(-inf-2): %f\n", exp2f(-cutlass::platform::numeric_limits::infinity() - 2.0f)); + }*/ + + static_assert(MaxSplits <= 32, "we can use 1 warp to initialize mailbox"); + // initialize mailbox tensor for fmax and fsum, when NumSplits < MaxSplits, we need to init those value to -inf and 0 + // because we do reduction on the full tensor (of size MaxSplits) not just the valid splits + // there is no need to init sAcc2 because it will be scaled with beta which will be 0 for invalid splits + if (tid < MaxSplits) { + fill(sFmaxMailbox(tid, _), -cutlass::platform::numeric_limits::infinity()); + clear(sFsumMailbox(tid, _)); + } + + // ensure initialized smem is visible to the entire cluster + cutlass::arch::fence_view_async_shared(); + epilog_barrier.arrive_and_wait(); + + // issue cp.async for sink tensor + if constexpr (!NoSink) { + if (rank < NumReductionCTA) { + // each thread loads one sink value + if (tid < size(sSink)) { + cp_async((int*)(&tClustergSink(tid)), (int*)(&sSink(tid))); + } + } + } + + // only do softmax on valid kv tiles + if (work_tile_info.is_valid()) { + // init rmem tensor to make first iteration correct + fill(tDrFmax, -cutlass::platform::numeric_limits::infinity()); + clear(l_i); + // prolog do arrive on tma_bmm1_full_barrier because first BMM1 doesn't need to wait for preceeding tcgen05.ld Acc1 + if (elect_one_sync()) { + arrive_barrier(shared_storage.tma_bmm1_full_barrier[0]); + } + + // initial phase bit for bmm1_softmax_full_barrier is 0 + // it is flipped to 1 when the BMM1 warp is done, and now we can start the softmax + int bmm1_softmax_full_barrier_phase_bit = 0; + + // initial phase bit for bmm2_epilog_full_barrier is 0 + // it is flipped to 1 when the BMM2 warp is done, and now we can start the epilog + int bmm2_epilog_full_barrier_phase_bit = 0; + + // If sliding window feature is enabled, we need to adjust the seq_len_start. + int seq_len_start = (sliding_window_size == 0) ? 0 : cute::max(0, seq_len - sliding_window_size); + + // loop over each kv tile + for (int kv_tile = 0; kv_tile < NumKVTiles; kv_tile++) { + + // wait for the BMM1 warp to finish + wait_barrier(shared_storage.bmm1_softmax_full_barrier, bmm1_softmax_full_barrier_phase_bit); + bmm1_softmax_full_barrier_phase_bit ^= 1; // flip the phase bit in preparation for next BMM1 + + //if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + // printf("[Softmax] tile %d fmax start\n", kv_tile); + //} + + // softmax on S + // load tmem -> rmem + copy(tiled_t2r_copy_bmm1, tDtAcc1, tDrS); + // there isn't a register dependency on tDrS to honor here to signal tcgen05.ld is done, so we need explicit tcgen05.wait::ld to make sure tcgen05.ld is done + // tcgen05.wait::ld has an implicit __syncwarp, so we don't need a bar.sync across all epilog warp group + cutlass::arch::fence_view_async_tmem_load(); + // only 1 thread per warp signals bmm1 of next iter to start, so in aggregate it's 4 arrives, i.e. each warp sync independently with bmm1, no need for all warp group to be in sync + // tcgen05.ld of Acc1 is done, the BMM1 of next iter can start to overwrite tmem + if (elect_one_sync()) { + arrive_barrier(shared_storage.tma_bmm1_full_barrier[(kv_tile + 1) % BMM1_DMA_Stage]); + } + + // fill the row with -inf if the data is not valid (i.e. over the kv seq len), such that after softmax they will be 0 + // the data per thread is a row of the S/Acc1 tensor of shape (CTA_kvL, (CTA_qHLocal, CTA_qL)) + // if the data is not valid, we fill it with -inf (mask off) such that it will be nop in fmax and fsum reduction + auto kv_seq_len = get<0>(cur_kvL(work_tile_info.kvL_idx_start + kv_tile)); + bool row_valid = (kv_seq_len < seq_len) && (kv_seq_len >= seq_len_start); // only kvL within [seq_len_start, seq_len) is valid + if (!row_valid) { + fill(tDrS, -cutlass::platform::numeric_limits::infinity()); + } + // scale it by softmax_scale_log2, s = s * softmax_scale_log2 = s * softmax_scale * log2(e) + // here we leverage the fact that expf(s) = exp2f(s * log2(e)), and doing the exp2f path generates less instructions than expf (and presumably slightly less accurate) + // so we fuse the log2(e) with the softmax scale, hence all later expf (e.g. alpha/beta) should be replaced by exp2f + // with cuda graph, softmax_scale_log2 is already precalculated on the cpu and hardened as kernel parameter/constant, there is no overhead of this fusion + CUTE_UNROLL + for (int i = 0; i < tDrS.size(); i++) { + tDrS[i] *= softmax_scale_log2; + } + + // calculate fmax across all threads for tile (CTA_kvL, (CTA_qHLocal, CTA_qL)) + // m_ij = fmax(s) + Tensor m_ij = make_tensor(shape(tDrFmax)); // (CTA_qHLocal * CTA_qL), per thread slice of the meta data max tensor for the current kv tile + cta_reduce(tDrS, m_ij, warp_idx, sFmaxPartial, epilog_barrier); + + // m_i_old = m_i + Tensor m_i_old = make_tensor(shape(tDrFmax)); + copy(tDrFmax, m_i_old); + + // m_i = max(m_i_old, m_ij) + CUTE_UNROLL + for (int i = 0; i < tDrFmax.size(); i++) { + tDrFmax[i] = reduce_op(tDrFmax(i), m_ij(i)); + } + + // alpha = exp2f(m_i_old - m_i) + CUTE_UNROLL + for (int i = 0; i < tDrFmax.size(); i++) { + rAlpha[i] = exp2f(m_i_old[i] - tDrFmax[i]); + } + + // p = exp2f(s - m_i) + CUTE_UNROLL + for (int i = 0; i < tDrS.size(); i++) { + tDrS[i] = exp2f(tDrS[i] - tDrFmax[i]); + } + + // l_i = alpha * l_i + p + CUTE_UNROLL + for (int i = 0; i < tDrS.size(); i++) { + l_i[i] = rAlpha[i] * l_i[i] + tDrS[i]; + } + + // convert S/P from fp32 to bf16 + CUTE_UNROLL + for (int i = 0; i < tDrS.size(); i++) { + tDrS_converted[i] = converter_s(tDrS[i]); + } + + // wait for the BMM2 warp to finish, such that we can write a new S tensor to smem for the next iteration of BMM2 + if (kv_tile > 0) { // we can safely overwrite S in the first iter since there is no preceeding BMM2 that consumes S + wait_barrier(shared_storage.bmm2_epilog_full_barrier, bmm2_epilog_full_barrier_phase_bit); + bmm2_epilog_full_barrier_phase_bit ^= 1; // flip the phase bit in preparation for next BMM2 + } + + //if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + // printf("[Softmax] tile %d S store start\n", kv_tile); + //} + + // store bf16 S to smem + copy(tDrS_converted, tDsS); + // fence.proxy.async.shared::cta ensures the smem write from generic proxy (i.e. cuda core) is visible to all async proxy (e.g. tma, tcgen05.mma) + // we want the S write to smem to be visible by tcgen05.mma in the mma warp + // so the fence+synchronization pattern is the following: + // 1. every thread in the epilog warp issues a fence.proxy.async.shared::cta such that the smem write by this thread is visible to async proxy + // 2. use named barrier to sync all threads in the epilog warp, so when all threads reach this point, every thread has executed the fence.proxy.async.shared::cta + // at this point the smem write is visible to tcgen05.mma unit + // 3. we use mbarrier to notify mma warp that the S tensor is ready and visible to tcgen05.mma unit and bmm2 is ready to start (if V load is also done) + // + // fence.proxy.async.shared::cta + cutlass::arch::fence_view_async_shared(); + // only need to sync within the warp, baceuse later each warp independently signals bmm2 to start, no need for all warp group to be in sync + __syncwarp(); + + // do the correction here, skip for first iter + // because we already checked BMM2 is done before the S store, so we can tcgen05.ld Acc2 + // also first iter value of alpha=0, if there is perf issue, we don't need the if + if (kv_tile > 0) { + // bmm2 load tmem -> rmem + // only the first 16 threads in each warp contains the Acc2 tensor data, each thread holds a row of the Acc2 tensor + // the rest 16 threads hold bogus data + tmem_load(acc2_tmem_addr, tAcc2rAcc2); + // acc2 = alpha * acc2 + CUTE_UNROLL + for (int i = 0; i < tAcc2rAcc2.size(); i++) { + tAcc2rAcc2[i] *= rAlpha[i]; + } + // now use tcgen05.st to store corrected Acc2 back to tmem + tmem_store(tAcc2rAcc2, acc2_tmem_addr); + // we need a tcgen05.wait::st to make sure tcgen05.st result is visible to async proxy (i.e. tcgen05.mma) + // tcgen05.wait::st has an implicit __syncwarp, so we don't need a bar.sync across all epilog warp group + cutlass::arch::fence_view_async_tmem_store(); + } + + // the warp is in sync, just do arrive per warp to signal bmm2 to start + // only 1 thread per warp signals bmm2 to start, so in aggregate it's 4 arrives + if (elect_one_sync()) { + arrive_barrier(shared_storage.tmasoftmax_bmm2_full_barrier[kv_tile % BMM2_DMA_Stage]); + } + } + + // overlapped with the last BMM2 + // do transpose of l_i in rmem for faster fsum reduction + copy(l_i, tDsAcc1); + // make the smem write visible to all threads in the epilog warp + epilog_barrier.arrive_and_wait(); + // now each thread holds a partial column of the Acc1 tensor + copy(tFsumsAcc1, tFsumrAcc1); + + // l_ij = sum(p) + int constexpr Interval = CTA_kvL / CTA_qHLocal / CTA_qL; + // do fsum reduction among Interval number of threads + tDrFsum(0) = cta_reduce_transposed(tFsumrAcc1); + // get the rest of the fsum values (different q tokens) to thread 0 + // now thread 0, Interval, 2 * Interval, ... have the fsum values for each q token + CUTE_UNROLL + for (int i = 1; i < tDrFsum.size(); i++) { + tDrFsum(i) = __shfl_sync(0xffffffff, tDrFsum(0), i * Interval, 32); + } + + // up until here, the content of tDrFmax and tDrFsum is: + // tDrFmax: warp 0-3: [fmax(q0), fmax(q1), fmax(q2), fmax(q3), fmax(q4), fmax(q5), fmax(q6), fmax(q7)] + // tDrFsum: warp 0 [fsum(q0), fsum(q1)] + // warp 1 [fsum(q2), fsum(q3)] + // warp 2 [fsum(q4), fsum(q5)] + // warp 3 [fsum(q6), fsum(q7)] + // st.async expects the layout of tDrFsum, so we rearrange tDrFmax to the same layout as tDrFsum + static_assert(NumEpilogWarps == 4, "NumEpilogWarps must be 4"); + if (tid == 32) { + int constexpr WarpId = 1; + CUTE_UNROLL + for (int i = 0; i < NumQPerWarp; i++) { + tDrFmax(i) = tDrFmax(WarpId * NumQPerWarp + i); + } + } + else if (tid == 64) { + int constexpr WarpId = 2; + CUTE_UNROLL + for (int i = 0; i < NumQPerWarp; i++) { + tDrFmax(i) = tDrFmax(WarpId * NumQPerWarp + i); + } + } + else if (tid == 96) { + int constexpr WarpId = 3; + CUTE_UNROLL + for (int i = 0; i < NumQPerWarp; i++) { + tDrFmax(i) = tDrFmax(WarpId * NumQPerWarp + i); + } + } + + // we can start sending cta level fmax and fsum to remote using st.async, + // tid 0 in each epilog warp will send its local portion of fmax and fsum to corresponding reduction cta + // when we have 8 q tokens in total and 4 epilog warps, each thread sends 2 q tokens to corresponding reduction cta + if ((tid % 32) == 0) { + CUTE_UNROLL + for (int i = 0; i < NumQPerWarp; i++) { + auto cluster_tv = cluster_reduce_tv_tv_layout(warp_idx, i); // it's the 1d coordinate of (reduction cta id (T'), V') + // idx2crd convertes 1d coordinate to natural coordinate, i.e. (reduction cta id (T'), V') + int local_q_idx = get<1>(idx2crd(cluster_tv, shape(cluster_reduce_tv_q_layout))); + store_shared_remote_f32(tDrFmax(i), (uint32_t)&tSRCdsFmaxMailbox[i](local_q_idx), dsmem_maxsum_mailbox_full_barrier_addr[i]); + store_shared_remote_f32(tDrFsum(i), (uint32_t)&tSRCdsFsumMailbox[i](local_q_idx), dsmem_maxsum_mailbox_full_barrier_addr[i]); + } + } + + // wait for the BMM2 warp to finish + wait_barrier(shared_storage.bmm2_epilog_full_barrier, bmm2_epilog_full_barrier_phase_bit); + + //if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + // printf("[Epilog] barrier full\n"); + //} + + // bmm2 load tmem -> rmem + // for dH=64, only the first 16 threads in each warp contains the Acc2 tensor data, each thread holds a row of the Acc2 tensor + // the rest 16 threads hold bogus data + // for dH=128, all 32 threads hold valid data + tmem_load(acc2_tmem_addr, tAcc2rAcc2); + int lane_id = cutlass::canonical_lane_idx(); + if (lane_id < (CTA_dH / NumEpilogWarps)) { + // do the st.async of acc2 to remote, rmem -> dsmem + CUTE_UNROLL + for (int i = 0; i < tAcc2rAcc2.size(); i++) { + // use the exact same partition layout as fmax and fsum cluster reduction + // i.e. each reduction cta handles CTA_qHLocal * CTA_qL / NumReductionCTA number of q tokens + // here we do q_idx -> (reduction cta id (T'), V'), similarly, we use idx2crd to convert 1d coordinate to natural coordinate + int dst_cta_id = get<0>(idx2crd(cluster_reduce_q_tv_layout(i), shape(cluster_reduce_tv_q_layout))); + int local_q_idx = get<1>(idx2crd(cluster_reduce_q_tv_layout(i), shape(cluster_reduce_tv_q_layout))); + store_shared_remote_f32(tAcc2rAcc2(i), (uint32_t)&tSRCdsAcc2Mailbox[dst_cta_id](local_q_idx), dsmem_acc2_mailbox_full_barrier_addr[dst_cta_id]); + } + } + + // signal the mma warp tcgen05.ld of bmm2 is done, can start deallocate all tmem + tmem_allocation_barrier.arrive(); + } + + // only NumReductionCTA number of reduction ctas will do the reduction + if (rank < NumReductionCTA) { + // handle oob when NumSplits < MaxSplits + // doing computation on MaxSplits is faster than doing NumSplits with if statement + clear(rBeta); + + if constexpr (!NoSink) { + // wait for cp.async of sink tensor to finish + if (tid < size(sSink)) { + cp_async_fence(); + cp_async_wait<0>(); + } + // make the sink tensor visible to all threads in the epilog warp + epilog_barrier.arrive_and_wait(); + } + + // the reduction cta wait for st.async of fmax and fsum to finish + int maxsum_mailbox_full_barrier_phase_bit = 0; + wait_barrier(shared_storage.maxsum_mailbox_full_barrier, maxsum_mailbox_full_barrier_phase_bit); + + //if (elect_one_sync() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + // printf("[Reduction] barrier full\n"); + //} + + // every thread redundantly calculates cluster wide fmax for (CTA_qHLocal * CTA_qL / NumReductionCTA) q tokens + CUTE_UNROLL + for (int i = 0; i < rFmaxCluster.size(); i++) { + // cache the mailbox tensor in rmem to hide ld.shared latency, if we demand load ld.shared, its latency will hurt pipelining/unrolling amount + // so we manually pipeline the ld.shared first and do all the operation on rmem, + // this is similar to sw pipelining but we do it manually because compiler is not smart enough to figure it out + // instruction sequencing is important because we are an in-order issue machine, meaning stall of current instruction issue will block all subsequent instruction issue + // many times compiler is not smart enough to do it, so you need to write the code in the right order to help it + Tensor rFmaxMailbox = make_tensor(Int{}); + copy(sFmaxMailbox(_,i), rFmaxMailbox); + + Tensor rFsumMailbox = make_tensor(Int{}); + copy(sFsumMailbox(_,i), rFsumMailbox); + + rFmaxCluster(i) = rFmaxMailbox(0); + + CUTE_UNROLL + for (int j = 1; j < MaxSplits; j++) { + rFmaxCluster(i) = reduce_op(rFmaxCluster(i), rFmaxMailbox(j)); + } + + // after fmax is done, we can do beta and fsum calculation + // 2 optimizations we are doing: + // 1. if we put NumSplits in the trip count, this makes it into a dynamic loop, and the index j into rBeta becomes a dynamic index + // but rBeta is in RF which doesn't support dynamic indexing, so the compiler will put it onto the stack (local memory) instead and generate ld.local/st.local instructions + // we want to keep rBeta in RF to avoid the local memory access, so we put MaxSplits in the trip count + // 2. we don't use predication of if statement to avoid the access when j >= NumSplits, instead we set the remainder sum/max value to 0 and inf and loop over MaxSplits + // when we use predicate, compiler will generate branch instruction which prevents the loop from doing more software pipelining, i.e. overlapping independent instructions + // from different iterations + TypeAcc acc = 0.0f; + CUTE_UNROLL + for (int j = 0; j < MaxSplits; j++) { + rBeta(i, j) = exp2f(rFmaxMailbox(j) - rFmaxCluster(i)); + acc += rBeta(i, j) * rFsumMailbox(j); + } + rFsumCluster(i) = acc; + if constexpr (!NoSink) { + rFsumCluster(i) += exp2f(sSink(i) * Log2_E - rFmaxCluster(i)); + } + } + + if (tid < CTA_dH) { + // initial phase bit for acc2_mailbox_full_barrier is 0 + // it is flipped to 1 when the acc2 st.async are done, and now we can start the reduction + int acc2_mailbox_full_barrier_phase_bit = 0; + // wait for the acc2 st.async to finish + wait_barrier(shared_storage.acc2_mailbox_full_barrier, acc2_mailbox_full_barrier_phase_bit); + + // now we can do the reduction, reduce across Acc2 of all splits + CUTE_UNROLL + for (int i = 0; i < tAcc2rO.size(); i++) { + TypeAcc acc = 0.0f; + CUTE_UNROLL + for (int j = 0; j < MaxSplits; j++) { + acc += rBeta(i, j) * sAcc2Mailbox(tid, i, j); + } + // o = o / l_i + tAcc2rO(i) = acc / rFsumCluster(i); + } + + // convert from fp32 to bf16 + CUTE_UNROLL + for (int i = 0; i < tAcc2rO.size(); i++) { + tAcc2rO_converted(i) = converter_o(tAcc2rO(i)); + } + + // rmem -> gmem + copy(tAcc2rO_converted, tCTAgO(tid, _)); + } + } + + // debug + /*epilog_barrier.arrive_and_wait(); + if ((tid == 0) && (blockIdx.x == 15) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + int example_row = 0; + + //print("sAcc1:\t"); print(sAcc1); print("\n"); // s = q * k * softmax_scale_log2 + print("tDrFmax:\t"); print_tensor(tDrFmax); print("\n"); // m_ij = fmax(s) + print("tDrS:\t"); print_tensor(tDrS); print("\n"); // p = exp2f(s - m_ij) + print("tDrFsum:\t"); print_tensor(tDrFsum); print("\n"); // l_ij = sum(p) + print("tDrS_converted:\t"); print_tensor(tDrS_converted); print("\n"); + print("sS:\t"); print_tensor(sS(example_row,_,0)); print("\n"); + + Tensor sP = shared_storage.tensor_sP(); // ((CTA_qHLocal, CTA_qL), CTA_kvL, BMM2_DMA_Stage) + print("sP:\t"); print_tensor(sP(_,example_row,0)); print("\n"); + + print("tAcc2rAcc2:\t"); print_tensor(tAcc2rAcc2); print("\n"); + + print("sFmaxMailbox: "); print_tensor(sFmaxMailbox); print("\n"); + print("sFsumMailbox: "); print_tensor(sFsumMailbox); print("\n"); + print("rFmaxCluster: "); print_tensor(rFmaxCluster); print("\n"); + print("rBeta: "); print_tensor(rBeta); print("\n"); + print("rFsumCluster: "); print_tensor(rFsumCluster); print("\n"); + + print("sAcc2Mailbox: "); print_tensor(sAcc2Mailbox(example_row,_,_)); print("\n"); + print("tAcc2rO: "); print_tensor(tAcc2rO); print("\n"); + print("tAcc2rO_converted: "); print_tensor(tAcc2rO_converted); print("\n"); + print("gO: "); print_tensor(gO(example_row,_)); print("\n"); + }*/ +} + +// K has shape (kvL, dH, kvH, BS) +// Q has shape ((qHLocal, qL), dH, kvH, BS) +// V has shape (dH, kvL, kvH, BS) +// O has shape (dH, (qHLocal, qL), kvH, BS) +// sinks has shape ((qHLocal, qL), kvH) +// seq_len has shape (BS) +template < + class SharedStorage, + class KTensor, class QTensor, class VTensor, class OTensor, class SinkTensor, + class TmaAtomK, class TmaAtomQ, class TmaAtomV, + class TiledBMM1, class TiledBMM2, + class TypeAcc, + int CTA_qHLocal, int CTA_qL, int CTA_kvL, int CTA_dH, + int BMM1_DMA_Stage, int BMM2_DMA_Stage, + int MaxSplits, int NumReductionCTA, + bool NoSink> +__maxnreg__(128) +__global__ void +gqa_device( + KTensor mK, + QTensor mQ, + VTensor mV, + OTensor mO, + SinkTensor mSink, + int* seq_lens, + CUTE_GRID_CONSTANT TmaAtomK const tma_atom_K, + CUTE_GRID_CONSTANT TmaAtomQ const tma_atom_Q, + CUTE_GRID_CONSTANT TmaAtomV const tma_atom_V, + TiledBMM1 tiled_bmm1, + TiledBMM2 tiled_bmm2, + float softmax_scale_log2, + int sliding_window_size, + int pdl_count +) { + //if (threadIdx.x == 0) { + // printf("[%d, %d, %d] gqa_device\n", blockIdx.x, blockIdx.y, blockIdx.z); + //} + + // Allocate SMEM + extern __shared__ char shared_memory[]; + SharedStorage& shared_storage = *reinterpret_cast(shared_memory); + + // WorkTileInfo, for non persistent static scheduler, cta id is the work tile info + // since loading the seq_lens is on the critical path of the prolog, we want to start it as soon as possible + int kvH = shape<2>(mK); + int BS_idx = blockIdx.x / kvH; + // only thread 0 issues cp.async to load the seq_len + if (threadIdx.x == 0) { + cp_async(&seq_lens[BS_idx], &shared_storage.seq_len); + } + + //if (threadIdx.x == 0) { + // printf("[%d, %d, %d] work_tile_info: %d, %d, %d, %d, %d\n", blockIdx.x, blockIdx.y, blockIdx.z, work_tile_info.BS_idx, work_tile_info.kvH_idx, work_tile_info.kvL_idx_start, work_tile_info.kvL_idx_end, work_tile_info.dH_idx, work_tile_info.qHLocal_idx, work_tile_info.qL_idx); + //} + + int warp_idx = cutlass::canonical_warp_idx_sync(); + + // barrier initialization, warp 0 does initialization + if (warp_idx == 0) { + // transaction barrier because tma arrive on it, 6 thread arrive: one for DMA_Q warp, one for DMA_KV (K fetch) warp, and 4 for softmax warp (tcgen05.ld Acc1 is done) + cutlass::arch::detail::initialize_barrier_array_aligned(shared_storage.tma_bmm1_full_barrier, /* arrival count */ 6); + // 1 thread (BMM1) arrive to signal DMA_Q and DMA_KV (K fetch) warp + cutlass::arch::detail::initialize_barrier_array_aligned(shared_storage.tma_bmm1_empty_barrier, /* arrival count */ 1); + // transaction barrier because tma arrive on it, 5 thread arrive: one for DMA_KV (V fetch) warp and 4 for softmax warp (S/P store) + cutlass::arch::detail::initialize_barrier_array_aligned(shared_storage.tmasoftmax_bmm2_full_barrier, /* arrival count */ 5); + // 1 thread (BMM2) arrive to signal DMA_KV (V fetch) and softmax warp (P store) + cutlass::arch::detail::initialize_barrier_array_aligned(shared_storage.tma_bmm2_empty_barrier, /* arrival count */ 1); + // 1 thread (BMM1) arrive to signal softmax + cutlass::arch::detail::initialize_barrier_array_aligned(&shared_storage.bmm1_softmax_full_barrier, /* arrival count */ 1); + // 1 thread (BMM2) arrive to signal epilog + cutlass::arch::detail::initialize_barrier_array_aligned(&shared_storage.bmm2_epilog_full_barrier, /* arrival count */ 1); + // 1 thread (epilog) arrive to signal maxsum + cutlass::arch::detail::initialize_barrier_array_aligned(&shared_storage.maxsum_mailbox_full_barrier, /* arrival count */ 1); + // 1 thread (epilog) arrive to signal acc2 + cutlass::arch::detail::initialize_barrier_array_aligned(&shared_storage.acc2_mailbox_full_barrier, /* arrival count */ 1); + } + // Sync tmem allocation status between MMA and softmax/epilogue warps within CTA + // 32 threads (mma) + 128 threads (epilog) to sync + // also used for tmem deallocation between epilog warps and mma warps within CTA + cutlass::arch::NamedBarrier tmem_allocation_barrier(32 + 128, cutlass::arch::ReservedNamedBarriers::TmemAllocBarrier); + // syncing all threads (128) within 4 epilog warps + cutlass::arch::NamedBarrier epilog_barrier(128, cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); + + /*if (thread0() && (blockIdx.x == 0) && (blockIdx.y == 0) && (blockIdx.z == 0)) { + Tensor tCsK = shared_storage.tensor_sK(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + Tensor tCsQ = shared_storage.tensor_sQ(); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + Tensor tCsV = shared_storage.tensor_sV(); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + Tensor sS = shared_storage.tensor_sS(); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + Tensor sP = shared_storage.tensor_sP(); // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) + + printf("tCsK:\t"); print(tCsK); print("\n"); + printf("tCsQ:\t"); print(tCsQ); print("\n"); + printf("tCsV:\t"); print(tCsV); print("\n"); + printf("sS:\t"); print(sS); print("\n"); + printf("sP:\t"); print(sP); print("\n"); + }*/ + + // barrier initialization needs to be visible to all warps + // defer it as late as possible to allow some thread divergence in prolog + cutlass::arch::fence_barrier_init(); +#if 0 + // this will have a membar.gpu to ensure dsmem write visibility within the entire cluster, because there isn't a membar.cluster + // membar.gpu is 0.2us + cluster_sync(); +#else + // the alternative is to use proper fences + // at the ptx level, fence.mbarrier_init.release.cluster act as a release fence (in cluster scope) for mbarrier init op + cutlass::arch::fence_barrier_init(); + // thread 0 waits for its previously issued cp.async to complete + // here we overlap the cp.async with the barrier initialization as much as possible + if (threadIdx.x == 0) { + cp_async_fence(); + cp_async_wait<0>(); + } + + // the cluster sync serves two purposes: + // 1. it waits for all threads in the cluster to see the barrier initialization + // 2. it waits for all threads in the cta to see the cp.async result in smem + cluster_arrive_relaxed(); + cluster_wait(); +#endif + + // bid.y includes rasterization of qHLocal and qL + // so if we have (2, 4) shape (qHLocal, qL) cta, we do the following mapping from linear cta id to 2d id + // 0 -> (0, 0) + // 1 -> (1, 0) + // 2 -> (0, 1) + // 3 -> (1, 1) + // 4 -> (0, 2) + // 5 -> (1, 2) + // 6 -> (0, 3) + // 7 -> (1, 3) + int qHLocal = shape<0>(shape<0>(mQ)); + int num_qHLocal = cutlass::ceil_div(qHLocal, CTA_qHLocal); + // bid.z is the split id for kvL split, try to evenly distribute the kvL blocks to every CTA + int rank = blockIdx.z; + int seq_len = shared_storage.seq_len; + // Sliding window optimization: when enabled, we only process tokens in range + // [seq_len - sliding_window_size, seq_len). To simplify tile distribution, + // we align the skip boundary to CTA_kvL tiles. + // + // Example with seq_len=100, sliding_window_size=30, CTA_kvL=16: + // - Tokens we care about: [70, 100) + // - Skip offset aligned to tiles: floor(70 / 16) * 16 = 64 + // - Workload range: [64, 100), length = 36 + // - Tiles to process: ceil(36 / 16) = 3 tiles + int workload_seq_len = seq_len; + int seq_len_skip_offset = 0; // Number of sequence positions to skip (tile-aligned) + if (sliding_window_size > 0 && sliding_window_size < seq_len) { + int unaligned_skip = seq_len - sliding_window_size; + seq_len_skip_offset = (unaligned_skip / CTA_kvL) * CTA_kvL; // Align to tile boundary + workload_seq_len = seq_len - seq_len_skip_offset; + } + int NumKVTiles = cutlass::ceil_div(workload_seq_len, CTA_kvL); + int NumSplits = cute::min(MaxSplits, NumKVTiles); + int kvL_tile_count_per_cta = NumKVTiles / MaxSplits; + int kvL_tile_count_remainder = NumKVTiles % MaxSplits; + int kvL_tile_count = kvL_tile_count_per_cta + (rank < kvL_tile_count_remainder ? 1 : 0); + int kvL_tile_count_skip_offset = seq_len_skip_offset / CTA_kvL; + int kvL_tile_count_start = rank * kvL_tile_count_per_cta + (rank < kvL_tile_count_remainder ? rank : kvL_tile_count_remainder) + kvL_tile_count_skip_offset; + int kvL_tile_count_end = kvL_tile_count_start + kvL_tile_count; + WorkTileInfo work_tile_info { + .BS_idx = (int32_t)BS_idx, + .kvH_idx = (int32_t)(blockIdx.x % kvH), + .kvL_idx_start = (int32_t)kvL_tile_count_start, + .kvL_idx_end = (int32_t)kvL_tile_count_end, + .dH_idx = 0, // no dH tiling for bmm2 + .qHLocal_idx = (int32_t)(blockIdx.y % num_qHLocal), + .qL_idx = (int32_t)(blockIdx.y / num_qHLocal), + .is_valid_tile = (kvL_tile_count > 0) + }; + + if (warp_idx == 0) { + DMA_Q_warp(shared_storage, work_tile_info, mQ, &tma_atom_Q, tiled_bmm1); + } + else if (warp_idx == 1) { + DMA_KV_warp(shared_storage, work_tile_info, mK, mV, &tma_atom_K, &tma_atom_V, tiled_bmm1, tiled_bmm2); + } + else if (warp_idx == 2) { + MMA_warp(shared_storage, work_tile_info, mO, tiled_bmm1, tiled_bmm2, tmem_allocation_barrier); + } + else if (warp_idx >= 4) { + // epilog tid is from 128 to 255, need to offset by -128 when getting the per thread slice + int tid = threadIdx.x - 128; + // warp_idx - 4 because epilog warp group starts from warp 4 + EPILOG_warp(shared_storage, work_tile_info, mK, mO, mSink, seq_len, tiled_bmm1, tiled_bmm2, softmax_scale_log2, sliding_window_size, tmem_allocation_barrier, epilog_barrier, NumSplits, tid, warp_idx - 4, rank); + } + + __syncthreads(); +} + +// K has shape (kvL, dH, kvH, BS) +// Q has shape ((qHLocal, qL), dH, kvH, BS) +// V has shape (dH, kvL, kvH, BS) +// O has shape (dH, (qHLocal, qL), kvH, BS) +// kvL is max_seq_len, seq_lens[BS] is the actual seq len for each batch +// sinks has shape (qHLocal * kvH), i.e. one sink per q head, when device_ptr_sinks is nullptr, it's disabled +// sliding_window_size is the size of the sliding window, when it's 0, it's disabled +template< + class TypeQKV, class TypeO, class TypeAcc, + int CTA_qHLocal, int CTA_qL, int CTA_kvL, int CTA_dH, + int BMM1_DMA_Stage, int BMM2_DMA_Stage, + int MaxSplits, int NumReductionCTA> +void gqa_host( + TypeQKV* device_ptr_K, + TypeQKV* device_ptr_Q, + TypeQKV* device_ptr_V, + TypeO* device_ptr_O, + int* seq_lens, + TypeAcc* device_ptr_sinks, + int kvH, int qHLocal, int qL, int kvL, int dH, int BS, + int stride_K_kvH, int stride_K_kvL, int stride_K_dH, int stride_K_BS, + int stride_Q_kvH, int stride_Q_qHLocal, int stride_Q_qL, int stride_Q_dH, int stride_Q_BS, + int stride_V_kvH, int stride_V_kvL, int stride_V_dH, int stride_V_BS, + int stride_O_kvH, int stride_O_qHLocal, int stride_O_qL, int stride_O_dH, int stride_O_BS, + float softmax_scale, + int sliding_window_size, + bool pdl, int pdl_count = -1, + cudaStream_t stream = 0 +) { + Layout layout_K = make_layout_K(kvH, kvL, dH, BS, stride_K_kvH, stride_K_kvL, stride_K_dH, stride_K_BS); + Layout layout_Q = make_layout_Q(kvH, qHLocal, qL, dH, BS, stride_Q_kvH, stride_Q_qHLocal, stride_Q_qL, stride_Q_dH, stride_Q_BS); + Layout layout_V = make_layout_V(kvH, kvL, dH, BS, stride_V_kvH, stride_V_kvL, stride_V_dH, stride_V_BS); + Layout layout_O = make_layout_O(kvH, qHLocal, qL, dH, BS, stride_O_kvH, stride_O_qHLocal, stride_O_qL, stride_O_dH, stride_O_BS); + Layout layout_sinks = make_layout_sinks(qHLocal, qL, kvH); + + // how we handle oob: + // oob for K, Q, V are handled by TMA + // oob for O is explicitly handled by predicate in the epilog since it uses simple st.global epilog + // we partition kvL with tile size of CTA_kvL, and we evenly distribute the kvL blocks to MaxSplits number of cta in the cluster + assert(NumReductionCTA <= MaxSplits); + static_assert(((CTA_qHLocal * CTA_qL) % NumReductionCTA) == 0, "each reduction cta must have even number of q tokens"); + + //printf("Running for problem shape (kvH x qHLocal x qL x kvL x dH x BS): %d x %d x %d x %d x %d x %d\n", kvH, qHLocal, qL, kvL, dH, BS); + //printf("with tile size CTA_qHLocal: %d, CTA_qL: %d, CTA_kvL: %d, CTA_dH: %d\n", CTA_qHLocal, CTA_qL, CTA_kvL, CTA_dH); + //printf("layout_K: "); print(layout_K); printf("\n"); + //printf("layout_Q: "); print(layout_Q); printf("\n"); + //printf("layout_V: "); print(layout_V); printf("\n"); + //printf("layout_O: "); print(layout_O); printf("\n"); + + // create the cute tensor + Tensor mK = make_tensor(make_gmem_ptr(device_ptr_K), layout_K); // (kvL, dH, kvH, BS) + Tensor mQ = make_tensor(make_gmem_ptr(device_ptr_Q), layout_Q); // ((qHLocal, qL), dH, kvH, BS) + Tensor mV = make_tensor(make_gmem_ptr(device_ptr_V), layout_V); // (dH, kvL, kvH, BS) + Tensor mO = make_tensor(make_gmem_ptr(device_ptr_O), layout_O); // (dH, (qHLocal, qL), kvH, BS) + Tensor mSink = make_tensor(make_gmem_ptr(device_ptr_sinks), layout_sinks); // ((qHLocal, qL), kvH) + + //printf("mK: "); print(mK); printf("\n"); + //printf("mQ: "); print(mQ); printf("\n"); + //printf("mV: "); print(mV); printf("\n"); + //printf("mO: "); print(mO); printf("\n"); + //printf("mSink: "); print(mSink); printf("\n"); + + static_assert(CTA_kvL == 128, "BMM1's MMA_M needs to be 128 for tcgen05.ld->softmax"); + static_assert(((CTA_qHLocal * CTA_qL) % 8) == 0, "BMM1's MMA_N needs to be divisible by 8 for tcgen05.mma"); + assert(dH == CTA_dH); // bmm1 only has 1 kblock (i.e. 1 Q tile), bmm2 deal with all dH for now, in the foreseable future this is the hardest constraint to lift + static_assert((CTA_dH == 128) || (CTA_dH == 64), "BMM2's MMA_M needs to be at either 128 or 64 for tcgen05.ld->correction"); + // we swap AB so bmm1 is K (CTA_kvL, CTA_dH) x Q (CTA_dH, CTA_qHLocal * CTA_qL) + // both Q and K are dH (K in gemm terminology) major + // M = CTA_kvL, N = CTA_qHLocal * CTA_qL, K = CTA_dH + TiledMMA tiled_bmm1 = cutlass::gemm::collective::detail::sm100_make_1sm_trivial_tiled_mma< + TypeQKV, TypeQKV, TypeAcc, // Mma's A, B, and Accumulator types + Shape, Int, Int>, // TileShape_MNK + Shape<_1, _1, _1>, // ClusterShape_MNK + cute::UMMA::Major::K, cute::UMMA::Major::K>(); + + // we swap AB for bmm2 as well, V (dH, CTA_kvL) x P (CTA_kvL, CTA_qHLocal * CTA_qL) + // V is dH (M in gemm terminology) major, P is CTA_kvL (K in gemm terminology) major in smem after each thread writes P from rmem to smem + // M = CTA_dH, N = CTA_qHLocal * CTA_qL, K = CTA_kvL + TiledMMA tiled_bmm2 = cutlass::gemm::collective::detail::sm100_make_1sm_trivial_tiled_mma< + TypeQKV, TypeQKV, TypeAcc, // Mma's A, B, and Accumulator types + Shape, Int, Int>, // TileShape_MNK + Shape<_1, _1, _1>, // ClusterShape_MNK + cute::UMMA::Major::MN, cute::UMMA::Major::K>(); + + // We can also print and inspect the tiled_mma + //print(tiled_bmm1); + //print(tiled_bmm2); + + // Pre-partitioned smem Tile Shape to post-partitioned smem tile shape ((Mma_M, Mma_K), NumMma_M, NumMma_K, DMA_Stage) + // bmm1 has BMM1_DMA_Stage stage + // tile K shape is (CTA_kvL, CTA_dH, BMM1_DMA_Stage) and is the A operand + // tile Q shape is ((CTA_qHLocal, CTA_qL), CTA_dH, 1) and is the B operand, because all K tiles share the same Q tiles, we only have 1 stage of Q tiles + // tile S shape is (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) and is the C operand + auto shape_K = make_shape(Int{}, Int{}, Int{}); + auto shape_Q = make_shape(make_shape(Int{}, Int{}), Int{}, Int<1>{}); + auto shape_S = make_shape(Int{}, make_shape(Int{}, Int{}), Int<1>{}); + auto mma_shape_K = partition_shape_A(tiled_bmm1, shape_K); + auto mma_shape_Q = partition_shape_B(tiled_bmm1, shape_Q); + + // bmm2 has 1 stage because we explicitly only has 1 kvL tile + // tile V shape is (CTA_dH, CTA_kvL, BMM2_DMA_Stage) and is the A operand + // tile P shape is ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) and is the B operand, since 1 P tile is enough to overlap MMA with softmax + auto shape_V = make_shape(Int{}, Int{}, Int{}); + auto shape_P = select<1, 0, 2>(shape_S); // just a permutation of shape_S + auto mma_shape_V = partition_shape_A(tiled_bmm2, shape_V); + + // Print and inspect shapes for this example. note that this is only the shape of the smem tile, not the actual smem layout + //print("shape_K: "); print(shape_K); print("\n"); + //print("shape_Q: "); print(shape_Q); print("\n"); + //print("shape_S: "); print(shape_S); print("\n"); + //print("shape_V: "); print(shape_V); print("\n"); + //print("shape_P: "); print(shape_P); print("\n"); + //print("mma_shape_K: "); print(mma_shape_K); print("\n"); + //print("mma_shape_Q: "); print(mma_shape_Q); print("\n"); + //print("mma_shape_V: "); print(mma_shape_V); print("\n"); + + // choose the swizzle atom for K, Q, S, V and P + // for bmm1, both K and Q are dH (K in gemm terminology) major + // and S is M major, none of the swizzle layout gives bank conflict free store to smem for S, + // swizzle 64B/128B should give at most 2-way bank conflict which is good enough since the output tile is small + auto SmemLayoutAtomK = cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, // gmem layout of K + TypeQKV, // data type of K + decltype(shape<0>(shape_K)), decltype(shape<1>(shape_K))>(); // tile size of K + auto SmemLayoutAtomQ = cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::K, // gmem layout of Q + TypeQKV, // data type of Q + decltype(shape<0>(shape_Q)), decltype(shape<1>(shape_Q))>(); // tile size of Q + // we use TypeQKV because we don't actually want to store the bf32 output to smem, we do the softmax and quantize it to bf16 and then store it as P + // hence the smem layout atom should reflect the bf16 precision + // for bmm1 tcgen05.ld, each register is holding a row of S (CTA_kvL is mapped to the thread dimension), if we do st.shared from rmem to smem, to avoid bank conflict, we need to put T0V0, T1V0, T2V0, ... T31V0 contiguously in smem + // then the smem layout of S is M (CTA_kvL) major, so we choose MN major swizzle atom + auto SmemLayoutAtomS = UMMA::Layout_MN_SW128_Atom{}; + + // for bmm2, V is dH (M in gemm terminology) major, P is CTA_kvL (K in gemm terminology) major + auto SmemLayoutAtomV = cutlass::gemm::collective::detail::sm100_smem_selector< + cute::UMMA::Major::MN, // gmem layout of V + TypeQKV, // data type of V + decltype(shape<0>(shape_V)), decltype(shape<1>(shape_V))>(); // tile size of V + // swizzle atom for P should be the transpose of the swizzle atom for S, because they literally represent the same tensor just with different dimension order (aka a pytorch transpose) + auto SmemLayoutAtomP = UMMA::Layout_K_SW128_Atom{}; + + // Print and inspect SmemLayoutAtomK, SmemLayoutAtomQ, SmemLayoutAtomS, SmemLayoutAtomV, and SmemLayoutAtomP for this example. + //print("SmemLayoutAtomK: "); print(SmemLayoutAtomK); print("\n"); + //print("SmemLayoutAtomQ: "); print(SmemLayoutAtomQ); print("\n"); + //print("SmemLayoutAtomS: "); print(SmemLayoutAtomS); print("\n"); + //print("SmemLayoutAtomV: "); print(SmemLayoutAtomV); print("\n"); + //print("SmemLayoutAtomP: "); print(SmemLayoutAtomP); print("\n"); + + // finally construct the smem layout for tile K, Q, V, S, and P + auto sK_layout = UMMA::tile_to_mma_shape(SmemLayoutAtomK, mma_shape_K); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM1_DMA_Stage) + auto sQ_layout = UMMA::tile_to_mma_shape(SmemLayoutAtomQ, mma_shape_Q); // ((Mma_N, Mma_K), NumMma_N, NumMma_K, 1) + auto sV_layout = UMMA::tile_to_mma_shape(SmemLayoutAtomV, mma_shape_V); // ((Mma_M, Mma_K), NumMma_M, NumMma_K, BMM2_DMA_Stage) + // S and P use tile_to_shape as we do the mma partition in the kernel later + // here we use Step to enforce same swizzle atom stacking order for S and P, + // with Step<_1, _2, _3>, basically we say the swizzle atom is first stacked along the first dimension (CTA_kvL), then the second dimension ((CTA_qHLocal, CTA_qL)), then the third dimension (1) + auto sS_layout = tile_to_shape(SmemLayoutAtomS, shape_S, Step<_1, _2, _3>{}); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + // with Step<_2, _1, _3>, basically we say the swizzle atom is first stacked along the second dimension (CTA_kvL), then the first dimension ((CTA_qHLocal, CTA_qL)), then the third dimension (1) + auto sP_layout = tile_to_shape(SmemLayoutAtomP, shape_P, Step<_2, _1, _3>{}); // ((CTA_qHLocal, CTA_qL), CTA_kvL, 1) + auto sAcc1_layout = make_layout(shape_S); // (CTA_kvL, (CTA_qHLocal, CTA_qL), 1) + // for storing fmax and fsum warp reduce partial results + int constexpr NumEpilogWarps = 4; + // NumEpilogWarps contiguous because we often ld.shared all NumEpilogWarps from 1/32 threads, this has best vectorization + auto sWarpReduce_layout = make_layout(make_shape(Int{}, make_shape(Int{}, Int{}))); // (NumEpilogWarps, (CTA_qHLocal, CTA_qL)) + // MaxSplits contiguous because we often ld.shared all MaxSplits from 1/32 threads, this has best vectorization + auto sMSMailbox_Layout = make_layout(make_shape(Int{}, Int{})); // (MaxSplits, CTA_qHLocal * CTA_qL / NumReductionCTA) + // default layout is CTA_dH contiguous to maximize st.async/ld.shared bw + auto sAcc2Mailbox_layout = make_layout(make_shape(Int{}, Int{}, Int{})); // (CTA_dH, CTA_qHLocal * CTA_qL / NumReductionCTA, MaxSplits) + auto sSinks_layout = make_layout(Int{}); // (CTA_qHLocal * CTA_qL / NumReductionCTA) + + // Print and inspect sK_layout, sQ_layout, sV_layout, and sP_layout for this example. + //print("sK_layout: "); print(sK_layout); print("\n"); + //print("sQ_layout: "); print(sQ_layout); print("\n"); + //print("sV_layout: "); print(sV_layout); print("\n"); + //print("sS_layout: "); print(sS_layout); print("\n"); + //print("sP_layout: "); print(sP_layout); print("\n"); + //print("sAcc1_layout: "); print(sAcc1_layout); print("\n"); + //print("sWarpReduce_layout: "); print(sWarpReduce_layout); print("\n"); + //print("sMSMailbox_Layout: "); print(sMSMailbox_Layout); print("\n"); + //print("sAcc2Mailbox_layout: "); print(sAcc2Mailbox_layout); print("\n"); + + // Now we can find the SMEM allocation size + using SMEMStorage = SharedStorage; + + static_assert(BMM1_DMA_Stage >= BMM2_DMA_Stage, "otherwise you are wasting BMM2 stage because BMM1 TMA issue will block BMM2 TMA due to insufficient BMM1 stages"); + + // create TMA descriptors for K, Q, V, and P matrices + Copy_Atom tma_atom_K = make_tma_atom( + SM90_TMA_LOAD{}, // TMA Load Op, sm100 reuses sm90 tma atom + mK, // Source GMEM tensor + take<0, 3>(sK_layout), // Destination SMEM layout for 1 DMA_Stage, ((Mma_M, Mma_K), NumMma_M, NumMma_K) + make_shape(get<0>(shape_K), get<1>(shape_K)) // TMA box shape, it's cosize must match the cosize of the destination smem layout + ); + // this is an arithmetic tuple, denoting the coordinate of the top-left corner of the TMA box + Tensor mK_tma = tma_atom_K.get_tma_tensor(shape(mK)); // (kvL, dH, kvH, BS) + //print("tma_atom_K:\t"); print(tma_atom_K); print("\n"); + //print("mK_tma:\t"); print(mK_tma); print("\n"); + + Copy_Atom tma_atom_Q = make_tma_atom( + SM90_TMA_LOAD{}, // TMA Load Op, sm100 reuses sm90 tma atom + mQ, // Source GMEM tensor + // sQ_layout(_,_,_,Int<0>{}) doesn't work + // basically under some corner cases, composedlayout indexing is incorrectly implemented, so we use the take method which is also correct + take<0, 3>(sQ_layout), // Destination SMEM layout for 1 DMA_Stage, ((Mma_N, Mma_K), NumMma_N, NumMma_K) + make_shape(get<0>(shape_Q), get<1>(shape_Q)) // TMA box shape, it's cosize must match the cosize of the destination smem layout + ); + // this is an arithmetic tuple, denoting the coordinate of the top-left corner of the TMA box + Tensor mQ_tma = tma_atom_Q.get_tma_tensor(shape(mQ)); // ((qHLocal, qL), dH, kvH, BS) + //print("tma_atom_Q:\t"); print(tma_atom_Q); print("\n"); + //print("mQ_tma:\t"); print(mQ_tma); print("\n"); + + Copy_Atom tma_atom_V = make_tma_atom( + SM90_TMA_LOAD{}, // TMA Load Op, sm100 reuses sm90 tma atom + mV, // Source GMEM tensor + take<0, 3>(sV_layout), // Destination SMEM layout for 1 DMA_Stage, ((Mma_M, Mma_K), NumMma_M, NumMma_K) + make_shape(get<0>(shape_V), get<1>(shape_V)) // TMA box shape, it's cosize must match the cosize of the destination smem layout + ); + // this is an arithmetic tuple, denoting the coordinate of the top-left corner of the TMA box + Tensor mV_tma = tma_atom_V.get_tma_tensor(shape(mV)); // (dH, kvL, kvH, BS) + //print("tma_atom_V:\t"); print(tma_atom_V); print("\n"); + //print("mV_tma:\t"); print(mV_tma); print("\n"); + + int smemBytes = sizeof(SMEMStorage); + + // print smemBytes + //printf("smemBytes: %d\n", smemBytes); + + // invoke the kernel + cudaLaunchConfig_t config; + cudaLaunchAttribute attrs[2]; + // bid.x: kvH * BS, bid.y: qHLocal * qL, bid.z: kvL + uint32_t Cluster_Size = cute::max(MaxSplits, NumReductionCTA); + config.gridDim = dim3{ + (uint32_t)kvH * BS, + (uint32_t)cutlass::ceil_div(qHLocal, CTA_qHLocal) * cutlass::ceil_div(qL, CTA_qL), + Cluster_Size}; + config.blockDim = 256; // 8 warps + config.dynamicSmemBytes = smemBytes; + config.stream = stream; + attrs[0].id = cudaLaunchAttributeClusterDimension; + attrs[0].val.clusterDim = {1, 1, Cluster_Size}; + attrs[1].id = cudaLaunchAttributeProgrammaticStreamSerialization; + attrs[1].val.programmaticStreamSerializationAllowed = 1; + config.attrs = attrs; + config.numAttrs = pdl ? 2 : 1; + + if (device_ptr_sinks != nullptr) { + auto *kernel_instance = + &gqa_device; + gpuErrChk(cudaFuncSetAttribute(*kernel_instance, cudaFuncAttributeMaxDynamicSharedMemorySize, smemBytes)); + // portable max cluster size is 8, but sm100a supports 16, need explicit opt in + gpuErrChk(cudaFuncSetAttribute(*kernel_instance, cudaFuncAttributeNonPortableClusterSizeAllowed, 1)); + gpuErrChk(cudaLaunchKernelEx(&config, kernel_instance, mK_tma, mQ_tma, mV_tma, mO, mSink, + seq_lens, + tma_atom_K, tma_atom_Q, tma_atom_V, + tiled_bmm1, tiled_bmm2, + softmax_scale * Log2_E, sliding_window_size, pdl_count)); + } + else { + auto *kernel_instance = + &gqa_device; + gpuErrChk(cudaFuncSetAttribute(*kernel_instance, cudaFuncAttributeMaxDynamicSharedMemorySize, smemBytes)); + // portable max cluster size is 8, but sm100a supports 16, need explicit opt in + gpuErrChk(cudaFuncSetAttribute(*kernel_instance, cudaFuncAttributeNonPortableClusterSizeAllowed, 1)); + gpuErrChk(cudaLaunchKernelEx(&config, kernel_instance, mK_tma, mQ_tma, mV_tma, mO, mSink, + seq_lens, + tma_atom_K, tma_atom_Q, tma_atom_V, + tiled_bmm1, tiled_bmm2, + softmax_scale * Log2_E, sliding_window_size, pdl_count)); + } +} + +} // namespace gqa +} // namespace TGV diff --git a/examples/94_ada_fp8_blockwise/CMakeLists.txt b/examples/94_ada_fp8_blockwise/CMakeLists.txt new file mode 100644 index 00000000..f5c9d30f --- /dev/null +++ b/examples/94_ada_fp8_blockwise/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +cutlass_example_add_executable( + 94_ada_fp8_blockwise + ada_fp8_blockwise.cu + ) diff --git a/examples/94_ada_fp8_blockwise/ada_fp8_blockwise.cu b/examples/94_ada_fp8_blockwise/ada_fp8_blockwise.cu new file mode 100644 index 00000000..f70cf159 --- /dev/null +++ b/examples/94_ada_fp8_blockwise/ada_fp8_blockwise.cu @@ -0,0 +1,489 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief An FP8 blockwise scaled GEMM example for the NVIDIA Ada SM89 architecture using CUTLASS. +*/ + + +#include "cutlass/arch/arch.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/thread/linear_combination.h" +#include "cutlass/gemm/device/gemm_blockwise.h" +#include "cutlass/gemm/threadblock/mma_multistage_blockwise.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/numeric_types.h" +#include "cutlass/tensor_ref.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/device_memory.h" +#include "cutlass/util/host_tensor.h" +#include "cutlass/util/reference/host/gemm.h" +#include "cutlass/util/reference/host/tensor_compare.h" +#include "cutlass/util/reference/host/tensor_copy.h" +#include "cutlass/util/reference/host/tensor_fill.h" +#include "cutlass/util/reference/host/tensor_norm.h" +#include "helper.h" +#include +#include +#include +#include +#include +#include +#include +#include "cutlass/util/command_line.h" + +using cutlass::ceil_div; + +using ElementA = cutlass::float_e4m3_t; +using ElementB = cutlass::float_e4m3_t; +using ElementOutput = cutlass::bfloat16_t; +using ElementAccumulator = float; +using ElementScale = float; + +using LayoutA = cutlass::layout::RowMajor; +using LayoutB = cutlass::layout::ColumnMajor; +using LayoutC = cutlass::layout::RowMajor; // Currently only RowMajor is supported +using LayoutScale = cutlass::layout::RowMajor; // Currently only RowMajor is supported + +static int const AlignmentA = 16; +static int const AlignmentB = 16; +static int const Stages = 3; +static int const BlockSize = 128; + +constexpr float epsilon = 0.51f; +constexpr float floor_val = 1.0f; + +// ----------------------------------------------------------------------------- +// Command line options structure +// ----------------------------------------------------------------------------- +struct Options { + bool help = false; + int m = 1024; + int n = 1024; + int k = 1024; + float alpha = 1.f; + float beta = 0.f; + bool verify = true; + int iterations = 1000; + int warmup = 1000; + + // Parse command line arguments using CUTLASS helper + void parse(int argc, char const **argv) { + cutlass::CommandLine cmd(argc, argv); + + if (cmd.check_cmd_line_flag("help")) { + help = true; + return; + } + + cmd.get_cmd_line_argument("m", m); + cmd.get_cmd_line_argument("n", n); + cmd.get_cmd_line_argument("k", k); + cmd.get_cmd_line_argument("alpha", alpha, alpha); + cmd.get_cmd_line_argument("beta", beta, beta); + cmd.get_cmd_line_argument("verify", verify); + cmd.get_cmd_line_argument("iterations", iterations); + cmd.get_cmd_line_argument("warmup", warmup); + } + + std::ostream &print_usage(std::ostream &out) const { + out << "94_ada_fp8_blockwise\n\n" + << " FP8 GEMM with blockwise scaling (Ada, Sm89).\n\n" + << "Options:\n\n" + << " --help Display this help string\n" + << " --m= GEMM M dimension (default 1024)\n" + << " --n= GEMM N dimension (default 1024)\n" + << " --k= GEMM K dimension (default 1024)\n" + << " --alpha= Epilogue alpha (default 1.0)\n" + << " --beta= Epilogue beta (default 0.0)\n" + << " --verify= Verify the results (default true)\n" + << " --iterations= Number of timing iterations (default 1000)\n" + << " --warmup= Number of warmup iterations (default 1000)\n"; + return out; + } + + double gflops(double runtime_s) const { + uint64_t flop = uint64_t(2) * m * n * k; + double gflop = double(flop) / double(1.0e9); + return gflop / runtime_s; + } +}; + +using EpilogueOutputOp = cutlass::epilogue::thread::LinearCombination< + ElementOutput, 8, ElementAccumulator, ElementAccumulator>; + +using Gemm = cutlass::gemm::device::GemmBlockwise< + ElementA, LayoutA, ElementB, LayoutB, ElementOutput, LayoutC, + ElementAccumulator, cutlass::arch::OpClassTensorOp, cutlass::arch::Sm89, + cutlass::gemm::GemmShape<64, 128, 128>, + cutlass::gemm::GemmShape<64, 64, 128>, cutlass::gemm::GemmShape<16, 8, 32>, + ElementScale, LayoutScale, BlockSize, EpilogueOutputOp, + cutlass::gemm::threadblock::GemmIdentityThreadblockSwizzle<>, Stages, + AlignmentA, AlignmentB, false, cutlass::arch::OpMultiplyAdd>; + +// Host-side verification +static bool verify_gemm(int M, int N, int K, ElementA const *A, + ElementB const *B, ElementOutput const *C, + ElementOutput const *D, ElementScale const *scale_A, + ElementScale const *scale_B, float alpha, float beta) { + std::vector A_fp8_host(M * K); + std::vector B_fp8_host(K * N); + std::vector C_bf16_host(M * N); + std::vector D_bf16_host(M * N); + + int kBlocks = ceil_div(K, BlockSize); + int mBlocks = ceil_div(M, BlockSize); + int nBlocks = ceil_div(N, BlockSize); + + std::vector ScaleA(mBlocks * kBlocks); + std::vector ScaleB(nBlocks * kBlocks); + + CUDA_CHECK( + cudaMemcpy(A_fp8_host.data(), A, + sizeof(ElementA) * A_fp8_host.size(), + cudaMemcpyDeviceToHost)); + + CUDA_CHECK( + cudaMemcpy(B_fp8_host.data(), B, + sizeof(ElementB) * B_fp8_host.size(), + cudaMemcpyDeviceToHost)); + + CUDA_CHECK( + cudaMemcpy(C_bf16_host.data(), C, + sizeof(ElementOutput) * C_bf16_host.size(), + cudaMemcpyDeviceToHost)); + + CUDA_CHECK( + cudaMemcpy(D_bf16_host.data(), D, + sizeof(ElementOutput) * D_bf16_host.size(), + cudaMemcpyDeviceToHost)); + + CUDA_CHECK( + cudaMemcpy(ScaleA.data(), scale_A, + sizeof(ElementScale) * ScaleA.size(), + cudaMemcpyDeviceToHost)); + + CUDA_CHECK( + cudaMemcpy(ScaleB.data(), scale_B, + sizeof(ElementScale) * ScaleB.size(), + cudaMemcpyDeviceToHost)); + + // -------------------------------------------------------------------- + // De-quantize A and B into FP32 using blockwise scales + // -------------------------------------------------------------------- + std::vector A_f32(M * K); + for (int m = 0; m < M; ++m) { + int blk_m = m / BlockSize; + for (int k = 0; k < K; ++k) { + int blk_k = k / BlockSize; + float sA = ScaleA[blk_m * kBlocks + blk_k]; + A_f32[m * K + k] = static_cast(A_fp8_host[m * K + k]) * sA; + } + } + + std::vector B_f32(K * N); + for (int n = 0; n < N; ++n) { + int blk_n = n / BlockSize; + for (int k = 0; k < K; ++k) { + int blk_k = k / BlockSize; + float sB = ScaleB[blk_n * kBlocks + blk_k]; + B_f32[k + n * K] = static_cast(B_fp8_host[k + n * K]) * sB; + } + } + + // -------------------------------------------------------------------- + // Prepare tensor refs and run reference GEMM + // -------------------------------------------------------------------- + cutlass::TensorRef A_ref(A_f32.data(), K); + cutlass::TensorRef B_ref(B_f32.data(), K); + + // Convert C (BF16) to FP32 once + std::vector C_f32(M * N); + cutlass::NumericConverter bf16_to_f32; + std::transform(C_bf16_host.begin(), C_bf16_host.end(), C_f32.begin(), + [&](ElementOutput x) { return bf16_to_f32(x); }); + cutlass::TensorRef C_ref(C_f32.data(), N); + + // Output buffer in FP32 (will later hold ReLU result) + std::vector D_ref_f32(M * N, 0.0f); + cutlass::TensorRef D_ref_tensor(D_ref_f32.data(), N); + + cutlass::gemm::GemmCoord problem{M, N, K}; + + cutlass::reference::host::Gemm + gemm_ref; + + gemm_ref(problem, alpha, A_ref, B_ref, + beta, C_ref, D_ref_tensor, 0.0f); + + // Build tensor views for relative comparison + cutlass::TensorView ref_view(D_ref_f32.data(), LayoutC(N), {M, N}); + + // Convert device output (BF16) to float for comparison + std::vector kernel_output(M * N); + cutlass::TensorView kernel_output_view(kernel_output.data(), LayoutC(N), {M, N}); + cutlass::TensorView d_bf16_view(D_bf16_host.data(), LayoutC(N), {M, N}); + cutlass::reference::host::TensorCopy(kernel_output_view, d_bf16_view); + + bool result = cutlass::reference::host::TensorRelativelyEquals( + ref_view, kernel_output_view, epsilon, floor_val); + +// std::cout << "ref:\n" << ref_view << "\n\n\n"; +// std::cout << "compute:\n" << kernel_output_view << "\n\n\n"; + + // Compute error metrics + double mse = cutlass::reference::host::TensorMSE(kernel_output_view, ref_view); + double mre = cutlass::reference::host::TensorMRE(kernel_output_view, ref_view); + double max_error = cutlass::reference::host::TensorGreatestError(kernel_output_view, ref_view); + + std::cout << " Result MSE: " << mse << ", MRE: " << mre << ", greatest error: " << max_error << std::endl; + std::cout << "GEMM Verification result is " << (result ? "PASS" : "FAIL") + << std::endl; + + return result; +} + +static void initialize_tensors( + int M, int N, int K, cutlass::HostTensor &tensor_A, + cutlass::HostTensor &tensor_B, + cutlass::HostTensor &tensor_C, + cutlass::HostTensor &tensor_D, + cutlass::HostTensor &tensor_ScaleA, + cutlass::HostTensor &tensor_ScaleB) { + int mBlocks = ceil_div(M, BlockSize); + int nBlocks = ceil_div(N, BlockSize); + int kBlocks = ceil_div(K, BlockSize); + + uint64_t seed = 2024; + + // Resize tensors ------------------------------------------------------ + tensor_A.resize({M, K}); + tensor_B.resize({K, N}); + tensor_C.resize({M, N}); + tensor_D.resize({M, N}); + + tensor_ScaleA.resize({mBlocks, kBlocks}); + tensor_ScaleB.resize({nBlocks, kBlocks}); + + // Fill A and B with random uniform values in [-2, 2] + cutlass::reference::host::TensorFillRandomUniform( + tensor_A.host_view(), seed + 1, 2.0, -2.0); + cutlass::reference::host::TensorFillRandomUniform( + tensor_B.host_view(), seed + 2, 2.0, -2.0); + + // Fill C and D with random uniform values in [-2, 2] + cutlass::reference::host::TensorFillRandomUniform( + tensor_C.host_view(), seed + 3, 2.0, -2.0); + cutlass::reference::host::TensorFillRandomUniform( + tensor_D.host_view(), seed + 4, 2.0, -2.0); + + // Fill scale tensors with random uniform values in [-1, 1] + cutlass::reference::host::TensorFillRandomUniform( + tensor_ScaleA.host_view(), seed + 5, 1.0, -1.0); + cutlass::reference::host::TensorFillRandomUniform( + tensor_ScaleB.host_view(), seed + 6, 1.0, -1.0); + + tensor_A.sync_device(); + tensor_B.sync_device(); + tensor_C.sync_device(); + tensor_D.sync_device(); + tensor_ScaleA.sync_device(); + tensor_ScaleB.sync_device(); +} + +// This example requires CUDA 12.4 or greater and sm89 or higher +bool sufficient() { + + if (__CUDACC_VER_MAJOR__ < 12 || (__CUDACC_VER_MAJOR__ == 12 && __CUDACC_VER_MINOR__ < 4)) { + std::cerr << "This example requires CUDA 12.4 or greater." << std::endl; + return false; + } + + size_t smem_size = sizeof(typename Gemm::GemmKernel::SharedStorage); + + cudaDeviceProp properties; + int device_idx; + cudaError_t result = cudaGetDevice(&device_idx); + + if (result != cudaSuccess) { + std::cerr << "cudaGetDevice() failed with error: " << cudaGetErrorString(result) << std::endl; + return false; + } + + result = cudaGetDeviceProperties(&properties, device_idx); + + if (result != cudaSuccess) { + std::cerr << "cudaGetDeviceProperties() failed with error: " << cudaGetErrorString(result) << std::endl; + return false; + } + + if (properties.major < 8 || (properties.major == 8 && properties.minor < 9)) { + std::cerr << "CUTLASS's Ada FP8 BlockwiseGEMM example requires a device of compute capability 89 or higher.\n" << std::endl; + return false; + } + + if (properties.sharedMemPerBlockOptin < smem_size) { + std::cerr << "Insufficient shared memory. Need " << smem_size + << ", but device only has " << properties.sharedMemPerBlockOptin << std::endl; + return false; + } + + return true; +} + + +int main(int argc, char const **args) { + // --------------------------------------------------------------------------- + // Parse command-line options + // --------------------------------------------------------------------------- + + Options options; + options.parse(argc, args); + + if (options.help) { + options.print_usage(std::cout) << std::endl; + return 0; + } + + // Problem dimensions + const int M = options.m; + const int N = options.n; + const int K = options.k; + + // Waive test if insufficient CUDA device + if (!sufficient()) { + std::cerr << "Insufficient resources to run the kernel." << std::endl; + return 0; + } + + cutlass::HostTensor tensor_A; + cutlass::HostTensor tensor_B; + cutlass::HostTensor tensor_C; + cutlass::HostTensor tensor_D; + cutlass::HostTensor tensor_ScaleA; + cutlass::HostTensor tensor_ScaleB; + + + initialize_tensors(M, N, K, tensor_A, tensor_B, tensor_C, tensor_D, tensor_ScaleA, tensor_ScaleB); + + ElementA const *ptr_A = tensor_A.device_data(); + ElementB const *ptr_B = tensor_B.device_data(); + ElementOutput const *ptr_C = tensor_C.device_data(); + ElementOutput *ptr_D = tensor_D.device_data(); + + float *a_ptr = tensor_ScaleA.device_data(); + float *b_ptr = tensor_ScaleB.device_data(); + + typename Gemm::EpilogueOutputOp::Params epilogue_params(options.alpha, options.beta); + + int kBlocks = ceil_div(K, BlockSize); + int ldA = kBlocks; + int ldB = kBlocks; + + using LayoutScale = Gemm::LayoutScale; + using TensorRefScale = Gemm::TensorRefScale; + + LayoutScale layout_A(ldA); + LayoutScale layout_B(ldB); + TensorRefScale ref_scale_A(a_ptr, layout_A); + TensorRefScale ref_scale_B(b_ptr, layout_B); + + // Construct the argument list ---------------------------------------- + typename Gemm::Arguments arguments( + /* problem_size */ {M, N, K}, + /* A */ {ptr_A, K}, + /* B */ {ptr_B, K}, + /* C */ {ptr_C, N}, + /* D */ {ptr_D, N}, + /* scale_A tensor ref */ ref_scale_A, + /* scale_B tensor ref */ ref_scale_B, + /* epilogue params */ epilogue_params, + /* split-k slices */ 1, + /* gather A indices */ nullptr, + /* gather B indices */ nullptr, + /* scatter D indices */ nullptr); + + Gemm gemm_op; + + cutlass::Status status = gemm_op.can_implement(arguments); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM cannot implement the given problem." << std::endl; + return -1; + } + + size_t workspace_bytes = Gemm::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_bytes); + + status = gemm_op.initialize(arguments, workspace.get()); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM initialization failed." << std::endl; + return -1; + } + + status = gemm_op(); + if (status != cutlass::Status::kSuccess) { + std::cerr << "GEMM execution failed." << std::endl; + return -1; + } + + // Verification + if (options.verify) { + std::cout << "Verifying GEMM" << std::endl; + bool ok = verify_gemm(M, N, K, ptr_A, ptr_B, ptr_C, ptr_D, a_ptr, b_ptr, + options.alpha, options.beta); + if (!ok) { + std::cerr << "Verification failed." << std::endl; + return -1; + } + } + + // Profiling loop + if (options.iterations > 0) { + GpuTimer timer; + for (int iter = 0; iter < options.warmup + options.iterations; ++iter) { + if (iter == options.warmup) + timer.start(); + CUTLASS_CHECK(gemm_op.run()); + } + timer.stop(); + + float elapsed_ms = timer.elapsed_millis(); + double avg_runtime_ms = double(elapsed_ms) / double(options.iterations); + double gflops = options.gflops(avg_runtime_ms / 1000.0); + std::cout << "Avg runtime: " << avg_runtime_ms << " ms" << std::endl; + std::cout << "GFLOPS: " << gflops << std::endl; + fflush(stdout); + } + + return 0; +} diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 60baa3b2..f27834d9 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,3 @@ - # Copyright (c) 2017 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: BSD-3-Clause # @@ -171,6 +170,10 @@ foreach(EXAMPLE 90_sm103_fp4_ultra_grouped_gemm 91_fp4_gemv 92_blackwell_moe_gemm + 93_blackwell_low_latency_gqa + 94_ada_fp8_blockwise + 111_hopper_ssd + 112_blackwell_ssd ) add_subdirectory(${EXAMPLE}) diff --git a/examples/python/CuTeDSL/blackwell/dense_gemm_persistent_dynamic.py b/examples/python/CuTeDSL/blackwell/dense_gemm_persistent_dynamic.py new file mode 100644 index 00000000..d68d9fc9 --- /dev/null +++ b/examples/python/CuTeDSL/blackwell/dense_gemm_persistent_dynamic.py @@ -0,0 +1,1832 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import argparse +from typing import Optional, Tuple, Type, Union +from functools import lru_cache +import cuda.bindings.driver as cuda + +import cutlass +import cutlass.cute as cute +import cutlass.cute.testing as testing +from cutlass.cute.runtime import from_dlpack +import cutlass.utils as utils +import cutlass.pipeline as pipeline +from cutlass.pipeline import pipeline_init_arrive, pipeline_init_wait +from cutlass.cute.nvgpu import cpasync, tcgen05 + +""" +A high-performance cluster launch control(CLC) dynamic persistent batched dense GEMM example +for the NVIDIA Blackwell SM100 architecture using CUTE DSL. + +The CLC dynamic persistent scheduling technique performs dynamic loading balancing. +It has the ability to adapt available SMs rather than a statically selected number. To support this, +a new instruction is introduced to query for a new tile to compute. This new instruction is similar +to programmatic multicast in context of clusters in that the same starting tile ID for a given cluster +is broadcasted to all threadblocks in the cluster. +See `PTX documentation `. + +- Matrix A is MxKxL, L is batch dimension, A can be row-major("K") or column-major("M") +- Matrix B is NxKxL, L is batch dimension, B can be row-major("N") or column-major("K") +- Matrix C is MxNxL, L is batch dimension, C can be row-major("N") or column-major("M") + +This GEMM kernel supports the following features: + - Utilizes Tensor Memory Access (TMA) for efficient memory operations + - Utilizes Blackwell's tcgen05.mma for matrix multiply-accumulate (MMA) operations (including 2cta mma instructions) + - Implements TMA multicast with cluster to reduce L2 memory traffic + - Support CLC dynamic persistent tile scheduling to have near perfect load balancing + - Support warp specialization to avoid explicit pipelining between mainloop load and mma + +This GEMM works as follows: +1. DMA warp: Load A and B matrices from global memory (GMEM) to shared memory (SMEM) using TMA operations. +2. MMA warp: Perform matrix multiply-accumulate (MMA) operations using tcgen05.mma instruction. +3. EPILOGUE warp: + - Load completed accumulator from tensor memory (TMEM) to registers (RMEM) using tcgen05.ld. + - Type convert C matrix to output type. + - Optionally store C matrix from registers (RMEM) to shared memory (SMEM) to global memory (GMEM) with TMA operations, + or directly store C matrix from registers (RMEM) to global memory (GMEM) without TMA operations. + - Optionally accept an elementwise lambda function epilogue_op to apply to the output tensor: + e.g., relu can set epilogue_op = lambda x: cute.where(x > 0, x, cute.full_like(x, 0)) + +SM100 tcgen05.mma instructions operate as follows: +- Read matrix A from SMEM +- Read matrix B from SMEM +- Write accumulator to TMEM +The accumulator in TMEM must then be loaded to registers before writing back to GMEM. + +Input arguments to this example is same as dense_gemm.py. + +.. code-block:: bash + + python examples/blackwell/dense_gemm_persistent_dynamic.py \ + --ab_dtype Float16 --c_dtype Float16 --acc_dtype Float32 \ + --mma_tiler_mn 256,128 --cluster_shape_mn 2,1 \ + --mnkl 8192,8192,8192,1 \ + --use_tma_store --use_2cta_instrs + +To collect performance with NCU profiler: + +.. code-block:: bash + + ncu python examples/blackwell/dense_gemm_persistent_dynamic.py \ + --ab_dtype Float16 --c_dtype Float16 --acc_dtype Float32 \ + --mma_tiler_mn 256,128 --cluster_shape_mn 2,1 \ + --mnkl 8192,8192,8192,1 \ + --use_tma_store --use_2cta_instrs \ + --warmup_iterations 1 --iterations 10 --skip_ref_check + + +Constraints are same as dense_gemm.py: +* Supported input data types: fp16, bf16, tf32, int8, uint8, fp8 (e4m3fn, e5m2), + see detailed valid dtype combinations in below PersistentDenseGemmKernel class documentation +* A/B tensor must have the same data type +* Mma tiler M must be 64/128 (use_2cta_instrs=False) or 128/256 (use_2cta_instrs=True) +* Mma tiler N must be 32-256, step 32 +* Cluster shape M/N must be positive and power of 2, total cluster size <= 16 +* Cluster shape M must be multiple of 2 if use_2cta_instrs=True +* The contiguous dimension of A/B/C tensors must be at least 16 bytes aligned, + i.e, number of elements is a multiple of 4, 8, and 16 for TFloat32, + Float16/BFloat16, and Int8/Uint8/Float8, respectively. +* OOB tiles are not allowed when TMA store is disabled +""" + + +def _compute_stages( + tiled_mma: cute.TiledMma, + mma_tiler_mnk: Tuple[int, int, int], + a_dtype: Type[cutlass.Numeric], + b_dtype: Type[cutlass.Numeric], + c_dtype: Type[cutlass.Numeric], + smem_capacity: int, + occupancy: int, + use_tma_store: bool, + c_smem_layout: Union[cute.Layout, None], +) -> Tuple[int, int, int]: + """Computes the number of stages for A/B/C operands based on heuristics. + + :param tiled_mma: The tiled MMA object defining the core computation. + :type tiled_mma: cute.TiledMma + :param mma_tiler_mnk: The shape (M, N, K) of the MMA tiler. + :type mma_tiler_mnk: tuple[int, int, int] + :param a_dtype: Data type of operand A. + :type a_dtype: type[cutlass.Numeric] + :param b_dtype: Data type of operand B. + :type b_dtype: type[cutlass.Numeric] + :param c_dtype: Data type of operand C (output). + :type c_dtype: type[cutlass.Numeric] + :param smem_capacity: Total available shared memory capacity in bytes. + :type smem_capacity: int + :param occupancy: Target number of CTAs per SM (occupancy). + :type occupancy: int + :param use_tma_store: Whether TMA store is enabled. + :type use_tma_store: bool + :param c_smem_layout: Layout of C operand in shared memory, or None if not using TMA store. + :type c_smem_layout: Union[cute.Layout, None] + + :return: A tuple containing the computed number of stages for: + (ACC stages, A/B operand stages, C stages) + :rtype: tuple[int, int, int] + """ + # Default ACC stages + num_acc_stage = 2 + + # Default C stages + num_c_stage = 2 if use_tma_store else 0 + + # Calculate smem layout and size for one stage of A, B, and C with 1-stage + a_smem_layout_stage_one = utils.sm100.make_smem_layout_a( + tiled_mma, mma_tiler_mnk, a_dtype, 1 + ) + b_smem_layout_staged_one = utils.sm100.make_smem_layout_b( + tiled_mma, mma_tiler_mnk, b_dtype, 1 + ) + + ab_bytes_per_stage = cute.size_in_bytes( + a_dtype, a_smem_layout_stage_one + ) + cute.size_in_bytes(b_dtype, b_smem_layout_staged_one) + mbar_helpers_bytes = 1024 + + c_bytes_per_stage = cute.size_in_bytes(c_dtype, c_smem_layout) + c_bytes = c_bytes_per_stage * num_c_stage + + # Calculate A/B stages: + # Start with total smem per CTA (capacity / occupancy) + # Subtract reserved bytes and initial C stages bytes + # Divide remaining by bytes needed per A/B stage + num_ab_stage = ( + smem_capacity // occupancy - (mbar_helpers_bytes + c_bytes) + ) // ab_bytes_per_stage + + # Refine epilogue stages: + # Calculate remaining smem after allocating for A/B stages and reserved bytes + # Add remaining unused smem to epilogue + if use_tma_store: + num_c_stage += ( + smem_capacity + - occupancy * ab_bytes_per_stage * num_ab_stage + - occupancy * (mbar_helpers_bytes + c_bytes) + ) // (occupancy * c_bytes_per_stage) + return num_acc_stage, num_ab_stage, num_c_stage + + +class PersistentDenseGemmKernel: + """This class implements batched matrix multiplication (C = A x B) with support for various data types + and architectural features specific to Blackwell GPUs with persistent tile scheduling and warp specialization. + + :param acc_dtype: Data type for accumulation during computation + :type acc_dtype: type[cutlass.Numeric] + :param use_2cta_instrs: Whether to use CTA group 2 for advanced thread cooperation + :type use_2cta_instrs: bool + :param mma_tiler_mn: Shape of the Matrix Multiply-Accumulate (MMA) tile (M,N) + :type mma_tiler_mn: Tuple[int, int] + :param cluster_shape_mn: Cluster dimensions (M,N) for parallel processing + :type cluster_shape_mn: Tuple[int, int] + :param use_tma_store: Whether to use Tensor Memory Access (TMA) for storing results + :type use_tma_store: bool + + :note: In current version, A and B tensor must have the same data type + - i.e., Float8E4M3FN for A and Float8E5M2 for B is not supported + + :note: Supported A/B data types: + - TFloat32 + - Float16/BFloat16 + - Int8/Uint8 + - Float8E4M3FN/Float8E5M2 + + :note: Supported accumulator data types: + - Float32 (for all floating point A/B data types) + - Float16 (only for fp16 and fp8 A/B data types) + - Int32 (only for uint8/int8 A/B data types) + + :note: Supported C data types: + - Float32 (for float32 and int32 accumulator data types) + - Int32 (for float32 and int32 accumulator data types) + - Float16/BFloat16 (for fp16 and fp8 accumulator data types) + - Int8/Uint8 (for uint8/int8 accumulator data types) + - Float8E4M3FN/Float8E5M2 (for float32 accumulator data types) + + :note: Constraints: + - MMA tiler M must be 64/128 (use_2cta_instrs=False) or 128/256 (use_2cta_instrs=True) + - MMA tiler N must be 32-256, step 32 + - Cluster shape M must be multiple of 2 if use_2cta_instrs=True + - Cluster shape M/N must be positive and power of 2, total cluster size <= 16 + + **Example:** + gemm = PersistentDenseGemmKernel( + acc_dtype=cutlass.Float32, + use_2cta_instrs=True, + mma_tiler_mn=(128, 128), + cluster_shape_mn=(2, 2) + ) + gemm(a, b, c, max_active_clusters, stream) + """ + + def __init__( + self, + acc_dtype: Type[cutlass.Numeric], + use_2cta_instrs: bool, + mma_tiler_mn: Tuple[int, int], + cluster_shape_mn: Tuple[int, int], + use_tma_store: bool, + ): + """Initializes the configuration for a Blackwell dense GEMM kernel. + + This configuration includes several key aspects: + + 1. MMA Instruction Settings (tcgen05): + - acc_dtype: Data types for MMA accumulator. + - mma_tiler_mn: The (M, N) shape of the MMA instruction tiler. + - use_2cta_instrs: Boolean indicating if the tcgen05 MMA variant + with cta_group=2 should be used. + + 2. Cluster Shape: + - cluster_shape_mn: The (ClusterM, ClusterN) shape of the CTA cluster. + + 3. Output C tensor store mode: + - use_tma_store: Boolean indicating whether to use Tensor Memory Access (TMA) for storing results. + + :param acc_dtype: Data type of the accumulator. + :type acc_dtype: type[cutlass.Numeric] + :param mma_tiler_mn: Tuple (M, N) shape of the MMA instruction. + :type mma_tiler_mn: Tuple[int, int] + :param use_2cta_instrs: Boolean, True to use cta_group=2 MMA variant. + :type use_2cta_instrs: bool + :param cluster_shape_mn: Tuple (ClusterM, ClusterN) shape of the cluster. + :type cluster_shape_mn: Tuple[int, int] + :param use_tma_store: Use Tensor Memory Access (TMA) or normal store for output C tensor. + :type use_tma_store: bool + """ + + self.acc_dtype: Type[cutlass.Numeric] = acc_dtype + self.use_2cta_instrs = use_2cta_instrs + self.cluster_shape_mn = cluster_shape_mn + # K dimension is deferred in _setup_attributes + self.mma_tiler_mn = mma_tiler_mn + self.mma_tiler = (*mma_tiler_mn, 1) + self.use_tma_store = use_tma_store + self.arch = "sm_100" + + self.cta_group = ( + tcgen05.CtaGroup.TWO if use_2cta_instrs else tcgen05.CtaGroup.ONE + ) + + self.occupancy = 1 + # Set specialized warp ids + self.epilogue_warp_id = (0, 1, 2, 3) + self.mma_warp_id = 4 + self.tma_warp_id = 5 + self.sched_warp_id = 6 + self.threads_per_cta = 32 * len( + ( + self.mma_warp_id, + self.tma_warp_id, + self.sched_warp_id, + *self.epilogue_warp_id, + ) + ) + # Set barrier id for cta sync, epilogue sync and tmem ptr sync + self.epilog_sync_bar_id = 1 + self.tmem_alloc_sync_bar_id = 2 + self.tmem_dealloc_sync_bar_id = 3 + + def _create_tiled_mma(self): + return utils.sm100.make_trivial_tiled_mma( + self.a_dtype, + self.a_major_mode, + self.b_major_mode, + self.acc_dtype, + self.cta_group, + self.mma_tiler[:2], + ) + + def _setup_attributes(self): + """Set up configurations that are dependent on GEMM inputs + + This method configures various attributes based on the input tensor properties + (data types, leading dimensions) and kernel settings: + - Configuring tiled MMA + - Computing MMA/cluster/tile shapes + - Computing cluster layout + - Computing multicast CTAs for A/B + - Computing epilogue subtile + - Setting up A/B/C stage counts in shared memory + - Computing A/B/C shared memory layout + - Computing tensor memory allocation columns + """ + # Configure tiled mma + tiled_mma = self._create_tiled_mma() + + # Compute mma/cluster/tile shapes + mma_inst_shape_k = cute.size(tiled_mma.shape_mnk, mode=[2]) + mma_inst_tile_k = 4 + self.mma_tiler = ( + self.mma_tiler[0], + self.mma_tiler[1], + mma_inst_shape_k * mma_inst_tile_k, + ) + self.cta_tile_shape_mnk = ( + self.mma_tiler[0] // cute.size(tiled_mma.thr_id.shape), + self.mma_tiler[1], + self.mma_tiler[2], + ) + + # Compute cluster layout + self.cluster_layout_vmnk = cute.tiled_divide( + cute.make_layout((*self.cluster_shape_mn, 1)), + (tiled_mma.thr_id.shape,), + ) + + # Compute number of multicast CTAs for A/B + self.num_mcast_ctas_a = cute.size(self.cluster_layout_vmnk.shape[2]) + self.num_mcast_ctas_b = cute.size(self.cluster_layout_vmnk.shape[1]) + self.is_a_mcast = self.num_mcast_ctas_a > 1 + self.is_b_mcast = self.num_mcast_ctas_b > 1 + + # Compute epilogue subtile + if cutlass.const_expr(self.use_tma_store): + self.epi_tile = utils.sm100.compute_epilogue_tile_shape( + self.cta_tile_shape_mnk, + self.use_2cta_instrs, + self.c_layout, + self.c_dtype, + ) + else: + self.epi_tile = self.cta_tile_shape_mnk[:2] + + c_smem_layout = None + if cutlass.const_expr(self.use_tma_store): + c_smem_layout = utils.sm100.make_smem_layout_epi( + self.c_dtype, self.c_layout, self.epi_tile, 1 + ) + + self.smem_capacity = utils.get_smem_capacity_in_bytes() + + # Setup A/B/C stage count in shared memory and ACC stage count in tensor memory + self.num_acc_stage, self.num_ab_stage, self.num_c_stage = _compute_stages( + tiled_mma, + self.mma_tiler, + self.a_dtype, + self.b_dtype, + self.c_dtype, + self.smem_capacity, + self.occupancy, + self.use_tma_store, + c_smem_layout, + ) + + # Setup clc stage by default + self.num_clc_stage = 1 + + # Compute A/B/C shared memory layout + self.a_smem_layout_staged = utils.sm100.make_smem_layout_a( + tiled_mma, self.mma_tiler, self.a_dtype, self.num_ab_stage + ) + self.b_smem_layout_staged = utils.sm100.make_smem_layout_b( + tiled_mma, self.mma_tiler, self.b_dtype, self.num_ab_stage + ) + + self.c_smem_layout_staged = None + if self.use_tma_store: + self.c_smem_layout_staged = utils.sm100.make_smem_layout_epi( + self.c_dtype, self.c_layout, self.epi_tile, self.num_c_stage + ) + + # Compute the number of tensor memory allocation columns + self.num_tmem_alloc_cols = self._compute_num_tmem_alloc_cols( + tiled_mma, self.mma_tiler, self.num_acc_stage, self.arch + ) + + @cute.jit + def __call__( + self, + a: cute.Tensor, + b: cute.Tensor, + c: cute.Tensor, + max_active_clusters: cutlass.Constexpr, + stream: cuda.CUstream, + epilogue_op: cutlass.Constexpr = lambda x: x, + ): + """Execute the GEMM operation in steps: + - Setup static attributes before smem/grid/tma computation + - Setup TMA load/store atoms and tensors + - Compute grid size with regard to hardware constraints + - Define shared storage for kernel + - Launch the kernel synchronously + + :param a: Input tensor A + :type a: cute.Tensor + :param b: Input tensor B + :type b: cute.Tensor + :param c: Output tensor C + :type c: cute.Tensor + :param max_active_clusters: Maximum number of active clusters + :type max_active_clusters: cutlass.Constexpr + :param stream: CUDA stream for asynchronous execution + :type stream: cuda.CUstream + :param epilogue_op: Optional elementwise lambda function to apply to the output tensor + :type epilogue_op: cutlass.Constexpr + :raises TypeError: If input data types are incompatible with the MMA instruction. + :raises AssertionError: If OOB (Out-Of-Bounds) tiles are present when TMA store is disabled. + """ + # Setup static attributes before smem/grid/tma computation + self.a_dtype: Type[cutlass.Numeric] = a.element_type + self.b_dtype: Type[cutlass.Numeric] = b.element_type + self.c_dtype: Type[cutlass.Numeric] = c.element_type + self.a_major_mode = utils.LayoutEnum.from_tensor(a).mma_major_mode() + self.b_major_mode = utils.LayoutEnum.from_tensor(b).mma_major_mode() + self.c_layout = utils.LayoutEnum.from_tensor(c) + + # Check if input data types are compatible with MMA instruction + if cutlass.const_expr(self.a_dtype != self.b_dtype): + raise TypeError(f"Type must match: {self.a_dtype} != {self.b_dtype}") + + tiled_mma = self._create_tiled_mma() + + # Setup attributes that dependent on gemm inputs + self._setup_attributes() + + atom_thr_size = cute.size(tiled_mma.thr_id.shape) + + # Setup TMA load for A + a_op = utils.sm100.cluster_shape_to_tma_atom_A( + self.cluster_shape_mn, tiled_mma.thr_id + ) + a_smem_layout = cute.slice_(self.a_smem_layout_staged, (None, None, None, 0)) + tma_atom_a, tma_tensor_a = cute.nvgpu.make_tiled_tma_atom_A( + a_op, + a, + a_smem_layout, + self.mma_tiler, + tiled_mma, + self.cluster_layout_vmnk.shape, + internal_type=( + cutlass.TFloat32 if a.element_type is cutlass.Float32 else None + ), + ) + + # Setup TMA load for B + b_op = utils.sm100.cluster_shape_to_tma_atom_B( + self.cluster_shape_mn, tiled_mma.thr_id + ) + b_smem_layout = cute.slice_(self.b_smem_layout_staged, (None, None, None, 0)) + tma_atom_b, tma_tensor_b = cute.nvgpu.make_tiled_tma_atom_B( + b_op, + b, + b_smem_layout, + self.mma_tiler, + tiled_mma, + self.cluster_layout_vmnk.shape, + internal_type=( + cutlass.TFloat32 if b.element_type is cutlass.Float32 else None + ), + ) + + a_copy_size = cute.size_in_bytes(self.a_dtype, a_smem_layout) + b_copy_size = cute.size_in_bytes(self.b_dtype, b_smem_layout) + self.num_tma_load_bytes = (a_copy_size + b_copy_size) * atom_thr_size + # Response size is 4B * 4 elements + self.num_clc_response_bytes = 16 + + # Setup TMA store for C + tma_atom_c = None + tma_tensor_c = None + if cutlass.const_expr(self.use_tma_store): + epi_smem_layout = cute.select(self.c_smem_layout_staged, mode=[0, 1]) + tma_atom_c, tma_tensor_c = cpasync.make_tiled_tma_atom( + cpasync.CopyBulkTensorTileS2GOp(), c, epi_smem_layout, self.epi_tile + ) + + # Compute grid size + self.tile_sched_params, grid = self._compute_grid( + c, self.cta_tile_shape_mnk, self.cluster_shape_mn + ) + + # Launch the kernel synchronously + self.kernel( + tiled_mma, + tma_atom_a, + tma_tensor_a, + tma_atom_b, + tma_tensor_b, + tma_atom_c, + tma_tensor_c if self.use_tma_store else c, + self.cluster_layout_vmnk, + self.a_smem_layout_staged, + self.b_smem_layout_staged, + self.c_smem_layout_staged, + self.epi_tile, + self.tile_sched_params, + epilogue_op, + ).launch( + grid=grid, + block=[self.threads_per_cta, 1, 1], + cluster=(*self.cluster_shape_mn, 1), + stream=stream, + ) + return + + # GPU device kernel + @cute.kernel + def kernel( + self, + tiled_mma: cute.TiledMma, + tma_atom_a: cute.CopyAtom, + mA_mkl: cute.Tensor, + tma_atom_b: cute.CopyAtom, + mB_nkl: cute.Tensor, + tma_atom_c: Optional[cute.CopyAtom], + mC_mnl: cute.Tensor, + cluster_layout_vmnk: cute.Layout, + a_smem_layout_staged: cute.ComposedLayout, + b_smem_layout_staged: cute.ComposedLayout, + c_smem_layout_staged: Union[cute.Layout, cute.ComposedLayout, None], + epi_tile: cute.Tile, + tile_sched_params: utils.ClcDynamicPersistentTileSchedulerParams, + epilogue_op: cutlass.Constexpr, + ): + """ + GPU device kernel performing the Persistent batched GEMM computation. + """ + warp_idx = cute.arch.warp_idx() + warp_idx = cute.arch.make_warp_uniform(warp_idx) + + # + # Prefetch tma desc + # + if warp_idx == self.tma_warp_id: + cpasync.prefetch_descriptor(tma_atom_a) + cpasync.prefetch_descriptor(tma_atom_b) + if cutlass.const_expr(self.use_tma_store): + cpasync.prefetch_descriptor(tma_atom_c) + + use_2cta_instrs = cute.size(tiled_mma.thr_id.shape) == 2 + + # + # Setup cta/thread coordinates + # + # Coords inside cluster + bidx, bidy, bidz = cute.arch.block_idx() + mma_tile_coord_v = bidx % cute.size(tiled_mma.thr_id.shape) + is_leader_cta = mma_tile_coord_v == 0 + cta_rank_in_cluster = cute.arch.make_warp_uniform( + cute.arch.block_idx_in_cluster() + ) + is_first_cta_in_cluster = cta_rank_in_cluster == 0 + block_in_cluster_coord_vmnk = cluster_layout_vmnk.get_flat_coord( + cta_rank_in_cluster + ) + # Coord inside cta + tidx, _, _ = cute.arch.thread_idx() + + # + # Alloc and init: a+b full/empty, accumulator full/empty, tensor memory dealloc barrier + # + # Define shared storage for kernel + @cute.struct + class SharedStorage: + ab_full_mbar_ptr: cute.struct.MemRange[cutlass.Int64, self.num_ab_stage * 2] + acc_full_mbar_ptr: cute.struct.MemRange[ + cutlass.Int64, self.num_acc_stage * 2 + ] + tmem_dealloc_mbar_ptr: cutlass.Int64 + tmem_holding_buf: cutlass.Int32 + clc_ptr: cute.struct.MemRange[cutlass.Int64, self.num_clc_stage * 2] + clc_response_ptr: cute.struct.MemRange[cutlass.Int32, 1] + + smem = utils.SmemAllocator() + storage = smem.allocate(SharedStorage) + + # Initialize mainloop ab_pipeline (barrier) and states + ab_pipeline_producer_group = pipeline.CooperativeGroup(pipeline.Agent.Thread) + num_tma_producer = self.num_mcast_ctas_a + self.num_mcast_ctas_b - 1 + ab_pipeline_consumer_group = pipeline.CooperativeGroup( + pipeline.Agent.Thread, num_tma_producer + ) + ab_producer, ab_consumer = pipeline.PipelineTmaUmma.create( + barrier_storage=storage.ab_full_mbar_ptr.data_ptr(), + num_stages=self.num_ab_stage, + producer_group=ab_pipeline_producer_group, + consumer_group=ab_pipeline_consumer_group, + tx_count=self.num_tma_load_bytes, + cta_layout_vmnk=cluster_layout_vmnk, + defer_sync=True, + ).make_participants() + + # Initialize acc_pipeline (barrier) and states + acc_pipeline_producer_group = pipeline.CooperativeGroup(pipeline.Agent.Thread) + num_acc_consumer_threads = len(self.epilogue_warp_id) * ( + 2 if use_2cta_instrs else 1 + ) + acc_pipeline_consumer_group = pipeline.CooperativeGroup( + pipeline.Agent.Thread, num_acc_consumer_threads + ) + acc_pipeline = pipeline.PipelineUmmaAsync.create( + barrier_storage=storage.acc_full_mbar_ptr.data_ptr(), + num_stages=self.num_acc_stage, + producer_group=acc_pipeline_producer_group, + consumer_group=acc_pipeline_consumer_group, + cta_layout_vmnk=cluster_layout_vmnk, + defer_sync=True, + ) + + # Initialize clc_pipeline (barrier) and states + clc_pipeline_producer_group = pipeline.CooperativeGroup(pipeline.Agent.Thread) + cluster_size = cute.size(self.cluster_shape_mn) + num_clc_consumer_threads = 32 * ( + 1 + cluster_size * (1 + len(self.epilogue_warp_id) + 1) + ) + clc_pipeline_consumer_group = pipeline.CooperativeGroup( + pipeline.Agent.Thread, num_clc_consumer_threads + ) + clc_pipeline = pipeline.PipelineClcFetchAsync.create( + barrier_storage=storage.clc_ptr.data_ptr(), + num_stages=self.num_clc_stage, + producer_group=clc_pipeline_producer_group, + consumer_group=clc_pipeline_consumer_group, + tx_count=self.num_clc_response_bytes, + cta_layout_vmnk=cluster_layout_vmnk, + defer_sync=True, + ) + + tmem_alloc_barrier = pipeline.NamedBarrier( + barrier_id=self.tmem_alloc_sync_bar_id, + num_threads=32 * len((self.mma_warp_id, *self.epilogue_warp_id)), + ) + tmem_dealloc_barrier = None + if cutlass.const_expr(not self.use_tma_store): + tmem_dealloc_barrier = pipeline.NamedBarrier( + barrier_id=self.tmem_dealloc_sync_bar_id, + num_threads=32 * len(self.epilogue_warp_id), + ) + # Tensor memory dealloc barrier init + tmem = utils.TmemAllocator( + storage.tmem_holding_buf, + barrier_for_retrieve=tmem_alloc_barrier, + allocator_warp_id=self.epilogue_warp_id[0], + is_two_cta=use_2cta_instrs, + two_cta_tmem_dealloc_mbar_ptr=storage.tmem_dealloc_mbar_ptr, + ) + + # Cluster arrive after barrier init + pipeline_init_arrive(cluster_shape_mn=cluster_layout_vmnk, is_relaxed=True) + + # Initial clc response pointer + clc_response_ptr = storage.clc_response_ptr.data_ptr() + + clc_consumer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Consumer, self.num_clc_stage + ) + + # + # Setup smem tensor A/B/C + # + # (MMA, MMA_M, MMA_K, STAGE) + sA = smem.allocate_tensor( + element_type=self.a_dtype, + layout=a_smem_layout_staged.outer, + byte_alignment=128, + swizzle=a_smem_layout_staged.inner, + ) + # (MMA, MMA_N, MMA_K, STAGE) + sB = smem.allocate_tensor( + element_type=self.b_dtype, + layout=b_smem_layout_staged.outer, + byte_alignment=128, + swizzle=b_smem_layout_staged.inner, + ) + + # + # Compute multicast mask for A/B buffer full + # + a_full_mcast_mask = None + b_full_mcast_mask = None + if cutlass.const_expr(self.is_a_mcast or self.is_b_mcast or use_2cta_instrs): + a_full_mcast_mask = cpasync.create_tma_multicast_mask( + cluster_layout_vmnk, block_in_cluster_coord_vmnk, mcast_mode=2 + ) + b_full_mcast_mask = cpasync.create_tma_multicast_mask( + cluster_layout_vmnk, block_in_cluster_coord_vmnk, mcast_mode=1 + ) + + # + # Local_tile partition global tensors + # + # (bM, bK, RestM, RestK, RestL) + gA_mkl = cute.local_tile( + mA_mkl, cute.slice_(self.mma_tiler, (None, 0, None)), (None, None, None) + ) + # (bN, bK, RestN, RestK, RestL) + gB_nkl = cute.local_tile( + mB_nkl, cute.slice_(self.mma_tiler, (0, None, None)), (None, None, None) + ) + # (bM, bN, RestM, RestN, RestL) + gC_mnl = cute.local_tile( + mC_mnl, cute.slice_(self.mma_tiler, (None, None, 0)), (None, None, None) + ) + k_tile_cnt = cute.size(gA_mkl, mode=[3]) + + # + # Partition global tensor for TiledMMA_A/B/C + # + thr_mma = tiled_mma.get_slice(mma_tile_coord_v) + # (MMA, MMA_M, MMA_K, RestM, RestK, RestL) + tCgA = thr_mma.partition_A(gA_mkl) + # (MMA, MMA_N, MMA_K, RestN, RestK, RestL) + tCgB = thr_mma.partition_B(gB_nkl) + # (MMA, MMA_M, MMA_N, RestM, RestN, RestL) + tCgC = thr_mma.partition_C(gC_mnl) + + # + # Partition global/shared tensor for TMA load A/B + # + # TMA load A partition_S/D + a_cta_layout = cute.make_layout( + cute.slice_(cluster_layout_vmnk, (0, 0, None, 0)).shape + ) + # ((atom_v, rest_v), STAGE) + # ((atom_v, rest_v), RestM, RestK, RestL) + tAsA, tAgA = cpasync.tma_partition( + tma_atom_a, + block_in_cluster_coord_vmnk[2], + a_cta_layout, + cute.group_modes(sA, 0, 3), + cute.group_modes(tCgA, 0, 3), + ) + # TMA load B partition_S/D + b_cta_layout = cute.make_layout( + cute.slice_(cluster_layout_vmnk, (0, None, 0, 0)).shape + ) + # ((atom_v, rest_v), STAGE) + # ((atom_v, rest_v), RestM, RestK, RestL) + tBsB, tBgB = cpasync.tma_partition( + tma_atom_b, + block_in_cluster_coord_vmnk[1], + b_cta_layout, + cute.group_modes(sB, 0, 3), + cute.group_modes(tCgB, 0, 3), + ) + + # + # Partition shared/tensor memory tensor for TiledMMA_A/B/C + # + # (MMA, MMA_M, MMA_K, STAGE) + tCrA = tiled_mma.make_fragment_A(sA) + # (MMA, MMA_N, MMA_K, STAGE) + tCrB = tiled_mma.make_fragment_B(sB) + # (MMA, MMA_M, MMA_N) + acc_shape = tiled_mma.partition_shape_C(self.mma_tiler[:2]) + # (MMA, MMA_M, MMA_N, STAGE) + tCtAcc_fake = tiled_mma.make_fragment_C( + cute.append(acc_shape, self.num_acc_stage) + ) + + # + # Cluster wait before tensor memory alloc + # + pipeline_init_wait(cluster_shape_mn=cluster_layout_vmnk) + + # + # Construct the scheduler + # + tile_sched = utils.ClcDynamicPersistentTileScheduler.create( + tile_sched_params, + cute.arch.block_idx(), + cute.arch.grid_dim(), + clc_response_ptr, + ) + work_tile = tile_sched.initial_work_tile_info() + + # + # Specialized TMA load warp + # + + if warp_idx == self.tma_warp_id: + # + # Persistent tile scheduling loop + # + while work_tile.is_valid_tile: + # Get tile coord from tile scheduler + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # + # Slice to per mma tile index + # + # ((atom_v, rest_v), RestK) + tAgA_slice = tAgA[ + (None, mma_tile_coord_mnl[0], None, mma_tile_coord_mnl[2]) + ] + # ((atom_v, rest_v), RestK) + tBgB_slice = tBgB[ + (None, mma_tile_coord_mnl[1], None, mma_tile_coord_mnl[2]) + ] + + # Peek (try_wait) AB buffer empty for k_tile = prefetch_k_tile_cnt + ab_producer.reset() + peek_ab_empty_status = ab_producer.try_acquire() + + # + # Tma load loop + # + for k_tile in cutlass.range(0, k_tile_cnt, 1, unroll=1): + # Conditionally wait for AB buffer empty + handle = ab_producer.acquire_and_advance(peek_ab_empty_status) + + # TMA load A/B + cute.copy( + tma_atom_a, + tAgA_slice[(None, handle.count)], + tAsA[(None, handle.index)], + tma_bar_ptr=handle.barrier, + mcast_mask=a_full_mcast_mask, + ) + cute.copy( + tma_atom_b, + tBgB_slice[(None, handle.count)], + tBsB[(None, handle.index)], + tma_bar_ptr=handle.barrier, + mcast_mask=b_full_mcast_mask, + ) + + # Peek (try_wait) AB buffer empty for k_tile = prefetch_k_tile_cnt + k_tile + 1 + peek_ab_empty_status = cutlass.Boolean(1) + if handle.count + 1 < k_tile_cnt: + peek_ab_empty_status = ab_producer.try_acquire() + + # + # Advance to next tile + # + clc_pipeline.consumer_wait(clc_consumer_state) + work_tile = tile_sched.get_current_work() + clc_pipeline.consumer_release(clc_consumer_state) + clc_consumer_state.advance() + # + # Wait A/B buffer empty + # + ab_producer.tail() + + # + # Sched warp + # + if warp_idx == self.sched_warp_id and is_first_cta_in_cluster: + # + # Persistent tile scheduling loop + # + clc_producer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.ProducerConsumer, self.num_clc_stage + ) + + while work_tile.is_valid_tile: + # + # Advance to next tile + # + clc_pipeline.producer_acquire(clc_producer_state) + mbarrier_addr = clc_pipeline.producer_get_barrier(clc_producer_state) + tile_sched.advance_to_next_work(mbarrier_addr) + clc_producer_state.advance() + + clc_pipeline.consumer_wait(clc_consumer_state) + work_tile = tile_sched.get_current_work() + clc_pipeline.consumer_release(clc_consumer_state) + clc_consumer_state.advance() + clc_pipeline.producer_tail(clc_producer_state) + + # + # Specialized MMA warp + # + if warp_idx == self.mma_warp_id: + # + # Retrieving tensor memory ptr and make accumulator tensor + # + tmem.wait_for_alloc() + tmem_ptr = tmem.retrieve_ptr(self.acc_dtype) + # (MMA, MMA_M, MMA_N, STAGE) + tCtAcc_base = cute.make_tensor(tmem_ptr, tCtAcc_fake.layout) + + # + # Persistent tile scheduling loop + # + acc_producer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Producer, self.num_acc_stage + ) + + while work_tile.is_valid_tile: + # Get tile coord from tile scheduler + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # Set tensor memory buffer for current tile + # (MMA, MMA_M, MMA_N) + tCtAcc = tCtAcc_base[(None, None, None, acc_producer_state.index)] + + # Peek (try_wait) AB buffer full for k_tile = 0 + ab_consumer.reset() + peek_ab_full_status = cutlass.Boolean(1) + if is_leader_cta: + peek_ab_full_status = ab_consumer.try_wait() + + # + # Wait for accumulator buffer empty + # + if is_leader_cta: + acc_pipeline.producer_acquire(acc_producer_state) + + # + # Reset the ACCUMULATE field for each tile + # + tiled_mma.set(tcgen05.Field.ACCUMULATE, False) + + # + # Mma mainloop + # + for k_tile in range(k_tile_cnt): + if is_leader_cta: + # Conditionally wait for AB buffer full + handle = ab_consumer.wait_and_advance(peek_ab_full_status) + + # tCtAcc += tCrA * tCrB + num_kblocks = cute.size(tCrA, mode=[2]) + for kblk_idx in cutlass.range(num_kblocks, unroll_full=True): + kblk_crd = (None, None, kblk_idx, handle.index) + + cute.gemm( + tiled_mma, + tCtAcc, + tCrA[kblk_crd], + tCrB[kblk_crd], + tCtAcc, + ) + # Enable accumulate on tCtAcc after first kblock + tiled_mma.set(tcgen05.Field.ACCUMULATE, True) + + # Async arrive AB buffer empty + handle.release() + + # Peek (try_wait) AB buffer full for k_tile = k_tile + 1 + peek_ab_full_status = cutlass.Boolean(1) + if handle.count + 1 < k_tile_cnt: + peek_ab_full_status = ab_consumer.try_wait() + + # + # Async arrive accumulator buffer full + # + if is_leader_cta: + acc_pipeline.producer_commit(acc_producer_state) + acc_producer_state.advance() + + # + # Advance to next tile + # + clc_pipeline.consumer_wait(clc_consumer_state) + work_tile = tile_sched.get_current_work() + clc_pipeline.consumer_release(clc_consumer_state) + clc_consumer_state.advance() + # + # Wait for accumulator buffer empty + # + acc_pipeline.producer_tail(acc_producer_state) + + sC = None + if cutlass.const_expr(self.use_tma_store): + # (EPI_TILE_M, EPI_TILE_N, STAGE) + sC = smem.allocate_tensor( + element_type=self.c_dtype, + layout=c_smem_layout_staged.outer, + byte_alignment=128, + swizzle=c_smem_layout_staged.inner, + ) + + # + # Specialized epilogue warps + # + if warp_idx < self.mma_warp_id: + # + # Alloc tensor memory buffer + # + tmem.allocate(self.num_tmem_alloc_cols) + + # + # Retrieving tensor memory ptr and make accumulator tensor + # + tmem.wait_for_alloc() + tmem_ptr = tmem.retrieve_ptr(self.acc_dtype) + # (MMA, MMA_M, MMA_N, STAGE) + tCtAcc_base = cute.make_tensor(tmem_ptr, tCtAcc_fake.layout) + + # + # Persistent tile scheduling loop for epilogue + # + if cutlass.const_expr(self.use_tma_store): + assert tma_atom_c is not None and sC is not None + utils.gemm.sm100.epilogue_tma_store( + self, + tidx, + warp_idx, + acc_pipeline, + tiled_mma, + tma_atom_c, + tCtAcc_base, + sC, + tCgC, + epi_tile, + tile_sched, + epilogue_op, + clc_pipeline, + clc_consumer_state, + ) + else: + utils.gemm.sm100.epilogue( + self, + tidx, + acc_pipeline, + tiled_mma, + tCtAcc_base, + tCgC, + epi_tile, + tile_sched, + epilogue_op, + tmem_dealloc_barrier, + None, + None, + clc_pipeline, + clc_consumer_state, + ) + + # + # Dealloc the tensor memory buffer + # + tmem.relinquish_alloc_permit() + tmem.free(tmem_ptr) + + @staticmethod + def _compute_grid( + c: cute.Tensor, + cta_tile_shape_mnk: Tuple[int, int, int], + cluster_shape_mn: Tuple[int, int], + ) -> Tuple[utils.ClcDynamicPersistentTileSchedulerParams, Tuple[int, int, int]]: + """Use persistent tile scheduler to compute the grid size for the output tensor C. + + :param c: The output tensor C + :type c: cute.Tensor + :param cta_tile_shape_mnk: The shape (M, N, K) of the CTA tile. + :type cta_tile_shape_mnk: tuple[int, int, int] + :param cluster_shape_mn: Shape of each cluster in M, N dimensions. + :type cluster_shape_mn: tuple[int, int] + + :return: A tuple containing: + - tile_sched_params: Parameters for the persistent tile scheduler. + - grid: Grid shape for kernel launch. + :rtype: Tuple[utils.ClcDynamicPersistentTileSchedulerParams, tuple[int, int, int]] + """ + c_shape = cute.slice_(cta_tile_shape_mnk, (None, None, 0)) + gc = cute.zipped_divide(c, tiler=c_shape) + num_ctas_mnl = gc[(0, (None, None, None))].shape + cluster_shape_mnl = (*cluster_shape_mn, 1) + + tile_sched_params = utils.ClcDynamicPersistentTileSchedulerParams( + num_ctas_mnl, cluster_shape_mnl + ) + grid = utils.ClcDynamicPersistentTileScheduler.get_grid_shape(tile_sched_params) + + return tile_sched_params, grid + + @staticmethod + def _compute_num_tmem_alloc_cols( + tiled_mma: cute.TiledMma, + mma_tiler: Tuple[int, int, int], + num_acc_stage: int, + arch: str, + ) -> int: + """ + Compute the number of tensor memory allocation columns. + + :param tiled_mma: The tiled MMA object defining the core computation. + :type tiled_mma: cute.TiledMma + :param mma_tiler: The shape (M, N, K) of the MMA tile. + :type mma_tiler: tuple[int, int, int] + :param num_acc_stage: The stage of the accumulator tensor. + :type num_acc_stage: int + + :return: The number of tensor memory allocation columns. + :rtype: int + """ + acc_shape = tiled_mma.partition_shape_C(mma_tiler[:2]) + tCtAcc_fake = tiled_mma.make_fragment_C(cute.append(acc_shape, num_acc_stage)) + num_tmem_alloc_cols = utils.get_num_tmem_alloc_cols(tCtAcc_fake, arch=arch) + + return num_tmem_alloc_cols + + def check_supported_dtypes( + self, ab_dtype: Type[cutlass.Numeric], c_dtype: Type[cutlass.Numeric] + ) -> bool: + """ + Check if the dtypes are valid + + :param ab_dtype: The data type of the A and B operands + :type ab_dtype: Type[cutlass.Numeric] + :param acc_dtype: The data type of the accumulator + :type acc_dtype: Type[cutlass.Numeric] + :param c_dtype: The data type of the output tensor + :type c_dtype: Type[cutlass.Numeric] + + :raises testing.CantImplementError: If the dtypes are invalid + """ + valid_ab_dtypes = { + cutlass.Float16, + cutlass.BFloat16, + cutlass.TFloat32, + cutlass.Uint8, + cutlass.Int8, + cutlass.Float8E4M3FN, + cutlass.Float8E5M2, + } + if ab_dtype not in valid_ab_dtypes: + raise testing.CantImplementError(f"Unsupported AB dtype: {ab_dtype}") + + if self.acc_dtype not in {cutlass.Float32, cutlass.Float16, cutlass.Int32}: + raise testing.CantImplementError( + f"Unsupported accumulator dtype: {self.acc_dtype}" + ) + + # Define compatibility mapping between accumulator type and AB type + acc_ab_compatibility = { + cutlass.Float32: { + cutlass.Float16, + cutlass.BFloat16, + cutlass.TFloat32, + cutlass.Float8E4M3FN, + cutlass.Float8E5M2, + }, # Float32 accumulator supports floating point AB types only + cutlass.Float16: { + cutlass.Float16, + cutlass.Float8E4M3FN, + cutlass.Float8E5M2, + }, + cutlass.Int32: {cutlass.Uint8, cutlass.Int8}, + } + # Check compatibility between accumulator type and AB type + if ab_dtype not in acc_ab_compatibility[self.acc_dtype]: + return False + + # Define compatibility mapping between accumulator type and C type + acc_c_compatibility = { + cutlass.Float32: { + cutlass.Float32, + cutlass.Float16, + cutlass.BFloat16, + cutlass.Float8E4M3FN, + cutlass.Float8E5M2, + cutlass.Int32, + cutlass.Int8, + cutlass.Uint8, + }, + cutlass.Float16: { + cutlass.BFloat16, + cutlass.Float16, + }, + cutlass.Int32: { + cutlass.BFloat16, + cutlass.Float16, + cutlass.Float32, + cutlass.Int32, + cutlass.Int8, + cutlass.Uint8, + }, + } + # Check compatibility between accumulator type and C type + if c_dtype not in acc_c_compatibility[self.acc_dtype]: + return False + + return True + + def check_mma_tiler_and_cluster_shape(self) -> bool: + """Check if the mma tiler and cluster shape are valid. + + :raises testing.CantImplementError: If the mma tiler and cluster shape are invalid + """ + # Skip invalid mma tile shape + if not ( + (not self.use_2cta_instrs and self.mma_tiler_mn[0] in [64, 128]) + or (self.use_2cta_instrs and self.mma_tiler_mn[0] in [128, 256]) + ): + raise testing.CantImplementError( + f"Invalid mma tiler & use_2cta_instrs: {self.mma_tiler_mn}, {self.use_2cta_instrs}" + ) + if self.mma_tiler_mn[1] not in range(32, 257, 32): + raise testing.CantImplementError( + f"Invalid mma tiler N: {self.mma_tiler_mn[1]}" + ) + # Skip illegal cluster shape + if self.cluster_shape_mn[0] % (2 if self.use_2cta_instrs else 1) != 0: + raise testing.CantImplementError( + f"Invalid cluster shape M: {self.cluster_shape_mn[0]}" + ) + # Skip invalid cluster shape + is_power_of_2 = lambda x: x > 0 and (x & (x - 1)) == 0 + if ( + self.cluster_shape_mn[0] * self.cluster_shape_mn[1] > 16 + or self.cluster_shape_mn[0] <= 0 + or self.cluster_shape_mn[1] <= 0 + or not is_power_of_2(self.cluster_shape_mn[0]) + or not is_power_of_2(self.cluster_shape_mn[1]) + ): + raise testing.CantImplementError( + f"Invalid cluster shape: {self.cluster_shape_mn}" + ) + + def check_tensor_alignment( + self, + m: int, + n: int, + k: int, + l: int, + ab_dtype: Type[cutlass.Numeric], + c_dtype: Type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + ) -> bool: + """ + Check if the tensor alignment is valid + + :param m: The number of rows in the A tensor + :type m: int + :param n: The number of columns in the B tensor + :type n: int + :param k: The number of columns in the A tensor + :type k: int + :param l: The number of columns in the C tensor + :type l: int + :param ab_dtype: The data type of the A and B operands + :type ab_dtype: Type[cutlass.Numeric] + :param c_dtype: The data type of the output tensor + :type c_dtype: Type[cutlass.Numeric] + :param a_major: The major axis of the A tensor + :type a_major: str + :param b_major: The major axis of the B tensor + :type b_major: str + :param c_major: The major axis of the C tensor + :type c_major: str + + :return: True if the problem shape is valid, False otherwise + :rtype: bool + """ + + # TODO: move to utils + def check_contiguous_16B_alignment(dtype, is_mode0_major, tensor_shape): + major_mode_idx = 0 if is_mode0_major else 1 + num_major_elements = tensor_shape[major_mode_idx] + num_contiguous_elements = 16 * 8 // dtype.width + return num_major_elements % num_contiguous_elements == 0 + + if ( + not check_contiguous_16B_alignment(ab_dtype, a_major == "m", (m, k, l)) + or not check_contiguous_16B_alignment(ab_dtype, b_major == "n", (n, k, l)) + or not check_contiguous_16B_alignment(c_dtype, c_major == "m", (m, n, l)) + ): + raise testing.CantImplementError( + f"Invalid tensor alignment: {m}, {n}, {k}, {l}, {ab_dtype}, {c_dtype}, {a_major}, {b_major}, {c_major}" + ) + + def check_epilog_store_option(self, m: int, n: int) -> bool: + """ + Check if the epilogue store option is valid + + :param m: The number of rows in the A tensor + :type m: int + :param n: The number of columns in the B tensor + :type n: int + + :raises testing.CantImplementError: If the epilogue store option is invalid + """ + # None TMA store version does not have predication, can not support OOB tiles + cta_tile_shape_mn = ( + self.mma_tiler_mn[0] // (2 if self.use_2cta_instrs else 1), + self.mma_tiler_mn[1], + ) + if not self.use_tma_store: + if not (m % cta_tile_shape_mn[0] == 0 and n % cta_tile_shape_mn[1] == 0): + raise testing.CantImplementError( + f"Invalid epilog store option: {m}, {n}" + ) + + def can_implement( + self, + mnkl: Tuple[int, int, int, int], + ab_dtype: Type[cutlass.Numeric], + c_dtype: Type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + ) -> bool: + """ + Determine if the given tensor configuration can be implemented by this kernel. + + :param mnkl: Problem size as a tuple (M, N, K, L). + :type mnkl: Tuple[int, int, int, int] + :param ab_dtype: Data type for input tensors A and B. + :type ab_dtype: Type[cutlass.Numeric] + :param c_dtype: Data type for output tensor C. + :type c_dtype: Type[cutlass.Numeric] + :param a_major: Major dimension of the A tensor layout ("m" or "k"). + :type a_major: str + :param b_major: Major dimension of the B tensor layout ("n" or "k"). + :type b_major: str + :param c_major: Major dimension of the C tensor layout ("m" or "n"). + :type c_major: str + :return: True if the kernel supports the given configuration, False otherwise. + :rtype: bool + """ + + try: + # Skip unsupported types + self.check_supported_dtypes(ab_dtype, c_dtype) + + # Skip invalid mma tile shape and cluster shape + self.check_mma_tiler_and_cluster_shape() + + m, n, k, l = mnkl + self.check_tensor_alignment( + m, n, k, l, ab_dtype, c_dtype, a_major, b_major, c_major + ) + self.check_epilog_store_option(m, n) + except testing.CantImplementError: + return False + return True + + +@cute.jit +def bmm( + gemm_op: cutlass.Constexpr, + a: cute.Tensor, # (l, m, k) + b: cute.Tensor, # (l, k, n) + c: cute.Tensor, # (l, m, n) + max_active_clusters: cutlass.Constexpr, + stream: cuda.CUstream, + epilogue_op: cutlass.Constexpr = lambda x: x, +): + """ + Wrapper API for persistent GEMM kernel to follow the convention of PyTorch's batch matrix-multiply (bmm). + + Internally, the tensors are permuted to match CuTe's convention: + - a: (m, k, l) + - b: (n, k, l) + - c: (m, n, l) + + :param gemm_op: Kernel operation, expects (a, b, c, max_active_clusters, stream, epilogue_op) + :type gemm_op: cutlass.Constexpr + :param a: Input tensor of shape (l, m, k) + :type a: cute.Tensor + :param b: Input tensor of shape (l, k, n) + :type b: cute.Tensor + :param c: Output tensor of shape (l, m, n) + :type c: cute.Tensor + :param max_active_clusters: Maximum number of hardware clusters to launch + :type max_active_clusters: cutlass.Constexpr + :param epilogue_op: Optional elementwise lambda function to apply per output element, defaults to identity + :type epilogue_op: cutlass.Constexpr, optional + """ + # (l,m,k) -> (m,k,l) + a = cute.make_tensor(a.iterator, cute.select(a.layout, mode=[1, 2, 0])) + # (l,k,n) -> (n,k,l) + b = cute.make_tensor(b.iterator, cute.select(b.layout, mode=[2, 1, 0])) + # (l,m,n) -> (m,n,l) + c = cute.make_tensor(c.iterator, cute.select(c.layout, mode=[1, 2, 0])) + + gemm_op(a, b, c, max_active_clusters, stream, epilogue_op) + + +@lru_cache(maxsize=1) +def prepare_tensors( + mnkl: Tuple[int, int, int, int], + ab_dtype: Type[cutlass.Numeric], + c_dtype: Type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + init_random: bool = True, +): + import torch + from cutlass.torch import dtype as torch_dtype + + m, n, k, l = mnkl + + if a_major == "k": + a = torch.empty((l, m, k), dtype=torch.float32, device="cuda") + elif a_major == "m": + a = torch.empty((l, k, m), dtype=torch.float32, device="cuda").permute(0, 2, 1) + + if b_major == "n": + b = torch.empty((l, k, n), dtype=torch.float32, device="cuda") + elif b_major == "k": + b = torch.empty((l, n, k), dtype=torch.float32, device="cuda").permute(0, 2, 1) + + if c_major == "n": + c = torch.empty((l, m, n), dtype=torch.float32, device="cuda") + elif c_major == "m": + c = torch.empty((l, n, m), dtype=torch.float32, device="cuda").permute(0, 2, 1) + + if init_random: + a.random_(-2, 3) + b.random_(-2, 3) + c.random_(-2, 3) + + return ( + a.to(dtype=torch_dtype(ab_dtype)), + b.to(dtype=torch_dtype(ab_dtype)), + c.to(dtype=torch_dtype(c_dtype)), + ) + + +@lru_cache(maxsize=1) +def compile_bmm( + mnkl: Tuple[int, int, int, int], + a: cute.Tensor, + b: cute.Tensor, + c: cute.Tensor, + acc_dtype: Type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + mma_tiler_mn: Tuple[int, int] = (256, 256), + cluster_shape_mn: Tuple[int, int] = (2, 1), + max_active_clusters: cutlass.Constexpr = None, + use_2cta_instrs: bool = True, + use_tma_store: bool = True, + epilogue_op: cutlass.Constexpr = lambda x: x, +): + from cutlass.cute.runtime import make_fake_stream + + gemm = PersistentDenseGemmKernel( + acc_dtype, + use_2cta_instrs, + mma_tiler_mn, + cluster_shape_mn, + use_tma_store, + ) + # Check if configuration can be implemented + can_implement = gemm.can_implement( + mnkl, a.element_type, c.element_type, a_major, b_major, c_major + ) + if not can_implement: + raise testing.CantImplementError( + f"The current config which is invalid/unsupported: use_2cta_instrs = {use_2cta_instrs}, " + f"mma_tiler_mn = {mma_tiler_mn}, cluster_shape_mn = {cluster_shape_mn}, " + f"use_tma_store = {use_tma_store}" + ) + + stream = make_fake_stream() + return cute.compile(bmm, gemm, a, b, c, max_active_clusters, stream, epilogue_op) + + +def run( + mnkl: Tuple[int, int, int, int], + ab_dtype: Type[cutlass.Numeric], + c_dtype: Type[cutlass.Numeric], + acc_dtype: Type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + mma_tiler_mn: Tuple[int, int] = (256, 256), + cluster_shape_mn: Tuple[int, int] = (2, 1), + use_2cta_instrs: bool = True, + use_tma_store: bool = True, + tolerance: float = 1e-01, + warmup_iterations: int = 0, + iterations: int = 1, + skip_ref_check: bool = False, + use_cold_l2: bool = False, + benchmark: bool = False, + **kwargs, +): + """ + Execute a persistent batched dense GEMM operation on Blackwell architecture with performance benchmarking. + + Prepares input tensors, configures and launches the persistent GEMM kernel, + optionally performs reference validation, and benchmarks execution. + + :param mnkl: Problem size as a tuple (M, N, K, L). + :type mnkl: Tuple[int, int, int, int] + :param ab_dtype: Data type for input tensors A and B. + :type ab_dtype: Type[cutlass.Numeric] + :param c_dtype: Data type for output tensor C. + :type c_dtype: Type[cutlass.Numeric] + :param acc_dtype: Accumulator data type for the matrix multiplication. + :type acc_dtype: Type[cutlass.Numeric] + :param a_major: Memory layout of tensor A. + :type a_major: str + :param b_major: Memory layout of tensor B. + :type b_major: str + :param c_major: Memory layout of tensor C. + :type c_major: str + :param mma_tiler_mn: MMA tiling size (M, N), defaults to (256, 256). + :type mma_tiler_mn: Tuple[int, int], optional + :param cluster_shape_mn: Cluster shape (M, N), defaults to (2, 1). + :type cluster_shape_mn: Tuple[int, int], optional + :param use_2cta_instrs: Whether to use 2CTA MMA instructions, defaults to True. + :type use_2cta_instrs: bool, optional + :param use_tma_store: Whether to use TMA store, defaults to True. + :type use_tma_store: bool, optional + :param tolerance: Tolerance for reference validation, defaults to 1e-01. + :type tolerance: float, optional + :param warmup_iterations: Number of warmup iterations before benchmarking, defaults to 0. + :type warmup_iterations: int, optional + :param iterations: Number of benchmark iterations to run, defaults to 1. + :type iterations: int, optional + :param skip_ref_check: Whether to skip reference result validation, defaults to False. + :type skip_ref_check: bool, optional + :param use_cold_l2: Whether to use circular buffer strategy to ensure cold L2 cache, defaults to False. + :type use_cold_l2: bool, optional + :param benchmark: Whether to only benchmark the kernel, defaults to False. + :type benchmark: bool, optional + :raises RuntimeError: If CUDA GPU is not available. + :raises ValueError: If the configuration is invalid or unsupported by the kernel. + :return: Execution time of the GEMM kernel. + :rtype: float + """ + import torch + from cutlass.torch import dtype as torch_dtype + + if not torch.cuda.is_available(): + raise RuntimeError("GPU is required to run this example!") + + # Get current CUDA stream from PyTorch + torch_stream = torch.cuda.current_stream() + # Get the raw stream pointer as a CUstream + current_stream = cuda.CUstream(torch_stream.cuda_stream) + + # Check if configuration can be implemented + max_active_clusters = utils.HardwareInfo().get_max_active_clusters( + cluster_shape_mn[0] * cluster_shape_mn[1] + ) + + # Run and verify BMM with torch + a, b, c = prepare_tensors(mnkl, ab_dtype, c_dtype, a_major, b_major, c_major) + + leading_dim_a = 2 if a_major == "k" else 1 + leading_dim_b = 1 if b_major == "k" else 2 + leading_dim_c = 2 if c_major == "n" else 1 + + a_ = from_dlpack( + a, assumed_align=16, force_tf32=ab_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_a) + b_ = from_dlpack( + b, assumed_align=16, force_tf32=ab_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_b) + c_ = from_dlpack( + c, assumed_align=16, force_tf32=c_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_c) + + compiled_fn = compile_bmm( + mnkl, + a_, + b_, + c_, + acc_dtype, + a_major, + b_major, + c_major, + mma_tiler_mn, + cluster_shape_mn, + max_active_clusters, + use_2cta_instrs, + use_tma_store, + epilogue_op=lambda x: x, + ) + + print("Running Blackwell Persistent Dense GEMM test with:") + print(f"mnkl: {mnkl}") + print(f"Tolerance: {tolerance}") + print(f"Warmup iterations: {warmup_iterations}") + print(f"Iterations: {iterations}") + print(f"Skip reference checking: {skip_ref_check}") + print(f"Use cold L2: {'True' if use_cold_l2 else 'False'}") + + if not skip_ref_check: + # Use small random number for deterministic result for reference check + compiled_fn(a_, b_, c_, current_stream) + + # Manually quantize to be comparable + ref = ( + torch.bmm(a.to(dtype=torch.float32), b.to(dtype=torch.float32)) + .to(dtype=torch_dtype(c_dtype)) + .to(dtype=torch.float32) + ) + torch.testing.assert_close( + c.to(dtype=torch.float32), ref, atol=tolerance, rtol=1e-03 + ) + + if not benchmark: + return 0 + + def generate_tensors(): + init_normal = ab_dtype not in [cutlass.Int8, cutlass.Uint8] + a, b, c = prepare_tensors( + mnkl, + ab_dtype, + c_dtype, + a_major, + b_major, + c_major, + init_random=not init_normal, + ) + a_ = from_dlpack( + a, assumed_align=16, force_tf32=ab_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_a) + b_ = from_dlpack( + b, assumed_align=16, force_tf32=ab_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_b) + c_ = from_dlpack( + c, assumed_align=16, force_tf32=c_dtype == cutlass.TFloat32 + ).mark_layout_dynamic(leading_dim=leading_dim_c) + return testing.JitArguments(a_, b_, c_, current_stream) + + workspace_count = 1 + if use_cold_l2: + one_workspace_bytes = ( + a.numel() * a.element_size() + + b.numel() * b.element_size() + + c.numel() * c.element_size() + ) + workspace_count = testing.get_workspace_count( + one_workspace_bytes, warmup_iterations, iterations + ) + + # Return execution time in microseconds + return testing.benchmark( + compiled_fn, + workspace_generator=generate_tensors, + workspace_count=workspace_count, + stream=current_stream, + warmup_iterations=warmup_iterations, + iterations=iterations, + ) + + +def compute_tflops(time_ns, m, n, k): + return 2.0 * m * n * k / time_ns / 1000.0 + + + +def _parse_comma_separated_ints(s: str) -> Tuple[int, ...]: + try: + return tuple(int(x.strip()) for x in s.split(",")) + except ValueError: + raise argparse.ArgumentTypeError( + "Invalid format. Expected comma-separated integers." + ) + + +def prepare_parser(): + parser = argparse.ArgumentParser( + description="Example of Dense Persistent GEMM on Blackwell." + ) + + parser.add_argument( + "--mnkl", + type=_parse_comma_separated_ints, + default=(256, 256, 512, 1), + help="mnkl dimensions (comma-separated)", + ) + parser.add_argument( + "--cluster_shape_mn", + type=_parse_comma_separated_ints, + default=(1, 1), + help="Cluster shape (comma-separated)", + ) + parser.add_argument("--ab_dtype", type=cutlass.dtype, default=cutlass.TFloat32) + parser.add_argument("--c_dtype", type=cutlass.dtype, default=cutlass.Float32) + parser.add_argument("--acc_dtype", type=cutlass.dtype, default=cutlass.Float32) + parser.add_argument( + "--use_2cta_instrs", + action="store_true", + help="Enable 2CTA MMA instructions feature", + ) + parser.add_argument("--a_major", choices=["k", "m"], type=str, default="k") + parser.add_argument("--b_major", choices=["k", "n"], type=str, default="k") + parser.add_argument("--c_major", choices=["n", "m"], type=str, default="n") + parser.add_argument( + "--use_tma_store", action="store_true", help="Use tma store or not" + ) + parser.add_argument( + "--tolerance", type=float, default=1e-01, help="Tolerance for validation" + ) + parser.add_argument( + "--benchmark", + type=str, + default="default", + choices=[ + "default", + "none", + ], + help="Benchmark the kernel with nsight or default (cute.testing.benchmark) or none", + ) + parser.add_argument( + "--warmup_iterations", type=int, default=0, help="Warmup iterations" + ) + parser.add_argument( + "--iterations", + type=int, + default=1, + help="Number of iterations to run the kernel", + ) + parser.add_argument( + "--skip_ref_check", action="store_true", help="Skip reference checking" + ) + parser.add_argument( + "--use_cold_l2", + action="store_true", + default=False, + help="Use circular buffer tensor sets to ensure L2 cold cache", + ) + + return parser + + +if __name__ == "__main__": + parser = prepare_parser() + parser.add_argument( + "--mma_tiler_mn", + type=_parse_comma_separated_ints, + default=(128, 128), + help="Mma tile shape (comma-separated)", + ) + + args = parser.parse_args() + + if len(args.mnkl) != 4: + parser.error("--mnkl must contain exactly 4 values") + + if len(args.mma_tiler_mn) != 2: + parser.error("--mma_tiler_mn must contain exactly 2 values") + + if len(args.cluster_shape_mn) != 2: + parser.error("--cluster_shape_mn must contain exactly 2 values") + + print(f"[DSL INFO] Compiling Blackwell Persistent Dense GEMM with:") + print( + f"[DSL INFO] A dtype: {args.ab_dtype}, B dtype: {args.c_dtype}, C dtype: {args.acc_dtype}, Acc dtype: {args.acc_dtype}" + ) + print( + f"[DSL INFO] Matrix majors - A: {args.a_major}, B: {args.b_major}, C: {args.c_major}" + ) + print(f"[DSL INFO] Mma Tiler (M, N): {args.mma_tiler_mn}") + print(f"[DSL INFO] Cluster Shape (M, N): {args.cluster_shape_mn}") + print( + f"[DSL INFO] 2CTA MMA instructions: {'True' if args.use_2cta_instrs else 'False'}" + ) + print(f"[DSL INFO] Use TMA Store: {'True' if args.use_tma_store else 'False'}") + + run( + args.mnkl, + args.ab_dtype, + args.c_dtype, + args.acc_dtype, + args.a_major, + args.b_major, + args.c_major, + args.mma_tiler_mn, + args.cluster_shape_mn, + args.use_2cta_instrs, + args.use_tma_store, + args.tolerance, + args.warmup_iterations, + args.iterations, + args.skip_ref_check, + args.use_cold_l2, + args.benchmark == "default", + ) + print("PASS") diff --git a/examples/python/CuTeDSL/cute/export/export_to_c.py b/examples/python/CuTeDSL/cute/export/export_to_c.py new file mode 100644 index 00000000..61ec79b9 --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/export_to_c.py @@ -0,0 +1,107 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import cutlass +import cutlass.cute as cute + +import os +import subprocess +import cuda.bindings.driver as cuda + +"""Example demonstrating how to export a CuTe function. + +This example shows how to: +1. Compile a CuTe function +2. Export the compiled function to a object file and a C header file +3. Compile the object file to a shared library + +To run this example: + +.. code-block:: bash + + # export the compiled function to a object file and a C header file + python cutlass_ir/compiler/python/examples/cute/export/export_to_c.py +""" + + +@cute.kernel +def print_tensor_kernel(a: cute.Tensor): + cute.printf("a: {}", a) + + +@cute.jit +def print_tensor(a: cute.Tensor, stream: cuda.CUstream): + print_tensor_kernel(a).launch(grid=(1, 1, 1), block=(1, 1, 1), stream=stream) + + +@cute.kernel +def add_one_kernel(a: cute.Tensor, b: cute.Tensor): + a[0] = b[0] + 1 + + +@cute.jit +def add_one(a: cute.Tensor, b: cute.Tensor, stream: cuda.CUstream): + add_one_kernel(a, b).launch(grid=(1, 1, 1), block=(1, 1, 1), stream=stream) + + +def run(): + from cutlass.cute.runtime import make_fake_compact_tensor + + shape = (cute.SymInt(divisibility=16), cute.SymInt()) + a = make_fake_compact_tensor(cutlass.Float32, shape, stride_order=(1, 0)) + b = make_fake_compact_tensor(cutlass.Float32, shape, stride_order=(1, 0)) + stream = cuda.CUstream(0) + compiled_print_tensor = cute.compile(print_tensor, a, stream=stream) + compiled_add_one = cute.compile(add_one, a, b, stream=stream) + + os.makedirs("./build", exist_ok=True) + compiled_print_tensor.export_to_c( + file_path="./build", + file_name="print_tensor_example", + function_prefix="print_tensor", + ) + compiled_add_one.export_to_c( + file_path="./build", file_name="add_one_example", function_prefix="add_one" + ) + + cc = os.environ.get("CC", "gcc") + + # compile the object file to a shared library + cmd = [ + cc, + "-shared", + "-o", + "./build/libexport_example.so", + "./build/print_tensor_example.o", + "./build/add_one_example.o", + ] + subprocess.run(cmd, check=True) + + +if __name__ == "__main__": + run() diff --git a/examples/python/CuTeDSL/cute/export/load_in_python.py b/examples/python/CuTeDSL/cute/export/load_in_python.py new file mode 100644 index 00000000..758fe228 --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/load_in_python.py @@ -0,0 +1,79 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import cutlass +import cutlass.cute as cute +import cuda.bindings.driver as cuda + + +"""Example demonstrating how to load a CuTe module/function in Python. + +This example shows how to: +1. Load a CuTe module from a object file or a shared library +2. Extract the function from the module and call it in Python + +To run this example: + +.. code-block:: bash + + # prerequesites: export the compiled functions to object files and compile them into a shared library + python examples/cute/export/export_to_c.py + # load the module from a object file or a shared library + python examples/cute/export/load_in_python.py +""" + + +def run(): + import torch + from cutlass.cute.runtime import from_dlpack + + a = ( + torch.arange(16 * 10, dtype=torch.float32, device="cuda") + .reshape(16, 10) + .permute(1, 0) + ) + b = torch.ones(16, 10, dtype=torch.float32, device="cuda").permute(1, 0) + a_cute = from_dlpack(a).mark_layout_dynamic() + b_cute = from_dlpack(b).mark_layout_dynamic() + stream = cuda.CUstream(0) + + print_tensor_mod = cute.runtime.load_module("./build/print_tensor_example.o") + print_tensor_mod.print_tensor(a_cute, stream=stream) + + add_one_mod = cute.runtime.load_module("./build/add_one_example.o") + add_one_mod.add_one(a_cute, b_cute, stream=stream) + assert a[0, 0] == b[0, 0] + 1 + + shared_mod = cute.runtime.load_module("./build/libexport_example.so") + shared_mod.print_tensor(a_cute, stream=stream) + shared_mod.add_one(a_cute, b_cute, stream=stream) + assert a[0, 0] == b[0, 0] + 1 + + +if __name__ == "__main__": + run() diff --git a/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.cpp b/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.cpp new file mode 100644 index 00000000..7c58d407 --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.cpp @@ -0,0 +1,254 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. + * All rights reserved. SPDX-License-Identifier: LicenseRef-NvidiaProprietary + * + * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual + * property and proprietary rights in and to this material, related + * documentation and any modifications thereto. Any use, reproduction, + * disclosure or distribution of this material and related documentation + * without an express license agreement from NVIDIA CORPORATION or + * its affiliates is strictly prohibited. + */ +/** + * This example demonstrates how to load a CuTe module/function from a object + * file or a shared library and run it in a CUDA kernel. + * + * To run this example: + * + * .. code-block:: bash + * + * # prerequesites: export the compiled functions to object files and compile + * them into a shared library python examples/cute/export/export_to_c.py # run + * the example bash ./examples/cute/export/run_with_dynamic_loading.sh + */ + +#include "CuteDSLRuntime.h" +#include +#include +#include + +std::vector read_file(const std::string &filename) { + std::ifstream file(filename, std::ios::binary); + std::vector content((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + return content; +} + +void initialize_cuda_context() { + // Initialize cuda context + cudaSetDevice(0); +} + +void check_error(CuteDSLRT_Error_t error) { + if (error != CuteDSLRT_Error_Success) { + printf("Got runtime error: %d\n", error); + exit(1); + } +} + +// Copy the definition of the tensor from `print_tensor_example.h` to here +typedef struct { + void *data; + int32_t dynamic_shapes[2]; + int64_t dynamic_strides[1]; +} print_tensor_Tensor_a_t; + +// Copy the definition of the tensor from `add_one_example.h` to here +typedef struct { + void *data; + int32_t dynamic_shapes[2]; + int64_t dynamic_strides[1]; +} add_one_Tensor_a_t; +typedef struct { + void *data; + int32_t dynamic_shapes[2]; + int64_t dynamic_strides[1]; +} add_one_Tensor_b_t; + +print_tensor_Tensor_a_t prepare_print_tensor_tensor() { + print_tensor_Tensor_a_t tensor; + tensor.data = NULL; + tensor.dynamic_shapes[0] = 32; + tensor.dynamic_shapes[1] = 16; + tensor.dynamic_strides[0] = 16; + return tensor; +} + +add_one_Tensor_a_t prepare_add_one_tensor_a() { + float a_host_ptr[32 * 16]; + for (int i = 0; i < 32 * 16; i++) { + a_host_ptr[i] = i; + } + void *a_device_ptr; + cudaMalloc(&a_device_ptr, sizeof(float) * 32 * 16); + cudaMemcpy(a_device_ptr, a_host_ptr, sizeof(float) * 32 * 16, + cudaMemcpyHostToDevice); + add_one_Tensor_a_t tensor; + tensor.data = (void *)a_device_ptr; + tensor.dynamic_shapes[0] = 32; + tensor.dynamic_shapes[1] = 16; + tensor.dynamic_strides[0] = 16; + return tensor; +} + +add_one_Tensor_b_t prepare_add_one_tensor_b() { + float b_host_ptr[32 * 16]; + for (int i = 0; i < 32 * 16; i++) { + b_host_ptr[i] = 32 * 16 - i; + } + void *b_device_ptr; + cudaMalloc(&b_device_ptr, sizeof(float) * 32 * 16); + cudaMemcpy(b_device_ptr, b_host_ptr, sizeof(float) * 32 * 16, + cudaMemcpyHostToDevice); + add_one_Tensor_b_t tensor; + tensor.data = (void *)b_device_ptr; + tensor.dynamic_shapes[0] = 32; + tensor.dynamic_shapes[1] = 16; + tensor.dynamic_strides[0] = 16; + return tensor; +} + +void run_print_tensor_with_object_file() { + + // prepare tensor + print_tensor_Tensor_a_t tensor = prepare_print_tensor_tensor(); + + // prepare stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // load module and function + CuteDSLRT_Module_t *module = nullptr; + std::vector print_tensor_example_o_bytes = + read_file("build/print_tensor_example.o"); + size_t print_tensor_example_o_size = print_tensor_example_o_bytes.size(); + CuteDSLRT_Error_t error = CuteDSLRT_Module_Create_From_Bytes( + &module, print_tensor_example_o_bytes.data(), print_tensor_example_o_size, + nullptr, 0); + check_error(error); + + CuteDSLRT_Function_t *function = nullptr; + error = CuteDSLRT_Module_Get_Function(&function, module, "print_tensor"); + check_error(error); + + // run kernel, refer to the wrapper function in `print_tensor_example.h` + int32_t cuda_result; + void *args[3] = {&tensor, &stream, &cuda_result}; + error = CuteDSLRT_Function_Run(function, args, 3); + check_error(error); + + // synchronize stream + cudaStreamSynchronize(stream); + + // unload module + error = CuteDSLRT_Module_Destroy(module); + check_error(error); + cudaStreamDestroy(stream); +} + +void run_add_one_with_object_file() { + // prepare a tensor + add_one_Tensor_a_t tensor_a = prepare_add_one_tensor_a(); + + // prepare b tensor + add_one_Tensor_b_t tensor_b = prepare_add_one_tensor_b(); + + // prepare stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // load module + CuteDSLRT_Module_t *module = nullptr; + std::vector add_one_example_o_bytes = + read_file("build/add_one_example.o"); + size_t add_one_example_o_size = add_one_example_o_bytes.size(); + CuteDSLRT_Error_t error = CuteDSLRT_Module_Create_From_Bytes( + &module, add_one_example_o_bytes.data(), add_one_example_o_size, nullptr, + 0); + check_error(error); + + CuteDSLRT_Function_t *function = nullptr; + error = CuteDSLRT_Module_Get_Function(&function, module, "add_one"); + check_error(error); + + // run kernel, refer to the wrapper function in `add_one_example.h` + int32_t cuda_result; + void *args[4] = {&tensor_a, &tensor_b, &stream, &cuda_result}; + error = CuteDSLRT_Function_Run(function, args, 4); + check_error(error); + cudaStreamSynchronize(stream); + + // unload module + error = CuteDSLRT_Module_Destroy(module); + check_error(error); + cudaStreamDestroy(stream); + + // check result + float a_host_ptr[32 * 16]; + cudaMemcpy(a_host_ptr, tensor_a.data, sizeof(float) * 32 * 16, + cudaMemcpyDeviceToHost); + + if (a_host_ptr[0] != 32 * 16 + 1) { + printf("Error: a_host_ptr[0] = %f, expected %d\n", a_host_ptr[0], 32 * 16); + exit(1); + } +} + +void run_example_with_shared_library() { + // prepare tensor + print_tensor_Tensor_a_t tensor = prepare_print_tensor_tensor(); + + // prepare a tensor + add_one_Tensor_a_t tensor_a = prepare_add_one_tensor_a(); + + // prepare b tensor + add_one_Tensor_b_t tensor_b = prepare_add_one_tensor_b(); + + // prepare stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // load module + CuteDSLRT_Module_t *module = nullptr; + const char *shared_libs[] = {"build/libexport_example.so"}; + CuteDSLRT_Error_t error = + CuteDSLRT_Module_Create_From_Bytes(&module, nullptr, 0, shared_libs, 1); + check_error(error); + + // get print tensor function + CuteDSLRT_Function_t *print_tensor_function = nullptr; + error = CuteDSLRT_Module_Get_Function(&print_tensor_function, module, + "print_tensor"); + check_error(error); + + // get add one function + CuteDSLRT_Function_t *add_one_function = nullptr; + error = CuteDSLRT_Module_Get_Function(&add_one_function, module, "add_one"); + check_error(error); + + // run print tensor kernel + int32_t cuda_result; + void *print_tensor_args[3] = {&tensor, &stream, &cuda_result}; + error = CuteDSLRT_Function_Run(print_tensor_function, print_tensor_args, 3); + check_error(error); + cudaStreamSynchronize(stream); + + // run add one kernel + void *add_one_args[4] = {&tensor_a, &tensor_b, &stream, &cuda_result}; + error = CuteDSLRT_Function_Run(add_one_function, add_one_args, 4); + check_error(error); + cudaStreamSynchronize(stream); + + // unload module + error = CuteDSLRT_Module_Destroy(module); + check_error(error); + cudaStreamDestroy(stream); +} + +int main() { + initialize_cuda_context(); + run_print_tensor_with_object_file(); + run_add_one_with_object_file(); + run_example_with_shared_library(); + return 0; +} diff --git a/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.sh b/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.sh new file mode 100755 index 00000000..571d06b3 --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/run_with_dynamic_loading.sh @@ -0,0 +1,80 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#!/bin/bash +set -eu + +# Try to find the wheel path of nvidia-cutlass-dsl +WHEEL_PATH=$(python3 -c "import cutlass, os; print(os.path.dirname(cutlass.__file__))" 2>/dev/null)/../.. + +if [[ -z "$WHEEL_PATH" ]]; then + echo "nvidia-cutlass-dsl wheel not found in the current Python environment." + exit 1 +else + echo "nvidia-cutlass-dsl wheel path found at: $WHEEL_PATH" +fi + +CUTE_DSL_LIB_PATH="${WHEEL_PATH}/lib/" +export LD_LIBRARY_PATH=${CUTE_DSL_LIB_PATH}:${CUDA_HOME}/lib64:./build + +if [ -z "$CUDA_HOME" ]; then + CUDA_HOME=/usr/local/cuda + echo "CUDA_HOME not set, using default: $CUDA_HOME" +else + echo "CUDA_HOME found: $CUDA_HOME" +fi +SOURCE_FILE="$(dirname "$0")/run_with_dynamic_loading.cpp" + +echo "Compiling the executable..." +# Search for a common C++ compiler: g++, clang++, or c++ +if [ -n "${CXX-}" ] && command -v "$CXX" &> /dev/null; then + CXX="$CXX" +elif command -v g++ &> /dev/null; then + CXX="g++" +elif command -v clang++ &> /dev/null; then + CXX="clang++" +elif command -v c++ &> /dev/null; then + CXX="c++" +else + echo "Error: No common C++ compiler found (g++, clang++, or c++). Please install a C++ compiler to continue." + exit 1 +fi + +$CXX -o build/run_with_dynamic_loading \ + -I${CUDA_HOME}/include \ + -I${WHEEL_PATH}/include \ + ${SOURCE_FILE} \ + -L${CUTE_DSL_LIB_PATH} \ + -L${CUDA_HOME}/lib64 \ + -L./build \ + -lcudart \ + -lcute_dsl_runtime \ + -lexport_example + +echo "Running the executable..." +./build/run_with_dynamic_loading diff --git a/examples/python/CuTeDSL/cute/export/run_with_static_linking.cpp b/examples/python/CuTeDSL/cute/export/run_with_static_linking.cpp new file mode 100644 index 00000000..96acbc2e --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/run_with_static_linking.cpp @@ -0,0 +1,124 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. + * All rights reserved. SPDX-License-Identifier: LicenseRef-NvidiaProprietary + * + * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual + * property and proprietary rights in and to this material, related + * documentation and any modifications thereto. Any use, reproduction, + * disclosure or distribution of this material and related documentation + * without an express license agreement from NVIDIA CORPORATION or + * its affiliates is strictly prohibited. + */ +/** + * This example demonstrates how to load a CuTe module/function from compilation + * and static linking and run it in a CUDA kernel. + * + * To run this example: + * + * .. code-block:: bash + * + * # prerequesites: export the compiled functions to object files and compile + * them into a shared library python examples/cute/export/export_to_c.py # run + * the example bash ./examples/cute/export/run_with_static_linking.sh + */ + +#include "add_one_example.h" +#include "print_tensor_example.h" +#include + +void initialize_cuda_context() { + // Initialize cuda context + int device_id = 0; + cudaSetDevice(device_id); +} + +void run_print_tensor() { + // prepare tensor + print_tensor_Tensor_a_t tensor; + tensor.data = NULL; + tensor.dynamic_shapes[0] = 32; + tensor.dynamic_shapes[1] = 16; + tensor.dynamic_strides[0] = 16; + + // prepare stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // load module + print_tensor_Kernel_Module_t module; + print_tensor_Kernel_Module_Load(&module); + + // run kernel + cute_dsl_print_tensor_wrapper(&module, &tensor, stream); + + // synchronize stream + cudaStreamSynchronize(stream); + + // unload module + print_tensor_Kernel_Module_Unload(&module); + cudaStreamDestroy(stream); +} + +void run_add_one() { + // prepare a tensor + add_one_Tensor_a_t a_tensor; + float a_host_ptr[32 * 16]; + for (int i = 0; i < 32 * 16; i++) { + a_host_ptr[i] = i; + } + void *a_device_ptr; + cudaMalloc(&a_device_ptr, sizeof(float) * 32 * 16); + cudaMemcpy(a_device_ptr, a_host_ptr, sizeof(float) * 32 * 16, + cudaMemcpyHostToDevice); + a_tensor.data = (void *)a_device_ptr; + a_tensor.dynamic_shapes[0] = 32; + a_tensor.dynamic_shapes[1] = 16; + a_tensor.dynamic_strides[0] = 16; + + // prepare b tensor + add_one_Tensor_b_t b_tensor; + float b_host_ptr[32 * 16]; + for (int i = 0; i < 32 * 16; i++) { + b_host_ptr[i] = 32 * 16 - i; + } + void *b_device_ptr; + cudaMalloc(&b_device_ptr, sizeof(float) * 32 * 16); + cudaMemcpy(b_device_ptr, b_host_ptr, sizeof(float) * 32 * 16, + cudaMemcpyHostToDevice); + + b_tensor.data = (void *)b_device_ptr; + b_tensor.dynamic_shapes[0] = 32; + b_tensor.dynamic_shapes[1] = 16; + b_tensor.dynamic_strides[0] = 16; + + // prepare stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // load module + add_one_Kernel_Module_t module; + add_one_Kernel_Module_Load(&module); + + // run kernel + cute_dsl_add_one_wrapper(&module, &a_tensor, &b_tensor, stream); + cudaStreamSynchronize(stream); + + // unload module + add_one_Kernel_Module_Unload(&module); + cudaStreamDestroy(stream); + + // check result + cudaMemcpy(a_host_ptr, a_device_ptr, sizeof(float) * 32 * 16, + cudaMemcpyDeviceToHost); + + if (a_host_ptr[0] != 32 * 16 + 1) { + printf("Error: a_host_ptr[0] = %f, expected %d\n", a_host_ptr[0], 32 * 16); + } +} + +int main() { + initialize_cuda_context(); + run_print_tensor(); + run_add_one(); + return 0; +} diff --git a/examples/python/CuTeDSL/cute/export/run_with_static_linking.sh b/examples/python/CuTeDSL/cute/export/run_with_static_linking.sh new file mode 100755 index 00000000..c3540d73 --- /dev/null +++ b/examples/python/CuTeDSL/cute/export/run_with_static_linking.sh @@ -0,0 +1,76 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#!/bin/bash +set -eu + +# Try to find the wheel path of nvidia-cutlass-dsl +WHEEL_PATH=$(python3 -c "import cutlass, os; print(os.path.dirname(cutlass.__file__))" 2>/dev/null)/../.. + +if [[ -z "$WHEEL_PATH" ]]; then + echo "nvidia-cutlass-dsl wheel not found in the current Python environment." + exit 1 +else + echo "nvidia-cutlass-dsl wheel path found at: $WHEEL_PATH" +fi +CUTE_DSL_LIB_PATH="${WHEEL_PATH}/lib/" +export LD_LIBRARY_PATH=${CUTE_DSL_LIB_PATH} + +if [ -z "$CUDA_HOME" ]; then + CUDA_HOME=/usr/local/cuda + echo "CUDA_HOME not set, using default: $CUDA_HOME" +else + echo "CUDA_HOME found: $CUDA_HOME" +fi +SOURCE_FILE="$(dirname "$0")/run_with_static_linking.cpp" + +echo "Compiling the executable..." +# Search for a common C++ compiler: g++, clang++, or c++ +if [ -n "${CXX-}" ] && command -v "$CXX" &> /dev/null; then + CXX="$CXX" +elif command -v g++ &> /dev/null; then + CXX="g++" +elif command -v clang++ &> /dev/null; then + CXX="clang++" +elif command -v c++ &> /dev/null; then + CXX="c++" +else + echo "Error: No common C++ compiler found (g++, clang++, or c++). Please install a C++ compiler to continue." + exit 1 +fi + +# Note: The options -ldl, -lrt, and -lpthread are optional to satisfy symbol dependencies required by `libcudart_static.a`. +$CXX -o build/run_with_static_linking \ + -I${CUDA_HOME}/include \ + -I./build \ + ${SOURCE_FILE} build/add_one_example.o build/print_tensor_example.o \ + ${CUTE_DSL_LIB_PATH}/libcuda_dialect_runtime_static.a \ + ${CUDA_HOME}/lib64/libcudart_static.a -ldl -lrt -lpthread + +echo "Running the executable..." +./build/run_with_static_linking diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/aot_export.py b/examples/python/CuTeDSL/cute/tvm_ffi/aot_export.py index a553ada5..57fe9a43 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/aot_export.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/aot_export.py @@ -37,21 +37,19 @@ To run this example: .. code-block:: bash - python examples/cute/tvm_ffi/aot_export.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/aot_export.py # run example to use in torch - python examples/cute/tvm_ffi/aot_use_in_torch.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/aot_use_in_torch.py # run example to use in jax - python examples/cute/tvm_ffi/aot_use_in_jax.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/aot_use_in_jax.py # run example to use in c++ bundle - bash examples/cute/tvm_ffi/aot_use_in_cpp_bundle.sh + bash cutlass_ir/compiler/python/examples/cute/tvm_ffi/aot_use_in_cpp_bundle.sh """ from pathlib import Path -import torch import os import subprocess import tvm_ffi -import torch import cutlass.cute as cute from cutlass.cute.runtime import from_dlpack @@ -69,6 +67,8 @@ def add_one(a: cute.Tensor, b: cute.Tensor): def main(): + import torch + # compile the kernel with "--enable-tvm-ffi" option a_torch = torch.arange(10, dtype=torch.float32, device="cuda") b_torch = torch.zeros(10, dtype=torch.float32, device="cuda") diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.cpp b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.cpp index 27883585..e1f0645b 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.cpp +++ b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.cpp @@ -15,32 +15,31 @@ // This example shows how to interface with an AOT compiled function in a C++ // bundle. to build and run the example, run the following command in project // root bash -// examples/cute/tvm_ffi/aot_use_in_cpp_bundle.sh +// cutlass_ir/compiler/python/examples/cute/tvm_ffi/aot_use_in_cpp_bundle.sh #include -#include #include #include #include +#include #include + namespace ffi = tvm::ffi; struct CUDANDAlloc { - void AllocData(DLTensor *tensor) { + void AllocData(DLTensor* tensor) { size_t data_size = ffi::GetDataSize(*tensor); - void *ptr = nullptr; + void* ptr = nullptr; cudaError_t err = cudaMalloc(&ptr, data_size); - TVM_FFI_ICHECK_EQ(err, cudaSuccess) - << "cudaMalloc failed: " << cudaGetErrorString(err); + TVM_FFI_ICHECK_EQ(err, cudaSuccess) << "cudaMalloc failed: " << cudaGetErrorString(err); tensor->data = ptr; } - void FreeData(DLTensor *tensor) { + void FreeData(DLTensor* tensor) { if (tensor->data != nullptr) { cudaError_t err = cudaFree(tensor->data); - TVM_FFI_ICHECK_EQ(err, cudaSuccess) - << "cudaFree failed: " << cudaGetErrorString(err); + TVM_FFI_ICHECK_EQ(err, cudaSuccess) << "cudaFree failed: " << cudaGetErrorString(err); tensor->data = nullptr; } } @@ -51,47 +50,45 @@ inline ffi::Tensor Empty(ffi::Shape shape, DLDataType dtype, DLDevice device) { } // symbol from the shared library -extern "C" int __tvm_ffi_add_one(void *, const TVMFFIAny *, int32_t, - TVMFFIAny *); +extern "C" int __tvm_ffi_add_one(void*, const TVMFFIAny*, int32_t, TVMFFIAny*); // Redirects into the exported function in object void CallAddOne(ffi::TensorView x, ffi::TensorView y) { - tvm::ffi::Function::InvokeExternC(nullptr, __tvm_ffi_add_one, x, y); + tvm::ffi::Function::InvokeExternC(nullptr, __tvm_ffi_add_one, x, y); } int main() { - DLDataType f32_dtype{kDLFloat, 32, 1}; - DLDevice cuda_device{kDLCUDA, 0}; + DLDataType f32_dtype{kDLFloat, 32, 1}; + DLDevice cuda_device{kDLCUDA, 0}; - constexpr int ARRAY_SIZE = 10; + constexpr int ARRAY_SIZE = 10; - ffi::Tensor x = Empty({ARRAY_SIZE}, f32_dtype, cuda_device); - ffi::Tensor y = Empty({ARRAY_SIZE}, f32_dtype, cuda_device); + ffi::Tensor x = Empty({ARRAY_SIZE}, f32_dtype, cuda_device); + ffi::Tensor y = Empty({ARRAY_SIZE}, f32_dtype, cuda_device); - std::vector host_x(ARRAY_SIZE); - for (int i = 0; i < ARRAY_SIZE; ++i) { - host_x[i] = static_cast(i); - } + std::vector host_x(ARRAY_SIZE); + for (int i = 0; i < ARRAY_SIZE; ++i) { + host_x[i] = static_cast(i); + } - size_t nbytes = host_x.size() * sizeof(float); - cudaError_t err = - cudaMemcpy(x.data_ptr(), host_x.data(), nbytes, cudaMemcpyHostToDevice); - TVM_FFI_ICHECK_EQ(err, cudaSuccess) - << "cudaMemcpy host to device failed: " << cudaGetErrorString(err); + size_t nbytes = host_x.size() * sizeof(float); + cudaError_t err = cudaMemcpy(x.data_ptr(), host_x.data(), nbytes, cudaMemcpyHostToDevice); + TVM_FFI_ICHECK_EQ(err, cudaSuccess) + << "cudaMemcpy host to device failed: " << cudaGetErrorString(err); - // Call into the FFI function; tensors remain on device because they carry a - // kDLCUDA device tag. - CallAddOne(x, y); + // Call into the FFI function; tensors remain on device because they carry a + // kDLCUDA device tag. + CallAddOne(x, y); - std::vector host_y(host_x.size()); - err = cudaMemcpy(host_y.data(), y.data_ptr(), nbytes, cudaMemcpyDeviceToHost); - TVM_FFI_ICHECK_EQ(err, cudaSuccess) - << "cudaMemcpy device to host failed: " << cudaGetErrorString(err); + std::vector host_y(host_x.size()); + err = cudaMemcpy(host_y.data(), y.data_ptr(), nbytes, cudaMemcpyDeviceToHost); + TVM_FFI_ICHECK_EQ(err, cudaSuccess) + << "cudaMemcpy device to host failed: " << cudaGetErrorString(err); - std::cout << "y after add_one_cuda(x, y)" << std::endl; - for (float value : host_y) { - std::cout << value << " "; - } - std::cout << std::endl; - return 0; + std::cout << "y after add_one_cuda(x, y)" << std::endl; + for (float value : host_y) { + std::cout << value << " "; + } + std::cout << std::endl; + return 0; } diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.sh b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.sh index dea07c95..3f110a4a 100755 --- a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.sh +++ b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_cpp_bundle.sh @@ -27,8 +27,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #!/bin/bash -CUDA_DIALECT_PATH="build/lib/" -export LD_LIBRARY_PATH=${CUDA_DIALECT_PATH}:`tvm-ffi-config --libdir` +# Set up library paths for runtime +export LD_LIBRARY_PATH=$(python3 -m cutlass.cute.export.aot_config --libdir):$(tvm-ffi-config --libdir) CUDA_HOME=/usr/local/cuda SOURCE_FILE="$(dirname "$0")/aot_use_in_cpp_bundle.cpp" @@ -38,11 +38,11 @@ g++ -o build/aot_use_in_cpp_bundle \ -I${CUDA_HOME}/include \ `tvm-ffi-config --cxxflags` \ ${SOURCE_FILE} build/add_one.o \ - -L${CUDA_DIALECT_PATH} \ + $(python3 -m cutlass.cute.export.aot_config --ldflags) \ -L${CUDA_HOME}/lib64 \ - -lcuda_dialect_runtime -lcuda -lcudart \ - `tvm-ffi-config --ldflags` \ - `tvm-ffi-config --libs` + $(python3 -m cutlass.cute.export.aot_config --libs) -lcuda -lcudart \ + $(tvm-ffi-config --ldflags) \ + $(tvm-ffi-config --libs) echo "Running the executable..." ./build/aot_use_in_cpp_bundle diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_jax.py b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_jax.py index 0aaebc1a..ce94567b 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_jax.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_jax.py @@ -37,7 +37,7 @@ def main(): a_jax = jnp.arange(10, dtype=jnp.float32) b_jax = jnp.zeros(10, dtype=jnp.float32) lib_path = "./build/add_one.so" - aot_mod = cute.runtime.load_module(lib_path) + aot_mod = cute.runtime.load_module(lib_path, enable_tvm_ffi=True) jax_tvm_ffi.register_ffi_target("add_one_cute", aot_mod.add_one, platform="gpu") b_jax = jax.ffi.ffi_call( "add_one_cute", diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_torch.py b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_torch.py index 20a224a9..62ed14b7 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_torch.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/aot_use_in_torch.py @@ -27,14 +27,16 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import cutlass.cute as cute -import torch + # now load it back def main(): + import torch + a_torch = torch.arange(10, dtype=torch.float32, device="cuda") b_torch = torch.zeros(10, dtype=torch.float32, device="cuda") lib_path = "./build/add_one.so" - aot_mod = cute.runtime.load_module(lib_path) + aot_mod = cute.runtime.load_module(lib_path, enable_tvm_ffi=True) aot_mod.add_one(a_torch, b_torch) print("result of b after aot_mod.add_one(a, b)") print(b_torch) diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/error_reporting.py b/examples/python/CuTeDSL/cute/tvm_ffi/error_reporting.py index 7a50a232..7b9bb275 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/error_reporting.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/error_reporting.py @@ -36,8 +36,9 @@ To run this example: .. code-block:: bash - python examples/cute/tvm_ffi/error_reporting.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/error_reporting.py """ + import torch import cutlass.cute as cute from cutlass.cute.runtime import from_dlpack diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_jax.py b/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_jax.py index 36b3e823..baf52f0b 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_jax.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_jax.py @@ -39,7 +39,7 @@ To run this example: pip install jax-tvm-ffi pip install jax[cuda13] - python examples/cute/tvm_ffi/jit_and_use_in_jax.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/jit_and_use_in_jax.py """ import jax diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_torch.py b/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_torch.py index be9867be..97404c15 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_torch.py +++ b/examples/python/CuTeDSL/cute/tvm_ffi/jit_and_use_in_torch.py @@ -36,9 +36,9 @@ To run this example: .. code-block:: bash - python examples/cute/tvm_ffi/jit_and_use_in_torch.py + python cutlass_ir/compiler/python/examples/cute/tvm_ffi/jit_and_use_in_torch.py """ -import torch + import cutlass.cute as cute from cutlass.cute.runtime import from_dlpack @@ -56,6 +56,8 @@ def add_one(a: cute.Tensor, b: cute.Tensor): def main(): + import torch + # compile the kernel with "--enable-tvm-ffi" option a_torch = torch.arange(10, dtype=torch.float32, device="cuda") b_torch = torch.zeros(10, dtype=torch.float32, device="cuda") diff --git a/examples/python/CuTeDSL/cute/tvm_ffi/requirements.txt b/examples/python/CuTeDSL/cute/tvm_ffi/requirements.txt index 8a3f9dcd..f3a147e5 100644 --- a/examples/python/CuTeDSL/cute/tvm_ffi/requirements.txt +++ b/examples/python/CuTeDSL/cute/tvm_ffi/requirements.txt @@ -1,2 +1,2 @@ apache-tvm-ffi -torch-c-dlpack-ext \ No newline at end of file +torch-c-dlpack-ext diff --git a/examples/python/CuTeDSL/jax/cutlass_call_basic.py b/examples/python/CuTeDSL/jax/cutlass_call_basic.py new file mode 100644 index 00000000..e1860403 --- /dev/null +++ b/examples/python/CuTeDSL/jax/cutlass_call_basic.py @@ -0,0 +1,260 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from functools import partial +import jax +import jax.numpy as jnp + +import cutlass +import cutlass.cute as cute +import cutlass.jax as cjax +import cuda.bindings.driver as cuda + +""" +Examples of calling CuTe DSL from jax.jit function using cutlass_call. + +cutlass_call is a Jax primitive the enables calling of CuTe DSL kernels within a +a jit-compiled Jax function. During the lowering process cutlass_call will +trigger compilation of the kernel and embed it into the HLO computation. It can +then be efficiently launched by XLA without callback to Python. + +This example assumes familiarity with CuTe DSL concepts such as layouts and +dynamic shapes. + +To run this example: + +.. code-block:: bash + + # Run with addition operation + python examples/jax/cutlass_call_basic.py +""" + + +# This is a typical CuTe DSL kernel function that accepts both tensor and scalar values. +@cute.jit +def launch( + A: cute.Tensor, + B: cute.Tensor, + x: cute.Int32, + y: cute.Int32, + C: cute.Tensor, + D: cute.Tensor, + stream: cuda.CUstream, +): + # Print layouts + print("A layout: ", A.layout) + print("B layout: ", B.layout) + print("C layout: ", C.layout) + print("D layout: ", D.layout) + cute.printf("A layout: {}", A.layout) + cute.printf("B layout: {}", B.layout) + cute.printf("C layout: {}", C.layout) + cute.printf("D layout: {}", D.layout) + cute.printf("") + + # Print non-tensor values + print("X is: ", x) + print("Y is: ", y) + cute.printf("X is: {}", x) + cute.printf("Y is: {}", y) + print() + + +# cutlass_call uses a fixed function signature to pass arguments between Jax and CuTeDSL kernel. +# +# Function Signature Requirement: +# stream, inputs, outputs, *, kwargs... +# +# The first argument must be the CUstream that the kernel is run. This stream is managed by the XLA runtime +# and is necessary to schedule and synchronize launches with the rest of your computation. +# +# The second set of arguments are the Jax arrays for inputs and outputs. Inputs must be passed before +# outputs. +# +# Lastly static arguments (i.e. static_argnums or static_argnames) values are passed as keyword only arguments +# by name. +# +# The the kernel does not match this signature a wrapper functions like the one shown below can be written +# or an inline lambda function can be used to rebind the arguments into the appropriate order. +@cute.jit +def launch_jax_wrapper( + stream: cuda.CUstream, + A: cute.Tensor, + B: cute.Tensor, + C: cute.Tensor, + D: cute.Tensor, + *, + x: cute.Int32, + y: cute.Int32, +): + launch(A, B, x, y, C, D, stream) + + +@cute.jit +def launch_aliased( + A: cute.Tensor, B: cute.Tensor, x: cute.Int32, y: cute.Int32, stream: cuda.CUstream +): + # Print layouts + print("A layout: ", A.layout) + print("B layout: ", B.layout) + cute.printf("A layout: {}", A.layout) + cute.printf("B layout: {}", B.layout) + cute.printf("") + + # Print non-tensor values + print("X is: ", x) + print("Y is: ", y) + cute.printf("X is: {}", x) + cute.printf("Y is: {}", y) + print() + + +if __name__ == "__main__": + + @partial(jax.jit, static_argnums=[2, 3]) + def run_cutlass_kernel(a, b, x, y): + call = cjax.cutlass_call( + launch_jax_wrapper, + # Jax requires output shapes/dtype information for each output + output_shape_dtype=( + jax.ShapeDtypeStruct(a.shape, a.dtype), + jax.ShapeDtypeStruct(b.shape, a.dtype), + ), + # Static jit arguments are passed via additional keyword arguments + x=x, + y=y, + ) + + # Returned value is a callable to invoke the kernel passing only jax arrays. + return call(a, b) + + print("\nExample: example_basic_call_from_jit") + A = jnp.zeros((512, 32, 64)) + B = jnp.zeros((1, 256, 64, 128)) + C, D = run_cutlass_kernel(A, B, 0, 1) + + @partial(jax.jit, static_argnums=[2, 3]) + def run_cutlass_kernel_lambda(a, b, x, y): + call = cjax.cutlass_call( + # A lambda function may be used to wrap and bind arguments passed by jax + # to the kernel. Alternatively you can wrap using another separate cute.jit + # function. + lambda stream, a, b, c, d, *, x, y: launch(a, b, x, y, c, d, stream), + # Jax requires output shapes/dtype information for each output + output_shape_dtype=( + jax.ShapeDtypeStruct(a.shape, a.dtype), + jax.ShapeDtypeStruct(b.shape, a.dtype), + ), + # Static jit arguments are passed via additional keyword arguments + x=x, + y=y, + ) + + # Returned value is a callable to invoke the kernel passing only jax arrays. + return call(a, b) + + print("\nExample: run_cutlass_kernel_lambda") + A = jnp.zeros((512, 32, 64)) + B = jnp.zeros((1, 256, 64, 128)) + C, D = run_cutlass_kernel_lambda(A, B, 1, 2) + + @partial(jax.jit, static_argnums=[2, 3]) + def run_cutlass_kernel_static_shapes(a, b, x, y): + call = cjax.cutlass_call( + lambda stream, a, b, c, d, *, x, y: launch(a, b, x, y, c, d, stream), + output_shape_dtype=( + jax.ShapeDtypeStruct(a.shape, a.dtype), + jax.ShapeDtypeStruct(b.shape, a.dtype), + ), + # By default cutlass_call will treat all tensors as dynamic shape. + # Dynamic shapes are often expected for kernels so this default ensures + # the broadest support. If you know that a kernel can accept fully static + # tensors then you can enable this flag to pass all tensors shapes and + # layouts known at compile time. + use_static_tensors=True, + x=x, + y=y, + ) + return call(a, b) + + print("\nExample: run_cutlass_kernel_static_shapes") + A = jnp.zeros((512, 32, 64)) + B = jnp.zeros((1, 256, 64, 128)) + C, D = run_cutlass_kernel_static_shapes(A, B, 3, 4) + + @partial(jax.jit, static_argnums=[2, 3]) + def run_cutlass_kernel_with_modes(a, b, x, y): + call = cjax.cutlass_call( + lambda stream, a, b, c, d, *, x, y: launch(a, b, x, y, c, d, stream), + output_shape_dtype=( + jax.ShapeDtypeStruct(a.shape, a.dtype), + jax.ShapeDtypeStruct(b.shape, a.dtype), + ), + # The modes of the layout for each tensor can be specified using the + # TensorSpec. By default modes will align with the physical layout + # but can be mapped to specific index position. If None is passed + # then the default mode is assumed for that tensor. + # + # Individual static/dynamic settings may also be applied. For example + # a specific tensor can be marked to have static shape. + input_spec=( + cjax.TensorSpec(mode=(1, 0, 2), static=True), + cjax.TensorSpec(mode=(3, 1, 2, 0)), + ), + output_spec=(None, cjax.TensorSpec(mode=(0, 1, 3, 2))), + x=x, + y=y, + ) + return call(a, b) + + print("\nExample: run_cutlass_kernel_with_modes") + A = jnp.zeros((512, 32, 64)) + B = jnp.zeros((1, 256, 64, 128)) + C, D = run_cutlass_kernel_with_modes(A, B, 5, 6) + + @partial(jax.jit, static_argnums=[2, 3], donate_argnums=[0, 1]) + def run_cutlass_kernel_aliased_outputs(a, b, x, y): + call = cjax.cutlass_call( + lambda stream, a, b, *, x, y: launch_aliased(a, b, x, y, stream), + output_shape_dtype=( + jax.ShapeDtypeStruct(a.shape, a.dtype), + jax.ShapeDtypeStruct(b.shape, b.dtype), + ), + # Can specify the input tensors that are aliasing outputs of this call. + # To avoid allocating separate output buffers. This is useful for kernels + # that update a tensor. + input_output_aliases={0: 0, 1: 1}, + x=x, + y=y, + ) + return call(a, b) + + print("\nExample: run_cutlass_kernel_aliased_outputs") + A = jnp.zeros((512, 32, 64)) + B = jnp.zeros((1, 256, 64, 128)) + A, B = run_cutlass_kernel_aliased_outputs(A, B, 7, 8) diff --git a/examples/python/CuTeDSL/jax/cutlass_call_export.py b/examples/python/CuTeDSL/jax/cutlass_call_export.py new file mode 100644 index 00000000..39a8baf1 --- /dev/null +++ b/examples/python/CuTeDSL/jax/cutlass_call_export.py @@ -0,0 +1,168 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import pytest +from functools import partial +import argparse + +import cuda.bindings.driver as cuda + +import cutlass +import cutlass.cute as cute + +import jax +import jax.numpy as jnp +from jax import export + +from cutlass.jax import cutlass_call, get_export_disabled_safety_checks +from cutlass.jax.testing import create_tensor + +""" +Examples of using jax.export APIs with functions using cutlass_call. + +This example demonstrates the use of jax.export with CuTe DSL kernel. It assumes +familiarity with CuTe DSL concepts such as layouts and dynamic shapes as well as +Jax's exporting and serialization features: +https://docs.jax.dev/en/latest/export/index.html#export + +To run this example: + +.. code-block:: bash + + # Run with defaults + python examples/jax/cutlass_call_export.py + + # Run with shape (1024, 512) + python examples/jax/cutlass_call_export.py --M 1024 --N 512 + + # Export with symbolic shapes. + python examples/jax/cutlass_call_export.py --export_symbolic +""" + + +@cute.kernel +def kernel(gA: cute.Tensor, gB: cute.Tensor, gC: cute.Tensor): + tidx, _, _ = cute.arch.thread_idx() + bidx, _, _ = cute.arch.block_idx() + bdim, _, _ = cute.arch.block_dim() + + thread_idx = bidx * bdim + tidx + + m, n = gA.shape + ni = thread_idx % n + mi = thread_idx // n + + a_val = gA[mi, ni] + b_val = gB[mi, ni] + gC[mi, ni] = a_val + b_val + + +@cute.jit +def launch(stream: cuda.CUstream, mA: cute.Tensor, mB: cute.Tensor, mC: cute.Tensor): + print("mA: ", mA.layout) + print("mB: ", mB.layout) + print("mC: ", mC.layout) + num_threads_per_block = 256 + m, n = mA.shape + kernel(mA, mB, mC).launch( + grid=((m * n) // num_threads_per_block, 1, 1), + block=(num_threads_per_block, 1, 1), + stream=stream, + ) + + +def run_example(M, N, export_symbolic_shapes): + @jax.jit + def f(a, b): + call = cutlass_call(launch, output_shape_dtype=a) + return jax.nn.sigmoid(call(a, b)) + + @jax.jit + def ref_f(a, b): + return jax.nn.sigmoid(a + b) + + # Symbolic or partially shapes are supported by cutlass_call and cute.Tensor + # This allows export of functions calling Cut eDSL kernels w/o having to re-compile + # the kernel for each new shape. + if export_symbolic_shapes: + a, b = export.symbolic_shape("a, b") + export_shape_dtype = jax.ShapeDtypeStruct((a, b), jnp.float32) + else: + export_shape_dtype = jax.ShapeDtypeStruct((M, N), jnp.float32) + + print("Exporting with input signature: ") + print(f"({export_shape_dtype}, {export_shape_dtype})") + + # jax.export can be used to export a jit function containing cutlass_call. + # The function get_export_disabled_safety_checks() returns a list of custom + # call targets that are used by cutlass_call not part of Jax's built-in + # list of stable custom calls. + exported = jax.export.export(f, disabled_checks=get_export_disabled_safety_checks()) + traced = exported(export_shape_dtype, export_shape_dtype) + + # Serialize the computation to a byte blob. + blob = traced.serialize() + print(f"Serialized computation is {len(blob)} bytes.") + + # Deserialize and run + rehydrated = export.deserialize(blob) + + key = jax.random.key(1123) + a_key, b_key = jax.random.split(key, 2) + + a = create_tensor((M, N), dtype=jnp.float32, key=a_key) + b = create_tensor((M, N), dtype=jnp.float32, key=b_key) + c = rehydrated.call(a, b) + assert jnp.allclose(c, ref_f(a, b)) + + # If the computation was exported with dynamic shapes then we can also + # call it with different shapes. The kernel will not be re-compiled + # even though the shapes are changing. + if export_symbolic_shapes: + a = create_tensor((M * 2, N * 4), dtype=jnp.float32, key=a_key) + b = create_tensor((M * 2, N * 4), dtype=jnp.float32, key=b_key) + c = rehydrated.call(a, b) + assert jnp.allclose(c, ref_f(a, b)) + + a = create_tensor((M * 4, N * 4), dtype=jnp.float32, key=a_key) + b = create_tensor((M * 4, N * 4), dtype=jnp.float32, key=b_key) + c = rehydrated.call(a, b) + assert jnp.allclose(c, ref_f(a, b)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Demonstration of using jax.export with functions with cutlass_call" + ) + parser.add_argument("--M", default=512, type=int) + parser.add_argument("--N", default=256, type=int) + parser.add_argument("--export_symbolic", action="store_true") + + args = parser.parse_args() + run_example(args.M, args.N, args.export_symbolic) + print("PASS") diff --git a/examples/python/CuTeDSL/jax/cutlass_call_sharding.py b/examples/python/CuTeDSL/jax/cutlass_call_sharding.py new file mode 100644 index 00000000..a2d03c34 --- /dev/null +++ b/examples/python/CuTeDSL/jax/cutlass_call_sharding.py @@ -0,0 +1,140 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from functools import partial +import argparse + +import jax +import jax.numpy as jnp +from jax.sharding import Mesh, NamedSharding, PartitionSpec as P +from jax.experimental.custom_partitioning import custom_partitioning + +import cutlass +import cutlass.cute as cute +import cutlass.jax as cjax +from cutlass.jax.testing import create_tensor +import cuda.bindings.driver as cuda + + +""" +Examples of combining jax.jit and jax.shard_map for sharding and executing kernels +across multiple GPU devices. + +To run this example: + +.. code-block:: bash + + # Run with addition operation + python examples/jax/cutlass_call_sharding.py +""" + + +@cute.kernel +def kernel(a: cute.Tensor, b: cute.Tensor, c: cute.Tensor): + tidx, _, _ = cute.arch.thread_idx() + bidx, _, _ = cute.arch.block_idx() + + frgA = cute.make_rmem_tensor(cute.size(a, mode=[0]), a.element_type) + frgB = cute.make_rmem_tensor(cute.size(b, mode=[0]), b.element_type) + frgC = cute.make_rmem_tensor(cute.size(c, mode=[0]), c.element_type) + + cute.autovec_copy(a[None, tidx, bidx], frgA) + cute.autovec_copy(b[None, tidx, bidx], frgB) + frgC.store(frgA.load() + frgB.load()) + cute.autovec_copy(frgC, c[None, tidx, bidx]) + + +@cute.jit +def launch( + stream: cuda.CUstream, + a: cute.Tensor, + b: cute.Tensor, + c: cute.Tensor, +): + cute.printf("a: {}", a.layout) + cute.printf("b: {}", b.layout) + cute.printf("c: {}", c.layout) + kernel(a, b, c).launch( + grid=[a.shape[-1], 1, 1], block=[a.shape[-2], 1, 1], stream=stream + ) + + +def run_example(): + # Create a device mesh with one axis b + ngpu = jax.device_count() + mesh = jax.make_mesh((ngpu,), "b") + + if ngpu == 1: + print("Note: only 1 GPU was detected.") + + # We will shard our 3D tensors over b + sharding = P("b", None, None) + + @partial(jax.jit, static_argnums=[0, 1]) + def allocate_sharded_tensors(shape, dtype): + key = jax.random.key(1123) + a_key, b_keys = jax.random.split(key, 2) + a = create_tensor(shape, dtype, a_key) + b = create_tensor(shape, dtype, b_keys) + a = jax.lax.with_sharding_constraint(a, NamedSharding(mesh, sharding)) + b = jax.lax.with_sharding_constraint(b, NamedSharding(mesh, sharding)) + return a, b + + @jax.jit + def compute(a, b): + # This jax.shard_map partitions the cutlass_call over the mesh. + @partial( + jax.shard_map, + mesh=mesh, + in_specs=(sharding, sharding), + out_specs=(sharding, sharding), + ) + def sharded_call(a_block, b_block): + call = cjax.cutlass_call( + launch, + use_static_tensors=True, + output_shape_dtype=jax.ShapeDtypeStruct(a_block.shape, a_block.dtype), + ) + ref_result = a_block + b_block + return call(a_block, b_block), ref_result + + return sharded_call(a, b) + + # Allocate (32, 16, 64) on each GPU + shape = (32 * ngpu, 16, 64) + dtype = jnp.float32 + + a, b = allocate_sharded_tensors(shape, dtype) + c, c_ref = compute(a, b) + + assert jnp.allclose(c, c_ref) + + +if __name__ == "__main__": + run_example() + print("PASS") diff --git a/examples/python/CuTeDSL/jax/elementwise_apply_example.py b/examples/python/CuTeDSL/jax/elementwise_apply_example.py new file mode 100644 index 00000000..c958d09c --- /dev/null +++ b/examples/python/CuTeDSL/jax/elementwise_apply_example.py @@ -0,0 +1,329 @@ +# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +import argparse +import operator +from functools import partial +from typing import List, Type + +import cuda.bindings.driver as cuda +import cutlass +import cutlass.cute as cute + +""" +An Elementwise Apply Example using CuTe DSL with cutlass.jax.cutlass_call + +This example is similar to examples/ampere/elementwise_apply.py but demonstrates +how to run the code in a jax specific way using the cutlass_call primitive. It assumes +familiarity with basic CuTe DSL concepts as well as the cutlass_call primitive. + +To run this example: + +.. code-block:: bash + + # Run with addition operation + python examples/jax/elementwise_apply_example.py --M 1024 --N 512 --op add + + # Run with multiplication operation + python examples/ampere/elementwise_apply_example.py --M 1024 --N 512 --op mul + + # Run with subtraction operation + python examples/ampere/elementwise_apply_example.py --M 1024 --N 512 --op sub +""" + + +@cute.kernel +def elementwise_apply_kernel( + op: cutlass.Constexpr, + mInputs: List[cute.Tensor], + mC: cute.Tensor, + cC: cute.Tensor, # coordinate tensor + shape: cute.Shape, + tv_layout: cute.Layout, # (tid, vid) -> logic coord +): + tidx, _, _ = cute.arch.thread_idx() + bidx, bidy, _ = cute.arch.block_idx() + + ############################################################################### + # Slice to local tile of thread block + ############################################################################### + blk_crd = ((None, None), (bidx, bidy)) + + # Leverage the meta-programming capability of the DSL to slice the tensors for each input + # All for loops below on input tensors would be fully unrolled automatically at compile time + # logical coord -> memory address + gInputs = [t[blk_crd] for t in mInputs] # (TileM, TileN) + gC = mC[blk_crd] # (TileM, TileN) + gCrd = cC[blk_crd] # (TileM, TileN) + + print("[DSL INFO] Sliced Tensors per thread block:") + for i in cutlass.range_constexpr(len(gInputs)): + print(f"[DSL INFO] ctaInputs{i} = {gInputs[i].type}") + print(f"[DSL INFO] gC = {gC.type}") + print(f"[DSL INFO] gCrd = {gCrd.type}") + + ############################################################################### + # Compose with thread block TV layout to map thread & value indices to memory address + ############################################################################### + # (tid, vid) -> memory address + tidfrgInputs = [cute.composition(t, tv_layout) for t in gInputs] + tidfrgC = cute.composition(gC, tv_layout) + tidfrgCrd = cute.composition(gCrd, tv_layout) + + # repeat None like vid to remove hierarchy of layout + thr_crd = (tidx, cute.repeat_like(None, tidfrgInputs[0][1])) + + ############################################################################### + # Slice to local tile of thread + ############################################################################### + # vid -> address + thrInputs = [t[thr_crd] for t in tidfrgInputs] # (V) + thrC = tidfrgC[thr_crd] # (V) + thrCrd = tidfrgCrd[thr_crd] + + print("[DSL INFO] Sliced Tensors per thread:") + for i in cutlass.range_constexpr(len(thrInputs)): + print(f"[DSL INFO] thrInputs{i} = {thrInputs[i].type}") + print(f"[DSL INFO] thrC = {thrC.type}") + print(f"[DSL INFO] thrCrd = {thrCrd.type}") + + ############################################################################### + # Compute predicate for out of boundary checks + ############################################################################### + frgPred = cute.make_fragment(thrCrd.shape, cutlass.Boolean) + print(f"[DSL INFO] frgPred = {frgPred.type}") + + for i in cutlass.range_constexpr(cute.size(frgPred)): + frgPred[i] = cute.elem_less(thrCrd[i], shape) + + # if tidx == 0 and bidx == 0: + # cute.print_tensor(frgPred) + + ########################################################## + # Load data and compute result + ########################################################## + + # Load data before use. The compiler will optimize the copy and load + # operations to convert some memory ld/st into register uses. + result = op(*[thrInput.load() for thrInput in thrInputs]) + thrC.store(result) + + +@cute.jit +def elementwise_apply( + op: cutlass.Constexpr, inputs, result: cute.Tensor, stream: cuda.CUstream +): + """CUDA kernel applying binary operator on each element of two n-D input tensors in + CuTe Python and store to result tensor. + + :param op: Binary operator or lambda function to apply element-wise + :type op: cutlass.Constexpr + :param a: First input tensor + :type a: cute.Tensor + :param b: Second input tensor + :type b: cute.Tensor + :param result: Output tensor to store the results of op(a, b) + :type result: cute.Tensor + :return: None + :rtype: None + """ + + # Baseline: naive TV layout + # * mA layout: (4096, 4096):(4096, 1) + # * TV layout map to (512, 4) tile + # * tidx maps to mode-0 but input layout is contiguous on mode-1, performance will be bad + # tv_layout = cute.make_layout((128, (4, 4)), stride=(4, (512, 1))) + # cta_tiler = (512, 4) + + # Opt-1: better TV layout with better 1D thread layout (SOL with 1D thread layout) + # * mA layout: (4096, 4096):(4096, 1) + # * TV layout map to (4, 512) tile + # * tidx maps to mode-1 which is leading mode of input tensor for coalesced load + # tv_layout = cute.make_layout((128, (4, 4)), stride=(16, (4, 1))) + # cta_tiler = (4, 512) + + # Opt-2: 2D tile but worse + # * mA layout: (4096, 4096):(4096, 1) + # * TV layout map to (128, 16) logical tile + # * V layout is bad as contiguous mode is not on right-most + # * `cute.copy` only supports vectorize when stride-1 of v-layout on right-most ) + # tv_layout = cute.make_layout(((32, 4), (4, 4)), stride=((4, 512), (1, 128))) + # cta_tiler = (128, 16) + + # Opt-3: SOL with 2D thread tile + # * mA layout: (4096, 4096):(4096, 1) + # * TV layout map to (64, 256) logical tile + # * tidx maps to mode-1 and input layout is contiguous on mode-1 for coalesced load-store + + # Use 128bit(16B) load as canonicalized form of val_layout then recast to target element-type + coalesced_ldst_bytes = 16 + + # Compile time validation: expect same element type for all input tensors + assert all(t.element_type == inputs[0].element_type for t in inputs) + dtype = inputs[0].element_type + + thr_layout = cute.make_ordered_layout((4, 64), order=(1, 0)) + val_layout = cute.make_ordered_layout((16, coalesced_ldst_bytes), order=(1, 0)) + val_layout = cute.recast_layout(dtype.width, 8, val_layout) + tiler_mn, tv_layout = cute.make_layout_tv(thr_layout, val_layout) + + print("[DSL INFO] Input Tensors:") + for i, t in enumerate(inputs): + print(f"[DSL INFO] inputs{i} = {t}") + print(f"[DSL INFO] result = {result}") + + print("[DSL INFO] Tiling Parameters:") + print(f"[DSL INFO] tiler_mn = {tiler_mn} per thread block") + print(f"[DSL INFO] tv_layout = {tv_layout}") + + print("[DSL INFO] Tiled Tensors:") + mInputs = [cute.zipped_divide(input, tiler_mn) for input in inputs] + # ((TileM, TileN), (RestM, RestN)) + mC = cute.zipped_divide(result, tiler_mn) + + # (RestM, RestN) -> (RestN, RestM) + remap_block = cute.make_ordered_layout( + cute.select(mInputs[0].shape[1], mode=[1, 0]), order=(1, 0) + ) + for i, t in enumerate(mInputs): + print(f"[DSL INFO] gInputs{i} = {mInputs[i]}") + mInputs[i] = cute.composition(t, (None, remap_block)) + print(f"[DSL INFO] gInputs{i} (remapped) = {mInputs[i]}") + + mC = cute.composition(mC, (None, remap_block)) + print(f"[DSL INFO] gC = {mC}") + + idC = cute.make_identity_tensor(result.shape) + cC = cute.zipped_divide(idC, tiler=tiler_mn) + print(f"[DSL INFO] coord tensor = {cC}") + + # Launch the kernel asynchronously + # Group input tensors into a list as a single argument + elementwise_apply_kernel(op, mInputs, mC, cC, result.shape, tv_layout).launch( + # Compute production at each mode of mC.shape[1] to get multi-dimensional grid size + grid=cute.product_each(mC.shape[1]), + block=[cute.size(tv_layout, mode=[0]), 1, 1], + stream=stream, + ) + + +@cutlass.dsl_user_op +def leaky_relu(x, alpha, *, loc=None, ip=None): + return cute.where(x > 0, x, alpha * x, loc=loc, ip=ip) + + +def leaky_relu_ref(x, alpha): + import jax.numpy as jnp + + return jnp.where(x > 0, x, alpha * x) + + +def run_and_verify(op, M, N, dtype, skip_ref_check=False): + import jax + import jax.numpy as jnp + import cutlass.jax as cjax + import cutlass.jax.testing as testing + + if op == "leaky_relu": + op = partial(leaky_relu, alpha=0.01) + ref_op = partial(leaky_relu_ref, alpha=0.01) + num_inputs = 1 + else: + op = getattr(operator, op) + ref_op = op + num_inputs = 2 + + # This jax function is transformed using jax.jit to compile its contents + # into an efficient HLO executable. + @partial(jax.jit, static_argnums=[1]) + def jax_function(inputs, op): + call = cjax.cutlass_call( + # Bind jax arguments to kernel signature + lambda stream, inputs, output, *, op: elementwise_apply( + op, inputs, output, stream + ), + # Specify output shape/dtype of result + output_shape_dtype=jax.ShapeDtypeStruct(inputs[0].shape, inputs[0].dtype), + # Pass static/constexpr values as kwargs + op=op, + ) + + # Call the kernel! + return call(inputs) + + @partial(jax.jit, static_argnums=[1]) + def jax_ref_function(inputs, op): + return op(*inputs) + + print("\nRunning Elementwise Apply test with:") + print(f"Tensor dimensions: [{M}, {N}]") + print(f"Input and Output Data type: {dtype}") + + jax_dtype = cjax.cutlass_to_jax_dtype(dtype) + keys = jax.random.split(jax.random.key(1435), num_inputs) + inputs = [testing.create_tensor((M, N), jax_dtype, key) for key in keys] + + print("Input tensor shapes:") + for i in range(num_inputs): + print(f"inputs[{i}]: {inputs[i].shape}, dtype: {inputs[i].dtype}") + + epsilon = 1.2 + if op in (operator.truediv, operator.floordiv): + inputs[1] = jnp.where(inputs[1] == 0, epsilon, inputs[1]) + + # Call the jax.jit function which will compile the kernel + c = jax_function(inputs, op) + + if not skip_ref_check: + print("Executing elementwise apply kernel...") + c = jax_function(inputs, op) + print("Verifying results...") + assert jnp.allclose(ref_op(*inputs), c) + print("Results verified successfully!") + print(f"First few elements of result: \n{c[:3, :3]}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Demonstration of calling a kernel with cutlass_call" + ) + parser.add_argument("--M", default=4096, type=int) + parser.add_argument("--N", default=4096, type=int) + parser.add_argument("--op", default="add", type=str) + parser.add_argument("--skip_ref_check", action="store_true") + + args = parser.parse_args() + run_and_verify( + args.op, + args.M, + args.N, + dtype=cutlass.Float32, + skip_ref_check=args.skip_ref_check, + ) + print("\nPASS") diff --git a/include/cute/arch/config.hpp b/include/cute/arch/config.hpp index 8d03794c..d9cecf9f 100644 --- a/include/cute/arch/config.hpp +++ b/include/cute/arch/config.hpp @@ -164,6 +164,9 @@ # define CUTE_ARCH_MXF4NVF4_2X_UE8M0_MMA_ENABLED # define CUTE_ARCH_MXF4NVF4_4X_UE4M3_MMA_ENABLED # endif +# if (__CUDACC_VER_MAJOR__ == 13 && __CUDACC_VER_MINOR__ >= 1) +# define CUTE_ARCH_MXF4NVF4_4X_UE8M0_MMA_ENABLED +# endif #endif #if defined(CUTLASS_ARCH_MMA_SM100F_ENABLED) || defined(CUTLASS_ARCH_MMA_SM103F_ENABLED) diff --git a/include/cute/arch/mma_sm100_desc.hpp b/include/cute/arch/mma_sm100_desc.hpp index 6abc527c..887b5896 100644 --- a/include/cute/arch/mma_sm100_desc.hpp +++ b/include/cute/arch/mma_sm100_desc.hpp @@ -449,7 +449,7 @@ union InstrDescriptorBlockScaled : 1, // b_sf_id_ : 2, // bit [ 4, 6) : Matrix B Scale Factor ID : 1, // - a_format_ : 3, // bit [ 7,10) : MXF8F6F4Format:0 = E4M3, 1 = E5M2, 3 = E2M3, 4 = E3M2, 5 = E2M1. F32F16Format: 0 = F16, 1 = BF16, 2 = TF32. S8: 0 unsigned 8 bit, 1 signed 8 bit. BMMA: 0 Boolean + a_format_ : 3, // bit [ 7, 10): MXF8F6F4Format:0 = E4M3, 1 = E5M2, 3 = E2M3, 4 = E3M2, 5 = E2M1. F32F16Format: 0 = F16, 1 = BF16, 2 = TF32. S8: 0 unsigned 8 bit, 1 signed 8 bit. BMMA: 0 Boolean b_format_ : 3, // bit [10,13) : MXF8F6F4Format:0 = E4M3, 1 = E5M2, 3 = E2M3, 4 = E3M2, 5 = E2M1. F32F16Format: 0 = F16, 1 = BF16, 2 = TF32. S8: 0 unsigned 8 bit, 1 signed 8 bit. BMMA: 0 Boolean a_negate_ : 1, // bit [13,14) : 0 = no negate. 1 = negate. 1 value valid only for F32F16Format and MXF8F6F4Format b_negate_ : 1, // bit [14,15) : 0 = no negate. 1 = negate. 1 value valid only for F32F16Format and MXF8F6F4Format diff --git a/include/cute/arch/mma_sm100_umma.hpp b/include/cute/arch/mma_sm100_umma.hpp index 5e611182..d7dfb715 100644 --- a/include/cute/arch/mma_sm100_umma.hpp +++ b/include/cute/arch/mma_sm100_umma.hpp @@ -208,6 +208,91 @@ struct SM100_MMA_F16BF16_TS } }; +template +struct SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN +{ + static_assert(M == 64 || M == 128, "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN M-mode size should be 64 or 128 for 1 CTA cluster MMA."); + static_assert((M == 64 && (N % 8 == 0) && (8 <= N) && (N <= 256)) || + (M == 128 && (N % 16 == 0) && (16 <= N) && (N <= 256)), + "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN N-mode size should be a multiple of 8 between 8 and 256 for M=64,\ + or a multiple of 16 between 16 and 256 for M=128."); + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN A from TMEM can't be transposed"); + static_assert(b_major == UMMA::Major::K, "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN B from SMEM requires non-transpose"); + + using DRegisters = void; + using ARegisters = uint32_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint32_t const& tmem_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& scaleC, + uint64_t const& idescE) + { +#if defined(CUTE_ARCH_TCGEN05_TF32_MMA_ENABLED) + if (cute::elect_one_sync()) { + uint32_t mask[4] = {0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::1.kind::tf32 [%0], [%1], %2, %3, {%5, %6, %7, %8}, p; \n\t" + "}\n" + : + : "r"(tmem_c), "r"(tmem_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(scaleC), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3])); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN without CUTE_ARCH_TCGEN05_TF32_MMA_ENABLED"); +#endif + } +}; + +template +struct SM100_MMA_TF32_SS_SCALED +{ + static_assert(M == 64 || M == 128, "SM100_MMA_TF32_SS_SCALED M-mode size should be 64 or 128 for 1 CTA cluster MMA."); + static_assert((N % 8 == 0) && (8 <= N) && (N <= 256), + "SM100_MMA_TF32_SS_SCALED N-mode size should be a multiple of 8 between 8 and 256."); + + using DRegisters = void; + using ARegisters = uint64_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint64_t const& desc_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& accumulate, + uint64_t const& idescE) + { +#if defined(CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED) + if (cute::elect_one_sync()) { + // ScaleC input should be a literal or compile time constant + uint32_t mask[4] = {0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::1.kind::tf32 [%0], %1, %2, %3, {%5, %6, %7, %8}, p, %9; \n\t" + "}\n" + : + : "r"(tmem_c), "l"(desc_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(accumulate), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3]), "n"(ScaleC)); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_SS_SCALED without CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED"); +#endif + } +}; + template @@ -249,6 +334,51 @@ struct SM100_MMA_F16BF16_SS_SCALED } }; +template +struct SM100_MMA_TF32_TS_SCALED +{ + static_assert(M == 64 || M == 128, "SM100_MMA_TF32_TS_SCALED M-mode size should be 64 or 128 for 1 CTA cluster MMA."); + static_assert((M == 64 && (N % 8 == 0) && (8 <= N) && (N <= 256)) || + (M == 128 && (N % 16 == 0) && (16 <= N) && (N <= 256)), + "SM100_MMA_TF32_TS_SCALED N-mode size should be a multiple of 8 between 8 and 256 for M=64,\ + or a multiple of 16 between 16 and 256 for M=128."); + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_TS_SCALED A from TMEM can't be transposed"); + + using DRegisters = void; + using ARegisters = uint32_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint32_t const& tmem_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& accumulate, + uint64_t const& idescE) + { +#if defined(CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED) + if (cute::elect_one_sync()) { + // ScaleC input should be a literal or compile time constant + uint32_t mask[4] = {0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::1.kind::tf32 [%0], [%1], %2, %3, {%5, %6, %7, %8}, p, %9; \n\t" + "}\n" + : + : "r"(tmem_c), "r"(tmem_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(accumulate), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3]), "n"(ScaleC)); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_TS_SCALED without CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED"); +#endif + } +}; + template +struct SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN +{ + static_assert(M == 128 || M == 256, "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN M-mode size should be 128 or 256 for 2 CTA cluster MMA."); + static_assert((N % 32 == 0) && (32 <= N) && (N <= 256), "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN N-mode size should be a multiple of 32 between 32 and 256."); + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN A from TMEM can't be transposed"); + static_assert(b_major == UMMA::Major::K, "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN B from SMEM requires non-transpose"); + + using DRegisters = void; + using ARegisters = uint32_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint32_t const& tmem_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& scaleC, + uint64_t const& idescE) + { +#if defined(CUTE_ARCH_TCGEN05_TF32_MMA_ENABLED) + if (cute::elect_one_sync()) { + uint32_t mask[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::2.kind::tf32 [%0], [%1], %2, %3, {%5, %6, %7, %8, %9, %10, %11, %12}, p; \n\t" + "}\n" + : + : "r"(tmem_c), "r"(tmem_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(scaleC), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3]), + "r"(mask[4]), "r"(mask[5]), "r"(mask[6]), "r"(mask[7])); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN without CUTE_ARCH_TCGEN05_TF32_MMA_ENABLED"); +#endif + } +}; + +template +struct SM100_MMA_TF32_2x1SM_SS_SCALED +{ + static_assert(M == 128 || M == 256, "SM100_MMA_TF32_2x1SM_SS_SCALED M-mode size should be 128 or 256 for 2 CTA cluster MMA."); + static_assert((N % 16 == 0) && (16 <= N) && (N <= 256), "SM100_MMA_TF32_2x1SM_SS_SCALED N-mode size should be a multiple of 16 between 16 and 256."); + + using DRegisters = void; + using ARegisters = uint64_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint64_t const& desc_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& accumulate, + uint64_t const& idescE) + { +#if defined(CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED) + if (cute::elect_one_sync()) { + // ScaleC input should be a literal or compile time constant + uint32_t mask[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::2.kind::tf32 [%0], %1, %2, %3, {%5, %6, %7, %8, %9, %10, %11, %12}, p, %13; \n\t" + "}\n" + : + : "r"(tmem_c), "l"(desc_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(accumulate), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3]), + "r"(mask[4]), "r"(mask[5]), "r"(mask[6]), "r"(mask[7]), "n"(ScaleC)); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_2x1SM_SS_SCALED without CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED"); +#endif + } +}; + template @@ -581,6 +794,49 @@ struct SM100_MMA_F16BF16_2x1SM_SS_SCALED } }; +template +struct SM100_MMA_TF32_2x1SM_TS_SCALED +{ + static_assert(M == 128 || M == 256, "SM100_MMA_TF32_2x1SM_TS_SCALED M-mode size should be 128 or 256 for 2 CTA cluster MMA."); + static_assert((N % 32 == 0) && (32 <= N) && (N <= 256), "SM100_MMA_TF32_2x1SM_TS_SCALED N-mode size should be a multiple of 32 between 32 and 256."); + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_2x1SM_TS_SCALED A from TMEM can't be transposed"); + + using DRegisters = void; + using ARegisters = uint32_t[1]; + using BRegisters = uint64_t[1]; + using CRegisters = uint32_t[1]; + + CUTE_HOST_DEVICE static void + fma(uint32_t const& tmem_a, + uint64_t const& desc_b, + uint32_t const& tmem_c, + uint32_t const& accumulate, + uint64_t idescE) + { +#if defined(CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED) + if (cute::elect_one_sync()) { + // ScaleC input should be a literal or compile time constant + uint32_t mask[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + asm volatile( + "{\n\t" + ".reg .pred p;\n\t" + "setp.ne.b32 p, %4, 0;\n\t" + "tcgen05.mma.cta_group::2.kind::tf32 [%0], [%1], %2, %3, {%5, %6, %7, %8, %9, %10, %11, %12}, p, %13; \n\t" + "}\n" + : + : "r"(tmem_c), "r"(tmem_a), "l"(desc_b), "r"(uint32_t(idescE>>32)), "r"(accumulate), + "r"(mask[0]), "r"(mask[1]), "r"(mask[2]), "r"(mask[3]), + "r"(mask[4]), "r"(mask[5]), "r"(mask[6]), "r"(mask[7]), "n"(ScaleC)); + } +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM100_MMA_TF32_2x1SM_TS_SCALED without CUTE_ARCH_TCGEN05_UTFMMA_SCALED_ENABLED"); +#endif + } +}; + template static constexpr uint16_t bidB = 0; CUTE_STATIC_ASSERT(VS == 16 || VS == 32, "Scaling factor vector size has to be 16 or 32 for MXF4NVF4 MMA."); + if constexpr ( VS == 16 ) { +#if defined(CUTE_ARCH_MXF4NVF4_4X_UE8M0_MMA_ENABLED) + asm volatile( + "mma.sync.aligned.m16n8k64.row.col.kind::mxf4nvf4.block_scale.scale_vec::4X.f32.e2m1.e2m1.f32.ue8m0 " + "{%0, %1, %2, %3}," + "{%4, %5, %6, %7}," + "{%8, %9}," + "{%10, %11, %12, %13}," + "{%14}," + "{%15, %16}," + "{%17}," + "{%18, %19};\n" + : "=f"(d0), "=f"(d1), "=f"(d2), "=f"(d3) + : "r"(a0), "r"(a1), "r"(a2), "r"(a3), + "r"(b0), "r"(b1), + "f"(c0), "f"(c1), "f"(c2), "f"(c3), + "r"(uint32_t(sfa0)) , "h"(bidA), "h"(tidA), + "r"(uint32_t(sfb0)) , "h"(bidB), "h"(tidB)); +#else + CUTE_INVALID_CONTROL_PATH("Attempting to use SM120::BLOCKSCALED::SM120_16x8x64_TN_VS without CUTE_ARCH_MXF4NVF4_4X_UE8M0_MMA_ENABLED"); +#endif + } else if constexpr ( VS == 32 ) { + #if defined(CUTE_ARCH_MXF4NVF4_2X_UE8M0_MMA_ENABLED) asm volatile( "mma.sync.aligned.kind::mxf4nvf4.block_scale.scale_vec::2X.m16n8k64.row.col.f32.e2m1.e2m1.f32.ue8m0 " @@ -3151,6 +3174,7 @@ struct SM120_16x8x64_TN_VS #else CUTE_INVALID_CONTROL_PATH("Attempting to use SM120::BLOCKSCALED::SM120_16x8x64_TN_VS without CUTE_ARCH_MXF4NVF4_2X_UE8M0_MMA_ENABLED"); #endif + } } }; diff --git a/include/cute/arch/mma_sm120_sparse.hpp b/include/cute/arch/mma_sm120_sparse.hpp index 297ea3b5..a95af101 100644 --- a/include/cute/arch/mma_sm120_sparse.hpp +++ b/include/cute/arch/mma_sm120_sparse.hpp @@ -3324,6 +3324,28 @@ struct SM120_SPARSE_16x8x128_TN_VS struct AuxTmaParams { using GmemStrides = GmemTmaBasisStrides_; // Strides for Gmem mode -> Tma coord mode, may be dynamic GmemStrides g_stride_; - using TmaGmemBasis = TmaGmemBasis_; // Layout for Tma box shape -> Gmem mode(s), always static - static_assert(is_static::value); + using TmaGmemBasis = TmaGmemBasis_; // Layout for Tma box shape -> Gmem mode(s) + // By default, TmaGmemBasis produced by construct_tma_gbasis is fully static. + // The user may construct a dynamic gbasis manually (e.g. to represent smem box with dynamic shape). + // In that case they will need to pass it around via other means. + // We avoid passing it as a data member to avoid ABI impact. + // static_assert(is_static::value); using TmaSwizzle = TmaSwizzle_; // Tma swizzle, always Swizzle static_assert(is_static::value); }; @@ -70,7 +74,7 @@ struct TMA_LOAD_Unpack { static_assert(is_smem::value, "SM90_TMA_LOAD requires the destination be shared memory."); - auto src_coord = src.data().coord_; + auto src_coord = src(Int<0>{}); void* dst_ptr = cute::raw_pointer_cast(dst.data()); #if 0 auto [c0,c1,c2,c3,c4] = append<5>(src_coord, 0); @@ -237,7 +241,7 @@ struct Copy_Traits Tensor const& src, Tensor & dst) { - auto src_coord = src.data().coord_; + auto src_coord = src(Int<0>{}); return detail::explode_tuple(detail::CallCOPY{}, traits.opargs_, tuple_seq{}, src_coord, tuple_seq{}); @@ -405,7 +409,7 @@ struct Copy_Traits void const* const desc_ptr = &(traits.tma_desc_); void const* const src_ptr = cute::raw_pointer_cast(src.data()); - auto dst_coord = dst.data().coord_; + auto dst_coord = dst(Int<0>{}); #if 0 auto [c0,c1,c2,c3,c4] = append<5>(dst_coord, 0); printf("THR (%d,%d,%d) BLK (%d,%d,%d) TMACRD (%d,%d,%d,%d,%d) SMEMADDR (%p)\n", @@ -446,7 +450,7 @@ struct Copy_Traits void const* const desc_ptr = traits.tma_desc_; void const* const src_ptr = cute::raw_pointer_cast(src.data()); - auto dst_coord = dst.data().coord_; + auto dst_coord = dst(Int<0>{}); #if 0 auto [c0,c1,c2,c3,c4] = append<5>(dst_coord, 0); printf("THR (%d,%d,%d) BLK (%d,%d,%d) TMACRD (%d,%d,%d,%d,%d) SMEMADDR (%p)\n", @@ -531,7 +535,8 @@ struct Copy_Traits static_assert(is_smem::value, "Expected smem src for SM90_TMA_REDUCE_ADD"); //static_assert(is_gmem::value, "Expected gmem dst for SM90_TMA_REDUCE_ADD"); // TMA spoofed src tensor - traits.copy_unpack_(cute::raw_pointer_cast(src.data()), dst.data().coord_, tuple_seq{}); + auto dst_coord = dst(Int<0>{}); + traits.copy_unpack_(cute::raw_pointer_cast(src.data()), dst_coord, tuple_seq{}); } }; diff --git a/include/cute/atom/mma_traits_sm100.hpp b/include/cute/atom/mma_traits_sm100.hpp index e9fcd725..c9b42a8f 100644 --- a/include/cute/atom/mma_traits_sm100.hpp +++ b/include/cute/atom/mma_traits_sm100.hpp @@ -1353,6 +1353,186 @@ struct MMA_Traits scaleC) const { return {accumulate, idesc_}; } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + +// Special instantiation for interleaved complex (emulated) +template +struct MMA_Traits, cutlass::complex, float, + M, N, a_major, b_major, + ScaleC, a_neg, b_neg>> +{ + static_assert(cute::sizeof_bits_v == 16, "Only supports 16bit base types"); + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::smem_desc; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_1sm; + + // Logical shape-K is always 256bits, transform to units of elements + static constexpr int K = 256 / cute::sizeof_bits::value; + + static constexpr uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_1>; + using ALayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + ab_vtype, ab_vtype, float, M, N, a_major, b_major, a_neg, b_neg>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint64_t desc_a = A[0]; + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_F16BF16_SS_SCALED::fma(desc_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + +template +struct MMA_Traits> +{ + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + static_assert(cute::sizeof_bits_v == cute::sizeof_bits_v && cute::sizeof_bits_v == 32, "SM100_MMA_TF32_TS_SCALED supports 32bit types"); + + using FrgTypeA = UMMA::tmem_frg_1sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_1sm; + + // Logical shape-K is always 256 bits; transform to units of elements + static constexpr int K = 256 / cute::sizeof_bits::value; + + static constexpr uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_1>; + using ALayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + a_type, b_type, c_type, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint32_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_TF32_TS_SCALED::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } }; template scaleC) const { return {accumulate, idesc_}; } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } }; +// Special instantiation for interleaved complex (emulated) +template +struct MMA_Traits, cutlass::complex, float, + M, N, a_major, b_major, + ScaleC, a_neg, b_neg, c_sat>> +{ + static_assert(cute::sizeof_bits_v == 16, "Only supports 16bit base types"); + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::tmem_frg_1sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_1sm; + + // Logical shape-K is always 256 bits; transform to units of elements + static constexpr int K = 256 / cute::sizeof_bits::value; + + static constexpr uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_1>; + using ALayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + ab_vtype, ab_vtype, float, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint32_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_F16BF16_TS_SCALED::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + + template +struct MMA_Traits> +{ + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::tmem_frg_1sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_1sm; + + // Logical shape-K is always 256 bits; transform to units of elements + static constexpr int K = 256 / cute::sizeof_bits::value; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_1>; + using ALayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride<_0,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + // MMA based interleaved complex GEMM calculates realAcc and imagAcc separately. + // This MMA_traits is used to calculate 1 of the GEMMs below : + // 1. realAcc = realA * realB + (-imagA) * imagB + // 2. imagAcc = imagA * realB + realA * imagB + // So it requires complex type operand A&B and float type operand Acc. + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN A from TMEM can't be transposed"); + static_assert(b_major == UMMA::Major::K, "SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN B from SMEM requires non-transpose"); + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + tfloat32_t, tfloat32_t, float, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint32_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN< + M, N, + a_major, b_major, + a_neg, b_neg, c_sat>::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } +}; + template scaleC) const { return {accumulate, idesc_}; } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } }; + +// Special instantiation for interleaved complex (emulated) +template +struct MMA_Traits, cutlass::complex, float, + M, N, a_major, b_major, + ScaleC, a_neg, b_neg>> +{ + static_assert(cute::sizeof_bits_v == 16, "Only supports 16bit base types"); + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::smem_desc; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_2sm; + + // Size of instructions's K extent is always 256bits, convert to units of element + constexpr static int K = 256 / cute::sizeof_bits::value; + constexpr static uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_2>; + using ALayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + ab_vtype, ab_vtype, float, M, N, a_major, b_major, a_neg, b_neg>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint64_t desc_a = A[0]; + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_F16BF16_2x1SM_SS_SCALED::fma(desc_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + +template +struct MMA_Traits> +{ + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + static_assert(cute::sizeof_bits_v == cute::sizeof_bits_v && cute::sizeof_bits_v == 32, "SM100_MMA_TF32_2x1SM_TS_SCALED supports 32bit types"); + + using FrgTypeA = UMMA::tmem_frg_2sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_2sm; + + // Size of instructions' K extent is always 256 bits; convert to units of element + constexpr static int K = 256 / cute::sizeof_bits::value; + constexpr static uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_2>; + using ALayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + a_type, b_type, c_type, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint64_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_TF32_2x1SM_TS_SCALED::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + + template @@ -2011,8 +2543,105 @@ struct MMA_Traits scaleC) const { return {accumulate, idesc_}; } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } }; + +// Special instantiation for interleaved complex (emulated) +template +struct MMA_Traits, cutlass::complex, float, + M, N, a_major, b_major, + ScaleC, a_neg, b_neg, c_sat>> +{ + static_assert(cute::sizeof_bits_v == 16, "Only supports 16bit base types"); + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::tmem_frg_2sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_2sm; + + // Size of instructions' K extent is always 256 bits; convert to units of element + constexpr static int K = 256 / cute::sizeof_bits::value; + constexpr static uint32_t ScalingFactor = ScaleC; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_2>; + using ALayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + ab_vtype, ab_vtype, float, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint64_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_F16BF16_2x1SM_TS_SCALED::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(UMMA::ScaleOut accumulate, cute::integral_constant scaleC) const { + return {accumulate, idesc_}; + } + + template + CUTE_HOST_DEVICE constexpr + MMA_Traits> + with(cute::integral_constant) const { + return {accumulate_, UMMA::make_instr_desc()}; + } +}; + + template +struct MMA_Traits> +{ + using a_type = complex; + using b_type = complex; + using c_type = float; + + using ValTypeD = c_type; + using ValTypeA = a_type; + using ValTypeB = b_type; + using ValTypeC = c_type; + + using FrgTypeA = UMMA::tmem_frg_2sm; + using FrgTypeB = UMMA::smem_desc; + using FrgTypeC = UMMA::tmem_frg_2sm; + + // Size of instructions' K extent is always 256 bits; convert to units of element + constexpr static int K = 256 / cute::sizeof_bits::value; + + using Shape_MNK = Shape,Int,Int>; + using ThrID = Layout<_2>; + using ALayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using BLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + using CLayout = Layout,Int>>, + Stride,Stride< _1,Int>>>; + + // Accumulate or overwrite C. 1: read C, 0: ignore C [clear accumulators] + UMMA::ScaleOut accumulate_ = UMMA::ScaleOut::One; + + // Interleaved complex GEMM calculates realAcc and imagAcc separately. + // This MMA_traits is used to calculate 1 of the GEMMs below : + // 1. realAcc = realA * realB + (-imagA) * imagB + // 2. imagAcc = imagA * realB + realA * imagB + // So it requires complex type operand A&B and float type operand Acc. + static_assert(a_major == UMMA::Major::K, "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN A from TMEM can't be transposed"); + static_assert(b_major == UMMA::Major::K, "SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN B from SMEM requires non-transpose"); + + UMMA::InstrDescriptor idesc_ = UMMA::make_instr_desc< + tfloat32_t, tfloat32_t, float, M, N, a_major, b_major, a_neg, b_neg, c_sat>(); + + template + CUTE_HOST_DEVICE constexpr friend + void + mma_unpack(MMA_Traits const& traits, + Tensor & D, + Tensor const& A, + Tensor const& B, + Tensor const& C) + { + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_rmem::value, "Expected desc registers in MMA_Atom::call"); + static_assert(is_tmem::value, "Expected tmem in MMA_Atom::call"); + + uint64_t tmem_a = raw_pointer_cast(A.data()); + uint64_t desc_b = B[0]; + uint32_t tmem_c = raw_pointer_cast(D.data()); + uint64_t idesc = UMMA::make_runtime_instr_desc<>(traits.idesc_); + + SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN< + M, N, + a_major, b_major, + a_neg, b_neg, c_sat>::fma(tmem_a, desc_b, tmem_c, uint32_t(traits.accumulate_), idesc); + } +}; + template @@ -2640,7 +3345,7 @@ struct MMA_Traits <= 8 && cute::sizeof_bits_v <= 8, "SM100_MMA_F8F6F4_SS supports types with leq 8bit types"); static_assert(M == 64 || M == 128, "SM100_MMA_F8F6F4_SS M-mode size should be 64 or 128 for 1 CTA cluster MMA."); static_assert(((b_major == UMMA::Major::K) && ((N % 8 == 0) && (8 <= N) && (N <= 256))) || - ((b_major == UMMA::Major::MN) && ((N % 16 == 0) && (16 <= N) && (N <= 256))), + ((b_major == UMMA::Major::MN) && ((N % 16 == 0) && (16 <= N) && (N <= 256))), "SM100_MMA_F8F6F4_SS N-mode size should be a multiple of 8 between 8 and 256 when B is K major. \ SM100_MMA_F8F6F4_SS N-mode size should be a multiple of 16 between 16 and 256 when B is MN major."); using FrgTypeA = UMMA::smem_desc; @@ -3058,7 +3763,7 @@ struct MMA_Traits <= 8 && cute::sizeof_bits_v <= 8, "SM100_MMA_F8F6F4_2x1SM_SS supports types with leq 8bit types"); static_assert(M == 128 || M == 256, "SM100_MMA_F8F6F4_2x1SM_SS M-mode size should be 64 or 128 for 1 CTA cluster MMA."); static_assert(((b_major == UMMA::Major::K) && ((N % 16 == 0) && (16 <= N) && (N <= 256))) || - ((b_major == UMMA::Major::MN) && ((N % 32 == 0) && (32 <= N) && (N <= 256))), + ((b_major == UMMA::Major::MN) && ((N % 32 == 0) && (32 <= N) && (N <= 256))), "SM100_MMA_F8F6F4_2x1SM_SS N-mode size should be a multiple of 16 between 16 and 256 when B is K major. \ SM100_MMA_F8F6F4_2x1SM_SS N-mode size should be a multiple of 32 between 32 and 256 when B is MN major."); diff --git a/include/cute/container/array.hpp b/include/cute/container/array.hpp index ae1a10ac..0e57859f 100644 --- a/include/cute/container/array.hpp +++ b/include/cute/container/array.hpp @@ -447,8 +447,20 @@ struct tuple_element> namespace std { +#if (__CUDACC_VER_MAJOR__ >= 13) + #include +#else +#if defined(__CUDACC_RTC__) + template + struct tuple_size; + + template + struct tuple_element; +#endif +#endif + template struct tuple_size> : CUTE_STL_NAMESPACE::integral_constant diff --git a/include/cute/container/array_subbyte.hpp b/include/cute/container/array_subbyte.hpp index 2c6a97be..2e634714 100644 --- a/include/cute/container/array_subbyte.hpp +++ b/include/cute/container/array_subbyte.hpp @@ -617,8 +617,20 @@ struct tuple_element> namespace std { +#if (__CUDACC_VER_MAJOR__ >= 13) + #include +#else +#if defined(__CUDACC_RTC__) + template + struct tuple_size; + + template + struct tuple_element; +#endif +#endif + template struct tuple_size> : CUTE_STL_NAMESPACE::integral_constant diff --git a/include/cute/container/tuple.hpp b/include/cute/container/tuple.hpp index 7a1650ed..f7cfca94 100644 --- a/include/cute/container/tuple.hpp +++ b/include/cute/container/tuple.hpp @@ -701,8 +701,20 @@ struct tuple_element> namespace std { +#if (__CUDACC_VER_MAJOR__ >= 13) + #include +#else +#if defined(__CUDACC_RTC__) + template + struct tuple_size; + + template + struct tuple_element; +#endif +#endif + template struct tuple_size> : CUTE_STL_NAMESPACE::integral_constant diff --git a/include/cute/container/type_list.hpp b/include/cute/container/type_list.hpp index 8c1373cd..62ebf9df 100644 --- a/include/cute/container/type_list.hpp +++ b/include/cute/container/type_list.hpp @@ -103,8 +103,20 @@ struct tuple_element> namespace std { +#if (__CUDACC_VER_MAJOR__ >= 13) + #include +#else +#if defined(__CUDACC_RTC__) + template + struct tuple_size; + + template + struct tuple_element; +#endif +#endif + template struct tuple_size> : CUTE_STL_NAMESPACE::integral_constant diff --git a/include/cute/numeric/arithmetic_tuple.hpp b/include/cute/numeric/arithmetic_tuple.hpp index 4ef9f790..01dde5f1 100644 --- a/include/cute/numeric/arithmetic_tuple.hpp +++ b/include/cute/numeric/arithmetic_tuple.hpp @@ -513,8 +513,20 @@ struct tuple_element> namespace std { +#if (__CUDACC_VER_MAJOR__ >= 13) + #include +#else +#if defined(__CUDACC_RTC__) + template + struct tuple_size; + + template + struct tuple_element; +#endif +#endif + template struct tuple_size> : CUTE_STL_NAMESPACE::integral_constant diff --git a/include/cutlass/arch/barrier.h b/include/cutlass/arch/barrier.h index 903ff0ac..015de3eb 100644 --- a/include/cutlass/arch/barrier.h +++ b/include/cutlass/arch/barrier.h @@ -33,6 +33,7 @@ */ #pragma once +#include "cutlass/cutlass.h" #include #include @@ -285,8 +286,8 @@ class NamedBarrier { #if CUDA_BARRIER_ENABLED asm volatile("bar.sync %0, %1;" : : "r"(barrier_id), "r"(num_threads) : "memory"); cutlass::arch::synclog_emit_named_barrier_arrive_and_wait(__LINE__, num_threads, barrier_id); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -295,8 +296,8 @@ class NamedBarrier { #if CUDA_BARRIER_ENABLED asm volatile("barrier.sync %0, %1;" : : "r"(barrier_id), "r"(num_threads) : "memory"); cutlass::arch::synclog_emit_named_barrier_arrive_and_wait(__LINE__, num_threads, barrier_id); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -305,8 +306,8 @@ class NamedBarrier { #if CUDA_BARRIER_ENABLED cutlass::arch::synclog_emit_named_barrier_arrive(__LINE__, num_threads, barrier_id); asm volatile("bar.arrive %0, %1;" : : "r"(barrier_id), "r"(num_threads) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -315,8 +316,8 @@ class NamedBarrier { #if CUDA_BARRIER_ENABLED cutlass::arch::synclog_emit_named_barrier_arrive(__LINE__, num_threads, barrier_id); asm volatile("barrier.arrive %0, %1;" : : "r"(barrier_id), "r"(num_threads) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -399,8 +400,8 @@ public: : "r"(arrive_count), "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cluster_barrier_init(__LINE__, smem_addr, arrive_count); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -425,8 +426,8 @@ public: : "r"(smem_addr), "r"(phase), "r"(ticks) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -450,8 +451,8 @@ public: : "memory"); return static_cast(waitComplete); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif return 0; } @@ -474,8 +475,8 @@ public: : "memory"); return static_cast(waitComplete); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif return 0; } @@ -498,8 +499,8 @@ public: } cutlass::arch::synclog_emit_cluster_barrier_arrive_cluster(__LINE__, smem_addr, cta_id, pred); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -516,8 +517,8 @@ public: : "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cluster_barrier_arrive(__LINE__, smem_addr); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -532,8 +533,8 @@ public: : : "r"(smem_addr) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } }; @@ -595,8 +596,8 @@ struct ClusterTransactionBarrier : public ClusterBarrier { : "r"(transaction_bytes), "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cluster_transaction_barrier_arrive_and_expect_tx(__LINE__, smem_addr, transaction_bytes); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -617,8 +618,8 @@ struct ClusterTransactionBarrier : public ClusterBarrier { : : "r"(smem_addr), "r"(cta_id), "r"(pred), "r"(transaction_bytes) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -635,8 +636,8 @@ struct ClusterTransactionBarrier : public ClusterBarrier { : "r"(transaction_bytes), "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cluster_transaction_barrier_expect_transaction(__LINE__, smem_addr, transaction_bytes); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -657,8 +658,8 @@ struct ClusterTransactionBarrier : public ClusterBarrier { : "r"(transaction_bytes), "r"(smem_addr), "r"(pred) : "memory"); cutlass::arch::synclog_emit_cluster_transaction_barrier_complete_transaction(__LINE__, smem_addr, dst_cta_id, transaction_bytes, pred); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -717,8 +718,8 @@ void fence_barrier_init() { "}" :: : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -733,8 +734,23 @@ void fence_view_async_shared() { "}" :: : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); +#endif +} + +CUTLASS_DEVICE +void fence_view_shared() { +#if CUDA_BARRIER_ENABLED + cutlass::arch::synclog_emit_fence_view_shared(__LINE__); + asm volatile ( + "{\n\t" + "fence.release.sync_restrict::shared::cta.cluster; \n" + "}" + :: + : "memory"); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -751,8 +767,8 @@ void cpasync_barrier_arrive(uint64_t const* smem_ptr) { : "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cpasync_barrier_arrive(__LINE__, smem_addr); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -769,8 +785,8 @@ void cpasync_barrier_arrive_noinc(uint64_t const* smem_ptr) { : "r"(smem_addr) : "memory"); cutlass::arch::synclog_emit_cpasync_barrier_arrive(__LINE__, smem_addr); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -787,8 +803,8 @@ void umma_arrive(uint64_t const* smem_ptr) { :"r"(bar_intptr) : "memory"); } -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -803,8 +819,8 @@ void umma_arrive_2x1SM(uint64_t const* smem_ptr) { :"r"(bar_intptr) : "memory"); } -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -822,8 +838,8 @@ void umma_arrive_multicast(uint64_t const* smem_ptr, uint16_t cta_mask) { :"r"(bar_intptr), "h"(cta_mask) : "memory"); } -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -841,8 +857,8 @@ void umma_arrive_multicast_2x1SM(uint64_t const* smem_ptr, uint16_t cta_mask) { :"r"(bar_intptr), "h"(cta_mask) : "memory"); } -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -861,8 +877,8 @@ void umma_arrive_multicast_no_elect(uint64_t const* smem_ptr, uint16_t cta_mask) : :"r"(bar_intptr), "r"(uint32_t(cta_mask)) : "memory"); -#elif defined(__CUDA_ARCH__) - CUTLASS_NOT_IMPLEMENTED(); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -899,8 +915,8 @@ void umma_arrive_2x1SM_sm0(uint64_t const* smem_ptr) { : "r"(bar_intptr) : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -912,8 +928,8 @@ CUTE_DEVICE static void fence_view_async_tmem_load() { "}" :: : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } @@ -925,8 +941,8 @@ CUTE_DEVICE static void fence_view_async_tmem_store() { "}" :: : "memory"); -#elif defined(__CUDA_ARCH__) - asm volatile ("brkpt;\n" ::); +#else + CUTLASS_NOT_IMPLEMENTED(); #endif } diff --git a/include/cutlass/arch/mma_sm100.h b/include/cutlass/arch/mma_sm100.h index 357a690b..92af9078 100644 --- a/include/cutlass/arch/mma_sm100.h +++ b/include/cutlass/arch/mma_sm100.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/arch/mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sm70.h b/include/cutlass/arch/mma_sm70.h index 749e71e4..16806493 100644 --- a/include/cutlass/arch/mma_sm70.h +++ b/include/cutlass/arch/mma_sm70.h @@ -33,7 +33,9 @@ */ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sm75.h b/include/cutlass/arch/mma_sm75.h index 0086d13c..3b5e51df 100644 --- a/include/cutlass/arch/mma_sm75.h +++ b/include/cutlass/arch/mma_sm75.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/arch/wmma.h" diff --git a/include/cutlass/arch/mma_sm80.h b/include/cutlass/arch/mma_sm80.h index 0c56dfc3..48536b96 100644 --- a/include/cutlass/arch/mma_sm80.h +++ b/include/cutlass/arch/mma_sm80.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sm89.h b/include/cutlass/arch/mma_sm89.h index 6b3a617b..493442ad 100644 --- a/include/cutlass/arch/mma_sm89.h +++ b/include/cutlass/arch/mma_sm89.h @@ -35,7 +35,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sm90.h b/include/cutlass/arch/mma_sm90.h index b5f018a0..5bcbe270 100644 --- a/include/cutlass/arch/mma_sm90.h +++ b/include/cutlass/arch/mma_sm90.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sparse_sm80.h b/include/cutlass/arch/mma_sparse_sm80.h index e0433bcd..c39a5695 100644 --- a/include/cutlass/arch/mma_sparse_sm80.h +++ b/include/cutlass/arch/mma_sparse_sm80.h @@ -35,7 +35,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/mma_sparse_sm89.h b/include/cutlass/arch/mma_sparse_sm89.h index d6d5d241..00a0a342 100644 --- a/include/cutlass/arch/mma_sparse_sm89.h +++ b/include/cutlass/arch/mma_sparse_sm89.h @@ -35,7 +35,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "mma.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/arch/synclog.hpp b/include/cutlass/arch/synclog.hpp index 9ca8337e..ffa7baee 100644 --- a/include/cutlass/arch/synclog.hpp +++ b/include/cutlass/arch/synclog.hpp @@ -156,6 +156,10 @@ constexpr bool synclog_enable_fence_view_async_shared = true; constexpr uint32_t synclog_header_fence_view_async_shared = 17; constexpr uint32_t synclog_length_fence_view_async_shared = synclog_length_prefix + 0; +constexpr bool synclog_enable_fence_view_shared = true; +constexpr uint32_t synclog_header_fence_view_shared = 39; +constexpr uint32_t synclog_length_fence_view_shared = synclog_length_prefix + 0; + constexpr bool synclog_enable_cp_async_wait = true; constexpr uint32_t synclog_header_cp_async_wait = 18; constexpr uint32_t synclog_length_cp_async_wait = synclog_length_prefix + 1; @@ -637,6 +641,19 @@ void synclog_emit_fence_view_async_shared(uint32_t line) { #endif // defined(CUTLASS_ENABLE_SYNCLOG) } +CUTLASS_DEVICE +void synclog_emit_fence_view_shared(uint32_t line) { + #if defined(CUTLASS_ENABLE_SYNCLOG) + if constexpr (!synclog_enable_fence_view_shared) return; + if (!synclog_condition_emit()) return; + uint32_t* to = synclog_alloc(synclog_length_fence_view_shared); + if (to == nullptr) return; + synclog_emit_prefix(to, synclog_header_fence_view_shared, line); + #else + CUTLASS_UNUSED(line); + #endif // defined(CUTLASS_ENABLE_SYNCLOG) +} + CUTLASS_DEVICE void synclog_emit_cp_async_wait( uint32_t line, @@ -1091,6 +1108,14 @@ void synclog_print() { continue; } } + if constexpr (synclog_enable_fence_view_shared) { + if (header == synclog_header_fence_view_shared) { + synclog_print_prefix("fence_view_shared", at); + at += synclog_length_fence_view_shared; + printf("\n"); + continue; + } + } if constexpr (synclog_enable_cp_async_wait) { if (header == synclog_header_cp_async_wait) { synclog_print_prefix("cp_async_wait", at); diff --git a/include/cutlass/arch/wmma_sm70.h b/include/cutlass/arch/wmma_sm70.h index 81a54b45..05efaf63 100644 --- a/include/cutlass/arch/wmma_sm70.h +++ b/include/cutlass/arch/wmma_sm70.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/layout/matrix.h" //////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/arch/wmma_sm72.h b/include/cutlass/arch/wmma_sm72.h index 85fa70bb..995f8250 100644 --- a/include/cutlass/arch/wmma_sm72.h +++ b/include/cutlass/arch/wmma_sm72.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/layout/matrix.h" //////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/arch/wmma_sm75.h b/include/cutlass/arch/wmma_sm75.h index 6bee3c64..f67a519b 100644 --- a/include/cutlass/arch/wmma_sm75.h +++ b/include/cutlass/arch/wmma_sm75.h @@ -34,7 +34,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/layout/matrix.h" //////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/array.h b/include/cutlass/array.h index 0e96486f..0ee2591f 100644 --- a/include/cutlass/array.h +++ b/include/cutlass/array.h @@ -718,6 +718,24 @@ struct maximum_absolute_value_reduction, PropogateNaN> { } }; +template +struct maximum_absolute_value_zero_mantissa_reduction, PropagateNaN> { + + CUTLASS_HOST_DEVICE + T operator() (T const& scalar, cutlass::Array const& rhs) const { + + T result = scalar; + maximum_absolute_value_zero_mantissa_reduction scalar_op; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result = scalar_op(result, rhs[i]); + } + + return result; + } +}; + template struct scale> { T const scaling_factor_; diff --git a/include/cutlass/complex.h b/include/cutlass/complex.h index 4449df67..adfe103d 100644 --- a/include/cutlass/complex.h +++ b/include/cutlass/complex.h @@ -813,6 +813,37 @@ struct atomic_add> { } }; +// Maximal exponent reduction for zero-mantissa scaling factors: complex number uses its largest cartesian norm not abs +template +struct maximum_cartesian_norm_zero_mantissa_reduction { + using T = typename TC::value_type; + + CUTLASS_HOST_DEVICE + T operator()(T const &lhs, cutlass::complex const &rhs) const { + maximum_absolute_value_zero_mantissa_reduction red_op; + + return red_op(red_op(lhs, rhs.real()), rhs.imag()); + } +}; + +template +struct maximum_cartesian_norm_zero_mantissa_reduction, PropagateNaN> { + using T = typename TC::value_type; + + CUTLASS_HOST_DEVICE + T operator() (T const& scalar, cutlass::Array const& rhs) const { + + T result = scalar; + maximum_cartesian_norm_zero_mantissa_reduction scalar_op; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result = scalar_op(result, rhs[i]); + } + + return result; + } +}; ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/cutlass.h b/include/cutlass/cutlass.h index 2442f310..0c7cb201 100644 --- a/include/cutlass/cutlass.h +++ b/include/cutlass/cutlass.h @@ -37,11 +37,7 @@ #include "cutlass/detail/helper_macros.hpp" -#if (__CUDACC_VER_MAJOR__ >= 13) - #define CUDA_STD_HEADER(header) -#else - #define CUDA_STD_HEADER(header) -#endif +#define CUDA_STD_HEADER(header) //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/detail/collective/mixed_input_utils.hpp b/include/cutlass/detail/collective/mixed_input_utils.hpp index 3ea85cdb..7c5ee0b3 100644 --- a/include/cutlass/detail/collective/mixed_input_utils.hpp +++ b/include/cutlass/detail/collective/mixed_input_utils.hpp @@ -862,7 +862,8 @@ public: } else if constexpr (UseScaleLookupTable) { constexpr int num_elements = decltype(size(src))::value; - static_assert(is_same_v, "Lookup table only supports int4 being the quant type now."); + static_assert(is_same_v || is_same_v, + "Lookup table supports int4b_t (Two's Complement) and float_e2m1_t (E2M1/FP4) quant types."); static_assert(sizeof_bits_v == 64, "Lookup table only supports 8 8bit scale values now."); static_assert(num_elements % 4 == 0 && num_elements >= 4, "Lookup table requires a vector size of 4x when converting."); @@ -885,15 +886,31 @@ public: { auto&& scale_neg_ = reinterpret_cast const&>(scales_neg_vm_(i)); auto&& scale_pos_ = reinterpret_cast &>(scales_pos_vm_(i)); - constexpr uint32_t immLut = (0xf0 & 0xcc) ^ 0xaa; - asm volatile( - "{\n" - " lop3 .b32 %0, %2, %4, %5, %6;\n" \ - " xor .b32 %1, %3, %5; \n" \ - "}\n" - : "=r"(scale_pos_[0]), "=r"(scale_pos_[1]) - : "r"(scale_neg_[0]), "r"(scale_neg_[1]), "n"(0xFFFFFF00), "n"(0x80808080), "n"(immLut) - ); + + // Accept CUTLASS pseudo-FP as well + if constexpr (cutlass::platform::is_floating_point::value || + cute::is_same_v) { + // E2M1 (FP4): Sign-magnitude encoding - simple sign flip with two XORs + asm volatile( + "{\n" + " xor .b32 %0, %2, %4;\n" \ + " xor .b32 %1, %3, %4;\n" \ + "}\n" + : "=r"(scale_pos_[0]), "=r"(scale_pos_[1]) + : "r"(scale_neg_[0]), "r"(scale_neg_[1]), "n"(0x80808080) + ); + } else { + // INT4: Two's complement encoding - reorder and sign flip with lop3 + constexpr uint32_t immLut = (0xf0 & 0xcc) ^ 0xaa; + asm volatile( + "{\n" + " lop3 .b32 %0, %2, %4, %5, %6;\n" \ + " xor .b32 %1, %3, %5; \n" \ + "}\n" + : "=r"(scale_pos_[0]), "=r"(scale_pos_[1]) + : "r"(scale_neg_[0]), "r"(scale_neg_[1]), "n"(0xFFFFFF00), "n"(0x80808080), "n"(immLut) + ); + } } } CUTLASS_PRAGMA_UNROLL diff --git a/include/cutlass/detail/sm100_blockscaled_layout.hpp b/include/cutlass/detail/sm100_blockscaled_layout.hpp index bdbd8bfe..e44dd887 100644 --- a/include/cutlass/detail/sm100_blockscaled_layout.hpp +++ b/include/cutlass/detail/sm100_blockscaled_layout.hpp @@ -88,9 +88,14 @@ struct Sm1xxBlockScaledConfig { CUTE_HOST_DEVICE static constexpr auto tile_atom_to_shape_SFA(ProblemShape problem_shape, LayoutSFA layout_sfa = LayoutSFA{}) { - auto problem_shape_MNKL = append<4>(problem_shape, 1); - auto [M, N, K, L] = problem_shape_MNKL; - return tile_to_shape(SfAtom{}, make_shape(M,K,L), Step<_2,_1,_3>{}); + if constexpr (rank(ProblemShape{}) == 3) { + auto [M, N, K] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(M,K), Step<_2,_1>{}); + } + else { + auto [M, N, K, L] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(M,K,L), Step<_2,_1,_3>{}); + } } // The following function is provided for user fill dynamic problem size to the layout_SFB. @@ -98,9 +103,14 @@ struct Sm1xxBlockScaledConfig { CUTE_HOST_DEVICE static constexpr auto tile_atom_to_shape_SFB(ProblemShape problem_shape, LayoutSFB layout_sfb = LayoutSFB{}) { - auto problem_shape_MNKL = append<4>(problem_shape, 1); - auto [M, N, K, L] = problem_shape_MNKL; - return tile_to_shape(SfAtom{}, make_shape(N,K,L), Step<_2,_1,_3>{}); + if constexpr (rank(ProblemShape{}) == 3) { + auto [M, N, K] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(N,K), Step<_2,_1>{}); + } + else { + auto [M, N, K, L] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(N,K,L), Step<_2,_1,_3>{}); + } } template diff --git a/include/cutlass/detail/sm103_blockscaled_layout.hpp b/include/cutlass/detail/sm103_blockscaled_layout.hpp index db89f3a1..800d0191 100644 --- a/include/cutlass/detail/sm103_blockscaled_layout.hpp +++ b/include/cutlass/detail/sm103_blockscaled_layout.hpp @@ -87,9 +87,14 @@ struct Sm103BlockScaledConfig { CUTE_HOST_DEVICE static constexpr auto tile_atom_to_shape_SFA(ProblemShape problem_shape, LayoutSFA layout_sfa = LayoutSFA{}) { - auto problem_shape_MNKL = append<4>(problem_shape, 1); - auto [M, N, K, L] = problem_shape_MNKL; - return tile_to_shape(SfAtom{}, make_shape(M,K,L), Step<_2,_1,_3>{}); + if constexpr (rank(ProblemShape{}) == 3) { + auto [M, N, K] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(M,K), Step<_2,_1>{}); + } + else { + auto [M, N, K, L] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(M,K,L), Step<_2,_1,_3>{}); + } } // The following function is provided for user fill dynamic problem size to the layout_SFB. @@ -97,9 +102,14 @@ struct Sm103BlockScaledConfig { CUTE_HOST_DEVICE static constexpr auto tile_atom_to_shape_SFB(ProblemShape problem_shape, LayoutSFB layout_sfb = LayoutSFB{}) { - auto problem_shape_MNKL = append<4>(problem_shape, 1); - auto [M, N, K, L] = problem_shape_MNKL; - return tile_to_shape(SfAtom{}, make_shape(N,K,L), Step<_2,_1,_3>{}); + if constexpr (rank(ProblemShape{}) == 3) { + auto [M, N, K] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(N,K), Step<_2,_1>{}); + } + else { + auto [M, N, K, L] = problem_shape; + return tile_to_shape(SfAtom{}, make_shape(N,K,L), Step<_2,_1,_3>{}); + } } }; ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/epilogue/collective/builders/sm100_builder.inl b/include/cutlass/epilogue/collective/builders/sm100_builder.inl index 211bdfe2..e5fafd52 100644 --- a/include/cutlass/epilogue/collective/builders/sm100_builder.inl +++ b/include/cutlass/epilogue/collective/builders/sm100_builder.inl @@ -1121,6 +1121,23 @@ sm100_dense_dispatch_policy() { else if constexpr (is_base_of_v || is_base_of_v) { return Sm100NoSmemWarpSpecialized{}; } + else if constexpr (is_same_v || + is_same_v) { + return Sm100PtrArrayPlanarComplexNoSmemWarpSpecialized{}; + } + else if constexpr (is_same_v || + is_same_v) { + constexpr bool ReuseSmem_ = (sizeof_bits_v == sizeof_bits_v); // limited smem reuse support for planar complex for now + constexpr int StagesC_ = ReuseSmem_ ? cute::max(cute::min(EpiTiles, 4), StagesD+1) : cute::min(EpiTiles, 4); + constexpr bool DelayTmaStore_ = false; // TMA store delay complicates tensormap updates for Ptr-Array GEMMs + return Sm100PtrArrayPlanarComplexTmaWarpSpecialized{}; + } + else if constexpr (is_same_v || + is_same_v) { + constexpr bool ReuseSmem_ = (sizeof_bits_v == sizeof_bits_v); // limited smem reuse support for planar complex for now + constexpr int StagesC_ = ReuseSmem_ ? cute::max(cute::min(EpiTiles, 4), StagesD+1) : cute::min(EpiTiles, 4); + return Sm100PlanarComplexTmaWarpSpecialized{}; + } else if constexpr (is_same_v || is_same_v) { constexpr bool DelayTmaStore_ = false; // TMA store delay complicates tensormap updates for Ptr-Array GEMMs @@ -1235,6 +1252,16 @@ private: static constexpr auto fusion_callbacks() { + if constexpr (is_same_v || + is_same_v || + is_same_v || + is_same_v) { + static_assert(IsDefaultFusionOp::value, "unsupported schedule + fusion"); + constexpr thread::ScaleType::Kind ScaleType = DisableSource ? thread::ScaleType::OnlyAlphaScaling : thread::ScaleType::Default; + return thread::LinearCombinationPlanarComplex< + ElementD, FragmentSize, ElementAccumulator, ElementCompute, FusionOp::RoundStyle, ScaleType>({}); + } + else { return typename CallbacksBuilder< decltype(dispatch_policy()), @@ -1514,6 +1541,12 @@ private: return thread::LinearCombination< ElementD, 1, ElementAccumulator, ElementCompute, ScaleType, FusionOp::RoundStyle, ElementC>({}); } + else if constexpr (is_same_v || + is_same_v) { + static_assert(IsDefaultFusionOp::value, "unsupported schedule + fusion"); + return thread::LinearCombinationPlanarComplex< + ElementD, FragmentSize, ElementAccumulator, ElementCompute, FusionOp::RoundStyle, ScaleType>({}); + } else { return typename detail::CallbacksBuilder< DispatchPolicy, @@ -1780,6 +1813,7 @@ struct CollectiveBuilder< CopyAtomR2G, Schedule>; }; + /////////////////////////////////////////////////////////////////////////////// } // namespace cutlass::epilogue::collective diff --git a/include/cutlass/epilogue/collective/detail.hpp b/include/cutlass/epilogue/collective/detail.hpp index 75c14c4b..05078bb3 100644 --- a/include/cutlass/epilogue/collective/detail.hpp +++ b/include/cutlass/epilogue/collective/detail.hpp @@ -736,7 +736,9 @@ public: // Wait for mma warp to fill tmem buffer with accumulator results acc_pipeline.consumer_wait(acc_pipe_consumer_state); - auto [acc_state_next] = (*this).template operator()( + auto [acc_state_next, load_state_next] = (*this).template operator()( + load_pipeline, + load_pipe_consumer_state, acc_pipeline, acc_pipe_consumer_state, problem_shape_mnkl, @@ -746,10 +748,9 @@ public: shared_tensors); // Let mma warp know tmem buffer is consumed and empty - ++load_pipe_consumer_state; ++store_pipe_producer_state; - return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state, acc_state_next); + return cute::make_tuple(load_state_next, store_pipe_producer_state, acc_state_next); } // FastF32 API @@ -857,7 +858,9 @@ public: TensorMap tensormap ) { - auto [acc_state_next] = (*this).template operator()( + auto [acc_state_next, load_state_next] = (*this).template operator()( + load_pipeline, + load_pipe_consumer_state, acc_pipeline, acc_pipe_consumer_state, problem_shape_mnkl, @@ -867,10 +870,9 @@ public: shared_tensors); // Let mma warp know tmem buffer is consumed and empty - ++load_pipe_consumer_state; ++store_pipe_producer_state; - return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state, acc_state_next); + return cute::make_tuple(load_state_next, store_pipe_producer_state, acc_state_next); } template diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_array_nosmem.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_array_nosmem.hpp index fe680480..176e7ad9 100644 --- a/include/cutlass/epilogue/collective/sm100_epilogue_array_nosmem.hpp +++ b/include/cutlass/epilogue/collective/sm100_epilogue_array_nosmem.hpp @@ -169,6 +169,8 @@ public: template< bool ReuseTmem = false, + class LoadPipeline, + class LoadPipelineState, class AccumulatorPipeline, class AccumulatorPipelineState, class ProblemShapeMNKL, @@ -178,6 +180,8 @@ public: > CUTLASS_DEVICE auto operator()( + [[maybe_unused]]LoadPipeline load_pipeline, + [[maybe_unused]]LoadPipelineState load_pipe_consumer_state, AccumulatorPipeline acc_pipeline, AccumulatorPipelineState acc_pipe_consumer_state, ProblemShapeMNKL problem_shape_mnkl, @@ -357,7 +361,7 @@ public: copy_if(tDpD, tTR_rD_src, tR2G_rD_dst); } - return cute::make_tuple(acc_pipe_consumer_state); + return cute::make_tuple(acc_pipe_consumer_state, load_pipe_consumer_state); } // API with Global Accumulator in registers for FastFP32 (emulated MMA) kernels. @@ -609,6 +613,8 @@ public: template< bool ReuseTmem = false, + class LoadPipeline, + class LoadPipelineState, class AccumulatorPipeline, class AccumulatorPipelineState, class ProblemShapeMNKL, @@ -618,6 +624,8 @@ public: > CUTLASS_DEVICE auto operator()( + [[maybe_unused]]LoadPipeline load_pipeline, + [[maybe_unused]]LoadPipelineState load_pipe_consumer_state, AccumulatorPipeline acc_pipeline, AccumulatorPipelineState acc_pipe_consumer_state, ProblemShapeMNKL problem_shape_mnkl, @@ -904,7 +912,7 @@ public: // auto cst_callbacks = fusion_callbacks.template get_consumer_store_callbacks(cst_args); epi_loop_fn(cst_callbacks, is_accumulator_needed); - return cute::make_tuple(acc_pipe_consumer_state); + return cute::make_tuple(acc_pipe_consumer_state, load_pipe_consumer_state); } }; diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_nosmem.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_nosmem.hpp new file mode 100644 index 00000000..d3cb7157 --- /dev/null +++ b/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_nosmem.hpp @@ -0,0 +1,345 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Functor performing elementwise operations used by Ptr-Array Planar Complex Gemm epilogue. +*/ + + + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/collective/detail.hpp" +#include "cutlass/epilogue/thread/linear_combination_planar_complex.h" + +#include "cute/tensor.hpp" +#include "cute/numeric/numeric_types.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace epilogue { +namespace collective { + +/// Applies an element wise operation to all elements within the fragment +/// and writes it out to destination storage. +template < + class EpilogueTile_, // (EPI_TILE_M, EPI_TILE_N) + class ElementC_, + class StrideC_, + class ElementD_, + class StrideD_, + class ThreadEpilogueOp_, + class CopyOpT2R_ +> +class CollectiveEpilogue< + Sm100PtrArrayPlanarComplexNoSmem, + EpilogueTile_, + ElementC_, + StrideC_, + ElementD_, + StrideD_, + ThreadEpilogueOp_, + CopyOpT2R_ +> { +public: + // + // Type Aliases + // + using DispatchPolicy = Sm100PtrArrayPlanarComplexNoSmem; + using EpilogueTile = EpilogueTile_; + // derived types of output thread level operator + using ThreadEpilogueOp = ThreadEpilogueOp_; + using ElementOutput = typename ThreadEpilogueOp::ElementOutput; + using ElementAccumulator = typename ThreadEpilogueOp::ElementAccumulator; + using ElementCompute = typename ThreadEpilogueOp::ElementCompute; + using ElementScalar = typename ThreadEpilogueOp::ElementScalar; + using ElementC = ElementC_; + using StrideC = StrideC_; + using InternalStrideC = cute::remove_pointer_t; + using ElementD = ElementD_; + using StrideD = StrideD_; + using InternalStrideD = cute::remove_pointer_t; + using CopyOpT2R = CopyOpT2R_; + + using GmemTiledCopyC = void; + using GmemTiledCopyD = void; + + constexpr static int ThreadCount = 128; + constexpr static uint32_t TmaTransactionBytes = 0; + constexpr static int FragmentSize = ThreadEpilogueOp::kCount; + + struct SharedStorage { + struct TensorStorage { }; + struct TensorMapStorage { }; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using TensorMapStorage = typename SharedStorage::TensorMapStorage; + + // Planar complex kernels have two accumulator copies for the real and imaginary tensors. + constexpr static int NumAccumulatorMtxs = 2; + + // Host side epilogue arguments + struct Arguments { + typename ThreadEpilogueOp::Params thread{}; + ElementC const** ptr_C_real = nullptr; + StrideC dC_real{}; + ElementC const** ptr_C_imag = nullptr; + StrideC dC_imag{}; + ElementD** ptr_D_real = nullptr; + StrideD dD_real{}; + ElementD** ptr_D_imag = nullptr; + StrideD dD_imag{}; + }; + + // Device side epilogue params + using Params = Arguments; + + // + // Methods + // + + template + static constexpr Params + to_underlying_arguments( + [[maybe_unused]] ProblemShape const& problem_shape, + Arguments const& args, + [[maybe_unused]] void* workspace) { + return args; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args, int sm_count) { + return 0; + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, + CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + [[maybe_unused]] ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + return true; + } + + CUTLASS_HOST_DEVICE + CollectiveEpilogue(Params const& params, SharedStorage&) : params(params) { }; + + template< + class ProblemShapeMNKL, + class TileShapeMNK, + class TileCoordMNKL, + class AccEngine, class AccLayout + > + CUTLASS_DEVICE void + operator()( + ProblemShapeMNKL problem_shape_mnkl, + TileShapeMNK cta_tile_shape_mnk, + TileCoordMNKL cta_coord_mnkl, + cute::Tensor const& accumulators, // (MMA,MMA_M,MMA_N) + [[maybe_unused]] SharedStorage&) { + + using namespace cute; + using X = Underscore; + + static_assert(is_tmem::value, "Accumulator must be TMEM resident."); + static_assert(rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4"); + static_assert(rank(TileCoordMNKL{}) == 4, "TileCoordMNKL must be rank 4"); + + // Separate out problem shape for convenience + auto M = get<0>(problem_shape_mnkl); + auto N = get<1>(problem_shape_mnkl); + auto L = get<3>(problem_shape_mnkl); + // Batches are managed by using appropriate pointers to C and D matrices + const int32_t mock_L = 1; + // Slice to get the tile this CTA is responsible for + auto [m_coord, n_coord, k_coord, l_coord] = cta_coord_mnkl; + const int32_t mock_l_coord = 0; + + auto problem_shape_mnl = make_shape(M,N,mock_L); + auto cta_coord_mnl = make_shape(m_coord, n_coord, mock_l_coord); + auto cta_tiler = take<0,2>(cta_tile_shape_mnk); + + // Represent the full output tensor, slice to get the tile this CTA is responsible for + Tensor mC_real = make_tensor(make_gmem_ptr(params.ptr_C_real[l_coord]), problem_shape_mnl, append<3>(params.dC_real,_0{})); // (M,N,L) + Tensor mC_imag = make_tensor(make_gmem_ptr(params.ptr_C_imag[l_coord]), problem_shape_mnl, append<3>(params.dC_imag,_0{})); // (M,N,L) + + Tensor mD_real = make_tensor(make_gmem_ptr(params.ptr_D_real[l_coord]), problem_shape_mnl, append<3>(params.dD_real,_0{})); // (M,N,L) + Tensor mD_imag = make_tensor(make_gmem_ptr(params.ptr_D_imag[l_coord]), problem_shape_mnl, append<3>(params.dD_imag,_0{})); // (M,N,L) + + Tensor gC_real = local_tile(mC_real, cta_tiler, cta_coord_mnl); // (CTA_M,CTA_N) + Tensor gC_imag = local_tile(mC_imag, cta_tiler, cta_coord_mnl); // (CTA_M,CTA_N) + + Tensor gD_real = local_tile(mD_real, cta_tiler, cta_coord_mnl); // (CTA_M,CTA_N) + Tensor gD_imag = local_tile(mD_imag, cta_tiler, cta_coord_mnl); // (CTA_M,CTA_N) + + // Partition source and destination tiles according to tmem copy T2R partitioning (tTR_) + auto tiled_t2r = make_tmem_copy(CopyOpT2R{}, tensor<0>(accumulators)); + auto thread_t2r = tiled_t2r.get_slice(threadIdx.x % size(tiled_t2r)); + Tensor tTR_gC_real = thread_t2r.partition_D(gC_real); // (T2R,T2R_M,T2R_N) + Tensor tTR_gC_imag = thread_t2r.partition_D(gC_imag); // (T2R,T2R_M,T2R_N) + + Tensor tTR_gD_real = thread_t2r.partition_D(gD_real); // (T2R,T2R_M,T2R_N) + Tensor tTR_gD_imag = thread_t2r.partition_D(gD_imag); // (T2R,T2R_M,T2R_N) + + Tensor tTR_rAcc = make_tensor(append(shape(tTR_gD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + Tensor tTR_rD = make_tensor(append(shape(tTR_gD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + + Tensor tTR_rAcc_frg = recast>(coalesce(tTR_rAcc)); // (EPI_V) + Tensor tTR_rD_frg = recast>(coalesce(tTR_rD)); // (EPI_V) + + Tensor coordD = make_identity_tensor(problem_shape_mnl); // (M,N,L) -> (m,n,l) + Tensor cD = local_tile(coordD, cta_tiler, cta_coord_mnl); // (CTA_M,CTA_N) -> (m,n,l) + Tensor tTR_cD = thread_t2r.partition_D(cD); // (T2R,T2R_M,T2R_N) -> (m,n,l) + + // 1. Load accumulators into register from tmem + auto accumulators_real = accumulators(_,_,_,0); + auto accumulators_imag = accumulators(_,_,_,1); + Tensor tAcc_real = accumulators_real(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + Tensor tAcc_imag = accumulators_imag(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + Tensor tTR_tAcc_real = thread_t2r.partition_S(tAcc_real); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + Tensor tTR_tAcc_imag = thread_t2r.partition_S(tAcc_imag); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + + // tmem -> rmem + copy(tiled_t2r, tTR_tAcc_real, tTR_rAcc(_,_,_,0)); + copy(tiled_t2r, tTR_tAcc_imag, tTR_rAcc(_,_,_,1)); + + // 2. Apply element-wise operation and store to gmem + ThreadEpilogueOp epilogue_op{params.thread}; + // source is needed + if (epilogue_op.is_source_needed()) { + Tensor tTR_rC = make_tensor(append(shape(tTR_gC_real), Int{})); // (T2R,T2R_M,T2R_N,2) + Tensor tTR_rC_frg = recast>(coalesce(tTR_rC)); // (EPI_V) + + auto tTR_rC_real = tTR_rC(_,_,_,0); + auto tTR_rC_imag = tTR_rC(_,_,_,1); + + for( int i = 0; i < size(tTR_gC_real); ++i) { + if (elem_less(tTR_cD(i), problem_shape_mnl)) { + tTR_rC_real(i) = tTR_gC_real(i); + tTR_rC_imag(i) = tTR_gC_imag(i); + } + } + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rAcc_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i), tTR_rC_frg(i)); + } + } + // source is not needed, avoid load + else { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rAcc_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i)); + } + } + + auto tTR_rD_real = tTR_rD(_,_,_,0); + auto tTR_rD_imag = tTR_rD(_,_,_,1); + + for( int i = 0; i < size(tTR_gD_real); ++i) { + if (elem_less(tTR_cD(i), problem_shape_mnl)) { + tTR_gD_real(i) = tTR_rD_real(i); + tTR_gD_imag(i) = tTR_rD_imag(i); + } + } + } + +protected: + Params const& params; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// For sm100 kernels requiring warp specialized epilogues +template < + class EpilogueTile_, // (EPI_TILE_M, EPI_TILE_N) + class ElementC_, + class StrideC_, + class ElementD_, + class StrideD_, + class ThreadEpilogueOp_, + class CopyOpT2R_, + class AlignmentC, + class AlignmentD +> +class CollectiveEpilogue< + Sm100PtrArrayPlanarComplexNoSmemWarpSpecialized, + EpilogueTile_, + ElementC_, + StrideC_, + ElementD_, + StrideD_, + ThreadEpilogueOp_, + CopyOpT2R_, + AlignmentC, + AlignmentD +> : public detail::Sm100TmaWarpSpecializedAdapter> +{ +public: + // ctor inheritance + using detail::Sm100TmaWarpSpecializedAdapter>::Sm100TmaWarpSpecializedAdapter; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + + + + +} // namespace collective +} // namespace epilogue +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_tma_warpspecialized.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_tma_warpspecialized.hpp new file mode 100644 index 00000000..8c0626a4 --- /dev/null +++ b/include/cutlass/epilogue/collective/sm100_epilogue_array_planar_complex_tma_warpspecialized.hpp @@ -0,0 +1,1161 @@ +/*************************************************************************************************** + * Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Functor performing elementwise operations used by Ptr-Array Planar Complex Gemm epilogues. +*/ + + + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/arch/barrier.h" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/detail.hpp" +#include "cutlass/epilogue/thread/scale_type.h" +#include "cutlass/epilogue/thread/linear_combination_planar_complex.h" +#include "cutlass/detail/layout.hpp" +#include "cutlass/trace.h" + +#include "cute/tensor.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::epilogue::collective { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template < + int StagesC_, + int StagesD_, + int FragmentSize_, + bool ReuseSmemC_, + bool DelayTmaStore_, + class CtaTileShape_, // (CTA_M,CTA_N,CTA_K, optional: Tile_L) + class EpilogueTile_, // (EPI_TILE_M, EPI_TILE_N) + class ElementC_, + class StrideC_, + class ElementD_, + class StrideD_, + class ThreadEpilogueOp_, + class CopyOpT2R_, + class CopyOpG2S_, + class SmemLayoutAtomC_, + class CopyOpS2R_, + class CopyOpS2G_, + class SmemLayoutAtomD_, + class CopyOpR2S_, + class CopyOpR2R_ +> +class CollectiveEpilogue< + Sm100PtrArrayPlanarComplexTmaWarpSpecialized, + CtaTileShape_, + EpilogueTile_, + ElementC_, + StrideC_, + ElementD_, + StrideD_, + ThreadEpilogueOp_, + CopyOpT2R_, + CopyOpG2S_, + SmemLayoutAtomC_, + CopyOpS2R_, + CopyOpS2G_, + SmemLayoutAtomD_, + CopyOpR2S_, + CopyOpR2R_ +> { +public: + using DispatchPolicy = Sm100PtrArrayPlanarComplexTmaWarpSpecialized; + using CtaTileShape = CtaTileShape_; + using EpilogueTile = EpilogueTile_; + using ThreadEpilogueOp = ThreadEpilogueOp_; + using ElementC = ElementC_; + using StrideC = StrideC_; + using InternalStrideC = cute::remove_pointer_t; + using ElementD = ElementD_; + using StrideD = StrideD_; + using InternalStrideD = cute::remove_pointer_t; + using CopyOpT2R = CopyOpT2R_; + using CopyOpG2S = CopyOpG2S_; + using SmemLayoutAtomC = SmemLayoutAtomC_; + using CopyOpS2R = CopyOpS2R_; + using CopyOpS2G = CopyOpS2G_; + using SmemLayoutAtomD = SmemLayoutAtomD_; + using CopyOpR2S = CopyOpR2S_; + using CopyOpR2R = CopyOpR2R_; + + using GmemTiledCopyC = CopyOpG2S; + using GmemTiledCopyD = CopyOpS2G; + + constexpr static int ThreadCount = 128; + + static_assert(!is_layout::value && is_tuple::value, "EpilogueTile must be a cute::Tile or cute::Shape"); + static_assert(rank(EpilogueTile{}) == 2, "EpilogueTile must be rank-2: [EPI_TILE_M, EPI_TILE_N]"); + + // Epilog assumes a max scheduler pipe count to calculate the number of asynchronous tma update buffer they need. + constexpr static uint32_t NumMaxSchedulerPipelineStageCount = 8; + +private: + using SmemElementD = typename cutlass::detail::get_unpacked_element_type::type; + using SmemElementC = typename cutlass::detail::get_unpacked_element_type,ElementD,ElementC>>::type; // prevents void ref breakages + constexpr static int StagesC = StagesC_; + constexpr static int StagesD = StagesD_; + constexpr static bool ReuseSmemC = ReuseSmemC_; + constexpr static bool DelayTmaStore = DelayTmaStore_; + constexpr static bool is_source_supported = ThreadEpilogueOp::kScale == cutlass::epilogue::thread::ScaleType::Default; + + constexpr static bool is_m_major_C = detail::is_m_major(); + constexpr static bool is_m_major_D = detail::is_m_major(); + + // Multiple buffer the TMA descriptors for each SM so that we can update them asynchronously. + // This should be larger than the total number of TMA requests inflight (from update to issued to returned). + // This can be calculated by SchedulerStages + max(TmaStages) + 2 (for consumer and producer in-flight accessies). + constexpr static uint32_t NumTmaDescriptorsPerSm = NumMaxSchedulerPipelineStageCount + std::max(StagesC, (ReuseSmemC ? StagesC : StagesD)) + 2; + + using SmemLayoutC = decltype(tile_to_shape( + SmemLayoutAtomC{}, + make_shape(size<0>(shape(EpilogueTile{})), size<1>(shape(EpilogueTile{})), Int{}), + cute::conditional_t, Step<_1,_2,_3>>{} )); + using SmemLayoutD = decltype(tile_to_shape( + SmemLayoutAtomD{}, + make_shape(size<0>(shape(EpilogueTile{})), size<1>(shape(EpilogueTile{})), Int{}), + cute::conditional_t, Step<_1,_2,_3>>{} )); + + constexpr static bool support_smem_reuse = is_source_supported && StagesD <= StagesC + && cosize(take<0,2>(SmemLayoutC{})) == cosize(take<0,2>(SmemLayoutD{})); + static_assert(not (ReuseSmemC && not support_smem_reuse), "Smem reuse requirements not met"); + + constexpr static size_t SmemAlignmentD = cutlass::detail::alignment_for_swizzle(SmemLayoutD{}); + constexpr static size_t SmemAlignmentC = cutlass::detail::alignment_for_swizzle(SmemLayoutC{}); + +public : + struct TensorStorageWithC { + alignas(SmemAlignmentC) cute::ArrayEngine> smem_C_real; + alignas(SmemAlignmentC) cute::ArrayEngine> smem_C_imag; + + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_real; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_imag; + }; + + struct TensorStorageWithoutC { + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_real; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_imag; + }; + +public: + // TMA pipeline for loading C + using LoadPipeline = cutlass::PipelineTransactionAsync; + using LoadPipelineState = cutlass::PipelineState; + constexpr static uint32_t TmaTransactionBytes = + 2 * ((size(take<0,2>(SmemLayoutC{})) * static_cast(sizeof_bits::value)) / 8); + + // TMA pipeline for storing D + using StorePipeline = cute::conditional_t, + cutlass::PipelineTmaStore>; + using StorePipelineState = cutlass::PipelineState; + + struct SharedStorage { + using TensorStorage = + cute::conditional_t; + TensorStorage tensors; + + struct TensorMapStorage : cute::aligned_struct<128, _0> { + cute::TmaDescriptor smem_tensormap_C_real; + cute::TmaDescriptor smem_tensormap_C_imag; + + cute::TmaDescriptor smem_tensormap_D_real; + cute::TmaDescriptor smem_tensormap_D_imag; + } tensormaps; + + using PipelineStorage = typename LoadPipeline::SharedStorage; + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using TensorMapStorage = typename SharedStorage::TensorMapStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Planar complex kernels have two accumulator copies for the real and imaginary tensors. + constexpr static int NumAccumulatorMtxs = 2; + + // Host side epilogue arguments + struct Arguments { + typename ThreadEpilogueOp::Params thread{}; + ElementC const** ptr_C_real = nullptr; + StrideC dC_real{}; + ElementC const** ptr_C_imag = nullptr; + StrideC dC_imag{}; + ElementD** ptr_D_real = nullptr; + StrideD dD_real{}; + ElementD** ptr_D_imag = nullptr; + StrideD dD_imag{}; + }; + + // Device side epilogue params + struct Params { + using TensorShapeC = decltype(repeat_like(append<3>(StrideC{}, _1{}), int32_t(0))); + using TensorShapeD = decltype(repeat_like(append<3>(StrideD{}, _1{}), int32_t(0))); + using TMA_C = decltype(make_tma_copy( + CopyOpG2S{}, + make_tensor( + make_gmem_ptr(static_cast,ElementD,ElementC> const*>(nullptr)), + TensorShapeC{}, + append<3>(StrideC{}, _0{})), + take<0,2>(SmemLayoutC{}), + EpilogueTile{}, + _1{})); + using TMA_D = decltype(make_tma_copy( + CopyOpS2G{}, + make_tensor( + make_gmem_ptr(static_cast(nullptr)), + TensorShapeD{}, + append<3>(StrideD{}, _0{})), + take<0,2>(SmemLayoutC{}), + EpilogueTile{}, + _1{})); + + typename ThreadEpilogueOp::Params thread{}; + TMA_C tma_load_c_real; + TMA_C tma_load_c_imag; + TMA_D tma_store_d_real; + TMA_D tma_store_d_imag; + cute::TmaDescriptor* tensormaps; + ElementC const** ptr_C_real; + ElementC const** ptr_C_imag; + ElementD** ptr_D_real; + ElementD** ptr_D_imag; + }; + + // + // Methods + // + + template + static constexpr Params + to_underlying_arguments( + ProblemShape const& problem_shape, + Arguments const& args, + void* workspace) { + // Tensor shapes for Ptr-Array are initialized correctly here. + auto [M,N,K,mock_L] = problem_shape.get_host_problem_shape(0); + // Batches/Groups are managed by using appropriate pointers to input matrices + mock_L = 1; + + typename Params::TMA_C tma_load_c_real{}; + typename Params::TMA_C tma_load_c_imag{}; + if constexpr (not cute::is_void_v) { + // Tensor pointers will be fixed before the first access + ElementC const* ptr_C_real_first_batch = nullptr; + ElementC const* ptr_C_imag_first_batch = nullptr; + Tensor tensor_c_real = make_tensor(ptr_C_real_first_batch, make_layout(make_shape(M,N,mock_L), append<3>(args.dC_real, _0{}))); + Tensor tensor_c_imag = make_tensor(ptr_C_imag_first_batch, make_layout(make_shape(M,N,mock_L), append<3>(args.dC_imag, _0{}))); + + tma_load_c_real = make_tma_copy(CopyOpG2S{}, tensor_c_real, take<0,2>(SmemLayoutC{}), EpilogueTile{}, _1{}); + tma_load_c_imag = make_tma_copy(CopyOpG2S{}, tensor_c_imag, take<0,2>(SmemLayoutC{}), EpilogueTile{}, _1{}); + } + + // Tensor pointers will be fixed before the first access + ElementD* ptr_D_real_first_batch = nullptr; + ElementD* ptr_D_imag_first_batch = nullptr; + Tensor tensor_d_real = make_tensor(ptr_D_real_first_batch, make_layout(make_shape(M,N,mock_L), append<3>(args.dD_real, _0{}))); + Tensor tensor_d_imag = make_tensor(ptr_D_imag_first_batch, make_layout(make_shape(M,N,mock_L), append<3>(args.dD_imag, _0{}))); + + typename Params::TMA_D tma_store_d_real = + make_tma_copy(CopyOpS2G{}, tensor_d_real, take<0,2>(SmemLayoutD{}), EpilogueTile{}, _1{}); + typename Params::TMA_D tma_store_d_imag = + make_tma_copy(CopyOpS2G{}, tensor_d_imag, take<0,2>(SmemLayoutD{}), EpilogueTile{}, _1{}); + + return { + args.thread, + tma_load_c_real, + tma_load_c_imag, + tma_store_d_real, + tma_store_d_imag, + static_cast(workspace), + args.ptr_C_real, + args.ptr_C_imag, + args.ptr_D_real, + args.ptr_D_imag + }; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args, int sm_count) { + constexpr uint32_t NumTensors = cute::is_void_v ? 2 : 4; + constexpr size_t SizeOfCuTensorMap = sizeof(cute::TmaDescriptor); + + return (NumTensors * SizeOfCuTensorMap * sm_count * NumTmaDescriptorsPerSm); + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, + CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits_d = cutlass::detail::get_output_alignment_bits(); + auto problem_shape_MNKL = append<4>(problem_shape.get_host_problem_shape(0), 1); + auto [M,N,K,L] = problem_shape_MNKL; + + constexpr int min_tma_aligned_elements_D = tma_alignment_bits_d / cutlass::sizeof_bits::value; + bool implementable = cutlass::detail::check_alignment(cute::make_shape(M,N,L), StrideD{}); + + if constexpr (not cute::is_void_v) { + constexpr int tma_alignment_bits_c = cutlass::detail::get_output_alignment_bits(); + constexpr int min_tma_aligned_elements_C = tma_alignment_bits_c / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,N,L), StrideC{}); + } + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + + bool beta_implementable = true; + + if constexpr (cute::is_void_v) { + if constexpr (detail::has_beta::value) { + beta_implementable = args.thread.beta == 0.0; + } + if constexpr (detail::has_beta_ptr::value) { + beta_implementable = beta_implementable && args.thread.beta_ptr == nullptr; + } + } + + if (!beta_implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Beta/beta pointer was set, but epilogue is sourceless (void-C).\n"); + } + + return implementable && beta_implementable; + } + + template + CUTLASS_HOST_DEVICE + static constexpr int + get_load_pipe_increment(CtaTileMNK cta_tile_mnk) { + // Compute number of epilogue subtiles + constexpr int epi_m = size<0>(cta_tile_mnk) / size<0>(EpilogueTile{}); + constexpr int epi_n = size<1>(cta_tile_mnk) / size<1>(EpilogueTile{}); + + return epi_m * epi_n; + } + + template + CUTLASS_HOST_DEVICE + static constexpr int + get_store_pipe_increment(CtaTileMNK cta_tile_mnk) { + return get_load_pipe_increment(cta_tile_mnk); + } + + CUTLASS_HOST_DEVICE + CollectiveEpilogue(Params const& params_, TensorStorage&) + : params(params_), epilogue_op(params_.thread) {} + + CUTLASS_DEVICE bool + is_producer_load_needed() const { + return epilogue_op.is_source_needed(); + } + + template + CUTLASS_DEVICE auto + load_init( + Params const& params, + TensorMapStorage& shared_tensormap, + int32_t const sm_count, + int32_t const sm_idx) const { + if constexpr (IsTmaAsyncUpdate) { + // Async update kernels will fetch the tensormap directly from tensormaps_init. + return cute::make_tuple(); + } else { + // Fetch a copy of tensormaps for the CTA from Params + constexpr bool IsEpiLoad = true; + auto load_tensormaps = tensormaps_init(params, shared_tensormap, sm_count, sm_idx); + return cute::make_tuple(load_tensormaps); + } + } + + template< + bool ReuseTmem = false, + class ProblemShapeMNKL, + class CtaTileMNK, + class CtaCoordMNKL, + class MmaTileMNK, + class TiledMma, + class TensorMapC + > + CUTLASS_DEVICE auto + load( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_producer_state, + ProblemShapeMNKL problem_shape_mnkl, + CtaTileMNK cta_tile_mnk, + CtaCoordMNKL cta_coord_mnkl, + MmaTileMNK mma_tile_mnk, + TiledMma tiled_mma, + TensorStorage& shared_tensors, + cute::tuple, bool> load_tensormaps_info, + bool reverse_epi_n = false) { + using namespace cute; + + // Check to see if tensormaps have been replaced in gmem + if (get<1>(load_tensormaps_info) /* did_batch_change */) { + tensormaps_fence_acquire(get<0>(load_tensormaps_info)); + } + + int lane_idx = canonical_lane_idx(); + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = cta_coord_mnkl; + + auto coord_shape = append<3>(make_shape(m_coord, n_coord),Int<0>{}); + // Tile residue + auto m_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + return get<0,i>(problem_shape_mnkl) - get<0,i>(cta_tile_mnk) * get<0,i>(cta_coord_mnkl); + })); + auto n_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + return get<1,i>(problem_shape_mnkl) - get<1,i>(cta_tile_mnk) * get<1,i>(cta_coord_mnkl); + })); + auto residue_mn = make_coord(m_max_coord, n_max_coord); + + // Represent the full source tensor, slice to get the tile this CTA is currently responsible for + Tensor mC_real_mn = params.tma_load_c_real.get_tma_tensor(append<3>(make_shape(M,N),Int<1>{})); // (M,N,L) + Tensor mC_imag_mn = params.tma_load_c_imag.get_tma_tensor(append<3>(make_shape(M,N),Int<1>{})); // (M,N,L) + + Tensor mC_real = coalesce(mC_real_mn, take<0,2>(cta_tile_mnk)); + Tensor mC_imag = coalesce(mC_imag_mn, take<0,2>(cta_tile_mnk)); + + Tensor gC_real = local_tile(mC_real, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + Tensor gC_imag = local_tile(mC_imag, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + + + // Apply epilogue subtile, get matching smem tensor + auto ptr_sC_real = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_real.begin(); + } + else { + return shared_tensors.smem_D_real.begin(); + } + }(); + auto ptr_sC_imag = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_imag.begin(); + } + else { + return shared_tensors.smem_D_imag.begin(); + } + }(); + + Tensor gC_real_epi = flat_divide(gC_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor gC_imag_epi = flat_divide(gC_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + Tensor sC_real_epi = make_tensor(make_smem_ptr(ptr_sC_real), SmemLayoutC{}); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + Tensor sC_imag_epi = make_tensor(make_smem_ptr(ptr_sC_imag), SmemLayoutC{}); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + + // Prepare the thread(b)lock's (G)mem to (S)mem TMA tiled copy (bGS_) + ThrCopy thrblk_g2s_real = params.tma_load_c_real.get_slice(Int<0>{}); + ThrCopy thrblk_g2s_imag = params.tma_load_c_imag.get_slice(Int<0>{}); + + Tensor bGS_gC_real = thrblk_g2s_real.partition_S(gC_real_epi); // (TMA,TMA_M,TMA_N,EPI_M,EPI_N) + Tensor bGS_gC_imag = thrblk_g2s_imag.partition_S(gC_imag_epi); // (TMA,TMA_M,TMA_N,EPI_M,EPI_N) + + Tensor bGS_sC_real = thrblk_g2s_real.partition_D(sC_real_epi); // (TMA,TMA_M,TMA_N,PIPE_C) + Tensor bGS_sC_imag = thrblk_g2s_imag.partition_D(sC_imag_epi); // (TMA,TMA_M,TMA_N,PIPE_C) + + // Predication for TMA load (one thread issues TMA load) + bool issue_tma_load = cute::elect_one_sync(); + + // Acquire the lock for the first stage + uint64_t* tma_barrier = load_pipeline.producer_get_barrier(load_pipe_producer_state); + load_pipeline.producer_acquire(load_pipe_producer_state); + + CUTLASS_PRAGMA_UNROLL + for (int iter_n = 0; iter_n < size<3>(gC_real_epi); ++iter_n) { + CUTLASS_PRAGMA_UNROLL + for (int iter_m = 0; iter_m < size<2>(gC_real_epi); ++iter_m) { + int epi_m = iter_m, epi_n = iter_n; + if constexpr (ReuseTmem) { + if (reverse_epi_n) { + epi_n = size<3>(gC_real_epi) - 1 - iter_n; + } + } + // Acquire the lock for this stage + constexpr uint16_t mcast_mask = 0; + uint64_t* tma_barrier = load_pipeline.producer_get_barrier(load_pipe_producer_state); + load_pipeline.producer_acquire(load_pipe_producer_state); + + // Execute the TMA load for C + if (issue_tma_load) { + copy(params.tma_load_c_real.with(get<0>(get<0>(load_tensormaps_info)), *tma_barrier, mcast_mask), + bGS_gC_real(_,_,_,epi_m,epi_n), bGS_sC_real(_,_,_,load_pipe_producer_state.index())); + copy(params.tma_load_c_imag.with(get<1>(get<0>(load_tensormaps_info)), *tma_barrier, mcast_mask), + bGS_gC_imag(_,_,_,epi_m,epi_n), bGS_sC_imag(_,_,_,load_pipe_producer_state.index())); + load_pipeline.producer_expect_transaction(load_pipe_producer_state); + } + + // Commit TMA loads for this stage and release the lock + load_pipeline.producer_commit(load_pipe_producer_state); + ++load_pipe_producer_state; + } + } + + return load_pipe_producer_state; + } + + CUTLASS_DEVICE void + load_tail( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_producer_state, + [[maybe_unused]] StorePipeline store_pipeline, + [[maybe_unused]] StorePipelineState store_pipe_producer_state) { + load_pipeline.producer_tail(load_pipe_producer_state); + } + + template + CUTLASS_DEVICE auto + store_init( + Params const& params, + TensorMapStorage& shared_tensormap, + int32_t const sm_count, + int32_t const sm_idx) const { + if constexpr (IsTmaAsyncUpdate) { + return cute::make_tuple(); + } else { + // Fetch a copy of tensormaps for the CTA from Params + constexpr bool IsEpiLoad = false; + cute::tuple store_tensormaps = {nullptr, nullptr}; + int thread_idx = threadIdx.x % ThreadCount; + int warp_idx = thread_idx / NumThreadsPerWarp; + // Only the first epilogue warp needs to perform TMA related operations + if (warp_idx == 0) { + store_tensormaps = tensormaps_init(params, shared_tensormap, sm_count, sm_idx); + } + return cute::make_tuple(store_tensormaps); + } + } + + template< + bool ReuseTmem = false, + class AccumulatorPipeline, + class AccumulatorPipelineState, + class ProblemShapeMNKL, + class CtaTileMNK, + class CtaCoordMNKL, + class MmaTileMNK, + class TiledMma, + class AccEngine, + class AccLayout, + class TensorMapD + > + CUTLASS_DEVICE auto + store( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, + StorePipelineState store_pipe_producer_state, + AccumulatorPipeline acc_pipeline, + AccumulatorPipelineState acc_pipe_consumer_state, + ProblemShapeMNKL problem_shape_mnkl, + CtaTileMNK cta_tile_mnk, + CtaCoordMNKL cta_coord_mnkl, + MmaTileMNK mma_tile_mnk, + TiledMma tiled_mma, + cute::Tensor accumulators, + TensorStorage& shared_tensors, + cute::tuple, bool> store_tensormap_info + ) { + using namespace cute; + using ElementAccumulator = typename AccEngine::value_type; + using ElementCompute = typename ThreadEpilogueOp::ElementCompute; + + static_assert(is_tmem::value, "Accumulator must be TMEM resident."); + //static_assert(rank(accumulators) == 4, "Accumulators must be MMA-partitioned: [MMA, MMA_M, MMA_N]"); + static_assert(size<1>(accumulators) == 1 && size<2>(accumulators) == 1, "TiledMMA must match partitioned ShapeMN"); + static_assert(rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4"); + static_assert(rank(CtaCoordMNKL{}) == 4, "CoordMNKL must be rank 4"); + + // Indexing variables + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = cta_coord_mnkl; + int thread_idx = threadIdx.x % ThreadCount; + int warp_idx = thread_idx / NumThreadsPerWarp; + [[maybe_unused]] int lane_idx = thread_idx % NumThreadsPerWarp; + + // Check to see if tensormaps have been replaced in gmem + // Only the first epilogue warp needs to perform TMA related operations + if (get<1>(store_tensormap_info) /* did_batch_change */ && warp_idx == 0) { + tensormaps_fence_acquire(get<0>(store_tensormap_info)); + } + + auto accumulators_real = accumulators(_,_,_,0); + auto accumulators_imag = accumulators(_,_,_,1); + + auto coord_shape = append<3>(make_shape(m_coord, n_coord),Int<0>{}); + + // Represent the full output tensor, slice to get the tile this CTA is responsible for + Tensor mD_real_mn = params.tma_store_d_real.get_tma_tensor(append<3>(make_shape(M,N),Int<1>{})); // (M,N,L) + Tensor mD_imag_mn = params.tma_store_d_imag.get_tma_tensor(append<3>(make_shape(M,N),Int<1>{})); // (M,N,L) + + Tensor mD_real = coalesce(mD_real_mn, take<0,2>(cta_tile_mnk)); + Tensor mD_imag = coalesce(mD_imag_mn, take<0,2>(cta_tile_mnk)); + + Tensor gD_real = local_tile(mD_real, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + Tensor gD_imag = local_tile(mD_imag, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + + Tensor tAcc_real = accumulators_real(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + Tensor tAcc_imag = accumulators_imag(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + + // Apply epilogue subtiling + Tensor tAcc_real_epi = flat_divide(tAcc_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor tAcc_imag_epi = flat_divide(tAcc_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + Tensor gD_real_epi = flat_divide(gD_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor gD_imag_epi = flat_divide(gD_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + // Construct the corresponding pipelined smem tensors + auto ptr_sC_real = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_real.begin(); + } + else { + return shared_tensors.smem_D_real.begin(); + } + }(); + auto ptr_sC_imag = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_imag.begin(); + } + else { + return shared_tensors.smem_D_imag.begin(); + } + }(); + + auto ptr_sD_real = shared_tensors.smem_D_real.begin(); + auto ptr_sD_imag = shared_tensors.smem_D_imag.begin(); + + Tensor sC_real_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sC_real), SmemLayoutC{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + Tensor sC_imag_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sC_imag), SmemLayoutC{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + + Tensor sD_real_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sD_real), SmemLayoutD{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + Tensor sD_imag_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sD_imag), SmemLayoutD{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + // (t)hread-partition for (t)mem to (r)egister copy (tTR_) + TiledCopy tiled_t2r = make_tmem_copy(CopyOpT2R{}, tAcc_real_epi(_,_,_0{},_0{})); + ThrCopy thread_t2r = tiled_t2r.get_slice(thread_idx); + Tensor tTR_tAcc_real = thread_t2r.partition_S(tAcc_real_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + Tensor tTR_sD_real = thread_t2r.partition_D(sD_real_epi(_,_,_0{})); // (T2R,T2R_M,T2R_N) + Tensor tTR_tAcc_imag = thread_t2r.partition_S(tAcc_imag_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + Tensor tTR_sD_imag = thread_t2r.partition_D(sD_imag_epi(_,_,_0{})); // (T2R,T2R_M,T2R_N) + + // Allocate D and accumulator registers + Tensor tTR_rAcc = make_tensor(append(shape(tTR_sD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + Tensor tTR_rD = make_tensor(append(shape(tTR_sD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + + // Vectorized fragment view + constexpr int FragmentSize = DispatchPolicy::FragmentSize; + Tensor tTR_rAcc_frg = recast>(coalesce(tTR_rAcc)); // (EPI_V) + Tensor tTR_rD_frg = recast>(coalesce(tTR_rD)); // (EPI_V) + + CUTE_STATIC_ASSERT(size(tTR_rAcc) % DispatchPolicy::FragmentSize == 0, "Fragment size does not vectorize properly"); + + // (t)hread-partition for (s)mem to (r)egister copy (tSR_) + TiledCopy tiled_s2r = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_s2r = tiled_s2r.get_slice(thread_idx); + Tensor tSR_sC_real = thread_s2r.partition_S(sC_real_epi); // (S2R,S2R_M,S2R_N,PIPE_C) + Tensor tSR_sC_imag = thread_s2r.partition_S(sC_imag_epi); // (S2R,S2R_M,S2R_N,PIPE_C) + + Layout tSR_rC_layout = thread_s2r.retile_D(tTR_rD(_,_,_,_0{})).layout(); // (S2R,S2R_M,S2R_N) + + // Allocate C registers + // If C smem load is a non-vectorized dst(i) = src(i) then we can allocate C registers directly in the compute type + // to eliminate some redundant pack+unpack instruction sequences for sub-word types + constexpr bool IsDirectS2R = cute::is_same_v + && decltype(max_common_vector(tSR_rC_layout, tSR_sC_real.layout()))::value <= 1; + using RegisterElementC = cute::conditional_t; + Tensor tTR_rC = make_tensor(append(shape(tTR_sD_real), _2{})); // (T2R,T2R_M,T2R_N) + Tensor tSR_rC = thread_s2r.retile_D(tTR_rC); // (S2R,S2R_M,S2R_N) + Tensor tTR_rC_frg = recast>(tTR_rC); // (EPI_V) + + // (t)hread-partition for (r)egister to (s)mem copy (tRS_) + TiledCopy tiled_r2s = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_rD = thread_r2s.retile_S(tTR_rD); // (R2S,R2S_M,R2S_N) + Tensor tRS_sD_real = thread_r2s.partition_D(sD_real_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + Tensor tRS_sD_imag = thread_r2s.partition_D(sD_imag_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + ThrCopy thrblk_s2g = params.tma_store_d_real.get_slice(Int<0>{}); + Tensor bSG_sD_real = thrblk_s2g.partition_S(sD_real_epi); // (S2G,S2G_M,S2G_N,PIPE_D) + Tensor bSG_gD_real = thrblk_s2g.partition_D(gD_real_epi); // (S2G,S2G_M,S2G_N,EPI_M,EPI_N) + Tensor bSG_sD_imag = thrblk_s2g.partition_S(sD_imag_epi); // (S2G,S2G_M,S2G_N,PIPE_D) + Tensor bSG_gD_imag = thrblk_s2g.partition_D(gD_imag_epi); // (S2G,S2G_M,S2G_N,EPI_M,EPI_N) + + // Coordinate tensors and residue for tile quantization + auto m_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + auto c_m = get<0,i>(problem_shape_mnkl) - get<0,i>(cta_tile_mnk) * get<0,i>(cta_coord_mnkl); + return cute::max(0, c_m); + })); + auto n_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + auto c_n = get<1,i>(problem_shape_mnkl) - get<1,i>(cta_tile_mnk) * get<1,i>(cta_coord_mnkl); + return cute::max(0, c_n); + })); + auto residue_mn = make_coord(m_max_coord, n_max_coord); + Tensor cD = make_identity_tensor(take<0,2>(cta_tile_mnk)); + Tensor tTR_cD = thread_t2r.partition_D(flat_divide(cD, EpilogueTile{})); + + bool is_source_needed = epilogue_op.is_source_needed(); + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + auto synchronize = [] () { cutlass::arch::NamedBarrier::sync(ThreadCount, cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); }; + + // Predication for sub-128 thread T2R tiled copy + Layout tmem_warp_layout = typename decltype(make_tmem_warp_partitioner(tAcc_real_epi(_,_,0,0)))::TiledLayout_TV{}; + constexpr bool predicate_tmem_load = size(tmem_warp_layout) != cosize(tmem_warp_layout); + bool issue_tmem_load = true; + + // If tmem doesn't have enough capacity to support double buffering, a portion of tmem (a column of epilogue tiles) + // is overlapped between 2 pseudo-buffers. The shared tmem portion corresponds to the last epilogue tile column of + // tmem accumulator buffer 0, and the first epilogue tile column of tmem accumulator 1. + // Thus, whenever we are processing tmem accumulator buffer 0, we process the epilogue tiles with reversed column order. + // Once the last epilogue tile column is loaded from tmem, the acc_pipeline is released. + // Then, the next accumulation stage for buffer 1 can start. + [[maybe_unused]] bool reverse_epi_n = ReuseTmem && acc_pipe_consumer_state.phase() == 0; + static_assert(not (ReuseTmem && AccumulatorPipeline::Stages != 1), "Tmem reuse requires 1 accumulator stage"); + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = warp_idx == 0; + + // In the reuse smem configuration we have StagesC smem buffers and at most StagesD committed TMA stores in flight. + // The TMA store pipeline producer acquire returns when at most StagesD-1 committed stores are in flight, so we can + // only guarantee store completion after StagesD iterations, then we can begin issuing releases on the smem buffer locks. + // store_pipe_producer_state tracks the acquire and load_pipe_consumer_state tracks the release, in circular buffer fashion. + // If TMA store supported async transaction mbarriers we would not need this synchronous release behavior. + LoadPipelineState load_wait_state = load_pipe_consumer_state; + if constexpr (ReuseSmemC) { + load_wait_state = store_pipe_producer_state; + load_wait_state.phase_ ^= 1; + } + + // We can delay issue of TMA store by one iteration to achieve better interleaving of non-TMA instructions + // Sync requirements of smem reuse may preclude this optimization + [[maybe_unused]] int epi_m_prev = 0; + [[maybe_unused]] int epi_n_prev = 0; + static_assert(not (DelayTmaStore and ReuseSmemC and StagesC <= StagesD), "This TMA epilogue configuration will deadlock"); + + // The TMA store sequence for one subtile iteration + auto tma_store_fn = [&] (int epi_m, int epi_n) { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_d_real.with(get<0>(get<0>(store_tensormap_info))), bSG_sD_real(_,_,_,store_pipe_producer_state.index()), bSG_gD_real(_,_,_,epi_m,epi_n)); + copy(params.tma_store_d_imag.with(get<1>(get<0>(store_tensormap_info))), bSG_sD_imag(_,_,_,store_pipe_producer_state.index()), bSG_gD_imag(_,_,_,epi_m,epi_n)); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + synchronize(); + + if constexpr (ReuseSmemC) { + // producer_acquire returns when at most StagesD-1 committed stores are pending + bool store_finished = store_pipe_producer_state.count() > StorePipeline::UnacquiredStages; + // Let dma warp know earliest smem buffer is consumed and empty after StagesD producer commits + if (store_finished) { + if (is_source_needed) { + load_pipeline.consumer_release(load_pipe_consumer_state); + } + ++load_pipe_consumer_state; + } + } + }; + + // + // BEGIN EPILOGUE + // + + // Begin the wait for the producer load results + ConsumerToken load_wait_token{BarrierStatus::WaitDone}; + if (is_source_needed) { + load_wait_token = load_pipeline.consumer_try_wait(load_wait_state); + } + // Begin the wait for the accumulator results + ConsumerToken acc_wait_token = acc_pipeline.consumer_try_wait(acc_pipe_consumer_state); + + // For each epilogue subtile within the CTA tile + CUTLASS_PRAGMA_UNROLL + for (int iter_n = 0; iter_n < size<3>(gD_real_epi); ++iter_n) { + CUTLASS_PRAGMA_UNROLL + for (int iter_m = 0; iter_m < size<2>(gD_real_epi); ++iter_m) { + int epi_m = iter_m, epi_n = iter_n; + bool is_first_iteration = iter_m == 0 && iter_n == 0; + bool is_last_iteration = iter_m == size<2>(gD_real_epi)-1 && iter_n == size<3>(gD_real_epi)-1; + bool do_acc_release = is_last_iteration; + + // Reverse subtile order for tmem reuse if necessary + if constexpr (ReuseTmem) { + if (reverse_epi_n) { + epi_n = size<3>(gD_real_epi) - 1 - iter_n; + } + do_acc_release = iter_m == size<2>(gD_real_epi)-1 && iter_n == 0; + } + + if (is_source_needed) { + // Wait for the producer load to fill smem + load_pipeline.consumer_wait(load_wait_state, load_wait_token); + + // Copy source tile from smem to register // residual smem -> reg + copy(tiled_s2r, tSR_sC_real(_,_,_,load_wait_state.index()), tSR_rC(_,_,_,0)); + copy(tiled_s2r, tSR_sC_imag(_,_,_,load_wait_state.index()), tSR_rC(_,_,_,1)); + } + + if (is_source_needed) { + // Let producer load warp know smem buffers are consumed and empty + if constexpr (not ReuseSmemC) { + cutlass::arch::fence_view_async_shared(); + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + ++load_wait_state; + } + + if (is_first_iteration) { + // Wait for mma warp to fill tmem buffer with accumulator results + acc_pipeline.consumer_wait(acc_pipe_consumer_state, acc_wait_token); + } + + // The current tile in tmem + Tensor tTR_tAcc_real_mn = tTR_tAcc_real(_,_,_,epi_m,epi_n); + Tensor tTR_tAcc_imag_mn = tTR_tAcc_imag(_,_,_,epi_m,epi_n); + + // Compute tmem load predication if necessary + if constexpr (predicate_tmem_load) { + // Issue tmem load if this tile's tmem subpartition is accessible by this warp + int subpart_idx = (tTR_tAcc_real_mn.data().dp_ / 32) % 4; + issue_tmem_load = warp_idx == subpart_idx; + } + + // Copy accumulator tile from tmem to register + if (issue_tmem_load) { // acc tmem -> reg + copy(tiled_t2r, tTR_tAcc_real_mn, tTR_rAcc(_,_,_,0)); + copy(tiled_t2r, tTR_tAcc_imag_mn, tTR_rAcc(_,_,_,1)); + } + + // After the last tmem load, signal that tmem buffer is consumed and empty + if (do_acc_release) { + cutlass::arch::fence_view_async_tmem_load(); + acc_pipeline.consumer_release(acc_pipe_consumer_state); + ++acc_pipe_consumer_state; + } + + // Vectorized fragment loop with visitor callback entry point + if (epilogue_op.is_source_needed()) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rD_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i), tTR_rC_frg(i)); + } + } else { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rD_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i)); + } + } + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the previous subtile + if (not is_first_iteration) { + tma_store_fn(epi_m_prev, epi_n_prev); + } + epi_m_prev = epi_m; + epi_n_prev = epi_n; + } + + // Copy output tile from register to smem + bool issue_smem_store = issue_tmem_load; + if (issue_smem_store) { // after scale, reg -> smem + copy(tiled_r2s, tRS_rD(_,_,_,0), tRS_sD_real(_,_,_,store_pipe_producer_state.index())); + copy(tiled_r2s, tRS_rD(_,_,_,1), tRS_sD_imag(_,_,_,store_pipe_producer_state.index())); + } + + if constexpr (not DelayTmaStore) { + // Issue TMA stores for this subtile + tma_store_fn(epi_m, epi_n); + } + + if (is_source_needed) { + // Begin the wait for the next subtile producer load + load_wait_token = load_pipeline.consumer_try_wait(load_wait_state, is_last_iteration); + } + } // for epi_m + } // for epi_n + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the last subtile + tma_store_fn(epi_m_prev, epi_n_prev); + } + + return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state, acc_pipe_consumer_state); + } + + template + CUTLASS_DEVICE void + store_tail( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, + StorePipelineState store_pipe_producer_state, + CtaTileMNK cta_tile_mnk) { + if constexpr (ReuseSmemC) { + if (epilogue_op.is_source_needed()) { + // wait for all TMA stores to complete + store_pipeline.producer_tail(store_pipe_producer_state); + + // Issue releases on up to StagesD-1 previously issued TMA stores + constexpr int release_stages = cute::min(StorePipeline::UnacquiredStages, get_load_pipe_increment(cta_tile_mnk)); + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < release_stages; ++stage) { + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + } + } + } + + // + // Methods to perform different parts of TMA/Tensormap modifications + // + + template + CUTLASS_DEVICE auto + tensormaps_init(Params const& params, + TensorMapStorage& shared_tensormap, + int32_t const sm_count, + int32_t const sm_idx, + bool const is_leader_warp = true) const { + // Define a local struct that provides simple array indexing for TMA descriptors + struct TensorMapArray { + cute::TmaDescriptor* tma_desc_real; + cute::TmaDescriptor* tma_desc_imag; + + TensorMapArray() = default; + + CUTLASS_DEVICE + TensorMapArray(cute::TmaDescriptor* desc_real, cute::TmaDescriptor* desc_imag) + : tma_desc_real(desc_real), tma_desc_imag(desc_imag) {} + + CUTLASS_DEVICE + cute::tuple + operator[](int32_t idx) const { + idx = idx % NumTmaDescriptorsPerSm; + return cute::make_tuple(tma_desc_real + idx, tma_desc_imag + idx); + } + }; + + cute::TmaDescriptor* tma_desc_real = nullptr; + cute::TmaDescriptor* tma_desc_imag = nullptr; + cute::TmaDescriptor* gmem_tensormap = params.tensormaps; + + if (!is_leader_warp) { + if constexpr (IsTmaAsyncUpdate) { + return TensorMapArray{tma_desc_real, tma_desc_imag}; + } else { + return cute::make_tuple(tma_desc_real, tma_desc_imag); + } + } + if constexpr (IsLoad) { + if constexpr (not cute::is_void_v) { + tma_desc_real = &gmem_tensormap[sm_idx * NumTmaDescriptorsPerSm]; + tma_desc_imag = &gmem_tensormap[(sm_idx + sm_count) * NumTmaDescriptorsPerSm]; + + if (cute::elect_one_sync()) { + // Bringing tensormaps from params to smem for modification later + Tensor pC_real_tensormap = make_tensor(params.tma_load_c_real.get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sC_real_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_C_real), Int<1>{}, Int<1>{}); + Tensor pC_imag_tensormap = make_tensor(params.tma_load_c_imag.get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sC_imag_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_C_imag), Int<1>{}, Int<1>{}); + + copy(recast(pC_real_tensormap), recast(sC_real_tensormap)); + copy(recast(pC_imag_tensormap), recast(sC_imag_tensormap)); + } + __syncwarp(); + } + } else { + int const offset_Ddesc = cute::is_void_v ? 0 : (2 * sm_count); + tma_desc_real = &gmem_tensormap[(sm_idx + offset_Ddesc) * NumTmaDescriptorsPerSm]; + tma_desc_imag = &gmem_tensormap[(sm_idx + offset_Ddesc + sm_count) * NumTmaDescriptorsPerSm]; + + if (cute::elect_one_sync()) { + // Bringing tensormaps from params to gmem for modification later + Tensor pD_real_tensormap = make_tensor(params.tma_store_d_real.get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sD_real_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_D_real), Int<1>{}, Int<1>{}); + Tensor pD_imag_tensormap = make_tensor(params.tma_store_d_imag.get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sD_imag_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_D_imag), Int<1>{}, Int<1>{}); + + copy(recast(pD_real_tensormap), recast(sD_real_tensormap)); + copy(recast(pD_imag_tensormap), recast(sD_imag_tensormap)); + } + __syncwarp(); + } + + if constexpr (IsTmaAsyncUpdate) { + return TensorMapArray{tma_desc_real, tma_desc_imag}; + } else { + return cute::make_tuple(tma_desc_real, tma_desc_imag); + } + } + + // Replace address for the global tensor (to be done by single thread) + template + CUTLASS_DEVICE + void + tensormaps_replace_global_address( + TensorMapStorage& shared_tensormap, + Params const& params, + int32_t next_batch) { + // Replacing global_address for the next batch + if constexpr (IsLoad) { + if (not cute::is_void_v) { + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_C_real, + params.ptr_C_real[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_C_imag, + params.ptr_C_imag[next_batch]); + } + } else { + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_D_real, + params.ptr_D_real[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_D_imag, + params.ptr_D_imag[next_batch]); + } + } + + template + CUTLASS_DEVICE + void + tensormaps_perform_update( + TensorMapStorage& shared_tensormap, + Params const& params, + cute::tuple const& tensormaps, + [[maybe_unused]] ProblemShape problem_shape, + int32_t next_batch + ) { + if (cute::elect_one_sync()) { + // Replacing global_address for the next batch + tensormaps_replace_global_address(shared_tensormap, params, next_batch); + } + // Ensure warp is converged before issuing tensormap fence release + __syncwarp(); + // Entire warp must do this (ie its aligned) + tensormaps_cp_fence_release( + shared_tensormap, + tensormaps + ); + } + + template + CUTLASS_DEVICE + void + tensormaps_cp_fence_release( + TensorMapStorage& shared_tensormap, + cute::tuple const& tensormaps + ) { + // Commit and wait for all TMA load/store instructions before updating the tensormap in gmem if we're not using async update. + // This operation only happens when the group/batch changes between consecutive tiles. + // If there are no uncommitted instructions then tma_desc_commit_group results in an empty bulk async-group. + auto tma_desc_wait_all_fn = [] () CUTLASS_LAMBDA_FUNC_INLINE { + if (cute::elect_one_sync()) { + cute::tma_desc_commit_group(); + cute::tma_desc_wait_group(); + } + }; + + // Entire warp must do this (ie its aligned) + if constexpr (IsLoad) { + if constexpr (not cute::is_void_v) { + if constexpr (WaitForInflightTmaRequests) { + tma_desc_wait_all_fn(); + } + tma_descriptor_cp_fence_release(get<0>(tensormaps), shared_tensormap.smem_tensormap_C_real); + tma_descriptor_cp_fence_release(get<1>(tensormaps), shared_tensormap.smem_tensormap_C_imag); + } + } else { + if constexpr (WaitForInflightTmaRequests) { + tma_desc_wait_all_fn(); + } + tma_descriptor_cp_fence_release(get<0>(tensormaps), shared_tensormap.smem_tensormap_D_real); + tma_descriptor_cp_fence_release(get<1>(tensormaps), shared_tensormap.smem_tensormap_D_imag); + } + } + + template + CUTLASS_DEVICE + void + tensormaps_fence_acquire(cute::tuple const& tensormaps) { + if constexpr (IsLoad) { + if constexpr (not cute::is_void_v) { + cute::tma_descriptor_fence_acquire(get<0>(tensormaps)); + cute::tma_descriptor_fence_acquire(get<1>(tensormaps)); + } + } else { + cute::tma_descriptor_fence_acquire(get<0>(tensormaps)); + cute::tma_descriptor_fence_acquire(get<1>(tensormaps)); + } + } + +private: + Params const& params; + ThreadEpilogueOp epilogue_op; +}; + + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::epilogue::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_array_tma_warpspecialized.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_array_tma_warpspecialized.hpp index 04f1eec8..9ad99b13 100644 --- a/include/cutlass/epilogue/collective/sm100_epilogue_array_tma_warpspecialized.hpp +++ b/include/cutlass/epilogue/collective/sm100_epilogue_array_tma_warpspecialized.hpp @@ -1532,6 +1532,7 @@ public: ProblemShape problem_shape, int32_t next_batch ) { + __syncwarp(); if (cute::elect_one_sync()) { // Replacing global_address for the next batch tensormaps_replace_global_address(shared_tensormap, params, next_batch); diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_nosmem.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_nosmem.hpp index bf7e1b6a..c8944f15 100644 --- a/include/cutlass/epilogue/collective/sm100_epilogue_nosmem.hpp +++ b/include/cutlass/epilogue/collective/sm100_epilogue_nosmem.hpp @@ -214,6 +214,8 @@ protected: public: template< bool ReuseTmem = false, + class LoadPipeline, + class LoadPipelineState, class AccumulatorPipeline, class AccumulatorPipelineState, class ProblemShapeMNKL, @@ -223,6 +225,8 @@ public: > CUTLASS_DEVICE auto operator()( + [[maybe_unused]]LoadPipeline load_pipeline, + [[maybe_unused]]LoadPipelineState load_pipe_consumer_state, AccumulatorPipeline acc_pipeline, AccumulatorPipelineState acc_pipe_consumer_state, ProblemShapeMNKL problem_shape_mnkl, @@ -352,7 +356,7 @@ public: copy_if(tDpD, tTR_rD_src, tR2G_rD_dst); } - return cute::make_tuple(acc_pipe_consumer_state); + return cute::make_tuple(acc_pipe_consumer_state, load_pipe_consumer_state); } @@ -571,6 +575,8 @@ public: template< bool ReuseTmem = false, + class LoadPipeline, + class LoadPipelineState, class AccumulatorPipeline, class AccumulatorPipelineState, class ProblemShapeMNKL, @@ -580,6 +586,8 @@ public: > CUTLASS_DEVICE auto operator()( + [[maybe_unused]]LoadPipeline load_pipeline, + [[maybe_unused]]LoadPipelineState load_pipe_consumer_state, AccumulatorPipeline acc_pipeline, AccumulatorPipelineState acc_pipe_consumer_state, ProblemShapeMNKL problem_shape_mnkl, @@ -788,7 +796,7 @@ public: // auto cst_callbacks = fusion_callbacks.template get_consumer_store_callbacks(cst_args); epi_loop_fn(cst_callbacks); - return cute::make_tuple(acc_pipe_consumer_state); + return cute::make_tuple(acc_pipe_consumer_state, load_pipe_consumer_state); } }; diff --git a/include/cutlass/epilogue/collective/sm100_epilogue_planar_complex_tma_warpspecialized.hpp b/include/cutlass/epilogue/collective/sm100_epilogue_planar_complex_tma_warpspecialized.hpp new file mode 100644 index 00000000..e9b8d18e --- /dev/null +++ b/include/cutlass/epilogue/collective/sm100_epilogue_planar_complex_tma_warpspecialized.hpp @@ -0,0 +1,897 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Functor performing elementwise operations used by Planar Complex Gemm epilogues. +*/ + + + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/arch/barrier.h" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/detail.hpp" +#include "cutlass/epilogue/thread/scale_type.h" +#include "cutlass/epilogue/thread/linear_combination_planar_complex.h" +#include "cutlass/detail/layout.hpp" +#include "cutlass/trace.h" + +#include "cute/tensor.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::epilogue::collective { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template < + int StagesC_, + int StagesD_, + int FragmentSize_, + bool ReuseSmemC_, + bool DelayTmaStore_, + class CtaTileShape_, // (CTA_M,CTA_N,CTA_K, optional: Tile_L) + class EpilogueTile_, // (EPI_TILE_M, EPI_TILE_N) + class ElementC_, + class StrideC_, + class ElementD_, + class StrideD_, + class ThreadEpilogueOp_, + class CopyOpT2R_, + class CopyOpG2S_, + class SmemLayoutAtomC_, + class CopyOpS2R_, + class CopyOpS2G_, + class SmemLayoutAtomD_, + class CopyOpR2S_, + class CopyOpR2R_ +> +class CollectiveEpilogue< + Sm100PlanarComplexTmaWarpSpecialized, + CtaTileShape_, + EpilogueTile_, + ElementC_, + StrideC_, + ElementD_, + StrideD_, + ThreadEpilogueOp_, + CopyOpT2R_, + CopyOpG2S_, + SmemLayoutAtomC_, + CopyOpS2R_, + CopyOpS2G_, + SmemLayoutAtomD_, + CopyOpR2S_, + CopyOpR2R_ +> { +public: + // + // Type Aliases + // + using DispatchPolicy = Sm100PlanarComplexTmaWarpSpecialized; + using CtaTileShape = CtaTileShape_; + using EpilogueTile = EpilogueTile_; + using ThreadEpilogueOp = ThreadEpilogueOp_; + using ElementC = ElementC_; + using StrideC = StrideC_; + using ElementD = ElementD_; + using StrideD = StrideD_; + using CopyOpT2R = CopyOpT2R_; + using CopyOpG2S = CopyOpG2S_; + using SmemLayoutAtomC = SmemLayoutAtomC_; + using CopyOpS2R = CopyOpS2R_; + using CopyOpS2G = CopyOpS2G_; + using SmemLayoutAtomD = SmemLayoutAtomD_; + using CopyOpR2S = CopyOpR2S_; + using CopyOpR2R = CopyOpR2R_; + + using GmemTiledCopyC = CopyOpG2S; + using GmemTiledCopyD = CopyOpS2G; + + constexpr static int ThreadCount = 128; + + static_assert(!is_layout::value && is_tuple::value, "EpilogueTile must be a cute::Tile or cute::Shape"); + static_assert(rank(EpilogueTile{}) == 2, "EpilogueTile must be rank-2: [EPI_TILE_M, EPI_TILE_N]"); + +private: + using SmemElementD = typename cutlass::detail::get_unpacked_element_type::type; + using SmemElementC = typename cutlass::detail::get_unpacked_element_type,ElementD,ElementC>>::type; // prevents void ref breakages + constexpr static int StagesC = StagesC_; + constexpr static int StagesD = StagesD_; + constexpr static bool ReuseSmemC = ReuseSmemC_; + constexpr static bool DelayTmaStore = DelayTmaStore_; + constexpr static bool is_source_supported = ThreadEpilogueOp::kScale == cutlass::epilogue::thread::ScaleType::Default; + + constexpr static bool is_m_major_C = detail::is_m_major(); + constexpr static bool is_m_major_D = detail::is_m_major(); + + using SmemLayoutC = decltype(tile_to_shape( + SmemLayoutAtomC{}, + make_shape(size<0>(shape(EpilogueTile{})), size<1>(shape(EpilogueTile{})), Int{}), + cute::conditional_t, Step<_1,_2,_3>>{} )); + using SmemLayoutD = decltype(tile_to_shape( + SmemLayoutAtomD{}, + make_shape(size<0>(shape(EpilogueTile{})), size<1>(shape(EpilogueTile{})), Int{}), + cute::conditional_t, Step<_1,_2,_3>>{} )); + + constexpr static bool support_smem_reuse = is_source_supported && StagesD <= StagesC + && cosize(take<0,2>(SmemLayoutC{})) == cosize(take<0,2>(SmemLayoutD{})); + static_assert(not (ReuseSmemC && not support_smem_reuse), "Smem reuse requirements not met"); + + constexpr static size_t SmemAlignmentD = cutlass::detail::alignment_for_swizzle(SmemLayoutD{}); + constexpr static size_t SmemAlignmentC = cutlass::detail::alignment_for_swizzle(SmemLayoutC{}); + +public : + struct TensorStorageWithC { + alignas(SmemAlignmentC) cute::ArrayEngine> smem_C_real; + alignas(SmemAlignmentC) cute::ArrayEngine> smem_C_imag; + + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_real; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_imag; + }; + + struct TensorStorageWithoutC { + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_real; + alignas(SmemAlignmentD) cute::ArrayEngine> smem_D_imag; + }; + +public: + // TMA pipeline for loading C + using LoadPipeline = cutlass::PipelineTransactionAsync; + using LoadPipelineState = cutlass::PipelineState; + constexpr static uint32_t TmaTransactionBytes = + 2 * ((size(take<0,2>(SmemLayoutC{})) * static_cast(sizeof_bits::value)) / 8); + + // TMA pipeline for storing D + using StorePipeline = cute::conditional_t, + cutlass::PipelineTmaStore>; + using StorePipelineState = cutlass::PipelineState; + + struct SharedStorage { + using TensorStorage = + cute::conditional_t; + TensorStorage tensors; + + using PipelineStorage = typename LoadPipeline::SharedStorage; + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Planar complex kernels have two accumulator copies for the real and imaginary tensors. + constexpr static int NumAccumulatorMtxs = 2; + + // Host side epilogue arguments + struct Arguments { + typename ThreadEpilogueOp::Params thread{}; + ElementC const* ptr_C_real = nullptr; + StrideC dC_real{}; + ElementC const* ptr_C_imag = nullptr; + StrideC dC_imag{}; + ElementD* ptr_D_real = nullptr; + StrideD dD_real{}; + ElementD* ptr_D_imag = nullptr; + StrideD dD_imag{}; + }; + + // Device side epilogue params + struct Params { + using TMA_C = decltype(make_tma_copy( + CopyOpG2S{}, + make_tensor( + make_gmem_ptr(static_cast,ElementD,ElementC> const*>(nullptr)), + repeat_like(append<3>(StrideC{}, _1{}), int32_t(0)), + append<3>(StrideC{}, _0{})), + take<0,2>(SmemLayoutC{}), + EpilogueTile{}, + _1{})); + using TMA_D = decltype(make_tma_copy( + CopyOpS2G{}, + make_tensor( + make_gmem_ptr(static_cast(nullptr)), + repeat_like(append<3>(StrideD{}, _1{}), int32_t(0)), + append<3>(StrideD{}, _0{})), + take<0,2>(SmemLayoutC{}), + EpilogueTile{}, + _1{})); + + typename ThreadEpilogueOp::Params thread{}; + TMA_C tma_load_c_real; + TMA_C tma_load_c_imag; + TMA_D tma_store_d_real; + TMA_D tma_store_d_imag; + }; + + // + // Methods + // + + template + static constexpr Params + to_underlying_arguments( + ProblemShape const& problem_shape, + Arguments const& args, + [[maybe_unused]] void* workspace) { + // Optionally append 1s until problem shape is rank-4 in case its is only rank-3 (MNK) + auto problem_shape_mnkl = append<4>(problem_shape, 1); + auto [M, N, K, L] = problem_shape_mnkl; + + typename Params::TMA_C tma_load_c_real{}; + typename Params::TMA_C tma_load_c_imag{}; + if constexpr (not cute::is_void_v) { + Tensor tensor_c_real = make_tensor(make_gmem_ptr(args.ptr_C_real), make_layout(make_shape(M,N,L), append<3>(args.dC_real, _0{}))); + Tensor tensor_c_imag = make_tensor(make_gmem_ptr(args.ptr_C_imag), make_layout(make_shape(M,N,L), append<3>(args.dC_imag, _0{}))); + + tma_load_c_real = make_tma_copy(CopyOpG2S{}, tensor_c_real, take<0,2>(SmemLayoutC{}), EpilogueTile{}, _1{}); + tma_load_c_imag = make_tma_copy(CopyOpG2S{}, tensor_c_imag, take<0,2>(SmemLayoutC{}), EpilogueTile{}, _1{}); + } + + Tensor tensor_d_real = make_tensor(make_gmem_ptr(args.ptr_D_real), make_layout(make_shape(M,N,L), append<3>(args.dD_real, _0{}))); + Tensor tensor_d_imag = make_tensor(make_gmem_ptr(args.ptr_D_imag), make_layout(make_shape(M,N,L), append<3>(args.dD_imag, _0{}))); + + typename Params::TMA_D tma_store_d_real = + make_tma_copy(CopyOpS2G{}, tensor_d_real, take<0,2>(SmemLayoutD{}), EpilogueTile{}, _1{}); + typename Params::TMA_D tma_store_d_imag = + make_tma_copy(CopyOpS2G{}, tensor_d_imag, take<0,2>(SmemLayoutD{}), EpilogueTile{}, _1{}); + + return { + args.thread, + tma_load_c_real, + tma_load_c_imag, + tma_store_d_real, + tma_store_d_imag + }; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args) { + return 0; + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, + CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits_d = cutlass::detail::get_output_alignment_bits(); + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + constexpr int min_tma_aligned_elements_D = tma_alignment_bits_d / cutlass::sizeof_bits::value; + bool implementable = cutlass::detail::check_alignment(cute::make_shape(M,N,L), StrideD{}); + + if constexpr (not cute::is_void_v) { + constexpr int tma_alignment_bits_c = cutlass::detail::get_output_alignment_bits(); + constexpr int min_tma_aligned_elements_C = tma_alignment_bits_c / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,N,L), StrideC{}); + } + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + + bool beta_implementable = true; + + if constexpr (cute::is_void_v) { + if constexpr (detail::has_beta::value) { + beta_implementable = args.thread.beta == 0.0; + } + if constexpr (detail::has_beta_ptr::value) { + beta_implementable = beta_implementable && args.thread.beta_ptr == nullptr; + } + } + + if (!beta_implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Beta/beta pointer was set, but epilogue is sourceless (void-C).\n"); + } + + return implementable && beta_implementable; + } + + template + CUTLASS_HOST_DEVICE + static constexpr int + get_load_pipe_increment(CtaTileMNK cta_tile_mnk) { + // Compute number of epilogue subtiles + constexpr int epi_m = size<0>(cta_tile_mnk) / size<0>(EpilogueTile{}); + constexpr int epi_n = size<1>(cta_tile_mnk) / size<1>(EpilogueTile{}); + + return epi_m * epi_n; + } + + template + CUTLASS_HOST_DEVICE + static constexpr int + get_store_pipe_increment(CtaTileMNK cta_tile_mnk) { + return get_load_pipe_increment(cta_tile_mnk); + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE static void + prefetch_tma_descriptors(Params const& epilogue_params) { + cute::prefetch_tma_descriptor(epilogue_params.tma_load_c_real.get_tma_descriptor()); + cute::prefetch_tma_descriptor(epilogue_params.tma_load_c_imag.get_tma_descriptor()); + cute::prefetch_tma_descriptor(epilogue_params.tma_store_d_real.get_tma_descriptor()); + cute::prefetch_tma_descriptor(epilogue_params.tma_store_d_imag.get_tma_descriptor()); + } + + CUTLASS_HOST_DEVICE + CollectiveEpilogue(Params const& params_, TensorStorage&) + : params(params_), epilogue_op(params_.thread) {} + + CUTLASS_DEVICE bool + is_producer_load_needed() const { + return epilogue_op.is_source_needed(); + } + + template< + bool ReuseTmem = false, + class ProblemShapeMNKL, + class CtaTileMNK, + class CtaCoordMNKL, + class MmaTileMNK, + class TiledMma + > + CUTLASS_DEVICE auto + load( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_producer_state, + ProblemShapeMNKL problem_shape_mnkl, + CtaTileMNK cta_tile_mnk, + CtaCoordMNKL cta_coord_mnkl, + MmaTileMNK mma_tile_mnk, + TiledMma tiled_mma, + TensorStorage& shared_tensors, + bool reverse_epi_n = false) { + using namespace cute; + + int lane_idx = canonical_lane_idx(); + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = cta_coord_mnkl; + + auto coord_shape = make_coord(m_coord, n_coord, l_coord); + + // Tile residue + auto m_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + return get<0,i>(problem_shape_mnkl) - get<0,i>(cta_tile_mnk) * get<0,i>(cta_coord_mnkl); + })); + auto n_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + return get<1,i>(problem_shape_mnkl) - get<1,i>(cta_tile_mnk) * get<1,i>(cta_coord_mnkl); + })); + auto residue_mn = make_coord(m_max_coord, n_max_coord); + + // Represent the full source tensor, slice to get the tile this CTA is currently responsible for + Tensor mC_real_mn = params.tma_load_c_real.get_tma_tensor(make_shape(M,N,L)); // (M,N,L) + Tensor mC_imag_mn = params.tma_load_c_imag.get_tma_tensor(make_shape(M,N,L)); // (M,N,L) + + Tensor mC_real = coalesce(mC_real_mn, take<0,2>(cta_tile_mnk)); + Tensor mC_imag = coalesce(mC_imag_mn, take<0,2>(cta_tile_mnk)); + + Tensor gC_real = local_tile(mC_real, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + Tensor gC_imag = local_tile(mC_imag, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + + + // Apply epilogue subtile, get matching smem tensor + auto ptr_sC_real = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_real.begin(); + } + else { + return shared_tensors.smem_D_real.begin(); + } + }(); + auto ptr_sC_imag = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_imag.begin(); + } + else { + return shared_tensors.smem_D_imag.begin(); + } + }(); + + Tensor gC_real_epi = flat_divide(gC_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor gC_imag_epi = flat_divide(gC_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + Tensor sC_real_epi = make_tensor(make_smem_ptr(ptr_sC_real), SmemLayoutC{}); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + Tensor sC_imag_epi = make_tensor(make_smem_ptr(ptr_sC_imag), SmemLayoutC{}); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + + // Prepare the thread(b)lock's (G)mem to (S)mem TMA tiled copy (bGS_) + ThrCopy thrblk_g2s_real = params.tma_load_c_real.get_slice(Int<0>{}); + ThrCopy thrblk_g2s_imag = params.tma_load_c_imag.get_slice(Int<0>{}); + + Tensor bGS_gC_real = thrblk_g2s_real.partition_S(gC_real_epi); // (TMA,TMA_M,TMA_N,EPI_M,EPI_N) + Tensor bGS_gC_imag = thrblk_g2s_imag.partition_S(gC_imag_epi); // (TMA,TMA_M,TMA_N,EPI_M,EPI_N) + + Tensor bGS_sC_real = thrblk_g2s_real.partition_D(sC_real_epi); // (TMA,TMA_M,TMA_N,PIPE_C) + Tensor bGS_sC_imag = thrblk_g2s_imag.partition_D(sC_imag_epi); // (TMA,TMA_M,TMA_N,PIPE_C) + + // Predication for TMA load (one thread issues TMA load) + bool issue_tma_load = cute::elect_one_sync(); + + // Acquire the lock for the first stage + uint64_t* tma_barrier = load_pipeline.producer_get_barrier(load_pipe_producer_state); + load_pipeline.producer_acquire(load_pipe_producer_state); + + CUTLASS_PRAGMA_UNROLL + for (int iter_n = 0; iter_n < size<3>(gC_real_epi); ++iter_n) { + CUTLASS_PRAGMA_UNROLL + for (int iter_m = 0; iter_m < size<2>(gC_real_epi); ++iter_m) { + int epi_m = iter_m, epi_n = iter_n; + if constexpr (ReuseTmem) { + if (reverse_epi_n) { + epi_n = size<3>(gC_real_epi) - 1 - iter_n; + } + } + // Acquire the lock for this stage + constexpr uint16_t mcast_mask = 0; + uint64_t* tma_barrier = load_pipeline.producer_get_barrier(load_pipe_producer_state); + load_pipeline.producer_acquire(load_pipe_producer_state); + + // Execute the TMA load for C + if (issue_tma_load) { + copy(params.tma_load_c_real.with(*tma_barrier, mcast_mask), + bGS_gC_real(_,_,_,epi_m,epi_n), bGS_sC_real(_,_,_,load_pipe_producer_state.index())); + copy(params.tma_load_c_imag.with(*tma_barrier, mcast_mask), + bGS_gC_imag(_,_,_,epi_m,epi_n), bGS_sC_imag(_,_,_,load_pipe_producer_state.index())); + load_pipeline.producer_expect_transaction(load_pipe_producer_state); + } + + // Commit TMA loads for this stage and release the lock + load_pipeline.producer_commit(load_pipe_producer_state); + ++load_pipe_producer_state; + } + } + + return load_pipe_producer_state; + } + + CUTLASS_DEVICE void + load_tail( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_producer_state, + [[maybe_unused]] StorePipeline store_pipeline, + [[maybe_unused]] StorePipelineState store_pipe_producer_state) { + load_pipeline.producer_tail(load_pipe_producer_state); + } + + template< + bool ReuseTmem = false, + class AccumulatorPipeline, + class AccumulatorPipelineState, + class ProblemShapeMNKL, + class CtaTileMNK, + class CtaCoordMNKL, + class MmaTileMNK, + class TiledMma, + class AccEngine, + class AccLayout + > + CUTLASS_DEVICE auto + store( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, + StorePipelineState store_pipe_producer_state, + AccumulatorPipeline acc_pipeline, + AccumulatorPipelineState acc_pipe_consumer_state, + ProblemShapeMNKL problem_shape_mnkl, + CtaTileMNK cta_tile_mnk, + CtaCoordMNKL cta_coord_mnkl, + MmaTileMNK mma_tile_mnk, + TiledMma tiled_mma, + cute::Tensor accumulators, + TensorStorage& shared_tensors + ) { + using namespace cute; + using ElementAccumulator = typename AccEngine::value_type; + using ElementCompute = typename ThreadEpilogueOp::ElementCompute; + + static_assert(is_tmem::value, "Accumulator must be TMEM resident."); + //static_assert(rank(accumulators) == 4, "Accumulators must be MMA-partitioned: [MMA, MMA_M, MMA_N]"); + static_assert(size<1>(accumulators) == 1 && size<2>(accumulators) == 1, "TiledMMA must match partitioned ShapeMN"); + static_assert(rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4"); + static_assert(rank(CtaCoordMNKL{}) == 4, "CoordMNKL must be rank 4"); + + // Indexing variables + auto [M, N, K, L] = problem_shape_mnkl; + auto [m_coord, n_coord, k_coord, l_coord] = cta_coord_mnkl; + int thread_idx = threadIdx.x % ThreadCount; + int warp_idx = thread_idx / NumThreadsPerWarp; + [[maybe_unused]] int lane_idx = thread_idx % NumThreadsPerWarp; + + auto accumulators_real = accumulators(_,_,_,0); + auto accumulators_imag = accumulators(_,_,_,1); + + auto coord_shape = make_coord(m_coord, n_coord, l_coord); + + // Represent the full output tensor, slice to get the tile this CTA is responsible for + Tensor mD_real_mn = params.tma_store_d_real.get_tma_tensor(make_shape(M,N,L)); // (M,N,L) + Tensor mD_imag_mn = params.tma_store_d_imag.get_tma_tensor(make_shape(M,N,L)); // (M,N,L) + + Tensor mD_real = coalesce(mD_real_mn, take<0,2>(cta_tile_mnk)); + Tensor mD_imag = coalesce(mD_imag_mn, take<0,2>(cta_tile_mnk)); + + Tensor gD_real = local_tile(mD_real, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + Tensor gD_imag = local_tile(mD_imag, take<0,2>(cta_tile_mnk), coord_shape); // (CTA_M,CTA_N) + + Tensor tAcc_real = accumulators_real(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + Tensor tAcc_imag = accumulators_imag(make_coord(_,_),_0{},_0{}); // (CTA_M,CTA_N) + + // Apply epilogue subtiling + Tensor tAcc_real_epi = flat_divide(tAcc_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor tAcc_imag_epi = flat_divide(tAcc_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + Tensor gD_real_epi = flat_divide(gD_real, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + Tensor gD_imag_epi = flat_divide(gD_imag, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + + // Construct the corresponding pipelined smem tensors + auto ptr_sC_real = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_real.begin(); + } + else { + return shared_tensors.smem_D_real.begin(); + } + }(); + auto ptr_sC_imag = [&]() { + if constexpr (not ReuseSmemC and is_source_supported) { + return shared_tensors.smem_C_imag.begin(); + } + else { + return shared_tensors.smem_D_imag.begin(); + } + }(); + + auto ptr_sD_real = shared_tensors.smem_D_real.begin(); + auto ptr_sD_imag = shared_tensors.smem_D_imag.begin(); + + Tensor sC_real_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sC_real), SmemLayoutC{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + Tensor sC_imag_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sC_imag), SmemLayoutC{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_C) + + Tensor sD_real_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sD_real), SmemLayoutD{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + Tensor sD_imag_epi = cute::as_position_independent_swizzle_tensor( + make_tensor(make_smem_ptr(ptr_sD_imag), SmemLayoutD{})); // (EPI_TILE_M,EPI_TILE_N,PIPE_D) + + // (t)hread-partition for (t)mem to (r)egister copy (tTR_) + TiledCopy tiled_t2r = make_tmem_copy(CopyOpT2R{}, tAcc_real_epi(_,_,_0{},_0{})); + ThrCopy thread_t2r = tiled_t2r.get_slice(thread_idx); + Tensor tTR_tAcc_real = thread_t2r.partition_S(tAcc_real_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + Tensor tTR_sD_real = thread_t2r.partition_D(sD_real_epi(_,_,_0{})); // (T2R,T2R_M,T2R_N) + Tensor tTR_tAcc_imag = thread_t2r.partition_S(tAcc_imag_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N) + Tensor tTR_sD_imag = thread_t2r.partition_D(sD_imag_epi(_,_,_0{})); // (T2R,T2R_M,T2R_N) + + // Allocate D and accumulator registers + Tensor tTR_rAcc = make_tensor(append(shape(tTR_sD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + Tensor tTR_rD = make_tensor(append(shape(tTR_sD_real), Int{})); // (T2R,T2R_M,T2R_N,2) + + // Vectorized fragment view + constexpr int FragmentSize = DispatchPolicy::FragmentSize; + Tensor tTR_rAcc_frg = recast>(coalesce(tTR_rAcc)); // (EPI_V) + Tensor tTR_rD_frg = recast>(coalesce(tTR_rD)); // (EPI_V) + + CUTE_STATIC_ASSERT(size(tTR_rAcc) % DispatchPolicy::FragmentSize == 0, "Fragment size does not vectorize properly"); + + // (t)hread-partition for (s)mem to (r)egister copy (tSR_) + TiledCopy tiled_s2r = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_s2r = tiled_s2r.get_slice(thread_idx); + Tensor tSR_sC_real = thread_s2r.partition_S(sC_real_epi); // (S2R,S2R_M,S2R_N,PIPE_C) + Tensor tSR_sC_imag = thread_s2r.partition_S(sC_imag_epi); // (S2R,S2R_M,S2R_N,PIPE_C) + + Layout tSR_rC_layout = thread_s2r.retile_D(tTR_rD(_,_,_,_0{})).layout(); // (S2R,S2R_M,S2R_N) + + // Allocate C registers + // If C smem load is a non-vectorized dst(i) = src(i) then we can allocate C registers directly in the compute type + // to eliminate some redundant pack+unpack instruction sequences for sub-word types + constexpr bool IsDirectS2R = cute::is_same_v + && decltype(max_common_vector(tSR_rC_layout, tSR_sC_real.layout()))::value <= 1; + using RegisterElementC = cute::conditional_t; + Tensor tTR_rC = make_tensor(append(shape(tTR_sD_real), _2{})); // (T2R,T2R_M,T2R_N) + Tensor tSR_rC = thread_s2r.retile_D(tTR_rC); // (S2R,S2R_M,S2R_N) + Tensor tTR_rC_frg = recast>(tTR_rC); // (EPI_V) + + // (t)hread-partition for (r)egister to (s)mem copy (tRS_) + TiledCopy tiled_r2s = make_tiled_copy_D(Copy_Atom{}, tiled_t2r); + ThrCopy thread_r2s = tiled_r2s.get_slice(thread_idx); + Tensor tRS_rD = thread_r2s.retile_S(tTR_rD); // (R2S,R2S_M,R2S_N) + Tensor tRS_sD_real = thread_r2s.partition_D(sD_real_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + Tensor tRS_sD_imag = thread_r2s.partition_D(sD_imag_epi); // (R2S,R2S_M,R2S_N,PIPE_D) + + // thread(b)lock-partition for (s)mem to (g)mem copy (bSG_) + ThrCopy thrblk_s2g = params.tma_store_d_real.get_slice(Int<0>{}); + Tensor bSG_sD_real = thrblk_s2g.partition_S(sD_real_epi); // (S2G,S2G_M,S2G_N,PIPE_D) + Tensor bSG_gD_real = thrblk_s2g.partition_D(gD_real_epi); // (S2G,S2G_M,S2G_N,EPI_M,EPI_N) + Tensor bSG_sD_imag = thrblk_s2g.partition_S(sD_imag_epi); // (S2G,S2G_M,S2G_N,PIPE_D) + Tensor bSG_gD_imag = thrblk_s2g.partition_D(gD_imag_epi); // (S2G,S2G_M,S2G_N,EPI_M,EPI_N) + + // Coordinate tensors and residue for tile quantization + auto m_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + auto c_m = get<0,i>(problem_shape_mnkl) - get<0,i>(cta_tile_mnk) * get<0,i>(cta_coord_mnkl); + return cute::max(0, c_m); + })); + auto n_max_coord = unwrap(cute::transform(make_seq(cta_tile_mnk)>{}, [&](auto i) { + auto c_n = get<1,i>(problem_shape_mnkl) - get<1,i>(cta_tile_mnk) * get<1,i>(cta_coord_mnkl); + return cute::max(0, c_n); + })); + auto residue_mn = make_coord(m_max_coord, n_max_coord); + Tensor cD = make_identity_tensor(take<0,2>(cta_tile_mnk)); + Tensor tTR_cD = thread_t2r.partition_D(flat_divide(cD, EpilogueTile{})); + + bool is_source_needed = epilogue_op.is_source_needed(); + // Thread synchronizer for previously issued waits or fences + // to ensure visibility of smem reads/writes to threads or TMA unit + auto synchronize = [] () { cutlass::arch::NamedBarrier::sync(ThreadCount, cutlass::arch::ReservedNamedBarriers::EpilogueBarrier); }; + + // Predication for sub-128 thread T2R tiled copy + Layout tmem_warp_layout = typename decltype(make_tmem_warp_partitioner(tAcc_real_epi(_,_,0,0)))::TiledLayout_TV{}; + constexpr bool predicate_tmem_load = size(tmem_warp_layout) != cosize(tmem_warp_layout); + bool issue_tmem_load = true; + + // If tmem doesn't have enough capacity to support double buffering, a portion of tmem (a column of epilogue tiles) + // is overlapped between 2 pseudo-buffers. The shared tmem portion corresponds to the last epilogue tile column of + // tmem accumulator buffer 0, and the first epilogue tile column of tmem accumulator 1. + // Thus, whenever we are processing tmem accumulator buffer 0, we process the epilogue tiles with reversed column order. + // Once the last epilogue tile column is loaded from tmem, the acc_pipeline is released. + // Then, the next accumulation stage for buffer 1 can start. + [[maybe_unused]] bool reverse_epi_n = ReuseTmem && acc_pipe_consumer_state.phase() == 0; + static_assert(not (ReuseTmem && AccumulatorPipeline::Stages != 1), "Tmem reuse requires 1 accumulator stage"); + + // Predication for TMA store (one warp issues TMA store) + bool issue_tma_store = warp_idx == 0; + + // In the reuse smem configuration we have StagesC smem buffers and at most StagesD committed TMA stores in flight. + // The TMA store pipeline producer acquire returns when at most StagesD-1 committed stores are in-flight, so we can + // only guarantee store completion after StagesD iterations, then we can begin issuing releases on the smem buffer locks. + // store_pipe_producer_state tracks the acquire and load_pipe_consumer_state tracks the release, in circular buffer fashion. + // If TMA store supported async transaction mbarriers we would not need this synchronous release behavior. + LoadPipelineState load_wait_state = load_pipe_consumer_state; + if constexpr (ReuseSmemC) { + load_wait_state = store_pipe_producer_state; + load_wait_state.phase_ ^= 1; + } + + // We can delay issue of TMA store by one iteration to achieve better interleaving of non-TMA instructions + // Sync requirements of smem reuse may preclude this optimization + [[maybe_unused]] int epi_m_prev = 0; + [[maybe_unused]] int epi_n_prev = 0; + static_assert(not (DelayTmaStore and ReuseSmemC and StagesC <= StagesD), "This TMA epilogue configuration will deadlock"); + + // The TMA store sequence for one subtile iteration + auto tma_store_fn = [&] (int epi_m, int epi_n) { + // Write the tile from smem to gmem with TMA + cutlass::arch::fence_view_async_shared(); // ensure smem writes are visible to TMA + synchronize(); // ensure all threads have issued their async fence + if (issue_tma_store) { + copy(params.tma_store_d_real, bSG_sD_real(_,_,_,store_pipe_producer_state.index()), bSG_gD_real(_,_,_,epi_m,epi_n)); + copy(params.tma_store_d_imag, bSG_sD_imag(_,_,_,store_pipe_producer_state.index()), bSG_gD_imag(_,_,_,epi_m,epi_n)); + } + + // Commit the TMA stores for this stage + if (issue_tma_store) { + store_pipeline.producer_commit(store_pipe_producer_state); + } + ++store_pipe_producer_state; + + // Wait for the next smem buffer to be available + if (issue_tma_store) { + store_pipeline.producer_acquire(store_pipe_producer_state); + } + synchronize(); + + if constexpr (ReuseSmemC) { + // producer_acquire returns when at most StagesD-1 committed stores are pending + bool store_finished = store_pipe_producer_state.count() > StorePipeline::UnacquiredStages; + // Let dma warp know earliest smem buffer is consumed and empty after StagesD producer commits + if (store_finished) { + if (is_source_needed) { + load_pipeline.consumer_release(load_pipe_consumer_state); + } + ++load_pipe_consumer_state; + } + } + }; + + // + // BEGIN EPILOGUE + // + + // Begin the wait for the producer load results + ConsumerToken load_wait_token{BarrierStatus::WaitDone}; + if (is_source_needed) { + load_wait_token = load_pipeline.consumer_try_wait(load_wait_state); + } + // Begin the wait for the accumulator results + ConsumerToken acc_wait_token = acc_pipeline.consumer_try_wait(acc_pipe_consumer_state); + + // For each epilogue subtile within the CTA tile + CUTLASS_PRAGMA_UNROLL + for (int iter_n = 0; iter_n < size<3>(gD_real_epi); ++iter_n) { + CUTLASS_PRAGMA_UNROLL + for (int iter_m = 0; iter_m < size<2>(gD_real_epi); ++iter_m) { + int epi_m = iter_m, epi_n = iter_n; + bool is_first_iteration = iter_m == 0 && iter_n == 0; + bool is_last_iteration = iter_m == size<2>(gD_real_epi)-1 && iter_n == size<3>(gD_real_epi)-1; + bool do_acc_release = is_last_iteration; + + // Reverse subtile order for tmem reuse if necessary + if constexpr (ReuseTmem) { + if (reverse_epi_n) { + epi_n = size<3>(gD_real_epi) - 1 - iter_n; + } + do_acc_release = iter_m == size<2>(gD_real_epi)-1 && iter_n == 0; + } + + if (is_source_needed) { + // Wait for the producer load to fill smem + load_pipeline.consumer_wait(load_wait_state, load_wait_token); + + // Copy source tile from smem to register // residual smem -> reg + copy(tiled_s2r, tSR_sC_real(_,_,_,load_wait_state.index()), tSR_rC(_,_,_,0)); + copy(tiled_s2r, tSR_sC_imag(_,_,_,load_wait_state.index()), tSR_rC(_,_,_,1)); + } + + if (is_source_needed) { + // Let producer load warp know smem buffers are consumed and empty + if constexpr (not ReuseSmemC) { + cutlass::arch::fence_view_async_shared(); + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + ++load_wait_state; + } + + if (is_first_iteration) { + // Wait for mma warp to fill tmem buffer with accumulator results + acc_pipeline.consumer_wait(acc_pipe_consumer_state, acc_wait_token); + } + + // The current tile in tmem + Tensor tTR_tAcc_real_mn = tTR_tAcc_real(_,_,_,epi_m,epi_n); + Tensor tTR_tAcc_imag_mn = tTR_tAcc_imag(_,_,_,epi_m,epi_n); + + // Compute tmem load predication if necessary + if constexpr (predicate_tmem_load) { + // Issue tmem load if this tile's tmem subpartition is accessible by this warp + int subpart_idx = (tTR_tAcc_real_mn.data().dp_ / 32) % 4; + issue_tmem_load = warp_idx == subpart_idx; + } + + // Copy accumulator tile from tmem to register + if (issue_tmem_load) { // acc tmem -> reg + copy(tiled_t2r, tTR_tAcc_real_mn, tTR_rAcc(_,_,_,0)); + copy(tiled_t2r, tTR_tAcc_imag_mn, tTR_rAcc(_,_,_,1)); + } + + // After the last tmem load, signal that tmem buffer is consumed and empty + if (do_acc_release) { + cutlass::arch::fence_view_async_tmem_load(); + acc_pipeline.consumer_release(acc_pipe_consumer_state); + ++acc_pipe_consumer_state; + } + + // Vectorized fragment loop with visitor callback entry point + if (epilogue_op.is_source_needed()) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rD_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i), tTR_rC_frg(i)); + } + } else { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tTR_rD_frg); ++i) { + tTR_rD_frg(i) = epilogue_op(tTR_rAcc_frg(i)); + } + } + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the previous subtile + if (not is_first_iteration) { + tma_store_fn(epi_m_prev, epi_n_prev); + } + epi_m_prev = epi_m; + epi_n_prev = epi_n; + } + + // Copy output tile from register to smem + bool issue_smem_store = issue_tmem_load; + if (issue_smem_store) { // after scale, reg -> smem + copy(tiled_r2s, tRS_rD(_,_,_,0), tRS_sD_real(_,_,_,store_pipe_producer_state.index())); + copy(tiled_r2s, tRS_rD(_,_,_,1), tRS_sD_imag(_,_,_,store_pipe_producer_state.index())); + } + + if constexpr (not DelayTmaStore) { + // Issue TMA stores for this subtile + tma_store_fn(epi_m, epi_n); + } + + if (is_source_needed) { + // Begin the wait for the next subtile producer load + load_wait_token = load_pipeline.consumer_try_wait(load_wait_state, is_last_iteration); + } + } // for epi_m + } // for epi_n + + if constexpr (DelayTmaStore) { + // Issue TMA stores for the last subtile + tma_store_fn(epi_m_prev, epi_n_prev); + } + + return cute::make_tuple(load_pipe_consumer_state, store_pipe_producer_state, acc_pipe_consumer_state); + } + + template + CUTLASS_DEVICE void + store_tail( + LoadPipeline load_pipeline, + LoadPipelineState load_pipe_consumer_state, + StorePipeline store_pipeline, + StorePipelineState store_pipe_producer_state, + CtaTileMNK cta_tile_mnk) { + if constexpr (ReuseSmemC) { + if (epilogue_op.is_source_needed()) { + // wait for all TMA stores to complete + store_pipeline.producer_tail(store_pipe_producer_state); + + // Issue releases on up to StagesD-1 previously issued TMA stores + constexpr int release_stages = cute::min(StorePipeline::UnacquiredStages, get_load_pipe_increment(cta_tile_mnk)); + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < release_stages; ++stage) { + load_pipeline.consumer_release(load_pipe_consumer_state); + ++load_pipe_consumer_state; + } + } + } + } + +private: + Params const& params; + ThreadEpilogueOp epilogue_op; +}; + + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::epilogue::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/epilogue/dispatch_policy.hpp b/include/cutlass/epilogue/dispatch_policy.hpp index dc8ba912..f1a53e2a 100644 --- a/include/cutlass/epilogue/dispatch_policy.hpp +++ b/include/cutlass/epilogue/dispatch_policy.hpp @@ -71,11 +71,18 @@ struct PtrArrayFastF32NoSmemWarpSpecialized1Sm : PtrArrayNoSmemWarpSpecialized1S struct PtrArrayFastF32NoSmemWarpSpecialized2Sm : PtrArrayNoSmemWarpSpecialized2Sm {}; struct PtrArrayBlockwiseNoSmemWarpSpecialized1Sm : PtrArrayNoSmemWarpSpecialized1Sm {}; struct PtrArrayBlockwiseNoSmemWarpSpecialized2Sm : PtrArrayNoSmemWarpSpecialized2Sm {}; +struct PtrArrayPlanarComplexNoSmemWarpSpecialized1Sm : PtrArrayNoSmemWarpSpecialized1Sm {}; +struct PtrArrayPlanarComplexNoSmemWarpSpecialized2Sm : PtrArrayNoSmemWarpSpecialized2Sm {}; // Blackwell TMA schedules struct TmaWarpSpecialized1Sm {}; struct TmaWarpSpecialized2Sm {}; struct PtrArrayTmaWarpSpecialized1Sm : TmaWarpSpecialized1Sm {}; struct PtrArrayTmaWarpSpecialized2Sm : TmaWarpSpecialized2Sm {}; + +struct PlanarComplexTmaWarpSpecialized1Sm : TmaWarpSpecialized1Sm {}; +struct PlanarComplexTmaWarpSpecialized2Sm : TmaWarpSpecialized2Sm {}; +struct PtrArrayPlanarComplexTmaWarpSpecialized1Sm : PlanarComplexTmaWarpSpecialized1Sm {}; +struct PtrArrayPlanarComplexTmaWarpSpecialized2Sm : PlanarComplexTmaWarpSpecialized2Sm {}; struct TmaWarpSpecialized1SmNvf4 final : TmaWarpSpecialized1Sm {}; struct TmaWarpSpecialized2SmNvf4 final : TmaWarpSpecialized2Sm {}; struct TmaWarpSpecialized1SmMxf4 final : TmaWarpSpecialized1Sm {}; @@ -253,7 +260,6 @@ struct Sm100NoSmemWarpSpecialized { constexpr static int StagesD = 1; constexpr static int FragmentSize = 1; }; - struct Sm100PtrArrayNoSmem { constexpr static int StagesC = 1; constexpr static int StagesD = 1; @@ -265,6 +271,42 @@ struct Sm100PtrArrayNoSmemWarpSpecialized { constexpr static int StagesD = 1; constexpr static int FragmentSize = 1; }; +struct Sm100PtrArrayPlanarComplexNoSmem {}; +struct Sm100PtrArrayPlanarComplexNoSmemWarpSpecialized {}; + +template< + int StagesC_, + int StagesD_, + int FragmentSize_, + bool ReuseSmemC_, + bool DelayTmaStore_ +> +struct Sm100PlanarComplexTmaWarpSpecialized + : public Sm100TmaWarpSpecialized +{ +}; + + +template< + int StagesC_, + int StagesD_, + int FragmentSize_, + bool ReuseSmemC_, + bool DelayTmaStore_ +> +struct Sm100PtrArrayPlanarComplexTmaWarpSpecialized + : public Sm100TmaWarpSpecialized +{ +}; + template< int StagesC_, int StagesD_, diff --git a/include/cutlass/epilogue/threadblock/epilogue.h b/include/cutlass/epilogue/threadblock/epilogue.h index 5968d6cb..423996a9 100644 --- a/include/cutlass/epilogue/threadblock/epilogue.h +++ b/include/cutlass/epilogue/threadblock/epilogue.h @@ -39,7 +39,9 @@ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/numeric_types.h" #include "cutlass/array.h" diff --git a/include/cutlass/epilogue/threadblock/epilogue_base.h b/include/cutlass/epilogue/threadblock/epilogue_base.h index 94c0a4d1..b6b63608 100644 --- a/include/cutlass/epilogue/threadblock/epilogue_base.h +++ b/include/cutlass/epilogue/threadblock/epilogue_base.h @@ -42,7 +42,9 @@ #include #include #endif +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/matrix_shape.h" #include "cutlass/numeric_types.h" diff --git a/include/cutlass/functional.h b/include/cutlass/functional.h index 6b23b205..2ac6e653 100644 --- a/include/cutlass/functional.h +++ b/include/cutlass/functional.h @@ -38,6 +38,8 @@ #include "cutlass/cutlass.h" #include "cutlass/numeric_types.h" #include "cutlass/platform/platform.h" +#include "cutlass/detail/dependent_false.hpp" + #if defined(__CUDACC_RTC__) #include "cutlass/floating_point_nvrtc.h" #endif @@ -535,6 +537,49 @@ struct maximum_absolute_value_reduction { } }; +// Maximal exponent reduction for zero-mantissa scaling factors +template +struct maximum_absolute_value_zero_mantissa_reduction { + + // Discard mantissa and sign bits for the input. Needs to specify the number of mantissa / exponent bits + template + static CUTLASS_HOST_DEVICE T_ discard_sign_mantissa_impl(T_ x) { + static constexpr UI one = 1; + static constexpr UI n_mantissa = N_Mantissa; + static constexpr UI pos_sign = sizeof(T_) * 8 - 1; // Position of sign bit: bit width - 1. + static constexpr UI mask = ~((one << n_mantissa) - one) & ~(one << pos_sign); + static constexpr UI subnormal_cap = one << n_mantissa; + + UI out = *reinterpret_cast(&x) & mask; + // Subnormals + if (out == 0) { + out = subnormal_cap; + } + return *reinterpret_cast(&out); + } + + // Discard mantissa and sign bits s.t. multipling with this scaling factor only results in an exponent shift + template + static CUTLASS_HOST_DEVICE T_ discard_sign_mantissa(T_ x) { + if constexpr (cute::is_same_v) { + return discard_sign_mantissa_impl(x); + } + else if constexpr (cute::is_same_v) { + return discard_sign_mantissa_impl(x); + } + else { + static_assert(cutlass::detail::dependent_false, "Can't discard mantissa & sign bits for unknown data type"); + } + } + + CUTLASS_HOST_DEVICE + T operator()(T const &lhs, T const &rhs) const { + cutlass::maximum max_op; + + return max_op(lhs, discard_sign_mantissa(rhs)); + } +}; + /// Fused multiply-add template struct multiply_add { diff --git a/include/cutlass/gemm/collective/builders/sm100_9xBF16_interleaved_complex_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_9xBF16_interleaved_complex_umma_builder.inl new file mode 100644 index 00000000..5cdbdd7e --- /dev/null +++ b/include/cutlass/gemm/collective/builders/sm100_9xBF16_interleaved_complex_umma_builder.inl @@ -0,0 +1,298 @@ +/*************************************************************************************************** + * Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +#pragma once + + +#include "cutlass/gemm/collective/builders/sm100_common.inl" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { + +///////////////////////////////////////////////////////////////////////////////////////////////// +// FastFP (9xBF16) TCGEN05 kernels builder +// Interleaved complex kernels that provides support for complex data types +template < + class ArchTag, + class GmemLayoutATag, + int AlignmentA, + class TransformA, + class GmemLayoutBTag, + int AlignmentB, + class TransformB, + class ElementAccumulator, + class TileShape_MNK, // The Cluster-level TileShape + class ClusterShape_MNK, + class StageCountType, + class BuilderScheduleTag +> +struct CollectiveBuilder< + ArchTag, + arch::OpClassTensorOp, + cute::tuple, TransformA>, // ElementA + ConjA + GmemLayoutATag, // LayoutA + AlignmentA, + cute::tuple, TransformB>, // ElementB + ConjB + GmemLayoutBTag, // LayoutB + AlignmentB, + ElementAccumulator, + TileShape_MNK, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + ClusterShape_MNK, // Static cluster shape or dynamic (int, int, int) + StageCountType, + BuilderScheduleTag, + cute::enable_if_t< + (cute::is_same_v + ) && + (not cute::is_tuple::value && not cute::is_tuple::value) && + (cute::is_base_of_v + ) && + ((sizeof(cutlass::complex) * AlignmentA) % detail::tma_alignment_bytes == 0) && + ((sizeof(cutlass::complex) * AlignmentB) % detail::tma_alignment_bytes == 0)>> +{ + static_assert(cute::is_static_v, "TileShape_MNK has to be static"); + static constexpr cute::UMMA::Major UmmaMajorA = cutlass::gemm::collective::detail::tag_to_umma_major_A(); + static constexpr cute::UMMA::Major UmmaMajorB = cutlass::gemm::collective::detail::tag_to_umma_major_B(); + static constexpr cute::UMMA::Major UmmaMajorACompute = cute::UMMA::Major::K; + static constexpr cute::UMMA::Major UmmaMajorBCompute = cute::UMMA::Major::K; + static constexpr bool BuilderTagIsSmem = + cute::is_base_of_v + ; + + using ElementA = complex; + using ElementB = complex; + using ElementAMma = complex< + cutlass::bfloat16_t + >; + using ElementBMma = complex< + cutlass::bfloat16_t + >; + static constexpr int ScalingFactor = + 8; + + using TiledMma = decltype(detail::sm100_make_trivial_fastFP32_tiled_mma()); + using AtomThrID = typename TiledMma::AtomThrID; + using AtomThrShapeMNK = Shape(typename TiledMma::ThrLayoutVMNK{})), _1, _1>; + using CtaTileShape_MNK = decltype(shape_div(TileShape_MNK{}, AtomThrShapeMNK{})); + + // ((MMA_TILE_M,MMA_TILE_K), MMA_M, MMA_K) + using MmaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(cute::size<0>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + // ((MMA_TILE_N,MMA_TILE_K), MMA_N, MMA_K) + using MmaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(cute::size<1>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + + using BlockTileA_M = decltype(cute::size<0,0>(MmaShapeA_MK{}) * cute::size<1>(MmaShapeA_MK{})); + using BlockTileA_K = decltype(cute::size<0,1>(MmaShapeA_MK{}) * cute::size<2>(MmaShapeA_MK{})); + + using SmemLayoutAtomA = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + // Take 3 compute buffers into account for swizzle selection + using SmemLayoutAtomACompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + + // Input transform kernel can not use TMA 2SM instructions. + using GmemTiledCopyA = decltype(detail::sm90_cluster_shape_to_tma_atom(cute::size<1>(ClusterShape_MNK{}))); + using SmemLayoutAtomPairA = cutlass::gemm::collective::detail::CollectiveMmaEmulatedLayoutAtomType< + SmemLayoutAtomA, SmemLayoutAtomACompute>; + + static constexpr int MMA_M = cute::size<0,0>(MmaShapeA_MK{}); + using CopyAtomPairA = cutlass::gemm::collective::detail::CollectiveMmaEmulatedCopyType< + Copy_Atom, ElementA>, + cute::conditional_t<(UmmaMajorACompute == cute::UMMA::Major::K && !BuilderTagIsSmem), + cute::conditional_t<(MMA_M == 64 && size(AtomThrID{}) == 1), SM100_TMEM_STORE_16dp256b1x, SM100_TMEM_STORE_32dp32b8x>, // TS Implementation + Copy_Atom, ElementAMma>> // SS Implementation + >; + + using BlockTileB_N = decltype(cute::size<0,0>(MmaShapeB_NK{}) * cute::size<1>(MmaShapeB_NK{})); + using BlockTileB_K = decltype(cute::size<0,1>(MmaShapeB_NK{}) * cute::size<2>(MmaShapeB_NK{})); + + // Input transform kernel can not use TMA 2SM instructions. + using GmemTiledCopyB = decltype(detail::sm90_cluster_shape_to_tma_atom(cute::size<0>(ClusterShape_MNK{}))); + + using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + // Take 3 compute buffers into account for swizzle selection + using SmemLayoutAtomBCompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + + using SmemLayoutAtomPairB = cutlass::gemm::collective::detail::CollectiveMmaEmulatedLayoutAtomType< + SmemLayoutAtomB, SmemLayoutAtomBCompute>; + using CopyAtomPairB = cutlass::gemm::collective::detail::CollectiveMmaEmulatedCopyType< + Copy_Atom, ElementB>, + Copy_Atom, ElementBMma> + >; + + // SmemCarveout + static constexpr int NumComplexComponents = 2; + static constexpr int NumComputeMtxs = + 3; + static constexpr int NumBandsToCompute = + 5; + static constexpr int AccPromotionInterval = + 1; + static constexpr int SchedulerPipelineStageCount = 3; + static constexpr bool IsArrayOfPointersGemm = + (cute::is_base_of_v + ); + // CLCPipeline = PipelineCLCFetchAsync + static constexpr auto CLCPipelineStorage = sizeof(typename cutlass::PipelineCLCFetchAsync::SharedStorage); + // CLC (scheduler) response + static constexpr auto CLCResponseStorage = SchedulerPipelineStageCount * detail::CLCResponseSize; + // CLC Throttle pipeline storage + static constexpr auto CLCThrottlePipelineStorage = sizeof(typename cutlass::PipelineAsync::SharedStorage); + // Tmem dealloc + static constexpr auto TmemDeallocStorage = sizeof(cutlass::arch::ClusterBarrier); + // Tmem ptr storage + static constexpr auto TmemBasePtrsStorage = sizeof(uint32_t); + // Tensormap Storage + static constexpr size_t TensorMapStorage = IsArrayOfPointersGemm ? sizeof(cute::TmaDescriptor) * 2 /* for A and B */ : 0; + + // Smem usage that's not part of CollectiveEpilogue::SharedStorage & CollectiveMainloop::SharedStorage + static constexpr auto KernelSmemCarveout = static_cast( CLCPipelineStorage + + CLCResponseStorage + + CLCThrottlePipelineStorage + + TmemDeallocStorage + + TmemBasePtrsStorage + + TensorMapStorage); + + // Reduce SMEM capacity available for buffers considering extra B smem and barrier smem allocations + + static constexpr int ReducedSmemCapacityBytes = + cutlass::gemm::collective::detail::sm100_smem_capacity_bytes - KernelSmemCarveout; + static constexpr auto stage_info = cutlass::gemm::collective::detail::sm100_compute_stage_count_or_override_fast_fp32< + ReducedSmemCapacityBytes, CtaTileShape_MNK, TiledMma, BuilderScheduleTag, UmmaMajorACompute, + NumComplexComponents, NumComputeMtxs + >(StageCountType{}); + + // Complex 9xBF16 allows TileShape_N = 64, while SmemLayoutAtomB contains Swizzle<3,4,3>. + static constexpr int Load2TransformPipelineStageCount = size<1>(TileShape_MNK{}) == 64 ? get<0>(stage_info) / 2 * 2 : get<0>(stage_info); + static constexpr int Transform2MmaPipelineStageCount = get<1>(stage_info); + static constexpr int AccumulatorPipelineStageCount = get<2>(stage_info); + + using AccumulatorCopyAtom = cute::SM100_TMEM_LOAD_32dp32b32x; + + using DispatchPolicy = cute::conditional_t, + cutlass::gemm::MainloopSm100TmaUmmaWarpSpecializedFastF32< + Load2TransformPipelineStageCount, + Transform2MmaPipelineStageCount, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + NumBandsToCompute, + ScalingFactor, + AccPromotionInterval, + ClusterShape_MNK, + AccumulatorCopyAtom> + >; + using CollectiveOp = cutlass::gemm::collective::CollectiveMma< + DispatchPolicy, + TileShape_MNK, + ElementA, + cutlass::gemm::TagToStrideA_t, + ElementB, + cutlass::gemm::TagToStrideB_t, + TiledMma, + GmemTiledCopyA, + SmemLayoutAtomPairA, + CopyAtomPairA, + TransformA, + GmemTiledCopyB, + SmemLayoutAtomPairB, + CopyAtomPairB, + TransformB + >; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// +// FastFP (9xBF16) TCGEN05 kernels builder +// CUTLASS library compatibility builder without conjugate +template < + class ArchTag, + class GmemLayoutATag, + int AlignmentA, + class GmemLayoutBTag, + int AlignmentB, + class ElementAccumulator, + class TileShape_MNK, // The Cluster-level TileShape + class ClusterShape_MNK, + class StageCountType, + class BuilderScheduleTag +> +struct CollectiveBuilder< + ArchTag, + arch::OpClassTensorOp, + cutlass::complex, // ElementA + GmemLayoutATag, // LayoutA + AlignmentA, + cutlass::complex, // ElementB + GmemLayoutBTag, // LayoutB + AlignmentB, + ElementAccumulator, + TileShape_MNK, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + ClusterShape_MNK, // Static cluster shape or dynamic (int, int, int) + StageCountType, + BuilderScheduleTag, + cute::enable_if_t< + (cute::is_same_v + ) && + (not cute::is_tuple::value && not cute::is_tuple::value) && + (cute::is_base_of_v + ) && + ((sizeof(cutlass::complex) * AlignmentA) % detail::tma_alignment_bytes == 0) && + ((sizeof(cutlass::complex) * AlignmentB) % detail::tma_alignment_bytes == 0)>> +{ + using CollectiveOp = typename CollectiveBuilder< + ArchTag, + arch::OpClassTensorOp, + cute::tuple, cute::identity>, + GmemLayoutATag, + AlignmentA, + cute::tuple, cute::identity>, + GmemLayoutBTag, + AlignmentB, + ElementAccumulator, + TileShape_MNK, + ClusterShape_MNK, + StageCountType, + BuilderScheduleTag + >::CollectiveOp; +}; + +} // cutlass::gemm::collective diff --git a/include/cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl index c4bcf591..4b345457 100644 --- a/include/cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl +++ b/include/cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl @@ -61,15 +61,19 @@ sm100_compute_stage_count_or_override_fast_fp32(StageCountAutoCarveout(CtaTileShape_MNK{}); using AtomThrID = typename TiledMma::AtomThrID; constexpr int TmemColumns = 512; + constexpr bool BuilderTagIsSmem = ( + cute::is_base_of_v + ); // Detect 2x2 TMEM layout constexpr int TmemAccWordsPerDP = (CtaM == 64 && size(AtomThrID{}) == 2) ? CtaN/2 : CtaN; constexpr int TmemAWordsPerDP = ComplexComponent * NumComputeMtxs * CtaK / 2; - constexpr bool IsAComputeinTmem = UmmaMajorA == cute::UMMA::Major::K && !cute::is_base_of_v; + constexpr bool IsAComputeinTmem = UmmaMajorA == cute::UMMA::Major::K && !BuilderTagIsSmem; constexpr bool IsAComputeinSmem = !IsAComputeinTmem; constexpr int AccumulatorStageCount = (IsAComputeinTmem) ? (((TmemAccWordsPerDP * ComplexComponent == 128) ? 2 : 3) * ComplexComponent) : (TmemColumns / TmemAccWordsPerDP); - - constexpr int SmemCapacityAfterMma2AccumCarveout = CapacityBytes - (carveout_bytes + AccumulatorStageCount * 32); + + constexpr int SmemCapacityAfterMma2AccumCarveout = CapacityBytes - (carveout_bytes + AccumulatorStageCount * (32 + )); constexpr int TmemInAStageCount_Potential = (IsAComputeinTmem) ? (TmemColumns - AccumulatorStageCount * TmemAccWordsPerDP) / TmemAWordsPerDP : 10000; @@ -87,7 +91,8 @@ sm100_compute_stage_count_or_override_fast_fp32(StageCountAutoCarveout(CtaTileShape_MNK{}) * size<2>(CtaTileShape_MNK{})) + // If ACompute is in TMEM, Acompute buffer has 0 bytes. cutlass::bits_to_bytes(NumComputeMtxs * b_compute_bits * size<1>(CtaTileShape_MNK{}) / size(AtomThrID{}) * size<2>(CtaTileShape_MNK{})) + - static_cast(transform2mma_pipeline_bytes); + static_cast(transform2mma_pipeline_bytes) + ; constexpr int ABComputeStageCount_Potential = SmemCapacityAfterMma2AccumCarveout / (ab_stage_bytes + ab_compute_stage_bytes); // The number of SMEM buffers for A, B. ACompute (if in SMEM), BCompute should be at least Transform2MmaStageCount @@ -135,20 +140,33 @@ struct CollectiveBuilder< (cute::is_same_v ) && (not cute::is_tuple::value && not cute::is_tuple::value) && - (cute::is_base_of_v) && + (cute::is_base_of_v + ) && ((sizeof(float) * AlignmentA) % detail::tma_alignment_bytes == 0) && ((sizeof(float) * AlignmentB) % detail::tma_alignment_bytes == 0)>> { static constexpr cute::UMMA::Major UmmaMajorA = cutlass::gemm::collective::detail::tag_to_umma_major_A(); static constexpr cute::UMMA::Major UmmaMajorB = cutlass::gemm::collective::detail::tag_to_umma_major_B(); + static constexpr cute::UMMA::Major UmmaMajorACompute = + UmmaMajorA; + static constexpr cute::UMMA::Major UmmaMajorBCompute = + UmmaMajorB; + static constexpr bool BuilderTagIsSmem = ( + cute::is_base_of_v + ); using ElementA = float; using ElementB = float; - using ElementAMma = cutlass::bfloat16_t; - using ElementBMma = cutlass::bfloat16_t; - static constexpr int ScalingFactor = 8; + using ElementAMma = + cutlass::bfloat16_t + ; + using ElementBMma = + cutlass::bfloat16_t + ; + static constexpr int ScalingFactor = + 8; - using TiledMma = decltype(detail::sm100_make_trivial_fastFP32_tiled_mma()); + using TiledMma = decltype(detail::sm100_make_trivial_fastFP32_tiled_mma()); using AtomThrID = typename TiledMma::AtomThrID; using AtomThrShapeMNK = Shape(typename TiledMma::ThrLayoutVMNK{})), _1, _1>; using CtaTileShape_MNK = decltype(shape_div(TileShape_MNK{}, AtomThrShapeMNK{})); @@ -166,7 +184,7 @@ struct CollectiveBuilder< using SmemLayoutAtomA = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); // Take 3 compute buffers into account for swizzle selection - using SmemLayoutAtomACompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); // Input transform kernel can not use TMA 2SM instructions. @@ -177,7 +195,7 @@ struct CollectiveBuilder< static constexpr int MMA_M = cute::size<0,0>(MmaShapeA_MK{}); using CopyAtomPairA = cutlass::gemm::collective::detail::CollectiveMmaEmulatedCopyType< Copy_Atom, ElementA>, - cute::conditional_t<(UmmaMajorA == cute::UMMA::Major::K && !cute::is_base_of_v), + cute::conditional_t<(UmmaMajorACompute == cute::UMMA::Major::K && !BuilderTagIsSmem), cute::conditional_t<(MMA_M == 64 && size(AtomThrID{}) == 1), SM100_TMEM_STORE_16dp256b1x, SM100_TMEM_STORE_32dp32b8x>, // TS Implementation Copy_Atom, ElementA>> // SS Implementation >; @@ -191,7 +209,7 @@ struct CollectiveBuilder< using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); // Take 3 compute buffers into account for swizzle selection - using SmemLayoutAtomBCompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); using SmemLayoutAtomPairB = cutlass::gemm::collective::detail::CollectiveMmaEmulatedLayoutAtomType< @@ -202,11 +220,16 @@ struct CollectiveBuilder< >; // SmemCarveout - static constexpr int NumBandsToCompute = 5; - static constexpr int AccPromotionInterval = 1; + static constexpr int NumComputeMtxs = + 3; + static constexpr int NumBandsToCompute = + 5; + static constexpr int AccPromotionInterval = + 1; static constexpr int SchedulerPipelineStageCount = 3; - static constexpr bool IsArrayOfPointersGemm = (cute::is_base_of_v); - + static constexpr bool IsArrayOfPointersGemm = + (cute::is_base_of_v + ); // CLCPipeline = PipelineCLCFetchAsync static constexpr auto CLCPipelineStorage = sizeof(typename cutlass::PipelineCLCFetchAsync::SharedStorage); // CLC (scheduler) response @@ -233,7 +256,9 @@ struct CollectiveBuilder< static constexpr int ReducedSmemCapacityBytes = cutlass::gemm::collective::detail::sm100_smem_capacity_bytes - KernelSmemCarveout; static constexpr auto stage_info = cutlass::gemm::collective::detail::sm100_compute_stage_count_or_override_fast_fp32< - ReducedSmemCapacityBytes, CtaTileShape_MNK, TiledMma, BuilderScheduleTag, UmmaMajorA>(StageCountType{}); + ReducedSmemCapacityBytes, CtaTileShape_MNK, TiledMma, BuilderScheduleTag, UmmaMajorACompute, + /*Cmplx=*/ 1, /*Mtxs=*/ NumComputeMtxs + >(StageCountType{}); static constexpr int Load2TransformPipelineStageCount = get<0>(stage_info); static constexpr int Transform2MmaPipelineStageCount = get<1>(stage_info); diff --git a/include/cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl index 78b66196..923ce9cf 100644 --- a/include/cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl +++ b/include/cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl @@ -73,7 +73,7 @@ sm100_compute_stage_count_or_override_blockscaled(StageCountAutoCarveout::SharedStorage); + constexpr auto mainloop_pipeline_bytes = cutlass::round_up(sizeof(typename cutlass::PipelineTmaUmmaAsync<1>::SharedStorage), 128); constexpr auto a_bits = cute::sizeof_bits_v; constexpr auto b_bits = cute::sizeof_bits_v; constexpr auto stage_sfa_bytes = size(filter_zeros(TileShapeSFA{})); diff --git a/include/cutlass/gemm/collective/builders/sm100_blockwise_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_blockwise_umma_builder.inl index e3418444..fc9911d9 100644 --- a/include/cutlass/gemm/collective/builders/sm100_blockwise_umma_builder.inl +++ b/include/cutlass/gemm/collective/builders/sm100_blockwise_umma_builder.inl @@ -102,8 +102,10 @@ sm100_compute_stage_count_or_override_blockwise(StageCountAutoCarveout(TileShapeMNK{}) * size<2>(TileShapeMNK{})) + - cutlass::bits_to_bytes(b_bits * size<1>(TileShapeMNK{}) * size<2>(TileShapeMNK{})) + + cutlass::bits_to_bytes(a_bits * size<0>(TileShapeMNK{}) * size<2>(TileShapeMNK{}) + ) + + cutlass::bits_to_bytes(b_bits * size<1>(TileShapeMNK{}) * size<2>(TileShapeMNK{}) + ) + cutlass::bits_to_bytes(scale_bits * size<0>(ScaleShapeMNK{}) * size<2>(ScaleShapeMNK{})) + cutlass::bits_to_bytes(scale_bits * size<1>(ScaleShapeMNK{}) * size<2>(ScaleShapeMNK{})), 128) + @@ -441,7 +443,6 @@ struct CollectiveBuilder< >; }; - } // namespace cutlass::gemm::collective ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/builders/sm100_common.inl b/include/cutlass/gemm/collective/builders/sm100_common.inl index 73f43797..284def11 100644 --- a/include/cutlass/gemm/collective/builders/sm100_common.inl +++ b/include/cutlass/gemm/collective/builders/sm100_common.inl @@ -220,7 +220,7 @@ sm100_cluster_shape_to_tma_atom_A(ClusterShapeMNK cluster_shape_mnk, AtomThrId a } else { // In the case of dynamic cluster, multicast decision is not known at compile time. - // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. + // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. return detail::sm90_cluster_shape_to_tma_atom(cute::Int<2>{}); } } @@ -255,7 +255,7 @@ sm100_cluster_shape_to_tma_atom_B(ClusterShapeMNK cluster_shape_mnk, AtomThrId a } else { // In the case of dynamic cluster, multicast decision is not known at compile time. - // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. + // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. return detail::sm90_cluster_shape_to_tma_atom(cute::Int<2>{}); } } @@ -281,7 +281,7 @@ sm100_cluster_shape_to_tma_atom_SFB(ClusterShapeMNK cluster_shape_mnk, AtomThrId } else { // In the case of dynamic cluster, multicast decision is not known at compile time. - // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. + // A multicast instruction is forced by passing a cute::Int<2>{} to this helper. return detail::sm90_cluster_shape_to_tma_atom(cute::Int<2>{}); } } @@ -328,24 +328,24 @@ sm100_make_1sm_trivial_tiled_mma() { return make_tiled_mma(cute::SM100_MMA_S8_SS{}); } - else if constexpr (cute::is_same_v - || cute::is_same_v - || cute::is_same_v + else if constexpr (cute::is_same_v + || cute::is_same_v + || cute::is_same_v || cute::is_same_v || cute::is_same_v || cute::is_same_v || cute::is_same_v || cute::is_same_v ) { - + return make_tiled_mma( cute::MMA_Traits< cute::SM100_MMA_F8F6F4_SS, ElementAMma, - ElementBMma, - ElementAMmaccumulator, - cute::C, - cute::C, + ElementBMma, + ElementAMmaccumulator, + cute::C, + cute::C, cute::integral_constant, cute::integral_constant, cute::integral_constant, @@ -396,9 +396,9 @@ sm100_make_2sm_trivial_tiled_mma() { return make_tiled_mma(cute::SM100_MMA_S8_2x1SM_SS{}); } - else if constexpr (cute::is_same_v - || cute::is_same_v - || cute::is_same_v + else if constexpr (cute::is_same_v + || cute::is_same_v + || cute::is_same_v || cute::is_same_v || cute::is_same_v || cute::is_same_v @@ -408,12 +408,12 @@ sm100_make_2sm_trivial_tiled_mma() { return make_tiled_mma( cute::MMA_Traits< - cute::SM100_MMA_F8F6F4_2x1SM_SS, + cute::SM100_MMA_F8F6F4_2x1SM_SS, ElementAMma, ElementBMma, - ElementAMmaccumulator, - cute::C, - cute::C, + ElementAMmaccumulator, + cute::C, + cute::C, cute::integral_constant, cute::integral_constant, cute::integral_constant, @@ -471,7 +471,7 @@ sm100_make_trivial_tiled_mma() { return sm100_make_1sm_trivial_tiled_mma(); } - // Dynamic cluster shape means we cannot assume we can use 2SM MMA + // Dynamic cluster shape means we cannot assume we can use 2SM MMA } else { return sm100_make_1sm_trivial_tiled_mma +constexpr auto +sm100_make_1sm_ts_trivial_tiled_mma() { + + constexpr int M = cute::size<0>(ClusterTileShape_MNK{}); + static_assert(M == 64 || M == 128, "Invalid TileShape_M."); + + // Do not allow a tiled MMA N mode > 1, as that is not reasonable. + constexpr int N = cute::size<1>(ClusterTileShape_MNK{}); + static_assert(N % 8 == 0 && N <= 256, "Invalid TileShape_N."); + + if constexpr (cute::is_same_v) { + static_assert(cute::is_same_v, "ElementA and ElementB must match."); + return make_tiled_mma(cute::SM100_MMA_TF32_TS{}); + } + else if constexpr (cute::is_same_v || + cute::is_same_v) { + static_assert(cute::is_same_v, "ElementA and ElementB must match."); + return make_tiled_mma(cute::SM100_MMA_F16BF16_TS{}); + } + else if constexpr (cute::is_same_v || + cute::is_same_v) { + return make_tiled_mma(cute::SM100_MMA_S8_TS{}); + } + else { + static_assert(cutlass::detail::dependent_false, + "Unsupported configuration for SM100 collective builder."); + } +} + +template< + class ElementAMma, + class ElementBMma, + class ElementAccumulator, + class ClusterTileShape_MNK, + class ClusterShape_MNK, + UMMA::Major UmmaMajorA, + UMMA::Major UmmaMajorB, + UMMA::ScaleIn ANeg = UMMA::ScaleIn::One, + UMMA::ScaleIn BNeg = UMMA::ScaleIn::One +> +constexpr auto +sm100_make_2sm_ts_trivial_tiled_mma() { + + constexpr int M = cute::size<0>(ClusterTileShape_MNK{}); + static_assert(M == 128 || M == 256, "Invalid TileShape_M."); + + // Do not allow a tiled MMA N mode > 1, as that is not reasonable. + constexpr int N = cute::size<1>(ClusterTileShape_MNK{}); + static_assert(N % 8 == 0 && N <= 256, "Invalid TileShape_N."); + + if constexpr (cute::is_same_v) { + static_assert(cute::is_same_v, "For SM100 TF32 MMA, ElementA and ElementB must match."); + return make_tiled_mma(cute::SM100_MMA_TF32_2x1SM_TS{}); + } + else if constexpr (cute::is_same_v || + cute::is_same_v) { + static_assert(cute::is_same_v, "For SM100 F16F32 MMA, ElementA and ElementB must match."); + return make_tiled_mma(cute::SM100_MMA_F16BF16_2x1SM_TS{}); + } + else if constexpr (cute::is_same_v || + cute::is_same_v) { + return make_tiled_mma(cute::SM100_MMA_S8_2x1SM_TS{}); + } + else { + static_assert(cutlass::detail::dependent_false, + "Unsupported configuration for SM100 collective builder."); + } +} + template< class ElementAMma, class ElementBMma, @@ -493,12 +579,16 @@ template< > constexpr auto sm100_make_trivial_fastFP32_tiled_mma() { + constexpr bool TagHasUmmaSs = ( + cute::is_base_of_v + ); + // MMA_2SM requested if constexpr (cute::is_base_of_v ) { using AtomLayout_MNK = decltype(make_layout(shape_div(ClusterShape_MNK{}, Shape<_2,_1,_1>{}))); constexpr int M = cute::size<0>(TileShape_MNK{}); constexpr int N = cute::size<1>(TileShape_MNK{}); - if constexpr (UmmaMajorA == cute::UMMA::Major::K && !cute::is_base_of_v) { + if constexpr (UmmaMajorA == cute::UMMA::Major::K && !TagHasUmmaSs) { return make_tiled_mma(cute::SM100_MMA_F16BF16_2x1SM_TS_SCALED{}); } @@ -512,7 +602,7 @@ sm100_make_trivial_fastFP32_tiled_mma() { // using AtomLayout_MNK = Layout; constexpr int M = cute::size<0>(TileShape_MNK{}); constexpr int N = cute::size<1>(TileShape_MNK{}); - if constexpr (UmmaMajorA == cute::UMMA::Major::K && !cute::is_base_of_v) { + if constexpr (UmmaMajorA == cute::UMMA::Major::K && !TagHasUmmaSs) { return make_tiled_mma(cute::SM100_MMA_F16BF16_TS_SCALED{}); } @@ -531,7 +621,7 @@ sm100_make_trivial_fastFP32_tiled_mma() { // and only M=128 and M=256 are supported, otherwise, fall back to MMA_1SM if constexpr (cute::get<0>(ClusterShape_MNK{}) % 2 == 0 && (cute::get<0>(TileShape_MNK{}) / cute::get<0>(ClusterShape_MNK{})) % 64 == 0) { - if constexpr (!cute::is_base_of_v) { + if constexpr (!TagHasUmmaSs) { return sm100_make_trivial_fastFP32_tiled_mma(); } @@ -541,7 +631,7 @@ sm100_make_trivial_fastFP32_tiled_mma() { } } else { - if constexpr (!cute::is_base_of_v) { + if constexpr (!TagHasUmmaSs) { return sm100_make_trivial_fastFP32_tiled_mma(); } @@ -551,9 +641,9 @@ sm100_make_trivial_fastFP32_tiled_mma() { } } } - // Dynamic cluster shape means we cannot assume we can use 2SM MMA + // Dynamic cluster shape means we cannot assume we can use 2SM MMA else { - if constexpr (!cute::is_base_of_v) { + if constexpr (!TagHasUmmaSs) { return sm100_make_trivial_fastFP32_tiled_mma(); } @@ -569,6 +659,52 @@ sm100_make_trivial_fastFP32_tiled_mma() { } } +template< + class TileShape_MNK, + class ClusterShape_MNK, + class BuilderScheduleTag +> +constexpr auto +sm100_make_trivial_interleaved_complex_tf32_tiled_mma() { + // MMA_2SM requested + if constexpr (cute::is_base_of_v ) { + constexpr int M = cute::size<0>(TileShape_MNK{}); + static_assert(M == 128 || M == 256, "Invalid TileShape_M."); + + // Do not allow a tiled MMA N mode > 1, as that is not reasonable. + constexpr int N = cute::size<1>(TileShape_MNK{}); + static_assert(N % 8 == 0 && N <= 256, "Invalid TileShape_N."); + return make_tiled_mma(cute::SM100_MMA_TF32_2x1SM_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN{}); + } + // MMA_1SM requested + else if constexpr (cute::is_base_of_v ) { + constexpr int M = cute::size<0>(TileShape_MNK{}); + static_assert(M == 64 || M == 128, "Invalid TileShape_M."); + // Do not allow a tiled MMA N mode > 1, as that is not reasonable. + constexpr int N = cute::size<1>(TileShape_MNK{}); + static_assert(N % 8 == 0 && N <= 256, "Invalid TileShape_N."); + return make_tiled_mma(cute::SM100_MMA_TF32_TS_INTERLEAVED_CF32CTF32CTF32CF32_TN{}); + } + else if constexpr (cute::is_same_v) { + // Static cluster + if constexpr (cute::is_static_v) { + // For MMA_2SM we need a cluster shape that is multiple of 2x1 + // and only M=128 and M=256 are supported, otherwise, fall back to MMA_1SM + if constexpr (cute::get<0>(ClusterShape_MNK{}) % 2 == 0 && + cute::size<0>(TileShape_MNK{}) % 128 == 0) { + return sm100_make_trivial_interleaved_complex_tf32_tiled_mma(); + } + else { + return sm100_make_trivial_interleaved_complex_tf32_tiled_mma(); + } + } + // Dynamic cluster shape means we cannot assume we can use 2SM MMA + else { + return sm100_make_trivial_interleaved_complex_tf32_tiled_mma(); + } + } +} + //Setting mma for Mixed input gemm. Here, ElementAMma should be TACompute template< class ElementAMma, @@ -606,10 +742,10 @@ sm100_make_trivial_mixed_input_tiled_mma() { cute::MMA_Traits< cute::SM100_MMA_F8F6F4_SS, ElementAMma, - ElementBMma, - ElementAccumulator, - cute::C, - cute::C, + ElementBMma, + ElementAccumulator, + cute::C, + cute::C, cute::integral_constant, cute::integral_constant, cute::integral_constant, diff --git a/include/cutlass/gemm/collective/builders/sm100_interleaved_complex_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_interleaved_complex_umma_builder.inl new file mode 100644 index 00000000..e6801432 --- /dev/null +++ b/include/cutlass/gemm/collective/builders/sm100_interleaved_complex_umma_builder.inl @@ -0,0 +1,264 @@ +/*************************************************************************************************** + * Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +#pragma once + + +#include "cutlass/gemm/collective/builders/sm100_common.inl" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { + +namespace detail { + +// Returns the maximum number of smem tiles that can be used with a given smem capacity, or overrides with manual count. +template< + int CapacityBytes, + class TileShapeMNK, + int stages +> +constexpr int +sm100_compute_stage_count_or_override_interleaved_complex_tf32(StageCount stage_count) { + return stages; +} + +// Returns the maximum number of smem tiles that can be used with a given smem capacity, or overrides with manual count. +template< + int CapacityBytes, + class TileShapeMNK, + int carveout_bytes +> +constexpr int +sm100_compute_stage_count_or_override_interleaved_complex_tf32(StageCountAutoCarveout stage_count) { + // Each stage include (CollectiveMma::SharedStorage) + // 1. smem for A and smem for B (CollectiveMma::SharedStorage::TensorStorage) + // 2. one Load2TransformPipeline = PipelineTmaTransformAsync + constexpr auto load2transform_pipeline_bytes = sizeof(typename cutlass::PipelineTmaTransformAsync<1>::SharedStorage); + constexpr auto a_bits = cute::sizeof_bits_v>; + constexpr auto b_bits = cute::sizeof_bits_v>; + constexpr int stage_bytes = + cutlass::bits_to_bytes(a_bits * size<0>(TileShapeMNK{}) * size<2>(TileShapeMNK{})) + + cutlass::bits_to_bytes(b_bits * size<1>(TileShapeMNK{}) * size<2>(TileShapeMNK{})) + + static_cast(load2transform_pipeline_bytes); + + return (CapacityBytes - carveout_bytes) / stage_bytes; +} + +} // namespace detail + +///////////////////////////////////////////////////////////////////////////////////////////////// +// Interleaved complex tf32 TCGEN05 kernels builder +template < + class ArchTag, + class GmemLayoutATag, + class TransformA, + class GmemLayoutBTag, + class TransformB, + class TileShape_MNK, + class ClusterShape_MNK, + class StageCountType, + class BuilderScheduleTag +> +struct CollectiveBuilder< + ArchTag, + arch::OpClassTensorOp, + cute::tuple, TransformA>, + GmemLayoutATag, + 2, + cute::tuple, TransformB>, + GmemLayoutBTag, + 2, + cutlass::complex, + TileShape_MNK, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + ClusterShape_MNK, // Static cluster shape or dynamic (int, int, _1) + StageCountType, + BuilderScheduleTag, + cute::enable_if_t< + (cute::is_same_v + ) && + (cute::is_base_of_v || + cute::is_same_v)>> +{ + static_assert(cute::is_static_v, "TileShape_MNK has to be static"); + // ElementA and ElementB are cutlass::complex, which are used as GMEM input and output data type. + // ElementAMma and ElementBMma are cutlass::complex, which are used as SMEM and RF data type. + using ElementA = complex; + using ElementB = complex; + using ElementAccumulator = cutlass::complex; + using ElementAMma = complex; + using ElementBMma = complex; + + static constexpr cute::UMMA::Major UmmaMajorA = cutlass::gemm::collective::detail::tag_to_umma_major_A(); + static constexpr cute::UMMA::Major UmmaMajorB = cutlass::gemm::collective::detail::tag_to_umma_major_B(); + + using TiledMma = decltype(detail::sm100_make_trivial_interleaved_complex_tf32_tiled_mma< + TileShape_MNK,ClusterShape_MNK,BuilderScheduleTag>()); + + using AtomThrID = typename TiledMma::AtomThrID; + + // Define A and B block shapes for reduced size TMA_LOADs + // ((MMA_TILE_M,MMA_TILE_K), MMA_M, MMA_K) + using MmaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(cute::size<0>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + // ((MMA_TILE_N,MMA_TILE_K), MMA_N, MMA_K) + using MmaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(cute::size<1>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + // Input transform kernel can not use TMA 2SM instructions. + using GmemTiledCopyA = decltype(detail::sm90_cluster_shape_to_tma_atom(cute::size<1>(ClusterShape_MNK{}))); + + using BlockTileA_M = decltype(cute::size<0,0>(MmaShapeA_MK{}) * cute::size<1>(MmaShapeA_MK{})); + using BlockTileA_K = decltype(cute::size<0,1>(MmaShapeA_MK{}) * cute::size<2>(MmaShapeA_MK{})); + + using SmemLayoutAtomA = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + using SmemLayoutAtomACompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + using SmemLayoutAtomPairA = cutlass::gemm::collective::detail::Sm100CollectiveMmaComplexLayoutAtomType; + + static constexpr int MMA_M = cute::size<0>(TileShape_MNK{}); + + using CopyAtomPairA = cutlass::gemm::collective::detail::Sm100CollectiveMmaComplexCopyType< + Copy_Atom, ElementAMma>, + conditional_t + >; + + // Input transform kernel can not use TMA 2SM instructions. + using GmemTiledCopyB = decltype(detail::sm90_cluster_shape_to_tma_atom(cute::size<0>(ClusterShape_MNK{}))); + + using BlockTileB_N = decltype(cute::size<0,0>(MmaShapeB_NK{}) * cute::size<1>(MmaShapeB_NK{})); + using BlockTileB_K = decltype(cute::size<0,1>(MmaShapeB_NK{}) * cute::size<2>(MmaShapeB_NK{})); + + using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + using SmemLayoutAtomBCompute = decltype(cutlass::gemm::collective::detail::sm100_smem_selector()); + using SmemLayoutAtomPairB = cutlass::gemm::collective::detail::Sm100CollectiveMmaComplexLayoutAtomType; + + using CopyAtomPairB = cutlass::gemm::collective::detail::Sm100CollectiveMmaComplexCopyType< + Copy_Atom, ElementBMma>, + Copy_Atom, ElementBMma> + >; + + // Calculate SMEM matrix A and B buffers' pipeline stages + static constexpr int MMA_N = cute::size<1>(TileShape_MNK{}); + static constexpr uint32_t TransformationStageCount = 4; + static constexpr uint32_t AccumulatorPipelineStageCount = (MMA_N >= 128) ? 1 : 2; + static constexpr uint32_t SchedulerPipelineStageCount = 3; + static constexpr bool IsArrayOfPointersGemm = (cute::is_base_of_v); + + // SmemCarveout + // B needs extra smem for smem tranpose (CollectiveMma::TensorStorageTransformed) + static constexpr auto TensorStorageTransformedSmemBStorage = TransformationStageCount * + static_cast(sizeof(ElementBMma)) * size<0>(BlockTileB_N{}) * size<0>(BlockTileA_K{}); + // CLCPipeline = PipelineCLCFetchAsync + static constexpr auto CLCPipelineStorage = sizeof(typename cutlass::PipelineCLCFetchAsync::SharedStorage); + // Transform2MmaPipeline = PipelineUmmaConsumerAsync (CollectiveMma) + static constexpr auto Transform2MmaPipelineStorage = sizeof(typename cutlass::PipelineUmmaConsumerAsync::SharedStorage); + // Mma2AccumPipeline = PipelineUmmaAsync (CollectiveMma) + static constexpr auto Mma2AccumPipelineStorage = sizeof(typename cutlass::PipelineUmmaAsync::SharedStorage); + // CLC (scheduler) response + static constexpr auto CLCResponseStorage = SchedulerPipelineStageCount * detail::CLCResponseSize; + // CLC Throttle pipeline storage + static constexpr auto CLCThrottlePipelineStorage = sizeof(typename cutlass::PipelineAsync::SharedStorage); + // Tmem dealloc + static constexpr auto TmemDeallocStorage = sizeof(cutlass::arch::ClusterBarrier); + // Tmem ptr storage + static constexpr auto TmemBasePtrsStorage = sizeof(uint32_t); + // Tensormap Storage + + static constexpr size_t TensorMapStorage = IsArrayOfPointersGemm ? sizeof(cute::TmaDescriptor) * 2 /* for A and B */ : 0; + + // Smem usage that's not part of CollectiveEpilogue::SharedStorage & CollectiveMainloop::SharedStorage + static constexpr auto KernelSmemCarveout = static_cast( CLCPipelineStorage + + CLCResponseStorage + + CLCThrottlePipelineStorage + + Transform2MmaPipelineStorage + + Mma2AccumPipelineStorage + + TensorStorageTransformedSmemBStorage + + TmemDeallocStorage + + TmemBasePtrsStorage + + TensorMapStorage); + // Reduce SMEM capacity available for buffers considering extra B smem and barrier smem allocations + + static constexpr int ReducedSmemCapacityBytes = + cutlass::gemm::collective::detail::sm100_smem_capacity_bytes - KernelSmemCarveout; + + using SmemTileShape = cute::Shape; + + static constexpr int PipelineStages_ = detail::sm100_compute_stage_count_or_override_interleaved_complex_tf32< + ReducedSmemCapacityBytes, SmemTileShape>(StageCountType{}); + // Complex kernels allow TileShape_N = 64, while SmemLayoutAtomB contains Swizzle<3,4,3>. + static constexpr int PipelineStages = size<1>(TileShape_MNK{}) == 64 ? PipelineStages_ / 2 * 2 : PipelineStages_; + static_assert(PipelineStages >= 2, "Pipeline Stages has to be at least 2"); + + using AccumulatorCopyAtom = cute::SM100_TMEM_LOAD_16dp256b1x; + + using DispatchPolicy = cute::conditional_t, + cutlass::gemm::MainloopSm100TmaUmmaWarpSpecializedInterleavedComplexTF32< + PipelineStages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + TransformationStageCount, + ClusterShape_MNK, + AccumulatorCopyAtom + > + >; + + using CollectiveOp = cutlass::gemm::collective::CollectiveMma< + DispatchPolicy, + TileShape_MNK, + ElementA, + cutlass::gemm::TagToStrideA_t, + ElementB, + cutlass::gemm::TagToStrideB_t, + TiledMma, + GmemTiledCopyA, + SmemLayoutAtomPairA, + CopyAtomPairA, + TransformA, + GmemTiledCopyB, + SmemLayoutAtomPairB, + CopyAtomPairB, + TransformB + >; +}; + +} // cutlass::gemm::collective diff --git a/include/cutlass/gemm/collective/builders/sm100_planar_complex_umma_builder.inl b/include/cutlass/gemm/collective/builders/sm100_planar_complex_umma_builder.inl new file mode 100644 index 00000000..dee762f1 --- /dev/null +++ b/include/cutlass/gemm/collective/builders/sm100_planar_complex_umma_builder.inl @@ -0,0 +1,182 @@ +/*************************************************************************************************** + * Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +#pragma once + + +#include "cutlass/gemm/collective/builders/sm100_common.inl" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +///////////////////////////////////////////////////////////////////////////////////////////////// +// Planar Complex f16/bf16 TCGEN05 kernels builder +template < + class ArchTag, + class ElementA, + class GmemLayoutATag, + class TransformA, + class ElementB, + class GmemLayoutBTag, + class TransformB, + class ElementAccumulator, + class TileShape_MNK, + class ClusterShape_MNK, + class StageCountType, + class BuilderScheduleTag +> +struct CollectiveBuilder< + ArchTag, + arch::OpClassTensorOp, + cute::tuple, + GmemLayoutATag, + 8, + cute::tuple, + GmemLayoutBTag, + 8, + ElementAccumulator, + TileShape_MNK, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + ClusterShape_MNK, // Static cluster shape or dynamic (int, int, _1) + StageCountType, + BuilderScheduleTag, + cute::enable_if_t< + (cute::is_same_v + ) && + // Element Types AB should be set as real type in Planar Complex f16/bf16 TCGEN05 kernels builder. + (cute::is_same_v || cute::is_same_v) && + (cute::is_same_v || cute::is_same_v) && + // Planar Complex f16/bf16 kernels don't support auto-scheduling for mainloop builder. + cute::is_base_of_v>> +{ + static_assert(cute::is_static_v, "TileShape has to be static"); + + static constexpr cute::UMMA::Major UmmaMajorA = cutlass::gemm::collective::detail::tag_to_umma_major_A(); + static constexpr cute::UMMA::Major UmmaMajorB = cutlass::gemm::collective::detail::tag_to_umma_major_B(); + + using TiledMma = decltype(detail::sm100_make_trivial_tiled_mma< + ElementA, ElementB, ElementAccumulator, + TileShape_MNK, ClusterShape_MNK, + UmmaMajorA, UmmaMajorB, BuilderScheduleTag, UMMA::ScaleIn::One>()); + using TiledMmaANeg = decltype(detail::sm100_make_trivial_tiled_mma< + ElementA, ElementB, ElementAccumulator, + TileShape_MNK, ClusterShape_MNK, + UmmaMajorA, UmmaMajorB, BuilderScheduleTag, UMMA::ScaleIn::Neg>()); + using TiledMmaPair = cutlass::gemm::collective::detail::Sm100CollectiveMmaPlanarComplexTiledMmaType; + + using AtomThrID = typename TiledMma::AtomThrID; + + // Define A and B block shapes for reduced size TMA_LOADs + // ((MMA_TILE_M,MMA_TILE_K), MMA_M, MMA_K) + using MmaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(cute::size<0>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + // ((MMA_TILE_N,MMA_TILE_K), MMA_N, MMA_K) + using MmaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(cute::size<1>(TileShape_MNK{}), + cute::size<2>(TileShape_MNK{})))); + + using GmemTiledCopyA = decltype(detail::sm100_cluster_shape_to_tma_atom_A(ClusterShape_MNK{}, AtomThrID{})); + + using BlockTileA_M = decltype(cute::size<0,0>(MmaShapeA_MK{}) * cute::size<1>(MmaShapeA_MK{})); + using BlockTileA_K = decltype(cute::size<0,1>(MmaShapeA_MK{}) * cute::size<2>(MmaShapeA_MK{})); + using SmemLayoutAtomA = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + UmmaMajorA, ElementA, BlockTileA_M, BlockTileA_K>()); + + using GmemTiledCopyB = decltype(detail::sm100_cluster_shape_to_tma_atom_B(ClusterShape_MNK{}, AtomThrID{})); + + using BlockTileB_N = decltype(cute::size<0,0>(MmaShapeB_NK{}) * cute::size<1>(MmaShapeB_NK{})); + using BlockTileB_K = decltype(cute::size<0,1>(MmaShapeB_NK{}) * cute::size<2>(MmaShapeB_NK{})); + using SmemLayoutAtomB = decltype(cutlass::gemm::collective::detail::sm100_smem_selector< + UmmaMajorB, ElementB, BlockTileB_N, BlockTileB_K>()); + + // Calculate SMEM matrix A and B buffers' pipeline stages + static constexpr uint32_t AccumulatorPipelineStageCount = 2; + // Ptr-arry gemm requires extra TensorMap storage + static constexpr bool IsArrayOfPointersGemm = (cute::is_base_of_v); + // Calculate scheduler pipeline stages. Having one more stage than the accumulator allows more latency hiding. + static constexpr uint32_t SchedulerPipelineStageCount = IsArrayOfPointersGemm ? AccumulatorPipelineStageCount + 1: 1; + + static constexpr uint32_t KernelSmemCarveout = detail::Sm100DenseGemmTmaUmmaCarveout< + ClusterShape_MNK, + AccumulatorPipelineStageCount, + SchedulerPipelineStageCount, + detail::CLCResponseSize, + IsArrayOfPointersGemm, + 4 // 4 Tensor maps for A_{imag|real} and B_{imag|real} + >::KernelSmemCarveout; + + // Reduce SMEM capacity available for buffers considering barrier allocations. + + static constexpr int ReducedSmemCapacityBytes = + cutlass::gemm::collective::detail::sm100_smem_capacity_bytes - KernelSmemCarveout; + + using SmemTileShape = cute::Shape; + + // Use complex type to calculate SMEM stage count + using ComplexElementA = cutlass::complex; + using ComplexElementB = cutlass::complex; + + using MainloopPipelineStorage = typename cutlass::PipelineTmaUmmaAsync<1>::SharedStorage; + static constexpr int PipelineStages = detail::sm100_compute_stage_count_or_override< + ReducedSmemCapacityBytes, ComplexElementA, ComplexElementB, SmemTileShape, MainloopPipelineStorage>(StageCountType{}); + + using DispatchPolicy = cute::conditional_t, + cutlass::gemm::MainloopSm100TmaUmmaWarpSpecializedPlanarComplex< + PipelineStages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + ClusterShape_MNK + > + >; + + using CollectiveOp = cutlass::gemm::collective::CollectiveMma< + DispatchPolicy, + TileShape_MNK, + ElementA, + cutlass::gemm::TagToStrideA_t, + ElementB, + cutlass::gemm::TagToStrideB_t, + TiledMmaPair, + GmemTiledCopyA, + SmemLayoutAtomA, + void, + TransformA, + GmemTiledCopyB, + SmemLayoutAtomB, + void, + TransformB + >; +}; + +} // cutlass::gemm::collective diff --git a/include/cutlass/gemm/collective/collective_builder.hpp b/include/cutlass/gemm/collective/collective_builder.hpp index b16f176a..e5f51df9 100644 --- a/include/cutlass/gemm/collective/collective_builder.hpp +++ b/include/cutlass/gemm/collective/collective_builder.hpp @@ -39,15 +39,15 @@ #include "cutlass/gemm/collective/collective_builder_decl.hpp" #include "cutlass/gemm/collective/builders/sm90_gmma_builder.inl" #include "cutlass/gemm/collective/builders/sm90_sparse_gmma_builder.inl" -#if !defined(__CUDACC_RTC__) -#include "cutlass/gemm/collective/builders/sm100_umma_builder.inl" -#include "cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl" +#if !defined(__CUDACC_RTC__) +#include "cutlass/gemm/collective/builders/sm100_umma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_9xBF16_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_sparse_umma_builder.inl" -#include "cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_blockscaled_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_blockwise_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_blockscaled_sparse_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_simt_builder.inl" -#include "cutlass/gemm/collective/builders/sm100_mixed_input_umma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_mixed_input_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_cpasync_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_mixed_tma_cpasync_umma_builder.inl" #include "cutlass/gemm/collective/builders/sm100_blockscaled_mixed_tma_cpasync_umma_builder.inl" @@ -57,6 +57,9 @@ #include "cutlass/gemm/collective/builders/sm120_sparse_mma_builder.inl" #include "cutlass/gemm/collective/builders/sm120_blockscaled_sparse_mma_builder.inl" #include "cutlass/gemm/collective/builders/sm120_blockwise_mma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_interleaved_complex_umma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_9xBF16_interleaved_complex_umma_builder.inl" +#include "cutlass/gemm/collective/builders/sm100_planar_complex_umma_builder.inl" #endif ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/collective_mma.hpp b/include/cutlass/gemm/collective/collective_mma.hpp index 8353c50e..2cc5697a 100644 --- a/include/cutlass/gemm/collective/collective_mma.hpp +++ b/include/cutlass/gemm/collective/collective_mma.hpp @@ -42,7 +42,7 @@ #include "cutlass/gemm/collective/sm90_mma_multistage_gmma_rs_warpspecialized.hpp" #include "cutlass/gemm/collective/sm90_mma_tma_gmma_ss.hpp" #include "cutlass/gemm/collective/sm90_mma_tma_gmma_rs_warpspecialized.hpp" -#include "cutlass/gemm/collective/sm90_mma_tma_gmma_rs_warpspecialized_mixed_input.hpp" +#include "cutlass/gemm/collective/sm90_mma_tma_gmma_rs_warpspecialized_mixed_input.hpp" #include "cutlass/gemm/collective/sm90_mma_tma_gmma_ss_warpspecialized.hpp" #include "cutlass/gemm/collective/sm90_sparse_mma_tma_gmma_ss_warpspecialized.hpp" #include "cutlass/gemm/collective/sm90_sparse_mma_tma_gmma_ss_warpspecialized_fp8.hpp" @@ -61,8 +61,8 @@ #include "cutlass/gemm/collective/sm100_mma_array_warpspecialized_emulated.hpp" #include "cutlass/gemm/collective/sm100_sparse_mma_warpspecialized.hpp" #include "cutlass/gemm/collective/sm100_blockscaled_sparse_mma_warpspecialized.hpp" -#include "cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp" -#include "cutlass/gemm/collective/sm100_blockscaled_mma_array_warpspecialized.hpp" +#include "cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp" +#include "cutlass/gemm/collective/sm100_blockscaled_mma_array_warpspecialized.hpp" #include "cutlass/gemm/collective/sm100_mma_warpspecialized_blockwise_scaling.hpp" #include "cutlass/gemm/collective/sm100_mma_array_warpspecialized_blockwise_scaling.hpp" #include "cutlass/gemm/collective/sm100_mma_warpspecialized_mixed_input.hpp" @@ -74,11 +74,17 @@ #include "cutlass/gemm/collective/sm120_mma_tma.hpp" #include "cutlass/gemm/collective/sm120_blockscaled_mma_tma.hpp" #include "cutlass/gemm/collective/sm120_blockscaled_mma_array_tma.hpp" -#include "cutlass/gemm/collective/sm120_sparse_mma_tma.hpp" -#include "cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp" #include "cutlass/gemm/collective/sm120_mma_tma_blockwise_scaling.hpp" #include "cutlass/gemm/collective/sm120_mma_array_tma_blockwise_scaling.hpp" -#endif // !defined(__CUDACC_RTC__) +#include "cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_emulated.hpp" +#include "cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_emulated.hpp" +#include "cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_tf32.hpp" +#include "cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_tf32.hpp" +#include "cutlass/gemm/collective/sm100_mma_warpspecialized_planar_complex.hpp" +#include "cutlass/gemm/collective/sm100_mma_array_warpspecialized_planar_complex.hpp" +#include "cutlass/gemm/collective/sm120_sparse_mma_tma.hpp" +#include "cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp" +#endif // !defined(__CUDACC_RTC__) diff --git a/include/cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp b/include/cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp index 082a13fc..e949f31d 100644 --- a/include/cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp +++ b/include/cutlass/gemm/collective/sm100_blockscaled_mma_warpspecialized.hpp @@ -604,14 +604,15 @@ struct CollectiveMma< implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); // Check for SFA SFB layout requirement - const auto layout_sfa_ref = Sm1xxBlkScaledConfig::tile_atom_to_shape_SFA(problem_shape_MNKL); - const auto layout_sfb_ref = Sm1xxBlkScaledConfig::tile_atom_to_shape_SFB(problem_shape_MNKL); - implementable = implementable && (layout_sfa_ref == args.layout_SFA); + const auto layout_sfa_ref = take<0,2>(Sm1xxBlkScaledConfig::tile_atom_to_shape_SFA(problem_shape_MNKL)); + const auto layout_sfb_ref = take<0,2>(Sm1xxBlkScaledConfig::tile_atom_to_shape_SFB(problem_shape_MNKL)); + + implementable = implementable && (layout_sfa_ref == take<0,2>(args.layout_SFA)); if (!implementable) { CUTLASS_TRACE_HOST(" CAN IMPLEMENT: layout_SFA mismatch, layout_SFA needs to be K-major\n"); } - implementable = implementable && (layout_sfb_ref == args.layout_SFB); + implementable = implementable && (layout_sfb_ref == take<0,2>(args.layout_SFB)); if (!implementable) { CUTLASS_TRACE_HOST(" CAN IMPLEMENT: layout_SFB mismatch, layout_SFB needs to be K-major\n"); } diff --git a/include/cutlass/gemm/collective/sm100_blockscaled_sparse_mma_warpspecialized.hpp b/include/cutlass/gemm/collective/sm100_blockscaled_sparse_mma_warpspecialized.hpp index b962296b..e20371d3 100644 --- a/include/cutlass/gemm/collective/sm100_blockscaled_sparse_mma_warpspecialized.hpp +++ b/include/cutlass/gemm/collective/sm100_blockscaled_sparse_mma_warpspecialized.hpp @@ -772,14 +772,14 @@ struct CollectiveMma< } // Check for SFA SFB layout requirement - const auto layout_sfa_ref = Sm1xxBlkScaledConfig::tile_atom_to_shape_SFA(problem_shape_MNKL); - const auto layout_sfb_ref = Sm1xxBlkScaledConfig::tile_atom_to_shape_SFB(problem_shape_MNKL); - implementable = implementable && (layout_sfa_ref == args.layout_SFA); + const auto layout_sfa_ref = take<0,2>(Sm1xxBlkScaledConfig::tile_atom_to_shape_SFA(problem_shape_MNKL)); + const auto layout_sfb_ref = take<0,2>(Sm1xxBlkScaledConfig::tile_atom_to_shape_SFB(problem_shape_MNKL)); + implementable = implementable && (layout_sfa_ref == take<0,2>(args.layout_SFA)); if (!implementable) { CUTLASS_TRACE_HOST(" CAN IMPLEMENT: layout_SFA mismatch, layout_SFA needs to be K-major\n"); } - implementable = implementable && (layout_sfb_ref == args.layout_SFB); + implementable = implementable && (layout_sfb_ref == take<0,2>(args.layout_SFB)); if (!implementable) { CUTLASS_TRACE_HOST(" CAN IMPLEMENT: layout_SFB mismatch, layout_SFB needs to be K-major\n"); } diff --git a/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_emulated.hpp b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_emulated.hpp new file mode 100644 index 00000000..d9275cf0 --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_emulated.hpp @@ -0,0 +1,1197 @@ +/*************************************************************************************************** + * Copyright (c) 2024 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + + +#pragma once +#include + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/numeric_conversion.h" +#include "cutlass/detail/sm100_tmem_helper.hpp" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/atom/copy_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/arch/mma_sm100.hpp" +#include "cutlass/trace.h" +#include "cutlass/kernel_hardware_info.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop for FastF32 Kernels +template < + int Load2TransformPipelineStageCount_, + int Transform2MmaPipelineStageCount_, + int SchedulerPipelineStageCount_, + int AccumulatorPipelineStageCount_, + int NumBandsToCompute_, + int ScalingFactor_, + int AccPromotionInterval_, + class AccumulatorCopyAtom_, + class ClusterShape, + class TileShape_, + class StrideA_, + class StrideB_, + class TiledMma_, + class GmemTiledCopyA_, + class SmemLayoutAtomsA_, + class CopyAtomsA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomsB_, + class CopyAtomsB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100ArrayTmaUmmaWarpSpecializedFastF32< + Load2TransformPipelineStageCount_, + Transform2MmaPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + NumBandsToCompute_, + ScalingFactor_, + AccPromotionInterval_, + ClusterShape, + AccumulatorCopyAtom_>, + TileShape_, + complex, + StrideA_, + complex, + StrideB_, + TiledMma_, + GmemTiledCopyA_, + SmemLayoutAtomsA_, + CopyAtomsA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomsB_, + CopyAtomsB_, + TransformB_> +{ + // + // Type Aliases + // + using TileShape = TileShape_; + using TiledMma = TiledMma_; + + // ElementA and ElementB are cutlass::complex, which are used as GMEM input and output data type. + using ElementA = complex; + using StrideA = StrideA_; + using InternalStrideA = cute::remove_pointer_t; + using ElementB = complex; + using StrideB = StrideB_; + using InternalStrideB = cute::remove_pointer_t; + + // For a complex kernel, the MMA output type is real valued, but ElementAccumulator is a complex type for the GETT reference kernel + using ElementAccumulator = complex; + using ElementAccumulatorRaw = typename TiledMma::ValTypeC; + +private: + // ElementAMma and ElementBMma are cutlass::complex, which are used as SMEM and RF data type. + // ElementAMmaRaw and ElementBMmaRaw are cutlass::bfloat16_t, which is the real internal data type set in TMA descriptor and used in TCGEN05 calculation. + using ElementAMma = typename TiledMma::ValTypeA; // complex + using ElementAMmaRaw = typename ElementAMma::value_type; // bfloat16_t + using ElementBMma = typename TiledMma::ValTypeB; // complex + using ElementBMmaRaw = typename ElementBMma::value_type; // bfloat16_t + +public: + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomsA = SmemLayoutAtomsA_; + using SmemLayoutAtomsB = SmemLayoutAtomsB_; + using CopyAtomsA = CopyAtomsA_; + using CopyAtomsB = CopyAtomsB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + + static_assert(cute::is_same_v, "Underlying input type for A should be float"); + static_assert(cute::is_same_v, "Underlying input type for B should be float"); + static_assert(cute::is_same_v, "Underlying compute type for A should be bfloat16_t"); + static_assert(cute::is_same_v, "Underlying compute type for A should be bfloat16_t"); + + // Determine MMA type: MMA_1SM vs MMA_2SM + using AtomThrShapeMNK = Shape(typename TiledMma_::ThrLayoutVMNK{})), _1, _1>; + using DispatchPolicy = MainloopSm100ArrayTmaUmmaWarpSpecializedFastF32< + Load2TransformPipelineStageCount_, + Transform2MmaPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + NumBandsToCompute_, + ScalingFactor_, + AccPromotionInterval_, + ClusterShape, + AccumulatorCopyAtom_>; + static constexpr bool IsDynamicCluster = not cute::is_static_v; + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using CtaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using CtaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + using ArchTag = typename DispatchPolicy::ArchTag; + + using Load2TransformPipeline = cutlass::PipelineTmaTransformAsync< + DispatchPolicy::Load2TransformPipelineStageCount, + AtomThrShapeMNK>; + using Load2TransformPipelineState = typename Load2TransformPipeline::PipelineState; + + using Transform2MmaPipeline = cutlass::PipelineUmmaConsumerAsync< + DispatchPolicy::Transform2MmaPipelineStageCount, + AtomThrShapeMNK>; + using Transform2MmaPipelineState = typename Transform2MmaPipeline::PipelineState; + + using Mma2AccumPipeline = cutlass::PipelineUmmaAsync< + DispatchPolicy::Schedule::AccumulatorPipelineStageCount, + AtomThrShapeMNK>; + using Mma2AccumPipelineState = typename Mma2AccumPipeline::PipelineState; + + // Thread Counts + static constexpr uint32_t NumTransformationThreads = 128; + static constexpr uint32_t NumAccumThreads = 128; + + // Get the Algorithm parameters + constexpr static int NumComputeMtxs = 3; + constexpr static int ConjSwapMode = 2; + constexpr static int NumBandsToCompute = DispatchPolicy::NumBandsToCompute; + constexpr static int ScalingFactor = DispatchPolicy::ScalingFactor; + constexpr static int AccPromotionInterval = DispatchPolicy::AccPromotionInterval; + constexpr static int AccumulatorPipelineStageCount = DispatchPolicy::Schedule::AccumulatorPipelineStageCount; + constexpr static int StagesPerTile = size<2>(CtaShapeA_MK{}) / DispatchPolicy::AccPromotionInterval; + constexpr static int NumBandsMax = 5; + static_assert(NumBandsToCompute <= NumBandsMax && NumBandsToCompute >= 3, "NumBandsToCompute should be less than maximum number of bands"); + static_assert(StagesPerTile * AccPromotionInterval == size<2>(CtaShapeA_MK{}), "PromotionInterval*InstructionK doesn't evenly divide CTA shape"); + + // Copy atom for Accumulator + using AccumulatorCopyAtom = typename DispatchPolicy::AccumulatorCopyAtom; + + static_assert((NumBandsToCompute == 5 || NumBandsToCompute == 4 || NumBandsToCompute == 3), + "9xBF16 with 5/4/3 Bands are supported"); + + using SmemLayoutAtomA = typename SmemLayoutAtomsA::InputLayoutAtom; + using SmemLayoutAtomACompute = typename SmemLayoutAtomsA::ComputeLayoutAtom; + using SmemLayoutAtomB = typename SmemLayoutAtomsB::InputLayoutAtom; + using SmemLayoutAtomBCompute = typename SmemLayoutAtomsB::ComputeLayoutAtom; + + using InputCopyAtomA = typename CopyAtomsA::InputCopyAtom; + using ComputeCopyAtomA = typename CopyAtomsA::ComputeCopyAtom; + using InputCopyAtomB = typename CopyAtomsB::InputCopyAtom; + using ComputeCopyAtomB = typename CopyAtomsB::ComputeCopyAtom; + + static_assert(rank(SmemLayoutAtomA{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert(((size<0,0>(CtaShapeA_MK{}) * size<1>(CtaShapeA_MK{})) % size<0>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeA_MK{}) * size<2>(CtaShapeA_MK{})) % size<1>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + + static_assert(rank(SmemLayoutAtomB{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert(((size<0,0>(CtaShapeB_NK{}) * size<1>(CtaShapeB_NK{})) % size<0>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeB_NK{}) * size<2>(CtaShapeB_NK{})) % size<1>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(CtaShapeA_MK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutACompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomACompute{}, + tuple_cat(CtaShapeA_MK{}, tuple, Int>{}))); + + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(CtaShapeB_NK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutBCompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomBCompute{}, + tuple_cat(CtaShapeB_NK{}, tuple, Int, Int>{}))); + + static_assert(DispatchPolicy::Load2TransformPipelineStageCount >= 2 && DispatchPolicy::Load2TransformPipelineStageCount >= 2, + "Specialization requires Stages set to value 2 or more."); + static_assert((cute::is_base_of::value || + cute::is_base_of::value ) && + cute::is_base_of::value, + "MMA atom must A operand from SMEM or TMEM and B operand from SMEM for this mainloop."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyA - invalid TMA copy atom specified."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyB - invalid TMA copy atom specified."); + + struct PipelineStorage { + using Load2TransformPipelineStorage = typename Load2TransformPipeline::SharedStorage; + alignas(16) Load2TransformPipelineStorage load2transform_pipeline; + using Transform2MmaPipelineStorage = typename Transform2MmaPipeline::SharedStorage; + alignas(16) Transform2MmaPipelineStorage transform2mma_pipeline; + using Mma2AccumPipelineStorage = typename Mma2AccumPipeline::SharedStorage; + alignas(16) Mma2AccumPipelineStorage mma2accum_pipeline; + }; + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + struct TensorStorageUntransformed { + cute::ArrayEngine> smem_A; + cute::ArrayEngine> smem_B; + }; + + struct TensorStorageTransformedAinSmem { + alignas(1024) cute::ArrayEngine> smem_ACompute; + alignas(1024) cute::ArrayEngine> smem_BCompute; + }; + + union TensorStorageTransformedAinTmem { + alignas(1024) cute::ArrayEngine smem_ACompute; // No smem_ACompute + alignas(1024) cute::ArrayEngine> smem_BCompute; + }; + + using TensorStorageTransformed = cute::conditional_t< + cute::is_base_of::value, + TensorStorageTransformedAinSmem, + TensorStorageTransformedAinTmem>; + + TensorStorageUntransformed input; + TensorStorageTransformed compute; + } tensors; + + struct TensorMapStorage : cute::aligned_struct<128, _0> { + cute::TmaDescriptor smem_tensormap_A; + cute::TmaDescriptor smem_tensormap_B; + } tensormaps; + + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using TensorMapStorage = typename SharedStorage::TensorMapStorage; + + // Different from other GEMM kernels, both CTAs should be aware of loads. Both CTAs will work on + // loaded input A and B matrices to convert the data type + static constexpr uint32_t TmaTransactionBytes = + cutlass::bits_to_bytes(size<0>(SmemLayoutA{}) * size<1>(SmemLayoutA{}) * size<2>(SmemLayoutA{}) * static_cast(sizeof_bits::value))+ + cutlass::bits_to_bytes(size<0>(SmemLayoutB{}) * size<1>(SmemLayoutB{}) * size<2>(SmemLayoutB{}) * static_cast(sizeof_bits::value)); + + // Host side kernel arguments + struct Arguments { + ElementA const** ptr_A{nullptr}; + StrideA dA{}; + ElementB const** ptr_B{nullptr}; + StrideB dB{}; + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), + make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + TMA_A tma_load_a; + TMA_B tma_load_b; + TMA_A tma_load_a_fallback; + TMA_B tma_load_b_fallback; + dim3 cluster_shape_fallback; + cute::TmaDescriptor* tensormaps; + ElementA const** ptr_A; + ElementB const** ptr_B; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_ = is_fallback_cluster ? ¶ms.tma_load_a_fallback : ¶ms.tma_load_a; + observed_tma_load_b_ = is_fallback_cluster ? ¶ms.tma_load_b_fallback : ¶ms.tma_load_b; + } + else { + observed_tma_load_a_ = ¶ms.tma_load_a; + observed_tma_load_b_ = ¶ms.tma_load_b; + } + } + + template + static constexpr Params + to_underlying_arguments(ProblemShape problem_shape, Arguments const& args, void* workspace, cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + (void) workspace; + + // Tensor shapes for Ptr-Array are initialized correctly here. + auto [M,N,K,mock_L] = problem_shape.get_host_problem_shape(0); + // Batches/Groups are managed by using appropriate pointers to input matrices + mock_L = 1; + + // Tensor pointers will be fixed before the first access + ElementA const* ptr_A_first_batch = nullptr; + ElementB const* ptr_B_first_batch = nullptr; + + Tensor tensor_a = make_tensor(ptr_A_first_batch, make_layout(make_shape(M,K,mock_L), args.dA)); + Tensor tensor_b = make_tensor(ptr_B_first_batch, make_layout(make_shape(N,K,mock_L), args.dB)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape_fallback); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a, + tma_load_b, + tma_load_a_fallback, + tma_load_b_fallback, + hw_info.cluster_shape_fallback, + reinterpret_cast(workspace), + reinterpret_cast(args.ptr_A), + reinterpret_cast(args.ptr_B) + }; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args, int sm_count) { + constexpr uint32_t NumInputTensors = 2; + constexpr size_t SizeOfCuTensorMap = sizeof(cute::TmaDescriptor); + // Allocate gmem space for input tensormaps per each SM, A tensormap copies followed by B tensormap copies + return (NumInputTensors * SizeOfCuTensorMap * sm_count); + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + ProblemShape problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits = 128; + auto [M,N,K,L] = problem_shape.get_host_problem_shape(0); + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE auto + partition_accumulator_shape() { + auto acc_shape = partition_shape_C(TiledMma{}, take<0,2>(TileShape{})); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N) + + return acc_shape; + } + + /// Produce the inputs to the transform threads by loading inputs from gmem -> smem + template < + class GTensorA, class GTensorB, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB, + class TensorMapA, class TensorMapB, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE auto + load( + Params const& params, + Load2TransformPipeline pipeline, + Load2TransformPipelineState load2xform_pipeline_state, + cute::tuple> const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count) { + + auto [unused_gA, unused_gB, + tAgA_mkl, tBgB_nkl, tAsA, tBsB, + mcast_mask_a, mcast_mask_b, + input_tensormaps] = load_inputs; + + // slice out the work coord from tiled tensors + Tensor tAgA = tAgA_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tBgB = tBgB_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + uint32_t skip_wait = (k_tile_count <= 0); + auto pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + // LOCK mainloop_load2xform_pipeline_state for _writing_ + pipeline.producer_acquire(load2xform_pipeline_state, pipeline_flag); + int write_stage = load2xform_pipeline_state.index(); + + using BarrierType = typename Load2TransformPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(load2xform_pipeline_state); + + // Advance mainloop_pipe + ++load2xform_pipeline_state; + skip_wait = (k_tile_count <= 1); + pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + copy(observed_tma_load_a_->with(get<0>(input_tensormaps), *tma_barrier, mcast_mask_a), tAgA(_,*k_tile_iter), tAsA(_,write_stage)); + copy(observed_tma_load_b_->with(get<1>(input_tensormaps), *tma_barrier, mcast_mask_b), tBgB(_,*k_tile_iter), tBsB(_,write_stage)); + ++k_tile_iter; + } + return cute::make_tuple(load2xform_pipeline_state, k_tile_iter); + } + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_mkl - The tiled tensor for input A + /// gB_nkl - The tiled tensor for input B + // Other inputs needed for load(): partitioned AB tensors for gmem and smem, and mcast masks + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + Params const& params, + TensorStorage& shared_storage, + int32_t const sm_count, int32_t const sm_idx) const { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_mkl = cta_mma.partition_A(gA_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgB_nkl = cta_mma.partition_B(gB_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sB = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_mkl, tAsA] = tma_partition(*observed_tma_load_a_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA), group_modes<0,3>(tCgA_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_nkl, tBsB] = tma_partition(*observed_tma_load_b_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB), group_modes<0,3>(tCgB_nkl)); + + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + // Fetch a copy of tensormaps for the CTA from Params + auto input_tensormaps = tensormaps_init(params, sm_count, sm_idx); + + return cute::make_tuple( + gA_mkl, gB_nkl, // for scheduler + tAgA_mkl, tBgB_nkl, tAsA, tBsB, // for input tensor values + mcast_mask_a, mcast_mask_b, // multicast masks + input_tensormaps); // for tma descriptor modification (per-CTA tensormap copy) + } + + template< + class KTileIterator, class Accumulator, + class GTensorA, class DstCopyA, class SrcTensorA, class DstTensorA, + class GTensorB, class SrcTensorB, class DstTensorB + > + CUTLASS_DEVICE auto + transform( + Load2TransformPipeline load2transform_pipeline, + Load2TransformPipelineState load2transform_pipeline_consumer_state, + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_producer_state, + Accumulator accumulators, + cute::tuple input_operands, + KTileIterator k_tile_iter, int k_tile_count) { + + static_assert(cute::is_same_v, "ElementA and ElementB types should be the same."); + static_assert(cute::is_same_v, "ElementAMma and ElementBMma types should be the same."); + + cutlass::arch::NamedBarrier transform_bar(NumTransformationThreads, cutlass::arch::ReservedNamedBarriers::TransformBarrier); + + // tAsA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tAdA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, NumComputeMtxs(Emulation), SmemStages (In SMEM or TMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, NumComputeMtxs(Complex,Emulation), SmemStages (In SMEM) + auto [unused_tAgA, dst_copy_A, tAsA, tAdACompute, + unused_tBgB, tBsB, tBsBCompute] = input_operands; + + // Create the tensors in registers + auto tArA = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_temp = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArACompute = make_tensor(tAsA(_,_,_,_,0).shape()); + + auto tBrB = make_tensor(tBsB(_,_,_,_,0).shape()); + auto tBrB_temp = make_tensor(tBsB(_,_,_,_,0).shape()); + auto tBrBCompute = make_tensor(tBsB(_,_,_,_,0).shape()); + + // For compute, cast to 4 raw elements instead of 2 complex elements. + auto tArA_x4 = recast>(tArA); + auto tArA_temp_x4 = recast>(tArA_temp); + auto tArACompute_x4 = recast>(tArACompute); + + auto tBrB_x4 = recast>(tBrB); + auto tBrB_temp_x4 = recast>(tBrB_temp); + auto tBrBCompute_x4 = recast>(tBrBCompute); + + uint32_t skip_wait = (k_tile_count <= 0); + auto load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + auto transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + load2transform_pipeline.consumer_wait(load2transform_pipeline_consumer_state, load2transform_flag); + transform2mma_pipeline.producer_acquire(transform2mma_pipeline_producer_state, transform2mma_flag); + + int load2transform_consumer_index = load2transform_pipeline_consumer_state.index(); + int transform2mma_producer_index = transform2mma_pipeline_producer_state.index(); + + auto curr_load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state; + auto curr_transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state; + + // Copy the input B matrix from SMEM + copy(AutoVectorizingCopy{}, tBsB(_,_,_,_,load2transform_consumer_index), tBrB); + // Copy the input A matrix from SMEM + copy(AutoVectorizingCopy{}, tAsA(_,_,_,_,load2transform_consumer_index), tArA); + + /// NOTE: sm100_mma_warpspecialized_interleaved_complex_tf32.hpp introduced about expanding: + /// re(a_complex * b_complex) -> (a_re, a_im) . (b_re,-b_im) = a . b_conj + /// im(a_complex * b_complex) -> (a_re, a_im) . (b_im, b_re) = a . b_swap + /// However, 16b types need to be packed for swapping and negation. + /// Hence, (re | im | re | im) is reordered into (re_x2 | im_x2). + cute::transform(tBrB_x4, tBrB_x4, [&] (auto& f4) -> Array {return {f4[0], f4[2], f4[1], f4[3]};}); + // Conversion b -> b_conj goes first, hence TransformB has a not preceding it. + if constexpr (not cute::is_same_v) { + cute::transform(tBrB_x4, tBrB_x4, [&] (auto& f4) { + auto f2_x2 = *reinterpret_cast,2>*>(&f4); + f2_x2[1] = cutlass::negate>{}(f2_x2[1]); + return *reinterpret_cast*>(&f2_x2); + }); + } + CUTE_UNROLL + for (int comp_mtx_index = 0; comp_mtx_index < NumComputeMtxs; ++comp_mtx_index) { + // Convert from fp32 -> bf16 + cute::transform(tBrB_x4, tBrBCompute_x4, + cutlass::NumericArrayConverter::convert); + // Store as B_conj (for producing C_re) + copy(AutoVectorizingCopy{}, tBrBCompute, tBsBCompute(_,_,_,_,0,comp_mtx_index,transform2mma_producer_index)); + // if it is not the last compute matrix, scale and substract + if (comp_mtx_index < NumComputeMtxs - 1) { + // Convert from bf16 -> fp32 to substract + cute::transform(tBrBCompute_x4, tBrB_temp_x4, + cutlass::NumericArrayConverter::convert); + cute::transform(tBrB_x4, tBrB_temp_x4, tBrB_x4, cutlass::minus>{}); + if constexpr (DispatchPolicy::ScalingFactor != 0) { + cute::transform(tBrB_x4, tBrB_x4, cutlass::scale>{(1 << DispatchPolicy::ScalingFactor)}); + } + } + + // Convert B_conj to B_swap + cute::transform(tBrBCompute_x4, tBrBCompute_x4, [&] (auto& h4) { + // Reinterpret as packed types + auto h2_x2_conj = *reinterpret_cast,2>*>(&h4); + cutlass::negate> neg; + Array,2> h2_x2_swap{ neg(h2_x2_conj[1]), h2_x2_conj[0] }; + return *reinterpret_cast*>(&h2_x2_swap); + }); + // Store as B_swap (for producing C_im) + copy(AutoVectorizingCopy{}, tBrBCompute, tBsBCompute(_,_,_,_,1,comp_mtx_index,transform2mma_producer_index)); + } + + // Loads from SMEM are done. Signal the mainloop load as early as possible + transform_bar.sync(); + load2transform_pipeline.consumer_release(curr_load2transform_pipeline_consumer_state); + + // ( re | im | re | im ) -> ( re_x2 | im_x2 ) + cute::transform(tArA_x4, tArA_x4, [&] (auto& f4) -> Array{return {f4[0], f4[2], f4[1], f4[3]};}); + if constexpr (cute::is_same_v) { + cute::transform(tArA_x4, tArA_x4, [&] (auto& f4) { + auto f2_x2 = *reinterpret_cast,2>*>(&f4); + f2_x2[1] = cutlass::negate>{}(f2_x2[1]); + return *reinterpret_cast*>(&f2_x2); + }); + } + CUTE_UNROLL + for (int comp_mtx_index = 0; comp_mtx_index < NumComputeMtxs; ++comp_mtx_index) { + // Convert from fp32 -> bf16 + cute::transform(tArA_x4, tArACompute_x4, + cutlass::NumericArrayConverter::convert); + copy(dst_copy_A, tArACompute, tAdACompute(_,_,_,_,comp_mtx_index,transform2mma_producer_index)); + // if it is not the last compute matrix, scale and substract + if (comp_mtx_index < NumComputeMtxs - 1) { + // Convert from bf16 -> fp32 to substract + cute::transform(tArACompute_x4, tArA_temp_x4, + cutlass::NumericArrayConverter::convert); + cute::transform(tArA_x4, tArA_temp_x4, tArA_x4, cutlass::minus>{}); + if constexpr (DispatchPolicy::ScalingFactor != 0) { + cute::transform(tArA_x4, tArA_x4, cutlass::scale>{(1 << DispatchPolicy::ScalingFactor)}); + } + } + } + + // fence for SMEM writes + cutlass::arch::fence_view_async_shared(); + if constexpr (is_tmem::value) { + // fence for TMEM writes if A operand is coming from TMEM + cutlass::arch::fence_view_async_tmem_store(); + } + + // Let the MMA know we are done transforming + transform2mma_pipeline.producer_commit(curr_transform2mma_pipeline_producer_state); + // Next pipeline stage + ++load2transform_pipeline_consumer_state; + ++transform2mma_pipeline_producer_state; + + skip_wait = (k_tile_count <= 1); + // Peek the next pipeline stage's barriers + load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + } + return cute::make_tuple(load2transform_pipeline_consumer_state, transform2mma_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + transform_init( + Params const& params, + ProblemShape_MNKL const& problem_shape_MNKL, + Accumulator accumulators, + TensorStorage& shared_storage) { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + Tensor sA_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); + Tensor sA = as_position_independent_swizzle_tensor(sA_orig); + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + + Tensor sB_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); + Tensor sB = as_position_independent_swizzle_tensor(sB_orig); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + + // Map input, compute, and fragment tensors to + // Copy strategies and partitioned tensors. These will become the input + // operands of the transform function. Depending on MMA atom type, the + // operands can reside in SMEM or TMEM + auto setup_copy_ops = [&] ( + auto tensor_input, + auto input_copy_atom, + auto tensor_compute, + auto make_fragment, + auto compute_copy_atom) constexpr { + auto fragment_compute = make_fragment(tensor_compute); + if constexpr (cute::is_tmem>::value) { + // For M=128 with 2CTA MMA atoms, the TMEM tensor for A has a duplicated allocation. + // Instead of allocation a 64x16 TMEM tensor, we have a 128x16 allocation + // See: TmemAllocMode::Duplicated. + Tensor tensor_input2x = [&] () constexpr { + if constexpr (decltype(size<0,0>(fragment_compute) == Int<128>{} && size<0,0>(tensor_input) == Int<64>{})::value) { + return make_tensor(tensor_input.data(), + logical_product(tensor_input.layout(), + make_tile(make_tile(Layout<_2,_0>{},_),_,_,_))); // ((128,16),m,k,PIPE) + } + else { + return tensor_input; + } + }(); + + fragment_compute.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + // If operand comes from TMEM, create the TMEM_STORE based copy + auto reg2tmem_tiled_copy = make_tmem_copy(compute_copy_atom, fragment_compute(_,_,_,0,0)); + auto thr_reg2tmem_tiled_copy = reg2tmem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2tmem_tiled_copy.partition_S(tensor_input2x); + auto partitioned_tensor_compute = thr_reg2tmem_tiled_copy.partition_D(fragment_compute); + return cute::make_tuple(reg2tmem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + else { + // If the operand comes from SMEM, create SMEM copy. + auto tensor_compute_ind_sw = as_position_independent_swizzle_tensor(tensor_compute); + auto reg2smem_tiled_copy = make_cotiled_copy(compute_copy_atom, Layout, Stride< _8,_1>>{}, + take<0,3>(tensor_compute.layout())); + + // Source copy is based on the source operand of copy. + auto thr_reg2smem_tiled_copy = reg2smem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2smem_tiled_copy.partition_S(tensor_input); + auto partitioned_tensor_compute = thr_reg2smem_tiled_copy.partition_D(tensor_compute_ind_sw); + + return cute::make_tuple(AutoVectorizingCopy{}, partitioned_tensor_input, partitioned_tensor_compute); + } + }; + + auto [dst_copy_A, tAsA, tAsACompute] = + setup_copy_ops(sA, InputCopyAtomA{}, sACompute, [&](auto &arg) {return TiledMma::make_fragment_A(arg);}, ComputeCopyAtomA{}); + + auto [dst_copy_B, tBsB, tBsBCompute] = + setup_copy_ops(sB, InputCopyAtomB{}, sBCompute, [&](auto &arg) {return TiledMma::make_fragment_B(arg);}, ComputeCopyAtomB{}); + + return cute::make_tuple(gA_mkl, dst_copy_A, tAsA, tAsACompute, + gB_nkl, tBsB, tBsBCompute); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class FrgEngine, class FrgLayout, + class TensorA, class TensorB + > + CUTLASS_DEVICE auto + mma( + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_consumer_state, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_producer_state, + cute::Tensor const& accumulators, + cute::tuple const& input_operands, + int k_tile_count + ) { + TiledMma tiled_mma; + + auto curr_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + auto next_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + uint32_t skip_wait = (k_tile_count <= 0); + auto transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + ++next_transform2mma_pipeline_consumer_state; + + // tCrA : (MMA), MMA_M, MMA_K, NumComputeMtxs, SmemStage (In SMEM or TMEM) + // We use SMEM stages to match #buffers in Load <-> Convert + // tCrB : (MMA), MMA_N, MMA_K, NumComputeMtxs, SmemStages (In SMEM) + auto const [tCrA, tCrB] = input_operands; + + using ZeroScaler = cute::integral_constant; + using Scaler = cute::integral_constant; + + int remaining_accum_promotions = k_tile_count * StagesPerTile; + uint32_t mma2accum_skip_wait = (remaining_accum_promotions <= 0); + auto mma2accum_flag = mma2accum_pipeline.producer_try_acquire(mma2accum_pipeline_producer_state, mma2accum_skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + transform2mma_pipeline.consumer_wait(curr_transform2mma_pipeline_consumer_state, transform2mma_flag); + + int transform2mma_pipeline_consumer_state_index = curr_transform2mma_pipeline_consumer_state.index(); + + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tCrA); k_block += DispatchPolicy::AccPromotionInterval, --remaining_accum_promotions) { + // Accum stages are organized as (C_real | C_imag | C_real | C_imag | ...) + CUTLASS_PRAGMA_UNROLL + for (int re_im = 0; re_im < 2; ++re_im) { + mma2accum_pipeline.producer_acquire(mma2accum_pipeline_producer_state, mma2accum_flag); + + int mma2accum_pipeline_producer_state_index = mma2accum_pipeline_producer_state.index(); + auto tCtC = accumulators(_,_,_,mma2accum_pipeline_producer_state_index); + auto curr_mma2accum_pipeline_producer_state = mma2accum_pipeline_producer_state; + + ++mma2accum_pipeline_producer_state; + mma2accum_skip_wait = (remaining_accum_promotions <= 1) && (re_im == 1); + mma2accum_flag = mma2accum_pipeline.producer_try_acquire(mma2accum_pipeline_producer_state, mma2accum_skip_wait); + + auto tCrA0 = tCrA(_,_,_,0,transform2mma_pipeline_consumer_state_index); + auto tCrA1 = tCrA(_,_,_,1,transform2mma_pipeline_consumer_state_index); + auto tCrA2 = tCrA(_,_,_,2,transform2mma_pipeline_consumer_state_index); + + auto tCrB0 = tCrB(_,_,_,re_im,0,transform2mma_pipeline_consumer_state_index); + auto tCrB1 = tCrB(_,_,_,re_im,1,transform2mma_pipeline_consumer_state_index); + auto tCrB2 = tCrB(_,_,_,re_im,2,transform2mma_pipeline_consumer_state_index); + + // MMA instructions Emulation + auto accumulate = UMMA::ScaleOut::Zero; + + // First set of GEMMs that we need to perform for each band are unrolled to set compile-time constant + // scaling parameter. Scaled GEMM operations are only needed for the first MMA operation of each band. + + // Band 5 + if constexpr (NumBandsToCompute == 5) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[2]*B[2] + accumulate = UMMA::ScaleOut::One; + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[2]*B[2] + } + } + // Band 4 + if constexpr (NumBandsToCompute >= 4) { + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA1(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[1]*B[2] + accumulate = UMMA::ScaleOut::One; + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[2]*B[1] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[1]*B[2] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[2]*B[1] + } + } + // Band 3 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[2]*B[0] + accumulate = UMMA::ScaleOut::One; + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[1]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[0]*B[2] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[2]*B[0] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[1]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[0]*B[2] + } + // Band 2 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[0]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[1]*B[0] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[0]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[1]*B[0] + } + // Band 1 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[0]*B[0] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[0]*B[0] + } + mma2accum_pipeline.producer_commit(curr_mma2accum_pipeline_producer_state); + } + } + + transform2mma_pipeline.consumer_release(curr_transform2mma_pipeline_consumer_state); + + skip_wait = (k_tile_count <= 1); + transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + + curr_transform2mma_pipeline_consumer_state = next_transform2mma_pipeline_consumer_state; + ++next_transform2mma_pipeline_consumer_state; + } + return cute::make_tuple(curr_transform2mma_pipeline_consumer_state, mma2accum_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + mma_init(cute::Tensor const& accumulators, TensorStorage& shared_storage) const { + TiledMma tiled_mma; + + Tensor tCrA = [&] () constexpr { + if constexpr (cute::is_base_of::value) { + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + return tiled_mma.make_fragment_A(sACompute); + } + else { + auto tCrA = tiled_mma.make_fragment_A(shape(SmemLayoutACompute{})); + tCrA.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + return tCrA; + } + } (); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + Tensor tCrB = tiled_mma.make_fragment_B(sBCompute); + return cute::make_tuple(tCrA, tCrB); + } + + template + CUTLASS_DEVICE auto + accum_init(cute::Tensor const& accumulators, TmemCopyAtom tmem_cp_atom, EpilogueTile epilogue_tile) { + // Obtain a single accumulator + Tensor tAcc = tensor<0>(accumulators(_,_,_,_0{})); + // Apply epilogue subtiling + Tensor tAcc_epi = flat_divide(tAcc, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + // Create the TMEM copy for single EpilogueTile. + // Note that EpilogueTile = CtaTile for NoSmem epilogue + auto tiled_t2r = make_tmem_copy(tmem_cp_atom, tAcc_epi(_,_,_0{},_0{})); + auto thread_t2r = tiled_t2r.get_slice(threadIdx.x % size(tiled_t2r)); + Tensor tTR_gC = thread_t2r.partition_D(tAcc_epi); + Tensor tTR_rAcc = make_tensor(shape(tTR_gC)); // (T2R,T2R_M,T2R_N) + Tensor tTR_rGlobAcc = make_tensor(shape(tTR_gC)); // (T2R,T2R_M,T2R_N) + + // Apply epilogue subtiling to bulk accumulator + // We need to tile the whole bulk_tmem allocation with EpilogueTile. + // The accumulation should be aware of the AccumulatorPipelineStages + Tensor tBulkAcc_epi = flat_divide(accumulators(make_coord(_,_),_0{},_0{},_), EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N,PIPE) + Tensor tTR_tBulkAcc = thread_t2r.partition_S(tBulkAcc_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N,PIPE) + return cute::make_tuple(tiled_t2r, thread_t2r, tTR_tBulkAcc, tTR_rAcc, tTR_rGlobAcc); + } + + template + CUTLASS_DEVICE auto + accum(cute::tuple accum_inputs, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_consumer_state, + int k_tile_count) { + auto [tiled_t2r, thread_t2r, tTR_tBulkAcc, + tTR_rAcc, tTR_rGlobAcc] = accum_inputs; + + Tensor tTR_rAcc_float2 = recast>(tTR_rAcc); // (T2R/2,T2R_M,T2R_N) + Tensor tTR_rGlobAcc_float2_x2 = recast,2>>(tTR_rGlobAcc);// (T2R/2,T2R_M,T2R_N) + + // Clear the global accumulator + CUTE_UNROLL + for (int i = 0; i 0; --k_tile_count) { + // The stage is limited to a CTA tile + CUTLASS_PRAGMA_NO_UNROLL + for (int k_block = 0; k_block cute::remove_cvref_t {return {cutlass::plus>{}(f2_x2[0], r2), f2_x2[1]};}); + } + else { + cute::transform(tTR_rGlobAcc_float2_x2, tTR_rAcc_float2, tTR_rGlobAcc_float2_x2, + [&] (auto& f2_x2, auto& i2) -> cute::remove_cvref_t {return {f2_x2[0], cutlass::plus>{}(f2_x2[1], i2)};}); + } + + cutlass::arch::fence_view_async_tmem_load(); // Need a fence bw TMEM_LOAD and arrive + mma2accum_pipeline.consumer_release(mma2accum_pipeline_consumer_state); + + ++mma2accum_pipeline_consumer_state; + skip_wait = ((k_tile_count <= 1) && (k_block >= (StagesPerTile-1))) && (re_im == 1); + mma2accum_flag = mma2accum_pipeline.consumer_try_wait(mma2accum_pipeline_consumer_state, skip_wait); + } + } + } + + // Interleave back (real_x2 | imag_x2) to (real | imag | real | imag) + cute::transform(tTR_rGlobAcc_float2_x2, tTR_rGlobAcc_float2_x2, [&] (auto& f2_x2) -> cute::remove_cvref_t { + Array c0{f2_x2[0][0], f2_x2[1][0]}; + Array c1{f2_x2[0][1], f2_x2[1][1]}; + return {c0, c1}; + }); + + return cute::make_tuple(mma2accum_pipeline_consumer_state, tTR_rGlobAcc); + } + + // + // Methods to perform different parts of TMA/Tensormap modifications + // + + CUTLASS_DEVICE auto + tensormaps_init(Params const& mainloop_params, int32_t const sm_count, int32_t const sm_idx) const { + cute::TmaDescriptor* gmem_tensormap = mainloop_params.tensormaps; + + cute::TmaDescriptor* tma_desc_a = &gmem_tensormap[sm_idx]; + cute::TmaDescriptor* tma_desc_b = &gmem_tensormap[sm_idx + sm_count]; + + if (cute::elect_one_sync()) { + // Bringing tensormaps from params to gmem for modification later + Tensor pA_tensormap = make_tensor(observed_tma_load_a_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor gA_tensormap = make_tensor(tma_desc_a, Int<1>{}, Int<1>{}); + Tensor pB_tensormap = make_tensor(observed_tma_load_b_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor gB_tensormap = make_tensor(tma_desc_b, Int<1>{}, Int<1>{}); + + copy(recast(pA_tensormap), recast(gA_tensormap)); + copy(recast(pB_tensormap), recast(gB_tensormap)); + } + + return cute::make_tuple(tma_desc_a, tma_desc_b); + } + + // Bringing tensormaps to smem (to be done by single thread) + template + CUTLASS_DEVICE + void + tensormaps_fetch_to_smem( + TensorMapStorage& shared_tensormap, + cute::tuple const& input_tensormaps) const { + Tensor gA_tensormap = make_tensor(make_gmem_ptr(get<0>(input_tensormaps)), Int<1>{}, Int<1>{}); + Tensor sA_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_A), Int<1>{}, Int<1>{}); + Tensor gB_tensormap = make_tensor(make_gmem_ptr(get<1>(input_tensormaps)), Int<1>{}, Int<1>{}); + Tensor sB_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_B), Int<1>{}, Int<1>{}); + + copy(recast(gA_tensormap), recast(sA_tensormap)); + copy(recast(gB_tensormap), recast(sB_tensormap)); + + cp_async_fence(); + cp_async_wait<0>(); + } + + // Replace address for the global tensor (to be done by single thread) + CUTLASS_DEVICE + void + tensormaps_replace_global_address( + TensorMapStorage& shared_tensormap, + Params const& mainloop_params, + int32_t next_batch) { + // Replacing global_address for the next batch + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_A, + mainloop_params.ptr_A[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_B, + mainloop_params.ptr_B[next_batch]); + } + + template + CUTLASS_DEVICE + void + tensormaps_perform_update( + TensorMapStorage& shared_tensormap, + Params const& mainloop_params, + cute::tuple const& input_tensormaps, + int32_t next_batch, + uint32_t lane_predicate) { + if (lane_predicate) { + // Bringing tensormaps to smem + tensormaps_fetch_to_smem(shared_tensormap, input_tensormaps); + + // Replacing global_address for the next batch + tensormaps_replace_global_address(shared_tensormap, mainloop_params, next_batch); + } + } + + template + CUTLASS_DEVICE + void + tensormaps_cp_fence_release ( + TensorMapStorage& shared_tensormap, + cute::tuple const& input_tensormaps) { + if (cute::elect_one_sync()) { + // Perform using same thread as the one that issued TMA store, separate these out as far as possible to hide latency + cute::tma_desc_commit_group(); + cute::tma_desc_wait_group(); + } + // Entire warp must do this (i.e. it's aligned) + tma_descriptor_cp_fence_release(get<0>(input_tensormaps), shared_tensormap.smem_tensormap_A); + tma_descriptor_cp_fence_release(get<1>(input_tensormaps), shared_tensormap.smem_tensormap_B); + } + + // The entire warp must call this function collectively (that is, the instructions are aligned) + template + CUTLASS_DEVICE + void + tensormaps_fence_acquire(cute::tuple const& input_tensormaps) { + cute::tma_descriptor_fence_acquire(get<0>(input_tensormaps)); + cute::tma_descriptor_fence_acquire(get<1>(input_tensormaps)); + } + +protected: + + template + CUTLASS_DEVICE + constexpr auto + tile_input_tensors(Params const& params, ProblemShape_MNKL const& problem_shape_MNKL) const { + using X = cute::Underscore; + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + + // Represent the full tensors -- get these from TMA + Tensor mA_mkl = observed_tma_load_a_->get_tma_tensor(make_shape(M,K,L)); + Tensor mB_nkl = observed_tma_load_b_->get_tma_tensor(make_shape(N,K,L)); + + // Tile the tensors and defer the slice + Tensor gA_mkl = local_tile(mA_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); + Tensor gB_nkl = local_tile(mB_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); + + return cute::make_tuple(gA_mkl, gB_nkl); + } + + typename Params::TMA_A const* observed_tma_load_a_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_ = nullptr; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_tf32.hpp b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_tf32.hpp new file mode 100644 index 00000000..9e0a6c5e --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_interleaved_complex_tf32.hpp @@ -0,0 +1,987 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +#pragma once +#include + +#include "cutlass/cutlass.h" +#include "cutlass/detail/cluster.hpp" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/numeric_conversion.h" +#include "cutlass/detail/sm100_tmem_helper.hpp" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/atom/copy_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/arch/mma_sm100.hpp" +#include "cutlass/trace.h" +#include "cutlass/kernel_hardware_info.hpp" +#include "cutlass/cuda_host_adapter.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop for complex kernels +template < + int ComputationPipelineStageCount_, + int SchedulerPipelineStageCount_, + int AccumulatorPipelineStageCount_, + int TransformationPipelineStageCount_, + class AccumulatorCopyAtom_, + class ClusterShape, // Static cluster shape or dynamic (int, int, _1) + class TileShape_, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + class StrideA_, + class StrideB_, + class TiledMma_, + class GmemTiledCopyA_, + class SmemLayoutAtomsA_, + class CopyAtomsA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomsB_, + class CopyAtomsB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100ArrayTmaUmmaWarpSpecializedInterleavedComplexTF32< + ComputationPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + TransformationPipelineStageCount_, + ClusterShape, + AccumulatorCopyAtom_>, + TileShape_, + complex, + StrideA_, + complex, + StrideB_, + TiledMma_, + GmemTiledCopyA_, + SmemLayoutAtomsA_, + CopyAtomsA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomsB_, + CopyAtomsB_, + TransformB_> +{ + // + // Type Aliases + // + using TileShape = TileShape_; + using TiledMma = TiledMma_; + + // ElementA and ElementB are cutlass::complex, which are used as GMEM input and output data type. + using ElementA = complex; + using StrideA = StrideA_; + using InternalStrideA = cute::remove_pointer_t; + using ElementB = complex; + using StrideB = StrideB_; + using InternalStrideB = cute::remove_pointer_t; + +private: + // ElementAMma and ElementBMma are cutlass::complex, which are used as SMEM and RF data type. + // ElementAMmaRaw and ElementBMmaRaw are cutlass::tfloat32_t, which is the real internal data type set in TMA descriptor and used in TCGEN05 calculation. + using ElementAMma = typename TiledMma::ValTypeA; // complex + using ElementAMmaRaw = typename ElementAMma::value_type; // tfloat32_t + using ElementBMma = typename TiledMma::ValTypeB; // complex + using ElementBMmaRaw = typename ElementBMma::value_type; // tfloat32_t + +public: + // For a complex kernel, the MMA output type is real valued, but ElementAccumulator is a complex type for the GETT reference kernel + using ElementAccumulator = cutlass::complex; + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomsA = SmemLayoutAtomsA_; + using SmemLayoutAtomsB = SmemLayoutAtomsB_; + using CopyAtomsA = CopyAtomsA_; + using CopyAtomsB = CopyAtomsB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + + // Determine MMA type: MMA_1SM vs MMA_2SM + using AtomThrShapeMNK = Shape(typename TiledMma_::ThrLayoutVMNK{})), _1, _1>; + using DispatchPolicy = MainloopSm100ArrayTmaUmmaWarpSpecializedInterleavedComplexTF32< + ComputationPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + TransformationPipelineStageCount_, + ClusterShape, + AccumulatorCopyAtom_>; + static constexpr bool IsDynamicCluster = not cute::is_static_v; + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using CtaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using CtaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + using ArchTag = typename DispatchPolicy::ArchTag; + + using Load2TransformPipeline = cutlass::PipelineTmaTransformAsync< + DispatchPolicy::ComputationPipelineStageCount, + AtomThrShapeMNK>; + using Load2TransformPipelineState = typename Load2TransformPipeline::PipelineState; + + using Transform2MmaPipeline = cutlass::PipelineUmmaConsumerAsync< + DispatchPolicy::TransformationPipelineStageCount, + AtomThrShapeMNK>; + using Transform2MmaPipelineState = typename Transform2MmaPipeline::PipelineState; + + using Mma2AccumPipeline = cutlass::PipelineUmmaAsync< + DispatchPolicy::Schedule::AccumulatorPipelineStageCount, + AtomThrShapeMNK>; + using Mma2AccumPipelineState = typename Mma2AccumPipeline::PipelineState; + + // Thread Counts + static constexpr uint32_t NumTransformationThreads = 128; + static constexpr uint32_t NumAccumThreads = 128; + + // Get the Algorithm parameters + constexpr static int NumComputeMtxs = 2; + constexpr static int AccumulatorPipelineStageCount = DispatchPolicy::Schedule::AccumulatorPipelineStageCount; + constexpr static int StagesPerTile = size<2>(CtaShapeA_MK{}); + + // Copy atom for Accumulator + using AccumulatorCopyAtom = typename DispatchPolicy::AccumulatorCopyAtom; + + using SmemLayoutAtomA = typename SmemLayoutAtomsA::InputLayoutAtom; + using SmemLayoutAtomACompute = typename SmemLayoutAtomsA::ComputeLayoutAtom; + using SmemLayoutAtomB = typename SmemLayoutAtomsB::InputLayoutAtom; + using SmemLayoutAtomBCompute = typename SmemLayoutAtomsB::ComputeLayoutAtom; + + using InputCopyAtomA = typename CopyAtomsA::InputCopyAtom; + using ComputeCopyAtomA = typename CopyAtomsA::ComputeCopyAtom; + using InputCopyAtomB = typename CopyAtomsB::InputCopyAtom; + using ComputeCopyAtomB = typename CopyAtomsB::ComputeCopyAtom; + + static_assert(((size<0,0>(CtaShapeA_MK{}) * size<1>(CtaShapeA_MK{})) % size<0>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeA_MK{}) * size<2>(CtaShapeA_MK{})) % size<1>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + + static_assert(((size<0,0>(CtaShapeB_NK{}) * size<1>(CtaShapeB_NK{})) % size<0>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeB_NK{}) * size<2>(CtaShapeB_NK{})) % size<1>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(CtaShapeA_MK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutACompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomACompute{}, + append(append(CtaShapeA_MK{}, Int{}), Int{}))); + + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(CtaShapeB_NK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutBCompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomBCompute{}, + append(CtaShapeB_NK{}, Int{}))); + + static_assert(DispatchPolicy::ComputationPipelineStageCount >= 2, "Specialization requires Stages set to value 2 or more."); + static_assert(DispatchPolicy::TransformationPipelineStageCount >= 2, "Specialization requires Stages set to value 2 or more."); + static_assert(cute::is_base_of::value && + cute::is_base_of::value, + "MMA atom must have A operand from TMEM and B operand from SMEM for this mainloop."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyA - invalid TMA copy atom specified."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyB - invalid TMA copy atom specified."); + + struct PipelineStorage { + using Load2TransformPipelineStorage = typename Load2TransformPipeline::SharedStorage; + alignas(16) Load2TransformPipelineStorage load2transform_pipeline; + using Transform2MmaPipelineStorage = typename Transform2MmaPipeline::SharedStorage; + alignas(16) Transform2MmaPipelineStorage transform2mma_pipeline; + using Mma2AccumPipelineStorage = typename Mma2AccumPipeline::SharedStorage; + alignas(16) Mma2AccumPipelineStorage mma2accum_pipeline; + }; + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + struct TensorStorageUntransformed { + cute::ArrayEngine> smem_A; + cute::ArrayEngine> smem_B; + } input; + + union TensorStorageTransformed { + alignas(1024) cute::ArrayEngine smem_ACompute; // smem_ACompute is actually in tmem + alignas(1024) cute::ArrayEngine> smem_BCompute; + } compute; + } tensors; + + struct TensorMapStorage : cute::aligned_struct<128, _0> { + cute::TmaDescriptor smem_tensormap_A; + cute::TmaDescriptor smem_tensormap_B; + } tensormaps; + + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + using TensorMapStorage = typename SharedStorage::TensorMapStorage; + + // Different from other GEMM kernels, both CTAs should be aware of loads. Both CTAs will work on + // loaded input A and B matrices to convert the data type + static constexpr uint32_t TmaTransactionBytes = + (size<0>(SmemLayoutA{}) * size<1>(SmemLayoutA{}) * size<2>(SmemLayoutA{}) * static_cast(sizeof(ElementAMma))) + + (size<0>(SmemLayoutB{}) * size<1>(SmemLayoutB{}) * size<2>(SmemLayoutB{}) * static_cast(sizeof(ElementBMma))); + + // Host side kernel arguments + struct Arguments { + ElementA const** ptr_A{nullptr}; + StrideA dA{}; + ElementB const** ptr_B{nullptr}; + StrideB dB{}; + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), + make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + TMA_A tma_load_a; + TMA_B tma_load_b; + TMA_A tma_load_a_fallback; + TMA_B tma_load_b_fallback; + dim3 cluster_shape_fallback; + cute::TmaDescriptor* tensormaps; + ElementA const** ptr_A; + ElementB const** ptr_B; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_ = is_fallback_cluster ? ¶ms.tma_load_a_fallback : ¶ms.tma_load_a; + observed_tma_load_b_ = is_fallback_cluster ? ¶ms.tma_load_b_fallback : ¶ms.tma_load_b; + } + else { + observed_tma_load_a_ = ¶ms.tma_load_a; + observed_tma_load_b_ = ¶ms.tma_load_b; + } + } + + template + static constexpr Params + to_underlying_arguments(ProblemShape problem_shape, Arguments const& args, void* workspace, cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + (void) workspace; + + // Tensor shapes for Ptr-Array are initialized correctly here. + auto [M,N,K,mock_L] = problem_shape.get_host_problem_shape(0); + // Batches/Groups are managed by using appropriate pointers to input matrices + mock_L = 1; + + // Tensor pointers will be fixed before the first access + ElementA const* ptr_A_first_batch = nullptr; + ElementB const* ptr_B_first_batch = nullptr; + + Tensor tensor_a = make_tensor(ptr_A_first_batch, make_layout(make_shape(M,K,mock_L), args.dA)); + Tensor tensor_b = make_tensor(ptr_B_first_batch, make_layout(make_shape(N,K,mock_L), args.dB)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape_fallback); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a, + tma_load_b, + tma_load_a_fallback, + tma_load_b_fallback, + hw_info.cluster_shape_fallback, + reinterpret_cast(workspace), + reinterpret_cast(args.ptr_A), + reinterpret_cast(args.ptr_B) + }; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args, int sm_count) { + constexpr uint32_t NumInputTensors = 2; + constexpr size_t SizeOfCuTensorMap = sizeof(cute::TmaDescriptor); + // Allocate gmem space for input tensormaps per each SM, A tensormap copies followed by B tensormap copies + return (NumInputTensors * SizeOfCuTensorMap * sm_count); + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + ProblemShape problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits = 128; + auto [M,N,K,L] = problem_shape.get_host_problem_shape(0); + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE auto + partition_accumulator_shape() { + return append( + partition_shape_C(TiledMma{}, take<0,2>(TileShape{})), + Int<2>{}); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,TMEM_PIPE,2) + } + + /// Produce the inputs to the transform threads by loading inputs from gmem -> smem + template < + class GTensorA, class GTensorB, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB, + class TensorMapA, class TensorMapB, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE cute::tuple + load( + Params const& params, + Load2TransformPipeline pipeline, + Load2TransformPipelineState load2xform_pipeline_state, + cute::tuple> const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count) { + + auto [unused_gA, unused_gB, + tAgA_mkl, tBgB_nkl, tAsA, tBsB, + mcast_mask_a, mcast_mask_b, + input_tensormaps] = load_inputs; + + // slice out the work coord from tiled tensors + Tensor tAgA = tAgA_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tBgB = tBgB_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + uint32_t skip_wait = (k_tile_count <= 0); + auto pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + // LOCK mainloop_load2xform_pipeline_state for _writing_ + pipeline.producer_acquire(load2xform_pipeline_state, pipeline_flag); + int write_stage = load2xform_pipeline_state.index(); + + using BarrierType = typename Load2TransformPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(load2xform_pipeline_state); + + // Advance mainloop_pipe + ++load2xform_pipeline_state; + skip_wait = (k_tile_count <= 1); + pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + copy(observed_tma_load_a_->with(get<0>(input_tensormaps), *tma_barrier, mcast_mask_a), tAgA(_,*k_tile_iter), tAsA(_,write_stage)); + copy(observed_tma_load_b_->with(get<1>(input_tensormaps), *tma_barrier, mcast_mask_b), tBgB(_,*k_tile_iter), tBsB(_,write_stage)); + ++k_tile_iter; + } + return cute::make_tuple(load2xform_pipeline_state, k_tile_iter); + } + + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_mkl - The tiled tensor for input A + /// gB_nkl - The tiled tensor for input B + // Other inputs needed for load(): partitioned AB tensors for gmem and smem, and mcast masks + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + Params const& params, + TensorStorage& shared_tensors, + int32_t const sm_count, int32_t const sm_idx) const { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_mkl = cta_mma.partition_A(gA_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgB_nkl = cta_mma.partition_B(gB_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA = make_tensor(make_smem_ptr(shared_tensors.input.smem_A.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sB = make_tensor(make_smem_ptr(shared_tensors.input.smem_B.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_mkl, tAsA] = tma_partition(*observed_tma_load_a_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA), group_modes<0,3>(tCgA_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_nkl, tBsB] = tma_partition(*observed_tma_load_b_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB), group_modes<0,3>(tCgB_nkl)); + + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + // Fetch a copy of tensormaps for the CTA from Params + auto input_tensormaps = tensormaps_init(params, sm_count, sm_idx); + + return cute::make_tuple( + gA_mkl, gB_nkl, // for scheduler + tAgA_mkl, tBgB_nkl, tAsA, tBsB, // for input tensor values + mcast_mask_a, mcast_mask_b, // multicast masks + input_tensormaps); // for tma descriptor modification (per-CTA tensormap copy) + } + + template< + class KTileIterator, class Accumulator, + class GTensorA, class SrcCopyA, class DstCopyA, class SrcTensorA, class DstTensorA, + class GTensorB, class SrcCopyB, class DstCopyB, class SrcTensorB, class DstTensorB + > + CUTLASS_DEVICE auto + transform( + Load2TransformPipeline load2transform_pipeline, + Load2TransformPipelineState load2transform_pipeline_consumer_state, + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_producer_state, + Accumulator accumulators, + cute::tuple input_operands, + KTileIterator k_tile_iter, int k_tile_count) { + cutlass::arch::NamedBarrier transform_barrier(NumTransformationThreads, cutlass::arch::ReservedNamedBarriers::TransformBarrier); + + // tAsA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tAtACompute : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, NumComputeMtxs, SmemStages (In TMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tBsBCompute : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + auto [unused_tAgA, src_copy_A, dst_copy_A, tAsA, tAtACompute, + unused_tBgB, src_copy_B, dst_copy_B, tBsB, tBsBCompute] = input_operands; + + // Create the tensors in registers + auto tArA = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_conj = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_swap = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tBrB = make_tensor(tBsB(_,_,_,_,0).shape()); + + uint32_t skip_wait = (k_tile_count <= 0); + auto load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + auto transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + load2transform_pipeline.consumer_wait(load2transform_pipeline_consumer_state, load2transform_flag); + transform2mma_pipeline.producer_acquire(transform2mma_pipeline_producer_state, transform2mma_flag); + + int load2transform_consumer_index = load2transform_pipeline_consumer_state.index(); + int transform2mma_producer_index = transform2mma_pipeline_producer_state.index(); + + auto curr_load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state; + auto curr_transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state; + + // Copy the input A matrix from SMEM + copy(src_copy_A, tAsA(_,_,_,_,load2transform_consumer_index), tArA); + // Copy the input B matrix from SMEM + copy(src_copy_B, tBsB(_,_,_,_,load2transform_consumer_index), tBrB); + + // First MMA, A.real * B.real - A.imag * B.imag + // Compose [real, -imag] copy for A TMEM + // Reflect the conjugation of B through A + if constexpr (cute::is_same_v) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_conj(i) = {tArA(i).real(), -tArA(i).imag()}; + } + } + else { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_conj(i) = tArA(i); + } + } + // Write to TMEM + copy(dst_copy_A, tArA_conj, tAtACompute(_,_,_,_,0,transform2mma_producer_index)); + + // Second MMA, A.imag * B.real + A.real * B.imag + // Compose [imag, real] copy for A TMEM + // Reflect the conjugation of B through A + auto transform_element = [] (ElementAMma const& tArA_i) -> ElementAMma { + if constexpr (cute::is_same_v && cute::is_same_v) { // CC + return {-tArA_i.imag(), -tArA_i.real()}; + } + else if constexpr (cute::is_same_v && not cute::is_same_v) { // CN/CT + return {-tArA_i.imag(), tArA_i.real()}; + } + else if constexpr (not cute::is_same_v && cute::is_same_v) { // NC/TC + return {tArA_i.imag(), -tArA_i.real()}; + } + else { // TN/NT/NN/TT + return {tArA_i.imag(), tArA_i.real()}; + } + }; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_swap(i) = transform_element(tArA(i)); + } + + // Write to TMEM + copy(dst_copy_A, tArA_swap, tAtACompute(_,_,_,_,1,transform2mma_producer_index)); + + // Write the B matrix to SMEM without any changes + copy(dst_copy_B, tBrB, tBsBCompute(_,_,_,_,transform2mma_producer_index)); + + // Loads from SMEM are done. Signal the mainloop load as early as possible + transform_barrier.sync(); + load2transform_pipeline.consumer_release(curr_load2transform_pipeline_consumer_state); + + // fence for SMEM writes + cutlass::arch::fence_view_async_shared(); + if constexpr (is_tmem::value) { + // fence for TMEM writes if A operand is coming from TMEM + cutlass::arch::fence_view_async_tmem_store(); + } + + // Let the MMA know we are done transforming + transform2mma_pipeline.producer_commit(curr_transform2mma_pipeline_producer_state); + // Next pipeline stage + ++load2transform_pipeline_consumer_state; + ++transform2mma_pipeline_producer_state; + + skip_wait = (k_tile_count <= 1); + // Peek the next pipeline stage's barriers + load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + } + return cute::make_tuple(load2transform_pipeline_consumer_state, transform2mma_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + transform_init( + Params const& params, + ProblemShape_MNKL const& problem_shape_MNKL, + Accumulator accumulators, + TensorStorage& shared_storage) { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + Tensor sA_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); + Tensor sA = as_position_independent_swizzle_tensor(sA_orig); + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + + Tensor sB_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); + Tensor sB = as_position_independent_swizzle_tensor(sB_orig); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + + // Map input, compute, and fragment tensors to + // Copy strategies and partitioned tensors. These will become the input + // operands of the transform function. Depending on MMA atom type, the + // operands can reside in SMEM or TMEM + auto setup_copy_ops = [&] (auto tensor_input, auto input_copy_atom, + auto tensor_compute, auto make_fragment, auto compute_copy_atom) constexpr { + auto fragment_compute = make_fragment(tensor_compute); + if constexpr (cute::is_tmem>::value) { + // For M=128 with 2CTA MMA atoms, the TMEM tensor for A has a duplicated allocation. + // Instead of allocation a 64x16 TMEM tensor, we have a 128x16 allocation + // See: TmemAllocMode::Duplicated. + Tensor tensor_input2x = [&] () constexpr { + if constexpr (decltype(size<0,0>(fragment_compute) == Int<128>{} && size<0,0>(tensor_input) == Int<64>{})::value) { + return make_tensor(tensor_input.data(), + logical_product(tensor_input.layout(), + make_tile(make_tile(Layout<_2,_0>{},_),_,_,_))); // ((128,16),m,k,PIPE) + } + else { + return tensor_input; + } + }(); + + fragment_compute.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + // If operand comes from TMEM, create the TMEM_STORE based copy + auto reg2tmem_tiled_copy = make_tmem_copy(compute_copy_atom, fragment_compute(_,_,_,0,0)); + auto thr_reg2tmem_tiled_copy = reg2tmem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2tmem_tiled_copy.partition_S(tensor_input2x); + auto partitioned_tensor_compute = thr_reg2tmem_tiled_copy.partition_D(fragment_compute); + // Source copy is based on the source operand of TMEM_STORE copy. + auto smem2reg_tiled_copy = make_tiled_copy_S(Copy_Atom, ElementAMma>{}, reg2tmem_tiled_copy); + return cute::make_tuple(smem2reg_tiled_copy, reg2tmem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + else { + // If the operand comes from SMEM, create SMEM copy. + auto tensor_compute_ind_sw = as_position_independent_swizzle_tensor(tensor_compute); + auto reg2smem_tiled_copy = make_cotiled_copy(compute_copy_atom, Layout, Stride< _8,_1>>{}, + tensor_compute(_,_,_,0).layout()); + + // Source copy is based on the source operand of copy. + auto smem2reg_tiled_copy = make_tiled_copy_S(input_copy_atom, reg2smem_tiled_copy); + auto thr_smem2reg_tiled_copy = smem2reg_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto thr_reg2smem_tiled_copy = reg2smem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2smem_tiled_copy.partition_S(tensor_input); + auto partitioned_tensor_compute = thr_reg2smem_tiled_copy.partition_D(tensor_compute_ind_sw); + + return cute::make_tuple(smem2reg_tiled_copy, reg2smem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + }; + + auto [src_copy_A, dst_copy_A, tAsA, tAtACompute] = + setup_copy_ops(sA, InputCopyAtomA{}, sACompute, [&](auto &arg) {return TiledMma::make_fragment_A(arg);}, ComputeCopyAtomA{}); + + auto [src_copy_B, dst_copy_B, tBsB, tBsBCompute] = + setup_copy_ops(sB, InputCopyAtomB{}, sBCompute, [&](auto &arg) {return TiledMma::make_fragment_B(arg);}, ComputeCopyAtomB{}); + + return cute::make_tuple(gA_mkl, src_copy_A, dst_copy_A, tAsA, tAtACompute, + gB_nkl, src_copy_B, dst_copy_B, tBsB, tBsBCompute); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class FrgEngine, class FrgLayout, + class TensorA, class TensorB + > + CUTLASS_DEVICE auto + mma( + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_consumer_state, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_producer_state, + cute::Tensor const& accumulators, + cute::tuple const& input_operands, + int k_tile_count + ) { + TiledMma tiled_mma; + + // tCrA : (MMA), MMA_M, MMA_K, NumComputeMtxs, SmemStage (In TMEM) + // We use SMEM stages to match #buffers in Load <-> Convert + // tCrB : (MMA), MMA_N, MMA_K, SmemStages (In SMEM) + auto const [tCrA, tCrB] = input_operands; + + auto curr_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + auto next_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + uint32_t skip_wait = (k_tile_count <= 0); + auto transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + ++next_transform2mma_pipeline_consumer_state; + + mma2accum_pipeline.producer_acquire(mma2accum_pipeline_producer_state); + + constexpr int RealAccumIndex = 0; + constexpr int ImagAccumIndex = 1; + + int mma2accum_pipeline_producer_state_index = mma2accum_pipeline_producer_state.index(); + auto tCtC_real = accumulators(_,_,_,RealAccumIndex,mma2accum_pipeline_producer_state_index); + auto tCtC_imag = accumulators(_,_,_,ImagAccumIndex,mma2accum_pipeline_producer_state_index); + auto curr_mma2accum_pipeline_producer_state = mma2accum_pipeline_producer_state; + ++mma2accum_pipeline_producer_state; + + // + // PIPELINED MAIN LOOP + // + + tiled_mma.accumulate_ = UMMA::ScaleOut::Zero; + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + transform2mma_pipeline.consumer_wait(curr_transform2mma_pipeline_consumer_state, transform2mma_flag); + + int transform2mma_pipeline_consumer_state_index = curr_transform2mma_pipeline_consumer_state.index(); + + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < StagesPerTile; ++k_block) { + + auto tCrA_conj = tCrA(_,_,_,Int<0>{},transform2mma_pipeline_consumer_state_index); + auto tCrA_swap = tCrA(_,_,_,Int<1>{},transform2mma_pipeline_consumer_state_index); + + auto tCrB0 = tCrB(_,_,_,transform2mma_pipeline_consumer_state_index); + + // A conjugate * B + cute::gemm(tiled_mma, tCrA_conj(_,_,k_block), tCrB0(_,_,k_block), tCtC_real); // A[0]*B[0] + // A swapped * B + cute::gemm(tiled_mma, tCrA_swap(_,_,k_block), tCrB0(_,_,k_block), tCtC_imag); // A[0]*B[0] + tiled_mma.accumulate_ = UMMA::ScaleOut::One; + } + + transform2mma_pipeline.consumer_release(curr_transform2mma_pipeline_consumer_state); + + skip_wait = (k_tile_count <= 1); + transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + + curr_transform2mma_pipeline_consumer_state = next_transform2mma_pipeline_consumer_state; + ++next_transform2mma_pipeline_consumer_state; + } + + mma2accum_pipeline.producer_commit(curr_mma2accum_pipeline_producer_state); + + return cute::make_tuple(curr_transform2mma_pipeline_consumer_state, mma2accum_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + mma_init(cute::Tensor const& accumulators, TensorStorage& shared_storage) const { + TiledMma tiled_mma; + + Tensor tCrA = [&] () constexpr { + if constexpr (cute::is_base_of::value) { + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + return tiled_mma.make_fragment_A(sACompute); + } + else { + auto tCrA = tiled_mma.make_fragment_A(shape(SmemLayoutACompute{})); + tCrA.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + return tCrA; + } + } (); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + Tensor tCrB = tiled_mma.make_fragment_B(sBCompute); + return cute::make_tuple(tCrA, tCrB); + } + + template + CUTLASS_DEVICE auto + accum_init(cute::Tensor const& accumulators, TmemCopyAtom, EpilogueTile) { + return accumulators; + } + + // + // Methods to perform different parts of TMA/Tensormap modifications + // + + CUTLASS_DEVICE auto + tensormaps_init(Params const& mainloop_params, int32_t const sm_count, int32_t const sm_idx) const { + cute::TmaDescriptor* gmem_tensormap = mainloop_params.tensormaps; + + cute::TmaDescriptor* tma_desc_a = &gmem_tensormap[sm_idx]; + cute::TmaDescriptor* tma_desc_b = &gmem_tensormap[sm_idx + sm_count]; + + if (cute::elect_one_sync()) { + // Bringing tensormaps from params to gmem for modification later + Tensor pA_tensormap = make_tensor(observed_tma_load_a_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor gA_tensormap = make_tensor(tma_desc_a, Int<1>{}, Int<1>{}); + Tensor pB_tensormap = make_tensor(observed_tma_load_b_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor gB_tensormap = make_tensor(tma_desc_b, Int<1>{}, Int<1>{}); + + copy(recast(pA_tensormap), recast(gA_tensormap)); + copy(recast(pB_tensormap), recast(gB_tensormap)); + } + + return cute::make_tuple(tma_desc_a, tma_desc_b); + } + + // Bringing tensormaps to smem (to be done by single thread) + template + CUTLASS_DEVICE + void + tensormaps_fetch_to_smem( + TensorMapStorage& shared_tensormap, + cute::tuple const& input_tensormaps) const { + Tensor gA_tensormap = make_tensor(make_gmem_ptr(get<0>(input_tensormaps)), Int<1>{}, Int<1>{}); + Tensor sA_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_A), Int<1>{}, Int<1>{}); + Tensor gB_tensormap = make_tensor(make_gmem_ptr(get<1>(input_tensormaps)), Int<1>{}, Int<1>{}); + Tensor sB_tensormap = make_tensor(make_smem_ptr(&shared_tensormap.smem_tensormap_B), Int<1>{}, Int<1>{}); + + copy(recast(gA_tensormap), recast(sA_tensormap)); + copy(recast(gB_tensormap), recast(sB_tensormap)); + + cp_async_fence(); + cp_async_wait<0>(); + } + + // Replace address for the global tensor (to be done by single thread) + CUTLASS_DEVICE + void + tensormaps_replace_global_address( + TensorMapStorage& shared_tensormap, + Params const& mainloop_params, + int32_t next_batch) { + // Replacing global_address for the next batch + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_A, + mainloop_params.ptr_A[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_B, + mainloop_params.ptr_B[next_batch]); + } + + template + CUTLASS_DEVICE + void + tensormaps_perform_update( + TensorMapStorage& shared_tensormap, + Params const& mainloop_params, + cute::tuple const& input_tensormaps, + int32_t next_batch, + uint32_t lane_predicate) { + if (lane_predicate) { + // Bringing tensormaps to smem + tensormaps_fetch_to_smem(shared_tensormap, input_tensormaps); + + // Replacing global_address for the next batch + tensormaps_replace_global_address(shared_tensormap, mainloop_params, next_batch); + } + } + + template + CUTLASS_DEVICE + void + tensormaps_cp_fence_release ( + TensorMapStorage& shared_tensormap, + cute::tuple const& input_tensormaps) { + if (cute::elect_one_sync()) { + // Perform using same thread as the one that issued TMA store, separate these out as far as possible to hide latency + cute::tma_desc_commit_group(); + cute::tma_desc_wait_group(); + } + // Entire warp must do this (i.e. it's aligned) + tma_descriptor_cp_fence_release(get<0>(input_tensormaps), shared_tensormap.smem_tensormap_A); + tma_descriptor_cp_fence_release(get<1>(input_tensormaps), shared_tensormap.smem_tensormap_B); + } + + // The entire warp must call this function collectively (that is, the instructions are aligned) + template + CUTLASS_DEVICE + void + tensormaps_fence_acquire(cute::tuple const& input_tensormaps) { + cute::tma_descriptor_fence_acquire(get<0>(input_tensormaps)); + cute::tma_descriptor_fence_acquire(get<1>(input_tensormaps)); + } + +protected: + + template + CUTLASS_DEVICE + constexpr auto + tile_input_tensors(Params const& params, ProblemShape_MNKL const& problem_shape_MNKL) const { + using X = cute::Underscore; + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + // Problem Shape and therefore strides that we construct are [M,N,K,L], but since here for the TMA loads + // we are managing TMA descriptors to change batches, we need to neglect the L mode + const int32_t mock_L = 1; + + // Represent the full tensors -- get these from TMA + Tensor mA_mkl = observed_tma_load_a_->get_tma_tensor(make_shape(M,K,mock_L)); + Tensor mB_nkl = observed_tma_load_b_->get_tma_tensor(make_shape(N,K,mock_L)); + + // Tile the tensors and defer the slice + Tensor gA_mkl = local_tile(mA_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M, BLK_K, m, k, l) + Tensor gB_nkl = local_tile(mB_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + + return cute::make_tuple(gA_mkl, gB_nkl); + } + + typename Params::TMA_A const* observed_tma_load_a_{nullptr}; + typename Params::TMA_B const* observed_tma_load_b_{nullptr}; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_planar_complex.hpp b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_planar_complex.hpp new file mode 100644 index 00000000..44bdc8cf --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_array_warpspecialized_planar_complex.hpp @@ -0,0 +1,963 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/detail/collective.hpp" +#include "cutlass/detail/cluster.hpp" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/gemm/gemm.h" +#include "cutlass/trace.h" +#include "cutlass/kernel_hardware_info.hpp" +#include "cutlass/cuda_host_adapter.hpp" +#include "cutlass/detail/sm100_tmem_helper.hpp" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/numeric/arithmetic_tuple.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop +// Both DMA Load and MMA methods of this class must be run by a single thread that's picked by elect_one +template < + int Stages, + int SchedulerPipelineStageCount, + int AccumulatorPipelineStageCount, + class ClusterShape, + class TileShape_, // Static cluster shape or dynamic (int, int, _1) + class ElementA_, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + class StrideA_, + class ElementB_, + class StrideB_, + class TiledMmaPair_, + class GmemTiledCopyA_, + class SmemLayoutAtomA_, + class SmemCopyAtomA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomB_, + class SmemCopyAtomB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100ArrayTmaUmmaWarpSpecializedPlanarComplex< + Stages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + ClusterShape>, + TileShape_, + ElementA_, + StrideA_, + ElementB_, + StrideB_, + TiledMmaPair_, + GmemTiledCopyA_, + SmemLayoutAtomA_, + SmemCopyAtomA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomB_, + SmemCopyAtomB_, + TransformB_> +{ + // + // Type Aliases + // + + // Determine MMA type: MMA_1SM vs MMA_2SM + using TiledMmaPair = TiledMmaPair_; + using TiledMma = typename TiledMmaPair::TiledMmaAPosAtom; + using TiledMmaANeg = typename TiledMmaPair::TiledMmaANegAtom; + using AtomThrShapeMNK = Shape(typename TiledMma::ThrLayoutVMNK{})), _1, _1>; + + static constexpr bool IsDynamicCluster = not cute::is_static_v; + + using DispatchPolicy = MainloopSm100ArrayTmaUmmaWarpSpecializedPlanarComplex< + Stages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + ClusterShape>; + using TileShape = TileShape_; + + CUTE_STATIC_ASSERT_V(evenly_divides(TileShape{}, tile_shape(TiledMma{})), + "Static cluster shape used: TileShape should be evenly divided by TiledMma"); + + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using MmaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using MmaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + // Multiple buffer the TMA descriptors for each SM so that we can update them asynchronously. + // This should be larger than the total number of TMA requests inflight (from update to issued to returned). + // This can be calculated by SchedulerStages + max(TmaStages) + 2 (for consumer and producer in-flight accessies). + constexpr static uint32_t NumTmaDescriptorsPerSm = SchedulerPipelineStageCount + Stages + 2; + + using ElementA = ElementA_; + using ElementAMma = typename TiledMma::ValTypeA; + using StrideA = StrideA_; + using InternalStrideA = cute::remove_pointer_t; + using ElementB = ElementB_; + using ElementBMma = typename TiledMma::ValTypeB; + using StrideB = StrideB_; + using InternalStrideB = cute::remove_pointer_t; + using ElementAccumulator = typename TiledMma::ValTypeC; + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomA = SmemLayoutAtomA_; + using SmemLayoutAtomB = SmemLayoutAtomB_; + using SmemCopyAtomA = SmemCopyAtomA_; + using SmemCopyAtomB = SmemCopyAtomB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + using ArchTag = typename DispatchPolicy::ArchTag; + + using MainloopPipeline = cutlass::PipelineTmaUmmaAsync< + DispatchPolicy::Stages, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineState = typename MainloopPipeline::PipelineState; + + static_assert(rank(SmemLayoutAtomA{}) == 2, "SmemLayoutAtomA must be rank 2 (M, K)"); + static_assert(((size<0,0>(MmaShapeA_MK{}) * size<1>(MmaShapeA_MK{})) % size<0>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(MmaShapeA_MK{}) * size<2>(MmaShapeA_MK{})) % size<1>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(cute::is_void_v, + "SM100 UMMA cannot have a non-void copy atom for smem sourced instructions."); + + static_assert(rank(SmemLayoutAtomB{}) == 2, "SmemLayoutAtomB must be rank 2 (N, K)"); + static_assert(((size<0,0>(MmaShapeB_NK{}) * size<1>(MmaShapeB_NK{})) % size<0>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(MmaShapeB_NK{}) * size<2>(MmaShapeB_NK{})) % size<1>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(cute::is_void_v, + "SM100 UMMA cannot have a non-void copy atom for smem sourced instructions."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(MmaShapeA_MK{}, Int{}), + cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{})); + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(MmaShapeB_NK{}, Int{}), + cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{})); + + static_assert(DispatchPolicy::Stages >= 2, "Specialization requires Stages set to value 1 or more."); + static_assert(cute::is_base_of::value && + cute::is_base_of::value, + "MMA atom must source both A and B operand from smem_desc for this mainloop."); + static_assert( + (size(AtomThrShapeMNK{}) == 1 && + (cute::is_same_v || cute::is_same_v)) || + (size(AtomThrShapeMNK{}) == 2 && + (cute::is_same_v || cute::is_same_v)), + "GmemTiledCopy - invalid TMA copy atom specified."); + static_assert( + (size(AtomThrShapeMNK{}) == 1 && + (cute::is_same_v || cute::is_same_v)) || + (size(AtomThrShapeMNK{}) == 2 && + (cute::is_same_v || cute::is_same_v)), + "GmemTiledCopy - invalid TMA copy atom specified."); + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + cute::ArrayEngine> smem_A_real; + cute::ArrayEngine> smem_A_imag; + cute::ArrayEngine> smem_B_real; + cute::ArrayEngine> smem_B_imag; + } tensors; + + struct TensorMapStorage : cute::aligned_struct<128, _0> { + cute::TmaDescriptor smem_tensormap_A_real; + cute::TmaDescriptor smem_tensormap_A_imag; + cute::TmaDescriptor smem_tensormap_B_real; + cute::TmaDescriptor smem_tensormap_B_imag; + } tensormaps; + + using PipelineStorage = typename MainloopPipeline::SharedStorage; + PipelineStorage pipeline; + }; + + // Expose shared storage for tensors/pipelines separately to allow kernel layer to reorder them. + using TensorStorage = typename SharedStorage::TensorStorage; + using TensorMapStorage = typename SharedStorage::TensorMapStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Only one thread issues the TMA and updates the barriers in a 2SM MMA, adjust bytes accordingly + static constexpr uint32_t TmaTransactionBytes = 2 * ( + cutlass::bits_to_bytes(size(AtomThrShapeMNK{}) * (cosize(take<0,3>(SmemLayoutA{})) * static_cast(cute::sizeof_bits::value))) + + cutlass::bits_to_bytes(size(AtomThrShapeMNK{}) * (cosize(take<0,3>(SmemLayoutB{})) * static_cast(cute::sizeof_bits::value)))); + + template + struct TmemStorage { + AccTensor accumulators; + }; + + // Host side kernel arguments + struct Arguments { + ElementA const** ptr_A_real{nullptr}; + StrideA dA_real{}; + ElementA const** ptr_A_imag{nullptr}; + StrideA dA_imag{}; + ElementB const** ptr_B_real{nullptr}; + StrideB dB_real{}; + ElementB const** ptr_B_imag{nullptr}; + StrideB dB_imag{}; + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + + TMA_A tma_load_a_real; + TMA_A tma_load_a_imag; + TMA_B tma_load_b_real; + TMA_B tma_load_b_imag; + TMA_A tma_load_a_real_fallback; + TMA_A tma_load_a_imag_fallback; + TMA_B tma_load_b_real_fallback; + TMA_B tma_load_b_imag_fallback; + dim3 cluster_shape_fallback; + cute::TmaDescriptor* tensormaps; + ElementA const** ptr_A_real; + ElementA const** ptr_A_imag; + ElementB const** ptr_B_real; + ElementB const** ptr_B_imag; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_real_ = is_fallback_cluster ? ¶ms.tma_load_a_real_fallback : ¶ms.tma_load_a_real; + observed_tma_load_a_imag_ = is_fallback_cluster ? ¶ms.tma_load_a_imag_fallback : ¶ms.tma_load_a_imag; + observed_tma_load_b_real_ = is_fallback_cluster ? ¶ms.tma_load_b_real_fallback : ¶ms.tma_load_b_real; + observed_tma_load_b_imag_ = is_fallback_cluster ? ¶ms.tma_load_b_imag_fallback : ¶ms.tma_load_b_imag; + } + else { + observed_tma_load_a_real_ = ¶ms.tma_load_a_real; + observed_tma_load_a_imag_ = ¶ms.tma_load_a_imag; + observed_tma_load_b_real_ = ¶ms.tma_load_b_real; + observed_tma_load_b_imag_ = ¶ms.tma_load_b_imag; + } + } + + template + static constexpr Params + to_underlying_arguments( + ProblemShape const& problem_shape, + Arguments const& args, + void* workspace, + cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + // Tensor shapes for Ptr-Array are initialized correctly here. + auto [M,N,K,mock_L] = problem_shape.get_host_problem_shape(0); + + // Batches/Groups are managed by using appropriate pointers to input matrices + mock_L = 1; + + // Tensor pointers will be fixed before the first access + ElementA const* ptr_A_real_first_batch = nullptr; + ElementA const* ptr_A_imag_first_batch = nullptr; + + ElementB const* ptr_B_real_first_batch = nullptr; + ElementB const* ptr_B_imag_first_batch = nullptr; + + Tensor tensor_a_real = make_tensor(ptr_A_real_first_batch, make_layout(make_shape(M,K,mock_L), args.dA_real)); + Tensor tensor_a_imag = make_tensor(ptr_A_imag_first_batch, make_layout(make_shape(M,K,mock_L), args.dA_imag)); + + Tensor tensor_b_real = make_tensor(ptr_B_real_first_batch, make_layout(make_shape(N,K,mock_L), args.dB_real)); + Tensor tensor_b_imag = make_tensor(ptr_B_imag_first_batch, make_layout(make_shape(N,K,mock_L), args.dB_imag)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = conditional_return(make_shape(hw_info.cluster_shape_fallback.x, hw_info.cluster_shape_fallback.y, Int<1>{}), ClusterShape{}); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a_real = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_real, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_imag = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_imag, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b_real = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_real, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b_imag = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_imag, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_real_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_real, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_A tma_load_a_imag_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_imag, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_real_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_real, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_imag_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_imag, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a_real, + tma_load_a_imag, + tma_load_b_real, + tma_load_b_imag, + tma_load_a_real_fallback, + tma_load_a_imag_fallback, + tma_load_b_real_fallback, + tma_load_b_imag_fallback, + hw_info.cluster_shape_fallback, + reinterpret_cast(workspace), + reinterpret_cast(args.ptr_A_real), + reinterpret_cast(args.ptr_A_imag), + reinterpret_cast(args.ptr_B_real), + reinterpret_cast(args.ptr_B_imag) + }; + } + + template + static size_t + get_workspace_size(ProblemShape const& problem_shape, Arguments const& args, int sm_count) { + constexpr uint32_t NumInputTensors = 4; + constexpr size_t SizeOfCuTensorMap = sizeof(cute::TmaDescriptor); + // Allocate gmem space for input tensormaps per each SM, A tensormap copies followed by B tensormap copies + return (NumInputTensors * SizeOfCuTensorMap * sm_count * NumTmaDescriptorsPerSm); + } + + template + static cutlass::Status + initialize_workspace(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cudaStream_t stream, CudaHostAdapter* cuda_adapter = nullptr) { + return cutlass::Status::kSuccess; + } + + template + static bool + can_implement( + ProblemShape problem_shape, + [[maybe_unused]] Arguments const& args) { + auto [M,N,K,L] = problem_shape.get_host_problem_shape(0); + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = 128 / cute::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = 128 / cute::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE static + auto + partition_accumulator_shape() { + return append(partition_shape_C(TiledMma{}, take<0,2>(TileShape{})), Int<2>{}); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,TMEM_PIPE,2) + } + + template + CUTLASS_DEVICE static + auto + slice_accumulator(TmemStorage tmem_storage, int stage) { + return tmem_storage.accumulators(_,_,_,_,stage); + } + + template + CUTLASS_DEVICE static + auto + init_tmem_tensors(EpilogueTile epi_tile) { + TiledMma tiled_mma; + auto acc_shape = partition_accumulator_shape(); + // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,ACC_PIPE) where ACC_PIPE=2 so we can double buffer our accumulators for mainloop and epilogue. + Tensor accumulators = cutlass::detail::make_sm100_accumulator( + tiled_mma, acc_shape, EpilogueTile{}); + TmemStorage tmem_storage; + tmem_storage.accumulators = accumulators; + return tmem_storage; + } + + template + CUTLASS_DEVICE static + void + set_tmem_offsets(TmemStorage& tmem_storage, uint32_t tmem_base_addr) { + tmem_storage.accumulators.data() = tmem_base_addr; + } + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_(real/imag)_mkl - The tiled tma tensor for input A_(real/imag) + /// gB_(real/imag)_nkl - The tiled tma tensor for input B_(real/imag) + /// tAsA_(real/imag) - partitioned smem tensor for A_(real/imag) + /// tBsB_(real/imag) - partitioned smem tensor for B_(real/imag) + /// mcast_mask_a - tma multicast mask for A_(real/imag) + /// mcast_mask_b - tma multicast mask for B_(real/imag) + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + Params const& params, + TensorStorage& shared_tensors, + TensorMapStorage& shared_tensormaps, + int32_t const sm_count, int32_t const sm_idx, + [[maybe_unused]] int32_t num_groups, + [[maybe_unused]] int32_t init_group) const { + using X = Underscore; + + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + // Problem Shape and therefore strides that we construct are [M,N,K,L], but since here for the TMA loads + // we are managing TMA descriptors to change batches, we need to neglect the L mode + const int32_t mock_L = 1; + + // Represent the full tensors -- get these from TMA + Tensor mA_real_mkl = observed_tma_load_a_real_->get_tma_tensor(make_shape(M,K,mock_L)); + Tensor mA_imag_mkl = observed_tma_load_a_imag_->get_tma_tensor(make_shape(M,K,mock_L)); + Tensor mB_real_nkl = observed_tma_load_b_real_->get_tma_tensor(make_shape(N,K,mock_L)); + Tensor mB_imag_nkl = observed_tma_load_b_imag_->get_tma_tensor(make_shape(N,K,mock_L)); + + // Tile the tensors and defer the slice + Tensor gA_real_mkl = local_tile(mA_real_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M, BLK_K, m, k, l) + Tensor gA_imag_mkl = local_tile(mA_imag_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_N, BLK_K, m, k, l) + + Tensor gB_real_nkl = local_tile(mB_real_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + Tensor gB_imag_nkl = local_tile(mB_imag_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + + // Partition for this CTA + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_real_mkl = cta_mma.partition_A(gA_real_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgA_imag_mkl = cta_mma.partition_A(gA_imag_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + + Tensor tCgB_real_nkl = cta_mma.partition_B(gB_real_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + Tensor tCgB_imag_nkl = cta_mma.partition_B(gB_imag_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA_real = make_tensor(make_smem_ptr(shared_tensors.smem_A_real.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sA_imag = make_tensor(make_smem_ptr(shared_tensors.smem_A_imag.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + + Tensor sB_real = make_tensor(make_smem_ptr(shared_tensors.smem_B_real.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + Tensor sB_imag = make_tensor(make_smem_ptr(shared_tensors.smem_B_imag.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_real_mkl, tAsA_real] = tma_partition(*observed_tma_load_a_real_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA_real), group_modes<0,3>(tCgA_real_mkl)); + auto [tAgA_imag_mkl, tAsA_imag] = tma_partition(*observed_tma_load_a_imag_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA_imag), group_modes<0,3>(tCgA_imag_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_real_nkl, tBsB_real] = tma_partition(*observed_tma_load_b_real_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB_real), group_modes<0,3>(tCgB_real_nkl)); + auto [tBgB_imag_nkl, tBsB_imag] = tma_partition(*observed_tma_load_b_imag_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB_imag), group_modes<0,3>(tCgB_imag_nkl)); + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + auto ret = cute::make_tuple( + gA_real_mkl, gA_imag_mkl, gB_real_nkl, gB_imag_nkl, // for scheduler + tAgA_real_mkl, tAgA_imag_mkl, tBgB_real_nkl, tBgB_imag_nkl, // for input tensor values + tAsA_real, tAsA_imag, tBsB_real, tBsB_imag, // for input tensor values + mcast_mask_a, mcast_mask_b // multicast masks + ); + + if constexpr (IsTensorMapUpdateAsync) { + return ret; + } + else { + // Fetch a copy of tensormaps for the CTA from Params + auto input_tensormaps = tensormaps_init(params, shared_tensormaps, sm_count, sm_idx); + return cute::tuple_cat(ret, cute::make_tuple(input_tensormaps)); + } + } + + /// Set up the data needed by this collective for mma compute. + template + CUTLASS_DEVICE auto + mma_init( + [[maybe_unused]] TmemStorage tmem_storage, + TensorStorage& shared_tensors) const { + Tensor sA_real = make_tensor(make_smem_ptr(shared_tensors.smem_A_real.begin()), SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + Tensor sA_imag = make_tensor(make_smem_ptr(shared_tensors.smem_A_imag.begin()), SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + + Tensor sB_real = make_tensor(make_smem_ptr(shared_tensors.smem_B_real.begin()), SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + Tensor sB_imag = make_tensor(make_smem_ptr(shared_tensors.smem_B_imag.begin()), SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + + // Allocate "fragments/descriptors" for A and B matrices + Tensor tCrA_real = TiledMma::make_fragment_A(sA_real); // (MMA,MMA_M,MMA_K,PIPE) + Tensor tCrA_imag = TiledMma::make_fragment_A(sA_imag); // (MMA,MMA_M,MMA_K,PIPE) + + Tensor tCrB_real = TiledMma::make_fragment_B(sB_real); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tCrB_imag = TiledMma::make_fragment_B(sB_imag); // (MMA,MMA_N,MMA_K,PIPE) + + CUTE_STATIC_ASSERT_V(Int{} == size<3>(sA_real)); // PIPE + CUTE_STATIC_ASSERT_V(Int{} == size<3>(sB_real)); // PIPE + + TiledMma tiled_mma_a_pos; + TiledMmaANeg tiled_mma_a_neg; + + return cute::make_tuple(tiled_mma_a_pos, tiled_mma_a_neg, tCrA_real, tCrA_imag, tCrB_real, tCrB_imag); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Producer Perspective + template < + class GTensorA, class GTensorB, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB, + class TensorMapA, class TensorMapB, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE auto + load( + Params const& params, + MainloopPipeline mainloop_pipeline, + MainloopPipelineState mainloop_pipe_producer_state, + cute::tuple> const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count, + bool did_batch_change, + [[maybe_unused]] int curr_batch) { + + auto [unused_gA_real, unused_gA_imag, unused_gB_real, unused_gB_imag, + tAgA_real_mkl, tAgA_imag_mkl, tBgB_real_nkl, tBgB_imag_nkl, + tAsA_real, tAsA_imag, tBsB_real, tBsB_imag, + mcast_mask_a, mcast_mask_b, + input_tensormaps] = load_inputs; + + // Check to see if tensormaps have been replaced in gmem + if (did_batch_change) { + tensormaps_fence_acquire(input_tensormaps); + } + + // slice out the work coord from partitioned tensors + Tensor tAgA_real = tAgA_real_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tAgA_imag = tAgA_imag_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + + Tensor tBgB_real = tBgB_real_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + Tensor tBgB_imag = tBgB_imag_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + auto barrier_token = mainloop_pipeline.producer_try_acquire(mainloop_pipe_producer_state); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + while (k_tile_count > 0) { + // LOCK mainloop_pipe_producer_state for _writing_ + mainloop_pipeline.producer_acquire(mainloop_pipe_producer_state, barrier_token); + + using BarrierType = typename MainloopPipeline::ProducerBarrierType; + BarrierType* tma_barrier = mainloop_pipeline.producer_get_barrier(mainloop_pipe_producer_state); + + int write_stage = mainloop_pipe_producer_state.index(); + ++mainloop_pipe_producer_state; + barrier_token = mainloop_pipeline.producer_try_acquire(mainloop_pipe_producer_state); + + if (cute::elect_one_sync()) { + copy(observed_tma_load_a_real_->with(get<0>(input_tensormaps), *tma_barrier, mcast_mask_a), tAgA_real(_,*k_tile_iter), tAsA_real(_,write_stage)); + copy(observed_tma_load_a_imag_->with(get<1>(input_tensormaps), *tma_barrier, mcast_mask_a), tAgA_imag(_,*k_tile_iter), tAsA_imag(_,write_stage)); + + copy(observed_tma_load_b_real_->with(get<2>(input_tensormaps), *tma_barrier, mcast_mask_b), tBgB_real(_,*k_tile_iter), tBsB_real(_,write_stage)); + copy(observed_tma_load_b_imag_->with(get<3>(input_tensormaps), *tma_barrier, mcast_mask_b), tBgB_imag(_,*k_tile_iter), tBsB_imag(_,write_stage)); + } + --k_tile_count; + ++k_tile_iter; + } + + return cute::make_tuple(mainloop_pipe_producer_state, k_tile_iter); + } + + /// Perform a Producer Epilogue to prevent early exit of ctas in a Cluster + CUTLASS_DEVICE void + load_tail(MainloopPipeline mainloop_pipeline, MainloopPipelineState mainloop_pipe_producer_state) { + // Issue the epilogue waits + /* This helps avoid early exit of ctas in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + mainloop_pipeline.producer_tail(mainloop_pipe_producer_state); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class AccumulatorPipeline, + class FrgEngine, class FrgLayout, + class FragmentA, class FragmentB, + class CtaTileCoord + > + CUTLASS_DEVICE auto + mma(cute::tuple pipelines, + cute::tuple pipeline_states, + cute::Tensor const& accumulators, + cute::tuple const& mma_inputs, + CtaTileCoord cta_tile_coord, + int k_tile_count + ) { + static_assert(is_tmem::value, "Accumulator must be tmem resident."); + static_assert(rank(FrgLayout{}) == 4 && size<3>(FrgLayout{}) == _2{}, "Accumulator must be MMA-partitioned: (MMA, MMA_M, MMA_N, _2)"); + + auto [tiled_mma_a_pos, tiled_mma_a_neg, tCrA_real, tCrA_imag, tCrB_real, tCrB_imag] = mma_inputs; + + auto [mainloop_pipeline, accumulator_pipeline] = pipelines; + auto [mainloop_pipe_consumer_state, accumulator_pipe_producer_state] = pipeline_states; + + uint32_t skip_wait = k_tile_count <= 0; + auto barrier_token = mainloop_pipeline.consumer_try_wait(mainloop_pipe_consumer_state, skip_wait); + + // + // PIPELINED MAIN LOOP + // + tiled_mma_a_pos.accumulate_ = UMMA::ScaleOut::Zero; + tiled_mma_a_neg.accumulate_ = UMMA::ScaleOut::Zero; + // Wait for tmem accumulator buffer to become empty with a flipped phase + accumulator_pipeline.producer_acquire(accumulator_pipe_producer_state); + + auto accumulators_real = accumulators(_,_,_,0); + auto accumulators_imag = accumulators(_,_,_,1); + + CUTLASS_PRAGMA_NO_UNROLL + while (k_tile_count > 0) { + // WAIT on mainloop_pipe_consumer_state until its data are available + // (phase bit flips from mainloop_pipe_consumer_state.phase() value) + mainloop_pipeline.consumer_wait(mainloop_pipe_consumer_state, barrier_token); + + // Compute on k_tile + int read_stage = mainloop_pipe_consumer_state.index(); + // Save current mainlop pipeline read state + auto curr_mainloop_pipe_consumer_state = mainloop_pipe_consumer_state; + + // Advance mainloop_pipe + ++mainloop_pipe_consumer_state; + --k_tile_count; + skip_wait = k_tile_count <= 0; + // Peek at next iteration + barrier_token = mainloop_pipeline.consumer_try_wait(mainloop_pipe_consumer_state, skip_wait); + + // Unroll the K mode manually so we can set scale C to 1 + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tCrA_real); ++k_block) { + // (V,M) x (V,N) => (V,M,N) + + // Calculate real acc, 1st step + // realAcc += realA * realB + cute::gemm(tiled_mma_a_pos, tCrA_real(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_real); + + // Calculate imag acc, 1st step + if constexpr (cute::is_same_v) { + // imagAcc += realA * (-imagB) + cute::gemm(tiled_mma_a_neg, tCrA_real(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_imag); + } + else { + // imagAcc += realA * imagB + cute::gemm(tiled_mma_a_pos, tCrA_real(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_imag); + } + + tiled_mma_a_pos.accumulate_ = UMMA::ScaleOut::One; + tiled_mma_a_neg.accumulate_ = UMMA::ScaleOut::One; + + // Calculate real acc, 2nd step + if constexpr (cute::is_same_v) { + // realAcc -= imagA * imagB + cute::gemm(tiled_mma_a_neg, tCrA_imag(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_real); + } + else { + // realAcc += imagA * imagB + cute::gemm(tiled_mma_a_pos, tCrA_imag(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_real); + } + + // Calculate imag acc, 2nd step + if constexpr (cute::is_same_v) { + // imagAcc += (-imagA) * realB + cute::gemm(tiled_mma_a_neg, tCrA_imag(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_imag); + } + else { + // imagAcc += imagA * realB + cute::gemm(tiled_mma_a_pos, tCrA_imag(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_imag); + } + } + mainloop_pipeline.consumer_release(curr_mainloop_pipe_consumer_state); + } + + return mainloop_pipe_consumer_state; + } + + // + // Methods to perform different parts of TMA/Tensormap modifications + // + + template + CUTLASS_DEVICE auto + tensormaps_init( + Params const& mainloop_params, + TensorMapStorage& shared_tensormaps, + int32_t const sm_count, + int32_t const sm_idx) const { + cute::TmaDescriptor* gmem_tensormap = mainloop_params.tensormaps; + + cute::TmaDescriptor* tma_desc_a_real = &gmem_tensormap[sm_idx * NumTmaDescriptorsPerSm]; + cute::TmaDescriptor* tma_desc_a_imag = &gmem_tensormap[(sm_idx + sm_count) * NumTmaDescriptorsPerSm]; + + cute::TmaDescriptor* tma_desc_b_real = &gmem_tensormap[(sm_idx + 2 * sm_count) * NumTmaDescriptorsPerSm]; + cute::TmaDescriptor* tma_desc_b_imag = &gmem_tensormap[(sm_idx + 3 * sm_count) * NumTmaDescriptorsPerSm]; + + + if (cute::elect_one_sync()) { + // Bringing tensormaps from params to smem for modification later + Tensor pA_real_tensormap = make_tensor(observed_tma_load_a_real_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sA_real_tensormap = make_tensor(make_smem_ptr(&shared_tensormaps.smem_tensormap_A_real), Int<1>{}, Int<1>{}); + Tensor pA_imag_tensormap = make_tensor(observed_tma_load_a_imag_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sA_imag_tensormap = make_tensor(make_smem_ptr(&shared_tensormaps.smem_tensormap_A_imag), Int<1>{}, Int<1>{}); + + Tensor pB_real_tensormap = make_tensor(observed_tma_load_b_real_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sB_real_tensormap = make_tensor(make_smem_ptr(&shared_tensormaps.smem_tensormap_B_real), Int<1>{}, Int<1>{}); + Tensor pB_imag_tensormap = make_tensor(observed_tma_load_b_imag_->get_tma_descriptor(), Int<1>{}, Int<1>{}); + Tensor sB_imag_tensormap = make_tensor(make_smem_ptr(&shared_tensormaps.smem_tensormap_B_imag), Int<1>{}, Int<1>{}); + + copy(recast(pA_real_tensormap), recast(sA_real_tensormap)); + copy(recast(pA_imag_tensormap), recast(sA_imag_tensormap)); + + copy(recast(pB_real_tensormap), recast(sB_real_tensormap)); + copy(recast(pB_imag_tensormap), recast(sB_imag_tensormap)); + } + __syncwarp(); + + struct TensorMapArray { + cute::TmaDescriptor* tma_desc_a_real; + cute::TmaDescriptor* tma_desc_a_imag; + cute::TmaDescriptor* tma_desc_b_real; + cute::TmaDescriptor* tma_desc_b_imag; + + TensorMapArray() = default; + + CUTLASS_DEVICE + TensorMapArray(cute::TmaDescriptor* tma_desc_a_real, cute::TmaDescriptor* tma_desc_a_imag, + cute::TmaDescriptor* tma_desc_b_real, cute::TmaDescriptor* tma_desc_b_imag) + : tma_desc_a_real(tma_desc_a_real), tma_desc_a_imag(tma_desc_a_imag), + tma_desc_b_real(tma_desc_b_real), tma_desc_b_imag(tma_desc_b_imag) {} + + CUTLASS_DEVICE + cute::tuple + operator[](int32_t idx) { + idx = idx % NumTmaDescriptorsPerSm; + return cute::make_tuple(tma_desc_a_real + idx, tma_desc_a_imag + idx, + tma_desc_b_real + idx, tma_desc_b_imag + idx); + } + }; + + if constexpr (IsTensorMapUpdateAsync) { + return TensorMapArray(tma_desc_a_real, tma_desc_a_imag, tma_desc_b_real, tma_desc_b_imag); + } + else { + return cute::make_tuple(tma_desc_a_real, tma_desc_a_imag, tma_desc_b_real, tma_desc_b_imag); + } + } + + // Replace address for the global tensor (to be done by single thread) + CUTLASS_DEVICE + void + tensormaps_replace_global_address( + TensorMapStorage& shared_tensormap, + Params const& mainloop_params, + int32_t next_batch) { + // Replacing global_address for the next batch + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_A_real, + mainloop_params.ptr_A_real[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_A_imag, + mainloop_params.ptr_A_imag[next_batch]); + + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_B_real, + mainloop_params.ptr_B_real[next_batch]); + cute::tma_descriptor_replace_addr_in_shared_mem(shared_tensormap.smem_tensormap_B_imag, + mainloop_params.ptr_B_imag[next_batch]); + } + + // The entire warp must call this function collectively (that is, the instructions are aligned) + template + CUTLASS_DEVICE + void + tensormaps_perform_update( + TensorMapStorage& shared_tensormaps, + Params const& mainloop_params, + cute::tuple const& input_tensormaps, + [[maybe_unused]]ProblemShape problem_shape, + int32_t next_batch + ) { + if (cute::elect_one_sync()) { + // Replacing global_address for the next batch + tensormaps_replace_global_address(shared_tensormaps, mainloop_params, next_batch); + } + // Ensure warp is converged before issuing tensormap fence release + __syncwarp(); + // Entire warp must do this (ie its aligned) + tensormaps_cp_fence_release( + shared_tensormaps, + input_tensormaps + ); + } + + template + CUTLASS_DEVICE + void + tensormaps_cp_fence_release ( + TensorMapStorage& shared_tensormap, + cute::tuple const& input_tensormaps + ) { + // Entire warp must do this (i.e., it's aligned) + tma_descriptor_cp_fence_release(get<0>(input_tensormaps), shared_tensormap.smem_tensormap_A_real); + tma_descriptor_cp_fence_release(get<1>(input_tensormaps), shared_tensormap.smem_tensormap_A_imag); + + tma_descriptor_cp_fence_release(get<2>(input_tensormaps), shared_tensormap.smem_tensormap_B_real); + tma_descriptor_cp_fence_release(get<3>(input_tensormaps), shared_tensormap.smem_tensormap_B_imag); + } + + // The entire warp must call this function collectively (that is, the instructions are aligned) + template + CUTLASS_DEVICE + void + tensormaps_fence_acquire(cute::tuple const& input_tensormaps) { + cute::tma_descriptor_fence_acquire(get<0>(input_tensormaps)); + cute::tma_descriptor_fence_acquire(get<1>(input_tensormaps)); + cute::tma_descriptor_fence_acquire(get<2>(input_tensormaps)); + cute::tma_descriptor_fence_acquire(get<3>(input_tensormaps)); + } + +protected: + + typename Params::TMA_A const* observed_tma_load_a_real_ = nullptr; + typename Params::TMA_A const* observed_tma_load_a_imag_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_real_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_imag_ = nullptr; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_emulated.hpp b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_emulated.hpp new file mode 100644 index 00000000..140b7854 --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_emulated.hpp @@ -0,0 +1,1072 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +#pragma once +#include + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/numeric_conversion.h" +#include "cutlass/detail/sm100_tmem_helper.hpp" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/atom/copy_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/arch/mma_sm100.hpp" +#include "cutlass/trace.h" +#include "cutlass/kernel_hardware_info.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop for FastF32 Kernels: Interleaved complex variants +template < + int Load2TransformPipelineStageCount_, + int Transform2MmaPipelineStageCount_, + int SchedulerPipelineStageCount_, + int AccumulatorPipelineStageCount_, + int NumBandsToCompute_, + int ScalingFactor_, + int AccPromotionInterval_, + class AccumulatorCopyAtom_, + class ClusterShape, + class TileShape_, + class StrideA_, + class StrideB_, + class TiledMma_, + class GmemTiledCopyA_, + class SmemLayoutAtomsA_, + class CopyAtomsA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomsB_, + class CopyAtomsB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100TmaUmmaWarpSpecializedFastF32< + Load2TransformPipelineStageCount_, + Transform2MmaPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + NumBandsToCompute_, + ScalingFactor_, + AccPromotionInterval_, + ClusterShape, + AccumulatorCopyAtom_>, + TileShape_, + complex, + StrideA_, + complex, + StrideB_, + TiledMma_, + GmemTiledCopyA_, + SmemLayoutAtomsA_, + CopyAtomsA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomsB_, + CopyAtomsB_, + TransformB_> +{ + // + // Type Aliases + // + using TileShape = TileShape_; + using TiledMma = TiledMma_; + + // ElementA and ElementB are cutlass::complex, which are used as GMEM input and output data type. + using ElementA = complex; + using StrideA = StrideA_; + using ElementB = complex; + using StrideB = StrideB_; + + // For a complex kernel, the MMA output type is real valued, but ElementAccumulator is a complex type for the GETT reference kernel + using ElementAccumulator = complex; + using ElementAccumulatorRaw = typename TiledMma::ValTypeC; + +private: + // ElementAMma and ElementBMma are cutlass::complex, which are used as SMEM and RF data type. + // ElementAMmaRaw and ElementBMmaRaw are cutlass::bfloat16_t, which is the real internal data type set in TMA descriptor and used in TCGEN05 calculation. + using ElementAMma = typename TiledMma::ValTypeA; // complex + using ElementAMmaRaw = typename ElementAMma::value_type; // bfloat16_t + using ElementBMma = typename TiledMma::ValTypeB; // complex + using ElementBMmaRaw = typename ElementBMma::value_type; // bfloat16_t + +public: + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomsA = SmemLayoutAtomsA_; + using SmemLayoutAtomsB = SmemLayoutAtomsB_; + using CopyAtomsA = CopyAtomsA_; + using CopyAtomsB = CopyAtomsB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + + static_assert(cute::is_same_v, "Underlying input type for A should be float"); + static_assert(cute::is_same_v, "Underlying input type for B should be float"); + static_assert(cute::is_same_v, "Underlying compute type for A should be bfloat16_t"); + static_assert(cute::is_same_v, "Underlying compute type for A should be bfloat16_t"); + + // Determine MMA type: MMA_1SM vs MMA_2SM + using AtomThrShapeMNK = Shape(typename TiledMma_::ThrLayoutVMNK{})), _1, _1>; + using DispatchPolicy = MainloopSm100TmaUmmaWarpSpecializedFastF32< + Load2TransformPipelineStageCount_, + Transform2MmaPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + NumBandsToCompute_, + ScalingFactor_, + AccPromotionInterval_, + ClusterShape, + AccumulatorCopyAtom_>; + static constexpr bool IsDynamicCluster = not cute::is_static_v; + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using CtaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using CtaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + using ArchTag = typename DispatchPolicy::ArchTag; + + using Load2TransformPipeline = cutlass::PipelineTmaTransformAsync< + DispatchPolicy::Load2TransformPipelineStageCount, + AtomThrShapeMNK>; + using Load2TransformPipelineState = typename Load2TransformPipeline::PipelineState; + + using Transform2MmaPipeline = cutlass::PipelineUmmaConsumerAsync< + DispatchPolicy::Transform2MmaPipelineStageCount, + AtomThrShapeMNK>; + using Transform2MmaPipelineState = typename Transform2MmaPipeline::PipelineState; + + using Mma2AccumPipeline = cutlass::PipelineUmmaAsync< + DispatchPolicy::Schedule::AccumulatorPipelineStageCount, + AtomThrShapeMNK>; + using Mma2AccumPipelineState = typename Mma2AccumPipeline::PipelineState; + + // Thread Counts + static constexpr uint32_t NumTransformationThreads = 128; + static constexpr uint32_t NumAccumThreads = 128; + + // Get the Algorithm parameters + constexpr static int NumComputeMtxs = 3; + constexpr static int ConjSwapMode = 2; + constexpr static int NumBandsToCompute = DispatchPolicy::NumBandsToCompute; + constexpr static int ScalingFactor = DispatchPolicy::ScalingFactor; + constexpr static int AccPromotionInterval = DispatchPolicy::AccPromotionInterval; + constexpr static int AccumulatorPipelineStageCount = DispatchPolicy::Schedule::AccumulatorPipelineStageCount; + constexpr static int StagesPerTile = size<2>(CtaShapeA_MK{}) / DispatchPolicy::AccPromotionInterval; + constexpr static int NumBandsMax = 5; + static_assert(NumBandsToCompute <= NumBandsMax && NumBandsToCompute >= 3, "NumBandsToCompute should be less than maximum number of bands"); + static_assert(StagesPerTile * AccPromotionInterval == size<2>(CtaShapeA_MK{}), "PromotionInterval*InstructionK doesn't evenly divide CTA shape"); + + // Copy atom for Accumulator + using AccumulatorCopyAtom = typename DispatchPolicy::AccumulatorCopyAtom; + + static_assert((NumBandsToCompute == 5 || NumBandsToCompute == 4 || NumBandsToCompute == 3), + "9xBF16 with 5/4/3 Bands are supported"); + + using SmemLayoutAtomA = typename SmemLayoutAtomsA::InputLayoutAtom; + using SmemLayoutAtomACompute = typename SmemLayoutAtomsA::ComputeLayoutAtom; + using SmemLayoutAtomB = typename SmemLayoutAtomsB::InputLayoutAtom; + using SmemLayoutAtomBCompute = typename SmemLayoutAtomsB::ComputeLayoutAtom; + + using InputCopyAtomA = typename CopyAtomsA::InputCopyAtom; + using ComputeCopyAtomA = typename CopyAtomsA::ComputeCopyAtom; + using InputCopyAtomB = typename CopyAtomsB::InputCopyAtom; + using ComputeCopyAtomB = typename CopyAtomsB::ComputeCopyAtom; + + static_assert(rank(SmemLayoutAtomA{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert(((size<0,0>(CtaShapeA_MK{}) * size<1>(CtaShapeA_MK{})) % size<0>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeA_MK{}) * size<2>(CtaShapeA_MK{})) % size<1>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + + static_assert(rank(SmemLayoutAtomB{}) == 2, "SmemLayoutAtom must be rank 2 (M/N, K)"); + static_assert(((size<0,0>(CtaShapeB_NK{}) * size<1>(CtaShapeB_NK{})) % size<0>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeB_NK{}) * size<2>(CtaShapeB_NK{})) % size<1>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtomCompute must evenly divide tile shape."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(CtaShapeA_MK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutACompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomACompute{}, + tuple_cat(CtaShapeA_MK{}, tuple, Int>{}))); + + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(CtaShapeB_NK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutBCompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomBCompute{}, + tuple_cat(CtaShapeB_NK{}, tuple, Int, Int>{}))); + + static_assert(DispatchPolicy::Load2TransformPipelineStageCount >= 2 && DispatchPolicy::Load2TransformPipelineStageCount >= 2, + "Specialization requires Stages set to value 2 or more."); + static_assert((cute::is_base_of::value || + cute::is_base_of::value ) && + cute::is_base_of::value, + "MMA atom must A operand from SMEM or TMEM and B operand from SMEM for this mainloop."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyA - invalid TMA copy atom specified."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyB - invalid TMA copy atom specified."); + + struct PipelineStorage { + using Load2TransformPipelineStorage = typename Load2TransformPipeline::SharedStorage; + alignas(16) Load2TransformPipelineStorage load2transform_pipeline; + using Transform2MmaPipelineStorage = typename Transform2MmaPipeline::SharedStorage; + alignas(16) Transform2MmaPipelineStorage transform2mma_pipeline; + using Mma2AccumPipelineStorage = typename Mma2AccumPipeline::SharedStorage; + alignas(16) Mma2AccumPipelineStorage mma2accum_pipeline; + }; + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + struct TensorStorageUntransformed { + cute::ArrayEngine> smem_A; + cute::ArrayEngine> smem_B; + }; + + struct TensorStorageTransformedAinSmem { + alignas(1024) cute::ArrayEngine> smem_ACompute; + alignas(1024) cute::ArrayEngine> smem_BCompute; + }; + + union TensorStorageTransformedAinTmem { + alignas(1024) cute::ArrayEngine smem_ACompute; // No smem_ACompute + alignas(1024) cute::ArrayEngine> smem_BCompute; + }; + + using TensorStorageTransformed = cute::conditional_t< + cute::is_base_of::value, + TensorStorageTransformedAinSmem, + TensorStorageTransformedAinTmem>; + + TensorStorageUntransformed input; + TensorStorageTransformed compute; + } tensors; + + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + + // Different from other GEMM kernels, both CTAs should be aware of loads. Both CTAs will work on + // loaded input A and B matrices to convert the data type + static constexpr uint32_t TmaTransactionBytes = + cutlass::bits_to_bytes(size<0>(SmemLayoutA{}) * size<1>(SmemLayoutA{}) * size<2>(SmemLayoutA{}) * static_cast(sizeof_bits::value))+ + cutlass::bits_to_bytes(size<0>(SmemLayoutB{}) * size<1>(SmemLayoutB{}) * size<2>(SmemLayoutB{}) * static_cast(sizeof_bits::value)); + + // Host side kernel arguments + struct Arguments { + ElementA const* ptr_A{nullptr}; + StrideA dA{}; + ElementB const* ptr_B{nullptr}; + StrideB dB{}; + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), + make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + TMA_A tma_load_a; + TMA_B tma_load_b; + TMA_A tma_load_a_fallback; + TMA_B tma_load_b_fallback; + dim3 cluster_shape_fallback; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_ = is_fallback_cluster ? ¶ms.tma_load_a_fallback : ¶ms.tma_load_a; + observed_tma_load_b_ = is_fallback_cluster ? ¶ms.tma_load_b_fallback : ¶ms.tma_load_b; + } + else { + observed_tma_load_a_ = ¶ms.tma_load_a; + observed_tma_load_b_ = ¶ms.tma_load_b; + } + } + + template + static constexpr Params + to_underlying_arguments(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + (void) workspace; + + // Optionally append 1s until problem shape is rank-4 (MNKL), in case it is only rank-3 (MNK) + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + Tensor tensor_a = make_tensor(args.ptr_A, make_layout(make_shape(M,K,L), args.dA)); + Tensor tensor_b = make_tensor(args.ptr_B, make_layout(make_shape(N,K,L), args.dB)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape_fallback); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a, + tma_load_b, + tma_load_a_fallback, + tma_load_b_fallback, + hw_info.cluster_shape_fallback + }; + } + + template + static bool + can_implement( + ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits = 128; + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE static void + prefetch_tma_descriptors(Params const& params) { + if constexpr (IsDynamicCluster) { + dim3 cs = cute::cluster_shape(); + const bool is_fallback_cluster = (cs.x == params.cluster_shape_fallback.x && cs.y == params.cluster_shape_fallback.y); + if (is_fallback_cluster) { + cute::prefetch_tma_descriptor(params.tma_load_a_fallback.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b_fallback.get_tma_descriptor()); + } + else { + cute::prefetch_tma_descriptor(params.tma_load_a.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + } + } + else { + cute::prefetch_tma_descriptor(params.tma_load_a.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + } + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE auto + partition_accumulator_shape() { + auto acc_shape = partition_shape_C(TiledMma{}, take<0,2>(TileShape{})); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N) + + return acc_shape; + } + + /// Produce the inputs to the transform threads by loading inputs from gmem -> smem + template < + class GTensorA, class GTensorB, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE auto + load( + Params const& params, + Load2TransformPipeline pipeline, + Load2TransformPipelineState load2xform_pipeline_state, + cute::tuple const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count) { + + auto [unused_gA, unused_gB, + tAgA_mkl, tBgB_nkl, tAsA, tBsB, + mcast_mask_a, mcast_mask_b] = load_inputs; + + // slice out the work coord from tiled tensors + Tensor tAgA = tAgA_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tBgB = tBgB_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + uint32_t skip_wait = (k_tile_count <= 0); + auto pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + // LOCK mainloop_load2xform_pipeline_state for _writing_ + pipeline.producer_acquire(load2xform_pipeline_state, pipeline_flag); + int write_stage = load2xform_pipeline_state.index(); + + using BarrierType = typename Load2TransformPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(load2xform_pipeline_state); + + // Advance mainloop_pipe + ++load2xform_pipeline_state; + skip_wait = (k_tile_count <= 1); + pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + copy(observed_tma_load_a_->with(*tma_barrier, mcast_mask_a), tAgA(_,*k_tile_iter), tAsA(_,write_stage)); + copy(observed_tma_load_b_->with(*tma_barrier, mcast_mask_b), tBgB(_,*k_tile_iter), tBsB(_,write_stage)); + ++k_tile_iter; + } + return cute::make_tuple(load2xform_pipeline_state, k_tile_iter); + } + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_mkl - The tiled tensor for input A + /// gB_nkl - The tiled tensor for input B + // Other inputs needed for load(): partitioned AB tensors for gmem and smem, and mcast masks + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + Params const& params, + TensorStorage& shared_storage) const { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_mkl = cta_mma.partition_A(gA_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgB_nkl = cta_mma.partition_B(gB_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sB = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_mkl, tAsA] = tma_partition(*observed_tma_load_a_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA), group_modes<0,3>(tCgA_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_nkl, tBsB] = tma_partition(*observed_tma_load_b_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB), group_modes<0,3>(tCgB_nkl)); + + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + return cute::make_tuple( + gA_mkl, gB_nkl, // for scheduler + tAgA_mkl, tBgB_nkl, tAsA, tBsB, // for input tensor values + mcast_mask_a, mcast_mask_b); // multicast masks + } + + template< + class KTileIterator, class Accumulator, + class GTensorA, class DstCopyA, class SrcTensorA, class DstTensorA, + class GTensorB, class SrcTensorB, class DstTensorB + > + CUTLASS_DEVICE auto + transform( + Load2TransformPipeline load2transform_pipeline, + Load2TransformPipelineState load2transform_pipeline_consumer_state, + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_producer_state, + Accumulator accumulators, + cute::tuple input_operands, + KTileIterator k_tile_iter, int k_tile_count) { + + static_assert(cute::is_same_v, "ElementA and ElementB types should be the same."); + static_assert(cute::is_same_v, "ElementAMma and ElementBMma types should be the same."); + + cutlass::arch::NamedBarrier transform_bar(NumTransformationThreads, cutlass::arch::ReservedNamedBarriers::TransformBarrier); + + // tAsA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tAdA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, NumComputeMtxs(Emulation), SmemStages (In SMEM or TMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, NumComputeMtxs(Complex,Emulation), SmemStages (In SMEM) + auto [unused_tAgA, dst_copy_A, tAsA, tAdACompute, + unused_tBgB, tBsB, tBsBCompute] = input_operands; + + // Create the tensors in registers + auto tArA = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_temp = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArACompute = make_tensor(tAsA(_,_,_,_,0).shape()); + + auto tBrB = make_tensor(tBsB(_,_,_,_,0).shape()); + auto tBrB_temp = make_tensor(tBsB(_,_,_,_,0).shape()); + auto tBrBCompute = make_tensor(tBsB(_,_,_,_,0).shape()); + + // For compute, cast to 4 raw elements instead of 2 complex elements. + auto tArA_x4 = recast>(tArA); + auto tArA_temp_x4 = recast>(tArA_temp); + auto tArACompute_x4 = recast>(tArACompute); + + auto tBrB_x4 = recast>(tBrB); + auto tBrB_temp_x4 = recast>(tBrB_temp); + auto tBrBCompute_x4 = recast>(tBrBCompute); + + uint32_t skip_wait = (k_tile_count <= 0); + auto load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + auto transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + load2transform_pipeline.consumer_wait(load2transform_pipeline_consumer_state, load2transform_flag); + transform2mma_pipeline.producer_acquire(transform2mma_pipeline_producer_state, transform2mma_flag); + + int load2transform_consumer_index = load2transform_pipeline_consumer_state.index(); + int transform2mma_producer_index = transform2mma_pipeline_producer_state.index(); + + auto curr_load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state; + auto curr_transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state; + + // Copy the input B matrix from SMEM + copy(AutoVectorizingCopy{}, tBsB(_,_,_,_,load2transform_consumer_index), tBrB); + // Copy the input A matrix from SMEM + copy(AutoVectorizingCopy{}, tAsA(_,_,_,_,load2transform_consumer_index), tArA); + + /// NOTE: sm100_mma_warpspecialized_interleaved_complex_tf32.hpp introduced about expanding: + /// re(a_complex * b_complex) -> (a_re, a_im) . (b_re,-b_im) = a . b_conj + /// im(a_complex * b_complex) -> (a_re, a_im) . (b_im, b_re) = a . b_swap + /// However, 16b types need to be packed for swapping and negation. + /// Hence, (re | im | re | im) is reordered into (re_x2 | im_x2). + cute::transform(tBrB_x4, tBrB_x4, [&] (auto& f4) -> Array {return {f4[0], f4[2], f4[1], f4[3]};}); + // Conversion b -> b_conj goes first, hence TransformB has a not preceding it. + if constexpr (not cute::is_same_v) { + cute::transform(tBrB_x4, tBrB_x4, [&] (auto& f4) { + auto f2_x2 = *reinterpret_cast,2>*>(&f4); + f2_x2[1] = cutlass::negate>{}(f2_x2[1]); + return *reinterpret_cast*>(&f2_x2); + }); + } + CUTE_UNROLL + for (int comp_mtx_index = 0; comp_mtx_index < NumComputeMtxs; ++comp_mtx_index) { + // Convert from fp32 -> bf16 + cute::transform(tBrB_x4, tBrBCompute_x4, + cutlass::NumericArrayConverter::convert); + // Store as B_conj (for producing C_re) + copy(AutoVectorizingCopy{}, tBrBCompute, tBsBCompute(_,_,_,_,0,comp_mtx_index,transform2mma_producer_index)); + // if it is not the last compute matrix, scale and substract + if (comp_mtx_index < NumComputeMtxs - 1) { + // Convert from bf16 -> fp32 to substract + cute::transform(tBrBCompute_x4, tBrB_temp_x4, + cutlass::NumericArrayConverter::convert); + cute::transform(tBrB_x4, tBrB_temp_x4, tBrB_x4, cutlass::minus>{}); + if constexpr (DispatchPolicy::ScalingFactor != 0) { + cute::transform(tBrB_x4, tBrB_x4, cutlass::scale>{(1 << DispatchPolicy::ScalingFactor)}); + } + } + + // Convert B_conj to B_swap + cute::transform(tBrBCompute_x4, tBrBCompute_x4, [&] (auto& h4) { + // Reinterpret as packed types + auto h2_x2_conj = *reinterpret_cast,2>*>(&h4); + cutlass::negate> neg; + Array,2> h2_x2_swap{ neg(h2_x2_conj[1]), h2_x2_conj[0] }; + return *reinterpret_cast*>(&h2_x2_swap); + }); + // Store as B_swap (for producing C_im) + copy(AutoVectorizingCopy{}, tBrBCompute, tBsBCompute(_,_,_,_,1,comp_mtx_index,transform2mma_producer_index)); + } + + // Loads from SMEM are done. Signal the mainloop load as early as possible + transform_bar.sync(); + load2transform_pipeline.consumer_release(curr_load2transform_pipeline_consumer_state); + + // ( re | im | re | im ) -> ( re_x2 | im_x2 ) + cute::transform(tArA_x4, tArA_x4, [&] (auto& f4) -> Array{return {f4[0], f4[2], f4[1], f4[3]};}); + if constexpr (cute::is_same_v) { + cute::transform(tArA_x4, tArA_x4, [&] (auto& f4) { + auto f2_x2 = *reinterpret_cast,2>*>(&f4); + f2_x2[1] = cutlass::negate>{}(f2_x2[1]); + return *reinterpret_cast*>(&f2_x2); + }); + } + CUTE_UNROLL + for (int comp_mtx_index = 0; comp_mtx_index < NumComputeMtxs; ++comp_mtx_index) { + // Convert from fp32 -> bf16 + cute::transform(tArA_x4, tArACompute_x4, + cutlass::NumericArrayConverter::convert); + copy(dst_copy_A, tArACompute, tAdACompute(_,_,_,_,comp_mtx_index,transform2mma_producer_index)); + // if it is not the last compute matrix, scale and substract + if (comp_mtx_index < NumComputeMtxs - 1) { + // Convert from bf16 -> fp32 to substract + cute::transform(tArACompute_x4, tArA_temp_x4, + cutlass::NumericArrayConverter::convert); + cute::transform(tArA_x4, tArA_temp_x4, tArA_x4, cutlass::minus>{}); + if constexpr (DispatchPolicy::ScalingFactor != 0) { + cute::transform(tArA_x4, tArA_x4, cutlass::scale>{(1 << DispatchPolicy::ScalingFactor)}); + } + } + } + + // fence for SMEM writes + cutlass::arch::fence_view_async_shared(); + if constexpr (is_tmem::value) { + // fence for TMEM writes if A operand is coming from TMEM + cutlass::arch::fence_view_async_tmem_store(); + } + + // Let the MMA know we are done transforming + transform2mma_pipeline.producer_commit(curr_transform2mma_pipeline_producer_state); + // Next pipeline stage + ++load2transform_pipeline_consumer_state; + ++transform2mma_pipeline_producer_state; + + skip_wait = (k_tile_count <= 1); + // Peek the next pipeline stage's barriers + load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + } + return cute::make_tuple(load2transform_pipeline_consumer_state, transform2mma_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + transform_init( + Params const& params, + ProblemShape_MNKL const& problem_shape_MNKL, + Accumulator accumulators, + TensorStorage& shared_storage) { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + Tensor sA_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); + Tensor sA = as_position_independent_swizzle_tensor(sA_orig); + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + + Tensor sB_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); + Tensor sB = as_position_independent_swizzle_tensor(sB_orig); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + + // Map input, compute, and fragment tensors to + // Copy strategies and partitioned tensors. These will become the input + // operands of the transform function. Depending on MMA atom type, the + // operands can reside in SMEM or TMEM + auto setup_copy_ops = [&] ( + auto tensor_input, + auto input_copy_atom, + auto tensor_compute, + auto make_fragment, + auto compute_copy_atom) constexpr { + auto fragment_compute = make_fragment(tensor_compute); + if constexpr (cute::is_tmem>::value) { + // For M=128 with 2CTA MMA atoms, the TMEM tensor for A has a duplicated allocation. + // Instead of allocation a 64x16 TMEM tensor, we have a 128x16 allocation + // See: TmemAllocMode::Duplicated. + Tensor tensor_input2x = [&] () constexpr { + if constexpr (decltype(size<0,0>(fragment_compute) == Int<128>{} && size<0,0>(tensor_input) == Int<64>{})::value) { + return make_tensor(tensor_input.data(), + logical_product(tensor_input.layout(), + make_tile(make_tile(Layout<_2,_0>{},_),_,_,_))); // ((128,16),m,k,PIPE) + } + else { + return tensor_input; + } + }(); + + fragment_compute.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + // If operand comes from TMEM, create the TMEM_STORE based copy + auto reg2tmem_tiled_copy = make_tmem_copy(compute_copy_atom, fragment_compute(_,_,_,0,0)); + auto thr_reg2tmem_tiled_copy = reg2tmem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2tmem_tiled_copy.partition_S(tensor_input2x); + auto partitioned_tensor_compute = thr_reg2tmem_tiled_copy.partition_D(fragment_compute); + return cute::make_tuple(reg2tmem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + else { + // If the operand comes from SMEM, create SMEM copy. + auto tensor_compute_ind_sw = as_position_independent_swizzle_tensor(tensor_compute); + auto reg2smem_tiled_copy = make_cotiled_copy(compute_copy_atom, Layout, Stride< _4,_1>>{}, + take<0,3>(tensor_compute.layout())); + + // Source copy is based on the source operand of copy. + auto thr_reg2smem_tiled_copy = reg2smem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2smem_tiled_copy.partition_S(tensor_input); + auto partitioned_tensor_compute = thr_reg2smem_tiled_copy.partition_D(tensor_compute_ind_sw); + + return cute::make_tuple(AutoVectorizingCopy{}, partitioned_tensor_input, partitioned_tensor_compute); + } + }; + + auto [dst_copy_A, tAsA, tAsACompute] = + setup_copy_ops(sA, InputCopyAtomA{}, sACompute, [&](auto &arg) {return TiledMma::make_fragment_A(arg);}, ComputeCopyAtomA{}); + + auto [dst_copy_B, tBsB, tBsBCompute] = + setup_copy_ops(sB, InputCopyAtomB{}, sBCompute, [&](auto &arg) {return TiledMma::make_fragment_B(arg);}, ComputeCopyAtomB{}); + return cute::make_tuple(gA_mkl, dst_copy_A, tAsA, tAsACompute, + gB_nkl, tBsB, tBsBCompute); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class FrgEngine, class FrgLayout, + class TensorA, class TensorB + > + CUTLASS_DEVICE auto + mma( + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_consumer_state, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_producer_state, + cute::Tensor const& accumulators, + cute::tuple const& input_operands, + int k_tile_count + ) { + TiledMma tiled_mma; + + auto curr_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + auto next_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + uint32_t skip_wait = (k_tile_count <= 0); + auto transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + ++next_transform2mma_pipeline_consumer_state; + + // tCrA : (MMA), MMA_M, MMA_K, NumComputeMtxs, SmemStage (In SMEM or TMEM) + // We use SMEM stages to match #buffers in Load <-> Convert + // tCrB : (MMA), MMA_N, MMA_K, NumComputeMtxs, SmemStages (In SMEM) + auto const [tCrA, tCrB] = input_operands; + + using ZeroScaler = cute::integral_constant; + using Scaler = cute::integral_constant; + + int remaining_accum_promotions = k_tile_count * StagesPerTile; + uint32_t mma2accum_skip_wait = (remaining_accum_promotions <= 0); + auto mma2accum_flag = mma2accum_pipeline.producer_try_acquire(mma2accum_pipeline_producer_state, mma2accum_skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + transform2mma_pipeline.consumer_wait(curr_transform2mma_pipeline_consumer_state, transform2mma_flag); + + int transform2mma_pipeline_consumer_state_index = curr_transform2mma_pipeline_consumer_state.index(); + + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tCrA); k_block += DispatchPolicy::AccPromotionInterval, --remaining_accum_promotions) { + // Accum stages are organized as (C_real | C_imag | C_real | C_imag | ...) + CUTLASS_PRAGMA_UNROLL + for (int re_im = 0; re_im < 2; ++re_im) { + mma2accum_pipeline.producer_acquire(mma2accum_pipeline_producer_state, mma2accum_flag); + + int mma2accum_pipeline_producer_state_index = mma2accum_pipeline_producer_state.index(); + auto tCtC = accumulators(_,_,_,mma2accum_pipeline_producer_state_index); + auto curr_mma2accum_pipeline_producer_state = mma2accum_pipeline_producer_state; + + ++mma2accum_pipeline_producer_state; + mma2accum_skip_wait = (remaining_accum_promotions <= 1) && (re_im == 1); + mma2accum_flag = mma2accum_pipeline.producer_try_acquire(mma2accum_pipeline_producer_state, mma2accum_skip_wait); + + auto tCrA0 = tCrA(_,_,_,0,transform2mma_pipeline_consumer_state_index); + auto tCrA1 = tCrA(_,_,_,1,transform2mma_pipeline_consumer_state_index); + auto tCrA2 = tCrA(_,_,_,2,transform2mma_pipeline_consumer_state_index); + + auto tCrB0 = tCrB(_,_,_,re_im,0,transform2mma_pipeline_consumer_state_index); + auto tCrB1 = tCrB(_,_,_,re_im,1,transform2mma_pipeline_consumer_state_index); + auto tCrB2 = tCrB(_,_,_,re_im,2,transform2mma_pipeline_consumer_state_index); + + // MMA instructions Emulation + auto accumulate = UMMA::ScaleOut::Zero; + // First set of GEMMs that we need to perform for each band are unrolled to set compile-time constant + // scaling parameter. Scaled GEMM operations are only needed for the first MMA operation of each band. + + // Band 5 + if constexpr (NumBandsToCompute == 5) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[2]*B[2] + accumulate = UMMA::ScaleOut::One; + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[2]*B[2] + } + } + // Band 4 + if constexpr (NumBandsToCompute >= 4) { + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA1(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[1]*B[2] + accumulate = UMMA::ScaleOut::One; + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[2]*B[1] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[1]*B[2] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[2]*B[1] + } + } + // Band 3 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB2(_,_,k_block), tCtC); // A[2]*B[0] + accumulate = UMMA::ScaleOut::One; + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[1]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[0]*B[2] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB2(_,_,k_block+s), tCtC); // A[2]*B[0] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[1]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA2(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[0]*B[2] + } + // Band 2 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB1(_,_,k_block), tCtC); // A[0]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[1]*B[0] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB1(_,_,k_block+s), tCtC); // A[0]*B[1] + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA1(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[1]*B[0] + } + // Band 1 + cute::gemm(tiled_mma.with(accumulate, Scaler{}), tCrA0(_,_,k_block), tCrB0(_,_,k_block), tCtC); // A[0]*B[0] + CUTLASS_PRAGMA_UNROLL + for (int s = 1; s < DispatchPolicy::AccPromotionInterval; s++) { + cute::gemm(tiled_mma.with(accumulate, ZeroScaler{}), tCrA0(_,_,k_block+s), tCrB0(_,_,k_block+s), tCtC); // A[0]*B[0] + } + mma2accum_pipeline.producer_commit(curr_mma2accum_pipeline_producer_state); + } + } + + transform2mma_pipeline.consumer_release(curr_transform2mma_pipeline_consumer_state); + + skip_wait = (k_tile_count <= 1); + transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + + curr_transform2mma_pipeline_consumer_state = next_transform2mma_pipeline_consumer_state; + ++next_transform2mma_pipeline_consumer_state; + } + return cute::make_tuple(curr_transform2mma_pipeline_consumer_state, mma2accum_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + mma_init(cute::Tensor const& accumulators, TensorStorage& shared_storage) const { + TiledMma tiled_mma; + + Tensor tCrA = [&] () constexpr { + if constexpr (cute::is_base_of::value) { + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + return tiled_mma.make_fragment_A(sACompute); + } + else { + auto tCrA = tiled_mma.make_fragment_A(shape(SmemLayoutACompute{})); + tCrA.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + return tCrA; + } + } (); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + Tensor tCrB = tiled_mma.make_fragment_B(sBCompute); + return cute::make_tuple(tCrA, tCrB); + } + + template + CUTLASS_DEVICE auto + accum_init(cute::Tensor const& accumulators, TmemCopyAtom tmem_cp_atom, EpilogueTile epilogue_tile) { + // Obtain a single accumulator + Tensor tAcc = tensor<0>(accumulators(_,_,_,_0{})); + // Apply epilogue subtiling + Tensor tAcc_epi = flat_divide(tAcc, EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N) + // Create the TMEM copy for single EpilogueTile. + // Note that EpilogueTile = CtaTile for NoSmem epilogue + auto tiled_t2r = make_tmem_copy(tmem_cp_atom, tAcc_epi(_,_,_0{},_0{})); + auto thread_t2r = tiled_t2r.get_slice(threadIdx.x % size(tiled_t2r)); + Tensor tTR_gC = thread_t2r.partition_D(tAcc_epi); + Tensor tTR_rAcc = make_tensor(shape(tTR_gC)); // (T2R,T2R_M,T2R_N) + Tensor tTR_rGlobAcc = make_tensor(shape(tTR_gC)); // (T2R,T2R_M,T2R_N) + + // Apply epilogue subtiling to bulk accumulator + // We need to tile the whole bulk_tmem allocation with EpilogueTile. + // The accumulation should be aware of the AccumulatorPipelineStages + Tensor tBulkAcc_epi = flat_divide(accumulators(make_coord(_,_),_0{},_0{},_), EpilogueTile{}); // (EPI_TILE_M,EPI_TILE_N,EPI_M,EPI_N,PIPE) + Tensor tTR_tBulkAcc = thread_t2r.partition_S(tBulkAcc_epi); // (T2R,T2R_M,T2R_N,EPI_M,EPI_N,PIPE) + return cute::make_tuple(tiled_t2r, thread_t2r, tTR_tBulkAcc, tTR_rAcc, tTR_rGlobAcc); + } + + template + CUTLASS_DEVICE auto + accum(cute::tuple accum_inputs, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_consumer_state, + int k_tile_count) { + auto [tiled_t2r, thread_t2r, tTR_tBulkAcc, + tTR_rAcc, tTR_rGlobAcc] = accum_inputs; + + Tensor tTR_rAcc_float2 = recast>(tTR_rAcc); // (T2R/2,T2R_M,T2R_N) + Tensor tTR_rGlobAcc_float2_x2 = recast,2>>(tTR_rGlobAcc);// (T2R/2,T2R_M,T2R_N) + + // Clear the global accumulator + CUTE_UNROLL + for (int i = 0; i 0; --k_tile_count) { + // The stage is limited to a CTA tile + CUTLASS_PRAGMA_NO_UNROLL + for (int k_block = 0; k_block cute::remove_cvref_t {return {cutlass::plus>{}(f2_x2[0], r2), f2_x2[1]};}); + } + else { + cute::transform(tTR_rGlobAcc_float2_x2, tTR_rAcc_float2, tTR_rGlobAcc_float2_x2, + [&] (auto& f2_x2, auto& i2) -> cute::remove_cvref_t {return {f2_x2[0], cutlass::plus>{}(f2_x2[1], i2)};}); + } + + cutlass::arch::fence_view_async_tmem_load(); // Need a fence bw TMEM_LOAD and arrive + mma2accum_pipeline.consumer_release(mma2accum_pipeline_consumer_state); + + ++mma2accum_pipeline_consumer_state; + skip_wait = ((k_tile_count <= 1) && (k_block >= (StagesPerTile-1))) && (re_im == 1); + mma2accum_flag = mma2accum_pipeline.consumer_try_wait(mma2accum_pipeline_consumer_state, skip_wait); + } + } + } + + // Interleave back (real_x2 | imag_x2) to (real | imag | real | imag) + cute::transform(tTR_rGlobAcc_float2_x2, tTR_rGlobAcc_float2_x2, [&] (auto& f2_x2) -> cute::remove_cvref_t { + Array c0{f2_x2[0][0], f2_x2[1][0]}; + Array c1{f2_x2[0][1], f2_x2[1][1]}; + return {c0, c1}; + }); + + return cute::make_tuple(mma2accum_pipeline_consumer_state, tTR_rGlobAcc); + } + +protected: + + template + CUTLASS_DEVICE + constexpr auto + tile_input_tensors(Params const& params, ProblemShape_MNKL const& problem_shape_MNKL) const { + using X = cute::Underscore; + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + + // Represent the full tensors -- get these from TMA + Tensor mA_mkl = observed_tma_load_a_->get_tma_tensor(make_shape(M,K,L)); + Tensor mB_nkl = observed_tma_load_b_->get_tma_tensor(make_shape(N,K,L)); + + // Tile the tensors and defer the slice + Tensor gA_mkl = local_tile(mA_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); + Tensor gB_nkl = local_tile(mB_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); + + return cute::make_tuple(gA_mkl, gB_nkl); + } + + typename Params::TMA_A const* observed_tma_load_a_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_ = nullptr; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_tf32.hpp b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_tf32.hpp new file mode 100644 index 00000000..1dc7b02c --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_interleaved_complex_tf32.hpp @@ -0,0 +1,875 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +#pragma once +#include + +#include "cutlass/cutlass.h" +#include "cutlass/detail/cluster.hpp" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/numeric_conversion.h" +#include "cutlass/detail/sm100_tmem_helper.hpp" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/atom/copy_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/arch/mma_sm100.hpp" +#include "cutlass/trace.h" +#include "cutlass/kernel_hardware_info.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +namespace detail { +template +struct Sm100CollectiveMmaComplexLayoutAtomType { + using InputLayoutAtom = InputLayoutAtom_; + using ComputeLayoutAtom = ComputeLayoutAtom_; +}; + +template +struct Sm100CollectiveMmaComplexCopyType { + using InputCopyAtom = InputCopyAtom_; + using ComputeCopyAtom = ComputeCopyAtom_; +}; +} // namespace detail + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop for complex kernels +template < + int ComputationPipelineStageCount_, + int SchedulerPipelineStageCount_, + int AccumulatorPipelineStageCount_, + int TransformationPipelineStageCount_, + class AccumulatorCopyAtom_, + class ClusterShape, // Static cluster shape or dynamic (int, int, _1) + class TileShape_, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + class StrideA_, + class StrideB_, + class TiledMma_, + class GmemTiledCopyA_, + class SmemLayoutAtomsA_, + class CopyAtomsA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomsB_, + class CopyAtomsB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100TmaUmmaWarpSpecializedInterleavedComplexTF32< + ComputationPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + TransformationPipelineStageCount_, + ClusterShape, + AccumulatorCopyAtom_>, + TileShape_, + complex, + StrideA_, + complex, + StrideB_, + TiledMma_, + GmemTiledCopyA_, + SmemLayoutAtomsA_, + CopyAtomsA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomsB_, + CopyAtomsB_, + TransformB_> +{ + // + // Type Aliases + // + using TileShape = TileShape_; + using TiledMma = TiledMma_; + + // ElementA and ElementB are cutlass::complex, which are used as GMEM input and output data type. + using ElementA = complex; + using StrideA = StrideA_; + using ElementB = complex; + using StrideB = StrideB_; + +private: + // ElementAMma and ElementBMma are cutlass::complex, which are used as SMEM and RF data type. + // ElementAMmaRaw and ElementBMmaRaw are cutlass::tfloat32_t, which is the real internal data type set in TMA descriptor and used in TCGEN05 calculation. + using ElementAMma = typename TiledMma::ValTypeA; // complex + using ElementAMmaRaw = typename ElementAMma::value_type; // tfloat32_t + using ElementBMma = typename TiledMma::ValTypeB; // complex + using ElementBMmaRaw = typename ElementBMma::value_type; // tfloat32_t + +public: + // For a complex kernel, the MMA output type is real valued, but ElementAccumulator is a complex type for the GETT reference kernel + using ElementAccumulator = cutlass::complex; + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomsA = SmemLayoutAtomsA_; + using SmemLayoutAtomsB = SmemLayoutAtomsB_; + using CopyAtomsA = CopyAtomsA_; + using CopyAtomsB = CopyAtomsB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + + // Determine MMA type: MMA_1SM vs MMA_2SM + using AtomThrShapeMNK = Shape(typename TiledMma_::ThrLayoutVMNK{})), _1, _1>; + using DispatchPolicy = MainloopSm100TmaUmmaWarpSpecializedInterleavedComplexTF32< + ComputationPipelineStageCount_, + SchedulerPipelineStageCount_, + AccumulatorPipelineStageCount_, + TransformationPipelineStageCount_, + ClusterShape, + AccumulatorCopyAtom_>; + static constexpr bool IsDynamicCluster = not cute::is_static_v; + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using CtaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using CtaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + using ArchTag = typename DispatchPolicy::ArchTag; + + using Load2TransformPipeline = cutlass::PipelineTmaTransformAsync< + DispatchPolicy::ComputationPipelineStageCount, + AtomThrShapeMNK>; + using Load2TransformPipelineState = typename Load2TransformPipeline::PipelineState; + + using Transform2MmaPipeline = cutlass::PipelineUmmaConsumerAsync< + DispatchPolicy::TransformationPipelineStageCount, + AtomThrShapeMNK>; + using Transform2MmaPipelineState = typename Transform2MmaPipeline::PipelineState; + + using Mma2AccumPipeline = cutlass::PipelineUmmaAsync< + DispatchPolicy::Schedule::AccumulatorPipelineStageCount, + AtomThrShapeMNK>; + using Mma2AccumPipelineState = typename Mma2AccumPipeline::PipelineState; + + // Thread Counts + static constexpr uint32_t NumTransformationThreads = 128; + static constexpr uint32_t NumAccumThreads = 128; + + // Get the Algorithm parameters + constexpr static int NumComputeMtxs = 2; + constexpr static int AccumulatorPipelineStageCount = DispatchPolicy::Schedule::AccumulatorPipelineStageCount; + constexpr static int StagesPerTile = size<2>(CtaShapeA_MK{}); + + // Copy atom for Accumulator + using AccumulatorCopyAtom = typename DispatchPolicy::AccumulatorCopyAtom; + + using SmemLayoutAtomA = typename SmemLayoutAtomsA::InputLayoutAtom; + using SmemLayoutAtomACompute = typename SmemLayoutAtomsA::ComputeLayoutAtom; + using SmemLayoutAtomB = typename SmemLayoutAtomsB::InputLayoutAtom; + using SmemLayoutAtomBCompute = typename SmemLayoutAtomsB::ComputeLayoutAtom; + + using InputCopyAtomA = typename CopyAtomsA::InputCopyAtom; + using ComputeCopyAtomA = typename CopyAtomsA::ComputeCopyAtom; + using InputCopyAtomB = typename CopyAtomsB::InputCopyAtom; + using ComputeCopyAtomB = typename CopyAtomsB::ComputeCopyAtom; + + static_assert(((size<0,0>(CtaShapeA_MK{}) * size<1>(CtaShapeA_MK{})) % size<0>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeA_MK{}) * size<2>(CtaShapeA_MK{})) % size<1>(SmemLayoutAtomACompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + + static_assert(((size<0,0>(CtaShapeB_NK{}) * size<1>(CtaShapeB_NK{})) % size<0>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(CtaShapeB_NK{}) * size<2>(CtaShapeB_NK{})) % size<1>(SmemLayoutAtomBCompute{})) == 0, "SmemLayoutAtom must evenly divide tile shape."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(CtaShapeA_MK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutACompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomACompute{}, + append(append(CtaShapeA_MK{}, Int{}), Int{}))); + + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(CtaShapeB_NK{}, Int{}), + (cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{}))); + + using SmemLayoutBCompute = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomBCompute{}, + append(CtaShapeB_NK{}, Int{}))); + + static_assert(DispatchPolicy::ComputationPipelineStageCount >= 2, "Specialization requires Stages set to value 2 or more."); + static_assert(DispatchPolicy::TransformationPipelineStageCount >= 2, "Specialization requires Stages set to value 2 or more."); + static_assert(cute::is_base_of::value && + cute::is_base_of::value, + "MMA atom must have A operand from TMEM and B operand from SMEM for this mainloop."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyA - invalid TMA copy atom specified."); + static_assert((cute::is_same_v || cute::is_same_v), + "GmemTiledCopyB - invalid TMA copy atom specified."); + + struct PipelineStorage { + using Load2TransformPipelineStorage = typename Load2TransformPipeline::SharedStorage; + alignas(16) Load2TransformPipelineStorage load2transform_pipeline; + using Transform2MmaPipelineStorage = typename Transform2MmaPipeline::SharedStorage; + alignas(16) Transform2MmaPipelineStorage transform2mma_pipeline; + using Mma2AccumPipelineStorage = typename Mma2AccumPipeline::SharedStorage; + alignas(16) Mma2AccumPipelineStorage mma2accum_pipeline; + }; + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + struct TensorStorageUntransformed { + cute::ArrayEngine> smem_A; + cute::ArrayEngine> smem_B; + } input; + + union TensorStorageTransformed { + alignas(1024) cute::ArrayEngine smem_ACompute; // smem_ACompute is actually in tmem + alignas(1024) cute::ArrayEngine> smem_BCompute; + } compute; + } tensors; + + PipelineStorage pipeline; + }; + using TensorStorage = typename SharedStorage::TensorStorage; + + // Different from other GEMM kernels, both CTAs should be aware of loads. Both CTAs will work on + // loaded input A and B matrices to convert the data type + static constexpr uint32_t TmaTransactionBytes = + (size<0>(SmemLayoutA{}) * size<1>(SmemLayoutA{}) * size<2>(SmemLayoutA{}) * static_cast(sizeof(ElementAMma))) + + (size<0>(SmemLayoutB{}) * size<1>(SmemLayoutB{}) * size<2>(SmemLayoutB{}) * static_cast(sizeof(ElementBMma))); + + // Host side kernel arguments + struct Arguments { + ElementA const* ptr_A{nullptr}; + StrideA dA{}; + ElementB const* ptr_B{nullptr}; + StrideB dB{}; + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), + make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + TMA_A tma_load_a; + TMA_B tma_load_b; + TMA_A tma_load_a_fallback; + TMA_B tma_load_b_fallback; + dim3 cluster_shape_fallback; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_ = is_fallback_cluster ? ¶ms.tma_load_a_fallback : ¶ms.tma_load_a; + observed_tma_load_b_ = is_fallback_cluster ? ¶ms.tma_load_b_fallback : ¶ms.tma_load_b; + } + else { + observed_tma_load_a_ = ¶ms.tma_load_a; + observed_tma_load_b_ = ¶ms.tma_load_b; + } + } + + template + static constexpr Params + to_underlying_arguments(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + (void) workspace; + + // Optionally append 1s until problem shape is rank-4 (MNKL), in case it is only rank-3 (MNK) + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + Tensor tensor_a = make_tensor(args.ptr_A, make_layout(make_shape(M,K,L), args.dA)); + Tensor tensor_b = make_tensor(args.ptr_B, make_layout(make_shape(N,K,L), args.dB)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape_fallback); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a, + tma_load_b, + tma_load_a_fallback, + tma_load_b_fallback, + hw_info.cluster_shape_fallback + }; + } + + template + static bool + can_implement( + ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + constexpr int tma_alignment_bits = 128; + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = tma_alignment_bits / cutlass::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE static void + prefetch_tma_descriptors(Params const& params) { + if constexpr (IsDynamicCluster) { + dim3 cs = cute::cluster_shape(); + const bool is_fallback_cluster = (cs.x == params.cluster_shape_fallback.x && cs.y == params.cluster_shape_fallback.y); + if (is_fallback_cluster) { + cute::prefetch_tma_descriptor(params.tma_load_a_fallback.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b_fallback.get_tma_descriptor()); + } + else { + cute::prefetch_tma_descriptor(params.tma_load_a.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + } + } + else { + cute::prefetch_tma_descriptor(params.tma_load_a.get_tma_descriptor()); + cute::prefetch_tma_descriptor(params.tma_load_b.get_tma_descriptor()); + } + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE auto + partition_accumulator_shape() { + return append( + partition_shape_C(TiledMma{}, take<0,2>(TileShape{})), + Int<2>{}); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,TMEM_PIPE,2) + } + + /// Produce the inputs to the transform threads by loading inputs from gmem -> smem + template < + class GTensorA, class GTensorB, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE cute::tuple + load( + Params const& params, + Load2TransformPipeline pipeline, + Load2TransformPipelineState load2xform_pipeline_state, + cute::tuple const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count) { + + auto [unused_gA, unused_gB, + tAgA_mkl, tBgB_nkl, tAsA, tBsB, + mcast_mask_a, mcast_mask_b] = load_inputs; + + // slice out the work coord from tiled tensors + Tensor tAgA = tAgA_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tBgB = tBgB_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + uint32_t skip_wait = (k_tile_count <= 0); + auto pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + // LOCK mainloop_load2xform_pipeline_state for _writing_ + pipeline.producer_acquire(load2xform_pipeline_state, pipeline_flag); + int write_stage = load2xform_pipeline_state.index(); + + using BarrierType = typename Load2TransformPipeline::ProducerBarrierType; + BarrierType* tma_barrier = pipeline.producer_get_barrier(load2xform_pipeline_state); + + // Advance mainloop_pipe + ++load2xform_pipeline_state; + skip_wait = (k_tile_count <= 1); + pipeline_flag = pipeline.producer_try_acquire(load2xform_pipeline_state, skip_wait); + + copy(observed_tma_load_a_->with(*tma_barrier, mcast_mask_a), tAgA(_,*k_tile_iter), tAsA(_,write_stage)); + copy(observed_tma_load_b_->with(*tma_barrier, mcast_mask_b), tBgB(_,*k_tile_iter), tBsB(_,write_stage)); + ++k_tile_iter; + } + return cute::make_tuple(load2xform_pipeline_state, k_tile_iter); + } + + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_mkl - The tiled tensor for input A + /// gB_nkl - The tiled tensor for input B + // Other inputs needed for load(): partitioned AB tensors for gmem and smem, and mcast masks + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + Params const& params, + TensorStorage& shared_storage) const { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_mkl = cta_mma.partition_A(gA_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgB_nkl = cta_mma.partition_B(gB_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sB = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_mkl, tAsA] = tma_partition(*observed_tma_load_a_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA), group_modes<0,3>(tCgA_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_nkl, tBsB] = tma_partition(*observed_tma_load_b_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB), group_modes<0,3>(tCgB_nkl)); + + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + return cute::make_tuple( + gA_mkl, gB_nkl, // for scheduler + tAgA_mkl, tBgB_nkl, tAsA, tBsB, // for input tensor values + mcast_mask_a, mcast_mask_b); // multicast masks + } + + template< + class KTileIterator, class Accumulator, + class GTensorA, class SrcCopyA, class DstCopyA, class SrcTensorA, class DstTensorA, + class GTensorB, class SrcCopyB, class DstCopyB, class SrcTensorB, class DstTensorB + > + CUTLASS_DEVICE auto + transform( + Load2TransformPipeline load2transform_pipeline, + Load2TransformPipelineState load2transform_pipeline_consumer_state, + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_producer_state, + Accumulator accumulators, + cute::tuple input_operands, + KTileIterator k_tile_iter, int k_tile_count) { + cutlass::arch::NamedBarrier transform_barrier(NumTransformationThreads, cutlass::arch::ReservedNamedBarriers::TransformBarrier); + + // tAsA : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tAtACompute : (Copy,#Copy),MMA_Rest,MMA_M_Rest,MMA_K_Rest, NumComputeMtxs, SmemStages (In TMEM) + // tBsB : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + // tBsBCompute : (Copy,#Copy),MMA_Rest,MMA_N_Rest,MMA_K_Rest, SmemStages (In SMEM) + auto [unused_tAgA, src_copy_A, dst_copy_A, tAsA, tAtACompute, + unused_tBgB, src_copy_B, dst_copy_B, tBsB, tBsBCompute] = input_operands; + + // Create the tensors in registers + auto tArA = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_conj = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tArA_swap = make_tensor(tAsA(_,_,_,_,0).shape()); + auto tBrB = make_tensor(tBsB(_,_,_,_,0).shape()); + + uint32_t skip_wait = (k_tile_count <= 0); + auto load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + auto transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + load2transform_pipeline.consumer_wait(load2transform_pipeline_consumer_state, load2transform_flag); + transform2mma_pipeline.producer_acquire(transform2mma_pipeline_producer_state, transform2mma_flag); + + int load2transform_consumer_index = load2transform_pipeline_consumer_state.index(); + int transform2mma_producer_index = transform2mma_pipeline_producer_state.index(); + + auto curr_load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state; + auto curr_transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state; + + // Copy the input A matrix from SMEM + copy(src_copy_A, tAsA(_,_,_,_,load2transform_consumer_index), tArA); + // Copy the input B matrix from SMEM + copy(src_copy_B, tBsB(_,_,_,_,load2transform_consumer_index), tBrB); + + // First MMA, A.real * B.real - A.imag * B.imag + // Compose [real, -imag] copy for A TMEM + // Reflect the conjugation of B through A + if constexpr (cute::is_same_v) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_conj(i) = {tArA(i).real(), -tArA(i).imag()}; + } + } + else { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_conj(i) = tArA(i); + } + } + // Write to TMEM + copy(dst_copy_A, tArA_conj, tAtACompute(_,_,_,_,0,transform2mma_producer_index)); + + // Second MMA, A.imag * B.real + A.real * B.imag + // Compose [imag, real] copy for A TMEM + // Reflect the conjugation of B through A + auto transform_element = [] (ElementAMma const& tArA_i) -> ElementAMma { + if constexpr (cute::is_same_v && cute::is_same_v) { // CC + return {-tArA_i.imag(), -tArA_i.real()}; + } + else if constexpr (cute::is_same_v && not cute::is_same_v) { // CN/CT + return {-tArA_i.imag(), tArA_i.real()}; + } + else if constexpr (not cute::is_same_v && cute::is_same_v) { // NC/TC + return {tArA_i.imag(), -tArA_i.real()}; + } + else { // TN/NT/NN/TT + return {tArA_i.imag(), tArA_i.real()}; + } + }; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < size(tArA); i++) { + tArA_swap(i) = transform_element(tArA(i)); + } + + // Write to TMEM + copy(dst_copy_A, tArA_swap, tAtACompute(_,_,_,_,1,transform2mma_producer_index)); + + // Write the B matrix to SMEM without any changes + copy(dst_copy_B, tBrB, tBsBCompute(_,_,_,_,transform2mma_producer_index)); + + // Loads from SMEM are done. Signal the mainloop load as early as possible + transform_barrier.sync(); + load2transform_pipeline.consumer_release(curr_load2transform_pipeline_consumer_state); + + // fence for SMEM writes + cutlass::arch::fence_view_async_shared(); + if constexpr (is_tmem::value) { + // fence for TMEM writes if A operand is coming from TMEM + cutlass::arch::fence_view_async_tmem_store(); + } + + // Let the MMA know we are done transforming + transform2mma_pipeline.producer_commit(curr_transform2mma_pipeline_producer_state); + // Next pipeline stage + ++load2transform_pipeline_consumer_state; + ++transform2mma_pipeline_producer_state; + + skip_wait = (k_tile_count <= 1); + // Peek the next pipeline stage's barriers + load2transform_flag = load2transform_pipeline.consumer_try_wait(load2transform_pipeline_consumer_state, skip_wait); + transform2mma_flag = transform2mma_pipeline.producer_try_acquire(transform2mma_pipeline_producer_state, skip_wait); + } + return cute::make_tuple(load2transform_pipeline_consumer_state, transform2mma_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + transform_init( + Params const& params, + ProblemShape_MNKL const& problem_shape_MNKL, + Accumulator accumulators, + TensorStorage& shared_storage) { + auto [gA_mkl, gB_nkl] = tile_input_tensors(params, problem_shape_MNKL); + + Tensor sA_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_A.begin()), SmemLayoutA{}); + Tensor sA = as_position_independent_swizzle_tensor(sA_orig); + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + + Tensor sB_orig = make_tensor(make_smem_ptr(shared_storage.input.smem_B.begin()), SmemLayoutB{}); + Tensor sB = as_position_independent_swizzle_tensor(sB_orig); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + + // Map input, compute, and fragment tensors to + // Copy strategies and partitioned tensors. These will become the input + // operands of the transform function. Depending on MMA atom type, the + // operands can reside in SMEM or TMEM + auto setup_copy_ops = [&] (auto tensor_input, auto input_copy_atom, + auto tensor_compute, auto make_fragment, auto compute_copy_atom) constexpr { + auto fragment_compute = make_fragment(tensor_compute); + if constexpr (cute::is_tmem>::value) { + // For M=128 with 2CTA MMA atoms, the TMEM tensor for A has a duplicated allocation. + // Instead of allocation a 64x16 TMEM tensor, we have a 128x16 allocation + // See: TmemAllocMode::Duplicated. + Tensor tensor_input2x = [&] () constexpr { + if constexpr (decltype(size<0,0>(fragment_compute) == Int<128>{} && size<0,0>(tensor_input) == Int<64>{})::value) { + return make_tensor(tensor_input.data(), + logical_product(tensor_input.layout(), + make_tile(make_tile(Layout<_2,_0>{},_),_,_,_))); // ((128,16),m,k,PIPE) + } + else { + return tensor_input; + } + }(); + + fragment_compute.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + // If operand comes from TMEM, create the TMEM_STORE based copy + auto reg2tmem_tiled_copy = make_tmem_copy(compute_copy_atom, fragment_compute(_,_,_,0,0)); + auto thr_reg2tmem_tiled_copy = reg2tmem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2tmem_tiled_copy.partition_S(tensor_input2x); + auto partitioned_tensor_compute = thr_reg2tmem_tiled_copy.partition_D(fragment_compute); + // Source copy is based on the source operand of TMEM_STORE copy. + auto smem2reg_tiled_copy = make_tiled_copy_S(Copy_Atom, ElementAMma>{}, reg2tmem_tiled_copy); + return cute::make_tuple(smem2reg_tiled_copy, reg2tmem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + else { + // If the operand comes from SMEM, create SMEM copy. + auto tensor_compute_ind_sw = as_position_independent_swizzle_tensor(tensor_compute); + auto reg2smem_tiled_copy = make_cotiled_copy(compute_copy_atom, Layout, Stride< _8,_1>>{}, + tensor_compute(_,_,_,0).layout()); + + // Source copy is based on the source operand of copy. + auto smem2reg_tiled_copy = make_tiled_copy_S(input_copy_atom, reg2smem_tiled_copy); + auto thr_smem2reg_tiled_copy = smem2reg_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto thr_reg2smem_tiled_copy = reg2smem_tiled_copy.get_slice(threadIdx.x % NumTransformationThreads); + auto partitioned_tensor_input = thr_reg2smem_tiled_copy.partition_S(tensor_input); + auto partitioned_tensor_compute = thr_reg2smem_tiled_copy.partition_D(tensor_compute_ind_sw); + + return cute::make_tuple(smem2reg_tiled_copy, reg2smem_tiled_copy, partitioned_tensor_input, partitioned_tensor_compute); + } + }; + + auto [src_copy_A, dst_copy_A, tAsA, tAtACompute] = + setup_copy_ops(sA, InputCopyAtomA{}, sACompute, [&](auto &arg) {return TiledMma::make_fragment_A(arg);}, ComputeCopyAtomA{}); + + auto [src_copy_B, dst_copy_B, tBsB, tBsBCompute] = + setup_copy_ops(sB, InputCopyAtomB{}, sBCompute, [&](auto &arg) {return TiledMma::make_fragment_B(arg);}, ComputeCopyAtomB{}); + + return cute::make_tuple(gA_mkl, src_copy_A, dst_copy_A, tAsA, tAtACompute, + gB_nkl, src_copy_B, dst_copy_B, tBsB, tBsBCompute); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class FrgEngine, class FrgLayout, + class TensorA, class TensorB + > + CUTLASS_DEVICE auto + mma( + Transform2MmaPipeline transform2mma_pipeline, + Transform2MmaPipelineState transform2mma_pipeline_consumer_state, + Mma2AccumPipeline mma2accum_pipeline, + Mma2AccumPipelineState mma2accum_pipeline_producer_state, + cute::Tensor const& accumulators, + cute::tuple const& input_operands, + int k_tile_count + ) { + TiledMma tiled_mma; + + // tCrA : (MMA), MMA_M, MMA_K, NumComputeMtxs, SmemStage (In TMEM) + // We use SMEM stages to match #buffers in Load <-> Convert + // tCrB : (MMA), MMA_N, MMA_K, SmemStages (In SMEM) + auto const [tCrA, tCrB] = input_operands; + + auto curr_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + auto next_transform2mma_pipeline_consumer_state = transform2mma_pipeline_consumer_state; + uint32_t skip_wait = (k_tile_count <= 0); + auto transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + ++next_transform2mma_pipeline_consumer_state; + + mma2accum_pipeline.producer_acquire(mma2accum_pipeline_producer_state); + + constexpr int RealAccumIndex = 0; + constexpr int ImagAccumIndex = 1; + + int mma2accum_pipeline_producer_state_index = mma2accum_pipeline_producer_state.index(); + auto tCtC_real = accumulators(_,_,_,RealAccumIndex,mma2accum_pipeline_producer_state_index); + auto tCtC_imag = accumulators(_,_,_,ImagAccumIndex,mma2accum_pipeline_producer_state_index); + auto curr_mma2accum_pipeline_producer_state = mma2accum_pipeline_producer_state; + ++mma2accum_pipeline_producer_state; + + // + // PIPELINED MAIN LOOP + // + + tiled_mma.accumulate_ = UMMA::ScaleOut::Zero; + CUTLASS_PRAGMA_NO_UNROLL + for ( ; k_tile_count > 0; --k_tile_count) { + + transform2mma_pipeline.consumer_wait(curr_transform2mma_pipeline_consumer_state, transform2mma_flag); + + int transform2mma_pipeline_consumer_state_index = curr_transform2mma_pipeline_consumer_state.index(); + + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < StagesPerTile; ++k_block) { + + auto tCrA_conj = tCrA(_,_,_,Int<0>{},transform2mma_pipeline_consumer_state_index); + auto tCrA_swap = tCrA(_,_,_,Int<1>{},transform2mma_pipeline_consumer_state_index); + + auto tCrB0 = tCrB(_,_,_,transform2mma_pipeline_consumer_state_index); + + // A conjugate * B + cute::gemm(tiled_mma, tCrA_conj(_,_,k_block), tCrB0(_,_,k_block), tCtC_real); // A[0]*B[0] + // A swapped * B + cute::gemm(tiled_mma, tCrA_swap(_,_,k_block), tCrB0(_,_,k_block), tCtC_imag); // A[0]*B[0] + tiled_mma.accumulate_ = UMMA::ScaleOut::One; + } + + transform2mma_pipeline.consumer_release(curr_transform2mma_pipeline_consumer_state); + + skip_wait = (k_tile_count <= 1); + transform2mma_flag = transform2mma_pipeline.consumer_try_wait(next_transform2mma_pipeline_consumer_state, skip_wait); + + curr_transform2mma_pipeline_consumer_state = next_transform2mma_pipeline_consumer_state; + ++next_transform2mma_pipeline_consumer_state; + } + + mma2accum_pipeline.producer_commit(curr_mma2accum_pipeline_producer_state); + + return cute::make_tuple(curr_transform2mma_pipeline_consumer_state, mma2accum_pipeline_producer_state); + } + + template + CUTLASS_DEVICE auto + mma_init(cute::Tensor const& accumulators, TensorStorage& shared_storage) const { + TiledMma tiled_mma; + + Tensor tCrA = [&] () constexpr { + if constexpr (cute::is_base_of::value) { + Tensor sACompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_ACompute.begin()), SmemLayoutACompute{}); + return tiled_mma.make_fragment_A(sACompute); + } + else { + auto tCrA = tiled_mma.make_fragment_A(shape(SmemLayoutACompute{})); + tCrA.data() = accumulators.data().get() + cutlass::detail::find_tmem_tensor_col_offset(accumulators); + return tCrA; + } + } (); + Tensor sBCompute = make_tensor(make_smem_ptr(shared_storage.compute.smem_BCompute.begin()), SmemLayoutBCompute{}); + Tensor tCrB = tiled_mma.make_fragment_B(sBCompute); + return cute::make_tuple(tCrA, tCrB); + } + + template + CUTLASS_DEVICE auto + accum_init(cute::Tensor const& accumulators, TmemCopyAtom, EpilogueTile) { + return accumulators; + } + +protected: + + template + CUTLASS_DEVICE + constexpr auto + tile_input_tensors(Params const& params, ProblemShape_MNKL const& problem_shape_MNKL) const { + using X = cute::Underscore; + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + + // Represent the full tensors -- get these from TMA + Tensor mA_mkl = observed_tma_load_a_->get_tma_tensor(make_shape(M,K,L)); + Tensor mB_nkl = observed_tma_load_b_->get_tma_tensor(make_shape(N,K,L)); + + // Tile the tensors and defer the slice + Tensor gA_mkl = local_tile(mA_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M, BLK_K, m, k, l) + Tensor gB_nkl = local_tile(mB_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + + return cute::make_tuple(gA_mkl, gB_nkl); + } + + typename Params::TMA_A const* observed_tma_load_a_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_ = nullptr; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm100_mma_warpspecialized_planar_complex.hpp b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_planar_complex.hpp new file mode 100644 index 00000000..3d9c11e4 --- /dev/null +++ b/include/cutlass/gemm/collective/sm100_mma_warpspecialized_planar_complex.hpp @@ -0,0 +1,829 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/detail/cluster.hpp" +#include "cutlass/gemm/dispatch_policy.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/pipeline/pipeline.hpp" +#include "cutlass/gemm/gemm.h" +#include "cutlass/trace.h" + +#include "cute/algorithm/functional.hpp" +#include "cute/arch/cluster_sm90.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cute/algorithm/gemm.hpp" +#include "cute/numeric/arithmetic_tuple.hpp" +#include "cutlass/kernel_hardware_info.hpp" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass::gemm::collective { +using namespace cute; + +namespace detail { +template +struct Sm100CollectiveMmaPlanarComplexTiledMmaType { + using TiledMmaAPosAtom = TiledMmaAPos_; + using TiledMmaANegAtom = TiledMmaANeg_; +}; + +} // namespace detail + +///////////////////////////////////////////////////////////////////////////////////////////////// + +// WarpSpecialized Mainloop +// Both DMA Load and MMA methods of this class must be run by a single thread that's picked by elect_one +template < + int Stages, + int SchedulerPipelineStageCount, + int AccumulatorPipelineStageCount, + class ClusterShape, + class TileShape_, // Static cluster shape or dynamic (int, int, _1) + class ElementA_, // (MmaAtomShapeM, MmaAtomShapeN, TileK) + class StrideA_, + class ElementB_, + class StrideB_, + class TiledMmaPair_, + class GmemTiledCopyA_, + class SmemLayoutAtomA_, + class SmemCopyAtomA_, + class TransformA_, + class GmemTiledCopyB_, + class SmemLayoutAtomB_, + class SmemCopyAtomB_, + class TransformB_> +struct CollectiveMma< + MainloopSm100TmaUmmaWarpSpecializedPlanarComplex< + Stages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + ClusterShape>, + TileShape_, + ElementA_, + StrideA_, + ElementB_, + StrideB_, + TiledMmaPair_, + GmemTiledCopyA_, + SmemLayoutAtomA_, + SmemCopyAtomA_, + TransformA_, + GmemTiledCopyB_, + SmemLayoutAtomB_, + SmemCopyAtomB_, + TransformB_> +{ + // + // Type Aliases + // + + // Determine MMA type: MMA_1SM vs MMA_2SM + using TiledMmaPair = TiledMmaPair_; + using TiledMma = typename TiledMmaPair::TiledMmaAPosAtom; + using TiledMmaANeg = typename TiledMmaPair::TiledMmaANegAtom; + using AtomThrShapeMNK = Shape(typename TiledMma::ThrLayoutVMNK{})), _1, _1>; + + static constexpr bool IsDynamicCluster = not cute::is_static_v; + + using DispatchPolicy = MainloopSm100TmaUmmaWarpSpecializedPlanarComplex< + Stages, + SchedulerPipelineStageCount, + AccumulatorPipelineStageCount, + ClusterShape>; + using TileShape = TileShape_; + + CUTE_STATIC_ASSERT_V(evenly_divides(TileShape{}, tile_shape(TiledMma{})), + "Static cluster shape used: TileShape should be evenly divided by TiledMma"); + + using CtaShape_MNK = decltype(shape_div(TileShape{}, AtomThrShapeMNK{})); + + // Define A and B block shapes for reduced size TMA_LOADs + using MmaShapeA_MK = decltype(partition_shape_A(TiledMma{}, make_shape(size<0>(TileShape{}), size<2>(TileShape{})))); + using MmaShapeB_NK = decltype(partition_shape_B(TiledMma{}, make_shape(size<1>(TileShape{}), size<2>(TileShape{})))); + + using ElementA = ElementA_; + using ElementAMma = typename TiledMma::ValTypeA; + using StrideA = StrideA_; + using ElementB = ElementB_; + using ElementBMma = typename TiledMma::ValTypeB; + using StrideB = StrideB_; + using ElementAccumulator = typename TiledMma::ValTypeC; + using GmemTiledCopyA = GmemTiledCopyA_; + using GmemTiledCopyB = GmemTiledCopyB_; + using SmemLayoutAtomA = SmemLayoutAtomA_; + using SmemLayoutAtomB = SmemLayoutAtomB_; + using SmemCopyAtomA = SmemCopyAtomA_; + using SmemCopyAtomB = SmemCopyAtomB_; + using TransformA = TransformA_; + using TransformB = TransformB_; + using ArchTag = typename DispatchPolicy::ArchTag; + + using MainloopPipeline = cutlass::PipelineTmaUmmaAsync< + DispatchPolicy::Stages, + ClusterShape, + AtomThrShapeMNK>; + using MainloopPipelineState = typename MainloopPipeline::PipelineState; + + static_assert(rank(SmemLayoutAtomA{}) == 2, "SmemLayoutAtomA must be rank 2 (M, K)"); + static_assert(((size<0,0>(MmaShapeA_MK{}) * size<1>(MmaShapeA_MK{})) % size<0>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(MmaShapeA_MK{}) * size<2>(MmaShapeA_MK{})) % size<1>(SmemLayoutAtomA{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(cute::is_void_v, + "SM100 UMMA cannot have a non-void copy atom for smem sourced instructions."); + + static_assert(rank(SmemLayoutAtomB{}) == 2, "SmemLayoutAtomB must be rank 2 (N, K)"); + static_assert(((size<0,0>(MmaShapeB_NK{}) * size<1>(MmaShapeB_NK{})) % size<0>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(((size<0,1>(MmaShapeB_NK{}) * size<2>(MmaShapeB_NK{})) % size<1>(SmemLayoutAtomB{})) == 0, + "SmemLayoutAtom must evenly divide tile shape."); + static_assert(cute::is_void_v, + "SM100 UMMA cannot have a non-void copy atom for smem sourced instructions."); + + // Tile along K mode first before tiling over MN. PIPE mode last as usual. + // This maximizes TMA boxes due to better smem-K vectorization, reducing total issued TMAs. + using SmemLayoutA = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomA{}, + append(MmaShapeA_MK{}, Int{}), + cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{})); + using SmemLayoutB = decltype(UMMA::tile_to_mma_shape( + SmemLayoutAtomB{}, + append(MmaShapeB_NK{}, Int{}), + cute::conditional_t(), Step<_2,_1,_3>, Step<_1,_2,_3>>{})); + + static_assert(DispatchPolicy::Stages >= 2, "Specialization requires Stages set to value 1 or more."); + static_assert(cute::is_base_of::value && + cute::is_base_of::value, + "MMA atom must source both A and B operand from smem_desc for this mainloop."); + static_assert( + (size(AtomThrShapeMNK{}) == 1 && + (cute::is_same_v || cute::is_same_v)) || + (size(AtomThrShapeMNK{}) == 2 && + (cute::is_same_v || cute::is_same_v)), + "GmemTiledCopy - invalid TMA copy atom specified."); + static_assert( + (size(AtomThrShapeMNK{}) == 1 && + (cute::is_same_v || cute::is_same_v)) || + (size(AtomThrShapeMNK{}) == 2 && + (cute::is_same_v || cute::is_same_v)), + "GmemTiledCopy - invalid TMA copy atom specified."); + + struct SharedStorage { + struct TensorStorage : cute::aligned_struct<128, _0> { + cute::ArrayEngine> smem_A_real; + cute::ArrayEngine> smem_A_imag; + cute::ArrayEngine> smem_B_real; + cute::ArrayEngine> smem_B_imag; + } tensors; + + using PipelineStorage = typename MainloopPipeline::SharedStorage; + PipelineStorage pipeline; + }; + + // Expose shared storage for tensors/pipelines separately to allow kernel layer to reorder them. + using TensorStorage = typename SharedStorage::TensorStorage; + using PipelineStorage = typename SharedStorage::PipelineStorage; + + // Only one thread issues the TMA and updates the barriers in a 2SM MMA, adjust bytes accordingly + static constexpr uint32_t TmaTransactionBytes = 2 * ( + cutlass::bits_to_bytes(size(AtomThrShapeMNK{}) * (cosize(take<0,3>(SmemLayoutA{})) * static_cast(cute::sizeof_bits::value))) + + cutlass::bits_to_bytes(size(AtomThrShapeMNK{}) * (cosize(take<0,3>(SmemLayoutB{})) * static_cast(cute::sizeof_bits::value)))); + + template + struct TmemStorage { + AccTensor accumulators; + }; + + // Host side kernel arguments + struct Arguments { + ElementA const* ptr_A_real{nullptr}; + StrideA dA_real{}; + ElementA const* ptr_A_imag{nullptr}; + StrideA dA_imag{}; + ElementB const* ptr_B_real{nullptr}; + StrideB dB_real{}; + ElementB const* ptr_B_imag{nullptr}; + StrideB dB_imag{}; + }; + + template< + class KTileCount, + class GTensorPartitionedA, class GTensorPartitionedB, + class STensorA, class STensorB + > + struct LoadParams { + // For scheduler + KTileCount k_tiles; + // for input tensor values + GTensorPartitionedA tAgA_real_mkl; + GTensorPartitionedA tAgA_imag_mkl; + GTensorPartitionedB tBgB_real_nkl; + GTensorPartitionedB tBgB_imag_nkl; + STensorA tAsA_real; + STensorA tAsA_imag; + STensorB tBsB_real; + STensorB tBsB_imag; + // for input tensor values + uint16_t mcast_mask_a; + uint16_t mcast_mask_b; + + CUTLASS_DEVICE + LoadParams ( + KTileCount k_tiles_, + GTensorPartitionedA tAgA_real_mkl_, GTensorPartitionedA tAgA_imag_mkl_, + GTensorPartitionedB tBgB_real_nkl_, GTensorPartitionedB tBgB_imag_nkl_, + STensorA tAsA_real_, STensorA tAsA_imag_, + STensorB tBsB_real_, STensorB tBsB_imag_, + uint16_t mcast_mask_a_, uint16_t mcast_mask_b_) + : k_tiles(k_tiles_) + , tAgA_real_mkl(tAgA_real_mkl_), tAgA_imag_mkl(tAgA_imag_mkl_) + , tBgB_real_nkl(tBgB_real_nkl_), tBgB_imag_nkl(tBgB_imag_nkl_) + , tAsA_real(tAsA_real_), tAsA_imag(tAsA_imag_) + , tBsB_real(tBsB_real_), tBsB_imag(tBsB_imag_) + , mcast_mask_a(mcast_mask_a_), mcast_mask_b(mcast_mask_b_) {} + }; + + template + struct MmaParams { + TiledMma tiled_mma_a_pos; + TiledMmaANeg tiled_mma_a_neg; + FragmentA tCrA_real; + FragmentA tCrA_imag; + FragmentB tCrB_real; + FragmentB tCrB_imag; + + CUTLASS_DEVICE + MmaParams ( + TiledMma tiled_mma_a_pos_, TiledMmaANeg tiled_mma_a_neg_, + FragmentA tCrA_real_, FragmentA tCrA_imag_, + FragmentB tCrB_real_, FragmentB tCrB_imag_) + : tiled_mma_a_pos(tiled_mma_a_pos_), tiled_mma_a_neg(tiled_mma_a_neg_) + , tCrA_real(tCrA_real_), tCrA_imag(tCrA_imag_) + , tCrB_real(tCrB_real_), tCrB_imag(tCrB_imag_) {} + }; + + // Device side kernel params + struct Params { + using ClusterLayout_VMNK = decltype(tiled_divide(make_layout(conditional_return(make_shape(uint32_t(0), uint32_t(0), Int<1>{}), ClusterShape{})), make_tile(typename TiledMma::AtomThrID{}))); + + using TMA_A = decltype(make_tma_atom_A_sm100( + GmemTiledCopyA{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideA{}, int32_t(0)), StrideA{}), + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + + using TMA_B = decltype(make_tma_atom_B_sm100( + GmemTiledCopyB{}, + make_tensor(recast_ptr(nullptr), repeat_like(StrideB{}, int32_t(0)), StrideB{}), + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + ClusterLayout_VMNK{}) + ); + + TMA_A tma_load_a_real; + TMA_A tma_load_a_imag; + TMA_B tma_load_b_real; + TMA_B tma_load_b_imag; + TMA_A tma_load_a_real_fallback; + TMA_A tma_load_a_imag_fallback; + TMA_B tma_load_b_real_fallback; + TMA_B tma_load_b_imag_fallback; + dim3 cluster_shape_fallback; + }; + + CUTLASS_DEVICE + CollectiveMma(Params const& params, ClusterShape cluster_shape, uint32_t block_rank_in_cluster) + : cluster_shape_(cluster_shape) + , block_rank_in_cluster_(block_rank_in_cluster) { + if constexpr (IsDynamicCluster) { + const bool is_fallback_cluster = (cute::size<0>(cluster_shape_) == params.cluster_shape_fallback.x && + cute::size<1>(cluster_shape_) == params.cluster_shape_fallback.y); + observed_tma_load_a_real_ = is_fallback_cluster ? ¶ms.tma_load_a_real_fallback : ¶ms.tma_load_a_real; + observed_tma_load_a_imag_ = is_fallback_cluster ? ¶ms.tma_load_a_imag_fallback : ¶ms.tma_load_a_imag; + observed_tma_load_b_real_ = is_fallback_cluster ? ¶ms.tma_load_b_real_fallback : ¶ms.tma_load_b_real; + observed_tma_load_b_imag_ = is_fallback_cluster ? ¶ms.tma_load_b_imag_fallback : ¶ms.tma_load_b_imag; + } + else { + observed_tma_load_a_real_ = ¶ms.tma_load_a_real; + observed_tma_load_a_imag_ = ¶ms.tma_load_a_imag; + observed_tma_load_b_real_ = ¶ms.tma_load_b_real; + observed_tma_load_b_imag_ = ¶ms.tma_load_b_imag; + } + } + + template + static constexpr Params + to_underlying_arguments(ProblemShape const& problem_shape, Arguments const& args, void* workspace, cutlass::KernelHardwareInfo const& hw_info = cutlass::KernelHardwareInfo{}) { + (void) workspace; + + // Optionally append 1s until problem shape is rank-4 (MNKL), in case it is only rank-3 (MNK) + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + auto ptr_A_real = recast_ptr(args.ptr_A_real); + auto ptr_A_imag = recast_ptr(args.ptr_A_imag); + + auto ptr_B_real = recast_ptr(args.ptr_B_real); + auto ptr_B_imag = recast_ptr(args.ptr_B_imag); + + Tensor tensor_a_real = make_tensor(ptr_A_real, make_layout(make_shape(M,K,L), args.dA_real)); + Tensor tensor_a_imag = make_tensor(ptr_A_imag, make_layout(make_shape(M,K,L), args.dA_imag)); + + Tensor tensor_b_real = make_tensor(ptr_B_real, make_layout(make_shape(N,K,L), args.dB_real)); + Tensor tensor_b_imag = make_tensor(ptr_B_imag, make_layout(make_shape(N,K,L), args.dB_imag)); + + auto cluster_shape = cutlass::detail::select_cluster_shape(ClusterShape{}, hw_info.cluster_shape); + // Cluster layout for TMA construction + auto cluster_layout_vmnk = tiled_divide(make_layout(cluster_shape), make_tile(typename TiledMma::AtomThrID{})); + + auto cluster_shape_fallback = conditional_return(make_shape(hw_info.cluster_shape_fallback.x, hw_info.cluster_shape_fallback.y, Int<1>{}), ClusterShape{}); + // Cluster layout for TMA construction + auto cluster_layout_vmnk_fallback = tiled_divide(make_layout(cluster_shape_fallback), make_tile(typename TiledMma::AtomThrID{})); + + typename Params::TMA_A tma_load_a_real = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_real, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_imag = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_imag, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b_real = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_real, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_B tma_load_b_imag = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_imag, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk); + + typename Params::TMA_A tma_load_a_real_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_real, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_A tma_load_a_imag_fallback = make_tma_atom_A_sm100( + GmemTiledCopyA{}, + tensor_a_imag, + SmemLayoutA{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_real_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_real, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + typename Params::TMA_B tma_load_b_imag_fallback = make_tma_atom_B_sm100( + GmemTiledCopyB{}, + tensor_b_imag, + SmemLayoutB{}(_,_,_,cute::Int<0>{}), + TileShape{}, + TiledMma{}, + cluster_layout_vmnk_fallback); + + return { + tma_load_a_real, + tma_load_a_imag, + tma_load_b_real, + tma_load_b_imag, + tma_load_a_real_fallback, + tma_load_a_imag_fallback, + tma_load_b_real_fallback, + tma_load_b_imag_fallback, + hw_info.cluster_shape_fallback + }; + } + + template + static bool + can_implement( + ProblemShape const& problem_shape, + [[maybe_unused]] Arguments const& args) { + auto problem_shape_MNKL = append<4>(problem_shape, 1); + auto [M,N,K,L] = problem_shape_MNKL; + + bool implementable = true; + constexpr int min_tma_aligned_elements_A = 128 / cute::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(M,K,L), StrideA{}); + constexpr int min_tma_aligned_elements_B = 128 / cute::sizeof_bits::value; + implementable = implementable && cutlass::detail::check_alignment(cute::make_shape(N,K,L), StrideB{}); + + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Problem Size doesn't meet the minimum alignment requirements for TMA.\n"); + } + return implementable; + } + + /// Issue Tma Descriptor Prefetch -- ideally from a single thread for best performance + CUTLASS_DEVICE void + prefetch_tma_descriptors() { + cute::prefetch_tma_descriptor(observed_tma_load_a_real_->get_tma_descriptor()); + cute::prefetch_tma_descriptor(observed_tma_load_a_imag_->get_tma_descriptor()); + cute::prefetch_tma_descriptor(observed_tma_load_b_real_->get_tma_descriptor()); + cute::prefetch_tma_descriptor(observed_tma_load_b_imag_->get_tma_descriptor()); + } + + /// Construct A Single Stage's Accumulator Shape + CUTLASS_DEVICE static + auto + partition_accumulator_shape() { + auto acc_shape = append( + partition_shape_C(TiledMma{}, take<0,2>(TileShape{})), + Int<2>{}); // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,TMEM_PIPE,2) + + return acc_shape; + } + + template + CUTLASS_DEVICE static + auto + slice_accumulator(TmemStorage tmem_storage, int stage) { + return cute::make_tuple(tmem_storage.accumulators(_,_,_,_,stage)); + } + + template + CUTLASS_DEVICE static + auto + init_tmem_tensors(EpilogueTile epi_tile) { + TiledMma tiled_mma; + auto acc_shape = partition_accumulator_shape(); + // ((MMA_TILE_M,MMA_TILE_N),MMA_M,MMA_N,ACC_PIPE) where ACC_PIPE=2 so we can double buffer our accumulators for mainloop and epilogue. + Tensor accumulators = cutlass::detail::make_sm100_accumulator( + tiled_mma, acc_shape, EpilogueTile{}); + + TmemStorage tmem_storage; + tmem_storage.accumulators = accumulators; + + return tmem_storage; + } + + template + CUTLASS_DEVICE static + void + set_tmem_offsets(TmemStorage& tmem_storage, uint32_t tmem_base_addr) { + tmem_storage.accumulators.data() = tmem_base_addr; + } + + /// Set up the data needed by this collective for load. + /// Returned tuple must contain at least two elements, with the first two elements being: + /// gA_(real/imag)_mkl - The tiled tma tensor for input A_(real/imag) + /// gB_(real/imag)_nkl - The tiled tma tensor for input B_(real/imag) + /// tAsA_(real/imag) - partitioned smem tensor for A_(real/imag) + /// tBsB_(real/imag) - partitioned smem tensor for B_(real/imag) + /// mcast_mask_a - tma multicast mask for A_(real/imag) + /// mcast_mask_b - tma multicast mask for B_(real/imag) + template + CUTLASS_DEVICE auto + load_init( + ProblemShape_MNKL const& problem_shape_MNKL, + TensorStorage& shared_tensors) const { + using X = Underscore; + + // Separate out problem shape for convenience + auto [M,N,K,L] = problem_shape_MNKL; + + // Represent the full tensors -- get these from TMA + Tensor mA_real_mkl = observed_tma_load_a_real_->get_tma_tensor(make_shape(M,K,L)); + Tensor mA_imag_mkl = observed_tma_load_a_imag_->get_tma_tensor(make_shape(M,K,L)); + Tensor mB_real_nkl = observed_tma_load_b_real_->get_tma_tensor(make_shape(N,K,L)); + Tensor mB_imag_nkl = observed_tma_load_b_imag_->get_tma_tensor(make_shape(N,K,L)); + + // Tile the tensors and defer the slice + Tensor gA_real_mkl = local_tile(mA_real_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_M, BLK_K, m, k, l) + Tensor gA_imag_mkl = local_tile(mA_imag_mkl, TileShape{}, make_coord(_,_,_), Step<_1, X,_1>{}); // (BLK_N, BLK_K, m, k, l) + + Tensor gB_real_nkl = local_tile(mB_real_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + Tensor gB_imag_nkl = local_tile(mB_imag_nkl, TileShape{}, make_coord(_,_,_), Step< X,_1,_1>{}); // (BLK_N, BLK_K, n, k, l) + + // Partition for this CTA + ThrMMA cta_mma = TiledMma{}.get_slice(blockIdx.x % size(typename TiledMma::AtomThrID{})); + + Tensor tCgA_real_mkl = cta_mma.partition_A(gA_real_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + Tensor tCgA_imag_mkl = cta_mma.partition_A(gA_imag_mkl); // (MMA, MMA_M, MMA_K, m, k, l) + + Tensor tCgB_real_nkl = cta_mma.partition_B(gB_real_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + Tensor tCgB_imag_nkl = cta_mma.partition_B(gB_imag_nkl); // (MMA, MMA_N, MMA_K, n, k, l) + + Tensor sA_real = make_tensor(make_smem_ptr(shared_tensors.smem_A_real.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + Tensor sA_imag = make_tensor(make_smem_ptr(shared_tensors.smem_A_imag.begin()), SmemLayoutA{}); // (MMA,MMA_M,MMA_K,PIPE) + + Tensor sB_real = make_tensor(make_smem_ptr(shared_tensors.smem_B_real.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + Tensor sB_imag = make_tensor(make_smem_ptr(shared_tensors.smem_B_imag.begin()), SmemLayoutB{}); // (MMA,MMA_N,MMA_K,PIPE) + + // Define the CTA-in-cluster Layout and Coord + Layout cta_layout_mnk = make_layout(cluster_shape_); + Layout cta_layout_vmnk = tiled_divide(cta_layout_mnk, make_tile(typename TiledMma::AtomThrID{})); + auto cta_coord_vmnk = cta_layout_vmnk.get_flat_coord(block_rank_in_cluster_); + + // Project the cta_layout for tma_a along the n-modes + auto [tAgA_real_mkl, tAsA_real] = tma_partition(*observed_tma_load_a_real_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA_real), group_modes<0,3>(tCgA_real_mkl)); + auto [tAgA_imag_mkl, tAsA_imag] = tma_partition(*observed_tma_load_a_imag_, + get<2>(cta_coord_vmnk), make_layout(size<2>(cta_layout_vmnk)), + group_modes<0,3>(sA_imag), group_modes<0,3>(tCgA_imag_mkl)); + + // Project the cta_layout for tma_b along the m-modes + auto [tBgB_real_nkl, tBsB_real] = tma_partition(*observed_tma_load_b_real_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB_real), group_modes<0,3>(tCgB_real_nkl)); + auto [tBgB_imag_nkl, tBsB_imag] = tma_partition(*observed_tma_load_b_imag_, + get<1>(cta_coord_vmnk), make_layout(size<1>(cta_layout_vmnk)), + group_modes<0,3>(sB_imag), group_modes<0,3>(tCgB_imag_nkl)); + // TMA Multicast Masks + uint16_t mcast_mask_a = create_tma_multicast_mask<2>(cta_layout_vmnk, cta_coord_vmnk); + uint16_t mcast_mask_b = create_tma_multicast_mask<1>(cta_layout_vmnk, cta_coord_vmnk); + + LoadParams load_params { + shape<3>(gA_real_mkl), // for scheduler + tAgA_real_mkl, tAgA_imag_mkl, tBgB_real_nkl, tBgB_imag_nkl, // for input tensor values + tAsA_real, tAsA_imag, tBsB_real, tBsB_imag, // for input tensor values + mcast_mask_a, mcast_mask_b + }; + return load_params; + } + + /// Set up the data needed by this collective for mma compute. + template + CUTLASS_DEVICE auto + mma_init( + [[maybe_unused]] TmemStorage tmem_storage, + TensorStorage& shared_tensors) const { + Tensor sA_real = make_tensor(make_smem_ptr(shared_tensors.smem_A_real.begin()), SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + Tensor sA_imag = make_tensor(make_smem_ptr(shared_tensors.smem_A_imag.begin()), SmemLayoutA{}); // (BLK_M,BLK_K,PIPE) + + Tensor sB_real = make_tensor(make_smem_ptr(shared_tensors.smem_B_real.begin()), SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + Tensor sB_imag = make_tensor(make_smem_ptr(shared_tensors.smem_B_imag.begin()), SmemLayoutB{}); // (BLK_N,BLK_K,PIPE) + + // Allocate "fragments/descriptors" for A and B matrices + Tensor tCrA_real = TiledMma::make_fragment_A(sA_real); // (MMA,MMA_M,MMA_K,PIPE) + Tensor tCrA_imag = TiledMma::make_fragment_A(sA_imag); // (MMA,MMA_M,MMA_K,PIPE) + + Tensor tCrB_real = TiledMma::make_fragment_B(sB_real); // (MMA,MMA_N,MMA_K,PIPE) + Tensor tCrB_imag = TiledMma::make_fragment_B(sB_imag); // (MMA,MMA_N,MMA_K,PIPE) + + CUTE_STATIC_ASSERT_V(Int{} == size<3>(sA_real)); // PIPE + CUTE_STATIC_ASSERT_V(Int{} == size<3>(sB_real)); // PIPE + + TiledMma tiled_mma_a_pos; + TiledMmaANeg tiled_mma_a_neg; + MmaParams mma_params { + tiled_mma_a_pos, tiled_mma_a_neg, + tCrA_real, tCrA_imag, + tCrB_real, tCrB_imag + }; + + return mma_params; + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Producer Perspective + template < + class LoadParams, + class TileCoordMNKL, + class KTileIterator + > + CUTLASS_DEVICE auto + load( + MainloopPipeline mainloop_pipeline, + MainloopPipelineState mainloop_pipe_producer_state, + LoadParams const& load_inputs, + TileCoordMNKL const& cta_coord_mnkl, + KTileIterator k_tile_iter, int k_tile_count) { + + auto [unused_k_tiles, + tAgA_real_mkl, tAgA_imag_mkl, tBgB_real_nkl, tBgB_imag_nkl, + tAsA_real, tAsA_imag, tBsB_real, tBsB_imag, + mcast_mask_a, mcast_mask_b] = load_inputs; + + // slice out the work coord from partitioned tensors + Tensor tAgA_real = tAgA_real_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + Tensor tAgA_imag = tAgA_imag_mkl(_, get<0>(cta_coord_mnkl) / size(typename TiledMma::AtomThrID{}), _, get<3>(cta_coord_mnkl)); + + Tensor tBgB_real = tBgB_real_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + Tensor tBgB_imag = tBgB_imag_nkl(_, get<1>(cta_coord_mnkl), _, get<3>(cta_coord_mnkl)); + + auto barrier_token = mainloop_pipeline.producer_try_acquire(mainloop_pipe_producer_state); + + // Issue the Mainloop loads + CUTLASS_PRAGMA_NO_UNROLL + while (k_tile_count > 0) { + // LOCK mainloop_pipe_producer_state for _writing_ + mainloop_pipeline.producer_acquire(mainloop_pipe_producer_state, barrier_token); + + using BarrierType = typename MainloopPipeline::ProducerBarrierType; + BarrierType* tma_barrier = mainloop_pipeline.producer_get_barrier(mainloop_pipe_producer_state); + + int write_stage = mainloop_pipe_producer_state.index(); + ++mainloop_pipe_producer_state; + barrier_token = mainloop_pipeline.producer_try_acquire(mainloop_pipe_producer_state); + + if (cute::elect_one_sync()) { + copy(observed_tma_load_a_real_->with(*tma_barrier, mcast_mask_a), tAgA_real(_,*k_tile_iter), tAsA_real(_,write_stage)); + copy(observed_tma_load_a_imag_->with(*tma_barrier, mcast_mask_a), tAgA_imag(_,*k_tile_iter), tAsA_imag(_,write_stage)); + + copy(observed_tma_load_b_real_->with(*tma_barrier, mcast_mask_b), tBgB_real(_,*k_tile_iter), tBsB_real(_,write_stage)); + copy(observed_tma_load_b_imag_->with(*tma_barrier, mcast_mask_b), tBgB_imag(_,*k_tile_iter), tBsB_imag(_,write_stage)); + } + + --k_tile_count; + ++k_tile_iter; + } + + return cute::make_tuple(mainloop_pipe_producer_state, k_tile_iter); + } + + /// Perform a Producer Epilogue to prevent early exit of ctas in a Cluster + CUTLASS_DEVICE void + load_tail(MainloopPipeline mainloop_pipeline, MainloopPipelineState mainloop_pipe_producer_state) { + // Issue the epilogue waits + /* This helps avoid early exit of ctas in Cluster + * Waits for all stages to either be released (all + * Consumer UNLOCKs), or if the stage was never used + * then would just be acquired since the phase was + * still inverted from make_producer_start_state + */ + mainloop_pipeline.producer_tail(mainloop_pipe_producer_state); + } + + /// Perform a collective-scoped matrix multiply-accumulate + /// Consumer Perspective + template < + class AccumulatorPipeline, + class FrgEngine, class FrgLayout, + class MmaParams, + class CtaTileCoord + > + CUTLASS_DEVICE auto + mma(cute::tuple pipelines, + cute::tuple pipeline_states, + cute::tuple> const& accumulators_pair, + MmaParams const& mma_inputs, + CtaTileCoord cta_tile_coord, + int k_tile_count + ) { + static_assert(is_tmem::value, "Accumulator must be tmem resident."); + static_assert(rank(FrgLayout{}) == 4 && size<3>(FrgLayout{}) == _2{}, "Accumulator must be MMA-partitioned: (MMA, MMA_M, MMA_N, _2)"); + + auto [tiled_mma_a_pos, tiled_mma_a_neg, tCrA_real, tCrA_imag, tCrB_real, tCrB_imag] = mma_inputs; + + auto [mainloop_pipeline, accumulator_pipeline] = pipelines; + auto [mainloop_pipe_consumer_state, accumulator_pipe_producer_state] = pipeline_states; + + uint32_t skip_wait = k_tile_count <= 0; + auto barrier_token = mainloop_pipeline.consumer_try_wait(mainloop_pipe_consumer_state, skip_wait); + + // + // PIPELINED MAIN LOOP + // + tiled_mma_a_pos.accumulate_ = UMMA::ScaleOut::Zero; + tiled_mma_a_neg.accumulate_ = UMMA::ScaleOut::Zero; + + auto accumulators = get<0>(accumulators_pair); + auto accumulators_real = accumulators(_,_,_,0); + auto accumulators_imag = accumulators(_,_,_,1); + + // Wait for tmem accumulator buffer to become empty with a flipped phase + accumulator_pipeline.producer_acquire(accumulator_pipe_producer_state); + + CUTLASS_PRAGMA_NO_UNROLL + while (k_tile_count > 0) { + // WAIT on mainloop_pipe_consumer_state until its data are available + // (phase bit flips from mainloop_pipe_consumer_state.phase() value) + mainloop_pipeline.consumer_wait(mainloop_pipe_consumer_state, barrier_token); + + // Compute on k_tile + int read_stage = mainloop_pipe_consumer_state.index(); + // Save current mainlop pipeline read state + auto curr_mainloop_pipe_consumer_state = mainloop_pipe_consumer_state; + + // Advance mainloop_pipe + ++mainloop_pipe_consumer_state; + --k_tile_count; + skip_wait = k_tile_count <= 0; + // Peek at next iteration + barrier_token = mainloop_pipeline.consumer_try_wait(mainloop_pipe_consumer_state, skip_wait); + + // Unroll the K mode manually so we can set scale C to 1 + CUTLASS_PRAGMA_UNROLL + for (int k_block = 0; k_block < size<2>(tCrA_real); ++k_block) { + // (V,M) x (V,N) => (V,M,N) + + // Calculate real acc, 1st step + // realAcc += realA * realB + cute::gemm(tiled_mma_a_pos, tCrA_real(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_real); + + // Calculate imag acc, 1st step + if constexpr (cute::is_same_v) { + // imagAcc += realA * (-imagB) + cute::gemm(tiled_mma_a_neg, tCrA_real(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_imag); + } else { + // imagAcc += realA * imagB + cute::gemm(tiled_mma_a_pos, tCrA_real(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_imag); + } + + tiled_mma_a_pos.accumulate_ = UMMA::ScaleOut::One; + tiled_mma_a_neg.accumulate_ = UMMA::ScaleOut::One; + + // Calculate real acc, 2nd step + if constexpr (cute::is_same_v) { + // realAcc -= imagA * imagB + cute::gemm(tiled_mma_a_neg, tCrA_imag(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_real); + } else { + // realAcc += imagA * imagB + cute::gemm(tiled_mma_a_pos, tCrA_imag(_,_,k_block,read_stage), tCrB_imag(_,_,k_block,read_stage), accumulators_real); + } + + // Calculate imag acc, 2nd step + if constexpr (cute::is_same_v) { + // imagAcc += (-imagA) * realB + cute::gemm(tiled_mma_a_neg, tCrA_imag(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_imag); + } else { + // imagAcc += imagA * realB + cute::gemm(tiled_mma_a_pos, tCrA_imag(_,_,k_block,read_stage), tCrB_real(_,_,k_block,read_stage), accumulators_imag); + } + } + mainloop_pipeline.consumer_release(curr_mainloop_pipe_consumer_state); + } + + return mainloop_pipe_consumer_state; + } + +protected: + + typename Params::TMA_A const* observed_tma_load_a_real_ = nullptr; + typename Params::TMA_A const* observed_tma_load_a_imag_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_real_ = nullptr; + typename Params::TMA_B const* observed_tma_load_b_imag_ = nullptr; + + ClusterShape cluster_shape_; + uint32_t block_rank_in_cluster_; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace cutlass::gemm::collective + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/collective/sm120_blockscaled_mma_array_tma.hpp b/include/cutlass/gemm/collective/sm120_blockscaled_mma_array_tma.hpp index 34b3aebc..458ee1af 100755 --- a/include/cutlass/gemm/collective/sm120_blockscaled_mma_array_tma.hpp +++ b/include/cutlass/gemm/collective/sm120_blockscaled_mma_array_tma.hpp @@ -259,8 +259,8 @@ struct CollectiveMma< struct TensorStorage : cute::aligned_struct<128, _0> { alignas(1024) cute::ArrayEngine> smem_A; alignas(1024) cute::ArrayEngine> smem_B; - cute::ArrayEngine> smem_SFA; - cute::ArrayEngine> smem_SFB; + alignas(16) cute::ArrayEngine> smem_SFA; + alignas(16) cute::ArrayEngine> smem_SFB; } tensors; struct TensorMapStorage : cute::aligned_struct<128, _0> { diff --git a/include/cutlass/gemm/collective/sm120_blockscaled_mma_tma.hpp b/include/cutlass/gemm/collective/sm120_blockscaled_mma_tma.hpp index edb945b9..9cb80518 100755 --- a/include/cutlass/gemm/collective/sm120_blockscaled_mma_tma.hpp +++ b/include/cutlass/gemm/collective/sm120_blockscaled_mma_tma.hpp @@ -256,8 +256,8 @@ struct CollectiveMma< struct TensorStorage : cute::aligned_struct<128, _0> { alignas(1024) cute::ArrayEngine> smem_A; alignas(1024) cute::ArrayEngine> smem_B; - cute::ArrayEngine> smem_SFA; - cute::ArrayEngine> smem_SFB; + alignas(16) cute::ArrayEngine> smem_SFA; + alignas(16) cute::ArrayEngine> smem_SFB; } tensors; using PipelineStorage = typename MainloopPipeline::SharedStorage; alignas(16) PipelineStorage pipeline_storage; diff --git a/include/cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp b/include/cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp index 46ecaa0d..f65629c5 100755 --- a/include/cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp +++ b/include/cutlass/gemm/collective/sm120_blockscaled_sparse_mma_tma.hpp @@ -296,9 +296,9 @@ struct CollectiveMma< struct TensorStorage : cute::aligned_struct<128> { alignas(1024) cute::ArrayEngine> smem_A; alignas(1024) cute::ArrayEngine> smem_B; - cute::ArrayEngine> smem_SFA; - cute::ArrayEngine> smem_SFB; - cute::ArrayEngine{}> smem_E; + alignas(16) cute::ArrayEngine> smem_SFA; + alignas(16) cute::ArrayEngine> smem_SFB; + alignas(16) cute::ArrayEngine{}> smem_E; } tensors; using PipelineStorageMK = typename MainloopPipelineMK::SharedStorage; diff --git a/include/cutlass/gemm/collective/sm120_sparse_mma_tma.hpp b/include/cutlass/gemm/collective/sm120_sparse_mma_tma.hpp index 52089b70..30587e46 100644 --- a/include/cutlass/gemm/collective/sm120_sparse_mma_tma.hpp +++ b/include/cutlass/gemm/collective/sm120_sparse_mma_tma.hpp @@ -253,7 +253,7 @@ struct CollectiveMma< struct TensorStorage : cute::aligned_struct<128, _0> { alignas(1024) cute::ArrayEngine> smem_A; alignas(1024) cute::ArrayEngine> smem_B; - cute::ArrayEngine{}> smem_E; + alignas(16) cute::ArrayEngine{}> smem_E; } tensors; using PipelineStorageMK = typename MainloopPipelineMK::SharedStorage; diff --git a/include/cutlass/gemm/collective/sm90_mma_array_tma_gmma_ss_warpspecialized_fp8_blockwise_scaling.hpp b/include/cutlass/gemm/collective/sm90_mma_array_tma_gmma_ss_warpspecialized_fp8_blockwise_scaling.hpp index 20c40956..f27731bc 100644 --- a/include/cutlass/gemm/collective/sm90_mma_array_tma_gmma_ss_warpspecialized_fp8_blockwise_scaling.hpp +++ b/include/cutlass/gemm/collective/sm90_mma_array_tma_gmma_ss_warpspecialized_fp8_blockwise_scaling.hpp @@ -212,8 +212,7 @@ struct CollectiveMma< static_assert(cute::is_same_v, "ElementAccumulator and ElementBlockScale should be same datatype"); - // For TileShapeM < 128, NumSplitsM should be 1 - using NumSplitsM = cute::conditional_t(TileShape_{}) < _128{}, _1, cute::C(TileShape_{}) / 128>>; + using NumSplitsM = cute::C(TileShape_{}) / 128>; static_assert(NumSplitsM{} == 1 || NumSplitsM{} == 2); struct SharedStorage { diff --git a/include/cutlass/gemm/device/gemm_blockwise.h b/include/cutlass/gemm/device/gemm_blockwise.h new file mode 100644 index 00000000..13e22941 --- /dev/null +++ b/include/cutlass/gemm/device/gemm_blockwise.h @@ -0,0 +1,761 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Template for a pipelined GEMM kernel. Does not compute batching or + support split-K. +*/ + +#pragma once + +#include "cutlass/arch/arch.h" +#include "cutlass/cutlass.h" +#include "cutlass/device_kernel.h" +#include "cutlass/gemm/device/default_gemm_configuration.h" +#include "cutlass/gemm/kernel/default_gemm.h" +#include "cutlass/gemm/kernel/gemm.h" +#include "cutlass/gemm/kernel/gemm_blockwise.h" +#include "cutlass/gemm/threadblock/threadblock_swizzle.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/layout/permute.h" +#include "cutlass/numeric_types.h" + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace device { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/*! Gemm device-level operator. This is an interface to efficient CUTLASS GEMM + kernels that may be invoked from host code. + + The contributions of this class are: + + 1. At compile time, it maps data types and high-level structural parameters + onto specific CUTLASS components. + + 2. At runtime, it maps logical arguments to GEMM problems to kernel + parameters. + + 3. At runtime, it launches kernels on the device. + + The intent is to provide a convenient mechanism for interacting with most + plausible GEMM configurations for each supported architecture. Consequently, + not all parameters are exposed to the top-level interface. Rather, sensible + defaults at each level of the CUTLASS hierarchy are selected to tradeoff + simplicity of the interface with flexibility. We expect most configurations to + be specified at this level. Applications with more exotic requirements may + construct their kernels of interest using CUTLASS components at the + threadblock, warp, and thread levels of abstraction. + + CUTLASS exposes computations using the functor design pattern in which objects + compose some internal state with an overloaded function call operator. This + enables decoupling of initialization from execution, possibly reducing + overhead during steady state phases of application execution. + + CUTLASS device-level operators expose an Arguments structure encompassing each + logical input to the computation. This is distinct from the kernel-level + Params structure pattern which contains application-specific precomputed state + needed by the device code. + + Example of a CUTLASS GEMM operator implementing the functionality of cuBLAS's + SGEMM NN is as follows: + + // + // Instantiate the CUTLASS GEMM operator. + // + + cutlass::gemm::device::Gemm< + float, + cutlass::layout::ColumnMajor, + float, + cutlass::layout::ColumnMajor, + float, + cutlass::layout::ColumnMajor + > gemm_op; + + // + // Launch the GEMM operation on the device + // + + cutlass::Status status = gemm_op({ + {m, n, k}, // GemmCoord problem_size, + {A, lda}, // TensorRef ref_A, {B, ldb}, // + TensorRef ref_B, {C, ldc}, // TensorRef ref_C, {D, ldd}, // + TensorRef ref_D, {alpha, beta} // + EpilogueOutputOp::Params epilogue_op_params + }); + + + A simplified view of the template is listed below. + + template < + /// Element type for A matrix operand + typename ElementA, + + /// Layout type for A matrix operand + typename LayoutA, + + /// Element type for B matrix operand + typename ElementB, + + /// Layout type for B matrix operand + typename LayoutB, + + /// Element type for C and D matrix operands + typename ElementC, + + /// Layout type for C and D matrix operands + typename LayoutC, + + /// Element type for internal accumulation + typename ElementAccumulator, + + /// Operator class tag + typename OperatorClass, + + /// Tag indicating architecture to tune for. This is the minimum SM that + /// supports the intended feature. The device kernel can be built + /// targeting any SM larger than this number. + typename ArchTag, + + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + + /// Warp-level tile size (concept: GemmShape) + typename InstructionShape, + + /// Epilogue output operator + typename EpilogueOutputOp, + + /// Threadblock-level swizzling operator + typename ThreadblockSwizzle, + + /// Number of stages used in the pipelined mainloop + int Stages + > + class Gemm; +*/ +template < + /// Element type for A matrix operand + typename ElementA_, + /// Layout type for A matrix operand + typename LayoutA_, + /// Element type for B matrix operand + typename ElementB_, + /// Layout type for B matrix operand + typename LayoutB_, + /// Element type for C and D matrix operands + typename ElementC_, + /// Layout type for C and D matrix operands + typename LayoutC_, + /// Element type for internal accumulation + typename ElementAccumulator_ = ElementC_, + /// Operator class tag + typename OperatorClass_ = arch::OpClassSimt, + /// Tag indicating architecture to tune for + typename ArchTag_ = arch::Sm89, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape_ = typename DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, + ElementAccumulator_>::ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape_ = typename DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, + ElementAccumulator_>::WarpShape, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape_ = typename DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, + ElementAccumulator_>::InstructionShape, + /// Element Type for for the scalesl + typename ElementScale_ = float, + /// Layout for the scales. + typename LayoutScale_ = cutlass::layout::RowMajor, + /// Scale Block Size. + int ScaleBlockSize_ = 128, + /// Epilogue output operator + typename EpilogueOutputOp_ = typename DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, + ElementAccumulator_>::EpilogueOutputOp, + /// Threadblock-level swizzling operator + typename ThreadblockSwizzle_ = + typename threadblock::GemmIdentityThreadblockSwizzle<>, + /// Number of stages used in the pipelined mainloop + int Stages = + DefaultGemmConfiguration::kStages, + /// Access granularity of A matrix in units of elements + int AlignmentA = + DefaultGemmConfiguration::kAlignmentA, + /// Access granularity of B matrix in units of elements + int AlignmentB = + DefaultGemmConfiguration::kAlignmentB, + /// If true, kernel supports split-K with serial reduction + bool SplitKSerial = false, + /// Operation performed by GEMM + typename Operator_ = typename DefaultGemmConfiguration< + OperatorClass_, ArchTag_, ElementA_, ElementB_, ElementC_, + ElementAccumulator_>::Operator, + /// Gather operand A by using an index array + bool GatherA = false, + /// Gather operand B by using an index array + bool GatherB = false, + /// Scatter result D by using an index array + bool ScatterD = false, + /// Permute result D + typename PermuteDLayout = layout::NoPermute> +class GemmBlockwise { +public: + using ElementA = ElementA_; + using LayoutA = LayoutA_; + using TensorRefA = TensorRef; + using ElementB = ElementB_; + using LayoutB = LayoutB_; + using TensorRefB = TensorRef; + using ElementC = ElementC_; + using LayoutC = LayoutC_; + using TensorRefC = TensorRef; + using TensorRefD = TensorRef; + using ElementAccumulator = ElementAccumulator_; + using OperatorClass = OperatorClass_; + using ArchTag = ArchTag_; + using ThreadblockShape = ThreadblockShape_; + using WarpShape = WarpShape_; + using InstructionShape = InstructionShape_; + using EpilogueOutputOp = EpilogueOutputOp_; + using ThreadblockSwizzle = ThreadblockSwizzle_; + using Operator = Operator_; + using ElementScale = ElementScale_; + using LayoutScale = LayoutScale_; + static int const kStages = Stages; + static int const kAlignmentA = AlignmentA; + static int const kAlignmentB = AlignmentB; + + static int const kAlignmentC = EpilogueOutputOp::kCount; + static bool const kSplitKSerial = SplitKSerial; + static int const kScaleBlockSize = ScaleBlockSize_; + + + static_assert(kScaleBlockSize == 128, "Scale block size has to be 128 for now."); + // Ensure the threadblock K-dimension is 128 + static_assert(ThreadblockShape::kK == kScaleBlockSize, + "GemmBlockwise requires ThreadblockShape::kK equale to Scale Block Size"); + + static_assert(cutlass::platform::is_same::value, + "Scales have to be row major for now."); + + static_assert(cutlass::platform::is_same::value, + "Scales have to be float."); + + // Tensor reference type for the FP8 scale tensors + using TensorRefScale = cutlass::TensorRef; + static ComplexTransform const kTransformA = ComplexTransform::kNone; + static ComplexTransform const kTransformB = ComplexTransform::kNone; + + /// Define the kernel + using GemmKernel = typename kernel::GemmBlockwise< + ElementA, LayoutA, kAlignmentA, ElementB, LayoutB, kAlignmentB, ElementC, + LayoutC, ElementAccumulator, ElementScale, LayoutScale, + OperatorClass, ArchTag, ThreadblockShape, + WarpShape, InstructionShape, EpilogueOutputOp, ThreadblockSwizzle, + kStages, kSplitKSerial, Operator, SharedMemoryClearOption::kNone, GatherA, + GatherB, ScatterD, PermuteDLayout>::GemmKernel; + + /// Argument structure + struct Arguments { + // + // Data members + // + + GemmCoord problem_size; + TensorRef ref_A; + TensorRef ref_B; + TensorRef ref_C; + TensorRef ref_D; + typename EpilogueOutputOp::Params epilogue; + int split_k_slices; + // For gather+scatter operations + int const *gather_A_indices; + int const *gather_B_indices; + int const *scatter_D_indices; + + // Dequantization scale tensors (row-major) + TensorRefScale scale_A; + TensorRefScale scale_B; + + // + // Methods + // + + /// Default ctor + CUTLASS_HOST_DEVICE + Arguments() : problem_size(0, 0, 0), split_k_slices(1) {} + + /// Constructs an Arguments structure + CUTLASS_HOST_DEVICE + Arguments(GemmCoord problem_size_, + TensorRef ref_A_, + TensorRef ref_B_, + TensorRef ref_C_, + TensorRef ref_D_, + TensorRefScale scale_A_, + TensorRefScale scale_B_, + typename EpilogueOutputOp::Params epilogue_ = typename EpilogueOutputOp::Params(), + int split_k_slices = 1, int const *gather_A_indices_ = nullptr, + int const *gather_B_indices_ = nullptr, + int const *scatter_D_indices_ = nullptr) + : problem_size(problem_size_), ref_A(ref_A_), ref_B(ref_B_), + ref_C(ref_C_), ref_D(ref_D_), scale_A(scale_A_), + scale_B(scale_B_), epilogue(epilogue_), + split_k_slices(split_k_slices), gather_A_indices(gather_A_indices_), + gather_B_indices(gather_B_indices_), + scatter_D_indices(scatter_D_indices_) {} + }; + +private: + /// Kernel parameters object + typename GemmKernel::Params params_; + +public: + /// Constructs the GEMM. + GemmBlockwise() {} + + /// Determines whether the GEMM can execute the given problem. + static Status can_implement(Arguments const &args) { + // Require the problem K dimension to be an exact multiple of the Threadblock K tile. + if (args.problem_size.k() % ThreadblockShape::kK != 0) { + return Status::kErrorInvalidProblem; + } + + if (!kSplitKSerial && args.split_k_slices > 1) { + return Status::kErrorInvalidProblem; + } + + // ------------------------------------------------------------------ + // Validate scale tensor leading dimensions. + // Row-major layout implies stride(0) equals number of columns (kBlocks). + // Both scale_A (mBlocks × kBlocks) and scale_B (nBlocks × kBlocks) must + // therefore have stride(0) == kBlocks where kBlocks = ceil_div(K, 128). + // ------------------------------------------------------------------ + int const kBlocks = (args.problem_size.k() + ThreadblockShape::kK - 1) / ThreadblockShape::kK; + + if (args.scale_A.stride(0) != kBlocks || args.scale_B.stride(0) != kBlocks) { + return Status::kErrorInvalidProblem; + } + + Status status = GemmKernel::can_implement( + args.problem_size, args.ref_A.non_const_ref(), + args.ref_B.non_const_ref(), args.ref_C.non_const_ref(), args.ref_D); + + if (status != Status::kSuccess) { + return status; + } + + return Status::kSuccess; + } + + /// Gets the workspace size + static size_t get_workspace_size(Arguments const &args) { + size_t bytes = 0; + + // Determine grid shape + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord tiled_shape = threadblock_swizzle.get_tiled_shape( + args.problem_size, + {ThreadblockShape::kM, ThreadblockShape::kN, ThreadblockShape::kK}, + args.split_k_slices); + + if (kSplitKSerial && args.split_k_slices > 1) { + bytes += sizeof(int) * size_t(tiled_shape.m()) * size_t(tiled_shape.n()); + } + + return bytes; + } + + /// Initializes GEMM state from arguments. + Status initialize(Arguments const &args, void *workspace = nullptr, + cudaStream_t stream = nullptr) { + // Determine grid shape + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord grid_shape = threadblock_swizzle.get_tiled_shape( + args.problem_size, + {ThreadblockShape::kM, ThreadblockShape::kN, ThreadblockShape::kK}, + args.split_k_slices); + + if (kSplitKSerial) { + if (args.split_k_slices > 1) { + if (!workspace) { + return Status::kErrorWorkspaceNull; + } + + size_t bytes = get_workspace_size(args); + + cudaError_t result = cudaMemsetAsync(workspace, 0, bytes, stream); + + if (result != cudaSuccess) { + return Status::kErrorInternal; + } + } + } else { + if (args.split_k_slices > 1) { + return Status::kErrorInvalidProblem; + } + } + + // Initialize the Params structure + params_ = typename GemmKernel::Params{args.problem_size, + grid_shape, + args.ref_A.non_const_ref(), + args.ref_B.non_const_ref(), + args.ref_C.non_const_ref(), + args.ref_D, + args.scale_A, + args.scale_B, + args.epilogue, + static_cast(workspace), + args.gather_A_indices, + args.gather_B_indices, + args.scatter_D_indices}; + + return Status::kSuccess; + } + + /// Lightweight update given a subset of arguments + Status update(Arguments const &args, void *workspace = nullptr) { + if (kSplitKSerial && args.split_k_slices > 1) { + if (!workspace) { + return Status::kErrorWorkspaceNull; + } + } + + params_.ref_A.reset(args.ref_A.non_const_ref().data()); + params_.ref_B.reset(args.ref_B.non_const_ref().data()); + params_.ref_C.reset(args.ref_C.non_const_ref().data()); + params_.ref_D.reset(args.ref_D.data()); + params_.scale_A.reset(args.scale_A.data()); + params_.scale_B.reset(args.scale_B.data()); + params_.output_op = args.epilogue; + params_.semaphore = static_cast(workspace); + + return Status::kSuccess; + } + + /// Runs the kernel using initialized state. + Status run(cudaStream_t stream = nullptr) { + ThreadblockSwizzle threadblock_swizzle; + + dim3 grid = threadblock_swizzle.get_grid_shape(params_.grid_tiled_shape); + dim3 block(GemmKernel::kThreadCount, 1, 1); + + cudaError_t result; + + int smem_size = int(sizeof(typename GemmKernel::SharedStorage)); + + if (smem_size >= (48 << 10)) { + result = cudaFuncSetAttribute(Kernel, + cudaFuncAttributeMaxDynamicSharedMemorySize, + smem_size); + + if (result != cudaSuccess) { + return Status::kErrorInternal; + } + } + + cutlass::arch::synclog_setup(); + cutlass::Kernel<<>>(params_); + + result = cudaGetLastError(); + + return result == cudaSuccess ? Status::kSuccess : Status::kErrorInternal; + } + + /// Runs the kernel using initialized state. + Status operator()(cudaStream_t stream = nullptr) { return run(stream); } + + /// Runs the kernel using initialized state. + Status operator()(Arguments const &args, void *workspace = nullptr, + cudaStream_t stream = nullptr) { + Status status = initialize(args, workspace, stream); + + if (status == Status::kSuccess) { + status = run(stream); + } + + return status; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Partial specialization for column-major output exchanges problem size and +/// operand. +template < + /// Element type for A matrix operand + typename ElementA_, + /// Layout type for A matrix operand + typename LayoutA_, + /// Element type for B matrix operand + typename ElementB_, + /// Layout type for B matrix operand + typename LayoutB_, + /// Element type for C and D matrix operands + typename ElementC_, + /// Element type for internal accumulation + typename ElementAccumulator_, + /// Operator class tag + typename OperatorClass_, + /// Tag indicating architecture to tune for + typename ArchTag_, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape_, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape_, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape_, + /// Element Type for for the scalesl + typename ElementScale_, + /// Layout for the scales. + typename LayoutScale_, + /// Scale Block Size. + int ScaleBlockSize_, + /// Epilogue output operator + typename EpilogueOutputOp_, + /// Threadblock-level swizzling operator + typename ThreadblockSwizzle_, + /// Number of stages used in the pipelined mainloop + int Stages, + /// Access granularity of A matrix in units of elements + int AlignmentA, + /// Access granularity of B matrix in units of elements + int AlignmentB, + /// If true, kernel supports split-K as a serial reduction + bool SplitKSerial, + /// Operation performed by GEMM + typename Operator_, + /// Gather operand A by using an index array + bool GatherA, + /// Gather operand B by using an index array + bool GatherB, + /// Scatter result D by using an index array + bool ScatterD, + /// Permute result D + typename PermuteDLayout> +class GemmBlockwise { +public: + using ElementA = ElementA_; + using LayoutA = LayoutA_; + using TensorRefA = TensorRef; + using ElementB = ElementB_; + using LayoutB = LayoutB_; + using TensorRefB = TensorRef; + using ElementC = ElementC_; + using LayoutC = layout::ColumnMajor; + using TensorRefC = TensorRef; + using TensorRefD = TensorRef; + using ElementAccumulator = ElementAccumulator_; + using OperatorClass = OperatorClass_; + using ArchTag = ArchTag_; + using ThreadblockShape = ThreadblockShape_; + using WarpShape = WarpShape_; + using InstructionShape = InstructionShape_; + using EpilogueOutputOp = EpilogueOutputOp_; + using ThreadblockSwizzle = ThreadblockSwizzle_; + using Operator = Operator_; + using ElementScale = ElementScale_; + using LayoutScale = LayoutScale_; + + static int const kScaleBlockShape = ScaleBlockSize_; + static int const kStages = Stages; + static int const kAlignmentA = AlignmentA; + static int const kAlignmentB = AlignmentB; + + // Alias for per-tile FP8 dequantization scale tensors + using TensorRefScale = cutlass::TensorRef; + static ComplexTransform const kTransformA = ComplexTransform::kNone; + static ComplexTransform const kTransformB = ComplexTransform::kNone; + static bool const kSplitKSerial = SplitKSerial; + + using UnderlyingOperator = + GemmBlockwise::type, + ElementA, typename layout::LayoutTranspose::type, + ElementC, layout::RowMajor, ElementAccumulator, + OperatorClass, ArchTag, ThreadblockShape, WarpShape, + InstructionShape, ElementScale, LayoutScale, kScaleBlockShape, + EpilogueOutputOp, ThreadblockSwizzle, + Stages, kAlignmentB, kAlignmentA, SplitKSerial, Operator, + GatherB, GatherA, ScatterD, PermuteDLayout>; + + using UnderlyingArguments = typename UnderlyingOperator::Arguments; + using GemmKernel = typename UnderlyingOperator::GemmKernel; + static int const kAlignmentC = UnderlyingOperator::kAlignmentC; + + /// Argument structure + struct Arguments { + // + // Data members + // + + GemmCoord problem_size; + TensorRef ref_A; + TensorRef ref_B; + TensorRef ref_C; + TensorRef ref_D; + typename EpilogueOutputOp::Params epilogue; + int split_k_slices; + // For gather+scatter operations + int const *gather_A_indices; + int const *gather_B_indices; + int const *scatter_D_indices; + + // Dequantization scale tensors (row-major) + TensorRefScale scale_A; + TensorRefScale scale_B; + + // + // Methods + // + + /// Default ctor + CUTLASS_HOST_DEVICE + Arguments() {} + + /// Constructs an Arguments structure + CUTLASS_HOST_DEVICE + Arguments(GemmCoord problem_size_, + TensorRef ref_A_, + TensorRef ref_B_, + TensorRef ref_C_, + TensorRef ref_D_, + TensorRefScale scale_A_, + TensorRefScale scale_B_, + typename EpilogueOutputOp::Params epilogue_ = typename EpilogueOutputOp::Params(), + int split_k_slices = 1, int const *gather_A_indices_ = nullptr, + int const *gather_B_indices_ = nullptr, + int const *scatter_D_indices_ = nullptr) + : problem_size(problem_size_), ref_A(ref_A_), ref_B(ref_B_), + ref_C(ref_C_), ref_D(ref_D_), scale_A(scale_A_), + scale_B(scale_B_), epilogue(epilogue_), + split_k_slices(split_k_slices), gather_A_indices(gather_A_indices_), + gather_B_indices(gather_B_indices_), + scatter_D_indices(scatter_D_indices_) {} + }; + +private: + UnderlyingOperator underlying_operator_; + +public: + /// Constructs the GEMM. + GemmBlockwise() {} + + /// Helper to construct a transposed equivalent for the underying GEMM + /// operator + static UnderlyingArguments to_underlying_arguments(Arguments const &args) { + return UnderlyingArguments( + {args.problem_size.n(), args.problem_size.m(), args.problem_size.k()}, + {args.ref_B.data(), args.ref_B.stride(0)}, + {args.ref_A.data(), args.ref_A.stride(0)}, + {args.ref_C.data(), args.ref_C.stride(0)}, + {args.ref_D.data(), args.ref_D.stride(0)}, + {args.scale_B.data(), args.scale_B.stride(0)}, + {args.scale_A.data(), args.scale_A.stride(0)}, + args.epilogue, + args.split_k_slices, args.gather_B_indices, args.gather_A_indices, + args.scatter_D_indices); + } + + /// Determines whether the GEMM can execute the given problem. + static Status can_implement(Arguments const &args) { + return UnderlyingOperator::can_implement(to_underlying_arguments(args)); + } + + /// Gets the workspace size + static size_t get_workspace_size(Arguments const &args) { + return UnderlyingOperator::get_workspace_size( + to_underlying_arguments(args)); + } + + /// Initializes GEMM state from arguments. + Status initialize(Arguments const &args, void *workspace = nullptr, cudaStream_t stream = nullptr) { + return underlying_operator_.initialize(to_underlying_arguments(args), + workspace, stream); + } + + /// Lightweight update given a subset of arguments + Status update(Arguments const &args, void *workspace = nullptr) { + return underlying_operator_.update(to_underlying_arguments(args), + workspace); + } + + /// Runs the kernel using initialized state. + Status run(cudaStream_t stream = nullptr) { + return underlying_operator_.run(stream); + } + + /// Runs the kernel using initialized state. + Status operator()(cudaStream_t stream = nullptr) { return run(stream); } + + /// Runs the kernel using initialized state. + Status operator()(Arguments const &args, void *workspace = nullptr, + cudaStream_t stream = nullptr) { + Status status = initialize(args, workspace, stream); + + if (status == Status::kSuccess) { + status = run(stream); + } + + return status; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace device +} // namespace gemm +} // namespace cutlass +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/device/gemm_universal_base.h b/include/cutlass/gemm/device/gemm_universal_base.h index 1aac3f98..0998735f 100644 --- a/include/cutlass/gemm/device/gemm_universal_base.h +++ b/include/cutlass/gemm/device/gemm_universal_base.h @@ -166,6 +166,7 @@ protected: } } +#ifndef __QNX__ // Update SM occupancy member cudart_result = cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( &sm_occupancy_, @@ -177,6 +178,7 @@ protected: CUTLASS_TRACE_HOST(" cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags() returned error " << cudaGetErrorString(cudart_result)); return Status::kErrorInternal; } +#endif // Update device ordinal member on success device_ordinal_ = current_ordinal; diff --git a/include/cutlass/gemm/dispatch_policy.hpp b/include/cutlass/gemm/dispatch_policy.hpp index deefe903..3ea71399 100644 --- a/include/cutlass/gemm/dispatch_policy.hpp +++ b/include/cutlass/gemm/dispatch_policy.hpp @@ -787,6 +787,24 @@ struct KernelPtrArrayTmaWarpSpecialized2SmFastFP32Sm100 final : KernelSchedu struct KernelPtrArrayTmaWarpSpecialized1SmFastFP32SmemSm100 final : KernelSchedule1Sm, KernelTmaWarpSpecializedPtrArrayFastFP32SmemSm100 { }; struct KernelPtrArrayTmaWarpSpecialized2SmFastFP32SmemSm100 final : KernelSchedule2Sm, KernelTmaWarpSpecializedPtrArrayFastFP32SmemSm100 { }; +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// SM100 Interleaved Complex GEMM Dispatch Policies +/////////////////////////////////////////////////////////////////////////////////////////////////////// +struct KernelScheduleSm100InterleavedComplexTF32Gemm : KernelScheduleSm100 {}; +// Transform GEMM: Specialize for Interleaved Complex GEMMs +struct KernelTmaWarpSpecialized1SmInterleavedComplexTF32Sm100 final : KernelSchedule1Sm, KernelScheduleSm100InterleavedComplexTF32Gemm { }; +struct KernelTmaWarpSpecialized2SmInterleavedComplexTF32Sm100 final : KernelSchedule2Sm, KernelScheduleSm100InterleavedComplexTF32Gemm { }; + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// SM100 Ptr-Array Interleaved Complex GEMM Dispatch Policies +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Interleaved Complex GEMM + (Ptr array or Group GEMM) +struct KernelScheduleSm100PtrArrayInterleavedComplexTF32Gemm : KernelScheduleSm100InterleavedComplexTF32Gemm {}; +// Ptr-Array Transform GEMM: Specialize for 1SM vs 2SM Complex GEMM +// Transform GEMM: Specialize for Interleaved Complex GEMMs +struct KernelPtrArrayTmaWarpSpecialized1SmInterleavedComplexTF32Sm100 final : KernelSchedule1Sm, KernelScheduleSm100PtrArrayInterleavedComplexTF32Gemm { }; +struct KernelPtrArrayTmaWarpSpecialized2SmInterleavedComplexTF32Sm100 final : KernelSchedule2Sm, KernelScheduleSm100PtrArrayInterleavedComplexTF32Gemm { }; + /////////////////////////////////////////////////////////////////////////////////////////////////////// // SM100 Sparse GEMM Dispatch Policies /////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1133,6 +1151,33 @@ struct MainloopSm100TmaUmmaWarpSpecializedFastF32 { }; +template< + // Number of Pipeline stages for + // MainloopLoad <-> Transformation + int ComputationPipelineStageCount_, + // TileScheduler pipeline depth + int SchedulerPipelineStageCount_, + // Accmulator pipeline depth + int AccumulatorPipelineStageCount_, + // Number of Pipeline stages for + // Transformation <-> MMA + int TransformationPipelineStageCount_, + class ClusterShape_ = Shape<_1,_1,_1>, + class AccumulatorCopyAtom_ = cute::SM100_TMEM_LOAD_16dp256b1x +> +struct MainloopSm100TmaUmmaWarpSpecializedInterleavedComplexTF32 { + constexpr static int ComputationPipelineStageCount = ComputationPipelineStageCount_; + constexpr static int TransformationPipelineStageCount = TransformationPipelineStageCount_; + constexpr static detail::KernelInputTransformType InputTransformType = detail::KernelInputTransformType::InterleavedComplexTF32; + using ClusterShape = ClusterShape_; + using AccumulatorCopyAtom = AccumulatorCopyAtom_; + using ArchTag = arch::Sm100; + using Schedule = KernelTmaWarpSpecializedInputTransformSm100; + + // For backwards compatibility with GemmUniversalAdapter. + constexpr static int Stages = ComputationPipelineStageCount; +}; + // n-buffer in smem, pipelined with Blackwell Mixed Input kernel with UMMA (HwScaled) and TMA, template< // Number of Pipeline stages for @@ -1162,6 +1207,23 @@ struct MainloopSm100TmaUmmaWarpSpecializedMixedInput { }; +// n-buffer in smem, pipelined with Blackwell UMMA and TMA, Warp specialized dynamic schedule +template< + int Stages_, + // TileScheduler pipeline depth + int SchedulerPipelineStageCount_, + // Accmulator pipeline depth + int AccumulatorPipelineStageCount_, + class ClusterShape_ = Shape<_1,_1,_1> +> +struct MainloopSm100TmaUmmaWarpSpecializedPlanarComplex { + constexpr static int Stages = Stages_; + using ClusterShape = ClusterShape_; + using ArchTag = arch::Sm100; + using Schedule = KernelTmaWarpSpecializedSm100; + constexpr static bool IsOverlappingAccum = false; +}; + // n-buffer in smem, pipelined with Blackwell UMMA and TMA, Warp specialized dynamic schedule template< int Stages_, @@ -1224,6 +1286,22 @@ struct MainloopSm100ArrayTmaUmmaWarpSpecializedBlockScaled { +// n-buffer in smem, pipelined with Blackwell UMMA and TMA, Warp specialized dynamic schedule +template< + int Stages_, + int SchedulerPipelineStageCount_, + int AccumulatorPipelineStageCount_, + class ClusterShape_ = Shape<_1,_1,_1> +> +struct MainloopSm100ArrayTmaUmmaWarpSpecializedPlanarComplex { + constexpr static int Stages = Stages_; + using ClusterShape = ClusterShape_; + using ArchTag = arch::Sm100; + constexpr static bool IsOverlappingAccum = false; + using Schedule = KernelPtrArrayTmaWarpSpecializedSm100; +}; + + // n-buffer in smem, pipelined with Blackwell Fast FP32 kernel with UMMA (HwScaled) and TMA, // Warp specialized dynamic schedule template< @@ -1271,6 +1349,35 @@ struct MainloopSm100ArrayTmaUmmaWarpSpecializedFastF32 { constexpr static int Stages = Load2TransformPipelineStageCount; }; + +template< + // Number of Pipeline stages for + // MainloopLoad <-> Transformation + int ComputationPipelineStageCount_, + // TileScheduler pipeline depth + int SchedulerPipelineStageCount_, + // Accmulator pipeline depth + int AccumulatorPipelineStageCount_, + // Number of Pipeline stages for + // Transformation <-> MMA + int TransformationPipelineStageCount_, + class ClusterShape_ = Shape<_1,_1,_1>, + class AccumulatorCopyAtom_ = cute::SM100_TMEM_LOAD_16dp256b1x +> +struct MainloopSm100ArrayTmaUmmaWarpSpecializedInterleavedComplexTF32 { + constexpr static int ComputationPipelineStageCount = ComputationPipelineStageCount_; + constexpr static int TransformationPipelineStageCount = TransformationPipelineStageCount_; + constexpr static detail::KernelInputTransformType InputTransformType = detail::KernelInputTransformType::InterleavedComplexTF32; + using ClusterShape = ClusterShape_; + using AccumulatorCopyAtom = AccumulatorCopyAtom_; + using ArchTag = arch::Sm100; + using Schedule = KernelPtrArrayTmaWarpSpecializedInputTransformSm100; + + // For backwards compatibility with GemmUniversalAdapter. + constexpr static int Stages = ComputationPipelineStageCount; +}; + + // n-buffer in smem, pipelined with Blackwell UMMA and TMA, Warp specialized dynamic schedule template< int LoadABPipelineStageCount_, diff --git a/include/cutlass/gemm/kernel/gemm_blockwise.h b/include/cutlass/gemm/kernel/gemm_blockwise.h new file mode 100644 index 00000000..f8ee9d0d --- /dev/null +++ b/include/cutlass/gemm/kernel/gemm_blockwise.h @@ -0,0 +1,223 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief + Default kernel-level GEMM definitions combine threadblock-scoped matrix + multiply-add with the appropriate threadblock-scoped epilogue. + + Note, CUTLASS epilogues universally target row-major outputs. Column-major + outputs are accommodated by exchanging A and B operands and assuming + transposed layouts. Partial specializations here choose + 'device::GemmTransposed' to implement this functionality. +*/ + +#pragma once + +#include "cutlass/arch/wmma.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/thread/linear_combination.h" +#include "cutlass/epilogue/threadblock/default_epilogue_simt.h" +#include "cutlass/epilogue/threadblock/default_epilogue_tensor_op.h" +#include "cutlass/epilogue/threadblock/default_epilogue_volta_tensor_op.h" +#include "cutlass/epilogue/threadblock/epilogue.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/kernel/gemm_universal_blockwise.h" +#include "cutlass/gemm/kernel/gemm_pipelined.h" +#include "cutlass/gemm/threadblock/default_mma.h" +#include "cutlass/gemm/threadblock/default_mma_core_simt.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm70.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm75.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm80.h" +#include "cutlass/gemm/threadblock/default_mma_multistage_blockwise.h" +#include "cutlass/gemm/threadblock/threadblock_swizzle.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/layout/permute.h" +#include "cutlass/numeric_types.h" +#include "cutlass/transform/threadblock/predicated_tile_iterator.h" + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace kernel { + +//////////////////////////////////////////////////////////////////////////////// + +template < + /// Element type for A matrix operand + typename ElementA_, + /// Layout type for A matrix operand + typename LayoutA_, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB_, + /// Layout type for B matrix operand + typename LayoutB_, + /// Access granularity of B matrix in units of elements + int kAlignmentB, + /// Element type for C and D matrix operands + typename ElementC_, + /// Layout type for C and D matrix operands + typename LayoutC_, + /// Element type for internal accumulation + typename ElementAccumulator, + /// Element Type for for the scalesl + typename ElementScale, + /// Layout for the scales. + typename LayoutScale, + /// Operator class tag + typename OperatorClass, + /// Tag indicating architecture to tune for + typename ArchTag, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + /// Warp-level tile size (concept: GemmShape) + typename InstructionShape, + /// Epilogue output operator + typename EpilogueOutputOp, + /// Threadblock-level swizzling operator + typename ThreadblockSwizzle, + /// Number of stages used in the pipelined mainloop + int Stages, + /// If true, kernel is configured to support serial reduction in the + /// epilogue + bool SplitKSerial, + /// Operation performed by GEMM + typename Operator, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear = SharedMemoryClearOption::kNone, + /// Gather operand A by using an index array + bool GatherA = false, + /// Gather operand B by using an index array + bool GatherB = false, + /// Scatter result D by using an index array + bool ScatterD = false, + /// Permute result D + typename PermuteDLayout = layout::NoPermute, + /// Permute operand A + typename PermuteALayout = layout::NoPermute, + /// Permute operand B + typename PermuteBLayout = layout::NoPermute, + /// + typename Enable = void> +struct GemmBlockwise; + +//////////////////////////////////////////////////////////////////////////////// + +/// Partial specialization for Ada Architecture +template < + /// Element type for A matrix operand + typename ElementA, + /// Layout type for A matrix operand + typename LayoutA, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB, + /// Layout type for B matrix operand + typename LayoutB, + /// Access granularity of A matrix in units of elements + int kAlignmentB, + /// Element type for C and D matrix operands + typename ElementC, + /// Element type for internal accumulation + typename ElementAccumulator, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + /// Warp-level tile size (concept: GemmShape) + typename InstructionShape, + /// Epilogue output operator + typename EpilogueOutputOp, + /// Threadblock-level swizzling operator + typename ThreadblockSwizzle, + /// Number of stages used in the pipelined mainloop + int Stages, + /// If true, kernel is configured to support serial reduction in the + /// epilogue + bool SplitKSerial, + /// Operation performed by GEMM + typename Operator, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear, + /// Gather operand A by using an index array + bool GatherA, + /// Gather operand B by using an index array + bool GatherB, + /// Scatter result D by using an index array + bool ScatterD, + /// Permute result D + typename PermuteDLayout, + /// Permute operand A + typename PermuteALayout, + /// Permute operand B + typename PermuteBLayout> +struct GemmBlockwise { + /// Define the threadblock-scoped matrix multiply-accumulate + using Mma = typename cutlass::gemm::threadblock::DefaultMmaBlockwise< + ElementA, LayoutA, kAlignmentA, ElementB, LayoutB, kAlignmentB, + ElementAccumulator, layout::RowMajor, float, layout::RowMajor, + arch::OpClassTensorOp, arch::Sm89, + ThreadblockShape, WarpShape, InstructionShape, Stages, Operator, false, + SharedMemoryClear, GatherA, GatherB, PermuteALayout, + PermuteBLayout>::ThreadblockMma; + + static_assert(ThreadblockShape::kK % WarpShape::kK == 0, "ThreadblockShape::kK must be divisible by WarpShape::kK."); + static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; + + /// Define the epilogue + using Epilogue = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< + ThreadblockShape, typename Mma::Operator, kPartitionsK, + EpilogueOutputOp, EpilogueOutputOp::kCount, ScatterD, + PermuteDLayout>::Epilogue; + + /// Define the kernel-level GEMM operator. + using GemmKernel = + kernel::GemmUniversalBlockwise; +}; +//////////////////////////////////////////////////////////////////////////////// + +} // namespace kernel +} // namespace gemm +} // namespace cutlass diff --git a/include/cutlass/gemm/kernel/gemm_universal_blockwise.h b/include/cutlass/gemm/kernel/gemm_universal_blockwise.h new file mode 100644 index 00000000..72a589f8 --- /dev/null +++ b/include/cutlass/gemm/kernel/gemm_universal_blockwise.h @@ -0,0 +1,359 @@ +/*************************************************************************************************** + * Copyright (c) 2017 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Template for a pipelined GEMM kernel. Does not compute batching or + support split-K. +*/ + +#pragma once + +#include "cutlass/arch/arch.h" +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/matrix_coord.h" +#include "cutlass/semaphore.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace kernel { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template +struct GemmUniversalBlockwise { + using Mma = Mma_; + using Epilogue = Epilogue_; + using OutputOp = typename Epilogue::OutputOp; + using ThreadblockSwizzle = ThreadblockSwizzle_; + static bool const kSplitKSerial = SplitKSerial; + + // Added aliases for per-tile FP8 dequantisation scale tensors + using LayoutScale = cutlass::layout::RowMajor; + using TensorRefScale = cutlass::TensorRef; + + /// Warp count (concept: GemmShape) + using WarpCount = typename Mma::WarpCount; + static int const kThreadCount = 32 * WarpCount::kCount; + + /// Parameters structure + struct Params { + cutlass::gemm::GemmCoord problem_size; + cutlass::gemm::GemmCoord grid_tiled_shape; + int swizzle_log_tile; + typename Mma::IteratorA::Params params_A; + typename Mma::IteratorA::TensorRef ref_A; + typename Mma::IteratorB::Params params_B; + typename Mma::IteratorB::TensorRef ref_B; + typename Epilogue::OutputTileIterator::Params params_C; + typename Epilogue::OutputTileIterator::TensorRef ref_C; + typename Epilogue::OutputTileIterator::Params params_D; + typename Epilogue::OutputTileIterator::TensorRef ref_D; + typename OutputOp::Params output_op; + int *semaphore; + int gemm_k_size; + // For gather+scatter operations + int const *gather_A_indices; + int const *gather_B_indices; + int const *scatter_D_indices; + TensorRefScale scale_A; + TensorRefScale scale_B; + + // + // Methods + // + + CUTLASS_HOST_DEVICE + Params() : swizzle_log_tile(0), semaphore(0), gemm_k_size(0) {} + + CUTLASS_HOST_DEVICE + Params(cutlass::gemm::GemmCoord const &problem_size, + cutlass::gemm::GemmCoord const &grid_tiled_shape, + typename Mma::IteratorA::TensorRef ref_A, + typename Mma::IteratorB::TensorRef ref_B, + typename Epilogue::OutputTileIterator::TensorRef ref_C, + typename Epilogue::OutputTileIterator::TensorRef ref_D, + TensorRefScale scale_A, + TensorRefScale scale_B, + typename OutputOp::Params output_op = typename OutputOp::Params(), + int *workspace = nullptr, int const *gather_A_indices = nullptr, + int const *gather_B_indices = nullptr, + int const *scatter_D_indices = nullptr) + : problem_size(problem_size), grid_tiled_shape(grid_tiled_shape), + swizzle_log_tile(ThreadblockSwizzle().get_log_tile(grid_tiled_shape)), + params_A(ref_A.layout()), ref_A(ref_A), params_B(ref_B.layout()), + ref_B(ref_B), params_C(ref_C.layout()), ref_C(ref_C), + params_D(ref_D.layout()), ref_D(ref_D), scale_A(scale_A), + scale_B(scale_B), output_op(output_op), + gather_A_indices(gather_A_indices), + gather_B_indices(gather_B_indices), + scatter_D_indices(scatter_D_indices) { + int total_gemm_k_iterations = + (problem_size.k() + Mma::Shape::kK - 1) / Mma::Shape::kK; + int gemm_k_iterations = + (total_gemm_k_iterations + grid_tiled_shape.k() - 1) / + grid_tiled_shape.k(); + + gemm_k_size = gemm_k_iterations * Mma::Shape::kK; + + semaphore = workspace; + } + }; + + /// Shared memory storage structure + union SharedStorage { + typename Mma::SharedStorage main_loop; + typename Epilogue::SharedStorage epilogue; + }; + + // + // Methods + // + + CUTLASS_HOST_DEVICE + GemmUniversalBlockwise() {} + + /// Determines whether kernel satisfies alignment + CUTLASS_HOST_DEVICE + static Status + can_implement(cutlass::gemm::GemmCoord const &problem_size, + typename Mma::IteratorA::TensorRef ref_A, + typename Mma::IteratorB::TensorRef ref_B, + typename Epilogue::OutputTileIterator::TensorRef ref_C, + typename Epilogue::OutputTileIterator::TensorRef ref_D) { + static int const kAlignmentA = + (platform::is_same>::value) + ? 32 + : (platform::is_same>::value) + ? 64 + : Mma::IteratorA::AccessType::kElements; + static int const kAlignmentB = + (platform::is_same>::value) + ? 32 + : (platform::is_same>::value) + ? 64 + : Mma::IteratorB::AccessType::kElements; + static int const kAlignmentC = + (platform::is_same>::value) + ? 32 + : (platform::is_same>::value) + ? 64 + : Epilogue::OutputTileIterator::kElementsPerAccess; + + if (!TensorRef_aligned(ref_A, kAlignmentA)) { + return Status::kErrorMisalignedOperand; + } + + if (!TensorRef_aligned(ref_B, kAlignmentB)) { + return Status::kErrorMisalignedOperand; + } + + if (!TensorRef_aligned(ref_C, kAlignmentC)) { + return Status::kErrorMisalignedOperand; + } + + if (!TensorRef_aligned(ref_D, kAlignmentC)) { + return Status::kErrorMisalignedOperand; + } + + return Status::kSuccess; + } + + /// Executes one GEMM + CUTLASS_DEVICE + void operator()(Params const ¶ms, SharedStorage &shared_storage) { + // Compute threadblock location + ThreadblockSwizzle threadblock_swizzle; + + cutlass::gemm::GemmCoord threadblock_tile_offset = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // Early exit if CTA is out of range + if (params.grid_tiled_shape.m() <= threadblock_tile_offset.m() || + params.grid_tiled_shape.n() <= threadblock_tile_offset.n()) { + return; + } + + // Compute initial location in logical coordinates + cutlass::MatrixCoord tb_offset_A{ + threadblock_tile_offset.m() * Mma::Shape::kM, + threadblock_tile_offset.k() * params.gemm_k_size, + }; + + cutlass::MatrixCoord tb_offset_B{ + threadblock_tile_offset.k() * params.gemm_k_size, + threadblock_tile_offset.n() * Mma::Shape::kN}; + + // Problem size is a function of threadblock index in the K dimension + int problem_size_k = + min(params.problem_size.k(), + (threadblock_tile_offset.k() + 1) * params.gemm_k_size); + + // Compute threadblock-scoped matrix multiply-add + int gemm_k_iterations = + (problem_size_k - tb_offset_A.column() + Mma::Shape::kK - 1) / + Mma::Shape::kK; + + // Compute position within threadblock + int thread_idx = threadIdx.x; + + // Construct iterators to A and B operands + typename Mma::IteratorA iterator_A( + params.params_A, params.ref_A.data(), + {params.problem_size.m(), problem_size_k}, thread_idx, tb_offset_A, + params.gather_A_indices); + + typename Mma::IteratorB iterator_B( + params.params_B, params.ref_B.data(), + {problem_size_k, params.problem_size.n()}, thread_idx, tb_offset_B, + params.gather_B_indices); + + // Broadcast the warp_id computed by lane 0 to ensure dependent code + // is compiled as warp-uniform. + int warp_idx = canonical_warp_idx_sync(); + int lane_idx = threadIdx.x % 32; + + // + // Main loop + // + + // Construct thread-scoped matrix multiply + Mma mma(shared_storage.main_loop, thread_idx, warp_idx, lane_idx); + + typename Mma::FragmentC accumulators; + + accumulators.clear(); + + if (!kSplitKSerial || gemm_k_iterations > 0) { + // Compute threadblock-scoped matrix multiply-add + mma(gemm_k_iterations, accumulators, iterator_A, iterator_B, accumulators, + params.scale_A, params.scale_B); + } + + // + // Epilogue + // + + OutputOp output_op(params.output_op); + + // + // Masked tile iterators constructed from members + // + + threadblock_tile_offset = + threadblock_swizzle.get_tile_offset(params.swizzle_log_tile); + + // assume identity swizzle + MatrixCoord threadblock_offset(threadblock_tile_offset.m() * Mma::Shape::kM, + threadblock_tile_offset.n() * + Mma::Shape::kN); + + int block_idx = threadblock_tile_offset.m() + + threadblock_tile_offset.n() * params.grid_tiled_shape.m(); + + // Construct the semaphore. + Semaphore semaphore(params.semaphore + block_idx, thread_idx); + + // If performing a reduction via split-K, fetch the initial synchronization + if (kSplitKSerial && params.grid_tiled_shape.k() > 1) { + // Fetch the synchronization lock initially but do not block. + semaphore.fetch(); + + // Indicate which position in a serial reduction the output operator is + // currently updating + output_op.set_k_partition(threadblock_tile_offset.k(), + params.grid_tiled_shape.k()); + } + + // Tile iterator loading from source tensor. + typename Epilogue::OutputTileIterator iterator_C( + params.params_C, params.ref_C.data(), params.problem_size.mn(), + thread_idx, threadblock_offset, params.scatter_D_indices); + + // Tile iterator writing to destination tensor. + typename Epilogue::OutputTileIterator iterator_D( + params.params_D, params.ref_D.data(), params.problem_size.mn(), + thread_idx, threadblock_offset, params.scatter_D_indices); + + Epilogue epilogue(shared_storage.epilogue, thread_idx, warp_idx, lane_idx); + + // Wait on the semaphore - this latency may have been covered by iterator + // construction + if (kSplitKSerial && params.grid_tiled_shape.k() > 1) { + // For subsequent threadblocks, the source matrix is held in the 'D' + // tensor. + if (threadblock_tile_offset.k()) { + iterator_C = iterator_D; + } + + semaphore.wait(threadblock_tile_offset.k()); + } + + // Execute the epilogue operator to update the destination tensor. + epilogue(output_op, iterator_D, accumulators, iterator_C); + + // + // Release the semaphore + // + + if (kSplitKSerial && params.grid_tiled_shape.k() > 1) { + int lock = 0; + if (params.grid_tiled_shape.k() == threadblock_tile_offset.k() + 1) { + // The final threadblock resets the semaphore for subsequent grids. + lock = 0; + } else { + // Otherwise, the semaphore is incremented + lock = threadblock_tile_offset.k() + 1; + } + + semaphore.release(lock); + } + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace kernel +} // namespace gemm +} // namespace cutlass diff --git a/include/cutlass/gemm/kernel/gemv.h b/include/cutlass/gemm/kernel/gemv.h index 4264080c..4d6b42f4 100644 --- a/include/cutlass/gemm/kernel/gemv.h +++ b/include/cutlass/gemm/kernel/gemv.h @@ -247,7 +247,7 @@ public: Status update(Arguments const &args) { output_op = args.output_op; - ref_A = ref_A; + ref_A = args.ref_A; ptr_B = args.ptr_B; ptr_C = args.ptr_C; ptr_D = args.ptr_D; @@ -480,7 +480,7 @@ public: problem_size = args.problem_size; batch_count = args.batch_count; output_op = args.output_op; - ref_A = ref_A; + ref_A = args.ref_A; ptr_B = args.ptr_B; ptr_C = args.ptr_C; ptr_D = args.ptr_D; diff --git a/include/cutlass/gemm/kernel/sm100_gemm_array_tma_warpspecialized_input_transform.hpp b/include/cutlass/gemm/kernel/sm100_gemm_array_tma_warpspecialized_input_transform.hpp index 47b1ce2c..48b1f738 100644 --- a/include/cutlass/gemm/kernel/sm100_gemm_array_tma_warpspecialized_input_transform.hpp +++ b/include/cutlass/gemm/kernel/sm100_gemm_array_tma_warpspecialized_input_transform.hpp @@ -1146,7 +1146,9 @@ public: // support fixup operations needed by split-/stream-K. These operations are pushed // to the collective layer so that they can reuse the TMEM -> RF copy performed // at the collective layer. - auto [mma2accum_pipeline_state_next] = collective_epilogue( + auto [mma2accum_pipeline_state_next, epi_load_pipe_consumer_state_next] = collective_epilogue( + epi_load_pipeline, + epi_load_pipe_consumer_state, mma2accum_pipeline, mma2accum_pipeline_consumer_state, problem_shape_MNKL, @@ -1157,6 +1159,7 @@ public: ); // Advance the mm2accum pipe mma2accum_pipeline_consumer_state = mma2accum_pipeline_state_next; + epi_load_pipe_consumer_state = epi_load_pipe_consumer_state_next; } work_tile_info = next_work_tile_info; diff --git a/include/cutlass/gemm/kernel/sm100_gemm_tma_warpspecialized_input_transform.hpp b/include/cutlass/gemm/kernel/sm100_gemm_tma_warpspecialized_input_transform.hpp index 7e920b2f..67853638 100644 --- a/include/cutlass/gemm/kernel/sm100_gemm_tma_warpspecialized_input_transform.hpp +++ b/include/cutlass/gemm/kernel/sm100_gemm_tma_warpspecialized_input_transform.hpp @@ -144,8 +144,9 @@ public: static constexpr bool IsSchedDynamicPersistent = TileScheduler::IsDynamicPersistent; // Transfer registers from regular warps to Accum warps - static constexpr uint32_t GenericRegisterRequirement = 152; - static constexpr uint32_t AccumRegisterRequirement = 200; + static constexpr uint32_t GenericRegisterRequirement = 64; + static constexpr uint32_t TransformRegisterRequirement = 184; + static constexpr uint32_t AccumRegisterRequirement = 256; // Pipeline and pipeline state types using Load2TransformPipeline = typename CollectiveMainloop::Load2TransformPipeline; @@ -769,7 +770,7 @@ public: else if (is_participant.transformation) { // Register reconfiguration - arch::warpgroup_reg_dealloc(); + arch::warpgroup_reg_alloc(); // Signal the epilogue warps to proceed once the prologue is complete epilogue_throttle_barrier.arrive(); @@ -781,18 +782,19 @@ public: auto k_tile_count = TileScheduler::get_work_k_tile_count(work_tile_info, problem_shape_MNKL, CtaShape_MNK{}); auto k_tile_start = TileScheduler::get_work_k_tile_start(work_tile_info); auto k_tile_iter = cute::make_coord_iterator(idx2crd(k_tile_start, shape<3>(gA_mkl)), shape<3>(gA_mkl)); - auto [load2transform_pipeline_consumer_state_next, transform2mma_pipeline_producer_state_next] = collective_mainloop.transform( - load2transform_pipeline, - load2transform_pipeline_consumer_state, - transform2mma_pipeline, - transform2mma_pipeline_producer_state, - bulk_tmem, - transform_inputs, - k_tile_iter, k_tile_count - ); - transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state_next; - load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state_next; - + { + auto [load2transform_pipeline_consumer_state_next, transform2mma_pipeline_producer_state_next] = collective_mainloop.transform( + load2transform_pipeline, + load2transform_pipeline_consumer_state, + transform2mma_pipeline, + transform2mma_pipeline_producer_state, + bulk_tmem, + transform_inputs, + k_tile_iter, k_tile_count + ); + transform2mma_pipeline_producer_state = transform2mma_pipeline_producer_state_next; + load2transform_pipeline_consumer_state = load2transform_pipeline_consumer_state_next; + } // Fetch next work tile auto [next_work_tile_info, increment_pipe] = scheduler.fetch_next_work( work_tile_info, @@ -950,7 +952,9 @@ public: // Wait for tmem allocation tmem_allocation_result_barrier.arrive_and_wait_unaligned(); - auto accum_inputs = collective_mainloop.accum_init(bulk_tmem, typename CollectiveEpilogue::CopyOpT2R{}, typename CollectiveEpilogue::EpilogueTile{}); + auto accum_inputs = [&]() { + return collective_mainloop.accum_init(bulk_tmem, typename CollectiveEpilogue::CopyOpT2R{}, typename CollectiveEpilogue::EpilogueTile{}); + }(); bool do_tail_store = false; do { // Fetch next work tile @@ -967,12 +971,12 @@ public: auto k_tile_count = TileScheduler::get_work_k_tile_count(work_tile_info, problem_shape_MNKL, CtaShape_MNK{}); if constexpr (InputTransformType == cutlass::gemm::detail::KernelInputTransformType::FastF32) { - auto [mma2accum_pipeline_consumer_state_next,tTR_rGlobAcc] = collective_mainloop.accum( - accum_inputs, - mma2accum_pipeline, - mma2accum_pipeline_consumer_state, - k_tile_count); - + auto [mma2accum_pipeline_consumer_state_next,tTR_rGlobAcc] = + collective_mainloop.accum( + accum_inputs, + mma2accum_pipeline, + mma2accum_pipeline_consumer_state, + k_tile_count); mma2accum_pipeline_consumer_state_next = scheduler.template fixup( TiledMma{}, work_tile_info, @@ -1028,7 +1032,9 @@ public: // Epilogue and write to gD // if (scheduler.compute_epilogue(work_tile_info)) { - auto [mma2accum_pipeline_state_next] = collective_epilogue( + auto [mma2accum_pipeline_state_next, epi_load_pipe_consumer_state_next] = collective_epilogue( + epi_load_pipeline, + epi_load_pipe_consumer_state, mma2accum_pipeline, mma2accum_pipeline_consumer_state, problem_shape_MNKL, @@ -1039,6 +1045,7 @@ public: ); // Advance the mm2accum pipe mma2accum_pipeline_consumer_state = mma2accum_pipeline_state_next; + epi_load_pipe_consumer_state = epi_load_pipe_consumer_state_next; } } diff --git a/include/cutlass/gemm/kernel/sm100_tile_scheduler.hpp b/include/cutlass/gemm/kernel/sm100_tile_scheduler.hpp index da63fe53..739010c3 100755 --- a/include/cutlass/gemm/kernel/sm100_tile_scheduler.hpp +++ b/include/cutlass/gemm/kernel/sm100_tile_scheduler.hpp @@ -621,7 +621,7 @@ public: , "r"(clc_response.data[1]) , "r"(clc_response.data[2]) , "r"(clc_response.data[3])); - cutlass::arch::fence_view_async_shared(); + cutlass::arch::fence_view_shared(); #endif } diff --git a/include/cutlass/gemm/kernel/sm100_tile_scheduler_stream_k.hpp b/include/cutlass/gemm/kernel/sm100_tile_scheduler_stream_k.hpp index 94dcfa65..54d81cab 100644 --- a/include/cutlass/gemm/kernel/sm100_tile_scheduler_stream_k.hpp +++ b/include/cutlass/gemm/kernel/sm100_tile_scheduler_stream_k.hpp @@ -226,7 +226,7 @@ public: PipelineState advance_to_next_work(Pipeline& clc_pipeline, PipelineState clc_pipe_producer_state) const { return sm100_scheduler_.advance_to_next_work(clc_pipeline, clc_pipe_producer_state); - } + } // Given the inputs, computes the total number of output blocks this problem will compute over template diff --git a/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_array_tma_warpspecialized.hpp b/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_array_tma_warpspecialized.hpp index d9127d92..c90b3e3d 100644 --- a/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_array_tma_warpspecialized.hpp +++ b/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_array_tma_warpspecialized.hpp @@ -381,11 +381,19 @@ public: // more than 4 CTAs implementable &= (args.hw_info.cluster_shape.x <= 4 && args.hw_info.cluster_shape.y <= 4 && args.hw_info.cluster_shape_fallback.x <= 4 && args.hw_info.cluster_shape_fallback.y <= 4); + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Cluster Shapes cannot be greater than 4.\n"); + return implementable; + } } else { // Special cluster check for scale factor multicasts. Due to limited size of scale factors, we can't multicast among // more than 4 CTAs implementable &= ((size<0>(ClusterShape{}) <= 4) && (size<1>(ClusterShape{}) <= 4)); + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Cluster Shapes cannot be greater than 4.\n"); + return implementable; + } } } diff --git a/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_tma_warpspecialized.hpp b/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_tma_warpspecialized.hpp index ae393783..455464e6 100644 --- a/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_tma_warpspecialized.hpp +++ b/include/cutlass/gemm/kernel/sm103_blockscaled_gemm_tma_warpspecialized.hpp @@ -322,11 +322,19 @@ public: // more than 4 CTAs implementable &= (args.hw_info.cluster_shape.x <= 4 && args.hw_info.cluster_shape.y <= 4 && args.hw_info.cluster_shape_fallback.x <= 4 && args.hw_info.cluster_shape_fallback.y <= 4); + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Cluster Shapes cannot be greater than 4.\n"); + return implementable; + } } else { // Special cluster check for scale factor multicasts. Due to limited size of scale factors, we can't multicast among // more than 4 CTAs implementable &= ((size<0>(ClusterShape{}) <= 4) && (size<1>(ClusterShape{}) <= 4)); + if (!implementable) { + CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Cluster Shapes cannot be greater than 4.\n"); + return implementable; + } } return implementable; diff --git a/include/cutlass/gemm/kernel/sm90_tile_scheduler_stream_k.hpp b/include/cutlass/gemm/kernel/sm90_tile_scheduler_stream_k.hpp index 6d134322..1e206aa6 100644 --- a/include/cutlass/gemm/kernel/sm90_tile_scheduler_stream_k.hpp +++ b/include/cutlass/gemm/kernel/sm90_tile_scheduler_stream_k.hpp @@ -328,7 +328,7 @@ public: CUTLASS_DEVICE bool is_last_tile(WorkTileInfo work_tile_info, uint32_t advance_count = 1) const { - // Never pass this by reference; it needs a copy, + // Never pass this by reference; it needs a copy, // because continue_current_work will modify it. if (continue_current_work(work_tile_info)) { return false; diff --git a/include/cutlass/gemm/threadblock/default_mma_core_sm80.h b/include/cutlass/gemm/threadblock/default_mma_core_sm80.h index d9817dca..578e5cc7 100644 --- a/include/cutlass/gemm/threadblock/default_mma_core_sm80.h +++ b/include/cutlass/gemm/threadblock/default_mma_core_sm80.h @@ -57,6 +57,7 @@ #include "cutlass/gemm/threadblock/default_mma_core.h" #include "cutlass/gemm/threadblock/default_multistage_mma_complex_core.h" #include "cutlass/gemm/threadblock/default_multistage_mma_complex_core_sm80.h" +#include "cutlass/gemm/threadblock/mma_multistage_blockwise.h" #include "cutlass/matrix_shape.h" #include "cutlass/numeric_types.h" diff --git a/include/cutlass/gemm/threadblock/default_mma_multistage_blockwise.h b/include/cutlass/gemm/threadblock/default_mma_multistage_blockwise.h new file mode 100644 index 00000000..7850ed14 --- /dev/null +++ b/include/cutlass/gemm/threadblock/default_mma_multistage_blockwise.h @@ -0,0 +1,212 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Template for a pipelined GEMM kernel for row-major output (OperatorClass TensorOp) and calls MmaMultistageBlockwise threadblock-scoped multistage matrix multiply + that supports additional scaling operands. Does not compute batching or support split-K. +*/ + +#pragma once + +#include "cutlass/arch/arch.h" +#include "cutlass/arch/wmma.h" +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/threadblock/default_mma_core_simt.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm70.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm75.h" +#include "cutlass/gemm/threadblock/default_mma_core_sm80.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/layout/permute.h" +#include "cutlass/numeric_types.h" +#include "cutlass/transform/threadblock/predicated_tile_iterator.h" +#include "cutlass/transform/threadblock/predicated_tile_iterator_2dthreadtile.h" + +#if defined(CUTLASS_ARCH_WMMA_ENABLED) +#include "cutlass/gemm/threadblock/default_mma_core_wmma.h" +#endif // CUTLASS_ARCH_WMMA_ENABLED + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace threadblock { + +template < + /// Element type for A matrix operand + typename ElementA_, + /// Layout type for A matrix operand + typename LayoutA_, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB_, + /// Layout type for B matrix operand + typename LayoutB_, + /// Access granularity of B matrix in units of elements + int kAlignmentB, + /// Element type for internal accumulation + typename ElementAccumulator_, + /// Layout type for C and D matrix operands + typename LayoutC_, + /// Element Type for scales. + typename ElementScale, + /// Layout ytpe for scales. + typename LayoutSclae, + /// Operator class tag + typename OperatorClass_, + /// Tag indicating architecture to tune for + typename ArchTag_, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape_, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape_, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape_, + /// Number of stages used in the pipelined mainloop + int Stages, + /// Operation perfomed by GEMM + typename Operator, + /// Store the accumulators in row major or column major. Row major is used + /// when output layout is interleaved. + bool AccumulatorsInRowMajor = false, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear = SharedMemoryClearOption::kNone, + /// Gather operand A by using an index array + bool GatherA = false, + /// Gather operand B by using an index array + bool GatherB = false, + /// Permute operand A + typename PermuteALayout = layout::NoPermute, + /// Permute operand B + typename PermuteBLayout = layout::NoPermute> +struct DefaultMmaBlockwise; + +template < + /// Element type for A matrix operand + typename ElementA, + /// Layout type for A matrix operand + typename LayoutA, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB, + /// Layout type for B matrix operand + typename LayoutB, + /// Access granularity of B matrix in units of elements + int kAlignmentB, + /// Element type for internal accumulation + typename ElementAccumulator, + /// Layout type for C and D matrix operand + typename LayoutC, + /// Element Type for scales. + typename ElementScale, + /// Layout ytpe for scales. + typename LayoutScale, + /// Tag indicating architecture to tune for + typename ArchTag, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape, + /// Number of stages used in the multistage mainloop + int Stages, + /// Operation perfomed by GEMM + typename Operator, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear, + /// Gather operand A by using an index array + bool GatherA, + /// Gather operand B by using an index array + bool GatherB, + /// Permute operand A + typename PermuteALayout, + /// Permute operand B + typename PermuteBLayout> +struct DefaultMmaBlockwise< + ElementA, LayoutA, kAlignmentA, ElementB, LayoutB, kAlignmentB, + ElementAccumulator, LayoutC, ElementScale, LayoutScale, arch::OpClassTensorOp, ArchTag, + ThreadblockShape, WarpShape, InstructionShape, Stages, Operator, false, + SharedMemoryClear, GatherA, GatherB, PermuteALayout, PermuteBLayout> { + static_assert(platform::is_same::value || + platform::is_same>::value, + "simt epilogue must be row major"); + + static cutlass::arch::CacheOperation::Kind const CacheOpA = + ((sizeof_bits::value * kAlignmentA) == 128) + ? cutlass::arch::CacheOperation::Global + : cutlass::arch::CacheOperation::Always; + + static cutlass::arch::CacheOperation::Kind const CacheOpB = + ((sizeof_bits::value * kAlignmentB) == 128) + ? cutlass::arch::CacheOperation::Global + : cutlass::arch::CacheOperation::Always; + + // Define the MmaCore components + using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< + ThreadblockShape, WarpShape, InstructionShape, ElementA, LayoutA, + ElementB, LayoutB, ElementAccumulator, LayoutC, arch::OpClassTensorOp, + Stages, Operator, false, CacheOpA, CacheOpB>; + + // Define iterators over tiles from the A operand + using ThreadMapA = typename MmaCore::IteratorThreadMapA; + using AccessTypeA = cutlass::Array; + using IteratorA = + cutlass::transform::threadblock::PredicatedTileAccessIterator< + cutlass::MatrixShape, + ElementA, LayoutA, 1, ThreadMapA, AccessTypeA, GatherA, + PermuteALayout>; + + // Define iterators over tiles from the B operand + using ThreadMapB = typename MmaCore::IteratorThreadMapB; + using AccessTypeB = cutlass::Array; + using IteratorB = + cutlass::transform::threadblock::PredicatedTileAccessIterator< + cutlass::MatrixShape, + ElementB, LayoutB, 0, ThreadMapB, AccessTypeB, GatherB, + PermuteBLayout>; + + // Define the threadblock-scoped multistage matrix multiply + using ThreadblockMma = cutlass::gemm::threadblock::MmaMultistageBlockwise< + typename MmaCore::Shape, IteratorA, typename MmaCore::SmemIteratorA, + MmaCore::kCacheOpA, IteratorB, typename MmaCore::SmemIteratorB, + MmaCore::kCacheOpB, ElementAccumulator, LayoutC, + ElementScale, LayoutScale, + typename MmaCore::MmaPolicy, Stages, SharedMemoryClear>; +}; + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/threadblock/mma_multistage.h b/include/cutlass/gemm/threadblock/mma_multistage.h index 5b7427b8..e9045c18 100644 --- a/include/cutlass/gemm/threadblock/mma_multistage.h +++ b/include/cutlass/gemm/threadblock/mma_multistage.h @@ -729,6 +729,9 @@ public: // Perform the MAC-iterations gemm_iters(gemm_k_iterations, accum, iterator_A, iterator_B); } + + // Expose pipeline state via alias without changing its original access level + using PublicPipeState = PipeState; }; ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/gemm/threadblock/mma_multistage_blockwise.h b/include/cutlass/gemm/threadblock/mma_multistage_blockwise.h new file mode 100644 index 00000000..9903b8b9 --- /dev/null +++ b/include/cutlass/gemm/threadblock/mma_multistage_blockwise.h @@ -0,0 +1,449 @@ +/*************************************************************************************************** + * Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + +/*! \file + \brief Template for a double-buffered threadblock-scoped GEMM kernel that performs blockwise + scaling dequantization in the MMA for input matrices A and B. +*/ + +#pragma once + +#include "cutlass/aligned_buffer.h" +#include "cutlass/arch/memory.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/threadblock/mma_base.h" +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_types.h" +#include "cutlass/gemm/threadblock/mma_multistage.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace threadblock { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Iterates over tiles of A operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorA_, + /// Iterates over tiles of A operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorA_, + /// Cache operation for operand A + cutlass::arch::CacheOperation::Kind CacheOpA, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Cache operation for operand B + cutlass::arch::CacheOperation::Kind CacheOpB, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Element Type for for the scalesl + typename ElementScale_, + /// Layout for the scales. + typename LayoutScale_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Number of stages, + int Stages, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear = SharedMemoryClearOption::kNone, + /// Used for partial specialization + typename Enable = bool> +class MmaMultistageBlockwise : public MmaMultistage { +public: + ///< Base class + using Base = MmaMultistage; + ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using Shape = Shape_; + ///< Iterates over tiles of A operand in global memory + using IteratorA = IteratorA_; + ///< Iterates over tiles of B operand in global memory + using IteratorB = IteratorB_; + ///< Data type of accumulator matrix + using ElementC = ElementC_; + ///< Layout of accumulator matrix + using LayoutC = LayoutC_; + /// Data type of scales + using ElementScale = ElementScale_; + /// Layout Type of Scales. + using LayoutScale = LayoutScale_; + ///< Policy describing tuning details + using Policy = Policy_; + + using SmemIteratorA = SmemIteratorA_; + using SmemIteratorB = SmemIteratorB_; + + static cutlass::arch::CacheOperation::Kind const kCacheOpA = CacheOpA; + static cutlass::arch::CacheOperation::Kind const kCacheOpB = CacheOpB; + + // + // Dependent types + // + + /// Fragment of accumulator tile + using FragmentC = typename Policy::Operator::FragmentC; + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Minimum architecture is Sm80 to support cp.async + using ArchTag = arch::Sm80; + + /// Complex transform on A operand + static ComplexTransform const kTransformA = Operator::kTransformA; + + /// Complex transform on B operand + static ComplexTransform const kTransformB = Operator::kTransformB; + + // Reference to the canonical MmaMultistage specialization with identical + // template arguments. This enables us to reuse its helper structures + // (Detail and PipeState) without redefining them here. + using BaseMma = MmaMultistage; + + /// Internal structure exposed for introspection (aliased from BaseMma). + using Detail = typename BaseMma::Detail; + + // Bring selected base-class helpers into scope so that calls like + // advance_smem_read_stage() resolve correctly in a dependent-name + // context where two-phase lookup would otherwise ignore the base + // class. + using Base::advance_smem_read_stage; + using Base::advance_smem_write_stage; + using Base::copy_tiles_and_advance; + using Base::prologue; + using Base::gmem_wait; + using Base::wind_down; + +private: + // Pipeline state structure reused from the canonical multistage kernel. + using PipeState = typename BaseMma::PublicPipeState; + +private: + // + // Data members + // + + /// Warp-level MMA operator + Operator warp_mma_; + +public: + /// Construct from tensor references + CUTLASS_DEVICE + MmaMultistageBlockwise( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + typename Base::SharedStorage &shared_storage, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : Base(shared_storage, thread_idx, warp_idx, lane_idx) + { + // All per-warp iterator adjustments are handled by the base-class + // constructor, so no additional work is required here. + } + + /// Perform a threadblock mainloop iteration of matrix multiply-accumulate + CUTLASS_DEVICE + void mac_loop_iter( + PipeState &pipe_state, ///< [in|out] loop-carried pipeline state + FragmentC &accum, ///< [in|out] destination accumulator tile + IteratorA &iterator_A, ///< [in|out] iterator over A operand in global memory + IteratorB &iterator_B, ///< [in|out] iterator over B operand in global memory + int &gemm_k_iterations, + cutlass::TensorRef scale_A, // blockwise scale tensor for A + cutlass::TensorRef scale_B, // blockwise scale tensor for B + int k_iter_idx, ///< current K-block index processed by this iteration + int block_m_idx, ///< threadblock index along M dimension (row) + int block_n_idx) ///< threadblock index along N dimension (col) + { + // Unroll the warp-level MMA tiles of a threadblock's mainloop iteration + CUTLASS_PRAGMA_UNROLL + for (int warp_mma_k = 0; warp_mma_k < Base::kWarpGemmIterations; + ++warp_mma_k) { + + // Load the next warp-tile's A fragment from shared memory + this->warp_tile_iterator_A_.set_kgroup_index((warp_mma_k + 1) % Base::kWarpGemmIterations); + this->warp_tile_iterator_A_.load(pipe_state.warp_loaded_frag_A_[(warp_mma_k + 1) % 2]); + ++this->warp_tile_iterator_A_; + + // Load the next warp-tile's B fragment from shared memory + this->warp_tile_iterator_B_.set_kgroup_index((warp_mma_k + 1) % Base::kWarpGemmIterations); + this->warp_tile_iterator_B_.load(pipe_state.warp_loaded_frag_B_[(warp_mma_k + 1) % 2]); + ++this->warp_tile_iterator_B_; + + // Except for the first warp-tile, all warp-tiles convert their incoming shared memory fragments as necessary + if (warp_mma_k > 0) { + warp_mma_.transform(pipe_state.warp_transformed_frag_A_[warp_mma_k % 2], + pipe_state.warp_transformed_frag_B_[warp_mma_k % 2], + pipe_state.warp_loaded_frag_A_[warp_mma_k % 2], + pipe_state.warp_loaded_frag_B_[warp_mma_k % 2]); + } + + // Compute scale factor for the current (M-tile, N-tile, K-tile) triple. + // The K-tile index used for scaling must not exceed the allocated range + // of the scale tensors. This situation can arise in the prologue / + // epilogue iterations of the multistage pipeline when the software + // pipeline executes Stages-1 extra iterations with gemm_k_iterations < 0. + + int ldA = int(scale_A.layout().stride(0)); + int k_block_idx = k_iter_idx; + if (k_block_idx >= ldA) { + k_block_idx = ldA - 1; + } + + float scale_factor = scale_A.at({block_m_idx, k_block_idx}) * + scale_B.at({block_n_idx, k_block_idx}); + + // Perform MMA into a temporary fragment (unscaled) + FragmentC delta; + FragmentC zero_frag; + zero_frag.clear(); + + warp_mma_(delta, pipe_state.warp_transformed_frag_A_[warp_mma_k % 2], + pipe_state.warp_transformed_frag_B_[warp_mma_k % 2], zero_frag); + + // Apply dequantization scaling + CUTLASS_PRAGMA_UNROLL + for (int el = 0; el < FragmentC::kElements; ++el) { + delta[el] *= scale_factor; + } + + // Accumulate the scaled contribution + plus plus_accum; + + if (Detail::kStagedAccumulation) { + pipe_state.tmp_accum_ = plus_accum(pipe_state.tmp_accum_, delta); + + if (warp_mma_k == 0) { + accum = plus_accum(accum, pipe_state.tmp_accum_); + pipe_state.tmp_accum_.clear(); + } + } else { + accum = plus_accum(accum, delta); + } + + // Except for the last warp-tile, all warp-tiles issue their share of + // global->shared fragment copies + if (warp_mma_k < Base::kWarpGemmIterations - 1) { + int group_start_iteration_A, group_start_iteration_B; + group_start_iteration_A = warp_mma_k * Detail::kAccessesPerGroupA; + group_start_iteration_B = warp_mma_k * Detail::kAccessesPerGroupB; + + copy_tiles_and_advance(iterator_A, iterator_B, group_start_iteration_A, + group_start_iteration_B); + } + + // The second-to-last warp-tile also: + // - performs the last warp-tile's share of global->shared fragment + // copies + // - moves to the next global fetch stage + if (warp_mma_k + 2 == Base::kWarpGemmIterations) { + // Performs the last warp-tile's share of global->shared fragment copies + int group_start_iteration_A = + (warp_mma_k + 1) * Detail::kAccessesPerGroupA; + int group_start_iteration_B = + (warp_mma_k + 1) * Detail::kAccessesPerGroupB; + + copy_tiles_and_advance(iterator_A, iterator_B, group_start_iteration_A, + group_start_iteration_B); + + // Inserts a memory fence between stages of cp.async instructions. + cutlass::arch::cp_async_fence(); + + // Wait until we have at least one completed global fetch stage + gmem_wait(); + + // Move to the next global fetch stage + advance_smem_write_stage(iterator_A, iterator_B); + advance_smem_read_stage(); + + // Disable global fetching when done with global fetch iterations + --gemm_k_iterations; + iterator_A.clear_mask(gemm_k_iterations == 0); + iterator_B.clear_mask(gemm_k_iterations == 0); + } + + // The last warp-tile also converts the shared memory fragments used by + // the first warp-tile of the next iteration, if necessary (so we can + // immediately start issuing MMA instructions at the top of the loop ) + if (warp_mma_k + 1 == Base::kWarpGemmIterations) { + warp_mma_.transform( + pipe_state.warp_transformed_frag_A_[(warp_mma_k + 1) % 2], + pipe_state.warp_transformed_frag_B_[(warp_mma_k + 1) % 2], + pipe_state.warp_loaded_frag_A_[(warp_mma_k + 1) % 2], + pipe_state.warp_loaded_frag_B_[(warp_mma_k + 1) % 2]); + } + } + } + + /// Perform the specified number of threadblock mainloop iterations of matrix + /// multiply-accumulate. Assumes prologue has been initiated. + CUTLASS_DEVICE + void gemm_iters( + int gemm_k_iterations, ///< number of threadblock mainloop iterations + FragmentC &accum, ///< [in|out] accumulator tile + IteratorA &iterator_A, ///< [in|out] iterator over A operand in global memory + IteratorB &iterator_B, + cutlass::TensorRef scale_A, // blockwise scale tensor for A + cutlass::TensorRef scale_B, // blockwise scale tensor for B + int block_m_idx, + int block_n_idx) ///< [in|out] iterator over B operand in global memory + { + PipeState pipe_state; + + // Disable global fetching if done with global fetch iterations + iterator_A.clear_mask(gemm_k_iterations == 0); + iterator_B.clear_mask(gemm_k_iterations == 0); + + // Load first warp-tile's A fragment from shared memory + this->warp_tile_iterator_A_.set_kgroup_index(0); + this->warp_tile_iterator_A_.load(pipe_state.warp_loaded_frag_A_[0]); + ++this->warp_tile_iterator_A_; + + // Load first warp-tile's B fragment from shared memory + this->warp_tile_iterator_B_.set_kgroup_index(0); + this->warp_tile_iterator_B_.load(pipe_state.warp_loaded_frag_B_[0]); + ++this->warp_tile_iterator_B_; + + // Transform, if necessary, the first warp-tile's shared memory fragments + warp_mma_.transform(pipe_state.warp_transformed_frag_A_[0], + pipe_state.warp_transformed_frag_B_[0], + pipe_state.warp_loaded_frag_A_[0], + pipe_state.warp_loaded_frag_B_[0]); + + if (Detail::kStagedAccumulation) { + pipe_state.tmp_accum_.clear(); + } + + // Mainloop + int k_iter_idx = 0; + + CUTLASS_GEMM_LOOP + for (; gemm_k_iterations > (-Base::kStages + 1); ++k_iter_idx) { + mac_loop_iter(pipe_state, accum, iterator_A, iterator_B, + gemm_k_iterations, scale_A, scale_B, k_iter_idx, + block_m_idx, block_n_idx); + } + + if (Detail::kStagedAccumulation) { + plus plus_accum; + accum = plus_accum(accum, pipe_state.tmp_accum_); + } + + // Commit and drain all pending and predicated cp.async pnz from the GEMM + // mainloop + cutlass::arch::cp_async_fence(); + cutlass::arch::cp_async_wait<0>(); + __syncthreads(); + } + + /// Perform a threadblock-scoped matrix multiply-accumulate + CUTLASS_DEVICE + void operator()( + ///< problem size of GEMM + int gemm_k_iterations, + ///< destination accumulator tile + FragmentC &accum, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + ///< initial value of accumulator + FragmentC const &src_accum, + cutlass::TensorRef scaleA, + cutlass::TensorRef scaleB) { + // Each scale element corresponds to a 128x128 tile along (M, K) for A and + // (N, K) for B. Grid dimension X enumerates threadblock tiles along M and + // grid dimension Y along N when GemmIdentityThreadblockSwizzle is used with + // the default N = 1 (tile = 1). Therefore, + // blockIdx.x -> tile index along the M dimension + // blockIdx.y -> tile index along the N dimension. + + constexpr int kScaleBlock = 128; + // Row-wise block index for A (and output C/D) – one per 128 rows. + int block_m_idx = (blockIdx.x * Shape::kM) / kScaleBlock; + + // Column-wise block index for B – one per 128 columns. Note that each + // threadblock processes Shape::kN columns, which may be < 128 (64 in this + // kernel). We therefore map two consecutive threadblock tiles onto the + // same 128-wide scale block when Shape::kN < kScaleBlock. + int block_n_idx = (blockIdx.y * Shape::kN) / kScaleBlock; + + // Prologue (start fetching iterations of global fragments into shared + // memory) + prologue(iterator_A, iterator_B, gemm_k_iterations); + + // Wait until we have at least one completed global fetch stage + gmem_wait(); + + // Initialize destination accumulators with source accumulators + accum = src_accum; + + // Perform the MAC-iterations with blockwise dequantization + gemm_iters(gemm_k_iterations, accum, iterator_A, iterator_B, scaleA, scaleB, + block_m_idx, block_n_idx); + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/cutlass/layout/permute.h b/include/cutlass/layout/permute.h index 3464d7f5..b311010e 100644 --- a/include/cutlass/layout/permute.h +++ b/include/cutlass/layout/permute.h @@ -39,7 +39,9 @@ */ #pragma once #include "cutlass/cutlass.h" +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/fast_math.h" #include "cutlass/layout/pitch_linear.h" #include "cutlass/layout/matrix.h" diff --git a/include/cutlass/numeric_conversion.h b/include/cutlass/numeric_conversion.h index 42f3c912..e9463b20 100644 --- a/include/cutlass/numeric_conversion.h +++ b/include/cutlass/numeric_conversion.h @@ -3678,30 +3678,537 @@ template < struct NumericArrayConverter : public PackedNumericArrayConverter {}; +///////////////////////////////////////////////////////////////////////////////////////////////// +// +// Helpers for PTX conversion with inline assembly (used in the following partial specializations) +// Specifically, we use lookup tables for converting e2m1 to bf16, half and float_e4m3 and float_e5m2 +// +///////////////////////////////////////////////////////////////////////////////////////////////// + + +#if defined(CUDA_PTX_FP4FP6_CVT_ENABLED) && __CUDA_ARCH__ >= 1100 + #define USE_PTX_CONVERT 1 +#endif + + + +namespace detail { + +///////////////////////////////////////////////////////////////////////////////////////////////// +// +// E2M1 Conversion Helper Functions to BF16 +// +///////////////////////////////////////////////////////////////////////////////////////////////// + + /**************************************************************************** + E2M1 to BF16 Conversion Table: + +-----------------+-------------------------------+---------------+ + | E2M1 Pattern | BF16 Pattern | Numeric Value | + | (s E E M) | (s EEEEEEEE MMMMMMM) | | + +-----------------+-------------------------------+---------------+ + | 0 00 0 | 0 00000000 0000000 | 0.0 | + | 0 00 1 | 0 01111110 0000000 | 0.5 | + | 0 01 0 | 0 01111111 0000000 | 1.0 | + | 0 01 1 | 0 01111111 1000000 | 1.5 | + | 0 10 0 | 0 10000000 0000000 | 2.0 | + | 0 10 1 | 0 10000000 1000000 | 3.0 | + | 0 11 0 | 0 10000001 0000000 | 4.0 | + | 0 11 1 | 0 10000001 1000000 | 6.0 | + +-----------------+-------------------------------+---------------+ + + bits 2-9 go into a LUT, the top 2 bits are inserted from E2M1 value (s E E M) + + +-----------------+-------------------+-----------+ + | E2M1 Pattern | LUT Value (8 bits)| Hex Value | + | (s E E M) | | | + +-----------------+-------------------+-----------+ + | 0 00 0 | 00000000 | 0x00 | + | 0 00 1 | 11111100 | 0xFC | + | 0 01 0 | 11111110 | 0xFE | + | 0 01 1 | 11111111 | 0xFF | + | 0 10 0 | 00000000 | 0x00 | + | 0 10 1 | 00000001 | 0x01 | + | 0 11 0 | 00000010 | 0x02 | + | 0 11 1 | 00000011 | 0x03 | + +-----------------+-------------------+-----------+ + + constexpr unsigned long long E2M1_to_BF16_LUT = 0x03020100FFFEFC00ULL; + constexpr unsigned int E2M1_to_BF16_UPPER_LUT = 0xc0804000U; + + ****************************************************************************/ + + // LUT _e2m1_to_bf16_x2: Direct E2M1->BF16 (converts 2 E2M1 to 2 BF16) + CUTLASS_DEVICE + void _e2m1_to_bf16_x2(unsigned int src, unsigned int& out0) { + constexpr unsigned long long lut = 0x03020100FFFEFC00ULL; + constexpr unsigned int upper_lut = 0xc0804000U; + constexpr unsigned int lut_lo = (unsigned int)lut; + constexpr unsigned int lut_hi = (unsigned int)(lut >> 32); + + asm( + "{\n\t" + ".reg .u32 prmt_ctrl01, target01, upper01;\n\t" + ".reg .u32 target0_1_, upper_0_1;\n\t" + ".reg .u32 upper_prmt_ctrl_01;\n\t" + "and.b32 prmt_ctrl01, %1, 0x0077;\n\t" + "shr.b32 upper_prmt_ctrl_01, %1, 2;\n\t" + "and.b32 upper_prmt_ctrl_01, upper_prmt_ctrl_01, 0x0033;\n\t" + "prmt.b32 target01, %2, %3, prmt_ctrl01;\n\t" + "prmt.b32 target0_1_, target01, target01, 0x3120;\n\t" // both 2 and 3 are known to be zero + "prmt.b32 upper01, %4, %4, upper_prmt_ctrl_01;\n\t" + "prmt.b32 upper_0_1, upper01, upper01, 0x1302;\n\t" // both 2 and 3 are known to be zero + "shl.b32 target0_1_, target0_1_, 6;\n\t" + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "}" + : "=r"(out0) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %1, %2, %3, %4 + ); + } + + // LUT x4 _e2m1_to_bf16_x4: Direct E2M1->BF16 (converts 4 E2M1 to 4 BF16 in one call) + CUTLASS_DEVICE + void _e2m1_to_bf16_x4(unsigned int src, unsigned int& out0, unsigned int& out1, unsigned int shift_count=0) { + constexpr unsigned long long lut = 0x03020100FFFEFC00ULL; // bit2 - 9 for e2m1 -> bf16 conversion + constexpr unsigned int upper_lut = 0xc0804000U; // bit0, bot1 for e2m1 -> bf16 conversion + constexpr unsigned int lut_lo = (unsigned int)lut; + constexpr unsigned int lut_hi = (unsigned int)(lut >> 32); + + + if (shift_count == 0) { + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 target0_1_, target2_3_, upper_0_1, upper_2_3;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "" + "and.b32 prmt_ctrl0123, %2, 0x7777;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %2, 2;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "prmt.b32 target0123, %3, %4, prmt_ctrl0123;\n\t" + "prmt.b32 target0_1_, target0123, %4, 0x4140;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 target2_3_, target0123, %4, 0x4342;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper0123, %5, %5, upper_prmt_ctrl_0123;\n\t" + "prmt.b32 upper_0_1, upper0123, %4, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper_2_3, upper0123, %4, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "shl.b32 target0_1_, target0_1_, 6;\n\t" + "shl.b32 target2_3_, target2_3_, 6;\n\t" + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "or.b32 %1, target2_3_, upper_2_3;\n\t" + "}" + : "=r"(out0), "=r"(out1) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %2, %3, %4, %5 + ); + } else if (shift_count == 16) { + // protect against future changes to the shift_count + assert(shift_count==16 && "shift_count should be 0 or 16"); + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 target0_1_, target2_3_, upper_0_1, upper_2_3;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "" + "shr.b32 prmt_ctrl0123, %2, 16;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %2, 18;\n\t" + "and.b32 prmt_ctrl0123, prmt_ctrl0123, 0x7777;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "prmt.b32 target0123, %3, %4, prmt_ctrl0123;\n\t" + "prmt.b32 target0_1_, target0123, %4, 0x4140;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 target2_3_, target0123, %4, 0x4342;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper0123, %5, %5, upper_prmt_ctrl_0123;\n\t" + "prmt.b32 upper_0_1, upper0123, %4, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper_2_3, upper0123, %4, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "shl.b32 target0_1_, target0_1_, 6;\n\t" + "shl.b32 target2_3_, target2_3_, 6;\n\t" + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "or.b32 %1, target2_3_, upper_2_3;\n\t" + "}" + : "=r"(out0), "=r"(out1) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %2, %3, %4, %5 + ); + } else { + assert((shift_count==0 || shift_count==16) && "shift_count should be 0 or 16"); + } + } + + // LUT x8 _e2m1_to_bf16_x8: Direct E2M1->BF16 (converts 8 E2M1 to 8 BF16 in one call) + CUTLASS_DEVICE + void _e2m1_to_bf16_x8(unsigned int src, unsigned int& out0, unsigned int& out1, unsigned int& out2, unsigned int& out3) { + _e2m1_to_bf16_x4(src, out0, out1, 0); + _e2m1_to_bf16_x4(src, out2, out3, 16); + } + + +///////////////////////////////////////////////////////////////////////////////////////////////// +// +// E2M1 Conversion Helper Functions to FP16 +// +///////////////////////////////////////////////////////////////////////////////////////////////// + + + /**************************************************************************** + E2M1 to FP16 Conversion Table: + +-----------------+-----------------------------------+---------------+---------------+ + | E2M1 Pattern | FP16 Pattern | MS Byte (Hex) | Numeric Value | + | (s E E M) | (s EEEEE MMMMMMMMMM) | (s EEEEE MM) | | + +-----------------+-----------------------------------+---------------+---------------+ + | 0 00 0 | 0 00000 0000000000 | 0x00 | 0.0 | + | 0 00 1 | 0 01110 0000000000 | 0x38 | 0.5 | + | 0 01 0 | 0 01111 0000000000 | 0x3C | 1.0 | + | 0 01 1 | 0 01111 1000000000 | 0x3E | 1.5 | + | 0 10 0 | 0 10000 0000000000 | 0x40 | 2.0 | + | 0 10 1 | 0 10000 1000000000 | 0x42 | 3.0 | + | 0 11 0 | 0 10001 0000000000 | 0x44 | 4.0 | + | 0 11 1 | 0 10001 1000000000 | 0x46 | 6.0 | + +-----------------+-----------------------------------+---------------+---------------+ + + constexpr unsigned long long E2M1_to_FP16_LUT = 0x464442403E3C3800ULL; + constexpr unsigned int E2M1_to_FP16_UPPER_LUT = 0xc0804000U; + + ****************************************************************************/ + + // LUT _e2m1_to_half_x2: Direct E2M1->FP16 (converts 2 E2M1 to 2 FP16) + CUTLASS_DEVICE + void _e2m1_to_half_x2(unsigned int src, unsigned int& out0) { + constexpr unsigned long long lut = 0x464442403E3C3800ULL; + constexpr unsigned int upper_lut = 0xc0804000U; + constexpr unsigned int lut_lo = (unsigned int)lut; + constexpr unsigned int lut_hi = (unsigned int)(lut >> 32); + + asm( + "{\n\t" + ".reg .u32 prmt_ctrl01, target01, upper01;\n\t" + ".reg .u32 target0_1_, upper_0_1;\n\t" + ".reg .u32 upper_prmt_ctrl_01;\n\t" + "and.b32 prmt_ctrl01, %1, 0x0077;\n\t" + "shr.b32 upper_prmt_ctrl_01, %1, 2;\n\t" + "and.b32 upper_prmt_ctrl_01, upper_prmt_ctrl_01, 0x0033;\n\t" + "prmt.b32 target01, %2, %3, prmt_ctrl01;\n\t" + "prmt.b32 target0_1_, target01, target01, 0x1302;\n\t" // both 2 and 3 are known to be zero + "prmt.b32 upper01, %4, %4, upper_prmt_ctrl_01;\n\t" + "prmt.b32 upper_0_1, upper01, upper01, 0x1302;\n\t" // both 2 and 3 are known to be zero + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "}" + : "=r"(out0) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %2, %3, %4, %5 + ); + } + + // LUT x4 _e2m1_to_half_x4: Direct E2M1->FP16 (converts 4 E2M1 to 4 FP16 in one call) + CUTLASS_DEVICE + void _e2m1_to_half_x4(unsigned int src, unsigned int& out0, unsigned int& out1, unsigned int shift_count=0) { + constexpr unsigned long long lut = 0x464442403E3C3800ULL; // bit0 - 7 for e2m1 -> half conversion + constexpr unsigned int upper_lut = 0xc0804000U; // bit0, bit1 for e2m1 -> FP16 conversion + constexpr unsigned int lut_lo = (unsigned int)lut; + constexpr unsigned int lut_hi = (unsigned int)(lut >> 32); + + assert((shift_count==0 || shift_count==16) && "shift_count should be 0 or 16"); + + if (shift_count == 0) { + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 target0_1_, target2_3_, upper_0_1, upper_2_3;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "" + "and.b32 prmt_ctrl0123, %2, 0x7777;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %2, 2;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "prmt.b32 target0123, %3, %4, prmt_ctrl0123;\n\t" + "prmt.b32 target0_1_, target0123, %5, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 target2_3_, target0123, %5, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper0123, %5, %5, upper_prmt_ctrl_0123;\n\t" + "prmt.b32 upper_0_1, upper0123, %5, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper_2_3, upper0123, %5, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "or.b32 %1, target2_3_, upper_2_3;\n\t" + "}" + : "=r"(out0), "=r"(out1) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %2, %3, %4, %5 + ); + } else /* shift_count == 16 */ { + // protect against future changes to the shift_count + assert(shift_count==16 && "shift_count should be 0 or 16"); + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 target0_1_, target2_3_, upper_0_1, upper_2_3;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "" + "shr.b32 prmt_ctrl0123, %2, 16;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %2, 18;\n\t" + "and.b32 prmt_ctrl0123, prmt_ctrl0123, 0x7777;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "prmt.b32 target0123, %3, %4, prmt_ctrl0123;\n\t" + "prmt.b32 target0_1_, target0123, %5, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 target2_3_, target0123, %5, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper0123, %5, %5, upper_prmt_ctrl_0123;\n\t" + "prmt.b32 upper_0_1, upper0123, %5, 0x1404;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "prmt.b32 upper_2_3, upper0123, %5, 0x3424;\n\t" // 4 is the low order byte of upper_lut which is 0x00 + "or.b32 %0, target0_1_, upper_0_1;\n\t" + "or.b32 %1, target2_3_, upper_2_3;\n\t" + "}" + : "=r"(out0), "=r"(out1) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) // %2, %3, %4, %5 + ); + } + } + + // LUT x8 _e2m1_to_half_x8: Direct E2M1->FP16 (converts 8 E2M1 to 8 FP16 in one call) + CUTLASS_DEVICE + void _e2m1_to_half_x8(unsigned int src, unsigned int& out0, unsigned int& out1, unsigned int& out2, unsigned int& out3) { + _e2m1_to_half_x4(src, out0, out1, 0); + _e2m1_to_half_x4(src, out2, out3, 16); + } + +///////////////////////////////////////////////////////////////////////////////////////////////// +// +// E2M1 -> FP8 (E4M3/E5M2) Shared Helper Functions +// +///////////////////////////////////////////////////////////////////////////////////////////////// + + /**************************************************************************** + E2M1 to E4M3 (FP8) Conversion Table + constexpr unsigned long long E2M1_to_E4M3_LUT_0_7 = 0x4C4844403C383000ULL; + + +-----------------+--------------------------+---------------+-------------+ + | E2M1 Pattern | E4M3 Pattern | Numeric Value | E4M3 Hex | + | (s E E M) | (s EEEE MMM) | | | + +-----------------+--------------------------+---------------+-------------+ + | 0 00 0 | 0 0000 000 | 0.0 | 0x00 | + | 0 00 1 | 0 0110 000 | 0.5 | 0x30 | + | 0 01 0 | 0 0111 000 | 1.0 | 0x38 | + | 0 01 1 | 0 0111 100 | 1.5 | 0x3C | + | 0 10 0 | 0 1000 000 | 2.0 | 0x40 | + | 0 10 1 | 0 1000 100 | 3.0 | 0x44 | + | 0 11 0 | 0 1001 000 | 4.0 | 0x48 | + | 0 11 1 | 0 1001 100 | 6.0 | 0x4C | + +-----------------+--------------------------+---------------+-------------+ + + E2M1 to E5M2 (FP8) Conversion Table + constexpr unsigned long long E2M1_to_E5M2_LUT_0_7 = 0x464442403E3C3800ULL; + + +-----------------+--------------------------+---------------+-------------+ + | E2M1 Pattern | E5M2 Pattern | Numeric Value | E5M2 Hex | + | (s E E M) | (s EEEEE MM) | | | + +-----------------+--------------------------+---------------+-------------+ + | 0 00 0 | 0 00000 00 | 0.0 | 0x00 | + | 0 00 1 | 0 01110 00 | 0.5 | 0x38 | + | 0 01 0 | 0 01111 00 | 1.0 | 0x3C | + | 0 01 1 | 0 01111 10 | 1.5 | 0x3E | + | 0 10 0 | 0 10000 00 | 2.0 | 0x40 | + | 0 10 1 | 0 10000 10 | 3.0 | 0x42 | + | 0 11 0 | 0 10001 00 | 4.0 | 0x44 | + | 0 11 1 | 0 10001 10 | 6.0 | 0x46 | + +-----------------+--------------------------+---------------+-------------+ + ****************************************************************************/ + + // LUT _e2m1_to_fp8_x4: Direct E2M1->FP8 (converts 4 E2M1 to 4 FP8) + template + CUTLASS_DEVICE + static void _e2m1_to_fp8_x4(unsigned int src, unsigned int& out0) { + constexpr unsigned int upper_lut = 0xc0804000U; + constexpr unsigned int lut_lo = (unsigned int)fp8_lut; + constexpr unsigned int lut_hi = (unsigned int)(fp8_lut >> 32); + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "and.b32 prmt_ctrl0123, %1, 0x7777;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %1, 2;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "prmt.b32 target0123, %2, %3, prmt_ctrl0123;\n\t" + "prmt.b32 upper0123, %4, %4, upper_prmt_ctrl_0123;\n\t" + "or.b32 %0, target0123, upper0123;\n\t" + "}" + : "=r"(out0) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) + ); + } + + // LUT _e2m1_to_fp8_x2: Direct E2M1->FP8 (converts 2 E2M1 to 2 FP8) + template + CUTLASS_DEVICE + static void _e2m1_to_fp8_x2(unsigned int src, unsigned int& out0) { + constexpr unsigned int upper_lut = 0xc0804000U; + constexpr unsigned int lut_lo = (unsigned int)fp8_lut; + constexpr unsigned int lut_hi = (unsigned int)(fp8_lut >> 32); + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + "and.b32 prmt_ctrl0123, %1, 0x0077;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %1, 2;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x0033;\n\t" + "prmt.b32 target0123, %2, %3, prmt_ctrl0123;\n\t" + "prmt.b32 upper0123, %4, %4, upper_prmt_ctrl_0123;\n\t" + "or.b32 %0, target0123, upper0123;\n\t" // we wiped out the upper half when computing controls + "}" + : "=r"(out0) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) + ); + } + + // LUT _e2m1_to_fp8_x8: Direct E2M1->FP8 (converts 8 E2M1 to 8 FP8) + template + CUTLASS_DEVICE + static void _e2m1_to_fp8_x8(unsigned int src, unsigned int& out0, unsigned int& out1) { + constexpr unsigned int upper_lut = 0xc0804000U; + constexpr unsigned int lut_lo = (unsigned int)fp8_lut; + constexpr unsigned int lut_hi = (unsigned int)(fp8_lut >> 32); + asm( + "{\n\t" + ".reg .u32 prmt_ctrl0123, target0123, upper0123;\n\t" + ".reg .u32 upper_prmt_ctrl_0123;\n\t" + ".reg .u32 prmt_ctrl4567, target4567, upper4567;\n\t" + ".reg .u32 upper_prmt_ctrl_4567;\n\t" + "and.b32 prmt_ctrl0123, %2, 0x7777;\n\t" + "shr.b32 upper_prmt_ctrl_0123, %2, 2;\n\t" + "shr.b32 prmt_ctrl4567, %2, 16;\n\t" + "shr.b32 upper_prmt_ctrl_4567, %2, 18;\n\t" + "and.b32 prmt_ctrl4567, prmt_ctrl4567, 0x7777;\n\t" + "and.b32 upper_prmt_ctrl_0123, upper_prmt_ctrl_0123, 0x3333;\n\t" + "and.b32 upper_prmt_ctrl_4567, upper_prmt_ctrl_4567, 0x3333;\n\t" + "prmt.b32 target0123, %3, %4, prmt_ctrl0123;\n\t" + "prmt.b32 target4567, %3, %4, prmt_ctrl4567;\n\t" + "prmt.b32 upper0123, %5, %5, upper_prmt_ctrl_0123;\n\t" + "prmt.b32 upper4567, %5, %5, upper_prmt_ctrl_4567;\n\t" + "or.b32 %0, target0123, upper0123;\n\t" + "or.b32 %1, target4567, upper4567;\n\t" + "}" + : "=r"(out0), "=r"(out1) + : "r"(src), "r"(lut_lo), "r"(lut_hi), "r"(upper_lut) + ); + } + +} // namespace detail + +namespace detail { + + /* + A helper class that can vectorize a numeric converter with implementation for several vector widths. + + The vector widths must be giving in decreasing order or width, and must be a power of 2. + + The vector converters must produce identical results to the scalar converters for consistency. + */ + class VectorizedConverter { + private: + // Base case to handle remainder elements as scalars. + template + CUTLASS_DEVICE + static void convert_helper( + typename ArrayConverter::result_type& result, + typename ArrayConverter::source_type const& source) { + + using ElementRes = typename ArrayConverter::result_type::Element; + using ElementSrc = typename ArrayConverter::source_type::Element; + // If no more converters, handle the remaining elements as scalars. + constexpr int total_elements = ArrayConverter::result_type::kElements; + constexpr int remainder = total_elements - Offset; + static_assert(remainder == (total_elements % ParentWidth), "Unexpected remainder."); + + typename ArrayConverter::ScalarConverter scalar_converter; + CUTLASS_PRAGMA_UNROLL + for (int i = Offset; i < ArrayConverter::result_type::kElements; ++i) { + result[i] = scalar_converter(ElementSrc(source[i])); + } + } + + template + CUTLASS_DEVICE + static void convert_helper(typename ArrayConverter::result_type& result, typename ArrayConverter::source_type const& source) { + static_assert(sizeof...(OtherVectorArrays) % 2 == 0, "Vector converters must come in {dst, src} pairs"); + static_assert(ResultVectorArray::kElements == SourceVectorArray::kElements, "Vector converters must have the same vector width"); + static_assert(cutlass::platform::is_same::value, + "ResultVectorArray must have the same type ArrayConverter::result_type"); + static_assert(cutlass::platform::is_same::value, + "SourceVectorArray must have the same type ArrayConverter::result_type"); + static_assert(Offset >= 0 && Offset <= ArrayConverter::result_type::kElements, "Offset must be between 0 and N"); + + static_assert(ParentWidth == 0 || ParentWidth > ResultVectorArray::kElements, "Vector arrays must be given in decreasing order of width"); + + constexpr int vector_width = ResultVectorArray::kElements; + static_assert(ispow2(vector_width), "Vector width must be a power of 2"); + + using ElementRes = typename ArrayConverter::result_type::Element; + using ElementSrc = typename ArrayConverter::source_type::Element; + + constexpr int vector_bits_res = vector_width * cutlass::sizeof_bits::value; + constexpr int vector_bits_src = vector_width * cutlass::sizeof_bits::value; + + static_assert(vector_bits_res % 8 == 0, "Result vector type must be byte addressed."); + static_assert(vector_bits_src % 8 == 0, "Source vector type must be byte addressed."); + + constexpr int vector_offset = Offset / vector_width; + ResultVectorArray* packed_result_vec = reinterpret_cast(&result) + vector_offset; + SourceVectorArray const* packed_source_vec = reinterpret_cast(&source) + vector_offset; + + // Convert the remaining elements as vectors. + constexpr int total_elements = ArrayConverter::result_type::kElements; + constexpr int groups_of_vec = (total_elements - Offset) / vector_width; + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < groups_of_vec; ++i) { + packed_result_vec[i] = ArrayConverter::template packed_convert(packed_source_vec[i]); + } + + constexpr int new_offset = Offset + vector_width * groups_of_vec; + // Recurse to handle other vector converters, or the scalar base case. + convert_helper(result, source); + } + + public: + /* + A method to convert vectors of elements using the packed_convert method of the converter. + + Converters using this class must implement packed convert and support 1 or more vector conversions. + */ + template + CUTLASS_DEVICE + static void convert(typename ArrayConverter::result_type& result, typename ArrayConverter::source_type const& source) { + convert_helper<0, 0, ArrayConverter, ResultVectorArray, SourceVectorArray, OtherVectorArrays...>(result, source); + } + }; +} + + ///////////////////////////////////////////////////////////////////////////////////////////////// // // Partial specializations for Array <=> Array // ///////////////////////////////////////////////////////////////////////////////////////////////// -/// Partial specialization for Array <= Array +/// Partial specialization for Array <= Array template < + int N, FloatRoundStyle Round > -struct NumericArrayConverter { +struct NumericArrayConverter { using result_element = float; using source_element = cutlass::float_e2m1_t; - - using result_type = Array; - using source_type = Array; + using result_type = Array; + using source_type = Array; static FloatRoundStyle const round_style = Round; - CUTLASS_DEVICE - static result_type convert(source_type const & source) { +private: + using result_type_packed_8 = Array; + using result_type_packed_4 = Array; + using result_type_packed_2 = Array; + using source_type_packed_8 = Array; + using source_type_packed_4 = Array; + using source_type_packed_2 = Array; - #if defined(CUDA_PTX_FP4FP6_CVT_ENABLED) - uint32_t out_fp16[4]; - uint32_t const& src_packed = reinterpret_cast(source); + using ScalarConverter = NumericConverter; + + // Convert 8 elements: E2M1 -> BF16 -> FP32 + CUTLASS_DEVICE + static result_type_packed_8 lut_convert(source_type_packed_8 const &source) { + result_type_packed_8 result; + uint32_t src_packed = *reinterpret_cast(source.data()); + + #if defined(USE_PTX_CONVERT) + + float* out_float = reinterpret_cast(result.data()); + uint32_t halfx2_01, halfx2_23, halfx2_45, halfx2_67; asm volatile( \ "{\n" \ @@ -3711,29 +4218,157 @@ struct NumericArrayConverter { "cvt.rn.f16x2.e2m1x2 %1, byte1;\n" \ "cvt.rn.f16x2.e2m1x2 %2, byte2;\n" \ "cvt.rn.f16x2.e2m1x2 %3, byte3;\n" \ - "}\n" : "=r"(out_fp16[0]), "=r"(out_fp16[1]) , "=r"(out_fp16[2]), "=r"(out_fp16[3]): "r"(src_packed)); + "}\n" + : "=r"(halfx2_01), "=r"(halfx2_23) , "=r"(halfx2_45), "=r"(halfx2_67): "r"(src_packed) + ); - float2 res0 = __half22float2(reinterpret_cast<__half2 &>(out_fp16[0])); - float2 res1 = __half22float2(reinterpret_cast<__half2 &>(out_fp16[1])); - float2 res2 = __half22float2(reinterpret_cast<__half2 &>(out_fp16[2])); - float2 res3 = __half22float2(reinterpret_cast<__half2 &>(out_fp16[3])); + float2 floatx2_01 = __half22float2(reinterpret_cast<__half2 &>(halfx2_01)); + float2 floatx2_23 = __half22float2(reinterpret_cast<__half2 &>(halfx2_23)); + float2 floatx2_45 = __half22float2(reinterpret_cast<__half2 &>(halfx2_45)); + float2 floatx2_67 = __half22float2(reinterpret_cast<__half2 &>(halfx2_67)); - result_type out; - out[0] = res0.x; - out[1] = res0.y; - out[2] = res1.x; - out[3] = res1.y; - out[4] = res2.x; - out[5] = res2.y; - out[6] = res3.x; - out[7] = res3.y; - return out; + out_float[0] = floatx2_01.x; + out_float[1] = floatx2_01.y; + out_float[2] = floatx2_23.x; + out_float[3] = floatx2_23.y; + out_float[4] = floatx2_45.x; + out_float[5] = floatx2_45.y; + out_float[6] = floatx2_67.x; + out_float[7] = floatx2_67.y; + + #else + + // Convert all 8 E2M1 values to BF16, then extend to FP32 + uint4* out_floatx4 = reinterpret_cast(result.data()); + unsigned int bfloatx2_01, bfloatx2_23, bfloatx2_45, bfloatx2_67; + detail::_e2m1_to_bf16_x8(src_packed, bfloatx2_01, bfloatx2_23, bfloatx2_45, bfloatx2_67); + + out_floatx4[0] = make_uint4(bfloatx2_01 << 16, bfloatx2_01 & 0xFFFF0000u, + bfloatx2_23 << 16, bfloatx2_23 & 0xFFFF0000u); + out_floatx4[1] = make_uint4(bfloatx2_45 << 16, bfloatx2_45 & 0xFFFF0000u, + bfloatx2_67 << 16, bfloatx2_67 & 0xFFFF0000u); + + #endif + + return result; + } + + // Convert 4 elements: E2M1 -> BF16 -> FP32 + CUTLASS_DEVICE + static result_type_packed_4 lut_convert(source_type_packed_4 const &source) { + result_type_packed_4 result; + uint16_t src_packed = *reinterpret_cast(source.data()); + + #if defined(USE_PTX_CONVERT) + + float* out_float = reinterpret_cast(result.data()); + uint32_t halfx2_01, halfx2_23; + + asm volatile( \ + "{\n" \ + ".reg .b8 byte0, byte1;\n" \ + "mov.b16 {byte0, byte1}, %2;\n" \ + "cvt.rn.f16x2.e2m1x2 %0, byte0;\n" \ + "cvt.rn.f16x2.e2m1x2 %1, byte1;\n" \ + "}\n" : "=r"(halfx2_01), "=r"(halfx2_23): "h"(src_packed) + ); + + float2 floatx2_01 = __half22float2(reinterpret_cast<__half2 &>(halfx2_01)); + float2 floatx2_23 = __half22float2(reinterpret_cast<__half2 &>(halfx2_23)); + + out_float[0] = floatx2_01.x; + out_float[1] = floatx2_01.y; + out_float[2] = floatx2_23.x; + out_float[3] = floatx2_23.y; + + #else + + uint4* out_floatx4 = reinterpret_cast(result.data()); + unsigned int bfloatx2_01, bfloatx2_23; + detail::_e2m1_to_bf16_x4(src_packed, bfloatx2_01, bfloatx2_23); + + out_floatx4[0] = make_uint4(bfloatx2_01 << 16, bfloatx2_01 & 0xFFFF0000u, + bfloatx2_23 << 16, bfloatx2_23 & 0xFFFF0000u); + + #endif + + return result; + } + + // Convert 2 elements: E2M1 -> BF16 -> FP32 + CUTLASS_DEVICE + static result_type_packed_2 lut_convert(source_type_packed_2 const &source) { + result_type_packed_2 result; + uint8_t src_packed = *reinterpret_cast(source.data()); + + #if defined(USE_PTX_CONVERT) + + float* out_float = reinterpret_cast(result.data()); + uint32_t halfx2_01; + + // extend input to 16 bit since there is no 8 bit register asm constraint available for ptx inline assembly + uint16_t src_packed_16 = src_packed; + + asm volatile( \ + "{\n" \ + ".reg .b8 byte0, byte1;\n" \ + "mov.b16 {byte0, byte1}, %1;\n" \ + "cvt.rn.f16x2.e2m1x2 %0, byte0;\n" \ + "}\n" : "=r"(halfx2_01): "h"(src_packed_16) + ); + + float2 floatx2_01 = __half22float2(reinterpret_cast<__half2 &>(halfx2_01)); + + out_float[0] = floatx2_01.x; + out_float[1] = floatx2_01.y; + + #else + + uint2* out_floatx2 = reinterpret_cast(result.data()); + unsigned int bfloatx2_01; + detail::_e2m1_to_bf16_x2(src_packed, bfloatx2_01); + + out_floatx2[0] = make_uint2(bfloatx2_01 << 16, bfloatx2_01 & 0xFFFF0000u); + + #endif + + return result; + } + + template + CUTLASS_DEVICE + static PackedResultType packed_convert(PackedSrcType const &source) { + static_assert((platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value), + "Invalid PackedSrcType/PackedResultType must be 2, 4 or 8."); + + return lut_convert(source); + } + + friend class detail::VectorizedConverter; + +public: + CUTLASS_HOST_DEVICE + static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) + result_type result; + using ConverterType = NumericArrayConverter; + detail::VectorizedConverter::convert(result, source); + + return result; #else result_type result; - NumericConverter converter; + ScalarConverter converter; CUTLASS_PRAGMA_UNROLL - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < N; ++i) { result[i] = converter(source[i]); } @@ -3747,34 +4382,28 @@ struct NumericArrayConverter { } }; -/// Partial specialization for Array <= Array +///////////////////////////////////////////////////////////////////////////////////////////////// +// +// Partial specializations for Array <=> Array +// +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Partial specialization for Array <= Array template < int N, FloatRoundStyle Round > -struct NumericArrayConverter { - static_assert(!(N % 8), "N must be multiple of 8."); - - using result_type = Array; - using source_type = Array; +struct NumericArrayConverter { + using result_type = Array; + using source_type = Array; static FloatRoundStyle const round_style = Round; CUTLASS_HOST_DEVICE static result_type convert(source_type const & source) { - - NumericArrayConverter convert_vector_; - - result_type result; - - Array *result_ptr = reinterpret_cast *>(&result); - Array const *source_ptr = reinterpret_cast const *>(&source); - - CUTLASS_PRAGMA_UNROLL - for (int i = 0; i < N / 8; ++i) { - result_ptr[i] = convert_vector_(source_ptr[i]); - } - - return result; + // Delegate to float converter, then reinterpret bits + NumericArrayConverter e2m1_to_fp32; + Array fp32_result = e2m1_to_fp32(source); + return reinterpret_cast(fp32_result); } CUTLASS_HOST_DEVICE @@ -4287,93 +4916,7 @@ struct NumericArrayConverter { #endif // Conditional guards to enable partial specialization for packed integers -namespace detail { - /* - A helper class that can vectorize a numeric converter with implementation for several vector widths. - - The vector widths must be giving in decreasing order or width, and must be a power of 2. - - The vector converters must produce identical results to the scalar converters for consistency. - */ - class VectorizedConverter { - private: - // Base case to handle remainder elements as scalars. - template - CUTLASS_DEVICE - static void convert_helper( - typename ArrayConverter::result_type& result, - typename ArrayConverter::source_type const& source) { - - using ElementRes = typename ArrayConverter::result_type::Element; - using ElementSrc = typename ArrayConverter::source_type::Element; - // If no more converters, handle the remaining elements as scalars. - constexpr int total_elements = ArrayConverter::result_type::kElements; - constexpr int remainder = total_elements - Offset; - static_assert(remainder == (total_elements % ParentWidth), "Unexpected remainder."); - - typename ArrayConverter::ScalarConverter scalar_converter; - CUTLASS_PRAGMA_UNROLL - for (int i = Offset; i < ArrayConverter::result_type::kElements; ++i) { - result[i] = scalar_converter(ElementSrc(source[i])); - } - } - - template - CUTLASS_DEVICE - static void convert_helper(typename ArrayConverter::result_type& result, typename ArrayConverter::source_type const& source) { - static_assert(sizeof...(OtherVectorArrays) % 2 == 0, "Vector converters must come in {dst, src} pairs"); - static_assert(ResultVectorArray::kElements == SourceVectorArray::kElements, "Vector converters must have the same vector width"); - static_assert(cutlass::platform::is_same::value, - "ResultVectorArray must have the same type ArrayConverter::result_type"); - static_assert(cutlass::platform::is_same::value, - "SourceVectorArray must have the same type ArrayConverter::result_type"); - static_assert(Offset >= 0 && Offset <= ArrayConverter::result_type::kElements, "Offset must be between 0 and N"); - - static_assert(ParentWidth == 0 || ParentWidth > ResultVectorArray::kElements, "Vector arrays must be given in decreasing order of width"); - - constexpr int vector_width = ResultVectorArray::kElements; - static_assert(ispow2(vector_width), "Vector width must be a power of 2"); - - using ElementRes = typename ArrayConverter::result_type::Element; - using ElementSrc = typename ArrayConverter::source_type::Element; - - constexpr int vector_bits_res = vector_width * cutlass::sizeof_bits::value; - constexpr int vector_bits_src = vector_width * cutlass::sizeof_bits::value; - - static_assert(vector_bits_res % 8 == 0, "Result vector type must be byte addressed."); - static_assert(vector_bits_src % 8 == 0, "Source vector type must be byte addressed."); - - constexpr int vector_offset = Offset / vector_width; - ResultVectorArray* packed_result_vec = reinterpret_cast(&result) + vector_offset; - SourceVectorArray const* packed_source_vec = reinterpret_cast(&source) + vector_offset; - - // Convert the remaining elements as vectors. - constexpr int total_elements = ArrayConverter::result_type::kElements; - constexpr int groups_of_vec = (total_elements - Offset) / vector_width; - CUTLASS_PRAGMA_UNROLL - for (int i = 0; i < groups_of_vec; ++i) { - packed_result_vec[i] = ArrayConverter::template packed_convert(packed_source_vec[i]); - } - - constexpr int new_offset = Offset + vector_width * groups_of_vec; - // Recurse to handle other vector converters, or the scalar base case. - convert_helper(result, source); - } - - public: - /* - A method to convert vectors of elements using the packed_convert method of the converter. - - Converters using this class must implement packed convert and support 1 or more vector conversions. - */ - template - CUTLASS_DEVICE - static void convert(typename ArrayConverter::result_type& result, typename ArrayConverter::source_type const& source) { - convert_helper<0, 0, ArrayConverter, ResultVectorArray, SourceVectorArray, OtherVectorArrays...>(result, source); - } - }; -} ///////////////////////////////////////////////////////////////////////////////////////////////// /// Partial specialization for Array <= Array @@ -4398,12 +4941,14 @@ private: using ScalarConverter = NumericConverter; - #if defined(CUDA_PTX_FP8_CVT_ENABLED) + + #if defined(USE_PTX_CONVERT) // defined(CUDA_PTX_FP4FP6_CVT_ENABLED) CUTLASS_DEVICE static result_type_packed_8 ptx_convert(source_type_packed_8 const &source) { result_type_packed_8 out; - uint32_t* out_fp16 = reinterpret_cast(&out); + uint32_t* out_halfx2 = reinterpret_cast(&out); uint32_t const& src_packed = reinterpret_cast(source); + asm volatile( \ "{\n" \ ".reg .b8 byte0, byte1, byte2, byte3;\n" \ @@ -4412,39 +4957,87 @@ private: "cvt.rn.f16x2.e2m1x2 %1, byte1;\n" \ "cvt.rn.f16x2.e2m1x2 %2, byte2;\n" \ "cvt.rn.f16x2.e2m1x2 %3, byte3;\n" \ - "}\n" : "=r"(out_fp16[0]), "=r"(out_fp16[1]) , "=r"(out_fp16[2]), "=r"(out_fp16[3]): "r"(src_packed)); + "}\n" : "=r"(out_halfx2[0]), "=r"(out_halfx2[1]) , "=r"(out_halfx2[2]), "=r"(out_halfx2[3]): "r"(src_packed)); + return out; } CUTLASS_DEVICE static result_type_packed_4 ptx_convert(source_type_packed_4 const &source) { result_type_packed_4 out; - uint32_t* out_fp16 = reinterpret_cast(&out); + uint32_t* out_halfx2 = reinterpret_cast(&out); uint16_t const& src_packed = reinterpret_cast(source); + asm volatile( \ "{\n" \ ".reg .b8 byte0, byte1;\n" \ "mov.b16 {byte0, byte1}, %2;\n" \ "cvt.rn.f16x2.e2m1x2 %0, byte0;\n" \ "cvt.rn.f16x2.e2m1x2 %1, byte1;\n" \ - "}\n" : "=r"(out_fp16[0]), "=r"(out_fp16[1]) : "h"(src_packed)); + "}\n" : "=r"(out_halfx2[0]), "=r"(out_halfx2[1]) : "h"(src_packed)); + return out; } CUTLASS_DEVICE static result_type_packed_2 ptx_convert(source_type_packed_2 const &source) { result_type_packed_2 out; - uint32_t* out_fp16 = reinterpret_cast(&out); + uint32_t* out_halfx2 = reinterpret_cast(&out); uint16_t const& src_packed = static_cast(reinterpret_cast(source)); + asm volatile( \ "{\n" \ ".reg .b8 byte0, byte1;\n" \ "mov.b16 {byte0, byte1}, %1;\n" \ "cvt.rn.f16x2.e2m1x2 %0, byte0;\n" \ - "}\n" : "=r"(out_fp16[0]) : "h"(src_packed)); + "}\n" : "=r"(out_halfx2[0]) : "h"(src_packed)); + + return out; + } + +#endif + + CUTLASS_DEVICE + static result_type_packed_8 lut_convert(source_type_packed_8 const &source) { + result_type_packed_8 out; + uint32_t* out_halfx2 = reinterpret_cast(&out); + uint32_t const& src_packed = reinterpret_cast(source); + + // LUT x4 e2m1 to fp16 (SM90) + // CUTLASS_PRAGMA_UNROLL + // for (int i = 0; i < 2; i++) { + // unsigned int lane0123 = src_packed >> (16 * i); + // detail::_e2m1_to_half_x4(lane0123, out_halfx2[2*i], out_halfx2[2*i+1]); + //} + + // LUT x8 e2m1 to fp16 (SM90) + detail::_e2m1_to_half_x8(src_packed, out_halfx2[0], out_halfx2[1], out_halfx2[2], out_halfx2[3]); + return out; } - #endif + + CUTLASS_DEVICE + static result_type_packed_4 lut_convert(source_type_packed_4 const &source) { + result_type_packed_4 out; + uint32_t* out_halfx2 = reinterpret_cast(&out); + uint16_t const& src_packed = reinterpret_cast(source); + + // LUT x4 e2m1 to half + detail::_e2m1_to_half_x4(src_packed, out_halfx2[0], out_halfx2[1]); + return out; + } + + CUTLASS_DEVICE + static result_type_packed_2 lut_convert(source_type_packed_2 const &source) { + result_type_packed_2 out; + uint32_t* out_halfx2 = reinterpret_cast(&out); + uint16_t const& src_packed = static_cast(reinterpret_cast(source)); + + // LUT x2 e2m1 to half + detail::_e2m1_to_half_x2(src_packed, out_halfx2[0]); + return out; + } + template CUTLASS_DEVICE @@ -4457,27 +5050,20 @@ private: platform::is_same::value), "Invalid PackedSrcType/PackedResultType must be 2, 4 or 8 to use private convert dispatch."); - #if defined(CUDA_PTX_FP4FP6_CVT_ENABLED) + // either call lookup table or PTX instruction implementation + #if defined(USE_PTX_CONVERT) // defined(CUDA_PTX_FP4FP6_CVT_ENABLED) return ptx_convert(source); #else - PackedResultType result; - NumericConverter converter; - - const int k_packed = PackedResultType::kElements; - CUTLASS_PRAGMA_UNROLL - for (int i = 0; i < k_packed; ++i) { - result[i] = converter(source[i]); - } - - return result; + return lut_convert(source); #endif } friend class detail::VectorizedConverter; public: - CUTLASS_DEVICE + CUTLASS_HOST_DEVICE static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) result_type result; using ConverterType = NumericArrayConverter; detail::VectorizedConverter::convert(result, source); return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif + } + + CUTLASS_HOST_DEVICE + result_type operator()(source_type const &s) const { + return convert(s); + } +}; + + +///////////////////////////////////////////////////////////////////////////////////////////////// +/// Partial specialization for Array <= Array +template < + FloatRoundStyle Round, + int N +> +struct NumericArrayConverter { + using result_element = cutlass::bfloat16_t; + using source_element = cutlass::float_e2m1_t; + using result_type = Array; + using source_type = Array; + static FloatRoundStyle const round_style = Round; + +private: + using result_type_packed_8 = Array; + using result_type_packed_4 = Array; + using result_type_packed_2 = Array; + using source_type_packed_8 = Array; + using source_type_packed_4 = Array; + using source_type_packed_2 = Array; + + using ScalarConverter = NumericConverter; + + CUTLASS_DEVICE + static result_type_packed_8 lut_convert(source_type_packed_8 const &source) { + + result_type_packed_8 out; + uint32_t* out_bfloatx2 = reinterpret_cast(&out); + uint32_t const& src_packed = reinterpret_cast(source); + + // LUT x4 e2m1 to bf16 (SM90) + // CUTLASS_PRAGMA_UNROLL + // for (int i = 0; i < 2; i++) { + // unsigned int lane0123 = src_packed >> (16 * i); + // detail::_e2m1_to_bf16_x4(lane0123, out_bfloatx2[2*i], out_bfloatx2[2*i+1]); + // } + + // LUT x8 e2m1 to bf16 (SM90) + detail::_e2m1_to_bf16_x8(src_packed, out_bfloatx2[0], out_bfloatx2[1], out_bfloatx2[2], out_bfloatx2[3]); + + return out; + } + + CUTLASS_DEVICE + static result_type_packed_4 lut_convert(source_type_packed_4 const &source) { + result_type_packed_4 out; + uint32_t* out_bfloatx2 = reinterpret_cast(&out); + uint16_t const& src_packed = reinterpret_cast(source); + + // LUT x4 e2m1 to bf16 + detail::_e2m1_to_bf16_x4(src_packed, out_bfloatx2[0], out_bfloatx2[1]); + return out; + } + + CUTLASS_DEVICE + static result_type_packed_2 lut_convert(source_type_packed_2 const &source) { + result_type_packed_2 out; + uint32_t* out_bfloatx2 = reinterpret_cast(&out); + uint16_t const& src_packed = static_cast(reinterpret_cast(source)); + + // LUT x2 e2m1 to bf16 (SM90) + detail::_e2m1_to_bf16_x2(src_packed, out_bfloatx2[0]); + return out; + } + + template + CUTLASS_DEVICE + static PackedResultType packed_convert(PackedSrcType const &source) { + static_assert((platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value), + "Invalid PackedSrcType/PackedResultType must be 2, 4 or 8 to use private convert dispatch."); + + // Option to add an optimized PTX path + return lut_convert(source); + } + + friend class detail::VectorizedConverter; + +public: + CUTLASS_HOST_DEVICE + static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) + result_type result; + using ConverterType = NumericArrayConverter; + detail::VectorizedConverter::convert(result, source); + + return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif } CUTLASS_HOST_DEVICE @@ -4545,7 +5256,7 @@ private: // [0, 1, -2, -1] encoded as FP8 static constexpr uint32_t E4M3_LUT = 0xB8C03800; - const int iters = PackedSrcType::kElements / 4; + constexpr int iters = PackedSrcType::kElements / 4; #pragma unroll for (int ii = 0; ii < iters; ii += 2, src_reg >>= 16, src_reg_shifted >>= 16) { // This uses a look up table to convert packed int2s to packed fp8s, using the int4 value @@ -4949,6 +5660,202 @@ struct NumericArrayConverter { } }; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Partial specialization for Array <= Array +template +struct NumericArrayConverter { + using result_type = Array; + using source_type = Array; + + static FloatRoundStyle const round_style = Round; + +private: + using result_type_packed_8 = Array; + using result_type_packed_4 = Array; + using source_type_packed_8 = Array; + using source_type_packed_4 = Array; + + using ScalarConverter = NumericConverter; + + CUTLASS_DEVICE + static uint32_t to_reg(source_type_packed_4 const& source) { + return static_cast( + reinterpret_cast(source)); + } + + CUTLASS_DEVICE + static uint32_t to_reg(source_type_packed_8 const& source) { + return reinterpret_cast(source); + } + + // The core converter uses a lookup table to converts e2m1 -> e4m3. + template + CUTLASS_DEVICE + static PackedResultType packed_convert(PackedSrcType const &source) { + + static_assert((platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value), + "Invalid PackedSrcType/PackedResultType must be 4 or 8 to use private convert dispatch."); + + // Hold FP8 outputs in reg. We need 1 reg for every 4 outputs. + cutlass::AlignedArray out_fp8; + + // View the input as reg + uint32_t reg = to_reg(source); + + constexpr int iters_x8 = PackedSrcType::kElements / 8; + constexpr int iters_x4 = (PackedSrcType::kElements / 4) & 1; + constexpr unsigned long long E2M1_to_E4M3_LUT_0_7 = 0x4C4844403C383000ULL; + + // we really only get called with 4 or 8 elements, but allow for more arguments for future use + // practically it's one of either x8 or x4, since we unroll everything else will be optimized away + #pragma unroll + for (int ii = 0; ii < iters_x8; ++ii) { + detail::_e2m1_to_fp8_x8(reg, out_fp8[ii*2], out_fp8[ii*2+1]); + } + + if (iters_x4) { + detail::_e2m1_to_fp8_x4(reg, out_fp8[iters_x8*2]); + } + + return reinterpret_cast(out_fp8); + } + + friend class detail::VectorizedConverter; + +public: + CUTLASS_HOST_DEVICE + static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) + result_type result; + using ConverterType = NumericArrayConverter; + detail::VectorizedConverter::convert(result, source); + + return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif + } + + + CUTLASS_HOST_DEVICE + result_type operator()(source_type const &s) const { + return convert(s); + } +}; + + +/// Partial specialization for Array <= Array +template +struct NumericArrayConverter { + using result_type = Array; + using source_type = Array; + + static FloatRoundStyle const round_style = Round; + +private: + using result_type_packed_8 = Array; + using result_type_packed_4 = Array; + using source_type_packed_8 = Array; + using source_type_packed_4 = Array; + + using ScalarConverter = NumericConverter; + + CUTLASS_DEVICE + static uint32_t to_reg(source_type_packed_4 const& source) { + return static_cast( + reinterpret_cast(source)); + } + + CUTLASS_DEVICE + static uint32_t to_reg(source_type_packed_8 const& source) { + return reinterpret_cast(source); + } + + // The core converter uses a lookup table to convert e2m1 -> e5m2. + // Uses the existing templated _e2m1_to_fp8_x* helper functions defined above. + template + CUTLASS_DEVICE + static PackedResultType packed_convert(PackedSrcType const &source) { + + static_assert((platform::is_same::value && + platform::is_same::value) || + (platform::is_same::value && + platform::is_same::value), + "Invalid PackedSrcType/PackedResultType must be 4 or 8 to use private convert dispatch."); + + // Hold FP8 outputs in reg. We need 1 reg for every 4 outputs. + cutlass::AlignedArray out_fp8; + + // View the input as reg + uint32_t reg = to_reg(source); + + constexpr int iters_x8 = PackedSrcType::kElements / 8; + constexpr int iters_x4 = (PackedSrcType::kElements / 4) & 1; + // E2M1→E5M2 LUT from table at lines 6109-6124 + constexpr unsigned long long E2M1_to_E5M2_LUT_0_7 = 0x464442403E3C3800ULL; + + // we really only get called with 4 or 8 elements, but allow for more arguments for future use + #pragma unroll + for (int ii = 0; ii < iters_x8; ++ii) { + detail::_e2m1_to_fp8_x8(reg, out_fp8[ii*2], out_fp8[ii*2+1]); + } + + if (iters_x4) { + detail::_e2m1_to_fp8_x4(reg, out_fp8[iters_x8*2]); + } + + return reinterpret_cast(out_fp8); + } + + friend class detail::VectorizedConverter; + +public: + CUTLASS_HOST_DEVICE + static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) + result_type result; + using ConverterType = NumericArrayConverter; + detail::VectorizedConverter::convert(result, source); + + return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif + } + + + CUTLASS_HOST_DEVICE + result_type operator()(source_type const &s) const { + return convert(s); + } +}; + + /// Partial specialization for Array <= Array template struct NumericArrayConverter { @@ -5012,7 +5919,7 @@ private: static constexpr uint32_t NEG_E4M3s_REG2 = 0xB8C0C4C8; - const int iters = PackedSrcType::kElements / 4; + constexpr int iters = PackedSrcType::kElements / 4; #pragma unroll for (int ii = 0; ii < iters; ++ii, lut_idx >>=16, sign >>=16) { uint32_t final_prmt_idx = final_prmt_base | sign; @@ -5038,8 +5945,9 @@ private: friend class detail::VectorizedConverter; public: - CUTLASS_DEVICE + CUTLASS_HOST_DEVICE static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) result_type result; using ConverterType = NumericArrayConverter; detail::VectorizedConverter::convert(result, source); return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif } - CUTLASS_DEVICE + CUTLASS_HOST_DEVICE result_type operator()(source_type const &s) const { return convert(s); } @@ -5119,7 +6038,7 @@ private: static constexpr uint32_t NEG_E5M2s_REG2 = 0xBCC0C2C4; - const int iters = PackedSrcType::kElements / 4; + constexpr int iters = PackedSrcType::kElements / 4; #pragma unroll for (int ii = 0; ii < iters; ++ii, lut_idx >>=16, sign >>=16) { uint32_t final_prmt_idx = final_prmt_base | sign; @@ -5145,8 +6064,9 @@ private: friend class detail::VectorizedConverter; public: - CUTLASS_DEVICE + CUTLASS_HOST_DEVICE static result_type convert(source_type const &source) { + #if defined(__CUDA_ARCH__) result_type result; using ConverterType = NumericArrayConverter; detail::VectorizedConverter::convert(result, source); return result; + #else + result_type result; + ScalarConverter converter; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < N; ++i) { + result[i] = converter(source[i]); + } + + return result; + #endif } - CUTLASS_DEVICE + CUTLASS_HOST_DEVICE result_type operator()(source_type const &s) const { return convert(s); } @@ -5226,7 +6157,7 @@ private: static constexpr uint32_t E4M3s_REG4 = 0x57565554; - const int iters = PackedSrcType::kElements / 4; + constexpr int iters = PackedSrcType::kElements / 4; #pragma unroll for (int ii = 0; ii < iters; ++ii, lut_idx >>=16, sign >>=16) { uint32_t final_prmt_idx = final_prmt_base | sign; diff --git a/include/cutlass/platform/platform.h b/include/cutlass/platform/platform.h index 3bf82c6a..ee58b054 100644 --- a/include/cutlass/platform/platform.h +++ b/include/cutlass/platform/platform.h @@ -31,6 +31,8 @@ #pragma once +#include "cutlass/tfloat32.h" + /** * \file * \brief C++ features that may be otherwise unimplemented for CUDA device functions. @@ -580,7 +582,7 @@ template struct alignment_of : std::alignment_of {}; #endif - +#if CUDA_VERSION >= 11080 /* 16B specializations where 32-bit Win32 host compiler disagrees with device compiler */ template <> struct alignment_of { @@ -676,7 +678,7 @@ struct alignment_of { }; #endif - +#endif // CUDA_VERSION >= 11080 // Specializations for volatile/const qualified types template @@ -915,6 +917,18 @@ struct numeric_limits { static constexpr bool has_infinity = true; }; +template <> +struct numeric_limits { + CUTLASS_HOST_DEVICE + static tfloat32_t infinity() noexcept { return tfloat32_t::bitcast(0x7f800000);} + CUTLASS_HOST_DEVICE + static tfloat32_t max() noexcept { return tfloat32_t::bitcast(0x7f7fffff);} + CUTLASS_HOST_DEVICE + static tfloat32_t lowest() noexcept { return tfloat32_t::bitcast(0xff7fffff);} + static constexpr bool is_integer = false; + static constexpr bool has_infinity = true; +}; + /// Returns a value that curries the `std::maximum()` function into the identity /// function. No value will compare < than this value. template diff --git a/include/cutlass/predicate_vector.h b/include/cutlass/predicate_vector.h index fe82fbb9..76c02e2d 100644 --- a/include/cutlass/predicate_vector.h +++ b/include/cutlass/predicate_vector.h @@ -40,7 +40,9 @@ #include #endif +#ifndef __QNX__ #include CUDA_STD_HEADER(cassert) +#endif #include "cutlass/platform/platform.h" diff --git a/include/cutlass/transform/kernel/sm90_sparse_gemm_compressor.hpp b/include/cutlass/transform/kernel/sm90_sparse_gemm_compressor.hpp index 83a891b5..e1b485c9 100644 --- a/include/cutlass/transform/kernel/sm90_sparse_gemm_compressor.hpp +++ b/include/cutlass/transform/kernel/sm90_sparse_gemm_compressor.hpp @@ -494,8 +494,7 @@ private: // * Output Cta Tensor S to G if (GemmM_within_Cta > 0 && GemmK_within_Cta > 0) { - constexpr int MaxVecBits = 128; // STG.128 - cute::cooperative_copy(threadIdx_X, cEsE, cEgE); + cute::cooperative_copy(threadIdx_X, cEsE, cEgE); } if (GemmMAlignedAC_within_Cta == TensorEAtomM{} && GemmKAlignedAC_within_Cta == TensorEAtomK{}) { @@ -577,9 +576,9 @@ private: // Row Major if constexpr (IsRowMajor) { CUTE_UNROLL - for (int iter_row_blk = 0; iter_row_blk < cutlass::ceil_div(shape<0>(dSrc), ThreadShapeRows * ValueShapeRows); ++iter_row_blk) { + for (int iter_row_blk = 0; iter_row_blk < cutlass::ceil_div(valid_rows, ThreadShapeRows * ValueShapeRows); ++iter_row_blk) { CUTE_UNROLL - for (int col_chunk_i = 0; col_chunk_i < cutlass::ceil_div(shape<1>(dSrc) , ThreadShapeCols * ValueShapeCols); ++col_chunk_i) { + for (int col_chunk_i = 0; col_chunk_i < cutlass::ceil_div(valid_cols, ThreadShapeCols * ValueShapeCols); ++col_chunk_i) { CUTE_UNROLL for (int iter_row_thr = 0; iter_row_thr < ValueShapeRows; ++iter_row_thr) { CUTE_UNROLL @@ -587,7 +586,9 @@ private: const int row_i = (iter_row_blk * ThreadShapeRows + threadIdx_X_row) * ValueShapeRows + iter_row_thr; const int col_i = (col_chunk_i * ThreadShapeCols + threadIdx_X_col) * ValueShapeCols + iter_col_thr; if constexpr ( (not pred) and (not IsQmmaF6) ) { - dDst(row_i, col_i) = dSrc(row_i, col_i); + if (row_i < valid_rows && col_i < valid_cols) { + dDst(row_i, col_i) = dSrc(row_i, col_i); + } } else { if (row_i < valid_rows && col_i < valid_cols) { @@ -602,9 +603,9 @@ private: // Col Major else { CUTE_UNROLL - for (int col_chunk_i = 0; col_chunk_i < cutlass::ceil_div(shape<1>(dSrc) , ThreadShapeCols * ValueShapeCols); ++col_chunk_i) { + for (int col_chunk_i = 0; col_chunk_i < cutlass::ceil_div(valid_cols, ThreadShapeCols * ValueShapeCols); ++col_chunk_i) { CUTE_UNROLL - for (int iter_row_blk = 0; iter_row_blk < cutlass::ceil_div(shape<0>(dSrc), ThreadShapeRows * ValueShapeRows); ++iter_row_blk) { + for (int iter_row_blk = 0; iter_row_blk < cutlass::ceil_div(valid_rows, ThreadShapeRows * ValueShapeRows); ++iter_row_blk) { CUTE_UNROLL for (int iter_col_thr = 0; iter_col_thr < ValueShapeCols; ++iter_col_thr) { CUTE_UNROLL @@ -612,7 +613,9 @@ private: const int row_i = (iter_row_blk * ThreadShapeRows + threadIdx_X_row) * ValueShapeRows + iter_row_thr; const int col_i = (col_chunk_i * ThreadShapeCols + threadIdx_X_col) * ValueShapeCols + iter_col_thr; if constexpr ( (not pred) and (not IsQmmaF6) ) { - dDst(row_i, col_i) = dSrc(row_i, col_i); + if (row_i < valid_rows && col_i < valid_cols) { + dDst(row_i, col_i) = dSrc(row_i, col_i); + } } else { if (row_i < valid_rows && col_i < valid_cols) { diff --git a/include/cutlass/workspace.h b/include/cutlass/workspace.h index bb318aa3..610ca8c3 100644 --- a/include/cutlass/workspace.h +++ b/include/cutlass/workspace.h @@ -121,6 +121,8 @@ fill_workspace(void* workspace, T fill_value, size_t fill_count, cudaStream_t st #else CUdeviceptr d_workspace = reinterpret_cast(workspace); CUresult result = CUDA_SUCCESS; + +#ifndef __QNX__ if (sizeof(T) == 4) { result = cuMemsetD32Async(d_workspace, reinterpret_cast(fill_value), fill_count, stream); } @@ -130,6 +132,7 @@ fill_workspace(void* workspace, T fill_value, size_t fill_count, cudaStream_t st else if (sizeof(T) == 1) { result = cuMemsetD8Async(d_workspace, reinterpret_cast(fill_value), fill_count, stream); } +#endif if (CUDA_SUCCESS != result) { const char** error_string_ptr = nullptr; diff --git a/media/docs/cpp/blackwell_functionality.md b/media/docs/cpp/blackwell_functionality.md index 04e4139d..8b410e1c 100644 --- a/media/docs/cpp/blackwell_functionality.md +++ b/media/docs/cpp/blackwell_functionality.md @@ -131,7 +131,7 @@ instructions supported by CUTLASS. |[8](#bs_rows_4_5_7_8_10) | Dense | mx_float6_t | mx_float6_t | TN, NN, NT, TT | 128 | 128 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf6_mxf6_void_bf16_tn_layout.cu)
    [NT unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf6_mxf6_void_bf16_nt_layout.cu)| |[9](#bs_rows_6_9_11) | Dense | mx_float6_t | mx_float8_t | TN, NN, NT, TT | 128 | 16 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf6_mxf8_void_f32_tn_layout.cu)
    [NT unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf6_mxf8_void_f32_nt_layout.cu)| |[10](#bs_rows_4_5_7_8_10) | Dense | mx_float8_t | mx_float6_t | TN, NN, NT, TT | 16 | 128 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf6_f16_f8_tn_layout.cu)
    [NT unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf6_f16_f8_nt_layout.cu)| -|[11](#bs_rows_6_9_11) | Dense | mx_float8_t | mx_float8_t | TN, NN, NT, TT | 16 | 16 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf8_void_f8_tn_layout.cu.cu)
    [NT unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf8_void_f8_nt_layout.cu)| +|[11](#bs_rows_6_9_11) | Dense | mx_float8_t | mx_float8_t | TN, NN, NT, TT | 16 | 16 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf8_void_f8_tn_layout.cu)
    [NT unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_tensorop_gemm/mxf8_mxf8_void_f8_nt_layout.cu)| |[12](#bs_rows_1) | Sparse | nv_float4_t | nv_float4_t | TN | 32 (N) / 64 (T) | 32 | mxf4nvf4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_sparse_tensorop_gemm/sm100_bssp_gemm_nvf4_nvf4_f32_void_f16_o_tnn.cu) | |[13](#bs_rows_2) | Sparse | mx_float4_t | mx_float4_t | TN | 32 (N) / 64 (T) | 32 | mxf4, mxf4nvf4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_sparse_tensorop_gemm/sm100_bssp_gemm_mxf4_mxf4_f32_f16_f16_o_tnn.cu) | |[14](#bs_rows_3) | Sparse | mx_float4_t | mx_float4_t | TN, NN, NT, TT | 128 (N) / 256 (T) | 128 | mxf8f6f4 |[TN unit tests](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/sm100_blockscaled_sparse_tensorop_gemm/sm100_bssp_gemm_mxf4_mxf4_f32_f16_f16_q_tnt.cu) | @@ -652,7 +652,7 @@ auto tensor_sfb = make_tensor(bptr, layout_sfb); auto val_a_mk = tensor_sfa(make_coord(m,k,0)); ``` # Blackwell SM120 GEMMs -The NVIDIA RTX 5000 Series GPUs introduce support for new narrow precision (4bit and 6bit) block-scaled and non-block-scaled tensor cores. The PTX ISA has extended the `mma` instructions to support these data formats which are 1x to 4x faster than Ada architecture's fp8 tensor cores. For more detailed information see [`mma` PTX documentation](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#multiply-and-accumulate-instruction-mma). +The NVIDIA RTX 5000 Series GPUs introduce support for new narrow precision (4bit and 6bit) block-scaled and non-block-scaled tensor cores. The PTX ISA has extended the `mma` instructions to support these data formats which are 1x to 4x faster than Ada architecture's fp8 tensor cores. For more detailed information see [`mma` PTX documentation](https://docs.nvidia.com/cuda/parallel-thread-execution/#warp-level-matrix-instructions-for-mma). CUTLASS 4.0 has added support for these newly introduced narrow precision GEMMs. Similar to the Blackwell SM100 GEMMs, the SM120 GEMMs can be built using the collective builder interface. See examples in [examples/79_blackwell_geforce_gemm/](../../examples/79_blackwell_geforce_gemm/) and unit tests listed below. diff --git a/media/docs/cpp/functionality.md b/media/docs/cpp/functionality.md index 88fb1678..a5e446f2 100644 --- a/media/docs/cpp/functionality.md +++ b/media/docs/cpp/functionality.md @@ -47,19 +47,19 @@ Hyperlinks to relevant unit tests demonstrate how specific template instances ma | **WmmaTensorOp** | 70+ | 11.4+ | `f16 * f16 + f16 => f16` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16t_f16t_f16n_wmma_tensor_op_f16_sm70.cu) | | **WmmaTensorOp** | 70+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16t_f16t_f16n_wmma_tensor_op_f32_sm70.cu) | | **WmmaTensorOp** | 75+ | 11.4+ | `s8 * s8 + s32 => {s32, s8}` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s8t_s8n_s8t_wmma_tensor_op_s32_sm72.cu) | -| **WmmaTensorOp** | 75+ | 11.4+ | `s4 * s4 + s32 => {s32, s4}` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s4t_s4n_s4t_wmma_tensor_op_s32_sm75.cu) | -| **WmmaTensorOp** | 75+ | 11.4+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_b1t_b1n_b1t_wmma_tensor_op_s32_sm75.cu) | +| **WmmaTensorOp** | 75+ | 11.4+ | `s4 * s4 + s32 => {s32, s4}` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_s4t_s4n_s32t_wmma_tensor_op_s32_sm75.cu) | +| **WmmaTensorOp** | 75+ | 11.4+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_b1t_b1n_s32n_wmma_tensor_op_s32_sm75.cu) | | **TensorOp** | 70+ | 11.4+ | `f16 * f16 + f16 => f16` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_volta_tensor_op_f16_sm70.cu) | -| **TensorOp** | 70+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_volta_tensor_op_f32_sm70.cu) | +| **TensorOp** | 70+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f32t_volta_tensor_op_f32_sm70.cu) | | **TensorOp** | 75+ | 11.4+ | `f16 * f16 + f16 => f16` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f16_sm75.cu) | -| **TensorOp** | 75+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f32_sm75.cu) | +| **TensorOp** | 75+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_f16n_f16t_f32t_tensor_op_f32_sm75.cu) | | **TensorOp** | 75+ | 11.4+ | `s8 * s8 + s32 => {s32, s8}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s8t_s8n_s32n_tensor_op_s32_sm75.cu) | -| **TensorOp** | 75+ | 11.4+ | `s4 * s4 + s32 => {s32, s4}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s4t_s4n_s32n_tensor_op_s32_sm75.cu) | +| **TensorOp** | 75+ | 11.4+ | `s4 * s4 + s32 => {s32, s4}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_s4t_s4n_s32n_tensor_op_s32_sm75.cu) | | **TensorOp** | 75+ | 11.4+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_b1t_b1n_s32n_tensor_op_s32_sm75.cu) | | **TensorOp** | 80+ | 11.4+ | `f16 * f16 + f16 => f16` | {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f16_sm80.cu) | | **TensorOp** | 80+ | 11.4+ | `f16 * f16 + f32 => {f16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f16n_f16t_f16t_tensor_op_f32_sm80.cu) | -| **TensorOp** | 80+ | 11.4+ | `bf16 * bf16 + f32 => {bf16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_bf16n_bf16t_bf16t_tensor_op_f32_sm80.cu) | -| **TensorOp** | 80+ | 11.4+ | `tf32 * tf32 + f32 => f32`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_f32n_f32t_f32t_tensor_op_f32_sm80.cu) | +| **TensorOp** | 80+ | 11.4+ | `bf16 * bf16 + f32 => {bf16, f32}`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_bf16t_bf16t_bf16t_tensor_op_f32_sm80.cu) | +| **TensorOp** | 80+ | 11.4+ | `tf32 * tf32 + f32 => f32`| {N,T} x {N,T} => {N,T} | [example](https://github.com/NVIDIA/cutlass/blob/main/test/unit/gemm/device/gemm_tf32n_tf32t_f32t_tensor_op_f32_sm80.cu) | | **TensorOp** | 80+ | 11.4+ | `s8 * s8 + s32 => {s32, s8}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s8t_s8n_s32n_tensor_op_s32_sm80.cu) | | **TensorOp** | 80+ | 11.4+ | `s4 * s4 + s32 => {s32, s4}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_s4t_s4n_s32n_tensor_op_s32_sm80.cu) | | **TensorOp** | 80+ | 11.4+ | `b1 ^ b1 + s32 => {s32, b1}` | { T } x { N } => {N,T} | [example](https://github.com/NVIDIA/cutlass/tree/main/test/unit/gemm/device/gemm_b1t_b1n_s32n_tensor_op_s32_sm80.cu) | diff --git a/media/docs/cpp/pipeline.md b/media/docs/cpp/pipeline.md index bcd5e332..8455bc42 100644 --- a/media/docs/cpp/pipeline.md +++ b/media/docs/cpp/pipeline.md @@ -78,7 +78,7 @@ These classes help developers orchestrate a pipeline of asynchronous producer and consumer threads, without needing to worry about lower-level hardware details. These classes serve a similar function as the various -[pipeline abstractions](https://nvidia.github.io/libcudacxx/extended_api/synchronization_primitives/pipeline.html) +[pipeline abstractions](https://nvidia.github.io/cccl/libcudacxx/extended_api/synchronization_primitives/pipeline.html) in libcu++. #### Pipeline methods diff --git a/media/docs/pythonDSL/cute_dsl.rst b/media/docs/pythonDSL/cute_dsl.rst index 1c129a77..a05c434e 100644 --- a/media/docs/pythonDSL/cute_dsl.rst +++ b/media/docs/pythonDSL/cute_dsl.rst @@ -17,4 +17,6 @@ CuTe DSL Debugging with the DSL Autotuning with the DSL Educational Notebooks + Deprecation Policy Compile with TVM FFI + Ahead-of-Time (AOT) Compilation diff --git a/media/docs/pythonDSL/cute_dsl_api/changelog.rst b/media/docs/pythonDSL/cute_dsl_api/changelog.rst index 49a66caa..e4200e07 100644 --- a/media/docs/pythonDSL/cute_dsl_api/changelog.rst +++ b/media/docs/pythonDSL/cute_dsl_api/changelog.rst @@ -74,7 +74,7 @@ Changelog for CuTe DSL API changes - Introduce BlockScaled layout utilities in `blockscaled_layout.py `_ for creating the required scale factor layouts in global memory, shared memory and tensor memory. * ``cutlass.cute.compile`` now supports compilation options. Refer to `JIT compilation options `_ for more details. -* ``cutlass.cute.testing.assert_`` now works for device JIT function. Specify ``--enable-device-assertions`` as compilation option to enable. +* ``cutlass.cute.testing.assert_`` now works for device JIT function. Specify ``--enable-assertions`` as compilation option to enable. * ``cutlass.cute.make_tiled_copy`` is now deprecated. Please use ``cutlass.cute.make_tiled_copy_tv`` instead. * Shared memory capacity query diff --git a/media/docs/pythonDSL/cute_dsl_general/compile_with_tvm_ffi.rst b/media/docs/pythonDSL/cute_dsl_general/compile_with_tvm_ffi.rst index 8459cbae..c82c74d8 100644 --- a/media/docs/pythonDSL/cute_dsl_general/compile_with_tvm_ffi.rst +++ b/media/docs/pythonDSL/cute_dsl_general/compile_with_tvm_ffi.rst @@ -4,7 +4,8 @@ Compile with TVM FFI ==================== -Apache TVM FFI is an open ABI and FFI for machine learning systems. More information can be found in the `official documentation `_. +Apache TVM FFI is an open ABI and FFI for machine learning systems. More information can be found in +the `official documentation `_. To install TVM FFI, you can run the following command: @@ -14,7 +15,9 @@ To install TVM FFI, you can run the following command: # optional package for improved torch tensor calling performance pip install torch-c-dlpack-ext -In |DSL|, TVM FFI can be enabled as an option for JIT-compiled functions. Using TVM FFI can lead to faster JIT function invocation and provides better interoperability with machine learning frameworks (e.g., directly take ``torch.Tensor`` as arguments). +In |DSL|, TVM FFI can be enabled as an option for JIT-compiled functions. Using TVM FFI can lead to faster +JIT function invocation and provides better interoperability with machine learning frameworks +(e.g., directly take ``torch.Tensor`` as arguments). Enable Apache TVM FFI in |DSL| @@ -129,7 +132,8 @@ stride via the ``stride`` argument in the ``make_fake_tensor`` API. ``cute.Tensor`` adapter for TVM FFI ----------------------------------- -To adapt the ``cute.Tensor`` to the TVM FFI function, you can use the ``cute.runtime.from_dlpack`` function with the ``enable_tvm_ffi=True`` option or the environment variable ``CUTE_DSL_ENABLE_TVM_FFI=1``. For example: +To adapt the ``cute.Tensor`` to the TVM FFI function, you can use the ``cute.runtime.from_dlpack`` function with the +``enable_tvm_ffi=True`` option or the environment variable ``CUTE_DSL_ENABLE_TVM_FFI=1``. For example: .. code-block:: python @@ -570,7 +574,7 @@ Then you can load back the exported module and use it in different ways: from cutlass import cute def example_load_module_add_one(): - mod = cute.runtime.load_module("./add_one.so") + mod = cute.runtime.load_module("./add_one.so", enable_tvm_ffi=True) a_torch = torch.arange(10, dtype=torch.float32, device="cuda") b_torch = torch.empty(10, dtype=torch.float32, device="cuda") mod.add_one(a_torch, b_torch) @@ -587,9 +591,11 @@ in the official documentation. When you build your own libraries, make sure you link against the necessary runtime libraries. You can use ``cute.runtime.find_runtime_libraries(enable_tvm_ffi=True)`` to get the path to these libraries. -``cute.runtime.load_module`` will load these libraries automatically before loading +``cute.runtime.load_module(path, enable_tvm_ffi=True)`` will load these libraries automatically before loading an exported module. You can also manually load these libraries in advanced use cases. +For low-level cute ABI AOT compilation support without TVM FFI, you can refer to :doc:`dsl_ahead_of_time_compilation`. + Keyword Arguments and Defaults ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -683,3 +689,32 @@ The code block below shows how to do this: wrapped_func(a_torch, b_torch, offset=4) print("result of b_torch after wrapped_func(a_torch, b_torch, offset=4)") print(b_torch) + + +Limitations +----------- + +The Fake Tensor flow is ONLY compatible with TVM FFI because TVM FFI supports more flexible constraints on Tensor arguments. +For instance, fake tensor can specify per-mode static shape or constraints on shape and strides which are not supported by +existing ``from_dlpack`` flow. It's expected that JIT function compiled with fake tensor will have different ABI compared to +tensor converted by ``from_dlpack``. + +.. code-block:: python + + import cutlass.cute as cute + import torch + + n = cute.sym_int() + # Dynamic Shape + fake_a = cute.runtime.make_fake_compact_tensor(cute.Float32, (n,)) + + # Compile without tvm-ffi + compiled_fn = cute.compile(foo, fake_a) + + # Wrong, in compatible ABI + compiled_fn(from_dlpack(a)) + + +In order to avoid such issue, it's recommended to use fake tensor only with TVM FFI backend. Practically speaking, +as we only want to call ``from_dlpack`` once and reuse for both compilation and runtime, the benefit of +using fake tensor is limited in this case. diff --git a/media/docs/pythonDSL/cute_dsl_general/debugging.rst b/media/docs/pythonDSL/cute_dsl_general/debugging.rst index 93c75112..759086e3 100644 --- a/media/docs/pythonDSL/cute_dsl_general/debugging.rst +++ b/media/docs/pythonDSL/cute_dsl_general/debugging.rst @@ -172,6 +172,25 @@ For detecting memory errors and race conditions: Please refer to the `compute-sanitizer documentation `_ for more details. +Set function name prefix +~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, the function name (host function or kernel function) is automatically generated based on the function name and its parameters. +Sometimes you may want to attach some runtime information to the function name to make performance profiling and debugging easier, +e.g., the kernel configs or the rank ids. You can assign a name prefix to the name by calling the ``set_name_prefix`` +method on the host function or kernel function. + +.. code:: python + + @cute.kernel + def kernel(arg1, arg2, ...): + ... + @cute.jit + def launch_kernel(): + kernel.set_name_prefix("your_custom_name_prefix") + kernel(arg1, arg2, ...).launch(grid=[1, 1, 1], block=[1, 1, 1], ...) + +For above example, the generated kernel name will be "your_custom_name_prefix_xxx". Conclusion ---------- diff --git a/media/docs/pythonDSL/cute_dsl_general/dsl_ahead_of_time_compilation.rst b/media/docs/pythonDSL/cute_dsl_general/dsl_ahead_of_time_compilation.rst new file mode 100644 index 00000000..67b4354f --- /dev/null +++ b/media/docs/pythonDSL/cute_dsl_general/dsl_ahead_of_time_compilation.rst @@ -0,0 +1,239 @@ +.. _dsl_ahead_of_time_compilation: +.. |DSL| replace:: CuTe DSL + +Ahead-of-Time (AOT) Compilation +=============================== + +This guide demonstrates how to use |DSL|'s Ahead-of-Time (AOT) compilation features to export compiled kernels for use in production environments. + +Overview +-------- + +|DSL| Ahead-of-Time (hereinafter referred to as AOT) compilation allows you to: + +* **Compile once, enable cross-compilation**: Write kernels in Python and cross-compile them for multiple GPU architectures. +* **Remove JIT overhead**: Eliminate compilation delays in production by pre-compiling kernels. +* **Flexible integration**: Easily integrate compiled kernels into both Python and C/C++ codebases using flexible deployment options. + +We provide 2 levels of AOT ABI: + +1. **Low-Level CuTe ABI**: This ABI is expressed using CuTe DSL types and tensors, mirroring the original Python function. +2. **High-Level Apache TVM FFI ABI**: For interop with various frameworks (e.g., PyTorch, JAX), and offer high-level stable ABI access. + +This guide will focus on the CuTe ABI AOT. For the Apache TVM FFI AOT, please refer to the section "Exporting Compiled Module" in :doc:`compile_with_tvm_ffi`. + +CuTe ABI AOT Workflow +--------------------- + +Export Interface +~~~~~~~~~~~~~~~~ + +The ``export_to_c`` interface is provided by the ``JitCompiledFunction`` class. It accepts the following parameters: + +* ``file_path``: The path to the directory where the header and object files will be saved. +* ``file_name``: The base name for the header and object files. The same file name will always overwrite existing files. +* ``function_prefix``: The prefix of the function symbol in the generated object file. This should be a unique identifier to avoid symbol conflicts. Users should ensure the function prefix is unique for each exported function. Defaults to the ``file_name``. + +It generates the following files: + +* ``{file_path}/{file_name}.h``: A C header file containing API function declarations. This header specifies the runtime function signatures in C, mirroring the original Python function interfaces. +* ``{file_path}/{file_name}.o``: A standard object file containing the compiled kernel code. You can link this object file into either a static or shared library. It includes the host entry function, fatbin data, and helper functions such as ``cuda_init`` and ``cuda_load_to_device``. Additionally, it embeds metadata for runtime loading and version verification. + +Example: + +.. code-block:: python + + import cutlass.cute as cute + import cutlass.cute.cuda as cuda + + @cute.kernel + def print_tensor_kernel(a: cute.Tensor): + cute.printf("a: {}", a) + + @cute.jit + def print_tensor(a: cute.Tensor, stream: cuda.CUstream): + print_tensor_kernel(a).launch(grid=(1, 1, 1), block=(1, 1, 1), stream=stream) + + compiled_func = cute.compile(print_tensor) + # Export compiled functions to object files and headers + compiled_func.export_to_c(file_path="./artifacts", file_name="print_tensor_example", function_prefix="print_tensor") + +Loading in Python +~~~~~~~~~~~~~~~~~ + +Load pre-compiled object files or shared libraries into Python for execution. + +.. code-block:: python + + import cutlass.cute as cute + import torch + from cutlass.cute import from_dlpack + import cutlass.cute.cuda as cuda + + # Load module from object file + module = cute.runtime.load_module("./artifacts/print_tensor_example.o") + # or + module = cute.runtime.load_module("./artifacts/libprint_tensor_example.so") + + # Prepare data + a = torch.arange(160, dtype=torch.float32, device="cuda").reshape(16, 10) + a_cute = from_dlpack(a).mark_layout_dynamic() + stream = cuda.CUstream(0) + + # Call the function (no JIT compilation needed!) + module.print_tensor(a_cute, stream=stream) + + # This will fail because 'non_existing_api' was not exported: + # module.non_existing_api() + +C++ Integration with Static Linking +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Integrate compiled kernels directly into your C++ executable during the build process. The generated header file supplies the necessary API for loading the module and invoking the function. + +Example: + +.. code-block:: cpp + + #include "print_tensor_example.h" + #include + + void run_print_tensor() { + // Prepare tensor, the tensor declaration is in the header file + print_tensor_Tensor_a_t tensor_a; + tensor_a.data = nullptr; // GPU memory is set to nullptr. + // Set dynamic shapes and strides + tensor_a.dynamic_shapes[0] = 32; + tensor_a.dynamic_shapes[1] = 16; + tensor_a.dynamic_strides[0] = 16; + + // Create stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // Load module before calling the kernel + print_tensor_Kernel_Module_t module; + print_tensor_Kernel_Module_Load(&module); + + // Call the kernel; the kernel wrapper function is defined in the header file + cute_dsl_print_tensor_wrapper(&module, &tensor_a, stream); + + // Cleanup + print_tensor_Kernel_Module_Unload(&module); + cudaStreamDestroy(stream); + } + +The ``print_tensor_example.h`` header file is generated by the ``export_to_c`` interface. It includes: + +* The ``print_tensor_Kernel_Module_t`` type: Represents the kernel module. +* The ``print_tensor_Tensor_a_t`` type: A tensor-specific type that defines the ABI for a particular CuTe tensor. +* The ``cute_dsl_print_tensor_wrapper`` function: The user-facing entry point to invoke the kernel. + +The compilation of the C++ executable requires the ``libcuda_dialect_runtime.so`` or ``libcuda_dialect_runtime_static.a`` library which is involved in ``/lib``, along with the CUDA driver and runtime libraries, to function properly. + + +C++ Integration with Dynamic Loading +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Dynamically load pre-compiled object files or shared libraries at runtime. By including the ``CuteDSLRuntime.h`` header, you can load the module, look up exported functions, and invoke them. + +.. code-block:: cpp + + #include "CuteDSLRuntime.h" + #include + + void run_print_tensor() { + // Load module from shared library + CuteDSLRT_Module_t *module = nullptr; + CuteDSLRT_Error_t err = CuteDSLRT_Module_Load( + &module, + "./artifacts/libprint_tensor_example.so" + ); + // or + CuteDSLRT_Error_t err = CuteDSLRT_Module_Load( + &module, + "./artifacts/print_tensor_example.o" + ); + check_error(err); + + // Lookup function + CuteDSLRT_Function_t *func = nullptr; + err = CuteDSLRT_Module_Get_Function(&func, module, "print_tensor"); + check_error(err); + + // Prepare arguments, matching the argument type defined in the header file + typedef struct { + void *data; + int32_t dynamic_shapes[2]; + int64_t dynamic_strides[1]; + } print_tensor_Tensor_a_t; + + print_tensor_Tensor_a_t tensor_a; + tensor_a.data = nullptr; + tensor_a.dynamic_shapes[0] = 32; + tensor_a.dynamic_shapes[1] = 16; + tensor_a.dynamic_strides[0] = 16; + + // Create stream + cudaStream_t stream; + cudaStreamCreate(&stream); + + // Call the function; the runtime function accepts packed arguments, refer to the wrapper in the header file + int ret; + void* args[] = {&tensor_a, &stream, &ret}; + err = CuteDSLRT_Function_Run(func, args, 3); + check_error(err); + cudaStreamSynchronize(stream); + + // Cleanup + CuteDSLRT_Module_Destroy(module); + cudaStreamDestroy(stream); + } + +The ``CuteDSLRuntime.h`` header file can be found in ``/include``. It includes: + +* The ``CuteDSLRT_Error_t`` type: Indicates error status. +* The ``CuteDSLRT_Module_Load`` function: Loads the module. +* The ``CuteDSLRT_Module_Get_Function`` function: Gets a function from the loaded module. The runtime API will load the CUDA module for kernel execution. +* The ``CuteDSLRT_Function_Run`` function: Runs the function. +* The ``CuteDSLRT_Module_Destroy`` function: Destroys the module. + +The compilation of the C++ executable requires the ``libcute_dsl_runtime.so`` library which is involved in ``/lib``, along with the CUDA driver and runtime libraries, to function properly. + +Supported Argument Types +------------------------ + +|DSL| supports the following argument types: + +* ``cute.Tensor`` +* ``cute.Shape`` / ``cute.Coord`` / ``cute.Tile`` / ``cute.IntTuple`` / ``cute.Stride`` +* ``cuda.CUstream`` +* ``cutlass.Int8`` / ``cutlass.Int16`` / ``cutlass.Int32`` / ``cutlass.Int64`` / ``cutlass.Boolean`` +* ``cutlass.Uint8`` / ``cutlass.Uint16`` / ``cutlass.Uint32`` / ``cutlass.Uint64`` +* ``cutlass.Float32`` / ``cutlass.TFloat32`` / ``cutlass.Float64`` / ``cutlass.Float16`` + +Note that: + +1. ``cute.Tensor`` is a dynamic tensor type that only contains dynamic shapes and strides in its ABI representation. As a result, different compilations may produce different tensor ABIs. This is why declarations for each tensor type are included in the generated header file. +2. ``strides`` in ``cute.Tensor`` are determined by the ``use_32bit_strides`` compile argument. When ``use_32bit_strides`` is set to ``True``, the strides are 32-bit; when set to ``False``, they are 64-bit. +3. Currently, custom types are not supported for AOT compilation. + +Object File Compatibility Issues +-------------------------------- + +The object file generated by |DSL| depends on the CUDA runtime library. Therefore, ensure that the version of the CUDA runtime/toolkit library matches the version used by |DSL|. Otherwise, ABI compatibility with the CUDA runtime cannot be guaranteed. + +When using C++ static linking integration, compatibility is assured because the header and object files are generated together and guaranteed to match. + +For C++ dynamic loading integration and Python loading, the binary file is loaded at runtime. To ensure compatibility, version information is embedded in the metadata of the generated binary file. At runtime, this version information is checked, and if it does not match the expected version, the binary file will be rejected. + +Relation to Apache TVM FFI AOT +------------------------------ + +Apache TVM FFI AOT offers a comparable capability, enabling TVM functions to be compiled into binary files that can be loaded and executed at runtime. +For more information, see the section "Exporting Compiled Module" in :doc:`compile_with_tvm_ffi`. + +The primary distinction is that, when TVM FFI is enabled, |DSL| generates a dedicated wrapper function on top of the underlying CuTe ABI. This wrapper adheres to the calling conventions defined by TVM FFI. +In contrast, the CuTe ABI entry function is specified directly in the generated header file, which affects how arguments must be provided. + +For instance, with the TVM FFI wrapper function, users are able to pass in arguments such as ``torch.Tensor`` directly. However, when calling the CuTe ABI entry function, arguments should be provided as ``cute.Tensor`` types. diff --git a/media/docs/pythonDSL/cute_dsl_general/dsl_control_flow.rst b/media/docs/pythonDSL/cute_dsl_general/dsl_control_flow.rst index f5c2ea35..02f83463 100644 --- a/media/docs/pythonDSL/cute_dsl_general/dsl_control_flow.rst +++ b/media/docs/pythonDSL/cute_dsl_general/dsl_control_flow.rst @@ -184,6 +184,46 @@ Standard Python ``while`` is supported. n += 1 +Summary of Control Flow behavior +--------------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 30 30 30 + + * - **Control Flow** + - **Run time evaluation** + - **Compile time evaluation** + + * - if cutlass.const_expr() + - ❌ + - ✅ + + * - if pred + - ✅ + - ❌ + + * - while cutlass.const_expr() + - ❌ + - ✅ + + * - while pred + - ✅ + - ❌ + + * - for i in cutlass.range_constexpr() + - ❌ + - ✅ + + * - for i in range() + - ✅ + - ❌ + + * - for i in cutlass.range() (support advanced unrolling and pipelining) + - ✅ + - ❌ + + Compile-Time Metaprogramming ---------------------------- diff --git a/media/docs/pythonDSL/cute_dsl_general/dsl_jit_compilation_options.rst b/media/docs/pythonDSL/cute_dsl_general/dsl_jit_compilation_options.rst index 5f7e7598..8da0c643 100644 --- a/media/docs/pythonDSL/cute_dsl_general/dsl_jit_compilation_options.rst +++ b/media/docs/pythonDSL/cute_dsl_general/dsl_jit_compilation_options.rst @@ -73,7 +73,7 @@ You can use the following code to specify compilation options: jit_executor_with_opt_level_2 = cute.compile(add, 1, 2, options="--opt-level 2") jit_executor_with_opt_level_1 = cute.compile(add, 1, 2, options="--opt-level 1") - jit_executor_with_enable_device_assertions = cute.compile(add, 1, 2, options="--enable-assertions") + jit_executor_with_enable_assertions = cute.compile(add, 1, 2, options="--enable-assertions") jit_executor_with_keep_cubin = cute.compile(add, 1, 2, options="--keep-cubin") jit_executor_with_keep_ptx = cute.compile(add, 1, 2, options="--keep-ptx") jit_executor_with_ptxas_options = cute.compile(add, 1, 2, options="--ptxas-options '--opt-level=2'") @@ -100,7 +100,7 @@ Notebly, boolean options are automatically converted to True instances of the op jit_executor_with_opt_level_2 = cute.compile[OptLevel(2)](add, 1, 2) jit_executor_with_opt_level_1 = cute.compile[OptLevel(1)](add, 1, 2) - jit_executor_with_enable_device_assertions = cute.compile[EnableAssertions](add, 1, 2) + jit_executor_with_enable_assertions = cute.compile[EnableAssertions](add, 1, 2) jit_executor_with_keep_cubin = cute.compile[KeepCUBIN](add, 1, 2) jit_executor_with_keep_ptx = cute.compile[KeepPTX](add, 1, 2) - jit_executor_with_ptxas_options = cute.compile[PtxasOptions("--opt-level=2")](add, 1, 2) \ No newline at end of file + jit_executor_with_ptxas_options = cute.compile[PtxasOptions("--opt-level=2")](add, 1, 2) diff --git a/media/docs/pythonDSL/deprecation.rst b/media/docs/pythonDSL/deprecation.rst new file mode 100644 index 00000000..dd6ad881 --- /dev/null +++ b/media/docs/pythonDSL/deprecation.rst @@ -0,0 +1,56 @@ +.. _deprecation: + +Deprecation Policy +================== + +Purpose +------- + +The goal of this policy is to evolve the DSL and its APIs while keeping user +programs stable. Features or APIs are deprecated only when they are redundant, +unsafe, or block better designs. + +Deprecation Process +------------------- + +**Step 1 — Soft Deprecation** + +When a feature is considered for removal, it is first annotated with the +``@deprecated`` decorator or ``DeprecationWarning`` and documented with a +suggested alternative. At this stage, the feature continues to work normally. + +Users are encouraged to provide feedback and describe their use cases. +If there is strong justification, we may keep or redesign the feature. + +**Step 2 — Removal (the subsequent release)** + +If no valid use cases remain, the deprecated feature will be removed in the +following **minor** release. + +.. note:: + + The release version follows the format ``..``. + +Communication +------------- + +All deprecations are announced through: + +* This page +* In-code warning messages + +Soft Deprecations +----------------- + +**Version 4.2.1** + +* ``cute.arch.warpgroup_reg_alloc`` and ``cute.arch.warpgroup_reg_dealloc`` + → Scheduled for deprecation. Use ``cute.arch.setmaxregister_increase`` and ``cute.arch.setmaxregister_decrease`` instead. + +* ``alignment`` argument in ``CooperativeGroup`` constructor + → Scheduled for deprecation. It was unused; no replacement is suggested. + +Deprecated Features +------------------- + +*(None currently.)* diff --git a/media/docs/pythonDSL/limitations.rst b/media/docs/pythonDSL/limitations.rst index 23673195..f396e4f5 100644 --- a/media/docs/pythonDSL/limitations.rst +++ b/media/docs/pythonDSL/limitations.rst @@ -17,12 +17,8 @@ the DSL. Notable unsupported features ---------------------------- -- Programmatic Dependent Launch (PDL) - convolutions -- full support for ahead of time compilation - preferred clusters -- CLC-based tile schedulers -- EVT support - Windows support Programming Model @@ -82,16 +78,30 @@ Programming Model xs.append(Float32(1.0)) **Python Function** - The DSL currently does not implement support for return values from Python functions, - although this capability is planned for future releases. + The DSL currently has **limited support for return values** from Python functions. + At the moment, only ``constexpr`` values can be returned, while returning **dynamic values** is **not yet supported**. + This capability is planned for a future release. Example: - .. code:: python + .. code-block:: python @cute.jit - def foo(): - return 1 # Currently unsupported in CuTe DSL + def baz(a: cutlass.Constexpr): + return a + 1 + + @cute.jit + def foo(a: cutlass.Int32): + return a + 1 + + @cute.jit + def bar(a: cutlass.Int32): + val = foo(a) # works + + val = baz(10) # works + val = bar(10) # works + foo(10) # currently unsupported in CuTe DSL + **Expression or Statement with Dependent Type** CuTe DSL implements static typing and does not support dependent types. diff --git a/media/docs/pythonDSL/overview.rst b/media/docs/pythonDSL/overview.rst index fbd3abd8..c98bea59 100644 --- a/media/docs/pythonDSL/overview.rst +++ b/media/docs/pythonDSL/overview.rst @@ -105,4 +105,4 @@ You can: - Propose support for additional data types or kernel variants - Help prioritize roadmap features by upvoting GitHub issues -Thank you for helping shape the future of CUTLASS DSLs! \ No newline at end of file +Thank you for helping shape the future of CUTLASS DSLs! diff --git a/media/docs/pythonDSL/quick_start.rst b/media/docs/pythonDSL/quick_start.rst index 495ec8ff..cd6dfc2f 100644 --- a/media/docs/pythonDSL/quick_start.rst +++ b/media/docs/pythonDSL/quick_start.rst @@ -3,28 +3,39 @@ Quick Start Guide ======================= -The CUTLASS DSL 4.0 release currently supports **Linux** and **Python 3.12** only. To install CUTLASS DSLs (limited to CuTe DSL for now), use the following command +The CUTLASS DSL 4.4 release currently supports **Linux** and **Python 3.10 - 3.13** only. To install CUTLASS DSLs (limited to CuTe DSL for now), use the following command Installation ----------------------- To ensure compatibility with the examples and code on `GitHub `_, -use the `requirements.txt `_ file from the corresponding commit in the repository. +use the `setup.sh `_ file from the corresponding commit in the repository. .. code-block:: bash - git clone https://github.com/NVIDIA/cutlass.git - pip install -r cutlass/python/CuTeDSL/requirements.txt - -If you just want to try out the last known stable release of the CUTLASS DSL (may not compatible with the latest examples and code), run: + git clone https://github.com/NVIDIA/cutlass.git + + # For CUDA Toolkit 12.9: + ./cutlass/python/CuTeDSL/setup.sh --cu12 + + # For CUDA Toolkit 13.1: + ./cutlass/python/CuTeDSL/setup.sh --cu13 + +If you just want to try out the last known stable release of the CUTLASS DSL (may not be compatible with the latest examples and code), run: + .. code-block:: bash + # For CUDA Toolkit 12.9: pip install nvidia-cutlass-dsl + # For CUDA Toolkit 13.1: + pip install nvidia-cutlass-dsl[cu13] + + The ``nvidia-cutlass-dsl`` wheel includes everything needed to generate GPU kernels. It requires -the same NVIDIA driver version as the -`CUDA Toolkit 12.9 `_. +the same NVIDIA driver version as the corresponding `CUDA Toolkit `_ +(CUDA Toolkit 12.9 or CUDA Toolkit 13.1). Recommended Dependencies --------------------------------- @@ -35,6 +46,8 @@ To run examples and begin development, we recommend installing: pip install torch jupyter +We recommend installing JAX with CUDA support at version 0.8.1 to run JAX examples. + Recommended Python environment variables for jupyter notebooks -------------------------------------------------------------- diff --git a/python/CuTeDSL/cutlass/__init__.py b/python/CuTeDSL/cutlass/__init__.py index c09463fc..3df1c5c2 100644 --- a/python/CuTeDSL/cutlass/__init__.py +++ b/python/CuTeDSL/cutlass/__init__.py @@ -13,6 +13,8 @@ from ._mlir._mlir_libs import _cutlass_ir _cutlass_ir.populate(_cutlass_ir) +__version__ = "@CUTLASS_IR_WHEEL_RELEASE_VERSION@" + from .cutlass_dsl import ( Constexpr, dsl_user_op, @@ -44,6 +46,7 @@ from .cutlass_dsl import ( # Construction utilities for user-defined classes extract_mlir_values, new_from_mlir_values, + DSLCudaVersion, ) from .cute.typing import * @@ -51,6 +54,7 @@ from .cute.typing import * # Utilities not belonging to CuTe from . import utils as utils from . import pipeline as pipeline +from .utils.version_info import CUDA_VERSION # Used as internal symbol from . import cutlass_dsl as _dsl @@ -61,4 +65,7 @@ register_jit_arg_adapter = _dsl.JitArgAdapterRegistry.register_jit_arg_adapter gpu = _dsl.cutlass_gpu cuda = _dsl.cuda_helpers +# Jax Framework support +from . import jax as jax + CACHE_FILE = "compiled_cache.db" diff --git a/python/CuTeDSL/cutlass/base_dsl/__init__.py b/python/CuTeDSL/cutlass/base_dsl/__init__.py index e3fcbc77..2b4927fa 100644 --- a/python/CuTeDSL/cutlass/base_dsl/__init__.py +++ b/python/CuTeDSL/cutlass/base_dsl/__init__.py @@ -15,3 +15,13 @@ from .runtime import * from ._mlir_helpers import lru_cache_ir, dsl_user_op from .env_manager import get_str_env_var, detect_gpu_arch +from .utils.tree_utils import ( + is_constexpr_field, + tree_flatten, + tree_unflatten, + PyTreeDef, + is_frozen_dataclass, + DSLTreeFlattenError, +) + +from .common import DSLCudaVersion diff --git a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/arith.py b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/arith.py index ef06f8eb..01070140 100644 --- a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/arith.py +++ b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/arith.py @@ -294,7 +294,8 @@ def const(value, ty=None, *, loc=None, ip=None): Generates dynamic expression for constant values. """ from ..typing import Numeric, NumericMeta - from ..dsl import is_dynamic_expression, _numpy_type_to_mlir_type + from ..dsl import is_dynamic_expression + from ..utils.numpy import _numpy_type_to_mlir_type if isinstance(value, Numeric): value = value.value @@ -693,9 +694,9 @@ def _min(lhs, rhs, *, loc=None, ip=None): if isinstance(lhs.type, T.VectorType): elem_type = lhs.type.element_type if arith._is_integer_like_type(elem_type): - assert hasattr( - lhs, "signed" - ), "Should have attribute `signed`, must be a bug" + assert hasattr(lhs, "signed"), ( + "Should have attribute `signed`, must be a bug" + ) if lhs.signed != False: return arith.minsi(lhs, rhs, loc=loc, ip=ip) else: @@ -719,6 +720,7 @@ def _max(lhs, rhs, *, loc=None, ip=None): Assuming the operands have the same type """ from ..dsl import is_dynamic_expression + if not is_dynamic_expression(lhs): if not is_dynamic_expression(rhs): return max(lhs, rhs) @@ -731,9 +733,9 @@ def _max(lhs, rhs, *, loc=None, ip=None): if isinstance(lhs.type, T.VectorType): elem_type = lhs.type.element_type if isinstance(elem_type, ir.IntegerType): - assert hasattr( - lhs, "signed" - ), "Should have attribute `signed`, must be a bug" + assert hasattr(lhs, "signed"), ( + "Should have attribute `signed`, must be a bug" + ) if lhs.signed != False: return arith.maxsi(lhs, rhs, loc=loc, ip=ip) else: diff --git a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py index 3ba565ea..ad7893ee 100644 --- a/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py +++ b/python/CuTeDSL/cutlass/base_dsl/_mlir_helpers/op.py @@ -17,6 +17,7 @@ import inspect from functools import wraps from ..._mlir import ir +from ..common import DSLRuntimeError def dsl_user_op(opFunc): @@ -57,7 +58,26 @@ def dsl_user_op(opFunc): ), childLoc=file_loc, ) - res_or_list = opFunc(*args, **kwargs, loc=loc) + + try: + res_or_list = opFunc(*args, **kwargs, loc=loc) + except TypeError as e: + # Provide a helpful error message when function doesn't accept 'loc' + func_name = getattr(opFunc, "__name__", str(opFunc)) + if "unexpected keyword argument 'loc'" in str(e): + raise DSLRuntimeError( + f"Function '{func_name}' decorated with @dsl_user_op does not accept the required 'loc' parameter.", + suggestion=[ + f"1. Add 'loc=None' as a keyword-only parameter to {func_name}:", + f" def {func_name}(..., *, loc=None):", + "", + f"2. Remove the @dsl_user_op decorator if location tracking is not needed", + ], + cause=e, + ) from e + else: + # Re-raise other TypeErrors as-is + raise return res_or_list return wrapper diff --git a/python/CuTeDSL/cutlass/base_dsl/arch.py b/python/CuTeDSL/cutlass/base_dsl/arch.py index 2a69946e..76b75d19 100644 --- a/python/CuTeDSL/cutlass/base_dsl/arch.py +++ b/python/CuTeDSL/cutlass/base_dsl/arch.py @@ -44,7 +44,6 @@ class Arch(Enum): sm_121 = (12, 1, "") sm_121a = (12, 1, "a") sm_121f = (12, 1, "f") - def __init__(self, major, minor, suffix): self.major = major self.minor = minor @@ -59,7 +58,6 @@ class Arch(Enum): return cls((major, minor, suffix)) else: raise ValueError(f"invalid arguments for Arch: {value}") - # attributes to get arch list of specific families @classmethod diff --git a/python/CuTeDSL/cutlass/base_dsl/ast_helpers.py b/python/CuTeDSL/cutlass/base_dsl/ast_helpers.py index 9161127d..c434c982 100644 --- a/python/CuTeDSL/cutlass/base_dsl/ast_helpers.py +++ b/python/CuTeDSL/cutlass/base_dsl/ast_helpers.py @@ -14,7 +14,8 @@ This module provides helper functions that are generated by the preprocessor. The preprocessor read through python's ast and changes the input code. """ -from typing import Callable, Iterator, Optional, overload +from dataclasses import dataclass +from typing import Callable, Iterator, Optional, overload, List from typing_extensions import deprecated import warnings import inspect @@ -111,6 +112,7 @@ class Executor: unroll=-1, unroll_full=False, prefetch_stages=None, + vectorize=None, ): assert self._loop_execute_range_dynamic, ( "Functions must be set before execution." @@ -128,6 +130,7 @@ class Executor: unroll, unroll_full, prefetch_stages, + vectorize, ) def if_execute( @@ -153,7 +156,6 @@ class Executor: def while_execute( self, - pred, while_before_block: Callable, while_after_block: Callable, write_args=[], @@ -190,9 +192,10 @@ def loop_selector( unroll=-1, unroll_full=False, prefetch_stages=None, + vectorize=None, ): log().debug( - "start [%s] stop [%s] step [%s] write_args [%s] full_write_args_count [%s] write_args_names [%s] unroll [%s] unroll_full [%s] prefetch_stages [%s]", + "start [%s] stop [%s] step [%s] write_args [%s] full_write_args_count [%s] write_args_names [%s] unroll [%s] unroll_full [%s] prefetch_stages [%s] vectorize [%s]", start, stop, step, @@ -202,6 +205,7 @@ def loop_selector( unroll, unroll_full, prefetch_stages, + vectorize, ) from .typing import Integer, Numeric @@ -227,6 +231,7 @@ def loop_selector( unroll, unroll_full, prefetch_stages, + vectorize, ) return ir_loop @@ -247,15 +252,14 @@ def if_selector(pred, write_args=[]): return ir_loop -def while_selector(pred, write_args=[]): +def while_selector(*, write_args=[]): def ir_while_loop(func): - return func(pred, *write_args) + return func(*write_args) return ir_while_loop def while_executor( - pred, while_before_block: Callable, while_after_block: Callable, write_args=[], @@ -263,7 +267,6 @@ def while_executor( write_args_names=[], ): return executor.while_execute( - pred, while_before_block, while_after_block, write_args, @@ -310,15 +313,25 @@ class range: - unroll: Number of iterations to unroll (0 or 1 = no unrolling) - unroll_full: Whether to fully unroll the loop - prefetch_stages: Number of prefetch stages to generate + - vectorize: Whether to vectorize the loop (default: None) """ @overload - def __new__(cls, stop, unroll=0, unroll_full=False, prefetch_stages=None): + def __new__( + cls, stop, unroll=0, unroll_full=False, prefetch_stages=None, vectorize=None + ): pass @overload def __new__( - cls, start, stop, step, unroll=0, unroll_full=False, prefetch_stages=None + cls, + start, + stop, + step, + unroll=0, + unroll_full=False, + prefetch_stages=None, + vectorize=None, ): pass @@ -581,7 +594,11 @@ def copy_members(dest, src): or not hasattr(src, name) ): continue - setattr(dest, name, getattr(src, name)) + try: + setattr(dest, name, getattr(src, name)) + except AttributeError: + # AttributeError means the member is no settable, like property without setter, just ignore + pass def get_locals_or_none(locals, symbols): @@ -609,3 +626,109 @@ def closure_check(closures): f"Function `{closure.__name__}` is a closure that captures variables and is not supported in dynamic control flow", suggestion="Please implicitly pass in captured variables as arguments", ) + + +@dataclass +class FormattedValue: + """ + Represents a value (from an f-string interpolation) along with its conversion and format specification. + + This is a runtime representation of ast.FormattedValue. + See https://docs.python.org/3/library/ast.html#ast.FormattedValue + + This class is used to encapsulate a value that is to be embedded into an f-string formatted string, + along with any conversion flags (such as '!s', '!r', or '!a') and a list of format specification strings + (e.g., '.2f', '05d', etc). + + Attributes: + value (Any): The value to be formatted. + conversion (int): The ASCII code of the conversion character, defaulting to -1 (no conversion). + format_spec (Optional[List[str]]): List of format specifier strings. + """ + + value: Any + conversion: int = -1 + format_spec: Optional[List[str]] = None + + def to_str(self): + """ + Converts the FormattedValue into a format string component and (optional) dynamic argument. + + If the value is a dynamic expression (requires runtime evaluation), returns a printf-style placeholder and + the corresponding dynamic value for later substitution. For static (non-dynamic) values, returns the fully + rendered literal string and None for the dynamic value. + + Returns: + Tuple[str, Optional[Any]]: A tuple where the first element is the format string component and the second + element is the dynamic value (or None if not required). + + Raises: + DSLRuntimeError: If the format spec is invalid or not supported for dynamic expressions. + """ + if executor._is_dynamic_expression(self.value): + if self.conversion != -1: + warnings.warn( + "Conversion may not be honored for dynamic expressions", + stacklevel=3, + ) + if self.format_spec is not None and len(self.format_spec) > 1: + raise DSLRuntimeError( + "At most one format specifier is supported for dynamic expressions", + ) + if self.format_spec is not None: + if self.format_spec[0].startswith(("<", ">", "^")): + raise DSLRuntimeError( + "Alignment specifier is not supported for dynamic expressions", + ) + return f"%{self.format_spec[0]}", self.value + return "{}", self.value + else: + conversion_str = "" + if self.conversion == 97: + conversion_str = "!a" # ASCII + elif self.conversion == 114: + conversion_str = "!r" # repr + elif self.conversion == 115: + conversion_str = "!s" # str + if self.format_spec is not None: + f_str = f"{{{conversion_str}:{self.format_spec[0]}}}" + else: + f_str = f"{{{conversion_str}}}" + return f_str.format(self.value), None + + +def fstring_decompose(joinedStrComponent): + """ + Decomposes a joined f-string component list into a format string and dynamic arguments. + + This function takes a sequence of components representing parts of an f-string, + which may include both literal strings and FormatValue instances. + It assembles a format string with placeholders for dynamic values + and collects the actual dynamic argument values in order. + + Args: + joinedStrComponent (List[Union[str, FormattedValue]]): The components of the f-string. + + Returns: + Tuple[str, ...]: A tuple containing the format string as the first element, + followed by all dynamic argument values. + + Raises: + DSLAstPreprocessorError: If an unsupported component type is encountered. + """ + format_string = "" + dynamic_args = [] + for component in joinedStrComponent: + if isinstance(component, FormattedValue): + s, v = component.to_str() + format_string += s + if v is not None: + # This is a dynamic value, add to dynamic_args + dynamic_args.append(v) + elif isinstance(component, str): + format_string += component + else: + raise DSLAstPreprocessorError( + f"Unsupported component type in f-string: {type(component)}", + ) + return (format_string, *dynamic_args) diff --git a/python/CuTeDSL/cutlass/base_dsl/ast_preprocessor.py b/python/CuTeDSL/cutlass/base_dsl/ast_preprocessor.py index 36c2ecb0..4afc61b6 100644 --- a/python/CuTeDSL/cutlass/base_dsl/ast_preprocessor.py +++ b/python/CuTeDSL/cutlass/base_dsl/ast_preprocessor.py @@ -371,7 +371,11 @@ class DSLPreprocessor(ast.NodeTransformer): package_name = module.__package__.rsplit( ".", child_node.level - 1 )[0] - module_name = f"{package_name}.{module_name}" + # For `from . import x`, module name is None, just use package name + if module_name: + module_name = f"{package_name}.{module_name}" + else: + module_name = package_name else: # Handle typically some local import like: # from .common_dense_gemm import DenseGemmKernel @@ -423,12 +427,15 @@ class DSLPreprocessor(ast.NodeTransformer): # Get the module containing the decorated function if module := inspect.getmodule(decorated_func): + if module in self.module_cache: + return self.module_cache[module] try: # Get the module source code source = inspect.getsource(module) module_ast = ast.parse(source) imports = self._get_imports_from_ast(module_ast, module) + self.module_cache[module] = imports except (IOError, TypeError): pass @@ -768,7 +775,7 @@ class DSLPreprocessor(ast.NodeTransformer): return unified_tree def analyze_region_variables( - self, node: Union[ast.For, ast.If], active_symbols: List[Set[str]] + self, node: Union[ast.For, ast.If, ast.While], active_symbols: List[Set[str]] ): """ Analyze variables in different code regions to identify read-only, write-only, @@ -857,7 +864,14 @@ class DSLPreprocessor(ast.NodeTransformer): self.generic_visit(node) analyzer = RegionAnalyzer() - analyzer.visit(ast.Module(body=node)) + analyzer.visit(ast.Module(body=node.body)) + if node.orelse: + analyzer.visit(ast.Module(body=node.orelse)) + + # While's loop condition is executed n times, as loop body + # So collect the variables used in the loop condition + if isinstance(node, ast.While): + analyzer.visit(ast.Module(body=node.test)) # If arg is both write and invoke, remove from invoked_args invoked_args = invoked_args - write_args @@ -917,6 +931,10 @@ class DSLPreprocessor(ast.NodeTransformer): return keywords.get("pipelining", ast.Constant(value=None)) return keywords.get("prefetch_stages", ast.Constant(value=None)) + def extract_vectorize_args(self, iter_node): + keywords = {kw.arg: kw.value for kw in iter_node.keywords} + return keywords.get("vectorize", ast.Constant(value=None)) + def create_loop_function( self, func_name, @@ -927,6 +945,7 @@ class DSLPreprocessor(ast.NodeTransformer): unroll, unroll_full, prefetch_stages, + vectorize, write_args, full_write_args_count, ): @@ -972,6 +991,7 @@ class DSLPreprocessor(ast.NodeTransformer): ast.keyword(arg="unroll", value=unroll), ast.keyword(arg="unroll_full", value=unroll_full), ast.keyword(arg="prefetch_stages", value=prefetch_stages), + ast.keyword(arg="vectorize", value=vectorize), ast.keyword( arg="write_args", value=self.generate_get_locals_or_none_call(write_args), @@ -1387,6 +1407,7 @@ class DSLPreprocessor(ast.NodeTransformer): start_expr, stop_expr, step_expr, has_step = self.extract_range_args(node.iter) unroll, unroll_full = self.extract_unroll_args(node.iter) prefetch_stages = self.extract_prefetch_stages_args(node.iter) + vectorize = self.extract_vectorize_args(node.iter) write_args, full_write_args_count, called_closures = ( self.analyze_region_variables(node, active_symbols) ) @@ -1416,6 +1437,7 @@ class DSLPreprocessor(ast.NodeTransformer): unroll, unroll_full, prefetch_stages, + vectorize, write_args, full_write_args_count, ) @@ -1462,6 +1484,67 @@ class DSLPreprocessor(ast.NodeTransformer): ast.copy_location(new_node, node) return new_node + def processFormattedValue(self, node): + """ + Converts an ast.FormattedValue node into a runtime representation of an ast.FormattedValue. + + This function takes an ast.FormattedValue node and converts it into a runtime representation of ast.FormattedValue. + """ + keywords = [] + if node.conversion != -1: + keywords.append( + ast.keyword(arg="conversion", value=ast.Constant(value=node.conversion)) + ) + if node.format_spec: + keywords.append( + ast.keyword( + arg="format_spec", + value=ast.List(elts=node.format_spec.values, ctx=ast.Load()), + ) + ) + call = ast.Call( + func=_create_module_attribute( + "FormattedValue", + lineno=node.lineno, + col_offset=node.col_offset, + ), + args=[node.value], + keywords=keywords, + ) + return ast.copy_location(call, node) + + def processFString(self, node): + """ + Converts an f-string node into a runtime representation of an f-string. + + This function takes an ast.JoinedStr node and converts it into a list of elements, + where each element is either a literal string or a FormattedValue. + The FormattedValue is converted into a runtime representation of ast.FormattedValue. + """ + elements = [] + joinedStr = node.args[0] + for component in joinedStr.values: + if isinstance(component, ast.Constant): + elements.append(component) + elif isinstance(component, ast.FormattedValue): + elements.append(self.processFormattedValue(component)) + else: + raise DSLAstPreprocessorError( + f"Unsupported component type in f-string: {type(component)}", + filename=self.session_data.file_name, + snippet=ast.unparse(component), + ) + call = ast.Call( + func=_create_module_attribute( + "fstring_decompose", + lineno=node.lineno, + col_offset=node.col_offset, + ), + args=[ast.copy_location(ast.List(elts=elements, ctx=ast.Load()), node)], + keywords=[], + ) + return ast.copy_location(call, node) + def visit_Call(self, node): func = node.func # Visit args and kwargs @@ -1533,45 +1616,62 @@ class DSLPreprocessor(ast.NodeTransformer): ), node, ) - elif isinstance(func, ast.Attribute) and isinstance(func.value, ast.Name): - - def create_downcast_call(arg): - return ast.copy_location( - ast.Call( - func=_create_module_attribute( - self.IMPLICIT_DOWNCAST_NUMERIC_TYPE, - submodule_name="typing", - lineno=node.lineno, - col_offset=node.col_offset, - ), - args=[arg], - keywords=[], - ), - arg, - ) - - module = self.session_data.function_globals.get(func.value.id) - if isinstance(module, ModuleType) and module.__package__.endswith( - "._mlir.dialects" + elif ( + func.id == "printf" + and len(node.args) > 0 + and isinstance(node.args[0], ast.JoinedStr) ): - # Check if argument is Numeric, if so, call ir_value() - args = [] - for arg in node.args: - args.append(create_downcast_call(arg)) - kwargs = [] - for kwarg in node.keywords: - kwargs.append( - ast.copy_location( - ast.keyword( - arg=kwarg.arg, - value=create_downcast_call(kwarg.value), + node.args = [ + ast.Starred(value=self.processFString(node), ctx=ast.Load()) + ] + elif isinstance(func, ast.Attribute) and isinstance(func.value, ast.Name): + if ( + func.attr == "printf" + and len(node.args) > 0 + and isinstance(node.args[0], ast.JoinedStr) + ): + node.args = [ + ast.Starred(value=self.processFString(node), ctx=ast.Load()) + ] + else: + + def create_downcast_call(arg): + return ast.copy_location( + ast.Call( + func=_create_module_attribute( + self.IMPLICIT_DOWNCAST_NUMERIC_TYPE, + submodule_name="typing", + lineno=node.lineno, + col_offset=node.col_offset, ), - kwarg, - ) + args=[arg], + keywords=[], + ), + arg, + ) + + module = self.session_data.function_globals.get(func.value.id) + if isinstance(module, ModuleType) and module.__package__.endswith( + "._mlir.dialects" + ): + # Check if argument is Numeric, if so, call ir_value() + args = [] + for arg in node.args: + args.append(create_downcast_call(arg)) + kwargs = [] + for kwarg in node.keywords: + kwargs.append( + ast.copy_location( + ast.keyword( + arg=kwarg.arg, + value=create_downcast_call(kwarg.value), + ), + kwarg, + ) + ) + return ast.copy_location( + ast.Call(func=func, args=args, keywords=kwargs), node ) - return ast.copy_location( - ast.Call(func=func, args=args, keywords=kwargs), node - ) else: node.func = self.visit(node.func) @@ -1602,6 +1702,11 @@ class DSLPreprocessor(ast.NodeTransformer): self.generic_visit(node) return node + def visit_AnnAssign(self, node): + self._visit_target(node.target) + self.generic_visit(node) + return node + def visit_Name(self, node): isLoad = isinstance(node.ctx, ast.Load) if node.id in ["max", "min", "any", "all"] and isLoad: @@ -1623,22 +1728,13 @@ class DSLPreprocessor(ast.NodeTransformer): self.generic_visit(node) return node - def check_decorator(self, node: ast.AST) -> bool: - """ - Check if the function has the correct decorator for preprocessing. - """ - if not isinstance(node, ast.FunctionDef): - return False - decorator_list = node.decorator_list - if len(decorator_list) == 0: - return False - - for d in decorator_list: + def get_dsl_decorator_index(self, decorator_list): + for i, d in enumerate(decorator_list): if isinstance(d, ast.Call): if isinstance(d.func, ast.Attribute): if d.func.attr in ["jit", "kernel"]: if d.keywords == []: - return True + return i for keyword in d.keywords: if keyword.arg == "preprocess": try: @@ -1651,9 +1747,32 @@ class DSLPreprocessor(ast.NodeTransformer): elif isinstance(d, ast.Attribute): if d.attr in ["jit", "kernel"]: - return True + return i + return None - return False + def check_decorator(self, node: ast.AST) -> bool: + """ + Check if the function has the correct decorator for preprocessing. + """ + if not isinstance(node, ast.FunctionDef): + return False + decorator_list = node.decorator_list + if len(decorator_list) == 0: + return False + + dsl_decorator_index = self.get_dsl_decorator_index(decorator_list) + + if ( + dsl_decorator_index is not None + and dsl_decorator_index < len(decorator_list) - 1 + ): + decorator = ast.unparse(decorator_list[dsl_decorator_index]) + raise DSLAstPreprocessorError( + f"`{decorator}` decorator must be the inner most decorator", + suggestion=f"Please move the `{decorator}` decorator to the inner most position", + ) + + return dsl_decorator_index is not None def remove_dsl_decorator(self, decorator_list): """ @@ -1707,6 +1826,9 @@ class DSLPreprocessor(ast.NodeTransformer): # Remove .jit and .kernel decorators node.decorator_list = self.remove_dsl_decorator(node.decorator_list) + + # Remove return annotation from processed AST to avoid symbol requirement + node.returns = None return node def visit_With(self, node): @@ -2181,11 +2303,9 @@ class DSLPreprocessor(ast.NodeTransformer): return write_args """ test_expr = self.visit(node.test) - pred_name = self.make_func_param_name("pred", write_args) # Section: decorator construction decorator_keywords = [ - ast.keyword(arg="pred", value=test_expr), ast.keyword( arg="write_args", value=self.generate_get_locals_or_none_call(write_args), @@ -2260,7 +2380,6 @@ class DSLPreprocessor(ast.NodeTransformer): # Section: Execute via executor execute_keywords = [ - ast.keyword(arg="pred", value=ast.Name(id=pred_name, ctx=ast.Load())), ast.keyword( arg="write_args", value=ast.List( @@ -2298,8 +2417,7 @@ class DSLPreprocessor(ast.NodeTransformer): ) # Putting everything together, FunctionDef for while_region - func_args_args = [ast.arg(arg=pred_name, annotation=None)] - func_args_args += [ast.arg(arg=var, annotation=None) for var in write_args] + func_args_args = [ast.arg(arg=var, annotation=None) for var in write_args] func_args = ast.arguments( posonlyargs=[], args=func_args_args, diff --git a/python/CuTeDSL/cutlass/base_dsl/cache_helpers.py b/python/CuTeDSL/cutlass/base_dsl/cache_helpers.py index 1d327f45..ce920311 100644 --- a/python/CuTeDSL/cutlass/base_dsl/cache_helpers.py +++ b/python/CuTeDSL/cutlass/base_dsl/cache_helpers.py @@ -13,21 +13,24 @@ This module provides jit cache load/dump helper functions """ +from collections import OrderedDict import os import io import sys import uuid import random import tempfile -import pwd import time +from typing import Any, Optional from pathlib import Path import hashlib from functools import lru_cache +import weakref import zlib from .utils.logger import log from .jit_executor import JitCompiledFunction +from .common import DSLRuntimeError from .._mlir import ir @@ -36,16 +39,28 @@ from .._mlir import ir # ============================================================================= + def get_current_user(): """ Get the current user. This is used to determine the path to the cache directory. """ - # Try to get the user from the environment variable first user = os.getenv("USER") or os.getenv("USERNAME") - if not user: - # Fallback for Unix-like systems - user = pwd.getpwuid(os.getuid()).pw_name - return user + if user: + return user + # Try Unix-like systems + try: + import pwd + + return pwd.getpwuid(os.getuid()).pw_name + except (ImportError, KeyError, AttributeError, OSError): + raise + + +def normalize_path(path): + """ + Normalize a path to its full long form. + """ + return Path(path).resolve() # default_generated_ir_path is the path to the cache directory. @@ -53,7 +68,6 @@ def get_current_user(): # Otherwise, it is set to a directory controled by TMPDIR defaulting # to /tmp/${USER}/cutlass_python_cache. if not (default_generated_ir_path := os.getenv("CUTE_DSL_CACHE_DIR", None)): - tmp_dir = Path(os.environ.get("TMPDIR", tempfile.gettempdir())) def get_reusable_temp_dir(name): @@ -67,6 +81,7 @@ if not (default_generated_ir_path := os.getenv("CUTE_DSL_CACHE_DIR", None)): default_generated_ir_path = str(tmp_dir / "cutlass_python_cache") print(f"Could not determine user, using default path. Error: {e}") + @lru_cache(maxsize=1) def get_default_file_dump_root(): """ @@ -187,7 +202,7 @@ def save_ir( :rtype: str """ initial_name = f"{dsl_name.lower()}_{fname}.mlir" - save_path = Path(output_dir if output_dir else tempfile.gettempdir()) + save_path = normalize_path(output_dir if output_dir else tempfile.gettempdir()) save_fname = save_path / initial_name # Random ID to avoid any collisions rnd_id = str(uuid.uuid4()) @@ -206,7 +221,9 @@ def save_ir( module.operation.write_bytecode(f) else: with open(temp_fname, "w") as f: - print(module, file=f) + # Always save with the locations in the MLIR assembly textual + # representation. + print(module.operation.get_asm(enable_debug_info=True), file=f) # os.replace is guaranteed to be atomic on POSIX systems if it succeeds # so filepath cannot see a partial write os.replace(temp_fname, save_fname) @@ -287,3 +304,174 @@ def dump_cache_to_path( log().warning( f"{dsl_name} failed with dumping generated IR cache for {file}: {e}" ) + + +class JitCacheDict: + def __init__(self, max_elems: int | None = None): + """ + This is a dictionary-like object that stores JitCompiledFunction objects + and will garbage collect them when the associated function is garbage + collected. This is done to prevent memory leaks of compiled functions. + + If max_elems is not None, the cache will use an LRU eviction policy to + evict the least recently used item when the cache is full. + + :param max_elems: The maximum number of elements in the cache. + If None, the cache is unlimited. Default is None. + :type max_elems: int | None + """ + self._dict = OrderedDict() if max_elems is not None else dict() + self.max_elems = max_elems + + def get(self, key: Any) -> Any | None: + """ + Try to get the JitCompiledFunction object for the given key. If the key + is not in the cache, None will be returned. This has the same semantics + as `dict.get` in that it will not raise a KeyError if the key is not in + the cache. + + This implementation will use the dictionary as a LRU cache. + First it will get the underlying weak reference to the value (compiled + artifact). Then it will convert the weak reference to an object. + + If the object found by the weak reference is None, it will remove the + key from the cache and return None to indicate that the key is not in + the cache. + + Otherwise, it will return the object and move the key to the end of the + cache to indicate that it is recently used. + + :param key: The key to get the value for. + :type key: Any + :return: The value for the key or None if the key is not in the cache. + :rtype: Any | None + """ + if self.max_elems == 0: + return None + + # returns a object, finalizer pair and we just want the object + value = self._dict.get(key) + if value is not None: + # unpack the value into the object and finalizer + obj, _ = value + + # Move the key to the end of the cache to indicate that it is recently used + if self.max_elems is not None: + self._dict.move_to_end(key, last=True) + return obj + else: + # Key is truly missing, return None + return None + + def set(self, key: Any, value: Any, funcBody: Any = None) -> None: + """ + Set the JitCompiledFunction object for the given key. After calling this + method, the key will be in the cache if maxsize is not 0. + + If the cache is disabled, the value will not be set. + + If the cache is full, the least recently used item will be evicted. + + The implementation will use the dictionary as a LRU cache. First we will + remove any existing finalizer for the key to prevent the old finalizer + from interacting with the cache. Then we will add the new value to the + cache with a new finalizer. Finally, we will move the key to the end of + the cache to indicate that it is recently used. + + :param key: The key to set the value for. + :type key: Any + :param value: The value to set for the given key. + :type value: Any + :param funcBody: The function body that is associated with the value. + :type funcBody: Any + """ + if self.max_elems == 0: + # Cache disabled: ignore writes. + return + + # Detach any existing finalizer for this key so that collection of the + # old value cannot accidentally remove or interfere with the new entry. + old = self._dict.get(key) + if old is not None: + _, old_finalize = old + # Finalizer now will not be called anymore for this key + if old_finalize is not None: + old_finalize.detach() + + def _remove_entry(k: Any, self_ref=weakref.ref(self)) -> None: + # Called from GC/finalizer; be defensive and avoid raising. + self_obj = self_ref() + if self_obj is not None: + # Provide None to avoid pop throwing a key error + self_obj.delete(k) + + assert value != funcBody, ( + "Value and funcBody cannot be the same object to avoid circular references" + ) + self._dict[key] = ( + value, + None + if funcBody is None + else weakref.finalize(funcBody, _remove_entry, key), + ) + # Move the key to the end of the cache to indicate that it is recently used + if self.max_elems is not None: + self._dict.move_to_end(key, last=True) + # If the cache is full, the least recently used item will be evicted + while len(self._dict) > self.max_elems: + # pop from the front + evicted_key, evicted_value = self._dict.popitem(last=False) + # Finalizer now will not be called anymore for this key + _, finalize = evicted_value + if finalize is not None: + finalize.detach() + + def __contains__(self, key: str) -> bool: + """ + Check if the given key is in the cache. + + :param key: The key to check if it is in the cache. + :type key: Any + :return: True if the key is in the cache, False otherwise. + :rtype: bool + """ + return key in self._dict + + def __len__(self) -> int: + """ + Get the number of items in the cache. + + :return: The number of items in the cache. + :rtype: int + """ + return len(self._dict) + + def delete(self, key: Any) -> None: + """ + Try to delete the value for the given key. + + If the key is not in the cache, this will do nothing. + + This will detach the finalizer for the key to prevent it from + being called anymore in the case that the value is garbage collected. + + :param key: The key to delete the value for. + :type key: Any + """ + try: + _, finalize = self._dict.pop(key) + if finalize is not None: + finalize.detach() + except KeyError: + # Key is truly missing, do nothing + pass + + def clear(self) -> None: + """ + Clear the cache. + """ + for key, value in self._dict.items(): + _, finalize = value + if finalize is not None: + finalize.detach() + self._dict.clear() diff --git a/python/CuTeDSL/cutlass/base_dsl/common.py b/python/CuTeDSL/cutlass/base_dsl/common.py index 9d33c403..202288ad 100644 --- a/python/CuTeDSL/cutlass/base_dsl/common.py +++ b/python/CuTeDSL/cutlass/base_dsl/common.py @@ -201,8 +201,10 @@ def _get_friendly_cuda_error_message(error_code, error_name): ), } - message = f"{error_name} (error code: {error_code}) \n" \ - f"{additional_info.get(error_name, '')} \n\n{Colors.RESET}" + message = ( + f"{error_name} (error code: {error_code}) \n" + f"{additional_info.get(error_name, '')} \n\n{Colors.RESET}" + ) # Add debug information debug_info = f"\n- {Colors.BOLD}Error name: {error_name}\n" @@ -321,3 +323,31 @@ This error typically occurs when: " • CUTLASS DSL requirements: nvidia-cutlass-dsl documentation", ], ) + + +class DSLCudaVersion: + """ + Class to represent the CUDA version used to build the DSL. + """ + + def __init__(self, version: str): + self.version_tuple = tuple(int(part) for part in version.split(".")) + + def __str__(self): + return f"{self.major}.{self.minor}" + + def __eq__(self, other): + if isinstance(other, DSLCudaVersion): + return self.version_tuple == other.version_tuple + elif isinstance(other, str): + return self == DSLCudaVersion(other) + else: + return False + + @property + def major(self): + return self.version_tuple[0] + + @property + def minor(self): + return self.version_tuple[1] diff --git a/python/CuTeDSL/cutlass/base_dsl/compiler.py b/python/CuTeDSL/cutlass/base_dsl/compiler.py index 560359e2..339f695e 100644 --- a/python/CuTeDSL/cutlass/base_dsl/compiler.py +++ b/python/CuTeDSL/cutlass/base_dsl/compiler.py @@ -332,6 +332,7 @@ class KeepPTX(BooleanBasedFileDumpOption): option_name = "dump-ptx-path" + class LinkLibraries(StringCompileOption): option_name = "link-libraries" @@ -427,9 +428,7 @@ class CompileOptions: else self.options[DumpDir].value ) if self.options[KeepPTX].value: - self.options[KeepPTX].dump_path = os.path.join( - dump_dir, f"{function_name}" - ) + self.options[KeepPTX].dump_path = os.path.join(dump_dir, f"{function_name}") self.options[KeepPTX].full_ptx_path = os.path.join( dump_dir, f"{function_name}.{arch}.ptx" ) @@ -440,7 +439,6 @@ class CompileOptions: self.options[KeepCUBIN].full_cubin_path = os.path.join( dump_dir, f"{function_name}.{arch}.cubin" ) - @property def generate_line_info(self) -> bool: return self.options[GenerateLineInfo].value @@ -501,6 +499,7 @@ class CompileOptions: def _parse_compile_options_from_str(options: str) -> CompileOptions: """ Parse the compile options from a string. + Deprecated and will be removed in the future. """ def _get_compile_option_from_str(option_str: str): @@ -622,6 +621,10 @@ class CompileCallable: func, ) + func_name_prefix = getattr(func, "_name_prefix", None) + if func_name_prefix: + kwargs["_name_prefix"] = func_name_prefix + # If it's a wrapped function created by decorators, get the original function while hasattr(func, "__wrapped__"): func = func.__wrapped__ diff --git a/python/CuTeDSL/cutlass/base_dsl/dsl.py b/python/CuTeDSL/cutlass/base_dsl/dsl.py index 3d381883..118e406b 100644 --- a/python/CuTeDSL/cutlass/base_dsl/dsl.py +++ b/python/CuTeDSL/cutlass/base_dsl/dsl.py @@ -62,7 +62,6 @@ from .arch import Arch # ============================================================================= from .._mlir import ir -from .._mlir.extras import types as T from .._mlir.dialects import func # ============================================================================= @@ -71,78 +70,6 @@ from .._mlir.dialects import func MLIR_DYNAMIC = -9223372036854775808 -# ============================================================================= -# Codegen Utils -# ============================================================================= - - -def _numpy_type_to_mlir_type(dtype): - if dtype == np.float64: - return T.f64() - if dtype == np.float16: - return T.f16() - if dtype == np.float32: - return T.f32() - if dtype == np.int64: - return T.i64() - if dtype == np.int32: - return T.i32() - if dtype == np.int16: - return T.i16() - if dtype == np.int8: - return T.i8() - if dtype == np.uint64: - return T.ui64() - if dtype == np.uint32: - return T.ui32() - if dtype == np.uint16: - return T.ui16() - if dtype == np.uint8: - return T.ui8() - if dtype == np.bool_: - return T.bool() - if dtype == f8E5M2: - return T.f8E5M2() - if dtype == f8E4M3FN: - return T.f8E4M3FN() - if dtype == f8E8M0FNU: - return T.f8E8M0FNU() - if dtype == f6E3M2FN: - return T.f6E3M2FN() - if dtype == f6E2M3FN: - return T.f6E2M3FN() - if dtype == f4E2M1FN: - return T.f4E2M1FN() - assert False, f"Unknown type {type}" - - -def _mlir_type_to_numpy_type(type): - if type == T.f64(): - return np.float64 - if type == T.f16(): - return np.float16 - if type == T.f32(): - return np.float32 - if type == T.i64(): - return np.int64 - if type == T.i32(): - return np.int32 - if type == T.i16(): - return np.int16 - if type == T.i8(): - return np.int8 - if type == T.ui64(): - return np.uint64 - if type == T.ui32(): - return np.uint32 - if type == T.ui16(): - return np.uint16 - if type == T.ui8(): - return np.uint8 - if type == T.bool(): - return np.bool_ - assert False, f"Unknown type {type}" - # ============================================================================= # Main DSL Class @@ -192,6 +119,38 @@ def extract_mlir_values(obj): return res +def extract_mlir_attributes(obj): + """ + Given the `obj`, recursively go through it to extract all contained IR attributes as list of MLIR attributes. + This is used for generating kernel function argument attributes. + """ + res = [] + if hasattr(obj, "__extract_mlir_attributes__"): + res = obj.__extract_mlir_attributes__() + elif isinstance(obj, (tuple, list)): + res = sum((extract_mlir_attributes(x) for x in obj), []) + elif isinstance(obj, SimpleNamespace): + res = [] + for k, v in obj.__dict__.items(): + res.extend(extract_mlir_attributes(v)) + # Can't call is_dynamic_expression as _is_dynamic_expression depends on extract_mlir_values + elif isinstance(obj, set): + raise DSLRuntimeError( + "Sets are not supported in extract_mlir_values to ensure order preservation", + context="The DSL attempted to generate JIT function argument(s) for an argument of type set but failed.", + suggestion="Consider using a list or tuple instead", + ) + elif isinstance(obj, ir.Value): + res = [ir.DictAttr.get({})] + elif isinstance(obj, ir.BlockArgumentList): + res = [ir.DictAttr.get({})] * len(obj) + else: + # Unlike extract_mlir_values we expand in the default case that we do not have an __extract_mlir_attributes__ + res = [ir.DictAttr.get({})] * len(get_mlir_types(obj)) + + return res + + def new_from_mlir_values(obj, values): """ Create a new python object by populating containing MLIR values with list of new values @@ -351,7 +310,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): self.envar = self._env_class(self.name) self.enable_preprocessor = preprocess # This cache uses hash of original ir and env as key, allows dump/load to/from file. Enabled by default - self.jit_cache = dict() + self.jit_cache = JitCacheDict(max_elems=self.envar.jit_cache_max_elems) self.host_jit_decorator_name = f"@{BaseDSL.jit.__name__}" self.device_jit_decorator_name = f"@{BaseDSL.kernel.__name__}" @@ -380,6 +339,11 @@ class BaseDSL(metaclass=DSLSingletonMeta): log().info(f"Initializing {name} DSL") log().debug(f"Logger initialized for {self.name}") + if self.envar.jit_time_profiling: + self.profiler = timer(enable=True) + self.cache_hits = 0 + self.cache_misses = 0 + # Hook excepthook if self.envar.filter_stacktrace: origin_excepthook = sys.excepthook @@ -727,7 +691,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): """ jit_arg_type, jit_arg_attr, jit_exec_arg = [], [], [] - default_attr = ir.DictAttr.get({}) if is_argument_constexpr(arg, arg_spec, arg_name, arg_index, func): jit_exec_arg = jit_arg_type = jit_arg_attr = None @@ -799,10 +762,12 @@ class BaseDSL(metaclass=DSLSingletonMeta): else: jit_exec_arg.extend(get_c_pointers(arg)) jit_arg_type.extend(get_mlir_types(arg)) + jit_arg_attr.extend([default_attr] * len(get_mlir_types(arg))) else: dyn_vals = extract_mlir_values(arg) jit_exec_arg.extend(dyn_vals) jit_arg_type.extend([v.type for v in dyn_vals]) + jit_arg_attr.extend(extract_mlir_attributes(arg)) if not jit_arg_type or not jit_exec_arg: # when it is compile only, we don't have to prepare the executable arguments. @@ -829,8 +794,6 @@ class BaseDSL(metaclass=DSLSingletonMeta): "enable dynamic value conversion at runtime.", ) - jit_arg_attr.extend([default_attr] * len(jit_arg_type)) - if jit_arg_type is not None: jit_exec_args.extend(jit_exec_arg) jit_arg_types.extend(jit_arg_type) @@ -871,16 +834,18 @@ class BaseDSL(metaclass=DSLSingletonMeta): @dataclass class LaunchConfig: cluster: list = None + fallback_cluster: list = None grid: list = field(default_factory=lambda: [1, 1, 1]) block: list = field(default_factory=lambda: [1, 1, 1]) max_number_threads: list = field(default_factory=lambda: [0, 0, 0]) smem: int = None async_deps: list = field(default_factory=list) has_cluster: bool = False + has_fallback_cluster: bool = False min_blocks_per_mp: int = 0 use_pdl: bool = False auto_smem: bool = False - + cooperative: bool = False @staticmethod def _check_and_canonicalize_dim(dim, name): if not isinstance(dim, (list, tuple)): @@ -890,11 +855,11 @@ class BaseDSL(metaclass=DSLSingletonMeta): raise DSLRuntimeError( f"Expected {name} dimension to be less than or equal to 3, but got {len(dim)}" ) - - if any(not isinstance(e, (Integer, int)) for e in dim): - raise DSLRuntimeError( - f"Expected integer for {name} dimension, but got {type(e)}" - ) + for idx, e in enumerate(dim): + if not isinstance(e, (Integer, int)): + raise DSLRuntimeError( + f"Expected integer for {name} dimension at index {idx}, but got {type(e)}" + ) # Pad with 1s to 3-dim vector for grid or block dimensions return list(dim) + [1] * (3 - len(dim)) @@ -913,6 +878,12 @@ class BaseDSL(metaclass=DSLSingletonMeta): elif len(self.cluster) != 3: raise DSLRuntimeError(f"Expect 3d cluster!") + self.has_fallback_cluster = self.fallback_cluster is not None + if self.fallback_cluster is None: + self.fallback_cluster = [None, None, None] + elif len(self.fallback_cluster) != 3: + raise DSLRuntimeError(f"Expect 3d fallback_cluster!") + def has_max_number_threads(self): """Check if max_number_threads is given by user""" return all( @@ -1027,13 +998,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): pass def preprocess_pipeline(self, pipeline, arch) -> str: - if self.envar.cuda_toolkit is None: - self.print_warning( - "CUDA_TOOLKIT_PATH environment variable is not set. Cannot set toolkitPath." - ) - options = { - "toolkitPath": self.envar.cuda_toolkit if self.envar.cuda_toolkit else None, self.pass_sm_arch_name: arch, } @@ -1118,7 +1083,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): try: module.operation.verify() except Exception as e: - raise DSLRuntimeError(f"🧊🧊🧊 ICE IR Verification Failed 🧊🧊🧊", cause=e) + raise DSLRuntimeError("🧊🧊🧊 ICE IR Verification Failed 🧊🧊🧊", cause=e) return module @@ -1158,9 +1123,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): self._build_gpu_module(gpu_module_attrs, loc=loc) ret_types = self.get_return_types() - fop = func.FuncOp( - function_name, (func_types, ret_types), loc=loc - ) + fop = func.FuncOp(function_name, (func_types, ret_types), loc=loc) fop.attributes["llvm.emit_c_interface"] = ir.UnitAttr.get() log().debug("Generated Function OP [%s]", fop) # Attach per-argument source locations if supported by the FuncOp binding. @@ -1189,8 +1152,10 @@ class BaseDSL(metaclass=DSLSingletonMeta): return module, result # Build IR module - profiler = timer(enable=self.envar.jit_time_profiling) - module, result = profiler(build_ir_module)() + if self.envar.jit_time_profiling: + module, result = self.profiler(build_ir_module)() + else: + module, result = build_ir_module() module_hash = self.get_module_hash(module, function_name) module = self.build_module(module, function_name) @@ -1205,6 +1170,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): pipeline, args_spec, no_cache, + no_jit_engine, func_type=JitCompiledFunction, *, full_args=None, @@ -1212,6 +1178,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): dynamic_args=None, dynamic_kwargs=None, original_function_name=None, + funcBody=None, ): # If `gpu-arch` is set by compile_options, use it. Otherwise, use the arch from the environment variable. compile_gpu_arch = ( @@ -1221,13 +1188,13 @@ class BaseDSL(metaclass=DSLSingletonMeta): ) # If no gpu kernels or compile_gpu_arch is same as the arch from the environment variable, generate a JIT engine. Otherwise, only do the compilation. gen_jit_engine = self.num_kernels == 0 or compile_gpu_arch == self.envar.arch + if no_jit_engine: + gen_jit_engine = False # Preprocess the pipeline. pipeline = self.preprocess_pipeline( self._get_pipeline(pipeline), compile_gpu_arch ) - log().debug(f"Using pipeline = {pipeline}") shared_libs = self.get_shared_libs() - profiler = timer(enable=self.envar.jit_time_profiling) # try load the file cache load_from_file_cache = False if not no_cache: @@ -1236,13 +1203,17 @@ class BaseDSL(metaclass=DSLSingletonMeta): ) if fn is not None: load_from_file_cache = True - self.jit_cache[module_hash] = fn + self.jit_cache.set(module_hash, fn, funcBody=funcBody) - if ( - no_cache - or module_hash not in self.jit_cache - or self.jit_cache[module_hash].ir_module is None - ): + cached_jit_func = None if no_cache else self.jit_cache.get(module_hash) + + if no_cache or cached_jit_func is None or cached_jit_func.ir_module is None: + if self.envar.jit_time_profiling: + self.cache_misses += 1 + log().info( + "Jit cache hit rate=[%f%%]", + self.cache_hits / (self.cache_hits + self.cache_misses) * 100, + ) log().info( "JIT cache miss function=[%s] module_hash=[%s]", function_name, @@ -1250,11 +1221,22 @@ class BaseDSL(metaclass=DSLSingletonMeta): ) # Compile and JIT MLIR module if gen_jit_engine: - engine = profiler(self.compile_and_jit)( - module, pipeline, shared_libs, function_name=function_name - ) + if self.envar.jit_time_profiling: + engine = self.profiler(self.compile_and_jit)( + module, pipeline, shared_libs, function_name=function_name + ) + else: + engine = self.compile_and_jit( + module, pipeline, shared_libs, function_name=function_name + ) else: - profiler(self.compiler_provider.compile)(module, pipeline) + if self.envar.jit_time_profiling: + self.profiler(self.compiler_provider.compile)( + module, + pipeline, + ) + else: + self.compiler_provider.compile(module, pipeline) engine = None else: log().info( @@ -1262,13 +1244,22 @@ class BaseDSL(metaclass=DSLSingletonMeta): function_name, module_hash, ) - module = self.jit_cache[module_hash].ir_module + if self.envar.jit_time_profiling: + self.cache_hits += 1 + log().info( + "JIT cache hit rate=[%f%%]", + self.cache_hits / (self.cache_hits + self.cache_misses) * 100, + ) + module = cached_jit_func.ir_module engine = ( self.compiler_provider.jit(module, shared_libs=shared_libs) if gen_jit_engine else None ) - capi_func = profiler(engine.lookup)(function_name) if engine else None + if self.envar.jit_time_profiling: + capi_func = self.profiler(engine.lookup)(function_name) if engine else None + else: + capi_func = engine.lookup(function_name) if engine else None fn = func_type( module, @@ -1283,14 +1274,14 @@ class BaseDSL(metaclass=DSLSingletonMeta): CUBIN=self.compile_options.full_cubin_path, MLIR=(self.dump_mlir_path if self.envar.keep_ir else None), ), + # set dynamic arguments if the jit_function is a JitCompiledFunction for AOT generation. + dynamic_args=dynamic_args, + dynamic_kwargs=dynamic_kwargs, ) - # set dynamic arguments if the jit_function is a JitCompiledFunction for AOT generation. - fn.set_dynamic_args(dynamic_args, dynamic_kwargs) - if not no_cache: # module stored in cache is compiled. - self.jit_cache[module_hash] = fn + self.jit_cache.set(module_hash, fn, funcBody=funcBody) # write through the file cache if enabled. if not self.envar.disable_file_caching and not load_from_file_cache: dump_cache_to_path( @@ -1330,18 +1321,10 @@ class BaseDSL(metaclass=DSLSingletonMeta): i, funcBody, ): - try: - dynamic_args.append(weakref.proxy(arg)) - except TypeError: - # If arg cannot be weakly referenced (e.g., int, float) - dynamic_args.append(arg) + dynamic_args.append(arg) for i, (k, v) in enumerate(kwargs.items()): if not is_argument_constexpr(v, args_spec.kwonlyargs[i], k, i, funcBody): - try: - dynamic_kwargs[k] = weakref.proxy(v) - except TypeError: - # If v cannot be weakly referenced (e.g., int, float) - dynamic_kwargs[k] = v + dynamic_kwargs[k] = v return dynamic_args, dynamic_kwargs def generate_mlir( @@ -1354,6 +1337,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): args_spec, pipeline, no_cache, + no_jit_engine, compile_only, location=None, ): @@ -1387,10 +1371,13 @@ class BaseDSL(metaclass=DSLSingletonMeta): if self.envar.dryrun: return result + # Get a single reference to the cache since garbage collection + cached_jit_func = None if no_cache else self.jit_cache.get(module_hash) + if ( no_cache - or module_hash not in self.jit_cache - or self.jit_cache[module_hash].capi_func is None + or cached_jit_func is None + or cached_jit_func.capi_func is None ): # no cache or cache miss, do ir generation/compilation/jit engine jit_function = self.compile_and_cache( @@ -1400,11 +1387,13 @@ class BaseDSL(metaclass=DSLSingletonMeta): pipeline, args_spec, no_cache, + no_jit_engine, full_args=args, full_kwargs=kwargs, dynamic_args=dynamic_args, dynamic_kwargs=dynamic_kwargs, original_function_name=original_function_name, + funcBody=funcBody, ) else: # cache hit @@ -1413,7 +1402,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): function_name, module_hash, ) - jit_function = self.jit_cache[module_hash] + jit_function = cached_jit_func finally: self.post_compilation_cleanup() @@ -1537,9 +1526,14 @@ class BaseDSL(metaclass=DSLSingletonMeta): # Disable cache no_cache = kwargs.pop("no_cache", False) + # Disable JIT execution engine + no_jit_engine = kwargs.pop("no_jit_engine", False) + # Always compile(disable cache) and return the result jit_executor compile_only = kwargs.pop("compile_only", False) + func_name_prefix = kwargs.pop("_name_prefix", None) + if not no_cache and ( self.envar.keep_ptx or self.envar.keep_cubin @@ -1560,9 +1554,11 @@ class BaseDSL(metaclass=DSLSingletonMeta): canonicalized_args, canonicalized_kwargs = self._canonicalize_args( sig, *args, **kwargs ) - # Simple name mangling function_name = self.mangle_name(function_name, canonicalized_args, args_spec) + if func_name_prefix: + function_name = f"{func_name_prefix}_{function_name}" + self.compile_options.apply_envar_settings(self.envar, function_name) if not self.compile_options.generate_line_info: self.decorator_location = None @@ -1578,6 +1574,7 @@ class BaseDSL(metaclass=DSLSingletonMeta): args_spec, pipeline, no_cache, + no_jit_engine, compile_only, location=self.decorator_location, ) @@ -1778,6 +1775,8 @@ class BaseDSL(metaclass=DSLSingletonMeta): # The mangled name of Python function is part of the name to # improve readability. kernel_name = f"kernel_{self.mangle_name(kernel_name, args, args_spec)}_{self.num_kernels}" + if hasattr(self, "_name_prefix") and self._name_prefix: + kernel_name = f"{self._name_prefix}_{kernel_name}" self.num_kernels += 1 # Step 0. Preprocess the arguments diff --git a/python/CuTeDSL/cutlass/base_dsl/env_manager.py b/python/CuTeDSL/cutlass/base_dsl/env_manager.py index bd08b158..f135258b 100644 --- a/python/CuTeDSL/cutlass/base_dsl/env_manager.py +++ b/python/CuTeDSL/cutlass/base_dsl/env_manager.py @@ -73,6 +73,27 @@ def get_int_env_var(var_name, default_value=0): return int(value) if value and value.isdigit() else default_value +@lru_cache(maxsize=None) +def get_int_or_none_env_var(var_name, default_value=None): + """ + Get the value of an integer or None union environment variable. + If the value is not a valid integer, the default value 0 is returned. + Note that the value is cached after the first call. + """ + raw = get_str_env_var(var_name) + if raw is None: + return default_value + + value = raw.strip().lower() + if value == "none": + return None + + try: + return int(value) + except ValueError: + return default_value + + @lru_cache(maxsize=None) def has_env_var(var_name): """ @@ -235,17 +256,19 @@ def get_prefix_dsl_libs(prefix: str): return prefix_libs_existing def get_libs_cand(start): - target_cuda_dialect_libs = { - "cuda_dialect_runtime", + target_dsl_runtime_libs = { + "cute_dsl_runtime", } lib_folder_guesses = [ "lib", ] for target_libs in [ - target_cuda_dialect_libs, + target_dsl_runtime_libs, ]: - libs_cand = find_libs_in_ancestors(start, target_libs, lib_folder_guesses) + libs_cand = find_libs_in_ancestors( + start, target_libs, lib_folder_guesses + ) if libs_cand: dsl_libs = ":".join(libs_cand) return dsl_libs @@ -310,6 +333,8 @@ class EnvironmentVarManager(LogEnvironmentManager): - [DSL_NAME]_WARNINGS_IGNORE: Ignore warnings (default: False) - [DSL_NAME]_ENABLE_OPTIMIZATION_WARNINGS: Enable warnings of optimization warnings (default: False) - [DSL_NAME]_JIT_TIME_PROFILING: Whether or not to profile the IR generation/compilation/execution time (default: False) + - [DSL_NAME]_JIT_CACHE_MAX_ELEMS: Maximum number of JIT compiled functions to cache in memory (default: None). If None, the cache is unbounded. + - [DSL_NAME]_NO_CACHE: Disable JIT cache (default: False) - [DSL_NAME]_DISABLE_FILE_CACHING: Disable file caching (default: False) - [DSL_NAME]_LIBS: Path to dependent shared libraries (default: None) - [DSL_NAME]_ENABLE_TVM_FFI: Enable TVM-FFI or not (default: False) @@ -325,12 +350,17 @@ class EnvironmentVarManager(LogEnvironmentManager): self.print_ir = get_bool_env_var(f"{prefix}_PRINT_IR", False) self.filter_stacktrace = get_bool_env_var(f"{prefix}_FILTER_STACKTRACE", True) self.lineinfo = get_bool_env_var(f"{prefix}_LINEINFO", False) + self.no_cache = get_bool_env_var(f"{prefix}_NO_CACHE", False) + self.jit_cache_max_elems = get_int_or_none_env_var( + f"{prefix}_JIT_CACHE_MAX_ELEMS", None + ) + if self.no_cache: + self.jit_cache_max_elems = 0 self.dump_dir = get_str_env_var( f"{prefix}_DUMP_DIR", get_default_file_dump_root() ) self.keep_ptx = get_bool_env_var(f"{prefix}_KEEP_PTX", False) self.keep_cubin = get_bool_env_var(f"{prefix}_KEEP_CUBIN", False) - # File options self.keep_ir = get_bool_env_var(f"{prefix}_KEEP_IR", False) self.cache_dir = get_str_env_var(f"{prefix}_CACHE_DIR", None) diff --git a/python/CuTeDSL/cutlass/base_dsl/export/__init__.py b/python/CuTeDSL/cutlass/base_dsl/export/__init__.py index 5d1c59a3..66eaf403 100644 --- a/python/CuTeDSL/cutlass/base_dsl/export/__init__.py +++ b/python/CuTeDSL/cutlass/base_dsl/export/__init__.py @@ -9,12 +9,23 @@ # and related documentation outside the scope permitted by the EULA # is strictly prohibited. -from .c_header_generator import CHeaderGenerator -from .export import get_export_module, dump_to_object, export_to_c +from .c_header_generator import CHeaderGenerator, CHeaderArguments +from .export import ( + get_export_module, + encode_metadata_into_ir_module, + decode_metadata_from_execution_engine, +) + +from .export import ArgsSpecProcessor +from .external_binary_module import ExternalBinaryModule, LoadProvider __all__ = [ "CHeaderGenerator", + "CHeaderArguments", "get_export_module", - "dump_to_object", - "export_to_c", + "encode_metadata_into_ir_module", + "decode_metadata_from_execution_engine", + "ArgsSpecProcessor", + "ExternalBinaryModule", + "LoadProvider", ] diff --git a/python/CuTeDSL/cutlass/base_dsl/export/c_header_generator.py b/python/CuTeDSL/cutlass/base_dsl/export/c_header_generator.py index 3284280f..f99a3e36 100644 --- a/python/CuTeDSL/cutlass/base_dsl/export/c_header_generator.py +++ b/python/CuTeDSL/cutlass/base_dsl/export/c_header_generator.py @@ -41,6 +41,36 @@ import cuda.bindings.driver as cuda cubin_suffix = "cubin" +class CHeaderArguments: + """This class is used to store the arguments generation of the wrapper function. + The arguments are generated when the JitCompiledFunction is created and used to avoid + the long-term reference of the arguments by the JitCompiledFunction. + """ + + def __init__( + self, + dummy_prefix_name: str, + arguments: List[str], + packed_args: List[str], + declarations: str, + error_msg: str = None, + ): + self.dummy_prefix_name = dummy_prefix_name + self.arguments = arguments + self.packed_args = packed_args + self.declarations = declarations + self.error_msg = error_msg + + def __bool__(self): + return self.error_msg is None + + def __str__(self): + return self.error_msg + + def __repr__(self): + return self.error_msg + + class CHeaderGenerator: """This class provides a Export C Header Generator for c/cpp AOT support.""" @@ -120,11 +150,11 @@ class CHeaderGenerator: return check_cuda - def _generate_kernel_metadata( + def _generate_kernel_module( self, symbol_prefix: str, kernel_info: Dict[str, List], dsl_name: str ): """ - Generate the kernel metadata for the compiled function. + Generate the kernel module for the compiled function. """ function_declarations = [] function_loads = [] @@ -132,31 +162,31 @@ class CHeaderGenerator: function_non_portable_cluster_size_allowed = [] for sym, attrs in kernel_info.items(): function_declaration = f"CUfunction {sym};" - function_load = f'{dsl_name}_CUDA_ERROR_CHECK(cuModuleGetFunction(&metadata->{sym}, metadata->module, "{sym}"));' + function_load = f'{dsl_name}_CUDA_ERROR_CHECK(cuModuleGetFunction(&module->{sym}, module->module, "{sym}"));' function_declarations.append(function_declaration) function_loads.append(function_load) for attr in attrs: function_set_attributes.append( - f"{dsl_name}_CUDA_ERROR_CHECK(cuFuncSetAttribute(metadata->{sym}, {attr.name}, {attr.value}));" + f"{dsl_name}_CUDA_ERROR_CHECK(cuFuncSetAttribute(module->{sym}, {attr.name}, {attr.value}));" ) function_non_portable_cluster_size_allowed.append( - f"{dsl_name}_CUDA_ERROR_CHECK(cuFuncSetAttribute(metadata->{sym}, CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 1));" + f"{dsl_name}_CUDA_ERROR_CHECK(cuFuncSetAttribute(module->{sym}, CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 1));" ) function_declarations_str = "\n ".join(function_declarations) - kernel_metadata_struct = f""" + kernel_module_struct = f""" typedef struct {{ CUmodule module; {function_declarations_str} -}} {symbol_prefix}_Kernel_Metadata_t; +}} {symbol_prefix}_Kernel_Module_t; """ function_loads_str = "\n ".join(function_loads) function_set_attributes_str = "\n ".join(function_set_attributes) function_non_portable_cluster_size_allowed_str = "\n ".join( function_non_portable_cluster_size_allowed ) - kernel_metadata_load = f""" -static inline void {symbol_prefix}_Kernel_Metadata_Load({symbol_prefix}_Kernel_Metadata_t *metadata) {{ - {dsl_name}_CUDA_ERROR_CHECK(cuModuleLoadData(&metadata->module, {symbol_prefix}_{cubin_suffix})); + kernel_module_load = f""" +static inline void {symbol_prefix}_Kernel_Module_Load({symbol_prefix}_Kernel_Module_t *module) {{ + {dsl_name}_CUDA_ERROR_CHECK(cuModuleLoadData(&module->module, {symbol_prefix}_{cubin_suffix})); {function_loads_str} {function_set_attributes_str} int driver_version; @@ -166,13 +196,13 @@ static inline void {symbol_prefix}_Kernel_Metadata_Load({symbol_prefix}_Kernel_M }} }} """ - kernel_metadata_unload = f""" -static inline void {symbol_prefix}_Kernel_Metadata_Unload({symbol_prefix}_Kernel_Metadata_t *metadata) {{ - {dsl_name}_CUDA_ERROR_CHECK(cuModuleUnload(metadata->module)); + kernel_module_unload = f""" +static inline void {symbol_prefix}_Kernel_Module_Unload({symbol_prefix}_Kernel_Module_t *module) {{ + {dsl_name}_CUDA_ERROR_CHECK(cuModuleUnload(module->module)); }} """ - return kernel_metadata_struct + kernel_metadata_load + kernel_metadata_unload + return kernel_module_struct + kernel_module_load + kernel_module_unload def _generate_arguments( self, @@ -213,29 +243,42 @@ static inline void {symbol_prefix}_Kernel_Metadata_Unload({symbol_prefix}_Kernel def _generate_wrapper_function( self, + dsl_name: str, symbol_prefix: str, args_spec: ExecutionArgs, function_name: str, kernel_info: Dict[str, List], - dynamic_args: list, - dynamic_kwargs: dict, + c_header_arguments: CHeaderArguments, ): """ Generate the wrapper function for the compiled function which is provided to users as the entry point. It uses the `symbol_prefix` as the function name for identification. The host/device symbols are hidden under the bytecode. """ # 1. Get the name of the function wrapper - wrapper_function_name = f"{symbol_prefix}_wrapper" + wrapper_function_name = f"{dsl_name.lower()}_{symbol_prefix}_wrapper" capi_function_name = f"_mlir_{symbol_prefix}__mlir_ciface_{function_name}" # 2. Generate the signature of the wrapper function - arguments, packed_args, declarations = self._generate_arguments( - symbol_prefix, args_spec, dynamic_args, dynamic_kwargs - ) + if c_header_arguments.error_msg is not None: + raise DSLRuntimeError( + f"Error generating c header arguments: {c_header_arguments.error_msg}" + ) + arguments = [ + arg.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for arg in c_header_arguments.arguments + ] + packed_args = [ + arg.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for arg in c_header_arguments.packed_args + ] + declarations = [ + declaration.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for declaration in c_header_arguments.declarations + ] declarations = "\n".join(declarations) # 3. Generate the wrapper function kernel_symbols = tuple(kernel_info.keys()) - kernel_symbols_str = ", ".join([f"&metadata->{sym}" for sym in kernel_symbols]) + kernel_symbols_str = ", ".join([f"&module->{sym}" for sym in kernel_symbols]) function = ( declarations + f""" @@ -244,7 +287,7 @@ extern "C" #endif void {capi_function_name}(void **args, int32_t num_args); -static inline void {wrapper_function_name}({symbol_prefix}_Kernel_Metadata_t *metadata, {", ".join(arguments)}) {{ +static inline void {wrapper_function_name}({symbol_prefix}_Kernel_Module_t *module, {", ".join(arguments)}) {{ void *args[{len(packed_args) + len(kernel_symbols)}] = {{ {", ".join(packed_args)}, {kernel_symbols_str} }}; @@ -258,7 +301,6 @@ static inline void {wrapper_function_name}({symbol_prefix}_Kernel_Metadata_t *me """ Generate the binary of the compiled function. """ - varname = symbol_prefix + "_" + cubin_suffix binary = f""" extern const unsigned char {varname}[]; @@ -272,29 +314,28 @@ extern const unsigned char {varname}[]; args_spec: ExecutionArgs, function_name: str, kernel_info: Dict[str, List], - dynamic_args: list, - dynamic_kwargs: dict, + c_header_arguments: CHeaderArguments, dsl_name: str, ) -> str: if len(kernel_info) > 0: check_cuda = self._generate_check_cuda(dsl_name) - kernel_metadata = self._generate_kernel_metadata( + kernel_module = self._generate_kernel_module( symbol_prefix, kernel_info, dsl_name ) binary = self._generate_binary_declaration(symbol_prefix) else: check_cuda = "" - kernel_metadata = "" + kernel_module = "" binary = "" function = self._generate_wrapper_function( + dsl_name, symbol_prefix, args_spec, function_name, kernel_info, - dynamic_args, - dynamic_kwargs, + c_header_arguments, ) - header = self.includes + check_cuda + binary + kernel_metadata + function + header = self.includes + check_cuda + binary + kernel_module + function return header @@ -333,21 +374,21 @@ extern const unsigned char {varname}[]; # typedef struct { # CUmodule module; # CUfunction kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0; -# } gemm_Kernel_Metadata_t; +# } gemm_Kernel_Module_t; -# static inline void gemm_Kernel_Metadata_Load(gemm_Kernel_Metadata_t *metadata) { -# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleLoadData(&metadata->module, gemm_cubin)); -# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleGetFunction(&metadata->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0, metadata->module, "kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0")); +# static inline void gemm_Kernel_Module_Load(gemm_Kernel_Module_t *module) { +# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleLoadData(&module->module, gemm_cubin)); +# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleGetFunction(&module->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0, module->module, "kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0")); # int driver_version; # CUTE_DSL_CUDA_ERROR_CHECK(cuDriverGetVersion(&driver_version)); # if (driver_version >= 11080) { -# CUTE_DSL_CUDA_ERROR_CHECK(cuFuncSetAttribute(metadata->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0, CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 1)); +# CUTE_DSL_CUDA_ERROR_CHECK(cuFuncSetAttribute(module->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0, CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 1)); # } # } -# static inline void gemm_Kernel_Metadata_Unload(gemm_Kernel_Metadata_t *metadata) { -# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleUnload(metadata->module)); +# static inline void gemm_Kernel_Module_Unload(gemm_Kernel_Module_t *module) { +# CUTE_DSL_CUDA_ERROR_CHECK(cuModuleUnload(module->module)); # } # typedef struct { @@ -375,9 +416,9 @@ extern const unsigned char {varname}[]; # #endif # void _mlir_gemm__mlir_ciface_cutlass_host_func_Tensorgenericoi641_Tensorgenericoi641_Tensorgenericoi641(void **args, int32_t num_args); -# static inline void gemm_wrapper(gemm_Kernel_Metadata_t *metadata, gemm_Tensor_a_t *a, gemm_Tensor_b_t *b, gemm_Tensor_c_t *c) { +# static inline void cute_dsl_gemm_wrapper(gemm_Kernel_Module_t *module, gemm_Tensor_a_t *a, gemm_Tensor_b_t *b, gemm_Tensor_c_t *c) { # void *args[4] = { -# a, b, c, &metadata->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0 +# a, b, c, &module->kernel_cutlass_dummy_gemm_tensorptrf32generico1_tensorptrf32generico1_tensorptrf32generico1_0 # }; # _mlir_gemm__mlir_ciface_cutlass_host_func_Tensorgenericoi641_Tensorgenericoi641_Tensorgenericoi641(args, 4); # } diff --git a/python/CuTeDSL/cutlass/base_dsl/export/export.py b/python/CuTeDSL/cutlass/base_dsl/export/export.py index 5342ad15..7e91ab00 100644 --- a/python/CuTeDSL/cutlass/base_dsl/export/export.py +++ b/python/CuTeDSL/cutlass/base_dsl/export/export.py @@ -11,23 +11,26 @@ import io import os -import array -import tempfile from ..common import DSLRuntimeError -from ..jit_executor import JitCompiledFunction, get_escaped_cubin_bytes -from ...base_dsl.dsl import BaseDSL -from ...base_dsl.typing import Int32, Int64, Float32, Float64 from ..._mlir import ir from ..._mlir.dialects import llvm -from .c_header_generator import CHeaderGenerator +import json +import base64 +import ctypes +from inspect import FullArgSpec -from typing import Union +args_spec_suffix = "args_spec" +function_name_suffix = "function_name" +kernel_info_suffix = "kernel_info" +version_suffix = "version" +c_string_suffix = "\0" -cubin_suffix = "cubin" -def get_export_module(ir_module: ir.Module, symbol_prefix: str, *, preserve_symbols = None): +def get_export_module( + ir_module: ir.Module, symbol_prefix: str, *, preserve_symbols=None +): """Get the export module which is cloned from the original compiled ir module, and add the prefix to avoid the symbol conflict. @@ -66,7 +69,10 @@ def get_export_module(ir_module: ir.Module, symbol_prefix: str, *, preserve_symb symbol_prefix + "_" + op.attributes["callee"].value ) # Rename addressof references - elif op.name == "llvm.mlir.addressof" and op.attributes["global_name"].value in defined_symbols: + elif ( + op.name == "llvm.mlir.addressof" + and op.attributes["global_name"].value in defined_symbols + ): op.attributes["global_name"] = ir.FlatSymbolRefAttr.get( symbol_prefix + "_" + op.attributes["global_name"].value ) @@ -76,9 +82,9 @@ def get_export_module(ir_module: ir.Module, symbol_prefix: str, *, preserve_symb renamed_ctors = [] for ctor in ctors: if ctor.value in defined_symbols: - renamed_ctors.append(ir.FlatSymbolRefAttr.get( - symbol_prefix + "_" + ctor.value - )) + renamed_ctors.append( + ir.FlatSymbolRefAttr.get(symbol_prefix + "_" + ctor.value) + ) else: renamed_ctors.append(ctor) if renamed_ctors: @@ -89,9 +95,9 @@ def get_export_module(ir_module: ir.Module, symbol_prefix: str, *, preserve_symb renamed_dtors = [] for dtor in dtors: if dtor.value in defined_symbols: - renamed_dtors.append(ir.FlatSymbolRefAttr.get( - symbol_prefix + "_" + dtor.value - )) + renamed_dtors.append( + ir.FlatSymbolRefAttr.get(symbol_prefix + "_" + dtor.value) + ) else: renamed_dtors.append(dtor) if renamed_dtors: @@ -107,135 +113,127 @@ def get_export_module(ir_module: ir.Module, symbol_prefix: str, *, preserve_symb return export_module +class ArgsSpecProcessor: + """The args spec processor. The args_spec may contain the dsl specific types. The base processor + class is used to define an interface for dumping and loading the args_spec.""" -def dump_to_object( - prefix_name: str, - export_module: ir.Module, - jit_function: Union[JitCompiledFunction, "CudaDialectJitCompiledFunction"], - dsl: BaseDSL, - use_gpu_dialect: bool, -) -> bytes: - """Dump the compiled ir function to a bytes object with ELF format. The bytes object contains the host - launch entry function and cubin inside. + def dumps(self, args_spec: FullArgSpec) -> bytes: + raise NotImplementedError("ArgsSpecProcessor does not support dumps") - @param prefix_name: The prefix name of the function. This is the unique identifier name of the function to avoid symbol conflict in the generated object file. - @param export_module: The export module of the function. This is the module that contains the function to be exported. - @param jit_function: The jit-compiled function. To provided other metadata for the object file. - @param dsl: The dsl object. This is the dsl object to get the compiler provider and shared libs. - @return: The bytes object of the function. - """ - if use_gpu_dialect: - cubin_data = None - - def strip_gpu_binary_op(op): - if op.name == "gpu.binary": - s = io.BytesIO() - op.operation.write_bytecode(s) - nonlocal cubin_data - cubin_data = s.getvalue() - cubin_data = cubin_data.split(b'bin = "')[1].split(b'">')[0] - cubin_data = get_escaped_cubin_bytes(cubin_data) - op.erase() - return ir.WalkResult.ADVANCE - return ir.WalkResult.ADVANCE - - # Strip gpu related to avoid the object file generating builtin module load/unload functions - export_module.operation.walk(strip_gpu_binary_op) - - cubin_array = array.array("b", cubin_data) - with ( - export_module.context, - ir.Location.unknown(), - ir.InsertionPoint(export_module.body), - ): - new_binary_global_op = llvm.GlobalOp( - sym_name="_".join([prefix_name, cubin_suffix]), - global_type=ir.Type.parse(f"!llvm.array<{len(cubin_array)} x i8>"), - linkage=ir.Attribute.parse("#llvm.linkage"), - value=ir.DenseIntElementsAttr.get(cubin_array), - constant=True, - ) - if "gpu.container_module" in export_module.operation.attributes: - del export_module.operation.attributes["gpu.container_module"] - # Generate the object file - export_engine = dsl.compiler_provider.jit( - export_module, shared_libs=dsl.get_shared_libs() - ) - # This lookup is necessary to make sure the compilation is done. - entry_func = export_engine.raw_lookup( - "_".join([prefix_name, jit_function.function_name]) - ) - if not entry_func: - raise DSLRuntimeError( - f"Execution engine cannot find the entry function {prefix_name}_{jit_function.function_name}" - ) - try: - with tempfile.NamedTemporaryFile() as tmp_object_file: - export_engine.dump_to_object_file(tmp_object_file.name) - with open(tmp_object_file.name, "rb") as f: - ret = f.read() - return ret - except Exception as e: - raise DSLRuntimeError(f"Error dumping object file: {e}") from e + def loads(self, args_spec_bytes: bytes): + raise NotImplementedError("ArgsSpecProcessor does not support loads") -def export_to_c( - jit_function: Union[JitCompiledFunction, "CudaDialectJitCompiledFunction"], - file_path: str, - file_name: str, - dsl: BaseDSL, - c_header_generator: CHeaderGenerator, - use_gpu_dialect: bool, +def encode_metadata_into_ir_module( + prefix: str, + ir_module: ir.Module, + args_spec: FullArgSpec, + function_name: str, + kernel_info: dict, + args_spec_processor: ArgsSpecProcessor, + object_file_version: str, ): - """Exports the jit-compiled function to a C compatible files(header/library). - This is used for c/cpp AOT support. - The `file_name` will be used as the symbol prefix of the generated functions, it is guaranteed by - the caller that the generated functions are unique. And the function will always overwrite the existing file. + """Encode the executor metadata into the ir module. The metadata includes: + 1. args_spec: The args_spec of the python function. + 2. function_name: The name mangling function_name of the python host function. + 3. kernel_info: The kernel_info of the jit-compiled function including the kernel name and attributes. + 4. version: The version of the object file. - - The c header file is generated with following components: - 1. The host launch entry function. And the structure definitions of the arguments. - 2. The device metadata load/unload functions. - 3. The cubin data array and len. - - The library contains the binary of the underlying host launch entry function. - - @param jit_function: The jit-compiled function from `cute.compile`. - @param file_path: The path to the directory where the header and object files will be saved. - @param file_name: The name of the function. This is the unique identifier name of the function to avoid symbol conflict in the generated object file. - @param dsl: The dsl object. This is the dsl object to get the compiler provider and shared libs. - @param c_header_generator: The c header generator. This is the c header generator to generate the c header file. + @param prefix: The prefix name of the function. This is the unique identifier name of the function to avoid symbol conflict in the generated object file. + @param ir_module: The ir module to encode the metadata into. + @param args_spec: The args_spec of the python function. + @param function_name: The name mangling function_name of the python host function. + @param kernel_info: The kernel_info of the jit-compiled function including the kernel name and attributes. + @param args_spec_processor: The args spec processor. The args_spec may contain the dsl specific types. The processor will be used to dump and load the args_spec. + @param object_file_version: The version of the object file. """ - export_module = get_export_module(jit_function.ir_module, file_name) - # Generate the c header file - header_file_content = c_header_generator( - file_name, - export_module, - jit_function.args_spec, - jit_function.function_name, - jit_function.kernel_info, - jit_function.dynamic_args, - jit_function.dynamic_kwargs, - dsl.name, + if not args_spec: + raise DSLRuntimeError( + "args_spec is empty, please set the args_spec for the python jit function." + ) + version = object_file_version + c_string_suffix + + args_spec_bytes = args_spec_processor.dumps(args_spec) + args_spec_str = base64.b64encode(args_spec_bytes).decode("utf-8") + c_string_suffix + packed_function_name = ( + "_mlir_" + prefix + "__mlir_ciface_" + function_name + c_string_suffix ) - try: - with open(os.path.join(file_path, file_name + ".h"), "w") as f: - f.write(header_file_content) - except Exception as e: - raise DSLRuntimeError(f"Error writing header file: {e}") from e + with ir_module.context, ir.Location.unknown(): + with ir.InsertionPoint(ir_module.body): + args_spec_op = llvm.GlobalOp( + sym_name="_".join([prefix, args_spec_suffix]), + global_type=ir.Type.parse(f"!llvm.array<{len(args_spec_str)} x i8>"), + linkage=ir.Attribute.parse("#llvm.linkage"), + value=ir.StringAttr.get(args_spec_str), + ) + function_name_op = llvm.GlobalOp( + sym_name="_".join([prefix, function_name_suffix]), + global_type=ir.Type.parse( + f"!llvm.array<{len(packed_function_name)} x i8>" + ), + linkage=ir.Attribute.parse("#llvm.linkage"), + value=ir.StringAttr.get(packed_function_name), + ) + # pack the kernel_info from a dict to a global op. + kernel_info = json.dumps(kernel_info) + c_string_suffix + kernel_info_op = llvm.GlobalOp( + sym_name="_".join([prefix, kernel_info_suffix]), + global_type=ir.Type.parse(f"!llvm.array<{len(kernel_info)} x i8>"), + linkage=ir.Attribute.parse("#llvm.linkage"), + value=ir.StringAttr.get(kernel_info), + ) + version_op = llvm.GlobalOp( + sym_name="_".join([prefix, version_suffix]), + global_type=ir.Type.parse(f"!llvm.array<{len(version)} x i8>"), + linkage=ir.Attribute.parse("#llvm.linkage"), + value=ir.StringAttr.get(version), + ) - # Generate the object file - object_file_content = dump_to_object( - file_name, - export_module, - jit_function, - dsl, - use_gpu_dialect, + return ir_module + + +def decode_metadata_from_execution_engine( + prefix: str, + execution_engine: "BinaryExecutionEngine", + args_spec_processor: ArgsSpecProcessor, +): + """Decode the executor metadata from the execution engine. The metadata includes: + 1. args_spec: The args_spec of the python function. + 2. function_name: The name mangling function_name of the python host function. + 3. kernel_info: The kernel_info of the jit-compiled function including the kernel name and attributes. + 4. version: The version of the object file. + + @param prefix: The prefix name of the function. This is the unique identifier name of the function to avoid symbol conflict in the generated object file. + @param execution_engine: The binary execution engine. This is the execution engine to load the cuda module. + @param args_spec_processor: The args spec processor. The args_spec may contain the dsl specific types. The processor will be used to dump and load the args_spec. + @return: The args_spec, function_name, and kernel_info. + """ + args_spec_str_p = execution_engine.lookup("_".join([prefix, args_spec_suffix])) + function_name_str_p = execution_engine.lookup( + "_".join([prefix, function_name_suffix]) ) - try: - with open(os.path.join(file_path, file_name + ".o"), "wb") as f: - f.write(object_file_content) - except Exception as e: - raise DSLRuntimeError(f"Error writing object file: {e}") from e - + kernel_info_str_p = execution_engine.lookup("_".join([prefix, kernel_info_suffix])) + version_str_p = execution_engine.lookup("_".join([prefix, version_suffix])) + if args_spec_str_p: + args_spec_str = ctypes.c_char_p(args_spec_str_p).value.decode("utf-8") + else: + args_spec_str = None + # The StringAttr encodes the string as utf-8 format. + if function_name_str_p: + function_name_str = ctypes.c_char_p(function_name_str_p).value.decode("utf-8") + else: + function_name_str = None + if kernel_info_str_p: + kernel_info_str = ctypes.c_char_p(kernel_info_str_p).value.decode("utf-8") + else: + kernel_info_str = None + if version_str_p: + version_str = ctypes.c_char_p(version_str_p).value.decode("utf-8") + else: + version_str = None + args_spec_bytes = base64.b64decode(args_spec_str) + args_spec = args_spec_processor.loads(args_spec_bytes) + function_name = function_name_str + kernel_info = json.loads(kernel_info_str) + return args_spec, function_name, kernel_info, version_str diff --git a/python/CuTeDSL/cutlass/base_dsl/export/external_binary_module.py b/python/CuTeDSL/cutlass/base_dsl/export/external_binary_module.py new file mode 100644 index 00000000..c42c6fa2 --- /dev/null +++ b/python/CuTeDSL/cutlass/base_dsl/export/external_binary_module.py @@ -0,0 +1,126 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +import io +import os + +import ctypes +from typing import Callable +from inspect import FullArgSpec + +from ..common import DSLRuntimeError +from ...base_dsl.dsl import BaseDSL +from ...base_dsl.typing import Int32, Int64, Float32, Float64 +from .export import decode_metadata_from_execution_engine + + +def _get_ctypes_return_type(args_spec: FullArgSpec): + """Get the ctypes return type from the args_spec.""" + return_type = args_spec.annotations.get("return", None) + if return_type is None: + raise DSLRuntimeError("Return type is not specified for AOT compiled function.") + type_to_ctype = { + Int32: ctypes.c_int32, + Int64: ctypes.c_int64, + Float32: ctypes.c_float, + Float64: ctypes.c_double, + # Add other types if needed + } + + ctype = type_to_ctype.get(return_type) + if ctype is None: + raise DSLRuntimeError(f"Unsupported return type for AOT loading: {return_type}") + + return ctype + + +class LoadProvider: + """The load provider is a class that stores the necessary information to construct a ExternalBinaryModule, + it could be set later by specific DSL.""" + + def __init__( + self, + dsl: "Type[BaseDSL]", + args_spec_processor: "ArgsSpecProcessor", + version_checker: Callable, + execution_engine_constructor: Callable, + jit_function_constructor: Callable, + ): + self.dsl = dsl + self.args_spec_processor = args_spec_processor + self.version_checker = version_checker + self.execution_engine_constructor = execution_engine_constructor + self.jit_function_constructor = jit_function_constructor + + +class ExternalBinaryModule: + """The exported binary module is a wrapper of the previous exported object files. It is used to load a object file + or a library in memory, allow function lookup and return the corresponding `JitCompiledFunction`. + """ + + load_provider: LoadProvider = None + + def __init__(self, file_path: str): + assert self.load_provider is not None, ( + "Load provider is not set for ExternalBinaryModule." + ) + shared_libs = self.load_provider.dsl._get_dsl().get_shared_libs() + object_file_content = bytes() + if file_path.endswith(".so"): + shared_libs.append(file_path) + else: + try: + with open(file_path, "rb") as f: + object_file_content = f.read() + except Exception as e: + raise DSLRuntimeError(f"Failed to read object file {file_path}: {e}") + # Lifetime of the engine is same as the ExternalBinaryModule. + self.engine = self.load_provider.execution_engine_constructor( + object_file_content, shared_libs + ) + + def __getattr__(self, function_prefix: str) -> "JitCompiledFunction": + """Get the jit_function from the `function_prefix`. The `function_prefix` is specified when users dump the object file. When there is no function_prefix found in the module, the function will raise an error.""" + try: + args_spec, function_name, kernel_info, version_str = ( + decode_metadata_from_execution_engine( + function_prefix, self.engine, self.load_provider.args_spec_processor + ) + ) + except Exception as e: + raise DSLRuntimeError( + f"Function prefix {function_prefix} not found in the module.", cause=e + ) + self.load_provider.version_checker(version_str) + capi_func_p = self.engine.lookup(function_name) + if not capi_func_p: + raise DSLRuntimeError( + "Unknown function: " + + "_mlir_" + + function_prefix + + "__mlir_ciface_" + + function_name + ) + return_type = _get_ctypes_return_type(args_spec) + capi_func = ctypes.CFUNCTYPE(return_type, ctypes.c_void_p)(capi_func_p) + jit_function = self.load_provider.jit_function_constructor( + ir_module=None, + engine=self.engine, + capi_func=capi_func, + args_spec=args_spec, + function_name=function_name, + kernel_info=kernel_info, + jit_time_profiling=self.load_provider.dsl._get_dsl().envar.jit_time_profiling, + jit_function_artifacts=None, + prefix=function_prefix, + load_from_binary=True, + ) + return jit_function diff --git a/python/CuTeDSL/cutlass/base_dsl/jit_executor.py b/python/CuTeDSL/cutlass/base_dsl/jit_executor.py index 5835473d..236049a6 100644 --- a/python/CuTeDSL/cutlass/base_dsl/jit_executor.py +++ b/python/CuTeDSL/cutlass/base_dsl/jit_executor.py @@ -13,6 +13,7 @@ This module provides jit executor related classes """ +import array import ctypes import inspect import io @@ -21,10 +22,12 @@ import weakref import threading import collections import os +import tempfile from dataclasses import dataclass # MLIR modules imports from .._mlir import ir +from .._mlir.dialects import llvm # Local modules imports from . import typing as t @@ -35,6 +38,7 @@ from .typing import get_c_pointers from .utils.logger import log from .utils.timer import timer + class CudaModuleAndKernel: """A loaded CUDA kernel and its metadata.""" @@ -132,17 +136,32 @@ def load_kernels_from_ir_module(module, kernel_info) -> list[CudaModuleAndKernel return list(kernel_modules.values()) - class KwargsWrapperSpec(NamedTuple): """A specification for keyword arguments wrapper.""" + arg_names: list[str] arg_defaults: tuple[Any, ...] kwonly_names: list[str] kwonly_defaults: dict[str, Any] +@dataclass +class ArgMeta: + """Metadata for function arguments.""" + + pos_names: list[str] + kwonly_names: list[str] + all_names: list[str] + annotated_types: list[object] + numeric_flags: list[bool] + name_to_index: dict[str, int] + pos_defaults: list[object] + kwonly_defaults: list[object] + arg_count: int + + class ExecutionArgs: - """Helper that wraps the function signature spec to filter exeuction and compile time arguments.""" + """Helper that wraps the function signature spec to filter execution and compile time arguments.""" def __init__(self, spec, function_name): self.function_name = function_name @@ -150,82 +169,235 @@ class ExecutionArgs: if spec is not None: self.args_spec = self.filter_runtime_arg_spec(spec) self.original_args_spec = spec + self._missing = object() + self._meta = self._build_meta() + self._tls = threading.local() + + def _build_meta(self): + """ + Precompute metadata for the fast-path execution. + This metadata is static per function signature. + """ + spec = self.args_spec + if spec is None: + return ArgMeta( + pos_names=[], + kwonly_names=[], + all_names=[], + annotated_types=[], + numeric_flags=[], + name_to_index={}, + pos_defaults=[], + kwonly_defaults=[], + arg_count=0, + ) + + pos_names = list(spec.args) + kwonly_names = list(spec.kwonlyargs) + all_names = pos_names + kwonly_names + + annotated_types = [spec.annotations.get(n) for n in all_names] + numeric_flags = [isinstance(typ, t.NumericMeta) for typ in annotated_types] + + name_to_index = {n: i for i, n in enumerate(all_names)} + + pos_defaults = [self._missing] * len(pos_names) + if spec.defaults: + start = len(pos_names) - len(spec.defaults) + for i, d in enumerate(spec.defaults): + pos_defaults[start + i] = d + + kwonly_defaults = [self._missing] * len(kwonly_names) + if spec.kwonlydefaults: + for i, n in enumerate(kwonly_names): + if n in spec.kwonlydefaults: + kwonly_defaults[i] = spec.kwonlydefaults[n] + + return ArgMeta( + pos_names=pos_names, + kwonly_names=kwonly_names, + all_names=all_names, + annotated_types=annotated_types, + numeric_flags=numeric_flags, + name_to_index=name_to_index, + pos_defaults=pos_defaults, + kwonly_defaults=kwonly_defaults, + arg_count=len(all_names), + ) + + def generate_execution_args_positional(self, *args): + """Fast execution for positional-only arguments with exact count match. + + This method is optimized for the common case where: + - All arguments are positional (no kwargs) + - Number of arguments matches the function signature exactly + + :param args: The positional arguments tuple + :return: (exe_args, adapted_args) tuple + """ + exe_arg_chunks = [None] * self._meta.arg_count + adapted_args = [] + + tls = self._tls + adapter_caches = getattr(tls, "adapter_caches", None) + if adapter_caches is None: + adapter_caches = [dict() for _ in range(self._meta.arg_count)] + tls.adapter_caches = adapter_caches + + annotated_types = self._meta.annotated_types + numeric_flags = self._meta.numeric_flags + + for index in range(self._meta.arg_count): + arg = args[index] + + cptr_method = getattr(arg, "__c_pointers__", None) + if cptr_method is not None: + exe_arg_chunks[index] = cptr_method() + continue + + if numeric_flags[index]: + arg = t.cast(arg, annotated_types[index]) + exe_arg_chunks[index] = get_c_pointers(arg) + else: + arg_type = type(arg) + cache = adapter_caches[index] + adapter = cache.get(arg_type) + if adapter is None: + adapter = JitArgAdapterRegistry.get_registered_adapter(arg_type) + if adapter is not None: + cache[arg_type] = adapter + + if adapter is not None: + arg = adapter(arg) + adapted_args.append(arg) + + exe_arg_chunks[index] = get_c_pointers(arg) + + exe_args = [p for chunk in exe_arg_chunks for p in chunk] + return exe_args, adapted_args def get_rectified_args(self, args, kwargs): """ This function is used to rectify the args and kwargs to a final runtime argument list according to the args_spec. """ - args_spec = self.args_spec - # Process positional arguments with defaults - rectified_args = list(args) - if args_spec.defaults and len(args) < len(args_spec.args): - rectified_args.extend(args_spec.defaults[len(args) - len(args_spec.args) :]) - for k, v in kwargs.items(): - if k in args_spec.args: - idx = args_spec.args.index(k) - if idx < len(rectified_args): - rectified_args[idx] = v - else: - rectified_args.append(v) - - # Process keyword arguments - rectified_kwargs = collections.OrderedDict( - (k, v) for k, v in kwargs.items() if k not in args_spec.args - ) - if args_spec.kwonlydefaults and len(rectified_kwargs) < len( - args_spec.kwonlyargs - ): - rectified_kwargs.update(args_spec.kwonlydefaults) - - # args/kwargs must match arg_specs - if len(rectified_args) != len(args_spec.args) or len(rectified_kwargs) != len( - args_spec.kwonlyargs - ): + pos_count = len(self._meta.pos_names) + if len(args) > pos_count: raise DSLRuntimeError( "input args/kwargs length does not match runtime function signature!", context={ - "input args length": len(rectified_args), - "input kwargs length": len(rectified_kwargs), - "function signature args length": len(args_spec.args), - "function signature kwonlyargs length": len(args_spec.kwonlyargs), + "input args length": len(args), + "input kwargs length": len(kwargs), + "function signature args length": len(self._meta.pos_names), + "function signature kwonlyargs length": len( + self._meta.kwonly_names + ), }, ) - return rectified_args + list(rectified_kwargs.values()) + + # Start with every slot marked missing, we overwrite as values/defaults bind + rectified = [self._missing] * self._meta.arg_count + pos_len = len(args) + + # Fill positional slots with the values from the caller + rectified[:pos_len] = args + + # Fill positional slots the caller skipped with the defaults + for i in range(pos_len, pos_count): + default = self._meta.pos_defaults[i] + if default is not self._missing: + rectified[i] = default + + # Fill keyword-only slots with the defaults before user kwargs + for j, default in enumerate(self._meta.kwonly_defaults): + idx = pos_count + j + if default is not self._missing: + rectified[idx] = default + + # Fill keyword slots with the values from the caller + for name, value in kwargs.items(): + idx = self._meta.name_to_index.get(name) + if idx is None: + raise DSLRuntimeError( + "unexpected keyword argument", + context={"argument_name": name}, + ) + if idx < pos_len: + raise DSLRuntimeError( + "multiple values for argument", + context={"argument_name": name}, + ) + rectified[idx] = value + + if self._missing in rectified: + missing_args = [ + name + for i, name in enumerate(self._meta.all_names) + if rectified[i] is self._missing + ] + raise DSLRuntimeError( + "input args/kwargs length does not match runtime function signature!", + context={ + "missing": missing_args, + "function signature args length": len(self._meta.pos_names), + "function signature kwonlyargs length": len( + self._meta.kwonly_names + ), + }, + ) + + return rectified def generate_execution_args(self, args, kwargs): """ This function is the prune version of `generate_mlir_function_types` which only generates execution args to get rid of mlir context. """ - args_spec = self.args_spec + if not kwargs and len(args) == self._meta.arg_count: + return self.generate_execution_args_positional(*args) - exe_args = [] + exe_arg_chunks = [None] * self._meta.arg_count adapted_args = [] + tls = self._tls + adapter_caches = getattr(tls, "adapter_caches", None) + if adapter_caches is None: + adapter_caches = [dict() for _ in range(self._meta.arg_count)] + tls.adapter_caches = adapter_caches + input_args = self.get_rectified_args(args, kwargs) - input_arg_names = args_spec.args + args_spec.kwonlyargs - for arg, arg_name in zip(input_args, input_arg_names): - # short-cut for args already converted - if hasattr(arg, "__c_pointers__"): - exe_args.extend(arg.__c_pointers__()) + + for index, arg in enumerate(input_args): + cptr_method = getattr(arg, "__c_pointers__", None) + if cptr_method is not None: + exe_arg_chunks[index] = cptr_method() continue - arg_type = args_spec.annotations.get(arg_name, None) + arg_type_anno = self._meta.annotated_types[index] - # Implicit cast to NumericMeta - if isinstance(arg_type, t.NumericMeta): - arg = t.cast(arg, arg_type) + if self._meta.numeric_flags[index]: + arg = t.cast(arg, arg_type_anno) + exe_arg_chunks[index] = get_c_pointers(arg) else: - # If not any known type, try registered adapter to do the conversion - adapter = JitArgAdapterRegistry.get_registered_adapter(type(arg)) - if adapter: + arg_type = type(arg) + cache = adapter_caches[index] + adapter = cache.get(arg_type) + if adapter is None: + adapter = JitArgAdapterRegistry.get_registered_adapter(arg_type) + if adapter is not None: + cache[arg_type] = adapter + + if adapter is not None: arg = adapter(arg) adapted_args.append(arg) - exe_args.extend(get_c_pointers(arg)) + exe_arg_chunks[index] = get_c_pointers(arg) + + exe_args = [p for chunk in exe_arg_chunks for p in chunk] return exe_args, adapted_args - def get_kwargs_wrapper_spec(self, exclude_arg_names: Sequence[str] = ()) -> KwargsWrapperSpec: + def get_kwargs_wrapper_spec( + self, exclude_arg_names: Sequence[str] = () + ) -> KwargsWrapperSpec: """ This function is used to get the kwargs wrapper spec from the original args_spec. """ @@ -242,7 +414,7 @@ class ExecutionArgs: kwonly_names = [] kwonly_defaults = {} - # Filter arguments and maintain their properties + # Filter arguments and maintain their properties for i, arg_name in enumerate(arg_spec.args): arg_type = arg_spec.annotations.get(arg_name, None) @@ -320,7 +492,7 @@ class ExecutionArgs: "function_name": self.function_name, "expected_args": len(arg_spec.args), "provided_args": len(full_args), - } + }, ) # Filter keyword-only arguments @@ -339,21 +511,23 @@ class ExecutionArgs: elif arg_spec.kwonlydefaults and kwarg in arg_spec.kwonlydefaults: runtime_kwargs[kwarg] = arg_spec.kwonlydefaults[kwarg] - if (len(runtime_args) != len(self.args_spec.args) or - len(runtime_kwargs) != len(self.args_spec.kwonlyargs)): + if len(runtime_args) != len(self.args_spec.args) or len(runtime_kwargs) != len( + self.args_spec.kwonlyargs + ): raise DSLRuntimeError( "input args/kwargs length does not match runtime function signature!", context={ "input args length": len(runtime_args), "input kwargs length": len(runtime_kwargs), "function signature args length": len(self.args_spec.args), - "function signature kwonlyargs length": len(self.args_spec.kwonlyargs), + "function signature kwonlyargs length": len( + self.args_spec.kwonlyargs + ), }, ) return runtime_args + list(runtime_kwargs.values()) - def filter_runtime_arg_spec(self, arg_spec: inspect.FullArgSpec): runtime_args = [] runtime_annotations = {} @@ -444,9 +618,11 @@ class JitExecuteContext: def __init__( self, module: "JitModule", - kernel_fns=[], + kernel_fns=None, context: Optional[cuda_helpers.DevicePrimaryContext] = None, ): + if kernel_fns is None: + kernel_fns = [] self.module = module self.kernel_functions = kernel_fns self.kernel_functions_ptrs = [ctypes.c_void_p(k.getPtr()) for k in kernel_fns] @@ -538,27 +714,71 @@ class JitExecutor: # are garbage collected. self.jit_module = jit_module self.exec_context = exec_context - self.profiler = timer(enable=jit_time_profiling) + self.profiler = timer(enable=jit_time_profiling) if jit_time_profiling else None # Get the cuda result type from the capi function. # This is only set to i32 if CudaDialectJitModule is used. cuda_result_type = self.jit_module.capi_func.restype self.cuda_result = cuda_result_type() if cuda_result_type is not None else None + # Pre-compute flags + self._has_cuda_result = self.cuda_result is not None + self._has_profiler = self.profiler is not None + self._cuda_result_addr = ( + ctypes.addressof(self.cuda_result) if self._has_cuda_result else None + ) + + if jit_time_profiling: + self._get_invoke_packed_args_func = self.profiler( + self._get_invoke_packed_args + ) + self.capi_func = self.profiler(self.jit_module.capi_func) + else: + self._get_invoke_packed_args_func = self._get_invoke_packed_args + self.capi_func = self.jit_module.capi_func + + # Pre-compute packed args metadata + self._num_extra_args = 0 + if self._has_cuda_result: + self._num_extra_args += 1 + if self.exec_context is not None: + self._kernel_ptrs = self.exec_context.kernel_functions_ptrs + self._num_extra_args += len(self._kernel_ptrs) + else: + self._kernel_ptrs = None + self._tls = threading.local() + # Assume each execution args has type `c_void_p` to reduce the overhead of `ctypes.cast`. def _get_invoke_packed_args(self, exe_args): - # If expecting a cuda result, add a pointer to exe_args - if self.cuda_result is not None: - exe_args.append(ctypes.addressof(self.cuda_result)) - if self.exec_context is not None: - exe_args += self.exec_context.kernel_functions_ptrs - packed_args = (ctypes.c_void_p * len(exe_args))() - for argNum in range(len(exe_args)): - arg = exe_args[argNum] - if isinstance(arg, ctypes.c_void_p): - packed_args[argNum] = arg - else: - packed_args[argNum] = ctypes.c_void_p(arg).value + # Pre-calculate sizes once during init and cache + num_base_args = len(exe_args) + total_args = num_base_args + self._num_extra_args + + # Re-use packed args buffer if possible + tls = self._tls + packed_args = getattr(tls, "packed_args", None) + capacity = getattr(tls, "capacity", 0) + + if packed_args is None or capacity < total_args: + packed_args = (ctypes.c_void_p * total_args)() + tls.packed_args = packed_args + tls.capacity = total_args + + idx = num_base_args + if self._has_cuda_result: + packed_args[idx] = self._cuda_result_addr + idx += 1 + if self._kernel_ptrs is not None: + for ptr in self._kernel_ptrs: + packed_args[idx] = ptr + idx += 1 + + for i in range(num_base_args): + arg = exe_args[i] + packed_args[i] = ( + arg if type(arg) is ctypes.c_void_p else ctypes.c_void_p(arg).value + ) + return packed_args def generate_execution_args(self, *args, **kwargs): @@ -566,17 +786,17 @@ class JitExecutor: def run_compiled_program(self, exe_args): try: - packed_args = self.profiler(self._get_invoke_packed_args)(exe_args) - self.profiler(self.jit_module.capi_func)(packed_args) - if self.cuda_result is not None: - if self.cuda_result.value != 0: - error_code = self.cuda_result.value - error_name = cuda_helpers._cudaGetErrorEnum( - cuda_helpers.cuda.CUresult(error_code) - ) - raise DSLCudaRuntimeError(error_code, error_name) - return self.cuda_result.value - return None + packed_args = self._get_invoke_packed_args_func(exe_args) + self.capi_func(packed_args) + if not self._has_cuda_result: + return None + error_code = self.cuda_result.value + if error_code == 0: + return error_code + error_name = cuda_helpers._cudaGetErrorEnum( + cuda_helpers.cuda.CUresult(error_code) + ) + raise DSLCudaRuntimeError(error_code, error_name) except DSLCudaRuntimeError as e: raise e except Exception as e: @@ -584,7 +804,7 @@ class JitExecutor: def __call__(self, *args, **kwargs): exe_args, adapted_args = self.generate_execution_args(*args, **kwargs) - self.run_compiled_program(exe_args) + return self.run_compiled_program(exe_args) @dataclass @@ -616,9 +836,34 @@ class JitFunctionArtifacts: raise DSLRuntimeError(f"Failed to read MLIR file '{self.MLIR}': {e}") +class ExportProvider: + """Holds the dsl specific settings for the export of the jit-compiled function.""" + + dsl: "Type[BaseDSL]" = None + arg_spec_processor: "ArgsSpecProcessor" = None + c_header_generator: "CHeaderGenerator" = None + object_file_version: str = None + + def __init__( + self, + dsl: "Type[BaseDSL]", + arg_spec_processor: "ArgsSpecProcessor", + c_header_generator: "CHeaderGenerator", + object_file_version: str, + mlirExecutionEngine: "MlirExecutionEngine", + ): + self.dsl = dsl + self.arg_spec_processor = arg_spec_processor + self.c_header_generator = c_header_generator + self.object_file_version = object_file_version + self.mlirExecutionEngine = mlirExecutionEngine + + class JitCompiledFunction: """Holds a compiled function.""" + export_provider: ExportProvider = None + def __init__( self, ir_module, @@ -631,6 +876,8 @@ class JitCompiledFunction: jit_function_artifacts, prefix=None, load_from_binary=False, + dynamic_args=None, + dynamic_kwargs=None, ): self.ir_module = ir_module self.engine = engine @@ -656,6 +903,9 @@ class JitCompiledFunction: self._executor_lock = threading.RLock() self._default_executor = None + # This is used to do early generation of the c header arguments to release the reference to the dynamic arguments. + self._generate_c_header_arguments(dynamic_args, dynamic_kwargs) + @property def __ptx__(self): """Returns the PTX code of the JIT-compiled function.""" @@ -704,7 +954,7 @@ class JitCompiledFunction: if self.engine is None: raise DSLRuntimeError( "The compiled function does not have a valid execution engine.", - suggestion="For cross-compilation, please use `cute.export.export_to_c` to serialize the compiled function and load/execute it on target device.", + suggestion="For cross-compilation, please use `JitCompiledFunction.export_to_c` to serialize the compiled function and load/execute it on target device.", ) def to(self, device=None) -> JitExecutor: @@ -735,11 +985,6 @@ class JitCompiledFunction: context = self.jit_module.get_device_execute_context(device) return JitExecutor(self.jit_module, context, self.jit_time_profiling) - def set_dynamic_args(self, dynamic_args, dynamic_kwargs): - """Sets the dynamic argument information required for export to c code generation.""" - self.dynamic_args = dynamic_args - self.dynamic_kwargs = dynamic_kwargs - def generate_execution_args(self, *args, **kwargs): return self.args_spec.generate_execution_args(args, kwargs) @@ -750,7 +995,10 @@ class JitCompiledFunction: CUDA errors. If you need to call the kernel on multiple devices use `to` to return a per-device function. """ - exe_args, adapted_args = self.generate_execution_args(*args, **kwargs) + exe_args, adapted_args = self.args_spec.generate_execution_args(args, kwargs) + executor = self._default_executor + if executor is not None: # Only lock on first call + return executor.run_compiled_program(exe_args) return self.run_compiled_program(exe_args) def run_compiled_program(self, exe_args): @@ -768,3 +1016,168 @@ class JitCompiledFunction: proxy_self = weakref.proxy(self) self._default_executor = proxy_self.to(None) return self._default_executor.run_compiled_program(exe_args) + + def _generate_c_header_arguments(self, dynamic_args, dynamic_kwargs): + """Generates the c header arguments for the AOT C header generation.""" + self.c_header_arguments = None + from .export import CHeaderArguments + + if dynamic_args is not None or dynamic_kwargs is not None: + self.dummy_prefix_name = "dummy_prefix_name" + try: + # This arguments may be generated failure due to not all the arguments (e.g. custom types) are supported by the AOT C header generator. + c_header_arguments, packed_args, declarations = ( + self.export_provider.c_header_generator._generate_arguments( + self.dummy_prefix_name, + self.args_spec, + dynamic_args, + dynamic_kwargs, + ) + ) + self.c_header_arguments = CHeaderArguments( + self.dummy_prefix_name, + c_header_arguments, + packed_args, + declarations, + None, + ) + except Exception as e: + self.c_header_arguments = CHeaderArguments( + self.dummy_prefix_name, [], [], [], str(e) + ) + + def dump_to_object( + self, + function_prefix: str, + ) -> bytes: + """Dump the compiled ir function to a bytes object with ELF format. The bytes object contains the host + launch entry function and cubin inside. + + @param function_prefix: The prefix name of the function. This is the user provided unique identifier name of the function to avoid symbol conflict in the generated object file. + @return: The bytes object of the function. + """ + # lazy import to avoid circular dependency + from .export import get_export_module, encode_metadata_into_ir_module + + assert self.export_provider is not None, ( + "Export provider is not set for JitCompiledFunction." + ) + export_module = get_export_module(self.ir_module, function_prefix) + export_module = encode_metadata_into_ir_module( + function_prefix, + export_module, + self.args_spec.args_spec, + self.function_name, + self.kernel_info, + self.export_provider.arg_spec_processor, + self.export_provider.object_file_version, + ) + + cubin_data = None + + def strip_gpu_binary_op(op): + if op.name == "gpu.binary": + s = io.BytesIO() + op.operation.write_bytecode(s) + nonlocal cubin_data + cubin_data = s.getvalue() + cubin_data = cubin_data.split(b'bin = "')[1].split(b'">')[0] + cubin_data = get_escaped_cubin_bytes(cubin_data) + op.erase() + return ir.WalkResult.ADVANCE + return ir.WalkResult.ADVANCE + + # Strip gpu related to avoid the object file generating builtin module load/unload functions + export_module.operation.walk(strip_gpu_binary_op) + cubin_suffix = "cubin" + if cubin_data is not None: + cubin_array = array.array("b", cubin_data) + with ( + export_module.context, + ir.Location.unknown(), + ir.InsertionPoint(export_module.body), + ): + new_binary_global_op = llvm.GlobalOp( + sym_name="_".join([function_prefix, cubin_suffix]), + global_type=ir.Type.parse(f"!llvm.array<{len(cubin_array)} x i8>"), + linkage=ir.Attribute.parse("#llvm.linkage"), + value=ir.DenseIntElementsAttr.get(cubin_array), + constant=True, + ) + + if "gpu.container_module" in export_module.operation.attributes: + del export_module.operation.attributes["gpu.container_module"] + # Generate the object file + + try: + with tempfile.NamedTemporaryFile() as tmp_object_file: + self.export_provider.mlirExecutionEngine.dump_object_file_pic( + export_module, + tmp_object_file.name, + "_".join([function_prefix, self.function_name]), + ) + with open(tmp_object_file.name, "rb") as f: + ret = f.read() + return ret + except Exception as e: + raise DSLRuntimeError(f"Error dumping object file: {e}") from e + + def export_to_c( + self, + file_path: str, + file_name: str, + function_prefix: str = "", + ): + """Exports the jit-compiled function to a C compatible files(header/library). + This is used for c/cpp AOT support. + The `file_path` will be used as the directory to save the header and object files. + The `file_name` will be used as the name of the header and object files. The same file name will always overwrite the existing file. + The `function_prefix` will be used as the symbol prefix of the generated functions, it is guaranteed by + the caller that the generated functions are unique. + + + The c header file is generated with following components: + 1. The host launch entry function. And the structure definitions of the arguments. + 2. The device metadata load/unload functions. + 3. The cubin data array and len. + + The library contains the binary of the underlying host launch entry function. + + @param jit_function: The jit-compiled function from `cute.compile`. + @param file_path: The path to the directory where the header and object files will be saved. + @param file_name: The name of the header and object files. + @param function_prefix: The prefix of the function. This is the unique identifier name of the function to avoid symbol conflict in the generated object file. Default to the `file_name`. + """ + if function_prefix is None or function_prefix == "": + function_prefix = file_name + + assert self.export_provider is not None, ( + "Export provider is not set for JitCompiledFunction." + ) + # lazy import to avoid circular dependency + from .export import get_export_module + + export_module = get_export_module(self.ir_module, function_prefix) + # Generate the c header file + header_file_content = self.export_provider.c_header_generator( + function_prefix, + export_module, + self.args_spec, + self.function_name, + self.kernel_info, + self.c_header_arguments, + self.export_provider.dsl._get_dsl().name, + ) + try: + with open(os.path.join(file_path, file_name + ".h"), "w") as f: + f.write(header_file_content) + except Exception as e: + raise DSLRuntimeError(f"Error writing header file: {e}") from e + + # Generate the object file + object_file_content = self.dump_to_object(function_prefix) + try: + with open(os.path.join(file_path, file_name + ".o"), "wb") as f: + f.write(object_file_content) + except Exception as e: + raise DSLRuntimeError(f"Error writing object file: {e}") from e diff --git a/python/CuTeDSL/cutlass/base_dsl/runtime/cuda.py b/python/CuTeDSL/cutlass/base_dsl/runtime/cuda.py index 940e27d5..e7a60a3d 100644 --- a/python/CuTeDSL/cutlass/base_dsl/runtime/cuda.py +++ b/python/CuTeDSL/cutlass/base_dsl/runtime/cuda.py @@ -347,6 +347,16 @@ def initialize_cuda_context(device_id: int = 0, flags: int = 0): # Initialize CUDA Driver API _log().info(f"cuInit {flags}") checkCudaErrors(cuda.cuInit(flags)) + + driver_version = get_driver_version() + + # Check the CUDA driver version works for the installed cuda-python package + if driver_version < 13000 and cuda.CUDA_VERSION >= 13000: + raise DSLRuntimeError( + f"CUDA driver version {driver_version} is below the minimum required version for the installed cuda-python package {cuda.CUDA_VERSION}.", + suggestion=f"Consider updating your NVIDIA driver to version 580 or above. Or install cuda-python package with version 12.9 or below.", + ) + # Retrieve handle for device cuDevice = get_device(device_id) # Create context diff --git a/python/CuTeDSL/cutlass/base_dsl/runtime/tensor_descriptor.py b/python/CuTeDSL/cutlass/base_dsl/runtime/tensor_descriptor.py index 864e6675..5b946950 100644 --- a/python/CuTeDSL/cutlass/base_dsl/runtime/tensor_descriptor.py +++ b/python/CuTeDSL/cutlass/base_dsl/runtime/tensor_descriptor.py @@ -94,6 +94,14 @@ class TensorDescriptor: return get_tensor_desc_device_id(self._capsule) return -1 + @property + def pointer(self): + """ + Returns the pointer to the tensor data. This is either the device pointer or the data pointer if the data is not + in a device. + """ + return self.device_pointer if self.device_pointer is not None else self.data_ptr + @property def element_type(self): """Return the corresponding Python type based on DLPack dtype metadata.""" diff --git a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/call_provider.py b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/call_provider.py index 1bc21a7e..0ce03475 100644 --- a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/call_provider.py +++ b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/call_provider.py @@ -113,15 +113,20 @@ class DynamicParamPackCallProvider(CallProvider, TVMFFIBuilder): if isinstance(stride, int) and stride == 1: return i raise ValueError("stride=1 index not found, needed for f4 tensor") + stride_one_index = find_stride_one_index() - def map_shape_for_tensor_dtype_f4x2_to_f4(index: int, value: ir.Value) -> ir.Value: + def map_shape_for_tensor_dtype_f4x2_to_f4( + index: int, value: ir.Value + ) -> ir.Value: if index == stride_one_index: with ir.InsertionPoint(current_block): return self.mul(value, self.integer_constant(value.type, 2)) return value - def map_stride_for_tensor_dtype_f4x2_to_f4(index, value: ir.Value) -> ir.Value: + def map_stride_for_tensor_dtype_f4x2_to_f4( + index, value: ir.Value + ) -> ir.Value: if index != stride_one_index: with ir.InsertionPoint(current_block): return self.mul(value, self.integer_constant(value.type, 2)) @@ -141,7 +146,9 @@ class DynamicParamPackCallProvider(CallProvider, TVMFFIBuilder): if param.strides is not None: for index, dim in enumerate(param.strides): if isinstance(dim, spec.Var): - strides.append(map_stride_value(index, context.matched_var_binding[dim])) + strides.append( + map_stride_value(index, context.matched_var_binding[dim]) + ) flatten_struct, alloca = self.pack_values_to_alloca( current_block, context.entry_block, [data, *shape, *strides] ) diff --git a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/mlir_builder.py b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/mlir_builder.py index 2d6c9d11..2d5ab527 100644 --- a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/mlir_builder.py +++ b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/mlir_builder.py @@ -233,7 +233,9 @@ class MLIRBuilder(MLIRTypeBuilder): remainder = llvm.urem(value, align_val) return self.equal(remainder, self.i64(0)) - def br(self, target_block: ir.Block, *, args: Optional[list[ir.Value]] = None) -> None: + def br( + self, target_block: ir.Block, *, args: Optional[list[ir.Value]] = None + ) -> None: """Create an unconditional branch. Parameters @@ -338,7 +340,7 @@ class MLIRBuilder(MLIRTypeBuilder): false_dest_operands=false_dest_operands, true_dest=true_block, false_dest=false_block, - branch_weights=ir.DenseI32ArrayAttr.get(list(branch_weights)) + branch_weights=ir.DenseI32ArrayAttr.get(list(branch_weights)), ) else: llvm.cond_br( @@ -436,8 +438,7 @@ class MLIRBuilder(MLIRTypeBuilder): internal: bool = False, llvm_func_attrs: Sequence[str] = (), ) -> tuple[list[ir.Value], ir.Block]: - """Create a function with the given signature. - """ + """Create a function with the given signature.""" func_op = llvm.func( name, function_type=self.as_attr( @@ -476,7 +477,9 @@ class MLIRBuilder(MLIRTypeBuilder): ) func_op.attributes["llvm.linkage"] = ir.StringAttr.get("external") - def create_alloca(self, entry_block: ir.Block, alloca_type: ir.Type, array_size: int) -> ir.Value: + def create_alloca( + self, entry_block: ir.Block, alloca_type: ir.Type, array_size: int + ) -> ir.Value: """Create an alloca operation.""" with ir.InsertionPoint(entry_block.operations[0]): # declare the struct type diff --git a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/spec.py b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/spec.py index d9d76904..13c24835 100644 --- a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/spec.py +++ b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/spec.py @@ -10,6 +10,7 @@ # is strictly prohibited. """Kernel specification classes for TVM-FFI function parameters.""" + from abc import ABC from collections.abc import Sequence @@ -20,6 +21,7 @@ try: except ModuleNotFoundError: pass + class DefaultConfig: """Default configuration with context manager support.""" @@ -105,7 +107,7 @@ class Var(Param): dtype: Union[str, "tvm_ffi.dtype"], *, divisibility: Optional[int] = None, - ) -> None: + ) -> None: """Initialize a Var parameter. Parameters @@ -138,7 +140,8 @@ class Shape(Param): def __init__( self, - name: str, shape: list[Union[int, Var]], + name: str, + shape: list[Union[int, Var]], ) -> None: """Initialize a Shape parameter. @@ -220,7 +223,9 @@ class Tensor(Param): self.data = Var(name + ".data", tvm_ffi.dtype("handle")) self.shape: list[Union[int, Var]] = list(shape) self.dtype = tvm_ffi.dtype(dtype) - self.strides: Optional[list[Var]] = list(strides) if strides is not None else None + self.strides: Optional[list[Var]] = ( + list(strides) if strides is not None else None + ) self.data_alignment = data_alignment # Use default device type if none specified @@ -319,6 +324,7 @@ class ConstNone(Param): name : str The parameter name. """ + name: str def __init__(self, name: str) -> None: @@ -340,6 +346,7 @@ class TupleParam(Param): name : str The parameter name. """ + name: str params: list[Param] @@ -471,6 +478,7 @@ def create_map_tensor_dtype_f4x2_to_f4_spec(f4_tensor_spec: Tensor) -> Tensor: if isinstance(stride, int) and stride == 1: return i raise ValueError("Cannot find dimension with stride=1") + stride_one_index = find_stride_one_index() def divisibility_divide_by_2(value: Var) -> Optional[int]: @@ -487,7 +495,9 @@ def create_map_tensor_dtype_f4x2_to_f4_spec(f4_tensor_spec: Tensor) -> Tensor: raise ValueError(f"Dimension {index} with stride=1 must be even") return value // 2 # create a new var with the same name and dtype - return Var(value.name, value.dtype, divisibility=divisibility_divide_by_2(value)) + return Var( + value.name, value.dtype, divisibility=divisibility_divide_by_2(value) + ) return value def map_stride(index: int, value: Union[int, Var]) -> Union[int, Var]: @@ -497,7 +507,9 @@ def create_map_tensor_dtype_f4x2_to_f4_spec(f4_tensor_spec: Tensor) -> Tensor: raise ValueError(f"Dimension {index} with stride != 1 must be even") return value // 2 # create a new var with the same name and dtype - return Var(value.name, value.dtype, divisibility=divisibility_divide_by_2(value)) + return Var( + value.name, value.dtype, divisibility=divisibility_divide_by_2(value) + ) return value new_shape = [map_shape(i, x) for i, x in enumerate(f4_tensor_spec.shape)] diff --git a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/tvm_ffi_builder.py b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/tvm_ffi_builder.py index 4b976d0c..9948d500 100644 --- a/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/tvm_ffi_builder.py +++ b/python/CuTeDSL/cutlass/base_dsl/tvm_ffi_builder/tvm_ffi_builder.py @@ -38,6 +38,7 @@ class ArgContext: :ivar tuple_indices: List of tuple indices for nested tuple access (e.g., [0, 1] for tuple[0][1]). :vartype tuple_indices: list[int] """ + param_name: str arg_index: int tuple_indices: list[int] @@ -54,7 +55,10 @@ class ArgContext: else: # Nested tuple element: "on my_tuple[0][1] in argument #0" indices_str = "".join(f"[{i}]" for i in self.tuple_indices) - return [f"on {self.param_name}{indices_str} in argument ", f"#{self.arg_index}"] + return [ + f"on {self.param_name}{indices_str} in argument ", + f"#{self.arg_index}", + ] def get_field_name(self, field_suffix: str) -> str: """Get the field name with tuple indices for shape/stride access. @@ -289,7 +293,9 @@ class TVMFFIBuilder(MLIRBuilder): elem_type=self.tvm_ffi_object_type, ) - def load_ffi_any_array_item_type_index(self, args: ir.Value, index: int) -> ir.Value: + def load_ffi_any_array_item_type_index( + self, args: ir.Value, index: int + ) -> ir.Value: """Get the type index from the index-th field of tvm_ffi_any_type struct. Semantics as follows: @@ -321,11 +327,7 @@ class TVMFFIBuilder(MLIRBuilder): ) return llvm.load(self.i32_type, type_index_ptr) - def load_ffi_any_array_item_v_int64( - self, - args: ir.Value, - index: int - ) -> ir.Value: + def load_ffi_any_array_item_v_int64(self, args: ir.Value, index: int) -> ir.Value: """Get the v_int64 from the index-th field of tvm_ffi_any_type struct. Semantics as follows: @@ -362,10 +364,7 @@ class TVMFFIBuilder(MLIRBuilder): return llvm.load(self.f64_type, v_float64_ptr) def load_ffi_any_array_item_v_ptr( - self, - args: ir.Value, - index: int, - address_space: Optional[int] = None + self, args: ir.Value, index: int, address_space: Optional[int] = None ) -> ir.Value: """Get the v_ptr from the index-th field of tvm_ffi_any_type struct. @@ -546,8 +545,10 @@ class TVMFFIBuilder(MLIRBuilder): ) -> ir.Value: """Downcast i64 to lower bits.""" overflow_flags = llvm.IntegerOverflowFlags.none - if (hasattr(tvm_ffi._dtype.DataTypeCode, "BOOL") and - target_dtype.type_code == tvm_ffi._dtype.DataTypeCode.BOOL): + if ( + hasattr(tvm_ffi._dtype.DataTypeCode, "BOOL") + and target_dtype.type_code == tvm_ffi._dtype.DataTypeCode.BOOL + ): # LLVM use i1 (boolean) for boolean return llvm.icmp(llvm.ICmpPredicate.ne, v_int64, self.i64(0)) if target_dtype.bits == 64: @@ -805,7 +806,7 @@ class TVMFFIBuilder(MLIRBuilder): true_block=subsequent_block, false_block=error_block, # likely to be true - branch_weights=self.BRANCH_WEIGHTS_LIKELY + branch_weights=self.BRANCH_WEIGHTS_LIKELY, ) with ir.InsertionPoint(error_block): self.raise_error_and_return(error_kind, error_message_parts) @@ -869,7 +870,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the integer parameter at the given index.""" # read the type index with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) # Check if type is int or bool (both use v_int64, bool can be converted to int) is_int = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIInt)) is_bool = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIBool)) @@ -915,7 +918,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the float parameter at the given index.""" # read the type index with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) # Check if type is float, int, or bool (int and bool can be converted to float) is_float = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIFloat)) is_int = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIInt)) @@ -954,7 +959,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # Handle float type with ir.InsertionPoint(float_block): - v_float64: ir.Value = self.load_ffi_any_array_item_v_float64(args, arg_index) + v_float64: ir.Value = self.load_ffi_any_array_item_v_float64( + args, arg_index + ) if param.dtype.bits == 64: float_result = v_float64 elif param.dtype.bits == 32: @@ -1023,7 +1030,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the opaque handle parameter at the given index.""" # read the type index with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) # Check if type is opaque pointer is_opaque_ptr = self.equal( type_index, self.i32(TVMFFITypeIndex.kTVMFFIOpaquePtr) @@ -1075,7 +1084,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the opaque handle parameter at the given index.""" # read the type index with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) # Check if type is a nullptr is_nullptr = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFINone)) @@ -1108,6 +1119,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): return current_block from tvm_ffi._dtype import DataTypeCode + is_uint = dtype.type_code == DataTypeCode.UINT # compute out the upper and lower bounds @@ -1121,7 +1133,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): error_msg = [ "Out of bound ", *error_msg_context, - f", expected to be in {str(dtype)} range [{lower_bound}, {upper_bound}]" + f", expected to be in {str(dtype)} range [{lower_bound}, {upper_bound}]", ] # Check bounds using appropriate comparison predicates @@ -1129,19 +1141,24 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): lower_bound_value = self.i64(lower_bound) upper_bound_value = self.i64(upper_bound) if is_uint: - is_above_lower = llvm.icmp(llvm.ICmpPredicate.uge, value, lower_bound_value) - is_below_upper = llvm.icmp(llvm.ICmpPredicate.ule, value, upper_bound_value) + is_above_lower = llvm.icmp( + llvm.ICmpPredicate.uge, value, lower_bound_value + ) + is_below_upper = llvm.icmp( + llvm.ICmpPredicate.ule, value, upper_bound_value + ) else: - is_above_lower = llvm.icmp(llvm.ICmpPredicate.sge, value, lower_bound_value) - is_below_upper = llvm.icmp(llvm.ICmpPredicate.sle, value, upper_bound_value) + is_above_lower = llvm.icmp( + llvm.ICmpPredicate.sge, value, lower_bound_value + ) + is_below_upper = llvm.icmp( + llvm.ICmpPredicate.sle, value, upper_bound_value + ) in_bounds = self.and_(is_above_lower, is_below_upper) return self.check_condition( - current_block, - lambda: in_bounds, - "ValueError", - error_msg + current_block, lambda: in_bounds, "ValueError", error_msg ) def check_int_value_divisibility( @@ -1173,6 +1190,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ir.Block The updated block after checks. """ + def check_divisibility() -> ir.Value: cond = self.i64_divisible_const(value, divisibility) if skip_check_predicate is not None: @@ -1182,14 +1200,11 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): error_msg = [ "Invalid ", *error_msg_context, - f", expected to be divisible by {divisibility}" + f", expected to be divisible by {divisibility}", ] return self.check_condition( - current_block, - check_divisibility, - "ValueError", - error_msg + current_block, check_divisibility, "ValueError", error_msg ) def set_or_check_matched_var_binding( @@ -1218,14 +1233,15 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # check divisibility if specified if var.divisibility is not None: current_block = self.check_int_value_divisibility( - current_block, value, var.divisibility, error_msg_context, + current_block, + value, + var.divisibility, + error_msg_context, skip_check_predicate=skip_check_predicate, ) # store the source value with parameter info with ir.InsertionPoint(current_block): - target_value = self.downcast_i64_to_lower_bits( - value, var.dtype - ) + target_value = self.downcast_i64_to_lower_bits(value, var.dtype) else: target_value = value # store the source value @@ -1251,7 +1267,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): error_msg_mismatch = [ error_prefix_mismatch, *error_msg_context, - f", expected to be {var}" + f", expected to be {var}", ] def check_value_mismatch() -> ir.Value: @@ -1261,10 +1277,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): return cond return self.check_condition( - current_block, - check_value_mismatch, - error_kind, - error_msg_mismatch + current_block, check_value_mismatch, error_kind, error_msg_mismatch ) def set_or_check_matched_var_binding_from_shape( @@ -1288,8 +1301,12 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): self._fn_call_context, ] return self.set_or_check_matched_var_binding( - current_block, var, value, error_msg, arg_field_name, - skip_check_predicate=skip_check_predicate + current_block, + var, + value, + error_msg, + arg_field_name, + skip_check_predicate=skip_check_predicate, ) def decode_param_shape_from_ffi_array( @@ -1325,9 +1342,13 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ) -> tuple[ir.Block, ir.Value]: """Validate and load a single shape element from the array.""" with ir.InsertionPoint(block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(array_data, index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + array_data, index + ) # Check if type is int or bool (both use v_int64, bool can be converted to int) - is_int_val = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIInt)) + is_int_val = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFIInt) + ) # Check that the element is an integer field_name = arg_context.get_field_name("") @@ -1346,7 +1367,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ) with ir.InsertionPoint(block): - v_int64: ir.Value = self.load_ffi_any_array_item_v_int64(array_data, index) + v_int64: ir.Value = self.load_ffi_any_array_item_v_int64( + array_data, index + ) return block, v_int64 @@ -1382,7 +1405,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ) with ir.InsertionPoint(current_block): - load_shapes = [self.load_i64_array_item(shape_data, i) for i in range(len(param.shape))] + load_shapes = [ + self.load_i64_array_item(shape_data, i) for i in range(len(param.shape)) + ] return (current_block, load_shapes) @@ -1396,10 +1421,16 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ) -> ir.Block: """Decode the shape parameter at the given index.""" with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) # Check if type is ffi.Shape or ffi.Array - is_ffi_shape = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIShape)) - is_ffi_array = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIArray)) + is_ffi_shape = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFIShape) + ) + is_ffi_array = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFIArray) + ) # Create error block and subsequent blocks error_block = current_block.create_after() @@ -1407,7 +1438,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): ffi_array_check_block = ffi_shape_block.create_after() ffi_array_block = ffi_array_check_block.create_after() # Create subsequent_block with i64 arguments for each shape dimension - subsequent_block = ffi_array_block.create_after(*[self.i64_type] * len(param.shape)) + subsequent_block = ffi_array_block.create_after( + *[self.i64_type] * len(param.shape) + ) # Branch from current_block: check FFI shape first with ir.InsertionPoint(current_block): @@ -1427,15 +1460,17 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # ffi array check block: verify it's actually an Array with ir.InsertionPoint(ffi_array_check_block): self.cond_br( - is_ffi_array, ffi_array_block, error_block, - branch_weights=self.BRANCH_WEIGHTS_LIKELY + is_ffi_array, + ffi_array_block, + error_block, + branch_weights=self.BRANCH_WEIGHTS_LIKELY, ) # ffi array block with ir.InsertionPoint(ffi_array_block): array_cell_ptr = self.get_object_cell_ptr( self.load_ffi_any_array_item_v_ptr(args, arg_index) - ) + ) ffi_array_block, load_shapes = self.decode_param_shape_from_ffi_array( ffi_array_block, param, arg_context, array_cell_ptr ) @@ -1476,9 +1511,15 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode tensor step0: check index and find out DLTensor*.""" # read the type index with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) - is_ffi_tensor = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFITensor)) - is_dl_tensor = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIDLTensorPtr)) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) + is_ffi_tensor = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFITensor) + ) + is_dl_tensor = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFIDLTensorPtr) + ) # Create error block and subsequent block error_block = current_block.create_after() @@ -1493,15 +1534,19 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # ffi tensor block with ir.InsertionPoint(ffi_tensor_block): - ffi_tensor_ptr: ir.Value = self.load_ffi_any_array_item_v_ptr(args, arg_index) + ffi_tensor_ptr: ir.Value = self.load_ffi_any_array_item_v_ptr( + args, arg_index + ) dl_tensor_ptr = self.get_object_cell_ptr(ffi_tensor_ptr) self.br(subsequent_block, args=[dl_tensor_ptr]) # dltensor check block: verify it's actually a DLTensor with ir.InsertionPoint(dl_tensor_check_block): self.cond_br( - is_dl_tensor, dl_tensor_block, error_block, - branch_weights=self.BRANCH_WEIGHTS_LIKELY + is_dl_tensor, + dl_tensor_block, + error_block, + branch_weights=self.BRANCH_WEIGHTS_LIKELY, ) # dltensor block @@ -1552,6 +1597,7 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # check data alignment if specified if param.data_alignment is not None: + def check_alignment() -> ir.Value: # Convert pointer to integer data_as_int = llvm.ptrtoint(self.i64_type, data) @@ -1574,7 +1620,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): # store the matched values, these do not need constraint checks self.matched_var_binding[param.data] = data self.matched_var_source[param.data] = param.data - self.matched_var_arg_field_name[param.data] = arg_context.get_field_name(".data") + self.matched_var_arg_field_name[param.data] = arg_context.get_field_name( + ".data" + ) # check device_id constraint if user specifies a device_id variable current_block = self.set_or_check_matched_var_binding( @@ -1718,8 +1766,12 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the stream parameter at the given index.""" # stream is decoded as opaque handle return self.decode_param_opaque_handle( - current_block, param.var, args, arg_index, arg_context, - allow_int_as_ptr=True + current_block, + param.var, + args, + arg_index, + arg_context, + allow_int_as_ptr=True, ) def decode_param_data_pointer( @@ -1790,8 +1842,12 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """Decode the tuple parameter at the given index.""" # Check if type is kTVMFFIArray with ir.InsertionPoint(current_block): - type_index: ir.Value = self.load_ffi_any_array_item_type_index(args, arg_index) - is_ffi_array = self.equal(type_index, self.i32(TVMFFITypeIndex.kTVMFFIArray)) + type_index: ir.Value = self.load_ffi_any_array_item_type_index( + args, arg_index + ) + is_ffi_array = self.equal( + type_index, self.i32(TVMFFITypeIndex.kTVMFFIArray) + ) # Check that the type is an array current_block = self.check_condition( @@ -1831,7 +1887,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): for i, tuple_param in enumerate(param.params): # Create nested context for the tuple element nested_context = arg_context.get_element_context(i) - current_block = self.decode_param(current_block, tuple_param, array_data, i, nested_context) + current_block = self.decode_param( + current_block, tuple_param, array_data, i, nested_context + ) return current_block @@ -1860,15 +1918,25 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): """ if isinstance(param, spec.Var): if param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.INT: - return self.decode_param_int(current_block, param, args, arg_index, arg_context) + return self.decode_param_int( + current_block, param, args, arg_index, arg_context + ) elif param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.UINT: # UINT uses the same logic as INT since both are stored in v_int64 - return self.decode_param_int(current_block, param, args, arg_index, arg_context) - elif (hasattr(tvm_ffi._dtype.DataTypeCode, "BOOL") and - param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.BOOL): - return self.decode_param_int(current_block, param, args, arg_index, arg_context) + return self.decode_param_int( + current_block, param, args, arg_index, arg_context + ) + elif ( + hasattr(tvm_ffi._dtype.DataTypeCode, "BOOL") + and param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.BOOL + ): + return self.decode_param_int( + current_block, param, args, arg_index, arg_context + ) elif param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.FLOAT: - return self.decode_param_float(current_block, param, args, arg_index, arg_context) + return self.decode_param_float( + current_block, param, args, arg_index, arg_context + ) elif param.dtype.type_code == tvm_ffi._dtype.DataTypeCode.HANDLE: return self.decode_param_opaque_handle( current_block, param, args, arg_index, arg_context @@ -1876,20 +1944,32 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): else: raise ValueError(f"Unsupported parameter type: {param.dtype.type_code}") elif isinstance(param, spec.Shape): - return self.decode_param_shape(current_block, param, args, arg_index, arg_context) + return self.decode_param_shape( + current_block, param, args, arg_index, arg_context + ) elif isinstance(param, spec.Tensor): - return self.decode_param_tensor(current_block, param, args, arg_index, arg_context) + return self.decode_param_tensor( + current_block, param, args, arg_index, arg_context + ) elif isinstance(param, spec.Stream): - return self.decode_param_stream(current_block, param, args, arg_index, arg_context) + return self.decode_param_stream( + current_block, param, args, arg_index, arg_context + ) elif isinstance(param, spec.EnvStream): # decode of env stream is deferred after we go through all parameters return current_block elif isinstance(param, spec.DataPointer): - return self.decode_param_data_pointer(current_block, param, args, arg_index, arg_context) + return self.decode_param_data_pointer( + current_block, param, args, arg_index, arg_context + ) elif isinstance(param, spec.ConstNone): - return self.decode_param_const_none(current_block, param, args, arg_index, arg_context) + return self.decode_param_const_none( + current_block, param, args, arg_index, arg_context + ) elif isinstance(param, spec.TupleParam): - return self.decode_param_tuple(current_block, param, args, arg_index, arg_context) + return self.decode_param_tuple( + current_block, param, args, arg_index, arg_context + ) else: raise ValueError(f"Unsupported parameter type: {type(param)}") @@ -1993,7 +2073,9 @@ class TVMFFIFunctionBuilder(TVMFFIBuilder): arg_index=ffi_arg_index, tuple_indices=[], ) - current_block = self.decode_param(current_block, param, args, ffi_arg_index, arg_context) + current_block = self.decode_param( + current_block, param, args, ffi_arg_index, arg_context + ) ffi_arg_index += 1 with ir.InsertionPoint(current_block): @@ -2053,7 +2135,9 @@ def attach_ffi_func( def rename_tvm_ffi_function( - module: ir.Module, old_name: str, new_name: str, + module: ir.Module, + old_name: str, + new_name: str, ) -> None: """Rename the TVM FFI function in the module. diff --git a/python/CuTeDSL/cutlass/base_dsl/typing.py b/python/CuTeDSL/cutlass/base_dsl/typing.py index 507b67ff..89fc6fb0 100644 --- a/python/CuTeDSL/cutlass/base_dsl/typing.py +++ b/python/CuTeDSL/cutlass/base_dsl/typing.py @@ -10,6 +10,7 @@ # is strictly prohibited. import ctypes +from itertools import chain import numpy as np import operator from typing_extensions import deprecated @@ -229,7 +230,7 @@ def get_c_pointers(obj): if hasattr(obj, "__c_pointers__"): return obj.__c_pointers__() elif isinstance(obj, (tuple, list)): - return sum((get_c_pointers(x) for x in obj), []) + return list(chain.from_iterable(get_c_pointers(x) for x in obj)) elif isinstance(obj, set): raise DSLRuntimeError( "Sets are not supported in get_c_pointers to ensure order preservation", diff --git a/python/CuTeDSL/cutlass/base_dsl/utils/numpy.py b/python/CuTeDSL/cutlass/base_dsl/utils/numpy.py new file mode 100644 index 00000000..61a181e3 --- /dev/null +++ b/python/CuTeDSL/cutlass/base_dsl/utils/numpy.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +""" +This module provides a NumPy related utility functions that are needed for +the DSL. +""" + +import numpy as np +from ..._mlir.extras import types as T + +# ============================================================================= +# Codegen Utils +# ============================================================================= + + +def _numpy_type_to_mlir_type(dtype): + if dtype == np.float64: + return T.f64() + if dtype == np.float16: + return T.f16() + if dtype == np.float32: + return T.f32() + if dtype == np.int64: + return T.i64() + if dtype == np.int32: + return T.i32() + if dtype == np.int16: + return T.i16() + if dtype == np.int8: + return T.i8() + if dtype == np.uint64: + return T.ui64() + if dtype == np.uint32: + return T.ui32() + if dtype == np.uint16: + return T.ui16() + if dtype == np.uint8: + return T.ui8() + if dtype == np.bool_: + return T.bool() + if dtype == f8E5M2: + return T.f8E5M2() + if dtype == f8E4M3FN: + return T.f8E4M3FN() + if dtype == f8E8M0FNU: + return T.f8E8M0FNU() + if dtype == f6E3M2FN: + return T.f6E3M2FN() + if dtype == f6E2M3FN: + return T.f6E2M3FN() + if dtype == f4E2M1FN: + return T.f4E2M1FN() + raise TypeError(f"Unknown NumPy dtype for MLIR conversion: {dtype!r}") + + +def _mlir_type_to_numpy_type(mlir_type): + if mlir_type == T.f64(): + return np.float64 + if mlir_type == T.f16(): + return np.float16 + if mlir_type == T.f32(): + return np.float32 + if mlir_type == T.i64(): + return np.int64 + if mlir_type == T.i32(): + return np.int32 + if mlir_type == T.i16(): + return np.int16 + if mlir_type == T.i8(): + return np.int8 + if mlir_type == T.ui64(): + return np.uint64 + if mlir_type == T.ui32(): + return np.uint32 + if mlir_type == T.ui16(): + return np.uint16 + if mlir_type == T.ui8(): + return np.uint8 + if mlir_type == T.bool(): + return np.bool_ + raise TypeError(f"Unknown MLIR type for NumPy conversion: {mlir_type!r}") diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/tree_utils.py b/python/CuTeDSL/cutlass/base_dsl/utils/tree_utils.py similarity index 86% rename from python/CuTeDSL/cutlass/cutlass_dsl/tree_utils.py rename to python/CuTeDSL/cutlass/base_dsl/utils/tree_utils.py index da1a6b5b..e447f353 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/tree_utils.py +++ b/python/CuTeDSL/cutlass/base_dsl/utils/tree_utils.py @@ -14,15 +14,15 @@ import dataclasses import itertools as it from types import SimpleNamespace -from ..base_dsl.typing import as_numeric, Numeric, Constexpr -from ..base_dsl._mlir_helpers.arith import ArithValue -from ..base_dsl.common import DSLBaseError -from .._mlir import ir +from ..typing import as_numeric, Numeric, Constexpr +from .._mlir_helpers.arith import ArithValue +from ..common import DSLBaseError +from ..._mlir import ir NoneType = type(None) # ============================================================================= -# Tree Utils +# Tree Utilsß # ============================================================================= @@ -43,6 +43,18 @@ def unzip2(pairs: Iterable[tuple[Any, Any]]) -> tuple[list[Any], list[Any]]: return lst1, lst2 +def unzip3( + triples: Iterable[tuple[Any, Any, Any]], +) -> tuple[list[Any], list[Any], list[Any]]: + """Unzip a sequence of triples into three lists.""" + lst1, lst2, lst3 = [], [], [] + for x1, x2, x3 in triples: + lst1.append(x1) + lst2.append(x2) + lst3.append(x3) + return lst1, lst2, lst3 + + def get_fully_qualified_class_name(x: Any) -> str: """ Get the fully qualified class name of an object. @@ -251,6 +263,7 @@ def set_dataclass_attributes( instance: Any, fields: list[str], values: Iterable[Any], + is_frozen: bool, constexpr_fields: list[str], ) -> Any: """ @@ -268,10 +281,16 @@ def set_dataclass_attributes( if not fields: return instance - kwargs = dict(zip(fields, values)) - for field in constexpr_fields: - kwargs[field] = getattr(instance, field) - return dataclasses.replace(instance, **kwargs) + if is_frozen: + kwargs = dict(zip(fields, values)) + for field in constexpr_fields: + kwargs[field] = getattr(instance, field) + return dataclasses.replace(instance, **kwargs) + else: + for field, value in zip(fields, values): + setattr(instance, field, value) + + return instance def default_dataclass_from_iterable( @@ -290,12 +309,11 @@ def default_dataclass_from_iterable( The reconstructed dataclass instance """ instance = metadata.original_obj + is_frozen = is_frozen_dataclass(instance) - new_instance = set_dataclass_attributes( - instance, metadata.fields, children, metadata.constexpr_fields + return set_dataclass_attributes( + instance, metadata.fields, children, is_frozen, metadata.constexpr_fields ) - metadata.original_obj = new_instance - return new_instance def dynamic_expression_to_iterable(x: Any) -> tuple[SimpleNamespace, list[Any]]: @@ -490,7 +508,7 @@ unflattened_a should be structurally identical to a, and unflattened_b should be """ -def tree_flatten(x: Any) -> tuple[list[Any], PyTreeDef]: +def tree_flatten(x: Any) -> tuple[list[Any], list[ir.Attribute], PyTreeDef]: """ Flatten a nested structure into a flat list of values and a tree definition. @@ -512,8 +530,8 @@ def tree_flatten(x: Any) -> tuple[list[Any], PyTreeDef]: >>> tree_flatten([1, [2, 3], 4]) ([1, 2, 3, 4], PyTreeDef(...)) """ - children_iter, treedef = _tree_flatten(x) - return list(children_iter), treedef + children_iter, child_attrs_iter, treedef = _tree_flatten(x) + return list(children_iter), list[ir.Attribute](child_attrs_iter), treedef def get_registered_node_types_or_insert(x: Any) -> Union[NodeType, None]: @@ -576,7 +594,9 @@ def create_leaf_for_value( ) -def _tree_flatten(x: Any) -> tuple[Iterable[Any], Union[PyTreeDef, Leaf]]: +def _tree_flatten( + x: Any, +) -> tuple[Iterable[Any], Iterable[ir.Attribute], Union[PyTreeDef, Leaf]]: """ Internal function to flatten a tree structure. @@ -595,28 +615,46 @@ def _tree_flatten(x: Any) -> tuple[Iterable[Any], Union[PyTreeDef, Leaf]]: DSLTreeFlattenError: If the object type is not supported """ if x is None: - return [], create_leaf_for_value(x, is_none=True) + return [], [], create_leaf_for_value(x, is_none=True) elif isinstance(x, ArithValue) and is_dynamic_expression(x): v = x.__extract_mlir_values__() - return v, create_leaf_for_value( - x, - node_metadata=SimpleNamespace(is_dynamic_expression=1, original_obj=x), - ir_type_str=str(v[0].type), + a = ( + [ir.DictAttr.get({})] + if not hasattr(x, "__extract_mlir_attributes__") + else x.__extract_mlir_attributes__() + ) + return ( + v, + a, + create_leaf_for_value( + x, + node_metadata=SimpleNamespace(is_dynamic_expression=1, original_obj=x), + ir_type_str=str(v[0].type), + ), ) elif isinstance(x, ArithValue): - return [x], create_leaf_for_value(x, is_numeric=True) + return [x], [ir.DictAttr.get({})], create_leaf_for_value(x, is_numeric=True) elif isinstance(x, ir.Value): - return [x], create_leaf_for_value(x) + return [x], [ir.DictAttr.get({})], create_leaf_for_value(x) elif isinstance(x, Numeric): v = x.__extract_mlir_values__() - return v, create_leaf_for_value( - x, - node_metadata=SimpleNamespace(is_dynamic_expression=1, original_obj=x), - ir_type_str=str(v[0].type), + a = ( + [ir.DictAttr.get({})] + if not hasattr(x, "__extract_mlir_attributes__") + else x.__extract_mlir_attributes__() + ) + return ( + v, + a, + create_leaf_for_value( + x, + node_metadata=SimpleNamespace(is_dynamic_expression=1, original_obj=x), + ir_type_str=str(v[0].type), + ), ) else: @@ -628,14 +666,31 @@ def _tree_flatten(x: Any) -> tuple[Iterable[Any], Union[PyTreeDef, Leaf]]: raise DSLTreeFlattenError( "Flatten Error: children is None", get_fully_qualified_class_name(x) ) - children_flat, child_trees = unzip2(map(_tree_flatten, children)) + children_flat, child_attrs_flat, child_trees = unzip3( + map(_tree_flatten, children) + ) flattened = it.chain.from_iterable(children_flat) - return flattened, PyTreeDef(node_type, node_metadata, tuple(child_trees)) + + if hasattr(x, "__extract_mlir_attributes__"): + # If x has extract mlir attributes it overrides the child's default attributes + child_attrs_flat = [x.__extract_mlir_attributes__()] * len( + child_attrs_flat + ) + child_attrs_flattened = it.chain.from_iterable(child_attrs_flat) + return ( + flattened, + child_attrs_flattened, + PyTreeDef(node_type, node_metadata, tuple(child_trees)), + ) # Try to convert to numeric try: nval = as_numeric(x).ir_value() - return [nval], create_leaf_for_value(nval, is_numeric=True) + return ( + [nval], + [ir.DictAttr.get({})], + create_leaf_for_value(nval, is_numeric=True), + ) except Exception: raise DSLTreeFlattenError( "Flatten Error", get_fully_qualified_class_name(x) @@ -658,7 +713,7 @@ def tree_unflatten(treedef: PyTreeDef, xs: list[Any]) -> Any: The reconstructed nested structure Example: - >>> flat_values, treedef = tree_flatten([1, [2, 3], 4]) + >>> flat_values, _, treedef = tree_flatten([1, [2, 3], 4]) >>> tree_unflatten(treedef, flat_values) [1, [2, 3], 4] """ @@ -709,6 +764,7 @@ def _check_tree_equal(lhs: Union[PyTreeDef, Leaf], rhs: Union[PyTreeDef, Leaf]) """ if isinstance(lhs, Leaf) and isinstance(rhs, Leaf): return lhs.is_none == rhs.is_none and lhs.ir_type_str == rhs.ir_type_str + elif isinstance(lhs, PyTreeDef) and isinstance(rhs, PyTreeDef): lhs_metadata = lhs.node_metadata rhs_metadata = rhs.node_metadata @@ -725,6 +781,7 @@ def _check_tree_equal(lhs: Union[PyTreeDef, Leaf], rhs: Union[PyTreeDef, Leaf]) and len(lhs.child_treedefs) == len(rhs.child_treedefs) and all(map(_check_tree_equal, lhs.child_treedefs, rhs.child_treedefs)) ) + else: return False @@ -744,8 +801,8 @@ def check_tree_equal(lhs: PyTreeDef, rhs: PyTreeDef) -> int: int: Index of the first differing child, or -1 if trees are equal Example: - >>> treedef1 = tree_flatten([1, [2, 3]])[1] - >>> treedef2 = tree_flatten([1, [2, 4]])[1] + >>> treedef1 = tree_flatten([1, [2, 3]])[2] + >>> treedef2 = tree_flatten([1, [2, 4]])[2] >>> check_tree_equal(treedef1, treedef2) 1 # The second child differs """ diff --git a/python/CuTeDSL/cutlass/cute/__init__.py b/python/CuTeDSL/cutlass/cute/__init__.py index 2be8c7f5..5522bd67 100644 --- a/python/CuTeDSL/cutlass/cute/__init__.py +++ b/python/CuTeDSL/cutlass/cute/__init__.py @@ -57,7 +57,6 @@ from .core import ( make_composed_layout, make_layout_tv, make_swizzle, - make_sparse_elem, recast_ptr, get, select, @@ -99,6 +98,8 @@ from .core import ( local_partition, local_tile, printf, + get_nonswizzle_portion, + get_swizzle_portion, # Wrapper classes Swizzle, E, @@ -118,6 +119,8 @@ from .core import ( # FastDivmod operations FastDivmodDivisor, fast_divmod_create_divisor, + basis_value, + basis_get, ) from .tuple import ( @@ -130,6 +133,9 @@ from .tuple import ( product_like, product_each, elem_less, + tuple_cat, + transform_apply, + filter_tuple, ) from .tensor import ( TensorSSA, @@ -178,6 +184,8 @@ from .atom import ( ) from .algorithm import gemm, copy, basic_copy, basic_copy_if, autovec_copy, prefetch +from . import typing as typing_module +from . import core from . import arch from . import export @@ -215,6 +223,7 @@ _tvm_ffi_args_spec_converter.attach_args_spec_converter(_dsl.CuTeDSL._get_dsl()) # Explicitly export all symbols for documentation generation __all__ = [ # Core types + *core.__all__, "AddressSpace", "CacheEvictionPriority", "Tensor", @@ -252,6 +261,8 @@ __all__ = [ "make_composed_layout", "make_layout_tv", "make_layout_image_mask", + "get_nonswizzle_portion", + "get_swizzle_portion", # Tensor functions "make_ptr", "make_tensor", @@ -271,6 +282,8 @@ __all__ = [ "find", "find_if", "transform_leaf", + "basis_value", + "basis_get", "coalesce", "group_modes", "cosize", @@ -287,6 +300,9 @@ __all__ = [ "prepend_ones", "append_ones", "elem_less", + "tuple_cat", + "transform_apply", + "filter_tuple", # Math operations "ceil_div", "round_up", diff --git a/python/CuTeDSL/cutlass/cute/_tvm_ffi_args_spec_converter.py b/python/CuTeDSL/cutlass/cute/_tvm_ffi_args_spec_converter.py index e4c51781..8a5ebc9e 100644 --- a/python/CuTeDSL/cutlass/cute/_tvm_ffi_args_spec_converter.py +++ b/python/CuTeDSL/cutlass/cute/_tvm_ffi_args_spec_converter.py @@ -353,6 +353,8 @@ def _convert_single_arg( elem_param = _convert_single_arg(elem, elem_name, None, ctx) tuple_params.append(elem_param) return spec.TupleParam(arg_name, tuple_params) + elif isinstance(arg, bool): + return spec.Var(arg_name, NumericToTVMFFIDtype[Boolean]) elif isinstance(arg, int): # in cute.compile, unannotated const int is converted to int32 return spec.Var(arg_name, NumericToTVMFFIDtype[Int32]) diff --git a/python/CuTeDSL/cutlass/cute/arch/__init__.py b/python/CuTeDSL/cutlass/cute/arch/__init__.py index a69ad0bc..6d10c66e 100644 --- a/python/CuTeDSL/cutlass/cute/arch/__init__.py +++ b/python/CuTeDSL/cutlass/cute/arch/__init__.py @@ -16,6 +16,7 @@ from .nvvm_wrappers import * from .smem import * from .tmem import * from .numeric_conversion import * +from .clc import * # __all__ is required here for documentation generation __all__ = [ @@ -73,12 +74,24 @@ __all__ = [ "vote_any_sync", "vote_all_sync", "vote_uni_sync", + "atomic_add", + "atomic_and", + "atomic_or", + "atomic_xor", + "atomic_max", + "atomic_min", + "atomic_exch", + "atomic_cas", + "store", + "load", "popc", "fence_proxy", "fence_view_async_tmem_load", "fence_view_async_tmem_store", "warpgroup_reg_alloc", "warpgroup_reg_dealloc", + "setmaxregister_increase", + "setmaxregister_decrease", "fma_packed_f32x2", "mul_packed_f32x2", "add_packed_f32x2", @@ -100,6 +113,8 @@ __all__ = [ # # tmem.py # + "get_max_tmem_alloc_cols", + "get_min_tmem_alloc_cols", "retrieve_tmem_ptr", "alloc_tmem", "relinquish_tmem_alloc_permit", @@ -115,4 +130,9 @@ __all__ = [ "cvt_i8x2_to_f32x2", "cvt_i8_bf16", "cvt_f32x2_bf16x2", + # + # clc.py + # + "issue_clc_query", + "clc_response", ] diff --git a/python/CuTeDSL/cutlass/cute/arch/clc.py b/python/CuTeDSL/cutlass/cute/arch/clc.py new file mode 100644 index 00000000..29af7348 --- /dev/null +++ b/python/CuTeDSL/cutlass/cute/arch/clc.py @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import Tuple +from cutlass.cutlass_dsl import T, dsl_user_op +from cutlass._mlir.dialects import nvvm, vector + +from ..typing import Int32, Pointer, Int128 + + +@dsl_user_op +def issue_clc_query( + mbar_ptr: Pointer, + clc_response_ptr: Pointer, + loc=None, + ip=None, +) -> None: + """ + The clusterlaunchcontrol.try_cancel instruction requests atomically cancelling the launch + of a cluster that has not started running yet. It asynchronously writes an opaque response + to shared memory indicating whether the operation succeeded or failed. On success, the + opaque response contains the ctaid of the first CTA of the canceled cluster. + + :param mbar_ptr: A pointer to the mbarrier address in SMEM + :type mbar_ptr: Pointer + :param clc_response_ptr: A pointer to the cluster launch control response address in SMEM + :type clc_response_ptr: Pointer + """ + mbar_llvm_ptr = mbar_ptr.llvm_ptr + clc_response_llvm_ptr = clc_response_ptr.llvm_ptr + nvvm.clusterlaunchcontrol_try_cancel_multicast( + clc_response_llvm_ptr, + mbar_llvm_ptr, + loc=loc, + ip=ip, + ) + + +@dsl_user_op +def clc_response( + result_addr: Pointer, loc=None, ip=None +) -> Tuple[Int32, Int32, Int32, Int32]: + """ + After loading response from clusterlaunchcontrol.try_cancel instruction into 16-byte + register, it can be further queried using clusterlaunchcontrol.query_cancel instruction. + If the cluster is canceled successfully, predicate p is set to true; otherwise, it is + set to false. If the request succeeded, clusterlaunchcontrol.query_cancel.get_first_ctaid + extracts the CTA id of the first CTA in the canceled cluster. By default, the instruction + returns a .v4 vector whose first three elements are the x, y and z coordinate of first CTA + in canceled cluster. + + :param result_addr: A pointer to the cluster launch control response address in SMEM + :type result_addr: Pointer + """ + from cutlass.cute import recast_ptr, make_tensor, make_layout + + clc_ptr_i128 = recast_ptr(result_addr, dtype=Int128, loc=loc, ip=ip) + clc_tensor = make_tensor( + clc_ptr_i128, make_layout(1, loc=loc, ip=ip), loc=loc, ip=ip + ) + + # Load the 128-bit value from shared memory + clc_result_vec = clc_tensor.load(loc=loc, ip=ip) + + # Extract the i128 scalar from the vector<1xi128> + clc_result_i128 = vector.extract( + clc_result_vec.ir_value(loc=loc, ip=ip), + [], + [0], + ) + # Query if the cluster was canceled + pred = nvvm.clusterlaunchcontrol_query_cancel_is_canceled( + T.bool(), + clc_result_i128, + loc=loc, + ip=ip, + ) + is_valid = Int32(pred) + + # Get first CTA ID x component + m_idx_i32 = nvvm.clusterlaunchcontrol_query_cancel_get_first_ctaid_x( + T.i32(), + clc_result_i128, + loc=loc, + ip=ip, + ) + + # Get first CTA ID y component + n_idx_i32 = nvvm.clusterlaunchcontrol_query_cancel_get_first_ctaid_y( + T.i32(), + clc_result_i128, + loc=loc, + ip=ip, + ) + + # Get first CTA ID z component + l_idx_i32 = nvvm.clusterlaunchcontrol_query_cancel_get_first_ctaid_z( + T.i32(), + clc_result_i128, + loc=loc, + ip=ip, + ) + + m_idx = Int32(m_idx_i32) + n_idx = Int32(n_idx_i32) + l_idx = Int32(l_idx_i32) + + return m_idx, n_idx, l_idx, is_valid diff --git a/python/CuTeDSL/cutlass/cute/arch/elect.py b/python/CuTeDSL/cutlass/cute/arch/elect.py index ebd6d840..9f51484e 100644 --- a/python/CuTeDSL/cutlass/cute/arch/elect.py +++ b/python/CuTeDSL/cutlass/cute/arch/elect.py @@ -69,6 +69,8 @@ def elect_one(*, loc=None, ip=None) -> IfOpRegion: # Only one thread in the warp executes the code in this context pass """ + from cutlass.base_dsl.arch import Arch + BaseDSL._get_dsl().check_arch(lambda arch: arch >= Arch.sm_90) is_thread_leader = nvvm.elect_sync(T.bool()) if_op = scf.IfOp(is_thread_leader, loc=loc, ip=ip) diff --git a/python/CuTeDSL/cutlass/cute/arch/mbar.py b/python/CuTeDSL/cutlass/cute/arch/mbar.py index 469ef3d5..3f9f2ec5 100644 --- a/python/CuTeDSL/cutlass/cute/arch/mbar.py +++ b/python/CuTeDSL/cutlass/cute/arch/mbar.py @@ -35,7 +35,10 @@ def mbarrier_init(mbar_ptr: Pointer, cnt: Int, *, loc=None, ip=None) -> None: :type cnt: Int """ nvvm.mbarrier_init_shared( - mbar_ptr.llvm_ptr, Int32(cnt).ir_value(loc=loc, ip=ip), loc=loc, ip=ip + mbar_ptr.to_llvm_ptr(loc=loc, ip=ip), + Int32(cnt).ir_value(loc=loc, ip=ip), + loc=loc, + ip=ip, ) @@ -65,7 +68,7 @@ def mbarrier_arrive_and_expect_tx( """ BaseDSL._get_dsl().check_arch(lambda arch: arch >= Arch.sm_90) - mbar_llvm_ptr = mbar_ptr.llvm_ptr + mbar_llvm_ptr = mbar_ptr.to_llvm_ptr(loc=loc, ip=ip) if peer_cta_rank_in_cluster is not None: mbar_llvm_ptr = nvvm.mapa_shared_cluster( mbar_llvm_ptr.type, @@ -105,7 +108,7 @@ def mbarrier_expect_tx( """ BaseDSL._get_dsl().check_arch(lambda arch: arch >= Arch.sm_90) - mbar_llvm_ptr = mbar_ptr.llvm_ptr + mbar_llvm_ptr = mbar_ptr.to_llvm_ptr(loc=loc, ip=ip) if peer_cta_rank_in_cluster is not None: mbar_llvm_ptr = nvvm.mapa( mbar_llvm_ptr.type, @@ -144,7 +147,7 @@ def mbarrier_wait(mbar_ptr: Pointer, phase: Int, *, loc=None, ip=None) -> None: # This NVVM Op is a spin-loop wrapping the mbarrier.try_wait.parity.shared.b64 PTX # The timeout in ns only applies to the latter and this call is truly blocking nvvm.mbarrier_try_wait_parity_shared( - mbar_ptr.llvm_ptr, + mbar_ptr.to_llvm_ptr(loc=loc, ip=ip), Int32(phase).ir_value(loc=loc, ip=ip), Int32(timeout_ns).ir_value(loc=loc, ip=ip), loc=loc, @@ -169,7 +172,7 @@ def mbarrier_try_wait(mbar_ptr: Pointer, phase: Int, *, loc=None, ip=None) -> Bo return Boolean( nvvm.mbarrier_wait_parity( T.bool(), - mbar_ptr.llvm_ptr, + mbar_ptr.to_llvm_ptr(loc=loc, ip=ip), Int32(phase).ir_value(loc=loc, ip=ip), nvvm.MBarrierWaitKind.TRY, loc=loc, @@ -223,7 +226,7 @@ def mbarrier_arrive( the mbarrier is converted to a remote address in the peer CTA's SMEM. """ - mbar_llvm_ptr = mbar_ptr.llvm_ptr + mbar_llvm_ptr = mbar_ptr.to_llvm_ptr(loc=loc, ip=ip) if peer_cta_rank_in_cluster is not None: BaseDSL._get_dsl().check_arch(lambda arch: arch >= Arch.sm_90) @@ -261,10 +264,5 @@ def cp_async_mbarrier_arrive_noinc(mbar_ptr: Pointer, *, loc=None, ip=None) -> N """ BaseDSL._get_dsl().check_arch(lambda arch: arch >= Arch.sm_90) - mbar_llvm_ptr = mbar_ptr.llvm_ptr - nvvm.cp_async_mbarrier_arrive_shared( - mbar_llvm_ptr, - noinc=True, - loc=loc, - ip=ip, - ) + mbar_llvm_ptr = mbar_ptr.to_llvm_ptr(loc=loc, ip=ip) + nvvm.cp_async_mbarrier_arrive_shared(mbar_llvm_ptr, noinc=True, loc=loc, ip=ip) diff --git a/python/CuTeDSL/cutlass/cute/arch/numeric_conversion.py b/python/CuTeDSL/cutlass/cute/arch/numeric_conversion.py index 073cf6d9..6484136f 100644 --- a/python/CuTeDSL/cutlass/cute/arch/numeric_conversion.py +++ b/python/CuTeDSL/cutlass/cute/arch/numeric_conversion.py @@ -30,6 +30,7 @@ from .nvvm_wrappers import ( cvt_f4e2m1x4_to_f16x4, cvt_f4e2m1x2_to_f16x2, cvt_f4e2m1_f16, + sext_unpacked_i4x4_to_i8x4, ) from ..typing import ( @@ -272,6 +273,38 @@ def cvt_f4e2m1_f16_intrinsic(vec_f4e2m1, length, *, loc=None, ip=None): return vec_dst +@dsl_user_op +def sext_unpacked_i4_i8_intrinsic(vec_unpacked_i4, length, *, loc=None, ip=None): + """ + Sign extend vector of int4 unpacked in 8b containers to packed int8 + + :param vec_unpacked_i4: The input vector of unpacked int4. + :type vec_unpacked_i4: 1D vector of unpacked int4 + :param length: The length of the input vector. + :type length: int + :return: The output 1D vector of int8 with the same length as the input vector. + :rtype: 1D vector of int8 + """ + assert length % 4 == 0, "unsupported length" + + vec_i8x4_type = ir.VectorType.get([4], Int8.mlir_type, loc=loc) + vec_i8_type = ir.VectorType.get([length], Int8.mlir_type, loc=loc) + vec_i8 = llvm.mlir_zero(vec_i8_type, loc=loc, ip=ip) + + for pos in range(0, length, 4): + vec_unpacked_i4x4 = vector.extract_strided_slice( + vec_i8x4_type, vec_unpacked_i4, [pos], [4], [1], loc=loc, ip=ip + ) + vec_i8x4 = sext_unpacked_i4x4_to_i8x4( + vec_unpacked_i4x4, loc=loc, ip=ip + ) + vec_i8 = vector.insert_strided_slice( + vec_i8x4, vec_i8, [pos], [1], loc=loc, ip=ip + ) + + return vec_i8 + + # Expose supported architectures via the intrinsic symbol cvt_i8_bf16_intrinsic.supported_archs = ( *Arch.AmpereArchs(), diff --git a/python/CuTeDSL/cutlass/cute/arch/nvvm_wrappers.py b/python/CuTeDSL/cutlass/cute/arch/nvvm_wrappers.py index bb7e006b..78f68639 100644 --- a/python/CuTeDSL/cutlass/cute/arch/nvvm_wrappers.py +++ b/python/CuTeDSL/cutlass/cute/arch/nvvm_wrappers.py @@ -10,19 +10,16 @@ # is strictly prohibited. from functools import partial -from typing import Optional, Tuple, Union, Callable, TYPE_CHECKING +from typing import Optional, Tuple, Union, Callable, Literal from typing_extensions import deprecated -from cutlass.cutlass_dsl import T, dsl_user_op, cutlass_arith +from cutlass.cutlass_dsl import T, dsl_user_op import cutlass.cutlass_dsl as cutlass_dsl from cutlass._mlir import ir from cutlass._mlir.dialects import arith, llvm, nvvm, vector -if TYPE_CHECKING: - from cutlass.tensor import TensorSSA - # Forward nvvm enums from cutlass._mlir.dialects.nvvm import ( ProxyKind, @@ -54,6 +51,81 @@ WARP_SIZE = 32 FULL_MASK = 0xFFFFFFFF +# ============================================================================ +# Enum String Mapping Helper +# ============================================================================ +# This section provides a helper to convert string literals to NVVM enum types +# by introspecting the enum's __str__() method. Each function imports and +# enhances only the enums it needs, avoiding namespace pollution. +# +# Usage within functions: +# MemOrderKind = _enhance_enum_with_str_mapping(MemOrderKind) +# sem = MemOrderKind.from_str("relaxed") +## ============================================================================ + + +def _enhance_enum_with_str_mapping(enum_class): + """ + Enhance an IntEnum class with automatic string-to-enum conversion. + + Builds a reverse mapping from __str__() output to enum members and adds + a from_str() class method for conversion. Safe to call multiple times + (idempotent - won't re-enhance if already enhanced). + + :param enum_class: The enum class to enhance + :return: The enhanced enum class (for chaining) + """ + # Skip if already enhanced + if hasattr(enum_class, "from_str"): + return enum_class + + # Build reverse mapping from string representation to enum member + str_to_enum_map = {} + for member in enum_class: + str_repr = str(member) + if str_repr in str_to_enum_map: + raise ValueError( + f"Duplicate string representation '{str_repr}' in {enum_class.__name__}" + ) + str_to_enum_map[str_repr] = member + + # Add from_str class method + @classmethod + def from_str(cls, s): + """ + Convert a string literal to the corresponding enum member. + + :param s: String representation of the enum member, or an enum member itself (deprecated) + :return: The enum member (or None if s is None) + :raises ValueError: If the string is not a valid enum member + """ + import warnings + + if s is None: + return None + + # Check if s is already an enum member of the correct type + if isinstance(s, cls): + warnings.warn( + f"Passing enum member directly to {cls.__name__}.from_str() is deprecated. " + f"Please use string literals instead (e.g., '{str(s)}' instead of {cls.__name__}.{s.name}).", + DeprecationWarning, + stacklevel=2, + ) + return s + + if s not in str_to_enum_map: + valid_options = sorted(str_to_enum_map.keys()) + raise ValueError( + f"Invalid {cls.__name__} string: '{s}'. " + f"Valid options are: {valid_options}" + ) + return str_to_enum_map[s] + + enum_class.from_str = from_str + return enum_class + + @dsl_user_op def lane_idx(*, loc=None, ip=None) -> Int32: """ @@ -374,7 +446,6 @@ def warp_reduction( offset = offset // 2 return val - warp_reduction_max = partial( warp_reduction, op=lambda x, y: fmax(x, y) if isinstance(x, Float32) else cutlass_dsl.max(x, y), @@ -389,13 +460,34 @@ def barrier(*, barrier_id=None, number_of_threads=None, loc=None, ip=None) -> No """ if barrier_id is not None: barrier_id = Int32(barrier_id).ir_value(loc=loc, ip=ip) + else: + barrier_id = Int32(0).ir_value(loc=loc, ip=ip) if number_of_threads is not None: number_of_threads = Int32(number_of_threads).ir_value(loc=loc, ip=ip) - - nvvm.barrier( - barrier_id=barrier_id, number_of_threads=number_of_threads, loc=loc, ip=ip - ) + llvm.inline_asm( + None, + [barrier_id, number_of_threads], + "bar.sync $0, $1;", + "r,r", + has_side_effects=True, + is_align_stack=False, + asm_dialect=llvm.AsmDialect.AD_ATT, + loc=loc, + ip=ip, + ) + else: + llvm.inline_asm( + None, + [barrier_id], + "bar.sync $0;", + "r", + has_side_effects=True, + is_align_stack=False, + asm_dialect=llvm.AsmDialect.AD_ATT, + loc=loc, + ip=ip, + ) @dsl_user_op @@ -404,6 +496,8 @@ def barrier_arrive( ) -> None: if barrier_id is not None: barrier_id = Int32(barrier_id).ir_value(loc=loc, ip=ip) + else: + barrier_id = Int32(0).ir_value(loc=loc, ip=ip) if number_of_threads is None: raise ValueError( @@ -411,8 +505,14 @@ def barrier_arrive( ) number_of_threads = Int32(number_of_threads).ir_value(loc=loc, ip=ip) - nvvm.barrier_arrive( - barrier_id=barrier_id, number_of_threads=number_of_threads, loc=loc, ip=ip + llvm.inline_asm( + None, + [barrier_id, number_of_threads], + "bar.arrive $0, $1;", + "r,r", + has_side_effects=True, + is_align_stack=False, + asm_dialect=llvm.AsmDialect.AD_ATT, ) @@ -682,7 +782,7 @@ def popc(value: Numeric, *, loc=None, ip=None) -> Numeric: @dsl_user_op def fence_view_async_tmem_op( - kind: Tcgen05WaitKind, + kind: Literal["load", "store"], *, loc=None, ip=None, @@ -715,18 +815,20 @@ def fence_view_async_tmem_op( ``` - :param kind: The kind of fence operation to perform including LOAD and STORE. - :type kind: Tcgen05WaitKind + :param kind: The kind of fence operation to perform ("load", "store"). + :type kind: Literal["load", "store"] """ - nvvm.tcgen05_wait(kind, loc=loc, ip=ip) + from cutlass._mlir.dialects.nvvm import Tcgen05WaitKind + + # Enhance enum and convert string literal to enum type + Tcgen05WaitKind_enhanced = _enhance_enum_with_str_mapping(Tcgen05WaitKind) + kind = Tcgen05WaitKind_enhanced.from_str(kind) + + nvvm.tcgen05_wait(kind=kind, loc=loc, ip=ip) -fence_view_async_tmem_load = partial( - fence_view_async_tmem_op, kind=Tcgen05WaitKind.LOAD -) -fence_view_async_tmem_store = partial( - fence_view_async_tmem_op, kind=Tcgen05WaitKind.STORE -) +fence_view_async_tmem_load = partial(fence_view_async_tmem_op, kind="load") +fence_view_async_tmem_store = partial(fence_view_async_tmem_op, kind="store") @dsl_user_op @@ -751,23 +853,45 @@ def fence_view_async_shared( @dsl_user_op -def warpgroup_reg_realloc_op( +def setmaxregister_increase( + reg_count: int, + *, + loc=None, + ip=None, +): + return nvvm.setmaxregister(reg_count, SetMaxRegisterAction.increase, loc=loc, ip=ip) + + +@dsl_user_op +def setmaxregister_decrease( + reg_count: int, + *, + loc=None, + ip=None, +): + return nvvm.setmaxregister(reg_count, SetMaxRegisterAction.decrease, loc=loc, ip=ip) + + +@dsl_user_op +@deprecated("API is deprecated, use setmaxregister_increase instead") +def warpgroup_reg_alloc( reg_count: int, - kind: SetMaxRegisterAction, *, loc=None, ip=None, ) -> None: - nvvm.setmaxregister(reg_count, kind, loc=loc, ip=ip) + nvvm.setmaxregister(reg_count, SetMaxRegisterAction.increase, loc=loc, ip=ip) -warpgroup_reg_alloc = partial( - warpgroup_reg_realloc_op, kind=SetMaxRegisterAction.increase -) -warpgroup_reg_dealloc = partial( - warpgroup_reg_realloc_op, kind=SetMaxRegisterAction.decrease -) - +@dsl_user_op +@deprecated("API is deprecated, use setmaxregister_decrease instead") +def warpgroup_reg_dealloc( + reg_count: int, + *, + loc=None, + ip=None, +) -> None: + nvvm.setmaxregister(reg_count, SetMaxRegisterAction.decrease, loc=loc, ip=ip) @dsl_user_op def calc_packed_f32x2_op( @@ -776,11 +900,17 @@ def calc_packed_f32x2_op( src_c: Optional[Tuple[Float32, Float32]], calc_func: Callable, *, - rnd=RoundingModeKind.RZ, - ftz=True, + rnd: Optional[Literal["rn", "rz", "rm", "rp", "none"]] = "rn", + ftz=None, loc=None, ip=None, ) -> Tuple[Float32, Float32]: + from cutlass._mlir.dialects.nvvm import RoundingModeKind + + # Enhance enum and convert string literal to enum type + RoundingModeKind_enhanced = _enhance_enum_with_str_mapping(RoundingModeKind) + rnd = RoundingModeKind_enhanced.from_str(rnd) + vec_type = ir.VectorType.get([2], Float32.mlir_type, loc=loc) vec_src_a = vector.from_elements( vec_type, @@ -1259,6 +1389,15 @@ def cvt_i4x8_to_bf16x8(src_vec8, *, loc=None, ip=None): vec_bf16x8 = llvm.bitcast(vec_bf16x8_type, rst_i32, loc=loc, ip=ip) return vec_bf16x8 +# Sign extend 4 int4 unpacked in 8b containers +@dsl_user_op +def sext_unpacked_i4x4_to_i8x4(src_vec4, *, loc=None, ip=None): + imm_u32 = arith.constant(Uint32.mlir_type, 0x78787878, loc=loc, ip=ip) + src_u32 = llvm.bitcast(Uint32.mlir_type, src_vec4, loc=loc, ip=ip) + dst_u32 = arith.addi(src_u32, imm_u32, loc=loc, ip=ip) + dst_u32 = arith.xori(dst_u32, imm_u32, loc=loc, ip=ip) + return llvm.bitcast(src_vec4.type, dst_u32, loc=loc, ip=ip) + @dsl_user_op def log2_of_pow2_int(a: Int32, *, loc=None, ip=None) -> Int32: @@ -1346,6 +1485,621 @@ def griddepcontrol_launch_dependents(*, loc=None, ip=None) -> None: +def _normalize_ptr(addr, *, loc=None, ip=None) -> ir.Value: + """ + Helper function to normalize pointer types to MLIR ir.Value. + + Supports: + - ir.Value (LLVM pointer): returned as-is + - cute.ptr (_Pointer instance): converted via to_llvm_ptr() + + :param addr: Address in various pointer formats + :return: Normalized MLIR pointer value + :rtype: ir.Value + """ + # If it's already an MLIR ir.Value, return as-is + if isinstance(addr, ir.Value): + return addr + + # If it has to_llvm_ptr method (cute._Pointer instances) + if hasattr(addr, "to_llvm_ptr") and callable(addr.to_llvm_ptr): + return addr.to_llvm_ptr(loc=loc, ip=ip) + + # If none of the above, return as-is and let NVVM handle it + # This allows for future pointer types without breaking existing code + return addr + + +def _atomic( + ptr, + val: Union[Numeric, ir.Value], + *, + op: Literal[ + "add", + "fadd", + "max", + "min", + "and", + "or", + "xor", + "exch", + ], + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Union[Numeric, ir.Value]: + """ + General atomic operation function. + + Atomically adds `val` to the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location. Supports: + - ir.Value (LLVM pointer) + - cute.ptr (_Pointer instance) + :param val: Value to add (scalar Numeric or vector ir.Value) + :type val: Union[Numeric, ir.Value] + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :param op: Atomic operation ("add", "fadd", "max", "min", "and", "or", "xor", "exch") + :type op: Literal["add", "fadd", "max", "min", "and", "or", "xor", "exch"] + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Union[Numeric, ir.Value] + """ + from cutlass._mlir.dialects.nvvm import AtomicOpKind, MemOrderKind, MemScopeKind + from cutlass.utils.version_info import CUDA_VERSION + + # Enhance enums and convert string literals to enum types + AtomicOpKind = _enhance_enum_with_str_mapping(AtomicOpKind) + MemOrderKind = _enhance_enum_with_str_mapping(MemOrderKind) + MemScopeKind = _enhance_enum_with_str_mapping(MemScopeKind) + + op = AtomicOpKind.from_str(op) + sem = MemOrderKind.from_str(sem) + scope = MemScopeKind.from_str(scope) + + # Normalize pointer type to MLIR ir.Value + ptr = _normalize_ptr(ptr, loc=loc, ip=ip) + + # * Handle `val` Type - scalar Numeric or vector ir.Value + is_vector = isinstance(val, ir.Value) and isinstance(val.type, ir.VectorType) + + if is_vector: + # Vector type atomic - val is already an ir.Value + val_ir = val + val_type = val.type + # Check if it's a floating-point vector type + elem_type = val.type.element_type + is_float_vector = ( + elem_type == Float16.mlir_type + or elem_type == BFloat16.mlir_type + or elem_type == Float32.mlir_type + ) + + # Vector atomics for f16/bf16/f32 only support ADD (FADD) + if is_float_vector and op == AtomicOpKind.ADD: + op = AtomicOpKind.FADD + else: + # Scalar type atomic - convert to Numeric + if not isinstance(val, Numeric): + val = as_numeric(val) + val_type = type(val) + val_ir = val.ir_value(loc=loc, ip=ip) + + # * Float + # For .f32, .f64, .f16, .bf16, .f16x2, .bf16x2, only .add (FADD) is supported + # For .u32 .u64, .s32, .s64, .add .and .or .xor .cas .exch .min .max are supported + if val_type.is_float: + # For floating-point types, only ADD is supported + if op == AtomicOpKind.ADD: + # Convert ADD to FADD for floating-point types + op = AtomicOpKind.FADD + + # * NVVM call based on nvvm version + if CUDA_VERSION.major == 12 and CUDA_VERSION.minor == 9: + # Old API: requires explicit result type as first positional argument + # For vectors: pass val_type (ir.VectorType), for scalars: pass val_type.mlir_type + result_type = val_type if is_vector else val_type.mlir_type + result = nvvm.atomicrmw( + result_type, + op=op, + ptr=ptr, + a=val_ir, + mem_order=sem, + syncscope=scope, + loc=loc, + ip=ip, + ) + else: + # New API: infers result type automatically + result = nvvm.atomicrmw( + op=op, + ptr=ptr, + a=val_ir, + mem_order=sem, + syncscope=scope, + loc=loc, + ip=ip, + ) + # Return raw result for vectors, wrapped for scalars + return result if is_vector else val_type(result) + + +def atomic_add( + ptr, + val: Union[Numeric, ir.Value], + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Union[Numeric, ir.Value]: + """ + Performs an atomic addition operation. + + Atomically adds `val` to the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value to add (scalar Numeric or vector ir.Value) + :type val: Union[Numeric, ir.Value] + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Union[Numeric, ir.Value] + """ + return _atomic(ptr, val, op="add", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_and( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic bitwise AND operation. + + Atomically computes bitwise AND of `val` with the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value for AND operation + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="and", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_or( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic bitwise OR operation. + + Atomically computes bitwise OR of `val` with the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value for OR operation + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="or", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_xor( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic bitwise XOR operation. + + Atomically computes bitwise XOR of `val` with the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value for XOR operation + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="xor", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_max( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic maximum operation. + + Atomically computes maximum of `val` and the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value for MAX operation + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="max", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_min( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic minimum operation. + + Atomically computes minimum of `val` and the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value for MIN operation + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="min", sem=sem, scope=scope, loc=loc, ip=ip) + + +def atomic_exch( + ptr, + val: Numeric, + *, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic exchange operation. + + Atomically exchanges `val` with the value at memory location `ptr` and returns the old value. + + :param ptr: Pointer to memory location + :param val: Value to exchange + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + return _atomic(ptr, val, op="exch", sem=sem, scope=scope, loc=loc, ip=ip) + + +@dsl_user_op +def atomic_cas( + ptr, + *, + cmp: Numeric, + val: Numeric, + sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> Numeric: + """ + Performs an atomic compare-and-swap (CAS) operation. + + Atomically compares the value at the memory location with `cmp`. If they are equal, + stores `val` at the memory location and returns the old value. + + :param ptr: Pointer to memory location. Supports: + - ir.Value (LLVM pointer) + - cute.ptr (_Pointer instance) + :param cmp: Value to compare against current memory value + :type cmp: Numeric + :param val: Value to store if comparison succeeds + :type val: Numeric + :param sem: Memory semantic ("relaxed", "release", "acquire", "acq_rel") + :type sem: Optional[Literal["relaxed", "release", "acquire", "acq_rel"]] + :param scope: Memory scope ("gpu", "cta", "cluster", "sys") + :type scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] + :return: Old value at memory location + :rtype: Numeric + """ + from cutlass._mlir.dialects.nvvm import AtomicOpKind, MemOrderKind, MemScopeKind + from cutlass.utils.version_info import CUDA_VERSION + + # Enhance enums and convert string literals to enum types + MemOrderKind = _enhance_enum_with_str_mapping(MemOrderKind) + MemScopeKind = _enhance_enum_with_str_mapping(MemScopeKind) + + sem = MemOrderKind.from_str(sem) + scope = MemScopeKind.from_str(scope) + + # Normalize pointer type to MLIR ir.Value + ptr = _normalize_ptr(ptr, loc=loc, ip=ip) + + # * Hanldle `val`, `cmp` Numeric Type + if not isinstance(cmp, Numeric): + cmp = as_numeric(cmp) + if not isinstance(val, Numeric): + val = as_numeric(val) + cmp_type = type(cmp) + cmp_ir = cmp.ir_value(loc=loc, ip=ip) + val_ir = val.ir_value(loc=loc, ip=ip) + + # * NVVM call based on nvvm version + if CUDA_VERSION.major == 12 and CUDA_VERSION.minor == 9: + result = nvvm.atomicrmw( + cmp_type.mlir_type, + op=AtomicOpKind.CAS, + ptr=ptr, + a=val_ir, + b=cmp_ir, + mem_order=sem, + syncscope=scope, + loc=loc, + ip=ip, + ) + else: + result = nvvm.atomicrmw( + op=AtomicOpKind.CAS, + ptr=ptr, + a=cmp_ir, + b=val_ir, + mem_order=sem, + syncscope=scope, + loc=loc, + ip=ip, + ) + return cmp_type(result) + + +@dsl_user_op +def store( + ptr, + val: Union[Numeric, ir.Value], + *, + level1_eviction_priority: Optional[ + Literal[ + "evict_normal", + "evict_first", + "evict_last", + "evict_no_allocate", + "evict_unchanged", + ] + ] = None, + cop: Optional[Literal["wb", "cg", "cs", "wt"]] = None, + ss: Optional[Literal["cta", "cluster"]] = None, + sem: Optional[Literal["relaxed", "release"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + loc=None, + ip=None, +) -> None: + """ + Store a value to a memory location. + + :param ptr: Pointer to store to. Supports: + - ir.Value (LLVM pointer) + - cute.ptr (_Pointer instance) + :param val: Value to store (scalar Numeric or vector ir.Value) + :type val: Union[Numeric, ir.Value] + :param level1_eviction_priority: L1 cache eviction policy string literal: + "evict_normal" : .level1::eviction_priority = .L1::evict_normal + "evict_first" : .level1::eviction_priority = .L1::evict_first + "evict_last" : .level1::eviction_priority = .L1::evict_last + "evict_no_allocate" : .level1::eviction_priority = .L1::no_allocate + "evict_unchanged" : .level1::eviction_priority = .L1::evict_unchanged + :param cop: Store cache modifier string literal: + :param ss: Shared memory space string literal: + "cta" : .ss = .shared::cta + "cluster" : .ss = .shared::cluster + None : .ss = .global + :param sem: Memory semantic string literal: + :param scope: Memory scope string literal: + + """ + from cutlass._mlir.dialects.nvvm import ( + MemOrderKind, + MemScopeKind, + StoreCacheModifierKind, + EvictKind, + SharedSpace, + ) + + # Enhance enums and convert string literals to enum types + MemOrderKind = _enhance_enum_with_str_mapping(MemOrderKind) + MemScopeKind = _enhance_enum_with_str_mapping(MemScopeKind) + StoreCacheModifierKind = _enhance_enum_with_str_mapping(StoreCacheModifierKind) + EvictKind = _enhance_enum_with_str_mapping(EvictKind) + SharedSpace = _enhance_enum_with_str_mapping(SharedSpace) + + sem = MemOrderKind.from_str(sem) + scope = MemScopeKind.from_str(scope) + cop = StoreCacheModifierKind.from_str(cop) + level1_eviction_priority = EvictKind.from_str(level1_eviction_priority) + ss = SharedSpace.from_str(ss) + + # Normalize pointer type to MLIR ir.Value + ptr = _normalize_ptr(ptr, loc=loc, ip=ip) + + # Handle both scalar Numeric and vector ir.Value + is_vector = isinstance(val, ir.Value) and isinstance(val.type, ir.VectorType) + + if is_vector: + # Vector type store - val is already an ir.Value + val_ir = val + else: + # Scalar type store - ensure val is a Numeric and convert to MLIR Value + if not isinstance(val, Numeric): + val = as_numeric(val) + val_ir = val.ir_value(loc=loc, ip=ip) + + nvvm.store_ext( + val_ir, + ptr, + order=sem, + scope=scope, + evict=level1_eviction_priority, + cache_modifier=cop, + shared_space=ss, + loc=loc, + ip=ip, + ) + + +@dsl_user_op +def load( + ptr, + dtype: Union[type[Numeric], ir.VectorType], + *, + sem: Optional[Literal["relaxed", "acquire"]] = None, + scope: Optional[Literal["gpu", "cta", "cluster", "sys"]] = None, + level1_eviction_priority: Optional[ + Literal[ + "evict_normal", + "evict_first", + "evict_last", + "evict_no_allocate", + "evict_unchanged", + ] + ] = None, + cop: Optional[Literal["ca", "cg", "cs", "lu", "cv"]] = None, + ss: Optional[Literal["cta", "cluster"]] = None, + level_prefetch_size: Optional[Literal["size_64b", "size_128b", "size_256b"]] = None, + loc=None, + ip=None, +) -> Union[Numeric, ir.Value]: + """ + Load a value from a memory location. + + :param ptr: Pointer to load from. Supports: + - ir.Value (LLVM pointer) + - cute.ptr (_Pointer instance) + :param dtype: Data type to load. Can be: + - Scalar: Numeric type class (Int8, Uint8, Int32, Float32, etc.) + - Vector: ir.VectorType for vectorized load (e.g., ir.VectorType.get([4], Int64.mlir_type)) + :type dtype: Union[type[Numeric], ir.VectorType] + :param sem: Memory semantic string literal: + :param scope: Memory scope string literal: + :param level1_eviction_priority: L1 cache eviction policy string literal: + "evict_normal" : .level1::eviction_priority = .L1::evict_normal + "evict_first" : .level1::eviction_priority = .L1::evict_first + "evict_last" : .level1::eviction_priority = .L1::evict_last + "evict_no_allocate" : .level1::eviction_priority = .L1::no_allocate + "evict_unchanged" : .level1::eviction_priority = .L1::evict_unchanged + :param cop: Load cache modifier string literal: + :param ss: Shared memory space string literal: + "cta" : .ss = .shared::cta + "cluster" : .ss = .shared::cluster + None : .ss = .global + :param level_prefetch_size: L2 cache prefetch size hint string literal: + "size_64b" : .level::prefetch_size = .L2::64B + "size_128b" : .level::prefetch_size = .L2::128B + "size_256b" : .level::prefetch_size = .L2::256B + :return: Loaded value (scalar Numeric or vector ir.Value) + :rtype: Union[Numeric, ir.Value] + """ + from cutlass._mlir.dialects.nvvm import ( + MemOrderKind, + MemScopeKind, + LoadCacheModifierKind, + EvictKind, + SharedSpace, + L2PrefetchSize, + ) + + # Enhance enums and convert string literals to enum types + MemOrderKind = _enhance_enum_with_str_mapping(MemOrderKind) + MemScopeKind = _enhance_enum_with_str_mapping(MemScopeKind) + LoadCacheModifierKind = _enhance_enum_with_str_mapping(LoadCacheModifierKind) + EvictKind = _enhance_enum_with_str_mapping(EvictKind) + SharedSpace = _enhance_enum_with_str_mapping(SharedSpace) + L2PrefetchSize = _enhance_enum_with_str_mapping(L2PrefetchSize) + + sem = MemOrderKind.from_str(sem) + scope = MemScopeKind.from_str(scope) + cop = LoadCacheModifierKind.from_str(cop) + level1_eviction_priority = EvictKind.from_str(level1_eviction_priority) + ss = SharedSpace.from_str(ss) + level_prefetch_size = L2PrefetchSize.from_str(level_prefetch_size) + + # Normalize pointer type to MLIR ir.Value + ptr = _normalize_ptr(ptr, loc=loc, ip=ip) + + # Determine if dtype is a vector type or scalar type + is_vector = isinstance(dtype, ir.VectorType) and isinstance(dtype, ir.VectorType) + + if is_vector: + # Vector load: dtype is already an ir.VectorType + mlir_type = dtype + scalar_dtype = None # We don't need to wrap the result + else: + # Scalar load: dtype is a Numeric type class + mlir_type = dtype.mlir_type + scalar_dtype = dtype + + result = nvvm.load_ext( + res=mlir_type, + addr=ptr, + order=sem, + scope=scope, + evict=level1_eviction_priority, + cache_modifier=cop, + shared_space=ss, + prefetch=level_prefetch_size, + loc=loc, + ip=ip, + ) + + # Return raw ir.Value for vectors, wrapped Numeric for scalars + if is_vector: + return result + else: + return scalar_dtype(result) + + @dsl_user_op def cvt_f4e2m1_f16(src, *, loc=None, ip=None): # 0 padding for upper 4 bits diff --git a/python/CuTeDSL/cutlass/cute/arch/tmem.py b/python/CuTeDSL/cutlass/cute/arch/tmem.py index f87fbc37..2e393672 100644 --- a/python/CuTeDSL/cutlass/cute/arch/tmem.py +++ b/python/CuTeDSL/cutlass/cute/arch/tmem.py @@ -16,11 +16,61 @@ from cutlass.cutlass_dsl import dsl_user_op import cutlass._mlir.dialects.cute as _cute_ir import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir -from ..typing import Pointer, Int, Int32, Numeric, NumericMeta +from ..typing import Pointer, Int, Int32, Numeric, NumericMeta, Tensor + +SM100_TMEM_CAPACITY_COLUMNS = ( + 512 # deprecated; use get_max_tmem_alloc_cols(arch="sm_100") instead +) +SM100_TMEM_MIN_ALLOC_COLUMNS = ( + 32 # deprecated; use get_min_tmem_alloc_cols(arch="sm_100") instead +) + +TMEM_MAX_ALLOC_COLUMNS_MAP = { + "sm_120": 512, + "sm_103": 512, + "sm_100": 512, +} + +TMEM_MIN_ALLOC_COLUMNS_MAP = { + "sm_120": 32, + "sm_103": 32, + "sm_100": 32, +} -SM100_TMEM_CAPACITY_COLUMNS = 512 -SM100_TMEM_MIN_ALLOC_COLUMNS = 32 +def get_max_tmem_alloc_cols(compute_capability: str) -> int: + """Get the tensor memory capacity in columns for a given compute capability. + + Returns the maximum TMEM capacity in columns available for the specified + GPU compute capability. + + :param compute_capability: The compute capability string (e.g. "sm_100", "sm_103") + :type compute_capability: str + :return: The TMEM capacity in columns + :rtype: int + :raises ValueError: If the compute capability is not supported + """ + if compute_capability not in TMEM_MAX_ALLOC_COLUMNS_MAP: + raise ValueError(f"Unsupported compute capability: {compute_capability}") + return TMEM_MAX_ALLOC_COLUMNS_MAP[compute_capability] + + + +def get_min_tmem_alloc_cols(compute_capability: str) -> int: + """Get the minimum TMEM allocation columns for a given compute capability. + + Returns the minimum TMEM allocation columns available for the specified + GPU compute capability. + + :param compute_capability: The compute capability string (e.g. "sm_100", "sm_103") + :type compute_capability: str + :return: The minimum TMEM allocation columns + :rtype: int + :raises ValueError: If the compute capability is not supported + """ + if compute_capability not in TMEM_MIN_ALLOC_COLUMNS_MAP: + raise ValueError(f"Unsupported compute capability: {compute_capability}") + return TMEM_MIN_ALLOC_COLUMNS_MAP[compute_capability] @dsl_user_op @@ -64,6 +114,7 @@ def alloc_tmem( smem_ptr_to_write_address: Pointer, is_two_cta=None, *, + arch: str = "sm_100", loc=None, ip=None, ) -> None: @@ -76,15 +127,19 @@ def alloc_tmem( to :type smem_ptr_to_write_address: Pointer :param is_two_cta: Optional boolean parameter for 2-CTA MMAs + :param arch: The architecture of the GPU. + :type arch: str """ + tmem_max_alloc_cols = get_max_tmem_alloc_cols(arch) + tmem_min_alloc_cols = get_min_tmem_alloc_cols(arch) if isinstance(num_columns, int): if ( - num_columns < SM100_TMEM_MIN_ALLOC_COLUMNS - or num_columns > SM100_TMEM_CAPACITY_COLUMNS + num_columns < tmem_min_alloc_cols + or num_columns > tmem_max_alloc_cols or not (num_columns & (num_columns - 1) == 0) ): raise ValueError( - f"num_columns must be between 32 and 512, and must be pow of 2, but got {num_columns}" + f"num_columns must be between {tmem_min_alloc_cols} and {tmem_max_alloc_cols}, and must be pow of 2, but got {num_columns}" ) _cute_nvgpu_ir.arch_sm100_alloc_tmem( Int32(num_columns).ir_value(loc=loc, ip=ip), @@ -112,6 +167,7 @@ def dealloc_tmem( num_columns: Int, is_two_cta=None, *, + arch: str = "sm_100", loc=None, ip=None, ) -> None: @@ -123,15 +179,19 @@ def dealloc_tmem( :param num_columns: The number of columns in the TMEM allocation :type num_columns: Int :param is_two_cta: Optional boolean parameter for 2-CTA MMAs + :param arch: The architecture of the GPU. + :type arch: str """ + tmem_max_alloc_cols = get_max_tmem_alloc_cols(arch) + tmem_min_alloc_cols = get_min_tmem_alloc_cols(arch) if isinstance(num_columns, int): if ( - num_columns < SM100_TMEM_MIN_ALLOC_COLUMNS - or num_columns > SM100_TMEM_CAPACITY_COLUMNS + num_columns < tmem_min_alloc_cols + or num_columns > tmem_max_alloc_cols or not (num_columns & (num_columns - 1) == 0) ): raise ValueError( - f"num_columns must be between 32 and 512, and must be pow of 2, but got {num_columns}" + f"num_columns must be between {tmem_min_alloc_cols} and {tmem_max_alloc_cols}, and must be pow of 2, but got {num_columns}" ) _cute_nvgpu_ir.arch_sm100_dealloc_tmem( tmem_ptr.value, diff --git a/python/CuTeDSL/cutlass/cute/atom.py b/python/CuTeDSL/cutlass/cute/atom.py index 4881b05e..ba453317 100644 --- a/python/CuTeDSL/cutlass/cute/atom.py +++ b/python/CuTeDSL/cutlass/cute/atom.py @@ -136,10 +136,15 @@ class Atom(ABC): self._trait = trait def __extract_mlir_values__(self): - return extract_mlir_values(self._trait) + return extract_mlir_values(self._trait) + extract_mlir_values(self._op) def __new_from_mlir_values__(self, values): - return self.__class__(self.op, new_from_mlir_values(self._trait, values)) + traits_value = values[: len(extract_mlir_values(self._trait))] + op_value = values[len(extract_mlir_values(self._trait)) :] + + new_trait = new_from_mlir_values(self._trait, traits_value) + new_op = new_from_mlir_values(self._op, op_value) + return self.__class__(new_op, new_trait) @property def op(self) -> Op: @@ -318,24 +323,29 @@ class TiledMma(MmaAtom): # @property - def tv_layout_A_tiled(self) -> Layout: - return static(self._trait.value.type.layout_a_tv_tiled) + @dsl_user_op + def tv_layout_A_tiled(self, *, loc=None, ip=None) -> Layout: + return static(self._trait.value.type.layout_a_tv_tiled, loc=loc, ip=ip) @property - def tv_layout_B_tiled(self) -> Layout: - return static(self._trait.value.type.layout_b_tv_tiled) + @dsl_user_op + def tv_layout_B_tiled(self, *, loc=None, ip=None) -> Layout: + return static(self._trait.value.type.layout_b_tv_tiled, loc=loc, ip=ip) @property - def tv_layout_C_tiled(self) -> Layout: - return static(self._trait.value.type.layout_c_tv_tiled) + @dsl_user_op + def tv_layout_C_tiled(self, *, loc=None, ip=None) -> Layout: + return static(self._trait.value.type.layout_c_tv_tiled, loc=loc, ip=ip) @property - def permutation_mnk(self) -> Tile: - return _unpack_x_tuple(self._trait.value.type.permutation_mnk) + @dsl_user_op + def permutation_mnk(self, *, loc=None, ip=None) -> Tile: + return _unpack_x_tuple(self._trait.value.type.permutation_mnk, loc=loc, ip=ip) @property - def thr_layout_vmnk(self) -> Layout: - return static(self._trait.value.type.thr_layout_vmnk) + @dsl_user_op + def thr_layout_vmnk(self, *, loc=None, ip=None) -> Layout: + return static(self._trait.value.type.thr_layout_vmnk, loc=loc, ip=ip) @property def size(self) -> int: @@ -598,6 +608,33 @@ class CopyAtom(Atom): def layout_dst_tv(self) -> Layout: return static(self._trait.value.type.layout_dst_tv) + @property + def smem_layout(self): + """ + Convenience property to access the SMEM layout for TMA copy atoms. + + This is a shortcut for ``atom.op.smem_layout`` that checks if the operation + is a TMA operation and provides a clearer error message if not. + + :return: The SMEM layout + :rtype: Layout or ComposedLayout + :raises TypeError: If the operation is not a TMA operation + :raises ValueError: If the SMEM layout is not set + + Example: + >>> layout = tma_atom.smem_layout # Instead of tma_atom.op.smem_layout + """ + # Import here to avoid circular dependency + from .nvgpu.cpasync.copy import TmaCopyOp + + if not isinstance(self.op, TmaCopyOp): + raise TypeError( + f"smem_layout is only available for TMA copy operations, " + f"but this atom uses {type(self.op).__name__}" + ) + + return self.op.smem_layout + class TiledCopy(CopyAtom): """ diff --git a/python/CuTeDSL/cutlass/cute/core.py b/python/CuTeDSL/cutlass/cute/core.py index 4ad53b5e..632a3b77 100644 --- a/python/CuTeDSL/cutlass/cute/core.py +++ b/python/CuTeDSL/cutlass/cute/core.py @@ -17,7 +17,7 @@ from typing import Any, Dict, List, Optional, Tuple, Type, Union, overload from typing_extensions import deprecated from cutlass._mlir import ir -from cutlass._mlir.dialects import builtin, llvm +from cutlass._mlir.dialects import builtin, llvm, vector from cutlass._mlir.dialects import cute as _cute_ir from cutlass._mlir.dialects.cute import ( Ratio as _Ratio, @@ -66,6 +66,91 @@ from .typing import ( is_integer, ) +__all__ = [ + # Classes + "IntValue", + "Swizzle", + "struct", + # Utility functions + "E", + "get_divisibility", + "is_valid_leaf", + "is_static", + "has_underscore", + "has_scaled_basis", + "pretty_str", + "printf", + # Layout operations + "front", + "is_major", + "assume", + "make_swizzle", + "static", + "get_leaves", + "depth", + "rank", + "is_congruent", + "is_weakly_congruent", + "get", + "select", + "group_modes", + "slice_", + "dice", + "prepend", + "append", + "prepend_ones", + "append_ones", + "repeat_as_tuple", + "repeat", + "repeat_like", + "flatten", + "filter_zeros", + "filter", + "size", + "shape_div", + "ceil_div", + "round_up", + "make_layout", + "make_identity_layout", + "make_ordered_layout", + "make_layout_like", + "make_composed_layout", + "cosize", + "size_in_bytes", + "coalesce", + "crd2idx", + "idx2crd", + "recast_layout", + "slice_and_offset", + "shape", + "recast_ptr", + "make_ptr", + "composition", + "complement", + "right_inverse", + "left_inverse", + "logical_product", + "zipped_product", + "tiled_product", + "flat_product", + "raked_product", + "blocked_product", + "logical_divide", + "zipped_divide", + "tiled_divide", + "flat_divide", + "max_common_layout", + "max_common_vector", + "tile_to_shape", + "local_partition", + "local_tile", + "make_layout_image_mask", + "leading_dim", + "make_layout_tv", + "get_nonswizzle_portion", + "get_swizzle_portion", +] + #################################################################################################### # # Internal IntTuple helpers @@ -131,8 +216,8 @@ def _pack_tile(tile: Tile, *, loc=None, ip=None) -> ir.Value: leaves = [] for e in tile: if isinstance(e, _Layout): - leaves.extend(list(flatten_to_tuple(e.shape))) - leaves.extend(list(flatten_to_tuple(e.stride))) + leaves.extend(list(flatten_to_tuple(e.shape_method(loc=loc, ip=ip)))) + leaves.extend(list(flatten_to_tuple(e.stride_method(loc=loc, ip=ip)))) else: leaves.append(e) return leaves @@ -143,6 +228,7 @@ def _pack_tile(tile: Tile, *, loc=None, ip=None) -> ir.Value: _get_typed_value(x) for x in dyn_elems if isinstance(x, (Integer, ir.Value)) ] + tile = transform_leaf(_get_typed_value, tile) res_ty = _cute_ir.pack_tile(tile) return _cute_ir.make_tile(res_ty, dyn_elems, loc=loc, ip=ip) @@ -332,16 +418,18 @@ class IntValue(cutlass_arith.ArithValue): # Dispatch to `__rmul__` of `other` return NotImplemented - return IntValue(op(self, other_val, **kwargs)) + return IntValue( + op(self, other_val, **kwargs), + loc=kwargs.get("loc"), + ip=kwargs.get("ip"), + ) return wrapper @dsl_user_op @_binary_op def __add__(self, other, *, loc=None, ip=None): - return _cute_ir.add_offset( - self.get_typed_value(loc=loc, ip=ip), other, loc=loc, ip=ip - ) + return _cute_ir.tuple_add(self.get_typed_value(), other, loc=loc, ip=ip) @dsl_user_op @_binary_op @@ -373,10 +461,8 @@ class IntValue(cutlass_arith.ArithValue): @dsl_user_op @_binary_op - def __radd__(self, other, *, loc=None, ip=None) -> "IntValue": - return _cute_ir.add_offset( - other, self.get_typed_value(loc=loc, ip=ip), loc=loc, ip=ip - ) + def __radd__(self, other, *, loc=None, ip=None): + return _cute_ir.tuple_add(other, self.get_typed_value(), loc=loc, ip=ip) @dsl_user_op @_binary_op @@ -579,6 +665,9 @@ class ScaledBasis: if isinstance(self._value, Integer): scale = self._value.ir_value(loc=loc, ip=ip) return _ScaledBasis(scale, self._mode, get_divisibility(scale)) + elif isinstance(self._value, cutlass_arith.ArithValue): + scale = self._value + return _ScaledBasis(scale, self._mode, get_divisibility(scale)) else: scale = self._value return _ScaledBasis(scale, self._mode) @@ -658,6 +747,27 @@ class ScaledBasis: return ScaledBasis(scale * value, self.mode) # type: ignore + def __mul__( + self, scale: Union[Int, ir.Value, Ratio], *, loc=None, ip=None + ) -> "ScaledBasis": + """Multiplication by a scale factor. + This operation is used in layout algebra to scale basis elements, + which is essential for operations like composition and partitioning. + + :param scale: The scale factor + :type scale: Union[Int, ir.Value, Ratio] + :param loc: The source location for the operation, defaults to None + :type loc: Location, optional + :param ip: The insertion point for the operation, defaults to None + :type ip: InsertionPoint, optional + :return: A new scaled basis element + :rtype: ScaledBasis + :raises TypeError: If scale is not of a supported type + :raises NotImplementedError: If scaling a basis element with a ratio value + """ + + return self.__rmul__(scale, loc=loc, ip=ip) + def __extract_mlir_values__(self): if isinstance(self.value, Ratio): # Ratio is always static @@ -716,6 +826,79 @@ def get_divisibility(x: Union[int, Integer]) -> int: return 1 +def basis_value(e: Union[ScaledBasis, Any]) -> Union[Int, ir.Value, Ratio]: + """Extract the value from a ScaledBasis or return the input as-is. + + If the input is a ScaledBasis, returns its value component. + Otherwise, returns the input unchanged. + + :param e: The input element (ScaledBasis or any other type) + :type e: Any + :return: The value of the ScaledBasis or the input itself + :rtype: Any + + **Examples:** + + .. code-block:: python + + >>> basis_value(ScaledBasis(5, 0)) + 5 + >>> basis_value(42) + 42 + """ + if isinstance(e, ScaledBasis): + return e.value + else: + return e + + +@dsl_user_op +def basis_get( + basis: Union[ScaledBasis, Numeric, int], + t: Union[XTuple, Layout, ComposedLayout], + *, + loc=None, + ip=None, +) -> Union[XTuple, Layout, ComposedLayout]: + """Apply the mode indices from a ScaledBasis to get an element from a tuple, layout, or composed layout. + + If the basis is a ScaledBasis or Numeric with mode indices, this function uses those + indices to extract the corresponding element from the tuple using hierarchical + indexing. If the basis is not a ScaledBasis or has no modes, returns the tuple, layout, or composed layout as-is. + + :param basis: The basis element (ScaledBasis) + :type basis: ScaledBasis + :param t: The tuple, layout, or composed layout to index into + :type t: Union[XTuple, Layout, ComposedLayout] + :return: The element at the position specified by the basis modes, or t itself + :rtype: Union[XTuple, Layout, ComposedLayout] + + **Examples:** + + .. code-block:: python + + >>> basis_get(ScaledBasis(2, 1), (10, 20, 30)) + 20 + >>> basis_get(ScaledBasis(2, [0, 1]), ((10, 20), (30, 40))) + 20 + >>> basis_get(5, (10, 20, 30)) # Non-basis returns tuple as-is + (10, 20, 30) + """ + if isinstance(basis, ScaledBasis): + modes = basis.mode + if len(modes) == 0: + return t + else: + # Use hierarchical indexing with the mode list + return get(t, modes, loc=loc, ip=ip) + elif isinstance(basis, (Numeric, int)): + return t + else: + raise TypeError( + f"basis must be a ScaledBasis or Numeric, but got {type(basis)}" + ) + + @ir.register_value_caster(_cute_ir.SwizzleType.get_static_typeid(), replace=True) class Swizzle(ir.Value): """ @@ -751,6 +934,41 @@ class Swizzle(ir.Value): # Cut off the MLIR type's string for making pretty_str more concise return self.type.__str__()[15 : 15 + 8] + def __eq__(self, other) -> Union[bool, Boolean]: + """Check if this Swizzle is equal to another Swizzle. Since num_bits, num_base, and num_shift are static, + this is a constant expression. + + Two Swizzles are equal if they have the same num_bits, num_base, and num_shift. + + :param other: The Swizzle to compare with. + :return: True if Swizzles are equal, False otherwise. + """ + if isinstance(other, Swizzle): + return self.type == other.type + else: + return False + + @property + def num_bits(self) -> int: + """ + Returns the number of bits in the mask (B in Sw). + """ + return self.type.num_bits + + @property + def num_base(self) -> int: + """ + Returns the number of least-significant bits to keep constant (M in Sw). + """ + return self.type.num_base + + @property + def num_shift(self) -> int: + """ + Returns the distance to shift the mask (S in Sw). + """ + return self.type.num_shift + @ir.register_value_caster(_cute_ir.LayoutType.get_static_typeid(), replace=True) class _Layout(Layout): @@ -794,12 +1012,26 @@ class _Layout(Layout): """ super().__init__(op_result) - def __str__(self) -> str: + def __repr__(self, *, loc=None, ip=None) -> str: + return self.__str__(loc=loc, ip=ip) + + def __str__(self, *, loc=None, ip=None) -> str: """Return a string representation of the layout. :return: A string in the format "shape:stride". """ - return f"{pretty_str(self.shape)}:{pretty_str(self.stride)}" + type_str = self.type.__str__() + return type_str[type_str.find("<") + 2 : type_str.rfind(">") - 1] + + @lru_cache_ir() + def shape_method(self, *, loc=None, ip=None) -> Shape: + return _unpack_x_tuple(_cute_ir.get_shape(self, loc=loc, ip=ip), loc=loc, ip=ip) + + @lru_cache_ir() + def stride_method(self, *, loc=None, ip=None) -> Stride: + return _unpack_x_tuple( + _cute_ir.get_stride(self, loc=loc, ip=ip), loc=loc, ip=ip + ) @property @dsl_user_op @@ -812,7 +1044,7 @@ class _Layout(Layout): :return: The hierarchical shape of the layout. """ - return _unpack_x_tuple(_cute_ir.get_shape(self, loc=loc, ip=ip), loc=loc, ip=ip) + return self.shape_method(loc=loc, ip=ip) @property @dsl_user_op @@ -824,9 +1056,7 @@ class _Layout(Layout): :return: The hierarchical stride of the layout. """ - return _unpack_x_tuple( - _cute_ir.get_stride(self, loc=loc, ip=ip), loc=loc, ip=ip - ) + return self.stride_method(loc=loc, ip=ip) @property def max_alignment(self) -> int: @@ -977,6 +1207,10 @@ class _ComposedLayout(ComposedLayout): @property @dsl_user_op def shape(self, *, loc=None, ip=None) -> Shape: + return self.shape_method(loc=loc, ip=ip) + + @dsl_user_op + def shape_method(self, *, loc=None, ip=None) -> Shape: return _unpack_x_tuple( _cute_ir.get_shape(self.value, loc=loc, ip=ip), loc=loc, ip=ip ) @@ -1088,11 +1322,15 @@ class _Pointer(Pointer): @property @lru_cache_ir() - def dtype(self) -> Union[Type[Numeric], _cute_ir.SparseElemType]: - if isinstance(self.value.type.value_type, _cute_ir.SparseElemType): - return self.value.type.value_type - else: - return Numeric.from_mlir_type(self.value.type.value_type) + def dtype( + self, + ) -> Union[ + Type[Numeric], + ]: + ret_type = None + if ret_type is None: + ret_type = Numeric.from_mlir_type(self.value.type.value_type) + return ret_type @property def alignment(self) -> int: @@ -1121,6 +1359,25 @@ class _Pointer(Pointer): """ Get the LLVM pointer representation of this pointer. + :param loc: Source location for MLIR, defaults to None + :type loc: Optional[Location] + :param ip: Insertion point for MLIR, defaults to None + :type ip: Optional[InsertionPoint] + :return: The LLVM pointer representation + :rtype: ir.Value + """ + return self.to_llvm_ptr(loc=loc, ip=ip) + + @dsl_user_op + @lru_cache_ir() + def to_llvm_ptr(self, *, loc=None, ip=None) -> ir.Value: + """ + Get the LLVM pointer representation of this pointer. (Used by internal API to propagate loc and ip) + + :param loc: Source location for MLIR, defaults to None + :type loc: Optional[Location] + :param ip: Insertion point for MLIR, defaults to None + :type ip: Optional[InsertionPoint] :return: The LLVM pointer representation :rtype: ir.Value """ @@ -1212,16 +1469,16 @@ class _Pointer(Pointer): #################################################################################################### -def _op_wrapper(op_fn, input): +def _op_wrapper(op_fn, input, *, loc=None, ip=None): from .tensor import _Tensor if isinstance(input, Tensor): - res = op_fn(input.value) - return _Tensor(res, dtype=input.element_type) + res = op_fn(input.value, loc=loc, ip=ip) + return _Tensor(res, dtype=input.element_type, loc=loc, ip=ip) elif isinstance(input, _ComposedLayout): - return op_fn(input.value) + return op_fn(input.value, loc=loc, ip=ip) else: - return op_fn(input) + return op_fn(input, loc=loc, ip=ip) # @@ -1486,17 +1743,14 @@ def assume(src, divby=None, *, loc=None, ip=None): @dsl_user_op def make_swizzle(b, m, s, *, loc=None, ip=None): # canonicalize to <0, 4, 3> for identity swizzle (as compiler assumes <0, 4, 3>) + if not isinstance(b, int) or not isinstance(m, int) or not isinstance(s, int): + raise ValueError("b, m, and s must be int") if b == 0: m, s = 4, 3 ty = ir.Type.parse(f'!cute.swizzle<"S<{b},{m},{s}>">') return Swizzle(static(ty, loc=loc, ip=ip)) -@dsl_user_op -def make_sparse_elem(num_logical, num_phys, elem_type, *, loc=None, ip=None): - return _cute_ir.SparseElemType.get(num_logical, num_phys, elem_type.mlir_type) - - @dsl_user_op def static(value, *, loc=None, ip=None): return _cute_ir.static(value, loc=loc, ip=ip) @@ -1846,7 +2100,7 @@ def group_modes(input, begin: int, end: Optional[int] = None, *, loc=None, ip=No return (*input[:begin], (input[begin:end]), *input[end:]) return _op_wrapper( - partial(_cute_ir.group_modes, begin=begin, end=end, loc=loc, ip=ip), input + partial(_cute_ir.group_modes, begin=begin, end=end), input, loc=loc, ip=ip ) @@ -1939,7 +2193,7 @@ def slice_(src, coord: Coord, *, loc=None, ip=None): return () coord_val = _pack_coord(coord, loc=loc, ip=ip) - return _op_wrapper(partial(_cute_ir.slice, coord=coord_val, loc=loc, ip=ip), src) + return _op_wrapper(partial(_cute_ir.slice, coord=coord_val), src, loc=loc, ip=ip) @overload @@ -2015,7 +2269,7 @@ def dice(src, dicer, *, loc=None, ip=None): dicer_val = _pack_coord(dicer, loc=loc, ip=ip) return _op_wrapper( - partial(_cute_ir.dice, coord=dicer_val.type.attribute, loc=loc, ip=ip), src + partial(_cute_ir.dice, coord=dicer_val.type.attribute), src, loc=loc, ip=ip ) @@ -2030,7 +2284,7 @@ def _extend(func, input, elem, up_to_rank, loc, ip): raise TypeError(f"Input type of elem ({type(elem)}) is not accepted!") N = rank(input) + 1 if up_to_rank is None else up_to_rank - return _op_wrapper(partial(func, N, element=elem, loc=loc, ip=ip), input) + return _op_wrapper(partial(func, N, element=elem), input, loc=loc, ip=ip) if is_valid_leaf(input) or isinstance(input, tuple): if elem is None: @@ -2717,9 +2971,7 @@ class _ComposedLayoutWithInnerFunc(ComposedLayout): delta = self._outer(coord) delta_val = _pack_int_tuple(delta, loc=loc, ip=ip) - offset_val_new = _cute_ir.add_offset( - self._offset_val, delta_val, loc=loc, ip=ip - ) + offset_val_new = _cute_ir.tuple_add(self._offset_val, delta_val, loc=loc, ip=ip) offset_new = _unpack_x_tuple(offset_val_new, loc=loc, ip=ip) return self._inner(offset_new) @@ -2906,7 +3158,7 @@ def coalesce(input, *, target_profile: Coord = None, loc=None, ip=None): profile_val = None return _op_wrapper( - partial(_cute_ir.coalesce, target_profile=profile_val, loc=loc, ip=ip), input + partial(_cute_ir.coalesce, target_profile=profile_val), input, loc=loc, ip=ip ) @@ -2989,15 +3241,13 @@ def idx2crd(idx, shape, *, loc=None, ip=None): import cutlass.cute as cute @cute.jit def foo(): - coord = cute.idx2crd(11, (5,4)) + coord = cute.idx2crd(11, (5, 4)) # idx2crd is always col-major # For shape (m, n, l, ...), coord = (idx % m, idx // m % n, idx // m // n % l, ... # Computed as: (11 % 5, 11 // 5 % 4) = (1, 2) print(coord) - foo() # Expected output: (1, 2) - **Note:** - Python DSL is aligned with C++ DSL. + foo() # Expected output: (1, 2) """ if is_integer(idx) and is_integer(shape): return idx @@ -3008,7 +3258,56 @@ def idx2crd(idx, shape, *, loc=None, ip=None): @dsl_user_op -def recast_layout(new_type_bits, old_type_bits, src_layout, *, loc=None, ip=None): +def recast_layout( + new_type_bits: int, + old_type_bits: int, + src_layout: Union[Layout, ComposedLayout], + *, + loc=None, + ip=None, +): + """ + Recast a layout from one data type to another. + + :param new_type_bits: The new data type bits + :type new_type_bits: int + :param old_type_bits: The old data type bits + :type old_type_bits: int + :param src_layout: The layout to recast + :type src_layout: Union[Layout, ComposedLayout] + :param loc: Optional location information for IR diagnostics. + :type loc: optional + :param ip: Optional instruction pointer or context for underlying IR functions. + :type ip: optional + :return: The recast layout + :rtype: Layout or ComposedLayout + + **Example:** + + .. code-block:: python + + import cutlass.cute as cute + @cute.jit + def foo(): + # Create a layout + L = cute.make_layout((2, 3, 4)) + # Recast the layout to a different data type + L_recast = cute.recast_layout(16, 8, L) + print(L_recast) + foo() # Expected output: (2, 3, 4) + """ + if not isinstance(new_type_bits, int): + raise TypeError( + f"new_type_bits must be an integer instead got {type(new_type_bits)}" + ) + if not isinstance(old_type_bits, int): + raise TypeError( + f"old_type_bits must be an integer instead got {type(old_type_bits)}" + ) + if not isinstance(src_layout, (Layout, ComposedLayout)): + raise TypeError( + f"src_layout must be a layout or composed layout instead got {type(src_layout)}" + ) if isinstance(src_layout, _ComposedLayout): src_layout = src_layout.value return _cute_ir.recast_layout( @@ -3086,15 +3385,14 @@ def recast_ptr( loc=None, ip=None, ) -> Pointer: + cvt_type = None if dtype is not None: - if isinstance(dtype, _cute_ir.SparseElemType): - # use SparseElemType as dtype - pass - else: + if cvt_type is None: if not isclass(dtype) or not issubclass(dtype, Numeric): raise TypeError(f"dtype must be a type of Numeric, but got {dtype}") - dtype = dtype.mlir_type + cvt_type = dtype.mlir_type + dtype = cvt_type value_type = ptr.type.value_type if dtype is None else dtype swizzle = swizzle_.type.attribute if swizzle_ is not None else None res_ty = _cute_ir.PtrType.get(value_type, ptr.memspace, ptr.alignment, swizzle) @@ -3405,7 +3703,7 @@ def logical_divide(target, tiler: Tiler, *, loc=None, ip=None): if isinstance(tiler, tuple): tiler = _pack_tile(tiler, loc=loc, ip=ip) # type: ignore return _op_wrapper( - partial(_cute_ir.logical_divide, tiler=tiler, loc=loc, ip=ip), target + partial(_cute_ir.logical_divide, tiler=tiler), target, loc=loc, ip=ip ) @@ -3420,7 +3718,7 @@ def zipped_divide(target, tiler: Tiler, *, loc=None, ip=None): if isinstance(tiler, tuple): tiler = _pack_tile(tiler, loc=loc, ip=ip) # type: ignore return _op_wrapper( - partial(_cute_ir.zipped_divide, tiler=tiler, loc=loc, ip=ip), target + partial(_cute_ir.zipped_divide, tiler=tiler), target, loc=loc, ip=ip ) @@ -3435,7 +3733,7 @@ def tiled_divide(target, tiler: Tiler, *, loc=None, ip=None): if isinstance(tiler, tuple): tiler = _pack_tile(tiler, loc=loc, ip=ip) return _op_wrapper( - partial(_cute_ir.tiled_divide, tiler=tiler, loc=loc, ip=ip), target + partial(_cute_ir.tiled_divide, tiler=tiler), target, loc=loc, ip=ip ) @@ -3450,7 +3748,7 @@ def flat_divide(target, tiler: Tile, *, loc=None, ip=None): if isinstance(tiler, tuple): tiler = _pack_tile(tiler, loc=loc, ip=ip) return _op_wrapper( - partial(_cute_ir.flat_divide, tiler=tiler, loc=loc, ip=ip), target + partial(_cute_ir.flat_divide, tiler=tiler), target, loc=loc, ip=ip ) @@ -3654,7 +3952,6 @@ def leading_dim(shape: Shape, stride: Stride) -> Union[int, Tuple[int, ...], Non return find_if(stride, pred_fn=pred_fn) - @dsl_user_op def make_layout_tv( thr_layout: Layout, val_layout: Layout, *, loc=None, ip=None @@ -3732,11 +4029,76 @@ def make_layout_tv( right_inverse(layout_mn, loc=loc, ip=ip), tmp, loc=loc, ip=ip ) - tiler_mn = product_each(layout_mn.shape, loc=loc, ip=ip) + tiler_mn = product_each(layout_mn.shape_method(loc=loc, ip=ip), loc=loc, ip=ip) return (tiler_mn, layout_tv) +@dsl_user_op +def get_nonswizzle_portion( + layout: Union[Layout, ComposedLayout], *, loc=None, ip=None +) -> Union[Layout, ComposedLayout]: + """ + Extract the non-swizzle portion from a layout. + + For a simple Layout, the entire layout is considered non-swizzled and is returned as-is. + For a ComposedLayout, the inner layout (non-swizzled portion) is extracted and returned, + effectively separating the base layout from any swizzle transformation that may be applied. + + :param layout: A Layout or ComposedLayout from which to extract the non-swizzle portion. + :type layout: Union[Layout, ComposedLayout] + :param loc: Optional location information for IR diagnostics. + :type loc: optional + :param ip: Optional + :type ip: optional + :returns: The non-swizzle portion of the input layout. For Layout objects, returns the layout itself. + For ComposedLayout objects, returns the outer layout component. + :rtype: Layout + :raises TypeError: If the layout is neither a Layout nor a ComposedLayout. + """ + if isinstance(layout, Layout): + return layout + elif isinstance(layout, ComposedLayout): + return layout.outer + else: + raise TypeError(f"expects a Layout or ComposedLayout, but got {type(layout)}") + + +@dsl_user_op +def get_swizzle_portion( + layout: Union[Layout, ComposedLayout], *, loc=None, ip=None +) -> Swizzle: + """ + Extract or create the swizzle portion from a layout. + + For a simple Layout (which has no explicit swizzle), a default identity swizzle is created. + For a ComposedLayout, the outer layout is checked and returned if it is a Swizzle object. + Otherwise, a default identity swizzle is created. The default identity swizzle has parameters + (0, 4, 3), which represents a no-op swizzle transformation. + + :param layout: A Layout or ComposedLayout from which to extract the swizzle portion. + :type layout: Union[Layout, ComposedLayout] + :param loc: Optional location information for IR diagnostics. + :type loc: optional + :param ip: Optional + :type ip: optional + :returns: The swizzle portion of the layout. For Layout objects or ComposedLayout objects without + a Swizzle outer component, returns a default identity swizzle (0, 4, 3). For ComposedLayout + objects with a Swizzle outer component, returns that swizzle. + :rtype: Swizzle + :raises TypeError: If the layout is neither a Layout nor a ComposedLayout. + """ + if isinstance(layout, Layout): + return make_swizzle(0, 4, 3, loc=loc, ip=ip) + elif isinstance(layout, ComposedLayout): + if isinstance(layout.inner, Swizzle): + return layout.inner + else: + return make_swizzle(0, 4, 3, loc=loc, ip=ip) + else: + raise TypeError(f"expects a Layout or ComposedLayout, but got {type(layout)}") + + ############################################################################## # User defined struct ############################################################################## @@ -3870,7 +4232,8 @@ class struct: self._size = size self._base = base - def data_ptr(self): + @dsl_user_op + def data_ptr(self, *, loc=None, ip=None): """ Returns start pointer to the data in this memory range. @@ -3878,9 +4241,10 @@ class struct: :raises AssertionError: If the size of the memory range is negative. """ assert self._size >= 0 - return recast_ptr(self._base, dtype=self._dtype) + return recast_ptr(self._base, dtype=self._dtype, loc=loc, ip=ip) - def get_tensor(self, layout, swizzle=None, dtype=None): + @dsl_user_op + def get_tensor(self, layout, swizzle=None, dtype=None, *, loc=None, ip=None): """ Creates a tensor from the memory range. @@ -3898,8 +4262,8 @@ class struct: if isinstance(layout, ComposedLayout) and (swizzle is not None): raise TypeError("incompatible layout with swizzle") elem_type = self._dtype if dtype is None else dtype - ptr = recast_ptr(self._base, swizzle, dtype=elem_type) - res = make_tensor(ptr, layout) + ptr = recast_ptr(self._base, swizzle, dtype=elem_type, loc=loc, ip=ip) + res = make_tensor(ptr, layout, loc=loc, ip=ip) return res def __getitem__(self, index: int) -> Any: @@ -4046,7 +4410,8 @@ class struct: self._size_of = self.align_offset(offset, alignment) # create the __init__ method for decorated struct - def __call__(self, base: Any) -> None: + @dsl_user_op + def __call__(self, base: Any, *, loc=None, ip=None) -> None: """ Creates a new instance of the decorated struct. @@ -4065,7 +4430,7 @@ class struct: if isinstance(obj, struct._AlignMeta): obj = obj.dtype if struct._is_scalar_type(obj): - new_obj = recast_ptr(base + off, dtype=obj) + new_obj = recast_ptr(base + off, dtype=obj, loc=loc, ip=ip) setattr(cls, name, new_obj) elif isinstance(obj, struct._MemRangeMeta): new_obj = struct._MemRangeData(obj._dtype, obj._size, base + off) diff --git a/python/CuTeDSL/cutlass/cute/experimental/__init__.py b/python/CuTeDSL/cutlass/cute/experimental/__init__.py new file mode 100755 index 00000000..d913a607 --- /dev/null +++ b/python/CuTeDSL/cutlass/cute/experimental/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +raise NotImplementedError( + "CuTe Experimental module is only supported on Cuda toolkit 13.1 and above!" +) diff --git a/python/CuTeDSL/cutlass/cute/export/__init__.py b/python/CuTeDSL/cutlass/cute/export/__init__.py index 9eb79612..1b9546ba 100644 --- a/python/CuTeDSL/cutlass/cute/export/__init__.py +++ b/python/CuTeDSL/cutlass/cute/export/__init__.py @@ -11,28 +11,39 @@ from .c_header_generator import CuteCHeaderGenerator -from ...base_dsl.export import ( - get_export_module, - dump_to_object as _dump_to_object, - export_to_c as _export_to_c, -) -from ...cutlass_dsl import CuTeDSL -from functools import partial as _partial -from ...cutlass_dsl.cuda_jit_executor import CudaDialectJitCompiledFunction +from .export import object_file_version as _object_file_version +from .export import CuteArgsSpecProcessor as _CuteArgsSpecProcessor -dump_to_object = _partial( - _dump_to_object, - dsl=CuTeDSL._get_dsl(), +from ...base_dsl.jit_executor import ExportProvider as _ExportProvider +from ...cutlass_dsl import CuTeDSL as _CuTeDSL +from ...cutlass_dsl.cuda_jit_executor import ( + CudaDialectJitCompiledFunction as _CudaDialectJitCompiledFunction, ) -export_to_c = _partial( - _export_to_c, - dsl=CuTeDSL._get_dsl(), +from ..._mlir._mlir_libs._cutlass_ir import _mlirExecutionEngine + +_CudaDialectJitCompiledFunction.export_provider = _ExportProvider( + dsl=_CuTeDSL, + arg_spec_processor=_CuteArgsSpecProcessor(), c_header_generator=CuteCHeaderGenerator(), - use_gpu_dialect=False, + object_file_version=_object_file_version, + mlirExecutionEngine=_mlirExecutionEngine, ) + +from ...base_dsl.export import ExternalBinaryModule as _ExternalBinaryModule +from ...base_dsl.export import LoadProvider as _LoadProvider +from .load import version_checker as _version_checker +from ..._mlir._mlir_libs._cutlass_ir._execution_engine import ( + BinaryExecutionEngine as _BinaryExecutionEngine, +) + +_ExternalBinaryModule.load_provider = _LoadProvider( + dsl=_CuTeDSL, + args_spec_processor=_CuteArgsSpecProcessor(), + version_checker=_version_checker, + execution_engine_constructor=_BinaryExecutionEngine, + jit_function_constructor=_CudaDialectJitCompiledFunction, +) + __all__ = [ "CuteCHeaderGenerator", - "get_export_module", - "dump_to_object", - "export_to_c", ] diff --git a/python/CuTeDSL/cutlass/cute/export/aot_config.py b/python/CuTeDSL/cutlass/cute/export/aot_config.py new file mode 100644 index 00000000..c143fac9 --- /dev/null +++ b/python/CuTeDSL/cutlass/cute/export/aot_config.py @@ -0,0 +1,172 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +""" +CLI tool to help with AOT compilation configuration. + +Similar to tvm-ffi-config or llvm-config, this tool provides compiler flags +for linking against CuTe DSL runtime libraries. + +Usage: + python -m cutlass.cute.export.aot_config --libdir # Returns the library directory path + python -m cutlass.cute.export.aot_config --ldflags # Returns -L flags for linking + python -m cutlass.cute.export.aot_config --libs # Returns -l flags for linking + +Examples: + # Compile and link a shared library using shell substitution + g++ -shared -o kernel.so kernel.o \\ + $(python -m cutlass.cute.export.aot_config --ldflags) \\ + $(python -m cutlass.cute.export.aot_config --libs) + + # Or using backticks + g++ -shared -o kernel.so kernel.o `python -m cutlass.cute.export.aot_config --ldflags` `python -m cutlass.cute.export.aot_config --libs` +""" + +import argparse +import sys +from pathlib import Path + + +def get_libdir() -> str: + """ + Get the library directory path containing libcuda_dialect_runtime.so. + + :return: Path to the library directory + :rtype: str + """ + from ..runtime import find_runtime_libraries + + libs = find_runtime_libraries(enable_tvm_ffi=False) + if libs: + # Return the directory containing the first library found + return str(Path(libs[0]).parent) + + return "" + + +def get_libs(enable_tvm_ffi: bool = False) -> str: + """ + Get the -l flags needed for AOT compilation linking. + + Similar to `tvm-ffi-config --libs` which returns `-ltvm_ffi`, + this returns `-lcuda_dialect_runtime` (and `-ltvm_ffi` if TVM-FFI is enabled). + + :param enable_tvm_ffi: Whether to include TVM-FFI library + :return: Space-separated -l flags (e.g., "-lcuda_dialect_runtime -ltvm_ffi") + :rtype: str + """ + from ..runtime import find_runtime_libraries + + libs = find_runtime_libraries(enable_tvm_ffi=enable_tvm_ffi) + # Convert full paths to -l flags + # e.g., /path/to/libcuda_dialect_runtime.so -> -lcuda_dialect_runtime + flags = [] + for lib in libs: + lib_path = Path(lib) + lib_name = lib_path.stem # e.g., "libcuda_dialect_runtime" + if lib_name.startswith("lib"): + lib_name = lib_name[3:] + flags.append(f"-l{lib_name}") + return " ".join(flags) + + +def get_lib_paths(enable_tvm_ffi: bool = False) -> list[str]: + """ + Get the full paths to runtime libraries. + + :param enable_tvm_ffi: Whether to include TVM-FFI library + :return: List of full library paths + :rtype: list[str] + """ + from ..runtime import find_runtime_libraries + + return find_runtime_libraries(enable_tvm_ffi=enable_tvm_ffi) + + +def get_ldflags() -> str: + """ + Get the -L flags for the linker. + + Similar to `tvm-ffi-config --ldflags` which returns `-L`. + + :return: -L flag with library directory path + :rtype: str + """ + libdir = get_libdir() + if libdir: + return f"-L{libdir}" + return "" + + +def main(): + parser = argparse.ArgumentParser( + description="AOT configuration helper for CuTe DSL (similar to tvm-ffi-config)", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Get library directory path + python -m cutlass.cute.export.aot_config --libdir + + # Get -L flags for linking + python -m cutlass.cute.export.aot_config --ldflags + + # Get -l flags for linking + python -m cutlass.cute.export.aot_config --libs + + # Compile a shared library + g++ -shared -o kernel.so kernel.o \\ + $(python -m cutlass.cute.export.aot_config --ldflags) \\ + $(python -m cutlass.cute.export.aot_config --libs) + """, + ) + + parser.add_argument( + "--libdir", + action="store_true", + help="Print the library directory path containing runtime libraries", + ) + parser.add_argument( + "--ldflags", + action="store_true", + help="Print -L flags for linking (e.g., -L/path/to/lib)", + ) + parser.add_argument( + "--libs", + action="store_true", + help="Print -l flags for linking (e.g., -lcuda_dialect_runtime)", + ) + parser.add_argument( + "--with-tvm-ffi", + action="store_true", + help="Include TVM-FFI library in --libs output (disabled by default)", + ) + + args = parser.parse_args() + + if not args.libdir and not args.ldflags and not args.libs: + parser.print_help() + sys.exit(1) + + enable_tvm_ffi = args.with_tvm_ffi + + if args.libdir: + print(get_libdir()) + + if args.ldflags: + print(get_ldflags()) + + if args.libs: + print(get_libs(enable_tvm_ffi=enable_tvm_ffi)) + + +if __name__ == "__main__": + main() + diff --git a/python/CuTeDSL/cutlass/cute/export/c_header_generator.py b/python/CuTeDSL/cutlass/cute/export/c_header_generator.py index 65a2cb13..7d5ff0e5 100644 --- a/python/CuTeDSL/cutlass/cute/export/c_header_generator.py +++ b/python/CuTeDSL/cutlass/cute/export/c_header_generator.py @@ -10,7 +10,7 @@ # is strictly prohibited. from cutlass.cute.typing import NumericMeta, Integer -from cutlass.base_dsl.export import CHeaderGenerator +from cutlass.base_dsl.export import CHeaderGenerator, CHeaderArguments from cutlass.base_dsl.dsl import is_dynamic_expression from cutlass.base_dsl.common import DSLRuntimeError from cutlass.base_dsl.jit_executor import ExecutionArgs @@ -29,6 +29,22 @@ import cuda.bindings.driver as cuda class CuteCHeaderGenerator(CHeaderGenerator): """This class provides a Export C Header Generator for cute c/cpp AOT support.""" + includes = """ +#pragma once + +#include +#include +#include +#include + +""" + cuda_error_check = r"""_CUDA_ERROR_CHECK(err) { \ + if ((err) != cudaSuccess) { \ + printf("Got Cuda Error %s: %s\n", cudaGetErrorName(err), cudaGetErrorString(err)); \ + } \ +} +""" + def _get_cute_algebra_type(self, arg_type: Any, arg: Any) -> str: """Judge if the dynamic elements of the cute algebra type are same(Int32 or Int64). If so, generate the corresponding C type. Otherwise, refuse to generate the argument @@ -65,55 +81,50 @@ class CuteCHeaderGenerator(CHeaderGenerator): """ return "" - def _generate_kernel_metadata( + def _generate_kernel_module( self, symbol_prefix: str, kernel_info: Dict[str, List], dsl_name: str ): """ - Generate the kernel metadata for the compiled function. + Generate the kernel module for the compiled function. """ - kernel_metadata_struct = f""" + kernel_module_struct = f""" typedef struct {{ - CUlibrary module; -}} {symbol_prefix}_Kernel_Metadata_t; + cudaLibrary_t module; +}} {symbol_prefix}_Kernel_Module_t; """ - kernel_metadata_load = f""" + kernel_module_load = f""" #ifdef __cplusplus extern "C" {{ #endif void _mlir_{symbol_prefix}_cuda_init(void **); -void _mlir_{symbol_prefix}_cuda_load(void **); -static inline void {symbol_prefix}_Kernel_Metadata_Load({symbol_prefix}_Kernel_Metadata_t *metadata) {{ - CUlibrary *libraryPtr = &(metadata->module); - int32_t ret; +void _mlir_{symbol_prefix}_cuda_load_to_device(void **); +static inline void {symbol_prefix}_Kernel_Module_Load({symbol_prefix}_Kernel_Module_t *module) {{ + cudaLibrary_t *libraryPtr = &(module->module); + cudaError_t ret; struct {{ - CUlibrary **libraryPtr; - int32_t *ret; + cudaLibrary_t **libraryPtr; + cudaError_t *ret; }} initArgs = {{&libraryPtr, &ret}}; _mlir_{symbol_prefix}_cuda_init((void **)(&initArgs)); - {dsl_name}_CUDA_ERROR_CHECK((CUresult)(ret)); + {dsl_name}_CUDA_ERROR_CHECK(ret); + int32_t device_id = 0; struct {{ - CUlibrary *library; - int32_t *ret; - }} loadArgs = {{libraryPtr, &ret}}; - _mlir_{symbol_prefix}_cuda_load((void **)(&loadArgs)); - {dsl_name}_CUDA_ERROR_CHECK((CUresult)(ret)); - CUdevice device; - {dsl_name}_CUDA_ERROR_CHECK(cuCtxGetDevice(&device)); - int max_shared_memory_per_block_optin; - {dsl_name}_CUDA_ERROR_CHECK(cuDeviceGetAttribute(&max_shared_memory_per_block_optin, CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN, device)); - unsigned int num_kernels; - {dsl_name}_CUDA_ERROR_CHECK(cuLibraryGetKernelCount(&num_kernels, metadata->module)); - CUkernel *kernels = (CUkernel *)malloc(num_kernels * sizeof(CUkernel)); - {dsl_name}_CUDA_ERROR_CHECK(cuLibraryEnumerateKernels(kernels, num_kernels, metadata->module)); - for (unsigned int i = 0; i < num_kernels; i++) {{ - {dsl_name}_CUDA_ERROR_CHECK(cuKernelSetAttribute(CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, max_shared_memory_per_block_optin, kernels[i], device)); + cudaLibrary_t **library; + int32_t *device_id; + cudaError_t *ret; + }} loadArgs = {{&libraryPtr, &device_id, &ret}}; + int32_t device_count; + {dsl_name}_CUDA_ERROR_CHECK(cudaGetDeviceCount(&device_count)); + for (int32_t i = 0; i < device_count; i++) {{ + device_id = i; + _mlir_{symbol_prefix}_cuda_load_to_device((void **)(&loadArgs)); + {dsl_name}_CUDA_ERROR_CHECK(ret); }} - free(kernels); }} """ - kernel_metadata_unload = f""" -static inline void {symbol_prefix}_Kernel_Metadata_Unload({symbol_prefix}_Kernel_Metadata_t *metadata) {{ - {dsl_name}_CUDA_ERROR_CHECK(cuLibraryUnload(metadata->module)); + kernel_module_unload = f""" +static inline void {symbol_prefix}_Kernel_Module_Unload({symbol_prefix}_Kernel_Module_t *module) {{ + {dsl_name}_CUDA_ERROR_CHECK(cudaLibraryUnload(module->module)); }} #ifdef __cplusplus @@ -121,7 +132,7 @@ static inline void {symbol_prefix}_Kernel_Metadata_Unload({symbol_prefix}_Kernel #endif """ - return kernel_metadata_struct + kernel_metadata_load + kernel_metadata_unload + return kernel_module_struct + kernel_module_load + kernel_module_unload def _generate_arguments( self, @@ -174,13 +185,13 @@ typedef struct {{ elif isinstance(arg_type, NumericMeta): arguments.append(self._generate_numeric_argument(arg_name, arg_type)) packed_args.append("&" + arg_name) - elif is_cute_algebra_type(arg_type): + elif is_cute_algebra_type(arg_type) or isinstance(arg, (tuple, list)): c_type = self._get_cute_algebra_type(arg_type, arg) arguments.append(f"{c_type}*{arg_name}") for i in range(self._count_dynamic_expression(arg)): packed_args.append("&" + arg_name + "[" + str(i) + "]") elif isclass(arg_type) and issubclass(arg_type, cuda.CUstream): - arguments.append("CUstream " + arg_name) + arguments.append("cudaStream_t " + arg_name) packed_args.append("&" + arg_name) else: raise DSLRuntimeError( @@ -191,24 +202,38 @@ typedef struct {{ def _generate_wrapper_function( self, + dsl_name: str, symbol_prefix: str, args_spec: ExecutionArgs, function_name: str, kernel_info: Dict[str, List], - dynamic_args: list, - dynamic_kwargs: dict, + c_header_arguments: CHeaderArguments, ): """ Generate the wrapper function for the compiled function which is provided to users as the entry point. It uses the `symbol_prefix` as the function name for identification. The host/device symbols are hidden under the bytecode. """ # 1. Get the name of the function wrapper - wrapper_function_name = f"{symbol_prefix}_wrapper" + wrapper_function_name = f"{dsl_name.lower()}_{symbol_prefix}_wrapper" capi_function_name = f"_mlir_{symbol_prefix}__mlir_ciface_{function_name}" # 2. Generate the signature of the wrapper function - arguments, packed_args, declarations = self._generate_arguments( - symbol_prefix, args_spec, dynamic_args, dynamic_kwargs - ) + if c_header_arguments.error_msg is not None: + raise DSLRuntimeError( + f"Error generating c header arguments: {c_header_arguments.error_msg}" + ) + arguments = [ + arg.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for arg in c_header_arguments.arguments + ] + packed_args = [ + arg.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for arg in c_header_arguments.packed_args + ] + declarations = [ + declaration.replace(c_header_arguments.dummy_prefix_name, symbol_prefix) + for declaration in c_header_arguments.declarations + ] + # 3. Get the return type of the wrapper function. # Note that this requires the return type to be properly annotated in python. return_type = args_spec.args_spec.annotations.get("return", None) @@ -227,7 +252,7 @@ extern "C" #endif void {capi_function_name}(void **args, int32_t num_args); -static inline {return_type} {wrapper_function_name}({symbol_prefix}_Kernel_Metadata_t *metadata, {", ".join(arguments)}) {{ +static inline {return_type} {wrapper_function_name}({symbol_prefix}_Kernel_Module_t *module, {", ".join(arguments)}) {{ {return_type} ret; void *args[{len(packed_args) + 1}] = {{ {", ".join(packed_args)}, diff --git a/python/CuTeDSL/cutlass/cute/export/export.py b/python/CuTeDSL/cutlass/cute/export/export.py new file mode 100644 index 00000000..fa27ce8b --- /dev/null +++ b/python/CuTeDSL/cutlass/cute/export/export.py @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +import os +import pickle +import copy +from ..typing import IntTuple, Shape, Stride, Coord, Tile +from inspect import FullArgSpec + +from cutlass.base_dsl.export import ( + ArgsSpecProcessor, +) + +cute_algebra_types_dump = { + IntTuple: "IntTuple", + Shape: "Shape", + Stride: "Stride", + Coord: "Coord", + Tile: "Tile", +} +cute_algebra_types_load = { + "IntTuple": IntTuple, + "Shape": Shape, + "Stride": Stride, + "Coord": Coord, + "Tile": Tile, +} + + +class CuteArgsSpecProcessor(ArgsSpecProcessor): + def dumps(self, args_spec: FullArgSpec) -> bytes: + new_args_spec = copy.deepcopy(args_spec) + for arg, arg_type in new_args_spec.annotations.items(): + if arg_type in cute_algebra_types_dump.keys(): + new_args_spec.annotations[arg] = cute_algebra_types_dump[arg_type] + return pickle.dumps(new_args_spec) + + def loads(self, args_spec_bytes: bytes) -> FullArgSpec: + args_spec = pickle.loads(args_spec_bytes) + for arg, arg_type in args_spec.annotations.items(): + if arg_type in cute_algebra_types_load.keys(): + args_spec.annotations[arg] = cute_algebra_types_load[arg_type] + return args_spec + + +# This is the version of the object file. It is used to check the version of the object file is compatible with the current dsl version or not. +object_file_version = "1.1" diff --git a/python/CuTeDSL/cutlass/cute/export/load.py b/python/CuTeDSL/cutlass/cute/export/load.py new file mode 100644 index 00000000..00e1a9b2 --- /dev/null +++ b/python/CuTeDSL/cutlass/cute/export/load.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from cutlass.base_dsl.common import DSLRuntimeError + + +def version_checker(version: str) -> bool: + """Check the version of the object file is compatible with the current dsl version or not.""" + if version not in ["1.0", "1.1"]: + raise DSLRuntimeError("Incompatible version: " + version) + return True diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/__init__.py b/python/CuTeDSL/cutlass/cute/nvgpu/__init__.py index ca08ecd4..c3e70442 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/__init__.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/__init__.py @@ -17,10 +17,17 @@ from . import tcgen05 from .common import * from .helpers import * +from . import common +from . import helpers + # __all__ is required here for documentation generation __all__ = [ - "OpError", - "MmaUniversalOp", - "CopyUniversalOp", + *common.__all__, + *helpers.__all__, + # submodules With namespace + "warp", + "cpasync", + "warpgroup", + "tcgen05", ] diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/common.py b/python/CuTeDSL/cutlass/cute/nvgpu/common.py index e2c5e830..3fa1a321 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/common.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/common.py @@ -20,9 +20,19 @@ from cutlass._mlir import ir from .. import atom from ..typing import Float16, Float32, Float64, Numeric -from cutlass import cute +__all__ = [ + "OpError", + "MmaUniversalOp", + "MmaUniversalTrait", + "CopyUniversalOp", + "CopyUniversalTrait", + "MemoryOrder", + "MemoryScope", + "CacheEvictionPriority", +] + class OpError(DSLBaseError): """ An exception class for Op construction errors. @@ -83,7 +93,7 @@ class MmaUniversalOp(atom.MmaOp): self.abacc_dtype.mlir_type, self.abacc_dtype.mlir_type, ) - return MmaUniversalTrait(cute.make_atom(atom_ty, loc=loc, ip=ip)) + return MmaUniversalTrait(atom.make_atom(atom_ty, loc=loc, ip=ip)) def _verify_fragment_A(self, input, *, loc=None, ip=None): pass @@ -140,6 +150,23 @@ class MemoryScope(enum.Enum): return self.value +class CacheEvictionPriority(enum.Enum): + EVICT_NORMAL = _cute_ir.CacheEvictionPriority.EVICT_NORMAL + EVICT_FIRST = _cute_ir.CacheEvictionPriority.EVICT_FIRST + EVICT_LAST = _cute_ir.CacheEvictionPriority.EVICT_LAST + EVICT_UNCHANGED = _cute_ir.CacheEvictionPriority.EVICT_UNCHANGED + NO_ALLOCATE = _cute_ir.CacheEvictionPriority.NO_ALLOCATE + + def __str__(self) -> str: + return f"{self.__class__.__name__}.{self.name}" + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}.{self.name}>" + + def _to_ir(self) -> _cute_ir.CacheEvictionPriority: + return self.value + + @dataclass(frozen=True) class CopyUniversalOp(atom.CopyOp): """ @@ -150,7 +177,12 @@ class CopyUniversalOp(atom.CopyOp): .. code-block:: python op = cute.nvgpu.CopyUniversalOp() - atom = cute.make_copy_atom(op, tensor_dtype, num_bits_per_copy=64) + atom = cute.make_copy_atom( + op, + tensor_dtype, + num_bits_per_copy=64, + l1c_evict_priority=cute.nvgpu.CacheEvictionPriority.EVICT_NORMAL + ) - ``tensor_dtype`` is the data type used to build the reference TV Layout (either the source \ or the destination TV Layout) in unit of tensor elements and is used for partitioning by \ @@ -158,6 +190,12 @@ class CopyUniversalOp(atom.CopyOp): - ``num_bits_per_copy`` is a kw argument specifying the number of bits to copy per Atom \ execution. This can be larger than the width of the above data type. When not provided, \ the compiler will do a best effort at auto-vectorizing. + - ``l1c_evict_priority`` is a kw argument specifying the L1 cache eviction priority hint for \ + the copy operation. Defaults to ``EVICT_NORMAL`` if not provided. + - ``invariant`` is a kw argument specifying whether the load is invariant (read-only data \ + that never changes). This enables compiler optimizations like instruction reordering. \ + Defaults to ``False`` if not provided. + """ def __str__(self) -> str: @@ -167,25 +205,27 @@ class CopyUniversalOp(atom.CopyOp): self, copy_internal_type: Type[Numeric], *, + num_bits_per_copy: int = 0, + memory_order: MemoryOrder = MemoryOrder.WEAK, + memory_scope: MemoryScope = MemoryScope.CTA, + l1c_evict_priority: CacheEvictionPriority = CacheEvictionPriority.EVICT_NORMAL, + invariant: bool = False, loc=None, ip=None, - **kwargs, ) -> "CopyUniversalTrait": - num_bits_per_copy = kwargs.get("num_bits_per_copy", 0) - memory_order = kwargs.get("memory_order", MemoryOrder.WEAK) - memory_scope = kwargs.get("memory_scope", MemoryScope.CTA) - if not isinstance(num_bits_per_copy, int) or (num_bits_per_copy < 0): + if not isinstance(num_bits_per_copy, int) or num_bits_per_copy < 0: raise ValueError( - "expects a 'num_bits_per_copy' kw argument of type int that is non-negative " - f"when creating a copy Atom for {self.__class__.__name__}" + f"'num_bits_per_copy' must be a non-negative int when creating a copy Atom for {self.__class__.__name__!r}" ) - ty = _cute_nvgpu_ir.CopyAtomSIMTSyncCopyType.get( + atom_type = _cute_nvgpu_ir.CopyAtomSIMTSyncCopyType.get( copy_internal_type.mlir_type, num_bits_per_copy, memory_order._to_ir(), memory_scope._to_ir(), + l1c_evict_priority._to_ir(), + invariant, ) - return CopyUniversalTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return CopyUniversalTrait(atom.make_atom(atom_type, loc=loc, ip=ip)) class CopyUniversalTrait(atom.Trait): diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/copy.py b/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/copy.py index 09192497..fbf9d863 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/copy.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/copy.py @@ -13,15 +13,14 @@ import enum from dataclasses import dataclass from typing import Optional, Type -from cutlass import cute from cutlass.base_dsl.arch import Arch from cutlass.cutlass_dsl import BaseDSL import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir +from cutlass._mlir.dialects.cute import ReductionOp as ReductionOp from cutlass._mlir import ir -from ...atom import CopyOp, Trait -from ...tensor import ReductionOp +from ...atom import CopyOp, Trait, make_atom from ...typing import Int16, Int64, Pointer, Integer, Numeric from ..common import OpError from ..tcgen05.mma import CtaGroup @@ -29,7 +28,7 @@ from ..tcgen05.mma import CtaGroup #################################################################################################### # -# Aynchronous copies +# Asynchronous copies # #################################################################################################### @@ -96,7 +95,7 @@ class CopyG2SOp(CopyOp): ty = _cute_nvgpu_ir.CopyAtomSIMTAsyncCopyType.get( copy_internal_type.mlir_type, self.cache_mode._to_ir(), num_bits_per_copy ) - return CopyG2STrait(cute.make_atom(ty, loc=loc, ip=ip)) + return CopyG2STrait(make_atom(ty, loc=loc, ip=ip)) class CopyG2STrait(Trait): @@ -121,7 +120,16 @@ class TmaCopyOp(CopyOp): Base class for all TMA copy operations. """ - pass + def __init__(self, smem_layout: Optional[ir.Value] = None) -> None: + self.smem_layout = smem_layout + + def __extract_mlir_values__(self): + return [self.smem_layout] + + def __new_from_mlir_values__(self, values): + res = self.__class__() + res.smem_layout = values[0] + return res # @@ -129,7 +137,7 @@ class TmaCopyOp(CopyOp): # -@dataclass(frozen=True) +@dataclass class CopyBulkTensorTileG2SOp(TmaCopyOp): """ Bulk tensor asynchrnous GMEM to SMEM Copy Operation using the TMA unit. @@ -246,7 +254,7 @@ class CopyBulkTensorTileG2STrait(Trait): # -@dataclass(frozen=True) +@dataclass class CopyBulkTensorTileG2SMulticastOp(TmaCopyOp): """ Bulk tensor asynchrnous multicast GMEM to SMEM Copy Operation using the TMA unit. @@ -375,7 +383,7 @@ class CopyBulkTensorTileG2SMulticastTrait(Trait): # -@dataclass(frozen=True) +@dataclass class CopyBulkTensorTileS2GOp(TmaCopyOp): """ Bulk tensor asynchronous SMEM to GMEM Copy Operation using the TMA unit. @@ -449,7 +457,11 @@ class CopyBulkTensorTileS2GTrait(Trait): pass -@dataclass(frozen=True) +class CopyBulkTensorTileS2GTrait(Trait): + pass + + +@dataclass class CopyReduceBulkTensorTileS2GOp(TmaCopyOp): """ Bulk tensor asynchronous SMEM to GMEM Reduction Operation using the TMA unit. @@ -585,7 +597,7 @@ class CopyBulkG2SOp(CopyOp): ty = _cute_nvgpu_ir.CopyAtomBulkCopyG2SType.get( copy_internal_type.mlir_type, num_bits_per_copy, False ) - return CopyBulkG2STrait(cute.make_atom(ty, loc=loc, ip=ip)) + return CopyBulkG2STrait(make_atom(ty, loc=loc, ip=ip)) class CopyBulkG2STrait(Trait): @@ -670,7 +682,7 @@ class CopyBulkG2SMulticastOp(CopyOp): ty = _cute_nvgpu_ir.CopyAtomBulkCopyG2SType.get( copy_internal_type.mlir_type, num_bits_per_copy, True ) - return CopyBulkG2SMulticastTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return CopyBulkG2SMulticastTrait(make_atom(ty, loc=loc, ip=ip)) class CopyBulkG2SMulticastTrait(Trait): @@ -764,8 +776,248 @@ class CopyBulkS2GOp(CopyOp): ty = _cute_nvgpu_ir.CopyAtomBulkCopyS2GType.get( copy_internal_type.mlir_type, num_bits_per_copy, False ) - return CopyBulkS2GTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return CopyBulkS2GTrait(make_atom(ty, loc=loc, ip=ip)) class CopyBulkS2GTrait(Trait): pass + + +# +# Bulk SMEM -> GMEM mask copies +# + + +@dataclass(frozen=True) +class CopyBulkS2GByteMaskOp(CopyOp): + """ + Bulk copy asynchrnous SMEM to GMEM Copy Operation with mask. + The i-th bit in the 16-bit wide byteMask operand specifies whether + the i-th byte of each 16-byte wide chunk of source data is copied to the destination. + + See the `PTX documentation `__. + """ + + def __post_init__(self) -> None: + # Arch verification + arch: Arch = CuTeDSL._get_dsl().get_arch_enum() + if not arch >= Arch.sm_100: + raise OpError( + self, + f"expects arch to be at least {Arch.sm_100.name}, but got {arch.name}", + suggestion="Ensure env CUTE_DSL_ARCH matches your GPU architecture", + ) + + def __str__(self) -> str: + res = "cp.async SMEM -> GMEM bulk copy Operation" + return res + + def _make_trait( + self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs + ) -> "CopyBulkS2GByteMaskTrait": + num_bits_per_copy = kwargs.get("num_bits_per_copy", 0) + if not isinstance(num_bits_per_copy, int) or (num_bits_per_copy < 0): + raise ValueError( + "expects a 'num_bits_per_copy' kw argument of type int that is positive " + f"when creating a copy Atom for {self.__class__.__name__}" + ) + ty = _cute_nvgpu_ir.CopyAtomBulkCopyS2GType.get( + copy_internal_type.mlir_type, num_bits_per_copy, True + ) + return CopyBulkS2GByteMaskTrait(make_atom(ty, loc=loc, ip=ip)) + + +class CopyBulkS2GByteMaskTrait(Trait): + def unpack( + self, + *, + loc=None, + ip=None, + byte_mask=None, + **kwargs, + ): + """ + Custom implementation of unpack for bulk copy store with mask. + + The bulk store with mask requires `byte_mask` keyword argument to be provided when + using `copy`. Any other kw arguments will be ignored instead of triggering an error. + """ + if not isinstance(byte_mask, Integer): + raise ValueError( + "expects a byte mask to be provided via the byte_mask kw argument" + ) + # Support for .cp_mask qualifier requires sm_100 or higher. + attr_str = f"#cute_nvgpu.atom_copy_field_bulks2g<{TMA_BYTE_MASK_FIELD_NAME}>" + attr = ir.Attribute.parse(attr_str) + val = _cute_nvgpu_ir.atom_set_value( + self.value, + attr, + Int16(byte_mask).ir_value(loc=loc, ip=ip), + loc=loc, + ip=ip, + ) + return val + + +# +# Bulk SMEM CTA to Cluster copies +# + + +@dataclass(frozen=True) +class CopyBulkS2SOp(CopyOp): + """ + Bulk copy asynchrnous SMEM CTA to Cluster Copy Operation. + + See the `PTX documentation `__. + """ + + def __post_init__(self) -> None: + # Arch verification + arch: Arch = CuTeDSL._get_dsl().get_arch_enum() + if not arch >= Arch.sm_90: + raise OpError( + self, + f"expects arch to be at least {Arch.sm_90.name}, but got {arch.name}", + suggestion="Ensure env CUTE_DSL_ARCH matches your GPU architecture", + ) + + def __str__(self) -> str: + res = "cp.async CTA -> Cluster bulk copy Operation" + return res + + def _make_trait( + self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs + ) -> "CopyBulkS2STrait": + num_bits_per_copy = kwargs.get("num_bits_per_copy", 0) + if not isinstance(num_bits_per_copy, int) or (num_bits_per_copy < 0): + raise ValueError( + "expects a 'num_bits_per_copy' kw argument of type int that is positive " + f"when creating a copy Atom for {self.__class__.__name__}" + ) + ty = _cute_nvgpu_ir.CopyAtomBulkCopyS2SType.get( + copy_internal_type.mlir_type, num_bits_per_copy + ) + return CopyBulkS2STrait(make_atom(ty, loc=loc, ip=ip)) + + +class CopyBulkS2STrait(Trait): + def unpack( + self, + *, + loc=None, + ip=None, + mbar_ptr: Optional[Pointer] = None, + cta_rank: Optional[Integer] = None, + **kwargs, + ): + """ + Custom implementation of unpack for bulk copy cta to cluster. + + The bulk cta to cluster copy requires a `mbar_ptr` and `cta_rank` keyword argument to be provided + when using `cute.copy`. Any other kw arguments will be ignored instead of triggering an error. + """ + + if not isinstance(mbar_ptr, Pointer): + raise ValueError( + "expects a pointer to an mbarrier to be provided via the mbar_ptr kw argument" + ) + if not isinstance(cta_rank, Integer): + raise ValueError( + "expects a cta rank of int32 to be provided via the cta_rank kw argument" + ) + attr_str = f"#cute_nvgpu.atom_copy_field_bulks2s<{TMA_MBAR_PTR_FIELD_NAME}>" + attr = ir.Attribute.parse(attr_str) + val = _cute_nvgpu_ir.atom_set_value( + self.value, attr, mbar_ptr.value, loc=loc, ip=ip + ) + attr_str = f"#cute_nvgpu.atom_copy_field_bulks2s<{TMA_CTA_RANK_FIELD_NAME}>" + attr = ir.Attribute.parse(attr_str) + val = _cute_nvgpu_ir.atom_set_value( + val, attr, Int32(cta_rank).ir_value(loc=loc, ip=ip), loc=loc, ip=ip + ) + return val + + +#################################################################################################### +# +# Aynchronous distributed shared memory stores +# +#################################################################################################### + +MBAR_PTR_FIELD_NAME = "mbar_ptr" + + +@dataclass(frozen=True) +class CopyDsmemStoreOp(CopyOp): + """ + Asynchronous Store operation to DSMEM with explicit synchronization. + + See the `PTX documentation `__. + """ + + def __post_init__(self) -> None: + # Arch verification + arch: Arch = CuTeDSL._get_dsl().get_arch_enum() + if not arch >= Arch.sm_90: + raise OpError( + self, + f"expects arch to be at least {Arch.sm_90.name}, but got {arch.name}", + suggestion="Ensure env CUTE_DSL_ARCH matches your GPU architecture", + ) + + def __str__(self) -> str: + res = "st.async RMEM -> DSMEM copy Operation" + return res + + def _make_trait( + self, + copy_internal_type: Type[Numeric], + *, + loc=None, + ip=None, + **kwargs, + ) -> "CopyDsmemStoreTrait": + num_bits_per_copy = kwargs.get("num_bits_per_copy", 0) + if not isinstance(num_bits_per_copy, int) or (num_bits_per_copy < 0): + raise ValueError( + "expects a 'num_bits_per_copy' kw argument of type int that is non-negative " + f"when creating a copy Atom for {self.__class__.__name__}" + ) + ty = _cute_nvgpu_ir.CopyAtomDsmemStoreType.get( + copy_internal_type.mlir_type, num_bits_per_copy + ) + return CopyDsmemStoreTrait(make_atom(ty, loc=loc, ip=ip)) + + +class CopyDsmemStoreTrait(Trait): + def unpack( + self, + *, + loc=None, + ip=None, + mbar_ptr: Optional[Pointer] = None, + **kwargs, + ): + """ + Custom implementation of unpack for dsmem async copy. + + The dsmem async copy requires `mbar_ptr` keyword argument to be provided when using `cute.copy`. + Any other kw arguments will be ignored instead of triggering an error. + """ + if not isinstance(mbar_ptr, Pointer): + raise ValueError( + "expects a pointer to an mbarrier to be provided via the mbar_ptr kw argument", + ) + attr_str = f"#cute_nvgpu.atom_copy_field_dsmem_store<{MBAR_PTR_FIELD_NAME}>" + attr = ir.Attribute.parse(attr_str) + val = _cute_nvgpu_ir.atom_set_value( + self.value, + attr, + mbar_ptr.value, + loc=loc, + ip=ip, + ) + return val + + diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/helpers.py b/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/helpers.py index de51c1e7..b724c2cd 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/helpers.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/cpasync/helpers.py @@ -10,6 +10,7 @@ # is strictly prohibited. from typing import Optional, Tuple, Type, Union +from typing_extensions import deprecated from cutlass.cutlass_dsl import dsl_user_op @@ -39,15 +40,16 @@ from .copy import ( CopyReduceBulkTensorTileS2GNonExecTrait, ) +TMAOp = Union[ + CopyBulkTensorTileG2SOp, + CopyBulkTensorTileG2SMulticastOp, + CopyBulkTensorTileS2GOp, + CopyReduceBulkTensorTileS2GOp, +] @dsl_user_op def make_tiled_tma_atom( - op: Union[ - CopyBulkTensorTileG2SOp, - CopyBulkTensorTileG2SMulticastOp, - CopyBulkTensorTileS2GOp, - CopyReduceBulkTensorTileS2GOp, - ], + op: TMAOp, gmem_tensor: Tensor, smem_layout: Union[Layout, ComposedLayout], cta_tiler: Tiler, @@ -69,37 +71,30 @@ def make_tiled_tma_atom( this function figures out the bulk tensor asynchronous copy instruction to use with the maximum "TMA vector length" to copy tiles of the GMEM tensor to/from an SMEM buffer with the provided - layout and consistent with the provided Tiler. + layout while maintaining consistency with the provided Tiler. This function returns two results: 1. the Copy Atom - 2. the so-called TMA tensor used to map logical coordinates of the GMEM tensor to coordinates \ - that the TMA unit can consume. TMA tensors have so-called basis stride elements so that the \ - associated layout can output coordinates. Otherwise, TMA tensors can be partitioned \ - similarly to any other CuTe tensors using the algebra. + 2. a TMA tensor that maps logical coordinates of the GMEM tensor to coordinates consumed by the \ + TMA unit. TMA tensors contain basis stride elements that enable their associated layout to \ + compute coordinates. Like other CuTe tensors, TMA tensors can be partitioned. - :param op: The Copy Operation to construct an Atom for - :type op: Union[CopyBulkTensorTileG2SOp, CopyBulkTensorTileG2SMulticastOp, CopyBulkTensorTileS2GOp, CopyReduceBulkTensorTileS2GOp] + :param op: The TMA Copy Operation to construct an Atom + :type op: TMAOp :param gmem_tensor: The GMEM tensor involved in the Copy :type gmem_tensor: Tensor - :param smem_layout: The SMEM layout to construct the Copy Atom for + :param smem_layout: The SMEM layout to construct the Copy Atom :type smem_layout: Union[Layout, ComposedLayout] :param cta_tiler: The CTA Tiler to use :type cta_tiler: Tiler :param num_multicast: The multicast factor :type num_multicast: int - :param internal_type: An optional parameter for the internal data type to use when the actual data type is not supported by the TMA unit + :param internal_type: Optional internal data type to use when the tensor data type is not supported by the TMA unit :type internal_type: Type[Numeric] - :return: A Copy Atom for this Operation and the associated TMA tensor + :return: A TMA Copy Atom associated with the TMA tensor :rtype: Tuple[atom.CopyAtom, Tensor] """ - - if internal_type is not None: - if not isinstance(internal_type, NumericMeta): - raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") - internal_type = internal_type.mlir_type - cta_v_map = core.composition( core.make_identity_layout(gmem_tensor.shape, loc=loc, ip=ip), cta_tiler, @@ -110,6 +105,26 @@ def make_tiled_tma_atom( if isinstance(smem_layout, core._ComposedLayout): smem_layout = smem_layout.value + # Set the smem_layout on the operation for later retrieval + op.smem_layout = ( + smem_layout.value + if isinstance(smem_layout, core._ComposedLayout) + else smem_layout + ) + + tma_format = None + if internal_type is not None: + if not isinstance(internal_type, NumericMeta): + raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") + + use_unpack = (internal_type.width == 8 and + isinstance(gmem_tensor.element_type, NumericMeta) and + gmem_tensor.element_type.width < 8) + internal_mlir_type = gmem_tensor.element_type.mlir_type if use_unpack else internal_type.mlir_type + tma_format = _cute_nvgpu_ir.TmaDataFormat( + _cute_nvgpu_ir.get_default_tma_format(internal_mlir_type, use_unpack) + ) + if isinstance(op, CopyBulkTensorTileG2SOp): if num_multicast != 1: raise ValueError( @@ -122,7 +137,7 @@ def make_tiled_tma_atom( cta_v_map, op._to_ir(), num_multicast=num_multicast, - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -139,7 +154,7 @@ def make_tiled_tma_atom( cta_v_map, op._to_ir(), num_multicast=num_multicast, - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -152,7 +167,7 @@ def make_tiled_tma_atom( gmem_tensor.value, smem_layout, cta_v_map, - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -163,7 +178,7 @@ def make_tiled_tma_atom( smem_layout, cta_v_map, op._to_ir(), - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -314,6 +329,8 @@ def fence_tma_desc_acquire( has_side_effects=True, is_align_stack=False, asm_dialect=llvm.AsmDialect.AD_ATT, + loc=loc, + ip=ip, ) @@ -342,6 +359,8 @@ def cp_fence_tma_desc_release( has_side_effects=True, is_align_stack=False, asm_dialect=llvm.AsmDialect.AD_ATT, + loc=loc, + ip=ip, ) @@ -358,10 +377,13 @@ def fence_tma_desc_release(*, loc=None, ip=None) -> None: has_side_effects=True, is_align_stack=False, asm_dialect=llvm.AsmDialect.AD_ATT, + loc=loc, + ip=ip, ) @dsl_user_op +@deprecated("`group_bulk_copy_modes` is deprecated, use `group_modes` instead") def group_bulk_copy_modes(src: Tensor, dst: Tensor, loc=None, ip=None) -> Tuple: """ Copy async bulk need group mode 0, acquiring whole tensor for bulk copy diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/helpers.py b/python/CuTeDSL/cutlass/cute/nvgpu/helpers.py index cff45047..6c786be5 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/helpers.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/helpers.py @@ -26,6 +26,11 @@ from .cpasync.copy import ( ) +__all__ = [ + "make_tiled_tma_atom_A", + "make_tiled_tma_atom_B", +] + #################################################################################################### # # TMA creation helpers for tcgen05 MMAs @@ -91,10 +96,6 @@ def make_tiled_tma_atom_A( """ - if internal_type is not None: - if not isinstance(internal_type, NumericMeta): - raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") - internal_type = internal_type.mlir_type check_type_in( op, [CopyBulkTensorTileG2SOp, CopyBulkTensorTileG2SMulticastOp], @@ -102,6 +103,13 @@ def make_tiled_tma_atom_A( "make_tiled_tma_atom_A", ) + # Set the smem_layout on the operation for later retrieval + op.smem_layout = ( + smem_layout.value + if isinstance(smem_layout, core._ComposedLayout) + else smem_layout + ) + ident = core.make_identity_layout(gmem_tensor.shape, loc=loc, ip=ip) mma_tiler_mk = (mma_tiler_mnk[0], *mma_tiler_mnk[2:]) g_tile = core.composition(ident, mma_tiler_mk, loc=loc, ip=ip) @@ -123,6 +131,19 @@ def make_tiled_tma_atom_A( if isinstance(smem_layout, core._ComposedLayout): smem_layout = smem_layout.value + tma_format = None + if internal_type is not None: + if not isinstance(internal_type, NumericMeta): + raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") + + use_unpack = (internal_type.width == 8 and + isinstance(gmem_tensor.element_type, NumericMeta) and + gmem_tensor.element_type.width < 8) + internal_mlir_type = gmem_tensor.element_type.mlir_type if use_unpack else internal_type.mlir_type + tma_format = _cute_nvgpu_ir.TmaDataFormat( + _cute_nvgpu_ir.get_default_tma_format(internal_mlir_type, use_unpack) + ) + # res[0] = the IR Value for the non-executable atom instance # res[1] = the IR Value for the associated TMA tensor res = _cute_nvgpu_ir.atom_make_non_exec_tiled_tma_load( @@ -131,7 +152,7 @@ def make_tiled_tma_atom_A( cta_v_map, op._to_ir(), num_multicast=num_multicast, - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -203,10 +224,6 @@ def make_tiled_tma_atom_B( """ - if internal_type is not None: - if not isinstance(internal_type, NumericMeta): - raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") - internal_type = internal_type.mlir_type check_type_in( op, [CopyBulkTensorTileG2SOp, CopyBulkTensorTileG2SMulticastOp], @@ -214,6 +231,13 @@ def make_tiled_tma_atom_B( "make_tiled_tma_atom_B", ) + # Set the smem_layout on the operation for later retrieval + op.smem_layout = ( + smem_layout.value + if isinstance(smem_layout, core._ComposedLayout) + else smem_layout + ) + ident = core.make_identity_layout(gmem_tensor.shape, loc=loc, ip=ip) mma_tiler_nk = (mma_tiler_mnk[1], *mma_tiler_mnk[2:]) g_tile = core.composition(ident, mma_tiler_nk, loc=loc, ip=ip) @@ -235,6 +259,19 @@ def make_tiled_tma_atom_B( if isinstance(smem_layout, core._ComposedLayout): smem_layout = smem_layout.value + tma_format = None + if internal_type is not None: + if not isinstance(internal_type, NumericMeta): + raise TypeError(f"internal_type must be a Numeric, but got {internal_type}") + + use_unpack = (internal_type.width == 8 and + isinstance(gmem_tensor.element_type, NumericMeta) and + gmem_tensor.element_type.width < 8) + internal_mlir_type = gmem_tensor.element_type.mlir_type if use_unpack else internal_type.mlir_type + tma_format = _cute_nvgpu_ir.TmaDataFormat( + _cute_nvgpu_ir.get_default_tma_format(internal_mlir_type, use_unpack) + ) + # res[0] = the IR Value for the non-executable atom instance # res[1] = the IR Value for the associated TMA tensor res = _cute_nvgpu_ir.atom_make_non_exec_tiled_tma_load( @@ -243,7 +280,7 @@ def make_tiled_tma_atom_B( cta_v_map, op._to_ir(), num_multicast=num_multicast, - internal_type=internal_type, + tma_format=tma_format, loc=loc, ip=ip, ) @@ -255,9 +292,3 @@ def make_tiled_tma_atom_B( atom.CopyAtom(op, CopyBulkTensorTileG2SMulticastNonExecTrait(res[0])), res[1], ) - - -__all__ = [ - "make_tiled_tma_atom_A", - "make_tiled_tma_atom_B", -] diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/copy.py b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/copy.py index 6a3dcaff..76b2198b 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/copy.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/copy.py @@ -13,7 +13,6 @@ import enum from dataclasses import dataclass from typing import Type -from cutlass import cute from cutlass.base_dsl.arch import Arch from cutlass.cutlass_dsl import BaseDSL @@ -21,7 +20,7 @@ import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir from cutlass._mlir import ir from ..common import OpError -from ...atom import CopyOp, Trait +from ...atom import CopyOp, Trait, make_atom from ...typing import Numeric from .mma import CtaGroup @@ -188,7 +187,7 @@ class Ld16x64bOp(_LdBase): self.repeat.value, ir.UnitAttr.get() if self.pack == Pack.PACK_16b_IN_32b else None, ) - return Ld16x64bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Ld16x64bTrait(make_atom(ty, loc=loc, ip=ip)) class Ld16x64bTrait(Trait): @@ -246,7 +245,7 @@ class Ld16x128bOp(_LdBase): self.repeat.value, ir.UnitAttr.get() if self.pack == Pack.PACK_16b_IN_32b else None, ) - return Ld16x128bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Ld16x128bTrait(make_atom(ty, loc=loc, ip=ip)) class Ld16x128bTrait(Trait): @@ -304,7 +303,7 @@ class Ld16x256bOp(_LdBase): self.repeat.value, ir.UnitAttr.get() if self.pack == Pack.PACK_16b_IN_32b else None, ) - return Ld16x256bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Ld16x256bTrait(make_atom(ty, loc=loc, ip=ip)) class Ld16x256bTrait(Trait): @@ -344,7 +343,7 @@ class Ld16x32bx2Op(_LdBase): self.repeat.value, ir.UnitAttr.get() if self.pack == Pack.PACK_16b_IN_32b else None, ) - return Ld16x32bx2Trait(cute.make_atom(ty, loc=loc, ip=ip)) + return Ld16x32bx2Trait(make_atom(ty, loc=loc, ip=ip)) class Ld16x32bx2Trait(Trait): @@ -384,7 +383,7 @@ class Ld32x32bOp(_LdBase): self.repeat.value, ir.UnitAttr.get() if self.pack == Pack.PACK_16b_IN_32b else None, ) - return Ld32x32bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Ld32x32bTrait(make_atom(ty, loc=loc, ip=ip)) class Ld32x32bTrait(Trait): @@ -478,7 +477,7 @@ class St16x64bOp(_StBase): self.repeat.value, ir.UnitAttr.get() if self.unpack == Unpack.UNPACK_32b_IN_16b else None, ) - return St16x64bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return St16x64bTrait(make_atom(ty, loc=loc, ip=ip)) class St16x64bTrait(Trait): @@ -513,7 +512,7 @@ class St16x128bOp(_StBase): self.repeat.value, ir.UnitAttr.get() if self.unpack == Unpack.UNPACK_32b_IN_16b else None, ) - return St16x128bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return St16x128bTrait(make_atom(ty, loc=loc, ip=ip)) class St16x128bTrait(Trait): @@ -548,7 +547,7 @@ class St16x256bOp(_StBase): self.repeat.value, ir.UnitAttr.get() if self.unpack == Unpack.UNPACK_32b_IN_16b else None, ) - return St16x256bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return St16x256bTrait(make_atom(ty, loc=loc, ip=ip)) class St16x256bTrait(Trait): @@ -574,7 +573,7 @@ class St16x32bx2Op(_StBase): self.repeat.value, ir.UnitAttr.get() if self.unpack == Unpack.UNPACK_32b_IN_16b else None, ) - return St16x32bx2Trait(cute.make_atom(ty, loc=loc, ip=ip)) + return St16x32bx2Trait(make_atom(ty, loc=loc, ip=ip)) class St16x32bx2Trait(Trait): @@ -600,7 +599,7 @@ class St32x32bOp(_StBase): self.repeat.value, ir.UnitAttr.get() if self.unpack == Unpack.UNPACK_32b_IN_16b else None, ) - return St32x32bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return St32x32bTrait(make_atom(ty, loc=loc, ip=ip)) class St32x32bTrait(Trait): @@ -681,7 +680,7 @@ class Cp128x256bOp(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.none, ) - return Cp128x256bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp128x256bTrait(make_atom(ty, loc=loc, ip=ip)) class Cp128x256bTrait(Trait): @@ -707,7 +706,7 @@ class Cp128x128bOp(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.none, ) - return Cp128x128bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp128x128bTrait(make_atom(ty, loc=loc, ip=ip)) class Cp128x128bTrait(Trait): @@ -733,7 +732,7 @@ class Cp4x256bOp(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.none, ) - return Cp4x256bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp4x256bTrait(make_atom(ty, loc=loc, ip=ip)) class Cp4x256bTrait(Trait): @@ -759,7 +758,7 @@ class Cp4x32x128bOp(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.x4, ) - return Cp4x32x128bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp4x32x128bTrait(make_atom(ty, loc=loc, ip=ip)) class Cp4x32x128bTrait(Trait): @@ -785,7 +784,7 @@ class Cp2x64x128b0213Op(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.lw_0213, ) - return Cp2x64x128b0213Trait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp2x64x128b0213Trait(make_atom(ty, loc=loc, ip=ip)) class Cp2x64x128b0213Trait(Trait): @@ -811,7 +810,7 @@ class Cp2x64x128b0123Op(_S2TCopyBase): self.cta_group.value, _cute_nvgpu_ir.CopyS2TBroadcast.lw_0123, ) - return Cp2x64x128b0123Trait(cute.make_atom(ty, loc=loc, ip=ip)) + return Cp2x64x128b0123Trait(make_atom(ty, loc=loc, ip=ip)) class Cp2x64x128b0123Trait(Trait): diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/helpers.py b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/helpers.py index 1439571c..b70a6ea0 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/helpers.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/helpers.py @@ -102,27 +102,17 @@ def make_smem_layout_atom( SmemLayoutAtomKind.MN_SW128_32B, ): # M/N-major layout - return core.make_composed_layout( - sw, - 0, - core.make_layout( - (num_contiguous_elems, 8), stride=(1, num_contiguous_elems) - ), - loc=loc, - ip=ip, + outer = core.make_layout( + (num_contiguous_elems, 8), stride=(1, num_contiguous_elems), loc=loc, ip=ip ) else: # K-major layout - return core.make_composed_layout( - sw, - 0, - core.make_layout( - (8, num_contiguous_elems), stride=(num_contiguous_elems, 1) - ), - loc=loc, - ip=ip, + outer = core.make_layout( + (8, num_contiguous_elems), stride=(num_contiguous_elems, 1), loc=loc, ip=ip ) + return core.make_composed_layout(sw, 0, outer, loc=loc, ip=ip) + @overload def tile_to_mma_shape( diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/mma.py b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/mma.py index 1fd4ca52..705f366f 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/mma.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/tcgen05/mma.py @@ -13,7 +13,6 @@ import enum from dataclasses import dataclass from typing import Type, Any -from cutlass import cute from cutlass.base_dsl.arch import Arch from cutlass.cutlass_dsl import BaseDSL, T @@ -24,9 +23,9 @@ from cutlass._mlir import ir from ..common import OpError from ... import core, atom from ...core import _pack_shape, rank, depth -from ...tensor import _Tensor from ...typing import ( Shape, + Tensor, Float4E2M1FN, Float8E8M0FNU, Float8E5M2, @@ -43,9 +42,7 @@ from ...typing import ( AddressSpace, Pointer, ) -from ...atom import Trait - -from ..warp.mma import SparseMetadataFormat +from ...atom import Trait, make_atom #################################################################################################### @@ -242,7 +239,7 @@ class MmaOp(Tcgen05MmaOp): + f"\n Instruction shape MNK = {self.shape_mnk}" ) - def _verify_fragment_A(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_A(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -254,7 +251,7 @@ class MmaOp(Tcgen05MmaOp): ) return True - def _verify_fragment_B(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_B(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -388,7 +385,7 @@ class BlockScaledMmaOp(Tcgen05MmaOp): + f"\n Instruction shape MNK = {self.shape_mnk}" ) - def _verify_fragment_A(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_A(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -400,7 +397,7 @@ class BlockScaledMmaOp(Tcgen05MmaOp): ) return True - def _verify_fragment_B(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_B(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -452,161 +449,6 @@ class BlockScaledMmaTraits(Trait): ) -# Base class for all tcgen05 Sparse MMA Ops with syntax `tcgen05.mma.cta_group.kind.sparse` used to factor out some internal code -@dataclass(frozen=True) -class SparseMmaOp(Tcgen05MmaOp): - a_dtype: Type[Numeric] - b_dtype: Type[Numeric] - acc_dtype: Type[Numeric] - shape_mnk: Shape - cta_group: CtaGroup - a_src: OperandSource - a_major_mode: OperandMajorMode - b_major_mode: OperandMajorMode - sparse_metadata_format: SparseMetadataFormat - - admissible_archs = Arch.filter( - lambda arch: arch.is_family_of(Arch.sm_100f) or arch.is_family_of(Arch.sm_110f) - ) - - def __post_init__(self) -> None: - # Verify arch - arch = BaseDSL._get_dsl().get_arch_enum() - if arch not in self.admissible_archs: - raise OpError( - self, - f"expects arch to be one of {self.admissible_archs}, but got {arch}", - suggestion="Ensure env CUTE_DSL_ARCH matches your GPU architecture", - ) - # Verify that the user provided enum values - if not isinstance(self.cta_group, CtaGroup): - raise OpError( - self, - "expects the 'cta_group' Op parameter to be a tcgen05.CtaGroup instance", - ) - if not isinstance(self.a_src, OperandSource): - raise OpError( - self, - "expects the 'a_src' Op parameter to be a tcgen05.OperandSource instance", - ) - if not isinstance(self.a_major_mode, OperandMajorMode): - raise OpError( - self, - "expects the 'a_major_mode' Op parameter to be a tcgen05.OperandMajorMode instance", - ) - if not isinstance(self.b_major_mode, OperandMajorMode): - raise OpError( - self, - "expects the 'b_major_mode' Op parameter to be a tcgen05.OperandMajorMode instance", - ) - if not isinstance(self.sparse_metadata_format, SparseMetadataFormat): - raise OpError( - self, - "expects the 'sparse_metadata_format' Op parameter to be a tcgen05.SparseMetadataFormat instance", - ) - # Verify the instruction shape - if (rank(self.shape_mnk) not in [2, 3]) or (depth(self.shape_mnk) != 1): - raise OpError( - self, - f"expected a flat rank 2 or 3 tuple for the 'shape_mnk' Op parameter, " - f"but got {self.shape_mnk}", - ) - m, n = self.shape_mnk[0], self.shape_mnk[1] - # For sparse MMA, the shape validation follows the same rules as dense MMA - # but the K dimension is typically doubled in the derived classes - if self.cta_group == CtaGroup.ONE: - if m not in [64, 128]: - raise OpError(self, f"expects the M-mode to be 64 or 128, but got {m}") - if m == 64: - if (n < 8) or (n > 256) or (n % 8 != 0): - raise OpError( - self, - f"expects the N-mode to satisfy 8 <= N <= 256 and N % 8 == 0, but got {n}", - ) - elif m == 128: - if (n < 16) or (n > 256) or (n % 16 != 0): - raise OpError( - self, - f"expects the N-mode to satisfy 16 <= N <= 256 and N % 16 == 0, but got {n}", - ) - else: - if m not in [128, 256]: - raise OpError(self, f"expects the M-mode to be 128 or 256, but got {m}") - if (n < 32) or (n > 256) or (n % 32 != 0): - raise OpError( - self, - f"expects the N-mode to satisfy 32 <= N <= 256 and N % 32 == 0, but got {n}", - ) - - def __str__(self) -> str: - return ( - self.__class__.descriptive_name # type: ignore - + f"\n A data type = {self.a_dtype}" - + f"\n B data type = {self.b_dtype}" - + f"\n Accumulator data type = {self.acc_dtype}" - + f"\n CTA group = {self.cta_group}" - + f"\n A source location = {self.a_src}" - + f"\n A major mode = {self.a_major_mode}" - + f"\n B major mode = {self.b_major_mode}" - + f"\n Instruction shape MNK = {self.shape_mnk}" - + f"\n Sparse metadata format = {self.sparse_metadata_format}" - ) - - def _verify_fragment_A(self, input: _Tensor, *, loc=None, ip=None): - if input.memspace == AddressSpace.smem and isinstance( - input.layout.type, _cute_ir.ComposedLayoutType - ): - raise OpError( - self, - f"Expected affine layout for {self._make_trait()}'s operand A, " - f"but got composed layout instead: {input.layout}" - f"\nPlease use recast_ptr(ptr, {input.layout.inner}, element_type) operation to move swizzle to the ptr", - ) - return True - - def _verify_fragment_B(self, input: _Tensor, *, loc=None, ip=None): - if input.memspace == AddressSpace.smem and isinstance( - input.layout.type, _cute_ir.ComposedLayoutType - ): - raise OpError( - self, - f"Expected affine layout for {self._make_trait()}'s operand B, " - f"but got composed layout instead: {input.layout}" - f"\nPlease use recast_ptr(ptr, {input.layout.inner}, element_type) operation to move swizzle to the ptr", - ) - return True - - -class SparseMmaTraits(Trait): - admissible_fields = [Field.ACCUMULATE, Field.NEGATE_A, Field.NEGATE_B] - - def set(self, field, value, *, loc=None, ip=None) -> None: - if field not in self.admissible_fields: - raise ValueError( - f"expects field to be one of {self.admissible_fields}, but got {field}" - ) - field_name = ( - f"#cute_nvgpu.atom_mma_field_sm100_sparse<{field._to_ir_field_name()}>" - ) - attr = ir.Attribute.parse(field_name) - self.value = _cute_nvgpu_ir.atom_set_value( - self.value, attr, Boolean(value).ir_value(loc=loc, ip=ip), loc=loc, ip=ip - ) - - def get(self, field, *, loc=None, ip=None) -> Any: - if field not in self.admissible_fields: - raise ValueError( - f"expects field to be one of {self.admissible_fields}, but got {field}" - ) - field_name = ( - f"#cute_nvgpu.atom_mma_field_sm100_sparse<{field._to_ir_field_name()}>" - ) - attr = ir.Attribute.parse(field_name) - return _cute_nvgpu_ir.atom_get_value( - Boolean.mlir_type, self.value, attr, loc=loc, ip=ip - ) - - # # TF32 MMA # @@ -669,7 +511,7 @@ class MmaTF32Op(MmaOp): 0, ) return MmaTF32Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -763,7 +605,7 @@ class MmaF16BF16Op(MmaOp): 0, ) return MmaF16BF16Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -780,109 +622,6 @@ class MmaF16BF16Trait(MmaTraits): pass -@dataclass(frozen=True) -class MmaF16BF16SparseOp(SparseMmaOp): - """ - F16/BF16 tcgen05 Sparse MMA Operation. - - See the `PTX documentation `__. - This Operation corresponds to the ``.kind::f16`` qualifier with sparse support. - """ - - descriptive_name = "tcgen05 F16/BF16 Sparse MMA Operation" - - def __init__( - self, - ab_dtype: Type[Numeric], - acc_dtype: Type[Numeric], - instruction_shape: Shape, - cta_group: CtaGroup, - a_src: OperandSource, - a_major_mode: OperandMajorMode, - b_major_mode: OperandMajorMode, - sparse_metadata_format: SparseMetadataFormat, - ) -> None: - super().__init__( - ab_dtype, - ab_dtype, - acc_dtype, - instruction_shape, - cta_group, - a_src, - a_major_mode, - b_major_mode, - sparse_metadata_format, - ) - self._verify() - - def _verify(self) -> None: - # Input data type verification - if self.a_dtype not in [Float16, BFloat16]: - raise OpError( - self, - "expects the 'ab_dtype' Op parameter to be one of Float16 or BFloat16", - ) - assert self.b_dtype == self.a_dtype, "a_dtype and b_dtype must be the same" - # Accumulator data type verification - if self.acc_dtype not in [Float16, Float32]: - raise OpError( - self, - "expects the 'acc_dtype' Op parameter to be one of Float16 or Float32", - ) - # Instruction shape verification - instruction_k = 32 # For sparse, K is doubled compared to dense F16/BF16 - if rank(self.shape_mnk) == 2: - object.__setattr__(self, "shape_mnk", (*self.shape_mnk, instruction_k)) - if self.shape_mnk[2] != instruction_k: - raise OpError( - self, - f"expects the instruction extent in the K-mode to be {instruction_k}, " - f"but got {self.shape_mnk[2]}", - ) - - def _make_trait(self, *, loc=None, ip=None, **kwargs) -> "MmaF16BF16SparseTrait": - shape_mnk = _pack_shape(self.shape_mnk, loc=loc, ip=ip) - ty = _cute_nvgpu_ir.MmaAtomSM100UMMASparseType.get( - shape_mnk.type.attribute, - self.cta_group.value, - self.a_major_mode._to_ir(), - self.b_major_mode._to_ir(), - self.a_dtype.mlir_type, - self.b_dtype.mlir_type, - self.acc_dtype.mlir_type, - T.ui8(), - self.sparse_metadata_format._to_ir(), - self.a_src._to_ir(), - 0, # cScaleExp - ) - - def get_e_ptr(): - ptr_type = _cute_ir.PtrType.get(T.ui8(), _cute_ir.AddressSpace.tmem, 8) - address_value = Int32(0).ir_value(loc=loc, ip=ip) - aligned_ty = _cute_ir.ConstrainedIntType.get(8, 32) - aligned_intptr = _cute_ir.assume(aligned_ty, address_value, loc=loc, ip=ip) - ui8_tmem_ptr = _cute_ir.inttoptr(ptr_type, aligned_intptr, loc=loc, ip=ip) - return ui8_tmem_ptr - - return MmaF16BF16SparseTrait( - cute.make_atom( - ty, - ( - Boolean(False).ir_value(loc=loc, ip=ip), - Boolean(False).ir_value(loc=loc, ip=ip), - Boolean(False).ir_value(loc=loc, ip=ip), - get_e_ptr().value, - ), - loc=loc, - ip=ip, - ) - ) - - -class MmaF16BF16SparseTrait(SparseMmaTraits): - pass - - # # I8 MMA # @@ -953,7 +692,7 @@ class MmaI8Op(MmaOp): 0, ) return MmaI8Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -1046,7 +785,7 @@ class MmaFP8Op(MmaOp): 0, ) return MmaFP8Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -1136,7 +875,7 @@ class MmaMXF8Op(BlockScaledMmaOp): self.sf_vec_size, ) return MmaMXF8Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -1222,7 +961,7 @@ class MmaMXF4Op(BlockScaledMmaOp): self.sf_vec_size, ) return MmaMXF4Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), @@ -1315,7 +1054,7 @@ class MmaMXF4NVF4Op(BlockScaledMmaOp): self.sf_vec_size, ) return MmaMXF4NVF4Trait( - cute.make_atom( + make_atom( ty, ( Boolean(False).ir_value(loc=loc, ip=ip), diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/warp/__init__.py b/python/CuTeDSL/cutlass/cute/nvgpu/warp/__init__.py index 36e5a3fe..6d1e3034 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/warp/__init__.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/warp/__init__.py @@ -16,9 +16,13 @@ from .mma import * # __all__ is required here for documentation generation __all__ = [ # mma.py + "Field", "MmaF16BF16Op", + "MmaMXF4Op", + "MmaMXF4NVF4Op", # copy.py "LdMatrix8x8x16bOp", + "LdMatrix16x8x8bOp", "LdMatrix16x16x8bOp", "StMatrix8x8x16bOp", "StMatrix16x8x8bOp", diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/warp/copy.py b/python/CuTeDSL/cutlass/cute/nvgpu/warp/copy.py index 26750b2b..09cde138 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/warp/copy.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/warp/copy.py @@ -12,20 +12,20 @@ from dataclasses import dataclass from typing import Type -from cutlass import cute import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir from cutlass._mlir import ir from ..common import OpError from ...core import _pack_shape -from ...typing import Numeric -from ...atom import CopyOp, Trait +from ...typing import Numeric, Optional +from ...atom import CopyOp, Trait, make_atom @dataclass(frozen=True) class BaseOp(CopyOp): transpose: bool = False num_matrices: int = 1 + unpack_bits: Optional[int] = None def __post_init__(self) -> None: if not isinstance(self.transpose, bool): @@ -41,6 +41,8 @@ class BaseOp(CopyOp): ) if self.transpose: res += "\n transposed" + if self.unpack_bits is not None: + res += f"\n unpack {self.unpack_bits}b to 8b" return res @@ -60,6 +62,8 @@ class LdMatrix8x8x16bOp(BaseOp): self, "expects the 'num_matrices' Op parameter to be one of [1,2,4]", ) + if self.unpack_bits is not None: + raise OpError(self, "Op doesn't support unpacking") def _make_trait( self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs @@ -72,46 +76,140 @@ class LdMatrix8x8x16bOp(BaseOp): self.num_matrices, ir.UnitAttr.get() if self.transpose else None, ) - return LdMatrix8x8x16bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return LdMatrix8x8x16bTrait(make_atom(ty, loc=loc, ip=ip)) class LdMatrix8x8x16bTrait(Trait): pass +@dataclass(frozen=True) +class LdMatrix8x16x8bOp(BaseOp): + """ + 8x16 ``ldmatrix`` Operation with unpacking to 8b container. + Packed source container is 16x4b elements with 64b padding + or 16x6b elements with 32b padding (total 128b per 16 elements) + + See the `PTX documentation `__. + This operation corresponds to the ``.m8n16`` and the ``.b4x16_p64``, ``.b6x16_p32`` qualifiers. + """ + + def __post_init__(self) -> None: + super().__post_init__() + if self.transpose: + raise OpError(self, "Op doesn't support transpose") + if self.num_matrices not in [1, 2, 4]: + raise OpError( + self, + "expects the 'num_matrices' Op parameter to be one of [1,2,4]", + ) + if self.unpack_bits not in [4, 6]: + raise OpError(self, "Op unpack bits must be 4 or 6") + + def _make_trait( + self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs + ) -> "LdMatrix8x16x8bTrait": + mode = _pack_shape((8, 16), loc=loc, ip=ip) + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u4x16p64to8 + if self.unpack_bits == 6: + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u6x16p32to8 + ty = _cute_nvgpu_ir.CopyAtomLdsmType.get( + copy_internal_type.mlir_type, + mode.type.attribute, + sz_pattern, + self.num_matrices, + None, + ) + return LdMatrix8x16x8bTrait(make_atom(ty, loc=loc, ip=ip)) + + +class LdMatrix8x16x8bTrait(Trait): + pass + +@dataclass(frozen=True) +class LdMatrix16x8x8bOp(BaseOp): + """ + 16x8 8b ``ldmatrix`` Operation with transpose + + There is no direct PTX correspondance to this Op. + This actually lowers to ldmatrix with the ``.m16n16`` qualifier and + additional address and value permutations to match stmatrix.m16n8.trans. + Useful for vectorizing with Ampere-style 8x8 matrix thread-value layouts + """ + + def __post_init__(self) -> None: + super().__post_init__() + if not self.transpose: + raise OpError(self, "Op only supports transpose") + if self.num_matrices not in [2, 4]: + raise OpError( + self, + "expects the 'num_matrices' Op parameter to be one of [2,4]", + ) + if self.unpack_bits not in [None, 4, 6]: + raise OpError(self, "Op unpack bits must be 4 or 6 or None") + + def _make_trait( + self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs + ) -> "LdMatrix16x8x8bTrait": + mode = _pack_shape((16, 8), loc=loc, ip=ip) + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u8 + if self.unpack_bits == 4: + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u4x16p64to8 + elif self.unpack_bits == 6: + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u6x16p32to8 + ty = _cute_nvgpu_ir.CopyAtomLdsmType.get( + copy_internal_type.mlir_type, + mode.type.attribute, + sz_pattern, + self.num_matrices, + ir.UnitAttr.get(), + ) + return LdMatrix16x8x8bTrait(make_atom(ty, loc=loc, ip=ip)) + +class LdMatrix16x8x8bTrait(Trait): + pass + @dataclass(frozen=True) class LdMatrix16x16x8bOp(BaseOp): """ - 16x16 8-bit ``ldmatrix`` Operation. - + 16x16 ``ldmatrix`` Operation with transpose and optional unpacking to 8b container. + Packed source container is 16x4b elements with 64b padding + or 16x6b elements with 32b padding (total 128b per 16 elements) + See the `PTX documentation `__. - This operation corresponds to the ``.m16n16`` and the ``.b16`` qualifiers. + This operation corresponds to the ``.m16n16`` and the ``.b4x16_p64``,``.b6x16_p32``,``.b8`` qualifiers. """ - def __init__(self, num_matrices: int) -> None: - super().__init__(transpose=True, num_matrices=num_matrices) - self._verify() - - def _verify(self): - assert self.transpose, "transpose must be True" + def __post_init__(self) -> None: + super().__post_init__() + if not self.transpose: + raise OpError(self, "Op only supports transpose") if self.num_matrices not in [1, 2]: raise OpError( self, "expects the 'num_matrices' Op parameter to be one of [1,2]", ) + if self.unpack_bits not in [None, 4, 6]: + raise OpError(self, "Op unpack bits must be 4 or 6 or None") def _make_trait( self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs ) -> "LdMatrix16x16x8bTrait": mode = _pack_shape((16, 16), loc=loc, ip=ip) + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u8 + if self.unpack_bits == 4: + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u4x16p64to8 + elif self.unpack_bits == 6: + sz_pattern = _cute_nvgpu_ir.LdsmSzPattern.u6x16p32to8 ty = _cute_nvgpu_ir.CopyAtomLdsmType.get( copy_internal_type.mlir_type, mode.type.attribute, - _cute_nvgpu_ir.LdsmSzPattern.u8, + sz_pattern, self.num_matrices, ir.UnitAttr.get(), ) - return LdMatrix16x16x8bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return LdMatrix16x16x8bTrait(make_atom(ty, loc=loc, ip=ip)) class LdMatrix16x16x8bTrait(Trait): @@ -134,6 +232,8 @@ class StMatrix8x8x16bOp(BaseOp): self, "expects the 'num_matrices' Op parameter to be one of [1,2,4]", ) + if self.unpack_bits is not None: + raise OpError(self, "Op doesn't support unpacking") def _make_trait( self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs @@ -145,7 +245,7 @@ class StMatrix8x8x16bOp(BaseOp): self.num_matrices, ir.UnitAttr.get() if self.transpose else None, ) - return StMatrix8x8x16bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return StMatrix8x8x16bTrait(make_atom(ty, loc=loc, ip=ip)) class StMatrix8x8x16bTrait(Trait): @@ -161,17 +261,17 @@ class StMatrix16x8x8bOp(BaseOp): This operation corresponds to the ``m16n8`` qualifier. """ - def __init__(self, num_matrices: int) -> None: - super().__init__(transpose=True, num_matrices=num_matrices) - self._verify() - - def _verify(self): + def __post_init__(self) -> None: + super().__post_init__() + if not self.transpose: + raise OpError(self, "Op only supports transpose") if self.num_matrices not in [1, 2, 4]: - assert self.transpose, "transpose must be True" raise OpError( self, "expects the 'num_matrices' Op parameter to be one of [1,2,4]", ) + if self.unpack_bits is not None: + raise OpError(self, "Op doesn't support unpacking") def _make_trait( self, copy_internal_type: Type[Numeric], *, loc=None, ip=None, **kwargs @@ -183,7 +283,7 @@ class StMatrix16x8x8bOp(BaseOp): self.num_matrices, ir.UnitAttr.get(), ) - return StMatrix16x8x8bTrait(cute.make_atom(ty, loc=loc, ip=ip)) + return StMatrix16x8x8bTrait(make_atom(ty, loc=loc, ip=ip)) class StMatrix16x8x8bTrait(Trait): diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/warp/mma.py b/python/CuTeDSL/cutlass/cute/nvgpu/warp/mma.py index a23dc862..145d9a88 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/warp/mma.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/warp/mma.py @@ -10,19 +10,33 @@ # is strictly prohibited. from dataclasses import dataclass -from typing import Type +from typing import Type, Any import enum from cutlass import cute +from cutlass.base_dsl.arch import Arch +from cutlass.cutlass_dsl import CuTeDSL + from ..common import OpError -from ...typing import Shape, Float16, BFloat16, Float32, Numeric +from ...typing import ( + Shape, + Float4E2M1FN, + Float8E8M0FNU, + Float8E4M3FN, + Float16, + BFloat16, + Float32, + Boolean, + Numeric, + Pointer, +) from ...core import _pack_shape -from ...tensor import _Tensor -from ...atom import MmaOp, Trait +from ...typing import Tensor +from ...atom import MmaOp, Trait, make_atom +from cutlass._mlir import ir import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir -from cutlass._mlir.dialects.cute_nvgpu import SparseMetadataFormat #################################################################################################### @@ -43,7 +57,7 @@ class WarpMmaOp(MmaOp): @dataclass(frozen=True) class MmaF16BF16Op(WarpMmaOp): """ - F16/BF16 tcgen05 MMA Operation. + F16/BF16 warp-level MMA Operation. See the `PTX documentation `__. This Operation covers the instructions using the ``.f16`` or ``.bf16`` qualifiers for the input operands. @@ -83,7 +97,7 @@ class MmaF16BF16Op(WarpMmaOp): self.ab_dtype.mlir_type, self.acc_dtype.mlir_type, ) - return MmaF16BF16Trait(cute.make_atom(ty, loc=loc, ip=ip)) + return MmaF16BF16Trait(make_atom(ty, loc=loc, ip=ip)) def __str__(self) -> str: return ( @@ -93,10 +107,10 @@ class MmaF16BF16Op(WarpMmaOp): + f"\n Instruction shape MNK = {self.shape_mnk}" ) - def _verify_fragment_A(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_A(self, input: Tensor, *, loc=None, ip=None): pass - def _verify_fragment_B(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_B(self, input: Tensor, *, loc=None, ip=None): pass @@ -104,12 +118,86 @@ class MmaF16BF16Trait(Trait): pass -class SparseMetadataFormat(enum.Enum): +# Base class for SM120 Blockscaled MMA Ops +@dataclass(frozen=True) +class MmaSM120BlockScaledOp(MmaOp): + ab_dtype: Type[Numeric] + acc_dtype: Type[Numeric] + shape_mnk: Shape + sf_type: Type[Numeric] + sf_vec_size: int + use_sf_layout_TV: bool = False + + admissible_archs = [ + "sm_120a", + ] + + def __post_init__(self) -> None: + # Verify arch + arch = CuTeDSL._get_dsl().get_arch_enum() + if not arch == Arch.sm_120a: + raise OpError( + self, + f"expects arch to be one of {self.admissible_archs}, but got {arch}", + suggestion="Ensure env CUTE_DSL_ARCH matches your GPU architecture", + ) + if self.ab_dtype != Float4E2M1FN: + raise OpError( + self, + "expects the 'ab_dtype' Op parameter to be Float4E2M1FN", + ) + if self.acc_dtype != Float32: + raise OpError( + self, + "expects the 'acc_dtype' Op parameter to be Float32", + ) + if self.shape_mnk != (16, 8, 64): + raise OpError( + self, + "expects the 'shape_mnk' Op parameter to be (16,8,64)", + ) + + if self.sf_vec_size == 16: + if self.sf_type != Float8E4M3FN: + raise OpError( + self, + "expects the 'sf_type' Op parameter to be Float8E4M3FN", + ) + elif self.sf_vec_size == 32: + if self.sf_type != Float8E8M0FNU: + raise OpError( + self, + "expects the 'sf_type' Op parameter to be Float8E8M0FNU", + ) + else: + raise OpError( + self, + "expects the 'sf_vec_size' Op parameter to be 16 or 32", + ) + def __str__(self) -> str: + return ( + "warp-level MXF4/MXF4NVF4 MMA Operation" + + f"\n A/B data type = {self.ab_dtype}" + + f"\n Accumulator data type = {self.acc_dtype}" + + f"\n Instruction shape MNK = {self.shape_mnk}" + + f"\n Vector size = {self.sf_vec_size}" + + f"\n SF data type = {self.sf_type}" + ) + + def _verify_fragment_A(self, input: Tensor, *, loc=None, ip=None): + pass + + def _verify_fragment_B(self, input: Tensor, *, loc=None, ip=None): + pass + +class Field(enum.Enum): """ - An enumeration for the sparse metadata format of the MMA. + An enumeration for the fields of the MMA Atom that can be modified at runtime. """ - TID = SparseMetadataFormat.tid + ACCUMULATE = "accum_c" + SFA = "sf_a" + SFB = "sf_b" def __str__(self) -> str: return f"{self.__class__.__name__}.{self.name}" @@ -117,66 +205,144 @@ class SparseMetadataFormat(enum.Enum): def __repr__(self) -> str: return f"<{self.__class__.__name__}.{self.name}>" - def _to_ir(self) -> _cute_nvgpu_ir.SparseMetadataFormat: + def _to_ir_field_name(self) -> str: return self.value +class MmaBlockScaledTrait(Trait): + admissible_fields = [ + Field.ACCUMULATE, + Field.SFA, + Field.SFB, + ] + + def set(self, field, value, *, loc=None, ip=None) -> None: + if field not in self.admissible_fields: + raise ValueError( + f"expects field to be one of {self.admissible_fields}, but got {field}" + ) + if field == Field.ACCUMULATE: + value = Boolean(value).ir_value(loc=loc, ip=ip) + elif field in [Field.SFA, Field.SFB]: + if not isinstance(value, Pointer): + raise ValueError( + f"expects value to be a pointer for {field}, but got {type(value).__name__}" + ) + value = value.value + + field_name = f"#cute_nvgpu.atom_mma_field_sm120_block_scaled<{field._to_ir_field_name()}>" + attr = ir.Attribute.parse(field_name) + self.value = _cute_nvgpu_ir.atom_set_value( + self.value, attr, value, loc=loc, ip=ip + ) + + def get(self, field, *, loc=None, ip=None) -> Any: + if field not in [Field.ACCUMULATE]: + raise ValueError(f"the get method for {field} is not supported") + field_name = f"#cute_nvgpu.atom_mma_field_sm120_block_scaled<{field._to_ir_field_name()}>" + attr = ir.Attribute.parse(field_name) + return _cute_nvgpu_ir.atom_get_value( + Boolean.mlir_type, self.value, attr, loc=loc, ip=ip + ) + + +# +# MXF4 MMA +# + + @dataclass(frozen=True) -class MmaF16BF16SparseOp(WarpMmaOp): - ab_dtype: Type[Numeric] - acc_dtype: Type[Numeric] - shape_mnk: Shape - sparse_metadata_format: SparseMetadataFormat +class MmaMXF4Op(MmaSM120BlockScaledOp): + """ + MXF4 warp-level MMA Operation. - def __post_init__(self) -> None: - # verify field after initialization - if not isinstance(self.sparse_metadata_format, SparseMetadataFormat): - raise OpError( - self, - "expects the 'sparse_metadata_format' Op parameter to be a SparseMetadataFormat instance", - ) - # verify the instruction shape - if self.ab_dtype not in [Float16, BFloat16]: - raise OpError( - self, - "expects the 'ab_dtype' Op parameter to be one of Float16 or BFloat16", - ) - if self.acc_dtype not in [Float16, Float32]: - raise OpError( - self, - "expects the 'acc_dtype' Op parameter to be one of Float16 or Float32", - ) - if (self.ab_dtype == BFloat16) and (self.acc_dtype != Float32): - raise OpError( - self, - "expects the 'acc_dtype' Op parameter to be Float32 when 'ab_dtype' is BFloat16", - ) - if self.shape_mnk not in [(16, 8, 16), (16, 8, 32)]: - raise OpError( - self, - "expects the 'shape_mnk' Op parameter to be one of (16,8,16) or (16,8,32)", - ) + See the `PTX documentation `__. + This Operation covers the instructions using the ``.e2m1`` qualifiers for the input operands. + .kind = {.kind::mxf4}; + .scale_vec_size = {.scale_vec::2X}; + .stype = {.ue8m0}; + """ - def _make_trait(self, *, loc=None, ip=None, **kwargs) -> "MmaF16BF16SparseTrait": + descriptive_name = "warp-level MXF4 MMA Operation" + + def __init__( + self, + ab_dtype: Type[Numeric], + acc_dtype: Type[Numeric], + sf_type: Type[Numeric], + ) -> None: + super().__init__( + ab_dtype, + acc_dtype, + (16, 8, 64), + sf_type, + 32, + ) + + def _make_trait(self, *, loc=None, ip=None, **kwargs) -> "MmaMXF4Trait": shape_mnk = _pack_shape(self.shape_mnk, loc=loc, ip=ip) - ty = _cute_nvgpu_ir.MmaAtomSM80SparseType.get( + ty = _cute_nvgpu_ir.MmaAtomSM120BlockScaledType.get( shape_mnk.type.attribute, + 32, + False, self.ab_dtype.mlir_type, self.ab_dtype.mlir_type, self.acc_dtype.mlir_type, - self.sparse_metadata_format._to_ir(), - ) - return MmaF16BF16SparseTrait(cute.make_atom(ty, loc=loc, ip=ip)) - - def __str__(self) -> str: - return ( - "warp-level F16/BF16 Sparse MMA Operation" - + f"\n A/B data type = {self.ab_dtype}" - + f"\n Accumulator data type = {self.acc_dtype}" - + f"\n Instruction shape MNK = {self.shape_mnk}" - + f"\n Sparse metadata format = {self.sparse_metadata_format}" + self.sf_type.mlir_type, ) + return MmaMXF4Trait(make_atom(ty, loc=loc, ip=ip)) -class MmaF16BF16SparseTrait(Trait): +class MmaMXF4Trait(MmaBlockScaledTrait): + pass + + +# +# MXF4NVF4 MMA +# + + +@dataclass(frozen=True) +class MmaMXF4NVF4Op(MmaSM120BlockScaledOp): + """ + MXF4NVF4 warp-level MMA Operation. + + See the `PTX documentation `__. + This Operation covers the instructions using the ``.e2m1`` qualifiers for the input operands. + .kind = {.kind::mxf4nvf4}; + .scale_vec_size = {.scale_vec::2X, .scale_vec::4X}; + .stype = {.ue8m0, .ue4m3}; + """ + + descriptive_name = "warp-level MXF4NVF4 MMA Operation" + + def __init__( + self, + ab_dtype: Type[Numeric], + acc_dtype: Type[Numeric], + sf_type: Type[Numeric], + ) -> None: + super().__init__( + ab_dtype, + acc_dtype, + (16, 8, 64), + sf_type, + 16, + ) + + def _make_trait(self, *, loc=None, ip=None, **kwargs) -> "MmaMXF4NVF4Trait": + shape_mnk = _pack_shape(self.shape_mnk, loc=loc, ip=ip) + ty = _cute_nvgpu_ir.MmaAtomSM120BlockScaledType.get( + shape_mnk.type.attribute, + 16, + False, + self.ab_dtype.mlir_type, + self.ab_dtype.mlir_type, + self.acc_dtype.mlir_type, + self.sf_type.mlir_type, + ) + return MmaMXF4NVF4Trait(make_atom(ty, loc=loc, ip=ip)) + + +class MmaMXF4NVF4Trait(MmaBlockScaledTrait): pass diff --git a/python/CuTeDSL/cutlass/cute/nvgpu/warpgroup/mma.py b/python/CuTeDSL/cutlass/cute/nvgpu/warpgroup/mma.py index a35a978f..3555790e 100644 --- a/python/CuTeDSL/cutlass/cute/nvgpu/warpgroup/mma.py +++ b/python/CuTeDSL/cutlass/cute/nvgpu/warpgroup/mma.py @@ -13,7 +13,6 @@ import enum from dataclasses import dataclass from typing import Type, Any -from cutlass import cute from cutlass.base_dsl.arch import Arch from cutlass.cutlass_dsl import BaseDSL, T @@ -23,9 +22,9 @@ from cutlass._mlir import ir from ..common import OpError from ...core import _pack_shape, rank, depth -from ...tensor import _Tensor from ...typing import ( Shape, + Tensor, Float16, BFloat16, Float32, @@ -38,7 +37,7 @@ from ...typing import ( Numeric, AddressSpace, ) -from ...atom import MmaOp, Trait +from ...atom import MmaOp, Trait, make_atom #################################################################################################### @@ -181,7 +180,7 @@ class MmaOp(WarpGroupMmaOp): + f"\n Instruction shape MNK = {self.shape_mnk}" ) - def _verify_fragment_A(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_A(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -193,7 +192,7 @@ class MmaOp(WarpGroupMmaOp): ) return True - def _verify_fragment_B(self, input: _Tensor, *, loc=None, ip=None): + def _verify_fragment_B(self, input: Tensor, *, loc=None, ip=None): if input.memspace == AddressSpace.smem and isinstance( input.layout.type, _cute_ir.ComposedLayoutType ): @@ -305,12 +304,7 @@ class MmaF16BF16Op(MmaOp): self.a_src._to_ir(), ) return MmaF16BF16Trait( - cute.make_atom( - ty, - (Boolean(False).ir_value(loc=loc, ip=ip),), - loc=loc, - ip=ip, - ) + make_atom(ty, (Boolean(False).ir_value(loc=loc, ip=ip),), loc=loc, ip=ip) ) @@ -391,12 +385,7 @@ class MmaF8Op(MmaOp): self.a_src._to_ir(), ) return MmaF8Trait( - cute.make_atom( - ty, - (Boolean(False).ir_value(loc=loc, ip=ip),), - loc=loc, - ip=ip, - ) + make_atom(ty, (Boolean(False).ir_value(loc=loc, ip=ip),), loc=loc, ip=ip) ) @@ -486,12 +475,7 @@ class MmaI8Op(MmaOp): self.a_src._to_ir(), ) return MmaI8Trait( - cute.make_atom( - ty, - (Boolean(False).ir_value(loc=loc, ip=ip),), - loc=loc, - ip=ip, - ) + make_atom(ty, (Boolean(False).ir_value(loc=loc, ip=ip),), loc=loc, ip=ip) ) diff --git a/python/CuTeDSL/cutlass/cute/runtime.py b/python/CuTeDSL/cutlass/cute/runtime.py index 4b95c16a..87082656 100644 --- a/python/CuTeDSL/cutlass/cute/runtime.py +++ b/python/CuTeDSL/cutlass/cute/runtime.py @@ -25,9 +25,19 @@ import cutlass._mlir.dialects.cuda as _cuda_dialect from cutlass.cutlass_dsl import JitArgAdapterRegistry, CuTeDSL as _CuTeDSL from cutlass.base_dsl.common import DSLRuntimeError +from cutlass.base_dsl.export import ExternalBinaryModule # Local modules imports -from .typing import AddressSpace, Layout, Tensor, Pointer, Numeric, SymInt +from .typing import ( + AddressSpace, + Layout, + Tensor, + Pointer, + Numeric, + SymInt, + Float32, + TFloat32, +) from . import core from .tensor import _Tensor as CoreTensor @@ -69,7 +79,10 @@ class _Pointer(Pointer): else: self._assumed_align = assumed_align - self._c_pointer = None + self._desc = ctypes.c_void_p(int(self._pointer)) + self._c_pointer = ctypes.addressof(self._desc) + self._c_pointers_cache = [self._c_pointer] + assert int(self._pointer) % self._assumed_align == 0, ( f"pointer must be {self._assumed_align} bytes aligned" ) @@ -85,10 +98,7 @@ class _Pointer(Pointer): return self._pointer def __c_pointers__(self): - if self._c_pointer is None: - self._desc = ctypes.c_void_p(int(self._pointer)) - self._c_pointer = ctypes.addressof(self._desc) - return [self._c_pointer] + return self._c_pointers_cache def __new_from_mlir_values__(self, values): assert len(values) == 1 @@ -151,29 +161,24 @@ class _Tensor(Tensor): self._memref_desc = None self._dtype = None self._use_32bit_stride = use_32bit_stride + self._c_pointers_cache = None @property def __class__(self) -> Type[Tensor]: # Cheat to let `type(_Tensor())` to return cute.Tensor return Tensor - def lazily_load_dltensor(func): - """Decorator to lazily load the DLTensorWrapper. + def load_dltensor(self): + """Lazily load the DLTensorWrapper. - This decorator loads the DLTensorWrapper when needed, + This function loads the DLTensorWrapper when needed, avoiding overhead in the critical path of calling JIT functions. """ + if self._dltensor_wrapper is None: + self._dltensor_wrapper = _cute_ir.DLTensorWrapper( + self._dlpack_data, self._use_32bit_stride + ) - def wrapper(self, *args, **kwargs): - if self._dltensor_wrapper is None: - self._dltensor_wrapper = _cute_ir.DLTensorWrapper( - self._dlpack_data, self._use_32bit_stride - ) - return func(self, *args, **kwargs) - - return wrapper - - @lazily_load_dltensor def mark_layout_dynamic(self, leading_dim: Optional[int] = None): """Marks the tensor layout as dynamic based on the leading dimension. @@ -193,10 +198,10 @@ class _Tensor(Tensor): :return: The tensor with dynamic layout :rtype: _Tensor """ + self.load_dltensor() self._dltensor_wrapper.mark_layout_dynamic(leading_dim) return self - @lazily_load_dltensor def mark_compact_shape_dynamic( self, mode: int, @@ -208,6 +213,7 @@ class _Tensor(Tensor): :param mode: The mode of the compact shape, defaults to 0 :type mode: int :param stride_order: Consistent with `torch.Tensor.dim_order`. Defaults to None. + Indicates the order of the modes (dimensions) if the current layout were converted to row-major order. It starts from the outermost to the innermost dimension. :type stride_order: tuple[int, ...], optional @@ -228,17 +234,18 @@ class _Tensor(Tensor): Using `torch.Tensor.dim_order()` to get the stride order of the torch tensor. .. code-block:: python - a = torch.empty(3, 4) - t = cute.runtime.from_dlpack(a) - t = t.mark_compact_shape_dynamic(mode=0, stride_order=a.dim_order()) + a = torch.empty(3, 4) + t = cute.runtime.from_dlpack(a) + t = t.mark_compact_shape_dynamic(mode=0, stride_order=a.dim_order()) """ + self.load_dltensor() self._dltensor_wrapper.mark_compact_shape_dynamic( mode, stride_order, divisibility ) return self @property - @lazily_load_dltensor def element_type(self) -> Type[Numeric]: + self.load_dltensor() if self._dtype is None: self._dtype = self._dltensor_wrapper.dtype return self._dtype @@ -274,24 +281,24 @@ class _Tensor(Tensor): self._dtype = new_type @property - @lazily_load_dltensor def memspace(self): + self.load_dltensor() return self._dltensor_wrapper.address_space @property - @lazily_load_dltensor def size_in_bytes(self) -> int: + self.load_dltensor() return self._dltensor_wrapper.size_in_bytes() @property - @lazily_load_dltensor def mlir_type(self) -> ir.Type: + self.load_dltensor() return self._dltensor_wrapper.get_type( self.element_type.mlir_type, self._assumed_align ) - @lazily_load_dltensor def __str__(self) -> str: + self.load_dltensor() return f"Tensor<0x{self._dltensor_wrapper.str}>" def __repr__(self): @@ -304,8 +311,8 @@ class _Tensor(Tensor): raise TypeError("runtime._Tensor is not indexable") @property - @lazily_load_dltensor def iterator(self): + self.load_dltensor() return _Pointer( self._dltensor_wrapper.data_ptr, self.element_type, @@ -320,13 +327,13 @@ class _Tensor(Tensor): ) @property - @lazily_load_dltensor def shape(self): + self.load_dltensor() return self._dltensor_wrapper.shape @property - @lazily_load_dltensor def stride(self): + self.load_dltensor() strides = self._dltensor_wrapper.stride if strides is None: strides = itertools.accumulate( @@ -356,28 +363,30 @@ class _Tensor(Tensor): raise TypeError("fill function is not supported in runtime") @property - @lazily_load_dltensor def data_ptr(self): + self.load_dltensor() return self._dltensor_wrapper.data_ptr @property - @lazily_load_dltensor def dynamic_shapes_mask(self): """Get the mask of dynamic shapes in the tensor.""" + self.load_dltensor() return self._dltensor_wrapper.get_dynamic_shapes_mask() @property - @lazily_load_dltensor def dynamic_strides_mask(self): """Get the mask of dynamic strides in the tensor.""" + self.load_dltensor() return self._dltensor_wrapper.get_dynamic_strides_mask() - @lazily_load_dltensor def __c_pointers__(self): - self._memref_desc = self._dltensor_wrapper.build_memref_desc( - self._assumed_align - ) - return [_cute_ir.pycapsule_get_pointer(self._memref_desc)] + if self._c_pointers_cache is None: + self.load_dltensor() + self._memref_desc = self._dltensor_wrapper.build_memref_desc( + self._assumed_align + ) + self._c_pointers_cache = [_cute_ir.pycapsule_get_pointer(self._memref_desc)] + return self._c_pointers_cache def __get_mlir_types__(self): return [self.mlir_type] @@ -480,6 +489,12 @@ class _FakeCompactTensor(Tensor): def stride(self): return self._stride + @property + def leading_dim(self): + for dim, order in enumerate(self._stride_order): + if order == 0: + return dim + @property def dynamic_shapes_mask(self): return tuple(1 if isinstance(e, SymInt) else 0 for e in self._shape) @@ -618,7 +633,8 @@ def make_fake_compact_tensor( :param shape: Shape of the tensor. :type shape: tuple[int, ...] :param stride_order: Order in which strides (memory layout) are assigned to the tensor dimensions. - If None, the default layout is col-major. Otherwise, it should be a permutation of the dimension indices. + If None, the default layout is left-to-right order (known as column-major order for flatten layout). + Otherwise, it should be a permutation order of the dimension indices. :type stride_order: tuple[int, ...], optional :param memspace: Memory space where the fake tensor resides. Optional. :type memspace: str, optional @@ -646,6 +662,9 @@ def make_fake_compact_tensor( # Compiled function will take a tensor with the type: # tensor o (100,?{div=8}):(?{i32 div=8},1)> compiled_foo = cute.compile(foo, x) + + # Default stride order is left-to-right order: (1, 8) + y = make_fake_compact_tensor(cutlass.Float32, (8, 3)) """ return _FakeCompactTensor( @@ -730,6 +749,7 @@ def from_dlpack( use_32bit_stride=False, *, enable_tvm_ffi=False, + force_tf32=False, ) -> Tensor: """Convert from tensor object supporting __dlpack__() to a CuTe Tensor. @@ -745,6 +765,8 @@ def from_dlpack( :param enable_tvm_ffi: Whether to enable TVM-FFI, defaults to False. When True, the tensor will be converted to a TVM-FFI function compatible tensor. :type enable_tvm_ffi: bool, optional + :param force_tf32: Whether to force the element type to TFloat32 if the element type is Float32. + :type force_tf32: bool, optional :return: A CuTe Tensor object :rtype: Tensor @@ -764,12 +786,15 @@ def from_dlpack( # If the environment variable `CUTE_DSL_ENABLE_TVM_FFI` is set to True, the tensor will be converted to # a TVM-FFI function compatible tensor. enable_tvm_ffi = enable_tvm_ffi or _CuTeDSL._get_dsl().envar.enable_tvm_ffi - return _Tensor( + res = _Tensor( tensor_dlpack, assumed_align=assumed_align, use_32bit_stride=use_32bit_stride, enable_tvm_ffi=enable_tvm_ffi, ) + if force_tf32 and res.element_type == Float32: + res.element_type = TFloat32 + return res def make_ptr( @@ -851,15 +876,21 @@ class TensorAdapter: def __init__(self, arg): self._arg = from_dlpack(arg).mark_layout_dynamic() + self._c_pointers_cache = None + self._mlir_types_cache = None def __new_from_mlir_values__(self, values): return self._arg.__new_from_mlir_values__(values) def __c_pointers__(self): - return self._arg.__c_pointers__() + if self._c_pointers_cache is None: + self._c_pointers_cache = self._arg.__c_pointers__() + return self._c_pointers_cache def __get_mlir_types__(self): - return self._arg.__get_mlir_types__() + if self._mlir_types_cache is None: + self._mlir_types_cache = self._arg.__get_mlir_types__() + return self._mlir_types_cache def find_runtime_libraries(*, enable_tvm_ffi: bool = True) -> List[str]: @@ -872,7 +903,7 @@ def find_runtime_libraries(*, enable_tvm_ffi: bool = True) -> List[str]: :rtype: list """ - def _get_cuda_dialect_runtime_path(): + def _get_cute_dsl_runtime_path(): libs = get_prefix_dsl_libs("CUTE_DSL") if libs is None: return None @@ -884,15 +915,15 @@ def find_runtime_libraries(*, enable_tvm_ffi: bool = True) -> List[str]: libs = libs.split(":") for path in libs: - if path.endswith("libcuda_dialect_runtime.so"): + if path.endswith("libcute_dsl_runtime.so"): return path return None libs = [] - cuda_dialect_runtime_path = _get_cuda_dialect_runtime_path() - if cuda_dialect_runtime_path: - libs.append(cuda_dialect_runtime_path) + cute_dsl_runtime_path = _get_cute_dsl_runtime_path() + if cute_dsl_runtime_path: + libs.append(cute_dsl_runtime_path) if enable_tvm_ffi: import tvm_ffi @@ -905,8 +936,8 @@ def find_runtime_libraries(*, enable_tvm_ffi: bool = True) -> List[str]: _LOAD_MODULE_LIBS_CACHE = [] -def load_module(file_path: str, *, enable_tvm_ffi: bool = True): - """Load a module from a file path. Today only support TVM-FFI module. +def load_module(file_path: str, *, enable_tvm_ffi: bool = False): + """Load a module from a file path. :param file_path: The path to the module file :type file_path: str @@ -937,9 +968,7 @@ def load_module(file_path: str, *, enable_tvm_ffi: bool = True): # compatible with tvm-ffi < 0.1.6 return tvm_ffi.load_module(file_path) else: - raise DSLRuntimeError( - "Unimplemented, please load the module with enable_tvm_ffi=True." - ) + return ExternalBinaryModule(file_path) # ------------------------------------------------------------------------- # Try to register_jit_arg_adapter for TensorAdapter diff --git a/python/CuTeDSL/cutlass/cute/tensor.py b/python/CuTeDSL/cutlass/cute/tensor.py index d24295a8..a8f0ff7b 100644 --- a/python/CuTeDSL/cutlass/cute/tensor.py +++ b/python/CuTeDSL/cutlass/cute/tensor.py @@ -28,6 +28,30 @@ from cutlass._mlir.dialects.cute import ReductionOp as ReductionOp import cutlass._mlir.dialects.cute_nvgpu as _cute_nvgpu_ir from cutlass._mlir.dialects import vector, arith +from .typing import ( + Numeric, + Integer, + Boolean, + Int4, + Uint8, + Int8, + Int32, + Int64, + BFloat16, + IntTuple, + Coord, + Shape, + Stride, + Pointer, + Layout, + ComposedLayout, + Tensor, + AddressSpace, + is_integer, + is_int_tuple, + as_numeric, +) + from .core import ( _unpack_x_tuple, _pack_int_tuple, @@ -82,6 +106,29 @@ from .tuple import transform_leaf, product, product_like, flatten_to_tuple from .arch import cvt_i8_bf16_intrinsic, cvt_i4_bf16_intrinsic, cvt_f4e2m1_f16_intrinsic +__all__ = [ + "TensorSSA", + "ReductionOp", + "make_tensor", + "make_identity_tensor", + "make_fragment", + "make_fragment_like", + "make_rmem_tensor_like", + "make_rmem_tensor", + "recast_tensor", + "domain_offset", + "print_tensor", + "full", + "full_like", + "empty_like", + "ones_like", + "zeros_like", + "where", + "any_", + "all_", +] + + @ir.register_value_caster(_cute_ir.MemRefType.get_static_typeid(), replace=True) @ir.register_value_caster(_cute_ir.CoordTensorType.get_static_typeid(), replace=True) @ir.register_value_caster( @@ -132,8 +179,9 @@ class _Tensor(Tensor): iter_val = _cute_ir.get_iter(self.value, loc=loc, ip=ip) if isinstance(iter_val, Pointer): self._iterator = iter_val - elif isinstance(iter_val.type, _cute_ir.IntTupleType): - self._iterator = _unpack_x_tuple(iter_val) + elif isinstance(iter_val.type, _cute_ir.ArithTupleIteratorType): + itup_val = _cute_ir.deref_arith_tuple_iter(iter_val) + self._iterator = _unpack_x_tuple(itup_val) elif isinstance(iter_val, ir.Value): # Example: SMEM descriptor iterator, not well supported today self._iterator = iter_val @@ -152,6 +200,9 @@ class _Tensor(Tensor): else: raise TypeError(f"unsupported iterator type, got {type(self.iterator)}") + def __repr__(self): + return self.__str__() + def __str__(self): from .core import pretty_str @@ -257,7 +308,8 @@ class _Tensor(Tensor): res = _cute_ir.get_iter( slice_(self, crd, loc=loc, ip=ip).value, loc=loc, ip=ip ) - return _unpack_x_tuple(res, loc=loc, ip=ip) + itup_val = _cute_ir.deref_arith_tuple_iter(res) + return _unpack_x_tuple(itup_val) else: self._check_can_load_store() self._check_can_dereference() @@ -387,9 +439,10 @@ class _Tensor(Tensor): return _cute_ir.get_layout(self.value, loc=loc, ip=ip) @property + @dsl_user_op @lru_cache_ir() - def shape(self) -> Shape: - return self.layout.shape + def shape(self, *, loc=None, ip=None) -> Shape: + return self.layout.shape_method(loc=loc, ip=ip) @property @lru_cache_ir() @@ -633,7 +686,7 @@ def make_tensor( """ if isinstance(layout, _ComposedLayoutWithInnerFunc): raise ValueError( - "CuTe DSL tensor does not support composed layouts with inner functions: {layout}" + f"CuTe DSL tensor does not support composed layouts with inner functions: {layout}" ) if not isinstance(layout, (Layout, ComposedLayout)): @@ -644,8 +697,12 @@ def make_tensor( res_ty = None if is_integer(iterator) or isinstance(iterator, tuple): - iterator = _pack_int_tuple(iterator, loc=loc, ip=ip) - res_ty = _cute_ir.CoordTensorType.get(iterator.type, layout.type) + itup_val = _pack_int_tuple(iterator, loc=loc, ip=ip) + iter_ty = _cute_ir.ArithTupleIteratorType.get(itup_val.type) + iterator = _cute_ir.make_arith_tuple_iter( + iter=iter_ty, value=itup_val, loc=loc, ip=ip + ) + res_ty = _cute_ir.CoordTensorType.get(itup_val.type, layout.type) elif isinstance(iterator, Pointer): iterator = iterator.value res_ty = _cute_ir.MemRefType.get(iterator.type, layout.type) @@ -773,7 +830,7 @@ def make_fragment( @dsl_user_op def make_rmem_tensor_like( - src: Union[Layout, ComposedLayout, Tensor], + src: Union[Layout, ComposedLayout, Tensor, "TensorSSA"], dtype: Optional[Type[Numeric]] = None, *, loc=None, @@ -826,7 +883,7 @@ def make_rmem_tensor_like( create register storage for intermediate results. """ - if not isinstance(src, (Layout, ComposedLayout, Tensor)): + if not isinstance(src, (Layout, ComposedLayout, Tensor, TensorSSA)): raise TypeError( f"src must be a Layout or ComposedLayout or Tensor, got {type(src)}" ) @@ -844,6 +901,9 @@ def make_rmem_tensor_like( else: res_dtype = dtype or src.element_type src_layout = src.layout + elif isinstance(src, TensorSSA): + res_dtype = dtype or src.element_type + src_layout = make_layout(src.shape, loc=loc, ip=ip) else: if dtype is None: raise ValueError("dtype must be provided when src is a layout") @@ -918,7 +978,7 @@ def domain_offset(coord: Coord, tensor: Tensor, *, loc=None, ip=None) -> Tensor: ip=ip, ) elif is_integer(tensor.iterator) or isinstance(tensor.iterator, tuple): - new_iter = _cute_ir.add_offset( + new_iter = _cute_ir.tuple_add( _pack_int_tuple(tensor.iterator, loc=loc, ip=ip), _pack_int_tuple(offset, loc=loc, ip=ip), loc=loc, @@ -1136,10 +1196,12 @@ class TensorSSA(cutlass_arith.ArithValue): def _apply_op( self, op, other: "TensorSSA", flip=False, *, loc, ip ) -> "TensorSSA": ... + @overload def _apply_op( self, op, other: cutlass_arith.ArithValue, flip=False, *, loc, ip ) -> "TensorSSA": ... + @overload def _apply_op( self, op, other: Union[int, float, bool], flip=False, *, loc, ip diff --git a/python/CuTeDSL/cutlass/cute/testing.py b/python/CuTeDSL/cutlass/cute/testing.py index 8cbc339a..9b99209f 100644 --- a/python/CuTeDSL/cutlass/cute/testing.py +++ b/python/CuTeDSL/cutlass/cute/testing.py @@ -22,12 +22,24 @@ import cuda.bindings.runtime as cuda_runtime import cutlass import cutlass.base_dsl.jit_executor -from cutlass.cutlass_dsl import Constexpr, CuTeDSL, T, dsl_user_op +import cutlass.cutlass_dsl.cuda_jit_executor +from cutlass.cutlass_dsl import Constexpr, CuTeDSL, T, dsl_user_op, const_expr -from .typing import Numeric, Int8, Boolean +from .typing import Numeric, Int8, Boolean, Tensor, Layout, Shape -import cutlass.cute as cute -from cutlass.cute import nvgpu +from . import nvgpu +from .core import recast_layout, make_layout, composition, get, rank, size, zipped_divide +from .tuple import elem_less +from .tensor import ( + make_rmem_tensor, + recast_tensor, + make_identity_tensor, + TensorSSA, + _Tensor, +) +from .atom import make_copy_atom +from .algorithm import copy +from .runtime import from_dlpack from cutlass._mlir.dialects import builtin, cf, nvvm, vector @@ -37,14 +49,252 @@ def assert_(cond, msg=None, *, loc=None, ip=None): cf.assert_(Boolean(cond).ir_value(), msg if msg else "", loc=loc, ip=ip) -def _maybe_recast_tensor_from_f4(src: cute.Tensor, tv_layout: cute.Layout): +################################################ +# Runtime Assertion Helper Utilities For Testing +################################################ + + +class AssertionError(RuntimeError): + """Custom assertion error for runtime assertions.""" + + pass + + +class Assertion: + """Base class for runtime assertion.""" + + pass + + +class _CompileTimeAssertion(Assertion): + """Compile-time assertion helper that tracks assertion results during execution. + + This assertion is used internally when RuntimeAssertion is passed through + JIT compilation. It stores assertion results in a tensor and provides compile-time + tracking of assertion results. + """ + + def __init__( + self, + tensor: _Tensor, + num_assertions: int = 1, + msgs=None, + device=None, + disable: bool = False, + init_value: bool = False, + used_indices: set = None, + ): + """Initialize _CompileTimeAssertion. + + :param tensor: Tensor to store assertion results + :param num_assertions: Number of assertions to support + :param msgs: List of assertion messages + :param device: Device to run assertions on + :param disable: If True, assertions are disabled + :param init_value: Initial value for assertion tensor + :param used_indices: Set of used assertion indices + """ + if msgs is None: + msgs = [] + self._tensor = tensor + self._num_assertions = num_assertions + self._device = device + self._disable = disable + self._msgs = msgs + self._init_value = init_value + self._used_indices = used_indices + + def __new_from_mlir_values__(self, values): + if self._disable: + return _CompileTimeAssertion( + None, + self._num_assertions, + self._msgs, + self._device, + self._disable, + self._init_value, + self._used_indices, + ) + return _CompileTimeAssertion( + _Tensor(values[0], dtype=Boolean), + self._num_assertions, + self._msgs, + self._device, + self._disable, + self._init_value, + self._used_indices, + ) + + def __extract_mlir_values__(self): + if self._disable: + return [] + return self._tensor.__extract_mlir_values__() + + @dsl_user_op + @CuTeDSL.jit + def store(self, idx: Constexpr, pred: Boolean, msg: str = "", *, loc=None, ip=None): + """Assert a predicate condition. + + :param idx: Assertion index + :type idx: int + :param pred: Predicate condition to assert + :type pred: Boolean + :param msg: Assertion message + :type msg: str, optional + :param loc: MLIR location information for debugging, defaults to None + :type loc: optional + :param ip: MLIR insertion point for code generation, defaults to None + :type ip: optional + """ + if const_expr(self._disable): + return + if const_expr(not isinstance(idx, int)): + raise ValueError(f"expects idx to be 'int', but got {type(idx)}") + if const_expr(idx >= self._num_assertions): + raise ValueError(f"please increase the number of assertions!!!") + if const_expr(self._init_value is True): + self._tensor[idx] = pred and self._tensor[idx] + else: + self._tensor[idx] = pred + self._msgs[idx] = f"{msg}\nAt {loc}" + self._used_indices.add(idx) + + def __enter__(self): + """Enter context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exit context manager and verify assertions if no exception occurred.""" + # Only verify if there was no exception in the with block + if exc_type is None and not self._disable: + # _CompileTimeAssertion doesn't have verify method as it's checked at compile time + pass + return False # Don't suppress exceptions + + +class RuntimeAssertion(Assertion): + """Runtime assertion helper that verifies conditions at runtime. + ```python + There are two modes to use RuntimeAssertion: + 1. Manual mode - explicitly call verify(): + ```python + @cute.jit + def jit_func(assertions: Assertion): + assertions.store(0, pred, "assertion failed") + assertions = cute.testing.RuntimeAssertion(num_assertions=1) + jit_func(assertions) + assertions.verify() + ``` + + 2. Context manager mode - automatically verifies on exit: + ```python + with cute.testing.RuntimeAssertion(num_assertions=1) as assertions: + jit_func(assertions) + # verify() is called automatically after the with block + ``` + """ + + def __init__( + self, + num_assertions: int = 1, + device=None, + disable: bool = False, + init_value: bool = False, + ): + """Initialize _RuntimeAssertion. + + :param num_assertions: Number of assertions to support + :param device: Device to run assertions on (None for CPU, "cuda" for GPU) + :param disable: If True, assertions are disabled + :param init_value: Initial value for assertion tensor + """ + self._num_assertions = num_assertions + self._device = device + self._disable = disable + self._msgs = [""] * num_assertions + self._init_value = init_value + self._used_indices = set() + if self._disable: + return + import torch + + self._torch_tensor = torch.full( + (self._num_assertions,), + device=self._device, + dtype=torch.bool, + fill_value=init_value, + ) + self._tensor = from_dlpack(self._torch_tensor) + + def __c_pointers__(self): + """Get C pointers for passing to JIT functions.""" + if self._disable: + return [] + return self._tensor.__c_pointers__() + + def __get_mlir_types__(self): + """Get MLIR types for code generation.""" + if self._disable: + return [] + return self._tensor.__get_mlir_types__() + + def __new_from_mlir_values__(self, values): + """Create new instance from MLIR values (for JIT compilation).""" + if self._disable: + return _CompileTimeAssertion( + None, + self._num_assertions, + self._msgs, + self._device, + self._disable, + self._init_value, + self._used_indices, + ) + return _CompileTimeAssertion( + _Tensor(values[0], dtype=Boolean), + self._num_assertions, + self._msgs, + self._device, + self._disable, + self._init_value, + self._used_indices, + ) + + def verify(self): + """Verify all assertions have passed.""" + if self._disable: + return + import torch + + if self._device is not None: + torch.cuda.synchronize() + false_indices = torch.where(self._torch_tensor == False)[0].tolist() + valid_indices = [idx for idx in false_indices if idx in self._used_indices] + if len(valid_indices) > 0: + # emit the first assertion error. + raise AssertionError(self._msgs[valid_indices[0]]) + + def __enter__(self): + """Enter the context manager, returns self for use in 'with' statement.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exit the context manager, automatically calls verify().""" + if exc_type is None: + # Only verify if no exception occurred in the with block + self.verify() + # Return False to propagate any exception that occurred + return False + + +def _maybe_recast_tensor_from_f4(src: Tensor, tv_layout: Layout): if src.element_type.width == 4: - tv_layout = cute.recast_layout(8, 4, tv_layout) - src = cute.recast_tensor(src, dtype=Int8) + tv_layout = recast_layout(8, 4, tv_layout) + src = recast_tensor(src, dtype=Int8) return src, tv_layout -def _maybe_recast_to_f4(input: cute.TensorSSA, dtype: Type[Numeric]): +def _maybe_recast_to_f4(input: TensorSSA, dtype: Type[Numeric]): """Conditionally recasts the tensor to 4-bit type if the destination type is 4-bit. :param input: The input tensor to recast. @@ -56,18 +306,18 @@ def _maybe_recast_to_f4(input: cute.TensorSSA, dtype: Type[Numeric]): raise TypeError(f"dst_ty must be a type of Numeric, but got {dtype}") if dtype.width == 4: - recast_shape = cute.recast_layout(4, 8, cute.make_layout(input.shape)).shape + recast_shape = recast_layout(4, 8, make_layout(input.shape)).shape i4_vec = vector.bitcast( T.vector(input.type.shape[0] * 2, T.i(4)), input.maybe_downcast() ) res_vect = builtin.unrealized_conversion_cast( [T.vector(i4_vec.type.shape[0], dtype.mlir_type)], [i4_vec] ) - return cute.TensorSSA(res_vect, recast_shape, dtype) + return TensorSSA(res_vect, recast_shape, dtype) return input -def _maybe_recast_from_f4(input: cute.TensorSSA, src_dtype: Type[Numeric]): +def _maybe_recast_from_f4(input: TensorSSA, src_dtype: Type[Numeric]): """Conditionally recasts the tensor from 4-bit type if the source type is 4-bit. :param input: The input tensor to recast. @@ -79,23 +329,23 @@ def _maybe_recast_from_f4(input: cute.TensorSSA, src_dtype: Type[Numeric]): raise TypeError(f"src_ty must be a type of Numeric, but got {src_dtype}") if src_dtype.width == 4: - recast_shape = cute.recast_layout(8, 4, cute.make_layout(input.shape)).shape + recast_shape = recast_layout(8, 4, make_layout(input.shape)).shape i4_vec = builtin.unrealized_conversion_cast( [T.vector(input.type.shape[0], T.i(4))], [input.maybe_downcast()] ) res_vect = vector.bitcast(T.vector(i4_vec.type.shape[0] // 2, T.i8()), i4_vec) - return cute.TensorSSA(res_vect, recast_shape, Int8) + return TensorSSA(res_vect, recast_shape, Int8) return input @CuTeDSL.kernel def _convert_kernel( - gSrc: cute.Tensor, - gDst: cute.Tensor, - cSrc: cute.Tensor, - src_tv_layout: cute.Layout, - dst_tv_layout: cute.Layout, - src_shape: cute.Shape, + gSrc: Tensor, + gDst: Tensor, + cSrc: Tensor, + src_tv_layout: Layout, + dst_tv_layout: Layout, + src_shape: Shape, src_ty, dst_ty, ): @@ -111,9 +361,9 @@ def _convert_kernel( # compose with CTA TV layout # tid, vid -> address - tidfrgSrc = cute.composition(ctaSrc, src_tv_layout) # (T,V) - tidfrgDst = cute.composition(ctaDst, dst_tv_layout) # (T,V) - tidfrgCSrc = cute.composition(ctaCSrc, src_tv_layout) # (T,V) + tidfrgSrc = composition(ctaSrc, src_tv_layout) # (T,V) + tidfrgDst = composition(ctaDst, dst_tv_layout) # (T,V) + tidfrgCSrc = composition(ctaCSrc, src_tv_layout) # (T,V) # print(f"tidfrgSrc = {tidfrgSrc.type}") # slice for threads @@ -124,19 +374,19 @@ def _convert_kernel( # print(f"thrSrc = {thrSrc.type}") # predicate - if cute.elem_less(thrCSrc[0], src_shape): + if elem_less(thrCSrc[0], src_shape): # allocate fragments for gmem->rmem - frgSrc = cute.make_rmem_tensor( - cute.get(src_tv_layout, mode=[1]), gSrc.element_type + frgSrc = make_rmem_tensor( + get(src_tv_layout, mode=[1]), gSrc.element_type ) # (V) - frgDst = cute.make_rmem_tensor( - cute.get(dst_tv_layout, mode=[1]), gDst.element_type + frgDst = make_rmem_tensor( + get(dst_tv_layout, mode=[1]), gDst.element_type ) # (V) # print(f"frgSrc = {frgSrc.type}") # Move data to reg address space - copy_atom_load = cute.make_copy_atom(nvgpu.CopyUniversalOp(), gSrc.element_type) - cute.copy(copy_atom_load, thrSrc, frgSrc) + copy_atom_load = make_copy_atom(nvgpu.CopyUniversalOp(), gSrc.element_type) + copy(copy_atom_load, thrSrc, frgSrc) vec_src = frgSrc.load() vec_src = _maybe_recast_to_f4(vec_src, src_ty) @@ -145,14 +395,14 @@ def _convert_kernel( frgDst.store(vec_dst) # Copy the results back to c - copy_atom_stg = cute.make_copy_atom(nvgpu.CopyUniversalOp(), gDst.element_type) - cute.copy(copy_atom_stg, frgDst, thrDst) + copy_atom_stg = make_copy_atom(nvgpu.CopyUniversalOp(), gDst.element_type) + copy(copy_atom_stg, frgDst, thrDst) @CuTeDSL.jit(preprocess=False) def _convert( - src: cute.Tensor, - dst: cute.Tensor, + src: Tensor, + dst: Tensor, leading_mode: Constexpr, elem_per_copy: Constexpr, ): @@ -160,35 +410,29 @@ def _convert( src_ty = src.element_type dst_ty = dst.element_type - tv_layout = cute.make_layout((128, elem_per_copy), stride=(elem_per_copy, 1)) + tv_layout = make_layout((128, elem_per_copy), stride=(elem_per_copy, 1)) # Step 2. maybe recast from f4 tensor src, src_tv_layout = _maybe_recast_tensor_from_f4(src, tv_layout) dst, dst_tv_layout = _maybe_recast_tensor_from_f4(dst, tv_layout) src_shape = src.shape # predicate tensor - idA = cute.make_identity_tensor(src.shape) + idA = make_identity_tensor(src.shape) # Step 3. select a proper tiling pattern as (...,TileV, ...) src_cta_tiler = [ 1, - ] * cute.rank(src.layout) - src_cta_tiler[leading_mode] = cute.size(src_tv_layout) # (...,TileV,...) + ] * rank(src.layout) + src_cta_tiler[leading_mode] = size(src_tv_layout) # (...,TileV,...) dst_cta_tiler = [ 1, - ] * cute.rank(dst.layout) - dst_cta_tiler[leading_mode] = cute.size(dst_tv_layout) # (...,TileV,...) + ] * rank(dst.layout) + dst_cta_tiler[leading_mode] = size(dst_tv_layout) # (...,TileV,...) # Step 4. partition input and output tensor by cta tiler. - gS = cute.zipped_divide( - src, tuple(src_cta_tiler) - ) # ((...,TileV,...),(...,RestV,...)) - cS = cute.zipped_divide( - idA, tuple(src_cta_tiler) - ) # ((...,TileV,...),(...,RestV,...)) - gD = cute.zipped_divide( - dst, tuple(dst_cta_tiler) - ) # ((...,TileV,...),(...,RestV,...)) + gS = zipped_divide(src, tuple(src_cta_tiler)) # ((...,TileV,...),(...,RestV,...)) + cS = zipped_divide(idA, tuple(src_cta_tiler)) # ((...,TileV,...),(...,RestV,...)) + gD = zipped_divide(dst, tuple(dst_cta_tiler)) # ((...,TileV,...),(...,RestV,...)) # print(f"{gS.type=}") _convert_kernel( @@ -201,8 +445,8 @@ def _convert( src_ty, dst_ty, ).launch( - grid=[cute.size(gS, mode=[1]), 1, 1], - block=[cute.size(src_tv_layout, mode=[0]), 1, 1], + grid=[size(gS, mode=[1]), 1, 1], + block=[size(src_tv_layout, mode=[0]), 1, 1], ) @@ -210,7 +454,7 @@ def _convert( # And when src or dst dtype is narrow precision(Float4E2M1FN/Float8E8M0FNU/Float8E4M3FN), the shape of # their leading dimension should be 4(fp8)/8(fp4) element align. (nvgpu.cvt_fptrunc/cvt_fpext # needs 32-bits aligned input/output) -def convert(src: cute.Tensor, dst: cute.Tensor): +def convert(src: Tensor, dst: Tensor): assert len(src.shape) == len(dst.shape), ( "Shape of src and dst tensors should be the same rank." ) @@ -292,6 +536,14 @@ class JitArguments: def __init__(self, *args, **kwargs): self.args = args self.kwargs = kwargs + self.references = list() + + def add_to_scope(self, references: Any) -> None: + """ + Keeps references to external variables (e.g., Torch tensors when taking a view) + in the scope of the lifetime of the JitArguments object. + """ + self.references.extend(references) def _cuda_success( @@ -428,6 +680,9 @@ def benchmark( :rtype: float """ + import cutlass.base_dsl.jit_executor as jit_executor + import cutlass.cutlass_dsl.cuda_jit_executor as cuda_jit_executor + if stream is None: stream = cuda_driver.CUstream(cuda_driver.CUstream_flags.CU_STREAM_DEFAULT) @@ -697,7 +952,7 @@ def _benchmark_for_autotune( _cuda_success(err, "Error on querying event") execution_time_ms.append(elapsed_time) # unit: us - time_us = sum(execution_time_ms) / len(execution_time_ms) + time_us = sum(execution_time_ms) * 1e3 / len(execution_time_ms) except Exception as e: print(f"This config execution error: {e}") time_us = float("inf") @@ -775,6 +1030,7 @@ class autotune_jit: Returns: Decorated wrapper function """ + from cutlass.cute import compile # Initialize autotune parameters if not hasattr(func, "_autotune_params"): @@ -825,7 +1081,7 @@ class autotune_jit: # For example, if current_config contains "cluster_shape_mn": (2, 1) # It will override func's default parameter value merged_kwargs = {**kwargs, **current_config} - compiled_func = cute.compile( + compiled_func = compile( func._original_func, *args, **merged_kwargs ) diff --git a/python/CuTeDSL/cutlass/cute/tuple.py b/python/CuTeDSL/cutlass/cute/tuple.py index 52ab318c..15c4114e 100644 --- a/python/CuTeDSL/cutlass/cute/tuple.py +++ b/python/CuTeDSL/cutlass/cute/tuple.py @@ -17,7 +17,17 @@ from cutlass.cutlass_dsl import is_dynamic_expression, dsl_user_op from cutlass._mlir import ir import cutlass._mlir.dialects.cute as _cute_ir -from .typing import XTuple, IntTuple, Shape, Coord, Boolean, is_integer +from .typing import ( + ComposedLayout, + Layout, + Stride, + XTuple, + IntTuple, + Shape, + Coord, + Boolean, + is_integer, +) def wrap(x) -> Tuple[Any, ...]: @@ -184,7 +194,7 @@ def product_each(a: IntTuple, *, loc=None, ip=None) -> IntTuple: def find_if( t: Union[tuple, ir.Value, int], - pred_fn: Callable[[int, Tuple[int, ...]], bool], + pred_fn: Callable[[Union[tuple, ir.Value, int], int], bool], *, loc=None, ip=None, @@ -197,7 +207,8 @@ def find_if( :type t: Union[tuple, ir.Value, int] :param pred_fn: A callable object (lambda, function, etc.) that predicates the value and position in t. It takes the current leaf value and position, returns True if the value or position is satisfied. - :type pred_fn: Callable[[int, Tuple[int, ...]], bool] + The type must be compatible with rank(t). + :type pred_fn: Callable[[Union[tuple, ir.Value, int], int], bool] :return: Index if found at top level, tuple of indices showing nested position, or None if not found :rtype: Union[int, Tuple[int, ...], None] @@ -329,3 +340,154 @@ def elem_less( lhs_val = _pack_coord(lhs, loc=loc, ip=ip) rhs_val = _pack_coord(rhs, loc=loc, ip=ip) return Boolean(_cute_ir.elem_less(lhs_val, rhs_val, loc=loc, ip=ip)) + + +def tuple_cat(*tuples): + """Concatenate multiple tuples into a single tuple. + + This function takes any number of tuples and concatenates them into a single tuple. + Non-tuple arguments are treated as single-element tuples. + + :param tuples: Variable number of tuples to concatenate + :type tuples: tuple or any + :return: A single concatenated tuple + :rtype: tuple + + **Examples:** + + .. code-block:: python + + >>> tuple_cat((1, 2), (3, 4)) + (1, 2, 3, 4) + >>> tuple_cat((1,), (2, 3), (4,)) + (1, 2, 3, 4) + >>> tuple_cat(1, (2, 3)) + (1, 2, 3) + """ + result = () + for t in tuples: + if isinstance(t, tuple): + result += t + else: + result += (t,) + return result + + +def transform_apply(*args, f: Callable, g: Callable): + """Transform elements of tuple(s) with f, then apply g to all results. + + This function applies f to corresponding elements across input tuple(s), + then applies g to all transformed results. It mimics the C++ CuTe implementation. + + Supports multiple signatures: + - transform_apply(t, f, g): For single tuple, computes g(f(t[0]), f(t[1]), ...) + - transform_apply(t0, t1, f, g): For two tuples, computes g(f(t0[0], t1[0]), f(t0[1], t1[1]), ...) + - transform_apply(t0, t1, t2, ..., f, g): For multiple tuples of same length + + For non-tuple inputs, f is applied to the input(s) and g is applied to that single result. + + :param args: One or more tuples (or non-tuples) to transform + :param f: The function to apply to each element (or corresponding elements across tuples) + :type f: Callable + :param g: The function to apply to all transformed elements + :type g: Callable + :param loc: Source location for MLIR, defaults to None + :type loc: optional + :param ip: Insertion point, defaults to None + :type ip: optional + :return: The result of applying g to all transformed elements + :rtype: any + + **Examples:** + + .. code-block:: python + + >>> transform_apply((1, 2, 3), f=lambda x: x * 2, g=lambda *args: sum(args)) + 12 # (1*2 + 2*2 + 3*2) = 12 + >>> transform_apply((1, 2), f=lambda x: (x, x+1), g=tuple_cat) + (1, 2, 2, 3) + >>> transform_apply((1, 2), (3, 4), f=lambda x, y: x + y, g=lambda *args: args) + (4, 6) + """ + if not isinstance(f, Callable): + raise TypeError(f"f must be callable, but got {type(f)}") + if not isinstance(g, Callable): + raise TypeError(f"g must be callable, but got {type(g)}") + + if not args: + raise ValueError("transform_apply requires at least one argument") + + # Check if first argument is a tuple to determine behavior + if isinstance(args[0], tuple): + # Verify all args are tuples of the same length + if not all(isinstance(arg, tuple) for arg in args): + raise TypeError("All arguments must be tuples or all must be non-tuples") + + tuple_length = len(args[0]) + for i, arg in enumerate(args[1:], 1): + if len(arg) != tuple_length: + raise ValueError( + f"All tuple arguments must have the same length. " + f"arg[0] has length {tuple_length}, but arg[{i}] has length {len(arg)}" + ) + + # Apply f to corresponding elements across all tuples: g(f(args[0][i], args[1][i], ...), ...) + transformed_results = tuple( + f(*(arg[i] for arg in args)) for i in range(tuple_length) + ) + return g(*transformed_results) + else: + # Non-tuple case: apply f to all args, then g to that single result + result = f(*args) + return g(result) + + +def filter_tuple(*args, f: Callable): + """Filter and flatten tuple elements by applying a function. + + The function f should return tuples, which are then concatenated together + to produce the final result. This is useful for filtering and transforming + tuple structures in a single pass. + + :param t: The tuple to filter + :type t: Union[tuple, ir.Value, int] + :param f: The function to apply to each element of t + :type f: Callable + :param loc: Source location for MLIR, defaults to None + :type loc: optional + :param ip: Insertion point, defaults to None + :type ip: optional + :return: A concatenated tuple of all results + :rtype: tuple + + **Examples:** + + .. code-block:: python + + >>> # Keep only even numbers, wrapped in tuples + >>> filter_tuple((1, 2, 3, 4), lambda x: (x,) if x % 2 == 0 else ()) + (2, 4) + >>> # Duplicate each element + >>> filter_tuple((1, 2, 3), lambda x: (x, x)) + (1, 1, 2, 2, 3, 3) + """ + if not isinstance(f, Callable): + raise TypeError(f"f must be callable, but got {type(f)}") + + return transform_apply(*args, f=f, g=lambda *args: tuple_cat(*args)) + + +__all__ = [ + "transform_leaf", + "find_if", + "find", + "flatten_to_tuple", + "unflatten", + "product", + "product_like", + "product_each", + "elem_less", + "tuple_cat", + "transform_apply", + "filter_tuple", +] diff --git a/python/CuTeDSL/cutlass/cute/typing.py b/python/CuTeDSL/cutlass/cute/typing.py index f8b16864..80a084da 100644 --- a/python/CuTeDSL/cutlass/cute/typing.py +++ b/python/CuTeDSL/cutlass/cute/typing.py @@ -52,6 +52,15 @@ class SymInt: [self._width == other._width, self._divisibility == other._divisibility] ) + def __mod__(self, other: int) -> Union["SymInt", int]: + if self._divisibility % other != 0: + from math import gcd + + div = gcd(self._divisibility, other) + return SymInt(self._width, divisibility=div) + else: + return 0 + def __c_pointers__(self): return [ctypes.c_void_p(0).value] @@ -381,10 +390,14 @@ __all__ = [ "Float6E2M3FN", "Float6E3M2FN", "IntTuple", - "Layout", + "ScaledBasis", "Coord", "Shape", "Stride", + "Layout", + "ComposedLayout", + "Pointer", + "Tensor", "Tile", "Tiler", "XTuple", diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/__init__.py b/python/CuTeDSL/cutlass/cutlass_dsl/__init__.py index 022cb79d..690546c6 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/__init__.py +++ b/python/CuTeDSL/cutlass/cutlass_dsl/__init__.py @@ -33,6 +33,8 @@ from ..base_dsl.ast_helpers import ( copy_members, get_locals_or_none, closure_check, + fstring_decompose, + FormattedValue, ) from ..base_dsl import * diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/cuda_jit_executor.py b/python/CuTeDSL/cutlass/cutlass_dsl/cuda_jit_executor.py index 644465b6..2c5e8a6e 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/cuda_jit_executor.py +++ b/python/CuTeDSL/cutlass/cutlass_dsl/cuda_jit_executor.py @@ -12,6 +12,7 @@ """ This module provides jit executor related classes for CUTLASS. """ + import ctypes import functools import weakref @@ -32,6 +33,7 @@ from ..base_dsl.common import DSLRuntimeError from ..base_dsl.typing import Int32 from ..base_dsl.runtime.cuda import checkCudaErrors + class CudaDialectJitModule: """Holds the execution engine and cuda libraries.""" @@ -80,22 +82,23 @@ class CudaDialectJitCompiledFunction(JitCompiledFunction): jit_function_artifacts, prefix=None, load_from_binary=False, + dynamic_args=None, + dynamic_kwargs=None, ): - self.ir_module = ir_module - self.engine = engine - self.capi_func = capi_func - self.function_name = function_name - self.kernel_info = kernel_info - if args_spec is not None: - self.args_spec = ExecutionArgs(args_spec, self.function_name) - self.jit_time_profiling = jit_time_profiling - self.prefix = prefix - assert ( - isinstance(jit_function_artifacts, JitFunctionArtifacts) - or jit_function_artifacts is None + super().__init__( + ir_module, + engine, + capi_func, + args_spec, + function_name, + kernel_info, + jit_time_profiling, + jit_function_artifacts, + prefix, + load_from_binary, + dynamic_args, + dynamic_kwargs, ) - self.artifacts = jit_function_artifacts - self.load_from_binary = load_from_binary # Set cuda result return type. # When execution engine/capi function is None, do not set the return type. @@ -104,13 +107,6 @@ class CudaDialectJitCompiledFunction(JitCompiledFunction): if self.args_spec: self.args_spec.args_spec.annotations["return"] = Int32 - # This runtime state is stored here so that we can preserve the module - # in the compiler cache. Callers can extend the lifetime of the module - # by creating and retaining the executor. - self.jit_module = None - self._executor_lock = threading.RLock() - self._default_executor = None - @functools.cached_property def num_devices(self): """Returns the number of CUDA devices available.""" @@ -222,7 +218,11 @@ class CudaDialectJitCompiledFunction(JitCompiledFunction): device_id = ctypes.c_int32(0) pointer_to_device_id = ctypes.pointer(device_id) - cuda_load_args = [pointer_to_library, pointer_to_device_id, pointer_to_err] + cuda_load_args = [ + pointer_to_pointer_to_library, + pointer_to_device_id, + pointer_to_err, + ] packed_args = (ctypes.c_void_p * len(cuda_load_args))() for i, arg in enumerate(cuda_load_args): packed_args[i] = ctypes.cast(arg, ctypes.c_void_p) diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/cutlass.py b/python/CuTeDSL/cutlass/cutlass_dsl/cutlass.py index ca27d3b7..83196af2 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/cutlass.py +++ b/python/CuTeDSL/cutlass/cutlass_dsl/cutlass.py @@ -29,6 +29,7 @@ from typing import ( ) import functools import pkgutil +from concurrent.futures import ThreadPoolExecutor, as_completed from dataclasses import is_dataclass, fields from math import ceil from itertools import chain @@ -36,6 +37,8 @@ from pathlib import Path from collections.abc import Sequence import builtins import ctypes +import hashlib +import os from ..base_dsl import * from ..base_dsl import compiler @@ -93,17 +96,8 @@ from .cutlass_ast_decorators import ( _while_execute_dynamic, ) -from .tree_utils import ( - is_constexpr_field, - tree_flatten, - tree_unflatten, - PyTreeDef, - is_frozen_dataclass, - DSLTreeFlattenError, -) from ..base_dsl.runtime.jit_arg_adapters import JitArgAdapterRegistry - # ============================================================================= # Cutlass DSL Base Abstract Class # ============================================================================= @@ -283,6 +277,18 @@ class CutlassBaseDSL(BaseDSL): log().info(f"GPU module: {self.gpu_module}") return ir.InsertionPoint(self.gpu_module.bodyRegion.blocks[0]) + @staticmethod + def generate_func_ret_op(loc=None, ip=None): + raise NotImplementedError( + "generate_func_ret_op() must be implemented by subclasses." + ) + + @staticmethod + def generate_func_op(arg_types, arg_attrs, kernel_name, loc=None): + raise NotImplementedError( + "generate_func_op() must be implemented by subclasses." + ) + def _generate_kernel_attrs(self, config: BaseDSL.LaunchConfig) -> dict: assert isinstance(config, BaseDSL.LaunchConfig), ( f"Expect LaunchConfig for @kernel, but got {type(config)}" @@ -326,43 +332,105 @@ class CutlassBaseDSL(BaseDSL): Get the version of cutlass dsl, used for computing the hash key of the cache. Including source python files and the shared library. """ + + def _hash_chunk( + key: str, path: str, idx: int, start: int, size: int + ) -> tuple[str, int, bytes]: + """Hash one chunk of a file with SHA-256.""" + h = hashlib.sha256() + if size > 0: + try: + with open(path, "rb") as f: + f.seek(start) + h.update(f.read(size)) + except Exception as e: + raise DSLRuntimeError( + f"Failed to read module file {key}." + "The file may not exist or may not be readable." + "Please re-install the package." + ) from e + return key, idx, h.digest() + + def _iter_jobs(): + """Chunk jobs generator to hash files in parallel""" + for key, path, size in files: + # empty files still get a deterministic hash from SHA-256 of zero bytes + for i in range(max(1, -(-size // chunk_size))): # ceil division + start = i * chunk_size + computed_size = min(chunk_size, max(size - start, 0)) + yield (key, path, i, start, computed_size) + dsl_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - # get the version hash of the cutlass shared library - version_hash = hashlib.sha256() - # update the version hash of the source python files - for lib in pkgutil.walk_packages([dsl_path], prefix="cutlass."): - try: - with open(lib.module_finder.find_spec(lib.name).origin, "rb") as f: - version_hash.update(f.read()) - except Exception: - raise DSLRuntimeError( - f"Failed to read module file {lib.name}. The file may not exist or may not be readable." - "Please re-install the package." - ) + files = [] + + # Keep large dso file first in the list to reduce tail effect + giant_dso_name = str( + next( + (Path(dsl_path) / "_mlir" / "_mlir_libs").glob("_cutlass_ir.cpython*") + ).name + ) + so_path = os.path.join(dsl_path, "_mlir", "_mlir_libs", giant_dso_name) try: # update the version hash of the cutlass shared library - giant_dso_name = str( - next( - (Path(dsl_path) / "_mlir" / "_mlir_libs").glob( - "_cutlass_ir.cpython*" - ) - ).name - ) - with open( - os.path.join(dsl_path, f"_mlir/_mlir_libs/{giant_dso_name}"), - "rb", - ) as f: - while True: - chunk = f.read(1024**2) - if not chunk: - break - version_hash.update(chunk) - except Exception: + so_size = os.path.getsize(so_path) + except Exception as e: raise DSLRuntimeError( f"Failed to read the shared library file {giant_dso_name}." "The file may not exist or may not be readable." "Please re-install the package." + ) from e + files.append((giant_dso_name, so_path, so_size)) + + def handle_import_error(exc): + """Handle errors during package walking, ignoring ImportError and NotImplementedError.""" + if isinstance(exc, (ImportError, NotImplementedError)): + log().info(f"Skipping module due to {type(exc).__name__}: {exc}") + else: + log().warning(f"Unexpected error during package walk: {exc}") + + for lib in pkgutil.walk_packages( + [dsl_path], prefix="cutlass.", onerror=handle_import_error + ): + spec = lib.module_finder.find_spec(lib.name) + if not spec or not spec.origin: + continue + path = spec.origin + try: + size = os.path.getsize(path) + except Exception as e: + raise DSLRuntimeError( + f"Failed to read module file {lib.name}. The file may not exist or may not be readable." + "Please re-install the package." + ) from e + files.append((lib.name, path, size)) + + # Submit chunks to a job queue + chunk_size = 1 << 24 # 16 MB (tuned) + per_file_chunks = {} + # 16 threads max to avoid context switching overhead + # To avoid oversubscription, we use half of cpu_count() + max_workers = min(16, (os.cpu_count() or 8) // 2) + with ThreadPoolExecutor(max_workers=max_workers) as ex: + futures = [ex.submit(_hash_chunk, *job) for job in _iter_jobs()] + for fut in as_completed(futures): + key, idx, digest = fut.result() + per_file_chunks.setdefault(key, []).append((idx, digest)) + + # update the version hash of the cutlass shared library using tree-hash + version_hash = hashlib.sha256() + # Since files list is in arbitrary order, we sort by key to get deterministic order + for key, path, size in sorted(files, key=lambda t: t[0]): + chunks = per_file_chunks.get(key) + file_hash = hashlib.sha256( + b"".join( + digest + for _, digest in sorted( + chunks + ) # Similarily, sort chunks by index to get deterministic order + ) ) + file_hash.update(key.encode("utf-8")) + version_hash.update(file_hash.digest()) return version_hash @@ -399,12 +467,14 @@ class CutlassBaseDSL(BaseDSL): pipeline, args_spec, no_cache, + no_jit_engine, *, full_args=None, full_kwargs=None, dynamic_args=None, dynamic_kwargs=None, original_function_name=None, + funcBody=None, ): """ Compile the module and cache the result. @@ -415,6 +485,7 @@ class CutlassBaseDSL(BaseDSL): :param pipeline: The pipeline to use for compilation. :param args_spec: The args spec to use for compilation. :param no_cache: Whether to cache the result. + :param no_jit_engine: Whether to create JIT execution engine. :param full_args: The full arguments to use for compilation. :param full_kwargs: The full keyword arguments to use for compilation. :param dynamic_args: The dynamic arguments to use for compilation. @@ -433,8 +504,10 @@ class CutlassBaseDSL(BaseDSL): from cutlass.base_dsl.tvm_ffi_builder import attach_ffi_func assert self._tvm_ffi_args_spec_converter is not None - tvm_ffi_spec_params, kwargs_wrapper_spec = self._tvm_ffi_args_spec_converter( - function_name, args_spec, full_args, full_kwargs + tvm_ffi_spec_params, kwargs_wrapper_spec = ( + self._tvm_ffi_args_spec_converter( + function_name, args_spec, full_args, full_kwargs + ) ) tvm_ffi_provider = TVMFFICuteCallProvider(function_name) @@ -454,8 +527,7 @@ class CutlassBaseDSL(BaseDSL): def _make_compiled_func(*args, **kwargs): if kwargs_wrapper_spec.kwonly_names or kwargs_wrapper_spec.arg_defaults: return TVMFFIJitCompiledFunctionWithKwargs( - *args, **kwargs, - kwargs_wrapper_spec=kwargs_wrapper_spec + *args, **kwargs, kwargs_wrapper_spec=kwargs_wrapper_spec ) else: return TVMFFIJitCompiledFunction(*args, **kwargs) @@ -472,11 +544,13 @@ class CutlassBaseDSL(BaseDSL): pipeline, args_spec, no_cache, + no_jit_engine, _make_compiled_func, full_args=full_args, full_kwargs=full_kwargs, dynamic_args=dynamic_args, dynamic_kwargs=dynamic_kwargs, + funcBody=funcBody, ) return super().compile_and_cache( @@ -486,12 +560,14 @@ class CutlassBaseDSL(BaseDSL): pipeline, args_spec, no_cache, + no_jit_engine, CudaDialectJitCompiledFunction, full_args=full_args, full_kwargs=full_kwargs, dynamic_args=dynamic_args, dynamic_kwargs=dynamic_kwargs, original_function_name=original_function_name, + funcBody=funcBody, ) @staticmethod @@ -539,14 +615,21 @@ class CutlassBaseDSL(BaseDSL): cluster_size_x=None, cluster_size_y=None, cluster_size_z=None, + preferred_cluster_size_x=None, + preferred_cluster_size_y=None, + preferred_cluster_size_z=None, dynamic_shared_memory_size=None, use_pdl=False, + cooperative=False, loc=None, ip=None, ): + # set to 3 for PDL, cluster size, and cooperative + max_num_attributes = 3 + + if preferred_cluster_size_x is not None: + max_num_attributes += 1 - # Max number of attributes in the launch config is set to 2 for PDL and cluster size - max_num_attributes = 2 launch_config_type = cuda_dialect.LaunchConfigType.get(max_num_attributes) if len(stream) == 0: @@ -571,7 +654,7 @@ class CutlassBaseDSL(BaseDSL): # Launch config type launch_config_type, # Max num of attributes the launch config can hold - # set to 2 for PDL and cluster size + # set to 3 for PDL, cluster size, and cooperative ir.IntegerAttr.get(ir.IntegerType.get_signless(32), max_num_attributes), block_size_x, block_size_y, @@ -585,10 +668,9 @@ class CutlassBaseDSL(BaseDSL): ip=ip, ) - if use_pdl: - cuda_dialect.launch_cfg_programmatic_stream_serialization_allowed( - cfg, Int32(use_pdl).ir_value(), loc=loc, ip=ip - ) + cuda_dialect.launch_cfg_programmatic_stream_serialization_allowed( + cfg, Int32(use_pdl).ir_value(), loc=loc, ip=ip + ) if cluster_size_x is not None: if cluster_size_y is None: @@ -602,11 +684,27 @@ class CutlassBaseDSL(BaseDSL): cfg, cluster_size_x, cluster_size_y, cluster_size_z, loc=loc, ip=ip ) + if preferred_cluster_size_x is not None: + preferred_cluster_size_y = preferred_cluster_size_y or 1 + preferred_cluster_size_z = preferred_cluster_size_z or 1 + preferred_x = Int32(preferred_cluster_size_x).ir_value(loc=loc, ip=ip) + preferred_y = Int32(preferred_cluster_size_y).ir_value(loc=loc, ip=ip) + preferred_z = Int32(preferred_cluster_size_z).ir_value(loc=loc, ip=ip) + cuda_dialect.launch_cfg_preferred_cluster_dim( + cfg, preferred_x, preferred_y, preferred_z, loc=loc, ip=ip + ) + + cuda_dialect.launch_cfg_cooperative( + cfg, Int32(cooperative).ir_value(loc=loc, ip=ip), loc=loc, ip=ip + ) + op = cuda_dialect.launch_ex( cuda_dialect.ResultType.get(), kernel, cfg, kernel_operands, + # This is true for any DSL generated kernel + assume_kernel_attr=ir.Attribute.parse("#cuda.assume_kernel_attr"), loc=loc, ip=ip, ) @@ -662,7 +760,7 @@ class CutlassBaseDSL(BaseDSL): loc=loc, ip=ip, ) - op.attributes["use_pdl"] = ir.BoolAttr.get(use_pdl) + op.attributes["use_pdl"] = use_pdl.ir_value() return _get_op_result_or_op_results(op) def _kernel_helper(self, funcBody, *args, **kwargs): @@ -674,27 +772,14 @@ class CutlassBaseDSL(BaseDSL): def generate_func_op(self, arg_types, arg_attrs, kernel_name, loc=None): super().generate_func_op(arg_types, arg_attrs, kernel_name) - self.func_op = cuda_dialect.KernelOp( - kernel_name, ir.FunctionType.get(arg_types, []), loc=loc + self.func_op = self.dsl.generate_func_op( + arg_types, arg_attrs, kernel_name, loc ) self.arg_types = arg_types - self.func_op.attributes["cu_attrs"] = ir.DictAttr.get( - { - str( - cuda_dialect.CUFunctionAttribute.non_portable_cluster_size_allowed - ): ir.IntegerAttr.get(ir.IntegerType.get_signless(32), 1), - str( - cuda_dialect.CUFunctionAttribute.max_dynamic_shared_size_bytes - ): cuda_dialect.DevMaxSharedMemoryOptinAttr.get(), - } - ) - if arg_attrs is not None: - log().debug(arg_attrs) - self.func_op.arg_attrs = arg_attrs return self.func_op def generate_func_ret_op(self, loc=None, ip=None): - return cuda_dialect.ReturnOp([], loc=loc, ip=ip) + self.dsl.generate_func_ret_op(loc, ip) def get_func_body_start(self): assert self.func_op is not None, "Invalid func_op is not expected!" @@ -736,31 +821,72 @@ class CutlassBaseDSL(BaseDSL): async_deps = cfg.async_deps if not isinstance(cfg.async_deps, (list, tuple)): async_deps = [cfg.async_deps] + + launch_kwargs = {} + + if cfg.has_fallback_cluster: + launch_kwargs.update( + dict( + zip( + ("cluster_size_x", "cluster_size_y", "cluster_size_z"), + tuple(cfg.fallback_cluster), + ) + ) + ) + launch_kwargs.update( + dict( + zip( + ( + "preferred_cluster_size_x", + "preferred_cluster_size_y", + "preferred_cluster_size_z", + ), + tuple(cfg.cluster), + ) + ) + ) + elif cfg.has_cluster: + launch_kwargs.update( + dict( + zip( + ("cluster_size_x", "cluster_size_y", "cluster_size_z"), + tuple(cfg.cluster), + ) + ) + ) + CutlassBaseDSL.cuda_launch_func( async_deps, kernelSym, *cfg.grid, *cfg.block, kernelOperands, - **dict( - zip( - ("cluster_size_x", "cluster_size_y", "cluster_size_z"), - tuple(cfg.cluster), - ) - ), + **launch_kwargs, dynamic_shared_memory_size=cfg.smem, use_pdl=cfg.use_pdl, + cooperative=cfg.cooperative, loc=loc, ) return None - return KernelLauncher( - self, - lambda: _CutlassIrKernelGenHelper(self), - funcBody, - *args, - **kwargs, - ) + custom_name = kwargs.pop("_name_prefix", None) + if custom_name: + return KernelLauncher( + self, + lambda: _CutlassIrKernelGenHelper(self), + funcBody, + *args, + **kwargs, + _name_prefix=custom_name, + ) + else: + return KernelLauncher( + self, + lambda: _CutlassIrKernelGenHelper(self), + funcBody, + *args, + **kwargs, + ) def _preprocess_launch_config_args(self, args, kwargs): """Helper to preprocess args and kwargs for LaunchConfig""" @@ -809,7 +935,10 @@ class CutlassBaseDSL(BaseDSL): # skip generic types such as List[int], Tuple[int, int], etc. for performance consideration? pass - elif getattr(arg_annotation, "__name__", None) == "CUstream" and arg.__class__.__name__ == "_FakeStream": + elif ( + getattr(arg_annotation, "__name__", None) == "CUstream" + and arg.__class__.__name__ == "_FakeStream" + ): # allow FakeStream to be passed as CUDA stream pass @@ -875,14 +1004,14 @@ class CutlassBaseDSL(BaseDSL): ): # Try tree_flatten try: - dyn_vals, _ = tree_flatten(arg) + dyn_vals, attr_vals, _ = tree_flatten(arg) except DSLTreeFlattenError: # If fails, just return the original arg return jit_exec_arg, jit_arg_type, jit_arg_attr if dyn_vals: jit_arg_type.extend([v.type for v in dyn_vals]) - jit_arg_attr.extend([default_attr] * len(dyn_vals)) + jit_arg_attr.extend(attr_vals) jit_exec_arg.extend( _get_c_pointers_cutlass(arg) if is_host else dyn_vals ) @@ -910,7 +1039,7 @@ class CutlassBaseDSL(BaseDSL): ): # Try tree_unflatten try: - dyn_vals, tree_def = tree_flatten(arg) + dyn_vals, _, tree_def = tree_flatten(arg) block_args = fop_args[iv_block_args : iv_block_args + len(dyn_vals)] ir_arg.append(tree_unflatten(tree_def, block_args)) iv_block_args += len(dyn_vals) @@ -937,6 +1066,30 @@ class CuTeDSL(CutlassBaseDSL): super().__init__(name, compiler_provider, pass_sm_arch_name, preprocess=True) + @staticmethod + def generate_func_op(arg_types, arg_attrs, kernel_name, loc=None): + func_op = cuda_dialect.KernelOp( + kernel_name, ir.FunctionType.get(arg_types, []), loc=loc + ) + func_op.attributes["cu_attrs"] = ir.DictAttr.get( + { + str( + cuda_dialect.CUFunctionAttribute.non_portable_cluster_size_allowed + ): ir.IntegerAttr.get(ir.IntegerType.get_signless(32), 1), + str( + cuda_dialect.CUFunctionAttribute.max_dynamic_shared_size_bytes + ): cuda_dialect.DevMaxSharedMemoryOptinAttr.get(), + } + ) + if arg_attrs is not None: + log().debug(arg_attrs) + func_op.arg_attrs = arg_attrs + return func_op + + @staticmethod + def generate_func_ret_op(loc=None, ip=None): + return cuda_dialect.ReturnOp([], loc=loc, ip=ip) + # ============================================================================= # KernelLauncher @@ -974,6 +1127,8 @@ class KernelLauncher: self.func_args = func_args self.func_kwargs = func_kwargs + self._name_prefix = func_kwargs.pop("_name_prefix", None) + self._check_func_args(funcBody, *func_args, **func_kwargs) def _check_func_args(self, funcBody, *func_args, **func_kwargs): @@ -1002,6 +1157,9 @@ class KernelLauncher: config = self.dsl.LaunchConfig(*args, **kwargs) kernel_attrs = _build_kernel_attrs(config) + if hasattr(self, "_name_prefix") and self._name_prefix: + self.dsl._name_prefix = self._name_prefix + kernel_generator = self.dsl.kernel_launcher( requiredArgs=["config"], unitAttrNames=["gpu.kernel", "cute.kernel"], @@ -1119,7 +1277,7 @@ def unpack_to_irvalue( log().debug("[%d]: will-unpacked: [type:%s] %s", idx, type(packed), packed) try: - unpacked_values, treedef = tree_flatten( + unpacked_values, _, treedef = tree_flatten( remove_read_only_frozen_dataclass(mixed_values, full_write_args_count) ) except DSLTreeFlattenError as e: @@ -1182,6 +1340,7 @@ def to_index(value): return res + def _validate_iter_args_structure(iter_args, ir_values): """ Validates that iter_args structure contains the same number of atomic values @@ -2087,3 +2246,15 @@ executor.set_functions( all_executor=all_, builtin_redirector=_builtin_redirector, ) + + +class DSLCudaVerNotImplemented(DSLNotImplemented): + """ + Exception raised when a feature is not supported for DSL with CUDA version less than the required version. + """ + + def __init__(self, feature: str, required_version: str): + super().__init__( + message=f"{feature} is not supported for DSL with CUDA version less than {required_version}", + suggestion=f"Consider upgrading to CUDA version {required_version}+ based DSL", + ) diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/cutlass_ast_decorators.py b/python/CuTeDSL/cutlass/cutlass_dsl/cutlass_ast_decorators.py index 84d0c3a8..5c032d1c 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/cutlass_ast_decorators.py +++ b/python/CuTeDSL/cutlass/cutlass_dsl/cutlass_ast_decorators.py @@ -18,10 +18,10 @@ from collections.abc import Sequence from ..base_dsl.dsl import is_dynamic_expression from ..base_dsl.ast_helpers import * from ..base_dsl.utils.logger import log -from ..base_dsl import typing as t +from ..base_dsl import typing as t, Arch from ..base_dsl.typing import Boolean, Numeric, as_numeric +from ..base_dsl.utils.tree_utils import PyTreeDef, check_tree_equal from . import cutlass as cutlass_dsl -from .tree_utils import PyTreeDef, check_tree_equal # ============================================================================= # AST Helpers @@ -289,6 +289,7 @@ def _loop_execute_range_dynamic( unroll: int = -1, unroll_full: bool = False, prefetch_stages: int = None, + vectorize: bool = None, ): """ Example: build an scf.for with optional unroll, using our universal helper. @@ -341,6 +342,17 @@ def _loop_execute_range_dynamic( ) log().debug("prefetch_stages attribute: %s", prefetch_stages_attr) + vectorize_attr = None + if vectorize: + arch = cutlass_dsl.CuTeDSL._get_dsl().get_arch_enum() + if arch < Arch.sm_100: + raise DSLRuntimeError( + f"vectorize is supported for sm_100 and above, got {arch}." + ) + _attr_const_check(vectorize, bool, "vectorize") + vectorize_attr = ir.BoolAttr.get(True) + log().debug("vectorize attribute: %s", vectorize_attr) + log().debug( "Creating scf.ForOp \n\t\tstart=%s: type : %s\n\t\tstop=%s: type : %s\n\t\tstep=%s: type : %s", start_, @@ -373,6 +385,9 @@ def _loop_execute_range_dynamic( if prefetch_stages_attr is not None: for_op.attributes["cutlass.pipelining"] = prefetch_stages_attr + if vectorize_attr is not None: + for_op.attributes["cutlass.vectorize"] = vectorize_attr + return for_op def for_body_builder( diff --git a/python/CuTeDSL/cutlass/cutlass_dsl/tvm_ffi_provider.py b/python/CuTeDSL/cutlass/cutlass_dsl/tvm_ffi_provider.py index a2060cab..a7c1e7e2 100644 --- a/python/CuTeDSL/cutlass/cutlass_dsl/tvm_ffi_provider.py +++ b/python/CuTeDSL/cutlass/cutlass_dsl/tvm_ffi_provider.py @@ -255,8 +255,7 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): current_device: Optional[ir.Value], target_device: Optional[ir.Value], ) -> ir.Block: - """Set the CUDA device index if it differs from the target device. - """ + """Set the CUDA device index if it differs from the target device.""" # If either device is None, no switching needed if current_device is None: assert target_device is None @@ -274,7 +273,7 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): self.cond_br( cond=devices_differ, true_block=switch_device_block, - false_block=continuation_block + false_block=continuation_block, ) # Switch device block: call cudaSetDevice @@ -288,7 +287,9 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): ) # Check for errors and branch to continuation - switch_device_block = self.check_cuda_error(result, switch_device_block, context) + switch_device_block = self.check_cuda_error( + result, switch_device_block, context + ) with ir.InsertionPoint(switch_device_block): self.br(continuation_block) @@ -319,7 +320,9 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): op_bundle_sizes=[], op_bundle_operands=[], ) - current_block = self.check_cuda_error(get_device_result, current_block, context) + current_block = self.check_cuda_error( + get_device_result, current_block, context + ) # Load the current device index from the alloca with ir.InsertionPoint(current_block): @@ -351,7 +354,6 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): return current_block - def find_cuda_device_index_from_params(self, context: CallContext): """Find the CUDA device index from tensor parameters.""" for param in context.params: @@ -363,12 +365,9 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): return None def create_shared_cuda_error_block( - self, - current_block: ir.Block, - context: CallContext + self, current_block: ir.Block, context: CallContext ) -> ir.Block: - """Create a shared error handling block for all CUDA errors. - """ + """Create a shared error handling block for all CUDA errors.""" # Create the shared error block after the current block (setup phase) # This block will be branched to from multiple error checking sites # It accepts the error code as a block argument @@ -398,7 +397,9 @@ class TVMFFICuteCallProvider(DynamicParamPackCallProvider): current_block = self.append_unload_to_global_dtors(current_block, context) # Create shared CUDA error handling block after the setup blocks # This reduces code duplication - all CUDA errors branch to this single block - self.cuda_error_handle_block = self.create_shared_cuda_error_block(current_block, context) + self.cuda_error_handle_block = self.create_shared_cuda_error_block( + current_block, context + ) # setup device index, will be set around the call to the target function self.cuda_device_index = self.find_cuda_device_index_from_params(context) current_block = super().__call__(current_block, context) @@ -416,6 +417,7 @@ def _inplace_hide_symbols(ir_module: ir.Module, hide_check: Callable[[str], bool @return: The ir module with the symbols hidden. """ defined_symbols = set() + def walk_llvm_func_op(op): # not a declaration if ( @@ -452,6 +454,7 @@ def _get_format_from_object_file_path(object_file_path: str) -> str: class TVMFFIJitCompiledFunctionBase(CudaDialectJitCompiledFunction): """Base class for TVM FFI compiled function.""" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -464,10 +467,12 @@ class TVMFFIJitCompiledFunctionBase(CudaDialectJitCompiledFunction): return self.__call__(*exe_args) def export_to_c( - self, object_file_path: str, function_name: str = None, + self, + object_file_path: str, + function_name: str = None, *, enable_pic: bool = True, - export_only_tvm_ffi_symbols: bool = False + export_only_tvm_ffi_symbols: bool = False, ): """Export the TVM FFI function to an object file. @@ -481,8 +486,9 @@ class TVMFFIJitCompiledFunctionBase(CudaDialectJitCompiledFunction): internal_symbol_prefix = "__cute_internal_" + function_name mod = self.ir_module mod = get_export_module( - self.ir_module, internal_symbol_prefix, - preserve_symbols=[f"__tvm_ffi_{self.function_name}"] + self.ir_module, + internal_symbol_prefix, + preserve_symbols=[f"__tvm_ffi_{self.function_name}"], ) rename_tvm_ffi_function(mod, self.function_name, function_name) @@ -498,8 +504,7 @@ class TVMFFIJitCompiledFunctionBase(CudaDialectJitCompiledFunction): f.write(out_bytes) def _create_tvm_ffi_function(self): - """Create the tvm_ffi.Function from the current execution engine. - """ + """Create the tvm_ffi.Function from the current execution engine.""" if self.engine is not None: # trigger eager compile of init callbacks cuda_init = self.engine.raw_lookup("cuda_init") @@ -512,14 +517,14 @@ class TVMFFIJitCompiledFunctionBase(CudaDialectJitCompiledFunction): "__tvm_ffi_" + self.function_name ) tvm_ffi_function = tvm_ffi.Function.__from_mlir_packed_safe_call__( - tvm_ffi_function_ptr, keep_alive_object=self.engine) + tvm_ffi_function_ptr, keep_alive_object=self.engine + ) return tvm_ffi_function return None class TVMFFIJitCompiledFunction(tvm_ffi.Function, TVMFFIJitCompiledFunctionBase): - """TVM FFI Function that directly subclasses the tvm_ffi.Function for pos only arguments. - """ + """TVM FFI Function that directly subclasses the tvm_ffi.Function for pos only arguments.""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -537,8 +542,7 @@ class TVMFFIJitCompiledFunction(tvm_ffi.Function, TVMFFIJitCompiledFunctionBase) class TVMFFIJitCompiledFunctionWithKwargs(TVMFFIJitCompiledFunctionBase): - """TVM FFI Function with kwargs wrapper support - """ + """TVM FFI Function with kwargs wrapper support""" def __init__(self, *args, **kwargs): assert "kwargs_wrapper_spec" in kwargs, "kwargs_wrapper_spec is required" @@ -549,6 +553,7 @@ class TVMFFIJitCompiledFunctionWithKwargs(TVMFFIJitCompiledFunctionBase): if kwargs_wrapper_spec.kwonly_names or kwargs_wrapper_spec.arg_defaults: try: from tvm_ffi.utils import kwargs_wrapper # type: ignore + self._kwargs_wrapper = kwargs_wrapper.make_kwargs_wrapper( self._tvm_ffi_function, arg_names=kwargs_wrapper_spec.arg_names, @@ -557,14 +562,15 @@ class TVMFFIJitCompiledFunctionWithKwargs(TVMFFIJitCompiledFunctionBase): kwonly_defaults=kwargs_wrapper_spec.kwonly_defaults, ) except ImportError: - raise DSLRuntimeError("install apache-tvm-ffi>=0.1.5 to enable kwargs/defaults") + raise DSLRuntimeError( + "install apache-tvm-ffi>=0.1.5 to enable kwargs/defaults" + ) else: # positional only is probably fine self._kwargs_wrapper = self._tvm_ffi_function def __call__(self, *args, **kwargs): - """Call the TVM FFI function with kwargs wrapper. - """ + """Call the TVM FFI function with kwargs wrapper.""" return self._kwargs_wrapper(*args, **kwargs) def __tvm_ffi_object__(self): @@ -574,7 +580,8 @@ class TVMFFIJitCompiledFunctionWithKwargs(TVMFFIJitCompiledFunctionBase): def supports_kwargs_wrapper() -> bool: """Check if the kwargs wrapper is supported.""" try: - from tvm_ffi.utils import kwargs_wrapper # type: ignore + from tvm_ffi.utils import kwargs_wrapper # type: ignore + return True except ImportError: return False diff --git a/python/CuTeDSL/cutlass/jax/__init__.py b/python/CuTeDSL/cutlass/jax/__init__.py new file mode 100644 index 00000000..e9fbd808 --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/__init__.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from functools import cache + +@cache +def is_available(): + """Returns true of Jax support is enabled.""" + try: + import jax + + _HAVE_JAX = True + except ImportError as e: + _HAVE_JAX = False + + return _HAVE_JAX + + +if is_available(): + from .primitive import cutlass_call + from .types import ( + jax_to_cutlass_dtype, + cutlass_to_jax_dtype, + from_dlpack, + JaxArray, + TensorSpec, + ) + from .compile import ( + release_compile_cache, + initialize_cutlass_dsl, + ) + from .ffi import ( + get_export_disabled_safety_checks, + find_cute_dsl_runtime_library, + register_ffi, + is_ffi_registered, + ) + from . import testing + + # This is a legacy name for TensorSpec. It will be removed eventually. + TensorMode = TensorSpec + + # This explicit init method ensures that we avoid initialization at + # unexpected times in jax tracing. + initialize_cutlass_dsl() + + __all__ = [ + "cutlass_call", + "jax_to_cutlass_dtype", + "cutlass_to_jax_dtype", + "from_dlpack", + "JaxArray", + "TensorSpec", + "TensorMode", + "release_compile_cache", + "get_export_disabled_safety_checks", + "is_available", + "testing", + ] +else: + # export is_available check for callers or tests. + __all__ = ["is_available"] diff --git a/python/CuTeDSL/cutlass/jax/compile.py b/python/CuTeDSL/cutlass/jax/compile.py new file mode 100644 index 00000000..f57e9dfe --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/compile.py @@ -0,0 +1,302 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +import os +import gc +import ctypes +import inspect +from typing import Any, Callable, Optional, Sequence +from dataclasses import dataclass +from functools import partial +from pathlib import Path + +import time +import logging +import threading +import hashlib + +import cuda.bindings.driver as cuda + +import jax +import jax.numpy as jnp +import jaxlib + +from .types import ( + jax_to_cutlass_dtype, + from_dlpack, + JaxArray, + JaxArrayList, + TensorSpec, + JaxTracedArray, + DEFAULT_CUTLASS_DEVICE_MEMSPACE, + DEFAULT_CUTLASS_DEVICE_BUFFER_ALIGNMENT, +) + +import cutlass +import cutlass.cute as cute +from cutlass.cutlass_dsl.cutlass import CuTeDSL + +logger = logging.getLogger(__name__) + +_CUTLASS_COMPILE_CACHE = {} +_EXPORT_PREFIX = "cutlass_call" + + +@dataclass(frozen=True) +class Arg: + idx: int # position in pytree + shape: tuple[Any, ...] + dtype: jnp.dtype + spec: TensorSpec + + def get_static_flag(self, use_static_tensors: bool): + if self.spec.static is None: + return use_static_tensors + else: + return self.spec.static + + +@dataclass(frozen=True) +class FunctionSpec: + """Contains a specification of the inputs and outputs to the kernel.""" + + in_args: tuple[Arg, ...] + input_tree: Any + out_args: tuple[Arg, ...] + output_tree: Any + input_output_aliases: tuple[tuple[int, int], ...] + input_spec: tuple[TensorSpec, ...] + output_spec: tuple[TensorSpec, ...] + compile_options: str + use_static_tensors: bool + kwargs: tuple[tuple[str, Any]] + + def get_compile_args(self): + """Returns the arguments to provide to cute.compile.""" + compiler_ins = [ + JaxTracedArray( + jax_to_cutlass_dtype(leaf.dtype), + leaf.shape, + DEFAULT_CUTLASS_DEVICE_MEMSPACE, + leaf.spec.ptr_assumed_align, + leaf.spec.layout, + leaf.spec.mode, + leaf.get_static_flag(self.use_static_tensors), + ) + for leaf in self.in_args + ] + compiler_outs = [ + JaxTracedArray( + jax_to_cutlass_dtype(leaf.dtype), + leaf.shape, + DEFAULT_CUTLASS_DEVICE_MEMSPACE, + leaf.spec.ptr_assumed_align, + leaf.spec.layout, + leaf.spec.mode, + leaf.get_static_flag(self.use_static_tensors), + ) + for leaf in self.out_args + ] + return JaxArrayList(tuple(compiler_ins + compiler_outs)) + + +@cute.jit +def jit_wrapper( + stream: cuda.CUstream, + args: JaxArrayList, + *, + wrapped_fn: cutlass.Constexpr, + spec: cutlass.Constexpr, +): + # split buffer argument into inputs and outputs and return to tree + ins, outs = args[: len(spec.in_args)], args[(len(spec.in_args)) :] + ins = [x.get_tensor() for x in ins] + outs = [x.get_tensor() for x in outs] + ins = jax.tree.unflatten(spec.input_tree, ins) + outs = jax.tree.unflatten(spec.output_tree, outs) + wrapped_fn(stream, *ins, *outs, **dict(spec.kwargs)) + + +@dataclass +class CompileResult: + """Holds reference to the compiled kernel and argument spec.""" + + module: bytes + fingerprint: bytes + spec: FunctionSpec + + +def _check_is_valid_type(x, is_input): + if not is_input: + if not isinstance(x, jax.ShapeDtypeStruct): + raise TypeError("Invalid output value passed.", x) + else: + if not isinstance(x, jax.Array): + raise TypeError("Invalid type passed.", x) + + +def build_function_spec( + ins, + in_tree, + outs, + out_tree, + input_spec, + output_spec, + input_output_aliases, + compile_options, + use_static_tensors, + kwargs, +): + in_args = [] + for idx, (arg, spec) in enumerate(zip(ins, input_spec)): + _check_is_valid_type(arg, is_input=True) + in_args.append(Arg(idx, arg.shape, arg.dtype, spec)) + + out_args = [] + for idx, (arg, spec) in enumerate(zip(outs, output_spec)): + _check_is_valid_type(arg, is_input=False) + out_args.append(Arg(idx, arg.shape, arg.dtype, spec)) + + # Return the argument specs to the original pytree structure + # We need this structure to sanely match index positions of the + # arguments to the kernel. + ins_args_structured = jax.tree.unflatten(in_tree, in_args) + out_args_structured = jax.tree.unflatten(out_tree, out_args) + + # Assign per-leaf aliases + input_output_aliases_per_leaf = {} + for input_arg_alias_idx in input_output_aliases: + flat_in, _ = jax.tree.flatten(ins_args_structured[input_arg_alias_idx]) + flat_out, _ = jax.tree.flatten( + out_args_structured[input_output_aliases[input_arg_alias_idx]] + ) + for i, o in zip(flat_in, flat_out): + input_output_aliases_per_leaf[i.idx] = o.idx + + # Remove aliased arguments from output set since they are also provided + # as inputs. This is done at the very top level of the tree to simplify + # how we handle aliasing. The assumption is that the entire pytree is + # aliased. + out_args_structured = list(out_args_structured) + for out_idx in sorted(tuple(set(input_output_aliases.values())), reverse=True): + try: + out_args_structured.pop(out_idx) + except IndexError: + raise ValueError(f"Invalid output alias {out_idx} in input_output_aliases.") + out_args_structured = tuple(out_args_structured) + + in_args_flat, _ = jax.tree.flatten(ins_args_structured) + out_args_flat, out_tree = jax.tree.flatten(out_args_structured) + + spec = FunctionSpec( + tuple(in_args_flat), + in_tree, + tuple(out_args_flat), + out_tree, + tuple(input_output_aliases_per_leaf.items()), + tuple(input_spec), + tuple(output_spec), + compile_options, + use_static_tensors, + tuple((k, kwargs[k]) for k in kwargs), + ) + + return spec + + +_compile_lock = threading.Lock() + + +def get_or_compile_kernel(fn, spec): + """Gets or compiles fn and returns a CutlassCompileResult. + + The function and its specification is used as a key to determine if a new + function must be compiled. + """ + cache_key = (fn, spec) + if cache_key in _CUTLASS_COMPILE_CACHE: + return _CUTLASS_COMPILE_CACHE[cache_key] + + # Don't allow more than 1 thead to compile at any time. + # We assume that the cache key is per thread so we don't need to lock + # the above check in compile cache, + compiled_fn = None + with _compile_lock: + start = time.time() + try: + cute_compile = cutlass.cute.compile + if spec.compile_options: + cute_compile = partial(cute_compile, options=spec.compile_options) + + compiled_fn = cute_compile( + jit_wrapper, + cuda.CUstream(0), + spec.get_compile_args(), + wrapped_fn=fn, + spec=spec, + ) + + module = compiled_fn.dump_to_object(_EXPORT_PREFIX) + fingerprint = bytes.fromhex(hashlib.sha256(module).hexdigest()) + + except Exception as e: + # Log here because Jax can obscure the exception details. + logger.exception("Compilation failure for kernel.") + raise e + end = time.time() + logger.debug(f"Took {end - start} to compile cute kernel.") + + result = CompileResult(module=module, spec=spec, fingerprint=fingerprint) + _CUTLASS_COMPILE_CACHE[cache_key] = result + return result + + +def release_compile_cache(): + """Releases entries from the compile cache. + + Note that is may prevent cute dsl from saving its persistent compilation cache entries. + """ + _CUTLASS_COMPILE_CACHE.clear() + dsl = CuTeDSL._get_dsl() + dsl.jit_cache.clear() + # TODO: This is needed to release frames being held in the DSL + # We should avoid holding such references as they unexpectedly + # extend object lifetime. + dsl.frame = None + gc.collect() + + +class _DummyInitKernel: + @cute.kernel + def kernel(self): + pass + + @cute.jit + def init(self): + pass + + +_CUTLASS_DSL_INITIALIZED = False + + +def initialize_cutlass_dsl(): + """Initializes cutlass DSL.""" + global _CUTLASS_DSL_INITIALIZED + if _CUTLASS_DSL_INITIALIZED: + return + + # Call compiler to ensure we've pre-processed any kernels inside cutedsl. + kernel = _DummyInitKernel() + with _compile_lock: + logger.debug("Initializing cutlass dsl...") + _ = cutlass.cute.compile(kernel.init) + + _CUTLASS_DSL_INITIALIZED = True diff --git a/python/CuTeDSL/cutlass/jax/ffi.py b/python/CuTeDSL/cutlass/jax/ffi.py new file mode 100644 index 00000000..55964cbf --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/ffi.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import Sequence +from pathlib import Path +from functools import cache +import os +import logging +import ctypes + +import cutlass +from cutlass.base_dsl.env_manager import find_libs_in_ancestors +from cutlass.cutlass_dsl.cutlass import CuTeDSL + +import jax +import jax.export + +logger = logging.getLogger(__name__) + +_CUTE_DSL_RUNTIME_LIBRARY_NAME = "cute_dsl_runtime" + +_CUTLASS_CALL_TARGETS = { + "CuteDSLRT_NvJaxCutlassCall": {"execute": "CuteDSLRT_NvJaxCutlassCallExecute"}, + "CuteDSLRT_NvJaxCutlassCallNoCudaGraph": { + "execute": "CuteDSLRT_NvJaxCutlassCallExecuteNoCudaGraph" + }, +} + + +def get_cutlass_call_ffi_name(allow_cuda_graph): + """Returns the FFI target to call when running cutlass_call functions.""" + disable_cuda_graph = not allow_cuda_graph + if not disable_cuda_graph: + return "CuteDSLRT_NvJaxCutlassCall" + else: + return "CuteDSLRT_NvJaxCutlassCallNoCudaGraph" + + +def get_export_disabled_safety_checks() -> Sequence[jax.export.DisabledSafetyCheck]: + """Returns jax.export.DisabledSafetyCheck to allow cutlass_call kernels.""" + checks = [] + for target in _CUTLASS_CALL_TARGETS: + checks.append(jax.export.DisabledSafetyCheck.custom_call(target)) + return tuple(checks) + + +@cache +def find_cute_dsl_runtime_library(): + """Searches for the CuTeDSL runtime library.""" + dsl = CuTeDSL._get_dsl() + candidate_libs = [] + + try: + # Prefer the environment variable if we find it there. + if dsl.envar.shared_libs: + for lib in dsl.envar.shared_libs.split(":"): + if lib.endswith(f"{_CUTE_DSL_RUNTIME_LIBRARY_NAME}.so"): + return lib + + # Otherwise try to search for the library inside the wheel + def get_libs_cand(start): + libs_cand = find_libs_in_ancestors( + start, [_CUTE_DSL_RUNTIME_LIBRARY_NAME], ["lib"] + ) + if libs_cand: + return libs_cand + return [] + + dsl_libs = get_libs_cand(cutlass.__file__) + if not dsl_libs: + dsl_libs = get_libs_cand(Path(__file__).parent.parent.resolve()) + + candidate_libs.extend(dsl_libs) + + except Exception as e: + logger.debug(f"Failed to locate libraries due to an exception:", e) + + for lib in candidate_libs: + if lib.endswith(f"{_CUTE_DSL_RUNTIME_LIBRARY_NAME}.so"): + return lib + + return None + + +_FFI_CALLS_REGISTERED = False + + +def register_ffi(): + """Registers custom calls with Jax/XLA runtime.""" + global _FFI_CALLS_REGISTERED + if _FFI_CALLS_REGISTERED: + return + + runtime_library = find_cute_dsl_runtime_library() + if not runtime_library: + logger.debug( + "No CuTeDSL runtime library found - skipping python ffi registration." + ) + return + + lib = ctypes.CDLL(runtime_library) + + def _capsule(funcptr): + destructor = ctypes.CFUNCTYPE(None, ctypes.py_object) + builder = ctypes.pythonapi.PyCapsule_New + builder.restype = ctypes.py_object + builder.argtypes = (ctypes.c_void_p, ctypes.c_char_p, destructor) + return builder(funcptr, None, destructor(0)) + + def _register_ffi_targets(lib, targets): + for target_name, target in targets.items(): + handler = {} + for stage, fn_name in target.items(): + fn = getattr(lib, fn_name) + fn.restype = ctypes.c_void_p + handler[stage] = _capsule(fn) + logger.debug(f"Registering ffi handler: {target_name}, {handler}") + jax.ffi.register_ffi_target( + target_name, handler["execute"], platform="CUDA" + ) + + # Register the custom FFI targets + _register_ffi_targets(lib, _CUTLASS_CALL_TARGETS) + + _FFI_CALLS_REGISTERED = True + + +def is_ffi_registered(): + """Returns true if the FFI calls have been registered with Jax/XLA.""" + global _FFI_CALLS_REGISTERED + return _FFI_CALLS_REGISTERED diff --git a/python/CuTeDSL/cutlass/jax/primitive.py b/python/CuTeDSL/cutlass/jax/primitive.py new file mode 100644 index 00000000..f9d838ce --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/primitive.py @@ -0,0 +1,309 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import Any, Union, Sequence, Callable +from functools import partial +import logging +import os + +import cuda.bindings.driver as cuda + +import jax, jax.numpy as jnp +import jax.extend +from jax.interpreters import mlir +from jax._src.interpreters import ad +from jax._src.interpreters import batching +from jax._src import ffi +from jax.tree import flatten, unflatten + +import cutlass + +from .compile import get_or_compile_kernel, build_function_spec +from .types import row_major_layout, default_tensor_spec, TensorSpec +from .ffi import get_cutlass_call_ffi_name, is_ffi_registered, register_ffi + +logger = logging.getLogger(__name__) + +cutlass_call_inner_p = jax.extend.core.Primitive("cutlass_call_inner") +cutlass_call_inner_p.multiple_results = True + + +def cutlass_call( + fn: Callable[..., None], + *, + output_shape_dtype: Any, + input_spec: Any = None, + output_spec: Any = None, + input_mode: Any = None, + output_mode: Any = None, + input_output_aliases=None, + allow_cuda_graph=True, + compile_options=None, + use_static_tensors=False, + **kwargs, +): + """Creates a callable that invokes a @cute.jit function. + + Args: + fn: A @cute.jit decorated function that launches a cutlass kernel. + output_shape_dtype: A pytree representing the shape and dtype of the output buffers. + input_output_aliases: Optional mapping of input to output aliases. Positions are specified assuming + a flattened input and output pytree. + input_spec: Specifies a cute.Tensor dimension order for input tensors. If None then the order + will assume the corresponding layout order. + output_spec: Specifies a cute.Tensor dimension order for output tensors. If None then the order + will assume the corresponding layout order. + input_mode: Legacy alias for input_spec. This parameter may be removed in future versions. + output_spec: Legacy alias for output_spec. This parameter may be removed in future versions. + allow_cuda_graph: If false will prevent XLA from building a cuda graph of for this call. + compile_options: Optional compiler arguments to pass into cute.compile. + use_static_tensors: If True, tensor shapes and strides are treated as constexpr values by + default. This can improve performance through compiler specialization but may not work + properly with all kernels. Specific tensors may be marked static or dynamic using the mode + and override this flag. + kwargs: Optional constexpr parameters to pass into the kernel fn. + + Note: This API is experimental and subject to change! + """ + output_shape_dtype = jax.tree.map( + lambda leaf: jax.ShapeDtypeStruct(leaf.shape, leaf.dtype), output_shape_dtype + ) + + if input_output_aliases is None: + input_output_aliases = {} + + if input_spec and input_mode: + raise ValueError( + "input_spec and input_mode can not both be set. Use input_spec only as input_mode is deprecated." + ) + if input_mode: + input_spec = input_mode + + if output_spec and output_mode: + raise ValueError( + "input_spec and input_mode can not both be set. Use input_spec only as input_mode is deprecated." + ) + if output_mode: + output_spec = output_mode + + return _cutlass_call_impl( + fn, + output_shape_dtype=output_shape_dtype, + input_spec=input_spec, + output_spec=output_spec, + input_output_aliases=input_output_aliases, + allow_cuda_graph=allow_cuda_graph, + compile_options=compile_options, + use_static_tensors=use_static_tensors, + **kwargs, + ) + + +def _normalize_tensor_spec(value: Any): + if value is None: + return [None] + elif isinstance(value, (tuple, list)): + if isinstance(value[0], int): # single tuple of modes + return TensorSpec(mode=tuple(value)) + else: + flat, _ = jax.tree.flatten( + [_normalize_tensor_spec(x) for x in value], + is_leaf=lambda x: x is None or isinstance(x, TensorSpec), + ) + return flat + elif isinstance(value, TensorSpec): + return [value] + else: + raise TypeError(f"Unexpected value for TensorMode {value} {type(value)}") + + +def _cutlass_call_impl( + fn, + *, + output_shape_dtype: Any, + input_spec: Any, + output_spec: Any, + input_output_aliases, + allow_cuda_graph, + compile_options, + use_static_tensors, + **kwargs, +): + multiple_results = isinstance(output_shape_dtype, Sequence) + if not multiple_results: + output_shape_dtype = (output_shape_dtype,) + output_shape_dtype_flat, output_tree = jax.tree.flatten(output_shape_dtype) + + @partial(jax.jit, inline=True) + def call_wrapper(*args): + args_flat, args_tree = jax.tree.flatten(args) + + if input_spec is None: + input_spec_flat = tuple(default_tensor_spec(x) for x in args_flat) + else: + input_spec_flat = _normalize_tensor_spec(input_spec) + for idx, (spec, arg) in enumerate(zip(input_spec_flat, args_flat)): + if spec is None: + input_spec_flat[idx] = default_tensor_spec(arg) + input_spec_flat = tuple(input_spec_flat) + + if output_spec is None: + output_spec_flat = tuple( + default_tensor_spec(x) for x in output_shape_dtype_flat + ) + else: + output_spec_flat = _normalize_tensor_spec(output_spec) + for idx, (spec, arg) in enumerate( + zip(output_spec_flat, output_shape_dtype_flat) + ): + if spec is None: + output_spec_flat[idx] = default_tensor_spec(arg) + output_spec_flat = tuple(output_spec_flat) + if len(input_spec_flat) != len(args_flat): + raise ValueError( + f"Must has same number of input modes ({len(input_spec_flat)}) as input arrays ({len(args_flat)})." + ) + + if len(output_spec_flat) != len(output_shape_dtype_flat): + raise ValueError( + f"Must has same number of output modes ({len(output_spec_flat)}) as output arrays ({len(output_shape_dtype_flat)})." + ) + + # Validate dynamic mode settings match whatever static shape + # information we got as input. + for idx, (arg, spec) in enumerate(zip(args_flat, input_spec_flat)): + if spec.layout is not None and len(spec.layout) != len(arg.shape): + raise ValueError( + f"Input #{idx} has invalid layout {spec.layout} for shape {arg.shape}." + ) + if spec.mode is not None and len(spec.mode) != len(arg.shape): + raise ValueError( + f"Input #{idx} has invalid mode {spec.mode} for shape {arg.shape}." + ) + + for idx, (arg, spec) in enumerate( + zip(output_shape_dtype_flat, output_spec_flat) + ): + if spec.layout is not None and len(spec.layout) != len(arg.shape): + raise ValueError( + f"Output #{idx} has invalid layout {spec.layout} for shape {arg.shape}." + ) + + if spec.mode is not None and len(spec.mode) != len(arg.shape): + raise ValueError( + f"Output #{idx} has invalid mode {spec.mode} for shape {arg.shape}." + ) + + output_flat = cutlass_call_inner_p.bind( + *args_flat, + fn=fn, + args_tree=args_tree, + output_shape_dtype_flat=tuple(output_shape_dtype_flat), + output_tree=output_tree, + input_spec_flat=tuple(input_spec_flat), + output_spec_flat=tuple(output_spec_flat), + input_output_aliases=tuple(input_output_aliases.items()), + allow_cuda_graph=allow_cuda_graph, + compile_options=compile_options, + use_static_tensors=use_static_tensors, + **kwargs, + ) + + output = jax.tree.unflatten(output_tree, output_flat) + return output if multiple_results else output[0] + + return call_wrapper + + +@cutlass_call_inner_p.def_abstract_eval +def cutlass_call_inner_p_abstract(*_, output_shape_dtype_flat, **__): + return [jax.core.ShapedArray(x.shape, x.dtype) for x in output_shape_dtype_flat] + + +def cutlass_call_inner_p_impl( + *args_flat, + fn, + args_tree: Any, + output_shape_dtype_flat: Any, + output_tree: Any, + input_spec_flat: Any, + output_spec_flat: Any, + input_output_aliases, + allow_cuda_graph, + compile_options, + use_static_tensors, + **kwargs, +): + input_output_aliases = dict(input_output_aliases) + spec = build_function_spec( + args_flat, + args_tree, + output_shape_dtype_flat, + output_tree, + input_spec_flat, + output_spec_flat, + input_output_aliases, + compile_options, + use_static_tensors, + kwargs, + ) + + kernel = get_or_compile_kernel(fn, spec) + + # Ensure our FFI target is registered. We do this lazily here + # so that we only load the dependant library if needed. + if not is_ffi_registered(): + register_ffi() + + call_name = get_cutlass_call_ffi_name(allow_cuda_graph) + fun = jax.ffi.ffi_call( + call_name, + result_shape_dtypes=output_shape_dtype_flat, + input_output_aliases=dict(spec.input_output_aliases), + ) + + return fun(*args_flat, module=kernel.module, key=kernel.fingerprint) + + +def _cutlass_call_jvp_rule(*args, **kwargs): + del args, kwargs + raise NotImplementedError( + "cutlass_call does not support VJP. Please use `jax.custom_jvp` for taking gradients." + ) + + +ad.primitive_jvps[cutlass_call_inner_p] = _cutlass_call_jvp_rule + + +def _cutlass_call_transpose_rule(*args, **kwargs): + del args, kwargs + raise NotImplementedError( + "cutlass_call does not support transpose. Please use `jax.custom_vjp` for taking gradients." + ) + + +ad.primitive_transposes[cutlass_call_inner_p] = _cutlass_call_transpose_rule + + +def _cutlass_call_vmap_rule(*args, **kwargs): + del args, kwargs + raise NotImplementedError( + "cutlass_call does not support batching with jax.vmap. Please " + "use jax.custom_batching.custom_vmap for applying vmap. " + ) + + +batching.primitive_batchers[cutlass_call_inner_p] = _cutlass_call_vmap_rule + +jax._src.dispatch.simple_impl(cutlass_call_inner_p) +jax._src.dispatch.prim_requires_devices_during_lowering.add(cutlass_call_inner_p) +lowering = mlir.lower_fun(cutlass_call_inner_p_impl, multiple_results=True) +mlir.register_lowering(cutlass_call_inner_p, lowering, platform="cuda") diff --git a/python/CuTeDSL/cutlass/jax/testing.py b/python/CuTeDSL/cutlass/jax/testing.py new file mode 100644 index 00000000..781671a2 --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/testing.py @@ -0,0 +1,258 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from functools import partial + +import jax +import jax.numpy as jnp + +import cutlass.cute as cute +from cutlass.cutlass_dsl import dsl_user_op + +def reorder_modes(src: str, target: str) -> tuple[int, ...]: + """Computes the mode given a source and target order.""" + src = tuple(src) + target = tuple(target) + src_map = {} + for idx, s in enumerate(src): + src_map[s] = idx + return tuple([src_map[d] for d in target]) + + +def gemm_a_major(d: str): + """Returns order for A tensor major mode.""" + return {"k": "lmk", "m": "lkm"}[d] + + +def gemm_a_mode(d: str) -> tuple[int, ...]: + """Returns mode for A tensor major mode.""" + return reorder_modes(gemm_a_major(d), "mkl") + + +def gemm_b_major(d: str): + """Returns order for B tensor major mode.""" + return {"k": "lnk", "n": "lkn"}[d] + + +def gemm_b_mode(d: str) -> tuple[int, ...]: + """Returns mode for B tensor major mode.""" + return reorder_modes(gemm_b_major(d), "nkl") + + +def gemm_c_major(d: str): + """Returns order for C tensor major mode.""" + return {"n": "lmn", "m": "lnm"}[d] + + +def gemm_c_mode(d: str) -> tuple[int, ...]: + """Returns mode for C tensor major mode.""" + return reorder_modes(gemm_c_major(d), "mnl") + + +def gemm_a_shape(l, m, k, major) -> tuple[int, ...]: + """Returns shape for A tensor given major mode.""" + assert major in ("k", "m") + shape = (l, m, k) if major == "k" else (l, k, m) + return shape + + +def gemm_b_shape(l, n, k, major) -> tuple[int, ...]: + """Returns shape for B tensor given major mode.""" + assert major in ("k", "n") + shape = (l, n, k) if major == "k" else (l, k, n) + return shape + + +def gemm_c_shape(l, m, n, major) -> tuple[int, ...]: + """Returns shape for C tensor given major mode.""" + assert major in ("m", "n") + shape = (l, m, n) if major == "n" else (l, n, m) + return shape + + +@dsl_user_op +def get_gemm_shape_from_tensors( + a: cute.Tensor, b: cute.Tensor, *, loc=None, ip=None +) -> tuple[int, int, int, int]: + """Returns a tuple of (M, N, K, L) from A/B gemm tensors.""" + # mkl, nkl + m, k, l = a.shape[:] + n = b.shape[0] + return (m, n, k, l) + +def create_tensor( + shape, dtype, key, *, minval=-2.0, maxval=2.0, fill_value=None, fill_arange=False +): + if fill_arange: + tensor = jnp.ones(shape, dtype=dtype) + tensor = tensor * jnp.arange(tensor.size, dtype=tensor.dtype).reshape( + tensor.shape + ) + elif fill_value is not None: + tensor = jnp.full(shape, fill_value, dtype=dtype) + else: + tensor = jax.random.uniform( + key, shape, dtype=jnp.float32, minval=minval, maxval=maxval + ) + tensor = tensor.astype(dtype) + return tensor + + +def create_a_tensor( + l, + m, + k, + major, + dtype, + key, + minval=-2.0, + maxval=2.0, + fill_value=None, + fill_arange=False, +): + shape = gemm_a_shape(l, m, k, major) + tensor = create_tensor( + shape, + dtype, + key, + minval=minval, + maxval=maxval, + fill_value=fill_value, + fill_arange=fill_arange, + ) + return tensor + + +def create_b_tensor( + l, + n, + k, + major, + dtype, + key, + minval=-2.0, + maxval=2.0, + fill_value=None, + fill_arange=False, +): + shape = gemm_b_shape(l, n, k, major) + tensor = create_tensor( + shape, + dtype, + key, + minval=minval, + maxval=maxval, + fill_value=fill_value, + fill_arange=fill_arange, + ) + return tensor + + +def create_cd_tensor( + l, + m, + n, + major, + dtype, + key, + *, + minval=-2.0, + maxval=2.0, + fill_value=None, + fill_arange=False, +): + shape = gemm_c_shape(l, m, n, major) + tensor = create_tensor( + shape, + dtype, + key, + minval=minval, + maxval=maxval, + fill_value=fill_value, + fill_arange=fill_arange, + ) + return tensor + + +def gemm_reference_einsum( + a, + b, + acc_dtype, + c_dtype, + a_major, + b_major, + c_major, + sf_a=None, + sf_b=None, + precision="highest", +): + a_idx = gemm_a_major(a_major) + b_idx = gemm_b_major(b_major) + c_idx = gemm_c_major(c_major) + spec = f"{a_idx},{b_idx}->{c_idx}" + + # If block scaled pre-scale input at higher precision + # Assumes we only use it for fp8 and smaller. + if sf_a is not None: + sf_vec_size = int(a.shape[-1] // sf_a.shape[-1]) + sf_a = jnp.repeat(sf_a, sf_vec_size, axis=-1) + a = a.astype(jnp.float16) * sf_a.astype(jnp.float16) + + if sf_b is not None: + sf_vec_size = int(b.shape[-1] // sf_b.shape[-1]) + sf_b = jnp.repeat(sf_b, sf_vec_size, axis=-1) + b = b.astype(jnp.float16) * sf_b.astype(jnp.float16) + + return jax.jit( + lambda a, b: jnp.einsum( + spec, a, b, preferred_element_type=acc_dtype, precision=precision + ).astype(c_dtype) + )(a, b) + + +def create_attn_tensors( + b, s, hq, hkv, d, dtype, key, *, minval=-2.0, maxval=2.0, fill_value=None +): + qkey, kkey, vkey = jax.random.split(key, 3) + return ( + create_tensor( + (b, s, hq, d), + dtype, + qkey, + minval=minval, + maxval=maxval, + fill_value=fill_value, + ), + create_tensor( + (b, s, hkv, d), + dtype, + kkey, + minval=minval, + maxval=maxval, + fill_value=fill_value, + ), + create_tensor( + (b, s, hkv, d), + dtype, + vkey, + minval=minval, + maxval=maxval, + fill_value=fill_value, + ), + ) + + +def attn_ref(q, k, v, is_causal: bool): + return jax.jit( + lambda q, k, v: jax.nn.dot_product_attention( + q, k, v, is_causal=is_causal, implementation="cudnn" + ) + )(q, k, v) diff --git a/python/CuTeDSL/cutlass/jax/types.py b/python/CuTeDSL/cutlass/jax/types.py new file mode 100644 index 00000000..e6f84ac2 --- /dev/null +++ b/python/CuTeDSL/cutlass/jax/types.py @@ -0,0 +1,425 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import Type, Optional, Sequence, Union, Callable, Any, TypeVar +import sys +import ctypes +import math +import inspect +from dataclasses import dataclass, field +from functools import partial, reduce +from operator import mul +from itertools import chain +from typing import Annotated + +import cuda.bindings.driver as cuda + +import jax +import jax.numpy as jnp + +import cutlass +import cutlass.cute as cute +from cutlass.cute.runtime import from_dlpack as _from_dlpack +from cutlass.cute import AddressSpace, Numeric, IntTuple +from cutlass._mlir import ir +from cutlass._mlir.dialects import llvm, arith +import cutlass._mlir.dialects.cute as _cute_ir + +JAX_DTYPE_TO_CUTLASS_DTYPE = { + jnp.bool.dtype: cutlass.Boolean, + jnp.int8.dtype: cutlass.Int8, + jnp.int16.dtype: cutlass.Int16, + jnp.int32.dtype: cutlass.Int32, + jnp.int64.dtype: cutlass.Int64, + jnp.uint8.dtype: cutlass.Uint8, + jnp.uint16.dtype: cutlass.Uint16, + jnp.uint32.dtype: cutlass.Uint32, + jnp.uint64.dtype: cutlass.Uint64, + jnp.bfloat16.dtype: cutlass.BFloat16, + jnp.float16.dtype: cutlass.Float16, + jnp.float32.dtype: cutlass.Float32, + jnp.float64.dtype: cutlass.Float64, + jnp.float8_e8m0fnu.dtype: cutlass.Float8E8M0FNU, + jnp.float8_e5m2.dtype: cutlass.Float8E5M2, + jnp.float8_e4m3.dtype: cutlass.Float8E4M3, + jnp.float8_e4m3fn.dtype: cutlass.Float8E4M3FN, + jnp.float8_e4m3b11fnuz.dtype: cutlass.Float8E4M3B11FNUZ, + jnp.float4_e2m1fn.dtype: cutlass.Float4E2M1FN, +} +CUTLASS_DTYPE_TO_JAX_DTYPE = { + value: key for key, value in JAX_DTYPE_TO_CUTLASS_DTYPE.items() +} + +DEFAULT_CUTLASS_DEVICE_MEMSPACE = AddressSpace.gmem +DEFAULT_CUTLASS_DEVICE_BUFFER_ALIGNMENT = 256 + + +@jax.tree_util.register_dataclass +@dataclass(frozen=True) +class TensorSpec: + """Provides a specification of cute.Tensor modes and additional metadata about + dynamic/static shapes for compilation. + + Arguments: + layout : Specifies the position of stries as they relate to the framework + tensor (S0, S1, ... SN) + mode : Specifies the position of each mode in the tensor (M0, M1, ... MN) + static : Specifies the tensor shape is represented as static constexpr. + ptr_assumed_align: Specifies the pointer alignment. + """ + + # Specifies the layout of the Jax array. If not it will be assumed that the layout + # is row major. + layout: tuple[int, ...] | None = field(metadata=dict(static=True), default=None) + # Indicates the order of modes. If unspecified the modes will match exactly with + # the layout of the Jax tensor (e.g. row-major). Typically used to map from the + # input layout to kernel layouts (e.g. MKL/NKL/MNL). + mode: tuple[int, ...] | None = field(metadata=dict(static=True), default=None) + # Indicates the shape and strides will be defined statically. Setting True ay enable + # additional optimization. Kernels that do not support static shapes will generate + # compile errors if this is enabled so we leave it off by default. + static: bool = field(metadata=dict(static=True), default=None) + # Overrides the default pointer alignment. Generally this should not be changed + # but is left here to provide a hook. + ptr_assumed_align: int = field( + metadata=dict(static=True), default=DEFAULT_CUTLASS_DEVICE_BUFFER_ALIGNMENT + ) + +def row_major_layout(shaped): + """Returns a row major layout given a shaped value. + + Row major layout is (N-1, N-2, ... 1, 0) for an N-dimensional tensor. + """ + if hasattr(shaped, "shape"): + shaped = shaped.shape + return tuple(reversed(range(len(shaped)))) + + +def default_tensor_mode(shaped): + """Returns a default tensor mode given a shaped value. + + Default mode is (0, 1, ... N-2, N-1) for an N_dimensional tensor. + """ + if hasattr(shaped, "shape"): + shaped = shaped.shape + return tuple(range(len(shaped))) + + +def default_tensor_spec(shaped) -> TensorSpec: + """Returns a default tensor spec given a shaped value. + + Default layout is (N-1, N-2, ... 1, 0) for an N-dimensional tensor. + Default mode is (0, 1, ... N-2, N-1) for an N_dimensional tensor. + """ + if hasattr(shaped, "shape"): + shaped = shaped.shape + return TensorSpec(layout=row_major_layout(shaped), mode=default_tensor_mode(shaped)) + + +def jax_to_cutlass_dtype(dtype): + """Gets the corresponding cutlass dtype given a jax dtype.""" + dtype = jnp.dtype(dtype) + if dtype not in JAX_DTYPE_TO_CUTLASS_DTYPE: + raise ValueError(f"Jax dtype [{dtype}] has no equivalent cutlass dtype.") + return JAX_DTYPE_TO_CUTLASS_DTYPE[dtype] + + +def cutlass_to_jax_dtype(dtype): + """Gets the corresponding cutlass dtype given a jax dtype.""" + if dtype not in CUTLASS_DTYPE_TO_JAX_DTYPE: + raise ValueError(f"Cutlass dtype [{dtype}] has no equivalent jax dtype.") + return CUTLASS_DTYPE_TO_JAX_DTYPE[dtype] + + +def from_dlpack(array, assumed_align: int = DEFAULT_CUTLASS_DEVICE_BUFFER_ALIGNMENT): + """Convert jax.Array to a DL pack tensor.""" + return _from_dlpack(array, assumed_align=assumed_align) + + +class JaxArray: + """Base class for JaxArray argument type. + + JaxArray provides glue between XLA/JAX FFI tensors and cute.Tensor. + + The following fields/properties provide control over the conversion + to cute.Tensor as part of jax.jit lowering. These properties are + constexpr and compiled into the kernel. + + 1. dtype: The tensor data type defined by the jax array. + 2. shape: The tensor shape defined at jit tracing time. This shape + can be concrete or symbolic in the case of jax.export. + 3. mem_space: The memory space of the tensor. Defaults to gmem. + 4. assumed_align: The alignment of the tensor. Defaults to XLA alignment. + 5. order: Specifies the order of the shape to determine strides. + 6. mode: Specifies how to map ordered elements to the modes od a cute.Layout. + 7. static: If True, tensor shapes and strides are compiled statically. + """ + + def __init__( + self, + dtype, + shape, + mem_space, + assumed_align, + order=None, + mode=None, + static=False, + ): + self.dtype = dtype + self.shape = tuple(shape) + self.ndim = len(self.shape) + self.mem_space = mem_space + self.assumed_align = assumed_align + if order is None: + order = row_major_layout(shape) + if mode is None: + mode = default_tensor_mode(shape) + + if len(order) != len(shape): + raise ValueError(f"layout must be same length as shape", order, shape) + for s in order: + if s < 0 or s >= len(shape): + raise ValueError(f"Invalid index {s} in stride order", order, shape) + if len(tuple(set(order))) != len(order): + raise ValueError(f"layout has duplicate indices", order) + + if len(mode) != len(shape): + raise ValueError(f"mode must be same length as shape", mode, shape) + for s in mode: + if s < 0 or s >= len(shape): + raise ValueError(f"Invalid index {s} in stride order", mode, shape) + if len(tuple(set(mode))) != len(mode): + raise ValueError(f"mode has duplicate indices", mode) + + self.order = tuple(order) + self.mode = tuple(mode) + + if any([jax.export.is_symbolic_dim(s) for s in self.shape]) and static: + raise ValueError( + f"{self.shape} contains one or more symbolic dimensions requires static=False" + ) + self.static = static + + +class JaxArrayValue(JaxArray): + """The IR representation of the JaxArray.""" + + def __init__( + self, + ir_value, + dtype, + shape, + mem_space, + assumed_align, + order, + mode, + static, + ): + super().__init__(dtype, shape, mem_space, assumed_align, order, mode, static) + self.value = ir_value + + def __str__(self): + return f"JaxArrayValue<{self.value}:{self.dtype}:{self.shape}:{self.order}:{self.mode}:{self.static}>" + + def __repr__(self): + return str(self) + + def _make_ordered_layout_dynamic_strides( + self, shape, order: tuple[int, ...], *, loc=None, ip=None + ): + i32 = ir.IntegerType.get_signless(32) + i64 = ir.IntegerType.get_signless(64) + one = arith.constant(i64, 1) + zero = arith.constant(i64, 0) + pairs = sorted(zip(shape, order), key=lambda x: x[1]) + + # Compute strides for each element in order. + strides = [1] # static 1 for leading + if len(shape) > 1: + strides.append(pairs[0][0]) + for i, idx in enumerate(range(len(pairs[:-2]))): + strides.append(arith.muli(pairs[i][0], strides[-1])) + + # Apply the order to strides + strides_ordered = [] + for i in range(len(shape)): + strides_ordered.append(strides[order[i]]) + + # zero out any stride for a shape of size 1 to align with make_ordered_layout + # We ignore the leading dimension of 1 + final_stride = [] + for i in range(len(shape)): + x = arith.cmpi(0, one, shape[i]) + s = strides_ordered[i] + if isinstance(s, int) and s == 1: + final_stride.append(s) + else: + final_stride.append(arith.select(x, zero, s)) + + # Shapes are expected to be int32 so truncate to that before creating layout + shape = tuple([arith.trunci(i32, s) for s in shape]) + + return cute.make_layout(shape, stride=tuple(final_stride)) + + def _load_dynamic_shapes(self, ffi_buffer, *, loc=None, ip=None): + i64 = ir.IntegerType.get_signless(64) + shape_array = llvm.extractvalue( + llvm.PointerType.get(), + ffi_buffer, + [1], + loc=loc, + ip=ip, + ) + + shape_i64 = [] + for i in range(len(self.shape)): + r = llvm.getelementptr( + llvm.PointerType.get(), + shape_array, + [], + raw_constant_indices=ir.DenseI32ArrayAttr.get([i]), + elem_type=i64, + loc=loc, + ip=ip, + ) + shape_i64.append(llvm.load(i64, r, loc=loc, ip=ip)) + + return tuple(shape_i64) + + def _load_pointer(self, ffi_buffer, *, loc=None, ip=None): + raw_ptr = llvm.extractvalue( + llvm.PointerType.get(), + ffi_buffer, + [0], + loc=loc, + ip=ip, + ) + return cute.make_ptr( + self.dtype, + raw_ptr, + self.mem_space, + assumed_align=self.assumed_align, + loc=loc, + ip=ip, + ) + + def get_tensor(self, *, loc=None, ip=None): + ffi_buffer_type = llvm.StructType.get_literal( + [llvm.PointerType.get(), llvm.PointerType.get()] + ) + + ffi_buffer = llvm.load(ffi_buffer_type, self.value, loc=loc, ip=ip) + pointer = self._load_pointer(ffi_buffer) + + if self.static: + shape = tuple(self.shape) + layout = cute.make_ordered_layout(shape, order=self.order, loc=loc, ip=ip) + else: + shape = self._load_dynamic_shapes(ffi_buffer) + layout = self._make_ordered_layout_dynamic_strides(shape, self.order) + + # Apply mode order + if self.mode is not None: + layout = cute.select(layout, self.mode, loc=loc, ip=ip) + + return cute.make_tensor(pointer, layout, loc=loc, ip=ip) + + def __extract_mlir_values__(self): + return [self.value] + + def __new_from_mlir_values__(self, values): + return JaxArrayValue( + values[0], + self.dtype, + self.shape, + self.mem_space, + self.assumed_align, + self.order, + self.mode, + self.static, + ) + + +class JaxTracedArray(JaxArray): + """Represents a traced array value that is used for cute.compile. + + Traced values are not real tensors or allocated on the device. + """ + + def __init__( + self, + dtype, + shape, + mem_space, + assumed_align, + order, + mode, + static, + ): + super().__init__(dtype, shape, mem_space, assumed_align, order, mode, static) + + def __str__(self): + return f"JaxTracedArray<{self.dtype}:{self.shape}:{self.order}:{self.mode}:{self.static}>" + + def __repr__(self): + return str(self) + + def __get_mlir_types__(self): + # Struct passed as opaque object. + return [llvm.PointerType.get()] + + def __new_from_mlir_values__(self, values): + return JaxArrayValue( + values, + self.dtype, + self.shape, + self.mem_space, + self.assumed_align, + self.order, + self.mode, + self.static, + ) + + def __c_pointers__(self): + return [0] + + +class JaxArrayList: + """Holds list of JaxArray or JaxTracedArray. + This class facilitates conversion of JaxTracedArray to JaxArray when crossing + the jit boundary. + """ + + def __init__(self, arrays: Sequence[JaxArray]): + self.arrays = tuple(arrays) + + def __getitem__(self, idx): + return self.arrays[idx] + + def __len__(self): + return len(self.arrays) + + def __iter__(self): + return iter(self.arrays) + + def __c_pointers__(self): + return [x.__c_pointers__()[0] for x in self.arrays] + + def __get_mlir_types__(self): + return [x.__get_mlir_types__()[0] for x in self.arrays] + + def __extract_mlir_values__(self): + return [x.__extract_mlir_values__()[0] for x in self.arrays] + + def __new_from_mlir_values__(self, values): + return JaxArrayList( + [x.__new_from_mlir_values__(v) for x, v in zip(self.arrays, values)] + ) diff --git a/python/CuTeDSL/cutlass/pipeline/__init__.py b/python/CuTeDSL/cutlass/pipeline/__init__.py index 461f01dd..1263f3fc 100644 --- a/python/CuTeDSL/cutlass/pipeline/__init__.py +++ b/python/CuTeDSL/cutlass/pipeline/__init__.py @@ -35,7 +35,6 @@ from .sm90 import ( PipelineAsync, PipelineCpAsync, PipelineTmaAsync, - PipelineTmaMultiConsumersAsync, PipelineTmaStore, PipelineOrder, PipelineProducer, @@ -46,6 +45,8 @@ from .sm100 import ( PipelineTmaUmma, PipelineAsyncUmma, PipelineUmmaAsync, + PipelineClcFetchAsync, + PipelineTmaMultiConsumersAsync, ) __all__ = [ @@ -63,9 +64,10 @@ __all__ = [ "PipelineCpAsync", "PipelineTmaAsync", "PipelineTmaUmma", - "PipelineTmaMultiConsumersAsync", "PipelineAsyncUmma", "PipelineUmmaAsync", + "PipelineClcFetchAsync", + "PipelineTmaMultiConsumersAsync", "PipelineTmaStore", "PipelineProducer", "PipelineConsumer", diff --git a/python/CuTeDSL/cutlass/pipeline/helpers.py b/python/CuTeDSL/cutlass/pipeline/helpers.py index a422037b..20479c15 100644 --- a/python/CuTeDSL/cutlass/pipeline/helpers.py +++ b/python/CuTeDSL/cutlass/pipeline/helpers.py @@ -102,6 +102,8 @@ class PipelineOp(enum.Enum): TCGen05Mma = enum.auto() # Tensor Memory Accelerator load TmaLoad = enum.auto() + # Cluster launch cancel response load + ClcLoad = enum.auto() # TMA Store consuming smem produced by AsyncThread TmaStore = enum.auto() # Composite of multiple PipelineOps @@ -161,12 +163,16 @@ class MbarrierArray(SyncObject): MbarrierArray implements an abstraction for an array of smem barriers. """ + @dsl_user_op def __init__( self, barrier_storage: cute.Pointer, num_stages: int, agent: tuple[PipelineOp, CooperativeGroup], tx_count: int = 0, + *, + loc=None, + ip=None, ) -> None: self.barrier_storage = barrier_storage self.tx_count = tx_count @@ -187,7 +193,7 @@ class MbarrierArray(SyncObject): self.mbarrier_base = self.barrier_storage # Mbarrier initialization in constructor - self.mbarrier_init() + self.mbarrier_init(loc=loc, ip=ip) def recast_to_new_op_type(self, new_op_type: PipelineOp) -> "MbarrierArray": """ @@ -207,6 +213,7 @@ class MbarrierArray(SyncObject): return new_mbarrier_array # Mbarrier initialization + @dsl_user_op def mbarrier_init(self, *, loc=None, ip=None) -> None: """ Initializes an array of mbarriers using warp 0. @@ -226,6 +233,7 @@ class MbarrierArray(SyncObject): if_generate(warp_idx == 0, then_body, loc=loc, ip=ip) + @dsl_user_op def arrive( self, index: int, @@ -257,7 +265,13 @@ class MbarrierArray(SyncObject): ) self.arrive_tcgen05mma(index, dst, cta_group, loc=loc, ip=ip) elif self.op_type in [PipelineOp.TmaLoad]: - self.arrive_and_expect_tx(index, self.tx_count) + # TMA operation signals local mbarrier only + self.arrive_and_expect_tx(index, self.tx_count, loc=loc, ip=ip) + elif self.op_type in [PipelineOp.ClcLoad]: + # Multiple threads in CTA 0 each signal a different remote CTA in cluster's mbarrier + self.arrive_and_expect_tx_with_dst( + index, self.tx_count, dst, loc=loc, ip=ip + ) elif self.op_type is PipelineOp.AsyncLoad: self.arrive_cp_async_mbarrier(index, loc=loc, ip=ip) else: @@ -265,6 +279,7 @@ class MbarrierArray(SyncObject): f"Error: MbarrierArray is not supported for PipelineOp: {_get_pipeline_op(self.op_type)}." ) + @dsl_user_op def arrive_mbarrier( self, index: int, dst_rank: Optional[int] = None, *, loc=None, ip=None ) -> None: @@ -277,11 +292,13 @@ class MbarrierArray(SyncObject): self.get_barrier(index, loc=loc, ip=ip), dst_rank, loc=loc, ip=ip ) + @dsl_user_op def arrive_cp_async_mbarrier(self, index: int, *, loc=None, ip=None): cute.arch.cp_async_mbarrier_arrive_noinc( self.get_barrier(index, loc=loc, ip=ip), loc=loc, ip=ip ) + @dsl_user_op def arrive_tcgen05mma( self, index: int, @@ -306,20 +323,34 @@ class MbarrierArray(SyncObject): ip=ip, ) - def arrive_and_expect_tx(self, index: int, tx_count: int) -> None: - with cute.arch.elect_one(): - cute.arch.mbarrier_arrive_and_expect_tx(self.get_barrier(index), tx_count) + @dsl_user_op + def arrive_and_expect_tx( + self, index: int, tx_count: int, *, loc=None, ip=None + ) -> None: + with cute.arch.elect_one(loc=loc, ip=ip): + cute.arch.mbarrier_arrive_and_expect_tx( + self.get_barrier(index, loc=loc, ip=ip), tx_count, loc=loc, ip=ip + ) + @dsl_user_op + def arrive_and_expect_tx_with_dst( + self, index: int, tx_count: int, dst: Optional[int] = None, *, loc=None, ip=None + ) -> None: + cute.arch.mbarrier_arrive_and_expect_tx(self.get_barrier(index), tx_count, dst, loc=loc, ip=ip) + + @dsl_user_op def try_wait(self, index: int, phase: int, *, loc=None, ip=None) -> Boolean: return cute.arch.mbarrier_try_wait( self.get_barrier(index, loc=loc, ip=ip), phase, loc=loc, ip=ip ) + @dsl_user_op def wait(self, index: int, phase: int, *, loc=None, ip=None) -> None: cute.arch.mbarrier_wait( self.get_barrier(index, loc=loc, ip=ip), phase, loc=loc, ip=ip ) + @dsl_user_op def arrive_and_wait( self, index: int, @@ -333,9 +364,11 @@ class MbarrierArray(SyncObject): arrive(index, dst, cta_group, loc=loc, ip=ip) wait(index, phase, loc=loc, ip=ip) + @dsl_user_op def arrive_and_drop(self, *, loc=None, ip=None) -> None: raise NotImplementedError("Error: Not yet supported.") + @dsl_user_op def get_barrier(self, index: int, *, loc=None, ip=None) -> cute.Pointer: return self.mbarrier_base + index @@ -440,12 +473,15 @@ class NamedBarrier(SyncObject): ip=ip, ) + @dsl_user_op def arrive_and_drop(self, *, loc=None, ip=None) -> None: raise NotImplementedError("Error: Not supported.") + @dsl_user_op def sync(self, *, loc=None, ip=None) -> None: self.arrive_and_wait() + @dsl_user_op def get_barrier(self, *, loc=None, ip=None) -> int: return self.barrier_id @@ -490,6 +526,7 @@ class TmaStoreFence(SyncObject): raise NotImplementedError("Error: Not supported.") # TmaStoreFence doesn't have mbarriers + @dsl_user_op def get_barrier(self, *, loc=None, ip=None) -> None: assert False, ( "Error: TmaStoreFence doesn't use mbarriers and cannot return a barrier." @@ -511,6 +548,7 @@ class TmaStoreFence(SyncObject): class PipelineUserType(enum.Enum): Producer = enum.auto() Consumer = enum.auto() + ProducerConsumer = enum.auto() ############################################################################## @@ -548,11 +586,12 @@ class PipelineState: def phase(self) -> Int32: return self._phase - def reset_count(self): - self._count = Int32(0) + @dsl_user_op + def reset_count(self, *, loc=None, ip=None): + self._count = Int32(0, loc=loc, ip=ip) @dsl_user_op - def advance(self, *, loc=None, ip=None): + def advance(self, *, loc=None, ip=None) -> None: self._index += 1 self._count += 1 @@ -613,18 +652,19 @@ class PipelineState: ) +@dsl_user_op def make_pipeline_state(type: PipelineUserType, stages: int, *, loc=None, ip=None): """ Creates a pipeline state. Producers are assumed to start with an empty buffer and have a flipped phase bit of 1. """ - if type is PipelineUserType.Producer: + if type in (PipelineUserType.Producer, PipelineUserType.ProducerConsumer): return PipelineState( stages, Int32(0, loc=loc, ip=ip), Int32(0, loc=loc, ip=ip), Int32(1, loc=loc, ip=ip), ) - elif type is PipelineUserType.Consumer: + elif type in (PipelineUserType.Consumer, PipelineUserType.ProducerConsumer): return PipelineState( stages, Int32(0, loc=loc, ip=ip), @@ -642,6 +682,7 @@ def make_pipeline_state(type: PipelineUserType, stages: int, *, loc=None, ip=Non ############################################################################## +@dsl_user_op def pipeline_init_arrive( cluster_shape_mn: Optional[cute.Layout] = None, is_relaxed: bool = False, @@ -667,6 +708,7 @@ def pipeline_init_arrive( cute.arch.cluster_arrive(loc=loc, ip=ip) +@dsl_user_op def pipeline_init_wait( cluster_shape_mn: Optional[cute.Layout] = None, *, loc=None, ip=None ): @@ -682,11 +724,13 @@ def pipeline_init_wait( cute.arch.cluster_wait(loc=loc, ip=ip) +@dsl_user_op def _sync(group: Agent, is_relaxed: bool = False, *, loc=None, ip=None): warnings.warn("_sync is deprecated. Please use agent_sync instead.") agent_sync(group, is_relaxed, loc=loc, ip=ip) +@dsl_user_op def agent_sync(group: Agent, is_relaxed: bool = False, *, loc=None, ip=None): """ Syncs all threads within an agent. @@ -720,6 +764,7 @@ def _mbarrier_i64_to_ptr(val: Int64) -> cute.Pointer: # NamedBarrier free functions +@dsl_user_op def arrive(barrier_id: int, num_threads: int, *, loc=None, ip=None): """ The aligned flavor of arrive is used when all threads in the CTA will execute the @@ -730,6 +775,7 @@ def arrive(barrier_id: int, num_threads: int, *, loc=None, ip=None): ) +@dsl_user_op def arrive_unaligned(barrier_id: int, num_threads: int, *, loc=None, ip=None): """ The unaligned flavor of arrive can be used with an arbitrary number of threads in the CTA. @@ -745,6 +791,7 @@ def arrive_unaligned(barrier_id: int, num_threads: int, *, loc=None, ip=None): ) +@dsl_user_op def wait(barrier_id: int, num_threads: int): """ NamedBarriers do not have a standalone wait like mbarriers, only an arrive_and_wait. @@ -759,6 +806,7 @@ def wait(barrier_id: int, num_threads: int): arrive_and_wait(loc=loc, ip=ip) +@dsl_user_op def wait_unaligned(barrier_id: int, num_threads: int, *, loc=None, ip=None): warnings.warn( "NamedBarrier wait also arrives on the barrier. Routing call to NamedBarrier.arrive_and_wait()." @@ -774,11 +822,13 @@ def wait_unaligned(barrier_id: int, num_threads: int, *, loc=None, ip=None): ) +@dsl_user_op def arrive_and_wait(barrier_id: int, num_threads: int, *, loc=None, ip=None): cute.arch.barrier( barrier_id=barrier_id, number_of_threads=num_threads, loc=loc, ip=ip ) +@dsl_user_op def sync(barrier_id: int = 0, *, loc=None, ip=None): cute.arch.barrier(barrier_id=barrier_id, loc=loc, ip=ip) diff --git a/python/CuTeDSL/cutlass/pipeline/sm100.py b/python/CuTeDSL/cutlass/pipeline/sm100.py index a962bdde..76a17b24 100644 --- a/python/CuTeDSL/cutlass/pipeline/sm100.py +++ b/python/CuTeDSL/cutlass/pipeline/sm100.py @@ -14,12 +14,15 @@ from typing import Optional import cutlass import cutlass.cute as cute -from cutlass.cutlass_dsl import Boolean, if_generate +from cutlass.cutlass_dsl import Boolean, Int32, if_generate, dsl_user_op from cutlass.pipeline import ( Agent, CooperativeGroup, PipelineOp, + SyncObject, + MbarrierArray, + TmaStoreFence, PipelineState, PipelineAsync, agent_sync, @@ -39,23 +42,66 @@ class PipelineTmaUmma(PipelineAsync): is_leader_cta: bool cta_group: cute.nvgpu.tcgen05.CtaGroup + @dsl_user_op + @staticmethod + def _make_sync_object( + barrier_storage: cute.Pointer, + num_stages: int, + agent: tuple[PipelineOp, CooperativeGroup], + tx_count: int = 0, + *, + loc=None, + ip=None, + ) -> SyncObject: + """ + Returns a SyncObject corresponding to an agent's PipelineOp. + """ + if agent[0] in [ + PipelineOp.AsyncThread, + PipelineOp.TmaLoad, + PipelineOp.TCGen05Mma, + PipelineOp.Composite, + PipelineOp.AsyncLoad, + PipelineOp.ClcLoad, + ]: + return MbarrierArray( + barrier_storage=barrier_storage, + num_stages=num_stages, + agent=agent, + tx_count=tx_count, + loc=loc, + ip=ip, + ) + elif agent[0] is PipelineOp.TmaStore: + # Path taken for AsyncTmaStore + return TmaStoreFence(num_stages=num_stages) + else: + assert False, "Error: Invalid PipelineOp specified." + + @dsl_user_op @staticmethod def _compute_mcast_arrival_mask( - cta_layout_vmnk: cute.Layout, mcast_mode_mn: tuple[int, int] + cta_layout_vmnk: cute.Layout, + mcast_mode_mn: tuple[int, int], + *, + loc=None, + ip=None, ): """ Computes a mask for signaling arrivals to multicasting threadblocks. """ cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + cute.arch.block_idx_in_cluster(loc=loc, ip=ip), loc=loc, ip=ip + ) + cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord( + cta_rank_in_cluster, loc=loc, ip=ip ) - cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord(cta_rank_in_cluster) tma_mcast_mask_a = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=2 + cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=2, loc=loc, ip=ip ) tma_mcast_mask_b = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=1 + cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=1, loc=loc, ip=ip ) block_in_cluster_coord_vmnk_peer = ( @@ -63,10 +109,18 @@ class PipelineTmaUmma(PipelineAsync): *cta_in_cluster_coord_vmnk[1:], ) tma_mcast_mask_a_peer = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, block_in_cluster_coord_vmnk_peer, mcast_mode=2 + cta_layout_vmnk, + block_in_cluster_coord_vmnk_peer, + mcast_mode=2, + loc=loc, + ip=ip, ) tma_mcast_mask_b_peer = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, block_in_cluster_coord_vmnk_peer, mcast_mode=1 + cta_layout_vmnk, + block_in_cluster_coord_vmnk_peer, + mcast_mode=1, + loc=loc, + ip=ip, ) assert not (mcast_mode_mn[0] == 0 and mcast_mode_mn[1] == 0) @@ -82,21 +136,23 @@ class PipelineTmaUmma(PipelineAsync): assert mcast_mode_mn[0] == 1 return tma_mcast_mask_a | tma_mcast_mask_a_peer + @dsl_user_op @staticmethod - def _compute_is_leader_cta(cta_layout_vmnk: cute.Layout): + def _compute_is_leader_cta(cta_layout_vmnk: cute.Layout, *, loc=None, ip=None): """ Computes leader threadblocks for 2CTA kernels. For 1CTA, all threadblocks are leaders. """ - bidx, bidy, _ = cute.arch.block_idx() + bidx, bidy, _ = cute.arch.block_idx(loc=loc, ip=ip) mma_coord_vmnk = ( - bidx % cute.size(cta_layout_vmnk, mode=[0]), - bidx // cute.size(cta_layout_vmnk, mode=[0]), + bidx % cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip), + bidx // cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip), bidy, None, ) return mma_coord_vmnk[0] == 0 + @dsl_user_op @staticmethod def create( *, @@ -108,6 +164,8 @@ class PipelineTmaUmma(PipelineAsync): cta_layout_vmnk: Optional[cute.Layout] = None, mcast_mode_mn: tuple[int, int] = (1, 1), defer_sync: bool = False, + loc=None, + ip=None, ): """Creates and initializes a new PipelineTmaUmma instance. @@ -130,7 +188,7 @@ class PipelineTmaUmma(PipelineAsync): :rtype: PipelineTmaUmma """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -140,27 +198,39 @@ class PipelineTmaUmma(PipelineAsync): producer = (producer_type, producer_group) consumer = (consumer_type, consumer_group) - sync_object_full = PipelineAsync._make_sync_object( - barrier_storage.align(min_align=8), num_stages, producer, tx_count + sync_object_full = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8), + num_stages, + producer, + tx_count, + loc=loc, + ip=ip, ) - sync_object_empty = PipelineAsync._make_sync_object( - barrier_storage.align(min_align=8) + num_stages, num_stages, consumer + sync_object_empty = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8) + num_stages, + num_stages, + consumer, + loc=loc, + ip=ip, ) - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, loc=loc, ip=ip) == 1: # No mcast mask if not using clusters producer_mask = None # All threadblocks are leaders if not using clusters is_leader_cta = True else: producer_mask = PipelineTmaUmma._compute_mcast_arrival_mask( - cta_layout_vmnk, mcast_mode_mn + cta_layout_vmnk, mcast_mode_mn, loc=loc, ip=ip + ) + is_leader_cta = PipelineTmaUmma._compute_is_leader_cta( + cta_layout_vmnk, loc=loc, ip=ip ) - is_leader_cta = PipelineTmaUmma._compute_is_leader_cta(cta_layout_vmnk) cta_group = ( cute.nvgpu.tcgen05.CtaGroup.ONE - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1 + if cta_layout_vmnk is None + or cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) == 1 else cute.nvgpu.tcgen05.CtaGroup.TWO ) @@ -168,7 +238,7 @@ class PipelineTmaUmma(PipelineAsync): if not defer_sync: cute.arch.mbarrier_init_fence() - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, loc=loc, ip=ip) == 1: agent_sync(Agent.ThreadBlock) else: agent_sync(Agent.ThreadBlockCluster, is_relaxed=True) @@ -183,25 +253,41 @@ class PipelineTmaUmma(PipelineAsync): cta_group, ) - def consumer_release(self, state: PipelineState): + @dsl_user_op + def consumer_release(self, state: PipelineState, *, loc=None, ip=None): """ UMMA consumer release buffer empty, cta_group needs to be provided. """ - self.sync_object_empty.arrive(state.index, self.consumer_mask, self.cta_group) + self.sync_object_empty.arrive( + state.index, self.consumer_mask, self.cta_group, loc=loc, ip=ip + ) def producer_acquire( - self, state: PipelineState, try_acquire_token: Optional[Boolean] = None + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, ): """ TMA producer commit conditionally waits on buffer empty and sets the transaction barrier for leader threadblocks. """ if_generate( try_acquire_token is None or try_acquire_token == 0, - lambda: self.sync_object_empty.wait(state.index, state.phase), + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) if_generate( self.is_leader_cta, - lambda: self.sync_object_full.arrive(state.index, self.producer_mask), + lambda: self.sync_object_full.arrive( + state.index, self.producer_mask, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) def producer_commit(self, state: PipelineState): @@ -219,51 +305,65 @@ class PipelineAsyncUmma(PipelineAsync): cta_group: cute.nvgpu.tcgen05.CtaGroup + @dsl_user_op @staticmethod - def _compute_leading_cta_rank(cta_v_size): + def _compute_leading_cta_rank(cta_v_size, *, loc=None, ip=None): """ Computes the leading CTA rank. """ cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + cute.arch.block_idx_in_cluster(loc=loc, ip=ip), + loc=loc, + ip=ip, ) return cta_rank_in_cluster // cta_v_size * cta_v_size + @dsl_user_op @staticmethod - def _compute_is_leader_cta(cta_layout_vmnk: cute.Layout): + def _compute_is_leader_cta(cta_layout_vmnk: cute.Layout, *, loc=None, ip=None): """ Computes leader threadblocks for 2CTA kernels. For 1CTA, all threadblocks are leaders. """ - bidx, bidy, _ = cute.arch.block_idx() + bidx, bidy, _ = cute.arch.block_idx(loc=loc, ip=ip) mma_coord_vmnk = ( - bidx % cute.size(cta_layout_vmnk, mode=[0]), - bidx // cute.size(cta_layout_vmnk, mode=[0]), + bidx % cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip), + bidx // cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip), bidy, None, ) return mma_coord_vmnk[0] == 0 + @dsl_user_op @staticmethod - def _compute_peer_cta_mask(cta_layout_vmnk: cute.Layout): + def _compute_peer_cta_mask(cta_layout_vmnk: cute.Layout, *, loc=None, ip=None): """ Computes a mask for signaling arrivals to multicasting threadblocks. """ cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + cute.arch.block_idx_in_cluster(loc=loc, ip=ip), + loc=loc, + ip=ip, + ) + cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord( + cta_rank_in_cluster, loc=loc, ip=ip ) - cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord(cta_rank_in_cluster) mask_self = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=0 + cta_layout_vmnk, cta_in_cluster_coord_vmnk, mcast_mode=0, loc=loc, ip=ip ) block_in_cluster_coord_vmnk_peer = ( cta_in_cluster_coord_vmnk[0] ^ 1, *cta_in_cluster_coord_vmnk[1:], ) mask_peer = cute.nvgpu.cpasync.create_tma_multicast_mask( - cta_layout_vmnk, block_in_cluster_coord_vmnk_peer, mcast_mode=0 + cta_layout_vmnk, + block_in_cluster_coord_vmnk_peer, + mcast_mode=0, + loc=loc, + ip=ip, ) return mask_self | mask_peer + @dsl_user_op @staticmethod def create( *, @@ -273,6 +373,8 @@ class PipelineAsyncUmma(PipelineAsync): barrier_storage: cute.Pointer = None, cta_layout_vmnk: Optional[cute.Layout] = None, defer_sync: bool = False, + loc=None, + ip=None, ): """Creates and initializes a new PipelineAsyncUmma instance. @@ -291,7 +393,7 @@ class PipelineAsyncUmma(PipelineAsync): :rtype: PipelineAsyncUmma """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -301,37 +403,53 @@ class PipelineAsyncUmma(PipelineAsync): producer = (producer_type, producer_group) consumer = (consumer_type, consumer_group) - sync_object_full = PipelineAsync._make_sync_object( + sync_object_full = PipelineTmaUmma._make_sync_object( barrier_storage.align(min_align=8), num_stages, producer, + loc=loc, + ip=ip, ) - sync_object_empty = PipelineAsync._make_sync_object( - barrier_storage.align(min_align=8) + num_stages, num_stages, consumer + sync_object_empty = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8) + num_stages, + num_stages, + consumer, + loc=loc, + ip=ip, ) cta_v_size = ( - cute.size(cta_layout_vmnk, mode=[0]) if cta_layout_vmnk is not None else 1 + cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) + if cta_layout_vmnk is not None + else 1 ) cta_group = ( cute.nvgpu.tcgen05.CtaGroup.ONE - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1 + if cta_layout_vmnk is None + or cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) == 1 else cute.nvgpu.tcgen05.CtaGroup.TWO ) - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1: + if ( + cta_layout_vmnk is None + or cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) == 1 + ): # No mcast mask if we're not using 2CTA tcgen05 MMA producer_mask = None consumer_mask = None else: # If we're using 2CTA UMMAs, producer will arrive the mbar on leading CTA # We need to get the target cta_rank - producer_mask = PipelineAsyncUmma._compute_leading_cta_rank(cta_v_size) + producer_mask = PipelineAsyncUmma._compute_leading_cta_rank( + cta_v_size, loc=loc, ip=ip + ) # consumer needs to get the mask to signal - consumer_mask = PipelineAsyncUmma._compute_peer_cta_mask(cta_layout_vmnk) + consumer_mask = PipelineAsyncUmma._compute_peer_cta_mask( + cta_layout_vmnk, loc=loc, ip=ip + ) if not defer_sync: cute.arch.mbarrier_init_fence() - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, loc=loc, ip=ip) == 1: agent_sync(Agent.ThreadBlock) else: agent_sync(Agent.ThreadBlockCluster, is_relaxed=True) @@ -345,7 +463,8 @@ class PipelineAsyncUmma(PipelineAsync): cta_group, ) - def consumer_release(self, state: PipelineState): + @dsl_user_op + def consumer_release(self, state: PipelineState, *, loc=None, ip=None): """ UMMA consumer release buffer empty, cta_group needs to be provided. """ @@ -360,29 +479,38 @@ class PipelineUmmaAsync(PipelineAsync): cta_group: cute.nvgpu.tcgen05.CtaGroup + @dsl_user_op @staticmethod - def _compute_tmem_sync_mask(cta_layout_vmnk: cute.Layout): + def _compute_tmem_sync_mask(cta_layout_vmnk: cute.Layout, *, loc=None, ip=None): """ Computes a mask to signal completion of tmem buffers for 2CTA kernels. """ cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + cute.arch.block_idx_in_cluster(loc=loc, ip=ip), + loc=loc, + ip=ip, + ) + cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord( + cta_rank_in_cluster, loc=loc, ip=ip ) - cta_in_cluster_coord_vmnk = cta_layout_vmnk.get_flat_coord(cta_rank_in_cluster) return cute.make_layout_image_mask( - cta_layout_vmnk, cta_in_cluster_coord_vmnk, mode=0 + cta_layout_vmnk, cta_in_cluster_coord_vmnk, mode=0, loc=loc, ip=ip ) + @dsl_user_op @staticmethod - def _compute_peer_cta_rank(): + def _compute_peer_cta_rank(*, loc=None, ip=None): """ Computes a mask to signal release of tmem buffers for 2CTA kernels. """ cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + cute.arch.block_idx_in_cluster(loc=loc, ip=ip), + loc=loc, + ip=ip, ) return cta_rank_in_cluster // 2 * 2 + @dsl_user_op @staticmethod def create( *, @@ -392,6 +520,8 @@ class PipelineUmmaAsync(PipelineAsync): barrier_storage: cute.Pointer = None, cta_layout_vmnk: Optional[cute.Layout] = None, defer_sync: bool = False, + loc=None, + ip=None, ): """Creates an instance of PipelineUmmaAsync with computed attributes. @@ -410,7 +540,7 @@ class PipelineUmmaAsync(PipelineAsync): :rtype: PipelineUmmaAsync """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -420,34 +550,44 @@ class PipelineUmmaAsync(PipelineAsync): producer = (producer_type, producer_group) consumer = (consumer_type, consumer_group) - sync_object_full = PipelineAsync._make_sync_object( - barrier_storage.align(min_align=8), num_stages, producer + sync_object_full = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8), num_stages, producer, loc=loc, ip=ip ) - sync_object_empty = PipelineAsync._make_sync_object( - barrier_storage.align(min_align=8) + num_stages, num_stages, consumer + sync_object_empty = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8) + num_stages, + num_stages, + consumer, + loc=loc, + ip=ip, ) - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, loc=loc, ip=ip) == 1: # Set mask to None if not using clusters (i.e. 1CTA kernels) producer_mask = None else: - producer_mask = PipelineUmmaAsync._compute_tmem_sync_mask(cta_layout_vmnk) + producer_mask = PipelineUmmaAsync._compute_tmem_sync_mask( + cta_layout_vmnk, loc=loc, ip=ip + ) - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1: + if ( + cta_layout_vmnk is None + or cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) == 1 + ): # Set mask to None if not using 2CTA instructions consumer_mask = None else: - consumer_mask = PipelineUmmaAsync._compute_peer_cta_rank() + consumer_mask = PipelineUmmaAsync._compute_peer_cta_rank(loc=loc, ip=ip) cta_group = ( cute.nvgpu.tcgen05.CtaGroup.ONE - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1 + if cta_layout_vmnk is None + or cute.size(cta_layout_vmnk, mode=[0], loc=loc, ip=ip) == 1 else cute.nvgpu.tcgen05.CtaGroup.TWO ) if not defer_sync: cute.arch.mbarrier_init_fence() - if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, loc=loc, ip=ip) == 1: agent_sync(Agent.ThreadBlock) else: agent_sync(Agent.ThreadBlockCluster, is_relaxed=True) @@ -461,14 +601,18 @@ class PipelineUmmaAsync(PipelineAsync): cta_group, ) - def producer_commit(self, state: PipelineState): + @dsl_user_op + def producer_commit(self, state: PipelineState, *, loc=None, ip=None): """ UMMA producer commit buffer full, cta_group needs to be provided. """ - self.sync_object_full.arrive(state.index, self.producer_mask, self.cta_group) + self.sync_object_full.arrive( + state.index, self.producer_mask, self.cta_group, loc=loc, ip=ip + ) + @dsl_user_op @cute.jit - def producer_tail(self, state: PipelineState): + def producer_tail(self, state: PipelineState, *, loc=None, ip=None): """ Make sure the last used buffer empty signal is visible to producer. Producer tail is usually executed by producer before exit, to avoid dangling @@ -477,8 +621,9 @@ class PipelineUmmaAsync(PipelineAsync): :param state: The pipeline state that points to next useful buffer :type state: PipelineState """ + bidx_in_cluster = cute.arch.block_idx_in_cluster(loc=loc, ip=ip) cta_rank_in_cluster = cute.arch.make_warp_uniform( - cute.arch.block_idx_in_cluster() + bidx_in_cluster, loc=loc, ip=ip ) is_leader_cta = cta_rank_in_cluster % 2 == 0 @@ -486,5 +631,375 @@ class PipelineUmmaAsync(PipelineAsync): # Assume state contains that next useful buffer # So we only need to advance to num_stages - 1 times to last used buffer for i in cutlass.range_constexpr(self.num_stages - 1): - state.advance() - self.producer_acquire(state) + state.advance(loc=loc, ip=ip) + self.producer_acquire(state, loc=loc, ip=ip) + + +@dataclass(frozen=True) +class PipelineClcFetchAsync: + """ + PipelineClcFetchAsync implements a producer-consumer pipeline for Cluster Launch + Control based dynamic scheduling. Both producer and consumer operate asynchronously + using barrier synchronization to coordinate across pipeline stages and cluster CTAs. + + - Producer: waits for empty buffer, signals full barrier with transection bytes + across all CTAs in cluster, hardware autosignals each CTA's mbarrier when + transaction bytes are written, then the satte advance to next buffer slot. + - Consumer: waits for full barrier, then load respinse from local SMEM, then + sigals CTA 0's empty barrier to allow buffer reuse. + """ + + sync_object_full: SyncObject + sync_object_empty: SyncObject + num_stages: int + producer_mask: Optional[Int32] + consumer_mask: Optional[Int32] + is_signalling_thread: Boolean + + @staticmethod + @cute.jit + def _init_full_barrier_arrive_signal(cta_layout_vmnk: cute.Layout, tidx: Int32): + """ + Computes producer barrier signaling parameters, returns destination CTA rank + (0 to cluster_size-1) based on thread ID, and a boolean flag indicating if + this thread participates in signaling. + + :param cta_layout_vmnk: Cluster layout defining CTA count + :param tidx: Thread ID within the CTA + """ + dst_rank = tidx % 32 + is_signalling_thread = dst_rank < cute.size(cta_layout_vmnk) + return dst_rank, is_signalling_thread + + @staticmethod + def create( + *, + num_stages: int, + producer_group: CooperativeGroup, + consumer_group: CooperativeGroup, + tx_count: int, + barrier_storage: cute.Pointer = None, + producer_mask: Int32 = None, + consumer_mask: Int32 = None, + cta_layout_vmnk: Optional[cute.Layout] = None, + defer_sync: bool = False, + ): + """ + This helper function computes any necessary attributes and returns an instance of PipelineClcFetchAsync. + :param barrier_storage: Pointer to the shared memory address for this pipeline's mbarriers + :type barrier_storage: cute.Pointer + :param num_stages: Number of buffer stages for this pipeline + :type num_stages: int + :param producer_group: `CooperativeGroup` for the producer agent + :type producer_group: CooperativeGroup + :param consumer_group: `CooperativeGroup` for the consumer agent + :type consumer_group: CooperativeGroup + :param tx_count: Number of bytes expected to be written to the transaction barrier for one stage + :type tx_count: int + :param producer_mask: Mask for signaling arrives for the producer agent, defaults to ``None`` + :type producer_mask: Int32, optional + :param consumer_mask: Mask for signaling arrives for the consumer agent, defaults to ``None`` + :type consumer_mask: Int32, optional + """ + if not isinstance(barrier_storage, cute.Pointer): + raise TypeError( + f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" + ) + + producer_type = PipelineOp.ClcLoad + consumer_type = PipelineOp.AsyncThread + + producer = (producer_type, producer_group) + consumer = (consumer_type, consumer_group) + sync_object_full = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8), num_stages, producer, tx_count + ) + sync_object_empty = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8) + num_stages, num_stages, consumer + ) + + if cta_layout_vmnk is None: + cta_layout_vmnk = cute.make_layout((1, 1, 1, 1)) + + tidx, _, _ = cute.arch.thread_idx() + # All signalling happens from CTA 0's threads, each thread + # in CTA 0 signals a different remote CTA's mbarrier. + (producer_mask, is_signalling_thread) = ( + PipelineClcFetchAsync._init_full_barrier_arrive_signal( + cta_layout_vmnk, tidx + ) + ) + + # The producer (sched warp) runs ONLY in CTA 0, all consumers + # across the cluster must arrive at CTA 0's empty barrier + consumer_mask = 0 + + if not defer_sync: + cute.arch.mbarrier_init_fence() + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + agent_sync(Agent.ThreadBlock) + else: + agent_sync(Agent.ThreadBlockCluster, is_relaxed=True) + + return PipelineClcFetchAsync( + sync_object_full, + sync_object_empty, + num_stages, + producer_mask, + consumer_mask, + is_signalling_thread, + ) + + @dsl_user_op + def producer_acquire( + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, + ): + """ + Producer acquire waits for empty buffer and sets transaction expectation on full barrier. + + :param state: Pipeline state pointing to the current buffer stage + :param try_acquire_token: Optional token to skip the empty barrier wait + """ + if_generate( + try_acquire_token is None or try_acquire_token == 0, + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, + ) + if_generate( + self.is_signalling_thread, + lambda: self.sync_object_full.arrive( + state.index, self.producer_mask, loc=loc, ip=ip + ), + loc=loc, + ip=ip, + ) + + @dsl_user_op + def consumer_wait( + self, + state: PipelineState, + try_wait_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, + ): + """ + Consumer waits for full barrier to be signaled by hardware multicast. + + :param state: Pipeline state pointing to the current buffer stage + :param try_wait_token: Optional token to skip the full barrier wait + """ + if_generate( + try_wait_token is None or try_wait_token == 0, + lambda: self.sync_object_full.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, + ) + + @dsl_user_op + def consumer_release(self, state: PipelineState, *, loc=None, ip=None): + self.sync_object_empty.arrive(state.index, self.consumer_mask, loc=loc, ip=ip) + + @dsl_user_op + def producer_get_barrier( + self, state: PipelineState, *, loc=None, ip=None + ) -> cute.Pointer: + return self.sync_object_full.get_barrier(state.index, loc=loc, ip=ip) + + @dsl_user_op + def producer_tail( + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, + ): + """ + Ensures all in-flight buffers are released before producer exits. + + :param state: Pipeline state with current position in the buffer + :param try_acquire_token: Optional token to skip the empty barrier waits + + """ + for i in range(self.num_stages): + if_generate( + try_acquire_token is None or try_acquire_token == 0, + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, + ) + state.advance(loc=loc, ip=ip) + + +@dataclass(frozen=True) +class PipelineTmaMultiConsumersAsync(PipelineAsync): + """ + PipelineTmaMultiConsumersAsync is used for TMA producers and UMMA+Async consumers. + """ + + is_leader_cta: bool + sync_object_empty_umma: SyncObject + sync_object_empty_async: SyncObject + cta_group: cute.nvgpu.tcgen05.CtaGroup + + @staticmethod + def create( + *, + num_stages: int, + producer_group: CooperativeGroup, + consumer_group_umma: CooperativeGroup, + consumer_group_async: CooperativeGroup, + tx_count: int, + barrier_storage: cute.Pointer = None, + cta_layout_vmnk: Optional[cute.Layout] = None, + defer_sync: bool = False, + ): + """ + This helper function computes any necessary attributes and returns an instance of PipelineTmaMultiConsumersAsync. + :param barrier_storage: Pointer to the smem address for this pipeline's mbarriers + :type barrier_storage: cute.Pointer + :param num_stages: Number of buffer stages for this pipeline + :type num_stages: Int32 + :param producer_group: `CooperativeGroup` for the producer agent + :type producer_group: CooperativeGroup + :param consumer_group_umma: `CooperativeGroup` for the UMMA consumer agent + :type consumer_group_umma: CooperativeGroup + :param consumer_group_async: `CooperativeGroup` for the AsyncThread consumer agent + :type consumer_group_async: CooperativeGroup + :param tx_count: Number of bytes expected to be written to the transaction barrier for one stage + :type tx_count: int + :param cta_layout_vmnk: Layout of the cluster shape + :type cta_layout_vmnk: cute.Layout | None + """ + if not isinstance(barrier_storage, cute.Pointer): + raise TypeError( + f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" + ) + + producer_type = PipelineOp.TmaLoad + consumer_type = PipelineOp.Composite + consumer_type_umma = PipelineOp.TCGen05Mma + consumer_type_async = PipelineOp.AsyncThread + + if consumer_group_umma.agent != consumer_group_async.agent: + raise ValueError( + "UMMA and AsyncThread consumer groups must be the same agent" + ) + + if cta_layout_vmnk is not None and cute.size(cta_layout_vmnk) != 1: + raise ValueError( + f"PipelineTmaMultiConsumersAsync is not verified for cta_layout_vmnk != 1, cta_layout_vmnk:{cta_layout_vmnk}" + ) + + consumer_group = CooperativeGroup( + consumer_group_umma.agent, + consumer_group_umma.size + consumer_group_async.size, + ) + + producer = (producer_type, producer_group) + consumer = (consumer_type, consumer_group) + + sync_object_full = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8), num_stages, producer, tx_count + ) + sync_object_empty = PipelineTmaUmma._make_sync_object( + barrier_storage.align(min_align=8) + num_stages, num_stages, consumer + ) + sync_object_empty_umma = sync_object_empty.recast_to_new_op_type( + consumer_type_umma + ) + sync_object_empty_async = sync_object_empty.recast_to_new_op_type( + consumer_type_async + ) + + # No mcast mask if not using clusters + producer_mask = None + consumer_mask = None + # All threadblocks are leaders if not using clusters + is_leader_cta = True + cta_group = ( + cute.nvgpu.tcgen05.CtaGroup.ONE + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk, mode=[0]) == 1 + else cute.nvgpu.tcgen05.CtaGroup.TWO + ) + + if not defer_sync: + cute.arch.mbarrier_init_fence() + if cta_layout_vmnk is None or cute.size(cta_layout_vmnk) == 1: + agent_sync(Agent.ThreadBlock) + else: + agent_sync(Agent.ThreadBlockCluster, is_relaxed=True) + + return PipelineTmaMultiConsumersAsync( + sync_object_full, + sync_object_empty, + num_stages, + producer_mask, + consumer_mask, + is_leader_cta, + sync_object_empty_umma, + sync_object_empty_async, + cta_group, + ) + + @dsl_user_op + def producer_acquire( + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, + ): + """ + TMA producer acquire waits on buffer empty and sets the transaction barrier for leader threadblocks. + """ + if_generate( + try_acquire_token is None or try_acquire_token == 0, + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, + ) + if_generate( + self.is_leader_cta, + lambda: self.sync_object_full.arrive(state.index, self.producer_mask), + loc=loc, + ip=ip, + ) + + @dsl_user_op + def producer_commit(self, state: PipelineState, *, loc=None, ip=None): + """ + TMA producer commit is a noop since TMA instruction itself updates the transaction count. + """ + pass + + @dsl_user_op + def consumer_release( + self, state: PipelineState, op_type: PipelineOp, *, loc=None, ip=None + ): + if op_type == PipelineOp.TCGen05Mma: + self.sync_object_empty_umma.arrive( + state.index, self.consumer_mask, self.cta_group, loc=loc, ip=ip + ) + elif op_type == PipelineOp.AsyncThread: + self.sync_object_empty_async.arrive( + state.index, self.consumer_mask, loc=loc, ip=ip + ) + else: + raise ValueError(f"Invalid PipelineOp specified. op_type:{op_type}") diff --git a/python/CuTeDSL/cutlass/pipeline/sm90.py b/python/CuTeDSL/cutlass/pipeline/sm90.py index 2393409f..385f8fa1 100644 --- a/python/CuTeDSL/cutlass/pipeline/sm90.py +++ b/python/CuTeDSL/cutlass/pipeline/sm90.py @@ -134,7 +134,6 @@ class PipelineAsync: if agent[0] in [ PipelineOp.AsyncThread, PipelineOp.TmaLoad, - PipelineOp.TCGen05Mma, PipelineOp.Composite, PipelineOp.AsyncLoad, ]: @@ -183,7 +182,7 @@ class PipelineAsync: :rtype: PipelineAsync """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -212,38 +211,66 @@ class PipelineAsync: consumer_mask, ) + @dsl_user_op def producer_acquire( - self, state: PipelineState, try_acquire_token: Optional[Boolean] = None + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, ): if_generate( try_acquire_token is None or try_acquire_token == 0, - lambda: self.sync_object_empty.wait(state.index, state.phase), + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) - def producer_try_acquire(self, state: PipelineState): - return self.sync_object_empty.try_wait(state.index, state.phase) + @dsl_user_op + def producer_try_acquire(self, state: PipelineState, *, loc=None, ip=None): + return self.sync_object_empty.try_wait(state.index, state.phase, loc=loc, ip=ip) - def producer_commit(self, state: PipelineState): - self.sync_object_full.arrive(state.index, self.producer_mask) + @dsl_user_op + def producer_commit(self, state: PipelineState, *, loc=None, ip=None): + self.sync_object_full.arrive(state.index, self.producer_mask, loc=loc, ip=ip) + @dsl_user_op def consumer_wait( - self, state: PipelineState, try_wait_token: Optional[Boolean] = None + self, + state: PipelineState, + try_wait_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, ): if_generate( try_wait_token is None or try_wait_token == 0, - lambda: self.sync_object_full.wait(state.index, state.phase), + lambda: self.sync_object_full.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) - def consumer_try_wait(self, state: PipelineState): - return self.sync_object_full.try_wait(state.index, state.phase) + @dsl_user_op + def consumer_try_wait(self, state: PipelineState, *, loc=None, ip=None): + return self.sync_object_full.try_wait(state.index, state.phase, loc=loc, ip=ip) - def consumer_release(self, state: PipelineState): - self.sync_object_empty.arrive(state.index, self.consumer_mask) + @dsl_user_op + def consumer_release(self, state: PipelineState, *, loc=None, ip=None): + self.sync_object_empty.arrive(state.index, self.consumer_mask, loc=loc, ip=ip) - def producer_get_barrier(self, state: PipelineState) -> cute.Pointer: - return self.sync_object_full.get_barrier(state.index) + @dsl_user_op + def producer_get_barrier( + self, state: PipelineState, *, loc=None, ip=None + ) -> cute.Pointer: + return self.sync_object_full.get_barrier(state.index, loc=loc, ip=ip) - def producer_tail(self, state: PipelineState): + @dsl_user_op + def producer_tail(self, state: PipelineState, *, loc=None, ip=None): """ Make sure the last used buffer empty signal is visible to producer. Producer tail is usually executed by producer before exit, to avoid dangling @@ -255,20 +282,27 @@ class PipelineAsync: # Assume state contains that next useful buffer # So we only need to advance to num_stages - 1 times to last used buffer for i in range(self.num_stages - 1): - state.advance() - self.producer_acquire(state) + state.advance(loc=loc, ip=ip) + self.producer_acquire(state, loc=loc, ip=ip) - # Util methods to manage produer and consumer - def make_producer(self): - state = make_pipeline_state(PipelineUserType.Producer, self.num_stages) + # Util methods to manage producer and consumer + @dsl_user_op + def make_producer(self, *, loc=None, ip=None): + state = make_pipeline_state( + PipelineUserType.Producer, self.num_stages, loc=loc, ip=ip + ) return PipelineProducer(self, state, self.sync_object_full.cg) - def make_consumer(self): - state = make_pipeline_state(PipelineUserType.Consumer, self.num_stages) + @dsl_user_op + def make_consumer(self, *, loc=None, ip=None): + state = make_pipeline_state( + PipelineUserType.Consumer, self.num_stages, loc=loc, ip=ip + ) return PipelineConsumer(self, state, self.sync_object_empty.cg) - def make_participants(self): - return self.make_producer(), self.make_consumer() + @dsl_user_op + def make_participants(self, *, loc=None, ip=None): + return self.make_producer(loc=loc, ip=ip), self.make_consumer(loc=loc, ip=ip) @dataclass(frozen=True) @@ -341,7 +375,9 @@ class PipelineTmaAsync(PipelineAsync): @staticmethod @cute.jit def init_empty_barrier_arrive_signal( - cta_layout_vmnk: cute.Layout, tidx: Int32, mcast_mode_mn: tuple[int, int] = (1, 1) + cta_layout_vmnk: cute.Layout, + tidx: Int32, + mcast_mode_mn: tuple[int, int] = (1, 1), ): """Initialize the empty barrier arrive signal. @@ -430,7 +466,7 @@ class PipelineTmaAsync(PipelineAsync): :rtype: PipelineTmaAsync """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -496,10 +532,13 @@ class PipelineTmaAsync(PipelineAsync): lambda: self.sync_object_empty.wait( state.index, state.phase, loc=loc, ip=ip ), + loc=loc, + ip=ip, ) self.sync_object_full.arrive(state.index, self.producer_mask, loc=loc, ip=ip) - def producer_commit(self, state: PipelineState): + @dsl_user_op + def producer_commit(self, state: PipelineState, *, loc=None, ip=None): """ TMA producer commit is a noop since TMA instruction itself updates the transaction count. """ @@ -564,7 +603,7 @@ class PipelineTmaMultiConsumersAsync(PipelineAsync): :rtype: PipelineTmaMultiConsumersAsync """ if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -580,7 +619,8 @@ class PipelineTmaMultiConsumersAsync(PipelineAsync): if cta_layout_vmnk is not None and cute.size(cta_layout_vmnk) != 1: raise ValueError( - f"PipelineTmaMultiConsumersAsync is not verified for cta_layout_vmnk != 1, cta_layout_vmnk:{cta_layout_vmnk}" + "PipelineTmaMultiConsumersAsync is not verified for cta_layout_vmnk != 1, " + f"cta_layout_vmnk:{cta_layout_vmnk}" ) consumer_group = CooperativeGroup( @@ -633,34 +673,54 @@ class PipelineTmaMultiConsumersAsync(PipelineAsync): cta_group, ) + @dsl_user_op def producer_acquire( - self, state: PipelineState, try_acquire_token: Optional[Boolean] = None + self, + state: PipelineState, + try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, ): """ TMA producer acquire waits on buffer empty and sets the transaction barrier for leader threadblocks. """ if_generate( try_acquire_token is None or try_acquire_token == 0, - lambda: self.sync_object_empty.wait(state.index, state.phase), + lambda: self.sync_object_empty.wait( + state.index, state.phase, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) if_generate( self.is_leader_cta, - lambda: self.sync_object_full.arrive(state.index, self.producer_mask), + lambda: self.sync_object_full.arrive( + state.index, self.producer_mask, loc=loc, ip=ip + ), + loc=loc, + ip=ip, ) - def producer_commit(self, state: PipelineState): + @dsl_user_op + def producer_commit(self, state: PipelineState, *, loc=None, ip=None): """ TMA producer commit is a noop since TMA instruction itself updates the transaction count. """ pass - def consumer_release(self, state: PipelineState, op_type: PipelineOp): + @dsl_user_op + def consumer_release( + self, state: PipelineState, op_type: PipelineOp, *, loc=None, ip=None + ): if op_type == PipelineOp.TCGen05Mma: self.sync_object_empty_umma.arrive( - state.index, self.consumer_mask, self.cta_group + state.index, self.consumer_mask, self.cta_group, loc=loc, ip=ip ) elif op_type == PipelineOp.AsyncThread: - self.sync_object_empty_async.arrive(state.index, self.consumer_mask) + self.sync_object_empty_async.arrive( + state.index, self.consumer_mask, loc=loc, ip=ip + ) else: raise ValueError(f"Invalid PipelineOp specified. op_type:{op_type}") @@ -766,7 +826,7 @@ class PipelineOrder: defer_sync: bool = False, ): if not isinstance(barrier_storage, cute.Pointer): - raise ValueError( + raise TypeError( f"Expected barrier_storage to be a cute.Pointer, but got {type(barrier_storage)}" ) @@ -805,7 +865,7 @@ class PipelineOrder: signalling_id = (self.group_id + 1) % self.length idx = self.get_barrier_for_current_stage_idx(signalling_id) cute.arch.mbarrier_arrive( - self.sync_object_full.get_barrier(idx), loc=loc, ip=ip + self.sync_object_full.get_barrier(idx, loc=loc, ip=ip), loc=loc, ip=ip ) self.state.advance(loc=loc, ip=ip) @@ -813,7 +873,10 @@ class PipelineOrder: def wait(self, *, loc=None, ip=None): idx = self.get_barrier_for_current_stage_idx(self.group_id) cute.arch.mbarrier_wait( - self.sync_object_full.get_barrier(idx), self.state.phase, loc=loc, ip=ip + self.sync_object_full.get_barrier(idx, loc=loc, ip=ip), + self.state.phase, + loc=loc, + ip=ip, ) @@ -922,13 +985,14 @@ class PipelineProducer: self._ImmutableResourceHandle__immutable_state ) - def commit(self): + @dsl_user_op + def commit(self, *, loc=None, ip=None): """Signal that data production is complete for the current stage. This allows consumers to start processing the data. """ self.get_origin().producer_commit( - self._ImmutableResourceHandle__immutable_state + self._ImmutableResourceHandle__immutable_state, loc=loc, ip=ip ) def __init__(self, pipeline, state, group: CooperativeGroup): @@ -949,13 +1013,18 @@ class PipelineProducer: """Create a new Producer instance with the same state.""" return PipelineProducer(self.__pipeline, self.__state.clone(), self.__group) - def reset(self): + @dsl_user_op + def reset(self, *, loc=None, ip=None): """Reset the count of how many handles this producer has committed.""" - self.__state.reset_count() + self.__state.reset_count(loc=loc, ip=ip) + @dsl_user_op def acquire( self, try_acquire_token: Optional[Boolean] = None, + *, + loc=None, + ip=None, ) -> ImmutableResourceHandle: """Wait for the current buffer to be empty before producing data. This is a blocking operation. @@ -965,18 +1034,22 @@ class PipelineProducer: :return: A handle to the producer for committing the data :rtype: ImmutableResourceHandle """ - self.__pipeline.producer_acquire(self.__state, try_acquire_token) + self.__pipeline.producer_acquire( + self.__state, try_acquire_token, loc=loc, ip=ip + ) handle = PipelineProducer.ImmutableResourceHandle( self.__pipeline, self.__state.clone() ) return handle - def advance(self): + @dsl_user_op + def advance(self, *, loc=None, ip=None): """Move to the next pipeline stage.""" - self.__state.advance() + self.__state.advance(loc=loc, ip=ip) + @dsl_user_op def acquire_and_advance( - self, try_acquire_token: Optional[Boolean] = None + self, try_acquire_token: Optional[Boolean] = None, *, loc=None, ip=None ) -> ImmutableResourceHandle: """Acquire the current buffer and advance to the next pipeline stage. @@ -992,11 +1065,12 @@ class PipelineProducer: acquired buffer stage :rtype: ImmutableResourceHandle """ - handle = self.acquire(try_acquire_token) - self.advance() + handle = self.acquire(try_acquire_token, loc=loc, ip=ip) + self.advance(loc=loc, ip=ip) return handle - def try_acquire(self) -> Boolean: + @dsl_user_op + def try_acquire(self, *, loc=None, ip=None) -> Boolean: """Attempt to acquire the current buffer without blocking. This method tries to acquire the current buffer stage for producing data @@ -1006,9 +1080,12 @@ class PipelineProducer: :return: A boolean token indicating whether the buffer was successfully acquired :rtype: Boolean """ - return self.__pipeline.producer_try_acquire(self.__state) + return self.__pipeline.producer_try_acquire(self.__state, loc=loc, ip=ip) - def commit(self, handle: Optional[ImmutableResourceHandle] = None): + @dsl_user_op + def commit( + self, handle: Optional[ImmutableResourceHandle] = None, *, loc=None, ip=None + ): """Signal that data production is complete for the current stage. This allows consumers to start processing the data. @@ -1018,19 +1095,20 @@ class PipelineProducer: :raises AssertionError: If provided handle does not belong to this producer """ if handle is not None: - assert handle.get_origin() is self, ( + assert handle.get_origin() is self.__pipeline, ( "ResourceHandle does not belong to this PipelineProducer instance" ) - handle.commit() + handle.commit(loc=loc, ip=ip) else: - self.__pipeline.producer_commit(self.__state) + self.__pipeline.producer_commit(self.__state, loc=loc, ip=ip) - def tail(self): + @dsl_user_op + def tail(self, *, loc=None, ip=None): """Ensure all used buffers are properly synchronized before producer exit. This should be called before the producer finishes to avoid dangling signals. """ - self.__pipeline.producer_tail(self.__state) + self.__pipeline.producer_tail(self.__state, loc=loc, ip=ip) def __extract_mlir_values__(self): """Extract MLIR values from the current state. @@ -1099,12 +1177,13 @@ class PipelineConsumer: @dataclass(frozen=True) class ImmutableResourceHandle(ImmutableResourceHandle): - def release(self): + @dsl_user_op + def release(self, *, loc=None, ip=None): """Signal that data production is complete for the current stage. This allows consumers to start processing the data. """ self.get_origin().consumer_release( - self._ImmutableResourceHandle__immutable_state + self._ImmutableResourceHandle__immutable_state, loc=loc, ip=ip ) def __init__(self, pipeline, state: PipelineState, group: CooperativeGroup): @@ -1125,11 +1204,15 @@ class PipelineConsumer: """Create a new Consumer instance with the same state.""" return PipelineConsumer(self.__pipeline, self.__state.clone(), self.__group) - def reset(self): + @dsl_user_op + def reset(self, *, loc=None, ip=None): """Reset the count of how many handles this consumer has consumed.""" - self.__state.reset_count() + self.__state.reset_count(loc=loc, ip=ip) - def wait(self, try_wait_token: Optional[Boolean] = None) -> ImmutableResourceHandle: + @dsl_user_op + def wait( + self, try_wait_token: Optional[Boolean] = None, *, loc=None, ip=None + ) -> ImmutableResourceHandle: """Wait for data to be ready in the current buffer. This is a blocking operation that will not return until data is available. @@ -1140,22 +1223,24 @@ class PipelineConsumer: once data consumption is complete :rtype: ImmutableResourceHandle """ - self.__pipeline.consumer_wait(self.__state, try_wait_token) + self.__pipeline.consumer_wait(self.__state, try_wait_token, loc=loc, ip=ip) handle = PipelineConsumer.ImmutableResourceHandle( self.__pipeline, self.__state.clone() ) return handle - def advance(self): + @dsl_user_op + def advance(self, *, loc=None, ip=None): """Advance the consumer to the next pipeline stage. This updates the internal state to point to the next buffer in the pipeline. Should be called after consuming data from the current buffer. """ - self.__state.advance() + self.__state.advance(loc=loc, ip=ip) + @dsl_user_op def wait_and_advance( - self, try_wait_token: Optional[Boolean] = None + self, try_wait_token: Optional[Boolean] = None, *, loc=None, ip=None ) -> ImmutableResourceHandle: """Atomically wait for data and advance to next pipeline stage. @@ -1170,11 +1255,12 @@ class PipelineConsumer: once data consumption is complete :rtype: ImmutableResourceHandle """ - handle = self.wait(try_wait_token) - self.advance() + handle = self.wait(try_wait_token, loc=loc, ip=ip) + self.advance(loc=loc, ip=ip) return handle - def try_wait(self) -> Boolean: + @dsl_user_op + def try_wait(self, *, loc=None, ip=None) -> Boolean: """Non-blocking check if data is ready in the current buffer. This method provides a way to test if data is available without blocking. @@ -1183,19 +1269,22 @@ class PipelineConsumer: :return: True if data is ready to be consumed, False if the buffer is not yet ready :rtype: Boolean """ - return self.__pipeline.consumer_try_wait(self.__state) + return self.__pipeline.consumer_try_wait(self.__state, loc=loc, ip=ip) - def release(self, handle: Optional[ImmutableResourceHandle] = None): + @dsl_user_op + def release( + self, handle: Optional[ImmutableResourceHandle] = None, *, loc=None, ip=None + ): """Signal that data consumption is complete for the current stage. This allows producers to start producing new data. """ if handle is not None: - assert handle.get_origin() is self, ( + assert handle.get_origin() is self.__pipeline, ( "ResourceHandle does not belong to this PipelineConsumer instance" ) - handle.release() + handle.release(loc=loc, ip=ip) else: - self.__pipeline.consumer_release(self.__state) + self.__pipeline.consumer_release(self.__state, loc=loc, ip=ip) def __extract_mlir_values__(self): """Extract MLIR values from the current state. diff --git a/python/CuTeDSL/cutlass/torch.py b/python/CuTeDSL/cutlass/torch.py index a795cbf6..754beed3 100644 --- a/python/CuTeDSL/cutlass/torch.py +++ b/python/CuTeDSL/cutlass/torch.py @@ -13,7 +13,7 @@ import ctypes from math import prod from dataclasses import dataclass from enum import Enum -from typing import Optional, Type, Union +from typing import Optional, Type, Union, Tuple, Literal from cutlass.cute.typing import ( Numeric, @@ -183,7 +183,7 @@ def convert_cute_tensor( ) -> Tensor: """ Change the value of the cute tensor to make its value converted from a fp32 torch tensor. - Used for fp8 and int4 types tensor creatation now. + Used for fp8 and int4 types tensor creation now. """ # if torch_tensor is on cpu, create a gpu copy if f32_torch_tensor.device.type == "cpu": @@ -289,7 +289,9 @@ def cute_tensor_like( assumed_align: Optional[int] = None, ) -> tuple[Tensor, torch.Tensor]: """ - Create a cute tensor use a torch tensor as the data source + Create a cute tensor use a torch tensor as the data source. + + The cute tensor is a managed reference to the torch tensor. :param data_ref: torch tensor as the data source :param cutlass_dtype: cutlass dtype of the cute tensor @@ -314,9 +316,11 @@ def cute_tensor_like( leading_dim = get_leading_dim(torch_tensor) cute_tensor = cute_tensor.mark_layout_dynamic(leading_dim=leading_dim) + is_empty_tensor = torch_tensor.numel() == 0 # initialize the cute tensor data - if (cutlass_dtype.is_float and cutlass_dtype.width <= 8) or ( - cutlass_dtype.is_integer and cutlass_dtype.width == 4 + if not is_empty_tensor and ( + (cutlass_dtype.is_float and cutlass_dtype.width <= 8) + or (cutlass_dtype.is_integer and cutlass_dtype.width == 4) ): cute_tensor = convert_cute_tensor( data_ref.to(dtype=torch.float32), @@ -327,3 +331,32 @@ def cute_tensor_like( else: torch_tensor.copy_(data_ref.to(dtype=torch_dtype)) return cute_tensor, torch_tensor + + +def prepare_tensors_for_gemm( + mnkl: Tuple[int, int, int, int] | Tuple[int, int, int], + a_dtype: Type[Numeric], + b_dtype: Type[Numeric], + c_dtype: Type[Numeric], +) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + Prepare tensors for GEMM + """ + if len(mnkl) == 4: + m, n, k, l = mnkl + a = torch.empty(l, m, k, dtype=dtype(a_dtype), device="cuda").permute(1, 2, 0) + b = torch.empty(l, n, k, dtype=dtype(b_dtype), device="cuda").permute(1, 2, 0) + c = torch.empty(l, m, n, dtype=dtype(c_dtype), device="cuda").permute(1, 2, 0) + elif len(mnkl) == 3: + m, n, k = mnkl + a = torch.empty(m, k, dtype=dtype(a_dtype), device="cuda") + b = torch.empty(n, k, dtype=dtype(b_dtype), device="cuda") + c = torch.empty(m, n, dtype=dtype(c_dtype), device="cuda") + else: + raise ValueError(f"mnkl must be a tuple of length 3 or 4, but got {mnkl}") + + a = a.random_(-2, 2) + b = b.random_(-2, 2) + c = c.random_(-2, 2) + + return a, b, c diff --git a/python/CuTeDSL/cutlass/utils/README.md b/python/CuTeDSL/cutlass/utils/README.md index 3a583ed4..b4a84681 100644 --- a/python/CuTeDSL/cutlass/utils/README.md +++ b/python/CuTeDSL/cutlass/utils/README.md @@ -4,6 +4,7 @@ This folder contains various utilties for kernel authoring. Specifically, the im followings can be considered experimental and subject to breaking changes: - static persistent tile scheduler defined in [`static_persistent_tile_scheduler.py`](./static_persistent_tile_scheduler.py) +- dynamic persistent tile scheduler defined in [`dynamic_persistent_tile_scheduler.py`](./dynamic_persistent_tile_scheduler.py) - pipeline abstractions defined in [`pipeline.py`](./pipeline.py) - grouped GEMM utilties defined [`grouped_gemm_tile_scheduler_helper.py`](./grouped_gemm_tile_scheduler_helper.py) and [`tensormap_manager.py`](./tensormap_manager.py) diff --git a/python/CuTeDSL/cutlass/utils/__init__.py b/python/CuTeDSL/cutlass/utils/__init__.py index 89b1f003..adddfc98 100644 --- a/python/CuTeDSL/cutlass/utils/__init__.py +++ b/python/CuTeDSL/cutlass/utils/__init__.py @@ -16,15 +16,17 @@ from .static_persistent_tile_scheduler import ( StaticPersistentRuntimeTileScheduler, ) -from .hardware_info import ( - HardwareInfo, +from .dynamic_persistent_tile_scheduler import ( + ClcDynamicPersistentTileSchedulerParams, + ClcDynamicPersistentTileScheduler, ) +from .hardware_info import HardwareInfo + from .blackwell_helpers import ( compute_epilogue_tile_shape, get_smem_store_op, get_tmem_load_op, - get_num_tmem_alloc_cols, make_smem_layout_a, make_smem_layout_b, make_smem_layout_epi, @@ -49,11 +51,13 @@ from .blockscaled_layout import ( make_tmem_layout_sfb, ) -from .grouped_gemm_tile_scheduler_helper import ( +from .grouped_gemm_persistent_tile_scheduler import ( GroupSearchResult, GroupedGemmGroupSearchState, - GroupedGemmTileSchedulerHelper, create_initial_search_state, + GroupedWorkTileInfo, + StaticPersistentGroupTileScheduler, + GroupedGemmTileSchedulerHelper, ) from .tensormap_manager import ( @@ -62,10 +66,11 @@ from .tensormap_manager import ( ) from .smem_allocator import SmemAllocator, get_smem_capacity_in_bytes -from .tmem_allocator import TmemAllocator +from .tmem_allocator import TmemAllocator, get_num_tmem_alloc_cols from .layout import LayoutEnum +from . import gemm from . import distributed from .mixed_input_helpers import ( @@ -73,6 +78,9 @@ from .mixed_input_helpers import ( scale_tma_partition, transform_partition, scale_partition, + epilog_gmem_copy_and_partition, + epilog_smem_copy_and_partition, + epilog_tmem_copy_and_partition, get_gmem_layout_scale, get_smem_layout_scale, compute_smem_layout, @@ -80,7 +88,15 @@ from .mixed_input_helpers import ( get_tma_atom_kind, get_copy_atom_a_transform, is_valid_scale_granularity, + is_shuffle_a, + is_valid_tensor_alignment, + is_valid_mma_tiler_and_cluster_shape, get_divisibility, + create_initial_contiguous_group_search_state, + contiguous_group_search, + make_contiguous_group_work_tile_info, + cvt_tensor_a, + store_transformed_a, ) from . import hopper_helpers as sm90 @@ -92,6 +108,7 @@ __all__ = [ "get_smem_capacity_in_bytes", "SmemAllocator", "TmemAllocator", + "get_num_tmem_alloc_cols", "LayoutEnum", "WorkTileInfo", "PersistentTileSchedulerParams", @@ -116,10 +133,11 @@ __all__ = [ "get_copy_atom_a_transform", "is_valid_scale_granularity", "get_divisibility", + "epilogue_tma_store", + "epilogue", "compute_epilogue_tile_shape", "get_smem_store_op", "get_tmem_load_op", - "get_num_tmem_alloc_cols", "make_smem_layout_a", "make_smem_layout_b", "make_smem_layout_epi", @@ -129,5 +147,8 @@ __all__ = [ "sm100", "print_latex", "print_latex_tv", + "gemm", "distributed", + "ClcDynamicPersistentTileSchedulerParams", + "ClcDynamicPersistentTileScheduler", ] diff --git a/python/CuTeDSL/cutlass/utils/blackwell_helpers.py b/python/CuTeDSL/cutlass/utils/blackwell_helpers.py index 6eb08bd8..f6fa0f84 100644 --- a/python/CuTeDSL/cutlass/utils/blackwell_helpers.py +++ b/python/CuTeDSL/cutlass/utils/blackwell_helpers.py @@ -9,8 +9,8 @@ # and related documentation outside the scope permitted by the EULA # is strictly prohibited. -from math import log2, ceil from typing import List, Type, Union, Tuple +from typing_extensions import deprecated from cutlass.cutlass_dsl import ( Float16, @@ -47,7 +47,6 @@ from cutlass.cute.nvgpu.tcgen05 import ( Ld32x32bOp, Repetition, Pack, - find_tmem_tensor_col_offset, SmemLayoutAtomKind, make_smem_layout_atom, tile_to_mma_shape, @@ -64,6 +63,21 @@ from cutlass.utils.layout import LayoutEnum OperandSource = Tcgen05OperandSource +@dsl_user_op +@deprecated("API is deprecated, use cutlass.utils.get_num_tmem_alloc_cols instead") +def get_num_tmem_alloc_cols( + tmem_tensors: Union[cute.Tensor, List[cute.Tensor]], + rounding=True, + *, + loc=None, + ip=None, +) -> int: + import cutlass.utils as utils + return utils.get_num_tmem_alloc_cols( + tmem_tensors, rounding, arch="sm_100", loc=loc, ip=ip + ) + + @dsl_user_op def compute_epilogue_tile_shape( cta_tile_shape: cute.Shape, @@ -305,13 +319,13 @@ def get_smem_store_op( op = StMatrix8x8x16bOp(is_m_major, 2) return cute.make_copy_atom(op, elem_ty_d, loc=loc, ip=ip) elif use_stmatrix_m16n8_4x: - op = StMatrix16x8x8bOp(4) + op = StMatrix16x8x8bOp(transpose=True, num_matrices=4) return cute.make_copy_atom(op, elem_ty_d, loc=loc, ip=ip) elif use_stmatrix_m16n8_2x: - op = StMatrix16x8x8bOp(2) + op = StMatrix16x8x8bOp(transpose=True, num_matrices=2) return cute.make_copy_atom(op, elem_ty_d, loc=loc, ip=ip) elif use_stmatrix_m16n8_1x: - op = StMatrix16x8x8bOp(1) + op = StMatrix16x8x8bOp(transpose=True, num_matrices=1) return cute.make_copy_atom(op, elem_ty_d, loc=loc, ip=ip) else: op = CopyUniversalOp() @@ -512,50 +526,6 @@ def get_tmem_load_op( raise ValueError() -def get_num_tmem_alloc_cols( - tmem_tensors: Union[cute.Tensor, List[cute.Tensor]], rounding=True -) -> int: - """Get the total number of TMEM allocation columns for the given TMEM tensors. - - :param tmem_tensors: The TMEM tensors to get the number of allocation columns for. - :type tmem_tensors: Union[cute.Tensor, List[cute.Tensor]] - :param rounding: Whether to round up the number of allocation columns to the nearest power of 2. - :type rounding: bool - - :return: The total number of TMEM allocation columns. - :rtype: int - - :raises ValueError: If the number of TMEM allocation columns exceeds the maximum capacity of 512 or is less than 32. - """ - # Turn tmem_tensors into a list - if isinstance(tmem_tensors, cute.Tensor): - tmem_tensors = [tmem_tensors] - - # For each tensor in tmem_tensors, find the tmem_tensor_col_offset - num_tmem_alloc_cols_per_tensor = [ - find_tmem_tensor_col_offset(t) for t in tmem_tensors - ] - - # Sum up the num_tmem_alloc_cols_per_tensor - num_tmem_alloc_cols = sum(num_tmem_alloc_cols_per_tensor) - - # Round up num_tmem_cols_total to the nearest power of 2 and make sure it is at least 32 - if rounding: - num_tmem_alloc_cols = max(1 << ceil(log2(num_tmem_alloc_cols)), 32) - - # Validate the number of TMEM allocation columns - SM100_TMEM_CAPACITY_COLUMNS = 512 - SM100_TMEM_MIN_ALLOC_COLUMNS = 32 - if ( - num_tmem_alloc_cols > SM100_TMEM_CAPACITY_COLUMNS - or num_tmem_alloc_cols < SM100_TMEM_MIN_ALLOC_COLUMNS - ): - raise ValueError( - f"TMEM allocation columns {num_tmem_alloc_cols} exceeds the maximum capacity of {SM100_TMEM_CAPACITY_COLUMNS} or less than {SM100_TMEM_MIN_ALLOC_COLUMNS}" - ) - return num_tmem_alloc_cols - - def get_smem_layout_atom_ab( major_mode: OperandMajorMode, element_type: Type[Numeric], @@ -1156,11 +1126,54 @@ def cluster_shape_to_tma_atom_SFB( ) +@dsl_user_op +def get_permutation_mnk( + tile_shape_mnk: cute.Shape, + sf_vec_size: int, + use_mxf8f6f4: bool, + *, + loc=None, + ip=None, +) -> Tuple[int, int, int]: + """ + Get the permutation of M, N, K for the tiled MMA. + + :param tile_shape_mnk: The shape of the tile + :type tile_shape_mnk: cute.Shape + :param sf_vec_size: The vector size of the Scale Factor. + :type sf_vec_size: int + :param use_mxf8f6f4: Whether to use MXF8F6F4 or MXF4NVF4. + :type use_mxf8f6f4: bool + + :return: The permutation of M, N, K + :rtype: Tuple[int, int, int] + + :raise ValueError: If the tile shape is not divisible by the sf_vec_size + """ + perm_m = min(tile_shape_mnk[0], 128) + # refer to C++ code: + # /include/cutlass/gemm/collective/builders/sm120_common.inl?ref_type=heads#L158 + if sf_vec_size == 32 or sf_vec_size == 16: + perm_n_shape = (8, 2, 2) + perm_n_stride = (1, 16, 8) + else: + raise ValueError(f"Unsupported sf_vec_size, got {sf_vec_size}") + + perm_n_layout = cute.make_layout(perm_n_shape, stride=perm_n_stride) + perm_k = 32 if use_mxf8f6f4 else 64 + permutation_mnk = ( + perm_m, + perm_n_layout, + perm_k, + ) + + return permutation_mnk + + __all__ = [ "compute_epilogue_tile_shape", "get_smem_store_op", "get_tmem_load_op", - "get_num_tmem_alloc_cols", "make_smem_layout_a", "make_smem_layout_b", "make_smem_layout_epi", @@ -1169,4 +1182,6 @@ __all__ = [ "cluster_shape_to_tma_atom_A", "cluster_shape_to_tma_atom_B", "cluster_shape_to_tma_atom_SFB", + "get_permutation_mnk", + "get_num_tmem_alloc_cols", # deprecated; use cutlass.utils.get_num_tmem_alloc_cols instead ] diff --git a/python/CuTeDSL/cutlass/utils/blockscaled_layout.py b/python/CuTeDSL/cutlass/utils/blockscaled_layout.py index 40072d68..49078db5 100644 --- a/python/CuTeDSL/cutlass/utils/blockscaled_layout.py +++ b/python/CuTeDSL/cutlass/utils/blockscaled_layout.py @@ -214,6 +214,7 @@ def make_smem_layout_sfb( return sfb_smem_layout_staged + @dsl_user_op def make_tmem_layout_sfa( tiled_mma: cute.TiledMma, diff --git a/python/CuTeDSL/cutlass/utils/distributed.py b/python/CuTeDSL/cutlass/utils/distributed.py index 6741259c..36c458f1 100644 --- a/python/CuTeDSL/cutlass/utils/distributed.py +++ b/python/CuTeDSL/cutlass/utils/distributed.py @@ -16,13 +16,8 @@ import cutlass.cute as cute from cutlass.cute.typing import Pointer, Int32 from cutlass.cutlass_dsl import T, dsl_user_op from cutlass._mlir import ir -from cutlass._mlir.dialects import llvm, nvvm -from cutlass._mlir.dialects.nvvm import ( - MemOrderKind, - MemScopeKind, - AtomicOpKind, -) - +from cutlass._mlir.dialects import llvm +from cutlass.cute.typing import Literal __all__ = [ # misc @@ -43,14 +38,12 @@ __all__ = [ @dsl_user_op -def atomicAdd(dst_ptr: Pointer, val: Int32, loc=None, ip=None) -> Int32: - return nvvm.atomicrmw( - T.i32(), - AtomicOpKind.ADD, - dst_ptr.llvm_ptr, - val.ir_value(loc=loc, ip=ip), - mem_order=MemOrderKind.RELAXED, - syncscope=MemScopeKind.SYS, +def atomicAdd(dst_ptr: Pointer, val: Int32, *, loc=None, ip=None) -> Int32: + return cute.arch.atomic_add( + ptr=dst_ptr.llvm_ptr, + val=val, + sem="relaxed", + scope="sys", loc=loc, ip=ip, ) @@ -273,41 +266,24 @@ def spin_lock_atom_cas_relaxed_wait( *, expected_val: Int32, reset_val: Int32, - scope: str, + scope: Literal["gpu", "sys"], loc=None, ip=None, ) -> None: """ wait on a spin lock until the expected count is reached. Reset flag to reset_val if the expected count is reached. """ - if scope == "gpu": - result = 0 - while result != expected_val: - result = nvvm.atomicrmw( - T.i32(), - AtomicOpKind.CAS, - lock_ptr.llvm_ptr, - Int32(reset_val).ir_value(loc=loc, ip=ip), - b=Int32(expected_val).ir_value(loc=loc, ip=ip), - mem_order=MemOrderKind.RELAXED, - syncscope=MemScopeKind.GPU, - loc=loc, - ip=ip, - ) - elif scope == "sys": - result = 0 - while result != expected_val: - result = nvvm.atomicrmw( - T.i32(), - AtomicOpKind.CAS, - lock_ptr.llvm_ptr, - Int32(reset_val).ir_value(loc=loc, ip=ip), - b=Int32(expected_val).ir_value(loc=loc, ip=ip), - mem_order=MemOrderKind.RELAXED, - syncscope=MemScopeKind.SYS, - loc=loc, - ip=ip, - ) + result = 0 + while result != expected_val: + result = cute.arch.atomic_cas( + ptr=lock_ptr.llvm_ptr, + cmp=Int32(expected_val), + val=Int32(reset_val), + sem="relaxed", + scope=scope, + loc=loc, + ip=ip, + ) ######################################################## diff --git a/python/CuTeDSL/cutlass/utils/dynamic_persistent_tile_scheduler.py b/python/CuTeDSL/cutlass/utils/dynamic_persistent_tile_scheduler.py new file mode 100644 index 00000000..dec19c90 --- /dev/null +++ b/python/CuTeDSL/cutlass/utils/dynamic_persistent_tile_scheduler.py @@ -0,0 +1,276 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import Tuple + +from cutlass.cutlass_dsl import ( + Boolean, + Integer, + Int32, + min, + extract_mlir_values, + new_from_mlir_values, + dsl_user_op, + T, +) +from cutlass._mlir import ir +from cutlass.utils.static_persistent_tile_scheduler import ( + WorkTileInfo, +) +import cutlass.cute as cute + +class ClcDynamicPersistentTileSchedulerParams: + """A class to represent parameters for a dynamic persistent tile scheduler. + + This class is designed to manage and compute the layout of clusters and tiles + in a batched gemm problem. + + :ivar cluster_shape_mn: Shape of the cluster in (m, n) dimensions (K dimension cta count must be 1). + :type cluster_shape_mn: tuple + """ + + def __init__( + self, + problem_shape_ntile_mnl: cute.Shape, + cluster_shape_mnk: cute.Shape, + *, + loc=None, + ip=None, + ): + """ + Initializes the ClcDynamicPersistentTileSchedulerParams with the given parameters. + + :param problem_shape_ntile_mnl: The shape of the problem in terms of + number of CTA (Cooperative Thread Array) in (m, n, l) dimensions. + :type problem_shape_ntile_mnl: cute.Shape + :param cluster_shape_mnk: The shape of the cluster in (m, n) dimensions. + :type cluster_shape_mnk: cute.Shape + + :raises ValueError: If cluster_shape_k is not 1. + """ + + if cluster_shape_mnk[2] != 1: + raise ValueError(f"unsupported cluster_shape_k {cluster_shape_mnk[2]}") + + self.problem_shape_ntile_mnl = problem_shape_ntile_mnl + # cluster_shape_mnk is kept for reconstruction + self._cluster_shape_mnk = cluster_shape_mnk + self.cluster_shape_mn = cluster_shape_mnk[:2] + self._loc = loc + + def __extract_mlir_values__(self): + values, self._values_pos = [], [] + for obj in [self.problem_shape_ntile_mnl, self._cluster_shape_mnk]: + obj_values = extract_mlir_values(obj) + values += obj_values + self._values_pos.append(len(obj_values)) + return values + + def __new_from_mlir_values__(self, values): + obj_list = [] + for obj, n_items in zip( + [self.problem_shape_ntile_mnl, self._cluster_shape_mnk], self._values_pos + ): + obj_list.append(new_from_mlir_values(obj, values[:n_items])) + values = values[n_items:] + return ClcDynamicPersistentTileSchedulerParams( + *(tuple(obj_list)), loc=self._loc + ) + + @dsl_user_op + def get_grid_shape(self, *, loc=None, ip=None) -> Tuple[Integer, Integer, Integer]: + """ + Computes the grid shape based on the problem shape and cluster shape. + + :return: the grid is the CTA numbers that has aligned with cluster shape. + """ + + problem_ceiling_cta_mnl = cute.round_up( + self.problem_shape_ntile_mnl, self._cluster_shape_mnk + ) + return problem_ceiling_cta_mnl + +class ClcDynamicPersistentTileScheduler: + """A scheduler for dynamic persistent tile execution in CUTLASS/CuTe kernels. + + :ivar params: Tile schedule related params, including cluster shape. + :type params: ClcDynamicPersistentTileSchedulerParams + :ivar cta_id_in_cluster: ID of the CTA within its cluster + :type cta_id_in_cluster: cute.Coord + :ivar _num_tiles_executed: Counter for executed tiles + :type _num_tiles_executed: Int32 + """ + + def __init__( + self, + params: ClcDynamicPersistentTileSchedulerParams, + cta_id_in_cluster: cute.Coord, + num_tiles_executed: Int32, + clc_response_ptr: cute.Pointer, + block_idx: Tuple[Integer, Integer, Integer], + ): + """ + Initializes the ClcDynamicPersistentTileScheduler with the given parameters. + + :param params: Tile schedule related params, including cluster shape. + :type params: ClcDynamicPersistentTileSchedulerParams + :param cta_id_in_cluster: ID of the CTA within its cluster. + :type cta_id_in_cluster: cute.Coord + :param num_tiles_executed: Counter for executed tiles. + :type num_tiles_executed: Int32 + :param clc_response_ptr: Pointer of the clc rsponse. + :type clc_response_ptr: Tuple[Integer, Integer, Integer, Integer] + :param block_idx: The block index. + :type block_idx: Tuple[Integer, Integer, Integer] + """ + self.params = params + self.cta_id_in_cluster = cta_id_in_cluster + self._num_tiles_executed = num_tiles_executed + self._clc_response_ptr = clc_response_ptr + self._block_idx = block_idx + + def __extract_mlir_values__(self) -> list[ir.Value]: + values = extract_mlir_values(self.cta_id_in_cluster) + values.extend(extract_mlir_values(self._num_tiles_executed)) + values.extend(extract_mlir_values(self._clc_response_ptr)) + values.extend(extract_mlir_values(self._block_idx)) + return values + + def __new_from_mlir_values__( + self, values: list[ir.Value] + ) -> "ClcDynamicPersistentTileScheduler": + assert len(values) == 8 + new_cta_id_in_cluster = new_from_mlir_values( + self.cta_id_in_cluster, values[0:3] + ) + new_num_tiles_executed = new_from_mlir_values( + self._num_tiles_executed, [values[3]] + ) + new_clc_response_ptr = new_from_mlir_values(self._clc_response_ptr, [values[4]]) + new_block_idx = new_from_mlir_values(self._block_idx, values[5:8]) + return ClcDynamicPersistentTileScheduler( + self.params, + new_cta_id_in_cluster, + new_num_tiles_executed, + new_clc_response_ptr, + new_block_idx, + ) + + @dsl_user_op + @staticmethod + def create( + params: ClcDynamicPersistentTileSchedulerParams, + block_idx: Tuple[Integer, Integer, Integer], + grid_dim: Tuple[Integer, Integer, Integer], + clc_response_ptr: cute.Pointer, + *, + loc=None, + ip=None, + ): + """Initialize the dynamic persistent tile scheduler. + + :param params: Parameters for the persistent + tile scheduler. + :type params: ClcDynamicPersistentTileSchedulerParams + :param block_idx: The 3d block index in the format (bidx, bidy, bidz). + :type block_idx: Tuple[Integer, Integer, Integer] + :param grid_dim: The 3d grid dimensions for kernel launch. + :type grid_dim: Tuple[Integer, Integer, Integer] + + :return: A ClcDynamicPersistentTileScheduler object. + :rtype: ClcDynamicPersistentTileScheduler + """ + params = params + + bidx, bidy, bidz = block_idx + + # CTA id in the cluster + cta_id_in_cluster = ( + Int32(bidx % params.cluster_shape_mn[0]), + Int32(bidy % params.cluster_shape_mn[1]), + Int32(0), + ) + + # Initialize number of tiles executed to zero + num_tiles_executed = Int32(0) + # Initialize clc response pointer + clc_response_ptr = clc_response_ptr + # The block index + block_idx = block_idx + + return ClcDynamicPersistentTileScheduler( + params, + cta_id_in_cluster, + num_tiles_executed, + clc_response_ptr, + block_idx, + ) + + # called by host + @dsl_user_op + def get_grid_shape( + params: ClcDynamicPersistentTileSchedulerParams, + *, + loc=None, + ip=None, + ) -> Tuple[Integer, Integer, Integer]: + """Calculates the grid shape to be launched on GPU using problem shape, + threadblock shape, and active cluster size. + + :param params: Parameters for grid shape calculation. + :type params: ClcDynamicPersistentTileSchedulerParams + + :return: The calculated 3d grid shape. + :rtype: Tuple[Integer, Integer, Integer] + """ + + return params.get_grid_shape(loc=loc, ip=ip) + + @dsl_user_op + def work_tile_info_from_clc_response( + self, result_addr: Int32, *, loc=None, ip=None + ) -> WorkTileInfo: + """ + Simulates parsing CLC response data in Python. + result_addr: 16-byte response data (simulating shared memory access) + """ + m_idx, n_idx, l_idx, vld = cute.arch.clc_response(result_addr, loc=loc, ip=ip) + cute.arch.fence_proxy( + cute.arch.ProxyKind.async_shared, + space=cute.arch.SharedSpace.shared_cta, + ) + cta_idx_in_cluster, cta_idy_in_cluster, _ = self.cta_id_in_cluster + cur_tile_coord = (m_idx + cta_idx_in_cluster, n_idx + cta_idy_in_cluster, l_idx) + return WorkTileInfo(cur_tile_coord, vld) + + @dsl_user_op + def get_current_work(self, *, loc=None, ip=None) -> WorkTileInfo: + smem_addr = self._clc_response_ptr + work_tile = self.work_tile_info_from_clc_response(smem_addr) + return work_tile + + @dsl_user_op + def initial_work_tile_info(self, *, loc=None, ip=None) -> WorkTileInfo: + bidx, bidy, bidz = self._block_idx + return WorkTileInfo((bidx, bidy, bidz), True) + + @dsl_user_op + def advance_to_next_work(self, mbarrier_addr, loc=None, ip=None): + # Query new work tile + with cute.arch.elect_one(): + cute.arch.issue_clc_query( + mbarrier_addr, self._clc_response_ptr, loc=loc, ip=ip + ) + self._num_tiles_executed += Int32(1) + + @property + def num_tiles_executed(self) -> Int32: + return self._num_tiles_executed diff --git a/python/CuTeDSL/cutlass/utils/gemm/__init__.py b/python/CuTeDSL/cutlass/utils/gemm/__init__.py new file mode 100644 index 00000000..d9d89020 --- /dev/null +++ b/python/CuTeDSL/cutlass/utils/gemm/__init__.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited + +from . import sm100 + +__all__ = [ + "sm100", +] diff --git a/python/CuTeDSL/cutlass/utils/gemm/sm100.py b/python/CuTeDSL/cutlass/utils/gemm/sm100.py new file mode 100644 index 00000000..1089a91a --- /dev/null +++ b/python/CuTeDSL/cutlass/utils/gemm/sm100.py @@ -0,0 +1,917 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited + +from typing import Tuple, Union +import cutlass.cute as cute +from cutlass.cutlass_dsl import Int32, Boolean, Constexpr, const_expr +import cutlass.pipeline as pipeline +from cutlass.utils.static_persistent_tile_scheduler import StaticPersistentTileScheduler +from cutlass.utils.dynamic_persistent_tile_scheduler import ( + ClcDynamicPersistentTileScheduler, +) +from cutlass.utils.blackwell_helpers import get_tmem_load_op, get_smem_store_op +from cutlass.cute.nvgpu import cpasync, tcgen05 +from cutlass.cute.nvgpu.common import CacheEvictionPriority + +__all__ = [ + "epilogue_tma_store", + "epilogue", + "epilogue_tma_store_release_flag", + "epilogue_release_flag", +] + + +def transform_partitioned_tensor_layout(tensor: cute.Tensor) -> cute.Tensor: + """ + Transform MMA layout from ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, ...rest) + to ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), ...rest). + + This groups MMA_ATOM_M with MMA_M and MMA_ATOM_N with MMA_N. + + :param tensor: Input tensor with layout ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, ...rest) + :type tensor: cute.Tensor + :return: Transformed tensor with layout ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), ...rest) + :rtype: cute.Tensor + """ + layout = tensor.layout + shape = layout.shape + stride = layout.stride + + # Build new shape: ((shape[0][0], shape[1]), (shape[0][1], shape[2]), ...rest) + new_shape = ((shape[0][0], shape[1]), (shape[0][1], shape[2]), *shape[3:]) + + # Build new stride: ((stride[0][0], stride[1]), (stride[0][1], stride[2]), ...rest) + new_stride = ((stride[0][0], stride[1]), (stride[0][1], stride[2]), *stride[3:]) + + new_layout = cute.make_layout(shape=new_shape, stride=new_stride) + return cute.make_tensor(tensor.iterator, new_layout) + + +def epilogue_tmem_copy_and_partition( + gemm_kernel, + tidx: Int32, + tAcc: cute.Tensor, + tCgC: cute.Tensor, + epi_tile: cute.Tile, + use_2cta_instrs: Union[Boolean, bool], +) -> Tuple[cute.TiledCopy, cute.Tensor, cute.Tensor]: + """ + Make tiledCopy for tensor memory load, then use it to partition tensor memory (source) and register array (destination). + + :param gemm_kernel: The kernel instance + :type gemm_kernel: Any + :param tidx: The thread index in epilogue warp groups + :type tidx: Int32 + :param tAcc: The accumulator tensor to be copied and partitioned + :type tAcc: cute.Tensor + :param tCgC: The global tensor C to be copied and partitioned + :type tCgC: cute.Tensor + :param epi_tile: The epilogue tiler + :type epi_tile: cute.Tile + :param use_2cta_instrs: Whether use_2cta_instrs is enabled + :type use_2cta_instrs: Union[Boolean, bool] + + :return: A tuple containing (tiled_copy_t2r, tTR_tAcc, tTR_rAcc) where: + - tiled_copy_t2r: The tiled copy operation for tmem to register copy(t2r) + - tTR_tAcc: The partitioned accumulator tensor + - tTR_rAcc: The accumulated tensor in register used to hold t2r results + :rtype: Tuple[cute.TiledCopy, cute.Tensor, cute.Tensor] + """ + # Make tiledCopy for tensor memory load + copy_atom_t2r = get_tmem_load_op( + gemm_kernel.cta_tile_shape_mnk, + gemm_kernel.c_layout, + gemm_kernel.c_dtype, + gemm_kernel.acc_dtype, + epi_tile, + use_2cta_instrs, + ) + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, STAGE) + tAcc_epi = cute.flat_divide( + tAcc, + epi_tile, + ) + # (EPI_TILE_M, EPI_TILE_N) + tiled_copy_t2r = tcgen05.make_tmem_copy( + copy_atom_t2r, tAcc_epi[(None, None, 0, 0, 0)] + ) + + thr_copy_t2r = tiled_copy_t2r.get_slice(tidx) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_M, STAGE) + tTR_tAcc = thr_copy_t2r.partition_S(tAcc_epi) + + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, RestM, RestN, RestL) + tCgC_epi = cute.flat_divide(tCgC, epi_tile) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N, RestM, RestN, RestL) + tTR_gC = thr_copy_t2r.partition_D(tCgC_epi) + # (T2R, T2R_M, T2R_N) + tTR_rAcc = cute.make_rmem_tensor( + tTR_gC[(None, None, None, 0, 0, 0, 0, 0)].shape, gemm_kernel.acc_dtype + ) + return tiled_copy_t2r, tTR_tAcc, tTR_rAcc + + +def epilogue_smem_copy_and_partition( + gemm_kernel, + tiled_copy_t2r: cute.TiledCopy, + tTR_rC: cute.Tensor, + tidx: Int32, + sC: cute.Tensor, +) -> Tuple[cute.TiledCopy, cute.Tensor, cute.Tensor]: + """ + Make tiledCopy for shared memory store, then use it to partition register array (source) and shared memory (destination). + + :param tiled_copy_t2r: The tiled copy operation for tmem to register copy(t2r) + :type tiled_copy_t2r: cute.TiledCopy + :param tTR_rC: The partitioned accumulator tensor + :type tTR_rC: cute.Tensor + :param tidx: The thread index in epilogue warp groups + :type tidx: Int32 + :param sC: The shared memory tensor to be copied and partitioned + :type sC: cute.Tensor + + :return: A tuple containing (tiled_copy_r2s, tRS_rC, tRS_sC) where: + - tiled_copy_r2s: The tiled copy operation for register to smem copy(r2s) + - tRS_rC: The partitioned tensor C (register source) + - tRS_sC: The partitioned tensor C (smem destination) + :rtype: Tuple[cute.TiledCopy, cute.Tensor, cute.Tensor] + """ + copy_atom_r2s = get_smem_store_op( + gemm_kernel.c_layout, gemm_kernel.c_dtype, gemm_kernel.acc_dtype, tiled_copy_t2r + ) + tiled_copy_r2s = cute.make_tiled_copy_D(copy_atom_r2s, tiled_copy_t2r) + # (R2S, R2S_M, R2S_N, PIPE_D) + thr_copy_r2s = tiled_copy_r2s.get_slice(tidx) + tRS_sC = thr_copy_r2s.partition_D(sC) + # (R2S, R2S_M, R2S_N) + tRS_rC = tiled_copy_r2s.retile(tTR_rC) + return tiled_copy_r2s, tRS_rC, tRS_sC + + +@cute.jit +def epilogue_tma_store( + gemm_kernel, + epi_tidx: Int32, + warp_idx: Int32, + acc_pipeline: pipeline.PipelineAsync, + tiled_mma: cute.TiledMma, + tma_atom_c: cute.CopyAtom, + # Input of epilogue + tCtAcc_base: cute.Tensor, + # Staging of epilogue + sC: cute.Tensor, + # Output of epilogue + tCgC_base: cute.Tensor, + epi_tile: cute.Tile, + tile_sched: Union[StaticPersistentTileScheduler, ClcDynamicPersistentTileScheduler], + epilogue_op: Constexpr, + clc_pipeline: Union[pipeline.PipelineClcFetchAsync, None] = None, + clc_consumer_state: Union[pipeline.PipelineState, None] = None, +) -> None: + # Layout transformation for tCgC_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, TILE_M, TILE_N, TILE_K) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), TILE_M, TILE_N, TILE_K) + tCgC = transform_partitioned_tensor_layout(tCgC_base) + + # Layout transformation for tCtAcc_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, STAGE) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), STAGE) + tCtAcc = transform_partitioned_tensor_layout(tCtAcc_base) + + tiled_copy_t2r, tTR_tAcc_base, tTR_rAcc = epilogue_tmem_copy_and_partition( + gemm_kernel, epi_tidx, tCtAcc, tCgC, epi_tile, gemm_kernel.use_2cta_instrs + ) + + tTR_rC = cute.make_rmem_tensor(tTR_rAcc.shape, gemm_kernel.c_dtype) + tiled_copy_r2s, tRS_rC, tRS_sC = epilogue_smem_copy_and_partition( + gemm_kernel, tiled_copy_t2r, tTR_rC, epi_tidx, sC + ) + + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, RestM, RestN, RestL) + tCgC_epi = cute.flat_divide(tCgC, epi_tile) + # ((ATOM_V, REST_V), EPI_M, EPI_N) + # ((ATOM_V, REST_V), EPI_M, EPI_N, RestM, RestN, RestL) + bSG_sC, bSG_gC_partitioned = cpasync.tma_partition( + tma_atom_c, + 0, + cute.make_layout(1), + cute.group_modes(sC, 0, 2), + cute.group_modes(tCgC_epi, 0, 2), + ) + + acc_consumer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Consumer, gemm_kernel.num_acc_stage + ) + + # Threads/warps participating in tma store pipeline + c_producer_group = pipeline.CooperativeGroup( + pipeline.Agent.Thread, + 32 * len(gemm_kernel.epilogue_warp_id), + ) + c_pipeline = pipeline.PipelineTmaStore.create( + num_stages=gemm_kernel.num_c_stage, producer_group=c_producer_group + ) + + epilog_sync_barrier = pipeline.NamedBarrier( + barrier_id=gemm_kernel.epilog_sync_bar_id, + num_threads=32 * len(gemm_kernel.epilogue_warp_id), + ) + + work_tile = tile_sched.initial_work_tile_info() + while work_tile.is_valid_tile: + # Get tile coord from tile scheduler + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # + # Slice to per mma tile index + # + # ((ATOM_V, REST_V), EPI_M, EPI_N) + bSG_gC = bSG_gC_partitioned[(None, None, None, *mma_tile_coord_mnl)] + + # Set tensor memory buffer for current tile + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N) + tTR_tAcc = tTR_tAcc_base[ + (None, None, None, None, None, acc_consumer_state.index) + ] + + # + # Wait for accumulator buffer full + # + acc_pipeline.consumer_wait(acc_consumer_state) + + tTR_tAcc = cute.group_modes(tTR_tAcc, 3, cute.rank(tTR_tAcc)) + bSG_gC = cute.group_modes(bSG_gC, 1, cute.rank(bSG_gC)) + + # + # Store accumulator to global memory in subtiles + # + subtile_cnt = cute.size(tTR_tAcc.shape, mode=[3]) + num_prev_subtiles = tile_sched.num_tiles_executed * subtile_cnt + for subtile_idx in range(subtile_cnt): + # + # Load accumulator from tensor memory buffer to register + # + tTR_tAcc_mn = tTR_tAcc[(None, None, None, subtile_idx)] + cute.copy(tiled_copy_t2r, tTR_tAcc_mn, tTR_rAcc) + + # + # Convert to C type + # + acc_vec = tiled_copy_r2s.retile(tTR_rAcc).load() + acc_vec = epilogue_op(acc_vec.to(gemm_kernel.c_dtype)) + tRS_rC.store(acc_vec) + + # + # Store C to shared memory + # + c_buffer = (num_prev_subtiles + subtile_idx) % gemm_kernel.num_c_stage + cute.copy(tiled_copy_r2s, tRS_rC, tRS_sC[(None, None, None, c_buffer)]) + # Fence and barrier to make sure shared memory store is visible to TMA store + cute.arch.fence_proxy( + cute.arch.ProxyKind.async_shared, + space=cute.arch.SharedSpace.shared_cta, + ) + epilog_sync_barrier.arrive_and_wait() + + # + # TMA store C to global memory + # + if warp_idx == gemm_kernel.epilogue_warp_id[0]: + cute.copy( + tma_atom_c, + bSG_sC[(None, c_buffer)], + bSG_gC[(None, subtile_idx)], + ) + # Fence and barrier to make sure shared memory store is visible to TMA store + c_pipeline.producer_commit() + c_pipeline.producer_acquire() + epilog_sync_barrier.arrive_and_wait() + + epilog_sync_barrier.arrive_and_wait() + + # + # Async arrive accumulator buffer empty + # + with cute.arch.elect_one(): + acc_pipeline.consumer_release(acc_consumer_state) + acc_consumer_state.advance() + + # + # Advance to next tile + # + # Check if tile_sched is StaticPersistentTileScheduler or any subclass inheriting from it + if const_expr(isinstance(tile_sched, StaticPersistentTileScheduler)): + tile_sched.advance_to_next_work() + work_tile = tile_sched.get_current_work() + elif const_expr(isinstance(tile_sched, ClcDynamicPersistentTileScheduler)): + clc_pipeline.consumer_wait(clc_consumer_state) + work_tile = tile_sched.get_current_work() + clc_pipeline.consumer_release(clc_consumer_state) + clc_consumer_state.advance() + else: + # Not match + pass + + # Wait for C store complete + c_pipeline.producer_tail() + + +@cute.jit +def epilogue( + gemm_kernel, + epi_tidx: Int32, + acc_pipeline: pipeline.PipelineAsync, + tiled_mma: cute.TiledMma, + tCtAcc_base: cute.Tensor, + tCgC_base: cute.Tensor, + epi_tile: cute.Tile, + tile_sched: Union[StaticPersistentTileScheduler, ClcDynamicPersistentTileScheduler], + epilogue_op: Constexpr, + tmem_dealloc_barrier: pipeline.NamedBarrier, + tCcC_base: cute.Tensor = None, + mC_mnl: cute.Tensor = None, + clc_pipeline: Union[pipeline.PipelineClcFetchAsync, None] = None, + clc_consumer_state: Union[pipeline.PipelineState, None] = None, +) -> None: + """ + Epilogue function that stores accumulator results directly to global memory. + Used when TMA store is not enabled. + + :param gemm_kernel: The kernel instance + :type gemm_kernel: Any + :param epi_tidx: Thread index in epilogue warp groups + :type epi_tidx: Int32 + :param acc_pipeline: Accumulator pipeline for async operations + :type acc_pipeline: pipeline.PipelineAsync + :param tiled_mma: The tiled MMA configuration + :type tiled_mma: cute.TiledMma + :param tCtAcc_base: Base accumulator tensor in tensor memory + :type tCtAcc_base: cute.Tensor + :param tCgC_base: The global memory tensor C to be copied and partitioned + :type tCgC_base: cute.Tensor + :param epi_tile: Epilogue tile configuration + :type epi_tile: cute.Tile + :param tile_sched: Tile scheduler for persistent scheduling + :type tile_sched: StaticPersistentTileScheduler + :param epilogue_op: Optional elementwise operation to apply + :type epilogue_op: Constexpr + :param tmem_dealloc_barrier: Barrier for tensor memory deallocation + :type tmem_dealloc_barrier: pipeline.NamedBarrier + :param alignment_bytes: Alignment bytes for global memory store + :type alignment_bytes: int + :param tCcC_base: Identity/coordinate tensor C + :type tCcC_base: cute.Tensor + :param mC_mnl: Global memory tensor C (full tensor for predicate computation) + :type mC_mnl: cute.Tensor + :param clc_pipeline: Pipeline for dynamic persistent tile scheduling + :type clc_pipeline: Union[pipeline.PipelineClcFetchAsync, None] + :param clc_consumer_state: Consumer state for dynamic persistent tile scheduling + :type clc_consumer_state: Union[pipeline.PipelineState, None] + """ + + # Layout transformation for tCgC_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, TILE_M, TILE_N, TILE_K) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), TILE_M, TILE_N, TILE_K) + tCgC = transform_partitioned_tensor_layout(tCgC_base) + + # Layout transformation for tCtAcc_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, STAGE) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), STAGE) + tCtAcc = transform_partitioned_tensor_layout(tCtAcc_base) + + # + # Partition for epilogue + # + ( + tiled_copy_t2r, + tTR_tAcc_base, + tTR_rAcc, + ) = epilogue_tmem_copy_and_partition( + gemm_kernel, epi_tidx, tCtAcc, tCgC, epi_tile, gemm_kernel.use_2cta_instrs + ) + + gC_epi = cute.flat_divide(tCgC, epi_tile) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N, RestM, RestN, RestL) + thr_copy_t2r = tiled_copy_t2r.get_slice(epi_tidx) + tTR_gC_partitioned = thr_copy_t2r.partition_D(gC_epi) + # (T2R, T2R_M, T2R_N) + tTR_rC = cute.make_rmem_tensor( + tTR_gC_partitioned[(None, None, None, 0, 0, 0, 0, 0)].shape, gemm_kernel.c_dtype + ) + + mclD = cute.max_common_layout( + tTR_rC.layout, tTR_gC_partitioned[(None, None, None, 0, 0, 0, 0, 0)].layout + ) + num_bits_per_copy = min( + tTR_gC_partitioned.iterator.alignment * 8, + cute.size(mclD) * gemm_kernel.c_dtype.width, + 256, + ) + + simt_atom = cute.make_copy_atom( + cute.nvgpu.CopyUniversalOp(), + gemm_kernel.c_dtype, + num_bits_per_copy=num_bits_per_copy, + l1c_evict_priority=CacheEvictionPriority.NO_ALLOCATE, + ) + use_predication = tCcC_base is not None and mC_mnl is not None + + if const_expr(use_predication): + # Layout transformation for tCcC_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, TILE_M, TILE_N, TILE_K) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), TILE_M, TILE_N, TILE_K) + tCcC = transform_partitioned_tensor_layout(tCcC_base) + cC_epi = cute.flat_divide(tCcC, epi_tile) + tTR_cC_partitioned = thr_copy_t2r.partition_D(cC_epi) + + acc_consumer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Consumer, gemm_kernel.num_acc_stage + ) + + work_tile = tile_sched.initial_work_tile_info() + while work_tile.is_valid_tile: + # + # Pre-advance to next tile + # + if const_expr(isinstance(tile_sched, StaticPersistentTileScheduler)): + tile_sched.advance_to_next_work() + next_work_tile = tile_sched.get_current_work() + + # Get tile coord from current work tile + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N) + tTR_gC = tTR_gC_partitioned[ + ( + None, + None, + None, + None, + None, + *mma_tile_coord_mnl, + ) + ] + if const_expr(use_predication): + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N) + tTR_cC = tTR_cC_partitioned[ + ( + None, + None, + None, + None, + None, + *mma_tile_coord_mnl, + ) + ] + tTR_cC = cute.group_modes(tTR_cC, 3, cute.rank(tTR_cC)) + + # Set tensor memory buffer for current tile + # (T2R, T2R_M, T2R_N, EPI_M, EPI_M) + tTR_tAcc = tTR_tAcc_base[ + (None, None, None, None, None, acc_consumer_state.index) + ] + + # + # Wait for accumulator buffer full + # + acc_pipeline.consumer_wait(acc_consumer_state) + + tTR_tAcc = cute.group_modes(tTR_tAcc, 3, cute.rank(tTR_tAcc)) + tTR_gC = cute.group_modes(tTR_gC, 3, cute.rank(tTR_gC)) + # + # Store accumulator to global memory in subtiles + # + subtile_cnt = cute.size(tTR_tAcc.shape, mode=[3]) + for subtile_idx in range(subtile_cnt): + # + # Get the destination and coordinate slices for this subtile + # + tTR_gC_subtile = tTR_gC[(None, None, None, subtile_idx)] + # + # Load accumulator from tensor memory buffer to register + # + tTR_tAcc_mn = tTR_tAcc[(None, None, None, subtile_idx)] + cute.copy(tiled_copy_t2r, tTR_tAcc_mn, tTR_rAcc) + # Async arrive accumulator buffer empty + # Release early for perf + if subtile_idx == subtile_cnt - 1: + with cute.arch.elect_one(): + acc_pipeline.consumer_release(acc_consumer_state) + acc_consumer_state.advance() + + # + # Convert to C type + # + acc_vec = tTR_rAcc.load() + acc_vec = epilogue_op(acc_vec.to(gemm_kernel.c_dtype)) + tTR_rC.store(acc_vec) + + if const_expr(use_predication): + # compute predicate + tTR_cC_subtile = tTR_cC[(None, None, None, subtile_idx)] + pred_C_shape = (1, *tTR_cC_subtile.shape[1:]) + pred_C = cute.make_rmem_tensor(pred_C_shape, Boolean) + for m_idx in range(tTR_cC_subtile.shape[1]): + for n_idx in range(tTR_cC_subtile.shape[2]): + vector_first_coord = tTR_cC_subtile[(0, m_idx, n_idx)] + pred_C[(0, m_idx, n_idx)] = cute.elem_less( + vector_first_coord, mC_mnl.shape + ) + # Store C to global memory with predication + cute.copy(simt_atom, tTR_rC, tTR_gC_subtile, pred=pred_C) + else: + # Store C directly to global memory + cute.copy(simt_atom, tTR_rC, tTR_gC_subtile) + + if const_expr(isinstance(tile_sched, StaticPersistentTileScheduler)): + work_tile = next_work_tile + elif const_expr(isinstance(tile_sched, ClcDynamicPersistentTileScheduler)): + clc_pipeline.consumer_wait(clc_consumer_state) + work_tile = tile_sched.get_current_work() + clc_pipeline.consumer_release(clc_consumer_state) + clc_consumer_state.advance() + + # Synchronize before TMEM dealloc (done by the caller) + tmem_dealloc_barrier.arrive_and_wait() + + +@cute.jit +def epilogue_tma_store_release_flag( + gemm_kernel, + epi_tidx: Int32, + warp_idx: Int32, + acc_pipeline: pipeline.PipelineAsync, + tiled_mma: cute.TiledMma, + tma_atom_c: cute.CopyAtom, + # Input of epilogue + tCtAcc_base: cute.Tensor, + # Staging of epilogue + sC: cute.Tensor, + # Output of epilogue + tCgC_base: cute.Tensor, + epi_tile: cute.Tile, + tile_sched: StaticPersistentTileScheduler, + epilogue_op: Constexpr, + flag_base: cute.Tensor, + flag_mem_scope: str, +) -> None: + # Layout transformation for tCgC_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, TILE_M, TILE_N, TILE_K) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), TILE_M, TILE_N, TILE_K) + tCgC = transform_partitioned_tensor_layout(tCgC_base) + # Layout transformation for tCtAcc_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, STAGE) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), STAGE) + tCtAcc = transform_partitioned_tensor_layout(tCtAcc_base) + tiled_copy_t2r, tTR_tAcc_base, tTR_rAcc = epilogue_tmem_copy_and_partition( + gemm_kernel, epi_tidx, tCtAcc, tCgC, epi_tile, gemm_kernel.use_2cta_instrs + ) + + tTR_rC = cute.make_rmem_tensor(tTR_rAcc.shape, gemm_kernel.c_dtype) + tiled_copy_r2s, tRS_rC, tRS_sC = epilogue_smem_copy_and_partition( + gemm_kernel, tiled_copy_t2r, tTR_rC, epi_tidx, sC + ) + + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, RestM, RestN, RestL) + tCgC_epi = cute.flat_divide(tCgC, epi_tile) + # ((ATOM_V, REST_V), EPI_M, EPI_N) + # ((ATOM_V, REST_V), EPI_M, EPI_N, RestM, RestN, RestL) + bSG_sC, bSG_gC_partitioned = cpasync.tma_partition( + tma_atom_c, + 0, + cute.make_layout(1), + cute.group_modes(sC, 0, 2), + cute.group_modes(tCgC_epi, 0, 2), + ) + + acc_consumer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Consumer, gemm_kernel.num_acc_stage + ) + + # Threads/warps participating in tma store pipeline + c_producer_group = pipeline.CooperativeGroup( + pipeline.Agent.Thread, + 32 * len(gemm_kernel.epilogue_warp_id), + ) + c_pipeline = pipeline.PipelineTmaStore.create( + num_stages=gemm_kernel.num_c_stage, producer_group=c_producer_group + ) + + epilog_sync_barrier = pipeline.NamedBarrier( + barrier_id=gemm_kernel.epilog_sync_bar_id, + num_threads=32 * len(gemm_kernel.epilogue_warp_id), + ) + + work_tile = tile_sched.initial_work_tile_info() + while work_tile.is_valid_tile: + # Get tile coord from tile scheduler + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # + # Slice to per mma tile index + # + # ((ATOM_V, REST_V), EPI_M, EPI_N) + bSG_gC = bSG_gC_partitioned[(None, None, None, *mma_tile_coord_mnl)] + + # Set tensor memory buffer for current tile + # (T2R, T2R_M, T2R_N, EPI_M, EPI_M) + tTR_tAcc = tTR_tAcc_base[ + (None, None, None, None, None, acc_consumer_state.index) + ] + + # + # Wait for accumulator buffer full + # + acc_pipeline.consumer_wait(acc_consumer_state) + + tTR_tAcc = cute.group_modes(tTR_tAcc, 3, cute.rank(tTR_tAcc)) + bSG_gC = cute.group_modes(bSG_gC, 1, cute.rank(bSG_gC)) + + # + # Store accumulator to global memory in subtiles + # + subtile_cnt = cute.size(tTR_tAcc.shape, mode=[3]) + num_prev_subtiles = tile_sched.num_tiles_executed * subtile_cnt + for subtile_idx in range(subtile_cnt): + # + # Load accumulator from tensor memory buffer to register + # + tTR_tAcc_mn = tTR_tAcc[(None, None, None, subtile_idx)] + cute.copy(tiled_copy_t2r, tTR_tAcc_mn, tTR_rAcc) + + # + # Convert to C type + # + acc_vec = tiled_copy_r2s.retile(tTR_rAcc).load() + acc_vec = epilogue_op(acc_vec.to(gemm_kernel.c_dtype)) + tRS_rC.store(acc_vec) + + # + # Store C to shared memory + # + c_buffer = (num_prev_subtiles + subtile_idx) % gemm_kernel.num_c_stage + cute.copy(tiled_copy_r2s, tRS_rC, tRS_sC[(None, None, None, c_buffer)]) + # Fence and barrier to make sure shared memory store is visible to TMA store + cute.arch.fence_proxy( + cute.arch.ProxyKind.async_shared, + space=cute.arch.SharedSpace.shared_cta, + ) + epilog_sync_barrier.arrive_and_wait() + + # + # TMA store C to global memory + # + if warp_idx == gemm_kernel.epilogue_warp_id[0]: + cute.copy( + tma_atom_c, + bSG_sC[(None, c_buffer)], + bSG_gC[(None, subtile_idx)], + ) + # Fence and barrier to make sure shared memory store is visible to TMA store + c_pipeline.producer_commit() + c_pipeline.producer_acquire() + epilog_sync_barrier.arrive_and_wait() + + epilog_sync_barrier.arrive_and_wait() + + # + # Async arrive accumulator buffer empty + # + with cute.arch.elect_one(): + acc_pipeline.consumer_release(acc_consumer_state) + acc_consumer_state.advance() + + # + # Set Per Output Tile Flag with Release + # + import cutlass.utils as utils + from cutlass._mlir.dialects.nvvm import ( + MemOrderKind, + MemScopeKind, + ) + + # 1D linear index of current output tile + tile_id_linear = Int32( + tile_sched._current_work_linear_idx + * cute.size(gemm_kernel.cluster_shape_mn) + + cute.arch.block_idx_in_cluster() + ) + # Wait for C store complete + # Unlike regular epilogue where we only wait C store complete once at end of each kernel. + # Here we need to wait for C store complete for each output tile before we set the release flag. + c_pipeline.producer_tail() + # Update flag with release semantic with GPU scope + if warp_idx == gemm_kernel.epilogue_warp_id[0]: + with cute.arch.elect_one(): + flag_curr_tile = flag_base.iterator + tile_id_linear + utils.distributed.multimem_red_add1( + lock_ptr=flag_curr_tile, + order="release", + scope=flag_mem_scope, + ) + + # + # Advance to next tile + # + tile_sched.advance_to_next_work() + work_tile = tile_sched.get_current_work() + + +@cute.jit +def epilogue_release_flag( + gemm_kernel, + epi_tidx: Int32, + acc_pipeline: pipeline.PipelineAsync, + tiled_mma: cute.TiledMma, + tCtAcc_base: cute.Tensor, + tCgC_base: cute.Tensor, + epi_tile: cute.Tile, + tile_sched: StaticPersistentTileScheduler, + epilogue_op: Constexpr, + tmem_dealloc_barrier: pipeline.NamedBarrier, + flag_base: cute.Tensor, + flag_mem_scope: str, +) -> None: + """ + Epilogue function that stores accumulator results directly to global memory. + Used when TMA store is not enabled. + + :param gemm_kernel: The kernel instance + :type gemm_kernel: Any + :param epi_tidx: Thread index in epilogue warp groups + :type epi_tidx: Int32 + :param acc_pipeline: Accumulator pipeline for async operations + :type acc_pipeline: pipeline.PipelineAsync + :param tiled_mma: The tiled MMA configuration + :type tiled_mma: cute.TiledMma + :param tCtAcc_base: Base accumulator tensor in tensor memory + :type tCtAcc_base: cute.Tensor + :param tCgC_base: The global memory tensor C to be copied and partitioned + :type tCgC_base: cute.Tensor + :param epi_tile: Epilogue tile configuration + :type epi_tile: cute.Tile + :param tile_sched: Tile scheduler for persistent scheduling + :type tile_sched: StaticPersistentTileScheduler + :param epilogue_op: Optional elementwise operation to apply + :type epilogue_op: Constexpr + :param tmem_dealloc_barrier: Barrier for tensor memory deallocation + :type tmem_dealloc_barrier: pipeline.NamedBarrier + :param flag_base: Base flag tensor + :type flag_base: cute.Tensor + :param flag_mem_scope: Memory scope for flag + :type flag_mem_scope: str + """ + # Layout transformation for tCgC_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, TILE_M, TILE_N, TILE_K) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), TILE_M, TILE_N, TILE_K) + tCgC = transform_partitioned_tensor_layout(tCgC_base) + # Layout transformation for tCtAcc_base + # ((MMA_ATOM_M, MMA_ATOM_N), MMA_M, MMA_N, STAGE) + # -> ((MMA_ATOM_M, MMA_M), (MMA_ATOM_N, MMA_N), STAGE) + tCtAcc = transform_partitioned_tensor_layout(tCtAcc_base) + # + # Partition for epilogue + # + ( + tiled_copy_t2r, + tTR_tAcc_base, + tTR_rAcc, + ) = epilogue_tmem_copy_and_partition( + gemm_kernel, epi_tidx, tCtAcc, tCgC, epi_tile, gemm_kernel.use_2cta_instrs + ) + + gC_epi = cute.flat_divide(tCgC, epi_tile) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N, RestM, RestN, RestL) + thr_copy_t2r = tiled_copy_t2r.get_slice(epi_tidx) + tTR_gC_partitioned = thr_copy_t2r.partition_D(gC_epi) + # (T2R, T2R_M, T2R_N) + tTR_rC = cute.make_rmem_tensor( + tTR_gC_partitioned[(None, None, None, 0, 0, 0, 0, 0)].shape, gemm_kernel.c_dtype + ) + simt_atom = cute.make_copy_atom(cute.nvgpu.CopyUniversalOp(), gemm_kernel.c_dtype) + + acc_consumer_state = pipeline.make_pipeline_state( + pipeline.PipelineUserType.Consumer, gemm_kernel.num_acc_stage + ) + + work_tile = tile_sched.initial_work_tile_info() + while work_tile.is_valid_tile: + # Get tile coord from tile scheduler + cur_tile_coord = work_tile.tile_idx + mma_tile_coord_mnl = ( + cur_tile_coord[0] // cute.size(tiled_mma.thr_id.shape), + cur_tile_coord[1], + cur_tile_coord[2], + ) + + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N) + tTR_gC = tTR_gC_partitioned[ + ( + None, + None, + None, + None, + None, + *mma_tile_coord_mnl, + ) + ] + + # Set tensor memory buffer for current tile + # (T2R, T2R_M, T2R_N, EPI_M, EPI_M) + tTR_tAcc = tTR_tAcc_base[ + (None, None, None, None, None, acc_consumer_state.index) + ] + + # + # Wait for accumulator buffer full + # + acc_pipeline.consumer_wait(acc_consumer_state) + + tTR_tAcc = cute.group_modes(tTR_tAcc, 3, cute.rank(tTR_tAcc)) + tTR_gC = cute.group_modes(tTR_gC, 3, cute.rank(tTR_gC)) + # + # Store accumulator to global memory in subtiles + # + subtile_cnt = cute.size(tTR_tAcc.shape, mode=[3]) + for subtile_idx in range(subtile_cnt): + # + # Load accumulator from tensor memory buffer to register + # + tTR_tAcc_mn = tTR_tAcc[(None, None, None, subtile_idx)] + cute.copy(tiled_copy_t2r, tTR_tAcc_mn, tTR_rAcc) + # Async arrive accumulator buffer empty + # Release early for perf + if subtile_idx == subtile_cnt - 1: + with cute.arch.elect_one(): + acc_pipeline.consumer_release(acc_consumer_state) + acc_consumer_state.advance() + + # + # Convert to C type + # + acc_vec = tTR_rAcc.load() + acc_vec = epilogue_op(acc_vec.to(gemm_kernel.c_dtype)) + tTR_rC.store(acc_vec) + + # + # Store C directly to global memory + # + cute.copy(simt_atom, tTR_rC, tTR_gC[(None, None, None, subtile_idx)]) + + # + # Set Per Output Tile Flag with Release + # + import cutlass.utils as utils + + # 1D linear index of current output tile + tile_id_linear = Int32( + tile_sched._current_work_linear_idx + * cute.size(gemm_kernel.cluster_shape_mn) + + cute.arch.block_idx_in_cluster() + ) + # Wait for C store complete + # Unlike regular epilogue where we only wait C store complete once at end of each kernel. + # Here we need to wait for C store complete for each output tile before we set the release flag. + c_pipeline.producer_tail() + # Update flag with release semantic with GPU scope + if warp_idx == gemm_kernel.epilogue_warp_id[0]: + with cute.arch.elect_one(): + flag_curr_tile = flag_base.iterator + tile_id_linear + utils.distributed.multimem_red_add1( + lock_ptr=flag_curr_tile, + order="release", + scope=flag_mem_scope, + ) + + # + # Advance to next tile + # + tile_sched.advance_to_next_work() + work_tile = tile_sched.get_current_work() + + # Synchronize before TMEM dealloc (done by the caller) + tmem_dealloc_barrier.arrive_and_wait() + diff --git a/python/CuTeDSL/cutlass/utils/gemm_helper.py b/python/CuTeDSL/cutlass/utils/gemm_helper.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python/CuTeDSL/cutlass/utils/grouped_gemm_persistent_tile_scheduler.py b/python/CuTeDSL/cutlass/utils/grouped_gemm_persistent_tile_scheduler.py new file mode 100644 index 00000000..227eafbe --- /dev/null +++ b/python/CuTeDSL/cutlass/utils/grouped_gemm_persistent_tile_scheduler.py @@ -0,0 +1,1035 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from typing import List, Tuple + +import cutlass.cute as cute +from cutlass.cutlass_dsl import ( + Boolean, + Int32, + Integer, + extract_mlir_values, + new_from_mlir_values, + const_expr, + dsl_user_op, + min, +) +from cutlass._mlir import ir +from typing_extensions import deprecated + +from cutlass.utils import ( + PersistentTileSchedulerParams, + StaticPersistentTileScheduler, + WorkTileInfo, +) + + +class GroupSearchResult: + """ + The result of the group search for grouped gemm. + + :param group_idx: The result group index + :type group_idx: Int32 + :param cta_tile_idx_m: CTA tile index along M dimension after rasterization + :type cta_tile_idx_m: Int32 + :param cta_tile_idx_n: CTA tile index along N dimension after rasterization + :type cta_tile_idx_n: Int32 + :param problem_shape_m: The M dimension of the gemm problem + :type problem_shape_m: Int32 + :param problem_shape_n: The N dimension of the gemm problem + :type problem_shape_n: Int32 + :param problem_shape_k: The K dimension of the gemm problem + :type problem_shape_k: Int32 + :param cta_tile_count_k: Number of tiles along K dimension + :type cta_tile_count_k: Int32 + """ + + def __init__( + self, + group_idx: Int32, + cta_tile_idx_m: Int32, + cta_tile_idx_n: Int32, + problem_shape_m: Int32, + problem_shape_n: Int32, + problem_shape_k: Int32, + cta_tile_count_k: Int32, + ) -> None: + self.group_idx = group_idx + self.cta_tile_idx_m = cta_tile_idx_m + self.cta_tile_idx_n = cta_tile_idx_n + self.problem_shape_m = problem_shape_m + self.problem_shape_n = problem_shape_n + self.problem_shape_k = problem_shape_k + self.cta_tile_count_k = cta_tile_count_k + + def __extract_mlir_values__(self) -> List[ir.Value]: + values = extract_mlir_values(self.group_idx) + values.extend(extract_mlir_values(self.cta_tile_idx_m)) + values.extend(extract_mlir_values(self.cta_tile_idx_n)) + values.extend(extract_mlir_values(self.problem_shape_m)) + values.extend(extract_mlir_values(self.problem_shape_n)) + values.extend(extract_mlir_values(self.problem_shape_k)) + values.extend(extract_mlir_values(self.cta_tile_count_k)) + return values + + def __new_from_mlir_values__(self, values: List[ir.Value]) -> "GroupSearchResult": + assert len(values) == 7 + return GroupSearchResult(*tuple(values)) + + +class GroupedGemmGroupSearchState: + """ + The state of group index search for grouped gemm. + + The state will be initialized once and updated in every round of group index search. + + :param start_group_idx: The group idx to start the search with + :type start_group_idx: Int32 + :param tile_count_prev_group: Number of tiles before the matched group + :type tile_count_prev_group: Int32 + :param tile_count_searched: Number of tiles we have searched. When the matched group is found, + it records the number of tiles including the matched group + :type tile_count_searched: Int32 + """ + + def __init__( + self, + start_group_idx: Int32, + tile_count_prev_group: Int32, + tile_count_searched: Int32, + found: Boolean, + ) -> None: + self.start_group_idx = start_group_idx + self.tile_count_prev_group = tile_count_prev_group + self.tile_count_searched = tile_count_searched + self.found = Boolean(found) + + def __extract_mlir_values__(self) -> List[ir.Value]: + values = extract_mlir_values(self.start_group_idx) + values.extend(extract_mlir_values(self.tile_count_prev_group)) + values.extend(extract_mlir_values(self.tile_count_searched)) + values.extend(extract_mlir_values(self.found)) + return values + + def __new_from_mlir_values__( + self, values: List[ir.Value] + ) -> "GroupedGemmGroupSearchState": + assert len(values) == 4 + start_group_idx = new_from_mlir_values(self.start_group_idx, [values[0]]) + tile_count_prev_group = new_from_mlir_values( + self.tile_count_prev_group, [values[1]] + ) + tile_count_searched = new_from_mlir_values( + self.tile_count_searched, [values[2]] + ) + found = new_from_mlir_values(self.found, [values[3]]) + return GroupedGemmGroupSearchState( + start_group_idx, tile_count_prev_group, tile_count_searched, found + ) + + +def create_initial_search_state() -> GroupedGemmGroupSearchState: + """ + Create an initial search state for grouped gemm. + + :return: A new search state with initial values + :rtype: GroupedGemmGroupSearchState + """ + return GroupedGemmGroupSearchState( + start_group_idx=Int32(0), + tile_count_prev_group=Int32(0), + tile_count_searched=Int32(0), + found=Boolean(False), + ) + + +# Grouped Work Tile Information +class GroupedWorkTileInfo(WorkTileInfo): + """A class to represent information about a work tile. + + :ivar tile_idx: The index of the tile. + :type tile_idx: cute.Coord + :ivar is_valid_tile: Whether the tile is valid. + :type is_valid_tile: Boolean + :ivar group_search_result: Group work tile information. + :type group_search_result: GroupSearchResult + """ + + def __init__( + self, + tile_idx: cute.Coord, + is_valid_tile: Boolean, + group_search_result: GroupSearchResult, + ): + super().__init__(tile_idx, is_valid_tile) + self.group_search_result = group_search_result + + def __extract_mlir_values__(self) -> list[ir.Value]: + values = extract_mlir_values(self.tile_idx) + values.extend(extract_mlir_values(self.is_valid_tile)) + values.extend(extract_mlir_values(self.group_search_result)) + return values + + def __new_from_mlir_values__(self, values: list[ir.Value]) -> "GroupedWorkTileInfo": + if len(values) != 11: + raise ValueError("Length of mlir values extracted is incorrect.") + new_tile_idx = new_from_mlir_values(self._tile_idx, values[:3]) + new_is_valid_tile = new_from_mlir_values(self._is_valid_tile, [values[3]]) + new_group_search_result = new_from_mlir_values( + self.group_search_result, values[4:11] + ) + return GroupedWorkTileInfo( + new_tile_idx, new_is_valid_tile, new_group_search_result + ) + + +# Static Persistent Grouped GEMM +class StaticPersistentGroupTileScheduler(StaticPersistentTileScheduler): + """A scheduler for static persistent group-based tile execution in CUTLASS/CuTe kernels. + + :ivar params: Tile schedule related params, including cluster shape and problem_layout_ncluster_mnl + :type params: PersistentTileSchedulerParams + :ivar num_persistent_clusters: Number of persistent clusters that can be launched + :type num_persistent_clusters: Int32 + :ivar _current_work_linear_idx: Current cluster index + :type _current_work_linear_idx: Int32 + :ivar cta_id_in_cluster: ID of the CTA within its cluster + :type cta_id_in_cluster: cute.Coord + :ivar _num_tiles_executed: Counter for executed tiles + :type _num_tiles_executed: Int32 + :ivar cluster_tile_shape_mnk: The shape of cluster tile as (m, n, k) + :type cluster_tile_shape_mnk: tuple[int, int, int] + :ivar search_state: The initial search state + :type search_state: GroupedGemmGroupSearchState + :ivar group_count: Number of groups in current grouped gemm problem + :type group_count: int + :ivar problem_shape_mnkl: Problem shape tensor for groups + :type problem_shape_mnkl: cute.Tensor + """ + + def __init__( + self, + params: PersistentTileSchedulerParams, + num_persistent_clusters: Int32, + current_work_linear_idx: Int32, + cta_id_in_cluster: cute.Coord, + num_tiles_executed: Int32, + cluster_tile_shape_mnk: tuple[int, int, int], + search_state: GroupedGemmGroupSearchState, + group_count: int, + problem_shape_mnkl: cute.Tensor, + ): + StaticPersistentTileScheduler.__init__( + self, + params, + num_persistent_clusters, + current_work_linear_idx, + cta_id_in_cluster, + num_tiles_executed, + ) + self.group_count = group_count + self.lane_idx = cute.arch.lane_idx() + self.cluster_tile_shape_mnk = cluster_tile_shape_mnk + self.search_state = search_state + self.problem_shape_mnkl = problem_shape_mnkl + + def __extract_mlir_values__(self) -> list[ir.Value]: + values = extract_mlir_values(self.num_persistent_clusters) + values.extend(extract_mlir_values(self._current_work_linear_idx)) + values.extend(extract_mlir_values(self.cta_id_in_cluster)) + values.extend(extract_mlir_values(self._num_tiles_executed)) + values.extend(extract_mlir_values(self.search_state)) + values.extend(extract_mlir_values(self.problem_shape_mnkl)) + values.extend(extract_mlir_values(self.params)) + return values + + def __new_from_mlir_values__( + self, values: list[ir.Value] + ) -> "StaticPersistentGroupTileScheduler": + if len(values) < 11: + raise ValueError("Length of mlir values extracted is incorrect.") + new_num_persistent_clusters = new_from_mlir_values( + self.num_persistent_clusters, [values[0]] + ) + new_current_work_linear_idx = new_from_mlir_values( + self._current_work_linear_idx, [values[1]] + ) + new_cta_id_in_cluster = new_from_mlir_values( + self.cta_id_in_cluster, values[2:5] + ) + new_num_tiles_executed = new_from_mlir_values( + self._num_tiles_executed, [values[5]] + ) + search_state = new_from_mlir_values(self.search_state, values[6:10]) + problem_shape_mnkl = new_from_mlir_values(self.problem_shape_mnkl, [values[10]]) + params = new_from_mlir_values(self.params, values[11:]) + + return StaticPersistentGroupTileScheduler( + params, + new_num_persistent_clusters, + new_current_work_linear_idx, + new_cta_id_in_cluster, + new_num_tiles_executed, + self.cluster_tile_shape_mnk, + search_state, + self.group_count, + problem_shape_mnkl, + ) + + @staticmethod + @dsl_user_op + def create( + params: PersistentTileSchedulerParams, + block_idx: Tuple[Integer, Integer, Integer], + grid_dim: Tuple[Integer, Integer, Integer], + cluster_tile_shape_mnk: tuple[int, int, int], + initial_search_state: GroupedGemmGroupSearchState, + group_count: int, + problem_shape_mnkl: cute.Tensor, + *, + loc=None, + ip=None, + ): + """Initialize the static persistent group-based tile scheduler. + + :param params: Parameters for the persistent + tile scheduler. + :type params: PersistentTileSchedulerParams + :param block_idx: The 3d block index in the format (bidx, bidy, bidz). + :type block_idx: Tuple[Integer, Integer, Integer] + :param grid_dim: The 3d grid dimensions for kernel launch. + :type grid_dim: Tuple[Integer, Integer, Integer] + :param cluster_tile_shape_mnk: The shape of cluster tile as (m, n, k) + :type cluster_tile_shape_mnk: tuple[int, int, int] + :param initial_search_state: The initial search state + :type initial_search_state: GroupedGemmGroupSearchState + :param group_count: Number of groups in current grouped gemm problem + :type group_count: int + :param problem_shape_mnkl: Problem shape tensor for groups + :type problem_shape_mnkl: cute.Tensor + + :return: A StaticPersistentGroupTileScheduler object. + :rtype: StaticPersistentGroupTileScheduler + """ + + # Calculate the number of persistent clusters by dividing the total grid size + # by the number of CTAs per cluster + num_persistent_clusters = cute.size(grid_dim, loc=loc, ip=ip) // cute.size( + params.cluster_shape_mn, loc=loc, ip=ip + ) + + bidx, bidy, bidz = block_idx + + # Initialize workload index equals to the cluster index in the grid + current_work_linear_idx = Int32(bidz) + + # CTA id in the cluster + cta_id_in_cluster = ( + Int32(bidx % params.cluster_shape_mn[0]), + Int32(bidy % params.cluster_shape_mn[1]), + Int32(0), + ) + + # Initialize number of tiles executed to zero + num_tiles_executed = Int32(0) + return StaticPersistentGroupTileScheduler( + params, + num_persistent_clusters, + current_work_linear_idx, + cta_id_in_cluster, + num_tiles_executed, + cluster_tile_shape_mnk, + initial_search_state, + group_count, + problem_shape_mnkl, + ) + + @dsl_user_op + @cute.jit + def _prefix_sum(self, value_per_thread: Int32, *, loc=None, ip=None) -> Int32: + """ + Perform prefix sum within a full warp. + + :param value_per_thread: The value for this thread to contribute to the prefix sum + :type value_per_thread: Int32 + :return: The prefix sum result for this thread + :rtype: Int32 + """ + clamp_value = 0 + idx = 1 + sum_per_thread = value_per_thread + while const_expr(idx < cute.arch.WARP_SIZE): + value = cute.arch.shuffle_sync_up( + sum_per_thread, idx, mask_and_clamp=clamp_value, loc=loc, ip=ip + ) + if self.lane_idx >= idx: + sum_per_thread += value + idx = idx << 1 + return sum_per_thread + + @dsl_user_op + def _get_problem_for_group( + self, problem_shape_mnkl: cute.Tensor, group_idx: Int32, *, loc=None, ip=None + ) -> cute.Tensor: + """ + Load gemm problem (m,n,k,l) for the specified group from global memory to register. + + :param problem_shape_mnkl: Tensor in global memory with layout (group_count, 4):(4, 1) + :type problem_shape_mnkl: cute.Tensor + :param group_idx: The index of the group to load + :type group_idx: Int32 + :return: The problem shape tensor for the specified group + :rtype: cute.Tensor + """ + cur_problem_mnkl = cute.make_rmem_tensor( + cute.make_layout(4), problem_shape_mnkl.element_type, loc=loc, ip=ip + ) + cute.autovec_copy( + problem_shape_mnkl[(group_idx, None)], cur_problem_mnkl, loc=loc, ip=ip + ) + return cur_problem_mnkl + + @dsl_user_op + def _get_cluster_tile_count_mn( + self, problem_shape: cute.Tensor, *, loc=None, ip=None + ) -> Int32: + """ + Compute total cluster count. + + :param problem_shape: Tensor containing problem shape (m, n, k, l) + :type problem_shape: cute.Tensor + :return: The total cluster tile count for M and N dimensions + :rtype: Int32 + """ + cur_ntile_m = ( + problem_shape[0] + self.cluster_tile_shape_mnk[0] - 1 + ) // self.cluster_tile_shape_mnk[0] + cur_ntile_n = ( + problem_shape[1] + self.cluster_tile_shape_mnk[1] - 1 + ) // self.cluster_tile_shape_mnk[1] + cur_ntile_mn = cur_ntile_m * cur_ntile_n + return cur_ntile_mn + + @dsl_user_op + def _compute_cta_tile_coord( + self, + cluster_tile_idx: Int32, + cta_tile_coord_in_cluster: tuple, + cluster_tile_count_m: Int32, + cluster_tile_count_n: Int32, + *, + loc=None, + ip=None, + ) -> tuple: + """ + Compute CTA tile indices along M and N dimensions based on the linear index within a group. + + It uses the AlongM mode to decompose the linear index onto M and N dimensions. + + :param cluster_tile_idx: The linear index within a group + :type cluster_tile_idx: Int32 + :param cta_tile_coord_in_cluster: CTA indices along M and N dimensions within a cluster + :type cta_tile_coord_in_cluster: tuple of Int32 + :param cluster_tile_count_m: The number of clusters along M dimension of the matched group + :type cluster_tile_count_m: Int32 + :param cluster_tile_count_n: The number of clusters along N dimension of the matched group + :type cluster_tile_count_n: Int32 + :return: A tuple containing CTA tile indices along M and N dimensions + :rtype: tuple of (Int32, Int32) + """ + cluster_layout_mn = cute.make_layout( + (cluster_tile_count_m, cluster_tile_count_n), loc=loc, ip=ip + ) + (mi, ni) = cluster_layout_mn.get_hier_coord(cluster_tile_idx) + cta_tile_idx_m = ( + mi * self.params.cluster_shape_mn[0] + cta_tile_coord_in_cluster[0] + ) + cta_tile_idx_n = ( + ni * self.params.cluster_shape_mn[1] + cta_tile_coord_in_cluster[1] + ) + return (cta_tile_idx_m, cta_tile_idx_n) + + @dsl_user_op + @cute.jit + def _group_search( + self, + linear_idx: Int32, + problem_shape_mnkl: cute.Tensor, + init_group_idx: Int32, + init_tile_count_searched: Int32, + *, + loc=None, + ip=None, + ) -> GroupedGemmGroupSearchState: + """ + Search which group the linear index belongs to. + + :param linear_idx: The linear index to be decomposed + :type linear_idx: Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for all groups + :type problem_shape_mnkl: cute.Tensor + :param init_group_idx: The group idx to start the search with + :type init_group_idx: Int32 + :param init_tile_count_searched: The number of tiles we have searched + :type init_tile_count_searched: Int32 + :return: The updated search state + :rtype: GroupedGemmGroupSearchState + """ + c_0 = Int32(0).ir_value() + last_lane_idx = cute.arch.WARP_SIZE - 1 + + tile_count_searched = init_tile_count_searched + start_group_idx = init_group_idx + not_found = linear_idx >= tile_count_searched + start_not_found = not_found + tile_count_prev_group = self.search_state.tile_count_prev_group + + while not_found and start_group_idx < self.group_count: + # get group to search for current lane + cur_group_idx = start_group_idx + self.lane_idx + # check if the group to be checked is out of range + inside_group_bound = cur_group_idx < self.group_count + + cur_ntile_mn = c_0 + if inside_group_bound: + # get problem size of current group + cur_problem_mnkl = self._get_problem_for_group( + problem_shape_mnkl, cur_group_idx, loc=loc, ip=ip + ) + cur_ntile_mn = self._get_cluster_tile_count_mn( + cur_problem_mnkl, loc=loc, ip=ip + ) + + # compute tile count from beginning to current group(included) + total_cluster_tile_count_ps_per_thread = self._prefix_sum( + cur_ntile_mn, loc=loc, ip=ip + ) + cluster_tile_count_end_per_thread = ( + total_cluster_tile_count_ps_per_thread + tile_count_searched + ) + + group_not_in_window = linear_idx >= cluster_tile_count_end_per_thread + hitted_group_idx_in_search_window = cute.arch.popc( + cute.arch.vote_ballot_sync(group_not_in_window, loc=loc, ip=ip), + loc=loc, + ip=ip, + ) + not_found = hitted_group_idx_in_search_window == cute.arch.WARP_SIZE + start_group_idx = hitted_group_idx_in_search_window + start_group_idx + + hit_the_1st_problem_in_search_window = ( + hitted_group_idx_in_search_window == c_0 + ) + tile_count_prev_group = tile_count_searched + if hit_the_1st_problem_in_search_window == False: + tile_count_prev_group = cute.arch.shuffle_sync( + cluster_tile_count_end_per_thread, + hitted_group_idx_in_search_window - 1, + ) + + # If no matched group, then get new_cluster_tile_count_end from last lane + # Otherwise, get new_cluster_tile_count_end from the hitted group + lane_idx_for_cluster_tile_count_end = hitted_group_idx_in_search_window + if not_found: + lane_idx_for_cluster_tile_count_end = last_lane_idx + tile_count_searched = cute.arch.shuffle_sync( + cluster_tile_count_end_per_thread, + lane_idx_for_cluster_tile_count_end, + ) + + # The tile is invalid if not_found doesn't change before and after the while loop. + end_not_found = not_found + is_valid = start_not_found != end_not_found + + return GroupedGemmGroupSearchState( + start_group_idx, + tile_count_prev_group, + tile_count_searched, + is_valid, + ) + + @dsl_user_op + @cute.jit + def _group_search_and_load_problem_shape( + self, + linear_idx: Int32, + problem_shape_mnkl: cute.Tensor, + start_group_idx: Int32, + tile_count_searched: Int32, + *, + loc=None, + ip=None, + ) -> Tuple[Int32, cute.Tensor]: + """ + Perform group search and load problem shape for the matched group. + + :param linear_idx: The linear index to be decomposed + :type linear_idx: Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for all groups + :type problem_shape_mnkl: cute.Tensor + :param start_group_idx: The group idx to start the search with + :type start_group_idx: Int32 + :param tile_count_searched: The number of tiles we have searched + :type tile_count_searched: Int32 + :return: A tuple containing the final group index and the problem shape tensor + :rtype: Tuple[Int32, cute.Tensor] + """ + self.search_state = self._group_search( + linear_idx, + problem_shape_mnkl, + start_group_idx, + tile_count_searched, + loc=loc, + ip=ip, + ) + # get final group search state + found = self.search_state.found + + final_group_idx = -1 + problem_mnkl = cute.make_rmem_tensor( + cute.make_layout(4), problem_shape_mnkl.element_type, loc=loc, ip=ip + ) + if found: + final_group_idx = self.search_state.start_group_idx + # let's revisit if it's better to broadcast problem_shape_mnk in group_search + problem_mnkl = self._get_problem_for_group( + problem_shape_mnkl, final_group_idx, loc=loc, ip=ip + ) + return found, final_group_idx, problem_mnkl + + @dsl_user_op + def delinearize_z( + self, + cta_tile_coord: tuple, + *, + loc=None, + ip=None, + ) -> GroupSearchResult: + """ + Delinearize the linear z index and return GroupSearchResult. + + This function should be used by warps that need to know the CTA tile index on M and N dimensions. + + :param cta_tile_coord: The raw CTA coordinate from tile scheduler + :type cta_tile_coord: tuple of Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for each group + :type problem_shape_mnkl: cute.Tensor + :return: The search result containing group index and tile coordinates + :rtype: GroupSearchResult + """ + # delinear the z coord + + linear_idx = self._current_work_linear_idx + + found, group_idx, problem_mnkl = self._group_search_and_load_problem_shape( + linear_idx, + self.problem_shape_mnkl, + self.search_state.start_group_idx, + self.search_state.tile_count_prev_group, + loc=loc, + ip=ip, + ) + + # The work_tile is valid if its linear index could be mapped to a group in the problem shapes + is_valid = found + + # linear index local to current group + cluster_tile_idx_in_current_group = ( + linear_idx - self.search_state.tile_count_prev_group + ) + + cluster_count_m, cluster_count_n, cluster_count_k = cute.ceil_div( + (problem_mnkl[0], problem_mnkl[1], problem_mnkl[2]), + ( + self.cluster_tile_shape_mnk[0], + self.cluster_tile_shape_mnk[1], + self.cluster_tile_shape_mnk[2], + ), + loc=loc, + ip=ip, + ) + + # decompose to get indices on M and N + cta_tile_idx_m, cta_tile_idx_n = self._compute_cta_tile_coord( + cluster_tile_idx_in_current_group, + cta_tile_coord, + cluster_count_m, + cluster_count_n, + loc=loc, + ip=ip, + ) + + group_search_result = GroupSearchResult( + group_idx, + cta_tile_idx_m, + cta_tile_idx_n, + problem_mnkl[0], + problem_mnkl[1], + problem_mnkl[2], + cluster_count_k, + ) + + return GroupedWorkTileInfo(cta_tile_coord, is_valid, group_search_result) + + @dsl_user_op + def get_current_work(self, *, loc=None, ip=None) -> WorkTileInfo: + work_tile = self._get_current_work_for_linear_idx( + self._current_work_linear_idx, loc=loc, ip=ip + ) + grouped_work_tile = self.delinearize_z(work_tile.tile_idx, loc=loc, ip=ip) + return grouped_work_tile + +@deprecated("API is deprecated, use cutlass.utils.StaticPersistentGroupTileScheduler instead") +class GroupedGemmTileSchedulerHelper: + """ + A helper to translate the raw block index (x, y, z) from tile scheduler to real CTA tile index for grouped gemm. + + :param group_count: Number of groups in current grouped gemm problem + :type group_count: int + :param tile_sched_params: Parameter used to create the tile scheduler this helper works with + :type tile_sched_params: PersistentTileSchedulerParams + :param cluster_tile_shape_mnk: The shape of cluster tile as (m, n, k) + :type cluster_tile_shape_mnk: tuple[int, int, int] + :param search_state: The initial search state + :type search_state: GroupedGemmGroupSearchState + """ + + def __init__( + self, + group_count: int, + tile_sched_params: PersistentTileSchedulerParams, + cluster_tile_shape_mnk: tuple[int, int, int], + search_state: GroupedGemmGroupSearchState, + ) -> None: + self.tile_sched_params = tile_sched_params + self.group_count = group_count + self.lane_idx = cute.arch.lane_idx() + self.cluster_tile_shape_mnk = cluster_tile_shape_mnk + self.search_state = search_state + + def __extract_mlir_values__(self) -> List[ir.Value]: + values = extract_mlir_values(self.tile_sched_params) + values.extend(extract_mlir_values(self.search_state)) + return values + + def __new_from_mlir_values__( + self, values: List[ir.Value] + ) -> "GroupedGemmTileSchedulerHelper": + # Reconstruct tile_sched_params and determine how many values it consumed. + # NOTE: tile_sched_params may contain FastDivmod divisors (when swizzle_size == 1), + # which adds extra MLIR values. + params_values = extract_mlir_values(self.tile_sched_params) + n_params_values = len(params_values) + tile_sched_params = new_from_mlir_values( + self.tile_sched_params, values[:n_params_values] + ) + + # Reconstruct search_state from remaining values + search_state = new_from_mlir_values(self.search_state, values[n_params_values:]) + + return GroupedGemmTileSchedulerHelper( + self.group_count, + tile_sched_params, + self.cluster_tile_shape_mnk, + search_state, + ) + + def delinearize_z( + self, + cta_tile_coord: tuple, + problem_shape_mnkl: cute.Tensor, + ) -> GroupSearchResult: + """ + Delinearize the linear z index and return GroupSearchResult. + + This function should be used by warps that need to know the CTA tile index on M and N dimensions. + + :param cta_tile_coord: The raw CTA coordinate from tile scheduler + :type cta_tile_coord: tuple of Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for each group + :type problem_shape_mnkl: cute.Tensor + :return: The search result containing group index and tile coordinates + :rtype: GroupSearchResult + """ + # delinear the z coord + linear_idx = cta_tile_coord[2] + group_idx, problem_mnkl = self._group_search_and_load_problem_shape( + linear_idx, + problem_shape_mnkl, + self.search_state.start_group_idx, + self.search_state.tile_count_prev_group, + ) + # linear index local to current group + cluster_tile_idx_in_current_group = ( + linear_idx - self.search_state.tile_count_prev_group + ) + cluster_count_m, cluster_count_n, cluster_count_k = cute.ceil_div( + (problem_mnkl[0], problem_mnkl[1], problem_mnkl[2]), + ( + self.cluster_tile_shape_mnk[0], + self.cluster_tile_shape_mnk[1], + self.cluster_tile_shape_mnk[2], + ), + ) + # decompose to get indices on M and N + cta_tile_idx_m, cta_tile_idx_n = self._compute_cta_tile_coord( + cluster_tile_idx_in_current_group, + cta_tile_coord, + cluster_count_m, + cluster_count_n, + ) + return GroupSearchResult( + group_idx, + cta_tile_idx_m, + cta_tile_idx_n, + problem_mnkl[0], + problem_mnkl[1], + problem_mnkl[2], + cluster_count_k, + ) + + def search_cluster_tile_count_k( + self, + cta_tile_coord: tuple, + problem_shape_mnkl: cute.Tensor, + ) -> Tuple[Int32, Int32]: + """ + Search the matched group for given linear index and compute the number of tiles along K dimension for the matched group. + + This function should be used by warps that are only interested in the number of tiles along K dimension. + + :param cta_tile_coord: The raw CTA coordinate from tile scheduler + :type cta_tile_coord: tuple of Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for all groups + :type problem_shape_mnkl: cute.Tensor + :return: A tuple containing cluster count along K dimension and the group index + :rtype: Tuple[Int32, Int32] + """ + group_idx, problem_mnk = self._group_search_and_load_problem_shape( + cta_tile_coord[2], + problem_shape_mnkl, + self.search_state.start_group_idx, + self.search_state.tile_count_prev_group, + ) + cluster_count_k = ( + problem_mnk[2] + self.cluster_tile_shape_mnk[2] - 1 + ) // self.cluster_tile_shape_mnk[2] + return cluster_count_k, group_idx + + @cute.jit + def _prefix_sum(self, value_per_thread: Int32) -> Int32: + """ + Perform prefix sum within a full warp. + + :param value_per_thread: The value for this thread to contribute to the prefix sum + :type value_per_thread: Int32 + :return: The prefix sum result for this thread + :rtype: Int32 + """ + clamp_value = 0 + idx = 1 + sum_per_thread = value_per_thread + while const_expr(idx < cute.arch.WARP_SIZE): + value = cute.arch.shuffle_sync_up( + sum_per_thread, idx, mask_and_clamp=clamp_value + ) + if self.lane_idx >= idx: + sum_per_thread += value + idx = idx << 1 + return sum_per_thread + + def _get_problem_for_group( + self, problem_shape_mnkl: cute.Tensor, group_idx: Int32 + ) -> cute.Tensor: + """ + Load gemm problem (m,n,k,l) for the specified group from global memory to register. + + :param problem_shape_mnkl: Tensor in global memory with layout (group_count, 4):(4, 1) + :type problem_shape_mnkl: cute.Tensor + :param group_idx: The index of the group to load + :type group_idx: Int32 + :return: The problem shape tensor for the specified group + :rtype: cute.Tensor + """ + cur_problem_mnkl = cute.make_rmem_tensor( + cute.make_layout(4), problem_shape_mnkl.element_type + ) + cute.autovec_copy(problem_shape_mnkl[(group_idx, None)], cur_problem_mnkl) + return cur_problem_mnkl + + def _get_cluster_tile_count_mn(self, problem_shape: cute.Tensor) -> Int32: + """ + Compute total cluster count. + + :param problem_shape: Tensor containing problem shape (m, n, k, l) + :type problem_shape: cute.Tensor + :return: The total cluster tile count for M and N dimensions + :rtype: Int32 + """ + cur_ntile_m = ( + problem_shape[0] + self.cluster_tile_shape_mnk[0] - 1 + ) // self.cluster_tile_shape_mnk[0] + cur_ntile_n = ( + problem_shape[1] + self.cluster_tile_shape_mnk[1] - 1 + ) // self.cluster_tile_shape_mnk[1] + cur_ntile_mn = cur_ntile_m * cur_ntile_n + return cur_ntile_mn + + def _compute_cta_tile_coord( + self, + cluster_tile_idx: Int32, + cta_tile_coord_in_cluster: tuple, + cluster_tile_count_m: Int32, + cluster_tile_count_n: Int32, + ) -> tuple: + """ + Compute CTA tile indices along M and N dimensions based on the linear index within a group. + + It uses the AlongM mode to decompose the linear index onto M and N dimensions. + + :param cluster_tile_idx: The linear index within a group + :type cluster_tile_idx: Int32 + :param cta_tile_coord_in_cluster: CTA indices along M and N dimensions within a cluster + :type cta_tile_coord_in_cluster: tuple of Int32 + :param cluster_tile_count_m: The number of clusters along M dimension of the matched group + :type cluster_tile_count_m: Int32 + :param cluster_tile_count_n: The number of clusters along N dimension of the matched group + :type cluster_tile_count_n: Int32 + :return: A tuple containing CTA tile indices along M and N dimensions + :rtype: tuple of (Int32, Int32) + """ + cluster_layout_mn = cute.make_layout( + (cluster_tile_count_m, cluster_tile_count_n) + ) + (mi, ni) = cluster_layout_mn.get_hier_coord(cluster_tile_idx) + cta_tile_idx_m = ( + mi * self.tile_sched_params.cluster_shape_mn[0] + + cta_tile_coord_in_cluster[0] + ) + cta_tile_idx_n = ( + ni * self.tile_sched_params.cluster_shape_mn[1] + + cta_tile_coord_in_cluster[1] + ) + return (cta_tile_idx_m, cta_tile_idx_n) + + @cute.jit + def _group_search( + self, + linear_idx: Int32, + problem_shape_mnkl: cute.Tensor, + init_group_idx: Int32, + init_tile_count_searched: Int32, + ) -> GroupedGemmGroupSearchState: + """ + Search which group the linear index belongs to. + + :param linear_idx: The linear index to be decomposed + :type linear_idx: Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for all groups + :type problem_shape_mnkl: cute.Tensor + :param init_group_idx: The group idx to start the search with + :type init_group_idx: Int32 + :param init_tile_count_searched: The number of tiles we have searched + :type init_tile_count_searched: Int32 + :return: The updated search state + :rtype: GroupedGemmGroupSearchState + """ + c_0 = Int32(0).ir_value() + last_lane_idx = cute.arch.WARP_SIZE - 1 + + tile_count_searched = init_tile_count_searched + start_group_idx = init_group_idx + not_found = linear_idx >= tile_count_searched + tile_count_prev_group = self.search_state.tile_count_prev_group + while not_found: + # get group to search for current lane + cur_group_idx = start_group_idx + self.lane_idx + # check if the group to be checked is out of range + inside_group_bound = cur_group_idx < self.group_count + cur_ntile_mn = c_0 + if inside_group_bound: + # get problem size of current group + cur_problem_mnkl = self._get_problem_for_group( + problem_shape_mnkl, cur_group_idx + ) + cur_ntile_mn = self._get_cluster_tile_count_mn(cur_problem_mnkl) + # compute tile count from beginning to current group(included) + total_cluster_tile_count_ps_per_thread = self._prefix_sum(cur_ntile_mn) + cluster_tile_count_end_per_thread = ( + total_cluster_tile_count_ps_per_thread + tile_count_searched + ) + + group_not_in_window = linear_idx >= cluster_tile_count_end_per_thread + hitted_group_idx_in_search_window = cute.arch.popc( + cute.arch.vote_ballot_sync(group_not_in_window) + ) + not_found = hitted_group_idx_in_search_window == cute.arch.WARP_SIZE + start_group_idx = hitted_group_idx_in_search_window + start_group_idx + hit_the_1st_problem_in_search_window = ( + hitted_group_idx_in_search_window == c_0 + ) + tile_count_prev_group = tile_count_searched + if hit_the_1st_problem_in_search_window == False: + tile_count_prev_group = cute.arch.shuffle_sync( + cluster_tile_count_end_per_thread, + hitted_group_idx_in_search_window - 1, + ) + + # If no matched group, then get new_cluster_tile_count_end from last lane + # Otherwise, get new_cluster_tile_count_end from the hitted group + lane_idx_for_cluster_tile_count_end = hitted_group_idx_in_search_window + if not_found: + lane_idx_for_cluster_tile_count_end = last_lane_idx + tile_count_searched = cute.arch.shuffle_sync( + cluster_tile_count_end_per_thread, + lane_idx_for_cluster_tile_count_end, + ) + + return GroupedGemmGroupSearchState( + start_group_idx, + tile_count_prev_group, + tile_count_searched, + 1 # found will always be 1 for old api + ) + + def _group_search_and_load_problem_shape( + self, + linear_idx: Int32, + problem_shape_mnkl: cute.Tensor, + start_group_idx: Int32, + tile_count_searched: Int32, + ) -> Tuple[Int32, cute.Tensor]: + """ + Perform group search and load problem shape for the matched group. + + :param linear_idx: The linear index to be decomposed + :type linear_idx: Int32 + :param problem_shape_mnkl: Tensor containing gemm problem size (M, N, K, L) for all groups + :type problem_shape_mnkl: cute.Tensor + :param start_group_idx: The group idx to start the search with + :type start_group_idx: Int32 + :param tile_count_searched: The number of tiles we have searched + :type tile_count_searched: Int32 + :return: A tuple containing the final group index and the problem shape tensor + :rtype: Tuple[Int32, cute.Tensor] + """ + self.search_state = self._group_search( + linear_idx, + problem_shape_mnkl, + start_group_idx, + tile_count_searched, + ) + # get final group search state + final_group_idx = self.search_state.start_group_idx + # let's revisit if it's better to broadcast problem_shape_mnk in group_search + problem_mnkl = self._get_problem_for_group(problem_shape_mnkl, final_group_idx) + return final_group_idx, problem_mnkl + diff --git a/python/CuTeDSL/cutlass/utils/mixed_input_helpers.py b/python/CuTeDSL/cutlass/utils/mixed_input_helpers.py index 0468f5d9..41ab59bd 100644 --- a/python/CuTeDSL/cutlass/utils/mixed_input_helpers.py +++ b/python/CuTeDSL/cutlass/utils/mixed_input_helpers.py @@ -1,30 +1,13 @@ -# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: - -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. - -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. - -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. from __future__ import annotations @@ -34,12 +17,16 @@ from typing import Optional, Union import cutlass import cutlass.cute as cute +from cutlass.cutlass_dsl import ( + extract_mlir_values, + new_from_mlir_values, +) +from cutlass.utils.layout import LayoutEnum import cutlass.utils.blackwell_helpers as sm100_utils from cutlass.cute.nvgpu import cpasync, tcgen05 -from cutlass.cute.runtime import from_dlpack """ -This file contain common utilities for mixed-input GEMM. +This file contains common utilities for mixed-input GEMM. """ @@ -61,7 +48,7 @@ def scale_tma_partition( ) -> tuple[cute.Tensor, cute.Tensor]: """ Perform TMA partition for scale tensor. - This method partitions the gobal memory and shared memory buffer for scale tensor for TMA load. + This method partitions the global memory and shared memory buffer for the scale tensor for TMA load. :param tCsS: Input scale shared memory tensor :type tCsS: cute.Tensor :param tCgS: Input scale global memory tensor @@ -120,7 +107,9 @@ def transform_partition( sA_input: cute.Tensor, A_transform: cute.Tensor, transform_local_tidx: cutlass.Int32, -) -> tuple[cute.TiledCopy, cute.TiledCopy, cute.Tensor, cute.Tensor]: +) -> tuple[ + Optional[cute.TiledCopy], Optional[cute.TiledCopy], cute.Tensor, cute.Tensor +]: """ Partition tensors for transform input and output. This method sets up the copy atoms and partitions the shared/tensor memory @@ -146,7 +135,7 @@ def transform_partition( * tAsA_input: Partitioned input tensor A * tA_transform: Partitioned transformed tensor A - :rtype: tuple[cute.TiledCopy, cute.TiledCopy, cute.Tensor, cute.Tensor] + :rtype: tuple[Optional[cute.TiledCopy], Optional[cute.TiledCopy], cute.Tensor, cute.Tensor] """ if cutlass.const_expr(transform_a_source == tcgen05.OperandSource.TMEM): if cutlass.const_expr( @@ -244,6 +233,185 @@ def scale_partition( return smem_thr_copy_S, tSsS_trans, tSrS_copy, tSrS +def epilog_gmem_copy_and_partition( + c_dtype: type[cutlass.Numeric], + tidx: cutlass.Int32, + tma_atom_c: Optional[cute.CopyAtom], + tiled_copy_t2r: Optional[cute.TiledCopy], + gC_mnl_tma: Optional[cute.Tensor], + gC_mnl_simt: Optional[cute.Tensor], + epi_tile: cute.Tile, + sC: cute.Tensor, +) -> tuple[ + Optional[cute.CopyAtom], + Optional[cute.Tensor], + Optional[cute.Tensor], + Optional[cute.CopyAtom], + Optional[cute.Tensor], +]: + """ + Partitions source and destination tensors for a global memory store. + This method generates a tiled copy for storing results to global memory + and partitions the source (register or shared memory) and destination + (global memory) tensors accordingly. If tma_atom_c is not None, then + partition for TMA store will be performed. If tiled_copy_t2r is not None, then + partition for SIMT store will be performed. + :param c_dtype: The data type of the tensor C. + :type c_dtype: type[cutlass.Numeric] + :param tidx: The thread index in epilogue warp groups. + :type tidx: cutlass.Int32 + :param tma_atom_c: The TMA copy atom. + :type tma_atom_c: Optional[cute.CopyAtom] + :param tiled_copy_t2r: The tiled copy operation for tmem to register copy. + :type tiled_copy_t2r: Optional[cute.TiledCopy] + :param gC_mnl_tma: The global tensor C for TMA. + :type gC_mnl_tma: Optional[cute.Tensor] + :param gC_mnl_simt: The global tensor C for SIMT Copy. + :type gC_mnl_simt: Optional[cute.Tensor] + :param epi_tile: The epilogue tiler. + :type epi_tile: cute.Tile + :param sC: The shared memory tensor C. + :return: A tuple containing the appropriate copy atom and partitioned + source and destination tensors for the store operation. + :rtype: tuple[Optional[cute.CopyAtom], Optional[cute.Tensor], Optional[cute.Tensor], Optional[cute.CopyAtom], Optional[cute.Tensor]] + """ + bSG_sC = None + bSG_gC = None + simt_atom = None + tTR_gC = None + if tma_atom_c is not None: + gC_epi_tma = cute.flat_divide( + gC_mnl_tma[((None, None), 0, 0, None, None, None)], epi_tile + ) + # TMA store + sC_for_tma_partition = cute.group_modes(sC, 0, 2) + gC_for_tma_partition = cute.group_modes(gC_epi_tma, 0, 2) + # ((ATOM_V, REST_V), EPI_M, EPI_N) + # ((ATOM_V, REST_V), EPI_M, EPI_N, RestM, RestN, RestL) + bSG_sC, bSG_gC = cpasync.tma_partition( + tma_atom_c, + 0, + cute.make_layout(1), + sC_for_tma_partition, + gC_for_tma_partition, + ) + if tiled_copy_t2r is not None: + # SIMT Store + gC_epi_simt = cute.flat_divide( + gC_mnl_simt[((None, None), 0, 0, None, None, None)], epi_tile + ) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N, RestM, RestN, RestL) + thr_copy_t2r = tiled_copy_t2r.get_slice(tidx) + tTR_gC = thr_copy_t2r.partition_D(gC_epi_simt) + simt_atom = cute.make_copy_atom(cute.nvgpu.CopyUniversalOp(), c_dtype) + return tma_atom_c, bSG_sC, bSG_gC, simt_atom, tTR_gC + + +def epilog_smem_copy_and_partition( + c_layout: LayoutEnum, + c_dtype: type[cutlass.Numeric], + acc_dtype: type[cutlass.Numeric], + tiled_copy_t2r: cute.TiledCopy, + tTR_rC: cute.Tensor, + tidx: cutlass.Int32, + sC: cute.Tensor, +) -> tuple[cute.TiledCopy, cute.Tensor, cute.Tensor]: + """ + Partitions source and destination tensors for a shared memory store. + This method generates a tiled copy for storing results to shared memory + and partitions the source (register) and destination (shared memory) + tensors accordingly. + :param c_layout: The layout of the tensor C. + :type c_layout: LayoutEnum + :param c_dtype: The data type of the tensor C. + :type c_dtype: type[cutlass.Numeric] + :param acc_dtype: The data type of the accumulator tensor. + :type acc_dtype: type[cutlass.Numeric] + :param tiled_copy_t2r: The tiled copy operation for tmem to register copy. + :param tTR_rC: The partitioned accumulator tensor. + :param tidx: The thread index in epilogue warp groups. + :param sC: The shared memory tensor to be copied and partitioned. + :return: A tuple containing the tiled copy for the store operation and + the partitioned source and destination tensors. + """ + copy_atom_r2s = sm100_utils.get_smem_store_op( + c_layout, c_dtype, acc_dtype, tiled_copy_t2r + ) + tiled_copy_r2s = cute.make_tiled_copy_D(copy_atom_r2s, tiled_copy_t2r) + # (R2S, R2S_M, R2S_N, PIPE_D) + thr_copy_r2s = tiled_copy_r2s.get_slice(tidx) + tRS_sC = thr_copy_r2s.partition_D(sC) + # (R2S, R2S_M, R2S_N) + tRS_rC = tiled_copy_r2s.retile(tTR_rC) + return tiled_copy_r2s, tRS_rC, tRS_sC + + +def epilog_tmem_copy_and_partition( + cta_tile_shape_mnk: tuple[int, int, int], + c_layout: LayoutEnum, + c_dtype: type[cutlass.Numeric], + acc_dtype: type[cutlass.Numeric], + tidx: cutlass.Int32, + tAcc: cute.Tensor, + gC_mnl: cute.Tensor, + epi_tile: cute.Tile, + use_2cta_instrs: Union[cutlass.Boolean, bool], +) -> tuple[cute.TiledCopy, cute.Tensor, cute.Tensor]: + """ + Partitions source and destination tensors for a tensor memory load. + This method generates a tiled copy for loading accumulators from tensor + memory and partitions the source (tensor memory) and destination + (register) tensors accordingly. + :param cta_tile_shape_mnk: The shape of the CTA tile (M, N, K). + :type cta_tile_shape_mnk: tuple[int, int, int] + :param c_layout: The layout of the tensor C. + :type c_layout: LayoutEnum + :param c_dtype: The data type of the tensor C. + :type c_dtype: type[cutlass.Numeric] + :param acc_dtype: The data type of the accumulator tensor. + :type acc_dtype: type[cutlass.Numeric] + :param tidx: The thread index in epilogue warp groups. + :param tAcc: The accumulator tensor to be copied and partitioned. + :param gC_mnl: The global tensor C. + :param epi_tile: The epilogue tiler. + :param use_2cta_instrs: Whether use_2cta_instrs is enabled. + :return: A tuple containing the tiled copy for the load operation and + the partitioned source and destination tensors. + """ + # Make tiledCopy for tensor memory load + copy_atom_t2r = sm100_utils.get_tmem_load_op( + cta_tile_shape_mnk, + c_layout, + c_dtype, + acc_dtype, + epi_tile, + use_2cta_instrs, + ) + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, STAGE) + tAcc_epi = cute.flat_divide( + tAcc[((None, None), 0, 0, None)], + epi_tile, + ) + # (EPI_TILE_M, EPI_TILE_N) + tiled_copy_t2r = tcgen05.make_tmem_copy( + copy_atom_t2r, tAcc_epi[(None, None, 0, 0, 0)] + ) + thr_copy_t2r = tiled_copy_t2r.get_slice(tidx) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_M, STAGE) + tTR_tAcc = thr_copy_t2r.partition_S(tAcc_epi) + # (EPI_TILE_M, EPI_TILE_N, EPI_M, EPI_N, loopM, loopN, loopL) + gC_mnl_epi = cute.flat_divide( + gC_mnl[((None, None), 0, 0, None, None, None)], epi_tile + ) + # (T2R, T2R_M, T2R_N, EPI_M, EPI_N, loopM, loopN, loopL) + tTR_gC = thr_copy_t2r.partition_D(gC_mnl_epi) + # (T2R, T2R_M, T2R_N) + tTR_rAcc = cute.make_rmem_tensor( + tTR_gC[(None, None, None, 0, 0, 0, 0, 0)].shape, acc_dtype + ) + return tiled_copy_t2r, tTR_tAcc, tTR_rAcc + + def get_gmem_layout_scale( scale_shape_mkl: tuple[int, int, int], scale_granularity_m: int, @@ -345,10 +513,9 @@ def get_smem_layout_scale( cute.size(mma_tiler[2]) % cute.size(smem_layout_scale_per_stage.outer[1]) == 0 ), "smem_layout_scale_per_stage must evenly divide tile k shape." # Shared memory buffer for scale must be at least 128B to satisfy TMA requirement - - assert cute.size_in_bytes(a_scale_dtype, smem_layout_scale_per_stage) >= 128, ( - "smem size for scale must be at least 128B" - ) + assert ( + cute.size_in_bytes(a_scale_dtype, smem_layout_scale_per_stage) >= 128 + ), "smem size for scale must be at least 128B" # Scale layout in smem with multiple stages smem_layout_scale = cute.append( smem_layout_scale_per_stage, @@ -496,6 +663,98 @@ def is_valid_scale_granularity( return True +def is_shuffle_a( + a_major: str, + k: int, + a_dtype: type[cutlass.Numeric], + mma_dtype: type[cutlass.Numeric], + scale_granularity_k: int, +) -> bool: + # Enable shuffle on the k mode of A tensor when + # 1) tensor a is k-major and, + # 2) k is exactly divisible by 8 and, + # 3) a_dtype is Int4 and mma_dtype is BFloat16 and, + # 4) scale granularity k is greater than 8 + shuffle_a = ( + a_major == "k" + and a_dtype == cutlass.Int4 + and k % 8 == 0 + and mma_dtype == cutlass.BFloat16 + and scale_granularity_k >= 8 + ) + return shuffle_a + + +def is_valid_tensor_alignment( + m: int, + n: int, + k: int, + a_dtype: type[cutlass.Numeric], + b_dtype: type[cutlass.Numeric], + c_dtype: type[cutlass.Numeric], + scale_dtype: type[cutlass.Numeric], + a_major: str, + b_major: str, + c_major: str, + mma_tiler_mnk: tuple[int, int, int], + use_2cta_instrs: bool, + cluster_shape_mn: tuple[int, int], + scale_granularity_m: int, + scale_granularity_k: int, +) -> bool: + """ + Check if the tensor alignments are valid for the given problem size and data types. + """ + + def check_contiguous_16B_alignment(dtype, is_mode0_major, tensor_shape): + major_mode_idx = 0 if is_mode0_major else 1 + num_major_elements = tensor_shape[major_mode_idx] + num_contiguous_elements = 16 * 8 // dtype.width + return num_major_elements % num_contiguous_elements == 0 + + if not ( + check_contiguous_16B_alignment(a_dtype, a_major == "m", (m, k)) + and check_contiguous_16B_alignment(b_dtype, b_major == "n", (n, k)) + and check_contiguous_16B_alignment(c_dtype, c_major == "m", (m, n)) + and ( + scale_granularity_k == 0 + or check_contiguous_16B_alignment( + b_dtype, True, (m, k // scale_granularity_k) + ) + ) + ): + return False + # Check if scale tensor matches the TMA load 128B alignment requirement + cta_tile_shape_mnk = ( + mma_tiler_mnk[0] // (2 if use_2cta_instrs else 1), + mma_tiler_mnk[1], + mma_tiler_mnk[2], + ) + if ( + scale_granularity_m > 0 + and (cta_tile_shape_mnk[0] // cluster_shape_mn[1] // scale_granularity_m) + * (scale_dtype.width // 8) + < 128 + ): + return False + return True + + +def is_valid_mma_tiler_and_cluster_shape( + mma_tiler: tuple[int, int, int], + cluster_shape_mn: tuple[int, int], + use_2cta_instrs: bool, +) -> bool: + """ + Check if the MMA tiler and cluster shape are valid for the given problem size. + """ + if cluster_shape_mn[0] % (2 if use_2cta_instrs else 1) != 0: + return False + if (mma_tiler[0] // (2 if use_2cta_instrs else 1)) not in [64, 128]: + return False + return True + + def get_divisibility(contiguous_dim_size: int, upper_bound: int = 128) -> int: """ Calculate the largest power of 2 divisibility factor for memory alignment. @@ -505,3 +764,244 @@ def get_divisibility(contiguous_dim_size: int, upper_bound: int = 128) -> int: if contiguous_dim_size % (2**i) == 0: return min(2**i, upper_bound) return 1 + + +class ContiguousGGSearchState: + """ + The state of group search for grouped GEMM with contiguous offsets. + + The state records the progress of the group search algorithm on one mode. It will be + initialized once and updated in every round of group index search. + + :param last_tile_count: Number of cluster tiles before the current group + :type last_tile_count: cutlass.Int32 + :param cur_boundary: The boundary of the current group, which is the size along the seach + mode before the next group + :type cur_boundary: cutlass.Int32 + :param cur_tile_count: Number of cluster tiles searched so far + :type cur_tile_count: cutlass.Int32 + :param cur_group_idx: The index of the current group + :type cur_group_idx: cutlass.Int32 + :param cur_offset: The starting offset of the current group along the search mode + :type cur_offset: cutlass.Int32 + :param cur_start: The starting offset of the current cluster tile size along the search mode + when group search is done + :type cur_start: cutlass.Int32 + """ + + def __init__( + self, + last_tile_count: cutlass.Int32, + cur_boundary: cutlass.Int32, + cur_tile_count: cutlass.Int32, + cur_group_idx: cutlass.Int32, + cur_offset: cutlass.Int32, + cur_start: cutlass.Int32, + ): + self.last_tile_count = last_tile_count + self.cur_boundary = cur_boundary + self.cur_tile_count = cur_tile_count + self.cur_group_idx = cur_group_idx + self.cur_offset = cur_offset + self.cur_start = cur_start + + def __extract_mlir_values__(self): + values = extract_mlir_values(self.last_tile_count) + values.extend(extract_mlir_values(self.cur_boundary)) + values.extend(extract_mlir_values(self.cur_tile_count)) + values.extend(extract_mlir_values(self.cur_group_idx)) + values.extend(extract_mlir_values(self.cur_offset)) + values.extend(extract_mlir_values(self.cur_start)) + return values + + def __new_from_mlir_values__(self, values) -> "ContiguousGGSearchState": + last_tile_count = new_from_mlir_values(self.last_tile_count, [values[0]]) + cur_boundary = new_from_mlir_values(self.cur_boundary, [values[1]]) + cur_tile_count = new_from_mlir_values(self.cur_tile_count, [values[2]]) + cur_group_idx = new_from_mlir_values(self.cur_group_idx, [values[3]]) + cur_offset = new_from_mlir_values(self.cur_offset, [values[4]]) + cur_start = new_from_mlir_values(self.cur_start, [values[5]]) + return ContiguousGGSearchState( + last_tile_count, + cur_boundary, + cur_tile_count, + cur_group_idx, + cur_offset, + cur_start, + ) + + +def create_initial_contiguous_group_search_state() -> ContiguousGGSearchState: + """ + Create an initial search state for grouped gemm with contiguous offsets. + """ + return ContiguousGGSearchState( + last_tile_count=cutlass.Int32(0), + cur_boundary=cutlass.Int32(0), + cur_tile_count=cutlass.Int32(0), + cur_group_idx=cutlass.Int32(0), + cur_offset=cutlass.Int32(0), + cur_start=cutlass.Int32(0), + ) + + +class ContiguousGroupWorkTileInfo: + """ + Tile info for grouped GEMM with contiguous offsets. + It's constructed from the search state and contains information needed for different warps. + + :param group_count: The total number of groups + :type group_count: int + :param cta_coord_m: The coordinate of the current CTA tile along the M mode + :type cta_coord_m: cutlass.Int32 + :param coord_n: The starting offset on N mode for the current CTA tile + :type coord_n: cutlass.Int32 + :param group_idx: The index of the current group + :type group_idx: cutlass.Int32 + :param distance_to_boundary: The distance to the boundary of the current group + :type distance_to_boundary: cutlass.Int32 + """ + + def __init__( + self, + group_count: int, + cta_coord_m: cutlass.Int32, + coord_n: cutlass.Int32, + group_idx: cutlass.Int32, + distance_to_boundary: cutlass.Int32, + ): + self.cta_coord_m = cta_coord_m + self.coord_n = coord_n + self.group_idx = group_idx + self.distance_to_boundary = distance_to_boundary + self.group_count = group_count + + def __extract_mlir_values__(self): + values = extract_mlir_values(self.cta_coord_m) + values.extend(extract_mlir_values(self.coord_n)) + values.extend(extract_mlir_values(self.group_idx)) + values.extend(extract_mlir_values(self.distance_to_boundary)) + return values + + def __new_from_mlir_values__(self, values): + assert len(values) == 4 + new_cta_coord_m = new_from_mlir_values(self.cta_coord_m, [values[0]]) + new_coord_n = new_from_mlir_values(self.coord_n, [values[1]]) + new_group_idx = new_from_mlir_values(self.group_idx, [values[2]]) + new_distance_to_boundary = new_from_mlir_values( + self.distance_to_boundary, [values[3]] + ) + return ContiguousGroupWorkTileInfo( + self.group_count, + new_cta_coord_m, + new_coord_n, + new_group_idx, + new_distance_to_boundary, + ) + + @property + def is_valid_tile(self): + return self.group_idx < self.group_count + + +@cute.jit +def contiguous_group_search( + cluster_tile_shape_mnk: tuple[int, int, int], + group_count: cutlass.Int32, + linear_idx: cutlass.Int32, + search_state: ContiguousGGSearchState, + cumsum: cute.Tensor, + search_mode: int, +) -> ContiguousGGSearchState: + """ + Group search for contiguous grouped gemm. + """ + not_found = linear_idx >= search_state.cur_tile_count + next_boundary = cutlass.Int32(0) + cur_group_idx = search_state.cur_group_idx + cur_offset = search_state.cur_offset + last_tile_count = search_state.last_tile_count + cur_boundary = search_state.cur_boundary + cur_tile_count = search_state.cur_tile_count + if not_found: + cur_group_idx = cur_group_idx + 1 + while not_found and cur_group_idx <= group_count: + next_boundary = cumsum[cur_group_idx] + num_m_blocks = cute.ceil_div( + (next_boundary - cur_boundary), + cluster_tile_shape_mnk[search_mode], + ) + next_tile_count = num_m_blocks + cur_tile_count + not_found = linear_idx >= next_tile_count + + last_tile_count = cur_tile_count + cur_offset = cur_boundary + cur_boundary = next_boundary + cur_tile_count = next_tile_count + if not_found: + cur_group_idx = cur_group_idx + 1 + cur_start = cur_offset + cluster_tile_shape_mnk[search_mode] * ( + linear_idx - last_tile_count + ) + return ContiguousGGSearchState( + last_tile_count, + cur_boundary, + cur_tile_count, + cur_group_idx, + cur_offset, + cur_start, + ) + + +def make_contiguous_group_work_tile_info(group_count: int, sTile_info: cute.Tensor): + """ + Generate ContiguousGroupWorkTileInfo from tile_info tensor generated by contiguous_group_search + """ + tile_info = cute.make_rmem_tensor(sTile_info.shape, sTile_info.element_type) + cute.autovec_copy(sTile_info, tile_info) + return ContiguousGroupWorkTileInfo( + group_count, tile_info[0], tile_info[1], tile_info[2], tile_info[3] + ) + + +def cvt_tensor_a( + src: cute.Tensor, dtype: type[cutlass.Numeric], shuffle: bool +) -> cute.TensorSSA: + """ + Convert tensor src to the given data type. If shuffle is True, use shuffle intrinsic + for int4-to-bf16 conversion. + """ + from cutlass import CUDA_VERSION + + # shuffle is supported since CUDA 13.1 + shuffle_supported = True + if CUDA_VERSION.major < 13 or (CUDA_VERSION == 13 and CUDA_VERSION.minor < 1): + shuffle_supported = False + shuffle = shuffle and shuffle_supported + rst = src.load() + if cutlass.const_expr(shuffle): + # conversion with shuffle + rst = cute.TensorSSA( + cute.arch.cvt_i4_bf16_intrinsic( + rst, + cute.size(rst.shape), + with_shuffle=True, + ), + rst.shape, + dtype, + ) + else: + rst = rst.to(dtype) + return rst + + +def store_transformed_a( + src_a: cute.Tensor, dst_a: cute.Tensor, copy_atom_a: Optional[cute.CopyAtom] +) -> None: + """ + Store transformed A tensor to the given destination tensor. If copy_atom_a is not None, use autovec_copy. + """ + if cutlass.const_expr(copy_atom_a is not None): + cute.copy(copy_atom_a, src_a, dst_a) + else: + cute.autovec_copy(src_a, dst_a) diff --git a/python/CuTeDSL/cutlass/utils/static_persistent_tile_scheduler.py b/python/CuTeDSL/cutlass/utils/static_persistent_tile_scheduler.py index 164224ae..925ff522 100644 --- a/python/CuTeDSL/cutlass/utils/static_persistent_tile_scheduler.py +++ b/python/CuTeDSL/cutlass/utils/static_persistent_tile_scheduler.py @@ -87,6 +87,7 @@ class PersistentTileSchedulerParams: :type problem_layout_ncluster_mnl: cute.Layout """ + @dsl_user_op def __init__( self, problem_shape_ntile_mnl: cute.Shape, @@ -124,7 +125,7 @@ class PersistentTileSchedulerParams: self._cluster_shape_mnk = cluster_shape_mnk self.cluster_shape_mn = cluster_shape_mnk[:2] self.swizzle_size = swizzle_size - self._raster_along_m = raster_along_m + self.raster_along_m = raster_along_m self._loc = loc # By default, we follow m major (col-major) raster order, so make a col-major layout @@ -188,20 +189,27 @@ class PersistentTileSchedulerParams: problem_layout_size, loc=loc, ip=ip ) - # cluster_shape_m_fdd: Used to decode work_unit_id to cluster coordinates - self.cluster_shape_m_fdd = cute.fast_divmod_create_divisor( - cluster_count_m, loc=loc, ip=ip + if raster_along_m: + cluster_count_major = cluster_count_m + cluster_count_minor = cluster_count_n + else: + cluster_count_major = cluster_count_n + cluster_count_minor = cluster_count_m + + # cluster_shape_major_fdd: Used to decode work_unit_id to cluster coordinates + self.cluster_shape_major_fdd = cute.fast_divmod_create_divisor( + cluster_count_major, loc=loc, ip=ip ) - # cluster_shape_n_fdd: Used for the second level decomposition - self.cluster_shape_n_fdd = cute.fast_divmod_create_divisor( - cluster_count_n, loc=loc, ip=ip + # cluster_shape_minor_fdd: Used for the second level decomposition + self.cluster_shape_minor_fdd = cute.fast_divmod_create_divisor( + cluster_count_minor, loc=loc, ip=ip ) else: # FastDivmod not applicable with swizzling, set to None self.batch_fdd = None - self.cluster_shape_m_fdd = None - self.cluster_shape_n_fdd = None + self.cluster_shape_major_fdd = None + self.cluster_shape_minor_fdd = None def __extract_mlir_values__(self): values, self._values_pos = [], [] @@ -209,7 +217,7 @@ class PersistentTileSchedulerParams: self.problem_shape_ntile_mnl, self._cluster_shape_mnk, self.swizzle_size, - self._raster_along_m, + self.raster_along_m, ]: obj_values = extract_mlir_values(obj) values += obj_values @@ -223,8 +231,8 @@ class PersistentTileSchedulerParams: for i, (fdd_name, fdd_obj) in enumerate( [ ("batch_fdd", self.batch_fdd), - ("cluster_shape_m_fdd", self.cluster_shape_m_fdd), - ("cluster_shape_n_fdd", self.cluster_shape_n_fdd), + ("cluster_shape_major_fdd", self.cluster_shape_major_fdd), + ("cluster_shape_minor_fdd", self.cluster_shape_minor_fdd), ] ): if fdd_obj is not None: @@ -251,7 +259,7 @@ class PersistentTileSchedulerParams: self.problem_shape_ntile_mnl, self._cluster_shape_mnk, self.swizzle_size, - self._raster_along_m, + self.raster_along_m, ], self._values_pos[:-1], # Exclude FastDivmod count ): @@ -263,7 +271,7 @@ class PersistentTileSchedulerParams: new_params = PersistentTileSchedulerParams(*(tuple(obj_list)), loc=self._loc) # Restore FastDivmod divisors from remaining values - fdd_names = ["batch_fdd", "cluster_shape_m_fdd", "cluster_shape_n_fdd"] + fdd_names = ["batch_fdd", "cluster_shape_major_fdd", "cluster_shape_minor_fdd"] if hasattr(self, "_fastdivmod_indices") and len(self._fastdivmod_indices) > 0: # Override the FastDivmod divisors created by __init__ with reconstructed ones @@ -538,15 +546,24 @@ class StaticPersistentTileScheduler: # Step 2: Decode work_unit_id using FastDivmod objects # The layout structure is: problem_layout_ncluster_mnl has shape (cluster_count_m, cluster_count_n, batch_count) - # work_unit_id needs to be decomposed into (batch_l, cluster_n, cluster_m) in little-endian order + # work_unit_id needs to be decomposed into (batch_l, cluster_minor, cluster_major) in little-endian order - # First, get cluster_m using cluster_shape_m_fdd - cluster_n_batch, cluster_m = divmod( - work_unit_id, self.params.cluster_shape_m_fdd + # First, get cluster_major using cluster_shape_major_fdd + cluster_minor_batch, cluster_major = divmod( + work_unit_id, self.params.cluster_shape_major_fdd ) - # Then decode cluster_n_batch to get cluster_n and batch_l using FastDivmod - batch_l, cluster_n = divmod(cluster_n_batch, self.params.cluster_shape_n_fdd) + # Then decode cluster_minor_batch to get cluster_minor and batch_l using FastDivmod + batch_l, cluster_minor = divmod( + cluster_minor_batch, self.params.cluster_shape_minor_fdd + ) + + if self.params.raster_along_m: + cluster_m = cluster_major + cluster_n = cluster_minor + else: + cluster_m = cluster_minor + cluster_n = cluster_major return (cluster_m, cluster_n, batch_l) diff --git a/python/CuTeDSL/cutlass/utils/tensormap_manager.py b/python/CuTeDSL/cutlass/utils/tensormap_manager.py index 716eb804..f5c7160d 100644 --- a/python/CuTeDSL/cutlass/utils/tensormap_manager.py +++ b/python/CuTeDSL/cutlass/utils/tensormap_manager.py @@ -79,34 +79,50 @@ class TensorMapManager: # init tensormap pointed by dst_ptr with the one inside copy_atom. # dst_ptr should be pointing to a global memory location or a smem location # warp_id specifies which warp to perform the initialization + @dsl_user_op @cute.jit def init_tensormap_from_atom( - self, copy_atom: cute.CopyAtom, dst_ptr: cute.Pointer, warp_id: int + self, + copy_atom: cute.CopyAtom, + dst_ptr: cute.Pointer, + warp_id: int, + *, + loc=None, + ip=None, ) -> None: - warp_idx = cute.arch.warp_idx() - warp_idx = cute.arch.make_warp_uniform(warp_idx) + warp_idx = cute.arch.warp_idx(loc=loc, ip=ip) + warp_idx = cute.arch.make_warp_uniform(warp_idx, loc=loc, ip=ip) if warp_idx == warp_id: - with cute.arch.elect_one(): - cute.nvgpu.cpasync.copy_tensormap(copy_atom, dst_ptr) - cute.arch.sync_warp() + with cute.arch.elect_one(loc=loc, ip=ip): + cute.nvgpu.cpasync.copy_tensormap(copy_atom, dst_ptr, loc=loc, ip=ip) + cute.arch.sync_warp(loc=loc, ip=ip) return # Perform a fence operation to ensure previous `init_tensormap_from_atom` calls have been completed + @dsl_user_op def fence_tensormap_initialization( self, + *, + loc=None, + ip=None, ) -> None: if self.tensormap_update_mode == TensorMapUpdateMode.GMEM: - cute.arch.fence_acq_rel_cta() + cute.arch.fence_acq_rel_cta(loc=loc, ip=ip) return # Perform a fence operation to ensure previous `update_tensormap` calls have been completed + @dsl_user_op def fence_tensormap_update( self, tensormap_ptr: cute.Pointer, + *, + loc=None, + ip=None, ) -> None: - cute.nvgpu.cpasync.fence_tma_desc_acquire(tensormap_ptr) + cute.nvgpu.cpasync.fence_tma_desc_acquire(tensormap_ptr, loc=loc, ip=ip) return + @dsl_user_op @cute.jit def update_tensormap( self, @@ -115,8 +131,13 @@ class TensorMapManager: tensormap_gmem_ptr: Tuple[cute.Pointer, ...], warp_id: int, tensormap_smem_ptr: Tuple[cute.Pointer, ...], + *, + loc=None, + ip=None, ) -> None: - warp_idx = cute.arch.make_warp_uniform(cute.arch.warp_idx()) + warp_idx = cute.arch.make_warp_uniform( + cute.arch.warp_idx(loc=loc, ip=ip), loc=loc, ip=ip + ) # updates before touching tensormap in global memory if warp_idx == warp_id: if const_expr(self.tensormap_update_mode == TensorMapUpdateMode.SMEM): @@ -124,23 +145,25 @@ class TensorMapManager: tma_copy_atom, tensor_gmem, tensormap_smem_ptr ): cute.nvgpu.cpasync.update_tma_descriptor( - copy_atom, tensor, smem_ptr + copy_atom, tensor, smem_ptr, loc=loc, ip=ip ) # wait until it's safe to update tensormap in global memory - with cute.arch.elect_one(): - cute.arch.cp_async_bulk_commit_group() - cute.arch.cp_async_bulk_wait_group(0, read=True) - cute.arch.sync_warp() + with cute.arch.elect_one(loc=loc, ip=ip): + cute.arch.cp_async_bulk_commit_group(loc=loc, ip=ip) + cute.arch.cp_async_bulk_wait_group(0, read=True, loc=loc, ip=ip) + cute.arch.sync_warp(loc=loc, ip=ip) # updates to tensormap in global memory if const_expr(self.tensormap_update_mode == TensorMapUpdateMode.SMEM): for gmem_ptr, smem_ptr in zip(tensormap_gmem_ptr, tensormap_smem_ptr): - cute.nvgpu.cpasync.cp_fence_tma_desc_release(gmem_ptr, smem_ptr) + cute.nvgpu.cpasync.cp_fence_tma_desc_release( + gmem_ptr, smem_ptr, loc=loc, ip=ip + ) else: for copy_atom, tensor, gmem_ptr in zip( tma_copy_atom, tensor_gmem, tensormap_gmem_ptr ): cute.nvgpu.cpasync.update_tma_descriptor( - copy_atom, tensor, gmem_ptr + copy_atom, tensor, gmem_ptr, loc=loc, ip=ip ) - cute.arch.sync_warp() - cute.nvgpu.cpasync.fence_tma_desc_release() + cute.arch.sync_warp(loc=loc, ip=ip) + cute.nvgpu.cpasync.fence_tma_desc_release(loc=loc, ip=ip) diff --git a/python/CuTeDSL/cutlass/utils/tmem_allocator.py b/python/CuTeDSL/cutlass/utils/tmem_allocator.py index 19818fdb..925f7005 100644 --- a/python/CuTeDSL/cutlass/utils/tmem_allocator.py +++ b/python/CuTeDSL/cutlass/utils/tmem_allocator.py @@ -9,7 +9,8 @@ # and related documentation outside the scope permitted by the EULA # is strictly prohibited. -from typing import Optional, Type +from typing import Optional, Type, Union, List +from math import ceil, log2 import inspect from cutlass import const_expr @@ -23,10 +24,12 @@ from cutlass.cutlass_dsl import ( import cutlass.pipeline as pipeline import cutlass.cute as cute from cutlass._mlir import ir +from cutlass.cute.nvgpu.tcgen05 import find_tmem_tensor_col_offset +from cutlass.cute.arch import get_max_tmem_alloc_cols, get_min_tmem_alloc_cols class TmemAllocator: - """A class for managing tensor memory allocation on Blackwell GPU. + """A class for managing tensor memory allocation. This class manages allocation/deallocation of tensor memory, including the mbarrier synchronization for two cta use case. @@ -43,6 +46,8 @@ class TmemAllocator: :type _num_allocated_columns: int :ivar _two_cta_tmem_dealloc_mbar_ptr: The mbarrier pointer required when deallocating tensor memory for two cta. :type _two_cta_tmem_dealloc_mbar_ptr: cute.Pointer + :ivar _arch: The architecture of the GPU. + :type _arch: str """ @dsl_user_op @@ -75,6 +80,7 @@ class TmemAllocator: num_allocated_columns: int = 0, two_cta_tmem_dealloc_mbar_ptr: Optional[cute.Pointer] = None, *, + arch: str = "sm_100", loc=None, ip=None, ): @@ -116,6 +122,8 @@ class TmemAllocator: self._num_allocated_columns = num_allocated_columns self._two_cta_tmem_dealloc_mbar_ptr = two_cta_tmem_dealloc_mbar_ptr self._barrier_for_retrieve = barrier_for_retrieve + self._arch = arch + self._max_tmem_columns = get_max_tmem_alloc_cols(arch) # Init tmem dealloc mbarrier if two cta if const_expr(self._is_two_cta): @@ -150,6 +158,7 @@ class TmemAllocator: self._is_two_cta, self._num_allocated_columns, new_two_cta_tmem_dealloc_mbar_ptr, + arch=self._arch, ) @cute.jit @@ -157,13 +166,13 @@ class TmemAllocator: """Check if the number of columns is valid. This method checks if the number of columns is valid. - It checks if the number of columns is larger than 0, smaller than 512, a multiple of 32, and a power of two. + It checks if the number of columns is larger than 0, smaller than max capacity, a multiple of 32, and a power of two. """ # larger than 0 if const_expr(num_columns < 0): return False - # smaller than 512 - if const_expr(num_columns > 512): + # smaller than max capacity + if const_expr(num_columns > self._max_tmem_columns): return False # multiple of 32 if const_expr(num_columns % 32 != 0): @@ -183,10 +192,10 @@ class TmemAllocator: """ assert self.check_valid_num_columns(num_columns), ( - "num_columns must be multiple of 32 and power of two, and between 0 and 512" + f"num_columns must be multiple of 32 and power of two, and between 0 and {self._max_tmem_columns}" ) - assert self._num_allocated_columns + num_columns <= 512, ( - "total allocated columns must be less than or equal to 512" + assert self._num_allocated_columns + num_columns <= self._max_tmem_columns, ( + f"total allocated columns must be less than or equal to {self._max_tmem_columns}" ) warp_idx = cute.arch.warp_idx(loc=loc, ip=ip) @@ -197,6 +206,7 @@ class TmemAllocator: num_columns, self._alloc_result_dst_smem_ptr, is_two_cta=self._is_two_cta, + arch=self._arch, loc=loc, ip=ip, ) @@ -290,6 +300,7 @@ class TmemAllocator: tmem_ptr, num_deallocate_columns, is_two_cta=self._is_two_cta, + arch=self._arch, loc=loc, ip=ip, ) @@ -335,3 +346,56 @@ TmemAllocator.__init__.__signature__ = inspect.Signature( ), ] ) + + +def get_num_tmem_alloc_cols( + tmem_tensors: Union[cute.Tensor, List[cute.Tensor]], + rounding=True, + *, + arch: str = "sm_100", + loc=None, + ip=None, +) -> int: + """Get the total number of TMEM allocation columns for the given TMEM tensors. + + :param tmem_tensors: The TMEM tensors to get the number of allocation columns for. + :type tmem_tensors: Union[cute.Tensor, List[cute.Tensor]] + :param rounding: Whether to round up the number of allocation columns to the nearest power of 2. + :type rounding: bool + :param arch: The architecture of the GPU. + :type arch: str + :return: The total number of TMEM allocation columns. + :rtype: int + + :raises ValueError: If the number of TMEM allocation columns exceeds the maximum capacity or is less than 32. + """ + # Turn tmem_tensors into a list + if isinstance(tmem_tensors, cute.Tensor): + tmem_tensors = [tmem_tensors] + + tmem_max_alloc_cols = get_max_tmem_alloc_cols(arch) + tmem_min_alloc_cols = get_min_tmem_alloc_cols(arch) + + # For each tensor in tmem_tensors, find the tmem_tensor_col_offset + num_tmem_alloc_cols_per_tensor = [ + find_tmem_tensor_col_offset(t) for t in tmem_tensors + ] + + # Sum up the num_tmem_alloc_cols_per_tensor + num_tmem_alloc_cols = sum(num_tmem_alloc_cols_per_tensor) + + # Round up num_tmem_cols_total to the nearest power of 2 and make sure it is at least 32 + if rounding: + num_tmem_alloc_cols = max( + 1 << ceil(log2(num_tmem_alloc_cols)), tmem_min_alloc_cols + ) + + # Validate the number of TMEM allocation columns + if ( + num_tmem_alloc_cols > tmem_max_alloc_cols + or num_tmem_alloc_cols < tmem_min_alloc_cols + ): + raise ValueError( + f"TMEM allocation columns {num_tmem_alloc_cols} exceeds the maximum capacity of {tmem_max_alloc_cols} or less than {tmem_min_alloc_cols}" + ) + return num_tmem_alloc_cols diff --git a/python/CuTeDSL/cutlass/utils/version_info.py b/python/CuTeDSL/cutlass/utils/version_info.py new file mode 100644 index 00000000..231856ec --- /dev/null +++ b/python/CuTeDSL/cutlass/utils/version_info.py @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NvidiaProprietary +# +# Use of this software is governed by the terms and conditions of the +# NVIDIA End User License Agreement (EULA), available at: +# https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html +# +# Any use, reproduction, disclosure, or distribution of this software +# and related documentation outside the scope permitted by the EULA +# is strictly prohibited. + +from ..cutlass_dsl import DSLCudaVersion, DSLRuntimeError + +try: + from .._mlir._mlir_libs._cutlass_ir._base_dsl import get_cuda_version + CUDA_VERSION = DSLCudaVersion(get_cuda_version()) +except Exception as e: + raise DSLRuntimeError( + "💥💥💥 Failed to get CUDA version 💥💥💥", + cause=e, + suggestion="Consider re-installing the package." + ) from e diff --git a/python/CuTeDSL/requirements.txt b/python/CuTeDSL/requirements.txt index 508ab5d4..4c4fb948 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.3.5 +nvidia-cutlass-dsl==4.4.0.dev0 diff --git a/python/cutlass_library/emit_kernel_listing.py b/python/cutlass_library/emit_kernel_listing.py index a68898e4..4041caee 100755 --- a/python/cutlass_library/emit_kernel_listing.py +++ b/python/cutlass_library/emit_kernel_listing.py @@ -48,6 +48,7 @@ import csv import json import math import os +import re try: import builtins @@ -413,13 +414,49 @@ def emit_gemm_kernel_testlist(manifest, curr_build_dir, arch, mode raise Exception(error_message) elif mode == "functional_L1": + sm100_mma_data_type_general = [ + 'gemm_f16_f16_f16_f16_f16', + 'gemm_f16_f16_f16_void_f16', + 'gemm_f16_f16_f32_f32_f32', + 'gemm_bf16_bf16_f32_bf16_bf16', + 'gemm_bf16_bf16_f32_f32_f32', + 'gemm_e2m1_e2m1_f32_f32_f32', + 'gemm_e2m1_e3m2_f32_f32_f32', + 'gemm_e2m1_e4m3_f32_f32_f32', + 'gemm_e3m2_e2m1_f32_f32_f32', + 'gemm_e3m2_e3m2_f32_f32_f32', + 'gemm_e3m2_e4m3_f32_f32_f32', + 'gemm_e4m3_e2m1_f32_f32_f32', + 'gemm_e4m3_e3m2_f32_f32_f32', + 'gemm_e4m3_e4m3_f32_bf16_bf16', + 'gemm_e4m3_e5m2_f32_bf16_e4m3', + 'gemm_e5m2_e4m3_f32_f16_e4m3', + 'gemm_s8_s8_s32_s32_s32', + 'gemm_s8_s8_s32_s8_s8', + 'gemm_f4_f4_f32_f32_f32', + 'gemm_f4_f6_f32_f32_f32', + 'gemm_f4_f8_f32_f32_f32', + 'gemm_f6_f4_f32_f32_f32', + 'gemm_f6_f6_f32_f32_f32', + 'gemm_f6_f8_f32_f32_f32', + 'gemm_f8_f4_f32_f32_f32', + 'gemm_f8_f6_f32_f32_f32', + 'gemm_f8_f8_f32_bf16_bf16', + 'gemm_f8_f8_f32_bf16_e4m3', + 'gemm_f8_f8_f32_bf16_e5m2', + 'gemm_f8_f8_f32_f16_e4m3', + 'gemm_f8_f8_f32_f16_e5m2', + 'gemm_f8_f8_f32_f16_f16', + 'gemm_f8_f8_f32_f32_f32', + 'tf32gemm_*', + ] sm100_mma_cluster_size = [ '0x0x1' # dynamic cluster ] # Restrict to two layouts to reduce L1 build and test time. sm100_mma_layouts = ['tnt', 'ntn'] - sm100_mma_filter_regex_1sm = "cutlass3x_sm100_tensorop.*(" + ").*(".join([ "|".join(x) for x in [sm100_mma_cluster_size, sm100_mma_layouts]]) + ").*1sm.*" - sm100_mma_filter_regex_2sm = "cutlass3x_sm100_tensorop.*(" + ").*(".join([ "|".join(x) for x in [sm100_mma_cluster_size, sm100_mma_layouts]]) + ").*2sm.*" + sm100_mma_filter_regex_1sm = "cutlass3x_sm100_tensorop.*(" + ").*(".join([ "|".join(x) for x in [sm100_mma_data_type_general, sm100_mma_cluster_size, sm100_mma_layouts]]) + ").*1sm.*" + sm100_mma_filter_regex_2sm = "cutlass3x_sm100_tensorop.*(" + ").*(".join([ "|".join(x) for x in [sm100_mma_data_type_general, sm100_mma_cluster_size, sm100_mma_layouts]]) + ").*2sm.*" block_scaled_data_type = [ 'ue8m0xe2m1_ue8m0xe2m1_f32_f16_e5m2', 'ue8m0xe2m1_ue8m0xe2m3_f32_f16_e5m2', @@ -446,7 +483,7 @@ def emit_gemm_kernel_testlist(manifest, curr_build_dir, arch, mode filter_regex_sm100_mma = f"({sm100_mma_filter_regex_1sm})|" \ f"({sm100_mma_filter_regex_2sm})|" \ f"({block_scaled_filter_regex_1sm})|" \ - f"({block_scaled_filter_regex_2sm})" \ + f"({block_scaled_filter_regex_2sm})|" \ f"({sm103_block_scaled_filter_regex_1sm})|" \ f"({sm103_block_scaled_filter_regex_2sm})" # CTA tiles for sm120 MMA - only run one tile size to reduce build/test times @@ -483,7 +520,7 @@ def emit_gemm_kernel_testlist(manifest, curr_build_dir, arch, mode filter_regex_sm120_mma = f"({filter_regex_sm120_mma_0})|({filter_regex_sm120_mma_1})|({filter_regex_sm120_mma_2})|({filter_regex_sm120_mma_3})" - problem_waves = [0.5, 1.25, 2.5] + problem_waves = [0.5, 2.5] if arch in ["120a", "120f", "121a", "121f"]: kernel_filter = f"({filter_regex_sm120_mma})" @@ -538,6 +575,7 @@ def emit_gemm_kernel_testlist(manifest, curr_build_dir, arch, mode runtime_input_datatypes = [None] if dynamic_datatype: + # Standard runtime datatype kernels encoded as f4_f4 / f6_f6 / f8_f8, etc. if "f4_f4" in kernel_name: runtime_input_datatypes = [['e2m1','e2m1']] elif "f4_f6" in kernel_name: @@ -588,6 +626,23 @@ def emit_gemm_kernel_testlist(manifest, curr_build_dir, arch, mode elif "ue8m0xf8_ue8m0xf8" in kernel_name: runtime_input_datatypes = [['e4m3','e4m3']] + # Blockwise runtime-datatype kernels encode the fp8 selector together with the + # accumulator precision and block tile, e.g.: + # gemm_64x128f32xf8_32x128f32xf8_... + # which does not contain an "f8_f8" substring. As a fallback, detect this + # encoding and map it to the same runtime input datatypes as the symmetric + # f4_f4 / f6_f6 / f8_f8 cases above. + if runtime_input_datatypes == [None]: + m = re.search(r"f32x(f[468])", kernel_name) + if m: + fp_token = m.group(1) + if fp_token == "f4": + runtime_input_datatypes = [['e2m1', 'e2m1']] + elif fp_token == "f6": + runtime_input_datatypes = [['e3m2', 'e3m2']] + elif fp_token == "f8": + runtime_input_datatypes = [['e4m3', 'e4m3']] + if "bstensorop" in kernel_name or is_blockwise(manifest.operations_by_name[kernel_name].gemm_kind): profiler_flags_for_verification = "host" diff --git a/python/cutlass_library/generator.py b/python/cutlass_library/generator.py index 350ebef5..546f193f 100644 --- a/python/cutlass_library/generator.py +++ b/python/cutlass_library/generator.py @@ -7487,7 +7487,6 @@ def GenerateSM100_TensorOp_fp8_UMMA_alignx_gemm(manifest, cuda_version, gemm_kin tile_schedulers = [ TileSchedulerType.Default ] - # Some SM100 NoSmem epilogue instantiations rely on CUTE's shape_div, which enforces a compile-time # divisibility condition between CTA N and the epilogue N tile. Keep this conservative and scoped: # only apply the divisibility filter for selected common (c_type, d_type) pairs. @@ -7498,7 +7497,6 @@ def GenerateSM100_TensorOp_fp8_UMMA_alignx_gemm(manifest, cuda_version, gemm_kin (DataType.void, DataType.f16): 64, (DataType.void, DataType.bf16): 64, } - # 1xSM MMA kernels for math_inst in math_instructions_1sm: tile_descriptions = [] @@ -7618,7 +7616,6 @@ def GenerateSM100_TensorOp_fp8_UMMA_alignx_gemm(manifest, cuda_version, gemm_kin kernel_schedule = KernelScheduleType.WarpSpecialized1SmSm100 epi_schedule = EpilogueScheduleType.NoSmemWarpSpecialized1Sm - # SM100 NoSmem epilogue uses EpilogueTileAuto with N-tile = min(64, cta_n). # CUTE's shape_div then requires a compile-time divisibility condition between cta_n and 64. # Only instantiate kernels where cta_n <= 64 or cta_n is an exact multiple of 64 to avoid @@ -10625,6 +10622,232 @@ def GenerateSM100_SparseTensorOp_mixed_8bits_UMMA_gemm(manifest, cuda_version): [[KernelScheduleType.SparseTmaWarpSpecialized2SmSm100, EpilogueScheduleType.TmaWarpSpecialized2Sm]], tile_schedulers=tile_schedulers) + +# SM100 Interleaved Complex Tf32 Kernels +def GenerateSM100_TensorOp_32b_UMMA_gemm_complex(manifest, cuda_version): + if not CudaToolkitVersionSatisfies(cuda_version, 12, 0): + return + + # layouts for ABC and their alignments. + layouts = [ + [[LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2]], + [[LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.RowMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.RowMajor, 2]] + ] + + complex_transforms = [ + (ComplexTransform.none, ComplexTransform.none), + (ComplexTransform.conj, ComplexTransform.none), + (ComplexTransform.none, ComplexTransform.conj), + (ComplexTransform.conj, ComplexTransform.conj) + ] + + data_types = [ + { + "a_type" : DataType.cf32, + "b_type" : DataType.cf32, + "c_type" : DataType.cf32, + "d_type" : DataType.cf32, + "acc_type" : DataType.cf32, + "epi_type" : DataType.cf32, + }, + { + "a_type" : DataType.cf32, + "b_type" : DataType.cf32, + "c_type" : DataType.void, + "d_type" : DataType.cf32, + "acc_type" : DataType.cf32, + "epi_type" : DataType.cf32, + } + ] + + thor_sm = ThorSMRenumbering(cuda_version) + + min_cc = 100 + max_cc = 100 + max_cc = max(max_cc, thor_sm) + + math_instructions_1sm = [ + # tf32 -> f32 + MathInstruction( + [128, 64, 4], + DataType.tf32, DataType.tf32, DataType.f32, + OpcodeClass.TensorOp, + MathOperation.multiply_add_complex) + ] + + cluster_shapes_1sm = [[1,2,1], [1,1,1], [1,4,1], [4,4,1] + , DynamicClusterShape + ] + + if thor_sm in manifest.compute_capabilities_baseline : + cluster_shapes_1sm = [[1,2,1], [1,1,1], [1,4,1] + , DynamicClusterShape + ] + + tile_schedulers = [ + TileSchedulerType.Default, TileSchedulerType.StreamK + ] + + # 1xSM MMA kernels + for math_inst in math_instructions_1sm: + tile_descriptions = [] + for cluster_shape in cluster_shapes_1sm: + multiplier_1sm = (1, 1, 1) if cluster_shape == DynamicClusterShape else cluster_shape + tile_descriptions.append( + TileDescription([ + math_inst.instruction_shape[0] * multiplier_1sm[0], + math_inst.instruction_shape[1] * multiplier_1sm[1], + math_inst.instruction_shape[2] * 4 * multiplier_1sm[2]], + 0, [4, 1, 1], math_inst, min_cc, max_cc, cluster_shape)) + + CreateGemmUniversal3xOperator(manifest, layouts, tile_descriptions, data_types, + [[KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized1SmSm100, EpilogueScheduleType.NoSmemWarpSpecialized1Sm]], + complex_transforms, + tile_schedulers=tile_schedulers) + + # 2xSM MMA kernels + math_instructions_2sm = [ + # tf32 -> f32 + MathInstruction( + [256, 64, 4], + DataType.tf32, DataType.tf32, DataType.f32, + OpcodeClass.TensorOp, + MathOperation.multiply_add_complex) + ] + + cluster_shapes_2sm = [[2,1,1], [2,2,1], [2,4,1], [4,1,1], [4,2,1], [4,4,1] + , DynamicClusterShape + ] + + if thor_sm in manifest.compute_capabilities_baseline : + cluster_shapes_2sm = [[2,1,1], [2,2,1], [2,4,1], [4,1,1], [4,2,1] + , DynamicClusterShape + ] + + for math_inst in math_instructions_2sm: + tile_descriptions = [] + for cluster_shape in cluster_shapes_2sm: + multiplier_2sm = (1, 1, 1) if cluster_shape == DynamicClusterShape else (cluster_shape[0] // 2, cluster_shape[1], cluster_shape[2]) + tile_descriptions.append( + TileDescription([ + math_inst.instruction_shape[0] * multiplier_2sm[0], + math_inst.instruction_shape[1] * multiplier_2sm[1], + math_inst.instruction_shape[2] * 4 * multiplier_2sm[2]], + 0, [4, 1, 1], math_inst, min_cc, max_cc, cluster_shape)) + + CreateGemmUniversal3xOperator(manifest, layouts, tile_descriptions, data_types, + [[KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized2SmSm100, EpilogueScheduleType.NoSmemWarpSpecialized2Sm]], + complex_transforms, + tile_schedulers=tile_schedulers) + +def GenerateSM100_TensorOp_FastF32_UMMA_gemm_complex_stream_k(manifest, cuda_version): + if not CudaToolkitVersionSatisfies(cuda_version, 12, 0): + return + + # layouts for ABC and their alignments. + layouts = [ + [[LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2]], + [[LayoutType.RowMajor, 2], [LayoutType.RowMajor, 2], [LayoutType.ColumnMajor, 2]], + [[LayoutType.ColumnMajor, 2], [LayoutType.ColumnMajor, 2], [LayoutType.RowMajor, 2]], + + ] + + data_types = [ + { + "a_type" : DataType.cf32, + "b_type" : DataType.cf32, + "c_type" : DataType.cf32, + "d_type" : DataType.cf32, + "acc_type" : DataType.cf32, + "epi_type" : DataType.cf32, + } + ] + + # Unsupported yet + complex_transforms = None + # [ + # (ComplexTransform.none, ComplexTransform.none), + # (ComplexTransform.conj, ComplexTransform.none), + # (ComplexTransform.none, ComplexTransform.conj), + # (ComplexTransform.conj, ComplexTransform.conj) + # ] + + min_cc = 100 + max_cc = 100 + + math_instructions_1sm = [ + MathInstruction( + [128, 64, 8], + DataType.cbf16, DataType.cbf16, DataType.cf32, + OpcodeClass.TensorOp, + MathOperation.multiply_add), + ] + + cluster_shapes_1sm = [ + [1,1,1], [4,4,1] + , DynamicClusterShape + ] + + tile_schedulers = [ + TileSchedulerType.Default, TileSchedulerType.StreamK, + ] + + # 1xSM MMA kernels + for math_inst in math_instructions_1sm: + tile_descriptions = [] + for cluster_shape in cluster_shapes_1sm: + multiplier = (1, 1, 1) if cluster_shape == DynamicClusterShape else cluster_shape + tile_descriptions.append( + TileDescription([ + math_inst.instruction_shape[0] * multiplier[0], + math_inst.instruction_shape[1] * multiplier[1], + math_inst.instruction_shape[2] * 2], + 0, [4, 1, 1], math_inst, min_cc, max_cc, cluster_shape)) + + CreateGemmUniversal3xOperator(manifest, layouts, tile_descriptions, data_types, + [[KernelScheduleType.TmaWarpSpecialized1SmFastFP32Sm100, EpilogueScheduleType.FastF32NoSmemWarpSpecialized1Sm]], + complex_transforms, + tile_schedulers=tile_schedulers) + + # 2xSM MMA kernels + math_instructions_2sm = [ + MathInstruction( + [256, 64, 8], + DataType.cbf16, DataType.cbf16, DataType.cf32, + OpcodeClass.TensorOp, + MathOperation.multiply_add), + ] + + cluster_shapes_2sm = [ + [2,1,1], [4,4,1] + , DynamicClusterShape + ] + + for math_inst in math_instructions_2sm: + tile_descriptions = [] + for cluster_shape in cluster_shapes_2sm: + multiplier_2sm = (1, 1, 1) if cluster_shape == DynamicClusterShape else (cluster_shape[0] // 2, cluster_shape[1], cluster_shape[2]) + tile_descriptions.append( + TileDescription([ + math_inst.instruction_shape[0] * multiplier_2sm[0], + math_inst.instruction_shape[1] * multiplier_2sm[1], + math_inst.instruction_shape[2] * 2], + 0, [4, 1, 1], math_inst, min_cc, max_cc, cluster_shape)) + CreateGemmUniversal3xOperator(manifest, layouts, tile_descriptions, data_types, + [[KernelScheduleType.TmaWarpSpecialized2SmFastFP32Sm100, EpilogueScheduleType.FastF32NoSmemWarpSpecialized2Sm]], + complex_transforms, + tile_schedulers=tile_schedulers) + + # Conv Utility functions def make_dims_and_alignments_triple(dim: int, bit_per_element_A: int, bit_per_element_B: int, bit_per_element_C: int): bit_alignment_required_by_tma = 128 @@ -11780,6 +12003,10 @@ def GenerateSM100(manifest, cuda_version): GenerateSM100_TensorOp_fp8_UMMA_gemm_with_blockwise(manifest, cuda_version) GenerateSM100_TensorOp_fp8_UMMA_gemm_with_blockwise(manifest, cuda_version, gemm_kind=GemmKind.GroupedBlockwiseUniversal3x) + GenerateSM100_TensorOp_32b_UMMA_gemm_complex(manifest, cuda_version) + # CGemm with 9xBF16 + GenerateSM100_TensorOp_FastF32_UMMA_gemm_complex_stream_k(manifest, cuda_version) + # # Sparse Gemm # diff --git a/python/cutlass_library/library.py b/python/cutlass_library/library.py index 8a26474c..e78db65b 100644 --- a/python/cutlass_library/library.py +++ b/python/cutlass_library/library.py @@ -562,6 +562,12 @@ class KernelScheduleType(enum.Enum): SparseNvf4TmaWarpSpecialized2SmSm100 = enum_auto() SparseMxf8f6f4TmaWarpSpecialized1SmSm100 = enum_auto() SparseMxf8f6f4TmaWarpSpecialized2SmSm100 = enum_auto() + + InterleavedComplexTF32TmaWarpSpecialized1SmSm100 = enum_auto() + InterleavedComplexTF32TmaWarpSpecialized2SmSm100 = enum_auto() + TmaWarpSpecialized1SmFastFP32Sm100 = enum_auto() + TmaWarpSpecialized2SmFastFP32Sm100 = enum_auto() + # FP4 Ultra MxNvf4UltraTmaWarpSpecialized1SmVs16Sm103 = enum_auto() MxNvf4UltraTmaWarpSpecialized2SmVs16Sm103 = enum_auto() @@ -679,7 +685,10 @@ KernelScheduleTag = { KernelScheduleType.MxNvf4UltraTmaWarpSpecialized2SmVs16Sm103DisablePrefetch: 'cutlass::gemm::KernelTmaWarpSpecialized2SmBlockScaledMxNvf4UltraVs16Sm103DisablePrefetch', KernelScheduleType.MxNvf4UltraTmaWarpSpecialized1SmVs32Sm103DisablePrefetch: 'cutlass::gemm::KernelTmaWarpSpecialized1SmBlockScaledMxNvf4UltraVs32Sm103DisablePrefetch', KernelScheduleType.MxNvf4UltraTmaWarpSpecialized2SmVs32Sm103DisablePrefetch: 'cutlass::gemm::KernelTmaWarpSpecialized2SmBlockScaledMxNvf4UltraVs32Sm103DisablePrefetch', - + KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized1SmSm100: 'cutlass::gemm::KernelTmaWarpSpecialized1SmInterleavedComplexTF32Sm100', + KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized2SmSm100: 'cutlass::gemm::KernelTmaWarpSpecialized2SmInterleavedComplexTF32Sm100', + KernelScheduleType.TmaWarpSpecialized1SmFastFP32Sm100: 'cutlass::gemm::KernelTmaWarpSpecialized1SmFastFP32Sm100', + KernelScheduleType.TmaWarpSpecialized2SmFastFP32Sm100: 'cutlass::gemm::KernelTmaWarpSpecialized2SmFastFP32Sm100', KernelScheduleType.PtrArrayTmaWarpSpecializedCooperative: 'cutlass::gemm::KernelPtrArrayTmaWarpSpecializedCooperative', KernelScheduleType.PtrArrayTmaWarpSpecializedCooperativeFP8FastAccum: 'cutlass::gemm::KernelPtrArrayTmaWarpSpecializedCooperativeFP8FastAccum', KernelScheduleType.PtrArrayTmaWarpSpecializedPingpong: 'cutlass::gemm::KernelPtrArrayTmaWarpSpecializedPingpong', @@ -799,7 +808,10 @@ KernelScheduleSuffixes = { KernelScheduleType.MxNvf4UltraTmaWarpSpecialized2SmVs16Sm103TmaPrefetch: '_o_vs16_ultra_2sm_tmapf', KernelScheduleType.MxNvf4UltraTmaWarpSpecialized1SmVs32Sm103TmaPrefetch: '_o_vs32_ultra_1sm_tmapf', KernelScheduleType.MxNvf4UltraTmaWarpSpecialized2SmVs32Sm103TmaPrefetch: '_o_vs32_ultra_2sm_tmapf', - + KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized1SmSm100: '_1sm', + KernelScheduleType.InterleavedComplexTF32TmaWarpSpecialized2SmSm100: '_2sm', + KernelScheduleType.TmaWarpSpecialized1SmFastFP32Sm100: '_FastF32_1sm', + KernelScheduleType.TmaWarpSpecialized2SmFastFP32Sm100: '_FastF32_2sm', KernelScheduleType.PtrArrayTmaWarpSpecializedCooperative: '_warpspecialized_cooperative', KernelScheduleType.PtrArrayTmaWarpSpecializedCooperativeFP8FastAccum: '_warpspecialized_cooperative_fp8_fastaccum', KernelScheduleType.PtrArrayTmaWarpSpecializedPingpong: '_warpspecialized_pingpong', diff --git a/test/self_contained_includes/CMakeLists.txt b/test/self_contained_includes/CMakeLists.txt index 094cfeea..97d1ce0c 100644 --- a/test/self_contained_includes/CMakeLists.txt +++ b/test/self_contained_includes/CMakeLists.txt @@ -260,11 +260,11 @@ set(header_files_to_check ) # for each header in _header_files: -# create a .cu file with the same name as the header's path, except with / replaced with % +# create a .cu file with the same name as the header's path, except with / replaced with # # have the .cu file include that header set(_gen_source_files "") foreach(header_file ${header_files_to_check}) - string(REPLACE "/" "%" header_file_esc ${header_file}) + string(REPLACE "/" "#" header_file_esc ${header_file}) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${header_file_esc}.cu" "#include <${header_file}>") diff --git a/test/unit/gemm/device/gemm_testbed_3x_planar_complex.hpp b/test/unit/gemm/device/gemm_testbed_3x_planar_complex.hpp new file mode 100644 index 00000000..d723bc2c --- /dev/null +++ b/test/unit/gemm/device/gemm_testbed_3x_planar_complex.hpp @@ -0,0 +1,482 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Tests for device-wide Planar Complex GEMM interface +*/ + + + +#pragma once + +#include +#include +#include + +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x.hpp" + +#include "cutlass/util/host_tensor.h" +#include "cutlass/util/host_tensor_planar_complex.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/distribution.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/util/reference/host/tensor_fill.h" +#include "cutlass/util/reference/host/tensor_copy.h" +#include "cutlass/util/reference/host/tensor_compare.h" +#include "cutlass/util/reference/host/tensor_norm.h" +#include "cutlass/util/reference/host/gemm_planar_complex.h" +#include "cutlass/numeric_types.h" + +#include "testbed_utils.h" + +#include "cutlass/kernel_hardware_info.hpp" +#include "cutlass/layout/matrix.h" +#include "cutlass/matrix_coord.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/fast_math.h" +#include "cutlass/platform/platform.h" + +#include "cute/int_tuple.hpp" +#include "cute/layout.hpp" + + +namespace test { +namespace gemm { +namespace device { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template +struct Testbed3xPlanarComplex { + // Kernel data types + using ElementA = typename Gemm::GemmKernel::ElementA; + using StrideA = typename Gemm::GemmKernel::StrideA; + using ElementB = typename Gemm::GemmKernel::ElementB; + using StrideB = typename Gemm::GemmKernel::StrideB; + using ElementC = std::conditional_t, + typename Gemm::GemmKernel::ElementD,typename Gemm::GemmKernel::ElementC>; + using StrideC = typename Gemm::GemmKernel::StrideC; + using ElementD = typename Gemm::GemmKernel::ElementD; + using StrideD = typename Gemm::GemmKernel::StrideD; + using ElementAccumulator = typename Gemm::GemmKernel::ElementAccumulator; + using ProblemShapeType = typename Gemm::GemmKernel::ProblemShape; + using EpilogueOutputOp = typename Gemm::EpilogueOutputOp; + using ClusterShapeType = typename Gemm::GemmKernel::CollectiveMainloop::DispatchPolicy::ClusterShape; + /// For custom EVTs + using ElementCompute = typename EpilogueOutputOp::ElementCompute; + using ElementScalar = typename EpilogueOutputOp::ElementScalar; + + static_assert(rank(StrideC{}) == 3, "StrideCD must be rank-3: [M, N, L]"); + static_assert(rank(StrideD{}) == 3, "StrideCD must be rank-3: [M, N, L]"); + + static constexpr uint32_t mma_promotion_interval = 4; + + // Looks at Cute Stride to check Row / Column Major + template + static constexpr bool is_row_or_col_major(){ + int stride_0 = int(cute::size<0>(Stride{})); + int stride_1 = int(cute::size<1>(Stride{})); + int depth = cute::depth(Stride{}); + return ((stride_0 == 1) || (stride_1 == 1)) && (depth == 1); + } + + // Note: this limitation comes from testbed / not the library + static_assert(is_row_or_col_major(), + "ERROR : A Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : B Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : C Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : D Layout is neither Row / Column Major)"); + + // Deduce Cutlass Layouts (RowMajor & ColumnMajor) + using LayoutTagA = cutlass::detail::StrideToLayoutTagA_t; + using LayoutTagB = cutlass::detail::StrideToLayoutTagB_t; + using LayoutTagC = cutlass::detail::StrideToLayoutTagA_t; + using LayoutTagD = cutlass::detail::StrideToLayoutTagA_t; + + /// Initialization + StrideA stride_a; + StrideB stride_b; + StrideC stride_c; + StrideD stride_d; + + typename LayoutTagA::Stride stride_factor_A; + typename LayoutTagB::Stride stride_factor_B; + typename LayoutTagC::Stride stride_factor_C; + typename LayoutTagD::Stride stride_factor_D; + + cutlass::Distribution::Kind init_A; + cutlass::Distribution::Kind init_B; + cutlass::Distribution::Kind init_C; + uint64_t seed; + static constexpr uint64_t kDefaultSeed = 4096; + + // Data members + cutlass::HostTensorPlanarComplex tensor_A; + cutlass::HostTensorPlanarComplex tensor_B; + cutlass::HostTensorPlanarComplex tensor_C; + cutlass::HostTensorPlanarComplex tensor_D; + cutlass::HostTensorPlanarComplex reference_D; + + uint32_t sm_count; + + // Used to force multi-wave tests for persistent kernel schedules + constexpr static int MaxSmCount = 16; + using RasterOrderOptions = typename cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90::RasterOrderOptions; + using DecompositionMode = typename cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90StreamKParams::DecompositionMode; + + cutlass::ComplexTransform TransformA = Gemm::kTransformA; + cutlass::ComplexTransform TransformB = Gemm::kTransformB; + + // + // Methods + // + Testbed3xPlanarComplex( + cutlass::Distribution::Kind init_A_ = cutlass::Distribution::Uniform, + cutlass::Distribution::Kind init_B_ = cutlass::Distribution::Uniform, + cutlass::Distribution::Kind init_C_ = cutlass::Distribution::Uniform, + uint64_t seed_ = kDefaultSeed + ): + stride_factor_A(typename LayoutTagA::Stride()), + stride_factor_B(typename LayoutTagB::Stride()), + stride_factor_C(typename LayoutTagC::Stride()), + stride_factor_D(typename LayoutTagD::Stride()), + init_A(init_A_), init_B(init_B_), init_C(init_C_), seed(seed_) { } + + /// Helper to initialize a tensor view + template + bool initialize_tensor( + cutlass::TensorViewPlanarComplex view, + cutlass::Distribution::Kind dist_kind, + uint64_t seed) { + + if (dist_kind == cutlass::Distribution::Uniform) { + double scope_max, scope_min; + int bits_input = cutlass::sizeof_bits::value; + int bits_output = cutlass::sizeof_bits::value; + + if (bits_input == 1) { + scope_max = 2; + scope_min = 0; + } + else if (bits_input <= 8) { + scope_max = 2; + scope_min = -2; + } + else if (bits_output == 16) { + scope_max = 5; + scope_min = -5; + } + else { + scope_max = 8; + scope_min = -8; + } + cutlass::reference::host::TensorFillRandomUniform( + view, seed, scope_max, scope_min, 0); + } + + else if (dist_kind == cutlass::Distribution::Gaussian) { + cutlass::reference::host::TensorFillRandomGaussian(view, seed, 0, 0.5); + } + + else if (dist_kind == cutlass::Distribution::AllOnes) { + cutlass::reference::host::TensorFill(view, {Element(1), Element(0)}); + } + else { + EXPECT_TRUE(false) << "Not implemented"; + return false; + } + + return true; + } + + /// Initializes data structures + void initialize(ProblemShapeType problem_size) { + // + // Allocate the GEMM workspace + // + auto problem_shape_MNKL = cute::append<4>(problem_size, 1); + auto M = cute::size<0>(problem_shape_MNKL); + auto N = cute::size<1>(problem_shape_MNKL); + auto K = cute::size<2>(problem_shape_MNKL); + auto L = cute::size<3>(problem_shape_MNKL); + + stride_a = cutlass::make_cute_packed_stride(StrideA{}, cute::make_shape(M, K, L)); + stride_b = cutlass::make_cute_packed_stride(StrideB{}, cute::make_shape(N, K, L)); + stride_c = cutlass::make_cute_packed_stride(StrideC{}, cute::make_shape(M, N, L)); + stride_d = cutlass::make_cute_packed_stride(StrideD{}, cute::make_shape(M, N, L)); + + // 2.x host tensor does not natively contain a batch stride or coord, so we spoof if by folding it into the outer mode + auto a_coord = cutlass::make_Coord(M * L, K); + auto c_coord = cutlass::make_Coord(M * L, N); + // Cutlass has Row/Col major refers to MxK times KxN matrix product, + // so the HostTensorB should be treated as KxN in "coord"'s view + auto b_coord = cutlass::make_Coord(K, N * L); + + tensor_A.resize(a_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(a_coord, stride_factor_A)); + tensor_B.resize(b_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(b_coord, stride_factor_B)); + tensor_C.resize(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_C)); + tensor_D.resize(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_D)); + + reference_D.resize(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_D), false); + + EXPECT_TRUE(initialize_tensor(tensor_A.host_view(), init_A, seed + 2022)); + EXPECT_TRUE(initialize_tensor(tensor_B.host_view(), init_B, seed + 2021)); + EXPECT_TRUE(initialize_tensor(tensor_C.host_view(), init_C, seed + 2020)); + + cutlass::reference::host::TensorFill(tensor_D.host_view(), cutlass::complex()); + cutlass::reference::host::TensorFill(reference_D.host_view(), cutlass::complex()); + + tensor_A.sync_device(); + tensor_B.sync_device(); + tensor_C.sync_device(); + tensor_D.sync_device(); + } + + /// Verifies the result is a GEMM + bool verify( + ProblemShapeType problem_size, + ElementScalar alpha, + ElementScalar beta) + { + auto problem_shape_MNKL = cute::append<4>(problem_size, 1); + auto M = cute::size<0>(problem_shape_MNKL); + auto N = cute::size<1>(problem_shape_MNKL); + auto K = cute::size<2>(problem_shape_MNKL); + auto L = cute::size<3>(problem_shape_MNKL); + +#if 0 + std::cout << " M : " << M << " N : " << N << " K : " << K << " L : " << L << std::endl; +#endif + // + // Compute reference + // + cutlass::reference::host::GemmPlanarComplex< + ElementA, LayoutTagA, + ElementB, LayoutTagB, + ElementC, LayoutTagC, + ElementAccumulator + >( + cutlass::gemm::GemmCoord(M,N,K), + alpha, + tensor_A.host_ref(), + TransformA, + tensor_B.host_ref(), + TransformB, + beta, + tensor_C.host_ref(), + reference_D.host_ref() + ); + + bool passed = false; + + tensor_D.sync_host(); + passed = cutlass::reference::host::TensorEquals( + tensor_D.host_view(), + reference_D.host_view() + ); + + EXPECT_TRUE(passed); + + if (!passed) { + std::stringstream fname; + fname << "error_Planar_Complex_Gemm_device_" + << M << "x" << N << "x" << K << "x" << L << "_" + << cute::get<0>(typename Gemm::GemmKernel::TileShape{}) << "_" + << cute::get<1>(typename Gemm::GemmKernel::TileShape{}) << "_" + << cute::get<2>(typename Gemm::GemmKernel::TileShape{}) << ".txt"; + + std::ofstream file(fname.str()); + file + << "problem: " << ' ' << M << "x" << N << "x" << K << ", Batch count = " << L + << ", alpha: " << alpha << ", beta: " << beta + << "\n\n"; + + file + << "A =\n" << tensor_A.host_view() + << "\nB =\n" << tensor_B.host_view() + << "\nC =\n" << tensor_C.host_view() + << "\n\nReference =\n" << reference_D.host_view() + << "\n\nComputed =\n" << tensor_D.host_view(); + } + + return passed; + } + + /// Returns true if the CUDA device is sufficient to execute the kernel. + bool sufficient() { + // + // Determine SMEM requirements and waive if not satisfied + // + + int smem_size = Gemm::GemmKernel::SharedStorageSize; + + int device_idx; + cudaError_t result = cudaGetDevice(&device_idx); + + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDevice() API call failed."); + } + + cudaDeviceProp properties; + result = cudaGetDeviceProperties(&properties, device_idx); + this->sm_count = properties.multiProcessorCount; + + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDeviceProperties() failed"); + } + + if (properties.sharedMemPerBlockOptin < size_t(smem_size)) { + return false; + } + + return true; + } + + bool run( + ProblemShapeType problem_size, + ElementScalar alpha = ElementScalar(1), + ElementScalar beta = ElementScalar(0), + RasterOrderOptions raster_order = RasterOrderOptions::Heuristic, + detail::MaxSwizzleSize max_swizzle = detail::MaxSwizzleSize{}, + detail::Splits splits = detail::Splits{}, + DecompositionMode decomposition_mode = DecompositionMode::Heuristic, + unsigned int cluster_m = 0, + unsigned int cluster_n = 0, + unsigned int cluster_m_fallback = 0, + unsigned int cluster_n_fallback = 0 + ) { + // Waive test if insufficient CUDA device + if (!sufficient()) { + if (CUTLASS_TEST_UNIT_ENABLE_WARNINGS) { + std::cerr << "Test waived due to insufficient CUDA device." << std::endl; + } + return true; + } + + this->initialize(problem_size); + + // + // Launch device kernel + // + + // + // Initialize the GEMM operator + // + + cutlass::KernelHardwareInfo hw_info; + hw_info.device_id = 0; + + if (cute::is_static_v) { + this->sm_count = cutlass::platform::min(MaxSmCount, cutlass::KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id)); + hw_info.sm_count = this->sm_count; + } + else { + this->sm_count = cutlass::KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + hw_info.sm_count = this->sm_count; + + // Runtime and preferred cluster setting + hw_info.cluster_shape = {cluster_m, cluster_n, 1}; + hw_info.cluster_shape_fallback = {cluster_m_fallback, cluster_n_fallback, 1}; + } + + typename Gemm::GemmKernel::TileScheduler::Arguments scheduler_args; + if constexpr (cute::is_same_v) { + scheduler_args = { static_cast(splits), static_cast(max_swizzle), raster_order, decomposition_mode }; + } + else { + scheduler_args = { static_cast(max_swizzle), raster_order }; + } + + auto arguments = typename Gemm::Arguments { + cutlass::gemm::GemmUniversalMode::kGemm, + problem_size, + { + tensor_A.device_data(), stride_a, tensor_A.device_data_imag(), stride_a, + tensor_B.device_data(), stride_b, tensor_B.device_data_imag(), stride_b + }, + { + {alpha, beta}, + tensor_C.device_data(), stride_c, tensor_C.device_data_imag(), stride_c, + tensor_D.device_data(), stride_d, tensor_D.device_data_imag(), stride_d + }, + hw_info, + scheduler_args + }; + + Gemm gemm_op; + + size_t workspace_size = Gemm::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = gemm_op.can_implement(arguments); + + if (status != cutlass::Status::kSuccess) { + cudaError_t error = cudaGetLastError(); + std::cerr << "This test is not supported: " << cudaGetErrorString(error) << "\n"; + return true; + } + + // + // Run the GEMM + // + + cudaError_t result; + status = gemm_op.initialize(arguments, workspace.get()); + status = gemm_op.run(); + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + EXPECT_EQ(result, cudaSuccess) << "Error at Kernel Sync."; + return false; + } + + EXPECT_TRUE(status == cutlass::Status::kSuccess) << to_string(status); + // + // Verify + // + bool passed = this->verify(problem_size, alpha, beta); + + if (!passed) { + std::cout << "Error : Failed : with alpha: " << alpha << ", beta: " << beta + << "\n"; + } + + return passed; + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace device +} // namespace gemm +} // namespace test diff --git a/test/unit/gemm/device/gemm_testbed_3x_ptr_array_planar_complex.hpp b/test/unit/gemm/device/gemm_testbed_3x_ptr_array_planar_complex.hpp new file mode 100644 index 00000000..01488c92 --- /dev/null +++ b/test/unit/gemm/device/gemm_testbed_3x_ptr_array_planar_complex.hpp @@ -0,0 +1,536 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Testbed for Ptr-Array and Grouped Planar Complex GEMM interface +*/ + + + +#pragma once + +#include +#include +#include + +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x.hpp" + +#include "cutlass/util/host_tensor.h" +#include "cutlass/util/host_tensor_planar_complex.h" +#include "cutlass/util/tensor_view_io.h" +#include "cutlass/util/distribution.h" +#include "cutlass/util/packed_stride.hpp" +#include "cutlass/util/reference/host/tensor_fill.h" +#include "cutlass/util/reference/host/tensor_copy.h" +#include "cutlass/util/reference/host/tensor_compare.h" +#include "cutlass/util/reference/host/tensor_norm.h" +#include "cutlass/util/reference/host/gemm_planar_complex.h" +#include "cutlass/numeric_types.h" + +#include "testbed_utils.h" + +#include "cutlass/kernel_hardware_info.hpp" +#include "cutlass/layout/matrix.h" +#include "cutlass/matrix_coord.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/fast_math.h" +#include "cutlass/platform/platform.h" + +#include "cute/int_tuple.hpp" +#include "cute/layout.hpp" + + +namespace test { +namespace gemm { +namespace device { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template +struct Testbed3xPlanarComplex { + // Kernel data types + using ElementA = typename Gemm::GemmKernel::ElementA; + using StrideA = typename Gemm::GemmKernel::StrideA; + using ElementB = typename Gemm::GemmKernel::ElementB; + using StrideB = typename Gemm::GemmKernel::StrideB; + using ElementC = std::conditional_t, + typename Gemm::GemmKernel::ElementD,typename Gemm::GemmKernel::ElementC>; + using StrideC = typename Gemm::GemmKernel::StrideC; + using ElementD = typename Gemm::GemmKernel::ElementD; + using StrideD = typename Gemm::GemmKernel::StrideD; + using ElementAccumulator = typename Gemm::GemmKernel::ElementAccumulator; + using ProblemShapeType = typename Gemm::GemmKernel::ProblemShape; + using EpilogueOutputOp = typename Gemm::EpilogueOutputOp; + using ClusterShapeType = typename Gemm::GemmKernel::CollectiveMainloop::DispatchPolicy::ClusterShape; + /// For custom EVTs + using ElementCompute = typename EpilogueOutputOp::ElementCompute; + using ElementScalar = typename EpilogueOutputOp::ElementScalar; + + static_assert(rank(StrideC{}) == 3, "StrideCD must be rank-3: [M, N, L]"); + static_assert(rank(StrideD{}) == 3, "StrideCD must be rank-3: [M, N, L]"); + + static constexpr uint32_t mma_promotion_interval = 4; + + // Looks at Cute Stride to check Row / Column Major + template + static constexpr bool is_row_or_col_major(){ + int stride_0 = int(cute::size<0>(Stride{})); + int stride_1 = int(cute::size<1>(Stride{})); + int depth = cute::depth(Stride{}); + return ((stride_0 == 1) || (stride_1 == 1)) && (depth == 1); + } + + // Note: this limitation comes from testbed / not the library + static_assert(is_row_or_col_major(), + "ERROR : A Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : B Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : C Layout is neither Row / Column Major)"); + static_assert(is_row_or_col_major(), + "ERROR : D Layout is neither Row / Column Major)"); + + // Deduce Cutlass Layouts (RowMajor & ColumnMajor) + using LayoutTagA = cutlass::detail::StrideToLayoutTagA_t; + using LayoutTagB = cutlass::detail::StrideToLayoutTagB_t; + using LayoutTagC = cutlass::detail::StrideToLayoutTagA_t; + using LayoutTagD = cutlass::detail::StrideToLayoutTagA_t; + + /// Initialization + StrideA stride_a; + StrideB stride_b; + StrideC stride_c; + StrideD stride_d; + + typename LayoutTagA::Stride stride_factor_A; + typename LayoutTagB::Stride stride_factor_B; + typename LayoutTagC::Stride stride_factor_C; + typename LayoutTagD::Stride stride_factor_D; + + cutlass::Distribution::Kind init_A; + cutlass::Distribution::Kind init_B; + cutlass::Distribution::Kind init_C; + uint64_t seed; + static constexpr uint64_t kDefaultSeed = 4096; + + // Data members + std::vector> tensors_A; + std::vector> tensors_B; + std::vector> tensors_C; + std::vector> tensors_D; + std::vector> references_D; + + cutlass::DeviceAllocation device_tensors_A_real; + cutlass::DeviceAllocation device_tensors_A_imag; + + cutlass::DeviceAllocation device_tensors_B_real; + cutlass::DeviceAllocation device_tensors_B_imag; + + cutlass::DeviceAllocation device_tensors_C_real; + cutlass::DeviceAllocation device_tensors_C_imag; + + cutlass::DeviceAllocation device_tensors_D_real; + cutlass::DeviceAllocation device_tensors_D_imag; + + uint32_t sm_count; + + // Used to force multi-wave tests for persistent kernel schedules + constexpr static int MaxSmCount = 16; + using RasterOrderOptions = typename cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90::RasterOrderOptions; + using DecompositionMode = typename cutlass::gemm::kernel::detail::PersistentTileSchedulerSm90StreamKParams::DecompositionMode; + + cutlass::ComplexTransform TransformA = Gemm::kTransformA; + cutlass::ComplexTransform TransformB = Gemm::kTransformB; + + // + // Methods + // + Testbed3xPlanarComplex( + cutlass::Distribution::Kind init_A_ = cutlass::Distribution::Uniform, + cutlass::Distribution::Kind init_B_ = cutlass::Distribution::Uniform, + cutlass::Distribution::Kind init_C_ = cutlass::Distribution::Uniform, + uint64_t seed_ = kDefaultSeed + ): + stride_factor_A(typename LayoutTagA::Stride()), + stride_factor_B(typename LayoutTagB::Stride()), + stride_factor_C(typename LayoutTagC::Stride()), + stride_factor_D(typename LayoutTagD::Stride()), + init_A(init_A_), init_B(init_B_), init_C(init_C_), seed(seed_) { } + + /// Helper to initialize a tensor view + template + bool initialize_tensor( + cutlass::TensorViewPlanarComplex view, + cutlass::Distribution::Kind dist_kind, + uint64_t seed) { + + if (dist_kind == cutlass::Distribution::Uniform) { + double scope_max, scope_min; + int bits_input = cutlass::sizeof_bits::value; + int bits_output = cutlass::sizeof_bits::value; + + if (bits_input == 1) { + scope_max = 2; + scope_min = 0; + } + else if (bits_input <= 8) { + scope_max = 2; + scope_min = -2; + } + else if (bits_output == 16) { + scope_max = 5; + scope_min = -5; + } + else { + scope_max = 8; + scope_min = -8; + } + cutlass::reference::host::TensorFillRandomUniform( + view, seed, scope_max, scope_min, 0); + } + + else if (dist_kind == cutlass::Distribution::Gaussian) { + cutlass::reference::host::TensorFillRandomGaussian(view, seed, 0, 0.5); + } + + else if (dist_kind == cutlass::Distribution::AllOnes) { + cutlass::reference::host::TensorFill(view, {Element(1), Element(0)}); + } + else { + EXPECT_TRUE(false) << "Not implemented"; + return false; + } + + return true; + } + + /// Initializes data structures + void initialize(ProblemShapeType problem_shapes) { + // + // Allocate the GEMM workspace + // + auto [M, N, K, L] = problem_shapes.get_host_problem_shape(); + + stride_a = cutlass::make_cute_packed_stride(StrideA{}, cute::make_shape(M, K, 1)); + stride_b = cutlass::make_cute_packed_stride(StrideB{}, cute::make_shape(N, K, 1)); + stride_c = cutlass::make_cute_packed_stride(StrideC{}, cute::make_shape(M, N, 1)); + stride_d = cutlass::make_cute_packed_stride(StrideD{}, cute::make_shape(M, N, 1)); + + auto a_coord = cutlass::make_Coord(M, K); + auto c_coord = cutlass::make_Coord(M, N); + // Cutlass has Row/Col major refers to MxK times KxN matrix product, + // so the HostTensorB should be treated as KxN in "coord"'s view + auto b_coord = cutlass::make_Coord(K, N); + + tensors_A.clear(); + tensors_B.clear(); + tensors_C.clear(); + tensors_D.clear(); + references_D.clear(); + + for (int32_t i = 0; i < L; ++i) { + tensors_A.push_back(cutlass::HostTensorPlanarComplex(a_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(a_coord, stride_factor_A))); + tensors_B.push_back(cutlass::HostTensorPlanarComplex(b_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(b_coord, stride_factor_B))); + tensors_C.push_back(cutlass::HostTensorPlanarComplex(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_C))); + tensors_D.push_back(cutlass::HostTensorPlanarComplex(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_D))); + references_D.push_back(cutlass::HostTensorPlanarComplex(c_coord, cutlass::layout::Affine2Layout_Factory::layout_factory(c_coord, stride_factor_D), false)); + + EXPECT_TRUE(initialize_tensor(tensors_A[i].host_view(), init_A, seed + 2022 + i)); + EXPECT_TRUE(initialize_tensor(tensors_B[i].host_view(), init_B, seed + 2021 + i)); + EXPECT_TRUE(initialize_tensor(tensors_C[i].host_view(), init_B, seed + 2020 + i)); + + cutlass::reference::host::TensorFill(tensors_D[i].host_view(), cutlass::complex()); + cutlass::reference::host::TensorFill(references_D[i].host_view(), cutlass::complex()); + + tensors_A[i].sync_device(); + tensors_B[i].sync_device(); + tensors_C[i].sync_device(); + tensors_D[i].sync_device(); + } + } + + /// Verifies the result is a GEMM + bool verify( + ProblemShapeType problem_shapes, + ElementScalar alpha, + ElementScalar beta) + { + using namespace cute; + auto [M, N, K, L] = problem_shapes.get_host_problem_shape(); + +#if 0 + std::cout << " M : " << M << " N : " << N << " K : " << K << " L : " << L << std::endl; +#endif + + // + // Compute reference + // + bool passed = false; + for(int batch = 0; batch < L; ++batch) { + cutlass::reference::host::GemmPlanarComplex< + ElementA, LayoutTagA, + ElementB, LayoutTagB, + ElementC, LayoutTagC, + ElementAccumulator + >( + cutlass::gemm::GemmCoord(M,N,K), + alpha, + tensors_A[batch].host_ref(), + TransformA, + tensors_B[batch].host_ref(), + TransformB, + beta, + tensors_C[batch].host_ref(), + references_D[batch].host_ref() + ); + + tensors_D[batch].sync_host(); + passed = cutlass::reference::host::TensorEquals( + tensors_D[batch].host_view(), + references_D[batch].host_view() + ); + + EXPECT_TRUE(passed); + + if (!passed) { + std::stringstream fname; + fname << "error_Planar_Complex_Gemm_device_" + << M << "x" << N << "x" << K << "x" << batch << "_" + << cute::get<0>(typename Gemm::GemmKernel::TileShape{}) << "_" + << cute::get<1>(typename Gemm::GemmKernel::TileShape{}) << "_" + << cute::get<2>(typename Gemm::GemmKernel::TileShape{}) << ".txt"; + + std::ofstream file(fname.str()); + file + << "problem: " << ' ' << M << "x" << N << "x" << K << ", Batch idx = " << batch + << ", alpha: " << alpha << ", beta: " << beta + << "\n\n"; + + file + << "A =\n" << tensors_A[batch].host_view() + << "\nB =\n" << tensors_B[batch].host_view() + << "\nC =\n" << tensors_C[batch].host_view() + << "\n\nReference =\n" << references_D[batch].host_view() + << "\n\nComputed =\n" << tensors_D[batch].host_view(); + } + } + return passed; + } + + /// Returns true if the CUDA device is sufficient to execute the kernel. + bool sufficient() { + // + // Determine SMEM requirements and waive if not satisfied + // + + int smem_size = Gemm::GemmKernel::SharedStorageSize; + + int device_idx; + cudaError_t result = cudaGetDevice(&device_idx); + + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDevice() API call failed."); + } + + cudaDeviceProp properties; + result = cudaGetDeviceProperties(&properties, device_idx); + this->sm_count = properties.multiProcessorCount; + + if (result != cudaSuccess) { + throw std::runtime_error("cudaGetDeviceProperties() failed"); + } + + if (properties.sharedMemPerBlockOptin < size_t(smem_size)) { + return false; + } + + return true; + } + + bool run( + ProblemShapeType problem_shapes, + ElementScalar alpha = ElementScalar(1), + ElementScalar beta = ElementScalar(0), + RasterOrderOptions raster_order = RasterOrderOptions::Heuristic, + detail::MaxSwizzleSize max_swizzle = detail::MaxSwizzleSize{}, + detail::Splits splits = detail::Splits{}, + DecompositionMode decomposition_mode = DecompositionMode::Heuristic, + unsigned int cluster_m = 0, + unsigned int cluster_n = 0, + unsigned int cluster_m_fallback = 0, + unsigned int cluster_n_fallback = 0 + ) { + // Waive test if insufficient CUDA device + if (!sufficient()) { + if (CUTLASS_TEST_UNIT_ENABLE_WARNINGS) { + std::cerr << "Test waived due to insufficient CUDA device." << std::endl; + } + return true; + } + + this->initialize(problem_shapes); + + // + // Launch device kernel + // + + // + // Initialize the GEMM operator + // + + cutlass::KernelHardwareInfo hw_info; + hw_info.device_id = 0; + + this->sm_count = cutlass::KernelHardwareInfo::query_device_multiprocessor_count(hw_info.device_id); + hw_info.sm_count = this->sm_count; + if (not cute::is_static_v) { + // Runtime and preferred cluster setting + hw_info.cluster_shape = {cluster_m, cluster_n, 1}; + hw_info.cluster_shape_fallback = {cluster_m_fallback, cluster_n_fallback, 1}; + } + + typename Gemm::GemmKernel::TileScheduler::Arguments scheduler_args; + if constexpr (cute::is_same_v) { + scheduler_args = { static_cast(splits), static_cast(max_swizzle), raster_order, decomposition_mode }; + } + else { + scheduler_args = { static_cast(max_swizzle), raster_order }; + } + + auto [M, N, K, L] = problem_shapes.get_host_problem_shape(); + std::vector ptr_A_real_host(L); + std::vector ptr_A_imag_host(L); + + std::vector ptr_B_real_host(L); + std::vector ptr_B_imag_host(L); + + std::vector ptr_C_real_host(L); + std::vector ptr_C_imag_host(L); + + std::vector ptr_D_real_host(L); + std::vector ptr_D_imag_host(L); + + for (int32_t i = 0; i < L; ++i) { + ptr_A_real_host.at(i) = tensors_A[i].device_data(); + ptr_A_imag_host.at(i) = tensors_A[i].device_data_imag(); + + ptr_B_real_host.at(i) = tensors_B[i].device_data(); + ptr_B_imag_host.at(i) = tensors_B[i].device_data_imag(); + + ptr_C_real_host.at(i) = tensors_C[i].device_data(); + ptr_C_imag_host.at(i) = tensors_C[i].device_data_imag(); + + ptr_D_real_host.at(i) = tensors_D[i].device_data(); + ptr_D_imag_host.at(i) = tensors_D[i].device_data_imag(); + } + + device_tensors_A_real.reset(L); + device_tensors_A_real.copy_from_host(ptr_A_real_host.data()); + device_tensors_A_imag.reset(L); + device_tensors_A_imag.copy_from_host(ptr_A_imag_host.data()); + + device_tensors_B_real.reset(L); + device_tensors_B_real.copy_from_host(ptr_B_real_host.data()); + device_tensors_B_imag.reset(L); + device_tensors_B_imag.copy_from_host(ptr_B_imag_host.data()); + + device_tensors_C_real.reset(L); + device_tensors_C_real.copy_from_host(ptr_C_real_host.data()); + device_tensors_C_imag.reset(L); + device_tensors_C_imag.copy_from_host(ptr_C_imag_host.data()); + + device_tensors_D_real.reset(L); + device_tensors_D_real.copy_from_host(ptr_D_real_host.data()); + device_tensors_D_imag.reset(L); + device_tensors_D_imag.copy_from_host(ptr_D_imag_host.data()); + + auto arguments = typename Gemm::Arguments { + cutlass::gemm::GemmUniversalMode::kArray, + problem_shapes, + { + device_tensors_A_real.get(), stride_a, device_tensors_A_imag.get(), stride_a, + device_tensors_B_real.get(), stride_b, device_tensors_B_imag.get(), stride_b + }, + { + {alpha, beta}, + device_tensors_C_real.get(), stride_c, device_tensors_C_imag.get(), stride_c, + device_tensors_D_real.get(), stride_d, device_tensors_D_imag.get(), stride_d + }, + hw_info, + scheduler_args + }; + + Gemm gemm_op; + + size_t workspace_size = Gemm::get_workspace_size(arguments); + cutlass::device_memory::allocation workspace(workspace_size); + + cutlass::Status status = gemm_op.can_implement(arguments); + + if (status != cutlass::Status::kSuccess) { + cudaError_t error = cudaGetLastError(); + std::cerr << "This test is not supported: " << cudaGetErrorString(error) << "\n"; + return true; + } + + // + // Run the GEMM + // + + cudaError_t result; + status = gemm_op.initialize(arguments, workspace.get()); + status = gemm_op.run(); + result = cudaDeviceSynchronize(); + if (result != cudaSuccess) { + EXPECT_EQ(result, cudaSuccess) << "Error at Kernel Sync."; + return false; + } + + EXPECT_TRUE(status == cutlass::Status::kSuccess) << to_string(status); + // + // Verify + // + bool passed = this->verify(problem_shapes, alpha, beta); + + if (!passed) { + std::cout << "Error : Failed : with alpha: " << alpha << ", beta: " << beta + << "\n"; + } + + return passed; + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace device +} // namespace gemm +} // namespace test diff --git a/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32.cu b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32.cu new file mode 100644 index 00000000..1af4d4d7 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32.cu @@ -0,0 +1,163 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// 128x128x64 ////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TTT +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16t_f32t_tensorop_1sm, 128x128x64_1x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TMA MULTICAST /////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TNN +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16n_f32n_tensorop_1sm, 512x256x64_4x4x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue, + cutlass::gemm::StreamKScheduler + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_2sm.cu b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_2sm.cu new file mode 100644 index 00000000..02b20856 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_2sm.cu @@ -0,0 +1,163 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// 128x64x64 /////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NNN +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16n_f32n_tensorop_2sm, 128x64x64_2x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TMA MULTICAST ////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NTT +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16t_f32t_tensorop_2sm, 256x256x64_4x4x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue, + cutlass::gemm::StreamKScheduler + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_conjugate_layout.cu b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_conjugate_layout.cu new file mode 100644 index 00000000..d281ee52 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_conjugate_layout.cu @@ -0,0 +1,211 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TCGEN05.1CTA /////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CN +TEST(SM100_Device_Gemm_Planar_cbf16c_cbf16n_f32n_tensorop_1sm, 128x64x64_1x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::conjugate; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +// NC +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16c_f32n_tensorop_1sm, 128x128x64_1x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::conjugate; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TCGEN05.2CTA //////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TC +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16c_f32t_tensorop_2sm, 128x64x64_2x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::conjugate; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif diff --git a/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_preferred_cluster.cu b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_preferred_cluster.cu new file mode 100644 index 00000000..1b0ff81d --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_preferred_cluster.cu @@ -0,0 +1,165 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////// 64x128x64_0x0x1 TCGEN05.1CTA /////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// TTT +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16t_f32t_tensorop_1sm_preferred_cluster, 64x128x64_0x0x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_64,_128,_64>; + using ClusterShape = cute::Shape; // Runtime cluster shape + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexPreferredClusterSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////// 128x128x64_0x0x1 TCGEN05.2CTA ////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// NNN +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16n_f32n_tensorop_2sm_preferred_cluster, 128x128x64_0x0x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = cute::Shape; // Runtime cluster shape + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + // 2Sm preferred cluster kernel should directly use 2Sm KernelSchedule for now + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexPreferredClusterSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_ptr_array.cu b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_ptr_array.cu new file mode 100644 index 00000000..341d1652 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cbf16_cbf16_cbf16_tensor_op_cf32_ptr_array.cu @@ -0,0 +1,282 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Tests for device-wide Ptr-Array GEMM interface +*/ + + + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" + +#include "cutlass/numeric_types.h" + +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/kernel/tile_scheduler.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cutlass/epilogue/collective/sm70_epilogue_vectorized.hpp" +#include "cutlass/epilogue/collective/default_epilogue.hpp" +#include "cutlass/epilogue/thread/linear_combination.h" + +#include "../../common/cutlass_unit_test.h" + +#include "gemm_testbed_3x_ptr_array_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 128x64x64, CLUSTER_SIZE : 1x1x1, CLUSTER_TILE_SIZE : 128x64x64, TCGEN05.1CTA ////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TT +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16t_f32n_tensorop_ptr_array_1sm, 128x64x64_1x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized1SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized1Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 64x128x64, CLUSTER_SIZE : 4x4x1, CLUSTER_TILE_SIZE : 256x256x64, TCGEN05.1CTA ///////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NN +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16n_f32n_tensorop_ptr_array_1sm, 256x512x64_4x4x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_64,_128,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized1SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized1Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 64x128x64, CLUSTER_SIZE : 2x1x1, CLUSTER_TILE_SIZE : 128x128x64, TCGEN05.1CTA ///////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TN +TEST(SM100_Device_Gemm_Planar_cbf16t_cbf16n_f32n_tensorop_ptr_array_2sm, 128x128x64_2x1x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized2SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized2Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 128x64x64, CLUSTER_SIZE : 4x4x1, CLUSTER_TILE_SIZE : 512x256x64, TCGEN05.1CTA ///////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NT +TEST(SM100_Device_Gemm_Planar_cbf16n_cbf16t_f32n_tensorop_ptr_array_2sm, 512x256x64_4x4x1) { + using ElementA = cutlass::bfloat16_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::bfloat16_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_256,_64,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized2SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized2Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::bfloat16_t, LayoutC, 8, + cutlass::bfloat16_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32.cu b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32.cu new file mode 100644 index 00000000..099a105b --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32.cu @@ -0,0 +1,163 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////// 64x64x64 /////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NNN +TEST(SM100_Device_Gemm_Planar_cf16n_cf16n_f32n_tensorop_1sm, 64x64x64_1x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_64,_64,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TMA MULTICAST /////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NTT +TEST(SM100_Device_Gemm_Planar_cf16n_cf16t_f32t_tensorop_1sm, 512x512x64_4x4x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue, + cutlass::gemm::StreamKScheduler + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_2sm.cu b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_2sm.cu new file mode 100644 index 00000000..7f77e456 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_2sm.cu @@ -0,0 +1,163 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// 256x64x64 ////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TTT +TEST(SM100_Device_Gemm_Planar_cf16t_cf16t_f32t_tensorop_2sm, 256x64x64_2x1x1) { + using ElementA = cutlass::half_t; + using LayoutA = cutlass::layout::RowMajor; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + + using ElementB = cutlass::half_t; + using LayoutB = cutlass::layout::RowMajor; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_256,_64,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TMA MULTICAST ////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TNN +TEST(SM100_Device_Gemm_Planar_cf16t_cf16n_f32n_tensorop_2sm, 256x512x64_4x4x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue, + cutlass::gemm::StreamKScheduler + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_conjugate_layout.cu b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_conjugate_layout.cu new file mode 100644 index 00000000..a595cfd7 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_conjugate_layout.cu @@ -0,0 +1,212 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TCGEN05.1CTA //////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NC +TEST(SM100_Device_Gemm_Planar_cf16n_cf16c_f32n_tensorop_1sm, 128x128x64_1x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::conjugate; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +// CT +TEST(SM100_Device_Gemm_Planar_cf16c_cf16t_f32n_tensorop_1sm, 64x64x64_1x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::conjugate; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_64,_64,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////// TCGEN05.2CTA //////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CC +TEST(SM100_Device_Gemm_Planar_cf16c_cf16c_f32t_tensorop_2sm, 256x64x64_2x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::conjugate; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::conjugate; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_256,_64,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue, + cutlass::gemm::StreamKScheduler + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif diff --git a/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_preferred_cluster.cu b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_preferred_cluster.cu new file mode 100644 index 00000000..6e8542d4 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_preferred_cluster.cu @@ -0,0 +1,165 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ + + + +/*! \file + \brief Tests for device-wide GEMM interface +*/ + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" +#include "cutlass/numeric_types.h" +#include "cutlass/arch/mma_sm100.h" +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/dispatch_policy.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cute/atom/mma_traits_sm100.hpp" +#include "../../common/cutlass_unit_test.h" +#include "gemm_testbed_3x_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////// 128x128x64_0x0x1 TCGEN05.1CTA ////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// TNT +TEST(SM100_Device_Gemm_Planar_cf16t_cf16n_f32t_tensorop_1sm_preferred_cluster, 128x128x64_0x0x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::RowMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = cute::Shape; // Runtime cluster shape + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized1Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + cutlass::gemm::KernelTmaWarpSpecialized1SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexPreferredClusterSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////// 256x128x64_0x0x1 MMA.2SM /////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// NTN +TEST(SM100_Device_Gemm_Planar_cf16n_cf16t_f32n_tensorop_2sm_preferred_cluster, 256x128x64_0x0x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_256,_128,_64>; + using ClusterShape = cute::Shape; // Runtime cluster shape + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + cutlass::epilogue::PlanarComplexTmaWarpSpecialized2Sm + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + // 2Sm preferred cluster kernel should directly use 2Sm KernelSchedule for now + cutlass::gemm::KernelTmaWarpSpecialized2SmPlanarComplexSm100 + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + Shape, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexPreferredClusterSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_ptr_array.cu b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_ptr_array.cu new file mode 100644 index 00000000..10cbaf51 --- /dev/null +++ b/test/unit/gemm/device/sm100_gemm_planar_cf16_cf16_cf16_tensor_op_cf32_ptr_array.cu @@ -0,0 +1,282 @@ +/*************************************************************************************************** + * Copyright (c) 2023 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Tests for device-wide Ptr-Array GEMM interface +*/ + + + +#include + +#include "cutlass/cutlass.h" +#include "cute/tensor.hpp" +#include "cute/atom/mma_atom.hpp" + +#include "cutlass/numeric_types.h" + +#include "cutlass/gemm/device/gemm_universal_adapter.h" +#include "cutlass/gemm/kernel/gemm_universal.hpp" +#include "cutlass/gemm/kernel/tile_scheduler.hpp" +#include "cutlass/gemm/collective/collective_builder.hpp" +#include "cutlass/epilogue/collective/collective_builder.hpp" +#include "cutlass/epilogue/collective/sm70_epilogue_vectorized.hpp" +#include "cutlass/epilogue/collective/default_epilogue.hpp" +#include "cutlass/epilogue/thread/linear_combination.h" + +#include "../../common/cutlass_unit_test.h" + +#include "gemm_testbed_3x_ptr_array_planar_complex.hpp" + +using namespace cute; + +#if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////// CTA_TILE_SIZE : 128x128x64, CLUSTER_SIZE : 1x1x1, CLUSTER_TILE_SIZE : 128x128x64, TCGEN05.1CTA ///////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TN +TEST(SM100_Device_Gemm_Planar_cf16t_cf16n_f32n_tensorop_ptr_array_1sm, 128x128x64_1x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_128,_64>; + using ClusterShape = Shape<_1,_1,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized1SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized1Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 64x64x64, CLUSTER_SIZE : 2x2x1, CLUSTER_TILE_SIZE : 128x128x64, TCGEN05.1CTA ////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NT +TEST(SM100_Device_Gemm_Planar_cf16n_cf16t_f32n_tensorop_ptr_array_1sm, 128x128x64_2x2x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_64,_64,_64>; + using ClusterShape = Shape<_2,_2,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized1SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized1Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 64x64x64, CLUSTER_SIZE : 2x1x1, CLUSTER_TILE_SIZE : 128x64x64, TCGEN05.2CTA /////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TT +TEST(SM100_Device_Gemm_Planar_cf16t_cf16t_f32n_tensorop_ptr_array_2sm, 128x64x64_2x1x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::RowMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::RowMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_128,_64,_64>; + using ClusterShape = Shape<_2,_1,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized2SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized2Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////// CTA_TILE_SIZE : 128x128x64, CLUSTER_SIZE : 4x4x1, CLUSTER_TILE_SIZE : 512x512x64, TCGEN05.2CTA //////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NN +TEST(SM100_Device_Gemm_Planar_cf16n_cf16n_f32n_tensorop_ptr_array_2sm, 512x512x64_4x4x1) { + using ElementA = cutlass::half_t; + using TransformA = cute::identity; + using ElementPairA = cute::tuple; + using LayoutA = cutlass::layout::ColumnMajor; + + using ElementB = cutlass::half_t; + using TransformB = cute::identity; + using ElementPairB = cute::tuple; + using LayoutB = cutlass::layout::ColumnMajor; + + using ElementAccumulator = float; + using LayoutC = cutlass::layout::ColumnMajor; + + using MmaTileShape = cute::Shape<_256,_128,_64>; + using ClusterShape = Shape<_4,_4,_1>; + + using MainloopSchedule = cutlass::gemm::KernelPtrArrayTmaWarpSpecialized2SmPlanarComplexSm100; // Kernel to launch + using EpilogueSchedule = cutlass::epilogue::PtrArrayPlanarComplexTmaWarpSpecialized2Sm; // Epilogue to launch + + using CollectiveEpilogue = typename cutlass::epilogue::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + MmaTileShape, ClusterShape, + cutlass::epilogue::collective::EpilogueTileAuto, + float, float, + cutlass::half_t, LayoutC, 8, + cutlass::half_t, LayoutC, 8, + EpilogueSchedule + >::CollectiveOp; + + using CollectiveMainloop = typename cutlass::gemm::collective::CollectiveBuilder< + cutlass::arch::Sm100, cutlass::arch::OpClassTensorOp, + ElementPairA, LayoutA, 8, + ElementPairB, LayoutB, 8, + ElementAccumulator, + MmaTileShape, ClusterShape, + cutlass::gemm::collective::StageCountAutoCarveout< + static_cast(sizeof(typename CollectiveEpilogue::SharedStorage))>, + MainloopSchedule + >::CollectiveOp; + + using GemmKernel = cutlass::gemm::kernel::GemmUniversal< + cutlass::gemm::ArrayProblemShape>, + CollectiveMainloop, + CollectiveEpilogue + >; + + using Gemm = cutlass::gemm::device::GemmUniversalAdapter; + EXPECT_TRUE(test::gemm::device::TestPlanarComplexSmall()); +} + +#endif // #if defined(CUTLASS_ARCH_MMA_SM100_SUPPORTED) diff --git a/test/unit/transform/device/testbed_sparse_gemm_compressor.hpp b/test/unit/transform/device/testbed_sparse_gemm_compressor.hpp index cf3bfdde..0955f6f7 100644 --- a/test/unit/transform/device/testbed_sparse_gemm_compressor.hpp +++ b/test/unit/transform/device/testbed_sparse_gemm_compressor.hpp @@ -306,14 +306,14 @@ public: compressor_utility.structure_sparse_zero_mask_fill(datas.tensor_A.host_data(), seed + 6); - // Check for failed devide + // Check for failed device CUDA_CHECK_FALSE(cudaGetLastError()); datas.tensor_A.sync_device(); datas.tensor_A_Comp.sync_device(); datas.tensor_E.sync_device(); - // Check for failed devide + // Check for failed device CUDA_CHECK_FALSE(cudaGetLastError()); return true; @@ -376,18 +376,6 @@ public: datas.tensor_A_Comp.sync_host(); datas.tensor_E.sync_host(); - #if 0 - { - printf("\n--> DEVICE OUTPUT\n"); - printf("datas.tensor_A\n"); - std::cout << datas.tensor_A.host_view() << std::endl << std::endl; - printf("datas.tensor_A_Comp\n"); - std::cout << datas.tensor_A_Comp.host_view() << std::endl << std::endl; - printf("datas.tensor_E\n"); - std::cout << datas.tensor_E.host_view() << std::endl << std::endl; - } - #endif - return true; } @@ -816,9 +804,11 @@ public: printf("compare_reference() DEVICE <-> LEGACY HOST fail\n"); return false; } - // else { - // printf("DEVICE <-> HOST PASS\n"); - // } + #if 0 + else { + printf("DEVICE <-> HOST PASS\n"); + } + #endif return true; } diff --git a/tools/library/CMakeLists.txt b/tools/library/CMakeLists.txt index 6358f03a..39676ca4 100644 --- a/tools/library/CMakeLists.txt +++ b/tools/library/CMakeLists.txt @@ -123,6 +123,19 @@ function(cutlass_add_cutlass_library) PRIVATE cutlass_library_internal_interface ) + # Use medium code model to handle large libraries (>2GB) on Linux x86_64 + # Conservative approach: only apply on Linux with GCC/Clang/Intel compilers + # This addresses the "relocation truncated to fit" linker error when libraries exceed 2GB + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND + CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64" AND + CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|IntelLLVM") + message(STATUS "CUTLASS: Applying -mcmodel=medium for large library support (Linux x86_64, ${CMAKE_CXX_COMPILER_ID})") + target_compile_options(${__NAME}_objs PRIVATE + $<$:-mcmodel=medium> + $<$:-Xcompiler=-mcmodel=medium> + ) + endif() + if (CUTLASS_BUILD_MONO_LIBRARY AND __SUFFIX) # If we're only building a single monolithic library then we diff --git a/tools/library/src/reference/gemm_f6_f8_f32.cu b/tools/library/src/reference/gemm_f6_f8_f32.cu index 08bdc5e3..cefea554 100644 --- a/tools/library/src/reference/gemm_f6_f8_f32.cu +++ b/tools/library/src/reference/gemm_f6_f8_f32.cu @@ -56,6 +56,10 @@ namespace library { // 2. e3m2_e4m3_f32_f16_e5m2 // 3. e3m2_e4m3_f32_f16_f16 // 4. e3m2_e4m3_f32_f32_f32 +// 5. e3m2_e5m2_f32_f16_e4m3 +// 6. e3m2_e5m2_f32_f16_e5m2 +// 7. e3m2_e5m2_f32_f16_f16 +// 8. e3m2_e5m2_f32_f32_f32 void initialize_gemm_reference_operations_f6_f8_f32(Manifest &manifest) { @@ -138,6 +142,86 @@ void initialize_gemm_reference_operations_f6_f8_f32(Manifest &manifest) { float, // ElementAccumulator float // ElementD >(manifest); + + // 5. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + half_t, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float_e4m3_t // ElementD + >(manifest); + + // 6. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + half_t, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float_e5m2_t // ElementD + >(manifest); + + // 7. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + half_t, // ElementC + float, // ElementScalar + float, // ElementAccumulator + half_t // ElementD + >(manifest); + + // 8. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + float, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float // ElementD + >(manifest); + + // 5. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + void, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float_e4m3_t // ElementD + >(manifest); + + // 6. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + void, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float_e5m2_t // ElementD + >(manifest); + + // 7. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + void, // ElementC + float, // ElementScalar + float, // ElementAccumulator + half_t // ElementD + >(manifest); + + // 8. + make_gemm_real_canonical_layouts< + float_e3m2_t, // ElementA + float_e5m2_t, // ElementB + void, // ElementC + float, // ElementScalar + float, // ElementAccumulator + float // ElementD + >(manifest); } /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/tools/profiler/include/cutlass/profiler/grouped_gemm_operation_profiler.h b/tools/profiler/include/cutlass/profiler/grouped_gemm_operation_profiler.h index 366133b5..e9582f53 100644 --- a/tools/profiler/include/cutlass/profiler/grouped_gemm_operation_profiler.h +++ b/tools/profiler/include/cutlass/profiler/grouped_gemm_operation_profiler.h @@ -318,8 +318,30 @@ protected: int swizzle_size, bool is_dynamic_cluster_enabled); - /// Verifies CUTLASS against host and device references - bool verify_with_reference_( + /// Verifies CUTLASS against device reference (for regular grouped GEMM) + bool verify_with_device_reference_( + Options const& options, + PerformanceReport& report, + DeviceContext& device_context, + library::Operation const* operation, + ProblemSpace const& problem_space, + ProblemSpace::Problem const& problem, + cutlass::library::NumericTypeID element_A, + cutlass::library::NumericTypeID element_B); + + /// Verifies CUTLASS against host reference (for regular grouped GEMM) + bool verify_regular_with_host_reference_( + Options const& options, + PerformanceReport& report, + DeviceContext& device_context, + library::Operation const* operation, + ProblemSpace const& problem_space, + ProblemSpace::Problem const& problem, + cutlass::library::NumericTypeID element_A, + cutlass::library::NumericTypeID element_B); + + /// Verifies CUTLASS against host reference (for block-scaled/blockwise grouped GEMM) + bool verify_block_with_host_reference_( Options const& options, PerformanceReport& report, DeviceContext& device_context, diff --git a/tools/profiler/src/block_scaled_gemm_operation_profiler.cu b/tools/profiler/src/block_scaled_gemm_operation_profiler.cu index dd3ee072..0fbe84e9 100644 --- a/tools/profiler/src/block_scaled_gemm_operation_profiler.cu +++ b/tools/profiler/src/block_scaled_gemm_operation_profiler.cu @@ -1137,37 +1137,31 @@ bool BlockScaledGemmOperationProfiler::verify_cutlass( } - bool verification_status = verify_with_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B); - - // Update disposition to worst case verification outcome among all - // verification providers which are supported - bool is_any_verification_run_passed = false; - for (auto &m : results_.back().verification_map) { - if (m.second == Disposition::kFailed || m.second == Disposition::kIncorrect) { - results_.back().disposition = m.second; - return true; - } - if (!is_any_verification_run_passed && m.second == Disposition::kPassed) { - is_any_verification_run_passed = true; - } + if (!verify_with_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B)) { + return false; } - if (is_any_verification_run_passed) { - results_.back().disposition = Disposition::kPassed; + // Block-scaled GEMM only supports host verification - check it directly + switch (results_.back().verification_map[library::Provider::kReferenceHost]) { + case Disposition::kFailed: + results_.back().disposition = Disposition::kFailed; + return true; + case Disposition::kIncorrect: + results_.back().disposition = Disposition::kIncorrect; + return true; + case Disposition::kPassed: + results_.back().disposition = Disposition::kPassed; + return true; + default: + break; } } - // if verification.required is set, then return success iff at least one ref-check was run - if (options.verification.required) { - bool did_any_verification_run = false; - for (auto provider : options.verification.providers) { - did_any_verification_run |= (Disposition::kNotRun != results_.back().verification_map[provider]); - } - - if (not did_any_verification_run) { - results_.back().status = Status::kErrorNotSupported; - return false; - } + // if verification.required is set, check if host verification ran (the only supported provider) + if (options.verification.required && + results_.back().verification_map[library::Provider::kReferenceHost] == Disposition::kNotRun) { + results_.back().status = Status::kErrorNotSupported; + return false; } // Return true means continue profiling @@ -1664,3 +1658,4 @@ Status BlockScaledGemmOperationProfiler::profile_cutlass_( } // namespace cutlass ///////////////////////////////////////////////////////////////////////////////////////////////// + diff --git a/tools/profiler/src/blockwise_gemm_operation_profiler.cu b/tools/profiler/src/blockwise_gemm_operation_profiler.cu index 7b52ad7d..910fe54c 100644 --- a/tools/profiler/src/blockwise_gemm_operation_profiler.cu +++ b/tools/profiler/src/blockwise_gemm_operation_profiler.cu @@ -988,37 +988,31 @@ bool BlockwiseGemmOperationProfiler::verify_cutlass( } - bool verification_status = verify_with_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B); - - // Update disposition to worst case verification outcome among all - // verification providers which are supported - bool is_any_verification_run_passed = false; - for (auto &m : results_.back().verification_map) { - if (m.second == Disposition::kFailed || m.second == Disposition::kIncorrect) { - results_.back().disposition = m.second; - return true; - } - if (!is_any_verification_run_passed && m.second == Disposition::kPassed) { - is_any_verification_run_passed = true; - } + if (!verify_with_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B)) { + return false; } - if (is_any_verification_run_passed) { - results_.back().disposition = Disposition::kPassed; + // Blockwise GEMM only supports host verification - check it directly + switch (results_.back().verification_map[library::Provider::kReferenceHost]) { + case Disposition::kFailed: + results_.back().disposition = Disposition::kFailed; + return true; + case Disposition::kIncorrect: + results_.back().disposition = Disposition::kIncorrect; + return true; + case Disposition::kPassed: + results_.back().disposition = Disposition::kPassed; + return true; + default: + break; } } - // if verification.required is set, then return success iff at least one ref-check was run - if (options.verification.required) { - bool did_any_verification_run = false; - for (auto provider : options.verification.providers) { - did_any_verification_run |= (Disposition::kNotRun != results_.back().verification_map[provider]); - } - - if (not did_any_verification_run) { - results_.back().status = Status::kErrorNotSupported; - return false; - } + // if verification.required is set, check if host verification ran (the only supported provider) + if (options.verification.required && + results_.back().verification_map[library::Provider::kReferenceHost] == Disposition::kNotRun) { + results_.back().status = Status::kErrorNotSupported; + return false; } // Return true means continue profiling @@ -1555,3 +1549,4 @@ Status BlockwiseGemmOperationProfiler::profile_cutlass_( } // namespace cutlass ///////////////////////////////////////////////////////////////////////////////////////////////// + diff --git a/tools/profiler/src/grouped_gemm_operation_profiler.cu b/tools/profiler/src/grouped_gemm_operation_profiler.cu index f680bf4c..91beed03 100644 --- a/tools/profiler/src/grouped_gemm_operation_profiler.cu +++ b/tools/profiler/src/grouped_gemm_operation_profiler.cu @@ -109,9 +109,9 @@ GroupedGemmOperationProfiler::GroupedGemmOperationProfiler(Options const& option {"beta", "epilogue::beta"}, "Epilogue scalar beta (applied to all GEMMs in group)."}, {ArgumentTypeID::kEnumerated, {"runtime_input_datatype_a", "runtime-input-datatype::a"}, - "Runtime datatype (e4m3, e5m2, e3m2, e2m3, e2m1)"}, + "Runtime datatype (e4m3, e5m2, e3m2, e2m3, e2m1)"}, {ArgumentTypeID::kEnumerated, {"runtime_input_datatype_b", "runtime-input-datatype::b"}, - "Runtime datatype (e4m3, e5m2, e3m2, e2m3, e2m1)"}, + "Runtime datatype (e4m3, e5m2, e3m2, e2m3, e2m1)"}, {ArgumentTypeID::kEnumerated, {"raster_order", "raster-order"}, "Raster order (heuristic, along_n, along_m)"}, {ArgumentTypeID::kInteger, {"swizzle_size", "swizzle-size"}, "Size to swizzle"}, @@ -198,9 +198,9 @@ Status GroupedGemmOperationProfiler::GroupedGemmProblem::parse( int n0 = 32; int k0 = 64; for (int i = 0; i < num_groups; i++) { - auto m = m0 * (i + 1); + auto m = is_moe ? m0 * num_groups : m0 * (i + 1); auto n = n0 * (i + 1); - auto k = k0 * (i + 1); + auto k = is_moe ? k0 * num_groups : k0 * (i + 1); problem_sizes[i] = {m, n, k}; problem_sizes_3x[i] = {m, n, k}; } @@ -275,7 +275,7 @@ Status GroupedGemmOperationProfiler::GroupedGemmProblem::parse( max_problem_size_3x = {max_m, max_n, max_k}; } if (is_moe) { - for(size_t group_idx = 0; group_idx < problem_sizes.size(); group_idx++) { + for(size_t group_idx = 0; group_idx < problem_sizes.size(); group_idx++) { if (problem_sizes[group_idx].m() != max_problem_size_3x[0] || problem_sizes[group_idx].k() != max_problem_size_3x[2]) { std::cerr << "Problem size M:"<< problem_sizes[group_idx].m() << "K:" << problem_sizes[group_idx].k() << " for group " << group_idx << "should be equal to " @@ -336,7 +336,7 @@ Status GroupedGemmOperationProfiler::GroupedGemmProblem::parse( // default value this->use_pdl = false; } - + if (!arg_as_RuntimeDatatype(this->runtime_input_datatype_a, "runtime_input_datatype_a", problem_space, problem)) { // default value this->runtime_input_datatype_a = cutlass::library::RuntimeDatatype::kStatic; @@ -547,7 +547,7 @@ void GroupedGemmOperationProfiler::GroupedGemmProblem::initialize_result( set_argument(result, "raster_order", problem_space, library::to_string(raster_order)); set_argument(result, "swizzle_size", problem_space, swizzle_size); set_argument(result, "use_pdl", problem_space, library::to_string(use_pdl)); - + set_argument(result, "runtime_input_datatype_a", problem_space, library::to_string(runtime_input_datatype_a)); set_argument(result, "runtime_input_datatype_b", problem_space, library::to_string(runtime_input_datatype_b)); @@ -614,8 +614,8 @@ Status GroupedGemmOperationProfiler::initialize_configuration( std::string sf_tuple = "\\d+x\\d+"; std::string datatypes_regex = "\\w?f\\d+|e\\dm\\d"; // bf16 | f16 | f32 | e4m3 | ... - std::string blockwise_regex_string = sf_tuple + "(" + datatypes_regex + ")x(" + - datatypes_regex + ")_" + sf_tuple + "(" + + std::string blockwise_regex_string = sf_tuple + "(" + datatypes_regex + ")x(" + + datatypes_regex + ")_" + sf_tuple + "(" + datatypes_regex + ")x(" + datatypes_regex + ")"; if (std::string(operation_desc.gemm.name).find("bstensor") != std::string::npos) { @@ -650,7 +650,7 @@ Status GroupedGemmOperationProfiler::initialize_configuration( gemm_workspace_.arguments.swizzle_size = problem_.swizzle_size; gemm_workspace_.arguments.raster_order = problem_.raster_order; - + gemm_workspace_.arguments.runtime_input_datatype_a = problem_.runtime_input_datatype_a; gemm_workspace_.arguments.runtime_input_datatype_b = problem_.runtime_input_datatype_b; @@ -782,7 +782,7 @@ Status GroupedGemmOperationProfiler::initialize_workspace( gemm_workspace_.reference_ptr_array_host.resize(num_groups); int seed_shift = 0; - if (not operation_desc.is_moe) { + if (not operation_desc.is_moe) { for (size_t group_idx = 0; group_idx < num_groups; group_idx++) { auto group_str = std::to_string(group_idx); gemm_workspace_.A_ptr_array_host[group_idx] = device_context.allocate_and_initialize_tensor( @@ -1410,29 +1410,30 @@ bool GroupedGemmOperationProfiler::verify_cutlass( init_arguments(options); library::Operation const* underlying_operation = operation; - results_.back().status = underlying_operation->initialize_with_arguments(&gemm_workspace_.arguments); - if (results_.back().status != Status::kSuccess) { + auto& result = results_.back(); + + result.status = underlying_operation->initialize_with_arguments(&gemm_workspace_.arguments); + if (result.status != Status::kSuccess) { return false; } - results_.back().status = underlying_operation->run( + result.status = underlying_operation->run( &gemm_workspace_.arguments, gemm_workspace_.host_workspace.data(), gemm_workspace_.device_workspace.data()); - if (results_.back().status != Status::kSuccess) { - results_.back().disposition = Disposition::kFailed; + if (result.status != Status::kSuccess) { + result.disposition = Disposition::kFailed; return false; } - cudaError_t result = cudaDeviceSynchronize(); - if (result != cudaSuccess) { - results_.back().disposition = Disposition::kFailed; + if (cudaDeviceSynchronize() != cudaSuccess) { + result.disposition = Disposition::kFailed; return false; } // CUTLASS op ran the but not yet verified against any verification provider - results_.back().disposition = Disposition::kNotVerified; + result.disposition = Disposition::kNotVerified; // // Run verification providers @@ -1443,7 +1444,7 @@ bool GroupedGemmOperationProfiler::verify_cutlass( #if CUTLASS_ENABLE_CUBLAS if (options.verification.provider_enabled(library::Provider::kCUBLAS)) { // set verification map for cublas to not supported - results_.back().verification_map[library::Provider::kCUBLAS] = Disposition::kNotSupported; + result.verification_map[library::Provider::kCUBLAS] = Disposition::kNotSupported; } #endif // #if CUTLASS_ENABLE_CUBLAS @@ -1457,10 +1458,10 @@ bool GroupedGemmOperationProfiler::verify_cutlass( bool is_runtime_datatype_b = runtime_datatype_b != cutlass::library::RuntimeDatatype::kStatic; assert(is_runtime_datatype_a == is_runtime_datatype_b && "runtime datatype should be both dynamic or static."); - + cutlass::library::NumericTypeID element_A = desc.gemm.A.element; cutlass::library::NumericTypeID element_B = desc.gemm.B.element; - + if (is_runtime_datatype_a) { element_A = cutlass::library::dynamic_datatype_to_id(runtime_datatype_a); } @@ -1469,44 +1470,85 @@ bool GroupedGemmOperationProfiler::verify_cutlass( element_B = cutlass::library::dynamic_datatype_to_id(runtime_datatype_b); } - bool verification_status = verify_with_reference_( - options, - report, - device_context, - operation, - problem_space, - problem, - element_A, - element_B); - - // Update disposition to worst case verification outcome among all - // verification providers which are supported - bool is_any_verification_run_passed = false; - for (auto& m : results_.back().verification_map) { - if (m.second == Disposition::kFailed || m.second == Disposition::kIncorrect) { - results_.back().disposition = m.second; - return true; + // Block-scaled and blockwise GEMMs only support host verification - always terminates early + if (is_block_scaled || is_blockwise) { + if (!verify_block_with_host_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B)) { + return false; } - if (!is_any_verification_run_passed && m.second == Disposition::kPassed) { - is_any_verification_run_passed = true; + + switch (result.verification_map[library::Provider::kReferenceHost]) { + case Disposition::kFailed: + result.disposition = Disposition::kFailed; + return true; + case Disposition::kIncorrect: + result.disposition = Disposition::kIncorrect; + return true; + case Disposition::kPassed: + result.disposition = Disposition::kPassed; + return true; + case Disposition::kNotSupported: + result.disposition = Disposition::kNotSupported; + return true; + default: + // verification.required check for block-scaled/blockwise (for kNotRun, kNotVerified, etc.) + if (options.verification.required) { + result.status = Status::kErrorNotSupported; + return false; + } + return true; } } - if (is_any_verification_run_passed) { - results_.back().disposition = Disposition::kPassed; + // Regular grouped GEMM verification flow + + // Step 1: Try device reference if enabled (also run if cuBLAS requested since it's not supported, or as fallback if host not enabled) + if (options.verification.provider_enabled(library::Provider::kReferenceDevice) || + options.verification.provider_enabled(library::Provider::kCUBLAS) || + !options.verification.provider_enabled(library::Provider::kReferenceHost)) { + verify_with_device_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B); + + auto device_it = result.verification_map.find(library::Provider::kReferenceDevice); + if (device_it != result.verification_map.end()) { + if (device_it->second == Disposition::kFailed || device_it->second == Disposition::kIncorrect) { + result.disposition = device_it->second; + return true; + } + if (device_it->second == Disposition::kPassed) { + result.disposition = Disposition::kPassed; + return true; + } } } - // if verification.required is set, then return success iff at least one ref-check was run - if (options.verification.required) { - bool did_any_verification_run = false; - for (auto provider : options.verification.providers) { - did_any_verification_run |= - (Disposition::kNotRun != results_.back().verification_map[provider]); - } + // Step 2: Try host reference if enabled + if (options.verification.provider_enabled(library::Provider::kReferenceHost)) { + verify_regular_with_host_reference_(options, report, device_context, operation, problem_space, problem, element_A, element_B); - if (not did_any_verification_run) { - results_.back().status = Status::kErrorNotSupported; + auto host_it = result.verification_map.find(library::Provider::kReferenceHost); + if (host_it != result.verification_map.end()) { + if (host_it->second == Disposition::kFailed || host_it->second == Disposition::kIncorrect) { + result.disposition = host_it->second; + return true; + } + if (host_it->second == Disposition::kPassed) { + result.disposition = Disposition::kPassed; + return true; + } + } + } + } + + // Step 3: Check verification.required for regular grouped GEMM + if (options.verification.required) { + auto device_it = result.verification_map.find(library::Provider::kReferenceDevice); + auto host_it = result.verification_map.find(library::Provider::kReferenceHost); + + bool did_any_verification_run = + (device_it != result.verification_map.end() && device_it->second != Disposition::kNotRun) || + (host_it != result.verification_map.end() && host_it->second != Disposition::kNotRun); + + if (!did_any_verification_run) { + result.status = Status::kErrorNotSupported; return false; } } @@ -1515,8 +1557,8 @@ bool GroupedGemmOperationProfiler::verify_cutlass( return true; } -/// Verifies CUTLASS against host and device references -bool GroupedGemmOperationProfiler::verify_with_reference_( +/// Verifies CUTLASS against device reference (for regular grouped GEMM) +bool GroupedGemmOperationProfiler::verify_with_device_reference_( Options const& options, PerformanceReport& report, DeviceContext& device_context, @@ -1528,98 +1570,20 @@ bool GroupedGemmOperationProfiler::verify_with_reference_( library::GroupedGemmDescription const& desc = static_cast(operation->description()); - for (auto provider : options.verification.providers) { - - // Skip providers that are not enabled - if (!options.verification.provider_enabled(provider)) { - continue; - } - - // we only have a block scaled reference kernel implemented on the host - if ((is_block_scaled || is_blockwise) && provider != library::Provider::kReferenceHost) { - continue; - } - auto status = Status::kSuccess; auto disposition = Disposition::kFailed; - // we don't have grouped GEMM reference kernels so we loop over the groups and perform - // a regular GEMM for each group + + // Loop over groups and perform a regular GEMM for each group using device reference for (size_t group_idx = 0, num_groups = problem_.problem_sizes.size(); group_idx < num_groups; group_idx++) { + // Use device pointers directly void* ptr_A = gemm_workspace_.A_ptr_array_host[group_idx]->data(); void* ptr_B = gemm_workspace_.B_ptr_array_host[group_idx]->data(); void* ptr_C = gemm_workspace_.C_ptr_array_host[group_idx]->data(); void* ptr_D = gemm_workspace_.reference_ptr_array_host[group_idx]->data(); - // To support the host-side reference, conditionally allocate and - // copy tensors to host memory. - std::vector host_data_A; - std::vector host_data_B; - std::vector host_data_C; - std::vector host_data_D; - std::vector host_data_SFA; - std::vector host_data_SFB; - std::vector host_data_SFC; - std::vector host_data_SFD; - std::vector host_data_norm_constant; - - void* ptr_SFA{nullptr}; - void* ptr_SFB{nullptr}; - void* ptr_SFD{nullptr}; - void* ptr_norm_constant{nullptr}; - - if (provider == library::Provider::kReferenceHost) { - host_data_A.resize(gemm_workspace_.A_ptr_array_host[group_idx]->bytes()); - ptr_A = host_data_A.data(); - gemm_workspace_.A_ptr_array_host[group_idx]->copy_to_host( - ptr_A); // this is copying all the data for L2 busting as well - - host_data_B.resize(gemm_workspace_.B_ptr_array_host[group_idx]->bytes()); - ptr_B = host_data_B.data(); - gemm_workspace_.B_ptr_array_host[group_idx]->copy_to_host(ptr_B); - - host_data_C.resize(gemm_workspace_.C_ptr_array_host[group_idx]->bytes()); - ptr_C = host_data_C.data(); - gemm_workspace_.C_ptr_array_host[group_idx]->copy_to_host(ptr_C); - - host_data_D.resize(gemm_workspace_.reference_ptr_array_host[group_idx]->bytes()); - ptr_D = host_data_D.data(); - - if (is_block_scaled) { - auto const& ws = gemm_workspace_.block_scales.value(); - - host_data_SFA.resize(ws.SFA_ptr_array_host[group_idx]->bytes()); - ptr_SFA = host_data_SFA.data(); - ws.SFA_ptr_array_host[group_idx]->copy_to_host(ptr_SFA); - host_data_SFB.resize(ws.SFB_ptr_array_host[group_idx]->bytes()); - ptr_SFB = host_data_SFB.data(); - ws.SFB_ptr_array_host[group_idx]->copy_to_host(ptr_SFB); - - host_data_SFD.resize(ws.SFD_reference_ptr_array_host[group_idx]->bytes()); - ptr_SFD = host_data_SFD.data(); - - host_data_norm_constant.resize(ws.norm_constant->bytes()); - ptr_norm_constant = host_data_norm_constant.data(); - ws.norm_constant->copy_to_host(ptr_norm_constant); - } - else if (is_blockwise) { - auto const& ws = gemm_workspace_.block_scales.value(); - - host_data_SFA.resize(ws.SFA_ptr_array_host[group_idx]->bytes()); - ptr_SFA = host_data_SFA.data(); - ws.SFA_ptr_array_host[group_idx]->copy_to_host(ptr_SFA); - host_data_SFB.resize(ws.SFB_ptr_array_host[group_idx]->bytes()); - ptr_SFB = host_data_SFB.data(); - ws.SFB_ptr_array_host[group_idx]->copy_to_host(ptr_SFB); - } - } - - const auto &desc = static_cast(operation->description()); - const auto& gemm_desc = desc.gemm; - - if (!is_block_scaled and !is_blockwise) { library::Handle handle; - handle.set_provider(provider); + handle.set_provider(library::Provider::kReferenceDevice); status = handle.gemm_universal( library::GemmUniversalMode::kGemm, @@ -1659,241 +1623,462 @@ bool GroupedGemmOperationProfiler::verify_with_reference_( gemm_workspace_.B_ptr_array_host[group_idx]->batch_stride(), gemm_workspace_.C_ptr_array_host[group_idx]->batch_stride(), gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride()); - } - else if (is_block_scaled) { - auto const& block_scale_desc = desc.block_scales.value(); - auto& block_scale_ws = gemm_workspace_.block_scales.value(); - library::BlockScaledGemmFunctionalKey blockScaledGemm_key( - library::Provider::kReferenceHost, - library::GemmKind::kUniversal, - library::OperationKind::kBlockScaledGemm, - gemm_desc.tile_description.math_instruction.element_accumulator, - gemm_desc.element_epilogue, - element_A, - gemm_desc.A.layout, - block_scale_desc.SFA.element, - element_B, - gemm_desc.B.layout, - block_scale_desc.SFB.element, - gemm_desc.C.element, - gemm_desc.C.layout, - gemm_desc.D.element, - gemm_desc.D.layout, - block_scale_desc.SFD.element, - block_scale_desc.SFD.layout, - block_scale_desc.SFKVecSize, - block_scale_desc.EpilogueSFVecSize); - - auto operators_it = - library::Singleton::get().operation_table.block_scaled_gemm_operations.find( - blockScaledGemm_key); - if ( - operators_it == - library::Singleton::get().operation_table.block_scaled_gemm_operations.end()) { - disposition = Disposition::kNotSupported; + if (status != Status::kSuccess) { break; } - if (operators_it->second.empty()) { - disposition = Disposition::kNotSupported; + disposition = compare_tensors( + options, + *gemm_workspace_.D_ptr_array_host[group_idx], + *gemm_workspace_.reference_ptr_array_host[group_idx], + gemm_workspace_.D_ptr_array_host[group_idx]->batch_stride()); + + if (disposition != Disposition::kPassed) { break; } + } - auto cc_it = operators_it->second.begin(); - if (cc_it == operators_it->second.end()) { - disposition = Disposition::kNotSupported; - break; - } - - // host reference has only one instances in BlockScaledOperationVectorMap - library::Operation const* reference_op = cc_it->second[0]; - library::BlockScaledGemmArguments arguments{ - {int(problem_.m(group_idx)), int(problem_.n(group_idx)), int(problem_.k(group_idx))}, - {int(problem_.cluster_m), int(problem_.cluster_n), int(problem_.cluster_k)}, - {int(problem_.cluster_m_fallback), int(problem_.cluster_n_fallback), int(problem_.cluster_k_fallback)}, - 1, // batch count - ptr_A, - ptr_B, - ptr_SFA, - ptr_SFB, - ptr_C, - ptr_D, - ptr_SFD, - problem_.alpha.data(), - problem_.beta.data(), - library::ScalarPointerMode::kHost, - problem_.lda[group_idx], - problem_.ldb[group_idx], - problem_.ldc[group_idx], - problem_.ldc[group_idx], - gemm_workspace_.A_ptr_array_host[group_idx]->batch_stride(), - gemm_workspace_.B_ptr_array_host[group_idx]->batch_stride(), - gemm_workspace_.C_ptr_array_host[group_idx]->batch_stride(), - gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride(), - ptr_norm_constant}; - - library::GemmUniversalConfiguration configuration{ - library::GemmUniversalMode::kGemm, - problem_.problem_sizes[group_idx], - {problem_.cluster_m, problem_.cluster_n, problem_.cluster_k}, - {problem_.cluster_m_fallback, problem_.cluster_n_fallback, problem_.cluster_k_fallback}, - 1, - problem_.lda[group_idx], - problem_.ldb[group_idx], - problem_.ldc[group_idx], - problem_.ldc[group_idx], - 1, - }; - uint64_t host_workspace_size_needed = reference_op->get_host_workspace_size(&gemm_workspace_.configuration); - std::vector host_workspace(host_workspace_size_needed); - status = reference_op->initialize(&configuration, host_workspace.data()); if (status != Status::kSuccess) { - break; - } - - status = reference_op->run(&arguments, host_workspace.data()); - - block_scale_ws.SFD_reference_ptr_array_host[group_idx]->copy_from_host(ptr_SFD); + results_.back().verification_map[library::Provider::kReferenceDevice] = Disposition::kNotVerified; } else { - // Blockwise - auto const& block_scale_desc = desc.block_scales.value(); - auto& block_scale_ws = gemm_workspace_.block_scales.value(); + results_.back().status = status; + results_.back().verification_map[library::Provider::kReferenceDevice] = disposition; + } - library::BlockwiseGemmFunctionalKey blockwiseGemm_key( - library::Provider::kReferenceHost, - library::GemmKind::kUniversal, - library::OperationKind::kBlockwiseGemm, - gemm_desc.tile_description.math_instruction.element_accumulator, - gemm_desc.element_epilogue, - element_A, - gemm_desc.A.layout, - block_scale_desc.SFA.element, - element_B, - gemm_desc.B.layout, - block_scale_desc.SFB.element, - gemm_desc.C.element, - gemm_desc.C.layout, - gemm_desc.D.element, - gemm_desc.D.layout, - block_scale_desc.SFMVecSize, - block_scale_desc.SFNVecSize, - block_scale_desc.SFKVecSize - ); + if (options.verification.save_workspace == SaveWorkspace::kIncorrect && + results_.back().verification_map[library::Provider::kReferenceDevice] == Disposition::kIncorrect) { + save_workspace(device_context, options, desc, library::Provider::kCUTLASS, library::Provider::kReferenceDevice); + } - auto operators_it = library::Singleton::get().operation_table.blockwise_gemm_operations.find(blockwiseGemm_key); - if ( - operators_it == - library::Singleton::get().operation_table.blockwise_gemm_operations.end()) { - disposition = Disposition::kNotSupported; - break; - } + return true; // continue profiling +} - if (operators_it->second.empty()) { - disposition = Disposition::kNotSupported; - break; - } +///////////////////////////////////////////////////////////////////////////////////////////////// - auto cc_it = operators_it->second.begin(); - if (cc_it == operators_it->second.end()) { - disposition = Disposition::kNotSupported; - break; - } +/// Verifies CUTLASS against host reference (for regular grouped GEMM) +bool GroupedGemmOperationProfiler::verify_regular_with_host_reference_( + Options const& options, + PerformanceReport& report, + DeviceContext& device_context, + library::Operation const* operation, + ProblemSpace const& problem_space, + ProblemSpace::Problem const& problem, + cutlass::library::NumericTypeID element_A, + cutlass::library::NumericTypeID element_B) { + library::GroupedGemmDescription const& desc = + static_cast(operation->description()); - // host reference has only one instances in BlockScaledOperationVectorMap - library::Operation const* reference_op = cc_it->second[0]; + auto status = Status::kSuccess; + auto disposition = Disposition::kFailed; - library::BlockwiseGemmArguments arguments { - {int(problem_.m(group_idx)), int(problem_.n(group_idx)), int(problem_.k(group_idx))}, - {int(problem_.cluster_m), int(problem_.cluster_n), int(problem_.cluster_k)}, - {int(problem_.cluster_m_fallback), int(problem_.cluster_n_fallback), int(problem_.cluster_k_fallback)}, - 1, // batch_count + // Loop over groups and perform a regular GEMM for each group using host reference + for (size_t group_idx = 0, num_groups = problem_.problem_sizes.size(); group_idx < num_groups; + group_idx++) { + // Copy data to host memory + std::vector host_data_A(gemm_workspace_.A_ptr_array_host[group_idx]->bytes()); + std::vector host_data_B(gemm_workspace_.B_ptr_array_host[group_idx]->bytes()); + std::vector host_data_C(gemm_workspace_.C_ptr_array_host[group_idx]->bytes()); + std::vector host_data_D(gemm_workspace_.reference_ptr_array_host[group_idx]->bytes()); + + void* ptr_A = host_data_A.data(); + void* ptr_B = host_data_B.data(); + void* ptr_C = host_data_C.data(); + void* ptr_D = host_data_D.data(); + + gemm_workspace_.A_ptr_array_host[group_idx]->copy_to_host(ptr_A); + gemm_workspace_.B_ptr_array_host[group_idx]->copy_to_host(ptr_B); + gemm_workspace_.C_ptr_array_host[group_idx]->copy_to_host(ptr_C); + + library::Handle handle; + handle.set_provider(library::Provider::kReferenceHost); + + status = handle.gemm_universal( + library::GemmUniversalMode::kGemm, + problem_.m(group_idx), + problem_.n(group_idx), + problem_.k(group_idx), + problem_.cluster_m, + problem_.cluster_n, + problem_.cluster_k, + problem_.cluster_m_fallback, + problem_.cluster_n_fallback, + problem_.cluster_k_fallback, + desc.gemm.tile_description.math_instruction.element_accumulator, + desc.gemm.element_epilogue, + problem_.alpha.data(), + element_A, + desc.gemm.A.layout, + desc.gemm.transform_A, ptr_A, + int(problem_.lda[group_idx]), + element_B, + desc.gemm.B.layout, + desc.gemm.transform_B, ptr_B, - ptr_SFA, - ptr_SFB, + int(problem_.ldb[group_idx]), + problem_.beta.data(), + desc.gemm.C.element, + desc.gemm.C.layout, ptr_C, + int(problem_.ldc[group_idx]), + desc.gemm.D.element, + desc.gemm.D.layout, ptr_D, - problem_.alpha.data(), - problem_.beta.data(), - library::ScalarPointerMode::kHost, - problem_.lda[group_idx], - problem_.ldb[group_idx], - problem_.ldc[group_idx], - problem_.ldc[group_idx], + int(problem_.ldc[group_idx]), + 1, gemm_workspace_.A_ptr_array_host[group_idx]->batch_stride(), gemm_workspace_.B_ptr_array_host[group_idx]->batch_stride(), gemm_workspace_.C_ptr_array_host[group_idx]->batch_stride(), - gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride(), - }; + gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride()); - library::GemmUniversalConfiguration configuration{ - library::GemmUniversalMode::kGemm, - problem_.problem_sizes[group_idx], - {problem_.cluster_m, problem_.cluster_n, problem_.cluster_k}, - {problem_.cluster_m_fallback, problem_.cluster_n_fallback, problem_.cluster_k_fallback}, - 1, - problem_.lda[group_idx], - problem_.ldb[group_idx], - problem_.ldc[group_idx], - problem_.ldc[group_idx], - 1, - }; - uint64_t host_workspace_size_needed = reference_op->get_host_workspace_size(&gemm_workspace_.configuration); - std::vector host_workspace(host_workspace_size_needed); - status = reference_op->initialize(&configuration, host_workspace.data()); if (status != Status::kSuccess) { break; } - status = reference_op->run(&arguments, host_workspace.data()); - } - - if (status != Status::kSuccess) { - break; - } - - if (provider == library::Provider::kReferenceHost) { + // Copy result back to device gemm_workspace_.reference_ptr_array_host[group_idx]->copy_from_host(ptr_D); - } disposition = compare_tensors( options, *gemm_workspace_.D_ptr_array_host[group_idx], *gemm_workspace_.reference_ptr_array_host[group_idx], gemm_workspace_.D_ptr_array_host[group_idx]->batch_stride()); - if (disposition != Disposition::kPassed) { - break; - } - if (is_block_scaled) { - auto& ws = gemm_workspace_.block_scales.value(); - auto const& block_scale_desc = desc.block_scales.value(); - if (block_scale_desc.SFD.element != library::NumericTypeID::kVoid) { - disposition = compare_tensors( - options, - *ws.SFD_ptr_array_host[group_idx], - *ws.SFD_reference_ptr_array_host[group_idx], - ws.SFD_ptr_array_host[group_idx]->batch_stride()); if (disposition != Disposition::kPassed) { break; } } + + if (status != Status::kSuccess) { + results_.back().verification_map[library::Provider::kReferenceHost] = Disposition::kNotVerified; + } + else { + results_.back().status = status; + results_.back().verification_map[library::Provider::kReferenceHost] = disposition; + } + + if (options.verification.save_workspace == SaveWorkspace::kIncorrect && + results_.back().verification_map[library::Provider::kReferenceHost] == Disposition::kIncorrect) { + save_workspace(device_context, options, desc, library::Provider::kCUTLASS, library::Provider::kReferenceHost); + } + + return true; // continue profiling +} + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Verifies CUTLASS against host reference (for block-scaled/blockwise grouped GEMM) +bool GroupedGemmOperationProfiler::verify_block_with_host_reference_( + Options const& options, + PerformanceReport& report, + DeviceContext& device_context, + library::Operation const* operation, + ProblemSpace const& problem_space, + ProblemSpace::Problem const& problem, + cutlass::library::NumericTypeID element_A, + cutlass::library::NumericTypeID element_B) { + library::GroupedGemmDescription const& desc = + static_cast(operation->description()); + + auto status = Status::kSuccess; + auto disposition = Disposition::kFailed; + + // we don't have grouped GEMM reference kernels so we loop over the groups and perform + // a regular GEMM for each group + for (size_t group_idx = 0, num_groups = problem_.problem_sizes.size(); group_idx < num_groups; + group_idx++) { + // To support the host-side reference, allocate and copy tensors to host memory. + std::vector host_data_A; + std::vector host_data_B; + std::vector host_data_C; + std::vector host_data_D; + std::vector host_data_SFA; + std::vector host_data_SFB; + std::vector host_data_SFD; + std::vector host_data_norm_constant; + + host_data_A.resize(gemm_workspace_.A_ptr_array_host[group_idx]->bytes()); + void* ptr_A = host_data_A.data(); + gemm_workspace_.A_ptr_array_host[group_idx]->copy_to_host(ptr_A); + + host_data_B.resize(gemm_workspace_.B_ptr_array_host[group_idx]->bytes()); + void* ptr_B = host_data_B.data(); + gemm_workspace_.B_ptr_array_host[group_idx]->copy_to_host(ptr_B); + + host_data_C.resize(gemm_workspace_.C_ptr_array_host[group_idx]->bytes()); + void* ptr_C = host_data_C.data(); + gemm_workspace_.C_ptr_array_host[group_idx]->copy_to_host(ptr_C); + + host_data_D.resize(gemm_workspace_.reference_ptr_array_host[group_idx]->bytes()); + void* ptr_D = host_data_D.data(); + + void* ptr_SFA{nullptr}; + void* ptr_SFB{nullptr}; + void* ptr_SFD{nullptr}; + void* ptr_norm_constant{nullptr}; + + if (is_block_scaled) { + auto const& ws = gemm_workspace_.block_scales.value(); + + host_data_SFA.resize(ws.SFA_ptr_array_host[group_idx]->bytes()); + ptr_SFA = host_data_SFA.data(); + ws.SFA_ptr_array_host[group_idx]->copy_to_host(ptr_SFA); + host_data_SFB.resize(ws.SFB_ptr_array_host[group_idx]->bytes()); + ptr_SFB = host_data_SFB.data(); + ws.SFB_ptr_array_host[group_idx]->copy_to_host(ptr_SFB); + + host_data_SFD.resize(ws.SFD_reference_ptr_array_host[group_idx]->bytes()); + ptr_SFD = host_data_SFD.data(); + + host_data_norm_constant.resize(ws.norm_constant->bytes()); + ptr_norm_constant = host_data_norm_constant.data(); + ws.norm_constant->copy_to_host(ptr_norm_constant); + } + else if (is_blockwise) { + auto const& ws = gemm_workspace_.block_scales.value(); + + host_data_SFA.resize(ws.SFA_ptr_array_host[group_idx]->bytes()); + ptr_SFA = host_data_SFA.data(); + ws.SFA_ptr_array_host[group_idx]->copy_to_host(ptr_SFA); + host_data_SFB.resize(ws.SFB_ptr_array_host[group_idx]->bytes()); + ptr_SFB = host_data_SFB.data(); + ws.SFB_ptr_array_host[group_idx]->copy_to_host(ptr_SFB); + } + + const auto& gemm_desc = desc.gemm; + + if (is_block_scaled) { + auto const& block_scale_desc = desc.block_scales.value(); + auto& block_scale_ws = gemm_workspace_.block_scales.value(); + + library::BlockScaledGemmFunctionalKey blockScaledGemm_key( + library::Provider::kReferenceHost, + library::GemmKind::kUniversal, + library::OperationKind::kBlockScaledGemm, + gemm_desc.tile_description.math_instruction.element_accumulator, + gemm_desc.element_epilogue, + element_A, + gemm_desc.A.layout, + block_scale_desc.SFA.element, + element_B, + gemm_desc.B.layout, + block_scale_desc.SFB.element, + gemm_desc.C.element, + gemm_desc.C.layout, + gemm_desc.D.element, + gemm_desc.D.layout, + block_scale_desc.SFD.element, + block_scale_desc.SFD.layout, + block_scale_desc.SFKVecSize, + block_scale_desc.EpilogueSFVecSize); + + auto operators_it = + library::Singleton::get().operation_table.block_scaled_gemm_operations.find( + blockScaledGemm_key); + if (operators_it == + library::Singleton::get().operation_table.block_scaled_gemm_operations.end()) { + disposition = Disposition::kNotSupported; + break; + } + + if (operators_it->second.empty()) { + disposition = Disposition::kNotSupported; + break; + } + + auto cc_it = operators_it->second.begin(); + if (cc_it == operators_it->second.end()) { + disposition = Disposition::kNotSupported; + break; + } + + // host reference has only one instances in BlockScaledOperationVectorMap + library::Operation const* reference_op = cc_it->second[0]; + library::BlockScaledGemmArguments arguments{ + {int(problem_.m(group_idx)), int(problem_.n(group_idx)), int(problem_.k(group_idx))}, + {int(problem_.cluster_m), int(problem_.cluster_n), int(problem_.cluster_k)}, + {int(problem_.cluster_m_fallback), int(problem_.cluster_n_fallback), int(problem_.cluster_k_fallback)}, + 1, // batch count + ptr_A, + ptr_B, + ptr_SFA, + ptr_SFB, + ptr_C, + ptr_D, + ptr_SFD, + problem_.alpha.data(), + problem_.beta.data(), + library::ScalarPointerMode::kHost, + problem_.lda[group_idx], + problem_.ldb[group_idx], + problem_.ldc[group_idx], + problem_.ldc[group_idx], + gemm_workspace_.A_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.B_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.C_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride(), + ptr_norm_constant}; + + library::GemmUniversalConfiguration configuration{ + library::GemmUniversalMode::kGemm, + problem_.problem_sizes[group_idx], + {problem_.cluster_m, problem_.cluster_n, problem_.cluster_k}, + {problem_.cluster_m_fallback, problem_.cluster_n_fallback, problem_.cluster_k_fallback}, + 1, + problem_.lda[group_idx], + problem_.ldb[group_idx], + problem_.ldc[group_idx], + problem_.ldc[group_idx], + 1, + }; + uint64_t host_workspace_size_needed = reference_op->get_host_workspace_size(&gemm_workspace_.configuration); + std::vector host_workspace(host_workspace_size_needed); + status = reference_op->initialize(&configuration, host_workspace.data()); + if (status != Status::kSuccess) { + break; + } + + status = reference_op->run(&arguments, host_workspace.data()); + + block_scale_ws.SFD_reference_ptr_array_host[group_idx]->copy_from_host(ptr_SFD); + } + else { + // Blockwise + auto const& block_scale_desc = desc.block_scales.value(); + + library::BlockwiseGemmFunctionalKey blockwiseGemm_key( + library::Provider::kReferenceHost, + library::GemmKind::kUniversal, + library::OperationKind::kBlockwiseGemm, + gemm_desc.tile_description.math_instruction.element_accumulator, + gemm_desc.element_epilogue, + element_A, + gemm_desc.A.layout, + block_scale_desc.SFA.element, + element_B, + gemm_desc.B.layout, + block_scale_desc.SFB.element, + gemm_desc.C.element, + gemm_desc.C.layout, + gemm_desc.D.element, + gemm_desc.D.layout, + block_scale_desc.SFMVecSize, + block_scale_desc.SFNVecSize, + block_scale_desc.SFKVecSize + ); + + auto operators_it = library::Singleton::get().operation_table.blockwise_gemm_operations.find(blockwiseGemm_key); + if (operators_it == + library::Singleton::get().operation_table.blockwise_gemm_operations.end()) { + disposition = Disposition::kNotSupported; + break; + } + + if (operators_it->second.empty()) { + disposition = Disposition::kNotSupported; + break; + } + + auto cc_it = operators_it->second.begin(); + if (cc_it == operators_it->second.end()) { + disposition = Disposition::kNotSupported; + break; + } + + // host reference has only one instances in BlockScaledOperationVectorMap + library::Operation const* reference_op = cc_it->second[0]; + + library::BlockwiseGemmArguments arguments { + {int(problem_.m(group_idx)), int(problem_.n(group_idx)), int(problem_.k(group_idx))}, + {int(problem_.cluster_m), int(problem_.cluster_n), int(problem_.cluster_k)}, + {int(problem_.cluster_m_fallback), int(problem_.cluster_n_fallback), int(problem_.cluster_k_fallback)}, + 1, // batch_count + ptr_A, + ptr_B, + ptr_SFA, + ptr_SFB, + ptr_C, + ptr_D, + problem_.alpha.data(), + problem_.beta.data(), + library::ScalarPointerMode::kHost, + problem_.lda[group_idx], + problem_.ldb[group_idx], + problem_.ldc[group_idx], + problem_.ldc[group_idx], + gemm_workspace_.A_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.B_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.C_ptr_array_host[group_idx]->batch_stride(), + gemm_workspace_.reference_ptr_array_host[group_idx]->batch_stride(), + }; + + library::GemmUniversalConfiguration configuration{ + library::GemmUniversalMode::kGemm, + problem_.problem_sizes[group_idx], + {problem_.cluster_m, problem_.cluster_n, problem_.cluster_k}, + {problem_.cluster_m_fallback, problem_.cluster_n_fallback, problem_.cluster_k_fallback}, + 1, + problem_.lda[group_idx], + problem_.ldb[group_idx], + problem_.ldc[group_idx], + problem_.ldc[group_idx], + 1, + }; + uint64_t host_workspace_size_needed = reference_op->get_host_workspace_size(&gemm_workspace_.configuration); + std::vector host_workspace(host_workspace_size_needed); + status = reference_op->initialize(&configuration, host_workspace.data()); + if (status != Status::kSuccess) { + break; + } + + status = reference_op->run(&arguments, host_workspace.data()); + } + + if (status != Status::kSuccess) { + break; + } + + gemm_workspace_.reference_ptr_array_host[group_idx]->copy_from_host(ptr_D); + + disposition = compare_tensors( + options, + *gemm_workspace_.D_ptr_array_host[group_idx], + *gemm_workspace_.reference_ptr_array_host[group_idx], + gemm_workspace_.D_ptr_array_host[group_idx]->batch_stride()); + if (disposition != Disposition::kPassed) { + break; + } + + if (is_block_scaled) { + auto& ws = gemm_workspace_.block_scales.value(); + auto const& block_scale_desc = desc.block_scales.value(); + if (block_scale_desc.SFD.element != library::NumericTypeID::kVoid) { + disposition = compare_tensors( + options, + *ws.SFD_ptr_array_host[group_idx], + *ws.SFD_reference_ptr_array_host[group_idx], + ws.SFD_ptr_array_host[group_idx]->batch_stride()); + if (disposition != Disposition::kPassed) { + break; + } } } - if (status != Status::kSuccess) { - results_.back().verification_map[provider] = Disposition::kNotVerified; - continue; - } - results_.back().status = status; - results_.back().verification_map[provider] = disposition; + } - if ( - options.verification.save_workspace == SaveWorkspace::kIncorrect && - results_.back().verification_map[provider] == Disposition::kIncorrect) { - save_workspace(device_context, options, desc, library::Provider::kCUTLASS, provider); - } + if (status != Status::kSuccess) { + results_.back().verification_map[library::Provider::kReferenceHost] = Disposition::kNotVerified; + return true; // continue profiling + } + + results_.back().status = status; + results_.back().verification_map[library::Provider::kReferenceHost] = disposition; + + if ( + options.verification.save_workspace == SaveWorkspace::kIncorrect && + disposition == Disposition::kIncorrect) { + save_workspace(device_context, options, desc, library::Provider::kCUTLASS, library::Provider::kReferenceHost); } return true; // continue profiling @@ -1912,7 +2097,7 @@ bool GroupedGemmOperationProfiler::profile( if (options.profiling.provider_enabled(library::Provider::kCUTLASS)) { if (options.profiling.enable_kernel_performance_search) { - std::cerr << "Exhaustive performance search is not available for Grouped GEMMs. " + std::cerr << "Exhaustive performance search is not available for Grouped GEMMs. " << "Please use --enable-best-kernel-for-fixed-shape to profile a specific problem size " << "with --problem-sizes or --problem-sizes-file.\n"; } @@ -1948,6 +2133,14 @@ Status GroupedGemmOperationProfiler::profile_cutlass_( return result.status; } + //For dynamic clusters, we update arguments, hence need to rerun can_implement() + result.status = underlying_operation->can_implement( + &gemm_workspace_.configuration, + &gemm_workspace_.arguments); + if (result.status != Status::kSuccess) { + return result.status; + } + auto func = [&](cudaStream_t stream, int iteration) { // Iterate over copies of the problem in memory int workspace_idx = options.profiling.warmup_iterations + iteration; diff --git a/tools/util/include/cutlass/util/mixed_dtype_utils.hpp b/tools/util/include/cutlass/util/mixed_dtype_utils.hpp index e92e3d90..0b271ec8 100644 --- a/tools/util/include/cutlass/util/mixed_dtype_utils.hpp +++ b/tools/util/include/cutlass/util/mixed_dtype_utils.hpp @@ -35,6 +35,7 @@ #pragma once #include +#include #include "cute/layout.hpp" #include "cute/tensor.hpp" #include "cute/arch/mma_sm90.hpp" @@ -175,21 +176,79 @@ static void dequantize(DequantizedElement* dq_buffer, CUDA_CHECK(cudaStreamSynchronize(stream)); } -template +template class packed_scale_t { public: - static_assert(cute::sizeof_bits_v == 8, - "only 8 bit arithmetic types are supported."); + static_assert( + cute::sizeof_bits_v == 8, + "ElementScale must be a supported 8-bit type."); + CUTLASS_HOST_DEVICE - explicit packed_scale_t(T val) { - if constexpr (!cute::is_unsigned_v) { - // Only pack negative values. The positive values are generated in flight in the mainloop. - storage[0] = pack4(T(float(val) * -8.f), T(float(val) * -7.f), T(float(val) * -6.f), T(float(val) * -5.f)); - storage[1] = pack4(T(float(val) * -4.f), T(float(val) * -3.f), T(float(val) * -2.f), -val); - } - else { - storage[0] = pack4(T(float(val) * 8.f), T(float(val) * 7.f), T(float(val) * 6.f), T(float(val) * 5.f)); - storage[1] = pack4(T(float(val) * 4.f), T(float(val) * 3.f), T(float(val) * 2.f), val); + explicit packed_scale_t(ElementScale val) { + + if constexpr (cutlass::platform::is_floating_point::value || + cute::is_same_v) { + // floating point QuantType needs to be converted to a signed type + // or a floating point ttype + static_assert( + !std::is_unsigned_v || + cutlass::platform::is_floating_point::value || + cute::is_same_v || + cute::is_same_v, + "E2M1 quantization requires ElementScale to be signed or FP8"); + + // E2M1 quantization: Use E2M1 LUT values + storage[0] = pack4( + ElementScale(float(val) * 0.0f), // E2M1: 0b000 => 0.0 + ElementScale(float(val) * (-0.5f)), // E2M1: 0b001 => -0.5 + ElementScale(float(val) * (-1.0f)), // E2M1: 0b010 => -1.0 + ElementScale(float(val) * (-1.5f)) // E2M1: 0b011 => -1.5 + ); + storage[1] = pack4( + ElementScale(float(val) * (-2.0f)), // E2M1: 0b100 => -2.0 + ElementScale(float(val) * (-3.0f)), // E2M1: 0b101 => -3.0 + ElementScale(float(val) * (-4.0f)), // E2M1: 0b110 => -4.0 + ElementScale(float(val) * (-6.0f)) // E2M1: 0b111 => -6.0 + ); + } else if constexpr (!std::is_unsigned_v) { + static_assert( + (std::is_integral_v && std::is_signed_v) || + cute::is_same_v, + "Two's complement LUT requires signed integer QuantType (int4b_t)"); + + // INT4 Two's Complement quantization: Use TC LUT values + storage[0] = pack4( + ElementScale(float(val) * (-8.0f)), // TC: 0b000 => -8 + ElementScale(float(val) * (-7.0f)), // TC: 0b001 => -7 + ElementScale(float(val) * (-6.0f)), // TC: 0b010 => -6 + ElementScale(float(val) * (-5.0f)) // TC: 0b011 => -5 + ); + storage[1] = pack4( + ElementScale(float(val) * (-4.0f)), // TC: 0b100 => -4 + ElementScale(float(val) * (-3.0f)), // TC: 0b101 => -3 + ElementScale(float(val) * (-2.0f)), // TC: 0b110 => -2 + ElementScale(float(val) * (-1.0f)) // TC: 0b111 => -1 + ); + } else { + // Unsigned ElementScale and QuantType: Pack positive LUT values (for UINT4) + static_assert(((std::is_integral_v && std::is_unsigned_v) || + cute::is_same_v) && + std::is_unsigned_v, + "Uint4 LUT requires unsigned QuantType (uint4b_t) and ElementScale"); + + // UINT4 LUT: pack positive LUT values + storage[0] = pack4( + ElementScale(float(val) * 8.0f), + ElementScale(float(val) * 7.0f), + ElementScale(float(val) * 6.0f), + ElementScale(float(val) * 5.0f) + ); + storage[1] = pack4( + ElementScale(float(val) * 4.0f), + ElementScale(float(val) * 3.0f), + ElementScale(float(val) * 2.0f), + ElementScale(float(val) * 1.0f) + ); } } CUTLASS_HOST_DEVICE @@ -230,7 +289,7 @@ private: Storage storage[2] {}; CUTLASS_HOST_DEVICE - static Storage pack4(T c1, T c2, T c3, T c4) { + static Storage pack4(ElementScale c1, ElementScale c2, ElementScale c3, ElementScale c4) { Storage result = 0; result |= (static_cast(reinterpret_cast(c4)) << 24); result |= (static_cast(reinterpret_cast(c3)) << 16); @@ -239,25 +298,25 @@ private: return result; } CUTLASS_HOST_DEVICE - T get() const { + ElementScale get() const { auto stage = static_cast(storage[0] >> 8); #if defined(__CUDA_ARCH__) - return reinterpret_cast(stage); + return reinterpret_cast(stage); #else - T tmp; + ElementScale tmp; std::memcpy(&tmp, &stage, sizeof(Stage)); return tmp; #endif } CUTLASS_HOST_DEVICE - T get(int idx) const { + ElementScale get(int idx) const { Stage stage; if (idx < 4) stage = static_cast(storage[0] >> (8 * idx)); else stage = static_cast(storage[1] >> (8 * idx - 32)); #if defined(__CUDA_ARCH__) - return reinterpret_cast(stage); + return reinterpret_cast(stage); #else - T tmp; + ElementScale tmp; std::memcpy(&tmp, &stage, sizeof(Stage)); return tmp; #endif @@ -301,7 +360,7 @@ static bool unified_encode_int4b(cutlass::int4b_t const *block_in, cutlass::int4 return true; } -template +template static bool pack_scale_fp8(ElementScale const *block_in, cutlass::Array *block_out, const size_t block_size) { std::vector data_in(block_size); std::vector> data_out(block_size); @@ -315,7 +374,7 @@ static bool pack_scale_fp8(ElementScale const *block_in, cutlass::Array tmp(data_in[i]); + cutlass::packed_scale_t tmp(data_in[i]); data_out[i] = reinterpret_cast const&>(tmp); }

    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¾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

    C-vWDbhIu11kxx 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

    &_hI(t)pPeza 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 literal 0 HcmV?d00001 diff --git a/examples/93_blackwell_low_latency_gqa/figures/fmax.png b/examples/93_blackwell_low_latency_gqa/figures/fmax.png new file mode 100644 index 0000000000000000000000000000000000000000..d267829bf81d6b9f8ec7a5e051f9629365ef2620 GIT binary patch literal 633844 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�!`cH37GlwzYvR{`k)BGQ{8 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%0D!lbDgz6kO1z_Y-o=F7%d>>5}1U}b) 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�YH`Zbl~z|TvQ@)h9a>xDRY3K_V9P_O3d^=y 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�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