From f1512bded1934e34f104bf1ac8547e97e24b2fe8 Mon Sep 17 00:00:00 2001 From: goostavz <109190422+goostavz@users.noreply.github.com> Date: Mon, 7 Aug 2023 09:53:04 +0800 Subject: [PATCH 01/34] Initial code merge of Hopper support (#2036) The initial code merge of Nvidia Hopper features support. Please be aware that the code merge is not finished yet and the trouble-shooting is still ongoing. The new hardware features (GMMA, TMA, STMATRIX etc.) and automatic warp-specialization are experimental for now and turned off by default. It is recommended for a trial when version 3.0 is released. The work is contributed by: ben-zhang-609, bealwang, donproc, qliu93, jsh20, allatit23, LyricZhao, ivanyinwz, goostavz & yangjunpro from Nvidia, in cooperation with: ptillet, Jokeren, ThomasRaoux & zahimoud from OpenAI. Co-authored-by: Goostav Zhu --- .github/workflows/integration-tests.yml | 30 +- CMakeLists.txt | 1 + bin/CMakeLists.txt | 3 + bin/RegisterTritonDialects.h | 4 + bin/triton-translate.cpp | 8 +- docs/python-api/triton.language.rst | 1 + include/triton/Analysis/Allocation.h | 13 +- include/triton/Analysis/AxisInfo.h | 2 +- include/triton/Analysis/Utility.h | 11 +- .../Conversion/TritonGPUToLLVM/Passes.td | 4 + .../TritonGPUToLLVM/TritonGPUToLLVMPass.h | 9 +- .../Conversion/TritonToTritonGPU/Passes.h | 1 + .../Conversion/TritonToTritonGPU/Passes.td | 6 + .../TritonToTritonGPU/TritonToTritonGPUPass.h | 6 +- include/triton/Dialect/CMakeLists.txt | 2 + include/triton/Dialect/NVGPU/CMakeLists.txt | 2 + .../triton/Dialect/NVGPU/IR/CMakeLists.txt | 14 + include/triton/Dialect/NVGPU/IR/Dialect.h | 47 + .../triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td | 33 + .../triton/Dialect/NVGPU/IR/NVGPUDialect.td | 40 + include/triton/Dialect/NVGPU/IR/NVGPUOps.td | 380 ++ .../Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h | 41 + include/triton/Dialect/Triton/IR/Dialect.h | 2 + include/triton/Dialect/Triton/IR/TritonOps.td | 3 + .../triton/Dialect/Triton/IR/TritonTypes.td | 2 +- include/triton/Dialect/Triton/IR/Types.h | 2 + .../triton/Dialect/Triton/Transforms/Passes.h | 1 - .../Dialect/TritonGPU/IR/CMakeLists.txt | 4 + include/triton/Dialect/TritonGPU/IR/Dialect.h | 33 +- .../Dialect/TritonGPU/IR/TritonGPUAttrDefs.td | 281 +- .../Dialect/TritonGPU/IR/TritonGPUDialect.td | 21 +- .../Dialect/TritonGPU/IR/TritonGPUOps.td | 124 +- .../Dialect/TritonGPU/IR/TritonGPUTypes.td | 26 + include/triton/Dialect/TritonGPU/IR/Types.h | 10 + .../Dialect/TritonGPU/Transforms/Passes.h | 9 +- .../Dialect/TritonGPU/Transforms/Passes.td | 30 +- .../Transforms/TritonGPUConversion.h | 6 +- .../Dialect/TritonGPU/Transforms/Utility.h | 108 + .../Dialect/TritonNvidiaGPU/CMakeLists.txt | 2 + .../Dialect/TritonNvidiaGPU/IR/CMakeLists.txt | 15 + .../Dialect/TritonNvidiaGPU/IR/Dialect.h | 46 + .../Dialect/TritonNvidiaGPU/IR/Traits.h | 53 + .../IR/TritonNvidiaGPUAttrDefs.td | 29 + .../IR/TritonNvidiaGPUDialect.td | 82 + .../TritonNvidiaGPU/IR/TritonNvidiaGPUOps.td | 386 ++ .../IR/TritonNvidiaGPUTypes.td | 37 + .../triton/Dialect/TritonNvidiaGPU/IR/Types.h | 33 + .../TritonNvidiaGPU/Transforms/CMakeLists.txt | 3 + .../TritonNvidiaGPU/Transforms/Passes.h | 81 + .../TritonNvidiaGPU/Transforms/Passes.td | 228 + .../TritonNvidiaGPU/Transforms/Utility.h | 95 + .../triton/Target/AMDGCN/AMDGCNTranslation.h | 19 + .../triton/Target/LLVMIR/LLVMIRTranslation.h | 5 + include/triton/Target/PTX/TmaMetadata.h | 107 + include/triton/Tools/Sys/GetEnv.hpp | 9 +- lib/Analysis/Alias.cpp | 11 +- lib/Analysis/Allocation.cpp | 108 +- lib/Analysis/CMakeLists.txt | 1 + lib/Analysis/Membar.cpp | 27 +- lib/Analysis/Utility.cpp | 175 +- lib/CMakeLists.txt | 1 + .../TritonGPUToLLVM/BarrierOpToLLVM.cpp | 217 + .../TritonGPUToLLVM/BarrierOpToLLVM.h | 37 + lib/Conversion/TritonGPUToLLVM/CMakeLists.txt | 20 +- .../TritonGPUToLLVM/ClusterOpsToLLVM.cpp | 62 + .../TritonGPUToLLVM/ClusterOpsToLLVM.h | 37 + .../TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp | 354 +- .../TritonGPUToLLVM/ConvertLayoutOpToLLVM.h | 1 + .../SharedToDotOperandFMA.cpp | 55 +- .../SharedToDotOperandMMAv2.cpp | 2 +- .../TritonGPUToLLVM/DotOpToLLVM.cpp | 81 +- lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.h | 3 +- .../TritonGPUToLLVM/DotOpToLLVM/FMA.cpp | 42 +- .../TritonGPUToLLVM/DotOpToLLVM/MMAv2.cpp | 11 +- .../TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp | 391 ++ .../TritonGPUToLLVM/ElementwiseOpToLLVM.cpp | 168 +- .../TritonGPUToLLVM/ElementwiseOpToLLVM.h | 7 +- .../TritonGPUToLLVM/LoadStoreOpToLLVM.cpp | 636 ++- .../TritonGPUToLLVM/LoadStoreOpToLLVM.h | 6 +- .../TritonGPUToLLVM/ReduceOpToLLVM.cpp | 435 +- .../TritonGPUToLLVM/ReduceOpToLLVM.h | 3 +- .../TritonGPUToLLVM/RegReallocOpToLLVM.cpp | 43 + .../TritonGPUToLLVM/RegReallocOpToLLVM.h | 14 + .../TritonGPUToLLVM/ScanOpToLLVM.cpp | 1 + lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.h | 1 + .../TritonGPUToLLVM/TensorPtrOpsToLLVM.cpp | 104 + .../TritonGPUToLLVM/TensorPtrOpsToLLVM.h | 37 + .../TritonGPUToLLVM/TritonGPUToLLVM.cpp | 123 +- .../TritonGPUToLLVM/TritonGPUToLLVM.h | 1 + .../TritonGPUToLLVM/TritonGPUToLLVMBase.h | 383 +- .../TritonGPUToLLVM/TritonGPUToLLVMPass.cpp | 264 +- .../TritonGPUToLLVM/TypeConverter.cpp | 22 +- lib/Conversion/TritonGPUToLLVM/Utility.cpp | 96 +- lib/Conversion/TritonGPUToLLVM/Utility.h | 42 +- .../TritonGPUToLLVM/ViewOpToLLVM.cpp | 7 +- lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.h | 4 +- .../TritonToTritonGPUPass.cpp | 77 +- lib/Dialect/CMakeLists.txt | 2 + lib/Dialect/NVGPU/CMakeLists.txt | 2 + lib/Dialect/NVGPU/IR/CMakeLists.txt | 9 + lib/Dialect/NVGPU/IR/Dialect.cpp | 108 + lib/Dialect/NVGPU/ToLLVMIR/CMakeLists.txt | 17 + lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp | 803 ++++ lib/Dialect/Triton/IR/Dialect.cpp | 1 + lib/Dialect/Triton/IR/Traits.cpp | 25 +- lib/Dialect/Triton/IR/Types.cpp | 15 +- .../Transforms/RewriteTensorPointer.cpp | 8 +- lib/Dialect/TritonGPU/IR/CMakeLists.txt | 1 + lib/Dialect/TritonGPU/IR/Dialect.cpp | 527 ++- lib/Dialect/TritonGPU/IR/Types.cpp | 38 + .../TritonGPU/Transforms/AccelerateMatmul.cpp | 231 +- .../TritonGPU/Transforms/CMakeLists.txt | 3 + lib/Dialect/TritonGPU/Transforms/Coalesce.cpp | 166 +- .../Transforms/DecomposeConversions.cpp | 4 +- .../Transforms/OptimizeDotOperands.cpp | 83 +- .../TritonGPU/Transforms/OptimizeEpilogue.cpp | 138 + lib/Dialect/TritonGPU/Transforms/Pipeline.cpp | 1059 ++++- .../Transforms/RemoveLayoutConversions.cpp | 63 +- .../Transforms/TritonGPUConversion.cpp | 24 +- lib/Dialect/TritonGPU/Transforms/Utility.cpp | 421 +- lib/Dialect/TritonNvidiaGPU/CMakeLists.txt | 2 + lib/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt | 14 + lib/Dialect/TritonNvidiaGPU/IR/Dialect.cpp | 69 + lib/Dialect/TritonNvidiaGPU/IR/Ops.cpp | 84 + lib/Dialect/TritonNvidiaGPU/IR/Traits.cpp | 36 + lib/Dialect/TritonNvidiaGPU/IR/Types.cpp | 43 + .../TritonNvidiaGPU/Transforms/CMakeLists.txt | 22 + .../Transforms/FenceInsertion.cpp | 73 + .../Transforms/MaterializeLoadStore.cpp | 187 + .../TritonNvidiaGPU/Transforms/PlanCTA.cpp | 1013 ++++ .../Transforms/RewriteTensorPointer.cpp | 752 +++ .../TritonNvidiaGPU/Transforms/Utility.cpp | 542 +++ .../Transforms/WSDecomposing.cpp | 260 ++ .../Transforms/WSFeasibilityChecking.cpp | 64 + .../Transforms/WSMaterialization.cpp | 764 ++++ .../TritonNvidiaGPU/Transforms/WSMutex.cpp | 315 ++ .../TritonNvidiaGPU/Transforms/WSPipeline.cpp | 953 ++++ lib/Hopper/CMakeLists.txt | 24 + lib/Hopper/HopperHelpers.c | 512 +++ lib/Target/LLVMIR/CMakeLists.txt | 6 + lib/Target/LLVMIR/LLVMIRTranslation.cpp | 12 +- lib/Target/PTX/CMakeLists.txt | 5 + lib/Target/PTX/PTXTranslation.cpp | 28 + python/setup.py | 21 +- python/src/triton.cc | 141 +- python/test/regression/test_performance.py | 2 +- python/test/unit/hopper/__init__.py | 0 .../test/unit/hopper/test_flashattention.py | 480 ++ python/test/unit/hopper/test_gemm.py | 469 ++ python/test/unit/hopper/test_gemm_fusion.py | 166 + python/test/unit/hopper/test_mixed_io.py | 89 + ...istent_warp_specialized_fused-attention.py | 395 ++ .../test_persistent_warp_specialized_gemm.py | 987 ++++ .../test/unit/hopper/test_tma_store_gemm.py | 123 + .../test/unit/hopper/ttgir_tests/test_tma.py | 75 + .../test/unit/hopper/ttgir_tests/test_util.py | 52 + .../ttgir_tests/wgmma_64_64_16_f16_NT.ttgir | 52 + .../ttgir_tests/wgmma_64_64_16_f16_TN.ttgir | 52 + .../wgmma_a_ldgsts_64_64_16_f16.ttgir | 59 + ...wgmma_a_ldgsts_mbarrier_64_64_16_f16.ttgir | 63 + .../wgmma_ldgsts_64_64_16_f16.ttgir | 63 + .../wgmma_ldgsts_mbarrier_64_64_16_f16.ttgir | 67 + ...mma_ldgsts_mbarrier_vec_64_64_16_f16.ttgir | 69 + .../ttgir_tests/wgmma_tma_64_64_16_f16.ttgir | 64 + python/test/unit/hopper/utils.py | 32 + python/test/unit/language/test_core.py | 419 +- .../unit/operators/test_flash_attention.py | 7 + python/test/unit/operators/test_matmul.py | 9 +- python/test/unit/runtime/test_cache.py | 5 +- python/test/unit/runtime/test_launch.py | 2 +- python/test/unit/runtime/test_subproc.py | 8 +- python/test/unit/tools/test_aot.py | 2 +- python/triton/compiler/code_generator.py | 20 +- python/triton/compiler/compiler.py | 160 +- python/triton/compiler/make_launcher.py | 57 +- python/triton/compiler/utils.py | 297 ++ python/triton/hopper_lib/libhopper_helpers.bc | Bin 0 -> 11976 bytes python/triton/language/semantic.py | 2 +- python/triton/ops/blocksparse/matmul.py | 4 +- python/triton/ops/matmul.py | 5 +- python/triton/runtime/autotuner.py | 42 +- python/triton/runtime/backends/cuda.c | 280 ++ python/triton/runtime/driver.py | 9 + python/triton/runtime/jit.py | 82 +- python/triton/testing.py | 23 +- python/triton/third_party/cuda/include/cuda.h | 4071 ++++++++++++++--- python/tutorials/05-layer-norm.py | 16 +- ...-experimental-tma-matrix-multiplication.py | 188 + ...perimental-tmastg-matrix-multiplication.py | 191 + test/Analysis/test-alias.mlir | 24 + test/Analysis/test-allocation.mlir | 137 +- test/Analysis/test-membar.mlir | 50 +- test/Conversion/triton_ops.mlir | 18 +- test/Conversion/triton_to_tritongpu.mlir | 10 +- test/Conversion/tritongpu_to_llvm.mlir | 453 +- test/Conversion/tritongpu_to_llvm_hopper.mlir | 80 + test/NVGPU/test_cga.mlir | 33 + test/NVGPU/test_mbarrier.mlir | 19 + test/NVGPU/test_tma.mlir | 47 + test/NVGPU/test_wgmma.mlir | 16 + test/Triton/reorder-broadcast.mlir | 4 +- test/Triton/rewrite-tensor-pointer.mlir | 83 - test/TritonGPU/coalesce.mlir | 36 +- test/TritonGPU/combine.mlir | 109 +- test/TritonGPU/dot-operands.mlir | 12 +- test/TritonGPU/loop-pipeline-hopper.mlir | 305 ++ test/TritonGPU/loop-pipeline.mlir | 58 +- test/TritonGPU/materialize-load-store.mlir | 63 + test/TritonGPU/rewrite-tensor-pointer.mlir | 64 + test/TritonGPU/wsdecomposing.mlir | 754 +++ test/TritonGPU/wsmaterialization.mlir | 414 ++ test/TritonGPU/wsmutex.mlir | 166 + test/TritonGPU/wspipeline.mlir | 148 + .../ws-feasibility-checking.mlir | 896 ++++ .../Conversion/TritonGPUToLLVM/CMakeLists.txt | 6 + .../Conversion/TritonGPUToLLVM/DumpLayout.cpp | 383 ++ .../Conversion/TritonGPUToLLVM/DumpLayout.h | 43 + .../TritonGPUToLLVM/EmitIndicesTest.cpp | 677 +++ unittest/Dialect/TritonGPU/CMakeLists.txt | 2 +- unittest/Dialect/TritonGPU/SwizzleTest.cpp | 11 +- 220 files changed, 28441 insertions(+), 2288 deletions(-) create mode 100644 include/triton/Dialect/NVGPU/CMakeLists.txt create mode 100644 include/triton/Dialect/NVGPU/IR/CMakeLists.txt create mode 100644 include/triton/Dialect/NVGPU/IR/Dialect.h create mode 100644 include/triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td create mode 100644 include/triton/Dialect/NVGPU/IR/NVGPUDialect.td create mode 100644 include/triton/Dialect/NVGPU/IR/NVGPUOps.td create mode 100644 include/triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h create mode 100644 include/triton/Dialect/TritonGPU/IR/TritonGPUTypes.td create mode 100644 include/triton/Dialect/TritonGPU/IR/Types.h create mode 100644 include/triton/Dialect/TritonNvidiaGPU/CMakeLists.txt create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/Dialect.h create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/Traits.h create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.td create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUOps.td create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td create mode 100644 include/triton/Dialect/TritonNvidiaGPU/IR/Types.h create mode 100644 include/triton/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt create mode 100644 include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h create mode 100644 include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.td create mode 100644 include/triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h create mode 100644 include/triton/Target/AMDGCN/AMDGCNTranslation.h create mode 100644 include/triton/Target/PTX/TmaMetadata.h create mode 100644 lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.cpp create mode 100644 lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.h create mode 100644 lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.cpp create mode 100644 lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.h create mode 100644 lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp create mode 100644 lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.cpp create mode 100644 lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.h create mode 100644 lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.cpp create mode 100644 lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.h create mode 100644 lib/Dialect/NVGPU/CMakeLists.txt create mode 100644 lib/Dialect/NVGPU/IR/CMakeLists.txt create mode 100644 lib/Dialect/NVGPU/IR/Dialect.cpp create mode 100644 lib/Dialect/NVGPU/ToLLVMIR/CMakeLists.txt create mode 100644 lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp create mode 100644 lib/Dialect/TritonGPU/IR/Types.cpp create mode 100644 lib/Dialect/TritonGPU/Transforms/OptimizeEpilogue.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/CMakeLists.txt create mode 100644 lib/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt create mode 100644 lib/Dialect/TritonNvidiaGPU/IR/Dialect.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/IR/Ops.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/IR/Traits.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/IR/Types.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/FenceInsertion.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/MaterializeLoadStore.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/PlanCTA.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/RewriteTensorPointer.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/Utility.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/WSDecomposing.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/WSFeasibilityChecking.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/WSMutex.cpp create mode 100644 lib/Dialect/TritonNvidiaGPU/Transforms/WSPipeline.cpp create mode 100644 lib/Hopper/CMakeLists.txt create mode 100644 lib/Hopper/HopperHelpers.c create mode 100644 python/test/unit/hopper/__init__.py create mode 100644 python/test/unit/hopper/test_flashattention.py create mode 100644 python/test/unit/hopper/test_gemm.py create mode 100644 python/test/unit/hopper/test_gemm_fusion.py create mode 100644 python/test/unit/hopper/test_mixed_io.py create mode 100644 python/test/unit/hopper/test_persistent_warp_specialized_fused-attention.py create mode 100644 python/test/unit/hopper/test_persistent_warp_specialized_gemm.py create mode 100644 python/test/unit/hopper/test_tma_store_gemm.py create mode 100644 python/test/unit/hopper/ttgir_tests/test_tma.py create mode 100644 python/test/unit/hopper/ttgir_tests/test_util.py create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_NT.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_TN.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_mbarrier_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_vec_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/ttgir_tests/wgmma_tma_64_64_16_f16.ttgir create mode 100644 python/test/unit/hopper/utils.py create mode 100644 python/triton/compiler/utils.py create mode 100644 python/triton/hopper_lib/libhopper_helpers.bc create mode 100644 python/tutorials/09-experimental-tma-matrix-multiplication.py create mode 100644 python/tutorials/10-experimental-tmastg-matrix-multiplication.py create mode 100644 test/Conversion/tritongpu_to_llvm_hopper.mlir create mode 100644 test/NVGPU/test_cga.mlir create mode 100644 test/NVGPU/test_mbarrier.mlir create mode 100644 test/NVGPU/test_tma.mlir create mode 100644 test/NVGPU/test_wgmma.mlir delete mode 100644 test/Triton/rewrite-tensor-pointer.mlir create mode 100644 test/TritonGPU/loop-pipeline-hopper.mlir create mode 100644 test/TritonGPU/materialize-load-store.mlir create mode 100644 test/TritonGPU/rewrite-tensor-pointer.mlir create mode 100644 test/TritonGPU/wsdecomposing.mlir create mode 100644 test/TritonGPU/wsmaterialization.mlir create mode 100644 test/TritonGPU/wsmutex.mlir create mode 100644 test/TritonGPU/wspipeline.mlir create mode 100644 test/TritonNvidiaGPU/ws-feasibility-checking.mlir create mode 100644 unittest/Conversion/TritonGPUToLLVM/DumpLayout.cpp create mode 100644 unittest/Conversion/TritonGPUToLLVM/DumpLayout.h create mode 100644 unittest/Conversion/TritonGPUToLLVM/EmitIndicesTest.cpp diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index c44737a312af..0247db53f1be 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -50,6 +50,8 @@ jobs: if: ${{(matrix.runner[0] == 'self-hosted') && (matrix.runner[1] == 'V100' || matrix.runner[1] == 'A100' || matrix.runner[1] == 'H100')}} run: | echo "BACKEND=CUDA" >> "${GITHUB_ENV}" + echo "ENABLE_TMA=0" >> "${GITHUB_ENV}" + echo "ENABLE_MMA_V3=0" >> "${GITHUB_ENV}" - name: Clear cache run: | @@ -79,8 +81,32 @@ jobs: fi lit -v "${LIT_TEST_DIR}" - - name: Run python tests on CUDA - if: ${{ env.BACKEND == 'CUDA'}} + - name: Enable MMAV3 and TMA + if: ${{(matrix.runner[0] == 'self-hosted') && (matrix.runner[1] == 'H100')}} + run: | + echo "ENABLE_TMA=1" >> "${GITHUB_ENV}" + echo "ENABLE_MMA_V3=1" >> "${GITHUB_ENV}" + + - name: Run python tests on CUDA with ENABLE_TMA=1 and ENABLE_MMA_V3=1 + if: ${{ env.BACKEND == 'CUDA' && env.ENABLE_TMA == '1' && env.ENABLE_MMA_V3 == '1'}} + run: | + cd python/test/unit + python3 -m pytest -n 8 --ignore=runtime + # run runtime tests serially to avoid race condition with cache handling. + python3 -m pytest runtime/ + + - name: Disable MMAV3 and TMA + if: ${{(matrix.runner[0] == 'self-hosted') && (matrix.runner[1] == 'H100')}} + run: | + echo "ENABLE_TMA=0" >> "${GITHUB_ENV}" + echo "ENABLE_MMA_V3=0" >> "${GITHUB_ENV}" + + - name: Clear cache + run: | + rm -rf ~/.triton + + - name: Run python tests on CUDA with ENABLE_TMA=0 and ENABLE_MMA_V3=0 + if: ${{ env.BACKEND == 'CUDA' && env.ENABLE_TMA == '0' && env.ENABLE_MMA_V3 == '0'}} run: | cd python/test/unit python3 -m pytest -n 8 --ignore=runtime diff --git a/CMakeLists.txt b/CMakeLists.txt index 82df055a85bb..7dd62d1a3dea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ if(TRITON_BUILD_PYTHON_MODULE) TritonAnalysis TritonTransforms TritonGPUTransforms + TritonNvidiaGPUTransforms TritonLLVMIR TritonPTX TritonHSACO diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 30f26b8ae18e..a8966c5e77f4 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -9,6 +9,7 @@ target_link_libraries(triton-opt PRIVATE TritonAnalysis TritonTransforms TritonGPUTransforms + TritonNvidiaGPUTransforms ${dialect_libs} ${conversion_libs} # tests @@ -29,6 +30,7 @@ target_link_libraries(triton-reduce PRIVATE TritonAnalysis TritonTransforms TritonGPUTransforms + TritonNvidiaGPUTransforms ${dialect_libs} ${conversion_libs} # tests @@ -48,6 +50,7 @@ llvm_update_compile_flags(triton-translate) TritonAnalysis TritonTransforms TritonGPUTransforms + TritonNvidiaGPUTransforms TritonLLVMIR TritonPTX TritonHSACO diff --git a/bin/RegisterTritonDialects.h b/bin/RegisterTritonDialects.h index 8083cb49f1c9..0060e20b695f 100644 --- a/bin/RegisterTritonDialects.h +++ b/bin/RegisterTritonDialects.h @@ -1,9 +1,11 @@ #pragma once #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include "triton/Dialect/Triton/Transforms/Passes.h" #include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" #include "triton/Conversion/TritonGPUToLLVM/Passes.h" #include "triton/Conversion/TritonToTritonGPU/Passes.h" @@ -23,6 +25,7 @@ inline void registerTritonDialects(mlir::DialectRegistry ®istry) { mlir::registerAllPasses(); mlir::registerTritonPasses(); mlir::registerTritonGPUPasses(); + mlir::registerTritonNvidiaGPUPasses(); mlir::test::registerTestAliasPass(); mlir::test::registerTestAlignmentPass(); mlir::test::registerTestAllocationPass(); @@ -32,6 +35,7 @@ inline void registerTritonDialects(mlir::DialectRegistry ®istry) { // TODO: register Triton & TritonGPU passes registry.insert(); diff --git a/bin/triton-translate.cpp b/bin/triton-translate.cpp index 3dd1d59a81f8..b29ec16645f9 100644 --- a/bin/triton-translate.cpp +++ b/bin/triton-translate.cpp @@ -14,6 +14,7 @@ #include "triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h" #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include "triton/Target/HSACO/HSACOTranslation.h" #include "triton/Target/LLVMIR/LLVMIRTranslation.h" #include "triton/Target/PTX/PTXTranslation.h" @@ -38,6 +39,7 @@ OwningOpRef loadMLIRModule(llvm::StringRef inputFilename, mlir::DialectRegistry registry; registry .insert(); context.appendDialectRegistry(registry); @@ -121,8 +123,10 @@ LogicalResult tritonTranslateMain(int argc, char **argv, } llvm::LLVMContext llvmContext; - auto llvmir = translateTritonGPUToLLVMIR(&llvmContext, *module, - SMArch.getValue(), false /*isRocm*/); + mlir::triton::gpu::TMAMetadataTy tmaInfos; + auto llvmir = translateTritonGPUToLLVMIR( + &llvmContext, *module, SMArch.getValue(), tmaInfos, false /*isRocm*/); + if (!llvmir) { llvm::errs() << "Translate to LLVM IR failed"; } diff --git a/docs/python-api/triton.language.rst b/docs/python-api/triton.language.rst index ab4fd115fb56..410d02faba74 100644 --- a/docs/python-api/triton.language.rst +++ b/docs/python-api/triton.language.rst @@ -192,3 +192,4 @@ Iterators :nosignatures: static_range + multiple_of diff --git a/include/triton/Analysis/Allocation.h b/include/triton/Analysis/Allocation.h index 9b9d9dace72f..6370eba55b32 100644 --- a/include/triton/Analysis/Allocation.h +++ b/include/triton/Analysis/Allocation.h @@ -9,6 +9,7 @@ #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include #include @@ -147,17 +148,17 @@ class Allocation { BufferKind kind; BufferId id; size_t size; + size_t alignment; size_t offset; bool operator==(const BufferT &other) const { return id == other.id; } bool operator<(const BufferT &other) const { return id < other.id; } - BufferT() : BufferT(BufferKind::Explicit) {} - BufferT(BufferKind kind) - : kind(kind), id(InvalidBufferId), size(0), offset(0) {} - BufferT(BufferKind kind, size_t size) : BufferT(kind, size, 0) {} - BufferT(BufferKind kind, size_t size, size_t offset) - : kind(kind), id(nextId++), size(size), offset(offset) {} + BufferT() : BufferT(BufferKind::Explicit, 0) {} + BufferT(BufferKind kind, size_t size, size_t alignment = 4, + size_t offset = 0) + : kind(kind), id(nextId++), size(size), alignment(alignment), + offset(offset) {} }; /// Op -> Scratch Buffer diff --git a/include/triton/Analysis/AxisInfo.h b/include/triton/Analysis/AxisInfo.h index af5b04ad2781..8d28f46aab1d 100644 --- a/include/triton/Analysis/AxisInfo.h +++ b/include/triton/Analysis/AxisInfo.h @@ -21,7 +21,7 @@ namespace mlir { /// This lattice value represents known information on the axes of a lattice. class AxisInfo { public: - typedef SmallVector DimVectorT; + typedef SmallVector DimVectorT; public: /// Default constructor diff --git a/include/triton/Analysis/Utility.h b/include/triton/Analysis/Utility.h index c5cf3fee63a5..4b6dad26cde3 100644 --- a/include/triton/Analysis/Utility.h +++ b/include/triton/Analysis/Utility.h @@ -3,6 +3,7 @@ #include "mlir/Analysis/DataFlowFramework.h" #include "mlir/Analysis/SliceAnalysis.h" +#include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include #include @@ -121,7 +122,11 @@ bool isSingleValue(Value value); bool isMmaToDotShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy); -Type getElementType(Value value); +bool isMmaToMmaShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy); + +// TODO: Move utility functions that belong to ConvertLayoutOp to class +// ConvertLayoutOpHelper in the future +bool shouldUseDistSmem(Attribute srcLayout, Attribute dstLayout); template inline SmallVector convertType(ArrayRef in) { @@ -324,6 +329,10 @@ template class CallGraph { FuncDataMapT funcMap; SmallVector roots; }; +// Create a basic DataFlowSolver with constant and dead code analysis included. +std::unique_ptr createDataFlowSolver(); + +triton::MakeTensorPtrOp getMakeTensorPtrOp(Value v); } // namespace mlir diff --git a/include/triton/Conversion/TritonGPUToLLVM/Passes.td b/include/triton/Conversion/TritonGPUToLLVM/Passes.td index 47873f114be6..3380360d0e4d 100644 --- a/include/triton/Conversion/TritonGPUToLLVM/Passes.td +++ b/include/triton/Conversion/TritonGPUToLLVM/Passes.td @@ -19,6 +19,7 @@ def ConvertTritonGPUToLLVM : Pass<"convert-triton-gpu-to-llvm", "mlir::ModuleOp" "mlir::tensor::TensorDialect", "mlir::triton::TritonDialect", "mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", "mlir::ROCDL::ROCDLDialect", "mlir::NVVM::NVVMDialect"]; @@ -26,6 +27,9 @@ def ConvertTritonGPUToLLVM : Pass<"convert-triton-gpu-to-llvm", "mlir::ModuleOp" Option<"computeCapability", "compute-capability", "int32_t", /*default*/"80", "device compute capability">, + Option<"TmaMetadata", "tma-metadata", + "mlir::triton::gpu::TMAMetadataTy*", /*default*/"nullptr", + "tma metadata to the runtime">, Option<"isROCM", "is-rocm", "bool", /*default*/"false", "compile for ROCM-compatible LLVM">, diff --git a/include/triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h b/include/triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h index 4e7ad0f40417..e1e1bf2978cb 100644 --- a/include/triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h +++ b/include/triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h @@ -3,6 +3,8 @@ #include "mlir/Conversion/LLVMCommon/TypeConverter.h" #include "mlir/Transforms/DialectConversion.h" +#include "triton/Target/PTX/TmaMetadata.h" + #include namespace mlir { @@ -12,9 +14,10 @@ template class OperationPass; namespace triton { -std::unique_ptr> -createConvertTritonGPUToLLVMPass(int computeCapability = 80, - bool isROCM = false); +std::unique_ptr> createConvertTritonGPUToLLVMPass( + int computeCapability = 80, + mlir::triton::gpu::TMAMetadataTy *tmaMetadata = nullptr, + bool isROCM = false); } // namespace triton diff --git a/include/triton/Conversion/TritonToTritonGPU/Passes.h b/include/triton/Conversion/TritonToTritonGPU/Passes.h index e159406b3ed4..cb11537c53af 100644 --- a/include/triton/Conversion/TritonToTritonGPU/Passes.h +++ b/include/triton/Conversion/TritonToTritonGPU/Passes.h @@ -2,6 +2,7 @@ #define TRITON_CONVERSION_PASSES_H #include "triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h" +#include "triton/Target/PTX/TmaMetadata.h" namespace mlir { namespace triton { diff --git a/include/triton/Conversion/TritonToTritonGPU/Passes.td b/include/triton/Conversion/TritonToTritonGPU/Passes.td index 16b376b71372..4ca495130efa 100644 --- a/include/triton/Conversion/TritonToTritonGPU/Passes.td +++ b/include/triton/Conversion/TritonToTritonGPU/Passes.td @@ -25,6 +25,12 @@ def ConvertTritonToTritonGPU: Pass<"convert-triton-to-tritongpu", "mlir::ModuleO Option<"threadsPerWarp", "threads-per-warp", "int32_t", /*default*/"32", "number of threads per warp">, + Option<"numCTAs", "num-ctas", + "int32_t", /*default*/"1", + "number of ctas in a cga">, + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "compute capability"> ]; } diff --git a/include/triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h b/include/triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h index 07e7178cce0b..9ed7fcad27d5 100644 --- a/include/triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h +++ b/include/triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h @@ -11,6 +11,9 @@ template class OperationPass; namespace triton { constexpr static char AttrNumWarpsName[] = "triton_gpu.num-warps"; +constexpr static char AttrNumCTAsName[] = "triton_gpu.num-ctas"; +constexpr static char AttrComputeCapabilityName[] = + "triton_gpu.compute-capability"; constexpr static char AttrNumThreadsPerWarp[] = "triton_gpu.threads-per-warp"; @@ -19,7 +22,8 @@ std::unique_ptr> createConvertTritonToTritonGPUPass(); // Create the pass with numWarps set explicitly. std::unique_ptr> -createConvertTritonToTritonGPUPass(int numWarps, int threadsPerWarp = 32); +createConvertTritonToTritonGPUPass(int numWarps, int threadsPerWarp = 32, + int numCTAs = 1, int computeCapability = 80); } // namespace triton } // namespace mlir diff --git a/include/triton/Dialect/CMakeLists.txt b/include/triton/Dialect/CMakeLists.txt index 27cb65ce5101..02d764601056 100644 --- a/include/triton/Dialect/CMakeLists.txt +++ b/include/triton/Dialect/CMakeLists.txt @@ -1,2 +1,4 @@ add_subdirectory(Triton) add_subdirectory(TritonGPU) +add_subdirectory(TritonNvidiaGPU) +add_subdirectory(NVGPU) diff --git a/include/triton/Dialect/NVGPU/CMakeLists.txt b/include/triton/Dialect/NVGPU/CMakeLists.txt new file mode 100644 index 000000000000..218c20c8819f --- /dev/null +++ b/include/triton/Dialect/NVGPU/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(IR) +#add_subdirectory(Transforms) diff --git a/include/triton/Dialect/NVGPU/IR/CMakeLists.txt b/include/triton/Dialect/NVGPU/IR/CMakeLists.txt new file mode 100644 index 000000000000..aa965dac6284 --- /dev/null +++ b/include/triton/Dialect/NVGPU/IR/CMakeLists.txt @@ -0,0 +1,14 @@ +set(LLVM_TARGET_DEFINITIONS NVGPUOps.td) +mlir_tablegen(Dialect.h.inc -gen-dialect-decls -dialect=nvgpu) +mlir_tablegen(Dialect.cpp.inc -gen-dialect-defs -dialect=nvgpu) +mlir_tablegen(OpsConversions.inc -gen-llvmir-conversions) +mlir_tablegen(Ops.h.inc -gen-op-decls) +mlir_tablegen(Ops.cpp.inc -gen-op-defs) +mlir_tablegen(OpsEnums.h.inc -gen-enum-decls) +mlir_tablegen(OpsEnums.cpp.inc -gen-enum-defs) +add_public_tablegen_target(NVGPUTableGen) + +set(LLVM_TARGET_DEFINITIONS NVGPUAttrDefs.td) +mlir_tablegen(NVGPUAttrDefs.h.inc -gen-attrdef-decls) +mlir_tablegen(NVGPUAttrDefs.cpp.inc -gen-attrdef-defs) +add_public_tablegen_target(NVGPUAttrDefsIncGen) diff --git a/include/triton/Dialect/NVGPU/IR/Dialect.h b/include/triton/Dialect/NVGPU/IR/Dialect.h new file mode 100644 index 000000000000..a27b556fed60 --- /dev/null +++ b/include/triton/Dialect/NVGPU/IR/Dialect.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_DIALECT_NVGPU_IR_DIALECT_H_ +#define TRITON_DIALECT_NVGPU_IR_DIALECT_H_ + +#include "mlir/Dialect/GPU/IR/GPUDialect.h" +#include "mlir/Dialect/LLVMIR/LLVMDialect.h" +#include "mlir/Dialect/Tensor/IR/Tensor.h" +#include "mlir/IR/BuiltinOps.h" +#include "mlir/IR/Dialect.h" +#include "triton/Dialect/NVGPU/IR/Dialect.h.inc" +#include "triton/Dialect/NVGPU/IR/OpsEnums.h.inc" + +#define GET_ATTRDEF_CLASSES +#include "triton/Dialect/NVGPU/IR/NVGPUAttrDefs.h.inc" + +#define GET_OP_CLASSES +#include "triton/Dialect/NVGPU/IR/Ops.h.inc" + +namespace mlir { +namespace triton { +namespace nvgpu {} // namespace nvgpu +} // namespace triton +} // namespace mlir + +#endif // TRITON_DIALECT_TRITONGPU_IR_DIALECT_H_ diff --git a/include/triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td b/include/triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td new file mode 100644 index 000000000000..20229f1e02c9 --- /dev/null +++ b/include/triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td @@ -0,0 +1,33 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef NVGPU_ATTRDEFS +#define NVGPU_ATTRDEFS + +include "triton/Dialect/NVGPU/IR/NVGPUDialect.td" +include "mlir/IR/AttrTypeBase.td" + +class NVGPU_Attr traits = [], + string baseCppClass = "::mlir::Attribute"> + : AttrDef { +} + +#endif diff --git a/include/triton/Dialect/NVGPU/IR/NVGPUDialect.td b/include/triton/Dialect/NVGPU/IR/NVGPUDialect.td new file mode 100644 index 000000000000..6978173d4982 --- /dev/null +++ b/include/triton/Dialect/NVGPU/IR/NVGPUDialect.td @@ -0,0 +1,40 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef NVGPU_DIALECT +#define NVGPU_DIALECT + +include "mlir/IR/OpBase.td" + +def NVGPU_Dialect : Dialect { + let name = "nvgpu"; + let cppNamespace = "::mlir::triton::nvgpu"; + + let description = [{ + NVGPU Dialect. + }]; + + let dependentDialects = [ + "mlir::LLVM::LLVMDialect" + ]; +} + +#endif diff --git a/include/triton/Dialect/NVGPU/IR/NVGPUOps.td b/include/triton/Dialect/NVGPU/IR/NVGPUOps.td new file mode 100644 index 000000000000..af53c9a3132c --- /dev/null +++ b/include/triton/Dialect/NVGPU/IR/NVGPUOps.td @@ -0,0 +1,380 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef NVGPU_OPS +#define NVGPU_OPS + +include "triton/Dialect/NVGPU/IR/NVGPUDialect.td" +include "triton/Dialect/NVGPU/IR/NVGPUAttrDefs.td" +include "mlir/IR/OpBase.td" +include "mlir/IR/EnumAttr.td" +include "mlir/Dialect/LLVMIR/LLVMOpBase.td" + +def I8Ptr_global : LLVM_IntPtrBase<8, 1>; +def I8Ptr_shared : LLVM_IntPtrBase<8, 3>; +def I64Ptr_shared : LLVM_IntPtrBase<64, 3>; + +class NVGPU_Op traits = []> : + LLVM_OpBase; + +def NVGPU_WGMMAFenceOp : NVGPU_Op<"wgmma_fence", []> { + string llvmBuilder = [{ + createWGMMAFence(builder); + }]; + let assemblyFormat = "attr-dict"; +} + + +def NVGPU_WGMMACommitGroupOp : NVGPU_Op<"wgmma_commit_group", []> { + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + createWGMMACommitGroup(builder); + }]; +} + +def NVGPU_WGMMAWaitOp : NVGPU_Op<"wgmma_wait_group", []> { + let arguments = (ins I32Attr:$pendings); + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + createWGMMAWaitGroup(builder, $pendings); + }]; +} + +def NVGPU_MBarrierInitOp : NVGPU_Op<"mbarrier_init", [MemoryEffects<[MemWrite]>]> { + let arguments = (ins I64Ptr_shared:$mbarrier, I1:$pred, I32Attr:$count); + let assemblyFormat = "$mbarrier `,` $pred attr-dict `:` type($mbarrier)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + auto *arriveCnt = builder.getInt32($count); + createExternalCall(builder, "__nv_mbarrier_init", {builder.CreatePtrToInt($mbarrier, i32Ty), + arriveCnt, + builder.CreateIntCast($pred, i32Ty, false)}); + }]; +} + +def MBarrier_ArriveTypeAttr : I32EnumAttr<"MBarriveType", + "mbarrier arrive type, either 'normal', 'expect_tx', 'cp_async'", + [ + I32EnumAttrCase<"normal", 0>, + I32EnumAttrCase<"cp_async", 1>, + I32EnumAttrCase<"expect_tx", 2>, + I32EnumAttrCase<"remote", 3>, + ]>{ + let cppNamespace = "::mlir::triton::nvgpu"; +} + +def NVGPU_MBarrierArriveOp : NVGPU_Op<"mbarrier_arrive", []> { + let arguments = (ins I64Ptr_shared:$mbarrier, I1:$pred, Optional:$ctaId, MBarrier_ArriveTypeAttr:$arriveType, DefaultValuedAttr:$txCount); + let assemblyFormat = "$mbarrier `,` $pred (`,` $ctaId^)? attr-dict `:` type($mbarrier)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + createMBarrierArrive(builder, $arriveType, builder.CreatePtrToInt($mbarrier, i32Ty), + builder.CreateIntCast($pred, i32Ty, false), $ctaId, + $txCount); + }]; +} + +def NVGPU_MBarrierWaitOp : NVGPU_Op<"mbarrier_wait", []> { + let arguments = (ins I64Ptr_shared:$mbarrier, I1:$phase); + let assemblyFormat = "$mbarrier `,` $phase attr-dict `:` type(operands)"; + + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + createExternalCall(builder, "__nv_mbarrier_wait", {builder.CreatePtrToInt($mbarrier, i32Ty), + builder.CreateIntCast($phase, i32Ty, false)}); + }]; +} + +def NVGPU_NamedBarrierArriveOp : NVGPU_Op<"bar_arrive", []> { + let arguments = (ins I32:$bar, I32:$numThreads); + let assemblyFormat = "$bar `,` $numThreads attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createExternalCall(builder, "__nv_bar_arrive", {$bar, $numThreads}); + }]; +} + +def NVGPU_NamedBarrierWaitOp : NVGPU_Op<"bar_wait", []> { + let arguments = (ins I32:$bar, I32:$numThreads); + let assemblyFormat = "$bar `,` $numThreads attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createExternalCall(builder, "__nv_bar_wait", {$bar, $numThreads}); + }]; +} + +def WGMMADesc_ModeAttr : I32EnumAttr<"WGMMADescMode", + "wgmma desc mode, either 'none', 'swizzle128', 'swizzle64', or 'swizzle32'", + [ + I32EnumAttrCase<"none", 0>, + I32EnumAttrCase<"swizzle128", 1>, + I32EnumAttrCase<"swizzle64", 2>, + I32EnumAttrCase<"swizzle32", 3> + ]>{ + let cppNamespace = "::mlir::triton::nvgpu"; +} + +def NVGPU_WGMMADescCreateOp : NVGPU_Op<"wgmma_desc_create", []> { + let arguments = (ins LLVM_AnyPointer:$buffer, I32:$height, WGMMADesc_ModeAttr:$mode); + let results = (outs I64:$res); + let assemblyFormat = "$buffer `,` $height attr-dict `:` functional-type(operands, results)"; + string llvmBuilder = [{ + $res = createWGMMADesc(builder, builder.CreatePtrToInt($buffer, builder.getInt32Ty()), $mode, $height); + }]; +} + +def NVGPU_TMALoadTiledOp : NVGPU_Op<"tma_load_tiled", [AttrSizedOperandSegments]> { + let arguments = (ins I8Ptr_shared:$dst, I64Ptr_shared:$mbarrier, I8Ptr_global:$tmaDesc, I64:$l2Desc, + I1:$pred, Variadic:$coords, Optional:$mcastMask); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + auto *i64Ty = builder.getInt64Ty(); + createTMALoadTiled(builder, + builder.CreatePtrToInt($dst, i32Ty), + builder.CreatePtrToInt($mbarrier, i32Ty), + builder.CreatePtrToInt($tmaDesc, i64Ty), + $l2Desc, $mcastMask, builder.CreateIntCast($pred, builder.getInt32Ty(), false), $coords); + }]; +} + +def NVGPU_TMALoadIm2colOp : NVGPU_Op<"tma_load_im2col", []> { + let arguments = (ins I8Ptr_shared:$dst, I64Ptr_shared:$mbarrier, I8Ptr_global:$tmaDesc, I64:$l2Desc, LLVM_AnyStruct:$im2colOffsets, I1:$pred, Variadic:$coords, I16Attr:$mcastMask); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + auto *i64Ty = builder.getInt64Ty(); + createTMALoadIm2col(builder, + builder.CreatePtrToInt($dst, i32Ty), + builder.CreatePtrToInt($mbarrier, i32Ty), + builder.CreatePtrToInt($tmaDesc, i64Ty), + $l2Desc, $mcastMask, $im2colOffsets, builder.CreateIntCast($pred, builder.getInt32Ty(), false), $coords); + }]; +} + +def WGMMA_LayoutAttr : I32EnumAttr<"WGMMALayout", + "wgmma layout, either 'row' or 'col'", + [ + I32EnumAttrCase<"row", 0>, + I32EnumAttrCase<"col", 1> + ]>{ + let cppNamespace = "::mlir::triton::nvgpu"; +} + +def WGMMA_EltTypeAttr : I32EnumAttr<"WGMMAEltType", + "wgmma operand type, either 's8', 's32', 'e4m3', 'e5m2', 'f16', 'bf16', 'tf32', or 'f32'", + [ + I32EnumAttrCase<"s8", 0>, + I32EnumAttrCase<"s32", 1>, + I32EnumAttrCase<"e4m3", 2>, + I32EnumAttrCase<"e5m2", 3>, + I32EnumAttrCase<"f16", 4>, + I32EnumAttrCase<"bf16", 5>, + I32EnumAttrCase<"tf32", 6>, + I32EnumAttrCase<"f32", 7> + ]>{ + let cppNamespace = "::mlir::triton::nvgpu"; +} + +def WGMMA_OperandType : AnyTypeOf<[LLVM_AnyStruct, I64], "wgmma operand A/B type">; + +def NVGPU_WGMMAOp : NVGPU_Op<"wgmma", []> { + let arguments = (ins WGMMA_OperandType:$opA, WGMMA_OperandType:$opB, LLVM_AnyStruct:$opC, + I32Attr:$m, I32Attr:$n, I32Attr:$k, + WGMMA_EltTypeAttr:$eltTypeC, WGMMA_EltTypeAttr:$eltTypeA, WGMMA_EltTypeAttr:$eltTypeB, + WGMMA_LayoutAttr:$layoutA, WGMMA_LayoutAttr:$layoutB); + let results = (outs LLVM_AnyStruct:$res); + let assemblyFormat = "$opA `,` $opB `,` $opC attr-dict `:` functional-type(operands, $res)"; + string llvmBuilder = [{ + $res = createWGMMA(builder, $m, $n, $k, $eltTypeC, $eltTypeA, $eltTypeB, $layoutA, $layoutB, $opA, $opB, $opC); + }]; +} + +def NVGPU_CGABarrierSyncOp : NVGPU_Op<"cga_barrier_sync", []> { + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + createExternalCall(builder, "__nv_cga_barrier_sync"); + }]; +} + +def NVGPU_CGABarrierArriveOp : NVGPU_Op<"cga_barrier_arrive", []> { + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + createExternalCall(builder, "__nv_cga_barrier_arrive"); + }]; +} + +def NVGPU_CGABarrierWaitOp : NVGPU_Op<"cga_barrier_wait", []> { + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + createExternalCall(builder, "__nv_cga_barrier_wait"); + }]; +} + +def NVGPU_LoadDSmemOp : NVGPU_Op<"load_dsmem", [MemoryEffects<[MemRead]>]> { + let arguments = (ins LLVM_AnyPointer:$addr, I32:$ctaId, I32Attr:$bitwidth, I32Attr:$vec); + let builders = [ + OpBuilder<(ins "Type":$resultTy, "Value":$addr, "Value":$ctaId)>, + OpBuilder<(ins "Value":$addr, "Value":$ctaId, "unsigned":$bitwidth, "unsigned":$vec)>, + OpBuilder<(ins "Value":$addr, "Value":$ctaId, "unsigned":$bitwidth)> + ]; + let results = (outs LLVM_LoadableType:$result); + let assemblyFormat = "operands attr-dict `:` functional-type(operands, results)"; + string llvmBuilder = [{ + $result = createLoadSharedCluster(builder, $addr, $ctaId, $bitwidth, $vec); + }]; +} + +def NVGPU_StoreDSmemOp : NVGPU_Op<"store_dsmem", [MemoryEffects<[MemWrite]>]> { + let arguments = (ins LLVM_AnyPointer:$addr, I32:$ctaId, + Variadic:$values, I1:$pred); + let builders = [ + OpBuilder<(ins "Value":$addr, "Value":$ctaId, "Value":$value, "Value":$pred)>, + ]; + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createStoreSharedCluster(builder, $addr, $ctaId, $values, $pred, op.getBitwidth(), op.getVec()); + }]; + let extraClassDeclaration = [{ + unsigned getBitwidth(); + unsigned getVec(); + }]; +} + +def NVGPU_FenceAsyncSharedOp : NVGPU_Op<"fence_async_shared", []> { + let arguments = (ins BoolAttr:$bCluster); + string llvmBuilder = [{ + if ($bCluster) + createExternalCall(builder, "__nv_fence_async_shared_cluster", {}); + else + createExternalCall(builder, "__nv_fence_async_shared_cta", {}); + }]; + let assemblyFormat = "attr-dict"; +} + +def NVGPU_FenceMBarrierInitOp : NVGPU_Op<"fence_mbarrier_init", []> { + string llvmBuilder = [{ + createExternalCall(builder, "__nv_fence_mbarrier_init", {}); + }]; + let assemblyFormat = "attr-dict"; +} + +def NVGPU_ClusterArriveOp : NVGPU_Op<"cluster_arrive", []> { + let arguments = (ins I1Attr:$relaxed); + + string llvmBuilder = [{ + if ($relaxed) + createExternalCall(builder, "__nv_cluster_arrive_relaxed", {}); + else + createExternalCall(builder, "__nv_cluster_arrive", {}); + }]; + let assemblyFormat = "attr-dict"; +} + +def NVGPU_ClusterWaitOp : NVGPU_Op<"cluster_wait", []> { + string llvmBuilder = [{ + createExternalCall(builder, "__nv_cluster_wait", {}); + }]; + let assemblyFormat = "attr-dict"; +} + +def NVGPU_TMAStoreTiledOp : NVGPU_Op<"tma_store_tiled", [MemoryEffects<[MemWrite]>]> { + let arguments = (ins I8Ptr_global:$tmaDesc, I8Ptr_shared:$src, I1:$pred, Variadic:$coords); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + auto *i64Ty = builder.getInt64Ty(); + createTMAStoreTiled(builder, + builder.CreatePtrToInt($tmaDesc, i64Ty), + builder.CreatePtrToInt($src, i32Ty), + builder.CreateIntCast($pred, i32Ty, false), $coords); + }]; +} + +def NVGPU_StoreMatrixOp : NVGPU_Op<"stmatrix", [MemoryEffects<[MemWrite]>]> { + let arguments = (ins I8Ptr_shared:$addr, Variadic:$datas); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + auto *i32Ty = builder.getInt32Ty(); + createStoreMatrix(builder, + builder.CreatePtrToInt($addr, i32Ty), + $datas); + }]; +} + +def NVGPU_OffsetOfStmatrixV4Op : NVGPU_Op<"offset_of_stmatrix_v4", []> { + let arguments = (ins I32:$threadId, I32:$rowOfWarp, I32:$elemIdx, I32Attr:$leadingDimOffset, I32Attr:$rowStride, I1Attr:$swizzleEnabled); + let results = (outs I32:$offset); + let assemblyFormat = "operands attr-dict `:` type(operands) `->` type($offset)"; + string llvmBuilder = [{ + $offset = createOffsetOfStmatrixV4(builder, $threadId, $rowOfWarp, $elemIdx, $leadingDimOffset, $rowStride, $swizzleEnabled); + }]; +} + +def NVGPU_OffsetOfSts64Op : NVGPU_Op<"offset_of_sts64", []> { + let arguments = (ins I32:$threadId, I32:$rowOfWarp, I32:$elemIdx, I32Attr:$leadingDimOffset, I32Attr:$rowStride, I1Attr:$swizzleEnabled); + let results = (outs I32:$offset); + let assemblyFormat = "operands attr-dict `:` type(operands) `->` type($offset)"; + string llvmBuilder = [{ + $offset = createOffsetOfSts64(builder, $threadId, $rowOfWarp, $elemIdx, $leadingDimOffset, $rowStride, $swizzleEnabled); + }]; +} + +def NVGPU_Sts64Op : NVGPU_Op<"sts64", [MemoryEffects<[MemWrite]>]> { + let arguments = (ins I32:$offset, AnyTypeOf<[F32, I32]>:$d0, AnyTypeOf<[F32, I32]>:$d1); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createSts64(builder, $offset, $d0, $d1); + }]; +} + +def NVGPU_CvtPackOp : NVGPU_Op<"cvt_pack", []> { + let arguments = (ins AnyTypeOf<[F16, I16]>:$d0, AnyTypeOf<[F16, I16]>:$d1); + let results = (outs I32:$result); + let assemblyFormat = "operands attr-dict `:` type(operands) `->` type($result)"; + string llvmBuilder = [{ + $result = createCvtPack(builder, $d0, $d1); + }]; +} + +def NVGPU_ClusterCTAIdOp : NVGPU_Op<"cluster_id", [Pure]> { + let results = (outs I32:$result); + let assemblyFormat = "attr-dict"; + string llvmBuilder = [{ + $result = createClusterId(builder); + }]; +} + +def NVGPU_RegAllocOp : NVGPU_Op<"reg_alloc", []> { + let arguments = (ins I32Attr: $regCount); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createRegAlloc(builder, $regCount); + }]; +} + +def NVGPU_RegDeallocOp : NVGPU_Op<"reg_dealloc", []> { + let arguments = (ins I32Attr: $regCount); + let assemblyFormat = "operands attr-dict `:` type(operands)"; + string llvmBuilder = [{ + createRegDealloc(builder, $regCount); + }]; +} + +#endif diff --git a/include/triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h b/include/triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h new file mode 100644 index 000000000000..28dfa8266c04 --- /dev/null +++ b/include/triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_DIALECT_NVGPU_NVGPUTOLLVMIRTRANSLATION_H +#define TRITON_DIALECT_NVGPU_NVGPUTOLLVMIRTRANSLATION_H + +namespace mlir { + +class DialectRegistry; +class MLIRContext; + +/// Register the nvgpu dialect and the translation from it to the LLVM IR in the +/// given registry; +void registerNVGPUDialectTranslation(DialectRegistry ®istry); + +/// Register the nvgpu dialect and the translation from it in the registry +/// associated with the given context. +void registerNVGPUDialectTranslation(MLIRContext &context); +} // namespace mlir + +#endif // TRITON_DIALECT_NVGPU_NVGPUTOLLVMIRTRANSLATION_H diff --git a/include/triton/Dialect/Triton/IR/Dialect.h b/include/triton/Dialect/Triton/IR/Dialect.h index 16879f8e9910..dd763d3454b4 100644 --- a/include/triton/Dialect/Triton/IR/Dialect.h +++ b/include/triton/Dialect/Triton/IR/Dialect.h @@ -9,6 +9,8 @@ #include "mlir/Dialect/Tensor/IR/Tensor.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/Dialect.h" +#include "mlir/IR/FunctionInterfaces.h" +#include "mlir/Interfaces/CallInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "triton/Dialect/Triton/IR/Dialect.h.inc" #include "triton/Dialect/Triton/IR/OpsEnums.h.inc" diff --git a/include/triton/Dialect/Triton/IR/TritonOps.td b/include/triton/Dialect/Triton/IR/TritonOps.td index 112f164074b2..779c51f6ea28 100644 --- a/include/triton/Dialect/Triton/IR/TritonOps.td +++ b/include/triton/Dialect/Triton/IR/TritonOps.td @@ -9,6 +9,8 @@ include "mlir/IR/OpBase.td" include "mlir/IR/FunctionInterfaces.td" // FunctionOpInterface include "mlir/IR/SymbolInterfaces.td" // SymbolUserOpInterface include "mlir/IR/OpAsmInterface.td" // OpAsmOpInterface +include "mlir/Interfaces/CallInterfaces.td" // CallOpInterface +include "mlir/Interfaces/CastInterfaces.td" // CastOpInterface include "mlir/Interfaces/SideEffectInterfaces.td" // Pure include "mlir/Interfaces/ControlFlowInterfaces.td" // BranchOpInterface include "mlir/Interfaces/InferTypeOpInterface.td" // SameOperandsAndResultType @@ -563,6 +565,7 @@ def TT_MakeTensorPtrOp : TT_Op<"make_tensor_ptr", let results = (outs TT_TensorPtr:$result); + // TODO(Keren): define a custom assembly format for this op because the result type cannot be printed correctly // Add additional `[]` to increase readability and split variadic lists let assemblyFormat = "$base `,` `[` $shape `]` `,` `[` $strides `]` `,` `[` $offsets `]` attr-dict `:` type($result)"; diff --git a/include/triton/Dialect/Triton/IR/TritonTypes.td b/include/triton/Dialect/Triton/IR/TritonTypes.td index 77bbdaf5a24c..cd8f49db486a 100644 --- a/include/triton/Dialect/Triton/IR/TritonTypes.td +++ b/include/triton/Dialect/Triton/IR/TritonTypes.td @@ -74,7 +74,7 @@ def TT_PtrType : TritonTypeDef<"Pointer", "ptr"> { // Scalar Pointer Type: `ptr<>` def TT_Ptr : TT_PtrOf<[AnyType]>; -// Tensor of Pointer Type +// Tensor of Pointer Type: `tensor>` def TT_PtrTensor : TensorOf<[TT_Ptr]>; // Tensor of Pointer Type or Pointer type: `tensor>` or `ptr<>` diff --git a/include/triton/Dialect/Triton/IR/Types.h b/include/triton/Dialect/Triton/IR/Types.h index 6c70c966d854..6a5d3124108c 100644 --- a/include/triton/Dialect/Triton/IR/Types.h +++ b/include/triton/Dialect/Triton/IR/Types.h @@ -14,6 +14,8 @@ namespace triton { bool isTensorPointerType(Type type); +bool isTensorOrTensorPointerType(Type type); + unsigned getPointeeBitWidth(Type type); Type getPointeeType(Type type); diff --git a/include/triton/Dialect/Triton/Transforms/Passes.h b/include/triton/Dialect/Triton/Transforms/Passes.h index 87758d7f532c..1d1ef2615d83 100644 --- a/include/triton/Dialect/Triton/Transforms/Passes.h +++ b/include/triton/Dialect/Triton/Transforms/Passes.h @@ -9,7 +9,6 @@ namespace triton { std::unique_ptr createCombineOpsPass(); std::unique_ptr createReorderBroadcastPass(); - std::unique_ptr createRewriteTensorPointerPass(int computeCapability = 80); diff --git a/include/triton/Dialect/TritonGPU/IR/CMakeLists.txt b/include/triton/Dialect/TritonGPU/IR/CMakeLists.txt index 1d2faad405e6..d32192749f25 100644 --- a/include/triton/Dialect/TritonGPU/IR/CMakeLists.txt +++ b/include/triton/Dialect/TritonGPU/IR/CMakeLists.txt @@ -3,9 +3,13 @@ mlir_tablegen(Dialect.h.inc -gen-dialect-decls -dialect=triton_gpu) mlir_tablegen(Dialect.cpp.inc -gen-dialect-defs -dialect=triton_gpu) mlir_tablegen(Ops.h.inc -gen-op-decls) mlir_tablegen(Ops.cpp.inc -gen-op-defs) +mlir_tablegen(Types.h.inc -gen-typedef-decls -typedefs-dialect=triton_gpu) +mlir_tablegen(Types.cpp.inc -gen-typedef-defs -typedefs-dialect=triton_gpu) add_public_tablegen_target(TritonGPUTableGen) set(LLVM_TARGET_DEFINITIONS TritonGPUAttrDefs.td) mlir_tablegen(TritonGPUAttrDefs.h.inc -gen-attrdef-decls) mlir_tablegen(TritonGPUAttrDefs.cpp.inc -gen-attrdef-defs) +mlir_tablegen(OpsEnums.h.inc -gen-enum-decls) +mlir_tablegen(OpsEnums.cpp.inc -gen-enum-defs) add_public_tablegen_target(TritonGPUAttrDefsIncGen) diff --git a/include/triton/Dialect/TritonGPU/IR/Dialect.h b/include/triton/Dialect/TritonGPU/IR/Dialect.h index c88f99b09294..6ba2fe711816 100644 --- a/include/triton/Dialect/TritonGPU/IR/Dialect.h +++ b/include/triton/Dialect/TritonGPU/IR/Dialect.h @@ -7,6 +7,7 @@ #include "mlir/IR/Dialect.h" // TritonGPU depends on Triton +#include "triton/Dialect/NVGPU/IR/Dialect.h" #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Attributes.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h.inc" @@ -71,17 +72,41 @@ getWarpsPerCTAWithUniqueData(Attribute layout, ArrayRef tensorShape); SmallVector getThreadsPerCTA(Attribute layout); +SmallVector getOrder(Attribute layout); + +CTALayoutAttr getCTALayout(Attribute layout); + +SmallVector getCTAsPerCGA(Attribute layout); + +SmallVector getCTASplitNum(Attribute layout); + +SmallVector getCTAOrder(Attribute layout); + +/* The difference between ShapePerCTATile and ShapePerCTA: + * (1) ShapePerCTATile is defined by SizePerThread * ThreadsPerWarp * + * WarpsPerCTA in each dimension and is independent from the tensor shape. + * (2) ShapePerCTA is defined by shape / CTASplitNum in each dimension. + * (3) In the implementation of emitIndices, ShapePerCTATile will + * be replicated or wraped to fit ShapePerCTA. + */ SmallVector -getShapePerCTA(Attribute layout, - ArrayRef tensorShape = ArrayRef()); +getShapePerCTATile(Attribute layout, + ArrayRef tensorShape = ArrayRef()); -SmallVector getOrder(Attribute layout); +SmallVector getShapePerCTA(ArrayRef CTASplitNum, + ArrayRef shape); +SmallVector getShapePerCTA(Attribute layout, ArrayRef shape); +SmallVector getShapePerCTA(Type type); + +unsigned getNumWarpsPerCTA(Attribute layout); + +unsigned getNumCTAs(Attribute layout); bool isaDistributedLayout(Attribute layout); bool isSharedEncoding(Value value); -bool isExpensiveCat(CatOp cat, Attribute &targetEncoding); +bool isExpensiveCat(CatOp cat, Attribute targetEncoding); } // namespace gpu } // namespace triton diff --git a/include/triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.td b/include/triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.td index f7af40a4ca0f..166adc8a52dc 100644 --- a/include/triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.td +++ b/include/triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.td @@ -41,6 +41,19 @@ Right now, Triton implements two classes of layouts: shared, and distributed. }]; } +//===----------------------------------------------------------------------===// +// CTA Layout +//===----------------------------------------------------------------------===// + +def CTALayoutAttr : TritonGPU_Attr<"CTALayout"> { + let parameters = ( + ins + ArrayRefParameter<"unsigned">:$CTAsPerCGA, + ArrayRefParameter<"unsigned">:$CTASplitNum, + ArrayRefParameter<"unsigned">:$CTAOrder + ); +} + //===----------------------------------------------------------------------===// // Shared Layout Encoding //===----------------------------------------------------------------------===// @@ -64,26 +77,49 @@ are stored contiguously _ _ _ _ /\_ _ _ _ A_{2, 2} A_{2, 3} A_{2, 0} A_{2, 1} ... [phase 1] \ per phase = 2 A_{3, 2} A_{3, 3} A_{3, 0} A_{3, 1} ... [phase 1] / + +For MMAv3 eg Hopper GMMA, hasLeadingOffset should be true. In this case, +when the matrix is stored in shared memory, there will be an offset not +only in the stride dimension, but also in the leading dimension. For example, +a matrix of size 16x128 and data type I8 is stored in the shared memory with +64B-swizzle mode. The offset of the element with index (0, 64) will be 16*64, +compared to 1*64 when the hasLeadingOffset is false. }]; + // swizzle info: vec, perPhase, maxPhase + // order: the fastest-changing axis first let parameters = ( ins - // swizzle info - "unsigned":$vec, "unsigned":$perPhase, "unsigned":$maxPhase, - ArrayRefParameter<"unsigned", "order of axes by the rate of changing">:$order + "unsigned":$vec, + "unsigned":$perPhase, + "unsigned":$maxPhase, + ArrayRefParameter<"unsigned">:$order, + "CTALayoutAttr":$CTALayout, + "bool":$hasLeadingOffset ); let builders = [ + AttrBuilder<(ins "unsigned":$vec, + "unsigned":$perPhase, + "unsigned":$maxPhase, + "ArrayRef":$order, + "CTALayoutAttr":$CTALayout), [{ + bool hasLeadingOffset = false; // default value + return $_get(context, vec, perPhase, maxPhase, order, CTALayout, hasLeadingOffset); + }]>, + AttrBuilder<(ins "DotOperandEncodingAttr":$dotOpEnc, "ArrayRef":$shape, "ArrayRef":$order, + "CTALayoutAttr":$CTALayout, "unsigned":$typeWidthInBit), [{ auto mmaEnc = dotOpEnc.getParent().dyn_cast(); if(!mmaEnc) - return $_get(context, 1, 1, 1, order); + return get(context, 1, 1, 1, order, CTALayout); int opIdx = dotOpEnc.getOpIdx(); + auto shapePerCTA = getShapePerCTA(CTALayout.getCTASplitNum(), shape); // number of rows per phase @@ -92,34 +128,34 @@ A_{3, 2} A_{3, 3} A_{3, 0} A_{3, 1} ... [phase 1] / // ---- begin Volta ---- if (mmaEnc.isVolta()) { - int perPhase = 128 / (shape[order[0]] * (typeWidthInBit / 8)); + int perPhase = 128 / (shapePerCTA[order[0]] * (typeWidthInBit / 8)); perPhase = std::max(perPhase, 1); bool is_row = order[0] != 0; - bool is_vec4 = opIdx == 0 ? !is_row && (shape[order[0]] <= 16) : - is_row && (shape[order[0]] <= 16); + bool is_vec4 = opIdx == 0 ? !is_row && (shapePerCTA[order[0]] <= 16) : + is_row && (shapePerCTA[order[0]] <= 16); int pack_size = opIdx == 0 ? ((is_row || is_vec4) ? 1 : 2) : ((is_row && !is_vec4) ? 2 : 1); int rep = 2 * pack_size; int maxPhase = (order[inner] == 1 ? 8 : 4) / perPhase; int vec = 2 * rep; - return $_get(context, vec, perPhase, maxPhase, order); + return get(context, vec, perPhase, maxPhase, order, CTALayout); } // ---- begin Ampere ---- if (mmaEnc.isAmpere()) { - int perPhase = 128 / (shape[order[0]] * 4 / dotOpEnc.getMMAv2kWidth()); + int perPhase = 128 / (shapePerCTA[order[0]] * 4 / dotOpEnc.getMMAv2kWidth()); perPhase = std::max(perPhase, 1); std::vector matShape = {8, 8, 4 * dotOpEnc.getMMAv2kWidth()}; // for now, disable swizzle when using transposed int8 tensor cores if ((32 / typeWidthInBit != dotOpEnc.getMMAv2kWidth()) && order[0] == inner) - return $_get(context, 1, 1, 1, order); + return get(context, 1, 1, 1, order, CTALayout); // --- handle A operand --- if (opIdx == 0) { // compute swizzling for A operand int vec = (order[0] == 1) ? matShape[2] : matShape[0]; // k : m int mmaStride = (order[0] == 1) ? matShape[0] : matShape[2]; int maxPhase = mmaStride / perPhase; - return $_get(context, vec, perPhase, maxPhase, order); + return get(context, vec, perPhase, maxPhase, order, CTALayout); } // --- handle B operand --- @@ -127,12 +163,19 @@ A_{3, 2} A_{3, 3} A_{3, 0} A_{3, 1} ... [phase 1] / int vec = (order[0] == 1) ? matShape[1] : matShape[2]; // n : k int mmaStride = (order[0] == 1) ? matShape[2] : matShape[1]; int maxPhase = mmaStride / perPhase; - return $_get(context, vec, perPhase, maxPhase, order); + return get(context, vec, perPhase, maxPhase, order, CTALayout); } llvm_unreachable("invalid operand index"); } + // ---- begin version 3 ---- + if (mmaEnc.isHopper()) { + llvm_unreachable("SharedEncodingAttr builder when the MMAEncodingAttr" + " is Hopper has not been implemented yet"); + return $_get(context, 1, 1, 1, order, CTALayout, true); + } + // ---- not implemented ---- llvm_unreachable("unsupported swizzling for provided MMA version"); }]>, @@ -140,9 +183,38 @@ A_{3, 2} A_{3, 3} A_{3, 0} A_{3, 1} ... [phase 1] / AttrBuilder<(ins "DotOperandEncodingAttr":$dotOpEnc, "ArrayRef":$shape, "ArrayRef":$order, + "CTALayoutAttr":$CTALayout, "Type":$eltTy), [{ unsigned bitwidth = eltTy.getIntOrFloatBitWidth(); - return get(context, dotOpEnc, shape, order, bitwidth); + return get(context, dotOpEnc, shape, order, CTALayout, bitwidth); + }]>, + + AttrBuilder<(ins "ArrayRef":$shape, + "ArrayRef":$order, + "CTALayoutAttr":$CTALayout, + "Type":$eltTy), [{ + auto shapePerCTA = getShapePerCTA(CTALayout.getCTASplitNum(), shape); + + int32_t eleBitWidth = eltTy.getIntOrFloatBitWidth(); + int32_t vec = 128 / eleBitWidth, perPhase = 1, maxPhase = 1; + + // get proper shared memory swizzling mode from the contiguous dimension + // size of the origin blocked layout. + auto contigDimSizeInByte = shapePerCTA[order[0]] * eleBitWidth / 8; + if (contigDimSizeInByte >= 128 && contigDimSizeInByte % 128 == 0) { + perPhase = 1; + maxPhase = 8; + } else if (contigDimSizeInByte >= 64 && contigDimSizeInByte % 64 == 0) { + perPhase = 2; + maxPhase = 4; + } else if (contigDimSizeInByte >= 32 && contigDimSizeInByte % 32 == 0) { + perPhase = 4; + maxPhase = 2; + } else { + llvm_unreachable("unsupported shared memory layout for MMAv3"); + } + + return $_get(context, vec, perPhase, maxPhase, order, CTALayout, true); }]> ]; @@ -194,7 +266,7 @@ used to promote memory coalescing in LoadInst and StoreInst. It is characterized by three tuples -- thread tile size, warp tile size, and block tile size -- which specify the amount of elements owned by each CUDA thread, warp and CTA respectively. -For example, a row-major coalesced layout may partition a 16x16 tensor over 2 warps (i.e. 64 threads) as follows. +Example 1, a row-major coalesced layout may partition a 16x16 tensor over 2 warps (i.e. 64 threads) as follows: [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] @@ -210,60 +282,136 @@ for sizePerThread = {2, 2} threadsPerWarp = {8, 4} warpsPerCTA = {1, 2} + CTAsPerCGA = {1, 1} +}> + +Example 2, a row-major coalesced layout may partition a 32x32 tensor over 2 warps (i.e. 64 threads) as follows: + +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +... ... +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +... ... +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +for + +#triton_gpu.blocked_layout<{ + sizePerThread = {2, 2} + threadsPerWarp = {8, 4} + warpsPerCTA = {1, 2} + CTAsPerCGA = {1, 1} +}> + +Example 3, A row-major coalesced layout may partition a 32x32 tensor over 2 warps (i.e. 64 threads) and +4 CTAs (taking 2x2 for example) as follows: + +CTA [0,0] CTA [0,1] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] [ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] [ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +... ... +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] [ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] [ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] + +CTA [1,0] CTA [1,1] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] [ 0 0 1 1 2 2 3 3 ; 32 32 33 33 34 34 35 35 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] [ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +[ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] [ 4 4 5 5 6 6 7 7 ; 36 36 37 37 38 38 39 39 ] +... ... +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] [ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +[ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] [ 28 28 29 29 30 30 31 31 ; 60 60 61 61 62 62 63 63 ] +for + +#triton_gpu.blocked_layout<{ + sizePerThread = {2, 2} + threadsPerWarp = {8, 4} + warpsPerCTA = {1, 2} + CTAsPerCGA = {2, 2} }> }]; + let parameters = ( + ins + ArrayRefParameter<"unsigned">:$sizePerThread, + ArrayRefParameter<"unsigned">:$threadsPerWarp, + ArrayRefParameter<"unsigned">:$warpsPerCTA, + ArrayRefParameter<"unsigned">:$order, // the fastest-changing axis first + "CTALayoutAttr":$CTALayout + ); let builders = [ - // Custom builder initializes sizePerWarp and sizePerCTA automatically - // TODO: compiles on MacOS but not linux? - // AttrBuilder<(ins "ArrayRef":$sizePerThread, - // "ArrayRef":$threadsPerWarp, - // "ArrayRef":$warpsPerCTA, - // "ArrayRef":$order), [{ - // int rank = threadsPerWarp.size(); - // SmallVector sizePerWarp(rank); - // SmallVector sizePerCTA(rank); - // for (unsigned i = 0; i < rank; i++) { - // sizePerWarp.push_back(sizePerThread[i] * threadsPerWarp[i]); - // sizePerCTA.push_back(sizePerWarp[i] * warpsPerCTA[i]); - // } - // return $_get(context, sizePerThread, threadsPerWarp, warpsPerCTA, order, sizePerWarp, sizePerCTA); - // }]>, - // Custom builder initializes sizePerWarp and sizePerCTA automatically - // Default builder takes sizePerThread, order and numWarps, and tries to - // pack numWarps*32 threads in the provided order for use in a type - // of the given shape. AttrBuilder<(ins "ArrayRef":$shape, "ArrayRef":$sizePerThread, "ArrayRef":$order, "unsigned":$numWarps, - "unsigned":$threadsPerWarp), [{ - int rank = sizePerThread.size(); - unsigned remainingLanes = threadsPerWarp; - unsigned remainingThreads = numWarps*threadsPerWarp; + "unsigned":$numThreadsPerWarp, + "CTALayoutAttr":$CTALayout), [{ + unsigned rank = sizePerThread.size(); + SmallVector threadsPerWarp(rank); + SmallVector warpsPerCTA(rank); + SmallVector shapePerCTA = getShapePerCTA(CTALayout.getCTASplitNum(), shape); + + unsigned remainingLanes = numThreadsPerWarp; + unsigned remainingThreads = numWarps * numThreadsPerWarp; unsigned remainingWarps = numWarps; unsigned prevLanes = 1; unsigned prevWarps = 1; - SmallVector rankedThreadsPerWarp(rank); - SmallVector warpsPerCTA(rank); - for (int _dim = 0; _dim < rank - 1; ++_dim) { - int i = order[_dim]; - unsigned threadsPerCTA = std::clamp(remainingThreads, 1, shape[i] / sizePerThread[i]); - rankedThreadsPerWarp[i] = std::clamp(threadsPerCTA, 1, remainingLanes); - warpsPerCTA[i] = std::clamp(threadsPerCTA / rankedThreadsPerWarp[i], 1, remainingWarps); + + // starting from the contiguous dimension + for (unsigned d = 0; d < rank - 1; ++d) { + unsigned i = order[d]; + unsigned threadsPerCTA = std::clamp(remainingThreads, 1, shapePerCTA[i] / sizePerThread[i]); + threadsPerWarp[i] = std::clamp(threadsPerCTA, 1, remainingLanes); + warpsPerCTA[i] = std::clamp(threadsPerCTA / threadsPerWarp[i], 1, remainingWarps); remainingWarps /= warpsPerCTA[i]; - remainingLanes /= rankedThreadsPerWarp[i]; + remainingLanes /= threadsPerWarp[i]; remainingThreads /= threadsPerCTA; - prevLanes *= rankedThreadsPerWarp[i]; + prevLanes *= threadsPerWarp[i]; prevWarps *= warpsPerCTA[i]; } + // Expand the last dimension to fill the remaining lanes and warps - rankedThreadsPerWarp[order[rank-1]] = threadsPerWarp / prevLanes; - warpsPerCTA[order[rank-1]] = numWarps / prevWarps; + threadsPerWarp[order[rank - 1]] = numThreadsPerWarp / prevLanes; + warpsPerCTA[order[rank - 1]] = numWarps / prevWarps; - return $_get(context, sizePerThread, rankedThreadsPerWarp, warpsPerCTA, order); + return $_get(context, sizePerThread, threadsPerWarp, warpsPerCTA, order, CTALayout); + }]>, + AttrBuilder<(ins "ArrayRef":$shape, + "ArrayRef":$sizePerThread, + "ArrayRef":$order, + "unsigned":$numWarps, + "unsigned":$numThreadsPerWarp, + "unsigned":$numCTAs), [{ + unsigned rank = sizePerThread.size(); + SmallVector CTAsPerCGA(rank); + SmallVector CTASplitNum(rank); + ArrayRef CTAOrder = order; + + unsigned remainingCTAs = numCTAs; + + // starting from the most strided dimension + for (int d = rank - 1; d >= 0; --d) { + unsigned i = order[d]; + CTAsPerCGA[i] = std::clamp(remainingCTAs, 1, shape[i] / sizePerThread[i]); + CTASplitNum[i] = CTAsPerCGA[i]; + remainingCTAs /= CTAsPerCGA[i]; + } + + CTAsPerCGA[rank - 1] *= remainingCTAs; // wrap at CTA level + + CTALayoutAttr CTALayout = CTALayoutAttr::get(context, CTAsPerCGA, CTASplitNum, CTAOrder); + return get(context, shape, sizePerThread, order, numWarps, numThreadsPerWarp, CTALayout); }]> ]; @@ -271,21 +419,6 @@ for SliceEncodingAttr squeeze(int axis); }]; - let parameters = ( - ins - ArrayRefParameter<"unsigned">:$sizePerThread, - ArrayRefParameter<"unsigned">:$threadsPerWarp, - ArrayRefParameter<"unsigned">:$warpsPerCTA, - // fastest-changing axis first - ArrayRefParameter< - "unsigned", - "order of axes by the rate of changing" - >:$order - // These attributes can be inferred from the rest - // ArrayRefParameter<"unsigned">:$sizePerWarp, - // ArrayRefParameter<"unsigned">:$sizePerCTA - ); - let hasCustomAssemblyFormat = 1; } @@ -381,13 +514,17 @@ For example, the matrix L corresponding to blockTileSize=[32,16] is: ins "unsigned":$versionMajor, "unsigned":$versionMinor, - ArrayRefParameter<"unsigned">:$warpsPerCTA + ArrayRefParameter<"unsigned">:$warpsPerCTA, + "CTALayoutAttr":$CTALayout, + ArrayRefParameter<"unsigned">:$instrShape ); let builders = [ // Specially for MMAV1(Volta) AttrBuilder<(ins "int":$versionMajor, "int":$numWarps, + "CTALayoutAttr":$CTALayout, + "ArrayRef":$instrShape, "ArrayRef":$shapeC, "bool":$isARow, "bool":$isBRow, @@ -401,7 +538,6 @@ For example, the matrix L corresponding to blockTileSize=[32,16] is: (isAVec4 * (1<<2)) |\ (isBVec4 * (1<<3)); - // TODO: Share code with // DotOpMmaV1ConversionHelper::AParam/BParam, since same code to compute the // rep,spw and fpw. @@ -426,12 +562,14 @@ For example, the matrix L corresponding to blockTileSize=[32,16] is: wpt[1] = std::clamp(wpt[1] * 2, 1, shapeC[1] / spw[1]); } while (wpt_nm1 != wpt); - return $_get(context, versionMajor, versionMinor, wpt); + return $_get(context, versionMajor, versionMinor, wpt, CTALayout, instrShape); }]>, AttrBuilder<(ins "int":$versionMajor, "int":$numWarps, + "CTALayoutAttr":$CTALayout, + "ArrayRef":$instrShape, "ArrayRef":$shapeA, "ArrayRef":$shapeB, "ArrayRef":$shapeC, @@ -441,15 +579,20 @@ For example, the matrix L corresponding to blockTileSize=[32,16] is: assert(versionMajor == 1 && "This builder is specially for versionMajor==1"); bool isAVec4 = !isARow && (shapeA[isARow] <= 16); bool isBVec4 = isBRow && (shapeB[isBRow] <= 16); - return get(context, versionMajor, numWarps, shapeC, isARow, isBRow, isAVec4, isBVec4, id); + return get(context, versionMajor, numWarps, CTALayout, instrShape, shapeC, isARow, isBRow, isAVec4, isBVec4, id); }]> ]; let extraClassDeclaration = extraBaseClassDeclaration # [{ bool isVolta() const; bool isAmpere() const; + bool isHopper() const; + + unsigned getElemsPerThreadOfOperand(int opIdx, ArrayRef shape) const; + // Get [isARow, isBRow, isAVec4, isBVec4, id] from versionMinor std::tuple decodeVoltaLayoutStates() const; + // Number of bits in versionMinor to hold the ID of the MMA encoding instance. // Here 5 bits can hold 32 IDs in a single module. static constexpr int numBitsToHoldMmaV1ID{5}; @@ -544,6 +687,4 @@ section 9.7.13.4.1 for more details. }]; } - - #endif diff --git a/include/triton/Dialect/TritonGPU/IR/TritonGPUDialect.td b/include/triton/Dialect/TritonGPU/IR/TritonGPUDialect.td index d9d5ea229a7f..7533044b41a6 100644 --- a/include/triton/Dialect/TritonGPU/IR/TritonGPUDialect.td +++ b/include/triton/Dialect/TritonGPU/IR/TritonGPUDialect.td @@ -16,6 +16,7 @@ def TritonGPU_Dialect : Dialect { let dependentDialects = [ "triton::TritonDialect", + "mlir::triton::nvgpu::NVGPUDialect", "mlir::gpu::GPUDialect", "tensor::TensorDialect", ]; @@ -23,14 +24,27 @@ def TritonGPU_Dialect : Dialect { let extraClassDeclaration = [{ static std::string getNumWarpsAttrName() { return "triton_gpu.num-warps"; } static int getNumWarps(ModuleOp mod) { - Attribute numWarps = mod->getDiscardableAttr("triton_gpu.num-warps"); - if(!numWarps) + if(!mod->hasAttr("triton_gpu.num-warps")) llvm::report_fatal_error( "TritonGPU module should contain a triton_gpu.num-warps attribute"); - return numWarps.cast().getInt(); + return mod->getAttr("triton_gpu.num-warps").cast().getInt(); } + static int getNumCTAs(ModuleOp mod) { + if(!mod->hasAttr("triton_gpu.num-ctas")) + llvm::report_fatal_error( + "TritonGPU module should contain a triton_gpu.num-ctas attribute"); + return mod->getAttr("triton_gpu.num-ctas").cast().getInt(); + } + static int getComputeCapability(ModuleOp mod) { + if(!mod->hasAttr("triton_gpu.compute-capability")) + llvm::report_fatal_error( + "TritonGPU module should contain a triton_gpu.compute-capability attribute"); + return mod->getAttrOfType("triton_gpu.compute-capability").getInt(); + } + void registerTypes(); static std::string getThreadsPerWarpAttrName() { return "triton_gpu.threads-per-warp"; } + static int getThreadsPerWarp(ModuleOp mod) { Attribute threadsPerWarp = mod->getDiscardableAttr("triton_gpu.threads-per-warp"); if(!threadsPerWarp) { @@ -38,7 +52,6 @@ def TritonGPU_Dialect : Dialect { } return threadsPerWarp.cast().getInt(); } - }]; let useDefaultAttributePrinterParser = 1; diff --git a/include/triton/Dialect/TritonGPU/IR/TritonGPUOps.td b/include/triton/Dialect/TritonGPU/IR/TritonGPUOps.td index b774fd54684d..d91fa076479b 100644 --- a/include/triton/Dialect/TritonGPU/IR/TritonGPUOps.td +++ b/include/triton/Dialect/TritonGPU/IR/TritonGPUOps.td @@ -2,6 +2,7 @@ #define TRITONGPU_OPS include "triton/Dialect/TritonGPU/IR/TritonGPUDialect.td" +include "triton/Dialect/TritonGPU/IR/TritonGPUTypes.td" include "triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.td" include "mlir/Dialect/Arith/IR/ArithBase.td" include "triton/Dialect/Triton/IR/TritonTypes.td" @@ -46,6 +47,20 @@ def TTG_AsyncWaitOp : TTG_Op<"async_wait"> { }]; } +def TTG_AsyncBulkWaitOp : TTG_Op<"async_bulk_wait"> { + let summary = "async bulk wait"; + + let arguments = (ins I32Attr:$num); + + let assemblyFormat = "attr-dict"; + + let extraClassDeclaration = [{ + static bool isSupported(int computeCapability) { + return computeCapability >= 90; + } + }]; +} + def TTG_AsyncCommitGroupOp : TTG_Op<"async_commit_group"> { let summary = "async commit group"; @@ -58,6 +73,18 @@ def TTG_AsyncCommitGroupOp : TTG_Op<"async_commit_group"> { }]; } +def TTG_AsyncBulkCommitGroupOp : TTG_Op<"async_bulk_commit_group"> { + let summary = "async bulk commit group"; + + let assemblyFormat = "attr-dict"; + + let extraClassDeclaration = [{ + static bool isSupported(int computeCapability) { + return computeCapability >= 90; + } + }]; +} + // Port Arith_CmpIOp & Arith_CmpFOp & Std_SelectOp to TritonGPU. // This is needed because these ops don't @@ -106,6 +133,98 @@ def TTG_SelectOp : TTG_Op<"select", [Pure, Elementwise, let results = (outs TT_Type:$result); } +// TODO[goostavz]: extract a base class for InsertSlice & InsertSliceAsync once the op definition is verified +def TTG_InsertSliceOp : TTG_Op<"insert_slice", + [AttrSizedOperandSegments, + ResultsAreSharedEncoding, + MemoryEffects<[MemRead, MemWrite]>, + TypesMatchWith<"infer mask type from src type", + "src", "mask", "getI1SameShape($_self)", + "($_op.getOperands().size() <= 3) || std::equal_to<>()">, + TypesMatchWith<"infer other type from src type", + "src", "other", "getPointeeType($_self)", + "($_op.getOperands().size() <= 4) || std::equal_to<>()">]> { + let summary = "insert slice"; + + let description = [{ + This operation inserts a tensor `$src` into another tensor `$dst` as specified by the operation’s + `$index` argument and `$axis` attribute. + + It returns a copy of `$dst` with the proper slice updated with the value of `$src`. + + When converting from `tt.load` to `triton_gpu.insert_slice`, the `$evict`, `$cache`, and `$isVolatile` fields + might be ignored on certain hardware. For example, on NVIDIA GPUs, the cache policy is determined by the backend, + and `$evict` and `$isVolatile` are ignored because they apply to L1 cache only. + + The insert_slice operation supports the following arguments: + + * src: the tensor that is inserted. + * dst: the tensor into which the `$src` tensor is inserted. + * index: the index of the `$src` tensor at the given `$axis` from which the `$dst` tensor is inserted into + * mask: optional tensor-rank number of boolean masks which specify which + elements of the `$src` tensor are inserted into the `$dst` tensor. + * other: optional tensor-rank number of other tensors which specify what + values are inserted into the `$dst` tensor if the corresponding + element of the `$mask` tensor is false. + + ttgpu.load_tile_async depracate + triton_gpu.insert_slice might be further lowered into triton_gpu_async for different hardware implementations + + like tt.load, ttgpu.insert_slice/insert_slice_async has two modes up to the type of src + mode 1: ptr/src is a tensor of pointers + mode 2: ptr/src is a tensor pointer + + Some typical lowering paths are: + in case the load is pipelined by the pipeline pass( load is inside kBlock loop, which means "pipeline pass): + Load from global + store to shared : tt.load(mode 1) -(tt->ttgpu+Coalesce)-> tt.load(mode 1) -(Pipeline)-> ttgpu.insert_slice(mode 1) + Non-bulk cp.async : tt.load(mode 1) -(tt->ttgpu+Coalesce)-> tt.load(mode 1) -(Pipeline)-> ttgpu.insert_slice(mode 1) -(MaterializeLoad)> ttgpu.insert_slice_async(mode 1) + ttgpu.await-> llvm + TMA load : tt.load(mode 2) -(tt->ttgpu+Coalesce)-> tt.load(mode 2) -(Pipeline)-> ttgpu.insert_slice(mode 2) -(MaterializeLoad)> ttgpu.insert_slice_async_v2(mode 2) + ttgpu.await-> llvm + + otherwise: + Load from global + store to shared : tt.load(mode 1) -(tt->ttgpu+Coalesce)-> tt.load(mode 1) + Non-bulk cp.async : tt.load(mode 1) -(tt->ttgpu+Coalesce)-> tt.load(mode 1) -> ... -(MaterializeLoad)-> ttgpu.insert_slice_async(mode 1) + ttgpu.await -> llvm + TMA load : tt.load(mode 2) -(tt->ttgpu+Coalesce)-> tt.load(mode 2) -> ... -(MaterializeLoad)-> ttgpu.insert_slice_async(mode 2) + ttgpu.await -> llvm + + Example: + + ``` + %1 = triton_gpu.alloc_tensor : tensor<2x32xf32> + %2 = triton_gpu.insert_slice %0, %1, %index { axis = 0 } : tensor<32x!tt.ptr, #AL> -> tensor<2x32xf32, #A> + ``` + }]; + + let arguments = (ins TT_PtrLike:$src, TT_Tensor:$dst, I32:$index, + Optional:$mask, Optional:$other, + TT_CacheModifierAttr:$cache, TT_EvictionPolicyAttr:$evict, + BoolAttr:$isVolatile, I32Attr:$axis); + + let builders = [ + OpBuilder<(ins "Value":$src, "Value":$dst, "Value":$index, + "triton::CacheModifier":$cache, + "triton::EvictionPolicy":$evict, "bool":$isVolatile, "int":$axis)>, + OpBuilder<(ins "Value":$src, "Value":$dst, "Value":$index, "Value":$mask, + "triton::CacheModifier":$cache, + "triton::EvictionPolicy":$evict, "bool":$isVolatile, "int":$axis)>, + OpBuilder<(ins "Value":$src, "Value":$dst, "Value":$index, + "Value":$mask, "Value":$other, + "triton::CacheModifier":$cache, + "triton::EvictionPolicy":$evict, "bool":$isVolatile, "int":$axis)>, + ]; + + let results = (outs TT_Tensor:$result); + + let extraClassDeclaration = [{ + static DenseSet getEligibleLoadByteWidth(int computeCapability) { + DenseSet validLoadBytes; + if (computeCapability >= 80) { + validLoadBytes = {4, 8, 16}; + } + return validLoadBytes; + } + }]; + + let hasCustomAssemblyFormat = 1; +} def TTG_ExtractSliceOp : TTG_Op<"extract_slice", @@ -173,7 +292,8 @@ def TTG_ExtractSliceOp : TTG_Op<"extract_slice", def TTG_InsertSliceAsyncOp : TTG_Op<"insert_slice_async", [AttrSizedOperandSegments, ResultsAreSharedEncoding, - MemoryEffects<[MemRead]>, + // TODO: Check if MemWrite will degrade performance of non-warp-specialized kernel + MemoryEffects<[MemRead, MemWrite]>, TypesMatchWith<"infer mask type from src type", "src", "mask", "getI1SameShape($_self)", "($_op.getOperands().size() <= 3) || std::equal_to<>()">, @@ -219,7 +339,7 @@ def TTG_InsertSliceAsyncOp : TTG_Op<"insert_slice_async", ``` }]; - let arguments = (ins TT_PtrTensor:$src, TT_Tensor:$dst, I32:$index, + let arguments = (ins TT_PtrLike:$src, TT_Tensor:$dst, I32:$index, Optional:$mask, Optional:$other, TT_CacheModifierAttr:$cache, TT_EvictionPolicyAttr:$evict, BoolAttr:$isVolatile, I32Attr:$axis); diff --git a/include/triton/Dialect/TritonGPU/IR/TritonGPUTypes.td b/include/triton/Dialect/TritonGPU/IR/TritonGPUTypes.td new file mode 100644 index 000000000000..aa831e7c4c1e --- /dev/null +++ b/include/triton/Dialect/TritonGPU/IR/TritonGPUTypes.td @@ -0,0 +1,26 @@ +#ifndef TRITONGPU_TYPES +#define TRITONGPU_TYPES + +include "triton/Dialect/TritonGPU/IR/TritonGPUDialect.td" +include "mlir/IR/AttrTypeBase.td" + +class TTG_TypeDef traits = []> + : TypeDef { + let mnemonic = _mnemonic; +} + +def TTG_TokenType : TTG_TypeDef<"Token", "token"> { + let parameters = (ins "int32_t":$type); + + let builders = [ + TypeBuilder<(ins "unsigned":$type), [{ + return $_get($_ctxt, type); + }]> + ]; + + let hasCustomAssemblyFormat = 1; + + let skipDefaultBuilders = 1; +} + +#endif diff --git a/include/triton/Dialect/TritonGPU/IR/Types.h b/include/triton/Dialect/TritonGPU/IR/Types.h new file mode 100644 index 000000000000..edf37fef606d --- /dev/null +++ b/include/triton/Dialect/TritonGPU/IR/Types.h @@ -0,0 +1,10 @@ +#ifndef TRITONGPU_IR_TYPES_H_ +#define TRITONGPU_IR_TYPES_H_ + +#include "mlir/IR/TypeSupport.h" +#include "mlir/IR/Types.h" + +#define GET_TYPEDEF_CLASSES +#include "triton/Dialect/TritonGPU/IR/Types.h.inc" + +#endif // TRITON_IR_TYPES_H_ diff --git a/include/triton/Dialect/TritonGPU/Transforms/Passes.h b/include/triton/Dialect/TritonGPU/Transforms/Passes.h index 1dfae0390dd2..5b2d7486d9c4 100644 --- a/include/triton/Dialect/TritonGPU/Transforms/Passes.h +++ b/include/triton/Dialect/TritonGPU/Transforms/Passes.h @@ -2,9 +2,14 @@ #define TRITON_DIALECT_TRITONGPU_TRANSFORMS_PASSES_H_ #include "mlir/Pass/Pass.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" namespace mlir { -std::unique_ptr createTritonGPUPipelinePass(int numStages = 2); + +std::unique_ptr createTritonGPUPipelinePass(int numStages = 3, + int numWarps = 4, + int numCTAs = 1, + int computeCapability = 80); std::unique_ptr createTritonGPUAccelerateMatmulPass(int computeCapability = 80); @@ -25,6 +30,8 @@ std::unique_ptr createTritonGPUVerifier(); std::unique_ptr createTritonGPUOptimizeDotOperandsPass(); +std::unique_ptr createTritonGPUOptimizeEpiloguePass(); + /// Generate the code for registering passes. #define GEN_PASS_REGISTRATION #include "triton/Dialect/TritonGPU/Transforms/Passes.h.inc" diff --git a/include/triton/Dialect/TritonGPU/Transforms/Passes.td b/include/triton/Dialect/TritonGPU/Transforms/Passes.td index b8f53eb9532a..685842c6261b 100644 --- a/include/triton/Dialect/TritonGPU/Transforms/Passes.td +++ b/include/triton/Dialect/TritonGPU/Transforms/Passes.td @@ -14,13 +14,23 @@ def TritonGPUPipeline : Pass<"tritongpu-pipeline", "mlir::ModuleOp"> { let constructor = "mlir::createTritonGPUPipelinePass()"; let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", "mlir::scf::SCFDialect", "mlir::arith::ArithDialect"]; let options = [ Option<"numStages", "num-stages", - "int32_t", /*default*/"2", - "number of pipeline stages"> + "int32_t", /*default*/"3", + "number of pipeline stages">, + Option<"numWarps", "num-warps", + "int32_t", /*default*/"4", + "number of warps per block">, + Option<"numCTAs", "num-ctas", + "int32_t", /*default*/"1", + "number of CTAs per CGA">, + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "device compute capability"> ]; } @@ -50,6 +60,7 @@ def TritonGPUAccelerateMatmul : Pass<"tritongpu-accelerate-matmul", "mlir::Modul let constructor = "mlir::createTritonGPUAccelerateMatmulPass()"; let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", "mlir::triton::TritonDialect"]; let options = [ @@ -70,6 +81,7 @@ def TritonGPUOptimizeDotOperands : Pass<"tritongpu-optimize-dot-operands", "mlir let constructor = "mlir::createTritonGPUOptimizeDotOperandsPass()"; let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", "mlir::triton::TritonDialect"]; } @@ -96,6 +108,20 @@ def TritonGPURemoveLayoutConversions : Pass<"tritongpu-remove-layout-conversions let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", "mlir::triton::TritonDialect"]; + +} + +def TritonGPUOptimizeEpilogue : Pass<"tritongpu-optimize-epilogue", "mlir::ModuleOp"> { + let summary = "Optimize epilogue: (1) Store accumulators directly without going thorough SMEM in epilogue."; + + let description = [{ + }]; + + let constructor = "mlir::createTritonGPUOptimizeEpiloguePass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::TritonDialect"]; + } def TritonGPUReorderInstructions: Pass<"tritongpu-reorder-instructions", "mlir::ModuleOp"> { diff --git a/include/triton/Dialect/TritonGPU/Transforms/TritonGPUConversion.h b/include/triton/Dialect/TritonGPU/Transforms/TritonGPUConversion.h index 8730c8b9a2cc..fbfa235fc6bb 100644 --- a/include/triton/Dialect/TritonGPU/Transforms/TritonGPUConversion.h +++ b/include/triton/Dialect/TritonGPU/Transforms/TritonGPUConversion.h @@ -13,15 +13,17 @@ namespace mlir { class TritonGPUTypeConverter : public TypeConverter { public: - TritonGPUTypeConverter(MLIRContext *context, int numWarps, - int threadsPerWarp); + TritonGPUTypeConverter(MLIRContext *context, int numWarps, int threadsPerWarp, + int numCTAs); int getNumWarps() const { return numWarps; } int getThreadsPerWarp() const { return threadsPerWarp; } + int getNumCTAs() const { return numCTAs; } private: MLIRContext *context; int numWarps; int threadsPerWarp; + int numCTAs; }; class TritonGPUConversionTarget : public ConversionTarget { diff --git a/include/triton/Dialect/TritonGPU/Transforms/Utility.h b/include/triton/Dialect/TritonGPU/Transforms/Utility.h index 92732d5797f8..181814aba8b2 100644 --- a/include/triton/Dialect/TritonGPU/Transforms/Utility.h +++ b/include/triton/Dialect/TritonGPU/Transforms/Utility.h @@ -10,8 +10,99 @@ namespace mlir { +namespace triton { +class LoadOp; +class StoreOp; +class FuncOp; +namespace gpu { +class SharedEncodingAttr; +} +} // namespace triton + LogicalResult fixupLoops(ModuleOp mod); +SmallVector mmaVersionToInstrShape(int version, + const ArrayRef &shape, + RankedTensorType type); + +/// Returns true if the Load is for TMA +bool isLoadFromTensorPtr(triton::LoadOp op); + +/// Returns true if the store is for TMA +bool isStoreToTensorPtr(triton::StoreOp op); + +/// Return the first consumer of v +Operation *getFirstUser(Value v); + +/// Return the proper SharedEncodingAttr according to shape/order +triton::gpu::SharedEncodingAttr getSharedEncoding(RankedTensorType tensorTy); + +/* Dump Triton IR in graphviz dot format. + * + * You can override `onValue` and `onOperation` in a subclass to mark + * specific Values and Operations. The below subclass + * GraphLayoutMarker is an example. + * + * Default NodeInfo for Value nodes: + * {{"shape": "box"}, + * {"style", "filled"}, + * {"fillcolor", "white"}, + * {"label", shapeStr}} + * + * Default NodeInfo for Operation nodes: + * {{"shape": "ellipse"}, + * {"style", "filled"}, + * {"fillcolor", "white"}, + * {"label", operationName}} + * + * If the key "label" is not set by `onValue` or `onOperation`, default labels + * will be generated. For Value node, the default label is the shape string and + * for Operation node, it is the operation name. + * + * Reference: + * https://graphviz.org/doc/info/shapes.html + * https://graphviz.org/doc/info/colors.html + * + * Usage: + * C++: GraphDumper().dumpToFile(func, "func.dot"); + * Shell: dot -Tjpg func.dot -o func.jpg + */ +class GraphDumper { +public: + using NodeInfo = std::map; + + // Override this function to mark specific Values + virtual NodeInfo onValue(Value value) const; + // Override this function to mark specific Operations + virtual NodeInfo onOperation(Operation *op) const; + + std::string dump(triton::FuncOp func) const; + void dumpToFile(triton::FuncOp func, const std::string &filename) const; + +protected: + std::string getShapeStr(const Type &type) const; + + std::string getUniqueId(Value value) const; + std::string getUniqueId(Operation *op) const; + + std::string emitNode(const std::string &id, const NodeInfo style) const; + std::string emitEdge(const std::string &srcId, + const std::string &destId) const; + + std::string emitValueNode(Value value) const; + std::string emitOperationNode(Operation *op) const; +}; + +/* A subclass of GraphDumper that marks different layout kinds in different + * colors.*/ +class GraphLayoutMarker : public GraphDumper { +public: + NodeInfo onValue(Value value) const override; + +protected: + std::string getColor(const Type &type) const; +}; + // TODO: Interface LogicalResult invertEncoding(Attribute targetEncoding, Operation *op, Attribute &ret); @@ -38,6 +129,23 @@ void rematerializeConversionChain( LogicalResult canMoveOutOfLoop(BlockArgument arg, SmallVector &cvts); +// Convert an \param index to a multi-dim coordinate given \param shape and +// \param order. +SmallVector delinearize(OpBuilder &b, Location loc, Value linear, + ArrayRef shape, + ArrayRef order); + +SmallVector delinearize(OpBuilder &b, Location loc, unsigned linear, + ArrayRef shape); + +SmallVector delinearize(OpBuilder &b, Location loc, Value linear, + ArrayRef shape); +Value linearize(OpBuilder &b, Location loc, ArrayRef multiDim, + ArrayRef shape, ArrayRef order); + +Value linearize(OpBuilder &b, Location loc, ArrayRef multiDim, + ArrayRef shape); + } // namespace mlir #endif // TRITON_DIALECT_TRITONGPU_TRANSFORMS_UTILITY_H_ diff --git a/include/triton/Dialect/TritonNvidiaGPU/CMakeLists.txt b/include/triton/Dialect/TritonNvidiaGPU/CMakeLists.txt new file mode 100644 index 000000000000..9f57627c321f --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(IR) +add_subdirectory(Transforms) diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt b/include/triton/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt new file mode 100644 index 000000000000..aba08ab137d3 --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt @@ -0,0 +1,15 @@ +set(LLVM_TARGET_DEFINITIONS TritonNvidiaGPUOps.td) +mlir_tablegen(Dialect.h.inc -gen-dialect-decls -dialect=triton_nvidia_gpu) +mlir_tablegen(Dialect.cpp.inc -gen-dialect-defs -dialect=triton_nvidia_gpu) +mlir_tablegen(Ops.h.inc -gen-op-decls) +mlir_tablegen(Ops.cpp.inc -gen-op-defs) +mlir_tablegen(Types.h.inc -gen-typedef-decls -typedefs-dialect=triton_nvidia_gpu) +mlir_tablegen(Types.cpp.inc -gen-typedef-defs -typedefs-dialect=triton_nvidia_gpu) +add_public_tablegen_target(TritonNvidiaGPUTableGen) + +set(LLVM_TARGET_DEFINITIONS TritonNvidiaGPUAttrDefs.td) +mlir_tablegen(TritonNvidiaGPUAttrDefs.h.inc -gen-attrdef-decls) +mlir_tablegen(TritonNvidiaGPUAttrDefs.cpp.inc -gen-attrdef-defs) +mlir_tablegen(OpsEnums.h.inc -gen-enum-decls) +mlir_tablegen(OpsEnums.cpp.inc -gen-enum-defs) +add_public_tablegen_target(TritonNvidiaGPUAttrDefsIncGen) diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/Dialect.h b/include/triton/Dialect/TritonNvidiaGPU/IR/Dialect.h new file mode 100644 index 000000000000..680af81ac41c --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/Dialect.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_DIALECT_TRITONNVIDIAGPU_IR_DIALECT_H_ +#define TRITON_DIALECT_TRITONNVIDIAGPU_IR_DIALECT_H_ + +#include "mlir/Dialect/GPU/IR/GPUDialect.h" +#include "mlir/Dialect/Tensor/IR/Tensor.h" +#include "mlir/IR/BuiltinOps.h" +#include "mlir/IR/Dialect.h" + +// TritonNvidiaGPU depends on Triton +#include "triton/Dialect/NVGPU/IR/Dialect.h" +#include "triton/Dialect/Triton/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/IR/Traits.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h.inc" +#include "triton/Dialect/TritonNvidiaGPU/IR/Traits.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Types.h" + +#define GET_ATTRDEF_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.h.inc" + +#define GET_OP_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/Ops.h.inc" + +#endif // TRITON_DIALECT_TRITONNVIDIAGPU_IR_DIALECT_H_ diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/Traits.h b/include/triton/Dialect/TritonNvidiaGPU/IR/Traits.h new file mode 100644 index 000000000000..1db22527716b --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/Traits.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_NVIDIA_GPU_IR_TRAITS_H_ +#define TRITON_NVIDIA_GPU_IR_TRAITS_H_ + +#include "mlir/IR/OpDefinition.h" + +#include "mlir/IR/BuiltinTypes.h" +#include "mlir/Support/LogicalResult.h" + +namespace mlir { +namespace OpTrait { + +// These functions are out-of-line implementations of the methods in the +// corresponding trait classes. This avoids them being template +// instantiated/duplicated. +namespace impl { +LogicalResult verifySource1IsSharedEncoding(Operation *op); +} // namespace impl + +template +class Source1IsSharedEncoding + : public TraitBase { +public: + static LogicalResult verifyTrait(Operation *op) { + return impl::verifySource1IsSharedEncoding(op); + } +}; +} // namespace OpTrait +} // namespace mlir + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.td b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.td new file mode 100644 index 000000000000..936535bb039a --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.td @@ -0,0 +1,29 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef TRITONNVIDIAGPU_ATTRDEFS +#define TRITONNVIDIAGPU_ATTRDEFS + +include "mlir/IR/AttrTypeBase.td" +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td" +include "triton/Dialect/Triton/IR/TritonInterfaces.td" + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td new file mode 100644 index 000000000000..08ff21f523f0 --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td @@ -0,0 +1,82 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef TRITONNVIDIAGPU_DIALECT +#define TRITONNVIDIAGPU_DIALECT + +include "mlir/IR/OpBase.td" + +def TritonNvidiaGPU_Dialect : Dialect { + let name = "triton_nvidia_gpu"; + + let cppNamespace = "::mlir::triton::nvidia_gpu"; + + let hasOperationAttrVerify = 1; + + let description = [{ + Triton Nvidia GPU Dialect. + }]; + + let dependentDialects = [ + "triton::TritonDialect", + "triton::gpu::TritonGPUDialect", + "mlir::triton::nvgpu::NVGPUDialect", + "mlir::gpu::GPUDialect", + "tensor::TensorDialect", + ]; + + let extraClassDeclaration = [{ + static std::string getNumWarpsAttrName() { return "triton_gpu.num-warps"; } + static int getNumWarps(ModuleOp mod) { + if(!mod->hasAttr("triton_gpu.num-warps")) + llvm::report_fatal_error( + "TritonGPU module should contain a triton_gpu.num-warps attribute"); + return mod->getAttr("triton_gpu.num-warps").cast().getInt(); + } + static int getNumCTAs(ModuleOp mod) { + if(!mod->hasAttr("triton_gpu.num-ctas")) + llvm::report_fatal_error( + "TritonGPU module should contain a triton_gpu.num-ctas attribute"); + return mod->getAttr("triton_gpu.num-ctas").cast().getInt(); + } + static int getComputeCapability(ModuleOp mod) { + if(!mod->hasAttr("triton_gpu.compute-capability")) + llvm::report_fatal_error( + "TritonGPU module should contain a triton_gpu.compute-capability attribute"); + return mod->getAttrOfType("triton_gpu.compute-capability").getInt(); + } + void registerTypes(); + + // Warp specialization related: + static std::string getWSSupportedAttrName() { return "triton_gpu.enable-warp-specialization"; } + static int getWSSupportedAttr(ModuleOp mod) { + auto name = getWSSupportedAttrName(); + if (!mod->hasAttr(name)) return 0; + return mod->getAttrOfType(name).getInt(); + } + }]; + + let useDefaultTypePrinterParser = 1; +} + +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td" + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUOps.td b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUOps.td new file mode 100644 index 000000000000..c391e423caa3 --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUOps.td @@ -0,0 +1,386 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef TRITONNVIDIAGPU_OPS +#define TRITONNVIDIAGPU_OPS + +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td" +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td" +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.td" +include "mlir/Dialect/Arith/IR/ArithBase.td" +include "triton/Dialect/Triton/IR/TritonTypes.td" +include "triton/Dialect/Triton/IR/TritonAttrDefs.td" +include "mlir/IR/OpBase.td" +include "mlir/Interfaces/SideEffectInterfaces.td" // Pure +include "mlir/Interfaces/InferTypeOpInterface.td" // SameOperandsAndResultType +include "mlir/Interfaces/DestinationStyleOpInterface.td" +include "mlir/Interfaces/ViewLikeInterface.td" + +def Source1IsSharedEncoding: NativeOpTrait<"Source1IsSharedEncoding">; + +def ResultsAreSharedEncoding: NativeOpTrait<"ResultsAreSharedEncoding">; + +class TTNG_Op traits = []> : + Op; + +// -------------------------------------------------------------------------------------------------- +// MBarrier related Ops: +// 1, These mbarrier commands are currently not needed, and not taken into consideration: +// (1), mbarrier.expect_tx +// (2), mbarrier.arrive_drop +// (3), mbarrier.complete_tx +// (4), mbarrier.inval +// +// 2, The mbarriers is supported to be created in vector, and accessed in seperate via tensor.extract. +// The mbarriers created in vector will have counters initialized in the same configuration. A +// typical example to demonstrate this: +// +// %1 = triton_nvidia_gpu.alloc_mbarrier { count = 1 } : tensor<4x!tt.ptr> +// scf.for %iv = %lb to %ub step %step iter_args() -> () { +// %buffer_id = arith.remi %iv, %c4 : i32 +// %2 = triton_nvidia_gpu.extract_mbarrier %1[%buffer_id] : tensor<4xi64>, i32 -> !tt.ptr +// triton_nvidia_gpu.mbarrier_arrive %2 {expectTx = 2048} : !tt.ptr -> () +// } +// ... +// scf.for %iv = %lb to %ub step %step iter_args() -> () { +// %buffer_id = arith.remi %iv, %c4 : i32 +// %2 = triton_nvidia_gpu.extract_mbarrier %1[%buffer_id] : tensor<4xi64>, i32 -> !tt.ptr +// triton_nvidia_gpu.mbarrier_wait %2, %c0 : !tt.ptr, i1 -> () +// } + +def TTNG_AllocMBarrierOp : TTNG_Op<"alloc_mbarrier", [MemoryEffects<[MemAlloc]>]> { + let summary = "allocate a vector of mbarriers"; + + let description = [{ + Allocate and initialize a vector of mbarriers. The size of the vector is implied in the returned type. + Each mbarrier is initialized as: + 1, the current phase initialized to 0. + 2, the expected arrival count initialized to 'count'. + 3, the pending arrival count initialized to 'count'. + 4, the tx-count initialized to 0. + + Example: + + case a. when created in vector: + %1 = triton_nvidia_gpu.alloc_mbarrier { count = 1 } : tensor<4xi64> + + case b. when created in scalar: + %1 = triton_nvidia_gpu.alloc_mbarrier { count = 1 } : !tt.ptr + + }]; + + let assemblyFormat = [{attr-dict `:` type($result)}]; + + let arguments = (ins I32Attr:$count); + + let results = (outs AnyTypeOf<[TT_Ptr, I64Tensor]>:$result); +} + +def TTNG_ExtractMBarrierOp : TTNG_Op<"extract_mbarrier", [Pure]> { + let summary = "extract a mbarrier from a vector of mbarriers"; + + let description = [{ + Extract a mbarrier from a vector of mbarriers + + Example: + + %1 = triton_nvidia_gpu.extract_mbarrier %mbarriers[%idx] : tensor<4xi64>, index -> !tt.ptr + + }]; + + let assemblyFormat = "$tensor `[` $index `]` attr-dict `:` type($tensor) `,` type($index) `->` type($result)"; + + let arguments = (ins I64Tensor:$tensor, I32:$index); + + let results = (outs TT_Ptr:$result); +} + +def TTNG_MBarrierWaitOp : TTNG_Op<"mbarrier_wait", [MemoryEffects<[MemRead, MemWrite]>]> { + let summary = "mbarrier wait"; + + let description = [{ + This operation defining the waiting action for a mbarrier. + The subsequent operations should not execute until this operation completes waiting. + + Example: + + triton_nvidia_gpu.mbarrier_wait %0, %1 : !tt.ptr + + }]; + + let arguments = (ins TT_Ptr:$mbarrier, I1: $phase); + + let assemblyFormat = "$mbarrier `,` $phase attr-dict `:` type($mbarrier)"; +} + +def TTNG_MBarrierArriveOp : TTNG_Op<"mbarrier_arrive", [AttrSizedOperandSegments, + MemoryEffects<[MemWrite]>]> { + let summary = "mbarrier arrive"; + + let description = [{ + This operation defining the arriving action for a mbarrier. + txCount: + An optional attribute that set tx-count. This Op will be lowered into + mbarrier.arrive.expect_tx if the optional attribute exist. + trackAsyncOp: + If true, this op will be lowered into cp.async.mbarrier.arrive.noinc. + pred: + Only perform arrive action when pred is true. + remoteCtaId: + if set, perform an remote arrive action. + + Example: + + triton_nvidia_gpu.mbarrier_arrive %0 {trackAsyncOp = false} : !tt.ptr + + }]; + + let arguments = (ins TT_Ptr:$mbarrier, + Optional:$pred, + Optional:$remoteCtaId, + I1Attr: $trackAsyncOp, + DefaultValuedAttr: $txCount + ); + + let assemblyFormat = "operands attr-dict `:` type(operands)"; +} + +def TTNG_FenceAsyncSharedOp : TTNG_Op<"fence_async_shared"> { + let arguments = (ins BoolAttr:$bCluster); + + let summary = "fence proxy async"; + + let assemblyFormat = "attr-dict"; + + let extraClassDeclaration = [{ + static bool isSupported(int computeCapability) { + return computeCapability >= 90; + } + }]; +} + +// TODO[goostavz]: ThreadId & ClusterCTAId should not be exposed to +// ttgpu level. Remove them when async dialect is ready. +def TTNG_GetThreadIdOp : TTNG_Op<"get_thread_id", [Pure]> { + let description = [{ + Returns the one dimensional threadId. + }]; + + let results = (outs I32:$result); + let assemblyFormat = "attr-dict `:` type($result)"; +} + +def TTNG_GetClusterCTAIdOp : TTNG_Op<"get_cluster_cta_id", [Pure]> { + let description = [{ + Returns the one dimensional cluster_cta_id. + }]; + + let results = (outs I32:$result); + let assemblyFormat = "attr-dict `:` type($result)"; +} + +def TTNG_NamedBarrierArriveOp : TTNG_Op<"bar_arrive", []> { + let summary = "named barrier arrive"; + + let arguments = (ins I32:$bar, I32: $numThreads); + + let assemblyFormat = "$bar `,` $numThreads attr-dict `:` type(operands)"; +} + +def TTNG_NamedBarrierWaitOp : TTNG_Op<"bar_wait", []> { + let summary = "named barrier wait"; + + let arguments = (ins I32:$bar, I32: $numThreads); + + let assemblyFormat = "$bar `,` $numThreads attr-dict `:` type(operands)"; +} + +def TTNG_InsertSliceAsyncV2Op : TTNG_Op<"insert_slice_async_v2", + [AttrSizedOperandSegments, + ResultsAreSharedEncoding, + // TODO: Check if MemWrite will degrade performance of non-warp-specialized kernel + MemoryEffects<[MemRead, MemWrite]>]> { + + let arguments = (ins AnyTypeOf<[TT_Ptr, TT_PtrTensor]>:$src, TT_Tensor:$dst, + I32:$index, TT_Ptr:$mbar, + Optional>:$mask, Optional:$other, + TT_CacheModifierAttr:$cache, TT_EvictionPolicyAttr:$evict, + BoolAttr:$isVolatile, I32Attr:$axis); + + let results = (outs TT_Tensor:$result); + + let assemblyFormat = "operands attr-dict `:` type(operands) `->` type($result)"; +} + +// TODO: the abstraction of barriers in ttgpu level is pending, will revisit later +// def TTNG_AwaitOp : TTNG_Op<"await", []> { +// let arguments = (ins TTNG_TokenType:$token); +// let assemblyFormat = "$token attr-dict `:` type($token)"; +// } + +def TTNG_ClusterArriveOp : TTNG_Op<"cluster_arrive", []> { + let arguments = (ins I1Attr:$relaxed); + let assemblyFormat = "attr-dict"; +} + +def TTNG_ClusterWaitOp : TTNG_Op<"cluster_wait", []> { + let assemblyFormat = "attr-dict"; +} + +// +// DotAsync Op +// +def TTNG_DotAsyncOp : TTNG_Op<"dot_async", [Pure, + DeclareOpInterfaceMethods, + TypesMatchWith<"result's type matches accumulator's type", + "d", "c", "$_self">]> { + let summary = "dot async"; + + let description = [{ + $d = matrix_multiply($a, $b) + $c + }]; + + let arguments = (ins TT_FpIntTensor:$a, TT_FpIntTensor:$b, TT_FpIntTensor:$c, BoolAttr:$allowTF32); + + let results = (outs TT_FpIntTensor:$d); + + let assemblyFormat = "$a`,` $b`,` $c attr-dict `:` type($a) `*` type($b) `->` type($d)"; +} + +def TTNG_DotWaitOp : TTNG_Op<"dot_wait", []> { + let summary = "dot wait"; + + let description = [{ + This operation defining the waiting action for a async dot, MMAv3 .e.g. + The subsequent operations should not execute until this operation completes waiting. + }]; + + let arguments = (ins I32Attr:$pendings); + + let assemblyFormat = "attr-dict"; +} + +def TTNG_StoreAsyncOp : TTNG_Op<"store_async", + [Source1IsSharedEncoding, + MemoryEffects<[MemWrite]>]> { + let summary = "store asynchronous by a tensor pointer"; + let arguments = (ins TT_TensorPtr:$dst, TT_Tensor:$src, + DefaultValuedAttr:$cache); + let assemblyFormat = "operands attr-dict `:` type(operands)"; +} + +def TTNG_GetAgentIdOp : TTNG_Op<"get_agent_id", [Pure]> { + let results = (outs I32:$result); + + let builders = [OpBuilder<(ins)>]; + + let assemblyFormat = "attr-dict `:` type($result)"; +} + +// +// Token +// + +def TTNG_CreateTokenOp : TTNG_Op<"create_token"> { + let results = (outs TensorOf<[TTNG_TokenType]>:$result); + + let arguments = (ins I32Attr:$num); + + let builders = [OpBuilder<(ins "uint32_t":$num)>]; + + let assemblyFormat = "attr-dict `:` type($result)"; +} + +def TTNG_ProducerAcquireOp : TTNG_Op<"producer_acquire"> { + let arguments = (ins TensorOf<[TTNG_TokenType]>:$token, I32:$idx); + + let assemblyFormat = "$token `,` $idx attr-dict `:` type(operands)"; +} + +def TTNG_ProducerCommitOp : TTNG_Op<"producer_commit"> { + let arguments = (ins TensorOf<[TTNG_TokenType]>:$token, I32:$idx); + + let assemblyFormat = "$token `,` $idx attr-dict `:` type(operands)"; +} + +def TTNG_ConsumerWaitOp : TTNG_Op<"consumer_wait"> { + let arguments = (ins TensorOf<[TTNG_TokenType]>:$token, I32:$idx); + + let assemblyFormat = "$token `,` $idx attr-dict `:` type(operands)"; +} + +def TTNG_ConsumerReleaseOp : TTNG_Op<"consumer_release"> { + let arguments = (ins TensorOf<[TTNG_TokenType]>:$token, I32:$idx); + + let assemblyFormat = "$token `,` $idx attr-dict `:` type(operands)"; +} + +// +// Mutex +// + +def TTNG_GetMutexRoleIdOp : TTNG_Op<"get_mutex_role_id"> { + let results = (outs I32:$result); + + let arguments = (ins I32Attr:$num); + + let builders = [OpBuilder<(ins "uint32_t":$num)>]; + + let assemblyFormat = "attr-dict `:` type($result)"; +} + +def TTNG_CreateMutexOp : TTNG_Op<"create_mutex"> { + let results = (outs TTNG_MutexType:$result); + + let builders = [OpBuilder<(ins)>]; + + let assemblyFormat = "attr-dict `:` type($result)"; +} + +def TTNG_LockOp : TTNG_Op<"lock"> { + let arguments = (ins TTNG_MutexType:$mutex); + + let assemblyFormat = "$mutex attr-dict `:` type(operands)"; +} + +def TTNG_UnlockOp : TTNG_Op<"unlock"> { + let arguments = (ins TTNG_MutexType:$mutex); + + let assemblyFormat = "$mutex attr-dict `:` type(operands)"; +} + +def TTNG_RegAllocOp : TTNG_Op<"reg_alloc", []> { + let summary = "register allocation"; + + let arguments = (ins I32Attr: $regCount); + + let assemblyFormat = "$regCount attr-dict `:` type(operands)"; +} + +def TTNG_RegDeallocOp : TTNG_Op<"reg_dealloc", []> { + let summary = "register deallocation"; + + let arguments = (ins I32Attr: $regCount); + + let assemblyFormat = "$regCount attr-dict `:` type(operands)"; +} + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td new file mode 100644 index 000000000000..d3126f8a044e --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUTypes.td @@ -0,0 +1,37 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef TRITONNVIDIAGPU_TYPES +#define TRITONNVIDIAGPU_TYPES + +include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUDialect.td" +include "mlir/IR/AttrTypeBase.td" + +class TTNG_TypeDef + : TypeDef { + let mnemonic = _mnemonic; +} + +def TTNG_TokenType : TTNG_TypeDef<"Token", "token">; + +def TTNG_MutexType : TTNG_TypeDef<"Mutex", "mutex">; + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/IR/Types.h b/include/triton/Dialect/TritonNvidiaGPU/IR/Types.h new file mode 100644 index 000000000000..63c7a091afcd --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/IR/Types.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITONNVIDIAGPU_IR_TYPES_H_ +#define TRITONNVIDIAGPU_IR_TYPES_H_ + +#include "mlir/IR/TypeSupport.h" +#include "mlir/IR/Types.h" + +#define GET_TYPEDEF_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/Types.h.inc" + +#endif // TRITON_IR_TYPES_H_ diff --git a/include/triton/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt b/include/triton/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt new file mode 100644 index 000000000000..d4b5c097f4fe --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LLVM_TARGET_DEFINITIONS Passes.td) +mlir_tablegen(Passes.h.inc -gen-pass-decls -name TritonNvidiaGPU) +add_public_tablegen_target(TritonNvidiaGPUTransformsIncGen) diff --git a/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h new file mode 100644 index 000000000000..b521c3f36a00 --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_PASSES_H_ +#define TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_PASSES_H_ + +#include "mlir/Pass/Pass.h" + +namespace mlir { +namespace triton { +namespace nvidia_gpu { + +// Used by Triton runtime +struct ClusterInfo { + ClusterInfo() : clusterDimX(1), clusterDimY(1), clusterDimZ(1) {} + int clusterDimX; + int clusterDimY; + int clusterDimZ; +}; + +} // namespace nvidia_gpu +} // namespace triton +} // namespace mlir + +namespace mlir { + +std::unique_ptr +createTritonNvidiaGPUMaterializeLoadStorePass(int numWarps = 4, + int computeCapability = 80); + +std::unique_ptr createTritonNvidiaGPUPlanCTAPass( + mlir::triton::nvidia_gpu::ClusterInfo *clusterInfo = nullptr); + +std::unique_ptr +createTritonNvidiaGPUWSFeasibilityCheckingPass(int computeCapability = 90); + +std::unique_ptr +createTritonNvidiaGPUWSDecomposingPass(int computeCapability = 90); + +std::unique_ptr +createTritonNvidiaGPUWSPipelinePass(int numStages = 3, int numWarps = 4, + int computeCapability = 90); + +std::unique_ptr +createTritonNvidiaGPUWSMutexPass(int computeCapability = 90); + +std::unique_ptr +createTritonNvidiaGPUWSMaterializationPass(int computeCapability = 90); + +std::unique_ptr +createTritonNvidiaGPUFenceInsertionPass(int computeCapability = 90); + +std::unique_ptr +createTritonGPURewriteTensorPointerPass(int computeCapability = 80); + +/// Generate the code for registering passes. +#define GEN_PASS_REGISTRATION +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +} // namespace mlir +#endif // TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_PASSES_H_ diff --git a/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.td b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.td new file mode 100644 index 000000000000..1069b015b441 --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Passes.td @@ -0,0 +1,228 @@ +// Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files +// (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef TRITONNVIDIAGPU_PASSES +#define TRITONNVIDIAGPU_PASSES + +include "mlir/Pass/PassBase.td" + +def MaterializeLoadStore : Pass<"triton-nvidia-gpu-materialize-load-store", "mlir::ModuleOp"> { + let summary = "materialize load & store"; + + let description = [{ + This pass works after pipeline pass, converting the remaining tt.LoadOp taking + ptr as input into ttg.InsertSliceAsyncOp and emit proper barriers + }]; + + let constructor = "mlir::createTritonNvidiaGPUMaterializeLoadStorePass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", + "mlir::scf::SCFDialect", + "mlir::arith::ArithDialect"]; + + let options = [ + Option<"numWarps", "num-warps", + "int32_t", /*default*/"4", + "number of warps per block">, + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "device compute capability"> + ]; +} + +def TritonGPUPlanCTAPass : Pass<"triton-nvidia-gpu-plan-cta", "mlir::ModuleOp"> { + let summary = "plan CTA"; + + let description = [{ + Plan CTAs in CGA + }]; + + let constructor = "mlir::createTritonNvidiaGPUPlanCTAPass()"; + + let dependentDialects = [ + "mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect" + ]; +} + +def TritonGPUWSFeasibilityChecking : Pass<"triton-nvidia-gpu-ws-feasibility-checking", "mlir::ModuleOp"> { + let summary = "Attach attr named TritonNvidiaGPUDialect::getWSSupportedAttrName() if auto WS supported"; + + let description = [{ + Since not every legal triton kernels can be auto WS, this pass does some (conservative) check + and attaches an attribute named TritonNvidiaGPUDialect::getWSSupportedAttrName() on + the input module op if the kernel is supported. + }]; + + let constructor = "mlir::createTritonNvidiaGPUWSFeasibilityCheckingPass()"; + + let dependentDialects = [ + "mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect" + ]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"90", + "device compute capability"> + ]; +} + +def TritonGPUWSDecomposing : Pass<"triton-nvidia-gpu-ws-decomposing", "mlir::ModuleOp"> { + let summary = "Clustering on the ops according to their performance hotspots"; + + let description = [{ + Based on compute capability and heuristics, + this pass will identify some operations to be executed in different agents, + by marking them with async 'label'. E.g., + input: + %1 = tt,load %0 ... + %4 = tt.dot %1, %2, %3 ... + output: + %1 = tt,load %0 {async_agent = 0} ... + %4 = tt.dot %1, %2, %3 {async_agent = 1} : ... + }]; + + let constructor = "mlir::createTritonNvidiaGPUWSDecomposingPass()"; + + let dependentDialects = [ + "mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect" + ]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "device compute capability"> + ]; +} + +def TritonGPUWSPipeline : Pass<"triton-nvidia-gpu-ws-pipeline", "mlir::ModuleOp"> { + let summary = "Warp specialization pipeline"; + + let description = [{ + }]; + + let constructor = "mlir::createTritonNvidiaGPUWSPipelinePass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", + "mlir::scf::SCFDialect", + "mlir::arith::ArithDialect"]; + + let options = [ + Option<"numStages", "num-stages", + "int32_t", /*default*/"3", + "number of pipeline stages">, + Option<"numWarps", "num-warps", + "int32_t", /*default*/"12", + "number of warps per block">, + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"90", + "device compute capability"> + ]; +} + +def TritonGPUWSMutex : Pass<"triton-nvidia-gpu-ws-mutex", "mlir::ModuleOp"> { + let summary = "Warp specialization mutex syncronization"; + + let description = [{ + create mutex syncronization for persistent kernel. (as "2 Math WG" persistent kernel in cutlass) + For example, the agent containing dot and store will be divided into two sub-agent, + which execute dot and store alternately. i.e.: + sub-agent-0: dot | store | dot | ... | store + sub-agent-1: | dot | store | ... | dot | store + }]; + + let constructor = "mlir::createTritonNvidiaGPUWSMutexPass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect", + "mlir::scf::SCFDialect", + "mlir::arith::ArithDialect"]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "device compute capability"> + ]; +} + +def TritonGPUWSMaterialization : Pass<"triton-nvidia-gpu-ws-materialization", "mlir::ModuleOp"> { + let summary = "Warp specialization materialization"; + + let description = [{ + }]; + + let constructor = "mlir::createTritonNvidiaGPUWSMaterializationPass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect"]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"90", + "device compute capability"> + ]; +} + +def TritonGPUFenceInsertion : Pass<"triton-nvidia-gpu-fence-insertion", "mlir::ModuleOp"> { + let summary = "Insert fences across generic and async proxy"; + + let description = [{ + }]; + + let constructor = "mlir::createTritonNvidiaGPUFenceInsertionPass()"; + + let dependentDialects = [ + "mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect" + ]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"90", + "device compute capability"> + ]; +} + +def TritonGPURewriteTensorPointer : Pass { + let summary = "Rewrite load/stores with tensor pointers into legacy load/stores"; + let description = [{ + This pass rewrites all load/store semantics initiated by a `tt.make_tensor_ptr` and `tt.advance` into legacy + semantics. After this pass, `tt.make_tensor_ptr` and `tt.advance` will disappear, and it generates logics to compute + the pointer/mask/other for each load/store. + }]; + + let constructor = "mlir::createTritonGPURewriteTensorPointerPass()"; + + let dependentDialects = ["mlir::triton::gpu::TritonGPUDialect", + "mlir::triton::TritonDialect"]; + + let options = [ + Option<"computeCapability", "compute-capability", + "int32_t", /*default*/"80", + "device compute capability"> + ]; +} + +#endif diff --git a/include/triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h new file mode 100644 index 000000000000..7090e937708f --- /dev/null +++ b/include/triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_UTILITY_H_ +#define TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_UTILITY_H_ + +#include "mlir/IR/Matchers.h" +#include "mlir/IR/PatternMatch.h" +#include "llvm/ADT/MapVector.h" + +namespace mlir { + +// 0 is reserved for default sync. +// TODO: comprehensive mechanism to globally manage namedbarrier. +static int const nameBarrierIdBegin = 1; +static int nameBarrierIdEnd = 16; + +/// Helper functions for async agent +typedef int AgentId; +SmallVector getAgentIds(Operation *op); +bool hasAgentId(Operation *op, AgentId agentId); +void setAgentIds(Operation *op, ArrayRef agentIds); +SmallVector collectAgentIds(Operation *op); +void addAgentIds(Operation *op, ArrayRef agents); +SmallVector getMutexBarIds(Operation *op); +SmallVector getMutexNumThreads(Operation *op); + +class OpBuilderWithAgentIds : public OpBuilder { +public: + OpBuilderWithAgentIds(MLIRContext *context) : OpBuilder(context) {} + + void setAgentIdsFromArray(ArrayRef newAgentIds) { + agentIds = SmallVector(newAgentIds.begin(), newAgentIds.end()); + } + + void setAgentIdsFromOp(Operation *op) { + setAgentIdsFromArray(getAgentIds(op)); + } + + void setAgentIdsFromValueUsers(Value value) { + SetVector agentIdSet; + for (Operation *user : value.getUsers()) + for (AgentId agentId : getAgentIds(user)) + agentIdSet.insert(agentId); + setAgentIdsFromArray(agentIdSet.getArrayRef()); + } + + template + OpTy createWithAgentIds(Args &&...args) { + OpTy op = create(std::forward(args)...); + if (!agentIds.empty()) + setAgentIds(op, agentIds); + return op; + } + +private: + SmallVector agentIds; +}; + +/// Constant agent ids +constexpr AgentId kLoadAgentId = 0; +constexpr AgentId kDotAgentId = 1; + +bool isWSCandidateLoad(Operation *op); +bool isWSSupported(ModuleOp m, int computeCapability); + +LogicalResult getDependentValues(Value val, DenseSet &depSet, + const DenseSet &stopSet = {}); +LogicalResult getDependentValues(Operation *op, DenseSet &depSet, + const DenseSet &stopSet = {}); +DenseSet getDependentOps(DenseSet &depSet); + +} // namespace mlir + +#endif // TRITON_DIALECT_TRITONNVIDIAGPU_TRANSFORMS_UTILITY_H_ diff --git a/include/triton/Target/AMDGCN/AMDGCNTranslation.h b/include/triton/Target/AMDGCN/AMDGCNTranslation.h new file mode 100644 index 000000000000..c20f1924db5c --- /dev/null +++ b/include/triton/Target/AMDGCN/AMDGCNTranslation.h @@ -0,0 +1,19 @@ +#ifndef TRITON_TARGET_AMDGCNTRANSLATION_H +#define TRITON_TARGET_AMDGCNTRANSLATION_H + +#include +#include + +namespace llvm { +class Module; +} // namespace llvm + +namespace triton { + +// Translate LLVM IR to AMDGCN code. +std::tuple +translateLLVMIRToAMDGCN(llvm::Module &module, std::string cc); + +} // namespace triton + +#endif diff --git a/include/triton/Target/LLVMIR/LLVMIRTranslation.h b/include/triton/Target/LLVMIR/LLVMIRTranslation.h index 05faee277b44..87e95fb63f9b 100644 --- a/include/triton/Target/LLVMIR/LLVMIRTranslation.h +++ b/include/triton/Target/LLVMIR/LLVMIRTranslation.h @@ -1,5 +1,6 @@ #ifndef TRITON_TARGET_LLVM_IR_LLVM_IR_TRANSLATION_H #define TRITON_TARGET_LLVM_IR_LLVM_IR_TRANSLATION_H +#include "triton/Target/PTX/TmaMetadata.h" #include "llvm/ADT/StringRef.h" #include #include @@ -26,6 +27,7 @@ void addExternalLibs(mlir::ModuleOp &module, std::unique_ptr translateTritonGPUToLLVMIR(llvm::LLVMContext *llvmContext, mlir::ModuleOp module, int computeCapability, + mlir::triton::gpu::TMAMetadataTy &tmaInfos, bool isROCM); // Translate mlir LLVM dialect to LLVMIR, return null if failed. @@ -33,6 +35,9 @@ std::unique_ptr translateLLVMToLLVMIR(llvm::LLVMContext *llvmContext, mlir::ModuleOp module, bool isROCM); +bool linkExternLib(llvm::Module &module, llvm::StringRef name, + llvm::StringRef path, bool isROCM); + } // namespace triton } // namespace mlir diff --git a/include/triton/Target/PTX/TmaMetadata.h b/include/triton/Target/PTX/TmaMetadata.h new file mode 100644 index 000000000000..f183f4e5b0fb --- /dev/null +++ b/include/triton/Target/PTX/TmaMetadata.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_TARGET_PTX_TMAMETADATA_H +#define TRITON_TARGET_PTX_TMAMETADATA_H + +#include "python/triton/third_party/cuda/include/cuda.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/Format.h" +#include "llvm/Support/FormatVariadic.h" +#include +#include +#include + +namespace mlir { +namespace triton { +namespace gpu { + +struct TMAInfo { + // -------------------------------------------- + // informations to be filled into CUtensorMaps + int tensorDataType; + + uint32_t tensorRank; + + // the argument indices for the runtime to get globalAddresses + size_t globalAddressArgIdx; + + // the argument indices for the runtime to get globalDims, -1 stands for this + // dim is padded + std::vector globalDimsArgIdx; + + // the argument indices for the runtime to get globalStrides, -1 stands for + // this dim is padded the runtime need to map the value to internal format + std::vector globalStridesArgIdx; + + std::vector boxDims; + + std::vector elementStrides; + + int interleave; + + int swizzle; + + int l2Promotion; + + int oobFill; + + // -------------------------------------------- + // the argument indices for the runtime to send the address of tma_desc to the + // binary + int TMADescArgIdx; + + template + void dump_vec(const std::vector &vec, llvm::StringRef info) const { + llvm::errs() << info << ": "; + for (const T &e : vec) + llvm::errs() << e << ","; + llvm::errs() << "\n"; + } + + void dump() const { + llvm::errs() << "TMA Info: ----------" + << "\n"; + llvm::errs() << "-- tensorDataType: " << tensorDataType + << ", tensorRank: " << tensorRank << "\n"; + llvm::errs() << "-- globalAddressArgIdx: " << globalAddressArgIdx << "\n"; + llvm::errs() << "-- TMADescArgIdx: " << TMADescArgIdx << "\n"; + dump_vec(globalDimsArgIdx, "-- globalDimsArgIdx"); + dump_vec(globalStridesArgIdx, "-- globalStridesArgIdx"); + dump_vec(boxDims, "-- boxDims"); + dump_vec(elementStrides, "-- elementStrides"); + llvm::errs() << "-- interleave: " << interleave << "\n"; + llvm::errs() << "-- swizzle: " << swizzle << "\n"; + llvm::errs() << "-- l2Promotion: " << l2Promotion << "\n"; + llvm::errs() << "-- oobFill: " << oobFill << "\n"; + }; +}; + +using TMAMetadataTy = std::vector; + +} // namespace gpu +} // namespace triton +} // namespace mlir + +#endif // TRITON_TARGET_PTX_TMAMETADATA_H diff --git a/include/triton/Tools/Sys/GetEnv.hpp b/include/triton/Tools/Sys/GetEnv.hpp index 7dd960070149..5f50401953a3 100644 --- a/include/triton/Tools/Sys/GetEnv.hpp +++ b/include/triton/Tools/Sys/GetEnv.hpp @@ -25,9 +25,13 @@ #include #include #include - namespace triton { +const std::set ENV_VARS = { + "ENABLE_MMA_V3", "TRITON_DISABLE_LINE_INFO", "DISABLE_FAST_REDUCTION", + "ENABLE_TMA", "MLIR_ENABLE_DUMP", "LLVM_IR_ENABLE_DUMP", + "AMDGCN_ENABLE_DUMP"}; + namespace tools { inline std::string getenv(const char *name) { @@ -39,6 +43,9 @@ inline std::string getenv(const char *name) { } inline bool getBoolEnv(const std::string &env) { + std::string msg = "Environment variable " + env + " is not recognized"; + assert(triton::ENV_VARS.find(env.c_str()) != triton::ENV_VARS.end() && + msg.c_str()); const char *s = std::getenv(env.c_str()); std::string str(s ? s : ""); std::transform(str.begin(), str.end(), str.begin(), diff --git a/lib/Analysis/Alias.cpp b/lib/Analysis/Alias.cpp index bc9fb637f6b9..db00c16d1600 100644 --- a/lib/Analysis/Alias.cpp +++ b/lib/Analysis/Alias.cpp @@ -2,6 +2,7 @@ #include "mlir/Dialect/Tensor/IR/Tensor.h" #include "triton/Analysis/Utility.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" namespace mlir { @@ -27,17 +28,21 @@ void SharedMemoryAliasAnalysis::visitOperation( // These ops may allocate a new shared memory buffer. auto result = op->getResult(0); // XXX(Keren): the following ops are always aliasing for now - if (isa(op)) { + if (isa(op)) { // extract_slice %src // trans %src aliasInfo = AliasInfo(operands[0]->getValue()); pessimistic = false; - } else if (isa( - op)) { + } else if (isa(op)) { // insert_slice_async %src, %dst, %index // insert_slice %src into %dst[%offsets] aliasInfo = AliasInfo(operands[1]->getValue()); pessimistic = false; + } else if (isa(op)) { + aliasInfo = AliasInfo(operands[0]->getValue()); + pessimistic = false; } else if (triton::gpu::isSharedEncoding(result)) { aliasInfo.insert(result); pessimistic = false; diff --git a/lib/Analysis/Allocation.cpp b/lib/Analysis/Allocation.cpp index 366823454b5c..8a94058b7f21 100644 --- a/lib/Analysis/Allocation.cpp +++ b/lib/Analysis/Allocation.cpp @@ -16,6 +16,7 @@ using ::mlir::triton::gpu::DotOperandEncodingAttr; using ::mlir::triton::gpu::getContigPerThread; using ::mlir::triton::gpu::getOrder; using ::mlir::triton::gpu::getShapePerCTA; +using ::mlir::triton::gpu::getShapePerCTATile; using ::mlir::triton::gpu::getSizePerThread; using ::mlir::triton::gpu::MmaEncodingAttr; using ::mlir::triton::gpu::SharedEncodingAttr; @@ -57,11 +58,23 @@ getScratchConfigForCvtLayout(triton::gpu::ConvertLayoutOp op, unsigned &inVec, Attribute srcLayout = srcTy.getEncoding(); Attribute dstLayout = dstTy.getEncoding(); - // MmaToDotShortcut doesn't use shared mem - if (srcLayout.isa() && - dstLayout.isa()) - if (isMmaToDotShortcut(srcTy, dstTy)) - return {}; + if (shouldUseDistSmem(srcLayout, dstLayout)) { + // TODO: padding to avoid bank conflicts + return convertType(getShapePerCTA(srcTy)); + } + + // MmaToDotShortcut and MmaToMmaShortcut doesn't use shared mem + if (auto srcMmaLayout = srcLayout.dyn_cast()) { + if (dstLayout.isa()) { + if (isMmaToDotShortcut(srcTy, dstTy)) { + return {}; + } + } else if (auto dstMmaLayout = dstLayout.dyn_cast()) { + if (isMmaToMmaShortcut(srcTy, dstTy)) { + return {}; + } + } + } assert(srcLayout && dstLayout && "Unexpected layout in getScratchConfigForCvtLayout()"); @@ -73,18 +86,18 @@ getScratchConfigForCvtLayout(triton::gpu::ConvertLayoutOp op, unsigned &inVec, inVec = outOrd[0] == 0 ? 1 : inOrd[0] == 0 ? 1 : srcContigPerThread; outVec = outOrd[0] == 0 ? 1 : dstContigPerThread; - auto srcShape = srcTy.getShape(); - auto dstShape = dstTy.getShape(); - auto srcShapePerCTA = getShapePerCTA(srcLayout, srcShape); - auto dstShapePerCTA = getShapePerCTA(dstLayout, dstShape); + auto srcShapePerCTA = getShapePerCTA(srcTy); + auto dstShapePerCTA = getShapePerCTA(dstTy); + auto srcShapePerCTATile = getShapePerCTATile(srcLayout, srcTy.getShape()); + auto dstShapePerCTATile = getShapePerCTATile(dstLayout, dstTy.getShape()); unsigned rank = dstTy.getRank(); SmallVector paddedRepShape(rank); unsigned pad = std::max(inVec, outVec); for (unsigned d = 0; d < rank; ++d) { paddedRepShape[d] = - std::max(std::min(srcTy.getShape()[d], srcShapePerCTA[d]), - std::min(dstTy.getShape()[d], dstShapePerCTA[d])); + std::max(std::min(srcShapePerCTA[d], srcShapePerCTATile[d]), + std::min(dstShapePerCTA[d], dstShapePerCTATile[d])); } if (rank == 1) return paddedRepShape; @@ -146,20 +159,45 @@ class AllocationAnalysis { // For example: %a = scf.if -> yield // %a must be allocated elsewhere by other operations. // FIXME(Keren): extract and insert are always alias for now - if (!maybeSharedAllocationOp(op) || maybeAliasOp(op)) { + if (!maybeSharedAllocationOp(op) || maybeAliasOp(op)) return; - } + // XXX(Keren): Why this hard-coded alignment? + size_t kAlignment = 8; for (Value result : op->getResults()) { if (triton::gpu::isSharedEncoding(result)) { // Bytes could be a different value once we support padding or other // allocation policies. auto tensorType = result.getType().dyn_cast(); - auto bytes = tensorType.getNumElements() * + auto shapePerCTA = triton::gpu::getShapePerCTA(tensorType); + auto bytes = product(shapePerCTA) * tensorType.getElementTypeBitWidth() / 8; - allocation->addBuffer(result, bytes); + + // XXX(Keren): magic numbers 256 and 1024 + // benzh@maybe alignment should be passed in. + // Software swizzling calculates phase based on offset, while hardware + // swizzling do that based on physical address. Thus only by setting the + // alignment to 1024 can ensure the correctness.  + if (bytes > 256) + kAlignment = 1024; + allocation->addBuffer(result, bytes, + kAlignment); } } + if (isa(op)) { + Value result = op->getResult(0); + if (!result.getType().isa()) + // In case AllocMBarrierOp is allocating scalar mbarriers + allocation->addBuffer(result, 8, + kAlignment); + } + } + + template + void maybeAddScratchBuffer(Operation *op, unsigned bytes, + unsigned alignment) { + if (bytes > 0) + allocation->addBuffer(op, bytes, alignment); } template @@ -170,14 +208,17 @@ class AllocationAnalysis { /// Initializes temporary shared memory for a given operation. void getScratchValueSize(Operation *op) { + const size_t scratchAlignment = 128; if (auto reduceOp = dyn_cast(op)) { ReduceOpHelper helper(reduceOp); unsigned bytes = helper.getScratchSizeInBytes(); - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } else if (auto scanOp = dyn_cast(op)) { ScanLoweringHelper helper(scanOp); unsigned bytes = helper.getScratchSizeInBytes(); - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } else if (auto cvtLayout = dyn_cast(op)) { auto srcTy = cvtLayout.getSrc().getType().cast(); auto dstTy = cvtLayout.getResult().getType().cast(); @@ -201,7 +242,8 @@ class AllocationAnalysis { srcTy.getElementType().isa() ? elems * kPtrBitWidth / 8 : elems * std::max(8, srcTy.getElementTypeBitWidth()) / 8; - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } else if (auto atomicRMWOp = dyn_cast(op)) { auto value = op->getOperand(0); // only scalar requires scratch memory @@ -218,7 +260,8 @@ class AllocationAnalysis { elemTy.isa() ? elems * kPtrBitWidth / 8 : elems * std::max(8, elemTy.getIntOrFloatBitWidth()) / 8; - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } } else if (auto atomicCASOp = dyn_cast(op)) { auto value = op->getOperand(0); @@ -230,13 +273,15 @@ class AllocationAnalysis { auto bytes = elemTy.isa() ? elems * kPtrBitWidth / 8 : elems * elemTy.getIntOrFloatBitWidth() / 8; - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } else if (auto callOp = dyn_cast(op)) { auto callable = callOp.resolveCallable(); auto funcOp = dyn_cast(callable); auto *funcAlloc = &(*funcAllocMap)[funcOp]; auto bytes = funcAlloc->getSharedMemorySize(); - maybeAddScratchBuffer(op, bytes); + maybeAddScratchBuffer(op, bytes, + scratchAlignment); } } @@ -356,6 +401,12 @@ class AllocationAnalysis { // Analyze liveness of explicit buffers Liveness liveness(operation); auto getValueLivenessRange = [&](Value value) { + // Shared memory allocated by mbarrier cannot be reused + if (value.getDefiningOp() && + isa(value.getDefiningOp())) + return Interval(std::numeric_limits::min(), + std::numeric_limits::max()); + auto liveOperations = liveness.resolveLiveness(value); auto minId = std::numeric_limits::max(); auto maxId = std::numeric_limits::min(); @@ -437,17 +488,22 @@ class AllocationAnalysis { auto xRange = bufferRange[buffer]; bool res = xRange.intersects(range); for (auto val : tripleMap) - res = res && !val.second.intersects(xRange); + res = res && + !val.second.intersects(xRange); // only one buffer intersect return res; }); if (bufferIt != xBuffers.end()) { auto buffer = *bufferIt; auto xSize = buffer->size; auto xRange = bufferRange.lookup(buffer); - bufferStart[buffer] = size; - tripleMap.insert( - {size + xSize, Interval{std::max(range.start(), xRange.start()), - std::min(range.end(), xRange.end())}}); + // TODO(Keren): A buffer's size shouldn't be determined here, have to + // clean it up + size_t alignment = buffer->alignment; + size_t alignSize = ((size + alignment - 1) / alignment) * alignment; + bufferStart[buffer] = alignSize; + tripleMap.insert({alignSize + xSize, + Interval{std::max(range.start(), xRange.start()), + std::min(range.end(), xRange.end())}}); // We could either insert (range.start, xRange.start) or (range.start, // xRange.end), both are correct and determine the potential buffer // offset, and the graph coloring algorithm will solve the interference, diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt index bb9a21ccf980..df1fe4066188 100644 --- a/lib/Analysis/CMakeLists.txt +++ b/lib/Analysis/CMakeLists.txt @@ -14,4 +14,5 @@ add_mlir_library(TritonAnalysis MLIRLLVMDialect TritonIR TritonGPUIR + TritonNvidiaGPUIR ) diff --git a/lib/Analysis/Membar.cpp b/lib/Analysis/Membar.cpp index c8db99d30490..e8895e0e4050 100644 --- a/lib/Analysis/Membar.cpp +++ b/lib/Analysis/Membar.cpp @@ -2,7 +2,11 @@ #include "triton/Analysis/Alias.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "../lib/Conversion/TritonGPUToLLVM/Utility.h" #include "mlir/Dialect/Func/IR/FuncOps.h" +#include "triton/Conversion/TritonGPUToLLVM/PTXAsmFormat.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + #include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/Dialect/Tensor/IR/Tensor.h" #include @@ -103,7 +107,11 @@ void MembarAnalysis::update(Operation *op, BlockInfo *blockInfo, return; } - if (isa(op)) { + // TODO(Keren): Don't expose LLVM Dialect ops here + if (isa(op) || + (isa(op) && + (dyn_cast(op).getAsmString().find("bar.sync") != + std::string::npos))) { // If the current op is a barrier, we sync previous reads and writes blockInfo->sync(); return; @@ -169,12 +177,23 @@ void MembarAnalysis::update(Operation *op, BlockInfo *blockInfo, if (blockInfo->isIntersected(curBlockInfo)) { OpBuilder::InsertionGuard g(*builder); builder->setInsertionPoint(op); - builder->create(op->getLoc()); - blockInfo->sync(); + // TODO(Keren): Don't expose LLVM Dialect ops here + // TODO[shuhaoj]: Change hard code style of numThreads. Hide async_agent + // attr. Better way to determine barId (number of agents are limited). + if (op->hasAttr("async_agent")) { + int agentId = getAgentIds(op).front(), roleId = 0; + if (op->hasAttr("agent.mutex_role")) + roleId = op->getAttrOfType("agent.mutex_role").getInt(); + int barId = agentId + roleId + nameBarrierIdBegin; + assert(barId < nameBarrierIdEnd); + barSync(*builder, op, barId, 128); + } else { + builder->create(op->getLoc()); + blockInfo->sync(); + } } // Update the region info, even if barrier is inserted, we have to maintain // the current op's read/write buffers. blockInfo->join(curBlockInfo); } - } // namespace mlir diff --git a/lib/Analysis/Utility.cpp b/lib/Analysis/Utility.cpp index 9dc7d6218eb3..ae66b89d51ff 100644 --- a/lib/Analysis/Utility.cpp +++ b/lib/Analysis/Utility.cpp @@ -1,10 +1,14 @@ #include "triton/Analysis/Utility.h" #include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h" #include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h" +#include "mlir/Conversion/LLVMCommon/Pattern.h" +#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" +#include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/IR/Dialect.h" #include "mlir/IR/Matchers.h" #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include "triton/Tools/Sys/GetEnv.hpp" #include @@ -37,6 +41,51 @@ bool ReduceOpHelper::isFastReduction() { getParentOrder(getSrcLayout())[0]; } +// Cases where distributed shared memory is not required in ConvertLayout: +// (1) numCTAs == 1 +// (2) numCTAs > 1 but srcCTALayout == dstCTALayout +// TODO: Case with SliceLayout as srcLayout and numCTAs > 1 is to be implemented +// in the future +bool shouldUseDistSmem(Attribute srcLayout, Attribute dstLayout) { + unsigned numCTAs = triton::gpu::getNumCTAs(srcLayout); + assert(numCTAs == triton::gpu::getNumCTAs(dstLayout) && + "Invalid layout conversion: the numbers of CTAs of src and dst " + "layouts are different"); + + // Case (1): Never use dsmem when numCTAs == 1 + if (numCTAs == 1) + return false; + + // Case where CTAsPerCGA of srcLayout in the sliced dim is not 1 is not + // implemented yet + if (auto sliceLayout = srcLayout.dyn_cast()) { + auto dim = sliceLayout.getDim(); + auto CTAsPerCGA = triton::gpu::getCTAsPerCGA(sliceLayout.getParent()); + if (CTAsPerCGA[dim] != 1) + assert(0 && "Layout conversion to be implemented"); + } + + // Case where CTAsPerCGA of dstLayout in the sliced dim is not 1 is supported + if (auto sliceLayout = dstLayout.dyn_cast()) { + auto dim = sliceLayout.getDim(); + auto CTAsPerCGA = triton::gpu::getCTAsPerCGA(sliceLayout.getParent()); + if (CTAsPerCGA[dim] != 1) + return true; + } + + // The above two branches make sure that it is legal to call getCTALayout of + // srcLayout and dstLayout + + // Case (2): Do not use dsmem when srcCTALayout == dstCTALayout + auto srcCTALayout = triton::gpu::getCTALayout(srcLayout); + auto dstCTALayout = triton::gpu::getCTALayout(dstLayout); + if (srcCTALayout == dstCTALayout) + return false; + + // Dsmem access is required when srcCTALayout != dstCTALayout + return true; +} + unsigned ReduceOpHelper::getInterWarpSize() { auto srcReduceDimSize = static_cast(srcShape[axis]); unsigned sizeIntraWarps = getIntraWarpSize(); @@ -136,7 +185,7 @@ bool ReduceOpHelper::isSupportedLayout() { return true; } if (auto mmaLayout = srcLayout.dyn_cast()) { - if (mmaLayout.isAmpere()) { + if (mmaLayout.isAmpere() || mmaLayout.isHopper()) { return true; } } @@ -282,6 +331,8 @@ bool maybeSharedAllocationOp(Operation *op) { return dialect && (dialect->getTypeID() == mlir::TypeID::get() || + dialect->getTypeID() == + mlir::TypeID::get() || dialect->getTypeID() == mlir::TypeID::get() || dialect->getTypeID() == mlir::TypeID::get() || dialect->getTypeID() == mlir::TypeID::get()); @@ -290,6 +341,8 @@ bool maybeSharedAllocationOp(Operation *op) { bool maybeAliasOp(Operation *op) { return isa(op) || isa(op) || isa(op) || + isa(op) || + isa(op) || isa(op); } @@ -299,6 +352,21 @@ bool supportMMA(triton::DotOp op, int version) { // https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-fragment-mma-884-f16 auto aElemTy = op.getA().getType().cast().getElementType(); auto bElemTy = op.getB().getType().cast().getElementType(); + if (version == 3) { + if (!::triton::tools::getBoolEnv("ENABLE_MMA_V3")) + return false; + auto retType = op.getResult().getType().cast(); + auto retShapePerCTA = triton::gpu::getShapePerCTA(retType); + auto mod = op->getParentOfType(); + int numWarps = triton::gpu::TritonGPUDialect::getNumWarps(mod); + if (!(numWarps % 4 == 0 && retShapePerCTA[0] % 64 == 0 && + retShapePerCTA[1] % 8 == 0 && + (aElemTy.isFloat8E5M2() || aElemTy.isFloat8E4M3FN() || + aElemTy.isInteger(8) || aElemTy.isF16() || aElemTy.isBF16() || + aElemTy.isF32()))) { + return false; + } + } if (aElemTy.isF32() && bElemTy.isF32()) { return op.getAllowTF32() && version >= 2; } @@ -306,24 +374,21 @@ bool supportMMA(triton::DotOp op, int version) { } bool supportMMA(Value value, int version) { - // Tell whether a DotOp support HMMA by the operand type(either $a or $b). + // Tell whether a DotOp support MMA by the operand type(either $a or $b). // We cannot get both the operand types(in TypeConverter), here we assume the // types of both the operands are identical here. - assert((version == 1 || version == 2) && + assert((version == 1 || version == 2 || version == 3) && "Unexpected MMA layout version found"); auto elemTy = value.getType().cast().getElementType(); - return elemTy.isF16() || elemTy.isBF16() || + // FP8 is not natively supported on all mma versions but it can always be + // promoted to fp16 therefore we can always support it. + bool isFP8 = elemTy.isFloat8E5M2() || elemTy.isFloat8E4M3FN() || + elemTy.isFloat8E5M2FNUZ() || elemTy.isFloat8E4M3FNUZ(); + return isFP8 || elemTy.isF16() || elemTy.isBF16() || (elemTy.isF32() && version >= 2) || (elemTy.isInteger(8) && version >= 2); } -Type getElementType(Value value) { - auto type = value.getType(); - if (auto tensorType = type.dyn_cast()) - return tensorType.getElementType(); - return type; -} - bool isMmaToDotShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy) { // dot_op = #mma // when #mma = MmaEncoding @@ -338,6 +403,17 @@ bool isMmaToDotShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy) { !srcTy.getElementType().isF32(); } +bool isMmaToMmaShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy) { + auto src = srcTy.getEncoding().cast(); + auto dst = dstTy.getEncoding().cast(); + auto srcElemsPerThread = triton::gpu::getTotalElemsPerThread(srcTy); + auto dstElemsPerThread = triton::gpu::getTotalElemsPerThread(dstTy); + // when #mma = MmaEncoding + return src.getVersionMajor() == 3 && src.getWarpsPerCTA()[1] == 1 && + dst.getVersionMajor() == 3 && dst.getWarpsPerCTA()[1] == 1 && + srcElemsPerThread == dstElemsPerThread; +} + bool isSingleValue(Value value) { // Don't consider load as expensive if it is loading a scalar. if (auto tensorTy = value.getType().dyn_cast()) @@ -557,4 +633,81 @@ std::unique_ptr createDataFlowSolver() { return solver; } +static triton::MakeTensorPtrOp getMakeTensorPtrOpImpl(Operation *op, Value v) { + + if (auto makeTensorPtrOp = dyn_cast(op)) { + return makeTensorPtrOp; + } + + if (auto advanceOp = dyn_cast(op)) { + return getMakeTensorPtrOp(advanceOp.getPtr()); + } + + if (auto branch = dyn_cast(op)) { + auto idx = v.cast().getResultNumber(); + llvm::SmallVector yieldOps; + op->walk([&](Operation *op) { + if (auto yieldOp = dyn_cast(op)) + yieldOps.push_back(yieldOp); + }); + + // benzh@ if multi yields, all yields operand should come from same arg. + Value newValue = yieldOps[0].getOperands()[idx]; + return getMakeTensorPtrOp(newValue); + } + + llvm_unreachable("Unable to getMakeTensorPtr()"); +} + +triton::MakeTensorPtrOp getMakeTensorPtrOp(Value v) { + using BranchOps = llvm::SetVector>; + llvm::DenseMap blockToCFOps; + auto moduleOp = + v.getParentBlock()->getParentOp()->getParentOfType(); + + moduleOp.walk([&](Operation *op) { + if (auto br = dyn_cast(op)) { + Block *block = br.getDest(); + blockToCFOps[block].insert({op, -1}); + } + if (auto condBr = dyn_cast(op)) { + Block *blockT = condBr.getTrueDest(); + Block *blockF = condBr.getFalseDest(); + blockToCFOps[blockT].insert({condBr, 1}); + blockToCFOps[blockF].insert({condBr, 0}); + } + }); + + if (Operation *definingOp = v.getDefiningOp()) { + return getMakeTensorPtrOpImpl(definingOp, v); + } else if (BlockArgument arg = v.cast()) { + unsigned argNum = arg.getArgNumber(); + Operation *argOwner = arg.getOwner()->getParentOp(); + + if (auto forOp = dyn_cast(argOwner)) { + return getMakeTensorPtrOp( + forOp.getOperand(argNum + forOp.getNumControlOperands() - 1)); + } else if (auto funcOp = dyn_cast(argOwner)) { + Block *block = arg.getOwner(); + Operation *op; + int tOrF; + std::tie(op, tOrF) = blockToCFOps[block][0]; + if (auto br = dyn_cast(op)) { + return getMakeTensorPtrOp(br.getDestOperands()[argNum]); + } + if (auto condBr = dyn_cast(op)) { + if (tOrF) { + return getMakeTensorPtrOp(condBr.getTrueDestOperands()[argNum]); + } else { + return getMakeTensorPtrOp(condBr.getFalseDestOperands()[argNum]); + } + } + } else { + return getMakeTensorPtrOp(argOwner->getOperand(argNum)); + } + } + + llvm_unreachable("Unable to getMakeTensorPtr()"); +} + } // namespace mlir diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index ab1d31a76317..77df1534e53d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -3,3 +3,4 @@ add_subdirectory(Analysis) add_subdirectory(Conversion) add_subdirectory(Dialect) add_subdirectory(Target) +add_subdirectory(Hopper) diff --git a/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.cpp new file mode 100644 index 000000000000..ca0970a7c9e4 --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "BarrierOpToLLVM.h" + +using namespace mlir; +using namespace mlir::triton; + +// -------------------------------------------------------------------------- +// -- MBarrier related Ops lowering, to be moved to a seperate file --------- +// -------------------------------------------------------------------------- +struct AllocMBarrierOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::AllocMBarrierOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::AllocMBarrierOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::AllocMBarrierOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + Value smemBase = getSharedMemoryBase(loc, rewriter, op.getResult()); + auto resultTy = op.getType(); + auto resultTensorTy = resultTy.dyn_cast(); + Type elemPtrTy; + if (resultTensorTy) { + auto llvmElemTy = + getTypeConverter()->convertType(resultTensorTy.getElementType()); + elemPtrTy = ptr_ty(llvmElemTy, 3); + } else { + elemPtrTy = getTypeConverter()->convertType(resultTy); + } + smemBase = bitcast(smemBase, elemPtrTy); + auto threadId = getThreadId(rewriter, loc); + auto pred = icmp_eq(threadId, i32_val(0)); + int numMBarriers = 1; + if (resultTensorTy) { + assert(resultTensorTy.getRank() == 1 && + "unexpected rank for AllocMBarrierOp"); + numMBarriers = resultTensorTy.getShape()[0]; + } + for (int i = 0; i < numMBarriers; ++i) { + Value smem = smemBase; + if (i > 0) { + smem = gep(elemPtrTy, smem, i32_val(i)); + } + rewriter.create(loc, smem, pred, + op.getCount()); + } + if (resultTensorTy) { + auto smemObj = SharedMemoryObject(smemBase, resultTensorTy.getShape(), + {0}, loc, rewriter); + auto retVal = getStructFromSharedMemoryObject(loc, smemObj, rewriter); + rewriter.replaceOp(op, retVal); + } else { + rewriter.replaceOp(op, smemBase); + } + return success(); + } +}; + +struct MBarrierArriveOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::MBarrierArriveOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::MBarrierArriveOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::MBarrierArriveOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + auto mbarrier = adaptor.getMbarrier(); + bool trackAsyncOp = op.getTrackAsyncOp(); + triton::nvgpu::MBarriveType type = triton::nvgpu::MBarriveType::normal; + uint32_t txCount = op.getTxCount(); + auto remoteCtaId = adaptor.getRemoteCtaId(); + if (trackAsyncOp) { + type = triton::nvgpu::MBarriveType::cp_async; + } else if (remoteCtaId) { + assert(txCount == 0 && + "remote arrive of transaction mbarrier is not implemented yet"); + type = triton::nvgpu::MBarriveType::remote; + } else if (txCount > 0) { + type = triton::nvgpu::MBarriveType::expect_tx; + } + Value pred = adaptor.getPred(); + if (pred == nullptr) { + pred = int_val(/*width*/ 1, 1); + } + rewriter.replaceOpWithNewOp( + op, mbarrier, pred, remoteCtaId, type, txCount); + return success(); + } +}; + +struct MBarrierWaitOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::MBarrierWaitOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::MBarrierWaitOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::MBarrierWaitOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getMbarrier(), adaptor.getPhase()); + return success(); + } +}; + +struct ExtractMBarrierOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ExtractMBarrierOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ExtractMBarrierOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::ExtractMBarrierOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + auto elemTy = + op.getTensor().getType().cast().getElementType(); + auto tensorStruct = adaptor.getTensor(); + auto index = adaptor.getIndex(); + auto ptrTy = + LLVM::LLVMPointerType::get(getTypeConverter()->convertType(elemTy), 3); + auto basePtr = + extract_val(ptrTy, tensorStruct, rewriter.getDenseI64ArrayAttr(0)); + Value result = gep(ptrTy, basePtr, index); + rewriter.replaceOp(op, result); + return success(); + } +}; + +struct NamedBarrierArriveOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::NamedBarrierArriveOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::NamedBarrierArriveOp>:: + ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::NamedBarrierArriveOp op, + OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getBar(), adaptor.getNumThreads()); + return success(); + } +}; + +struct NamedBarrierWaitOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::NamedBarrierWaitOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::NamedBarrierWaitOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::NamedBarrierWaitOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getBar(), adaptor.getNumThreads()); + return success(); + } +}; + +struct FenceAsyncSharedOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::FenceAsyncSharedOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::FenceAsyncSharedOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::FenceAsyncSharedOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getBCluster()); + return success(); + } +}; + +void populateBarrierOpToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit) { + patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, + benefit); + patterns.add(typeConverter, allocation, + benefit); + patterns.add(typeConverter, allocation, + benefit); +} diff --git a/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.h new file mode 100644 index 000000000000..1e8f53bc6571 --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/BarrierOpToLLVM.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_CONVERSION_TRITONGPU_TO_LLVM_BARRIER_OP_H +#define TRITON_CONVERSION_TRITONGPU_TO_LLVM_BARRIER_OP_H + +#include "TritonGPUToLLVMBase.h" + +using namespace mlir; +using namespace mlir::triton; + +void populateBarrierOpToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit); + +#endif diff --git a/lib/Conversion/TritonGPUToLLVM/CMakeLists.txt b/lib/Conversion/TritonGPUToLLVM/CMakeLists.txt index 98fce466ac01..fb855fcc3ddc 100644 --- a/lib/Conversion/TritonGPUToLLVM/CMakeLists.txt +++ b/lib/Conversion/TritonGPUToLLVM/CMakeLists.txt @@ -1,4 +1,16 @@ add_mlir_conversion_library(TritonGPUToLLVM + ConvertLayoutOpToLLVM/SharedToDotOperandFMA.cpp + ConvertLayoutOpToLLVM/SharedToDotOperandMMAv1.cpp + ConvertLayoutOpToLLVM/SharedToDotOperandMMAv2.cpp + ConvertLayoutOpToLLVM.cpp + DotOpToLLVM/FMA.cpp + DotOpToLLVM/MMAv1.cpp + DotOpToLLVM/MMAv2.cpp + DotOpToLLVM/WGMMA.cpp + DotOpToLLVM.cpp + ElementwiseOpToLLVM.cpp + LoadStoreOpToLLVM.cpp + BarrierOpToLLVM.cpp TritonGPUToLLVM.cpp GCNAsmFormat.cpp PTXAsmFormat.cpp @@ -15,12 +27,16 @@ add_mlir_conversion_library(TritonGPUToLLVM LoadStoreOpToLLVM.cpp TritonGPUToLLVM.cpp TritonGPUToLLVMPass.cpp + GCNAsmFormat.cpp PTXAsmFormat.cpp ReduceOpToLLVM.cpp ScanOpToLLVM.cpp - Utility.cpp TypeConverter.cpp + Utility.cpp ViewOpToLLVM.cpp + TensorPtrOpsToLLVM.cpp + ClusterOpsToLLVM.cpp + RegReallocOpToLLVM.cpp ADDITIONAL_HEADER_DIRS ${PROJECT_SOURCE_DIR}/include/triton/Conversion/TritonGPUToLLVM @@ -43,4 +59,6 @@ add_mlir_conversion_library(TritonGPUToLLVM TritonIR TritonGPUIR TritonGPUTransforms + TritonNvidiaGPUTransforms + NVGPUIR ) diff --git a/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.cpp new file mode 100644 index 000000000000..42bbf04839bb --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "ClusterOpsToLLVM.h" +using namespace mlir; +using namespace mlir::triton; + +struct ClusterArriveOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ClusterArriveOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ClusterArriveOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::ClusterArriveOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOpWithNewOp( + op, op.getRelaxed()); + return success(); + } +}; + +struct ClusterWaitOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ClusterWaitOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::ClusterWaitOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::ClusterWaitOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOpWithNewOp(op); + return success(); + } +}; + +void populateClusterOpsToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit) { + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + return; +} diff --git a/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.h new file mode 100644 index 000000000000..693310afa39a --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/ClusterOpsToLLVM.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_CONVERSION_TRITONGPU_TO_LLVM_CLUSTER_OPS_H +#define TRITON_CONVERSION_TRITONGPU_TO_LLVM_CLUSTER_OPS_H + +#include "TritonGPUToLLVMBase.h" + +using namespace mlir; +using namespace mlir::triton; + +void populateClusterOpsToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit); + +#endif diff --git a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp index 5b7c8b3507ba..9a43272f163a 100644 --- a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp @@ -1,14 +1,18 @@ #include "ConvertLayoutOpToLLVM.h" #include "Utility.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" -using ::mlir::LLVM::delinearize; using ::mlir::LLVM::getSharedMemoryObjectFromStruct; using ::mlir::LLVM::getStridesFromShapeAndOrder; using ::mlir::LLVM::linearize; + +using ::mlir::LLVM::getSharedMemoryObjectFromStruct; +using ::mlir::LLVM::getStridesFromShapeAndOrder; using ::mlir::triton::gpu::DotOperandEncodingAttr; using ::mlir::triton::gpu::getContigPerThread; using ::mlir::triton::gpu::getOrder; using ::mlir::triton::gpu::getShapePerCTA; +using ::mlir::triton::gpu::getShapePerCTATile; using ::mlir::triton::gpu::getSizePerThread; using ::mlir::triton::gpu::getTotalElemsPerThread; using ::mlir::triton::gpu::isaDistributedLayout; @@ -72,6 +76,13 @@ struct ConvertLayoutOpConversion dstLayout.isa()) { return lowerSharedToDotOperand(op, adaptor, rewriter); } + // forwarding on mma->mma shortcut, lower distributed->distributed otherwise + if (srcLayout.isa() && dstLayout.isa()) { + if (isMmaToMmaShortcut(srcTy, dstTy)) { + rewriter.replaceOp(op, op.getSrc()); + return success(); + } + } if (isaDistributedLayout(srcLayout) && isaDistributedLayout(dstLayout)) { return lowerDistributedToDistributed(op, adaptor, rewriter); } @@ -89,23 +100,25 @@ struct ConvertLayoutOpConversion } private: - SmallVector getMultiDimOffset(Attribute layout, Location loc, - ConversionPatternRewriter &rewriter, - unsigned elemId, RankedTensorType type, - ArrayRef multiDimCTAInRepId, - ArrayRef shapePerCTA) const { + SmallVector + getMultiDimOffset(Attribute layout, Location loc, + ConversionPatternRewriter &rewriter, unsigned elemId, + RankedTensorType type, + ArrayRef multiDimCTAInRepId, + ArrayRef shapePerCTATile) const { auto shape = type.getShape(); unsigned rank = shape.size(); if (auto blockedLayout = layout.dyn_cast()) { auto multiDimOffsetFirstElem = - emitBaseIndexForLayout(loc, rewriter, blockedLayout, type); + emitBaseIndexForLayout(loc, rewriter, blockedLayout, type, false); SmallVector multiDimOffset(rank); SmallVector multiDimElemId = getMultiDimIndex( elemId, getSizePerThread(layout), getOrder(layout)); for (unsigned d = 0; d < rank; ++d) { - multiDimOffset[d] = add(multiDimOffsetFirstElem[d], - i32_val(multiDimCTAInRepId[d] * shapePerCTA[d] + - multiDimElemId[d])); + multiDimOffset[d] = + add(multiDimOffsetFirstElem[d], + i32_val(multiDimCTAInRepId[d] * shapePerCTATile[d] + + multiDimElemId[d])); } return multiDimOffset; } @@ -127,7 +140,7 @@ struct ConvertLayoutOpConversion auto multiDimOffsetParent = getMultiDimOffset( parentEncoding, loc, rewriter, idxs[elemId], parentTy, sliceLayout.paddedShape(multiDimCTAInRepId), - sliceLayout.paddedShape(shapePerCTA)); + sliceLayout.paddedShape(shapePerCTATile)); SmallVector multiDimOffset(rank); for (unsigned d = 0; d < rank + 1; ++d) { if (d == dim) @@ -138,6 +151,8 @@ struct ConvertLayoutOpConversion return multiDimOffset; } if (auto mmaLayout = layout.dyn_cast()) { + auto shapePerCTA = getShapePerCTA(mmaLayout, shape); + auto instrShape = mmaLayout.getInstrShape(); SmallVector mmaColIdx(4); SmallVector mmaRowIdx(2); Value threadId = getThreadId(rewriter, loc); @@ -145,27 +160,35 @@ struct ConvertLayoutOpConversion Value laneId = urem(threadId, warpSize); Value warpId = udiv(threadId, warpSize); // TODO: fix the bug in MMAEncodingAttr document + SmallVector multiDimWarpId(2); auto warpsPerCTA = mmaLayout.getWarpsPerCTA(); - auto order = triton::gpu::getOrder(mmaLayout); - SmallVector multiDimWarpId = - delinearize(rewriter, loc, warpId, warpsPerCTA, order); + if (mmaLayout.isHopper()) { + multiDimWarpId[0] = urem(warpId, i32_val(warpsPerCTA[0])); + multiDimWarpId[1] = udiv(warpId, i32_val(warpsPerCTA[0])); + } else { + auto order = triton::gpu::getOrder(mmaLayout); + multiDimWarpId = delinearize(rewriter, loc, warpId, warpsPerCTA, order); + } Value _1 = i32_val(1); Value _2 = i32_val(2); Value _4 = i32_val(4); Value _8 = i32_val(8); Value _16 = i32_val(16); - if (mmaLayout.isAmpere()) { - multiDimWarpId[0] = urem(multiDimWarpId[0], i32_val(shape[0] / 16)); - multiDimWarpId[1] = urem(multiDimWarpId[1], i32_val(shape[1] / 8)); + if (mmaLayout.isAmpere() || mmaLayout.isHopper()) { + multiDimWarpId[0] = + urem(multiDimWarpId[0], i32_val(shapePerCTA[0] / instrShape[0])); + multiDimWarpId[1] = + urem(multiDimWarpId[1], i32_val(shapePerCTA[1] / instrShape[1])); + Value mmaGrpId = udiv(laneId, _4); Value mmaGrpIdP8 = add(mmaGrpId, _8); Value mmaThreadIdInGrp = urem(laneId, _4); Value mmaThreadIdInGrpM2 = mul(mmaThreadIdInGrp, _2); Value mmaThreadIdInGrpM2P1 = add(mmaThreadIdInGrpM2, _1); - Value rowWarpOffset = mul(multiDimWarpId[0], _16); + Value rowWarpOffset = mul(multiDimWarpId[0], i32_val(instrShape[0])); mmaRowIdx[0] = add(mmaGrpId, rowWarpOffset); mmaRowIdx[1] = add(mmaGrpIdP8, rowWarpOffset); - Value colWarpOffset = mul(multiDimWarpId[1], _8); + Value colWarpOffset = mul(multiDimWarpId[1], i32_val(instrShape[1])); mmaColIdx[0] = add(mmaThreadIdInGrpM2, colWarpOffset); mmaColIdx[1] = add(mmaThreadIdInGrpM2P1, colWarpOffset); } else if (mmaLayout.isVolta()) { @@ -176,13 +199,27 @@ struct ConvertLayoutOpConversion assert(rank == 2); SmallVector multiDimOffset(rank); - if (mmaLayout.isAmpere()) { + if (mmaLayout.isHopper()) { + unsigned elemIdRem4 = elemId % 4; + unsigned nGrpId = elemId / 4; + multiDimOffset[0] = elemIdRem4 < 2 ? mmaRowIdx[0] : mmaRowIdx[1]; + multiDimOffset[1] = elemIdRem4 % 2 == 0 ? mmaColIdx[0] : mmaColIdx[1]; + multiDimOffset[1] = add(multiDimOffset[1], i32_val(8 * nGrpId)); + multiDimOffset[0] = + add(multiDimOffset[0], + i32_val(multiDimCTAInRepId[0] * shapePerCTATile[0])); + multiDimOffset[1] = + add(multiDimOffset[1], + i32_val(multiDimCTAInRepId[1] * shapePerCTATile[1])); + } else if (mmaLayout.isAmpere()) { multiDimOffset[0] = elemId < 2 ? mmaRowIdx[0] : mmaRowIdx[1]; multiDimOffset[1] = elemId % 2 == 0 ? mmaColIdx[0] : mmaColIdx[1]; - multiDimOffset[0] = add( - multiDimOffset[0], i32_val(multiDimCTAInRepId[0] * shapePerCTA[0])); - multiDimOffset[1] = add( - multiDimOffset[1], i32_val(multiDimCTAInRepId[1] * shapePerCTA[1])); + multiDimOffset[0] = + add(multiDimOffset[0], + i32_val(multiDimCTAInRepId[0] * shapePerCTATile[0])); + multiDimOffset[1] = + add(multiDimOffset[1], + i32_val(multiDimCTAInRepId[1] * shapePerCTATile[1])); } else if (mmaLayout.isVolta()) { auto [isARow, isBRow, isAVec4, isBVec4, _] = mmaLayout.decodeVoltaLayoutStates(); @@ -211,11 +248,12 @@ struct ConvertLayoutOpConversion auto rank = type.getRank(); auto sizePerThread = getSizePerThread(layout); auto accumSizePerThread = product(sizePerThread); - SmallVector numCTAs(rank); + SmallVector numCTATiles(rank); + auto shapePerCTATile = getShapePerCTATile(layout); auto shapePerCTA = getShapePerCTA(layout, type.getShape()); auto order = getOrder(layout); for (unsigned d = 0; d < rank; ++d) { - numCTAs[d] = ceil(type.getShape()[d], shapePerCTA[d]); + numCTATiles[d] = ceil(shapePerCTA[d], shapePerCTATile[d]); } auto elemTy = type.getElementType(); bool isInt1 = elemTy.isInteger(1); @@ -238,17 +276,16 @@ struct ConvertLayoutOpConversion } auto linearCTAId = - getLinearIndex(multiDimCTAId, numCTAs, order); + getLinearIndex(multiDimCTAId, numCTATiles, order); // TODO: This is actually redundant index calculation, we should // consider of caching the index calculation result in case // of performance issue observed. for (unsigned elemId = 0; elemId < accumSizePerThread; elemId += vec) { SmallVector multiDimOffset = getMultiDimOffset(layout, loc, rewriter, elemId, type, - multiDimCTAInRepId, shapePerCTA); + multiDimCTAInRepId, shapePerCTATile); Value offset = linearize(rewriter, loc, multiDimOffset, paddedRepShape, outOrd); - auto elemPtrTy = ptr_ty(llvmElemTy, 3); Value ptr = gep(elemPtrTy, smemBase, offset); auto vecTy = vec_ty(llvmElemTy, vec); @@ -305,7 +342,8 @@ struct ConvertLayoutOpConversion SmallVector numCTAs(rank, 1); SmallVector numCTAsEachRep(rank, 1); - SmallVector shapePerCTA = getShapePerCTA(layout, shape); + SmallVector shapePerCTATile = getShapePerCTATile(layout, shape); + SmallVector shapePerCTA = getShapePerCTA(layout, shape); auto elemTy = type.getElementType(); int ctaId = 0; @@ -335,7 +373,7 @@ struct ConvertLayoutOpConversion // duplicate in Volta. SmallVector multiDimOffset = getMultiDimOffset(layout, loc, rewriter, elemId, type, - multiDimCTAInRepId, shapePerCTA); + multiDimCTAInRepId, shapePerCTATile); coord2val[elemId] = std::make_pair(multiDimOffset, vals[elemId]); } @@ -343,7 +381,7 @@ struct ConvertLayoutOpConversion // do transpose auto aEncoding = DotOperandEncodingAttr::get(mma.getContext(), 0, mma, 0); - int numM = aEncoding.getMMAv1NumOuter(shape); + int numM = aEncoding.getMMAv1NumOuter(shapePerCTA); int numN = accumSizePerThread / numM; for (int r = 0; r < numM; r++) { @@ -382,6 +420,91 @@ struct ConvertLayoutOpConversion } } + LogicalResult + lowerDistToDistWithDistSmem(triton::gpu::ConvertLayoutOp op, + OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const { + auto loc = op.getLoc(); + + Value src = op.getSrc(); + Value dst = op.getResult(); + auto srcTy = src.getType().cast(); + auto dstTy = dst.getType().cast(); + auto srcLayout = srcTy.getEncoding(); + auto dstLayout = dstTy.getEncoding(); + auto srcShapePerCTA = getShapePerCTA(srcTy); + auto srcCTAsPerCGA = triton::gpu::getCTAsPerCGA(srcLayout); + auto srcCTAOrder = triton::gpu::getCTAOrder(srcLayout); + unsigned rank = srcShapePerCTA.size(); + + auto llvmElemTy = getTypeConverter()->convertType(dstTy.getElementType()); + auto elemPtrTy = ptr_ty(llvmElemTy, 3); + + Value smemBase = getSharedMemoryBase(loc, rewriter, op.getOperation()); + smemBase = bitcast(smemBase, elemPtrTy); + auto smemShape = convertType(srcShapePerCTA); + + // Store to local shared memory + { + auto inVals = getTypeConverter()->unpackLLElements(loc, adaptor.getSrc(), + rewriter, srcTy); + auto inIndices = + emitIndices(loc, rewriter, srcLayout, srcTy, /*withCTAOffset*/ false); + + assert(inIndices.size() == inVals.size() && + "Unexpected number of indices emitted"); + + for (unsigned i = 0; i < inIndices.size(); ++i) { + Value offset = linearize(rewriter, loc, inIndices[i], smemShape); + Value ptr = gep(elemPtrTy, smemBase, offset); + store(inVals[i], ptr); + } + } + + // Cluster barrier + rewriter.create(loc, false); + rewriter.create(loc); + + // Load from remote shared memory + { + SmallVector srcShapePerCTACache; + for (unsigned i = 0; i < rank; ++i) + srcShapePerCTACache.push_back(i32_val(srcShapePerCTA[i])); + + SmallVector outVals; + auto outIndices = + emitIndices(loc, rewriter, dstLayout, dstTy, /*withCTAOffset*/ true); + + for (unsigned i = 0; i < outIndices.size(); ++i) { + auto coord = outIndices[i]; + assert(coord.size() == rank && "Unexpected rank of index emitted"); + + SmallVector multiDimCTAId, localCoord; + for (unsigned d = 0; d < rank; ++d) { + multiDimCTAId.push_back(udiv(coord[d], srcShapePerCTACache[d])); + localCoord.push_back(urem(coord[d], srcShapePerCTACache[d])); + } + + Value remoteCTAId = + linearize(rewriter, loc, multiDimCTAId, srcCTAsPerCGA, srcCTAOrder); + Value localOffset = linearize(rewriter, loc, localCoord, smemShape); + + Value ptr = gep(elemPtrTy, smemBase, localOffset); + outVals.push_back(load_dsmem(ptr, remoteCTAId)); + } + + Value result = + getTypeConverter()->packLLElements(loc, outVals, rewriter, dstTy); + rewriter.replaceOp(op, result); + } + + // Cluster barrier + rewriter.create(loc, false); + rewriter.create(loc); + + return success(); + } + // blocked/mma -> blocked/mma. // Data padding in shared memory to avoid bank conflict. LogicalResult @@ -395,6 +518,10 @@ struct ConvertLayoutOpConversion auto dstTy = dst.getType().cast(); Attribute srcLayout = srcTy.getEncoding(); Attribute dstLayout = dstTy.getEncoding(); + + if (shouldUseDistSmem(srcLayout, dstLayout)) + return lowerDistToDistWithDistSmem(op, adaptor, rewriter); + auto llvmElemTy = getTypeConverter()->convertType(dstTy.getElementType()); Value smemBase = getSharedMemoryBase(loc, rewriter, op.getOperation()); auto elemPtrTy = ptr_ty(llvmElemTy, 3); @@ -406,8 +533,9 @@ struct ConvertLayoutOpConversion SmallVector outNumCTAsEachRep(rank); SmallVector inNumCTAs(rank); SmallVector outNumCTAs(rank); - auto srcShapePerCTA = getShapePerCTA(srcLayout, srcTy.getShape()); - auto dstShapePerCTA = getShapePerCTA(dstLayout, shape); + auto srcShapePerCTATile = getShapePerCTATile(srcLayout, srcTy.getShape()); + auto dstShapePerCTATile = getShapePerCTATile(dstLayout, shape); + auto shapePerCTA = getShapePerCTA(srcLayout, shape); // For Volta, all the coords for a CTA are calculated. bool isSrcMmaV1{}, isDstMmaV1{}; @@ -427,15 +555,17 @@ struct ConvertLayoutOpConversion } for (unsigned d = 0; d < rank; ++d) { - unsigned inPerCTA = std::min(shape[d], srcShapePerCTA[d]); - unsigned outPerCTA = std::min(shape[d], dstShapePerCTA[d]); + unsigned inPerCTA = + std::min(shapePerCTA[d], srcShapePerCTATile[d]); + unsigned outPerCTA = + std::min(shapePerCTA[d], dstShapePerCTATile[d]); unsigned maxPerCTA = std::max(inPerCTA, outPerCTA); - numReplicates[d] = ceil(shape[d], maxPerCTA); + numReplicates[d] = ceil(shapePerCTA[d], maxPerCTA); inNumCTAsEachRep[d] = maxPerCTA / inPerCTA; outNumCTAsEachRep[d] = maxPerCTA / outPerCTA; assert(maxPerCTA % inPerCTA == 0 && maxPerCTA % outPerCTA == 0); - inNumCTAs[d] = ceil(shape[d], inPerCTA); - outNumCTAs[d] = ceil(shape[d], outPerCTA); + inNumCTAs[d] = ceil(shapePerCTA[d], inPerCTA); + outNumCTAs[d] = ceil(shapePerCTA[d], outPerCTA); } // Potentially we need to store for multiple CTAs in this replication auto accumNumReplicates = product(numReplicates); @@ -456,8 +586,26 @@ struct ConvertLayoutOpConversion for (unsigned repId = 0; repId < accumNumReplicates; ++repId) { auto multiDimRepId = getMultiDimIndex(repId, numReplicates, outOrd); - if (repId != 0) - barrier(); + if (repId != 0) { + // TODO[shuhaoj]: change hard code style of numThreads. Hide async + // attr. Better way to determine barId (number of agents are limited). + if (op->hasAttr("async_agent")) { + int agentId = getAgentIds(op).front(), roleId = 0; + if (op->hasAttr("agent.mutex_role")) + roleId = + op->getAttrOfType("agent.mutex_role").getInt(); + int barId = agentId + roleId + nameBarrierIdBegin; + assert(barId < nameBarrierIdEnd); + auto bar = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(barId)); + auto kNumThreads = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(128)); + rewriter.create(loc, bar, + kNumThreads); + } else { + barrier(); + } + } if (srcLayout.isa() || srcLayout.isa() || srcLayout.isa()) { @@ -474,7 +622,23 @@ struct ConvertLayoutOpConversion return failure(); } - barrier(); + // TODO[shuhaoj]: change hard code style of numThreads. Hide async_agent + // attr. Better way to determine barId (number of agents are limited). + if (op->hasAttr("async_agent")) { + int agentId = getAgentIds(op).front(), roleId = 0; + if (op->hasAttr("agent.mutex_role")) + roleId = op->getAttrOfType("agent.mutex_role").getInt(); + int barId = agentId + roleId + nameBarrierIdBegin; + assert(barId < nameBarrierIdEnd); + auto bar = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(barId)); + auto kNumThreads = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(128)); + rewriter.create(loc, bar, + kNumThreads); + } else { + barrier(); + } if (dstLayout.isa() || dstLayout.isa() || dstLayout.isa()) { @@ -545,7 +709,7 @@ struct ConvertLayoutOpConversion auto srcTy = src.getType().cast(); auto srcShape = srcTy.getShape(); auto dstTy = dst.getType().cast(); - auto dstShape = dstTy.getShape(); + auto dstShapePerCTA = triton::gpu::getShapePerCTA(dstTy); assert(srcShape.size() == 2 && "Unexpected rank of ConvertLayout(blocked->shared)"); auto srcLayout = srcTy.getEncoding(); @@ -557,13 +721,93 @@ struct ConvertLayoutOpConversion auto elemPtrTy = ptr_ty(getTypeConverter()->convertType(elemTy), 3); smemBase = bitcast(smemBase, elemPtrTy); - auto dstStrides = - getStridesFromShapeAndOrder(dstShape, outOrd, loc, rewriter); - auto srcIndices = emitIndices(loc, rewriter, srcLayout, srcTy); - storeDistributedToShared(src, adaptor.getSrc(), dstStrides, srcIndices, dst, - smemBase, elemTy, loc, rewriter); + int32_t elemSize = elemTy.getIntOrFloatBitWidth(); + auto mmaLayout = srcLayout.dyn_cast(); + unsigned numElems = triton::gpu::getTotalElemsPerThread(srcTy); + if (mmaLayout && mmaLayout.isHopper() && elemSize == 16 && + inOrd == outOrd && numElems >= 16) { + auto inVals = getTypeConverter()->unpackLLElements(loc, adaptor.getSrc(), + rewriter, srcTy); + + auto srcShapePerCTA = getShapePerCTA(mmaLayout, srcShape); + auto instrShape = mmaLayout.getInstrShape(); + auto warpsPerCTA = mmaLayout.getWarpsPerCTA(); + uint32_t repM = + ceil(srcShapePerCTA[0], instrShape[0] * warpsPerCTA[0]); + uint32_t numElemsPerRep = numElems / repM; + // rowStride in bytes + uint32_t rowStrideInBytes = dstShapePerCTA[outOrd[0]] * 2; + uint32_t swizzlingByteWidth = rowStrideInBytes; + if (swizzlingByteWidth > 128) + swizzlingByteWidth = 128; + + unsigned numElemsPerSwizzlingRow = swizzlingByteWidth * 8 / elemSize; + unsigned leadingDimOffset = + numElemsPerSwizzlingRow * srcShapePerCTA[outOrd[1]]; + + auto ptrI8SharedTy = LLVM::LLVMPointerType::get( + typeConverter->convertType(rewriter.getI8Type()), 3); + + uint32_t rowsPerRep = getShapePerCTATile(mmaLayout)[0]; + + Value threadId = getThreadId(rewriter, loc); + Value warpId = udiv(threadId, i32_val(32)); + Value warpId0 = urem(urem(warpId, i32_val(warpsPerCTA[0])), + i32_val(srcShape[0] / instrShape[0])); + + for (int rep = 0; rep < repM; ++rep) { + Value rowOfWarp = add(mul(warpId0, i32_val(instrShape[0])), + i32_val(rep * rowsPerRep)); + uint32_t elemIdxOffset = rep * numElemsPerRep; + + for (unsigned idx = 0; idx < numElemsPerRep; idx += 8) { + uint32_t elemIdx = elemIdxOffset + idx; + + Value offset = rewriter.create( + loc, i32_ty, threadId, rowOfWarp, i32_val(idx), leadingDimOffset, + numElemsPerSwizzlingRow, true); + + Value addr = gep(elemPtrTy, smemBase, offset); + Value data0 = rewriter.create( + loc, i32_ty, inVals[elemIdx + 1], inVals[elemIdx + 0]); + Value data1 = rewriter.create( + loc, i32_ty, inVals[elemIdx + 3], inVals[elemIdx + 2]); + Value data2 = rewriter.create( + loc, i32_ty, inVals[elemIdx + 5], inVals[elemIdx + 4]); + Value data3 = rewriter.create( + loc, i32_ty, inVals[elemIdx + 7], inVals[elemIdx + 6]); + + rewriter.create( + loc, bitcast(addr, ptrI8SharedTy), + ValueRange{data0, data1, data2, data3}); + } + } + // TODO[shuhaoj]: change hard code style of numThreads. Hide async_agent + // attr. Better way to determine barId (number of agents are limited). + if (op->hasAttr("async_agent")) { + int agentId = getAgentIds(op).front(), roleId = 0; + if (op->hasAttr("agent.mutex_role")) + roleId = op->getAttrOfType("agent.mutex_role").getInt(); + int barId = agentId + roleId + nameBarrierIdBegin; + assert(barId < nameBarrierIdEnd); + auto bar = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(barId)); + auto kNumThreads = rewriter.create( + loc, i32_ty, rewriter.getI32IntegerAttr(128)); + rewriter.create(loc, bar, + kNumThreads); + } else { + barrier(); + } + } else { + auto dstStrides = + getStridesFromShapeAndOrder(dstShapePerCTA, outOrd, loc, rewriter); + auto srcIndices = emitIndices(loc, rewriter, srcLayout, srcTy, false); + storeDistributedToShared(src, adaptor.getSrc(), dstStrides, srcIndices, + dst, smemBase, elemTy, loc, rewriter); + } auto smemObj = - SharedMemoryObject(smemBase, dstShape, outOrd, loc, rewriter); + SharedMemoryObject(smemBase, dstShapePerCTA, outOrd, loc, rewriter); auto retVal = getStructFromSharedMemoryObject(loc, smemObj, rewriter); rewriter.replaceOp(op, retVal); return success(); @@ -688,19 +932,16 @@ struct ConvertLayoutOpConversion auto loc = op.getLoc(); Value src = op.getSrc(); Value dst = op.getResult(); + bool isMMA = supportMMA(dst, mmaLayout.getVersionMajor()); auto smemObj = getSharedMemoryObjectFromStruct(loc, adaptor.getSrc(), rewriter); Value res; - if (!isOuter && mmaLayout.isAmpere()) { // tensor core v2 - res = SharedToDotOperandMMAv2::convertLayout( dotOperandLayout.getOpIdx(), rewriter, loc, src, dotOperandLayout, - smemObj, getTypeConverter(), tid_val()); - - } else if (!isOuter && mmaLayout.isVolta() && - supportMMA(dst, mmaLayout.getVersionMajor())) { // tensor core v1 + smemObj, getTypeConverter(), getThreadId(rewriter, loc)); + } else if (!isOuter && mmaLayout.isVolta() && isMMA) { // tensor core v1 bool isMMAv1Row = dotOperandLayout.getMMAv1IsRow(); auto srcSharedLayout = src.getType() .cast() @@ -722,10 +963,11 @@ struct ConvertLayoutOpConversion } return res; } -}; // namespace triton::gpu::ConvertLayoutOp +}; // namespace triton::gpu::ConvertLayoutOp> void populateConvertLayoutOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit) { diff --git a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.h index c8f3396b98cf..9cbf49573deb 100644 --- a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.h @@ -10,6 +10,7 @@ using ::mlir::triton::gpu::DotOperandEncodingAttr; void populateConvertLayoutOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandFMA.cpp b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandFMA.cpp index b453caf37210..e1815d96c863 100644 --- a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandFMA.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandFMA.cpp @@ -2,8 +2,10 @@ #include "../Utility.h" using ValueTable = std::map, Value>; +using ::mlir::LLVM::delinearize; using ::mlir::LLVM::getSharedMemoryObjectFromStruct; using ::mlir::LLVM::getStridesFromShapeAndOrder; +using ::mlir::LLVM::linearize; using ::mlir::triton::gpu::DotOperandEncodingAttr; using ::mlir::triton::gpu::getContigPerThread; using ::mlir::triton::gpu::getOrder; @@ -14,31 +16,32 @@ using ::mlir::triton::gpu::isaDistributedLayout; using ::mlir::triton::gpu::SharedEncodingAttr; SmallVector -getThreadIds(Value threadId, ArrayRef shapePerCTA, +getThreadIds(Value threadId, ArrayRef shapePerCTATile, ArrayRef sizePerThread, ArrayRef order, ConversionPatternRewriter &rewriter, Location loc) { int dim = order.size(); SmallVector threadIds(dim); for (unsigned k = 0; k < dim - 1; k++) { - Value dimK = i32_val(shapePerCTA[order[k]] / sizePerThread[order[k]]); + Value dimK = i32_val(shapePerCTATile[order[k]] / sizePerThread[order[k]]); Value rem = urem(threadId, dimK); threadId = udiv(threadId, dimK); threadIds[order[k]] = rem; } - Value dimK = i32_val(shapePerCTA[order[dim - 1]]); + Value dimK = i32_val(shapePerCTATile[order[dim - 1]]); threadIds[order[dim - 1]] = urem(threadId, dimK); return threadIds; } -int getShapePerCTAForMN(BlockedEncodingAttr layout, bool isM) { +// Get shapePerCTATile for M or N axis. +int getShapePerCTATileForMN(BlockedEncodingAttr layout, bool isM) { auto order = layout.getOrder(); - auto shapePerCTA = getShapePerCTA(layout); + auto shapePerCTATile = getShapePerCTATile(layout); - int mShapePerCTA = - order[0] == 1 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; - int nShapePerCTA = - order[0] == 0 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; - return isM ? mShapePerCTA : nShapePerCTA; + int mShapePerCTATile = + order[0] == 1 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; + int nShapePerCTATile = + order[0] == 0 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; + return isM ? mShapePerCTATile : nShapePerCTATile; } // Get sizePerThread for M or N axis. @@ -91,7 +94,7 @@ Value loadAFMA(Value A, Value llA, BlockedEncodingAttr dLayout, Value thread, ConversionPatternRewriter &rewriter) { auto aTensorTy = A.getType().cast(); auto aLayout = aTensorTy.getEncoding().cast(); - auto aShape = aTensorTy.getShape(); + auto aShapePerCTA = getShapePerCTA(aTensorTy); auto aOrder = aLayout.getOrder(); auto order = dLayout.getOrder(); @@ -104,10 +107,10 @@ Value loadAFMA(Value A, Value llA, BlockedEncodingAttr dLayout, Value thread, Value strideA0 = isARow ? strideAK : strideAM; Value strideA1 = isARow ? strideAM : strideAK; int aNumPtr = 8; - int K = aShape[1]; - int M = aShape[0]; + int K = aShapePerCTA[1]; + int M = aShapePerCTA[0]; - auto shapePerCTA = getShapePerCTA(dLayout); + auto shapePerCTATile = getShapePerCTATile(dLayout); auto sizePerThread = getSizePerThread(dLayout); Value _0 = i32_val(0); @@ -115,8 +118,8 @@ Value loadAFMA(Value A, Value llA, BlockedEncodingAttr dLayout, Value thread, Value mContig = i32_val(sizePerThread[order[1]]); // threadId in blocked layout - auto threadIds = - getThreadIds(thread, shapePerCTA, sizePerThread, order, rewriter, loc); + auto threadIds = getThreadIds(thread, shapePerCTATile, sizePerThread, order, + rewriter, loc); Value threadIdM = threadIds[0]; Value offA0 = isARow ? _0 : mul(threadIdM, mContig); @@ -134,11 +137,11 @@ Value loadAFMA(Value A, Value llA, BlockedEncodingAttr dLayout, Value thread, SmallVector vas; - int mShapePerCTA = getShapePerCTAForMN(dLayout, true /*isM*/); + int mShapePerCTATile = getShapePerCTATileForMN(dLayout, true /*isM*/); int mSizePerThread = getSizePerThreadForMN(dLayout, true /*isM*/); for (unsigned k = 0; k < K; ++k) - for (unsigned m = 0; m < M; m += mShapePerCTA) + for (unsigned m = 0; m < M; m += mShapePerCTATile) for (unsigned mm = 0; mm < mSizePerThread; ++mm) { Value offset = add(mul(i32_val(m + mm), strideAM), mul(i32_val(k), strideAK)); @@ -155,7 +158,7 @@ Value loadBFMA(Value B, Value llB, BlockedEncodingAttr dLayout, Value thread, ConversionPatternRewriter &rewriter) { auto bTensorTy = B.getType().cast(); auto bLayout = bTensorTy.getEncoding().cast(); - auto bShape = bTensorTy.getShape(); + auto bShapePerCTA = getShapePerCTA(bTensorTy); auto bOrder = bLayout.getOrder(); auto order = dLayout.getOrder(); @@ -168,10 +171,10 @@ Value loadBFMA(Value B, Value llB, BlockedEncodingAttr dLayout, Value thread, Value strideB0 = isBRow ? strideBN : strideBK; Value strideB1 = isBRow ? strideBK : strideBN; int bNumPtr = 8; - int K = bShape[0]; - int N = bShape[1]; + int K = bShapePerCTA[0]; + int N = bShapePerCTA[1]; - auto shapePerCTA = getShapePerCTA(dLayout); + auto shapePerCTATile = getShapePerCTATile(dLayout); auto sizePerThread = getSizePerThread(dLayout); Value _0 = i32_val(0); @@ -179,8 +182,8 @@ Value loadBFMA(Value B, Value llB, BlockedEncodingAttr dLayout, Value thread, Value nContig = i32_val(sizePerThread[order[0]]); // threadId in blocked layout - auto threadIds = - getThreadIds(thread, shapePerCTA, sizePerThread, order, rewriter, loc); + auto threadIds = getThreadIds(thread, shapePerCTATile, sizePerThread, order, + rewriter, loc); Value threadIdN = threadIds[1]; Value offB0 = isBRow ? mul(threadIdN, nContig) : _0; @@ -198,11 +201,11 @@ Value loadBFMA(Value B, Value llB, BlockedEncodingAttr dLayout, Value thread, SmallVector vbs; - int nShapePerCTA = getShapePerCTAForMN(dLayout, false /*isM*/); + int nShapePerCTATile = getShapePerCTATileForMN(dLayout, false /*isM*/); int nSizePerThread = getSizePerThreadForMN(dLayout, false /*isM*/); for (unsigned k = 0; k < K; ++k) - for (unsigned n = 0; n < N; n += nShapePerCTA) + for (unsigned n = 0; n < N; n += nShapePerCTATile) for (unsigned nn = 0; nn < nSizePerThread; ++nn) { Value offset = add(mul(i32_val(n + nn), strideBN), mul(i32_val(k), strideBK)); diff --git a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandMMAv2.cpp b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandMMAv2.cpp index 64ae94960742..97c1bb3064b7 100644 --- a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandMMAv2.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM/SharedToDotOperandMMAv2.cpp @@ -504,7 +504,7 @@ std::function getLoadMatrixFn( .cast() .getElementType() .isa()) { - bool noTrans = (isA ^ order[0] == 0); + bool noTrans = (isA ^ (order[0] == 0)); assert(noTrans && "float8e4b15 must have row-col layout"); } diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.cpp index 34d2da5cfe73..61de36785f2e 100644 --- a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.cpp @@ -4,7 +4,9 @@ using namespace mlir; using namespace mlir::triton; +using ::mlir::LLVM::getSharedMemoryObjectFromStruct; using ::mlir::triton::gpu::DotOperandEncodingAttr; +using ::mlir::triton::gpu::getShapePerCTA; using ::mlir::triton::gpu::MmaEncodingAttr; LogicalResult convertFMADot(triton::DotOp op, triton::DotOp::Adaptor adaptor, @@ -19,6 +21,16 @@ LogicalResult convertMMA16816(triton::DotOp op, triton::DotOp::Adaptor adaptor, TritonGPUToLLVMTypeConverter *typeConverter, ConversionPatternRewriter &rewriter); +LogicalResult convertWGMMA(triton::DotOp op, triton::DotOp::Adaptor adaptor, + TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, Value thread); + +LogicalResult convertAsyncWGMMA(triton::nvidia_gpu::DotAsyncOp op, + triton::nvidia_gpu::DotAsyncOp::Adaptor adaptor, + TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, + Value thread); + struct DotOpConversion : public ConvertTritonGPUOpToLLVMPattern { using ConvertTritonGPUOpToLLVMPattern< triton::DotOp>::ConvertTritonGPUOpToLLVMPattern; @@ -26,14 +38,15 @@ struct DotOpConversion : public ConvertTritonGPUOpToLLVMPattern { LogicalResult matchAndRewrite(triton::DotOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); // D = A * B + C Value A = op.getA(); Value D = op.getResult(); // Here we assume the DotOp's operands always comes from shared memory. - auto AShape = A.getType().cast().getShape(); + auto AShapePerCTA = getShapePerCTA(A.getType()); size_t reduceAxis = 1; - unsigned K = AShape[reduceAxis]; + unsigned K = AShapePerCTA[reduceAxis]; bool isOuter = K == 1; MmaEncodingAttr mmaLayout = D.getType() @@ -45,6 +58,9 @@ struct DotOpConversion : public ConvertTritonGPUOpToLLVMPattern { return convertMMA884(op, adaptor, getTypeConverter(), rewriter); if (mmaLayout.isAmpere()) return convertMMA16816(op, adaptor, getTypeConverter(), rewriter); + if (mmaLayout.isHopper()) + return convertWGMMA(op, adaptor, getTypeConverter(), rewriter, + getThreadId(rewriter, loc)); llvm::report_fatal_error( "Unsupported MMA kind found when converting DotOp to LLVM."); @@ -61,9 +77,68 @@ struct DotOpConversion : public ConvertTritonGPUOpToLLVMPattern { } }; +struct DotAsyncOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::DotAsyncOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::DotAsyncOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto loc = op.getLoc(); + // D = A * B + C + Value A = op.getA(); + Value D = op.getResult(); + + // Here we assume the DotOp's operands always comes from shared memory. + auto AShapePerCTA = getShapePerCTA(A.getType()); + size_t reduceAxis = 1; + unsigned K = AShapePerCTA[reduceAxis]; + bool isOuter = K == 1; + + MmaEncodingAttr mmaLayout = D.getType() + .cast() + .getEncoding() + .dyn_cast(); + if (!isOuter && mmaLayout && + supportMMA(op.getOperand(0), mmaLayout.getVersionMajor())) { + if (mmaLayout.isHopper()) { + return convertAsyncWGMMA(op, adaptor, getTypeConverter(), rewriter, + getThreadId(rewriter, loc)); + } + + llvm::report_fatal_error( + "Unsupported MMA kind found when converting DotAsyncOp to LLVM."); + } + + llvm::report_fatal_error( + "Unsupported DotAsyncOp found when converting TritonGPU to LLVM."); + } +}; + +struct DotWaitOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::DotWaitOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::DotWaitOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto pendings = op.getPendings(); + rewriter.create(op.getLoc(), pendings); + + // Safe to remove the op since it doesn't have any return value. + rewriter.eraseOp(op); + return success(); + } +}; + void populateDotOpToLLVMPatterns(TritonGPUToLLVMTypeConverter &typeConverter, - RewritePatternSet &patterns, + RewritePatternSet &patterns, int numWarps, + ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, PatternBenefit benefit) { patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, benefit); + patterns.add(typeConverter, allocation, benefit); } diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.h index 92ad51f38ab1..6d457cffec19 100644 --- a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM.h @@ -7,7 +7,8 @@ using namespace mlir; using namespace mlir::triton; void populateDotOpToLLVMPatterns(TritonGPUToLLVMTypeConverter &typeConverter, - RewritePatternSet &patterns, + RewritePatternSet &patterns, int numWarps, + ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, PatternBenefit benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/FMA.cpp b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/FMA.cpp index a7d75e677441..775c2e4a1ec0 100644 --- a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/FMA.cpp +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/FMA.cpp @@ -5,19 +5,20 @@ using namespace mlir; using namespace mlir::triton; using ::mlir::triton::gpu::DotOperandEncodingAttr; +using ::mlir::triton::gpu::getShapePerCTA; using ::mlir::triton::gpu::MmaEncodingAttr; using ValueTableFMA = std::map, Value>; static ValueTableFMA getValueTableFromStructFMA( - Value val, int K, int n0, int shapePerCTA, int sizePerThread, + Value val, int K, int n0, int shapePerCTATile, int sizePerThread, ConversionPatternRewriter &rewriter, Location loc, TritonGPUToLLVMTypeConverter *typeConverter, Type type) { ValueTableFMA res; auto elems = typeConverter->unpackLLElements(loc, val, rewriter, type); int index = 0; for (unsigned k = 0; k < K; ++k) { - for (unsigned m = 0; m < n0; m += shapePerCTA) + for (unsigned m = 0; m < n0; m += shapePerCTATile) for (unsigned mm = 0; mm < sizePerThread; ++mm) { res[{m + mm, k}] = elems[index++]; } @@ -40,8 +41,8 @@ LogicalResult convertFMADot(triton::DotOp op, triton::DotOp::Adaptor adaptor, auto bTensorTy = B.getType().cast(); auto dTensorTy = D.getType().cast(); - auto aShape = aTensorTy.getShape(); - auto bShape = bTensorTy.getShape(); + auto aShapePerCTA = getShapePerCTA(aTensorTy); + auto bShapePerCTA = getShapePerCTA(bTensorTy); BlockedEncodingAttr dLayout = dTensorTy.getEncoding().cast(); @@ -53,41 +54,42 @@ LogicalResult convertFMADot(triton::DotOp op, triton::DotOp::Adaptor adaptor, Value llB = adaptor.getB(); auto sizePerThread = getSizePerThread(dLayout); - auto shapePerCTA = getShapePerCTA(dLayout); + auto shapePerCTATile = getShapePerCTATile(dLayout); - int K = aShape[1]; - int M = aShape[0]; - int N = bShape[1]; + int K = aShapePerCTA[1]; + int M = aShapePerCTA[0]; + int N = bShapePerCTA[1]; - int mShapePerCTA = - order[0] == 1 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; + int mShapePerCTATile = + order[0] == 1 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; int mSizePerThread = order[0] == 1 ? sizePerThread[order[1]] : sizePerThread[order[0]]; - int nShapePerCTA = - order[0] == 0 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; + int nShapePerCTATile = + order[0] == 0 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; int nSizePerThread = order[0] == 0 ? sizePerThread[order[1]] : sizePerThread[order[0]]; auto has = - getValueTableFromStructFMA(llA, K, M, mShapePerCTA, mSizePerThread, + getValueTableFromStructFMA(llA, K, M, mShapePerCTATile, mSizePerThread, rewriter, loc, typeConverter, aTensorTy); auto hbs = - getValueTableFromStructFMA(llB, K, N, nShapePerCTA, nSizePerThread, + getValueTableFromStructFMA(llB, K, N, nShapePerCTATile, nSizePerThread, rewriter, loc, typeConverter, bTensorTy); SmallVector ret = cc; bool isCRow = order[0] == 1; for (unsigned k = 0; k < K; k++) { - for (unsigned m = 0; m < M; m += mShapePerCTA) - for (unsigned n = 0; n < N; n += nShapePerCTA) + for (unsigned m = 0; m < M; m += mShapePerCTATile) + for (unsigned n = 0; n < N; n += nShapePerCTATile) for (unsigned mm = 0; mm < mSizePerThread; ++mm) for (unsigned nn = 0; nn < nSizePerThread; ++nn) { - int mIdx = m / mShapePerCTA * mSizePerThread + mm; - int nIdx = n / nShapePerCTA * nSizePerThread + nn; + int mIdx = m / mShapePerCTATile * mSizePerThread + mm; + int nIdx = n / nShapePerCTATile * nSizePerThread + nn; - int z = isCRow ? mIdx * N / nShapePerCTA * mSizePerThread + nIdx - : nIdx * M / mShapePerCTA * nSizePerThread + mIdx; + int z = isCRow + ? mIdx * N / nShapePerCTATile * mSizePerThread + nIdx + : nIdx * M / mShapePerCTATile * nSizePerThread + mIdx; ret[z] = rewriter.create(loc, has[{m + mm, k}], hbs[{n + nn, k}], ret[z]); } diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/MMAv2.cpp b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/MMAv2.cpp index 726b87d6e2b2..89314f477af2 100644 --- a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/MMAv2.cpp +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/MMAv2.cpp @@ -170,16 +170,17 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, auto bTensorTy = b.getType().cast(); auto dTensorTy = d.getType().cast(); - SmallVector aShape(aTensorTy.getShape().begin(), - aTensorTy.getShape().end()); - auto dShape = dTensorTy.getShape(); + auto aShapePerCTA = triton::gpu::getShapePerCTA(aTensorTy); + auto bShapePerCTA = triton::gpu::getShapePerCTA(bTensorTy); + auto dShapePerCTA = triton::gpu::getShapePerCTA(dTensorTy); + int bitwidth = aTensorTy.getElementType().getIntOrFloatBitWidth(); auto repA = aTensorTy.getEncoding().cast().getMMAv2Rep( - aTensorTy.getShape(), bitwidth); + aShapePerCTA, bitwidth); auto repB = bTensorTy.getEncoding().cast().getMMAv2Rep( - bTensorTy.getShape(), bitwidth); + bShapePerCTA, bitwidth); assert(repA[1] == repB[0]); int repM = repA[0], repN = repB[1], repK = repA[1]; diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp new file mode 100644 index 000000000000..7424341ca79f --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "DotOpToLLVM.h" +#include "Utility.h" + +using namespace mlir; +using namespace mlir::triton; + +using ::mlir::LLVM::getSharedMemoryObjectFromStruct; +using ::mlir::triton::gpu::getShapePerCTA; +using ::mlir::triton::gpu::getShapePerCTATile; +using ::mlir::triton::gpu::MmaEncodingAttr; +using ::mlir::triton::gpu::SharedEncodingAttr; + +triton::nvgpu::WGMMAEltType getMmaRetType(Value d) { + auto dTy = d.getType().cast().getElementType(); + if (dTy.isF32()) { + return triton::nvgpu::WGMMAEltType::f32; + } else if (dTy.isF16()) { + return triton::nvgpu::WGMMAEltType::f16; + } else if (dTy.isInteger(32)) { + return triton::nvgpu::WGMMAEltType::s32; + } else { + llvm::report_fatal_error("Unsupported mma result type found"); + } +} + +triton::nvgpu::WGMMAEltType getMmaOperandType(Value a, bool allowTF32) { + auto aTy = a.getType().cast().getElementType(); + if (aTy.isF16()) { + return triton::nvgpu::WGMMAEltType::f16; + } else if (aTy.isBF16()) { + return triton::nvgpu::WGMMAEltType::bf16; + } else if (aTy.isF32() && allowTF32) { + return triton::nvgpu::WGMMAEltType::tf32; + } else if (aTy.isInteger(8)) { + return triton::nvgpu::WGMMAEltType::s8; + } else if (aTy.isFloat8E5M2()) { + return triton::nvgpu::WGMMAEltType::e5m2; + } else if (aTy.isFloat8E4M3FN()) { + return triton::nvgpu::WGMMAEltType::e4m3; + } else { + llvm::report_fatal_error("Unsupported mma operand type found"); + } +} + +mlir::triton::nvgpu::WGMMADescMode +getModeFromLayout(const SharedEncodingAttr &layout, uint32_t widthInByte) { + int perPhase = layout.getPerPhase(); + int maxPhase = layout.getMaxPhase(); + uint32_t swizzlingByteWidth = 0; + + mlir::triton::nvgpu::WGMMADescMode mode; + if (perPhase == 4 && maxPhase == 2) { + mode = mlir::triton::nvgpu::WGMMADescMode::swizzle32; + swizzlingByteWidth = 32; + } else if (perPhase == 2 && maxPhase == 4) { + mode = mlir::triton::nvgpu::WGMMADescMode::swizzle64; + swizzlingByteWidth = 64; + } else if (perPhase == 1 && maxPhase == 8) { + mode = mlir::triton::nvgpu::WGMMADescMode::swizzle128; + swizzlingByteWidth = 128; + } else { + llvm::report_fatal_error("Unsupported shared layout."); + } + + // TODO[biaow]: remove it once we support swizzling size larger than matrix + // width, which requires padding the matrix width to the swizzling size when + // allocating shared memory. + assert(swizzlingByteWidth <= widthInByte && + "swizzling size larger than matrix width is not supported."); + return mode; +} + +class DotOpMmaV3SmemLoader { +public: + DotOpMmaV3SmemLoader(Value tensor, const SharedMemoryObject &smemObj, + SmallVector shape, Value warpId, + unsigned int dimWpt, bool trans, + SmallVector instrShape, + ConversionPatternRewriter &rewriter, Location loc) + : base(smemObj.base), shape(shape), warpId(warpId), dimWpt(dimWpt), + trans(trans), instrShape(instrShape), rewriter(rewriter), loc(loc) { + auto tensorTy = tensor.getType().cast(); + auto sharedLayout = tensorTy.getEncoding().cast(); + ord = sharedLayout.getOrder(); + const int perPhase = sharedLayout.getPerPhase(); + const int maxPhase = sharedLayout.getMaxPhase(); + elemBytes = tensorTy.getElementTypeBitWidth() / 8; + elemsPerSwizzlingRow = 128 / perPhase / elemBytes; + elemsPerSwizzlingRowVal = i32_val(elemsPerSwizzlingRow); + + uint32_t widthInByte = shape[ord[0]] * elemBytes; + mode = getModeFromLayout(sharedLayout, widthInByte); + + baseDesc = rewriter.create( + loc, i64_ty, base, i32_val(shape[ord[1]]), mode); + } + + Value smemLoad(int a, int b) { + Value k = i32_val(b * instrShape[1]); + Value m = add(i32_val(a * dimWpt * instrShape[0]), + mul(warpId, i32_val(instrShape[0]))); + if (trans) { + std::swap(k, m); + } + Value leading_offset = mul(udiv(k, elemsPerSwizzlingRowVal), + i32_val(shape[ord[1]] * elemsPerSwizzlingRow)); + Value stride_offset = mul(m, elemsPerSwizzlingRowVal); + Value offset = add(add(leading_offset, stride_offset), + urem(k, elemsPerSwizzlingRowVal)); + Value off1 = mul(i32_val(elemBytes), offset); + Value off_ = zext(i64_ty, udiv(off1, i32_val(16))); + + return add(baseDesc, off_); + } + +private: + Value base; + SmallVector shape; + Value warpId; + int dimWpt; + bool trans; + Value elemsPerSwizzlingRowVal; + mlir::triton::nvgpu::WGMMADescMode mode; + SmallVector instrShape; + ArrayRef ord; + ConversionPatternRewriter &rewriter; + Location loc; + int elemsPerSwizzlingRow; + int elemBytes; + Value baseDesc; +}; + +DotOpMmaV3SmemLoader loadA(TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, Location loc, + const MmaEncodingAttr &mmaEncoding, Value tensor, + const SharedMemoryObject &smemObj, Value thread) { + auto aTensorTy = tensor.getType().cast(); + auto aSharedLayout = aTensorTy.getEncoding().dyn_cast(); + assert(aSharedLayout && "only support load dot operand from shared."); + auto instrShape = mmaEncoding.getInstrShape(); + auto wpt = mmaEncoding.getWarpsPerCTA(); + auto aOrd = aSharedLayout.getOrder(); + bool transA = aOrd[0] == 0; + auto shapePerCTA = getShapePerCTA(aTensorTy); + + int numRepM = ceil(shapePerCTA[0], instrShape[0] * wpt[0]); + int numRepK = ceil(shapePerCTA[1], instrShape[2]); + + Value warp = udiv(thread, i32_val(32)); + Value warpM = urem(warp, i32_val(wpt[0])); + Value warpId = urem(warpM, i32_val(shapePerCTA[0] / instrShape[0])); + + return {tensor, + smemObj, + shapePerCTA, + warpId, + wpt[0], + transA, + {instrShape[0], instrShape[2]}, + rewriter, + loc}; +} + +DotOpMmaV3SmemLoader loadB(TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, Location loc, + MmaEncodingAttr &mmaEncoding, Value tensor, + const SharedMemoryObject &smemObj, Value thread) { + auto bTensorTy = tensor.getType().cast(); + auto bSharedLayout = bTensorTy.getEncoding().cast(); + assert(bSharedLayout && "only support load B from shared."); + auto instrShape = mmaEncoding.getInstrShape(); + auto wpt = mmaEncoding.getWarpsPerCTA(); + auto bOrd = bSharedLayout.getOrder(); + bool transB = bOrd[0] == 1; + auto shapePerCTA = triton::gpu::getShapePerCTA(bTensorTy); + + int numRepK = ceil(shapePerCTA[0], instrShape[2]); + int numRepN = ceil(shapePerCTA[1], instrShape[1] * wpt[1]); + + Value warp = udiv(thread, i32_val(32)); + Value warpMN = udiv(warp, i32_val(wpt[0])); + Value warpN = urem(warpMN, i32_val(wpt[1])); + Value warpId = urem(warpN, i32_val(shapePerCTA[1] / instrShape[1])); + + return {tensor, + smemObj, + shapePerCTA, + warpId, + wpt[1], + transB, + {instrShape[1], instrShape[2]}, + rewriter, + loc}; +} + +LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, Location loc, + Operation *op, Value a, Value b, Value c, Value d, + Value loadedA, Value loadedB, Value loadedC, + bool allowTF32, const SharedMemoryObject &smemObjA, + const SharedMemoryObject &smemObjB, bool sync, + Value thread) { + auto aTensorTy = a.getType().cast(); + auto bTensorTy = b.getType().cast(); + auto dTensorTy = d.getType().cast(); + auto aSharedLayout = aTensorTy.getEncoding().cast(); + auto bSharedLayout = bTensorTy.getEncoding().cast(); + auto mmaEncoding = dTensorTy.getEncoding().cast(); + auto aOrd = aSharedLayout.getOrder(); + auto bOrd = bSharedLayout.getOrder(); + bool transA = aOrd[0] == 0; + bool transB = bOrd[0] == 1; + auto dShapePerCTA = getShapePerCTA(dTensorTy); + auto instrShape = mmaEncoding.getInstrShape(); + auto accSize = 2 * (instrShape[1] / 4); + Type resElemTy = dTensorTy.getElementType(); + llvm::SmallVector elemTypes(accSize, resElemTy); + auto accTy = + LLVM::LLVMStructType::getLiteral(rewriter.getContext(), elemTypes); + + int M = 4 * instrShape[0]; + int N = instrShape[1]; + int K = instrShape[2]; + + auto shapePerCTATile = getShapePerCTATile(mmaEncoding); + int numRepM = ceil(dShapePerCTA[0], shapePerCTATile[0]); + int numRepN = ceil(dShapePerCTA[1], shapePerCTATile[1]); + int numRepK = ceil(aTensorTy.getShape()[1], instrShape[2]); + + DotOpMmaV3SmemLoader aLoader = + loadA(typeConverter, rewriter, loc, mmaEncoding, a, smemObjA, thread); + DotOpMmaV3SmemLoader bLoader = + loadB(typeConverter, rewriter, loc, mmaEncoding, b, smemObjB, thread); + + auto fc = typeConverter->unpackLLElements(loc, loadedC, rewriter, dTensorTy); + + triton::nvgpu::WGMMAEltType eltTypeC = getMmaRetType(d); + assert(eltTypeC != triton::nvgpu::WGMMAEltType::f16 && + "TODO support f16 return type. This requires packing C into " + "vector<2xf16> type."); + triton::nvgpu::WGMMAEltType eltTypeA = getMmaOperandType(a, allowTF32); + triton::nvgpu::WGMMAEltType eltTypeB = eltTypeA; + + triton::nvgpu::WGMMALayout layoutA = transA ? triton::nvgpu::WGMMALayout::col + : triton::nvgpu::WGMMALayout::row; + triton::nvgpu::WGMMALayout layoutB = transB ? triton::nvgpu::WGMMALayout::row + : triton::nvgpu::WGMMALayout::col; + + auto func = op->getParentOfType(); + int numTMADescs = + func->getAttr(kAttrNumTMALoadDescsName).cast().getInt(); + if (numTMADescs == 0) + rewriter.create(loc, 0); + rewriter.create(loc); + + llvm::SmallVector mmaOut(accSize); + for (int m = 0; m < numRepM; ++m) { + for (int n = 0; n < numRepN; ++n) { + // reuse the same mmaOut + for (int i = 0; i < accSize; ++i) { + mmaOut[i] = fc[(m * numRepN + n) * accSize + i]; + } + Value d = typeConverter->packLLElements(loc, mmaOut, rewriter, accTy); + for (int k = 0; k < numRepK; ++k) { + auto a = aLoader.smemLoad(m, k); + auto b = bLoader.smemLoad(n, k); + ValueRange operands{a, b, d}; + d = rewriter.create(loc, accTy, a, b, d, M, N, + K, eltTypeC, eltTypeA, + eltTypeB, layoutA, layoutB); + } + auto acc = typeConverter->unpackLLElements(loc, d, rewriter, accTy); + for (int i = 0; i < acc.size(); ++i) { + fc[(m * numRepN + n) * accSize + i] = acc[i]; + } + } + } + rewriter.create(loc); + + if (sync) + rewriter.create(loc, 0); + + for (auto &elem : fc) { + elem = bitcast(elem, resElemTy); + } + // replace with new packed result + Type structTy = LLVM::LLVMStructType::getLiteral( + mmaEncoding.getContext(), SmallVector(fc.size(), resElemTy)); + auto res = typeConverter->packLLElements(loc, fc, rewriter, structTy); + rewriter.replaceOp(op, res); + return success(); +} + +// Loading $c to registers, returns a Value. +Value loadC(Value tensor, Value llTensor) { + auto tensorTy = tensor.getType().cast(); + auto mmaEncoding = tensorTy.getEncoding().dyn_cast(); + assert(mmaEncoding && "Currently, we only support $c with a mma layout."); + auto instrShape = mmaEncoding.getInstrShape(); + auto wpt = mmaEncoding.getWarpsPerCTA(); + auto shapePerCTA = getShapePerCTA(tensorTy); + auto shapePerCTATile = getShapePerCTATile(mmaEncoding); + + int numRepM = ceil(shapePerCTA[0], shapePerCTATile[0]); + int numRepN = ceil(shapePerCTA[1], shapePerCTATile[1]); + + size_t fcSize = 2 * (instrShape[1] / 4) * numRepM * numRepN; + + auto structTy = llTensor.getType().cast(); + assert(structTy.getBody().size() == fcSize && + "DotOp's $c operand should pass the same number of values as $d in " + "mma layout."); + return llTensor; +} + +LogicalResult convertWGMMA(triton::DotOp op, triton::DotOp::Adaptor adaptor, + TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, Value thread) { + auto loc = op.getLoc(); + Value A = op.getA(); + Value B = op.getB(); + Value C = op.getC(); + auto ATensorTy = A.getType().cast(); + auto BTensorTy = B.getType().cast(); + + assert(ATensorTy.getEncoding().isa() && + BTensorTy.getEncoding().isa() && + "Both $a and %b should be Shared layout."); + + Value llA, llB, llC; + llA = adaptor.getA(); + llB = adaptor.getB(); + llC = loadC(C, adaptor.getC()); + + auto smemObjA = getSharedMemoryObjectFromStruct(loc, llA, rewriter); + auto smemObjB = getSharedMemoryObjectFromStruct(loc, llB, rewriter); + return convertDot(typeConverter, rewriter, loc, op.getOperation(), A, B, C, + op.getD(), llA, llB, llC, op.getAllowTF32(), smemObjA, + smemObjB, true, thread); +} + +LogicalResult convertAsyncWGMMA(triton::nvidia_gpu::DotAsyncOp op, + triton::nvidia_gpu::DotAsyncOp::Adaptor adaptor, + TritonGPUToLLVMTypeConverter *typeConverter, + ConversionPatternRewriter &rewriter, + Value thread) { + auto loc = op.getLoc(); + Value A = op.getA(); + Value B = op.getB(); + Value C = op.getC(); + auto ATensorTy = A.getType().cast(); + auto BTensorTy = B.getType().cast(); + + assert(ATensorTy.getEncoding().isa() && + BTensorTy.getEncoding().isa() && + "Both $a and %b should be Shared layout."); + + Value llA, llB, llC; + llA = adaptor.getA(); + llB = adaptor.getB(); + llC = loadC(C, adaptor.getC()); + + auto smemObjA = getSharedMemoryObjectFromStruct(loc, llA, rewriter); + auto smemObjB = getSharedMemoryObjectFromStruct(loc, llB, rewriter); + return convertDot(typeConverter, rewriter, loc, op.getOperation(), A, B, C, + op.getD(), llA, llB, llC, op.getAllowTF32(), smemObjA, + smemObjB, false, thread); +} diff --git a/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.cpp index 4b3e446d8a6c..207a392912a6 100644 --- a/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.cpp @@ -353,6 +353,13 @@ static SmallVector reorderValues(const SmallVector &values, llvm_unreachable("unimplemented code path"); } +inline Type getElementType(Value value) { + auto type = value.getType(); + if (auto tensorType = type.dyn_cast()) + return tensorType.getElementType(); + return type; +} + inline SmallVector unpackI32(const SmallVector &inValues, Type srcTy, ConversionPatternRewriter &rewriter, @@ -1149,7 +1156,8 @@ struct IndexCastOpLowering void populateElementwiseOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, - PatternBenefit benefit) { + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit) { #define POPULATE_TERNARY_OP(SRC_OP, DST_OP) \ patterns.add>(typeConverter, benefit); POPULATE_TERNARY_OP(triton::gpu::SelectOp, LLVM::SelectOp) @@ -1222,3 +1230,161 @@ void populateElementwiseOpToLLVMPatterns( // __nv_expf for higher-precision calculation patterns.add(typeConverter, benefit); } + +struct FPExtOpConversion + : ElementwiseOpConversionBase { + using Base = ElementwiseOpConversionBase; + using Base::Base; + using Adaptor = typename Base::OpAdaptor; + + static bool isLegalOp(LLVM::FPExtOp op) { + auto retTy = op.getResult().getType(); + auto srcTy = op.getOperand().getType(); + if (retTy.isF32() && srcTy.isF16()) { + return false; + } + return true; + } + + SmallVector createDestOps(LLVM::FPExtOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter, + Type elemTy, MultipleOperandsRange operands, + Location loc) const { + return { + FpToFpOpConversion::convertFp16ToFp32(loc, rewriter, operands[0][0])}; + } +}; + +struct FPTruncOpConversion + : ElementwiseOpConversionBase { + using Base = + ElementwiseOpConversionBase; + using Base::Base; + using Adaptor = typename Base::OpAdaptor; + + static bool isLegalOp(LLVM::FPTruncOp op) { + auto retTy = op.getResult().getType(); + auto srcTy = op.getOperand().getType(); + if (retTy.isF16() && srcTy.isF32()) { + return false; + } + return true; + } + + SmallVector createDestOps(LLVM::FPTruncOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter, + Type elemTy, MultipleOperandsRange operands, + Location loc) const { + return { + FpToFpOpConversion::convertFp32ToFp16(loc, rewriter, operands[0][0])}; + } +}; + +struct TruncOpConversion + : ElementwiseOpConversionBase { + using Base = ElementwiseOpConversionBase; + using Base::Base; + using Adaptor = typename Base::OpAdaptor; + + static bool isLegalOp(LLVM::TruncOp op) { + auto retTy = op.getResult().getType(); + auto srcTy = op.getOperand().getType(); + if (retTy.isInteger(16) && srcTy.isInteger(32)) { + return false; + } + return true; + } + + SmallVector createDestOps(LLVM::TruncOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter, + Type elemTy, MultipleOperandsRange operands, + Location loc) const { + PTXBuilder builder; + auto &cvt = *builder.create("cvt.u16.u32"); + auto res = builder.newOperand("=h"); + auto operand = builder.newOperand(operands[0][0], "r"); + cvt(res, operand); + return {builder.launch(rewriter, loc, i16_ty, false)}; + } +}; + +struct SExtOpConversion + : ElementwiseOpConversionBase { + using Base = ElementwiseOpConversionBase; + using Base::Base; + using Adaptor = typename Base::OpAdaptor; + + static bool isLegalOp(LLVM::SExtOp op) { + auto retTy = op.getResult().getType(); + auto srcTy = op.getOperand().getType(); + if (retTy.isInteger(32) && srcTy.isInteger(16)) { + return false; + } + return true; + } + + SmallVector createDestOps(LLVM::SExtOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter, + Type elemTy, MultipleOperandsRange operands, + Location loc) const { + PTXBuilder builder; + auto &cvt = *builder.create("cvt.s32.s16"); + auto res = builder.newOperand("=r"); + auto operand = builder.newOperand(operands[0][0], "h"); + cvt(res, operand); + return {builder.launch(rewriter, loc, i32_ty, false)}; + } +}; + +struct ZExtOpConversion + : ElementwiseOpConversionBase { + using Base = ElementwiseOpConversionBase; + using Base::Base; + using Adaptor = typename Base::OpAdaptor; + + static bool isLegalOp(LLVM::ZExtOp op) { + auto retTy = op.getResult().getType(); + auto srcTy = op.getOperand().getType(); + if (retTy.isInteger(32) && srcTy.isInteger(16)) { + return false; + } + return true; + } + + SmallVector createDestOps(LLVM::ZExtOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter, + Type elemTy, MultipleOperandsRange operands, + Location loc) const { + PTXBuilder builder; + auto &cvt = *builder.create("cvt.u32.u16"); + auto res = builder.newOperand("=r"); + auto operand = builder.newOperand(operands[0][0], "h"); + cvt(res, operand); + return {builder.launch(rewriter, loc, i32_ty, false)}; + } +}; + +bool isLegalElementwiseOp(Operation *op) { + if (isa(op)) { + return FPExtOpConversion::isLegalOp(cast(op)); + } else if (isa(op)) { + return FPTruncOpConversion::isLegalOp(cast(op)); + } else if (isa(op)) { + return TruncOpConversion::isLegalOp(cast(op)); + } else if (isa(op)) { + return SExtOpConversion::isLegalOp(cast(op)); + } else if (isa(op)) { + return ZExtOpConversion::isLegalOp(cast(op)); + } + return true; +} + +void populateElementwiseOpToPTXPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + PatternBenefit benefit) { + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); +} diff --git a/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.h index 2187f798b2b3..1a8850739453 100644 --- a/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVM.h @@ -8,8 +8,13 @@ using namespace mlir::triton; void populateElementwiseOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, - PatternBenefit benefit); + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit); bool isLegalElementwiseOp(Operation *op); +void populateElementwiseOpToPTXPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + PatternBenefit benefit); + #endif diff --git a/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.cpp index 169cc92b766e..2498ff2f6de3 100644 --- a/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.cpp @@ -4,10 +4,15 @@ #include "ConvertLayoutOpToLLVM.h" #include "LoadStoreOpToLLVM.h" +#include + using namespace mlir; using namespace mlir::triton; +using ::mlir::LLVM::delinearize; using ::mlir::LLVM::getSharedMemoryObjectFromStruct; +using ::mlir::LLVM::linearize; +using ::mlir::triton::gpu::getShapePerCTA; using ::mlir::triton::gpu::getTotalElemsPerThread; using ::mlir::triton::gpu::SharedEncodingAttr; @@ -64,6 +69,9 @@ struct LoadOpConversion Value other = op.getOther(); // adaptor values + assert(!isTensorPointerType(ptr.getType()) && + "Cannot convert load with a tensor pointer into LLVM; " + "this case should be transformed to normal load before lowering"); Value llPtr = adaptor.getPtr(); Value llMask = adaptor.getMask(); Value llOther = adaptor.getOther(); @@ -378,6 +386,251 @@ struct StoreOpConversion return success(); } }; +// TODO: refactor to save common logic with insertsliceasyncv2 +struct StoreAsyncOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::StoreAsyncOp>::ConvertTritonGPUOpToLLVMPattern; + + StoreAsyncOpConversion(TritonGPUToLLVMTypeConverter &converter, + ModuleAllocation &allocation, + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + const TensorPtrMapT *tensorPtrMap, + PatternBenefit benefit) + : ConvertTritonGPUOpToLLVMPattern( + converter, allocation, tmaMetadata, benefit), + tensorPtrMap(tensorPtrMap) {} + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::StoreAsyncOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto loc = op.getLoc(); + MLIRContext *ctx = rewriter.getContext(); + + auto dst = op.getDst(); + auto src = op.getSrc(); + auto srcTy = src.getType().cast(); + auto elemTy = srcTy.getElementType(); + + auto rank = srcTy.getRank(); + assert(rank > 0 && rank <= 5); + + auto moduleOp = op->getParentOfType(); + assert(moduleOp && "Parent ModuleOp not found for StoreAsyncOp"); + + auto llFuncOp = op->getParentOfType(); + assert(llFuncOp && "LLVMFuncOp not found for StoreAsyncOp"); + + int numTMADescs = getNumTMADescs(llFuncOp); + assert(numTMADescs > 0); + + auto sharedLayout = srcTy.getEncoding().dyn_cast(); + assert(sharedLayout && "expected shared encoding"); + + mlir::triton::gpu::TMAInfo tmaInfo; + + tmaInfo.tensorDataType = getCUtensorMapDataType(elemTy); + tmaInfo.tensorRank = rank; + assert(tmaMetadata); + + auto inOrder = sharedLayout.getOrder(); + unsigned TMADescIdx = tmaMetadata->size(); + unsigned numFuncArgs = llFuncOp.getBody().front().getNumArguments(); + auto makeTensorPtr = tensorPtrMap->lookup(op.getOperation()); + auto dstOrder = makeTensorPtr.getOrder(); + + unsigned globalAddressArgIdx = getArgIdx(makeTensorPtr.getBase()); + tmaInfo.globalAddressArgIdx = globalAddressArgIdx; + tmaInfo.TMADescArgIdx = numFuncArgs - numTMADescs + TMADescIdx; + + auto getDimOfOrder = [](ArrayRef order, int32_t i) { + auto it = std::find(order.begin(), order.end(), i); + assert(it != order.end()); + return std::distance(order.begin(), it); + }; + + std::vector globalDimsArgIdx; + std::vector globalStridesArgIdx; + // constant values are mapped to (-1 - value) + for (int i = 0; i < rank; ++i) { + int32_t argIdx = -1; + auto dim = getDimOfOrder(dstOrder, i); + argIdx = getArgIdx(makeTensorPtr.getShape()[dim]); + globalDimsArgIdx.emplace_back(argIdx); + // handle constant stride + argIdx = getArgIdx(makeTensorPtr.getStrides()[dim]); + globalStridesArgIdx.emplace_back(argIdx); + } + + tmaInfo.globalDimsArgIdx = globalDimsArgIdx; + tmaInfo.globalStridesArgIdx = globalStridesArgIdx; + std::vector boxDims; + auto CTAsPerCGA = sharedLayout.getCTALayout().getCTAsPerCGA(); + auto CTAOrder = sharedLayout.getCTALayout().getCTAOrder(); + auto CTASplitNum = sharedLayout.getCTALayout().getCTASplitNum(); + auto tensorShape = makeTensorPtr.getResult() + .getType() + .cast() + .getPointeeType() + .cast() + .getShape(); + auto shapePerCTA = getShapePerCTA(CTASplitNum, tensorShape); + // magic 128 bytes + uint32_t bytesPerElem = elemTy.getIntOrFloatBitWidth() / 8; + uint32_t numBox{1}; + for (int i = 0; i < rank; ++i) { + auto dim = getDimOfOrder(dstOrder, i); + auto tNumElems = shapePerCTA[dim]; + if (i == 0 && tNumElems * bytesPerElem > 128) { + tNumElems = 128 / bytesPerElem; + numBox = (shapePerCTA[dim] + tNumElems - 1) / tNumElems; + } + boxDims.emplace_back(tNumElems); + } + std::vector elementStrides(rank, 1); + tmaInfo.boxDims = boxDims; + tmaInfo.elementStrides = elementStrides; + + CUtensorMapSwizzle swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_NONE; + assert( + ((elemTy.getIntOrFloatBitWidth() == 16 && sharedLayout.getVec() == 8) or + (elemTy.getIntOrFloatBitWidth() == 32 && + sharedLayout.getVec() == 4)) && + "Unexpected shared layout for StoreAsyncOp"); + if (sharedLayout.getPerPhase() == 4 && sharedLayout.getMaxPhase() == 2) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_32B; + else if (sharedLayout.getPerPhase() == 2 && sharedLayout.getMaxPhase() == 4) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_64B; + else if (sharedLayout.getPerPhase() == 1 && sharedLayout.getMaxPhase() == 8) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_128B; + else + llvm::report_fatal_error("Unsupported shared layout for StoreAsyncOp"); + tmaInfo.swizzle = swizzle; + tmaInfo.interleave = CUtensorMapInterleave::CU_TENSOR_MAP_INTERLEAVE_NONE; + tmaInfo.l2Promotion = + CUtensorMapL2promotion::CU_TENSOR_MAP_L2_PROMOTION_L2_128B; + tmaInfo.oobFill = + CUtensorMapFloatOOBfill::CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE; + + tmaMetadata->emplace_back(tmaInfo); + + Value llDst = adaptor.getDst(); + Value llSrc = adaptor.getSrc(); + auto srcShape = srcTy.getShape(); + auto smemObj = getSharedMemoryObjectFromStruct(loc, llSrc, rewriter); + + SmallVector offsetVals; + for (auto i = 0; i < srcShape.size(); ++i) { + offsetVals.emplace_back(i32_val(0)); + } + + Value tmaDesc = + llFuncOp.getBody().front().getArgument(tmaInfo.TMADescArgIdx); + auto ptrI8SharedTy = LLVM::LLVMPointerType::get( + typeConverter->convertType(rewriter.getI8Type()), 3); + + auto threadId = getThreadId(rewriter, loc); + Value pred = icmp_eq(threadId, i32_val(0)); + + auto llCoord = getTypeConverter()->unpackLLElements(loc, llDst, rewriter, + dst.getType()); + uint32_t boxStride = std::accumulate(boxDims.begin(), boxDims.end(), 1, + std::multiplies()); + + Value clusterCTAId = getClusterCTAId(rewriter, loc); + SmallVector multiDimClusterCTAId = + delinearize(rewriter, loc, clusterCTAId, CTAsPerCGA, CTAOrder); + + rewriter.create(loc, 0); + + for (uint32_t b = 0; b < numBox; ++b) { + SmallVector coord; + // raw coord + for (int i = 0; i < rank; ++i) { + auto dim = getDimOfOrder(dstOrder, i); + coord.push_back(llCoord[dim]); + } + // coord with box and cta offset + for (int i = 0; i < rank; ++i) { + auto dim = getDimOfOrder(dstOrder, i); + if (i == 0) { + coord[i] = add(coord[i], i32_val(b * boxDims[i])); + auto CTAOffset = + mul(multiDimClusterCTAId[dim], i32_val(numBox * boxDims[i])); + coord[i] = add(coord[i], CTAOffset); + } else { + coord[i] = add(coord[i], + mul(multiDimClusterCTAId[dim], i32_val(boxDims[i]))); + } + } + Value srcOffset = i32_val(b * boxStride); + auto srcPtrTy = ptr_ty(getTypeConverter()->convertType(elemTy), 3); + Value srcPtrBase = gep(srcPtrTy, smemObj.base, srcOffset); + auto addr = bitcast(srcPtrBase, ptrI8SharedTy); + rewriter.create(loc, tmaDesc, addr, pred, + coord); + } + rewriter.eraseOp(op); + return success(); + } + +private: + CUtensorMapDataType getCUtensorMapDataType(Type ty) const { + if (ty.isF16()) { + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT16; + } else if (ty.isF32()) { + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT32; + } else { + llvm::report_fatal_error("Unsupported elemTy for StoreAsyncOp"); + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT16; + } + } + + unsigned getArgIdx(Value v) const { + if (auto op = v.getDefiningOp()) { + return -1 - + op.getValue().dyn_cast().getValue().getZExtValue(); + } + if (v.getDefiningOp() && + isa(v.getDefiningOp())) { + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else if (v.getParentBlock()->isEntryBlock() && v.isa()) { + // in entryblock and is BlockArgument; Because argument of func are + // arugments of entryblock bb0 in MLIR + return v.cast().getArgNumber(); + } else if (v.getParentBlock()->isEntryBlock() && + (!v.isa())) { + // in entryblock but not BlockArgument + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else if (!v.getParentBlock()->isEntryBlock()) { + // in non-entryblock + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else { + llvm::report_fatal_error( + "Operand of `MakeTensorPtrOp` is not the function's argument"); + return 0; + } + } + + int getNumTMADescs(LLVM::LLVMFuncOp func) const { + if (!func->hasAttr(kAttrNumTMALoadDescsName)) { + llvm::report_fatal_error("TritonGPU module should contain a " + "triton_gpu.num-tma-load attribute"); + return -1; + } + if (!func->hasAttr(kAttrNumTMAStoreDescsName)) { + llvm::report_fatal_error("TritonGPU module should contain a " + "triton_gpu.num-tma-store attribute"); + return -1; + } + return func->getAttr(kAttrNumTMAStoreDescsName) + .cast() + .getInt() + + func->getAttr(kAttrNumTMALoadDescsName).cast().getInt(); + } + + const TensorPtrMapT *tensorPtrMap; +}; struct AtomicCASOpConversion : public ConvertTritonGPUOpToLLVMPattern, @@ -854,11 +1107,386 @@ struct InsertSliceAsyncOpConversion } }; +struct InsertSliceAsyncV2OpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::InsertSliceAsyncV2Op> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::InsertSliceAsyncV2Op>:: + ConvertTritonGPUOpToLLVMPattern; + + InsertSliceAsyncV2OpConversion(TritonGPUToLLVMTypeConverter &converter, + + ModuleAllocation &allocation, + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + const TensorPtrMapT *tensorPtrMap, + PatternBenefit benefit) + : ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::InsertSliceAsyncV2Op>(converter, allocation, + tmaMetadata, benefit), + tensorPtrMap(tensorPtrMap) {} + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::InsertSliceAsyncV2Op op, + OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + + Location loc = op->getLoc(); + auto resultTy = op.getResult().getType().cast(); + auto elemTy = resultTy.getElementType(); + auto rank = resultTy.getRank() - 1; + + // TODO: support any valid rank in (3, 4, 5) + assert(rank > 0 && rank <= 5); + SmallVector shape; + auto axis = op->getAttrOfType("axis").getInt(); + auto moduleOp = op->getParentOfType(); + assert(moduleOp && "Parent ModuleOp not found for InsertSliceAsyncV2Op"); + auto llFuncOp = op->getParentOfType(); + assert(llFuncOp && "LLVMFuncOp not found for InsertSliceAsyncV2Op"); + int numTMADescs = getNumTMADescs(llFuncOp); + assert(numTMADescs > 0); + auto sharedLayout = resultTy.getEncoding().dyn_cast(); + assert(sharedLayout && "unexpected layout of InsertSliceAsyncV2Op"); + auto CTAsPerCGA = sharedLayout.getCTALayout().getCTAsPerCGA(); + auto CTAOrder = sharedLayout.getCTALayout().getCTAOrder(); + auto CTASplitNum = sharedLayout.getCTALayout().getCTASplitNum(); + + mlir::triton::gpu::TMAInfo tmaInfo; + + tmaInfo.tensorDataType = getCUtensorMapDataType(elemTy); + tmaInfo.tensorRank = rank; + + assert(tmaMetadata); + unsigned TMADescIdx = tmaMetadata->size(); + unsigned numFuncArgs = llFuncOp.getBody().front().getNumArguments(); + auto makeTensorPtr = tensorPtrMap->lookup(op.getOperation()); + auto inOrder = makeTensorPtr.getOrder(); + unsigned globalAddressArgIdx = getArgIdx(makeTensorPtr.getBase()); + tmaInfo.globalAddressArgIdx = globalAddressArgIdx; + tmaInfo.TMADescArgIdx = numFuncArgs - numTMADescs + TMADescIdx; + + auto getDimOfOrder = [](ArrayRef order, int32_t i) { + auto it = std::find(order.begin(), order.end(), i); + assert(it != order.end()); + return std::distance(order.begin(), it); + }; + + std::vector globalDimsArgIdx; + std::vector globalStridesArgIdx; + // constant values are mapped to (-1 - value) + for (int i = 0; i < rank; ++i) { + int32_t argIdx = -1; + auto dim = getDimOfOrder(inOrder, i); + argIdx = getArgIdx(makeTensorPtr.getShape()[dim]); + globalDimsArgIdx.emplace_back(argIdx); + // handle constant stride + argIdx = getArgIdx(makeTensorPtr.getStrides()[dim]); + globalStridesArgIdx.emplace_back(argIdx); + } + + tmaInfo.globalDimsArgIdx = globalDimsArgIdx; + tmaInfo.globalStridesArgIdx = globalStridesArgIdx; + + std::vector boxDims; + auto tensorShape = makeTensorPtr.getResult() + .getType() + .cast() + .getPointeeType() + .cast() + .getShape(); + + SmallVector numMcast(rank); + unsigned accNumMcast = 1; + for (unsigned i = 0; i < rank; ++i) { + numMcast[i] = CTAsPerCGA[i] / CTASplitNum[i]; + accNumMcast *= numMcast[i]; + } + auto shapePerCTA = getShapePerCTA(CTASplitNum, tensorShape); + for (size_t i = 0; i < rank; ++i) { + auto dim = getDimOfOrder(inOrder, i); + // in case of TMA multicast, we should always slice along higher order + // dimensions + if (i == rank - 1) { + assert(shapePerCTA[dim] >= accNumMcast && + "cases when the size of the highest order is smaller " + "than numMcasts is not implemented"); + boxDims.emplace_back(shapePerCTA[dim] / accNumMcast); + } else { + boxDims.emplace_back(shapePerCTA[dim]); + } + } + + std::vector elementStrides(rank, 1); + tmaInfo.elementStrides = elementStrides; + + CUtensorMapSwizzle swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_NONE; + if (sharedLayout.getPerPhase() == 4 && sharedLayout.getMaxPhase() == 2) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_32B; + else if (sharedLayout.getPerPhase() == 2 && sharedLayout.getMaxPhase() == 4) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_64B; + else if (sharedLayout.getPerPhase() == 1 && sharedLayout.getMaxPhase() == 8) + swizzle = CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_128B; + else + llvm::report_fatal_error( + "Unsupported shared layout for InsertSliceAsyncV2Op"); + + tmaInfo.swizzle = swizzle; + tmaInfo.interleave = CUtensorMapInterleave::CU_TENSOR_MAP_INTERLEAVE_NONE; + tmaInfo.l2Promotion = + CUtensorMapL2promotion::CU_TENSOR_MAP_L2_PROMOTION_L2_128B; + tmaInfo.oobFill = + CUtensorMapFloatOOBfill::CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE; + + uint32_t numBoxes = 1; + uint32_t elemSizeOfBytes = elemTy.getIntOrFloatBitWidth() / 8; + if (swizzle == CUtensorMapSwizzle::CU_TENSOR_MAP_SWIZZLE_128B) { + while (elemSizeOfBytes * boxDims[0] > 128) { + boxDims[0] = boxDims[0] / 2; + numBoxes *= 2; + } + } + tmaInfo.boxDims = boxDims; + tmaMetadata->emplace_back(tmaInfo); + + uint32_t elemsPerBox = + std::accumulate(boxDims.begin(), boxDims.end(), 1, std::multiplies{}); + + Value clusterCTAId = getClusterCTAId(rewriter, loc); + SmallVector multiDimClusterCTAId = + delinearize(rewriter, loc, clusterCTAId, CTAsPerCGA, CTAOrder); + + Value llDst = adaptor.getDst(); + Value llIndex = adaptor.getIndex(); + Value src = op.getSrc(); + Value dst = op.getDst(); + auto dstTy = dst.getType().cast(); + auto dstShape = dstTy.getShape(); + auto smemObj = getSharedMemoryObjectFromStruct(loc, llDst, rewriter); + + // the offset of coord considering multicast slicing + SmallVector mcastOffsetVals; + // The index of slice is this CTAId is responsible for + SmallVector multiDimSliceIdx(rank); + for (auto i = 0; i < rank; ++i) + multiDimSliceIdx[i] = + udiv(multiDimClusterCTAId[i], i32_val(CTASplitNum[i])); + Value sliceIdx = + linearize(rewriter, loc, multiDimSliceIdx, numMcast, CTAOrder); + + Value sliceCoord; + for (auto i = 0; i < rank; ++i) { + if (inOrder[i] == rank - 1) { + // TODO[goostavz]: Cases when the size of the highest order is smaller + // than numMcasts is not implemented. + sliceCoord = mul(sliceIdx, i32_val(shapePerCTA[i] / accNumMcast)); + mcastOffsetVals.emplace_back( + mul(sliceIdx, i32_val(shapePerCTA[i] / accNumMcast))); + } else { + mcastOffsetVals.emplace_back(i32_val(0)); + } + } + + uint32_t elemsPerSlice = std::accumulate( + shapePerCTA.begin(), shapePerCTA.end(), 1, std::multiplies{}); + Value dstOffsetCommon = mul(llIndex, i32_val(elemsPerSlice)); + // [benzh] sliceCoord should be higher dimension's multiplier accumulate. + // currently only support rank == 2. + dstOffsetCommon = + add(dstOffsetCommon, mul(sliceCoord, i32_val(boxDims[0]))); + auto dstPtrTy = ptr_ty(getTypeConverter()->convertType(elemTy), 3); + + Value tmaDesc = + llFuncOp.getBody().front().getArgument(tmaInfo.TMADescArgIdx); + // TODO: sink this logic into Triton::NVGPU dialect and support more + // cache-policy modes + Value l2Desc = int_val(64, 0x1000000000000000ll); + + auto ptrI8SharedTy = LLVM::LLVMPointerType::get( + typeConverter->convertType(rewriter.getI8Type()), 3); + + SmallVector coordCommon; + auto llCoord = getTypeConverter()->unpackLLElements( + loc, adaptor.getSrc(), rewriter, src.getType()); + + for (int i = 0; i < rank; ++i) { + auto dim = getDimOfOrder(inOrder, i); + Value coordDim = bitcast(llCoord[dim], i32_ty); + if (CTASplitNum[dim] != 1) { + // Add offset for each CTA + // boxDims[i] * (multiDimClusterCTAId[i] % CTASplitNum[i]); + auto CTAOffset = + mul(i32_val(shapePerCTA[dim]), + urem(multiDimClusterCTAId[dim], i32_val(CTASplitNum[dim]))); + coordDim = add(coordDim, CTAOffset); + } + + if (i == rank - 1) + // Add offset in case of multicast slicing + coordCommon.push_back(add(coordDim, mcastOffsetVals[dim])); + else + coordCommon.push_back(coordDim); + } + + auto threadId = getThreadId(rewriter, loc); + Value pred = icmp_eq(threadId, i32_val(0)); + + auto mask = adaptor.getMask(); + if (mask) { + // TODO(thomas): What is the right implementation for this case? + assert(mask.getType().isInteger(1) && + "need to implement cases with tensor mask"); + pred = rewriter.create(loc, pred, mask); + } + + Value mcastMask = getMCastMask(sharedLayout, rewriter, loc, clusterCTAId); + + for (size_t i = 0; i < numBoxes; ++i) { + Value dstOffset = + add(dstOffsetCommon, i32_val(i * elemsPerBox * accNumMcast)); + Value dstPtrBase = gep(dstPtrTy, smemObj.base, dstOffset); + SmallVector coord = coordCommon; + coord[0] = add(coordCommon[0], i32_val(i * boxDims[0])); + rewriter.create( + loc, bitcast(dstPtrBase, ptrI8SharedTy), adaptor.getMbar(), tmaDesc, + l2Desc, pred, coord, mcastMask); + } + + rewriter.replaceOp(op, llDst); + return success(); + } + +private: + Value getMCastMask(const SharedEncodingAttr &sharedLayout, + ConversionPatternRewriter &rewriter, Location loc, + Value clusterCTAId) const { + auto CTAsPerCGA = sharedLayout.getCTALayout().getCTAsPerCGA(); + auto CTAOrder = sharedLayout.getCTALayout().getCTAOrder(); + auto CTASplitNum = sharedLayout.getCTALayout().getCTASplitNum(); + + // Short path when no multicast is needed + if (CTAsPerCGA == CTASplitNum) + return nullptr; + + // Short path when bcastMask is a constant + bool isConstMcastMask = true; + for (unsigned s : CTASplitNum) { + if (s > 1) { + isConstMcastMask = false; + break; + } + } + if (isConstMcastMask) { + unsigned numCTAs = std::accumulate(CTAsPerCGA.begin(), CTAsPerCGA.end(), + 1, std::multiplies{}); + return int_val(/*width*/ 16, (1u << numCTAs) - 1); + } + + SmallVector multiDimCTAId = + delinearize(rewriter, loc, clusterCTAId, CTAsPerCGA, CTAOrder); + auto rank = CTAOrder.size(); + SmallVector> multiDimMask(rank); + unsigned accNumMcast = 1; + SmallVector numMcast(rank); + for (unsigned i = 0; i < rank; ++i) { + // For the ith dimension, CTAsPerCGA[i]/CTASplitNum[i] vals is to be + // broadcasted, which for this CTAId is: + // multiDimCTAId[i] % CTASplitNum[i] + (0 .. + // (CTAsPerCGA[i]/CTASplitNum[i] - 1)) * CTASplitNum[i] + // TODO: will there be cases if CTAsPerCGA[i]/CTASplitNum[i] < 1? + Value rem = urem(multiDimCTAId[i], i32_val(CTASplitNum[i])); + numMcast[i] = CTAsPerCGA[i] / CTASplitNum[i]; + accNumMcast *= numMcast[i]; + for (unsigned j = 0; j < numMcast[i]; ++j) { + if (j == 0) { + multiDimMask[i].push_back(rem); + } else { + multiDimMask[i].push_back(add(rem, i32_val(j * CTASplitNum[i]))); + } + } + } + + Value bcastMask = int_val(/*width*/ 16, 0); + Value _1_i16 = int_val(/*width*/ 16, 1); + for (unsigned i = 0; i < accNumMcast; ++i) { + SmallVector multiDimIdx = + getMultiDimIndex(i, numMcast, CTAOrder); + SmallVector multiDimMaskedCTAId(rank); + for (unsigned dim = 0; dim < rank; ++dim) { + multiDimMaskedCTAId[dim] = multiDimMask[dim][multiDimIdx[dim]]; + } + Value bcastCTAId = + linearize(rewriter, loc, multiDimMaskedCTAId, CTAsPerCGA, CTAOrder); + // bcastMask |= 1u << bcastCTAId; + bcastMask = or_(bcastMask, shl(_1_i16, trunc(i16_ty, bcastCTAId))); + } + + return bcastMask; + } + + CUtensorMapDataType getCUtensorMapDataType(Type ty) const { + if (ty.isF16()) { + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT16; + } else if (ty.isF32()) { + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT32; + } else { + llvm::report_fatal_error("Unsupported elemTy for InsertSliceAsyncV2Op"); + return CUtensorMapDataType::CU_TENSOR_MAP_DATA_TYPE_FLOAT16; + } + } + + unsigned getArgIdx(Value v) const { + if (auto op = v.getDefiningOp()) { + return -1 - + op.getValue().dyn_cast().getValue().getZExtValue(); + } + if (v.getDefiningOp() && + isa(v.getDefiningOp())) { + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else if (v.getParentBlock()->isEntryBlock() && v.isa()) { + // in entryblock and is BlockArgument; Because argument of func are + // arugments of entryblock bb0 in MLIR + return v.cast().getArgNumber(); + } else if (v.getParentBlock()->isEntryBlock() && + (!v.isa())) { + // in entryblock but not BlockArgument + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else if (!v.getParentBlock()->isEntryBlock()) { + // in non-entryblock + return getArgIdx(v.getDefiningOp()->getOperand(0)); + } else { + llvm::report_fatal_error( + "Operand of `MakeTensorPtrOp` is not the function's argument"); + return 0; + } + } + + int getNumTMADescs(LLVM::LLVMFuncOp func) const { + if (!func->hasAttr(kAttrNumTMALoadDescsName)) { + llvm::report_fatal_error("TritonGPU module should contain a " + "triton_gpu.num-tma-load attribute"); + return -1; + } + if (!func->hasAttr(kAttrNumTMAStoreDescsName)) { + llvm::report_fatal_error("TritonGPU module should contain a " + "triton_gpu.num-tma-store attribute"); + return -1; + } + return func->getAttr(kAttrNumTMAStoreDescsName) + .cast() + .getInt() + + func->getAttr(kAttrNumTMALoadDescsName).cast().getInt(); + } + + const TensorPtrMapT *tensorPtrMap; +}; + void populateLoadStoreOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, - ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, - PatternBenefit benefit) { + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + const TensorPtrMapT *tensorPtrMap, PatternBenefit benefit) { patterns.add(typeConverter, axisInfoAnalysis, benefit); patterns.add(typeConverter, axisInfoAnalysis, benefit); patterns.add(typeConverter, allocation, @@ -869,4 +1497,8 @@ void populateLoadStoreOpToLLVMPatterns( indexCacheInfo, benefit); patterns.add( typeConverter, allocation, indexCacheInfo, axisInfoAnalysis, benefit); + patterns.add( + typeConverter, allocation, tmaMetadata, tensorPtrMap, benefit); + patterns.add(typeConverter, allocation, tmaMetadata, + tensorPtrMap, benefit); } diff --git a/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.h index b3f9f52afff2..197edd77aa7a 100644 --- a/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/LoadStoreOpToLLVM.h @@ -8,8 +8,10 @@ using namespace mlir::triton; void populateLoadStoreOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, - ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, - PatternBenefit benefit); + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + const TensorPtrMapT *tensorPtrMap, PatternBenefit benefit); #endif diff --git a/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.cpp index 3781e45a768c..a4f8f7e48ac6 100644 --- a/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.cpp @@ -1,5 +1,7 @@ #include "ReduceOpToLLVM.h" #include "Utility.h" +#include "mlir/Dialect/LLVMIR/NVVMDialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" using namespace mlir; using namespace mlir::triton; @@ -14,8 +16,13 @@ using ::mlir::triton::gpu::getTotalElemsPerThread; struct ReduceOpConversion : public ConvertTritonGPUOpToLLVMPattern { public: - using ConvertTritonGPUOpToLLVMPattern< - triton::ReduceOp>::ConvertTritonGPUOpToLLVMPattern; + ReduceOpConversion( + TritonGPUToLLVMTypeConverter &typeConverter, ModuleAllocation &allocation, + ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, + int computeCapability, PatternBenefit benefit) + : ConvertTritonGPUOpToLLVMPattern( + typeConverter, allocation, indexCacheInfo, benefit), + computeCapability(computeCapability) {} LogicalResult matchAndRewrite(triton::ReduceOp op, OpAdaptor adaptor, @@ -26,14 +33,12 @@ struct ReduceOpConversion } private: + int computeCapability; + void accumulate(ConversionPatternRewriter &rewriter, Region &combineOp, - llvm::SmallVectorImpl &acc, ValueRange cur, - bool isFirst) const { + SmallVector &acc, ValueRange cur, bool isFirst) const { if (isFirst) { - acc.resize(cur.size()); - for (unsigned i = 0; i < cur.size(); ++i) { - acc[i] = cur[i]; - } + acc = SmallVector(cur.begin(), cur.end()); return; } @@ -114,7 +119,7 @@ struct ReduceOpConversion // writeIdx[originalAxis] = index[originalAxis] / axisSizePerThread writeIdx[originalAxis] = udiv(index[originalAxis], axisSizePerThread); } else if (auto mmaLayout = layout.dyn_cast()) { - if (!mmaLayout.isAmpere()) { + if (!mmaLayout.isAmpere() && !mmaLayout.isHopper()) { llvm::report_fatal_error("Unsupported layout"); } if (originalAxis == 0) { @@ -157,7 +162,6 @@ struct ReduceOpConversion elemPtrTys[i] = LLVM::LLVMPointerType::get(llvmElemTy, 3); } auto llvmIndexTy = getTypeConverter()->getIndexType(); - auto indexPtrTy = LLVM::LLVMPointerType::get(llvmIndexTy, 3); auto smemShape = helper.getScratchConfigBasic(); unsigned elems = product(smemShape); @@ -171,33 +175,10 @@ struct ReduceOpConversion elemPtrTys[i]); } - unsigned srcElems = getTotalElemsPerThread(srcTys[0]); - // Emits indices of the original tensor that each thread - // would own - auto srcIndices = emitIndices(loc, rewriter, srcLayout, srcTys[0]); auto srcValues = unpackInputs(loc, op, adaptor, rewriter); - - // Emits offsets (the offset from the base index) - // of the original tensor that each thread would own - // NOTE: Assumes offsets don't actually depend on type - SmallVector> offset = - emitOffsetForLayout(srcLayout, srcTys[0]); - - // Keep track of accumulations and their indices std::map, SmallVector> accs; std::map, SmallVector> indices; - - Region *combineOp = &op.getCombineOp(); - - // reduce within threads - for (unsigned i = 0; i < srcElems; ++i) { - SmallVector key = offset[i]; - key[axis] = 0; - bool isFirst = accs.find(key) == accs.end(); - accumulate(rewriter, *combineOp, accs[key], srcValues[i], isFirst); - if (isFirst) - indices[key] = srcIndices[i]; - } + reduceWithinThreads(helper, srcValues, accs, indices, rewriter); // cached int32 constants std::map ints; @@ -249,15 +230,17 @@ struct ReduceOpConversion readPtrs[i] = gep(elemPtrTys[i], writePtrs[i], readOffset); } - barrier(); + sync(rewriter, loc, op); + // Combine accumulator value from another thread SmallVector cur(op.getNumOperands()); for (unsigned i = 0; i < op.getNumOperands(); ++i) { cur[i] = load(readPtrs[i]); } - accumulate(rewriter, *combineOp, acc, cur, false); + accumulate(rewriter, op.getCombineOp(), acc, cur, false); + + sync(rewriter, loc, op); - barrier(); // Publish our new accumulator value to shared memory for (unsigned i = 0; i < op.getNumOperands(); ++i) { store(acc[i], writePtrs[i]); @@ -265,7 +248,7 @@ struct ReduceOpConversion } } - barrier(); + sync(rewriter, loc, op); // set output values SmallVector results(op.getNumOperands()); @@ -302,78 +285,186 @@ struct ReduceOpConversion return success(); } - // Use warp shuffle for reduction within warps and shared memory for data - // exchange across warps - LogicalResult matchAndRewriteFast(triton::ReduceOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const { - ReduceOpHelper helper(op); - Location loc = op->getLoc(); - unsigned axis = adaptor.getAxis(); - - auto srcTys = op.getInputTypes(); - auto srcLayout = helper.getSrcLayout(); - if (!helper.isSupportedLayout()) { - assert(false && "Unexpected srcLayout in ReduceOpConversion"); - } - auto srcOrd = triton::gpu::getOrder(srcLayout); - auto srcShape = helper.getSrcShape(); - - SmallVector elemPtrTys(srcTys.size()); - for (unsigned i = 0; i < op.getNumOperands(); ++i) { - auto ty = srcTys[i].getElementType(); - auto llvmElemTy = getTypeConverter()->convertType(ty); - elemPtrTys[i] = LLVM::LLVMPointerType::get(llvmElemTy, 3); + void sync(ConversionPatternRewriter &rewriter, Location loc, + triton::ReduceOp op) const { + // TODO[shuhaoj]: change hard code style of numThreads. Hide async_agent + // attr. + if (op->hasAttr("async_agent")) { + barSync(rewriter, op, getAgentIds(op).front(), 128); + } else { + barrier(); } - auto llvmIndexTy = getTypeConverter()->getIndexType(); - auto indexPtrTy = LLVM::LLVMPointerType::get(llvmIndexTy, 3); - - auto smemShapes = helper.getScratchConfigsFast(); - unsigned elems = product(smemShapes[0]); - unsigned maxElems = std::max(elems, product(smemShapes[1])); - - unsigned sizeIntraWarps = helper.getIntraWarpSizeWithUniqueData(); - unsigned sizeInterWarps = helper.getInterWarpSizeWithUniqueData(); + } - SmallVector smemBases(op.getNumOperands()); - bool isWarpSync = helper.isWarpSynchronous(); - - if (!isWarpSync) { - smemBases[0] = bitcast( - getSharedMemoryBase(loc, rewriter, op.getOperation()), elemPtrTys[0]); - for (unsigned i = 1; i < op.getNumOperands(); ++i) { - smemBases[i] = - bitcast(gep(elemPtrTys[i - 1], smemBases[i - 1], i32_val(maxElems)), - elemPtrTys[i]); - } + // Check if the reduction can use a redux op and return the kind. + std::optional matchReduxKind(triton::ReduceOp op) const { + if (computeCapability < 80) + return std::nullopt; + if (op.getNumOperands() != 1 || op.getNumResults() != 1) + return std::nullopt; + Block *block = &(*op.getCombineOp().begin()); + Operation *yield = block->getTerminator(); + Operation *reduceOp = yield->getOperand(0).getDefiningOp(); + if (!reduceOp || reduceOp->getNumOperands() != 2 || + reduceOp->getNumResults() != 1 || + !reduceOp->getResultTypes()[0].isInteger(32)) + return std::nullopt; + if (reduceOp->getOperand(0) != block->getArgument(0) || + reduceOp->getOperand(1) != block->getArgument(1)) + return std::nullopt; + if (isa(reduceOp)) + return NVVM::ReduxKind::ADD; + if (isa(reduceOp)) + return NVVM::ReduxKind::AND; + if (isa(reduceOp)) + return NVVM::ReduxKind::OR; + if (isa(reduceOp)) + return NVVM::ReduxKind::XOR; + if (auto externalCall = + dyn_cast(reduceOp)) { + if (externalCall.getSymbol() == "__nv_min") + return NVVM::ReduxKind::MIN; + if (externalCall.getSymbol() == "__nv_umin") + return NVVM::ReduxKind::UMIN; + if (externalCall.getSymbol() == "__nv_max") + return NVVM::ReduxKind::MAX; + if (externalCall.getSymbol() == "__nv_umax") + return NVVM::ReduxKind::UMAX; } + return std::nullopt; + } - unsigned srcElems = getTotalElemsPerThread(srcTys[0]); - auto srcIndices = emitIndices(loc, rewriter, srcLayout, srcTys[0]); - auto srcValues = unpackInputs(loc, op, adaptor, rewriter); - - std::map, SmallVector> accs; - std::map, SmallVector> indices; - + // Reduce along op axis for elements that are in the same thread. The + // accumulated value is stored in accs. + void reduceWithinThreads( + ReduceOpHelper &helper, SmallVector> &srcValues, + std::map, SmallVector> &accs, + std::map, SmallVector> &indices, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + RankedTensorType operandType = op.getInputTypes()[0]; // Assumes offsets don't actually depend on type SmallVector> offset = - emitOffsetForLayout(srcLayout, srcTys[0]); - + emitOffsetForLayout(helper.getSrcLayout(), operandType); + unsigned srcElems = getTotalElemsPerThread(operandType); auto *combineOp = &op.getCombineOp(); - + auto srcIndices = + emitIndices(op.getLoc(), rewriter, helper.getSrcLayout(), operandType); // reduce within threads for (unsigned i = 0; i < srcElems; ++i) { SmallVector key = offset[i]; - key[axis] = 0; + key[op.getAxis()] = 0; bool isFirst = accs.find(key) == accs.end(); accumulate(rewriter, *combineOp, accs[key], srcValues[i], isFirst); if (isFirst) indices[key] = srcIndices[i]; } + } + + // Apply warp reduction across the given number of contiguous lanes using op + // region and the accumulator values as source. + void warpReduce(ConversionPatternRewriter &rewriter, Location loc, + SmallVector &acc, triton::ReduceOp op, + unsigned numLaneToReduce) const { + if (auto kind = matchReduxKind(op)) { + // Based on benchmarking on A100 redux op gives a speed up only when doing + // a single reduction (not partioned) and when the mask is static. + // Therefore we currently only enable it to reduce across all the lanes. + if (numLaneToReduce == 32) { + assert(acc.size() == 1); + Value mask = i32_val(0xFFFFFFFF); + // Even though we currently don't use redux for partitioned reduction + // the code below supports it in case we want to tweak the heuristic. + if (numLaneToReduce < 32) { + // For partitioned reduction we need to caluclate the mask so that + // each group of numLaneToReduce threads has the correct mask. + unsigned bitmask = (1 << numLaneToReduce) - 1; + Value threadId = getThreadId(rewriter, loc); + Value laneId = urem(threadId, i32_val(32)); + mask = shl(i32_val(bitmask), + and_(laneId, i32_val(~(numLaneToReduce - 1)))); + } + acc[0] = rewriter.create(loc, acc[0].getType(), acc[0], + *kind, mask); + return; + } + } + + for (unsigned N = numLaneToReduce / 2; N > 0; N >>= 1) { + SmallVector shfl(acc.size()); + for (unsigned i = 0; i < acc.size(); ++i) { + shfl[i] = shflSync(loc, rewriter, acc[i], N); + } + accumulate(rewriter, op.getCombineOp(), acc, shfl, false); + } + } + + // Reduce across threads within each warp. + void + reduceWithinWarps(ReduceOpHelper &helper, + std::map, SmallVector> &accs, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + unsigned sizeIntraWarps = helper.getIntraWarpSizeWithUniqueData(); + for (auto it : accs) { + const SmallVector &key = it.first; + SmallVector &acc = accs[key]; + warpReduce(rewriter, op.getLoc(), acc, op, sizeIntraWarps); + } + } + + // Pack the accumualtor values and replace the reduce op with the result. + void packResults(ReduceOpHelper &helper, + std::map, SmallVector> &accs, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + Location loc = op.getLoc(); + unsigned axis = op.getAxis(); + SmallVector results(op.getNumOperands()); + for (unsigned i = 0; i < op.getNumOperands(); ++i) { + if (auto resultTy = + op.getResult()[i].getType().dyn_cast()) { + auto resultLayout = resultTy.getEncoding().cast(); + unsigned resultElems = getTotalElemsPerThread(resultTy); + SmallVector> resultOffset = + emitOffsetForLayout(resultLayout, resultTy); + SmallVector resultVals; + for (int j = 0; j < resultElems; j++) { + auto key = resultOffset[j]; + key.insert(key.begin() + axis, 0); + resultVals.push_back(accs[key][i]); + } + results[i] = getTypeConverter()->packLLElements(loc, resultVals, + rewriter, resultTy); + } else + results[i] = accs.begin()->second[i]; + } + rewriter.replaceOp(op, results); + } + + // Return the type of the shared memory pointer for operand i. + Type getElementPtrType(triton::ReduceOp op, int i) const { + auto ty = op.getInputTypes()[i].getElementType(); + auto llvmElemTy = getTypeConverter()->convertType(ty); + return LLVM::LLVMPointerType::get(llvmElemTy, 3); + } + void storeWarpReduceToSharedMemory( + ReduceOpHelper &helper, + std::map, SmallVector> &accs, + std::map, SmallVector> &indices, + SmallVector &smemBases, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + Location loc = op.getLoc(); Value threadId = getThreadId(rewriter, loc); Value warpSize = i32_val(32); Value warpId = udiv(threadId, warpSize); Value laneId = urem(threadId, warpSize); + auto srcLayout = helper.getSrcLayout(); + auto srcShape = helper.getSrcShape(); + unsigned axis = op.getAxis(); + auto smemShapes = helper.getScratchConfigsFast(); auto threadsPerWarp = triton::gpu::getThreadsPerWarpWithUniqueData(srcLayout, srcShape); @@ -391,67 +482,38 @@ struct ReduceOpConversion Value zero = i32_val(0); Value laneZero = icmp_eq(laneIdAxis, zero); - std::map, SmallVector> finalAccs; for (auto it : accs) { const SmallVector &key = it.first; - SmallVector acc = it.second; - - // Reduce within warps - for (unsigned N = sizeIntraWarps / 2; N > 0; N >>= 1) { - SmallVector shfl(op.getNumOperands()); - for (unsigned i = 0; i < op.getNumOperands(); ++i) { - shfl[i] = shflSync(loc, rewriter, acc[i], N); - } - accumulate(rewriter, *combineOp, acc, shfl, false); - } - - if (isWarpSync) { - finalAccs[key] = acc; - continue; - } + SmallVector &acc = it.second; SmallVector writeIdx = indices[key]; writeIdx[axis] = warpIdAxis; Value writeOffset = linearize(rewriter, loc, writeIdx, smemShapes[0], order); for (unsigned i = 0; i < op.getNumOperands(); ++i) { - Value writePtr = gep(elemPtrTys[i], smemBases[i], writeOffset); + auto elemPtrTy = getElementPtrType(op, i); + Value writePtr = gep(elemPtrTy, smemBases[i], writeOffset); storeShared(rewriter, loc, writePtr, acc[i], laneZero); } } + } - if (isWarpSync) { - SmallVector results(op.getNumOperands()); - for (unsigned i = 0; i < op.getNumOperands(); ++i) { - if (auto resultTy = - op.getResult()[i].getType().dyn_cast()) { - auto resultLayout = resultTy.getEncoding().cast(); - unsigned resultElems = getTotalElemsPerThread(resultTy); - SmallVector> resultOffset = - emitOffsetForLayout(resultLayout, resultTy); - SmallVector resultVals; - for (int j = 0; j < resultElems; j++) { - auto key = resultOffset[j]; - key.insert(key.begin() + axis, 0); - resultVals.push_back(finalAccs[key][i]); - } - results[i] = getTypeConverter()->packLLElements(loc, resultVals, - rewriter, resultTy); - } else - results[i] = finalAccs.begin()->second[i]; - } - rewriter.replaceOp(op, results); - return success(); - } - - barrier(); + // Load the reduction of each warp and accumulate them to a final value and + // store back to shared memory. + void accumulatePartialReductions(ReduceOpHelper &helper, + SmallVector &smemBases, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + auto srcLayout = helper.getSrcLayout(); + auto smemShapes = helper.getScratchConfigsFast(); + unsigned elems = product(smemShapes[0]); + unsigned sizeInterWarps = helper.getInterWarpSizeWithUniqueData(); + Location loc = op.getLoc(); - // The second round of shuffle reduction - // now the problem size: sizeInterWarps, s1, s2, .. , sn - // where sizeInterWarps is 2^m - // - // Each thread needs to process: - // elemsPerThread = sizeInterWarps * s1 * s2 .. Sn / numThreads + Value threadId = getThreadId(rewriter, loc); + Value warpSize = i32_val(32); + Value laneId = urem(threadId, warpSize); + Value zero = i32_val(0); auto mod = op.getOperation()->getParentOfType(); unsigned numThreads = @@ -464,23 +526,18 @@ struct ReduceOpConversion // i32_val(sizeInerWarps)) SmallVector acc(op.getNumOperands()); for (unsigned i = 0; i < op.getNumOperands(); ++i) { - Value readPtr = gep(elemPtrTys[i], smemBases[i], readOffset); + auto elemPtrTy = getElementPtrType(op, i); + Value readPtr = gep(elemPtrTy, smemBases[i], readOffset); acc[i] = load(readPtr); } - - for (unsigned N = sizeInterWarps / 2; N > 0; N >>= 1) { - SmallVector shfl(op.getNumOperands()); - for (unsigned i = 0; i < op.getNumOperands(); ++i) { - shfl[i] = shflSync(loc, rewriter, acc[i], N); - } - accumulate(rewriter, *combineOp, acc, shfl, false); - } + warpReduce(rewriter, loc, acc, op, sizeInterWarps); // only the first thread in each sizeInterWarps is writing Value writeOffset = readOffset; SmallVector writePtrs(op.getNumOperands()); for (unsigned i = 0; i < op.getNumOperands(); ++i) { - writePtrs[i] = gep(elemPtrTys[i], smemBases[i], writeOffset); + auto elemPtrTy = getElementPtrType(op, i); + writePtrs[i] = gep(elemPtrTy, smemBases[i], writeOffset); } Value threadIsNeeded = icmp_slt(threadId, i32_val(elems)); Value laneIdModSizeInterWarps = urem(laneId, i32_val(sizeInterWarps)); @@ -496,10 +553,17 @@ struct ReduceOpConversion readOffset = add(readOffset, i32_val(numThreads)); } } + } - barrier(); - - // set output values + // Load the final reduction from shared memory and replace the reduce result + // with it. + void loadReductionAndPackResult(ReduceOpHelper &helper, + SmallVector &smemBases, + ConversionPatternRewriter &rewriter) const { + triton::ReduceOp op = helper.getOperation(); + Location loc = op.getLoc(); + auto smemShapes = helper.getScratchConfigsFast(); + auto order = getOrder(helper.getSrcLayout()); SmallVector results(op.getNumOperands()); for (unsigned i = 0; i < op.getNumOperands(); ++i) { if (auto resultTy = @@ -513,10 +577,11 @@ struct ReduceOpConversion SmallVector resultVals(resultElems); for (size_t j = 0; j < resultElems; ++j) { SmallVector readIdx = resultIndices[j]; - readIdx.insert(readIdx.begin() + axis, i32_val(0)); + readIdx.insert(readIdx.begin() + op.getAxis(), i32_val(0)); Value readOffset = linearize(rewriter, loc, readIdx, smemShapes[0], order); - Value readPtr = gep(elemPtrTys[i], smemBases[i], readOffset); + Value readPtr = + gep(getElementPtrType(op, i), smemBases[i], readOffset); resultVals[j] = load(readPtr); } @@ -528,6 +593,65 @@ struct ReduceOpConversion } } rewriter.replaceOp(op, results); + } + + // Use warp shuffle for reduction within warps and shared memory for data + // exchange across warps + LogicalResult matchAndRewriteFast(triton::ReduceOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const { + ReduceOpHelper helper(op); + assert(helper.isSupportedLayout() && + "Unexpected srcLayout in ReduceOpConversion"); + Location loc = op->getLoc(); + + auto srcValues = unpackInputs(loc, op, adaptor, rewriter); + std::map, SmallVector> accs; + std::map, SmallVector> indices; + // First reduce all the values along axis within each thread. + reduceWithinThreads(helper, srcValues, accs, indices, rewriter); + + // Then reduce across threads within a warp. + reduceWithinWarps(helper, accs, rewriter); + + if (helper.isWarpSynchronous()) { + // If all the values to be reduced are within the same warp there is + // nothing left to do. + packResults(helper, accs, rewriter); + return success(); + } + + // Compute a shared memory base per operand. + auto smemShapes = helper.getScratchConfigsFast(); + unsigned elems = product(smemShapes[0]); + unsigned maxElems = std::max(elems, product(smemShapes[1])); + SmallVector smemBases(op.getNumOperands()); + smemBases[0] = + bitcast(getSharedMemoryBase(loc, rewriter, op.getOperation()), + getElementPtrType(op, 0)); + for (unsigned i = 1; i < op.getNumOperands(); ++i) { + smemBases[i] = bitcast(gep(getElementPtrType(op, i - 1), smemBases[i - 1], + i32_val(maxElems)), + getElementPtrType(op, i)); + } + storeWarpReduceToSharedMemory(helper, accs, indices, smemBases, rewriter); + + sync(rewriter, loc, op); + + // The second round of shuffle reduction + // now the problem size: sizeInterWarps, s1, s2, .. , sn + // where sizeInterWarps is 2^m + // + // Each thread needs to process: + // elemsPerThread = sizeInterWarps * s1 * s2 .. Sn / numThreads + accumulatePartialReductions(helper, smemBases, rewriter); + + // We could avoid this barrier in some of the layouts, however this is not + // the general case. + // TODO: optimize the barrier in case the layouts are accepted. + sync(rewriter, loc, op); + + // set output values + loadReductionAndPackResult(helper, smemBases, rewriter); return success(); } @@ -535,9 +659,10 @@ struct ReduceOpConversion void populateReduceOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, - PatternBenefit benefit) { + int computeCapability, PatternBenefit benefit) { patterns.add(typeConverter, allocation, indexCacheInfo, - benefit); + computeCapability, benefit); } diff --git a/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.h index 677da86e30f2..225ddaec068a 100644 --- a/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/ReduceOpToLLVM.h @@ -8,8 +8,9 @@ using namespace mlir::triton; void populateReduceOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, - PatternBenefit benefit); + int computeCapability, PatternBenefit benefit); #endif diff --git a/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.cpp new file mode 100644 index 000000000000..e498208428d6 --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.cpp @@ -0,0 +1,43 @@ +#include "RegReallocOpToLLVM.h" + +using namespace mlir; +using namespace mlir::triton; + +struct RegAllocOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::RegAllocOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::RegAllocOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getRegCount()); + return success(); + } +}; + +struct RegDeallocOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::RegDeallocOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::RegDeallocOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Location loc = op->getLoc(); + rewriter.replaceOpWithNewOp( + op, adaptor.getRegCount()); + return success(); + } +}; + +void populateRegReallocOpToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + const ModuleAllocation &allocation, PatternBenefit benefit) { + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + return; +} diff --git a/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.h new file mode 100644 index 000000000000..ebbcabd26eab --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/RegReallocOpToLLVM.h @@ -0,0 +1,14 @@ +#ifndef TRITON_CONVERSION_TRITONGPU_TO_LLVM_REGREALLOC_OP_H +#define TRITON_CONVERSION_TRITONGPU_TO_LLVM_REGREALLOC_OP_H + +#include "TritonGPUToLLVMBase.h" + +using namespace mlir; +using namespace mlir::triton; + +void populateRegReallocOpToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + const ModuleAllocation &allocation, PatternBenefit benefit); + +#endif diff --git a/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.cpp index 533d1de6314e..5f8333e75009 100644 --- a/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.cpp @@ -316,6 +316,7 @@ ScanOpConversion::emitFastScan(triton::ScanOp op, triton::ScanOpAdaptor adaptor, void populateScanOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit) { diff --git a/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.h index 7a0bfbec5e3d..1249896708c8 100644 --- a/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/ScanOpToLLVM.h @@ -8,6 +8,7 @@ using namespace mlir::triton; void populateScanOpToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.cpp new file mode 100644 index 000000000000..3aa43422669e --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "TensorPtrOpsToLLVM.h" +using namespace mlir; +using namespace mlir::triton; + +struct MakeTensorPtrOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::MakeTensorPtrOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::MakeTensorPtrOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + + // struct { offset0, offset1, shape0, shape1, stride0, + // stride1, base_ptr}; + auto offsets = adaptor.getOffsets(); + auto shapes = adaptor.getShape(); + auto strides = adaptor.getStrides(); + auto base = adaptor.getBase(); + auto result = op.getResult(); + + SmallVector elems; + for (auto offset : offsets) + elems.push_back(offset); + for (auto shape : shapes) + elems.push_back(shape); + for (auto stride : strides) + elems.push_back(stride); + + elems.push_back(base); + + auto newValue = getTypeConverter()->packLLElements( + op.getLoc(), elems, rewriter, result.getType()); + rewriter.replaceOp(op, newValue); + return success(); + } +}; + +struct AdvanceOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::AdvanceOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::AdvanceOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + // struct { offset0, offset1, shape0, shape1, stride0, + // stride1, base_ptr}; + auto loc = op.getLoc(); + auto ptrType = op.getPtr().getType(); + auto tensorPtr = adaptor.getPtr(); + + auto offsets = adaptor.getOffsets(); + auto elems = + getTypeConverter()->unpackLLElements(loc, tensorPtr, rewriter, ptrType); + + SmallVector newOffsets; + + for (auto [offset, oldOffset] : llvm::zip_first(offsets, elems)) { + newOffsets.push_back((add(offset, oldOffset))); + } + + for (size_t i = 0; i < newOffsets.size(); ++i) { + elems[i] = newOffsets[i]; + } + + auto newValue = getTypeConverter()->packLLElements(op.getLoc(), elems, + rewriter, ptrType); + rewriter.replaceOp(op, newValue); + return success(); + } +}; + +void populateTensorPtrOpsToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit) { + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + return; +} diff --git a/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.h b/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.h new file mode 100644 index 000000000000..2bf5eb082b88 --- /dev/null +++ b/lib/Conversion/TritonGPUToLLVM/TensorPtrOpsToLLVM.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_CONVERSION_TRITONGPU_TO_LLVM_TENSOR_PTR_OPS_H +#define TRITON_CONVERSION_TRITONGPU_TO_LLVM_TENSOR_PTR_OPS_H + +#include "TritonGPUToLLVMBase.h" + +using namespace mlir; +using namespace mlir::triton; + +void populateTensorPtrOpsToLLVMPatterns( + TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit); + +#endif diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp index c2a1cd59db97..b9e5b563f541 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp @@ -389,18 +389,23 @@ struct GetProgramIdOpConversion LogicalResult matchAndRewrite(triton::GetProgramIdOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { + // It is not easy to get the compute capability here, so we use numCTAs to + // decide the semantic of GetProgramIdOp. If numCTAs = 1, then + // GetProgramIdOp is converted to "%ctaid", otherwise it is converted to + // "%clusterid". + auto moduleOp = op->getParentOfType(); + assert(moduleOp && "Parent ModuleOp not found for GetProgramIdOp"); + int numCTAs = triton::gpu::TritonGPUDialect::getNumCTAs(moduleOp); + Location loc = op->getLoc(); assert(op.getAxisAsInt() < 3); + std::string sreg = numCTAs == 1 ? "%ctaid." : "%clusterid."; + sreg.append(1, 'x' + op.getAxisAsInt()); // 0 -> 'x', 1 -> 'y', 2 -> 'z' - Value blockId = - rewriter.create<::mlir::gpu::BlockIdOp>(loc, dims[op.getAxisAsInt()]); - rewriter.replaceOpWithNewOp(op, i32_ty, blockId); + Value programId = getSRegValue(rewriter, loc, sreg); + rewriter.replaceOpWithNewOp(op, i32_ty, programId); return success(); } - - static constexpr mlir::gpu::Dimension dims[] = {mlir::gpu::Dimension::x, - mlir::gpu::Dimension::y, - mlir::gpu::Dimension::z}; }; struct GetNumProgramsOpConversion @@ -411,19 +416,54 @@ struct GetNumProgramsOpConversion LogicalResult matchAndRewrite(triton::GetNumProgramsOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { + // It is not easy to get the compute capability here, so we use numCTAs to + // decide the semantic of GetNumProgramsOp. If numCTAs = 1, then + // GetNumProgramsOp is converted to "%nctaid", otherwise it is converted to + // "%nclusterid". + auto moduleOp = op->getParentOfType(); + assert(moduleOp && "Parent ModuleOp not found for GetProgramIdOp"); + int numCTAs = triton::gpu::TritonGPUDialect::getNumCTAs(moduleOp); + Location loc = op->getLoc(); assert(op.getAxis() < 3); + std::string sreg = numCTAs == 1 ? "%nctaid." : "%nclusterid."; + sreg.append(1, 'x' + op.getAxis()); // 0 -> 'x', 1 -> 'y', 2 -> 'z' - Value blockId = - rewriter.create<::mlir::gpu::GridDimOp>(loc, dims[op.getAxis()]); - rewriter.replaceOpWithNewOp(op, i32_ty, blockId); + Value numPrograms = getSRegValue(rewriter, loc, sreg); + rewriter.replaceOpWithNewOp(op, i32_ty, numPrograms); + return success(); + } +}; +// TODO[goostavz]: GetThreadIdOp/GetClusterCTAIdOp is a temporary solution +// before async dialect is done. These concepts should appear in ttgpu +// level, and they are planned to be deprecated along with ttgpu.mbarrier_xxx +// ops. +struct GetThreadIdOpConversion : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::GetThreadIdOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::GetThreadIdOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::nvidia_gpu::GetThreadIdOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOp(op, getThreadId(rewriter, op->getLoc())); return success(); } +}; + +struct GetClusterCTAIdOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::GetClusterCTAIdOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::nvidia_gpu::GetClusterCTAIdOp>::ConvertTritonGPUOpToLLVMPattern; - static constexpr mlir::gpu::Dimension dims[] = {mlir::gpu::Dimension::x, - mlir::gpu::Dimension::y, - mlir::gpu::Dimension::z}; + LogicalResult + matchAndRewrite(triton::nvidia_gpu::GetClusterCTAIdOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOp(op, getClusterCTAId(rewriter, op->getLoc())); + return success(); + } }; struct AddPtrOpConversion @@ -479,7 +519,8 @@ struct AllocTensorOpConversion getTypeConverter()->convertType(resultTy.getElementType()); auto elemPtrTy = ptr_ty(llvmElemTy, 3); smemBase = bitcast(smemBase, elemPtrTy); - auto order = resultTy.getEncoding().cast().getOrder(); + auto sharedLayout = resultTy.getEncoding().cast(); + auto order = sharedLayout.getOrder(); // Workaround for 3D tensors // TODO: we need to modify the pipeline pass to give a proper shared // encoding to 3D tensors @@ -489,8 +530,9 @@ struct AllocTensorOpConversion else newOrder = SmallVector(order.begin(), order.end()); - auto smemObj = SharedMemoryObject(smemBase, resultTy.getShape(), newOrder, - loc, rewriter); + auto shapePerCTA = getShapePerCTA(sharedLayout, resultTy.getShape()); + auto smemObj = + SharedMemoryObject(smemBase, shapePerCTA, newOrder, loc, rewriter); auto retVal = getStructFromSharedMemoryObject(loc, smemObj, rewriter); rewriter.replaceOp(op, retVal); return success(); @@ -593,6 +635,49 @@ struct AsyncCommitGroupOpConversion } }; +struct AsyncBulkWaitOpConversion + : public ConvertTritonGPUOpToLLVMPattern { + using ConvertTritonGPUOpToLLVMPattern< + triton::gpu::AsyncBulkWaitOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::gpu::AsyncBulkWaitOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + PTXBuilder ptxBuilder; + auto &asyncBulkWaitOp = *ptxBuilder.create<>("cp.async.bulk.wait_group"); + auto num = op->getAttrOfType("num").getInt(); + asyncBulkWaitOp(ptxBuilder.newConstantOperand(num)); + + auto ctx = op.getContext(); + auto loc = op.getLoc(); + auto voidTy = void_ty(ctx); + ptxBuilder.launch(rewriter, loc, voidTy); + + // Safe to remove the op since it doesn't have any return value. + rewriter.eraseOp(op); + return success(); + } +}; + +struct AsyncBulkCommitGroupOpConversion + : public ConvertTritonGPUOpToLLVMPattern< + triton::gpu::AsyncBulkCommitGroupOp> { + using ConvertTritonGPUOpToLLVMPattern< + triton::gpu::AsyncBulkCommitGroupOp>::ConvertTritonGPUOpToLLVMPattern; + + LogicalResult + matchAndRewrite(triton::gpu::AsyncBulkCommitGroupOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + + PTXBuilder ptxBuilder; + ptxBuilder.create<>("cp.async.bulk.commit_group")->operator()(); + ptxBuilder.launch(rewriter, op.getLoc(), void_ty(op.getContext())); + // Safe to remove the op since it doesn't have any return value. + rewriter.eraseOp(op); + return success(); + } +}; + namespace mlir { namespace LLVM { @@ -618,6 +703,7 @@ void vprintf_array(Value thread, ArrayRef arr, std::string info, void populateTritonGPUToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &moduleAllocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit) { @@ -626,12 +712,15 @@ void populateTritonGPUToLLVMPatterns( benefit); patterns.add(typeConverter, benefit); patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); patterns.add(typeConverter, benefit); - patterns.add(typeConverter, moduleAllocation, benefit); patterns.add(typeConverter, benefit); patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); + patterns.add(typeConverter, benefit); patterns.add(typeConverter, indexCacheInfo, benefit); patterns.add(typeConverter, benefit); patterns.add(typeConverter, benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.h b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.h index 50ba1355d75e..9019073584c0 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.h @@ -8,6 +8,7 @@ using namespace mlir::triton; void populateTritonGPUToLLVMPatterns( TritonGPUToLLVMTypeConverter &typeConverter, RewritePatternSet &patterns, + int numWarps, ModuleAxisInfoAnalysis &axisInfoAnalysis, ModuleAllocation &allocation, ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo &indexCacheInfo, PatternBenefit benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h index 99dee8bb322a..450d2b5635c9 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h @@ -11,16 +11,28 @@ #include "Utility.h" #include "mlir/IR/TypeUtilities.h" #include "triton/Analysis/AxisInfo.h" +#include "triton/Target/PTX/TmaMetadata.h" #include + +#define DEBUG_TYPE "ttgpu_to_llvm" + +constexpr ::llvm::StringLiteral kAttrNumTMALoadDescsName = + "triton_gpu.num-tma-load"; +constexpr ::llvm::StringLiteral kAttrNumTMAStoreDescsName = + "triton_gpu.num-tma-store"; using namespace mlir; using namespace mlir::triton; using ::mlir::LLVM::delinearize; using ::mlir::LLVM::SharedMemoryObject; using ::mlir::triton::gpu::BlockedEncodingAttr; +using ::mlir::triton::gpu::CTALayoutAttr; using ::mlir::triton::gpu::DotOperandEncodingAttr; using ::mlir::triton::gpu::MmaEncodingAttr; using ::mlir::triton::gpu::SliceEncodingAttr; +using ::mlir::triton::gpu::TMAMetadataTy; + +typedef DenseMap TensorPtrMapT; namespace mlir { namespace LLVM { @@ -141,36 +153,39 @@ struct FuncOpConversionBase : public ConvertOpToLLVMPattern { } }; -using IndexCacheKeyT = std::pair; +struct IndexCacheKeyT { + Attribute layout; + RankedTensorType type; + bool withCTAOffset; +}; struct CacheKeyDenseMapInfo { static IndexCacheKeyT getEmptyKey() { auto *pointer = llvm::DenseMapInfo::getEmptyKey(); - return std::make_pair( - mlir::Attribute(static_cast(pointer)), - RankedTensorType{}); + return {mlir::Attribute(static_cast(pointer)), + RankedTensorType{}, true}; } static IndexCacheKeyT getTombstoneKey() { auto *pointer = llvm::DenseMapInfo::getTombstoneKey(); auto tombstone = llvm::DenseMapInfo::getTombstoneKey(); - return std::make_pair( - mlir::Attribute(static_cast(pointer)), - tombstone); + return {mlir::Attribute(static_cast(pointer)), + tombstone, true}; } static unsigned getHashValue(IndexCacheKeyT key) { - auto shape = key.second.getShape(); - return llvm::hash_combine(mlir::hash_value(key.first), - mlir::hash_value(key.second)); + return llvm::hash_combine(mlir::hash_value(key.layout), + mlir::hash_value(key.type), + llvm::hash_value(key.withCTAOffset)); } static bool isEqual(IndexCacheKeyT LHS, IndexCacheKeyT RHS) { - return LHS == RHS; + return LHS.layout == RHS.layout && LHS.type == RHS.type && + LHS.withCTAOffset == RHS.withCTAOffset; } }; class ConvertTritonGPUOpToLLVMPatternBase { public: // Two levels of value cache in emitting indices calculation: - // Key: pair + // Key: {layout, shape, withCTAOffset} struct IndexCacheInfo { DenseMap, CacheKeyDenseMapInfo> *baseIndexCache; @@ -198,6 +213,12 @@ class ConvertTritonGPUOpToLLVMPatternBase { : converter(&typeConverter), allocation(&allocation), indexCacheInfo(indexCacheInfo) {} + explicit ConvertTritonGPUOpToLLVMPatternBase( + TritonGPUToLLVMTypeConverter &typeConverter, ModuleAllocation &allocation, + TMAMetadataTy *tmaMetadata) + : converter(&typeConverter), allocation(&allocation), + tmaMetadata(tmaMetadata) {} + TritonGPUToLLVMTypeConverter *getTypeConverter() const { return converter; } static Value @@ -223,6 +244,26 @@ class ConvertTritonGPUOpToLLVMPatternBase { return rewriter.create(loc, i32_ty, tid); } + static Value getSRegValue(OpBuilder &b, Location loc, + const std::string &sRegStr) { + PTXBuilder builder; + auto &mov = builder.create("mov")->o("u32"); + auto *destOpr = builder.newOperand("=r"); + auto *sRegOpr = builder.newConstantOperand(sRegStr); + mov(destOpr, sRegOpr); + Value val = builder.launch(b, loc, b.getIntegerType(32), false); + + auto cast = b.create( + loc, TypeRange{b.getIntegerType(32)}, ValueRange{val}); + return cast.getResult(0); + } + + Value getClusterCTAId(ConversionPatternRewriter &rewriter, + Location loc) const { + return rewriter.create( + loc, rewriter.getI32Type()); + } + // ----------------------------------------------------------------------- // Shared memory utilities // ----------------------------------------------------------------------- @@ -259,7 +300,7 @@ class ConvertTritonGPUOpToLLVMPatternBase { // for all indices (row, col) of `srcEncoding` such that idx % inVec = 0, // the pointer: ptr[(row, col)] = base + (rowOff * strides[ord[1]] + // colOff) where : - // compute phase = (row // perPhase) % maxPhase + // phase = (row // perPhase) % maxPhase // rowOff = row // colOff = colOffSwizzled + colOffOrdered // colOffSwizzled = ((col // outVec) ^ phase) * outVec @@ -280,60 +321,89 @@ class ConvertTritonGPUOpToLLVMPatternBase { // then (x + y) XOR z = 0byyyyxxxx XOR 0b00000zzzz = (x XOR z) + y // This means that we can use some immediate offsets for shared memory // operations. - auto dstPtrTy = ptr_ty(resElemTy, 3); + auto dstPtrTy = ptr_ty(getTypeConverter()->convertType(resElemTy), 3); auto dstOffset = dot(rewriter, loc, offsetVals, smemObj.strides); Value dstPtrBase = gep(dstPtrTy, smemObj.base, dstOffset); auto srcEncoding = srcTy.getEncoding(); auto srcShape = srcTy.getShape(); + auto srcShapePerCTA = triton::gpu::getShapePerCTA(srcTy); unsigned numElems = triton::gpu::getTotalElemsPerThread(srcTy); // swizzling params as described in TritonGPUAttrDefs.td unsigned outVec = resSharedLayout.getVec(); unsigned perPhase = resSharedLayout.getPerPhase(); unsigned maxPhase = resSharedLayout.getMaxPhase(); - // order + // Order auto inOrder = triton::gpu::getOrder(srcEncoding); auto outOrder = triton::gpu::getOrder(resSharedLayout); - // tensor indices held by the current thread, as LLVM values - auto srcIndices = emitIndices(loc, rewriter, srcEncoding, srcTy); - // return values + // Tensor indices held by the current thread, as LLVM values + auto srcIndices = emitIndices(loc, rewriter, srcEncoding, srcTy, false); + // Swizzling with leading offsets (e.g. Hopper GMMA) + unsigned swizzlingByteWidth = 0; + if (resSharedLayout.getHasLeadingOffset()) { + if (perPhase == 4 && maxPhase == 2) + swizzlingByteWidth = 32; + else if (perPhase == 2 && maxPhase == 4) + swizzlingByteWidth = 64; + else if (perPhase == 1 && maxPhase == 8) + swizzlingByteWidth = 128; + else + llvm::report_fatal_error("Unsupported shared layout."); + } + unsigned numElemsPerSwizzlingRow = + swizzlingByteWidth * 8 / resElemTy.getIntOrFloatBitWidth(); + Value numElemsPerSwizzlingRowVal = i32_val(numElemsPerSwizzlingRow); + unsigned leadingDimOffset = + numElemsPerSwizzlingRow * srcShapePerCTA[outOrder[1]]; + Value leadingDimOffsetVal = i32_val(leadingDimOffset); + // Return values DenseMap ret; // cache for non-immediate offsets DenseMap cacheCol, cacheRow; unsigned minVec = std::min(outVec, inVec); for (unsigned elemIdx = 0; elemIdx < numElems; elemIdx += minVec) { - // extract multi dimensional index for current element + Value offset = i32_val(0); + // Extract multi dimensional index for current element auto idx = srcIndices[elemIdx]; Value idxCol = idx[outOrder[0]]; // contiguous dimension Value idxRow = idx[outOrder[1]]; // discontiguous dimension Value strideCol = srcStrides[outOrder[0]]; Value strideRow = srcStrides[outOrder[1]]; + // compute phase = (row // perPhase) % maxPhase + Value phase = urem(udiv(idxRow, i32_val(perPhase)), i32_val(maxPhase)); // extract dynamic/static offset for immediate offsetting unsigned immedateOffCol = 0; - if (auto add = dyn_cast_or_null(idxCol.getDefiningOp())) - if (auto _cst = dyn_cast_or_null( - add.getRhs().getDefiningOp())) { - unsigned cst = - _cst.getValue().cast().getValue().getSExtValue(); - unsigned key = cst % (outVec * maxPhase); - cacheCol.insert({key, idxCol}); - idxCol = cacheCol[key]; - immedateOffCol = cst / (outVec * maxPhase) * (outVec * maxPhase); - } - // extract dynamic/static offset for immediate offsetting unsigned immedateOffRow = 0; - if (auto add = dyn_cast_or_null(idxRow.getDefiningOp())) - if (auto _cst = dyn_cast_or_null( - add.getRhs().getDefiningOp())) { - unsigned cst = - _cst.getValue().cast().getValue().getSExtValue(); - unsigned key = cst % (perPhase * maxPhase); - cacheRow.insert({key, idxRow}); - idxRow = cacheRow[key]; - immedateOffRow = cst / (perPhase * maxPhase) * (perPhase * maxPhase); - } - // compute phase = (row // perPhase) % maxPhase - Value phase = urem(udiv(idxRow, i32_val(perPhase)), i32_val(maxPhase)); + if (leadingDimOffset) { + // hopper + offset = + mul(udiv(idxCol, numElemsPerSwizzlingRowVal), leadingDimOffsetVal); + // Shrink by swizzling blocks + idxCol = urem(idxCol, numElemsPerSwizzlingRowVal); + strideRow = numElemsPerSwizzlingRowVal; + } else { + if (auto add = dyn_cast_or_null(idxCol.getDefiningOp())) + if (auto _cst = dyn_cast_or_null( + add.getRhs().getDefiningOp())) { + unsigned cst = + _cst.getValue().cast().getValue().getSExtValue(); + unsigned key = cst % (outVec * maxPhase); + cacheCol.insert({key, idxCol}); + idxCol = cacheCol[key]; + immedateOffCol = cst / (outVec * maxPhase) * (outVec * maxPhase); + } + if (auto add = dyn_cast_or_null(idxRow.getDefiningOp())) + if (auto _cst = dyn_cast_or_null( + add.getRhs().getDefiningOp())) { + unsigned cst = + _cst.getValue().cast().getValue().getSExtValue(); + unsigned key = cst % (perPhase * maxPhase); + cacheRow.insert({key, idxRow}); + idxRow = cacheRow[key]; + immedateOffRow = + cst / (perPhase * maxPhase) * (perPhase * maxPhase); + } + } // row offset is simply row index Value rowOff = mul(idxRow, strideRow); // because swizzling happens at a granularity of outVec, we need to @@ -347,7 +417,7 @@ class ConvertTritonGPUOpToLLVMPatternBase { colOffOrdered = mul(colOffOrdered, i32_val(minVec)); Value colOff = add(colOffSwizzled, colOffOrdered); // compute non-immediate offset - Value offset = add(rowOff, mul(colOff, strideCol)); + offset = add(offset, add(rowOff, mul(colOff, strideCol))); Value currPtr = gep(dstPtrTy, dstPtrBase, offset); // compute immediate offset Value immedateOff = @@ -477,7 +547,7 @@ class ConvertTritonGPUOpToLLVMPatternBase { auto threadsPerWarp = triton::gpu::getThreadsPerWarp(layout); auto warpsPerCTA = triton::gpu::getWarpsPerCTA(layout); auto order = triton::gpu::getOrder(layout); - auto shapePerCTA = triton::gpu::getShapePerCTA(layout, shape); + auto shapePerCTATile = triton::gpu::getShapePerCTATile(layout, shape); Value warpSize = i32_val(32); Value laneId = urem(tid, warpSize); Value warpId = udiv(tid, warpSize); @@ -487,7 +557,7 @@ class ConvertTritonGPUOpToLLVMPatternBase { delinearize(rewriter, loc, laneId, threadsPerWarp, order); for (unsigned dim = 0; dim < rank; ++dim) { // if there is no data replication across threads on this dimension - if (shape[dim] >= shapePerCTA[dim]) + if (shape[dim] >= shapePerCTATile[dim]) continue; // Otherwise, we need to mask threads that will replicate data on this // dimension. Calculate the thread index on this dimension for the CTA @@ -535,13 +605,48 @@ class ConvertTritonGPUOpToLLVMPatternBase { // Get offsets / indices for any layout // ----------------------------------------------------------------------- + SmallVector emitCTAOffsetForLayout(Location loc, + ConversionPatternRewriter &rewriter, + Attribute layout, + ArrayRef shape) const { + unsigned rank = shape.size(); + SmallVector CTAsPerCGA = triton::gpu::getCTAsPerCGA(layout); + SmallVector CTASplitNum = triton::gpu::getCTASplitNum(layout); + SmallVector CTAOrder = triton::gpu::getCTAOrder(layout); + SmallVector shapePerCTA = + triton::gpu::getShapePerCTA(CTASplitNum, shape); + + // Delinearize clusterCTAId + Value clusterCTAId = getClusterCTAId(rewriter, loc); + SmallVector multiDimClusterCTAId = + delinearize(rewriter, loc, clusterCTAId, CTAsPerCGA, CTAOrder); + + // CTA Wrapping + for (unsigned i = 0; i < rank; ++i) { + // This wrapping rule must be consistent with getShapePerCTA + unsigned splitNum = std::min(shape[i], CTASplitNum[i]); + multiDimClusterCTAId[i] = + urem(multiDimClusterCTAId[i], i32_val(splitNum)); + } + + SmallVector CTAOffset(rank); + for (unsigned i = 0; i < rank; ++i) + CTAOffset[i] = mul(multiDimClusterCTAId[i], i32_val(shapePerCTA[i])); + + return CTAOffset; + } + SmallVector emitBaseIndexForLayout(Location loc, ConversionPatternRewriter &rewriter, Attribute layout, - RankedTensorType type) const { - IndexCacheKeyT key = std::make_pair(layout, type); + RankedTensorType type, + bool withCTAOffset) const { + auto shape = type.getShape(); + IndexCacheKeyT key{layout, type, withCTAOffset}; auto cache = indexCacheInfo.baseIndexCache; auto insertPt = indexCacheInfo.indexInsertPoint; + + SmallVector baseIndex; if (cache && cache->count(key) > 0) { return cache->lookup(key); } else { @@ -550,23 +655,34 @@ class ConvertTritonGPUOpToLLVMPatternBase { restoreInsertionPointIfSet(insertPt, rewriter); SmallVector result; if (auto blockedLayout = layout.dyn_cast()) { - result = - emitBaseIndexForBlockedLayout(loc, rewriter, blockedLayout, type); + result = emitBaseIndexWithinCTAForBlockedLayout(loc, rewriter, + blockedLayout, type); } else if (auto mmaLayout = layout.dyn_cast()) { if (mmaLayout.isVolta()) - result = emitBaseIndexForMmaLayoutV1(loc, rewriter, mmaLayout, type); - if (mmaLayout.isAmpere()) - result = emitBaseIndexForMmaLayoutV2(loc, rewriter, mmaLayout, type); + result = emitBaseIndexWithinCTAForMmaLayoutV1(loc, rewriter, + mmaLayout, type); + if (mmaLayout.isAmpere() || mmaLayout.isHopper()) + result = emitBaseIndexWithinCTAForMmaLayoutV2V3(loc, rewriter, + mmaLayout, type); } else if (auto sliceLayout = layout.dyn_cast()) { auto parentLayout = sliceLayout.getParent(); auto parentShape = sliceLayout.paddedShape(type.getShape()); RankedTensorType parentTy = RankedTensorType::get( parentShape, type.getElementType(), parentLayout); - result = emitBaseIndexForLayout(loc, rewriter, parentLayout, parentTy); + result = emitBaseIndexForLayout(loc, rewriter, parentLayout, parentTy, + withCTAOffset); result.erase(result.begin() + sliceLayout.getDim()); + // CTAOffset has been added in emitBaseIndexForLayout of parentLayout + return result; } else { llvm_unreachable("unsupported emitBaseIndexForLayout"); } + if (withCTAOffset) { + auto CTAOffset = emitCTAOffsetForLayout(loc, rewriter, layout, shape); + assert(CTAOffset.size() == result.size() && "Rank mismatch"); + for (unsigned k = 0; k < result.size(); ++k) + result[k] = add(result[k], CTAOffset[k]); + } if (cache) { cache->insert(std::make_pair(key, result)); *insertPt = rewriter.saveInsertionPoint(); @@ -584,6 +700,8 @@ class ConvertTritonGPUOpToLLVMPatternBase { return emitOffsetForMmaLayoutV1(mmaLayout, type); if (mmaLayout.isAmpere()) return emitOffsetForMmaLayoutV2(mmaLayout, type); + if (mmaLayout.isHopper()) + return emitOffsetForMmaLayoutV3(mmaLayout, type); } if (auto sliceLayout = layout.dyn_cast()) return emitOffsetForSliceLayout(sliceLayout, type); @@ -593,11 +711,10 @@ class ConvertTritonGPUOpToLLVMPatternBase { // ----------------------------------------------------------------------- // Emit indices // ----------------------------------------------------------------------- - SmallVector> emitIndices(Location loc, - ConversionPatternRewriter &b, - Attribute layout, - RankedTensorType type) const { - IndexCacheKeyT key(layout, type); + SmallVector> + emitIndices(Location loc, ConversionPatternRewriter &b, Attribute layout, + RankedTensorType type, bool withCTAOffset = true) const { + IndexCacheKeyT key{layout, type, withCTAOffset}; auto cache = indexCacheInfo.indexCache; auto insertPt = indexCacheInfo.indexInsertPoint; if (cache && cache->count(key) > 0) { @@ -608,11 +725,14 @@ class ConvertTritonGPUOpToLLVMPatternBase { restoreInsertionPointIfSet(insertPt, b); SmallVector> result; if (auto blocked = layout.dyn_cast()) { - result = emitIndicesForDistributedLayout(loc, b, blocked, type); + result = emitIndicesForDistributedLayout(loc, b, blocked, type, + withCTAOffset); } else if (auto mma = layout.dyn_cast()) { - result = emitIndicesForDistributedLayout(loc, b, mma, type); + result = + emitIndicesForDistributedLayout(loc, b, mma, type, withCTAOffset); } else if (auto slice = layout.dyn_cast()) { - result = emitIndicesForDistributedLayout(loc, b, slice, type); + result = + emitIndicesForDistributedLayout(loc, b, slice, type, withCTAOffset); } else { llvm_unreachable( "emitIndices for layouts other than blocked & slice not " @@ -642,19 +762,20 @@ class ConvertTritonGPUOpToLLVMPatternBase { // Blocked layout indices // ----------------------------------------------------------------------- - // Get an index-base for each dimension for a \param blocked_layout. - SmallVector emitBaseIndexForBlockedLayout( + // Get an index-base for each dimension for a \param blockedLayout. + SmallVector emitBaseIndexWithinCTAForBlockedLayout( Location loc, ConversionPatternRewriter &rewriter, - const BlockedEncodingAttr &blocked_layout, RankedTensorType type) const { + const BlockedEncodingAttr &blockedLayout, RankedTensorType type) const { auto shape = type.getShape(); Value threadId = getThreadId(rewriter, loc); Value warpSize = i32_val(32); Value laneId = urem(threadId, warpSize); Value warpId = udiv(threadId, warpSize); - auto sizePerThread = blocked_layout.getSizePerThread(); - auto threadsPerWarp = blocked_layout.getThreadsPerWarp(); - auto warpsPerCTA = blocked_layout.getWarpsPerCTA(); - auto order = blocked_layout.getOrder(); + auto sizePerThread = blockedLayout.getSizePerThread(); + auto threadsPerWarp = blockedLayout.getThreadsPerWarp(); + auto warpsPerCTA = blockedLayout.getWarpsPerCTA(); + auto order = blockedLayout.getOrder(); + auto shapePerCTA = triton::gpu::getShapePerCTA(blockedLayout, shape); unsigned rank = shape.size(); // delinearize threadId to get the base index @@ -666,10 +787,10 @@ class ConvertTritonGPUOpToLLVMPatternBase { SmallVector multiDimBase(rank); for (unsigned k = 0; k < rank; ++k) { // Wrap around multiDimWarpId/multiDimThreadId in case - // shape[k] > shapePerCTA[k] + // shapePerCTATile[k] > shapePerCTA[k] auto maxWarps = - ceil(shape[k], sizePerThread[k] * threadsPerWarp[k]); - auto maxThreads = ceil(shape[k], sizePerThread[k]); + ceil(shapePerCTA[k], sizePerThread[k] * threadsPerWarp[k]); + auto maxThreads = ceil(shapePerCTA[k], sizePerThread[k]); multiDimWarpId[k] = urem(multiDimWarpId[k], i32_val(maxWarps)); multiDimThreadId[k] = urem(multiDimThreadId[k], i32_val(maxThreads)); // multiDimBase[k] = (multiDimThreadId[k] + @@ -692,16 +813,17 @@ class ConvertTritonGPUOpToLLVMPatternBase { auto threadsPerWarp = blockedLayout.getThreadsPerWarp(); auto warpsPerCTA = blockedLayout.getWarpsPerCTA(); auto order = blockedLayout.getOrder(); + auto shapePerCTATile = getShapePerCTATile(blockedLayout); + auto shapePerCTA = triton::gpu::getShapePerCTA(blockedLayout, shape); unsigned rank = shape.size(); - SmallVector shapePerCTA = getShapePerCTA(blockedLayout); SmallVector tilesPerDim(rank); for (unsigned k = 0; k < rank; ++k) - tilesPerDim[k] = ceil(shape[k], shapePerCTA[k]); + tilesPerDim[k] = ceil(shapePerCTA[k], shapePerCTATile[k]); SmallVector> offset(rank); for (unsigned k = 0; k < rank; ++k) { - // 1 block in minimum if shape[k] is less than shapePerCTA[k] + // 1 CTA tile in minimum if shapePerCTA[k] is less than shapePerCTATile[k] for (unsigned blockOffset = 0; blockOffset < tilesPerDim[k]; ++blockOffset) for (unsigned warpOffset = 0; warpOffset < warpsPerCTA[k]; ++warpOffset) @@ -741,12 +863,10 @@ class ConvertTritonGPUOpToLLVMPatternBase { // Mma layout indices // ----------------------------------------------------------------------- - SmallVector - emitBaseIndexForMmaLayoutV1(Location loc, ConversionPatternRewriter &rewriter, - const MmaEncodingAttr &mmaLayout, - RankedTensorType type) const { + SmallVector emitBaseIndexWithinCTAForMmaLayoutV1( + Location loc, ConversionPatternRewriter &rewriter, + const MmaEncodingAttr &mmaLayout, RankedTensorType type) const { auto shape = type.getShape(); - auto wpt = mmaLayout.getWarpsPerCTA(); static constexpr std::array fpw{{2, 2, 1}}; auto [isARow, isBRow, isAVec4, isBVec4, _] = @@ -879,9 +999,6 @@ class ConvertTritonGPUOpToLLVMPatternBase { SmallVector multiDimWarpId = delinearize(rewriter, loc, warpId, warpsPerCTA, order); - unsigned lastAxis = order[order.size() - 1]; - multiDimWarpId[lastAxis] = - urem(multiDimWarpId[lastAxis], i32_val(warpsPerCTA[lastAxis])); multiDimWarpId[0] = urem(multiDimWarpId[0], i32_val(shape[0] / 16)); multiDimWarpId[1] = urem(multiDimWarpId[1], i32_val(shape[1] / 8)); Value offWarp0 = mul(multiDimWarpId[0], i32_val(16)); @@ -897,10 +1014,13 @@ class ConvertTritonGPUOpToLLVMPatternBase { emitOffsetForMmaLayoutV2(const MmaEncodingAttr &mmaLayout, RankedTensorType type) const { auto shape = type.getShape(); + auto shapePerCTA = getShapePerCTA(mmaLayout, shape); SmallVector> ret; - for (unsigned i = 0; i < shape[0]; i += getShapePerCTA(mmaLayout)[0]) { - for (unsigned j = 0; j < shape[1]; j += getShapePerCTA(mmaLayout)[1]) { + for (unsigned i = 0; i < shapePerCTA[0]; + i += getShapePerCTATile(mmaLayout)[0]) { + for (unsigned j = 0; j < shapePerCTA[1]; + j += getShapePerCTATile(mmaLayout)[1]) { ret.push_back({i, j}); ret.push_back({i, j + 1}); ret.push_back({i + 8, j}); @@ -910,17 +1030,88 @@ class ConvertTritonGPUOpToLLVMPatternBase { return ret; } + SmallVector emitBaseIndexWithinCTAForMmaLayoutV2V3( + Location loc, ConversionPatternRewriter &rewriter, + const MmaEncodingAttr &mmaLayout, RankedTensorType type) const { + auto shape = type.getShape(); + auto _warpsPerCTA = mmaLayout.getWarpsPerCTA(); + assert(_warpsPerCTA.size() == 2); + auto order = triton::gpu::getOrder(mmaLayout); + ArrayRef instrShape = mmaLayout.getInstrShape(); + SmallVector warpsPerCTA = {i32_val(_warpsPerCTA[0]), + i32_val(_warpsPerCTA[1])}; + auto shapePerCTA = getShapePerCTA(mmaLayout, shape); + + Value threadId = getThreadId(rewriter, loc); + Value warpSize = i32_val(32); + Value laneId = urem(threadId, warpSize); + Value warpId = udiv(threadId, warpSize); + + uint32_t repM = (_warpsPerCTA[0] * instrShape[0]) / shapePerCTA[0]; + uint32_t repN = (_warpsPerCTA[1] * instrShape[1]) / shapePerCTA[1]; + + uint32_t warpsM; + if (repM > 1) + warpsM = _warpsPerCTA[0] / repM; + else + warpsM = shape[0] / instrShape[0]; + + uint32_t warpsN; + if (repN > 1) + warpsN = _warpsPerCTA[1] / repN; + else + warpsN = shape[1] / instrShape[1]; + + SmallVector multiDimWarpId = + delinearize(rewriter, loc, warpId, _warpsPerCTA, order); + Value warpId0 = urem(multiDimWarpId[0], i32_val(warpsM)); + Value warpId1 = urem(multiDimWarpId[1], i32_val(warpsN)); + + Value offWarp0 = mul(warpId0, i32_val(instrShape[0])); + Value offWarp1 = mul(warpId1, i32_val(instrShape[1])); + + SmallVector multiDimBase(2); + multiDimBase[0] = add(udiv(laneId, i32_val(4)), offWarp0); + multiDimBase[1] = add(mul(i32_val(2), urem(laneId, i32_val(4))), offWarp1); + return multiDimBase; + } + + SmallVector> + emitOffsetForMmaLayoutV3(const MmaEncodingAttr &mmaLayout, + RankedTensorType type) const { + auto shape = type.getShape(); + auto shapePerCTA = getShapePerCTA(mmaLayout, shape); + SmallVector> ret; + ArrayRef instrShape = mmaLayout.getInstrShape(); + + for (unsigned i = 0; i < shapePerCTA[0]; + i += getShapePerCTATile(mmaLayout)[0]) { + for (unsigned j = 0; j < shapePerCTA[1]; + j += getShapePerCTATile(mmaLayout)[1]) { + for (unsigned k = 0; k < instrShape[1]; k += 8) { + ret.push_back({i, j + k}); + ret.push_back({i, j + k + 1}); + ret.push_back({i + 8, j + k}); + ret.push_back({i + 8, j + k + 1}); + } + } + } + return ret; + } + // Emit indices calculation within each ConversionPattern, and returns a // [elemsPerThread X rank] index matrix. SmallVector> emitIndicesForDistributedLayout( Location loc, ConversionPatternRewriter &rewriter, Attribute layout, - RankedTensorType type) const { + RankedTensorType type, bool withCTAOffset) const { // step 1, delinearize threadId to get the base index - auto multiDimBase = emitBaseIndexForLayout(loc, rewriter, layout, type); + auto multiDimBase = + emitBaseIndexForLayout(loc, rewriter, layout, type, withCTAOffset); // step 2, get offset of each element auto offset = emitOffsetForLayout(layout, type); - // step 3, add offset to base, and reorder the sequence of indices to - // guarantee that elems in the same sizePerThread are adjacent in order + // step 3, add offset to base, and reorder the sequence + // of indices to guarantee that elems in the same + // sizePerThread are adjacent in order auto shape = type.getShape(); unsigned rank = shape.size(); unsigned elemsPerThread = offset.size(); @@ -961,6 +1152,7 @@ class ConvertTritonGPUOpToLLVMPatternBase { TritonGPUToLLVMTypeConverter *converter; ModuleAllocation *allocation; IndexCacheInfo indexCacheInfo; + mlir::triton::gpu::TMAMetadataTy *tmaMetadata; }; template @@ -975,6 +1167,12 @@ class ConvertTritonGPUOpToLLVMPattern : ConvertOpToLLVMPattern(typeConverter, benefit), ConvertTritonGPUOpToLLVMPatternBase(typeConverter) {} + explicit ConvertTritonGPUOpToLLVMPattern( + TritonGPUToLLVMTypeConverter &typeConverter, ModuleAllocation &allocation, + PatternBenefit benefit = 1) + : ConvertOpToLLVMPattern(typeConverter, benefit), + ConvertTritonGPUOpToLLVMPatternBase(typeConverter, allocation) {} + explicit ConvertTritonGPUOpToLLVMPattern( TritonGPUToLLVMTypeConverter &typeConverter, IndexCacheInfo indexCacheInfo, PatternBenefit benefit = 1) @@ -983,16 +1181,17 @@ class ConvertTritonGPUOpToLLVMPattern explicit ConvertTritonGPUOpToLLVMPattern( TritonGPUToLLVMTypeConverter &typeConverter, ModuleAllocation &allocation, - PatternBenefit benefit = 1) + IndexCacheInfo indexCacheInfo, PatternBenefit benefit = 1) : ConvertOpToLLVMPattern(typeConverter, benefit), - ConvertTritonGPUOpToLLVMPatternBase(typeConverter, allocation) {} + ConvertTritonGPUOpToLLVMPatternBase(typeConverter, allocation, + indexCacheInfo) {} explicit ConvertTritonGPUOpToLLVMPattern( TritonGPUToLLVMTypeConverter &typeConverter, ModuleAllocation &allocation, - IndexCacheInfo indexCacheInfo, PatternBenefit benefit = 1) + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, PatternBenefit benefit = 1) : ConvertOpToLLVMPattern(typeConverter, benefit), ConvertTritonGPUOpToLLVMPatternBase(typeConverter, allocation, - indexCacheInfo) {} + tmaMetadata) {} protected: TritonGPUToLLVMTypeConverter *getTypeConverter() const { diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.cpp b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.cpp index cc15d96cfe81..564d19d50912 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.cpp +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.cpp @@ -14,20 +14,27 @@ #include "mlir/Dialect/LLVMIR/NVVMDialect.h" #include "mlir/Dialect/LLVMIR/ROCDLDialect.h" #include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" #include "triton/Analysis/Allocation.h" #include "triton/Analysis/AxisInfo.h" #include "triton/Analysis/Membar.h" #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include "triton/Tools/Sys/GetPlatform.hpp" +#include "BarrierOpToLLVM.h" +#include "ClusterOpsToLLVM.h" #include "ConvertLayoutOpToLLVM.h" #include "DotOpToLLVM.h" #include "ElementwiseOpToLLVM.h" #include "LoadStoreOpToLLVM.h" #include "ReduceOpToLLVM.h" +#include "RegReallocOpToLLVM.h" #include "ScanOpToLLVM.h" +#include "TensorPtrOpsToLLVM.h" #include "TritonGPUToLLVM.h" +#include "TritonGPUToLLVMBase.h" #include "TypeConverter.h" #include "ViewOpToLLVM.h" @@ -35,6 +42,7 @@ using namespace mlir; using namespace mlir::triton; +namespace ttng = mlir::triton::nvidia_gpu; #define GEN_PASS_CLASSES #include "triton/Conversion/TritonGPUToLLVM/Passes.h.inc" @@ -56,6 +64,30 @@ class TritonLLVMFunctionConversionTarget : public ConversionTarget { } }; +class FoldSplatMaskInInsertAsync : public mlir::RewritePattern { + +public: + FoldSplatMaskInInsertAsync(mlir::MLIRContext *context) + : mlir::RewritePattern( + triton::nvidia_gpu::InsertSliceAsyncV2Op::getOperationName(), 1, + context) {} + + LogicalResult + matchAndRewrite(mlir::Operation *op, + mlir::PatternRewriter &rewriter) const override { + auto insertOp = cast(op); + if (!insertOp.getMask()) + return failure(); + auto splatOp = insertOp.getMask().getDefiningOp(); + if (!splatOp) + return failure(); + rewriter.updateRootInPlace(insertOp, [&]() { + insertOp.getMaskMutable().assign(splatOp->getOperand(0)); + }); + return mlir::success(); + } +}; + struct ReturnOpConversion : public ConvertOpToLLVMPattern { using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern; @@ -146,6 +178,18 @@ struct FuncOpConversion : public FuncOpConversionBase { if (!allocation.isRoot(funcOp)) amendedFuncOp = amendFuncOp(funcOp, rewriter); + // Collect TMA informations. + unsigned numTMALoad = 0; + funcOp.walk( + [&numTMALoad](triton::nvidia_gpu::InsertSliceAsyncV2Op insertSliceOp) { + numTMALoad++; + }); + unsigned numTMAStore = 0; + funcOp.walk([&numTMAStore](triton::nvidia_gpu::StoreAsyncOp storeAsyncOp) { + numTMAStore++; + }); + unsigned numTMA = numTMALoad + numTMAStore; + auto newFuncOp = convertFuncOpToLLVMFuncOp(amendedFuncOp, rewriter); if (!newFuncOp) { return failure(); @@ -171,6 +215,30 @@ struct FuncOpConversion : public FuncOpConversionBase { // The call graph is updated by mapping the old function to the new one. allocation.mapFuncOp(funcOp, newFuncOp); + // Append arguments to receive TMADesc in global memory in the runtime + auto i8PtrTy = LLVM::LLVMPointerType::get( + this->getTypeConverter()->convertType(rewriter.getI8Type()), 1); + auto numArgs = newFuncOp.getBody().front().getNumArguments(); + auto funcTy = newFuncOp.getFunctionType().cast(); + SmallVector newInputsTy(funcTy.getParams().begin(), + funcTy.getParams().end()); + for (unsigned i = 0; i < numTMA; ++i) { + newFuncOp.getBody().front().addArgument(i8PtrTy, funcOp.getLoc()); + newInputsTy.push_back(i8PtrTy); + } + newFuncOp.setType( + LLVM::LLVMFunctionType::get(funcTy.getReturnType(), newInputsTy)); + // required by AxisInfoAnalysis + for (unsigned i = 0; i < numTMA; ++i) { + newFuncOp.setArgAttr(numArgs + i, "tt.divisibility", + rewriter.getIntegerAttr(i32_ty, 1)); + } + + newFuncOp->setAttr(kAttrNumTMALoadDescsName, + rewriter.getIntegerAttr(i32_ty, numTMALoad)); + newFuncOp->setAttr(kAttrNumTMAStoreDescsName, + rewriter.getIntegerAttr(i32_ty, numTMAStore)); + rewriter.eraseOp(funcOp); return success(); } @@ -247,7 +315,6 @@ struct CallOpConversion : public ConvertOpToLLVMPattern { this->getTypeConverter()->packFunctionResults(resultTypes))) return nullptr; } - auto newCallOp = rewriter.create( callOp.getLoc(), packedResult ? TypeRange(packedResult) : TypeRange(), promotedOperands, callOp->getAttrs()); @@ -288,8 +355,10 @@ class TritonLLVMConversionTarget : public ConversionTarget { } else { addLegalDialect(); } + addLegalDialect(); addIllegalDialect(); addIllegalDialect(); + addIllegalDialect(); addIllegalDialect(); addLegalOp(); } @@ -299,8 +368,11 @@ class ConvertTritonGPUToLLVM : public ConvertTritonGPUToLLVMBase { public: - explicit ConvertTritonGPUToLLVM(int computeCapability, bool isROCM) - : computeCapability(computeCapability), isROCM(isROCM) {} + explicit ConvertTritonGPUToLLVM(int computeCapability, + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + bool isROCM) + : computeCapability(computeCapability), tmaMetadata(tmaMetadata), + isROCM(isROCM) {} void runOnOperation() override { MLIRContext *context = &getContext(); @@ -310,19 +382,54 @@ class ConvertTritonGPUToLLVM TritonGPUToLLVMTypeConverter typeConverter(context, option); TritonLLVMConversionTarget target(*context, isROCM); int numWarps = triton::gpu::TritonGPUDialect::getNumWarps(mod); + int numCTAs = triton::gpu::TritonGPUDialect::getNumCTAs(mod); int threadsPerWarp = triton::gpu::TritonGPUDialect::getThreadsPerWarp(mod); // Preprocess decomposeFp8e4b15Convert(mod); - decomposeMmaToDotOperand(mod, numWarps, threadsPerWarp); + decomposeMmaToDotOperand(mod, numWarps, threadsPerWarp, numCTAs); decomposeBlockedToDotOperand(mod); decomposeInsertSliceAsyncOp(mod); + decomposeMixedModeDotOp(mod); // Allocate shared memory and set barrier ModuleAllocation allocation(mod); ModuleMembarAnalysis membarPass(&allocation); membarPass.run(); + /* Get tensorPtrMap before conversion */ + TensorPtrMapT tensorPtrMap; + mod.walk([&tensorPtrMap]( + mlir::triton::nvidia_gpu::InsertSliceAsyncV2Op insertOp) { + auto src = insertOp.getSrc(); + auto ptrTy = src.getType().dyn_cast(); + if (ptrTy && ptrTy.getPointeeType().isa()) { + auto makeTensorPtrOp = getMakeTensorPtrOp(insertOp.getSrc()); + tensorPtrMap[insertOp.getOperation()] = makeTensorPtrOp; + } + }); + + mod.walk([&tensorPtrMap](mlir::triton::nvidia_gpu::StoreAsyncOp storeOp) { + auto dst = storeOp.getDst(); + auto ptrTy = dst.getType().dyn_cast(); + if (ptrTy && ptrTy.getPointeeType().isa()) { + auto makeTensorPtrOp = getMakeTensorPtrOp(storeOp.getDst()); + tensorPtrMap[storeOp.getOperation()] = makeTensorPtrOp; + } + }); + + // Hack: cleanup + { + RewritePatternSet patterns(context); + patterns.add(context); + SmallVector insertSlices; + mod.walk([&insertSlices](triton::nvidia_gpu::InsertSliceAsyncV2Op op) { + insertSlices.push_back(op); + }); + if (applyOpPatternsAndFold(insertSlices, std::move(patterns)).failed()) + signalPassFailure(); + } + // Lower functions { mlir::LowerToLLVMOptions option(context); @@ -358,9 +465,14 @@ class ConvertTritonGPUToLLVM } ModuleAxisInfoAnalysis axisInfoAnalysis(mod); - // Rewrite ops - RewritePatternSet patterns(context); - // TritonGPU lowering patterns + + // Emit logics to get threadId/blockIds/linearized clusterCTAId etc. and + // cache the values. The reason to do it here is that cluster_ctaid is + // currently implemented via inline asm, and thus cannot be CSEed. + // clusterCTAId will be emitted only when numCTAs is larger than 1, and + // other values will be DCEed if not used hereafter. + bool isWarpSpecialization = + ttng::TritonNvidiaGPUDialect::getWSSupportedAttr(mod); OpBuilder::InsertPoint indexInsertPoint; ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo indexCacheInfo{ &baseIndexCache, &indexCache, &indexInsertPoint}; @@ -368,21 +480,56 @@ class ConvertTritonGPUToLLVM if (axisInfoAnalysis.getNumFunctions() > 1) { indexCacheInfo = {nullptr, nullptr, nullptr}; } - populateTritonGPUToLLVMPatterns(typeConverter, patterns, allocation, - indexCacheInfo, /*benefit=*/1); - populateConvertLayoutOpToLLVMPatterns(typeConverter, patterns, allocation, - indexCacheInfo, /*benefit=*/1); - populateDotOpToLLVMPatterns(typeConverter, patterns, allocation, - /*benefit=*/1); - populateElementwiseOpToLLVMPatterns(typeConverter, patterns, /*benefit=*/1); - populateLoadStoreOpToLLVMPatterns(typeConverter, patterns, axisInfoAnalysis, - allocation, indexCacheInfo, - /*benefit=*/1); - populateReduceOpToLLVMPatterns(typeConverter, patterns, allocation, - indexCacheInfo, /*benefit=*/1); - populateScanOpToLLVMPatterns(typeConverter, patterns, allocation, - indexCacheInfo, /*benefit=*/1); - populateViewOpToLLVMPatterns(typeConverter, patterns, /*benefit=*/1); + + // tmaMetadata is absent in a triton-opt unit test, in this case, create a + // local one and dump it after this pass is done. + mlir::triton::gpu::TMAMetadataTy tmaMetaDataDebug; + if (tmaMetadata == nullptr) + tmaMetadata = &tmaMetaDataDebug; + + RewritePatternSet patterns(context); + + auto populatePatterns1 = [&](auto populateFunc) { + populateFunc(typeConverter, patterns, numWarps, axisInfoAnalysis, + allocation, indexCacheInfo, + /*benefit*/ 10); + }; + + auto populatePatterns2 = [&](auto populateFunc) { + populateFunc(typeConverter, patterns, numWarps, axisInfoAnalysis, + allocation, /*benefit*/ 10); + }; + + auto populatePatterns3 = [&](auto populateFunc) { + populateFunc(typeConverter, patterns, numWarps, axisInfoAnalysis, + allocation, indexCacheInfo, tmaMetadata, &tensorPtrMap, + /*benefit*/ 10); + }; + + auto populatePatterns4 = [&](auto populateFunc) { + populateFunc(typeConverter, patterns, numWarps, axisInfoAnalysis, + allocation, indexCacheInfo, computeCapability, + /*benefit*/ 10); + }; + + populatePatterns1(populateTritonGPUToLLVMPatterns); + populatePatterns1(populateConvertLayoutOpToLLVMPatterns); + populatePatterns2(populateDotOpToLLVMPatterns); + populatePatterns2(populateElementwiseOpToLLVMPatterns); + populatePatterns3(populateLoadStoreOpToLLVMPatterns); + populatePatterns4(populateReduceOpToLLVMPatterns); + populatePatterns1(populateScanOpToLLVMPatterns); + populatePatterns2(populateViewOpToLLVMPatterns); + populatePatterns2(populateBarrierOpToLLVMPatterns); + populatePatterns2(populateTensorPtrOpsToLLVMPatterns); + populatePatterns2(populateClusterOpsToLLVMPatterns); + populatePatterns2(populateRegReallocOpToLLVMPatterns); + + // TODO(thomas): this should probably be done in a separate step to not + // interfere with our own lowering of arith ops. Add arith/math's patterns + // to help convert scalar expression to LLVM. + mlir::arith::populateArithToLLVMConversionPatterns(typeConverter, patterns); + mlir::populateMathToLLVMConversionPatterns(typeConverter, patterns); // Native lowering patterns if (isROCM) { @@ -396,10 +543,18 @@ class ConvertTritonGPUToLLVM patterns); if (failed(applyPartialConversion(mod, target, std::move(patterns)))) return signalPassFailure(); + + // Fold CTAId when there is only 1 CTA. + if (numCTAs == 1) { + mod.walk([](triton::nvgpu::ClusterCTAIdOp id) { + OpBuilder b(id); + Value zero = LLVM::createConstantI32(id->getLoc(), b, 0); + id.replaceAllUsesWith(zero); + }); + } } private: - using IndexCacheKeyT = std::pair; DenseMap, CacheKeyDenseMapInfo> baseIndexCache; DenseMap>, @@ -408,6 +563,7 @@ class ConvertTritonGPUToLLVM int computeCapability{}; bool isROCM{}; + mlir::triton::gpu::TMAMetadataTy *tmaMetadata; void initSharedMemory(ModuleAllocation &allocation, TritonGPUToLLVMTypeConverter &typeConverter) { @@ -470,8 +626,8 @@ class ConvertTritonGPUToLLVM }); } - void decomposeMmaToDotOperand(ModuleOp mod, int numWarps, - int threadsPerWarp) const { + void decomposeMmaToDotOperand(ModuleOp mod, int numWarps, int threadsPerWarp, + int numCTAs) const { // Replace `mma -> dot_op` with `mma -> blocked -> dot_op` // unless certain conditions are met mod.walk([&](triton::gpu::ConvertLayoutOp cvtOp) -> void { @@ -487,7 +643,7 @@ class ConvertTritonGPUToLLVM dstType.getShape(), dstType.getElementType(), triton::gpu::BlockedEncodingAttr::get( mod.getContext(), srcType.getShape(), getSizePerThread(srcMma), - getOrder(srcMma), numWarps, threadsPerWarp)); + getOrder(srcMma), numWarps, threadsPerWarp, numCTAs)); auto tmp = builder.create( cvtOp.getLoc(), tmpType, cvtOp.getOperand()); auto newConvert = builder.create( @@ -514,7 +670,8 @@ class ConvertTritonGPUToLLVM dstType.getShape(), dstType.getElementType(), triton::gpu::SharedEncodingAttr::get( mod.getContext(), dstDotOp, srcType.getShape(), - getOrder(srcBlocked), srcType.getElementType())); + srcBlocked.getOrder(), srcBlocked.getCTALayout(), + srcType.getElementType())); auto tmp = builder.create( cvtOp.getLoc(), tmpType, cvtOp.getOperand()); auto newConvert = builder.create( @@ -632,6 +789,52 @@ class ConvertTritonGPUToLLVM } }); } + + static Value promoteOperand(OpBuilder &builder, Location loc, Value operand, + Type promotedType) { + Type tensorPromotedType = + operand.getType().cast().cloneWith(std::nullopt, + promotedType); + return builder.create(loc, tensorPromotedType, operand); + } + + // promote operands of dot op if the existing combination is not natively + // supported. + void decomposeMixedModeDotOp(ModuleOp mod) const { + mod.walk([](triton::DotOp dotOp) -> void { + Value D = dotOp.getResult(); + OpBuilder builder(dotOp); + Type AElType = + dotOp.getA().getType().cast().getElementType(); + Type promoteType; + MmaEncodingAttr mmaLayout = D.getType() + .cast() + .getEncoding() + .dyn_cast(); + if (mmaLayout) { + bool isNativeHopperFP8 = + AElType.isFloat8E5M2() || AElType.isFloat8E4M3FN(); + bool isFP8 = isNativeHopperFP8 || AElType.isFloat8E5M2FNUZ() || + AElType.isFloat8E4M3FNUZ(); + if (!isFP8 || (isNativeHopperFP8 && mmaLayout.isHopper())) + return; + promoteType = builder.getF16Type(); + } else { + // FMA case. + Type AElType = + dotOp.getA().getType().cast().getElementType(); + Type DElType = D.getType().cast().getElementType(); + if (AElType == DElType) + return; + promoteType = DElType; + } + Location loc = dotOp.getLoc(); + Value promotedA = promoteOperand(builder, loc, dotOp.getA(), promoteType); + Value promotedB = promoteOperand(builder, loc, dotOp.getB(), promoteType); + dotOp.setOperand(0, promotedA); + dotOp.setOperand(1, promotedB); + }); + } }; } // anonymous namespace @@ -640,8 +843,11 @@ namespace mlir { namespace triton { std::unique_ptr> -createConvertTritonGPUToLLVMPass(int computeCapability, bool isROCM) { - return std::make_unique<::ConvertTritonGPUToLLVM>(computeCapability, isROCM); +createConvertTritonGPUToLLVMPass(int computeCapability, + mlir::triton::gpu::TMAMetadataTy *tmaMetadata, + bool isROCM) { + return std::make_unique<::ConvertTritonGPUToLLVM>(computeCapability, + tmaMetadata, isROCM); } } // namespace triton diff --git a/lib/Conversion/TritonGPUToLLVM/TypeConverter.cpp b/lib/Conversion/TritonGPUToLLVM/TypeConverter.cpp index 9c5f99a0a60c..1a1daca03acb 100644 --- a/lib/Conversion/TritonGPUToLLVM/TypeConverter.cpp +++ b/lib/Conversion/TritonGPUToLLVM/TypeConverter.cpp @@ -41,7 +41,27 @@ TritonGPUToLLVMTypeConverter::TritonGPUToLLVMTypeConverter( Type TritonGPUToLLVMTypeConverter::convertTritonPointerType( triton::PointerType type) { - // Recursively translate pointee type + auto ctx = type.getContext(); + auto pointeeType = type.getPointeeType(); + if (pointeeType.isa()) { + auto rankedTensorType = pointeeType.cast(); + // struct { offset0, offset1, shape0, shape1, stride0, + // stride1, base_ptr}; + auto eleType = rankedTensorType.getElementType(); + auto shape = rankedTensorType.getShape(); + SmallVector types; + // offsets + for (size_t i = 0; i < shape.size(); ++i) + types.push_back(IntegerType::get(ctx, 32)); + // shapes, strides + for (size_t i = 0; i < 2 * shape.size(); ++i) + types.push_back(IntegerType::get(ctx, 64)); + + types.push_back( + LLVM::LLVMPointerType::get(eleType, type.getAddressSpace())); + + return LLVM::LLVMStructType::getLiteral(ctx, types); + } return LLVM::LLVMPointerType::get(convertType(type.getPointeeType()), type.getAddressSpace()); } diff --git a/lib/Conversion/TritonGPUToLLVM/Utility.cpp b/lib/Conversion/TritonGPUToLLVM/Utility.cpp index d177e2e80c62..4f68551ec15f 100644 --- a/lib/Conversion/TritonGPUToLLVM/Utility.cpp +++ b/lib/Conversion/TritonGPUToLLVM/Utility.cpp @@ -6,19 +6,19 @@ namespace mlir { namespace LLVM { using namespace mlir::triton; -Value createConstantI32(Location loc, PatternRewriter &rewriter, int32_t v) { +Value createConstantI32(Location loc, OpBuilder &rewriter, int32_t v) { auto i32ty = rewriter.getIntegerType(32); return rewriter.create(loc, i32ty, IntegerAttr::get(i32ty, v)); } -Value createConstantF32(Location loc, PatternRewriter &rewriter, float v) { +Value createConstantF32(Location loc, OpBuilder &rewriter, float v) { auto type = type::f32Ty(rewriter.getContext()); return rewriter.create(loc, type, rewriter.getF32FloatAttr(v)); } -Value createConstantF64(Location loc, PatternRewriter &rewriter, float v) { +Value createConstantF64(Location loc, OpBuilder &rewriter, float v) { auto type = type::f64Ty(rewriter.getContext()); return rewriter.create(loc, type, rewriter.getF64FloatAttr(v)); @@ -40,6 +40,96 @@ Value createLLVMIntegerConstant(OpBuilder &builder, Location loc, short width, builder.getIntegerAttr(ty, value)); } +// A wrapper of LoadDSmemOp when vec = 1 +// (1) Get bitwidth from elemTy +// (2) Create LoadDSmemOp +// (3) Bitcast result from dataTy (u16/u32/u64) back to elemTy +Value createLoadDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId) { + assert(addr.getType().isa() && + "addr must be a pointer type"); + auto ptrTy = addr.getType().cast(); + assert(ptrTy.getAddressSpace() == 3 && "Invalid addr space for load_dsmem"); + auto elemTy = ptrTy.getElementType(); + unsigned bitwidth = elemTy.getIntOrFloatBitWidth(); + Value ret = + rewriter.create(loc, addr, ctaId, bitwidth); + return bitcast(ret, elemTy); +} + +// A wrapper of LoadDSmemOp when vec > 1 +// (1) Get bitwidth from elemTy +// (2) Create LoadDSmemOp and extract results from retStruct +// (3) Bitcast results from dataTy (u16/u32/u64) back to elemTy +SmallVector createLoadDSmem(Location loc, PatternRewriter &rewriter, + Value addr, Value ctaId, unsigned vec) { + assert(addr.getType().isa() && + "addr must be a pointer type"); + auto ptrTy = addr.getType().cast(); + assert(ptrTy.getAddressSpace() == 3 && "Invalid addr space for load_dsmem"); + auto elemTy = ptrTy.getElementType(); + unsigned bitwidth = elemTy.getIntOrFloatBitWidth(); + Value retStruct = rewriter.create( + loc, addr, ctaId, bitwidth, vec); + SmallVector retVals; + for (unsigned i = 0; i < vec; ++i) { + auto dataTy = rewriter.getIntegerType(bitwidth); + Value data = extract_val(dataTy, retStruct, i); + retVals.push_back(bitcast(data, elemTy)); + } + return retVals; +} + +// A wrapper of StoreDSmemOp when vec = 1 +// (1) Get bitwidth from elemTy +// (2) Bitcast value from elemTy to dataTy (u16/u32/u64) +// (3) Create StoreDSmemOp +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, Value value, Value pred) { + assert(addr.getType().isa() && + "addr must be a pointer type"); + auto ptrTy = addr.getType().cast(); + assert(ptrTy.getAddressSpace() == 3 && "Invalid addr space for load_dsmem"); + auto elemTy = ptrTy.getElementType(); + unsigned bitwidth = elemTy.getIntOrFloatBitWidth(); + auto dataTy = rewriter.getIntegerType(bitwidth); + Value data = bitcast(value, dataTy); + rewriter.create(loc, addr, ctaId, data, pred); +} + +// A wrapper of StoreDSmemOp when vec = 1 and pred = 1 +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, Value value) { + Value pred = int_val(/*width=*/1, 1); + createStoreDSmem(loc, rewriter, addr, ctaId, value, pred); +} + +// A wrapper of StoreDSmemOp when vec > 1 +// (1) Get bitwidth from elemTy +// (2) Bitcast values from elemTy to dataTy (u16/u32/u64) +// (3) Create StoreDSmemOp +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, ArrayRef values, Value pred) { + assert(addr.getType().isa() && + "addr must be a pointer type"); + auto ptrTy = addr.getType().cast(); + assert(ptrTy.getAddressSpace() == 3 && "Invalid addr space for load_dsmem"); + auto elemTy = ptrTy.getElementType(); + unsigned bitwidth = elemTy.getIntOrFloatBitWidth(); + auto dataTy = rewriter.getIntegerType(bitwidth); + SmallVector data; + for (unsigned i = 0; i < values.size(); ++i) + data.push_back(bitcast(values[i], dataTy)); + rewriter.create(loc, addr, ctaId, data, pred); +} + +// A wrapper of StoreDSmemOp when vec > 1 and pred = 1 +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, ArrayRef values) { + Value pred = int_val(/*width=*/1, 1); + createStoreDSmem(loc, rewriter, addr, ctaId, values, pred); +} + SharedMemoryObject getSharedMemoryObjectFromStruct(Location loc, Value llvmStruct, ConversionPatternRewriter &rewriter) { diff --git a/lib/Conversion/TritonGPUToLLVM/Utility.h b/lib/Conversion/TritonGPUToLLVM/Utility.h index 9d8834189e33..20fb113d289d 100644 --- a/lib/Conversion/TritonGPUToLLVM/Utility.h +++ b/lib/Conversion/TritonGPUToLLVM/Utility.h @@ -14,6 +14,7 @@ #define zext(...) rewriter.create(loc, __VA_ARGS__) #define sext(...) rewriter.create(loc, __VA_ARGS__) #define fpext(...) rewriter.create(loc, __VA_ARGS__) +#define trunc(...) rewriter.create(loc, __VA_ARGS__) #define udiv(...) rewriter.create(loc, __VA_ARGS__) #define urem(...) rewriter.create(loc, __VA_ARGS__) #define add(...) rewriter.create(loc, __VA_ARGS__) @@ -43,6 +44,8 @@ rewriter.create(loc, __VA_ARGS__) #define load(...) rewriter.create(loc, __VA_ARGS__) #define store(val, ptr) rewriter.create(loc, val, ptr) +#define load_dsmem(...) LLVM::createLoadDSmem(loc, rewriter, __VA_ARGS__) +#define store_dsmem(...) LLVM::createStoreDSmem(loc, rewriter, __VA_ARGS__) #define fcmp_ogt(lhs, rhs) \ rewriter.create(loc, rewriter.getI1Type(), \ LLVM::FCmpPredicate::ogt, lhs, rhs) @@ -75,6 +78,15 @@ #define select(...) rewriter.create(loc, __VA_ARGS__) #define address_of(...) rewriter.create(loc, __VA_ARGS__) #define barrier() rewriter.create(loc) +#define barSync(rewriter, op, bar, numThreads) \ + do { \ + ::mlir::triton::PTXBuilder ptxBuilder; \ + auto &barSyncOp = *ptxBuilder.create<>("bar.sync"); \ + barSyncOp(ptxBuilder.newConstantOperand(bar), \ + ptxBuilder.newConstantOperand(numThreads)); \ + auto voidTy = void_ty(op->getContext()); \ + ptxBuilder.launch(rewriter, op->getLoc(), voidTy); \ + } while (0) #define undef(...) rewriter.create(loc, __VA_ARGS__) #define null(...) rewriter.create(loc, __VA_ARGS__) #define call(...) rewriter.create(loc, __VA_ARGS__) @@ -84,6 +96,8 @@ #define i64_ty rewriter.getIntegerType(64) #define i32_ty rewriter.getIntegerType(32) #define i16_ty rewriter.getIntegerType(16) +#define i32_ty rewriter.getIntegerType(32) +#define i64_ty rewriter.getIntegerType(64) #define ui32_ty rewriter.getIntegerType(32, false) #define f16_ty rewriter.getF16Type() #define bf16_ty rewriter.getBF16Type() @@ -174,13 +188,13 @@ T getLinearIndex(llvm::ArrayRef multiDimIndex, llvm::ArrayRef shape, namespace LLVM { using namespace mlir::triton; -Value createConstantI32(Location loc, PatternRewriter &rewriter, int32_t v); +Value createConstantI32(Location loc, OpBuilder &rewriter, int32_t v); /// Create a 32-bit float constant. -Value createConstantF32(Location loc, PatternRewriter &rewriter, float v); +Value createConstantF32(Location loc, OpBuilder &rewriter, float v); /// Create a 64-bit float constant. -Value createConstantF64(Location loc, PatternRewriter &rewriter, float v); +Value createConstantF64(Location loc, OpBuilder &rewriter, float v); /// Create an index type constant. Value createIndexConstant(OpBuilder &builder, Location loc, @@ -190,6 +204,28 @@ Value createIndexConstant(OpBuilder &builder, Location loc, Value createLLVMIntegerConstant(OpBuilder &builder, Location loc, short width, int64_t value); +/// Usage of macro load_dsmem +/// (1) load_dsmem(addr, ctaId) +/// (2) load_dsmem(addr, ctaId, vec) +Value createLoadDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId); +SmallVector createLoadDSmem(Location loc, PatternRewriter &rewriter, + Value addr, Value ctaId, unsigned vec); + +/// Usage of macro store_dsmem +/// (1) store_dsmem(addr, ctaId, value, pred) +/// (2) store_dsmem(addr, ctaId, value) +/// (3) store_dsmem(addr, ctaId, values, pred) +/// (4) store_dsmem(addr, ctaId, values) +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, Value value, Value pred); +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, Value value); +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, ArrayRef values, Value pred); +void createStoreDSmem(Location loc, PatternRewriter &rewriter, Value addr, + Value ctaId, ArrayRef values); + /// Helper function to get strides from a given shape and its order SmallVector getStridesFromShapeAndOrder(ArrayRef shape, ArrayRef order, diff --git a/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.cpp index 553fd22bf1df..fdd47f2de196 100644 --- a/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.cpp @@ -104,6 +104,7 @@ struct CatOpConversion : public ConvertTritonGPUOpToLLVMPattern { using OpAdaptor = typename CatOp::Adaptor; explicit CatOpConversion(TritonGPUToLLVMTypeConverter &typeConverter, + PatternBenefit benefit = 1) : ConvertTritonGPUOpToLLVMPattern(typeConverter, benefit) {} @@ -138,6 +139,7 @@ struct CatOpConversion : public ConvertTritonGPUOpToLLVMPattern { struct ViewOpConversion : public ConvertTritonGPUOpToLLVMPattern { using OpAdaptor = typename ViewOp::Adaptor; explicit ViewOpConversion(TritonGPUToLLVMTypeConverter &typeConverter, + PatternBenefit benefit = 1) : ConvertTritonGPUOpToLLVMPattern(typeConverter, benefit) {} @@ -159,6 +161,7 @@ struct ExpandDimsOpConversion : public ConvertTritonGPUOpToLLVMPattern { using OpAdaptor = typename ExpandDimsOp::Adaptor; explicit ExpandDimsOpConversion(TritonGPUToLLVMTypeConverter &typeConverter, + PatternBenefit benefit = 1) : ConvertTritonGPUOpToLLVMPattern(typeConverter, benefit) {} @@ -221,7 +224,9 @@ struct TransOpConversion }; void populateViewOpToLLVMPatterns(TritonGPUToLLVMTypeConverter &typeConverter, - RewritePatternSet &patterns, + RewritePatternSet &patterns, int numWarps, + ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit) { patterns.add(typeConverter, benefit); patterns.add(typeConverter, benefit); diff --git a/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.h b/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.h index 1a8aef39148f..431e8efece40 100644 --- a/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.h +++ b/lib/Conversion/TritonGPUToLLVM/ViewOpToLLVM.h @@ -7,7 +7,9 @@ using namespace mlir; using namespace mlir::triton; void populateViewOpToLLVMPatterns(TritonGPUToLLVMTypeConverter &typeConverter, - RewritePatternSet &patterns, + RewritePatternSet &patterns, int numWarps, + ModuleAxisInfoAnalysis &axisInfoAnalysis, + ModuleAllocation &allocation, PatternBenefit benefit); #endif diff --git a/lib/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.cpp b/lib/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.cpp index f150ed422796..deff7bd71d94 100644 --- a/lib/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.cpp +++ b/lib/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.cpp @@ -10,6 +10,7 @@ #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include "triton/Dialect/TritonGPU/Transforms/TritonGPUConversion.h" +#include "triton/Target/PTX/TmaMetadata.h" #include "llvm/ADT/APSInt.h" #include @@ -240,10 +241,19 @@ struct TritonExpandDimsPattern retWarpsPerCTA.insert(retWarpsPerCTA.begin() + op.getAxis(), 1); SmallVector retOrder(retShape.size()); std::iota(retOrder.begin(), retOrder.end(), 0); + + auto argCTALayout = argEncoding.getCTALayout(); + auto retCTAsPerCGA = insertOne(argCTALayout.getCTAsPerCGA(), op.getAxis()); + auto retCTASplitNum = + insertOne(argCTALayout.getCTASplitNum(), op.getAxis()); + auto retCTAOrder = insertOrder(argCTALayout.getCTAOrder(), op.getAxis()); + auto retCTALayout = triton::gpu::CTALayoutAttr::get( + getContext(), retCTAsPerCGA, retCTASplitNum, retCTAOrder); + triton::gpu::BlockedEncodingAttr retEncoding = triton::gpu::BlockedEncodingAttr::get(getContext(), retSizePerThread, retThreadsPerWarp, retWarpsPerCTA, - retOrder); + retOrder, retCTALayout); // convert operand to slice of return type Attribute newArgEncoding = triton::gpu::SliceEncodingAttr::get( getContext(), op.getAxis(), retEncoding); @@ -257,6 +267,26 @@ struct TritonExpandDimsPattern adaptor.getAttributes()); return success(); } + +private: + template + SmallVector insertOne(ArrayRef vec, unsigned axis) const { + SmallVector res(vec.begin(), vec.end()); + res.insert(res.begin() + axis, 1); + return res; + } + + // Example: order = [ 0, 2, 1, 3], dim = 2 + // resOrder = [2, 0, 3, 1, 4] + SmallVector insertOrder(ArrayRef order, + unsigned axis) const { + SmallVector resOrder(order.begin(), order.end()); + for (unsigned i = 0; i < resOrder.size(); ++i) + if (resOrder[i] >= axis) + ++resOrder[i]; + resOrder.insert(resOrder.begin(), axis); + return resOrder; + } }; struct TritonDotPattern : public OpConversionPattern { @@ -270,6 +300,7 @@ struct TritonDotPattern : public OpConversionPattern { auto typeConverter = getTypeConverter(); int numWarps = typeConverter->getNumWarps(); int threadsPerWarp = typeConverter->getThreadsPerWarp(); + int numCTAs = typeConverter->getNumCTAs(); SmallVector retSizePerThread = {1, 1}; if (origShape[0] * origShape[1] / (numWarps * threadsPerWarp) >= 4) @@ -279,7 +310,7 @@ struct TritonDotPattern : public OpConversionPattern { SmallVector retOrder = {1, 0}; Attribute dEncoding = triton::gpu::BlockedEncodingAttr::get( getContext(), origShape, retSizePerThread, retOrder, numWarps, - threadsPerWarp); + threadsPerWarp, numCTAs); RankedTensorType retType = RankedTensorType::get(origShape, origType.getElementType(), dEncoding); // a & b must be of smem layout @@ -354,9 +385,9 @@ struct TritonCatPattern : public OpConversionPattern { newRetSizePerThread[retOrder[0]] *= newRetTotalElemsPerThread / retTotalElemsPerThread; triton::gpu::BlockedEncodingAttr newRetEncoding = - triton::gpu::BlockedEncodingAttr::get(getContext(), newRetSizePerThread, - retThreadsPerWarp, retWarpsPerCTA, - retOrder); + triton::gpu::BlockedEncodingAttr::get( + getContext(), newRetSizePerThread, retThreadsPerWarp, + retWarpsPerCTA, retOrder, retEncoding.getCTALayout()); auto newRetType = RankedTensorType::get(retShape, retType.getElementType(), newRetEncoding); addNamedAttrs(rewriter.replaceOpWithNewOp( @@ -386,8 +417,12 @@ struct TritonTransPattern : public OpConversionPattern { if (auto srcBlockedEncoding = srcEncoding.dyn_cast()) llvm::copy(srcBlockedEncoding.getOrder(), order.begin()); - srcEncoding = - triton::gpu::SharedEncodingAttr::get(getContext(), 1, 1, 1, order); + // TODO(Qingyi): need to check whether the CTALayout of srcEncoding should + // be used here. For tests where numCTAs = 1, this is not a problem since + // all CTALayouts are the same. + auto CTALayout = triton::gpu::getCTALayout(srcEncoding); + srcEncoding = triton::gpu::SharedEncodingAttr::get(getContext(), 1, 1, 1, + order, CTALayout); srcType = RankedTensorType::get(srcType.getShape(), srcType.getElementType(), srcEncoding); src = rewriter.create(src.getLoc(), srcType, @@ -658,10 +693,12 @@ class TritonReturnOpPattern : public OpConversionPattern { }; void populateTritonPatterns(TritonGPUTypeConverter &typeConverter, - RewritePatternSet &patterns) { + RewritePatternSet &patterns, unsigned numCTAs) { MLIRContext *context = patterns.getContext(); patterns .insert< // TODO: view should have custom pattern that views the layout + TritonGenericPattern, + TritonGenericPattern, TritonGenericPattern, TritonGenericPattern, TritonGenericPattern, @@ -889,16 +926,20 @@ class ConvertTritonToTritonGPU public: ConvertTritonToTritonGPU() = default; // constructor with some parameters set explicitly. - ConvertTritonToTritonGPU(int numWarps, int threadsPerWarp) { + ConvertTritonToTritonGPU(int numWarps, int threadsPerWarp, int numCTAs, + int computeCapability) { this->numWarps = numWarps; this->threadsPerWarp = threadsPerWarp; + this->numCTAs = numCTAs; + this->computeCapability = computeCapability; } void runOnOperation() override { MLIRContext *context = &getContext(); ModuleOp mod = getOperation(); // type converter - TritonGPUTypeConverter typeConverter(context, numWarps, threadsPerWarp); + TritonGPUTypeConverter typeConverter(context, numWarps, threadsPerWarp, + numCTAs); TritonGPUConversionTarget target(*context, typeConverter); // rewrite patterns RewritePatternSet patterns(context); @@ -906,7 +947,7 @@ class ConvertTritonToTritonGPU populateStdPatternsAndLegality(typeConverter, patterns, target); populateArithPatternsAndLegality(typeConverter, patterns, target); populateMathPatternsAndLegality(typeConverter, patterns, target); - populateTritonPatterns(typeConverter, patterns); + populateTritonPatterns(typeConverter, patterns, numCTAs); // TODO: can we use // mlir::scf::populateSCFStructurealTypeConversionsAndLegality(...) here? populateSCFPatterns(typeConverter, patterns); @@ -925,6 +966,13 @@ class ConvertTritonToTritonGPU AttrNumThreadsPerWarp, IntegerAttr::get(i32_ty, llvm::APInt(32, threadsPerWarp.getValue()))); + mod->setAttr(AttrNumCTAsName, + IntegerAttr::get(i32_ty, llvm::APInt(32, numCTAs.getValue()))); + + mod->setAttr(AttrComputeCapabilityName, + IntegerAttr::get( + i32_ty, llvm::APInt(32, computeCapability.getValue()))); + // update layouts // broadcast src => multicast, dst => broadcasted // if (failed(target.refineLayouts(mod, numWarps))) @@ -936,8 +984,11 @@ class ConvertTritonToTritonGPU std::unique_ptr> mlir::triton::createConvertTritonToTritonGPUPass(int numWarps, - int threadsPerWarp) { - return std::make_unique<::ConvertTritonToTritonGPU>(numWarps, threadsPerWarp); + int threadsPerWarp, + int numCTAs, + int computeCapability) { + return std::make_unique<::ConvertTritonToTritonGPU>( + numWarps, threadsPerWarp, numCTAs, computeCapability); } std::unique_ptr> diff --git a/lib/Dialect/CMakeLists.txt b/lib/Dialect/CMakeLists.txt index 27cb65ce5101..02d764601056 100644 --- a/lib/Dialect/CMakeLists.txt +++ b/lib/Dialect/CMakeLists.txt @@ -1,2 +1,4 @@ add_subdirectory(Triton) add_subdirectory(TritonGPU) +add_subdirectory(TritonNvidiaGPU) +add_subdirectory(NVGPU) diff --git a/lib/Dialect/NVGPU/CMakeLists.txt b/lib/Dialect/NVGPU/CMakeLists.txt new file mode 100644 index 000000000000..0c9674b7373c --- /dev/null +++ b/lib/Dialect/NVGPU/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(IR) +add_subdirectory(ToLLVMIR) diff --git a/lib/Dialect/NVGPU/IR/CMakeLists.txt b/lib/Dialect/NVGPU/IR/CMakeLists.txt new file mode 100644 index 000000000000..4e9e1ada172c --- /dev/null +++ b/lib/Dialect/NVGPU/IR/CMakeLists.txt @@ -0,0 +1,9 @@ +add_mlir_dialect_library(NVGPUIR + Dialect.cpp + + DEPENDS + NVGPUTableGen + NVGPUAttrDefsIncGen + + LINK_LIBS PUBLIC +) diff --git a/lib/Dialect/NVGPU/IR/Dialect.cpp b/lib/Dialect/NVGPU/IR/Dialect.cpp new file mode 100644 index 000000000000..a3c11f87a62f --- /dev/null +++ b/lib/Dialect/NVGPU/IR/Dialect.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/IR/DialectImplementation.h" +#include "mlir/IR/OpImplementation.h" + +// clang-format off +#include "triton/Dialect/NVGPU/IR/Dialect.h" +#include "triton/Dialect/NVGPU/IR/Dialect.cpp.inc" +// clang-format on + +using namespace mlir; +using namespace mlir::triton::nvgpu; + +void LoadDSmemOp::build(OpBuilder &builder, OperationState &state, + Type resultTy, Value addr, Value ctaId) { + unsigned vec, bitwidth; + if (auto structTy = resultTy.dyn_cast()) { + auto types = structTy.getBody(); + assert(types.size() > 0 && "Invalid result type of LoadDSmemOp"); + vec = types.size(); + for (unsigned i = 0; i < vec; ++i) + assert(types[0] == types[i]); + bitwidth = types[0].getIntOrFloatBitWidth(); + } else { + vec = 1; + bitwidth = resultTy.getIntOrFloatBitWidth(); + } + build(builder, state, resultTy, addr, ctaId, bitwidth, vec); +} + +void LoadDSmemOp::build(OpBuilder &builder, OperationState &state, Value addr, + Value ctaId, unsigned bitwidth, unsigned vec) { + Type resultTy = builder.getIntegerType(bitwidth); + if (vec > 1) { + SmallVector types(vec, resultTy); + resultTy = LLVM::LLVMStructType::getLiteral(builder.getContext(), types); + } + build(builder, state, resultTy, addr, ctaId, bitwidth, vec); +} + +void LoadDSmemOp::build(OpBuilder &builder, OperationState &state, Value addr, + Value ctaId, unsigned bitwidth) { + build(builder, state, addr, ctaId, bitwidth, /*vec*/ 1); +} + +void StoreDSmemOp::build(OpBuilder &builder, OperationState &state, Value addr, + Value ctaId, Value value, Value pred) { + SmallVector values = {value}; + build(builder, state, addr, ctaId, values, pred); +} + +unsigned StoreDSmemOp::getBitwidth() { + auto addrTy = getAddr().getType(); + assert(addrTy.isa() && "addr must be a pointer type"); + auto elemTy = addrTy.cast().getElementType(); + return elemTy.getIntOrFloatBitWidth(); +} + +unsigned StoreDSmemOp::getVec() { return getValues().size(); } + +static LogicalResult verify(mlir::triton::nvgpu::TMALoadTiledOp op) { + return success(); +} + +static LogicalResult verify(mlir::triton::nvgpu::TMALoadIm2colOp op) { + return success(); +} + +static LogicalResult verify(mlir::triton::nvgpu::WGMMAOp op) { + return success(); +} + +void mlir::triton::nvgpu::NVGPUDialect::initialize() { + addAttributes< +#define GET_ATTRDEF_LIST +#include "triton/Dialect/NVGPU/IR/NVGPUAttrDefs.cpp.inc" + >(); + + addOperations< +#define GET_OP_LIST +#include "triton/Dialect/NVGPU/IR/Ops.cpp.inc" + >(); +} + +#define GET_OP_CLASSES +#include "triton/Dialect/NVGPU/IR/Ops.cpp.inc" +#include "triton/Dialect/NVGPU/IR/OpsEnums.cpp.inc" diff --git a/lib/Dialect/NVGPU/ToLLVMIR/CMakeLists.txt b/lib/Dialect/NVGPU/ToLLVMIR/CMakeLists.txt new file mode 100644 index 000000000000..84b67abfbafd --- /dev/null +++ b/lib/Dialect/NVGPU/ToLLVMIR/CMakeLists.txt @@ -0,0 +1,17 @@ +add_mlir_translation_library(NVGPUToLLVMIR + NVGPUToLLVMIR.cpp + + DEPENDS + NVGPUTableGen + + LINK_COMPONENTS + Core + + LINK_LIBS PUBLIC + MLIRIR + MLIRLLVMDialect + MLIRNVVMDialect + MLIRSupport + MLIRTargetLLVMIRExport + NVGPUIR + ) diff --git a/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp b/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp new file mode 100644 index 000000000000..9506566859cc --- /dev/null +++ b/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp @@ -0,0 +1,803 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h" +#include "mlir/Dialect/LLVMIR/NVVMDialect.h" +#include "mlir/IR/Operation.h" +#include "mlir/Target/LLVMIR/ModuleTranslation.h" +#include "triton/Dialect/NVGPU/IR/Dialect.h" + +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/IntrinsicsNVPTX.h" + +using namespace mlir; +using namespace mlir::LLVM; + +namespace { +static llvm::FunctionCallee +getExternalFuncOP(llvm::Module *module, llvm::StringRef funcName, + llvm::Type *retTy, ArrayRef argTys = {}) { + return module->getOrInsertFunction( + funcName, llvm::FunctionType::get(retTy, argTys, false), + llvm::AttributeList{}); +} + +llvm::Value *createExternalCall(llvm::IRBuilderBase &builder, + llvm::StringRef funcName, + ArrayRef args = {}, + ArrayRef tys = {}) { + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = module->getFunction(funcName); + + if (func == nullptr) { + llvm::SmallVector argTys; + for (auto *arg : args) { + argTys.push_back(arg->getType()); + } + + llvm::Type *retTy; + if (tys.empty()) + retTy = builder.getVoidTy(); + else + retTy = tys[0]; + + func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + } + + return builder.CreateCall(func, args); +} + +void createMBarrierArrive(llvm::IRBuilderBase &builder, + mlir::triton::nvgpu::MBarriveType arriveType, + llvm::Value *barrier, llvm::Value *pred, + llvm::Value *ctaId, uint32_t txCount) { + auto *module = builder.GetInsertBlock()->getModule(); + + llvm::SmallVector argTys; + argTys.push_back(barrier->getType()); + llvm::Type *retTy = builder.getVoidTy(); + + if (arriveType == mlir::triton::nvgpu::MBarriveType::normal) { + argTys.push_back(pred->getType()); + auto *func = dyn_cast( + getExternalFuncOP(module, "__nv_mbarrier_arrive_normal", retTy, argTys) + .getCallee()); + builder.CreateCall(func, {barrier, pred}); + } else if (arriveType == mlir::triton::nvgpu::MBarriveType::cp_async) { + argTys.push_back(pred->getType()); + auto *func = dyn_cast( + getExternalFuncOP(module, "__nv_mbarrier_arrive_cp_async", retTy, + argTys) + .getCallee()); + builder.CreateCall(func, {barrier, pred}); + } else if (arriveType == mlir::triton::nvgpu::MBarriveType::expect_tx) { + assert(txCount > 0 && "txCount should be valid"); + argTys.push_back(builder.getInt32Ty()); + argTys.push_back(pred->getType()); + + auto *func = dyn_cast( + getExternalFuncOP(module, "__nv_mbarrier_arrive_expect_tx", retTy, + argTys) + .getCallee()); + builder.CreateCall(func, {barrier, builder.getInt32(txCount), pred}); + } else if (arriveType == mlir::triton::nvgpu::MBarriveType::remote) { + assert(ctaId && "ctaId should have a valid value"); + argTys.push_back(ctaId->getType()); + argTys.push_back(pred->getType()); + + auto *func = dyn_cast( + getExternalFuncOP(module, "__nv_mbarrier_arrive_remote", retTy, argTys) + .getCallee()); + builder.CreateCall(func, {barrier, ctaId, pred}); + } + + return; +} + +llvm::Value *createWGMMADesc(llvm::IRBuilderBase &builder, llvm::Value *buffer, + mlir::triton::nvgpu::WGMMADescMode mode, + llvm::Value *height) { + llvm::SmallVector argTys; + argTys.push_back(buffer->getType()); + argTys.push_back(builder.getInt32Ty()); + argTys.push_back(height->getType()); + llvm::Type *retTy = builder.getInt64Ty(); + + llvm::Value *mode_ = builder.getInt32((uint32_t)mode); + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, "__nv_get_wgmma_desc", retTy, argTys) + .getCallee()); + return builder.CreateCall(func, {buffer, mode_, height}); +} + +static std::string getTMALoadFuncName(bool tiled, bool mcast, + uint32_t dimSize) { + std::string funcName; + llvm::raw_string_ostream os(funcName); + os << "__nv_tma_load"; + if (tiled) + os << "_tiled"; + else + os << "_im2col"; + + if (mcast) + os << "_mcast"; + + os << "_" << dimSize << "d"; + + return funcName; +} + +void createTMALoadTiled(llvm::IRBuilderBase &builder, llvm::Value *dst, + llvm::Value *mbarrier, llvm::Value *tmaDesc, + llvm::Value *l2Desc, llvm::Value *mcastMask, + llvm::Value *pred, + llvm::SmallVector coords) { + assert(coords.size() >= 2 && coords.size() <= 5 && "invalid coords.size()"); + auto funcName = getTMALoadFuncName(true, mcastMask != 0, coords.size()); + llvm::Type *retTy = builder.getVoidTy(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(tmaDesc->getType()); + args.push_back(tmaDesc); + + argTys.push_back(dst->getType()); + args.push_back(dst); + + argTys.push_back(mbarrier->getType()); + args.push_back(mbarrier); + for (auto *c : coords) { + argTys.push_back(c->getType()); + args.push_back(c); + } + argTys.push_back(l2Desc->getType()); + args.push_back(l2Desc); + + if (mcastMask != nullptr) { + argTys.push_back(builder.getInt16Ty()); + args.push_back(mcastMask); + } + + argTys.push_back(pred->getType()); + args.push_back(pred); + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + builder.CreateCall(func, args); + + return; +} + +void createTMALoadIm2col(llvm::IRBuilderBase &builder, llvm::Value *dst, + llvm::Value *mbarrier, llvm::Value *tmaDesc, + llvm::Value *l2Desc, uint16_t mcastMask, + llvm::Value *im2colOffsets, llvm::Value *pred, + llvm::SmallVector coords) { + assert(coords.size() >= 3 && coords.size() <= 5 && + "invalid coords.size() for im2col"); + auto funcName = getTMALoadFuncName(false, mcastMask != 0, coords.size()); + llvm::Type *retTy = builder.getVoidTy(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(tmaDesc->getType()); + args.push_back(tmaDesc); + + argTys.push_back(dst->getType()); + args.push_back(dst); + + argTys.push_back(mbarrier->getType()); + args.push_back(mbarrier); + for (auto *c : coords) { + argTys.push_back(c->getType()); + args.push_back(c); + } + + { + auto offsetsType = dyn_cast(im2colOffsets->getType()); + auto subTypes = offsetsType->elements(); + assert((coords.size() - subTypes.size() == 2) && "wrong imcolOffsets"); + unsigned idx = 0; + for (auto subType : subTypes) { + argTys.push_back(subType); + args.push_back(builder.CreateExtractValue(im2colOffsets, {idx})); + idx++; + } + } + + argTys.push_back(l2Desc->getType()); + args.push_back(l2Desc); + + if (mcastMask != 0) { + argTys.push_back(builder.getInt16Ty()); + llvm::Value *mcastMask_ = builder.getInt16(mcastMask); + args.push_back(mcastMask_); + } + + argTys.push_back(pred->getType()); + args.push_back(pred); + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + builder.CreateCall(func, args); + + return; +} + +llvm::Value *createWGMMA(llvm::IRBuilderBase &builder, uint32_t m, uint32_t n, + uint32_t k, mlir::triton::nvgpu::WGMMAEltType eltTypeC, + mlir::triton::nvgpu::WGMMAEltType eltTypeA, + mlir::triton::nvgpu::WGMMAEltType eltTypeB, + mlir::triton::nvgpu::WGMMALayout layoutA, + mlir::triton::nvgpu::WGMMALayout layoutB, + llvm::Value *opA, llvm::Value *opB, llvm::Value *opC) { + // Simplify enum namespace + using namespace mlir::triton::nvgpu; + + // Register checks + auto typeA = opA->getType(); + auto typeB = opB->getType(); + auto typeC = opC->getType(); + auto structTypeA = dyn_cast(typeA); + auto structTypeB = dyn_cast(typeB); + auto structTypeC = dyn_cast(typeC); + assert(!structTypeB && "Operand B can not be registers"); + assert(structTypeC && "Operand C must be registers"); + + // Element type, MNK shape and transposing support check + // Reference: + // https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#asynchronous-warpgroup-level-matrix-instructions-wgmma-mma + bool transA = layoutA == WGMMALayout::col; + bool transB = layoutB == WGMMALayout::row; + bool supported = false, needTransArgs = false, floatTypeWGMMA = false; + assert(m % 8 == 0 && n % 8 == 0 && k % 8 == 0); + // Below instructions do support transposing, must pass `trans` arguments + supported |= + (eltTypeA == WGMMAEltType::f16) && (eltTypeB == WGMMAEltType::f16) && + (eltTypeC == WGMMAEltType::f16 || eltTypeC == WGMMAEltType::f32) && + (m == 64 && 8 <= n && n <= 256 && k == 16); + supported |= (eltTypeA == WGMMAEltType::bf16) && + (eltTypeB == WGMMAEltType::bf16) && + (eltTypeC == WGMMAEltType::f32) && + (m == 64 && 8 <= n && n <= 256 && k == 16); + needTransArgs = supported; + floatTypeWGMMA = supported; + // Below instructions do not support transposing + if (!supported && !transA && !transB) { + supported |= (eltTypeA == WGMMAEltType::tf32) && + (eltTypeB == WGMMAEltType::tf32) && + (eltTypeC == WGMMAEltType::f32) && + (m == 64 && 8 <= n && n <= 256 && k == 8); + supported |= + (eltTypeA == WGMMAEltType::e4m3 || eltTypeA == WGMMAEltType::e5m2) && + (eltTypeB == WGMMAEltType::e4m3 || eltTypeB == WGMMAEltType::e5m2) && + (eltTypeC == WGMMAEltType::f16 || eltTypeC == WGMMAEltType::f32) && + (m == 64 && 8 <= n && n <= 256 && k == 32); + floatTypeWGMMA = supported; + // Below instructions are integer-based + supported |= (eltTypeA == WGMMAEltType::s8) && + (eltTypeB == WGMMAEltType::s8) && + (eltTypeC == WGMMAEltType::s32) && + (m == 64 && 8 <= n && n <= 224 && k == 32); + } + assert(supported && "WGMMA type or shape is not supported"); + + // Build PTX asm + std::string ptxAsm; + std::string constraints; + llvm::raw_string_ostream asmOs(ptxAsm); + llvm::raw_string_ostream conOs(constraints); + llvm::SmallVector argTypes; + llvm::SmallVector args; + + // MMA instruction + asmOs << "wgmma.mma_async.sync.aligned" + << ".m" << m << "n" << n << "k" << k << "." << stringifyEnum(eltTypeC) + << "." << stringifyEnum(eltTypeA) << "." << stringifyEnum(eltTypeB) + << " "; + + // Operands + uint32_t asmOpIdx = 0; + + // Operand C + uint32_t numCRegs = m * n / 128; + assert(numCRegs == structTypeC->getStructNumElements()); + asmOs << "{"; + for (uint32_t i = 0; i < numCRegs; ++i) { + argTypes.push_back(structTypeC->getElementType(i)); + args.push_back(builder.CreateExtractValue(opC, {i})); + asmOs << "$" << asmOpIdx++ << (i == numCRegs - 1 ? "" : ","); + // LLVM does not support `+` semantic, we must repeat the arguments for both + // input and outputs + if (structTypeC->getElementType(0)->isFloatTy()) + conOs << "=f,"; + else + conOs << "=r,"; + } + asmOs << "}, "; + for (uint32_t i = asmOpIdx - numCRegs; i < asmOpIdx; ++i) + conOs << i << ","; + // Note that LLVM will not skip the indexed repeating placeholders + asmOpIdx += numCRegs; + + // Operand A + if (structTypeA) { + uint32_t numARegs = m * k / 128; + assert(numARegs == structTypeA->getNumElements()); + asmOs << "{"; + for (uint32_t i = 0; i < numARegs; ++i) { + argTypes.push_back(structTypeA->getElementType(i)); + args.push_back(builder.CreateExtractValue(opA, {i})); + asmOs << "$" << asmOpIdx++ << (i == numARegs - 1 ? "" : ","); + conOs << "f,"; + } + asmOs << "}, "; + } else { + argTypes.push_back(typeA); + args.push_back(opA); + asmOs << "$" << asmOpIdx++ << ", "; + conOs << "l,"; + } + + // Operand B (must be `desc`) + argTypes.push_back(typeB); + args.push_back(opB); + asmOs << "$" << asmOpIdx++ << ", "; + conOs << "l"; + + // `scale-d` is 1 by default + asmOs << "1"; + + // `imm-scale-a`, and `imm-scale-b` are 1 by default only for float-based + // WGMMA + if (floatTypeWGMMA) + asmOs << ", 1, 1"; + + // Push `trans-a` and `trans-b` args if needed (determined as constant) + if (needTransArgs) + asmOs << ", " << transA << ", " << transB; + asmOs << ";"; + + // Finally build `llvm::InlineAsm` and call it + auto inlineAsm = llvm::InlineAsm::get( + llvm::FunctionType::get(structTypeC, argTypes, false), ptxAsm, + constraints, true); + return builder.CreateCall(inlineAsm, args); +} + +void createWGMMAFence(llvm::IRBuilderBase &builder) { + std::string asmStr = "wgmma.fence.sync.aligned;"; + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getVoidTy(), {}), + asmStr, "", /*hasSideEffect*/ true); + builder.CreateCall(iasm, {}); +} + +void createWGMMACommitGroup(llvm::IRBuilderBase &builder) { + std::string asmStr = "wgmma.commit_group.sync.aligned;"; + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getVoidTy(), {}), + asmStr, "", /*hasSideEffect*/ true); + builder.CreateCall(iasm, {}); +} + +void createWGMMAWaitGroup(llvm::IRBuilderBase &builder, uint32_t pendings) { + std::string asmStr = (llvm::Twine("wgmma.wait_group.sync.aligned ") + + llvm::Twine(pendings) + ";") + .str(); + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getVoidTy(), {}), + asmStr, "", /*hasSideEffect*/ true); + builder.CreateCall(iasm, {}); +} + +llvm::Value *createLoadSharedCluster(llvm::IRBuilderBase &builder, + llvm::Value *addr, llvm::Value *ctaId, + unsigned bitwidth, unsigned vec) { + assert( + (bitwidth == 8 || bitwidth == 16 || bitwidth == 32 || bitwidth == 64) && + "invalid bitwidth"); + assert((vec == 1 || vec == 2 || vec == 4) && "invalid vec size"); + + // PTX string + std::string ptxStr; + llvm::raw_string_ostream asmOs(ptxStr); + unsigned addrArgId = vec, ctaIdArgId = vec + 1; + asmOs << "{\n\t" + << ".reg .u32 remoteAddr;\n\t" + << "mapa.shared::cluster.u32 remoteAddr, $" << addrArgId << ", $" + << ctaIdArgId << ";\n\t"; + asmOs << "ld.shared::cluster"; + if (vec > 1) + asmOs << ".v" << vec; + asmOs << ".u" << bitwidth << " "; + if (vec == 1) + asmOs << "$0"; + else if (vec == 2) + asmOs << "{$0, $1}"; + else + asmOs << "{$0, $1, $2, $3}"; + asmOs << ", [remoteAddr];\n\t" + << "}\n"; + + // Constraints + std::string constraints; + llvm::raw_string_ostream conOs(constraints); + std::string c = bitwidth == 16 ? "h" : (bitwidth == 32 ? "r" : "l"); + for (unsigned i = 0; i < vec; ++i) + conOs << "=" << c << ","; + conOs << "r,r"; + + // Arguments + llvm::SmallVector argTypes; + llvm::SmallVector args; + argTypes.push_back(addr->getType()); + args.push_back(addr); + argTypes.push_back(ctaId->getType()); + args.push_back(ctaId); + + // Return type + llvm::Type *retTy = builder.getIntNTy(bitwidth); + llvm::SmallVector retTys(vec, retTy); + if (vec > 1) + retTy = llvm::StructType::get(builder.getContext(), retTys); + + // Call InlineAsm + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(retTy, argTypes, false), + ptxStr, constraints, /*hasSideEffect*/ false); + return builder.CreateCall(iasm, args); +} + +void createStoreSharedCluster(llvm::IRBuilderBase &builder, llvm::Value *addr, + llvm::Value *ctaId, + llvm::SmallVector values, + llvm::Value *pred, unsigned bitwidth, + unsigned vec) { + assert( + (bitwidth == 8 || bitwidth == 16 || bitwidth == 32 || bitwidth == 64) && + "invalid bitwidth"); + assert((vec == 1 || vec == 2 || vec == 4) && vec == values.size() && + "invalid vec size"); + + // PTX string + std::string ptxStr; + llvm::raw_string_ostream asmOs(ptxStr); + asmOs << "{\n\t" + << ".reg .u32 remoteAddr;\n\t" + << "mapa.shared::cluster.u32 remoteAddr, $0, $1;\n\t" + << ".reg .pred p;\n\t" + << "mov.pred p, $2;\n\t"; + asmOs << "@p st.shared::cluster"; + if (vec > 1) + asmOs << ".v" << vec; + asmOs << ".u" << bitwidth << " [remoteAddr], "; + if (vec == 1) + asmOs << "$3"; + else if (vec == 2) + asmOs << "{$3, $4}"; + else if (vec == 4) + asmOs << "{$3, $4, $5, $6}"; + asmOs << ";\n\t" + << "}\n"; + + // Constraints + std::string constraints; + llvm::raw_string_ostream conOs(constraints); + std::string c = bitwidth == 16 ? "h" : (bitwidth == 32 ? "r" : "l"); + conOs << "r,r,b"; + for (unsigned i = 0; i < vec; ++i) + conOs << "," << c; + + // Arguments + llvm::SmallVector argTypes; + llvm::SmallVector args; + argTypes.push_back(addr->getType()); + args.push_back(addr); + argTypes.push_back(ctaId->getType()); + args.push_back(ctaId); + argTypes.push_back(pred->getType()); + args.push_back(pred); + for (llvm::Value *value : values) { + argTypes.push_back(value->getType()); + args.push_back(value); + } + + // Call InlineAsm + llvm::InlineAsm *iasm = llvm::InlineAsm::get( + llvm::FunctionType::get(builder.getVoidTy(), argTypes, false), ptxStr, + constraints, /*hasSideEffect*/ true); + builder.CreateCall(iasm, args); +} + +static std::string getTMAStoreFuncName(bool tiled, uint32_t dimSize) { + std::string funcName; + llvm::raw_string_ostream os(funcName); + os << "__nv_tma_store"; + if (tiled) + os << "_tiled"; + else + os << "_im2col"; + + os << "_" << dimSize << "d"; + + return funcName; +} + +void createTMAStoreTiled(llvm::IRBuilderBase &builder, llvm::Value *tmaDesc, + llvm::Value *src, llvm::Value *pred, + llvm::SmallVector coords) { + assert(coords.size() >= 2 && coords.size() <= 5 && "invalid coords.size()"); + auto funcName = getTMAStoreFuncName(true, coords.size()); + llvm::Type *retTy = builder.getVoidTy(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(tmaDesc->getType()); + args.push_back(tmaDesc); + + argTys.push_back(src->getType()); + args.push_back(src); + + for (auto *c : coords) { + argTys.push_back(c->getType()); + args.push_back(c); + } + argTys.push_back(pred->getType()); + args.push_back(pred); + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + builder.CreateCall(func, args); + + return; +} + +void createStoreMatrix(llvm::IRBuilderBase &builder, llvm::Value *addr, + llvm::SmallVector datas) { + auto size = datas.size(); + assert((size == 1 || size == 2 || size == 4) && + "not support size with stmatrix"); + + std::string funcName; + llvm::raw_string_ostream os(funcName); + os << "__nv_stmatrix_x" << size; + + llvm::Type *retTy = builder.getVoidTy(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(addr->getType()); + args.push_back(addr); + + for (size_t i = 0; i < datas.size(); ++i) { + argTys.push_back(datas[i]->getType()); + args.push_back(datas[i]); + } + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + builder.CreateCall(func, args); +} + +llvm::Value *createOffsetOfStmatrixV4(llvm::IRBuilderBase &builder, + llvm::Value *threadId, + llvm::Value *rowOfWarp, + llvm::Value *elemIdx, + uint32_t leadingDimOffset, + uint32_t rowStride, bool swizzleEnabled) { + if (swizzleEnabled) { + assert((rowStride == 16 || rowStride == 32 || rowStride == 64) && + "wrong rowString for swizzleEnabled"); + } + llvm::Type *retTy = builder.getInt32Ty(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(threadId->getType()); + args.push_back(threadId); + + argTys.push_back(rowOfWarp->getType()); + args.push_back(rowOfWarp); + + argTys.push_back(elemIdx->getType()); + args.push_back(elemIdx); + + argTys.push_back(builder.getInt32Ty()); + args.push_back(builder.getInt32(leadingDimOffset)); + + argTys.push_back(builder.getInt32Ty()); + args.push_back(builder.getInt32(rowStride)); + + std::string funcName("__nv_offset_of_stmatrix_v4"); + if (!swizzleEnabled) + funcName = "__nv_offset_of_stmatrix_v4_no_swizzle"; + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + return builder.CreateCall(func, args); +} + +llvm::Value *createOffsetOfSts64(llvm::IRBuilderBase &builder, + llvm::Value *threadId, llvm::Value *rowOfWarp, + llvm::Value *elemIdx, + uint32_t leadingDimOffset, uint32_t rowStride, + bool swizzleEnabled) { + if (swizzleEnabled) { + assert((rowStride == 32 || rowStride == 64 || rowStride == 128) && + "wrong rowString for swizzleEnabled"); + } + llvm::Type *retTy = builder.getInt32Ty(); + llvm::SmallVector args; + llvm::SmallVector argTys; + + argTys.push_back(threadId->getType()); + args.push_back(threadId); + + argTys.push_back(rowOfWarp->getType()); + args.push_back(rowOfWarp); + + argTys.push_back(elemIdx->getType()); + args.push_back(elemIdx); + + argTys.push_back(builder.getInt32Ty()); + args.push_back(builder.getInt32(leadingDimOffset)); + + argTys.push_back(builder.getInt32Ty()); + args.push_back(builder.getInt32(rowStride)); + + std::string funcName("__nv_offset_of_sts64"); + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + return builder.CreateCall(func, args); +} + +void createSts64(llvm::IRBuilderBase &builder, llvm::Value *offset, + llvm::Value *d0, llvm::Value *d1) { + std::string funcName("__nv_sts64"); + + llvm::Type *retTy = builder.getVoidTy(); + llvm::SmallVector args; + llvm::SmallVector argTys; + auto i32Ty = builder.getInt32Ty(); + argTys.push_back(i32Ty); + args.push_back(offset); + + argTys.push_back(i32Ty); + args.push_back(builder.CreateBitCast(d0, i32Ty)); + + argTys.push_back(i32Ty); + args.push_back(builder.CreateBitCast(d1, i32Ty)); + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + builder.CreateCall(func, args); + + return; +} + +llvm::Value *createCvtPack(llvm::IRBuilderBase &builder, llvm::Value *d0, + llvm::Value *d1) { + std::string funcName("__nv_cvt_pack"); + + llvm::Type *retTy = builder.getInt32Ty(); + llvm::SmallVector args; + llvm::SmallVector argTys; + auto i16Ty = builder.getInt16Ty(); + + argTys.push_back(i16Ty); + args.push_back(builder.CreateBitCast(d0, i16Ty)); + argTys.push_back(i16Ty); + args.push_back(builder.CreateBitCast(d1, i16Ty)); + + auto *module = builder.GetInsertBlock()->getModule(); + auto *func = dyn_cast( + getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); + return builder.CreateCall(func, args); +} + +static llvm::Value *getSRegValue(llvm::IRBuilderBase &builder, + llvm::StringRef name) { + std::string ptxStr; + llvm::raw_string_ostream asmOs(ptxStr); + asmOs << "mov.u32 $0, " << name << ";"; + std::string constraints = "=r"; + llvm::InlineAsm *inlineAsm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getInt32Ty(), false), + ptxStr, constraints, /*hasSideEffect*/ false); + return builder.CreateCall(inlineAsm); +} + +static llvm::Value *createClusterId(llvm::IRBuilderBase &builder) { + llvm::Value *x = getSRegValue(builder, "%cluster_ctaid.x"); + llvm::Value *y = getSRegValue(builder, "%cluster_ctaid.y"); + llvm::Value *z = getSRegValue(builder, "%cluster_ctaid.z"); + llvm::Value *nx = getSRegValue(builder, "%cluster_nctaid.x"); + llvm::Value *ny = getSRegValue(builder, "%cluster_nctaid.y"); + llvm::Value *clusterCTAId = builder.CreateAdd( + x, builder.CreateMul(builder.CreateAdd(y, builder.CreateMul(z, ny)), nx)); + return clusterCTAId; +} +void createRegAlloc(llvm::IRBuilderBase &builder, const uint32_t regCount) { + std::string ptxStr; + llvm::raw_string_ostream asmOs(ptxStr); + asmOs << "setmaxnreg.inc.sync.aligned.u32 " << regCount << ";\n"; + // Call InlineAsm + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getVoidTy(), {}), + ptxStr, "", /*hasSideEffect*/ true); + builder.CreateCall(iasm, {}); +} + +void createRegDealloc(llvm::IRBuilderBase &builder, const uint32_t regCount) { + std::string ptxStr; + llvm::raw_string_ostream asmOs(ptxStr); + asmOs << "setmaxnreg.dec.sync.aligned.u32 " << regCount << ";\n"; + // Call InlineAsm + llvm::InlineAsm *iasm = + llvm::InlineAsm::get(llvm::FunctionType::get(builder.getVoidTy(), {}), + ptxStr, "", /*hasSideEffect*/ true); + builder.CreateCall(iasm, {}); +} + +class NVGPUDialectLLVMIRTranslationInterface + : public LLVMTranslationDialectInterface { +public: + using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface; + + /// Translates the given operation to LLVM IR using the provided IR builder + /// and saving the state in `moduleTranslation`. + LogicalResult + convertOperation(Operation *op, llvm::IRBuilderBase &builder, + LLVM::ModuleTranslation &moduleTranslation) const final { + Operation &opInst = *op; +#include "triton/Dialect/NVGPU/IR/OpsConversions.inc" + + return failure(); + } +}; +} // namespace + +void mlir::registerNVGPUDialectTranslation(DialectRegistry ®istry) { + registry.insert(); + registry.addExtension( + +[](MLIRContext *ctx, mlir::triton::nvgpu::NVGPUDialect *dialect) { + dialect->addInterfaces(); + }); +} + +void mlir::registerNVGPUDialectTranslation(MLIRContext &context) { + DialectRegistry registry; + registerNVGPUDialectTranslation(registry); + context.appendDialectRegistry(registry); +} diff --git a/lib/Dialect/Triton/IR/Dialect.cpp b/lib/Dialect/Triton/IR/Dialect.cpp index 086279123722..0f234f905178 100644 --- a/lib/Dialect/Triton/IR/Dialect.cpp +++ b/lib/Dialect/Triton/IR/Dialect.cpp @@ -7,6 +7,7 @@ #include "llvm/ADT/TypeSwitch.h" #include "llvm/Support/raw_ostream.h" +#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" #include "mlir/IR/DialectImplementation.h" #include "mlir/Transforms/InliningUtils.h" diff --git a/lib/Dialect/Triton/IR/Traits.cpp b/lib/Dialect/Triton/IR/Traits.cpp index 47893fd2ced1..ecfce4a27fcc 100644 --- a/lib/Dialect/Triton/IR/Traits.cpp +++ b/lib/Dialect/Triton/IR/Traits.cpp @@ -7,15 +7,17 @@ using namespace mlir; static LogicalResult verifySameEncoding(Type typeA, Type typeB, bool allowTensorPointerType) { + // TODO(Keren): the allowTensorPointerType argument is a hack to allow. + // The type checking code is kind of a mess with the current design. auto getEncoding = [=](Type type) -> Attribute { - auto rankedType = type.dyn_cast(); - if (allowTensorPointerType) { - if (auto ptrType = type.dyn_cast()) - rankedType = ptrType.getPointeeType().dyn_cast(); - } else { + Attribute ret; + if (auto tensorType = dyn_cast(type)) { + ret = tensorType.getEncoding(); + } + if (!allowTensorPointerType) { assert(!triton::isTensorPointerType(type)); } - return rankedType ? rankedType.getEncoding() : Attribute(); + return ret; }; auto encodingA = getEncoding(typeA); auto encodingB = getEncoding(typeB); @@ -127,7 +129,16 @@ OpTrait::impl::verifySameLoadStoreOperandsAndResultShape(Operation *op) { bool OpTrait::impl::verifyLoadStorePointerAndValueType(Type valueType, Type ptrType) { if (triton::isTensorPointerType(ptrType)) { - return ptrType.cast().getPointeeType() == valueType; + // The encoding of tensor pointers is meaningless, we only check shapes and + // the type of elements + auto tensorAType = ptrType.cast() + .getPointeeType() + .cast(); + if (!isa(valueType)) + return false; + auto tensorBType = valueType.cast(); + return tensorAType.getShape() == tensorBType.getShape() && + tensorAType.getElementType() == tensorBType.getElementType(); } else if (auto rankedType = ptrType.dyn_cast()) { if (auto elementPtrType = dyn_cast(rankedType.getElementType())) { diff --git a/lib/Dialect/Triton/IR/Types.cpp b/lib/Dialect/Triton/IR/Types.cpp index 104482083a27..aae8d862e3de 100644 --- a/lib/Dialect/Triton/IR/Types.cpp +++ b/lib/Dialect/Triton/IR/Types.cpp @@ -27,15 +27,20 @@ Type PointerType::parse(AsmParser &parser) { if (parser.parseType(pointeeType)) return Type(); + int addressSpace = 1; + if (succeeded(parser.parseOptionalComma())) { + if (parser.parseInteger(addressSpace)) + return Type(); + } + if (parser.parseGreater()) return Type(); - // TODO: also print address space? - return PointerType::get(pointeeType, 1); + return PointerType::get(pointeeType, addressSpace); } void PointerType::print(AsmPrinter &printer) const { - printer << "<" << getPointeeType() << ">"; + printer << "<" << getPointeeType() << ", " << getAddressSpace() << ">"; } namespace mlir { @@ -99,6 +104,10 @@ bool isTensorPointerType(Type type) { return false; } +bool isTensorOrTensorPointerType(Type type) { + return type.isa() || isTensorPointerType(type); +} + Type getElementTypeOfTensorPointerType(Type type) { if (auto ptrType = type.dyn_cast()) if (auto tensorTy = ptrType.getPointeeType().dyn_cast()) diff --git a/lib/Dialect/Triton/Transforms/RewriteTensorPointer.cpp b/lib/Dialect/Triton/Transforms/RewriteTensorPointer.cpp index 3199de14f5ed..2393599143be 100644 --- a/lib/Dialect/Triton/Transforms/RewriteTensorPointer.cpp +++ b/lib/Dialect/Triton/Transforms/RewriteTensorPointer.cpp @@ -11,6 +11,8 @@ using namespace mlir; #define GEN_PASS_CLASSES #include "triton/Dialect/Triton/Transforms/Passes.h.inc" +namespace { + /// An additional struct to record the meta information of operations /// with tensor pointers struct RewritedInfo { @@ -186,6 +188,8 @@ struct RewritedInfo { } }; +} // namespace + class RewriteTensorPointerPass : public TritonRewriteTensorPointerBase { private: @@ -470,8 +474,8 @@ class RewriteTensorPointerPass void runOnOperation() override { // Only rewrite if the hardware does not support - // if (computeCapability >= 90) - // return; + if (computeCapability >= 90) + return; // NOTES(Chenggang): we don't use `ConversionPatternRewriter`, because // MLIR does not support one-multiple value mapping. For example, if we use diff --git a/lib/Dialect/TritonGPU/IR/CMakeLists.txt b/lib/Dialect/TritonGPU/IR/CMakeLists.txt index 20f6f9851e1b..8477f4dccd20 100644 --- a/lib/Dialect/TritonGPU/IR/CMakeLists.txt +++ b/lib/Dialect/TritonGPU/IR/CMakeLists.txt @@ -1,6 +1,7 @@ add_mlir_dialect_library(TritonGPUIR Dialect.cpp Traits.cpp + Types.cpp DEPENDS TritonGPUTableGen diff --git a/lib/Dialect/TritonGPU/IR/Dialect.cpp b/lib/Dialect/TritonGPU/IR/Dialect.cpp index f192d9ae6338..98aceb91f3a6 100644 --- a/lib/Dialect/TritonGPU/IR/Dialect.cpp +++ b/lib/Dialect/TritonGPU/IR/Dialect.cpp @@ -16,6 +16,21 @@ using namespace mlir::triton::gpu; namespace mlir { namespace triton { +static Type getI1SameShapeFromTensorOrTensorPtr(Type type) { + auto i1Type = IntegerType::get(type.getContext(), 1); + if (auto tensorType = type.dyn_cast()) { + return RankedTensorType::get(tensorType.getShape(), i1Type, + tensorType.getEncoding()); + } else if (auto ptrType = type.dyn_cast()) { + Type pointeeType = ptrType.getPointeeType(); + if (auto tensorType = pointeeType.dyn_cast()) { + return RankedTensorType::get(tensorType.getShape(), i1Type, + tensorType.getEncoding()); + } + } + return Type(); +} + namespace gpu { // TODO: Inheritance of layout attributes @@ -80,6 +95,8 @@ SmallVector getThreadsPerWarp(Attribute layout) { return {4, 8}; if (mmaLayout.isAmpere()) return {8, 4}; + if (mmaLayout.isHopper()) + return {8, 4}; } if (auto sliceLayout = layout.dyn_cast()) { auto parent = sliceLayout.getParent(); @@ -179,6 +196,10 @@ SmallVector getSizePerThread(Attribute layout) { return {2, 2}; } else if (mmaLayout.isVolta()) { return {1, 2}; + } else if (mmaLayout.isHopper()) { + auto instrShape = mmaLayout.getInstrShape(); + // TODO(thomas): what are those magic numbers? + return SmallVector{instrShape[0] * 4 / 32, instrShape[1] / 4}; } else { llvm_unreachable("Unexpected mma version"); } @@ -188,7 +209,6 @@ SmallVector getSizePerThread(Attribute layout) { if (auto parentMmaLayout = parentLayout.dyn_cast()) { assert(parentMmaLayout.isAmpere() && "mmaLayout version = 1 is not implemented yet"); - auto parentShapePerCTA = getShapePerCTA(parentLayout); auto opIdx = dotLayout.getOpIdx(); if (opIdx == 0) { return {2, 4}; @@ -211,7 +231,7 @@ SmallVector getSizePerThread(Attribute layout) { SmallVector getContigPerThread(Attribute layout) { if (auto mmaLayout = layout.dyn_cast()) { - assert(mmaLayout.isVolta() || mmaLayout.isAmpere()); + assert(mmaLayout.isVolta() || mmaLayout.isAmpere() || mmaLayout.isHopper()); return {1, 2}; } else if (auto sliceLayout = layout.dyn_cast()) { auto parentLayout = sliceLayout.getParent(); @@ -258,14 +278,14 @@ SmallVector getThreadsPerCTA(Attribute layout) { } else assert(0 && "Unimplemented usage of MmaEncodingAttr"); } else { - assert(0 && "Unimplemented usage of getShapePerCTA"); + assert(0 && "Unimplemented usage of getThreadsPerCTA"); } return threads; } -SmallVector getShapePerCTA(Attribute layout, - ArrayRef tensorShape) { +SmallVector getShapePerCTATile(Attribute layout, + ArrayRef tensorShape) { SmallVector shape; if (auto blockedLayout = layout.dyn_cast()) { for (unsigned d = 0, n = blockedLayout.getOrder().size(); d < n; ++d) @@ -273,13 +293,8 @@ SmallVector getShapePerCTA(Attribute layout, blockedLayout.getThreadsPerWarp()[d] * blockedLayout.getWarpsPerCTA()[d]); } else if (auto sliceLayout = layout.dyn_cast()) { - unsigned dim = sliceLayout.getDim(); - auto parent = sliceLayout.getParent(); - for (unsigned d = 0, n = getOrder(parent).size(); d < n; ++d) { - if (d == dim) - continue; - shape.push_back(getShapePerCTA(parent, tensorShape)[d]); - } + shape = getShapePerCTATile(sliceLayout.getParent(), tensorShape); + shape.erase(shape.begin() + sliceLayout.getDim()); } else if (auto mmaLayout = layout.dyn_cast()) { if (mmaLayout.isAmpere()) return {16 * mmaLayout.getWarpsPerCTA()[0], @@ -292,6 +307,11 @@ SmallVector getShapePerCTA(Attribute layout, return {static_cast(tensorShape[0]), static_cast(tensorShape[1])}; } + if (mmaLayout.isHopper()) { + auto instrShape = mmaLayout.getInstrShape(); + return {16 * mmaLayout.getWarpsPerCTA()[0], + instrShape[1] * mmaLayout.getWarpsPerCTA()[1]}; + } assert(0 && "Unexpected MMA layout version found"); } else if (auto dotLayout = layout.dyn_cast()) { auto parentLayout = dotLayout.getParent(); @@ -299,12 +319,13 @@ SmallVector getShapePerCTA(Attribute layout, if (auto parentMmaLayout = parentLayout.dyn_cast()) { assert(parentMmaLayout.isAmpere() && "mmaLayout version = 1 is not implemented yet"); - auto parentShapePerCTA = getShapePerCTA(parentLayout, tensorShape); + auto parentShapePerCTATile = + getShapePerCTATile(parentLayout, tensorShape); auto opIdx = dotLayout.getOpIdx(); if (opIdx == 0) { - return {parentShapePerCTA[0], 16}; + return {parentShapePerCTATile[0], 16}; } else if (opIdx == 1) { - return {16, parentShapePerCTA[1]}; + return {16, parentShapePerCTATile[1]}; } else { assert(0 && "DotOperandEncodingAttr opIdx must be 0 or 1"); } @@ -313,11 +334,32 @@ SmallVector getShapePerCTA(Attribute layout, "supported yet"); } } else { - assert(0 && "Unimplemented usage of getShapePerCTA"); + assert(0 && "Unimplemented usage of getShapePerCTATile"); } return shape; } +namespace { + +/* Utility function used by getOrder and getCTAOrder of SliceEncodingAttr. + * Erase dim and decrease all values larger than dim by 1. + * Example: order = [0, 2, 4, 3, 1], dim = 2 + * resOrder = [0, 3, 2, 1] + */ +SmallVector eraseOrder(ArrayRef order, unsigned dim) { + unsigned rank = order.size(); + assert(dim < rank && "Invalid dim to erase"); + SmallVector resOrder; + for (unsigned i : order) + if (i < dim) + resOrder.push_back(i); + else if (i > dim) + resOrder.push_back(i - 1); + return resOrder; +} + +} // namespace + SmallVector getOrder(Attribute layout) { if (auto blockedLayout = layout.dyn_cast()) { return SmallVector(blockedLayout.getOrder().begin(), @@ -344,8 +386,178 @@ SmallVector getOrder(Attribute layout) { sharedLayout.getOrder().end()); } else { assert(0 && "Unimplemented usage of getOrder"); - return {}; } + return {}; +}; + +CTALayoutAttr getCTALayout(Attribute layout) { + if (auto blockedLayout = layout.dyn_cast()) + return blockedLayout.getCTALayout(); + else if (auto sliceLayout = layout.dyn_cast()) + return CTALayoutAttr::get(layout.getContext(), getCTAsPerCGA(sliceLayout), + getCTASplitNum(sliceLayout), + getCTAOrder(sliceLayout)); + else if (auto mmaLayout = layout.dyn_cast()) + return mmaLayout.getCTALayout(); + else if (auto dotLayout = layout.dyn_cast()) + return CTALayoutAttr::get(layout.getContext(), getCTAsPerCGA(dotLayout), + getCTASplitNum(dotLayout), + getCTAOrder(dotLayout)); + else if (auto sharedLayout = layout.dyn_cast()) + return sharedLayout.getCTALayout(); + else + assert(0 && "Unimplemented usage of getCTALayout"); + return {}; +} + +SmallVector getCTAsPerCGA(Attribute layout) { + ArrayRef ref; + if (auto blockedLayout = layout.dyn_cast()) + ref = blockedLayout.getCTALayout().getCTAsPerCGA(); + else if (auto sliceLayout = layout.dyn_cast()) { + auto parentCTAsPerCGA = getCTAsPerCGA(sliceLayout.getParent()); + if (parentCTAsPerCGA[sliceLayout.getDim()] == 1) { + parentCTAsPerCGA.erase(parentCTAsPerCGA.begin() + sliceLayout.getDim()); + return parentCTAsPerCGA; + } + /* For getCTAsPerCGA of a slice layout, we have two choices: + * (1) Return CTAsPerCGA of its parent. This is not a perfect solution + * because the rank of the returned CTAsPerCGA does not match the rank of + * tensorShape. + * (2) Get CTAsPerCGA of its parent and erase the sliced dim. This is not a + * perfect solution because the product of the returned CTAsPerCGA might not + * match numCTAs. + * To avoid introducing inconsistencies to the shape and + * layout system, the usage of directly getting CTAsPerCGA of a slice layout + * in which the sliced dim is not 1 is banned. You should always consider + * slice layout as a special case and use getCTAsPerCGA(layout.getParent()) + * in the branch where layout is an instance of SliceEncodingAttr. This is + * inconvenient but safe. + */ + assert(0 && "getCTAsPerCGA for SliceEncodingAttr is not well-defined"); + } else if (auto mmaLayout = layout.dyn_cast()) + ref = mmaLayout.getCTALayout().getCTAsPerCGA(); + else if (auto dotLayout = layout.dyn_cast()) + return getCTAsPerCGA(dotLayout.getParent()); + else if (auto sharedLayout = layout.dyn_cast()) + ref = sharedLayout.getCTALayout().getCTAsPerCGA(); + else + assert(0 && "Unimplemented usage of getCTAsPerCGA"); + return SmallVector(ref.begin(), ref.end()); +} + +SmallVector getCTASplitNum(Attribute layout) { + SmallVector res; + + if (auto blockedLayout = layout.dyn_cast()) { + res.assign(blockedLayout.getCTALayout().getCTASplitNum().begin(), + blockedLayout.getCTALayout().getCTASplitNum().end()); + } else if (auto sliceLayout = layout.dyn_cast()) { + res = getCTASplitNum(sliceLayout.getParent()); + res.erase(res.begin() + sliceLayout.getDim()); + } else if (auto mmaLayout = layout.dyn_cast()) { + res.assign(mmaLayout.getCTALayout().getCTASplitNum().begin(), + mmaLayout.getCTALayout().getCTASplitNum().end()); + } else if (auto dotLayout = layout.dyn_cast()) { + res = getCTASplitNum(dotLayout.getParent()); + assert(res.size() == 2 && "Invalid dotLayout"); + + // Do not split CTA in K dimension + dotLayout.getOpIdx() == 0 ? res[1] = 1 : res[0] = 1; + } else if (auto sharedLayout = layout.dyn_cast()) { + res.assign(sharedLayout.getCTALayout().getCTASplitNum().begin(), + sharedLayout.getCTALayout().getCTASplitNum().end()); + } else { + assert(false && "Unimplemented usage of getCTASplitNum"); + } + + return res; +} + +SmallVector getCTAOrder(Attribute layout) { + ArrayRef ref; + if (auto blockedLayout = layout.dyn_cast()) { + ref = blockedLayout.getCTALayout().getCTAOrder(); + } else if (auto sliceLayout = layout.dyn_cast()) { + auto parentCTAOrder = getCTAOrder(sliceLayout.getParent()); + return eraseOrder(parentCTAOrder, sliceLayout.getDim()); + } else if (auto mmaLayout = layout.dyn_cast()) { + ref = mmaLayout.getCTALayout().getCTAOrder(); + } else if (auto dotLayout = layout.dyn_cast()) { + return getCTAOrder(dotLayout.getParent()); + } else if (auto sharedLayout = layout.dyn_cast()) { + ref = sharedLayout.getCTALayout().getCTAOrder(); + } else { + assert(0 && "Unimplemented usage of getCTAOrder"); + } + return SmallVector(ref.begin(), ref.end()); +} + +SmallVector getShapePerCTA(ArrayRef CTASplitNum, + ArrayRef shape) { + unsigned rank = shape.size(); + SmallVector shapePerCTA(rank); + for (unsigned i = 0; i < rank; ++i) { + // This wrapping rule must be consistent with emitCTAOffsetForLayout + unsigned splitNum = std::min(shape[i], CTASplitNum[i]); + shapePerCTA[i] = shape[i] / splitNum; + } + return shapePerCTA; +} + +SmallVector getShapePerCTA(Attribute layout, ArrayRef shape) { + if (auto sharedLayout = layout.dyn_cast()) { + // Special logic for pipeline pass, where shape is 3D and CTALayout is 2D. + // The first dim of shape is numStages. This is a work around, otherwise too + // many places would have to be modified in pipeline pass. Maybe we need to + // refactor this logic in the future. + auto CTASplitNum = sharedLayout.getCTALayout().getCTASplitNum(); + if (shape.size() == CTASplitNum.size() + 1) { + auto res = getShapePerCTA(CTASplitNum, shape.drop_front()); + res.insert(res.begin(), shape.front()); + return res; + } + } + return getShapePerCTA(getCTASplitNum(layout), shape); +} + +SmallVector getShapePerCTA(Type type) { + auto tensorType = type.cast(); + return getShapePerCTA(tensorType.getEncoding(), tensorType.getShape()); +} + +unsigned getNumWarpsPerCTA(Attribute layout) { + ArrayRef warpsPerCTA; + if (auto blockedLayout = layout.dyn_cast()) + warpsPerCTA = blockedLayout.getWarpsPerCTA(); + else if (auto sliceLayout = layout.dyn_cast()) + return getNumWarpsPerCTA(sliceLayout.getParent()); + else if (auto mmaLayout = layout.dyn_cast()) + warpsPerCTA = mmaLayout.getWarpsPerCTA(); + else if (auto dotLayout = layout.dyn_cast()) + return getNumWarpsPerCTA(dotLayout.getParent()); + else if (auto sharedLayout = layout.dyn_cast()) + assert(0 && "Cannot get numWarps from SharedEncodingAttr"); + else + assert(0 && "Unimplemented usage of getNumWarpsPerCTA"); + return product(warpsPerCTA); +} + +unsigned getNumCTAs(Attribute layout) { + ArrayRef CTAsPerCGA; + if (auto blockedLayout = layout.dyn_cast()) + CTAsPerCGA = blockedLayout.getCTALayout().getCTAsPerCGA(); + else if (auto sliceLayout = layout.dyn_cast()) + return getNumCTAs(sliceLayout.getParent()); + else if (auto mmaLayout = layout.dyn_cast()) + CTAsPerCGA = mmaLayout.getCTALayout().getCTAsPerCGA(); + else if (auto dotLayout = layout.dyn_cast()) + return getNumCTAs(dotLayout.getParent()); + else if (auto sharedLayout = layout.dyn_cast()) + CTAsPerCGA = sharedLayout.getCTALayout().getCTAsPerCGA(); + else + assert(0 && "Unimplemented usage of getNumCTAs"); + return product(CTAsPerCGA); } bool isaDistributedLayout(Attribute layout) { @@ -362,7 +574,7 @@ bool isSharedEncoding(Value value) { return false; } -bool isExpensiveCat(CatOp cat, Attribute &targetEncoding) { +bool isExpensiveCat(CatOp cat, Attribute targetEncoding) { // If the new elements per thread is less than the old one, we will need to do // convert encoding that goes through shared memory anyway. So we consider it // as expensive. @@ -411,10 +623,21 @@ static LogicalResult parseIntAttrValue(AsmParser &parser, Attribute attr, return success(); } +static LogicalResult parseBoolAttrValue(AsmParser &parser, Attribute attr, + bool &value, StringRef desc) { + auto boolAttr = attr.dyn_cast(); + if (!boolAttr) { + parser.emitError(parser.getNameLoc(), "expected an bool type in ") << desc; + return failure(); + } + value = boolAttr.getValue(); + return success(); +} + // parse an array of integers static LogicalResult parseIntArrayAttr(AsmParser &parser, const NamedAttribute &attr, - SmallVector &res, + SmallVector &res, StringRef desc) { auto arrayAttr = attr.getValue().dyn_cast(); if (!arrayAttr) { @@ -435,6 +658,11 @@ static LogicalResult parseUInt(AsmParser &parser, const NamedAttribute &attr, return parseIntAttrValue(parser, attr.getValue(), value, desc); }; +static LogicalResult parseBool(AsmParser &parser, const NamedAttribute &attr, + bool &value, StringRef desc) { + return parseBoolAttrValue(parser, attr.getValue(), value, desc); +}; + //===----------------------------------------------------------------------===// // Attribute methods //===----------------------------------------------------------------------===// @@ -451,12 +679,13 @@ BlockedEncodingAttr::getElemsPerThread(ArrayRef shape, auto sizePerThread = getSizePerThread(); auto warpsPerCTA = getWarpsPerCTA(); auto threadsPerWarp = getThreadsPerWarp(); + auto shapePerCTA = getShapePerCTA(*this, shape); assert(rank == sizePerThread.size() && "unexpected rank in BlockedEncodingAttr::getElemsPerThread"); SmallVector elemsPerThread(rank); for (size_t i = 0; i < rank; ++i) { unsigned t = sizePerThread[i] * threadsPerWarp[i] * warpsPerCTA[i]; - elemsPerThread[i] = ceil(shape[i], t) * sizePerThread[i]; + elemsPerThread[i] = ceil(shapePerCTA[i], t) * sizePerThread[i]; } return elemsPerThread; } @@ -503,7 +732,10 @@ SmallVector MmaEncodingAttr::getElemsPerThread(ArrayRef shape, Type eltTy) const { size_t rank = shape.size(); assert(rank == 2 && "Unexpected rank of mma layout"); - assert((isVolta() || isAmpere()) && "Only version 1 and 2 is supported"); + assert((isVolta() || isAmpere() || isHopper()) && + "For MmaEncodingAttr only version 1~3 is supported"); + + auto shapePerCTA = getShapePerCTA(getCTALayout().getCTASplitNum(), shape); SmallVector elemsPerThread(rank); if (isVolta()) { @@ -517,15 +749,24 @@ MmaEncodingAttr::getElemsPerThread(ArrayRef shape, Type eltTy) const { unsigned spwN = fpw[1] * 4 * repN; unsigned wptM = getWarpsPerCTA()[0]; unsigned wptN = getWarpsPerCTA()[1]; - unsigned resM = repM * std::max(1, shape[0] / (spwM * wptM)); - unsigned resN = 2 * repN * std::max(1, shape[1] / (spwN * wptN)); + unsigned resM = repM * std::max(1, shapePerCTA[0] / (spwM * wptM)); + unsigned resN = 2 * repN * std::max(1, shapePerCTA[1] / (spwN * wptN)); elemsPerThread[0] = resM; elemsPerThread[1] = resN; } else if (isAmpere()) { - unsigned elemsRow = ceil(shape[0], 16 * getWarpsPerCTA()[0]) * 2; - unsigned elemsCol = ceil(shape[1], 8 * getWarpsPerCTA()[1]) * 2; + unsigned elemsRow = + ceil(shapePerCTA[0], 16 * getWarpsPerCTA()[0]) * 2; + unsigned elemsCol = + ceil(shapePerCTA[1], 8 * getWarpsPerCTA()[1]) * 2; elemsPerThread[0] = elemsRow; elemsPerThread[1] = elemsCol; + } else if (isHopper()) { + auto wpt = getWarpsPerCTA(); + auto instrMNK = getInstrShape(); + int repM = ceil(shapePerCTA[0], instrMNK[0] * wpt[0]); + int repN = ceil(shapePerCTA[1], instrMNK[1] * wpt[1]); + elemsPerThread[0] = 2 * repM; + elemsPerThread[1] = (instrMNK[1] / 4) * repN; } else { llvm_unreachable("Unexpected mma version"); } @@ -533,6 +774,37 @@ MmaEncodingAttr::getElemsPerThread(ArrayRef shape, Type eltTy) const { return elemsPerThread; } +unsigned +MmaEncodingAttr::getElemsPerThreadOfOperand(int opIdx, + ArrayRef shape) const { + size_t rank = shape.size(); + assert(rank == 2 && "Unexpected rank of mma layout"); + auto shapePerCTA = getShapePerCTA(*this, shape); + int res = 0; + if (isVolta()) { + llvm_unreachable( + "getElemsPerThreadOfOperand() not supported for version 1"); + } else if (isAmpere()) { + llvm_unreachable( + "getElemsPerThreadOfOperand() not supported for version 2"); + } else if (isHopper()) { + auto wpt = getWarpsPerCTA(); + auto instrMNK = getInstrShape(); + if (opIdx == 0) { + int repM = ceil(shapePerCTA[0], instrMNK[0] * wpt[0]); + int repK = ceil(shapePerCTA[1], instrMNK[2]); + return 8 * repM * repK; + + } else if (opIdx == 1) { + int repK = ceil(shapePerCTA[0], instrMNK[2]); + int repN = ceil(shapePerCTA[1], instrMNK[1] * wpt[1]); + // benzh@ here need more check + return 4 * std::max(instrMNK[1] / 32, 1) * repK * repN; + } + } + return res; +} + unsigned MmaEncodingAttr::getTotalElemsPerThread(ArrayRef shape, Type eltTy) const { return product(getElemsPerThread(shape, eltTy)); @@ -580,7 +852,6 @@ unsigned DotOperandEncodingAttr::getTotalElemsPerThread(ArrayRef shape, if (auto mmaParent = getParent().dyn_cast()) { int warpsPerCTAM = mmaParent.getWarpsPerCTA()[0]; int warpsPerCTAN = mmaParent.getWarpsPerCTA()[1]; - // A100 if (mmaParent.isAmpere()) { auto rep = getMMAv2Rep(shape, eltTy.getIntOrFloatBitWidth()); if (getOpIdx() == 0) @@ -650,7 +921,7 @@ unsigned DotOperandEncodingAttr::getTotalElemsPerThread(ArrayRef shape, } } if (auto blockedLayout = getParent().dyn_cast()) { - auto shapePerCTA = getShapePerCTA(blockedLayout); + auto shapePerCTATile = getShapePerCTATile(blockedLayout); auto order = blockedLayout.getOrder(); auto sizePerThread = getSizePerThread(blockedLayout); @@ -665,13 +936,13 @@ unsigned DotOperandEncodingAttr::getTotalElemsPerThread(ArrayRef shape, order[0] == 0 ? sizePerThread[order[1]] : sizePerThread[order[0]]; int sizePerThreadMN = isM ? mSizePerThread : nSizePerThread; - int mShapePerCTA = - order[0] == 1 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; - int nShapePerCTA = - order[0] == 0 ? shapePerCTA[order[1]] : shapePerCTA[order[0]]; - int shapePerCTAMN = isM ? mShapePerCTA : nShapePerCTA; + int mShapePerCTATile = + order[0] == 1 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; + int nShapePerCTATile = + order[0] == 0 ? shapePerCTATile[order[1]] : shapePerCTATile[order[0]]; + int shapePerCTAMNTile = isM ? mShapePerCTATile : nShapePerCTATile; - return K * std::max(otherDim / shapePerCTAMN, 1) * sizePerThreadMN; + return K * std::max(otherDim / shapePerCTAMNTile, 1) * sizePerThreadMN; } llvm_unreachable("unknown dot operand parent layout"); return 0; @@ -691,10 +962,13 @@ Attribute BlockedEncodingAttr::parse(AsmParser &parser, Type type) { if (parser.parseGreater().failed()) return {}; - SmallVector sizePerThread; - SmallVector threadsPerWarp; - SmallVector warpsPerCTA; - SmallVector order; + SmallVector sizePerThread; + SmallVector threadsPerWarp; + SmallVector warpsPerCTA; + SmallVector order; + SmallVector CTAsPerCGA; + SmallVector CTASplitNum; + SmallVector CTAOrder; for (const NamedAttribute &attr : dict) { if (attr.getName() == "sizePerThread") { @@ -715,6 +989,15 @@ Attribute BlockedEncodingAttr::parse(AsmParser &parser, Type type) { } else if (attr.getName() == "order") { if (parseIntArrayAttr(parser, attr, order, "order").failed()) return {}; + } else if (attr.getName() == "CTAsPerCGA") { + if (parseIntArrayAttr(parser, attr, CTAsPerCGA, "CTAsPerCGA").failed()) + return {}; + } else if (attr.getName() == "CTASplitNum") { + if (parseIntArrayAttr(parser, attr, CTASplitNum, "CTASplitNum").failed()) + return {}; + } else if (attr.getName() == "CTAOrder") { + if (parseIntArrayAttr(parser, attr, CTAOrder, "CTAOrder").failed()) + return {}; } else { parser.emitError(parser.getNameLoc(), "unexpected key: ") << attr.getName().strref(); @@ -722,9 +1005,12 @@ Attribute BlockedEncodingAttr::parse(AsmParser &parser, Type type) { } } - auto ret = parser.getChecked( - parser.getContext(), sizePerThread, threadsPerWarp, warpsPerCTA, order); - return ret; + auto CTALayout = CTALayoutAttr::get(parser.getContext(), CTAsPerCGA, + CTASplitNum, CTAOrder); + + return parser.getChecked(parser.getContext(), + sizePerThread, threadsPerWarp, + warpsPerCTA, order, CTALayout); } void BlockedEncodingAttr::print(mlir::AsmPrinter &printer) const { @@ -733,6 +1019,9 @@ void BlockedEncodingAttr::print(mlir::AsmPrinter &printer) const { << ", threadsPerWarp = [" << getThreadsPerWarp() << "]" << ", warpsPerCTA = [" << getWarpsPerCTA() << "]" << ", order = [" << getOrder() << "]" + << ", CTAsPerCGA = [" << getCTALayout().getCTAsPerCGA() << "]" + << ", CTASplitNum = [" << getCTALayout().getCTASplitNum() << "]" + << ", CTAOrder = [" << getCTALayout().getCTAOrder() << "]" << "}>"; } @@ -751,7 +1040,11 @@ Attribute MmaEncodingAttr::parse(AsmParser &parser, Type type) { unsigned versionMajor = 0; unsigned versionMinor = 0; - SmallVector warpsPerCTA; + SmallVector warpsPerCTA; + SmallVector CTAsPerCGA; + SmallVector CTASplitNum; + SmallVector CTAOrder; + SmallVector instrShape; for (const NamedAttribute &attr : dict) { if (attr.getName() == "versionMajor") { @@ -766,17 +1059,42 @@ Attribute MmaEncodingAttr::parse(AsmParser &parser, Type type) { if (parseIntArrayAttr(parser, attr, warpsPerCTA, "warpsPerCTA").failed()) return {}; } + if (attr.getName() == "CTAsPerCGA") { + if (parseIntArrayAttr(parser, attr, CTAsPerCGA, "CTAsPerCGA").failed()) + return {}; + } + if (attr.getName() == "CTASplitNum") { + if (parseIntArrayAttr(parser, attr, CTASplitNum, "CTASplitNum").failed()) + return {}; + } + if (attr.getName() == "CTAOrder") { + if (parseIntArrayAttr(parser, attr, CTAOrder, "CTAOrder").failed()) + return {}; + } + if (attr.getName() == "instrShape") { + if (parseIntArrayAttr(parser, attr, instrShape, "instrShape").failed()) { + return {}; + } + } } + auto CTALayout = CTALayoutAttr::get(parser.getContext(), CTAsPerCGA, + CTASplitNum, CTAOrder); + return parser.getChecked(parser.getContext(), versionMajor, - versionMinor, warpsPerCTA); + versionMinor, warpsPerCTA, + CTALayout, instrShape); } void MmaEncodingAttr::print(AsmPrinter &printer) const { printer << "<{" << "versionMajor = " << getVersionMajor() << ", " << "versionMinor = " << getVersionMinor() << ", " - << "warpsPerCTA = [" << getWarpsPerCTA() << "]" + << "warpsPerCTA = [" << getWarpsPerCTA() << "], " + << "CTAsPerCGA = [" << getCTALayout().getCTAsPerCGA() << "], " + << "CTASplitNum = [" << getCTALayout().getCTASplitNum() << "], " + << "CTAOrder = [" << getCTALayout().getCTAOrder() << "], " + << "instrShape = [" << getInstrShape() << "]" << "}>"; } @@ -820,7 +1138,11 @@ Attribute SharedEncodingAttr::parse(AsmParser &parser, Type type) { unsigned vec = 0; unsigned perPhase = 0; unsigned maxPhase = 0; - SmallVector order; + SmallVector order; + SmallVector CTAsPerCGA; + SmallVector CTASplitNum; + SmallVector CTAOrder; + bool hasLeadingOffset = false; for (const NamedAttribute &attr : dict) { if (attr.getName() == "vec") { @@ -835,6 +1157,19 @@ Attribute SharedEncodingAttr::parse(AsmParser &parser, Type type) { } else if (attr.getName() == "order") { if (parseIntArrayAttr(parser, attr, order, "order").failed()) return {}; + } else if (attr.getName() == "CTAsPerCGA") { + if (parseIntArrayAttr(parser, attr, CTAsPerCGA, "CTAsPerCGA").failed()) + return {}; + } else if (attr.getName() == "CTASplitNum") { + if (parseIntArrayAttr(parser, attr, CTASplitNum, "CTASplitNum").failed()) + return {}; + } else if (attr.getName() == "CTAOrder") { + if (parseIntArrayAttr(parser, attr, CTAOrder, "CTAOrder").failed()) + return {}; + } else if (attr.getName() == "hasLeadingOffset") { + if (parseBool(parser, attr, hasLeadingOffset, "hasLeadingOffset") + .failed()) + return {}; } else { parser.emitError(parser.getNameLoc(), "unexpected key: ") << attr.getName().strref(); @@ -842,16 +1177,24 @@ Attribute SharedEncodingAttr::parse(AsmParser &parser, Type type) { } } + auto CTALayout = CTALayoutAttr::get(parser.getContext(), CTAsPerCGA, + CTASplitNum, CTAOrder); + return parser.getChecked(parser.getContext(), vec, - perPhase, maxPhase, order); + perPhase, maxPhase, order, + CTALayout, hasLeadingOffset); } void SharedEncodingAttr::print(AsmPrinter &printer) const { printer << "<{" - << "vec = " << getVec() << ", perPhase = " << getPerPhase() - << ", maxPhase = " << getMaxPhase() << ", order = [" << getOrder() - << "]" - << "}>"; + << "vec = " << getVec() << ", " + << "perPhase = " << getPerPhase() << ", " + << "maxPhase = " << getMaxPhase() << ", " + << "order = [" << getOrder() << "], " + << "CTAsPerCGA = [" << getCTALayout().getCTAsPerCGA() << "], " + << "CTASplitNum = [" << getCTALayout().getCTASplitNum() << "], " + << "CTAOrder = [" << getCTALayout().getCTAOrder() << "], " + << "hasLeadingOffset = " << getHasLeadingOffset() << "}>"; } //===----------------------------------------------------------------------===// @@ -862,6 +1205,8 @@ bool MmaEncodingAttr::isVolta() const { return getVersionMajor() == 1; } bool MmaEncodingAttr::isAmpere() const { return getVersionMajor() == 2; } +bool MmaEncodingAttr::isHopper() const { return getVersionMajor() == 3; } + // Get [isARow, isBRow, isAVec4, isBVec4, id] from versionMinor std::tuple MmaEncodingAttr::decodeVoltaLayoutStates() const { @@ -968,11 +1313,11 @@ int DotOperandEncodingAttr::getMMAv1NumOuter(ArrayRef shape) const { } //===----------------------------------------------------------------------===// -// InsertSliceAsyncOp +// InsertSliceOp / InsertSliceAsyncOp //===----------------------------------------------------------------------===// -ParseResult InsertSliceAsyncOp::parse(OpAsmParser &parser, - OperationState &result) { +template +ParseResult parseInsertSliceOp(OpAsmParser &parser, OperationState &result) { SmallVector allOperands; Type srcType, dstType; SMLoc allOperandLoc = parser.getCurrentLocation(); @@ -991,7 +1336,8 @@ ParseResult InsertSliceAsyncOp::parse(OpAsmParser &parser, int hasMask = 0, hasOther = 0; if (allOperands.size() >= 4) { - operandTypes.push_back(triton::getI1SameShape(srcType)); // mask + operandTypes.push_back( + triton::getI1SameShapeFromTensorOrTensorPtr(srcType)); // mask hasMask = 1; } if (allOperands.size() >= 5) { @@ -1004,24 +1350,43 @@ ParseResult InsertSliceAsyncOp::parse(OpAsmParser &parser, return failure(); // Deduce operand_segment_sizes from the number of the operands. - auto operand_segment_sizesAttrName = - InsertSliceAsyncOp::getOperandSegmentSizesAttrName(result.name); + auto operandSegmentSizesAttrName = + OpT::getOperandSegmentSizesAttrName(result.name); result.addAttribute( - operand_segment_sizesAttrName, + operandSegmentSizesAttrName, parser.getBuilder().getDenseI32ArrayAttr({1, 1, 1, hasMask, hasOther})); return success(); } -void InsertSliceAsyncOp::print(OpAsmPrinter &printer) { +template +void printInsertSliceOp(OpAsmPrinter &printer, OpT insertSliceOp) { printer << " "; - printer << getOperation()->getOperands(); + printer << insertSliceOp.getOperation()->getOperands(); // "operand_segment_sizes" can be deduced, so we don't print it. - printer.printOptionalAttrDict(getOperation()->getAttrs(), - {getOperandSegmentSizesAttrName()}); + printer.printOptionalAttrDict( + insertSliceOp->getAttrs(), + {insertSliceOp.getOperandSegmentSizesAttrName()}); printer << " : "; - printer.printStrippedAttrOrType(getSrc().getType()); + printer.printStrippedAttrOrType(insertSliceOp.getSrc().getType()); printer << " -> "; - printer.printStrippedAttrOrType(getResult().getType()); + printer.printStrippedAttrOrType(insertSliceOp.getDst().getType()); +} + +ParseResult InsertSliceOp::parse(OpAsmParser &parser, OperationState &result) { + return parseInsertSliceOp(parser, result); +} + +void InsertSliceOp::print(OpAsmPrinter &printer) { + printInsertSliceOp(printer, *this); +} + +ParseResult InsertSliceAsyncOp::parse(OpAsmParser &parser, + OperationState &result) { + return parseInsertSliceOp(parser, result); +} + +void InsertSliceAsyncOp::print(OpAsmPrinter &printer) { + printInsertSliceOp(printer, *this); } //===----------------------------------------------------------------------===// @@ -1071,9 +1436,12 @@ struct TritonGPUInferLayoutInterface SmallVector retOrder(sharedEncoding.getOrder().begin(), sharedEncoding.getOrder().end()); std::reverse(retOrder.begin(), retOrder.end()); + // TODO(Qingyi): Need to check whether CTAOrder should also be reversed. + // This is not a problem for tests where numCTAs = 1. resultEncoding = SharedEncodingAttr::get( getDialect()->getContext(), sharedEncoding.getVec(), - sharedEncoding.getPerPhase(), sharedEncoding.getMaxPhase(), retOrder); + sharedEncoding.getPerPhase(), sharedEncoding.getMaxPhase(), retOrder, + sharedEncoding.getCTALayout(), sharedEncoding.getHasLeadingOffset()); return mlir::success(); } @@ -1092,11 +1460,17 @@ struct TritonGPUInferLayoutInterface return success(); } - LogicalResult - inferDotOpEncoding(Attribute operandEncoding, unsigned opIdx, - Attribute retEncoding, - std::optional location) const override { - if (auto dotOpEnc = operandEncoding.dyn_cast()) { + LogicalResult inferDotOpEncoding(Attribute operandEncoding, unsigned opIdx, + Attribute retEncoding, + Optional location) const override { + auto mmaRetEncoding = retEncoding.dyn_cast(); + if (mmaRetEncoding && mmaRetEncoding.isHopper()) { + // TODO: support gmma when A/B does not reside in shared memory + if (!operandEncoding.isa()) + return emitOptionalError( + location, "unexpected operand layout for MmaEncodingAttr v3"); + } else if (auto dotOpEnc = + operandEncoding.dyn_cast()) { if (opIdx != dotOpEnc.getOpIdx()) return emitOptionalError(location, "Wrong opIdx"); if (retEncoding != dotOpEnc.getParent()) @@ -1138,6 +1512,20 @@ LogicalResult ConvertLayoutOp::canonicalize(ConvertLayoutOp op, if (dstType.getEncoding().isa() && srcType.getEncoding().isa()) return mlir::failure(); + // for hopper MMAv3 + if (!op.use_empty()) { + bool hasDotUser = false; + for (Operation *dot : op.getResult().getUsers()) + if (isa(dot)) + hasDotUser = true; + + if (hasDotUser) { + if (dstType.getEncoding().isa() && + srcType.getEncoding().isa()) + return mlir::failure(); + } + } + // convert to the same layout -- we can delete if (op->getResultTypes() == op->getOperandTypes()) { rewriter.replaceOp(op, op->getOperands()); @@ -1295,6 +1683,8 @@ void ExtractSliceOp::build(OpBuilder &b, OperationState &result, //===----------------------------------------------------------------------===// void TritonGPUDialect::initialize() { + registerTypes(); + addAttributes< #define GET_ATTRDEF_LIST #include "triton/Dialect/TritonGPU/IR/TritonGPUAttrDefs.cpp.inc" @@ -1302,6 +1692,7 @@ void TritonGPUDialect::initialize() { addOperations< #define GET_OP_LIST #include "triton/Dialect/TritonGPU/IR/Ops.cpp.inc" +#include "triton/Dialect/TritonGPU/IR/OpsEnums.cpp.inc" >(); addInterfaces(); addInterfaces(); diff --git a/lib/Dialect/TritonGPU/IR/Types.cpp b/lib/Dialect/TritonGPU/IR/Types.cpp new file mode 100644 index 000000000000..77f673cc2766 --- /dev/null +++ b/lib/Dialect/TritonGPU/IR/Types.cpp @@ -0,0 +1,38 @@ +#include "triton/Dialect/TritonGPU/IR/Types.h" +#include "mlir/IR/DialectImplementation.h" // required by `Types.cpp.inc` +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "llvm/ADT/TypeSwitch.h" // required by `Types.cpp.inc` + +using namespace mlir; +using namespace mlir::triton::gpu; + +#define GET_TYPEDEF_CLASSES +#include "triton/Dialect/TritonGPU/IR/Types.cpp.inc" + +Type TokenType::parse(AsmParser &parser) { + if (parser.parseLess()) + return Type(); + + int type = 1; + if (parser.parseInteger(type)) + return Type(); + + if (parser.parseGreater()) + return Type(); + + return TokenType::get(parser.getContext(), type); +} + +void TokenType::print(AsmPrinter &printer) const { + printer << "<" << getType() << ">"; +} + +//===----------------------------------------------------------------------===// +// Triton Dialect +//===----------------------------------------------------------------------===// +void ::mlir::triton::gpu::TritonGPUDialect::registerTypes() { + addTypes< +#define GET_TYPEDEF_LIST +#include "triton/Dialect/TritonGPU/IR/Types.cpp.inc" + >(); +} diff --git a/lib/Dialect/TritonGPU/Transforms/AccelerateMatmul.cpp b/lib/Dialect/TritonGPU/Transforms/AccelerateMatmul.cpp index ce33843a94d5..e32f062f78ea 100644 --- a/lib/Dialect/TritonGPU/Transforms/AccelerateMatmul.cpp +++ b/lib/Dialect/TritonGPU/Transforms/AccelerateMatmul.cpp @@ -4,31 +4,43 @@ #include "triton/Analysis/Utility.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonGPU/Transforms/Utility.h" +#include "triton/Tools/Sys/GetEnv.hpp" +#include "llvm/Support/Debug.h" #include using namespace mlir; +namespace tt = mlir::triton; +namespace ttg = mlir::triton::gpu; namespace { -using triton::DotOp; -using triton::gpu::BlockedEncodingAttr; -using triton::gpu::ConvertLayoutOp; -using triton::gpu::DotOperandEncodingAttr; -using triton::gpu::MmaEncodingAttr; -using triton::gpu::SliceEncodingAttr; - -int computeCapabilityToMMAVersion(int computeCapability) { - if (computeCapability < 70) { - return 0; - } else if (computeCapability < 80) { - return 1; +using tt::DotOp; +using ttg::BlockedEncodingAttr; +using ttg::ConvertLayoutOp; +using ttg::DotOperandEncodingAttr; +using ttg::MmaEncodingAttr; +using ttg::SliceEncodingAttr; + +// higher mma version is prefered, will fallback to lower version if not +// supported +static int getMMAVersionSafe(int computeCapability, tt::DotOp op) { + int baseVersion = 0; + if (computeCapability < 80) { + baseVersion = 1; } else if (computeCapability < 90) { - return 2; + baseVersion = 2; } else if (computeCapability < 100) { - // FIXME: temporarily add this to pass unis tests - return 2; + baseVersion = 3; } else { - assert(false && "computeCapability > 100 not supported"); - return 3; + assert(false && "computeCapability not supported"); } + + for (; baseVersion >= 1; baseVersion--) { + if (supportMMA(op, baseVersion)) { + return baseVersion; + } + } + + return 0; } SmallVector mmaVersionToShapePerWarp(int version) { @@ -42,20 +54,23 @@ SmallVector mmaVersionToShapePerWarp(int version) { } } -SmallVector warpsPerTileV2(triton::DotOp dotOp, - const ArrayRef shape, - int numWarps) { +SmallVector +warpsPerTileV2(tt::DotOp dotOp, const ArrayRef shape, int numWarps) { auto filter = [&dotOp](Operation *op) { return op->getParentRegion() == dotOp->getParentRegion(); }; auto slices = mlir::getSlice(dotOp, {filter}); for (Operation *op : slices) - if (isa(op) && (op != dotOp)) + if (isa(op) && (op != dotOp)) return {(unsigned)numWarps, 1}; SmallVector ret = {1, 1}; SmallVector shapePerWarp = {16, 8}; bool changed = false; + // TODO (@daadaada): double-check. + // original logic in + // https://github.com/openai/triton/blob/master/lib/codegen/analysis/layout.cc#L252 + // seems buggy for shape = [32, 16] ? do { changed = false; if (ret[0] * ret[1] >= numWarps) @@ -73,14 +88,37 @@ SmallVector warpsPerTileV2(triton::DotOp dotOp, return ret; } +SmallVector +warpsPerTileV3(tt::DotOp dotOp, const ArrayRef shape, int numWarps, + const SmallVector &instrShape) { + SetVector slices; + mlir::getForwardSlice(dotOp.getResult(), &slices); + if (llvm::find_if(slices, [](Operation *op) { return isa(op); }) != + slices.end()) + return {(unsigned)numWarps, 1}; + + // For MMAv3, the smallest indivisible unit of warp shape is (4, 1). + SmallVector ret = {4, 1}; + SmallVector shapePerWarp = {16, instrShape[1]}; + do { + if (ret[0] * ret[1] >= numWarps) + break; + if (shape[0] > shapePerWarp[0] * ret[0]) { + ret[0] *= 2; + } else { + ret[1] *= 2; + } + } while (true); + return ret; +} + class BlockedToMMA : public mlir::RewritePattern { int computeCapability; mutable int mmaV1Counter{}; // used to generate ID for MMAv1 encoding static bool bwdFilter(Operation *op) { return op->getNumOperands() == 1 && - (isa(op) || + (isa(op) || op->getDialect()->getTypeID() == mlir::TypeID::get()); } @@ -102,31 +140,80 @@ class BlockedToMMA : public mlir::RewritePattern { public: BlockedToMMA(mlir::MLIRContext *context, int computeCapability) - : mlir::RewritePattern(triton::DotOp::getOperationName(), 2, context), + : mlir::RewritePattern(tt::DotOp::getOperationName(), 2, context), computeCapability(computeCapability) {} + static SmallVector + getWarpsPerTile(tt::DotOp dotOp, const ArrayRef shape, int version, + int numWarps, const SmallVector &instrShape) { + switch (version) { + case 2: + return warpsPerTileV2(dotOp, shape, numWarps); + case 3: + return warpsPerTileV3(dotOp, shape, numWarps, instrShape); + default: + assert(false && "not supported version"); + return {0, 0}; + } + } + + static Value getMMAv3Operand(Value v, mlir::PatternRewriter &rewriter, + int opIdx) { + auto cvtOp = dyn_cast_or_null(v.getDefiningOp()); + auto arg = cvtOp.getSrc(); + auto argType = arg.getType().cast(); + auto eltType = argType.getElementType(); + assert(argType.getEncoding() && "unexpected tensor type"); + auto newOrder = ttg::getOrder(argType.getEncoding()); + + // MMAv3 with transpose only supports f16 and bf16 data type + // fallback to MMAv3 without transpose for other data types + if (!eltType.isF16() && !eltType.isBF16()) { + if (opIdx == 1) { + newOrder = {0, 1}; + } else { + newOrder = {1, 0}; + } + } + + auto CTALayout = ttg::getCTALayout(argType.getEncoding()); + auto newLayout = ttg::SharedEncodingAttr::get( + argType.getContext(), argType.getShape(), newOrder, CTALayout, + argType.getElementType()); + auto newType = RankedTensorType::get(argType.getShape(), + argType.getElementType(), newLayout); + + return rewriter.create(arg.getLoc(), newType, arg); + } + mlir::LogicalResult matchAndRewrite(mlir::Operation *op, mlir::PatternRewriter &rewriter) const override { if (computeCapability < 70) return failure(); - auto dotOp = cast(op); + auto dotOp = cast(op); auto ctx = op->getContext(); // TODO: Check data-types and SM compatibility auto oldRetType = dotOp.getResult().getType().cast(); if (!oldRetType.getEncoding() || - oldRetType.getEncoding().isa()) + oldRetType.getEncoding().isa()) return failure(); - // for FMA, should retain the blocked layout. - int versionMajor = computeCapabilityToMMAVersion(computeCapability); - if (!supportMMA(dotOp, versionMajor)) - return failure(); + auto AType = dotOp.getOperand(0).getType().cast(); + auto BType = dotOp.getOperand(1).getType().cast(); // get MMA encoding for the given number of warps - auto retShape = oldRetType.getShape(); + auto retShapePerCTA = ttg::getShapePerCTA(oldRetType); auto mod = op->getParentOfType(); - int numWarps = triton::gpu::TritonGPUDialect::getNumWarps(mod); + int numWarps = ttg::TritonGPUDialect::getNumWarps(mod); + auto CTALayout = ttg::getCTALayout(oldRetType.getEncoding()); + + int versionMajor = getMMAVersionSafe(computeCapability, dotOp); + if (!versionMajor) + return failure(); + + auto instrShape = + mmaVersionToInstrShape(versionMajor, retShapePerCTA, AType); // operands Value a = dotOp.getA(); @@ -134,7 +221,7 @@ class BlockedToMMA : public mlir::RewritePattern { auto oldAType = a.getType().cast(); auto oldBType = b.getType().cast(); - triton::gpu::MmaEncodingAttr mmaEnc; + ttg::MmaEncodingAttr mmaEnc; if (versionMajor == 1) { SetVector aBwdSlices, bBwdSlices; auto isCvt = [](Operation *op) { return isa(op); }; @@ -163,46 +250,54 @@ class BlockedToMMA : public mlir::RewritePattern { if (bOp) isBRow = getCvtArgOrder(bOp)[0] == 1; - mmaEnc = triton::gpu::MmaEncodingAttr::get( - oldRetType.getContext(), versionMajor, numWarps, oldAType.getShape(), - oldBType.getShape(), retShape, isARow, isBRow, mmaV1Counter++); - } else if (versionMajor == 2) { - auto warpsPerTile = warpsPerTileV2(dotOp, retShape, numWarps); - mmaEnc = triton::gpu::MmaEncodingAttr::get( - oldRetType.getContext(), versionMajor, 0 /*versionMinor*/, - warpsPerTile); - } else { - llvm_unreachable("Mma layout only supports versionMajor in {1, 2}"); + mmaEnc = ttg::MmaEncodingAttr::get( + oldRetType.getContext(), versionMajor, numWarps, CTALayout, + instrShape, oldAType.getShape(), oldBType.getShape(), retShapePerCTA, + isARow, isBRow, mmaV1Counter++); + } else if (versionMajor == 2 || versionMajor == 3) { + auto warpsPerTile = getWarpsPerTile(dotOp, retShapePerCTA, versionMajor, + numWarps, instrShape); + mmaEnc = ttg::MmaEncodingAttr::get(oldRetType.getContext(), versionMajor, + 0 /*versionMinor*/, warpsPerTile, + CTALayout, instrShape); } - auto newRetType = - RankedTensorType::get(retShape, oldRetType.getElementType(), mmaEnc); + auto newRetType = RankedTensorType::get( + oldRetType.getShape(), oldRetType.getElementType(), mmaEnc); // convert accumulator auto oldAcc = dotOp.getOperand(2); - auto newAcc = rewriter.create( - oldAcc.getLoc(), newRetType, oldAcc); - // convert operands - int minBitwidth = std::min(computeOrigBitWidth(a), computeOrigBitWidth(b)); - Type minType = IntegerType::get(ctx, minBitwidth); - // convert A operand - auto newAEncoding = triton::gpu::DotOperandEncodingAttr::get( - oldAType.getContext(), 0, newRetType.getEncoding(), - minBitwidth > 0 ? minType : oldAType.getElementType()); - auto newAType = RankedTensorType::get( - oldAType.getShape(), oldAType.getElementType(), newAEncoding); - a = rewriter.create(a.getLoc(), newAType, a); - // convert B operand - auto newBEncoding = triton::gpu::DotOperandEncodingAttr::get( - oldBType.getContext(), 1, newRetType.getEncoding(), - minBitwidth > 0 ? minType : oldBType.getElementType()); - auto newBType = RankedTensorType::get( - oldBType.getShape(), oldBType.getElementType(), newBEncoding); - b = rewriter.create(b.getLoc(), newBType, b); + auto newAcc = rewriter.create(oldAcc.getLoc(), + newRetType, oldAcc); + + if (versionMajor == 3) { + a = getMMAv3Operand(a, rewriter, 0); + b = getMMAv3Operand(b, rewriter, 1); + } else { + + // convert operands + int minBitwidth = + std::min(computeOrigBitWidth(a), computeOrigBitWidth(b)); + Type minType = IntegerType::get(ctx, minBitwidth); + // convert A operand + auto newAEncoding = ttg::DotOperandEncodingAttr::get( + oldAType.getContext(), 0, newRetType.getEncoding(), + minBitwidth > 0 ? minType : oldAType.getElementType()); + auto newAType = RankedTensorType::get( + oldAType.getShape(), oldAType.getElementType(), newAEncoding); + a = rewriter.create(a.getLoc(), newAType, a); + // convert B operand + auto newBEncoding = ttg::DotOperandEncodingAttr::get( + oldBType.getContext(), 1, newRetType.getEncoding(), + minBitwidth > 0 ? minType : oldBType.getElementType()); + auto newBType = RankedTensorType::get( + oldBType.getShape(), oldBType.getElementType(), newBEncoding); + b = rewriter.create(b.getLoc(), newBType, b); + } // convert dot instruction - auto newDot = rewriter.create( - dotOp.getLoc(), newRetType, a, b, newAcc, dotOp.getAllowTF32()); + auto newDot = rewriter.create(dotOp.getLoc(), newRetType, a, b, + newAcc, dotOp.getAllowTF32()); - rewriter.replaceOpWithNewOp( - op, oldRetType, newDot.getResult()); + rewriter.replaceOpWithNewOp(op, oldRetType, + newDot.getResult()); return success(); } }; diff --git a/lib/Dialect/TritonGPU/Transforms/CMakeLists.txt b/lib/Dialect/TritonGPU/Transforms/CMakeLists.txt index ced082069198..9d00930f83fa 100644 --- a/lib/Dialect/TritonGPU/Transforms/CMakeLists.txt +++ b/lib/Dialect/TritonGPU/Transforms/CMakeLists.txt @@ -3,6 +3,7 @@ add_mlir_dialect_library(TritonGPUTransforms Coalesce.cpp DecomposeConversions.cpp OptimizeDotOperands.cpp + OptimizeEpilogue.cpp Pipeline.cpp Prefetch.cpp RemoveLayoutConversions.cpp @@ -19,4 +20,6 @@ add_mlir_dialect_library(TritonGPUTransforms TritonAnalysis TritonIR TritonGPUIR + TritonNvidiaGPUIR + MLIRTransformUtils ) diff --git a/lib/Dialect/TritonGPU/Transforms/Coalesce.cpp b/lib/Dialect/TritonGPU/Transforms/Coalesce.cpp index 0a2cc1b466af..5ebc88083fca 100644 --- a/lib/Dialect/TritonGPU/Transforms/Coalesce.cpp +++ b/lib/Dialect/TritonGPU/Transforms/Coalesce.cpp @@ -3,6 +3,8 @@ #include "triton/Analysis/Utility.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "llvm/Support/Debug.h" +#include #include using namespace mlir; @@ -24,20 +26,64 @@ typedef DenseMap> LayoutMap; struct CoalescePass : public TritonGPUCoalesceBase { Attribute getCoalescedEncoding(ModuleAxisInfoAnalysis &axisInfoAnalysis, Value ptr, int numWarps, int threadsPerWarp) { - auto origType = ptr.getType().cast(); - // Get the shape of the tensor. - size_t rank = origType.getRank(); + auto refType = ptr.getType(); + if (refType.isa()) + refType = refType.cast().getPointeeType(); + auto refTensorType = refType.cast(); + + // TODO(Keren): integrate it into AxisInfoAnalysis + // Get axis info + auto queryAxisInfo = [&](const Value &val) -> AxisInfo { + auto valType = val.getType(); + // Tensor pointer + // TODO(Chenggang): encoding for tensor pointers is meaningless, remove + // these later while merging into the GitHub main + if (auto ptrType = valType.dyn_cast()) { + auto tensorTy = ptrType.getPointeeType().dyn_cast(); + assert(tensorTy); + auto makeTensorPtr = getMakeTensorPtrOp(val); + auto order = makeTensorPtr.getOrder(); + auto tileShape = triton::gpu::getShapePerCTA(tensorTy); + size_t rank = order.size(); + auto elemSizeInBytes = + tensorTy.getElementType().getIntOrFloatBitWidth() / 8; + SmallVector contiguity(rank, 1); + SmallVector divisibility(rank, 1); + SmallVector constancy(rank, 1); + // The contiguity in `order[0]` is `tileShape[order[0]]` + // The divisibility in `order[0]` is 16 + // TODO[goostavz]: confirm the legality of it + contiguity[order[0]] = tileShape[order[0]]; + divisibility[order[0]] = 16 * 8 / elemSizeInBytes; + return AxisInfo(contiguity, divisibility, constancy); + } + // Normal cases + assert(valType.isa()); + return *axisInfoAnalysis.getAxisInfo(val); + }; + // Get the contiguity order of `ptr` - auto order = argSort(axisInfoAnalysis.getAxisInfo(ptr)->getContiguity()); + SmallVector order; + if (auto ptrType = ptr.getType().dyn_cast()) { + // Tensor pointer + auto makeTensorPtr = getMakeTensorPtrOp(ptr); + std::copy(makeTensorPtr.getOrder().begin(), + makeTensorPtr.getOrder().end(), std::back_inserter(order)); + } else { + // Normal cases + order = argSort(queryAxisInfo(ptr).getContiguity()); + } + // The desired divisibility is the maximum divisibility // among all dependent pointers who have the same order as - // `ptr` + // `ptr`. + // We only do it for normal tensors of pointers, not tensor pointers. SetVector withSameOrder; withSameOrder.insert(ptr); - if (ptr.getDefiningOp()) + if (refType.isa() && ptr.getDefiningOp()) { for (Operation *op : mlir::multiRootGetSlice(ptr.getDefiningOp())) { for (Value val : op->getResults()) { - if (val.getType() != origType) + if (val.getType() != refTensorType) continue; auto currOrder = argSort(axisInfoAnalysis.getAxisInfo(val)->getContiguity()); @@ -45,32 +91,43 @@ struct CoalescePass : public TritonGPUCoalesceBase { withSameOrder.insert(val); } } - int numElems = product(origType.getShape()); + } + + auto shapePerCTA = triton::gpu::getShapePerCTA(refTensorType); + int numElems = product(shapePerCTA); int numThreads = numWarps * threadsPerWarp; int numElemsPerThread = std::max(numElems / numThreads, 1); + + // For tensor of pointers, the element to access is the pointee type; + // while for tensor pointer type (`refType` is directly the final shape), + // the element to access is itself. + auto typeForMem = refTensorType.getElementType().isa() + ? refTensorType.getElementType() + .cast() + .getPointeeType() + : refTensorType.getElementType(); + // Thread tile size depends on memory alignment - SmallVector sizePerThread(rank, 1); - unsigned elemNumBits = triton::getPointeeBitWidth(origType); + SmallVector sizePerThread(refTensorType.getRank(), 1); + unsigned elemNumBits = typeForMem.getIntOrFloatBitWidth(); unsigned elemNumBytes = std::max(elemNumBits / 8, 1u); unsigned perThread = 1; for (Value val : withSameOrder) { - unsigned maxMultipleBytes = - axisInfoAnalysis.getAxisInfo(val)->getDivisibility(order[0]); + auto valInfo = queryAxisInfo(val); + unsigned maxMultipleBytes = valInfo.getDivisibility(order[0]); unsigned maxMultiple = std::max(maxMultipleBytes / elemNumBytes, 1u); unsigned maxContig = - axisInfoAnalysis.getAxisInfo(val)->getContiguity(order[0]); + std::min(valInfo.getContiguity(order[0]), shapePerCTA[order[0]]); unsigned alignment = std::min(maxMultiple, maxContig); unsigned currPerThread = std::min(alignment, 128 / elemNumBits); perThread = std::max(perThread, currPerThread); } sizePerThread[order[0]] = std::min(perThread, numElemsPerThread); - SmallVector dims(rank); - std::iota(dims.begin(), dims.end(), 0); - // create encoding - Attribute encoding = triton::gpu::BlockedEncodingAttr::get( - &getContext(), origType.getShape(), sizePerThread, order, numWarps, - threadsPerWarp); - return encoding; + + auto CTALayout = triton::gpu::getCTALayout(refTensorType.getEncoding()); + return triton::gpu::BlockedEncodingAttr::get( + &getContext(), refTensorType.getShape(), sizePerThread, order, numWarps, + threadsPerWarp, CTALayout); } std::function @@ -78,40 +135,47 @@ struct CoalescePass : public TritonGPUCoalesceBase { int numWarps, int threadsPerWarp) { Attribute encoding = getCoalescedEncoding(axisInfoAnalysis, ptr, numWarps, threadsPerWarp); - return [encoding](Type _type) { - RankedTensorType type = _type.cast(); - return RankedTensorType::get(type.getShape(), type.getElementType(), - encoding); + return [encoding](Type type) { + RankedTensorType tensorType = type.cast(); + return RankedTensorType::get(tensorType.getShape(), + tensorType.getElementType(), encoding); }; } template void coalesceOp(LayoutMap &layoutMap, Operation *op, Value ptr, OpBuilder builder) { - RankedTensorType ty = ptr.getType().template dyn_cast(); - if (!ty) + if (!layoutMap.count(ptr)) return; + + // Convert operands + // For load/store with tensor pointers, we don't have to change the + // operands' type, we do this by changing the outputs' type of + // `make_tensor_ptr` auto convertType = layoutMap.lookup(ptr); - // convert operands SmallVector newArgs; - for (auto v : op->getOperands()) { - auto vTy = v.getType().dyn_cast(); - if (vTy && !vTy.getEncoding().isa()) + for (auto operand : op->getOperands()) { + auto tensorType = operand.getType().dyn_cast(); + if (tensorType && + !tensorType.getEncoding().isa()) newArgs.push_back(builder.create( - op->getLoc(), convertType(v.getType()), v)); + op->getLoc(), convertType(tensorType), operand)); else - newArgs.push_back(v); + newArgs.push_back(operand); } - // convert output types + + // Convert output types SmallVector newTypes; for (auto t : op->getResultTypes()) { - bool is_async = std::is_same::value; - newTypes.push_back(is_async ? t : convertType(t)); + bool isAsync = std::is_same::value; + newTypes.push_back(isAsync ? t : convertType(t)); } - // construct new op with the new encoding + + // Construct new op with the new encoding Operation *newOp = builder.create(op->getLoc(), newTypes, newArgs, op->getAttrs()); - // cast the results back to the original layout + + // Cast the results back to the original layout for (size_t i = 0; i < op->getNumResults(); i++) { Value newResult = newOp->getResult(i); if (newTypes[i] != op->getResultTypes()[i]) { @@ -123,6 +187,25 @@ struct CoalescePass : public TritonGPUCoalesceBase { op->erase(); } + void coalesceMakeTensorPtrOpResult(LayoutMap &layoutMap, Operation *op, + Value ptr, OpBuilder builder) { + if (!layoutMap.count(ptr)) + return; + + // Convert result type + auto convertType = layoutMap.lookup(ptr); + auto ptrType = ptr.getType().cast(); + auto resultTensorType = convertType(ptrType.getPointeeType()); + auto newResultType = + PointerType::get(resultTensorType, ptrType.getAddressSpace()); + + // Build new operation and replace + Operation *newOp = builder.create( + op->getLoc(), newResultType, op->getOperands(), op->getAttrs()); + op->getResult(0).replaceAllUsesWith(newOp->getResult(0)); + op->erase(); + } + void runOnOperation() override { // Run axis info analysis ModuleOp moduleOp = getOperation(); @@ -145,8 +228,13 @@ struct CoalescePass : public TritonGPUCoalesceBase { ptr = op.getPtr(); if (!ptr) return; - RankedTensorType ty = ptr.getType().template dyn_cast(); - if (!ty || !ty.getElementType().isa()) + // We only convert `tensor>` or `tt.ptr>` load/store + bool isPtrTensor = false, isTensorPointer = false; + if (auto tensorType = ptr.getType().dyn_cast()) + isPtrTensor = tensorType.getElementType().isa(); + if (auto ptrType = ptr.getType().dyn_cast()) + isTensorPointer = ptrType.getPointeeType().isa(); + if (!isPtrTensor && !isTensorPointer) return; auto mod = curr->getParentOfType(); int numWarps = triton::gpu::TritonGPUDialect::getNumWarps(mod); diff --git a/lib/Dialect/TritonGPU/Transforms/DecomposeConversions.cpp b/lib/Dialect/TritonGPU/Transforms/DecomposeConversions.cpp index c44fdefd86f5..598d7502f3cc 100644 --- a/lib/Dialect/TritonGPU/Transforms/DecomposeConversions.cpp +++ b/lib/Dialect/TritonGPU/Transforms/DecomposeConversions.cpp @@ -52,7 +52,9 @@ class TritonGPUDecomposeConversionsPass dstType.getShape(), dstType.getElementType(), triton::gpu::SharedEncodingAttr::get( mod.getContext(), dstDotOp, srcType.getShape(), - triton::gpu::getOrder(srcEncoding), srcType.getElementType())); + triton::gpu::getOrder(srcEncoding), + triton::gpu::getCTALayout(srcEncoding), + srcType.getElementType())); auto tmp = builder.create( cvtOp.getLoc(), tmpType, cvtOp.getOperand()); auto newConvert = builder.create( diff --git a/lib/Dialect/TritonGPU/Transforms/OptimizeDotOperands.cpp b/lib/Dialect/TritonGPU/Transforms/OptimizeDotOperands.cpp index 34bb732e8d5f..aa0e30e18025 100644 --- a/lib/Dialect/TritonGPU/Transforms/OptimizeDotOperands.cpp +++ b/lib/Dialect/TritonGPU/Transforms/OptimizeDotOperands.cpp @@ -56,10 +56,13 @@ class ConvertTransConvert : public mlir::RewritePattern { if (!ZEncoding) return mlir::failure(); // new X encoding + // TODO(Qingyi): need to check whether the CTALayout of XEncoding should be + // used here. For tests where numCTAs = 1, this is not a problem since all + // CTALayouts are the same. auto newXOrder = triton::gpu::getOrder(argEncoding); auto newXEncoding = triton::gpu::SharedEncodingAttr::get( getContext(), ZEncoding, XType.getShape(), newXOrder, - XType.getElementType()); + XEncoding.getCTALayout(), XType.getElementType()); auto newXType = RankedTensorType::get(XType.getShape(), XType.getElementType(), newXEncoding); if (XEncoding == newXEncoding) @@ -143,6 +146,83 @@ class MoveOpAfterLayoutConversion : public mlir::RewritePattern { } }; +// convert(trans(convert(arg))) +// x = convert_layout arg: #distributed -> #shared_x +// y = trans x: #shared_x -> #shared_y +// z = convert_layout y: #shared_y -> #shared_z +class FuseTransHopper : public mlir::RewritePattern { + +public: + FuseTransHopper(mlir::MLIRContext *context) + : mlir::RewritePattern(triton::gpu::ConvertLayoutOp::getOperationName(), + 1, context) {} + + LogicalResult + matchAndRewrite(mlir::Operation *op, + mlir::PatternRewriter &rewriter) const override { + if (!op->hasOneUse()) + return mlir::failure(); + auto dstOp = cast(op); + auto tmpOp = + dyn_cast_or_null(dstOp.getSrc().getDefiningOp()); + if (!tmpOp) + return mlir::failure(); + auto srcOp = dyn_cast_or_null( + tmpOp.getSrc().getDefiningOp()); + if (!srcOp) + return mlir::failure(); + auto arg = srcOp.getSrc(); + auto X = tmpOp.getSrc(); + // types + auto argType = arg.getType().cast(); + auto XType = X.getType().cast(); + auto ZType = dstOp.getResult().getType().cast(); + // encodings + auto argEncoding = argType.getEncoding(); + auto XEncoding = + XType.getEncoding().cast(); + auto ZEncoding = + ZType.getEncoding().dyn_cast(); + if (!ZEncoding) + return mlir::failure(); + // new X encoding + auto newXOrder = triton::gpu::getOrder(argEncoding); + + auto dotOp = *op->getUsers().begin(); + if (isa(dotOp)) { + auto dotTy = dotOp->getResult(0).getType().cast(); + auto dotEncoding = + dotTy.getEncoding().dyn_cast(); + auto eltType = XType.getElementType(); + if (!dotEncoding || dotEncoding.getVersionMajor() != 3) + return mlir::failure(); + // MMAv3 with transpose only supports f16 and bf16 data type + // fallback to MMAv3 without transpose for other data types + if (!eltType.isF16() && !eltType.isBF16()) { + if (dstOp.getResult() == dotOp->getOperand(0)) { + newXOrder = {0, 1}; + } else if (dstOp.getResult() == dotOp->getOperand(1)) { + newXOrder = {1, 0}; + } + } + } + + // TODO(Qingyi): need to check whether the CTALayout of XEncoding should be + // used here. For tests where numCTAs = 1, this is not a problem since all + // CTALayouts are the same. + auto newXEncoding = triton::gpu::SharedEncodingAttr::get( + getContext(), XType.getShape(), newXOrder, XEncoding.getCTALayout(), + XType.getElementType()); + auto newXType = RankedTensorType::get(XType.getShape(), + XType.getElementType(), newXEncoding); + + auto newX = rewriter.create(srcOp.getLoc(), + newXType, arg); + rewriter.replaceOpWithNewOp(dstOp, newX); + return mlir::success(); + } +}; + } // namespace #define GEN_PASS_CLASSES @@ -165,6 +245,7 @@ class TritonGPUOptimizeDotOperandsPass mlir::RewritePatternSet patterns(context); patterns.add(context); patterns.add(context); + patterns.add(context); if (applyPatternsAndFoldGreedily(m, std::move(patterns)).failed()) signalPassFailure(); if (fixupLoops(m).failed()) diff --git a/lib/Dialect/TritonGPU/Transforms/OptimizeEpilogue.cpp b/lib/Dialect/TritonGPU/Transforms/OptimizeEpilogue.cpp new file mode 100644 index 000000000000..ce43ebe49947 --- /dev/null +++ b/lib/Dialect/TritonGPU/Transforms/OptimizeEpilogue.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/IR/Matchers.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Pass/PassManager.h" +#include "mlir/Support/LogicalResult.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "mlir/Transforms/Passes.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonGPU/Transforms/Utility.h" + +using namespace mlir; + +namespace { + +// convert(val) : mma -> blocked +// tt.store(ptr, val, mask, ...) : blocked +// ==> +// convert(ptr) : blocked -> mma +// convert(mask) : blocked -> mma +// tt.store(ptr, val, mask, ...) : mma +// +// Store with mma layout directly +class BypassEpilogueSMEM : public mlir::RewritePattern { + +public: + explicit BypassEpilogueSMEM(mlir::MLIRContext *context) + : mlir::RewritePattern(triton::StoreOp::getOperationName(), 1, context) {} + mlir::LogicalResult + matchAndRewrite(mlir::Operation *op, + mlir::PatternRewriter &rewriter) const override { + + auto stOp = dyn_cast(op); + if (!stOp) + return mlir::failure(); + Value ptr = stOp.getPtr(); + Value val = stOp.getValue(); + Value mask = stOp.getMask(); + auto ptrType = ptr.getType().dyn_cast(); + auto valType = val.getType().dyn_cast(); + if (!ptrType || !valType || + !ptrType.getEncoding().isa() || + !valType.getEncoding().isa()) + return mlir::failure(); + + auto cvtOp = dyn_cast(val.getDefiningOp()); + if (!cvtOp) + return mlir::failure(); + + if (!cvtOp.getSrc() + .getType() + .cast() + .getEncoding() + .isa()) + return mlir::failure(); + + if (!cvtOp.getResult().hasOneUse()) + return mlir::failure(); + + auto newEncoding = + cvtOp.getOperand().getType().cast().getEncoding(); + + auto newVal = cvtOp.getOperand(); + + auto newPtrType = RankedTensorType::get( + ptrType.getShape(), ptrType.getElementType(), newEncoding); + Value newPtr = rewriter.create( + ptr.getLoc(), newPtrType, ptr); + + Value newMask = mask; + if (mask) { + auto maskType = mask.getType().dyn_cast(); + auto newMaskType = RankedTensorType::get( + maskType.getShape(), maskType.getElementType(), newEncoding); + newMask = rewriter.create( + mask.getLoc(), newMaskType, mask); + } + + rewriter.replaceOpWithNewOp( + stOp, newPtr, newVal, newMask, stOp.getCache(), stOp.getEvict()); + return mlir::success(); + } +}; + +} // namespace + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonGPU/Transforms/Passes.h.inc" + +class TritonGPUOptimizeEpiloguePass + : public TritonGPUOptimizeEpilogueBase { + +public: + TritonGPUOptimizeEpiloguePass() = default; + + void runOnOperation() override { + MLIRContext *context = &getContext(); + ModuleOp m = getOperation(); + + mlir::RewritePatternSet patterns(context); + + patterns.add(context); + + if (applyPatternsAndFoldGreedily(m, std::move(patterns)).failed()) { + signalPassFailure(); + } + if (fixupLoops(m).failed()) { + signalPassFailure(); + } + } +}; + +std::unique_ptr mlir::createTritonGPUOptimizeEpiloguePass() { + return std::make_unique(); +} diff --git a/lib/Dialect/TritonGPU/Transforms/Pipeline.cpp b/lib/Dialect/TritonGPU/Transforms/Pipeline.cpp index b337b8a7afd4..db5513d92cfb 100644 --- a/lib/Dialect/TritonGPU/Transforms/Pipeline.cpp +++ b/lib/Dialect/TritonGPU/Transforms/Pipeline.cpp @@ -8,7 +8,10 @@ #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include "triton/Dialect/TritonGPU/Transforms/Passes.h" #include "triton/Dialect/TritonGPU/Transforms/Utility.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Tools/Sys/GetEnv.hpp" #include "llvm/ADT/MapVector.h" +#include "llvm/Support/Debug.h" //===----------------------------------------------------------------------===// // This file implements software pipelining for loops. The implementation here @@ -78,7 +81,10 @@ using llvm::MapVector; using namespace mlir; -namespace ttg = triton::gpu; +namespace tt = mlir::triton; +namespace ttg = mlir::triton::gpu; +/// FIXME(Keren): The pipeline pass shouldn't be aware of nvidia_gpu dialect +namespace ttng = mlir::triton::nvidia_gpu; #define GEN_PASS_CLASSES #include "triton/Dialect/TritonGPU/Transforms/Passes.h.inc" @@ -104,6 +110,19 @@ void addNamedAttrs(Operation *op, DictionaryAttr dictAttrs) { } } +struct ConsumerReleaseInfo { + Value iterVar; + Value stageVar; + Value phaseVar; + Value nextIVVar; + Value stepVar; + Value upperBoundVar; + ttg::CTALayoutAttr CTALayout; + DenseMap consumerStageMap; +}; +typedef DenseMap + ConsumerReleaseMap; + class LoopPipeliner { /// Cache of ForOp and YieldOp related to this pipeliner. scf::ForOp forOp; @@ -122,10 +141,35 @@ class LoopPipeliner { /// load => after extract DenseMap loadsExtract; + /// XXX(Keren): The following are h100 only and disabled + /// load => full barrier arrive + DenseMap loadsBarrierArvOp; + /// load => mbarriers + DenseMap loadsFullBarriers; + DenseMap loadsEmptyBarriers; + /// load => null value or previous load which can share barrier with + DenseMap loadsCanShareBarriers; + /// Maintains the information to emit consumer_release mbarrier_arrive + ConsumerReleaseMap &consumerReleaseMap; + bool hasHopperDot = false; + // XXX(Keren): why the variable name is hopper dot and why do we need this + // check? + void checkHopperDots(SetVector &ops); + // XXX(Keren): it looks more like an optimization to be, not sure if it should + // exist in the base pipeliner + void checkOpShareBarriers(SetVector &ops); + int numLoadsRequireAsyncWait = 0; + int numLoadsRequireMBarrier = 0; + /// Iterator values + Value nextIV; Value pipelineIterIdx; + Value curWaitIdx; + + // Only needed when numLoadsRequireMBarrier > 0 Value loopIterIdx; - Value nextIV; + Value curPhase; + Value curEmptyPhase; /// Yield values SmallVector nextBuffers; @@ -138,9 +182,16 @@ class LoopPipeliner { int numStages; /// Arg indicies - size_t bufferIdx, loadIdx, depArgsBeginIdx, ivIndex; + size_t bufferIdx, loadIdx, depArgsBeginIdx, ivIdx; DenseMap depArgsIdx; + /// XXX(Keren): The mode parameter is hacky, should be refactored + // false: legacy mode as a temporary solution for backward compatibility + // true: new mode for hopper + bool mode; + int numWarps; + int numCTAs; + /// value (in loop) => value at stage N DenseMap> valueMapping; /// loop iter arg => value @@ -204,12 +255,11 @@ class LoopPipeliner { /// Get the load mask for `loadOp`, given the mapped mask `mappedMask` (if /// exists) and the current iteration's `loopCond`. - Value getLoadMask(triton::LoadOp loadOp, Value mappedMask, Value loopCond, + Value getLoadMask(tt::LoadOp loadOp, Value mappedMask, Value loopCond, OpBuilder &builder); /// Return an empty buffer of size - ttg::AllocTensorOp allocateEmptyBuffer(triton::LoadOp loadOp, - OpBuilder &builder); + ttg::AllocTensorOp allocateEmptyBuffer(tt::LoadOp loadOp, OpBuilder &builder); /// Collect all args of the new loop SmallVector collectNewLoopArgs(); @@ -220,15 +270,25 @@ class LoopPipeliner { /// Prefetch the next iteration for `newForOp` void prefetchNextIteration(scf::ForOp newForOp, OpBuilder &builder); + /// Check if curIdx is out of bound and wrap value around if necessary + Value getBoundedIterationValue(OpBuilder &builder, Value curIdx, + Value upperBoundIdx, Value curValue, + Value initValue); + /// Assemble `newForOp`'s yield op void finalizeYield(scf::ForOp newForOp, OpBuilder &builder); public: - LoopPipeliner(scf::ForOp forOp, int numStages) - : forOp(forOp), numStages(numStages) { + LoopPipeliner(scf::ForOp forOp, int numStages, int numWarps, int numCTAs, + bool mode, ConsumerReleaseMap &consumerReleaseMap) + : forOp(forOp), numStages(numStages), numWarps(numWarps), + numCTAs(numCTAs), mode(mode), consumerReleaseMap(consumerReleaseMap) { + // cache yieldOp yieldOp = cast(forOp.getBody()->getTerminator()); } + LoopPipeliner() = delete; + /// Collect loads to pipeline. Return success if we can pipeline this loop LogicalResult initialize(); @@ -252,27 +312,30 @@ LogicalResult LoopPipeliner::collectOps(SetVector &ops) { // We cannot use forOp.walk(...) here because we only want to visit the // operations in the loop body block. Nested blocks are handled separately. for (Operation &op : forOp) - if (auto loadOp = dyn_cast(&op)) { - auto ptr = loadOp.getPtr(); - unsigned vec = axisInfoAnalysis.getPtrContiguity(ptr); - - if (auto mask = loadOp.getMask()) - vec = std::min(vec, axisInfoAnalysis.getMaskAlignment(mask)); - - auto tensorTy = ptr.getType().dyn_cast(); - if (!tensorTy || tensorTy.getRank() < 2) - continue; - auto ty = tensorTy.getElementType() - .cast() - .getPointeeType(); - unsigned width = vec * ty.getIntOrFloatBitWidth(); - // We do not pipeline all loads for the following reasons: - // 1. On nvidia GPUs, cp.async's cp-size can only be 4, 8 and 16. - // 2. It's likely that pipling small loads won't offer much performance - // improvement and may even hurt performance by increasing register - // pressure. - if (width >= 32) + if (auto loadOp = dyn_cast(&op)) { + if (isLoadFromTensorPtr(loadOp)) { ops.insert(loadOp); + } else { + auto ptr = loadOp.getPtr(); + unsigned vec = axisInfoAnalysis.getPtrContiguity(ptr); + if (auto mask = loadOp.getMask()) + vec = + std::min(vec, axisInfoAnalysis.getMaskAlignment(mask)); + + auto tensorTy = ptr.getType().dyn_cast(); + if (!tensorTy || tensorTy.getRank() < 2) + continue; + auto ty = + tensorTy.getElementType().cast().getPointeeType(); + unsigned width = vec * ty.getIntOrFloatBitWidth(); + // We do not pipeline all loads for the following reasons: + // 1. On nvidia GPUs, cp.async's cp-size can only be 4, 8 and 16. + // 2. It's likely that pipling small loads won't offer much performance + // improvement and may even hurt performance by increasing register + // pressure. + if (width >= 32) + ops.insert(loadOp); + } } if (ops.empty()) @@ -324,23 +387,25 @@ LogicalResult LoopPipeliner::checkOpUses(SetVector &ops) { collectDeps(ops, opDeps); for (Operation *op : ops) { - if (auto loadOp = dyn_cast(op)) { + if (auto loadOp = dyn_cast(op)) { // Don't pipeline valid loads that depend on other valid loads // (Because if a valid load depends on another valid load, this load needs // to wait on the other load in the prologue, which is against the point // of the pipeline pass) bool isCandidate = true; for (Operation *other : ops) - if (isa(other)) + if (isa(other)) if (opDeps[op].contains(other->getResult(0))) { isCandidate = false; break; } // We only pipeline loads that have one covert_layout (to dot_op) use // TODO: lift this constraint in the future - if (isCandidate && loadOp.getResult().hasOneUse()) { + if (isCandidate && loadOp.getResult().hasOneUse() && + !isLoadFromTensorPtr(loadOp)) { isCandidate = false; Operation *use = *loadOp.getResult().getUsers().begin(); + Operation *preUse = nullptr; // Advance to the first conversion as long as the use resides in shared // memory and it has a single use itself @@ -351,10 +416,11 @@ LogicalResult LoopPipeliner::checkOpUses(SetVector &ops) { use->getResult(0).getType().dyn_cast(); if (!tensorType.getEncoding().isa()) break; + preUse = use; use = *use->getResult(0).getUsers().begin(); } - if (auto convertLayout = llvm::dyn_cast(use)) + if (auto convertLayout = llvm::dyn_cast(use)) { if (auto tensorType = convertLayout.getResult() .getType() .dyn_cast()) @@ -363,13 +429,43 @@ LogicalResult LoopPipeliner::checkOpUses(SetVector &ops) { isCandidate = true; loadsMapping[loadOp] = convertLayout; } + } else if (preUse && isa(use)) { + isCandidate = false; + // for MMAv3 whose dot take SharedEncoding as operands directly + Operation *post = *loadOp.getResult().getUsers().begin(); + auto newOrder = post->getResult(0) + .getType() + .cast() + .getEncoding() + .cast() + .getOrder(); + auto ty = loadOp.getType().cast(); + auto oldOrder = ttg::getOrder(ty.getEncoding()); + // The operand of MMAv3 is in SharedEncoding and it's order should not + // be changed after FuseTranspositions Pass. So we only pipeline the + // load if the order of the loaded BlockedEncoding is the same as the + // order of the SharedEncoding it is converted to. + // TODO: remove this constraint once the LoadOp supports transpose + // fusion + if (newOrder[0] == oldOrder[0] || newOrder[1] == oldOrder[1]) { + isCandidate = true; + loadsMapping[loadOp] = preUse->getResult(0); + } + } + } else if (isCandidate && mode && isLoadFromTensorPtr(loadOp)) { + loadsMapping[loadOp] = loadOp.getResult(); } else isCandidate = false; if (!isCandidate) invalidOps.insert(loadOp); - else + else { validLoads.insert(loadOp); + if (!isLoadFromTensorPtr(loadOp)) + numLoadsRequireAsyncWait++; + else + numLoadsRequireMBarrier++; + } } } @@ -382,6 +478,67 @@ LogicalResult LoopPipeliner::checkOpUses(SetVector &ops) { return success(); } +void LoopPipeliner::checkHopperDots(SetVector &ops) { + // dots to be pipelined + SetVector dots; + for (Operation &op : forOp) { + if (auto dotOp = dyn_cast(&op)) { + auto resTy = dotOp.getResult().getType().dyn_cast(); + if (auto resEnc = resTy.getEncoding().dyn_cast()) { + if (resEnc && resEnc.isHopper()) { + // Don't pipeline valid dots that depend on ops other than scf.yield + // and scf.for + auto dot = dotOp.getResult(); + bool valid = true; + + // all users of dot should be scf.yield + if (!dot.hasOneUse()) + valid = false; + if (!isa(*dot.getUsers().begin())) + valid = false; + + // C should be a block argument + auto CArg = dotOp.getOperand(2).dyn_cast(); + if (!CArg || !CArg.hasOneUse()) + valid = false; + + if (valid) + dots.insert(dotOp); + } + } + } + } + + hasHopperDot = true; +} + +void LoopPipeliner::checkOpShareBarriers(SetVector &ops) { + // Check if loads can share barriers + auto canShare = [&](Value load0, Value load1) -> bool { + if (!load0.hasOneUse() || !load1.hasOneUse()) + return false; + auto use0 = *load0.getUsers().begin(); + auto use1 = *load1.getUsers().begin(); + if (!use0->hasOneUse() || !use1->hasOneUse()) + return false; + if (*use0->getUsers().begin() != *use1->getUsers().begin()) + return false; + return true; + }; + // XXX(Keren): the logic here is pretty weird and might be incomplete + for (Value loadOp : validLoads) { + Value depLoad; + for (auto oldPair : loadsCanShareBarriers) { + Value oldLoad = oldPair.first; + if (canShare(loadOp, oldLoad)) { + depLoad = oldLoad; + break; + } + } + loadsCanShareBarriers[loadOp] = depLoad; + } +} + void LoopPipeliner::checkOpDeps(SetVector &ops) { SetVector nonImmediateDepArgs; SetVector nonImmediateOps; @@ -413,9 +570,8 @@ void LoopPipeliner::checkOpDeps(SetVector &ops) { } } - // XXX: We could remove the following constraints if we can rematerialize in - // the loop. - // Check if immediateDepArgs and nonImmediateDepArgs are disjoint. + // We could remove the following constraints if we can rematerialize in the + // loop. Check if immediateDepArgs and nonImmediateDepArgs are disjoint. for (auto &[arg, stages] : immediateArgStages) { assert(stages.size() == 1 && "Triton doesn't support an argument provides values for " @@ -485,18 +641,28 @@ void LoopPipeliner::createBufferTypes() { for (auto loadCvt : loadsMapping) { auto loadOp = loadCvt.first; Value cvt = loadCvt.second; - auto dotOpEnc = cvt.getType() - .cast() - .getEncoding() - .cast(); auto ty = loadOp.getType().cast(); SmallVector bufferShape(ty.getShape().begin(), ty.getShape().end()); bufferShape.insert(bufferShape.begin(), numStages); - unsigned bitWidth = ty.getElementType().getIntOrFloatBitWidth(); - auto sharedEnc = - ttg::SharedEncodingAttr::get(ty.getContext(), dotOpEnc, ty.getShape(), - ttg::getOrder(ty.getEncoding()), bitWidth); + auto CTALayout = ttg::getCTALayout(ty.getEncoding()); + Attribute sharedEnc; + if (auto dotOpEnc = cvt.getType() + .cast() + .getEncoding() + .dyn_cast()) { + // MMAv1 and MMAv2 + unsigned bitWidth = ty.getElementType().getIntOrFloatBitWidth(); + sharedEnc = ttg::SharedEncodingAttr::get( + ty.getContext(), dotOpEnc, ty.getShape(), + ttg::getOrder(ty.getEncoding()), CTALayout, bitWidth); + } else { + // MMAv3 + sharedEnc = ttg::SharedEncodingAttr::get(ty.getContext(), ty.getShape(), + ttg::getOrder(ty.getEncoding()), + CTALayout, ty.getElementType()); + } + // FIXME(Keren): block ptr not handled loadsBufferType[loadOp] = RankedTensorType::get(bufferShape, ty.getElementType(), sharedEnc); } @@ -525,7 +691,7 @@ int LoopPipeliner::getValueDefStage(Value v, int stage) { return stage; } -ttg::AllocTensorOp LoopPipeliner::allocateEmptyBuffer(triton::LoadOp loadOp, +ttg::AllocTensorOp LoopPipeliner::allocateEmptyBuffer(tt::LoadOp loadOp, OpBuilder &builder) { // Allocate a buffer for each pipelined tensor // shape: e.g. (numStages==4), <32x64xbf16> -> <4x32x64xbf16> @@ -546,6 +712,11 @@ LogicalResult LoopPipeliner::initialize() { if (checkOpUses(ops).failed()) return failure(); + // XXX(Keren): hopper specific, should be cleaned up + checkHopperDots(ops); + + checkOpShareBarriers(ops); + checkOpDeps(ops); createBufferTypes(); @@ -555,21 +726,21 @@ LogicalResult LoopPipeliner::initialize() { return success(); } -Value LoopPipeliner::getLoadMask(triton::LoadOp loadOp, Value mappedMask, +Value LoopPipeliner::getLoadMask(tt::LoadOp loadOp, Value mappedMask, Value loopCond, OpBuilder &builder) { - Type maskType = triton::getI1SameShape(loadOp.getType()); + Type maskType = tt::getI1SameShape(loadOp.getType()); Value mask = loadOp.getMask(); Value newMask; if (mask) { Value cond = loopCond; if (isa(maskType)) { - cond = builder.create(mask.getLoc(), maskType, loopCond); + cond = builder.create(mask.getLoc(), maskType, loopCond); } newMask = builder.create(mask.getLoc(), mappedMask, cond); } else { if (isa(maskType)) { - newMask = builder.create(loopCond.getLoc(), maskType, - loopCond); + newMask = + builder.create(loopCond.getLoc(), maskType, loopCond); } else { newMask = loopCond; } @@ -585,7 +756,53 @@ void LoopPipeliner::emitPrologue() { setValueMapping(arg, operand.get(), 0); } - // Emit prologue from [0, numStage-1) + // Alloc a vector of MBarriers in size numStages for each load to be pipelined + bool isMcast = false; + for (Value loadOp : validLoads) { + auto load = cast(loadOp.getDefiningOp()); + if (isLoadFromTensorPtr(load)) { + auto loadTy = loadOp.getType().cast(); + auto CTALayout = ttg::CTALayoutAttr::get( + load.getContext(), + /*CTAsPerCGA*/ {static_cast(numCTAs)}, + /*CTASplitNum*/ {1}, + /*CTAOrder*/ {0}); + auto sharedEncoding = ttg::SharedEncodingAttr::get( + load.getContext(), 1, 1, 1, {0}, CTALayout, false); + auto mBarriersTy = RankedTensorType::get( + {numStages}, builder.getIntegerType(64), sharedEncoding); + + if (!loadsCanShareBarriers[loadOp]) { + Value fullBarriers = builder.create( + load.getLoc(), mBarriersTy, 1); + loadsFullBarriers[loadOp] = fullBarriers; + } + auto layout = loadTy.getEncoding(); + auto CTASplitNum = ttg::getCTASplitNum(layout); + auto CTAsPerCGA = ttg::getCTAsPerCGA(layout); + if (CTASplitNum != CTAsPerCGA) { + isMcast = true; + // FIXME: numConsumerThreads could be 32 as well instead of 128 + // incase the consumer is not GMMA + unsigned arriveCnt = ttg::getNumWarpsPerCTA(layout); + if (hasHopperDot) + arriveCnt /= 4; + arriveCnt *= + product(CTAsPerCGA) / product(CTASplitNum); + + Value emptyBarriers = builder.create( + load.getLoc(), mBarriersTy, arriveCnt); + loadsEmptyBarriers[loadOp] = emptyBarriers; + } + } + } + + if (isMcast) { + builder.create(forOp.getLoc(), /*relaxed*/ 1); + builder.create(forOp.getLoc()); + } + + // prologue from [0, numStage-1) Value iv = forOp.getLowerBound(); pipelineIterIdx = builder.create(iv.getLoc(), 0, 32); for (int stage = 0; stage < numStages - 1; ++stage) { @@ -600,33 +817,99 @@ void LoopPipeliner::emitPrologue() { for (Operation *op : orderedDeps) { Operation *newOp = nullptr; if (validLoads.contains(op->getResult(0))) { - auto load = cast(op); + auto load = cast(op); // Allocate empty buffer if (stage == 0) { loadsBuffer[load] = allocateEmptyBuffer(load, builder); loadStageBuffer[load] = {loadsBuffer[load]}; } // load => copy async - if (auto loadOp = llvm::dyn_cast(op)) { + if (auto loadOp = llvm::dyn_cast(op)) { Value newMask = getLoadMask(loadOp, lookupOrDefault(loadOp.getMask(), stage), loopCond, builder); - newOp = builder.create( - op->getLoc(), loadsBuffer[loadOp].getType(), - lookupOrDefault(loadOp.getPtr(), stage), - loadStageBuffer[loadOp][stage], pipelineIterIdx, newMask, - lookupOrDefault(loadOp.getOther(), stage), loadOp.getCache(), - loadOp.getEvict(), loadOp.getIsVolatile(), /*axis*/ 0); - builder.create(op->getLoc()); + + if (mode && isLoadFromTensorPtr(loadOp)) { + auto loc = op->getLoc(); + auto mBarTy = tt::PointerType::get(builder.getIntegerType(64), 3); + Value stageVal = + builder.create(loc, stage, 32); + // producer_acquire + if (loadsEmptyBarriers.count(loadOp)) { + Value emptyBarrier = builder.create( + loc, mBarTy, loadsEmptyBarriers[loadOp], stageVal); + auto trueVal = + builder.create(loc, 1, /*bitWidth*/ 1); + builder.create(loc, emptyBarrier, trueVal); + } + + // producer_commit + Value fullBarrier; + if (!loadsCanShareBarriers[loadOp]) { + fullBarrier = builder.create( + loc, mBarTy, loadsFullBarriers[loadOp], stageVal); + loadsExtract[loadOp] = fullBarrier; + } else { + // Reuse the barrier from previouse load. + fullBarrier = loadsExtract[loadsCanShareBarriers[loadOp]]; + } + + auto loadTy = loadOp.getType().dyn_cast(); + assert(loadTy); + auto CTASplitNum = ttg::getCTASplitNum(loadTy.getEncoding()); + auto shapePerSlice = + ttg::getShapePerCTA(CTASplitNum, loadTy.getShape()); + unsigned elems = + std::accumulate(shapePerSlice.begin(), shapePerSlice.end(), 1, + std::multiplies{}); + elems *= (loadTy.getElementType().getIntOrFloatBitWidth() / 8); + + if (!loadsCanShareBarriers[loadOp]) { + Value _0 = builder.create(loc, 0, 32); + Value threadId = builder.create(loc); + Value pred = builder.create( + loc, arith::CmpIPredicate::eq, threadId, _0); + pred = builder.create(loc, pred, loopCond); + Operation *barrierArvOp = builder.create( + loc, fullBarrier, pred, + /*remoteCtaId*/ nullptr, /*trackAsyncOp*/ false, elems); + loadsBarrierArvOp[loadOp] = barrierArvOp; + } else { + // Increase the transcnt for barrier of previouse load by the + // bytes of current load. + Operation *barrierArvOp = + loadsBarrierArvOp[loadsCanShareBarriers[loadOp]]; + unsigned base_elems = + barrierArvOp->getAttr("txCount").cast().getInt(); + barrierArvOp->setAttr("txCount", + IntegerAttr::get(builder.getIntegerType(32), + base_elems + elems)); + } + newOp = builder.create( + loc, loadsBuffer[loadOp].getType(), + lookupOrDefault(loadOp.getPtr(), stage), + loadStageBuffer[loadOp][stage], pipelineIterIdx, fullBarrier, + newMask, lookupOrDefault(loadOp.getOther(), stage), + loadOp.getCache(), loadOp.getEvict(), loadOp.getIsVolatile(), + /*axis*/ 0); + } else { + newOp = builder.create( + op->getLoc(), loadsBuffer[loadOp].getType(), + lookupOrDefault(loadOp.getPtr(), stage), + loadStageBuffer[loadOp][stage], pipelineIterIdx, newMask, + lookupOrDefault(loadOp.getOther(), stage), loadOp.getCache(), + loadOp.getEvict(), loadOp.getIsVolatile(), /*axis*/ 0); + builder.create(op->getLoc()); + } loadStageBuffer[loadOp].push_back(newOp->getResult(0)); } else llvm_unreachable("This should be LoadOp"); } else { - if (auto loadOp = dyn_cast(op)) { + if (auto loadOp = dyn_cast(op)) { Value newMask = getLoadMask(loadOp, lookupOrDefault(loadOp.getMask(), stage), loopCond, builder); - newOp = builder.create( + newOp = builder.create( loadOp.getLoc(), loadOp.getResult().getType(), lookupOrDefault(loadOp.getPtr(), stage), newMask, lookupOrDefault(loadOp.getOther(), stage), @@ -667,9 +950,9 @@ void LoopPipeliner::emitPrologue() { } // for (int stage = 0; stage < numStages - 1; ++stage) // async.wait & extract_slice - builder.create(validLoads.front().getLoc(), - validLoads.size() * (numStages - 2)); - loopIterIdx = builder.create(iv.getLoc(), 0, 32); + if (numLoadsRequireAsyncWait > 0) + builder.create(validLoads.front().getLoc(), + validLoads.size() * (numStages - 2)); for (Value loadOp : validLoads) { auto bufferType = loadStageBuffer[loadOp][numStages - 1] .getType() @@ -688,19 +971,20 @@ void LoopPipeliner::emitPrologue() { SmallVector{int_attr(1), int_attr(1), int_attr(1)}); loadsExtract[loadOp] = extractSlice; } - // Bump up loopIterIdx, this is used for getting the correct slice for the - // `next` iteration - loopIterIdx = builder.create( - loopIterIdx.getLoc(), loopIterIdx, - builder.create(loopIterIdx.getLoc(), 1, 32)); + curWaitIdx = builder.create(iv.getLoc(), 0, 32); + loopIterIdx = builder.create(iv.getLoc(), 0, 32); + curPhase = builder.create(iv.getLoc(), 0, 1); + curEmptyPhase = builder.create(iv.getLoc(), 1, 1); } void LoopPipeliner::emitEpilogue() { // If there's any outstanding async copies, we need to wait for them. - OpBuilder builder(forOp); - OpBuilder::InsertionGuard g(builder); - builder.setInsertionPointAfter(forOp); - builder.create(forOp.getLoc(), 0); + if (numLoadsRequireAsyncWait > 0) { + OpBuilder builder(forOp); + OpBuilder::InsertionGuard g(builder); + builder.setInsertionPointAfter(forOp); + builder.create(forOp.getLoc(), 0); + } } SmallVector LoopPipeliner::collectNewLoopArgs() { @@ -714,6 +998,9 @@ SmallVector LoopPipeliner::collectNewLoopArgs() { // (iv at stage numStages - 2) // (pipeline iteration index) // (loop iteration index) + // (wait index) + // (phase index) + // (empty phase index) // We need this to update operands for yield // original block arg => new arg's idx @@ -739,10 +1026,16 @@ SmallVector LoopPipeliner::collectNewLoopArgs() { newLoopArgs.push_back(valueMapping[depArg][numStages - 1]); } - ivIndex = newLoopArgs.size(); + ivIdx = newLoopArgs.size(); newLoopArgs.push_back(valueMapping[forOp.getInductionVar()][numStages - 2]); newLoopArgs.push_back(pipelineIterIdx); - newLoopArgs.push_back(loopIterIdx); + newLoopArgs.push_back(curWaitIdx); + if (numLoadsRequireMBarrier > 0) { + newLoopArgs.push_back(loopIterIdx); + newLoopArgs.push_back(curPhase); + newLoopArgs.push_back(curEmptyPhase); + } + return newLoopArgs; } @@ -759,34 +1052,140 @@ scf::ForOp LoopPipeliner::cloneForOp(ArrayRef newLoopArgs, mapping.map(arg.value(), newForOp.getRegionIterArgs()[arg.index()]); mapping.map(forOp.getInductionVar(), newForOp.getInductionVar()); + // Loop iteration args + Value upperBound = newForOp.getUpperBound(); + Value step = newForOp.getStep(); + Value curIV = newForOp.getRegionIterArgs()[ivIdx]; + pipelineIterIdx = newForOp.getRegionIterArgs()[ivIdx + 1]; + curWaitIdx = newForOp.getRegionIterArgs()[ivIdx + 2]; + if (numLoadsRequireMBarrier > 0) { + loopIterIdx = newForOp.getRegionIterArgs()[ivIdx + 3]; + curPhase = newForOp.getRegionIterArgs()[ivIdx + 4]; + curEmptyPhase = newForOp.getRegionIterArgs()[ivIdx + 5]; + } + // Clone the loop body, replace original args with args of the new ForOp. - // We want to find cvt ops that match the following pattern: - // %0 = load %ptr - // %1 (dotOperand) = cvt %0 + SmallVector loadsFromTensorPtr; for (Operation &op : forOp.getBody()->without_terminator()) { - if (auto cvtOp = dyn_cast(op)) { + if (auto cvtOp = dyn_cast(op)) { auto result = op.getResult(0); auto cvtDstTy = result.getType().cast(); - if (cvtDstTy.getEncoding().isa()) { - auto it = - std::find(validLoads.begin(), validLoads.end(), op.getOperand(0)); - if (it != validLoads.end()) { + auto it = + std::find(validLoads.begin(), validLoads.end(), op.getOperand(0)); + if (it != validLoads.end()) { + auto loadArgIdx = std::distance(validLoads.begin(), it); + if (cvtDstTy.getEncoding().isa()) { + // We want to find cvt ops that match the following pattern: + // %0 = load %ptr + // %1 (dotOperand) = cvt %0 // We replace the use new load use with a convert layout - auto loadArgIdx = std::distance(validLoads.begin(), it); auto cvt = builder.create( result.getLoc(), cvtDstTy, newForOp.getRegionIterArgs()[loadIdx + loadArgIdx]); mapping.map(result, cvt.getResult()); continue; + } else if (cvtDstTy.getEncoding().isa()) { + // We want to find cvt ops that match the following pattern: + // %0 = load %ptr + // %1 (sharedEncoding) = cvt %0 + // We replace the use new load use with insert_slice_async's result + mapping.map(result, + newForOp.getRegionIterArgs()[loadIdx + loadArgIdx]); + continue; + } + } + } else if (auto loadOp = dyn_cast(op)) { + if (isLoadFromTensorPtr(loadOp)) { + // XXX(Keren): The comparison operator using std::find on tensor ptr + // doesn't work as expected + auto operand = loadOp.getPtr(); + auto tensorTy = + operand.getType().cast().getPointeeType(); + auto loadArgIdx = 0; + for (auto validLoad : validLoads) { + auto defOp = cast(validLoad.getDefiningOp()); + if (isLoadFromTensorPtr(defOp)) { + auto validOperand = defOp.getOperand(0); + auto validTensorTy = + validOperand.getType().cast().getPointeeType(); + if (tensorTy == validTensorTy) + break; + } + loadArgIdx++; } + // consumer_wait, emitted before the first consumer + auto firstConsumer = getFirstUser(loadOp); + mapping.map(loadOp, newForOp.getRegionIterArgs()[loadIdx + loadArgIdx]); + + // If current load can reuse barriers shared by previous load, then we + // do nothing. + if (!loadsCanShareBarriers[loadOp]) { + // emit mbarrier wait before the first consumer of the loaD + OpBuilder mBarBuilder(firstConsumer); + auto mBarTy = tt::PointerType::get(builder.getIntegerType(64), 3); + Value fullBarrier = mBarBuilder.create( + loadOp.getLoc(), mBarTy, loadsFullBarriers[loadOp], curWaitIdx); + mBarBuilder.create(loadOp.getLoc(), fullBarrier, + curPhase); + } + + loadsFromTensorPtr.push_back(loadOp); + continue; } } cloneWithInferType(builder, &op, mapping); } + for (Value load : loadsFromTensorPtr) { + // consumer_relase, emitted after the last consumer + // 'the last consumer' might be updated in the following Phase_1 since + // some of the consumers might be pipelined. Thus we maintain this + // information in 'consumerReleaseMap' and move the position of + // consumer_release barrier in a seperate Phase_2 in case necessary. + if (loadsEmptyBarriers.count(load)) { + auto users = mapping.lookup(load).getUsers(); + DenseMap consumerStageMap; + for (Operation *user : users) { + // All the stage is initialized to zero before Phase_1, + // since no consumers has been pipelined yet. + consumerStageMap[user] = 0; + } + auto CTALayout = ttg::getCTALayout( + load.getType().cast().getEncoding()); + ConsumerReleaseInfo info{ + loopIterIdx, pipelineIterIdx, curEmptyPhase, curIV, + step, upperBound, CTALayout, consumerStageMap}; + consumerReleaseMap[loadsEmptyBarriers[load]] = info; + } + } + + // Remove redundant conversions + // e.g., %145 = triton_gpu.convert_layout %arg15 : (tensor<128x64xf16, + // #shared1>) -> tensor<128x64xf16, #shared1> + for (Operation &op : newForOp.getBody()->without_terminator()) { + if (auto convert_layout = dyn_cast(op)) { + auto result = op.getResult(0); + auto cvtDstTy = result.getType(); + auto operand = convert_layout.getOperand(); + auto tensorTy = operand.getType(); + if (cvtDstTy == tensorTy) + result.replaceAllUsesWith(operand); + } + } + return newForOp; } +Value LoopPipeliner::getBoundedIterationValue(OpBuilder &builder, Value curIdx, + Value upperBoundIdx, + Value curValue, Value initValue) { + Value cond = builder.create( + curIdx.getLoc(), arith::CmpIPredicate::uge, curIdx, upperBoundIdx); + Value selectValue = builder.create( + curIdx.getLoc(), cond, initValue, curValue); + return selectValue; +} + void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, OpBuilder &builder) { // Map the dep args of the next iteration to the dep args of the current @@ -798,22 +1197,36 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, ++argIdx; } + // Update loop iteration args + Value curIV = newForOp.getRegionIterArgs()[ivIdx]; + pipelineIterIdx = newForOp.getRegionIterArgs()[ivIdx + 1]; + curWaitIdx = newForOp.getRegionIterArgs()[ivIdx + 2]; + if (numLoadsRequireMBarrier > 0) { + loopIterIdx = newForOp.getRegionIterArgs()[ivIdx + 3]; + curPhase = newForOp.getRegionIterArgs()[ivIdx + 4]; + curEmptyPhase = newForOp.getRegionIterArgs()[ivIdx + 5]; + } + // Special handling for iv & loop condition - Value curIV = newForOp.getRegionIterArgs()[ivIndex]; - nextIV = builder.create(newForOp.getInductionVar().getLoc(), - curIV, newForOp.getStep()); - Value nextLoopCond = - builder.create(nextIV.getLoc(), arith::CmpIPredicate::slt, - nextIV, newForOp.getUpperBound()); - - pipelineIterIdx = newForOp.getRegionIterArgs()[ivIndex + 1]; - Value insertSliceIndex = builder.create( - nextIV.getLoc(), pipelineIterIdx, - builder.create(nextIV.getLoc(), numStages, 32)); - loopIterIdx = newForOp.getRegionIterArgs()[ivIndex + 2]; - Value extractSliceIndex = builder.create( - nextIV.getLoc(), loopIterIdx, - builder.create(nextIV.getLoc(), numStages, 32)); + auto idxLoc = curIV.getLoc(); + nextIV = builder.create(idxLoc, curIV, newForOp.getStep()); + Value nextLoopCond = builder.create( + idxLoc, arith::CmpIPredicate::slt, nextIV, newForOp.getUpperBound()); + + // Constants + Value _0 = builder.create(idxLoc, 0, 32); + Value _1 = builder.create(idxLoc, 1, 32); + Value numStagesVal = + builder.create(idxLoc, numStages, 32); + + // nextWaitIdx + Value waitIdxPlusOne = builder.create(idxLoc, curWaitIdx, _1); + Value nextWaitIdx = getBoundedIterationValue( + builder, waitIdxPlusOne, numStagesVal, waitIdxPlusOne, _0); + + // Indices of InsertSliceAsyncOp and ExtractSliceOp + Value insertSliceIndex = pipelineIterIdx; + Value extractSliceIndex = nextWaitIdx; // Prefetch load deps // If a load-dependent instruction that uses a block argument, we @@ -841,11 +1254,11 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, else curMapping.map(forOp.getInductionVar(), nextIV); Operation *nextOp; - if (auto loadOp = dyn_cast(op)) { + if (auto loadOp = dyn_cast(op)) { auto newMask = getLoadMask(loadOp, curMapping.lookupOrDefault(loadOp.getMask()), nextLoopCond, builder); - nextOp = builder.create( + nextOp = builder.create( loadOp.getLoc(), loadOp.getResult().getType(), curMapping.lookupOrDefault(loadOp.getPtr()), newMask, curMapping.lookupOrDefault(loadOp.getOther()), @@ -870,7 +1283,7 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, Operation *nextOp = nullptr; // Update loading mask if (validLoads.contains(op->getResult(0))) { - auto loadOp = llvm::cast(op); + auto loadOp = llvm::cast(op); auto mask = loadOp.getMask(); auto newMask = getLoadMask(loadOp, nextMapping.lookupOrDefault(loadOp.getMask()), @@ -879,20 +1292,87 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, // If mask is defined outside the loop, don't update the map more than // once if (!(forOp.isDefinedOutsideOfLoop(mask) && nextMapping.contains(mask))) - nextMapping.map(loadOp.getMask(), newMask); - newMask = nextMapping.lookupOrDefault(mask); + nextMapping.map(mask, newMask); + newMask = nextMapping.lookupOrDefault(loadOp.getMask()); + } + Value insertedVal; + if (mode && isLoadFromTensorPtr(loadOp)) { + auto loc = op->getLoc(); + auto mBarTy = tt::PointerType::get(builder.getIntegerType(64), 3); + + // producer_acquire + if (loadsEmptyBarriers.count(loadOp)) { + auto ifOp = builder.create(loc, ArrayRef{}, + nextLoopCond, false); + builder.setInsertionPointToStart(ifOp.thenBlock()); + Value emptyBarrier = builder.create( + loc, mBarTy, loadsEmptyBarriers[loadOp], insertSliceIndex); + builder.create(loc, emptyBarrier, + curEmptyPhase); + builder.setInsertionPointAfter(ifOp); + } + + // producer_commit + Value fullBarrier; + if (!loadsCanShareBarriers[loadOp]) { + fullBarrier = builder.create( + loc, mBarTy, loadsFullBarriers[loadOp], insertSliceIndex); + loadsExtract[loadOp] = fullBarrier; + } else { + // Reuse the barrier from previouse load. + fullBarrier = loadsExtract[loadsCanShareBarriers[loadOp]]; + } + + auto loadTy = loadOp.getType().dyn_cast(); + assert(loadTy); + auto CTASplitNum = ttg::getCTASplitNum(loadTy.getEncoding()); + auto shapePerSlice = + ttg::getShapePerCTA(CTASplitNum, loadTy.getShape()); + unsigned elems = std::accumulate( + shapePerSlice.begin(), shapePerSlice.end(), 1, std::multiplies{}); + elems *= (loadTy.getElementType().getIntOrFloatBitWidth() / 8); + if (!loadsCanShareBarriers[loadOp]) { + Value _0 = builder.create(loc, 0, 32); + Value threadId = builder.create(loc); + Value pred = builder.create( + loc, arith::CmpIPredicate::eq, threadId, _0); + pred = builder.create(loc, pred, nextLoopCond); + Operation *barrierArvOp = builder.create( + loc, fullBarrier, pred, + /*remoteCtaId*/ nullptr, + /*trackAsyncOp*/ false, elems); + loadsBarrierArvOp[loadOp] = barrierArvOp; + } else { + // Increase the transcnt for barrier of previouse load by the bytes of + // current load. + Operation *barrierArvOp = + loadsBarrierArvOp[loadsCanShareBarriers[loadOp]]; + unsigned base_elems = + barrierArvOp->getAttr("txCount").cast().getInt(); + barrierArvOp->setAttr( + "txCount", + IntegerAttr::get(builder.getIntegerType(32), base_elems + elems)); + } + insertedVal = builder.create( + loc, loadsBuffer[loadOp].getType(), + nextMapping.lookupOrDefault(loadOp.getPtr()), + newForOp.getRegionIterArgs()[bufferIdx + nextBuffers.size()], + insertSliceIndex, fullBarrier, newMask, + nextMapping.lookupOrDefault(loadOp.getOther()), loadOp.getCache(), + loadOp.getEvict(), loadOp.getIsVolatile(), /*axis*/ 0); + } else { + insertedVal = builder.create( + op->getLoc(), loadsBuffer[loadOp].getType(), + nextMapping.lookupOrDefault(loadOp.getPtr()), + newForOp.getRegionIterArgs()[bufferIdx + nextBuffers.size()], + insertSliceIndex, newMask, + nextMapping.lookupOrDefault(loadOp.getOther()), loadOp.getCache(), + loadOp.getEvict(), loadOp.getIsVolatile(), /*axis*/ 0); + builder.create(op->getLoc()); } - Value insertAsyncOp = builder.create( - op->getLoc(), loadsBuffer[loadOp].getType(), - nextMapping.lookupOrDefault(loadOp.getPtr()), - newForOp.getRegionIterArgs()[bufferIdx + nextBuffers.size()], - insertSliceIndex, newMask, - nextMapping.lookupOrDefault(loadOp.getOther()), loadOp.getCache(), - loadOp.getEvict(), loadOp.getIsVolatile(), /*axis*/ 0); - builder.create(op->getLoc()); - nextBuffers.push_back(insertAsyncOp); + nextBuffers.push_back(insertedVal); // Extract slice - auto bufferType = insertAsyncOp.getType().cast(); + auto bufferType = insertedVal.getType().cast(); auto bufferShape = bufferType.getShape(); auto sliceType = loadsMapping[loadOp].getType().cast(); sliceType = RankedTensorType::get({bufferShape[1], bufferShape[2]}, @@ -900,7 +1380,7 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, loadsBufferType[loadOp].getEncoding()); nextOp = builder.create( - op->getLoc(), sliceType, insertAsyncOp, + op->getLoc(), sliceType, insertedVal, SmallVector{extractSliceIndex, int_attr(0), int_attr(0)}, SmallVector{int_attr(1), @@ -923,20 +1403,43 @@ void LoopPipeliner::prefetchNextIteration(scf::ForOp newForOp, newForOp.getRegionIterArgs()[depArgsIdx[arg]]); // async.wait & extract_slice - Operation *asyncWait = builder.create( - validLoads[0].getLoc(), validLoads.size() * (numStages - 2)); - for (auto it = extractSlices.rbegin(); it != extractSlices.rend(); ++it) { - // move extract_slice after asyncWait - it->getDefiningOp()->moveAfter(asyncWait); - } - - // Bump iteration count - pipelineIterIdx = builder.create( - nextIV.getLoc(), pipelineIterIdx, - builder.create(nextIV.getLoc(), 1, 32)); - loopIterIdx = builder.create( - nextIV.getLoc(), loopIterIdx, - builder.create(nextIV.getLoc(), 1, 32)); + if (numLoadsRequireAsyncWait > 0) { + Operation *asyncWait = builder.create( + validLoads[0].getLoc(), validLoads.size() * (numStages - 2)); + for (auto it = extractSlices.rbegin(); it != extractSlices.rend(); ++it) { + // move extract_slice after asyncWait + it->getDefiningOp()->moveAfter(asyncWait); + } + } + + // Bump pipelineIterIdx + Value pipelineIterIdxPlusOne = + builder.create(idxLoc, pipelineIterIdx, _1); + pipelineIterIdx = + getBoundedIterationValue(builder, pipelineIterIdxPlusOne, numStagesVal, + pipelineIterIdxPlusOne, _0); + + // Bump curWaitIdx + curWaitIdx = nextWaitIdx; + + if (numLoadsRequireMBarrier > 0) { + // Bump loopIterIdx + loopIterIdx = builder.create(idxLoc, loopIterIdx, _1); + + Value _1_1b = builder.create(idxLoc, 1, 1); + + // Flip curPhase + Value nextPhase = builder.create(idxLoc, curPhase, _1_1b); + curPhase = getBoundedIterationValue(builder, waitIdxPlusOne, numStagesVal, + curPhase, nextPhase); + + // Flip curEmptyPhase + Value nextEmptyPhase = + builder.create(idxLoc, curEmptyPhase, _1_1b); + curEmptyPhase = + getBoundedIterationValue(builder, pipelineIterIdxPlusOne, numStagesVal, + curEmptyPhase, nextEmptyPhase); + } } void LoopPipeliner::finalizeYield(scf::ForOp newForOp, OpBuilder &builder) { @@ -948,14 +1451,21 @@ void LoopPipeliner::finalizeYield(scf::ForOp newForOp, OpBuilder &builder) { for (Value nextSlice : extractSlices) yieldValues.push_back(nextSlice); - for (size_t i = depArgsBeginIdx; i < ivIndex; ++i) { + for (size_t i = depArgsBeginIdx; i < ivIdx; ++i) { auto arg = newForOp.getRegionIterArgs()[i]; assert(depArgsMapping.count(arg) && "Missing loop-carried value"); yieldValues.push_back(depArgsMapping[arg]); } + + // Loop iteration args yieldValues.push_back(nextIV); yieldValues.push_back(pipelineIterIdx); - yieldValues.push_back(loopIterIdx); + yieldValues.push_back(curWaitIdx); + if (numLoadsRequireMBarrier > 0) { + yieldValues.push_back(loopIterIdx); + yieldValues.push_back(curPhase); + yieldValues.push_back(curEmptyPhase); + } builder.setInsertionPointToEnd(newForOp.getBody()); builder.create(yieldOp->getLoc(), yieldValues); @@ -973,14 +1483,26 @@ scf::ForOp LoopPipeliner::createNewForOp() { // ref: mlir/lib/Dialect/SCF/Transforms/LoopPipelining.cpp struct PipelinePass : public TritonGPUPipelineBase { PipelinePass() = default; - PipelinePass(int numStages) { this->numStages = numStages; } + PipelinePass(int numStages, int numWarps, int numCTAs, + int computeCapability) { + this->numStages = numStages; + this->numWarps = numWarps; + this->numCTAs = numCTAs; + this->computeCapability = computeCapability; + } void runOnOperation() override { - int numStages = this->numStages; - - if (numStages <= 1) + // TODO[goostavz]: mode = 0 is temporary for backward compatible, will be + // deprecated after the refactor of pipeline fully gets done + // TODO[goostavz]: When mode = 1, the mask of prefetch insert_slice in the + // prologue is currently not properly provided. Need some second thought on + // the mask definition of InsertSliceOp when the src is ptr + bool mode = + computeCapability >= 90 && ::triton::tools::getBoolEnv("ENABLE_TMA"); + if (this->numStages <= 1) return; + // phase 0: pipeline loads in loops // Pre-processing // we make sure element-wise ops are done *after* the conversion // to dot operands @@ -991,26 +1513,283 @@ struct PipelinePass : public TritonGPUPipelineBase { // auto didPreprocess = // applyPatternsAndFoldGreedily(getOperation(), std::move(patterns)); + llvm::SmallVector newForOps; // Do the pipelining getOperation()->walk([&](scf::ForOp forOp) -> void { - LoopPipeliner pipeliner(forOp, numStages); - + LoopPipeliner pipeliner(forOp, this->numStages, this->numWarps, + this->numCTAs, mode, consumerReleaseMap); if (pipeliner.initialize().failed()) return; pipeliner.emitPrologue(); scf::ForOp newForOp = pipeliner.createNewForOp(); pipeliner.emitEpilogue(); + newForOps.push_back(newForOp); // Replace the original loop for (unsigned i = 0; i < forOp->getNumResults(); ++i) forOp->getResult(i).replaceAllUsesWith(newForOp->getResult(i)); forOp->erase(); }); + + // phase 1: pipeline dots in loops + // A tt.dot suitable for GMMA will be converted to ttg.dot_async. And a + // ttg.DotWaitOp will synchronize it lagging just one iteration, which is + // a hueristic rule. + for (auto forOp : newForOps) + asyncLaunchDots(forOp); + + // phase 2: emit consumer_release (empty barrier arrive) logics in case of + // TMA multicast. + // For each load ops, it is emitted after its last consumer, if the consumer + // is another async op, find its associated sync op. Each async load will be + // emitted with a consumer_release action. The merge of redundant mbarriers + // will be processed in the consequent OptimizeBarriers pass. + for (const auto &item : consumerReleaseMap) + emitConsumerRelease(item.first, item.second, numStages); } + +private: + Value getRemoteCTAId(OpBuilder &b, Location loc, ttg::CTALayoutAttr CTALayout, + Value remoteCTAIdIdx) const; + void updateConsumerReleaseInfo(Operation *oldOp, Operation *newOp, int stage); + void asyncLaunchDots(scf::ForOp forOp); + void emitConsumerRelease(Value mbarTensor, const ConsumerReleaseInfo &info, + int numStages); + + ConsumerReleaseMap consumerReleaseMap; }; + +void PipelinePass::updateConsumerReleaseInfo(Operation *oldOp, Operation *newOp, + int stage) { + for (auto &item : consumerReleaseMap) { + auto &m = item.second.consumerStageMap; + if (m.count(oldOp)) { + m.erase(oldOp); + m[newOp] = stage; + } + + for (Value operand : oldOp->getOperands()) { + Operation *op = operand.getDefiningOp(); + if (op && isa(op)) { + auto cvt = cast(op); + auto src = cvt.getSrc(); + auto srcEncoding = src.getType().cast().getEncoding(); + auto dstEncoding = + cvt.getResult().getType().cast().getEncoding(); + if (srcEncoding == dstEncoding && m.count(op)) { + m.erase(op); + m[newOp] = stage; + } + } + } + } +} + +void PipelinePass::asyncLaunchDots(scf::ForOp forOp) { + Block *loop = forOp.getBody(); + + /// XXX(Keren): Clean up the following duplicate code with checkDotOp + /// dots to be pipelined + SetVector dots; + for (Operation &op : *loop) { + if (auto dotOp = dyn_cast(&op)) { + auto resTy = dotOp.getResult().getType().dyn_cast(); + if (auto resEnc = resTy.getEncoding().dyn_cast()) { + if (resEnc && resEnc.isHopper()) { + // Don't pipeline valid dots that depend on ops other than scf.yield + // and scf.for + auto dot = dotOp.getResult(); + bool valid = true; + + // all users of dot should be scf.yield + if (!dot.hasOneUse()) + valid = false; + if (!isa(*dot.getUsers().begin())) + valid = false; + + // C should be a block argument + auto CArg = dotOp.getOperand(2).dyn_cast(); + if (!CArg || !CArg.hasOneUse()) + valid = false; + + if (valid) + dots.insert(dotOp); + } + } + } + } + + // Early stop: no need to continue if there is no valid dot in the loop. + if (dots.empty()) + return; + + OpBuilder builder(forOp); + + // 0. insert dot_wait after the last dot in the loop + Value dot = dots.back(); + auto loc = dot.getLoc(); + builder.setInsertionPointAfter(dot.getDefiningOp()); + auto dotWait = builder.create(loc, dots.size()); + + // 1. replace Dot with DotAsync + for (size_t idx = 0; idx < dots.size(); ++idx) { + Value dot = dots[idx]; + auto dotOp = cast(dot.getDefiningOp()); + builder.setInsertionPoint(dot.getDefiningOp()); + auto dotAsync = builder.create( + loc, dotOp.getA(), dotOp.getB(), dotOp.getC(), dotOp.getAllowTF32()); + dot.replaceAllUsesWith(dotAsync.getResult()); + updateConsumerReleaseInfo(dot.getDefiningOp(), dotWait, /*stage=*/1); + dot.getDefiningOp()->erase(); + } + + // 2. If there's any outstanding DotAsyncOps, we need to wait for them. + builder.setInsertionPointAfter(forOp); + Value loopNotEmpty = builder.create( + loc, arith::CmpIPredicate::slt, forOp.getLowerBound(), + forOp.getUpperBound()); + // TODO[goostavz]: it's a workaround to put the DotWaitOp in an IfOp for + // a bug in ptxas which mistakenly analysis the control flow and turn the GMMA + // into synchronuous implementation for safety. + // Remove this If once the bug is fixed. + auto ifOp = builder.create(loc, ArrayRef{}, loopNotEmpty, + /*hasElse*/ false); + builder.setInsertionPointToStart(ifOp.thenBlock()); + builder.create(forOp.getLoc(), 0); +} + +Value PipelinePass::getRemoteCTAId(OpBuilder &b, Location loc, + ttg::CTALayoutAttr CTALayout, + Value remoteCTAIdIdx) const { + auto CTAsPerCGA = CTALayout.getCTAsPerCGA(); + auto CTAOrder = CTALayout.getCTAOrder(); + auto CTASplitNum = CTALayout.getCTASplitNum(); + + // Short path when bcastMask is a constant + bool isConstMcastMask = true; + for (unsigned s : CTASplitNum) { + if (s > 1) { + isConstMcastMask = false; + break; + } + } + if (isConstMcastMask) + return remoteCTAIdIdx; + + Value linearCTAId = b.create(loc); + SmallVector multiDimCTAId = + delinearize(b, loc, linearCTAId, CTAsPerCGA, CTAOrder); + auto rank = CTAOrder.size(); + int bcastDim = -1; + for (size_t i = 0; i < rank; ++i) { + if (CTAsPerCGA[i] != CTASplitNum[i]) { + assert(bcastDim < 0 && "bcast in multiple dims is not expected"); + bcastDim = i; + } + } + multiDimCTAId[bcastDim] = remoteCTAIdIdx; + return linearize(b, loc, multiDimCTAId, CTAsPerCGA, CTAOrder); +} + +void PipelinePass::emitConsumerRelease(Value mbarTensor, + const ConsumerReleaseInfo &info, + int numStages) { + Value iterVar = info.iterVar; + Value stage = info.stageVar; + Value phase = info.phaseVar; + Value nextIV = info.nextIVVar; + Value step = info.stepVar; + Value upperBound = info.upperBoundVar; + + const auto &consumerStageMap = info.consumerStageMap; + // find the the last consumer among all the consumers with the largest stage. + SmallVector consumersWithLargestStage; + int maxStage = 0; + for (const auto &it : consumerStageMap) { + if (it.second > maxStage) { + consumersWithLargestStage.clear(); + consumersWithLargestStage.push_back(it.first); + maxStage = it.second; + } else if (it.second == maxStage) { + consumersWithLargestStage.push_back(it.first); + } + } + assert(consumersWithLargestStage.size() > 0); + DenseMap operationId; + consumersWithLargestStage[0]->getBlock()->walk( + [&](Operation *op) { operationId[op] = operationId.size(); }); + size_t maxId = 0; + Operation *lastUserWithLargestStage; + for (Operation *op : consumersWithLargestStage) { + assert(operationId.find(op) != operationId.end()); + size_t userId = operationId[op]; + if (userId > maxId) { + maxId = userId; + lastUserWithLargestStage = op; + } + } + + OpBuilder b(&getContext()); + b.setInsertionPointAfter(lastUserWithLargestStage); + auto loc = lastUserWithLargestStage->getLoc(); + auto maxStageVal = b.create(loc, maxStage, 32); + + // pred = (iterVar >= maxStage) && + // (threadId % (numConsumerThreads / numRemoteCTAs) == 0); + + // [benzh] maybe we can simplify the logics here + auto cmpOp = arith::CmpIPredicate::sge; + if (maxStage == 0) + cmpOp = arith::CmpIPredicate::sgt; + Value pred = b.create(loc, cmpOp, iterVar, maxStageVal); + + Value threadId = b.create(loc); + auto CTAsPerCGA = info.CTALayout.getCTAsPerCGA(); + auto CTASplitNum = info.CTALayout.getCTASplitNum(); + auto numRemoteCTAs = std::accumulate(CTAsPerCGA.begin(), CTAsPerCGA.end(), 1, + std::multiplies{}) / + std::accumulate(CTASplitNum.begin(), CTASplitNum.end(), + 1, std::multiplies{}); + auto numConsumerThreads = + isa(lastUserWithLargestStage) ? 128 : 32; + Value _0 = b.create(loc, 0, 32); + Value numArrives = b.create( + loc, numConsumerThreads / numRemoteCTAs, 32); + pred = b.create( + loc, pred, + b.create( + loc, arith::CmpIPredicate::eq, + b.create(loc, threadId, numArrives), _0)); + // remoteCtaIdIdx = (threadId % numConsumerThreads) / (numConsumerThreads / + // numRemoteCTAs); + Value remoteCTAIdIdx = b.create( + loc, + b.create( + loc, threadId, + b.create(loc, numConsumerThreads, 32)), + numArrives); + Value remoteCTAId = getRemoteCTAId(b, loc, info.CTALayout, remoteCTAIdIdx); + Value emptyBarrier = b.create( + loc, tt::PointerType::get(b.getIntegerType(64), 3), mbarTensor, stage); + + Value newNextIV = b.create(loc, nextIV, step); + Value nextLoopCond = b.create(loc, arith::CmpIPredicate::slt, + newNextIV, upperBound); + auto ifOp = b.create(loc, ArrayRef{}, nextLoopCond, + /*hasElse*/ false); + b.setInsertionPointToStart(ifOp.thenBlock()); + + b.create(loc, emptyBarrier, pred, remoteCTAId, + /*trackAsyncOp*/ false); +} + } // anonymous namespace -std::unique_ptr mlir::createTritonGPUPipelinePass(int numStages) { - return std::make_unique(numStages); +std::unique_ptr mlir::createTritonGPUPipelinePass(int numStages, + int numWarps, + int numCTAs, + int computeCapability) { + return std::make_unique(numStages, numWarps, numCTAs, + computeCapability); } diff --git a/lib/Dialect/TritonGPU/Transforms/RemoveLayoutConversions.cpp b/lib/Dialect/TritonGPU/Transforms/RemoveLayoutConversions.cpp index 47aa68c372b6..05f3fe8bf61b 100644 --- a/lib/Dialect/TritonGPU/Transforms/RemoveLayoutConversions.cpp +++ b/lib/Dialect/TritonGPU/Transforms/RemoveLayoutConversions.cpp @@ -126,6 +126,13 @@ class SimplifyReduceCvt : public mlir::RewritePattern { return failure(); } + // ReduceOp does not support SharedLayout as its src layout, therefore + // ConvertLayoutOp and ReduceOp should not be swapped when the conversion is + // from SharedLayout to DistributedLayout + if (newEncoding.isa()) { + return failure(); + } + for (unsigned i = 1; i < newOperands.size(); ++i) { auto oldTy = newOperands[i].getType().cast(); RankedTensorType newTy = @@ -195,7 +202,11 @@ void pushConversionForward(triton::gpu::ConvertLayoutOp cvt, if (arg.getDefiningOp() == cvt) mapping.map(arg, cvt.getOperand()); else { - auto oldType = arg.getType().cast(); + auto oldType = arg.getType().dyn_cast(); + // TODO: we may be creating block pointer load/store with mismatching + // pointer type. + if (!oldType) + continue; auto newType = RankedTensorType::get( oldType.getShape(), oldType.getElementType(), srcEncoding); auto cvtI = rewriter.create(arg.getLoc(), @@ -207,7 +218,7 @@ void pushConversionForward(triton::gpu::ConvertLayoutOp cvt, } rewriter.setInsertionPoint(op); if (op->getNumResults() == 0) { - Operation *newOp = rewriter.clone(*op, mapping); + Operation *newOp = cloneWithInferType(rewriter, op, mapping); rewriter.eraseOp(op); return; } @@ -299,7 +310,7 @@ class MoveConvertOutOfIf : public mlir::RewritePattern { mapping.map(op.getResult(0), mapping.lookup(op.getOperand(0))); continue; } - rewriter.clone(op, mapping); + cloneWithInferType(rewriter, &op, mapping); } }; rewriter.setInsertionPointToEnd(newIfOp.thenBlock()); @@ -458,7 +469,7 @@ class MoveConvertOutOfLoop : public mlir::RewritePattern { size_t i, RankedTensorType newType, triton::gpu::ConvertLayoutOp origConversion) const { // Rewrite init argument - Type origType = forOp.getInitArgs()[i].getType(); + auto origType = forOp.getInitArgs()[i].getType().cast(); SmallVector newInitArgs = forOp.getInitArgs(); newInitArgs[i] = rewriter.create( newInitArgs[i].getLoc(), newType, newInitArgs[i]); @@ -475,13 +486,52 @@ class MoveConvertOutOfLoop : public mlir::RewritePattern { mapping.map(forOp.getInductionVar(), newForOp.getInductionVar()); for (Operation &op : forOp.getBody()->without_terminator()) { - if (&op == (Operation *)(&origConversion)) + if (dyn_cast(op) == origConversion) continue; - Operation *newOp = rewriter.clone(op, mapping); + + bool convert = llvm::any_of(op.getOperands(), [&](auto operand) { + return operand == origConversion.getOperand(); + }); + auto convertLayout = [&](Value operand, Value value, Attribute encoding) { + auto tensorType = value.getType().cast(); + auto cvtType = RankedTensorType::get( + tensorType.getShape(), tensorType.getElementType(), encoding); + auto cvt = rewriter.create( + op.getLoc(), cvtType, value); + mapping.map(operand, cvt); + }; + DenseMap cvtValues; + if (convert) { + for (auto operand : op.getOperands()) { + if (operand == origConversion.getOperand() || + !isa(operand.getType())) + continue; + auto value = mapping.lookupOrDefault(operand); + // Convert to the new type + convertLayout(operand, value, newType.getEncoding()); + // Other ops don't use the converted value and we need to restore + cvtValues[operand] = value; + } + } + auto *newOp = cloneWithInferType(rewriter, &op, mapping); + if (convert) { + for (auto result : op.getResults()) { + if (!isa(result.getType())) + continue; + auto value = mapping.lookupOrDefault(result); + auto tensorType = result.getType().cast(); + // Convert to the original type + convertLayout(result, value, tensorType.getEncoding()); + } + // Restore original values + for (auto [operand, value] : cvtValues) + mapping.map(operand, value); + } } // create yield, inserting conversions if necessary auto yieldOp = forOp.getBody()->getTerminator(); SmallVector newYieldArgs; + // We use the new type for the result of the conversion for (Value arg : yieldOp->getOperands()) newYieldArgs.push_back(mapping.lookup(arg)); if (newYieldArgs[i].getType() != newType) @@ -494,6 +544,7 @@ class MoveConvertOutOfLoop : public mlir::RewritePattern { newResults[i] = rewriter.create( newForOp.getLoc(), origType, newForOp->getResult(i)); newResults[i].getDefiningOp()->moveAfter(newForOp); + return newResults; } diff --git a/lib/Dialect/TritonGPU/Transforms/TritonGPUConversion.cpp b/lib/Dialect/TritonGPU/Transforms/TritonGPUConversion.cpp index 6af4dbdf96e1..c345f1b87354 100644 --- a/lib/Dialect/TritonGPU/Transforms/TritonGPUConversion.cpp +++ b/lib/Dialect/TritonGPU/Transforms/TritonGPUConversion.cpp @@ -12,9 +12,13 @@ using namespace mlir::triton::gpu; // TypeConverter // TritonGPUTypeConverter::TritonGPUTypeConverter(MLIRContext *context, - int numWarps, int threadsPerWarp) - : context(context), numWarps(numWarps), threadsPerWarp(threadsPerWarp) { + int numWarps, int threadsPerWarp, + int numCTAs) + : context(context), numWarps(numWarps), threadsPerWarp(threadsPerWarp), + numCTAs(numCTAs) { addConversion([](Type type) { return type; }); + + // Add encoding for tensor addConversion([this](RankedTensorType tensorType) -> RankedTensorType { // types with encoding are already in the right format // TODO: check for layout encodings more specifically @@ -30,10 +34,24 @@ TritonGPUTypeConverter::TritonGPUTypeConverter(MLIRContext *context, llvm::SmallVector sizePerThread(rank, 1); Attribute encoding = triton::gpu::BlockedEncodingAttr::get( this->context, shape, sizePerThread, order, this->numWarps, - this->threadsPerWarp); + this->threadsPerWarp, this->numCTAs); return RankedTensorType::get(shape, tensorType.getElementType(), encoding); }); + // Add encoding for tensor pointer + addConversion([this](triton::PointerType ptrType) -> triton::PointerType { + // Check whether tensor pointer `tt.ptr>` + auto pointeeTensorType = + ptrType.getPointeeType().dyn_cast(); + if (pointeeTensorType == nullptr) + return ptrType; + + // Add layout into the tensor + auto convertedTensorType = convertType(pointeeTensorType); + return triton::PointerType::get(convertedTensorType, + ptrType.getAddressSpace()); + }); + // // Materializations // diff --git a/lib/Dialect/TritonGPU/Transforms/Utility.cpp b/lib/Dialect/TritonGPU/Transforms/Utility.cpp index 95130a3f13fd..39300d194997 100644 --- a/lib/Dialect/TritonGPU/Transforms/Utility.cpp +++ b/lib/Dialect/TritonGPU/Transforms/Utility.cpp @@ -5,6 +5,7 @@ #include "mlir/Transforms/GreedyPatternRewriteDriver.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" #include "triton/Dialect/TritonGPU/Transforms/Utility.h" +#include namespace mlir { @@ -63,6 +64,235 @@ LogicalResult fixupLoops(ModuleOp mod) { return success(); } +SmallVector mmaVersionToInstrShape(int version, + const ArrayRef &shape, + RankedTensorType type) { + if (version == 1) + return {16, 16}; + else if (version == 2) + return {16, 8}; + else if (version == 3) { + unsigned k = 256 / type.getElementTypeBitWidth(); + if (shape[0] % 64 != 0 || shape[1] % 8 != 0) { + assert(false && "type not supported"); + return {0, 0, 0}; + } + auto eltType = type.getElementType(); + SmallVector validN; + + // MMAv3 with larger instruction shape is preferred. + if (eltType.isFloat8E5M2() || eltType.isFloat8E4M3FN() || eltType.isF16() || + eltType.isBF16() || eltType.isF32()) { + validN.assign({256, 248, 240, 232, 224, 216, 208, 200, 192, 184, 176, + 168, 160, 152, 144, 136, 128, 120, 112, 104, 96, 88, + 80, 72, 64, 56, 48, 40, 32, 24, 16, 8}); + } + + if (eltType.isInteger(8)) { + validN.assign({224, 208, 192, 176, 160, 144, 128, 112, 96, 80, 64, 48, 32, + 24, 16, 8}); + } + + for (auto n : validN) { + if (shape[1] % n == 0) { + return {16, n, k}; + } + } + + assert(false && "type not supported"); + return {0, 0, 0}; + } else { + assert(false && "version not supported"); + return {0, 0}; + } +} + +bool isLoadFromTensorPtr(triton::LoadOp op) { + return mlir::triton::isTensorPointerType(op.getPtr().getType()); +} + +bool isStoreToTensorPtr(triton::StoreOp op) { + return mlir::triton::isTensorPointerType(op.getPtr().getType()); +} + +Operation *getFirstUser(Value v) { + DenseMap operationId; + v.getParentBlock()->walk( + [&](Operation *op) { operationId[op] = operationId.size(); }); + size_t minId = std::numeric_limits::max(); + Operation *firstUser = nullptr; + for (Operation *user : v.getUsers()) { + assert(operationId.find(user) != operationId.end()); + size_t userId = operationId[user]; + if (userId < minId) { + minId = userId; + firstUser = user; + } + } + assert(firstUser); + return firstUser; +} + +triton::gpu::SharedEncodingAttr getSharedEncoding(RankedTensorType tensorTy) { + auto blockedLayout = + tensorTy.getEncoding().cast(); + return triton::gpu::SharedEncodingAttr::get( + tensorTy.getContext(), tensorTy.getShape(), blockedLayout.getOrder(), + blockedLayout.getCTALayout(), tensorTy.getElementType()); +} + +//===----------------------------------------------------------------------===// +// GraphDumper +//===----------------------------------------------------------------------===// + +GraphDumper::NodeInfo GraphDumper::onValue(Value value) const { + return {{"shape", "box"}, {"style", "filled"}, {"fillcolor", "white"}}; +} + +GraphDumper::NodeInfo GraphDumper::onOperation(Operation *op) const { + return {{"shape", "ellipse"}, {"style", "filled"}, {"fillcolor", "white"}}; +} + +std::string GraphDumper::dump(triton::FuncOp func) const { + llvm::SetVector values; + llvm::SetVector operations; + + func.walk([&](Operation *op) { + operations.insert(op); + for (Value operand : op->getOperands()) + values.insert(operand); + for (Value result : op->getResults()) + values.insert(result); + }); + + std::ostringstream oss; + oss << "// Generated by Triton GraphDumper\n" + << "\n" + << "digraph {\n"; + + oss << " // Value Nodes\n"; + for (Value value : values) + oss << " " << emitValueNode(value) << "\n"; + oss << "\n"; + + oss << " // Operation Nodes\n"; + for (Operation *op : operations) + oss << " " << emitOperationNode(op) << "\n"; + oss << "\n"; + + oss << " // Edges\n"; + for (Operation *op : operations) { + for (Value operand : op->getOperands()) + oss << " " << emitEdge(getUniqueId(operand), getUniqueId(op)) << "\n"; + for (Value result : op->getResults()) + oss << " " << emitEdge(getUniqueId(op), getUniqueId(result)) << "\n"; + } + + oss << "}\n"; + return oss.str(); +} + +void GraphDumper::dumpToFile(triton::FuncOp func, + const std::string &filename) const { + std::ofstream ofs(filename); + ofs << dump(func); +} + +std::string GraphDumper::getShapeStr(const Type &type) const { + std::ostringstream oss; + oss << "["; + if (auto tensorTy = type.dyn_cast()) { + auto shape = tensorTy.getShape(); + for (unsigned i = 0; i < shape.size(); ++i) { + if (i > 0) + oss << ", "; + oss << shape[i]; + } + } + oss << "]"; + return oss.str(); +} + +std::string GraphDumper::getUniqueId(Value value) const { + std::ostringstream oss; + oss << value.getImpl(); + return oss.str(); +} + +std::string GraphDumper::getUniqueId(Operation *op) const { + std::ostringstream oss; + oss << op; + return oss.str(); +} + +std::string GraphDumper::emitNode(const std::string &id, + const GraphDumper::NodeInfo info) const { + std::ostringstream oss; + oss << "\"" << id << "\" ["; + for (auto it = info.begin(); it != info.end(); ++it) { + if (it != info.begin()) + oss << ", "; + oss << it->first << " = \"" << it->second << "\""; + } + oss << "];"; + return oss.str(); +} + +std::string GraphDumper::emitEdge(const std::string &srcId, + const std::string &destId) const { + std::ostringstream oss; + oss << "\"" << srcId << "\" -> \"" << destId << "\";"; + return oss.str(); +} + +std::string GraphDumper::emitValueNode(Value value) const { + NodeInfo info = onValue(value); + if (info.find("label") == info.end()) { + std::string shapeStr = getShapeStr(value.getType()); + if (auto arg = value.dyn_cast()) + info["label"] = + "BlockArg" + std::to_string(arg.getArgNumber()) + " " + shapeStr; + else + info["label"] = shapeStr; + } + return emitNode(getUniqueId(value), info); +} + +std::string GraphDumper::emitOperationNode(Operation *op) const { + NodeInfo info = onOperation(op); + if (info.find("label") == info.end()) + info["label"] = op->getName().getStringRef().str(); + return emitNode(getUniqueId(op), info); +} + +//===----------------------------------------------------------------------===// +// GraphLayoutMarker +//===----------------------------------------------------------------------===// + +GraphDumper::NodeInfo GraphLayoutMarker::onValue(Value value) const { + std::string color = getColor(value.getType()); + return {{"shape", "box"}, {"style", "filled"}, {"fillcolor", color}}; +} + +std::string GraphLayoutMarker::getColor(const Type &type) const { + if (auto tensorTy = type.dyn_cast()) { + auto layout = tensorTy.getEncoding(); + if (layout.isa()) + return "green"; + else if (layout.isa()) + return "yellow"; + else if (layout.isa()) + return "lightslateblue"; + else if (layout.isa()) + return "orange"; + else if (layout.isa()) + return "orangered"; + else + assert(0 && "Unrecognized layout"); + } else { + return "white"; + } +} // -------------------------------------------------------------------------- // // TODO: Interface @@ -89,11 +319,15 @@ LogicalResult invertEncoding(Attribute targetEncoding, Operation *op, } bool isExpensiveLoadOrStore(Operation *op, Attribute &targetEncoding) { - // Case 1: A size 1 tensor is not expensive since all threads will load the + // Case 1: Pointer of tensor is always expensive + auto operandType = op->getOperand(0).getType(); + if (triton::isTensorPointerType(operandType)) + return true; + // Case 2a: A size 1 tensor is not expensive since all threads will load the // same if (isSingleValue(op->getOperand(0))) return false; - // Case 2: Tensor of pointers has more threads than elements + // Case 2b: Tensor of pointers has more threads than elements // we can presume a high hit-rate that makes it cheap to load auto ptrType = op->getOperand(0).getType().cast(); auto mod = op->getParentOfType(); @@ -121,7 +355,7 @@ bool isExpensiveToRemat(Operation *op, Attribute &targetEncoding) { return false; } -bool canFoldConversion(Operation *op, Attribute &targetEncoding) { +bool canFoldConversion(Operation *op, Attribute targetEncoding) { if (isa(op)) return !triton::gpu::isExpensiveCat(cast(op), targetEncoding); @@ -162,6 +396,12 @@ int simulateBackwardRematerialization( return INT_MAX; if (toConvert.count(argI) && toConvert[argI] != newEncoding) return INT_MAX; + if (auto ptrTy = argI.getType().dyn_cast()) { + if (ptrTy.getPointeeType().isa()) { + return INT_MAX; + } + } + Operation *opArgI = argI.getDefiningOp(); toConvert.insert({argI, newEncoding}); // 1. Only convert RankedTensorType @@ -224,6 +464,103 @@ Operation *cloneWithInferType(mlir::OpBuilder &rewriter, Operation *op, return newOp; } +namespace { + +struct OpUseInfo { + Value value; + Operation *op; + unsigned index; +}; + +void getForwardSliceOpUseInfo(Operation *op, + SetVector *forwardSliceOps, + SmallVector *forwardOpUseInfo) { + if (!op) + return; + + for (Region ®ion : op->getRegions()) + for (Block &block : region) + for (Operation &blockOp : block) + if (forwardSliceOps->count(&blockOp) == 0) + getForwardSliceOpUseInfo(&blockOp, forwardSliceOps, forwardOpUseInfo); + for (Value result : op->getResults()) { + for (OpOperand &operand : result.getUses()) { + auto *blockOp = operand.getOwner(); + forwardOpUseInfo->push_back( + {operand.get(), blockOp, operand.getOperandNumber()}); + if (forwardSliceOps->count(blockOp) == 0) + getForwardSliceOpUseInfo(blockOp, forwardSliceOps, forwardOpUseInfo); + } + } + + forwardSliceOps->insert(op); +} +} // namespace + +LogicalResult simulateForwardRematerializationInLoop(Operation *startOp, + BlockArgument arg, + Attribute targetEncoding) { + // heuristics for flash attention + if (targetEncoding.isa()) + return failure(); + SetVector cvtSliceOps; + SmallVector cvtSliceOpUseInfo; + getForwardSliceOpUseInfo(startOp, &cvtSliceOps, &cvtSliceOpUseInfo); + + // Check if any additional conversion is needed along the way + for (Operation *op : cvtSliceOps) { + if (isa(op)) + continue; + // The first op doesn't push forward any conversion + if (op != startOp) { + if (isa(op) && + !op->getResult(0).getType().isa()) + return failure(); + // don't rematerialize anything expensive + if (isExpensiveToRemat(op, targetEncoding)) + return failure(); + // don't rematerialize non-element-wise + if (!op->hasTrait() && + !op->hasTrait() && + !isa(op)) + return failure(); + } + // don't rematerialize if it adds an extra conversion that can't + // be removed + for (Value value : op->getOperands()) { + Operation *argOp = arg.getDefiningOp(); + SetVector processed; + SetVector layout; + llvm::MapVector toConvert; + int numAddedConvs = simulateBackwardRematerialization( + argOp, processed, layout, toConvert, targetEncoding); + if (argOp && !isa(argOp) && + cvtSliceOps.count(argOp) == 0 && numAddedConvs > 0) + return failure(); + } + } + + // We apply conservative analysis. Only when the final operand's index + // matches the argument's index or their encoding match, we can rematerialize. + for (auto &opUseInfo : cvtSliceOpUseInfo) { + Operation *op = opUseInfo.op; + if (isa(op)) { + auto yieldIdx = opUseInfo.index; + // 0 is the induction variable + auto argIdx = arg.getArgNumber() - 1; + if (yieldIdx != argIdx) { + auto argType = arg.getType().cast(); + auto yieldType = + op->getOperand(yieldIdx).getType().dyn_cast(); + if (!yieldType || argType.getEncoding() != yieldType.getEncoding()) + return failure(); + } + } + } + return success(); +} + void rematerializeConversionChain( const llvm::MapVector &toConvert, mlir::PatternRewriter &rewriter, SetVector &processed, @@ -311,9 +648,6 @@ LogicalResult canMoveOutOfLoop(BlockArgument arg, if (cvts.empty()) return success(); if (cvtTypes.size() == 1) { - // Second condition - if (others.empty()) - return success(); // Third condition - part 1: // If the other or the cvt is in the different block, we cannot push the // conversion forward or backward @@ -329,23 +663,72 @@ LogicalResult canMoveOutOfLoop(BlockArgument arg, if (other->getBlock() != forOp.getBody()) return failure(); // Third condition - part 3: - // %0 (enc1) = cvt %arg (enc0) - // other %0 (enc1), %1 (enc0) => other %0 (enc1), %1 (enc1) - // Check if %2 (enc1) = cvt %1 (enc0) can be eliminated - SetVector processed; - SetVector layout; - llvm::MapVector toConvert; - for (auto operand : other->getOperands()) { - auto argOp = operand.getDefiningOp(); - if (argOp && !isa(argOp) && - simulateBackwardRematerialization(argOp, processed, layout, - toConvert, targetEncoding) > 0) - return failure(); - } + // Check if we can directly use arg without conversion + if (simulateForwardRematerializationInLoop(other, arg, targetEncoding) + .failed()) + return failure(); } return success(); } return failure(); } +// TODO(thomas): this is duplicated with what is in GPUToLLVM +// Convert an \param index to a multi-dim coordinate given \param shape and +// \param order. +SmallVector delinearize(OpBuilder &b, Location loc, Value linear, + ArrayRef shape, + ArrayRef order) { + unsigned rank = shape.size(); + assert(rank == order.size()); + auto reordered = reorder(shape, order); + auto reorderedMultiDim = delinearize(b, loc, linear, reordered); + SmallVector multiDim(rank); + for (unsigned i = 0; i < rank; ++i) { + multiDim[order[i]] = reorderedMultiDim[i]; + } + return multiDim; +} + +SmallVector delinearize(OpBuilder &b, Location loc, Value linear, + ArrayRef shape) { + unsigned rank = shape.size(); + assert(rank > 0); + SmallVector multiDim(rank); + if (rank == 1) { + multiDim[0] = linear; + } else { + Value remained = linear; + for (auto &&en : llvm::enumerate(shape.drop_back())) { + auto dimSize = b.create(loc, en.value(), 32); + multiDim[en.index()] = b.create(loc, remained, dimSize); + remained = b.create(loc, remained, dimSize); + } + multiDim[rank - 1] = remained; + } + return multiDim; +} + +Value linearize(OpBuilder &b, Location loc, ArrayRef multiDim, + ArrayRef shape, ArrayRef order) { + return linearize(b, loc, reorder(multiDim, order), + reorder(shape, order)); +} + +Value linearize(OpBuilder &b, Location loc, ArrayRef multiDim, + ArrayRef shape) { + auto rank = multiDim.size(); + Value linear = b.create(loc, 0, 32); + if (rank > 0) { + linear = multiDim.back(); + for (auto [dim, dimShape] : + llvm::reverse(llvm::zip(multiDim.drop_back(), shape.drop_back()))) { + Value dimSize = b.create(loc, dimShape, 32); + linear = b.create( + loc, b.create(loc, linear, dimSize), dim); + } + } + return linear; +} + } // namespace mlir diff --git a/lib/Dialect/TritonNvidiaGPU/CMakeLists.txt b/lib/Dialect/TritonNvidiaGPU/CMakeLists.txt new file mode 100644 index 000000000000..9f57627c321f --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(IR) +add_subdirectory(Transforms) diff --git a/lib/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt b/lib/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt new file mode 100644 index 000000000000..99f2ef6b702b --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/IR/CMakeLists.txt @@ -0,0 +1,14 @@ +add_mlir_dialect_library(TritonNvidiaGPUIR + Dialect.cpp + Ops.cpp + Traits.cpp + Types.cpp + + DEPENDS + TritonNvidiaGPUTableGen + TritonNvidiaGPUAttrDefsIncGen + + LINK_LIBS PUBLIC + TritonIR + TritonGPUIR +) diff --git a/lib/Dialect/TritonNvidiaGPU/IR/Dialect.cpp b/lib/Dialect/TritonNvidiaGPU/IR/Dialect.cpp new file mode 100644 index 000000000000..0a982ce0572a --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/IR/Dialect.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/Triton/IR/Dialect.h" + +#include + +#include "mlir/IR/DialectImplementation.h" +#include "mlir/IR/OpImplementation.h" +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "llvm/ADT/TypeSwitch.h" +#include "llvm/Support/Debug.h" + +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.cpp.inc" + +using namespace mlir; +using namespace mlir::triton::nvidia_gpu; + +//===----------------------------------------------------------------------===// +// Attribute methods +//===----------------------------------------------------------------------===// +#define GET_ATTRDEF_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.cpp.inc" + +//===----------------------------------------------------------------------===// + +void TritonNvidiaGPUDialect::initialize() { + registerTypes(); + + addAttributes< +#define GET_ATTRDEF_LIST +#include "triton/Dialect/TritonNvidiaGPU/IR/TritonNvidiaGPUAttrDefs.cpp.inc" + >(); + addOperations< +#define GET_OP_LIST +#include "triton/Dialect/TritonNvidiaGPU/IR/Ops.cpp.inc" +#include "triton/Dialect/TritonNvidiaGPU/IR/OpsEnums.cpp.inc" + >(); +} + +// verify TritonNvidiaGPU ops +LogicalResult +TritonNvidiaGPUDialect::verifyOperationAttribute(Operation *op, + NamedAttribute attr) { + // TODO: fill this. + return success(); +} diff --git a/lib/Dialect/TritonNvidiaGPU/IR/Ops.cpp b/lib/Dialect/TritonNvidiaGPU/IR/Ops.cpp new file mode 100644 index 000000000000..f11f0278133e --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/IR/Ops.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/IR/Builders.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" + +#define GET_OP_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/Ops.cpp.inc" + +namespace mlir { +namespace triton { +namespace nvidia_gpu { + +///--- DotAsyncOp --- +mlir::LogicalResult DotAsyncOp::inferReturnTypes( + MLIRContext *context, std::optional location, ValueRange operands, + DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, + SmallVectorImpl &inferredReturnTypes) { + // type is the same as the accumulator + auto accTy = operands[2].getType().cast(); + inferredReturnTypes.push_back(accTy); + + // verify encodings + auto aEnc = operands[0].getType().cast().getEncoding(); + auto bEnc = operands[1].getType().cast().getEncoding(); + auto retEnc = accTy.getEncoding(); + if (aEnc) { + assert(bEnc); + Dialect &dialect = aEnc.getDialect(); + auto interface = dyn_cast(&dialect); + if (interface->inferDotOpEncoding(aEnc, 0, retEnc, location).failed()) + return mlir::failure(); + if (interface->inferDotOpEncoding(bEnc, 1, retEnc, location).failed()) + return mlir::failure(); + } + return mlir::success(); +} + +///--- Async related ops --- +void GetAgentIdOp::build(::mlir::OpBuilder &builder, + ::mlir::OperationState &state) { + build(builder, state, builder.getI32Type()); +} + +void CreateTokenOp::build(::mlir::OpBuilder &builder, + ::mlir::OperationState &state, uint32_t num) { + auto tokenType = TokenType::get(builder.getContext()); + auto resultType = RankedTensorType::get({num}, tokenType); + build(builder, state, resultType, num); +} + +void GetMutexRoleIdOp::build(::mlir::OpBuilder &builder, + ::mlir::OperationState &state, uint32_t num) { + build(builder, state, builder.getI32Type(), num); +} + +void CreateMutexOp::build(::mlir::OpBuilder &builder, + ::mlir::OperationState &state) { + build(builder, state, MutexType::get(builder.getContext())); +} + +} // namespace nvidia_gpu +} // namespace triton +} // namespace mlir diff --git a/lib/Dialect/TritonNvidiaGPU/IR/Traits.cpp b/lib/Dialect/TritonNvidiaGPU/IR/Traits.cpp new file mode 100644 index 000000000000..8360eea33244 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/IR/Traits.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonNvidiaGPU/IR/Traits.h" +#include "triton/Analysis/Utility.h" + +mlir::LogicalResult +mlir::OpTrait::impl::verifySource1IsSharedEncoding(Operation *op) { + if (failed(verifyAtLeastNOperands(op, 2))) + return failure(); + + if (!mlir::triton::gpu::isSharedEncoding(op->getOperand(1))) + return op->emitOpError() << "requires operand 1 to be shared encoding"; + + return success(); +}; diff --git a/lib/Dialect/TritonNvidiaGPU/IR/Types.cpp b/lib/Dialect/TritonNvidiaGPU/IR/Types.cpp new file mode 100644 index 000000000000..326f4948a113 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/IR/Types.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonNvidiaGPU/IR/Types.h" +#include "mlir/IR/DialectImplementation.h" // required by `Types.cpp.inc` +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "llvm/ADT/TypeSwitch.h" // required by `Types.cpp.inc` + +using namespace mlir; +using namespace mlir::triton::nvidia_gpu; + +#define GET_TYPEDEF_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/IR/Types.cpp.inc" + +//===----------------------------------------------------------------------===// +// Triton Dialect +//===----------------------------------------------------------------------===// +void ::mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect::registerTypes() { + addTypes< +#define GET_TYPEDEF_LIST +#include "triton/Dialect/TritonNvidiaGPU/IR/Types.cpp.inc" + >(); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt b/lib/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt new file mode 100644 index 000000000000..51ddf0868f4e --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/CMakeLists.txt @@ -0,0 +1,22 @@ +add_mlir_dialect_library(TritonNvidiaGPUTransforms + MaterializeLoadStore.cpp + PlanCTA.cpp + WSDecomposing.cpp + WSFeasibilityChecking.cpp + WSPipeline.cpp + WSMutex.cpp + WSMaterialization.cpp + FenceInsertion.cpp + RewriteTensorPointer.cpp + Utility.cpp + + DEPENDS + TritonNvidiaGPUTransformsIncGen + + LINK_LIBS PUBLIC + TritonIR + TritonGPUIR + TritonGPUTransforms + TritonNvidiaGPUIR + MLIRTransformUtils +) diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/FenceInsertion.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/FenceInsertion.cpp new file mode 100644 index 000000000000..3175fbbfb018 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/FenceInsertion.cpp @@ -0,0 +1,73 @@ +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/Transforms/Utility.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include "llvm/Support/Debug.h" + +//===----------------------------------------------------------------------===// +// +// This pass works after all other passes, inserting fences to ensure that +// memory operations are properly ordered acorss genric and async proxy. +// +//===----------------------------------------------------------------------===// + +using namespace mlir; +namespace tt = ::mlir::triton; +namespace ttg = ::mlir::triton::gpu; +namespace ttng = ::mlir::triton::nvidia_gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +using ::mlir::triton::gpu::SharedEncodingAttr; + +namespace { + +struct FenceInsertionPass + : public TritonGPUFenceInsertionBase { + +public: + FenceInsertionPass() = default; + FenceInsertionPass(int computeCapability) { + this->computeCapability = computeCapability; + } + // TODO: support more patterns to insert fences + // only support insertion between convert layout ops and dot ops to protect + // flashattention + void runOnOperation() override { + // Only insert fences for compute capability 9.0 + if (computeCapability < 90) + return; + ModuleOp mod = getOperation(); + mod.walk([&](Operation *op) { + if (isa(op)) { + auto a = op->getOperand(0); + auto b = op->getOperand(1); + auto mmaEncoding = op->getResult(0) + .getType() + .cast() + .getEncoding() + .dyn_cast(); + auto isHopperEncoding = mmaEncoding && mmaEncoding.isHopper(); + if (isHopperEncoding && (isa(a.getDefiningOp()) && + ttg::isSharedEncoding(a)) || + (isa(b.getDefiningOp()) && + ttg::isSharedEncoding(b))) { + + // TODO: check whether cluster fence is needed + OpBuilder builder(op); + builder.create(op->getLoc(), + false /*bCluster*/); + } + } + }); + } +}; + +} // namespace + +std::unique_ptr +mlir::createTritonNvidiaGPUFenceInsertionPass(int computeCapability) { + return std::make_unique(computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/MaterializeLoadStore.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/MaterializeLoadStore.cpp new file mode 100644 index 000000000000..9d38638c9761 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/MaterializeLoadStore.cpp @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/Dialect/Tensor/IR/Tensor.h" +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/Transforms/Utility.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include "triton/Tools/Sys/GetEnv.hpp" +#include "llvm/Support/Debug.h" +#include + +//===----------------------------------------------------------------------===// +// +// This pass works after pipeline pass, converts the remaining tt.LoadOp taking +// ptr as input into ttg.InsertSliceAsyncOp and emit proper barriers +// +//===----------------------------------------------------------------------===// + +using namespace mlir; +namespace ttg = mlir::triton::gpu; +namespace ttng = mlir::triton::nvidia_gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +using ::mlir::triton::gpu::BlockedEncodingAttr; +using ::mlir::triton::gpu::getCTALayout; +using ::mlir::triton::gpu::MmaEncodingAttr; +using ::mlir::triton::gpu::SharedEncodingAttr; + +namespace { + +struct MaterializeLoadStorePass + : public MaterializeLoadStoreBase { + +public: + MaterializeLoadStorePass() = default; + MaterializeLoadStorePass(int numWarps, int computeCapability) { + this->numWarps = numWarps; + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + SmallVector worklists; + getOperation()->walk([&](mlir::triton::LoadOp load) -> void { + if (isLoadFromTensorPtr(load)) { + worklists.push_back(load); + } + }); + for (auto load : worklists) { + materializeLoadTilePtr(load); + } + + SmallVector storeOpWorklists; + getOperation()->walk([&](mlir::triton::StoreOp store) -> void { + if (isStoreToTensorPtr(store)) { + storeOpWorklists.push_back(store); + } + }); + for (auto store : storeOpWorklists) { + materializeStoreTilePtr(store); + } + } + +private: + void materializeLoadTilePtr(mlir::triton::LoadOp load); + void materializeStoreTilePtr(mlir::triton::StoreOp store); +}; + +void MaterializeLoadStorePass::materializeLoadTilePtr( + mlir::triton::LoadOp load) { + if (computeCapability < 90) + return; + if (!::triton::tools::getBoolEnv("ENABLE_TMA")) + return; + auto loc = load.getLoc(); + OpBuilder b(load); + auto loadTy = load.getType().dyn_cast(); + auto loadShape = loadTy.getShape(); + auto CTASplitNum = ttg::getCTASplitNum(loadTy.getEncoding()); + auto shapePerSlice = ttg::getShapePerCTA(CTASplitNum, loadShape); + auto elemTy = loadTy.getElementType(); + assert(loadTy); + SmallVector bufferShape(loadShape.begin(), loadShape.end()); + bufferShape.insert(bufferShape.begin(), 1); + + auto sharedEncoding = getSharedEncoding(loadTy); + auto bufferTy = RankedTensorType::get(bufferShape, elemTy, sharedEncoding); + Value buffer = b.create(loc, bufferTy); + unsigned elems = std::accumulate(shapePerSlice.begin(), shapePerSlice.end(), + 1, std::multiplies{}); + elems *= (elemTy.getIntOrFloatBitWidth() / 8); + auto mBarrierTy = mlir::triton::PointerType::get(b.getIntegerType(64), 3); + Value mBarrier = b.create(loc, mBarrierTy, 1); + Value _0 = b.create(loc, 0, 32); + Value threadId = b.create(loc); + Value pred = + b.create(loc, arith::CmpIPredicate::eq, threadId, _0); + b.create(loc, mBarrier, pred, /*remoteCtaId*/ nullptr, + /*trackAsyncOp*/ false, elems); + Value inserted = b.create( + loc, bufferTy, load.getPtr(), buffer, + /*index*/ _0, mBarrier, load.getMask(), load.getOther(), load.getCache(), + load.getEvict(), load.getIsVolatile(), + /*axis*/ 0); + auto extractedTy = RankedTensorType::get(loadShape, elemTy, sharedEncoding); + Value extracted = b.create( + loc, extractedTy, inserted, + SmallVector{b.getI64IntegerAttr(0), b.getI64IntegerAttr(0), + b.getI64IntegerAttr(0)}, + SmallVector{b.getI64IntegerAttr(1), + b.getI64IntegerAttr(loadShape[0]), + b.getI64IntegerAttr(loadShape[1])}, + SmallVector{b.getI64IntegerAttr(1), b.getI64IntegerAttr(1), + b.getI64IntegerAttr(1)}); + + Value phase = b.create(loc, 0, 1); + b.create(loc, mBarrier, phase); + Value newValue = + b.create(loc, load.getType(), extracted); + load.getResult().replaceAllUsesWith(newValue); + load->erase(); +} + +void MaterializeLoadStorePass::materializeStoreTilePtr( + mlir::triton::StoreOp store) { + if (computeCapability < 90 || !::triton::tools::getBoolEnv("ENABLE_TMA")) + return; + auto loc = store.getLoc(); + OpBuilder builder(store); + auto *ctx = store.getContext(); + auto value = store.getValue(); + auto dst = store.getPtr(); + auto storeTy = value.getType().dyn_cast(); + assert(storeTy); + auto storeElemTy = storeTy.getElementType(); + auto ctaLayout = getCTALayout(storeTy.getEncoding()); + auto storeShape = storeTy.getShape(); + SmallVector bufferShape(storeShape.begin(), storeShape.end()); + auto rank = storeShape.size(); + // The order of smem should be consistent with gmem. + auto makeTensorPtrOp = getMakeTensorPtrOp(dst); + SmallVector sharedOrder; + for (auto o : makeTensorPtrOp.getOrder()) { + sharedOrder.emplace_back(o); + } + auto sharedEncoding = SharedEncodingAttr::get(ctx, storeShape, sharedOrder, + ctaLayout, storeElemTy); + auto bufferTy = + RankedTensorType::get(bufferShape, storeElemTy, sharedEncoding); + Value cvt = builder.create(loc, bufferTy, value); + builder.create(loc, dst, cvt); + builder.create(loc); + builder.create(loc, 0); + store->erase(); +} + +} // anonymous namespace + +std::unique_ptr +mlir::createTritonNvidiaGPUMaterializeLoadStorePass(int numWarps, + int computeCapability) { + return std::make_unique(numWarps, + computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/PlanCTA.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/PlanCTA.cpp new file mode 100644 index 000000000000..c0761cad93e3 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/PlanCTA.cpp @@ -0,0 +1,1013 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace { + +using namespace mlir; +namespace ttg = ::mlir::triton::gpu; +namespace ttng = ::mlir::triton::nvidia_gpu; + +// TODO: use ConvertLayoutOp +using CastOp = ::mlir::UnrealizedConversionCastOp; + +unsigned getNumUsers(Value value) { + return std::distance(value.user_begin(), value.user_end()); +} + +Type replaceLayout(const Type &type, const Attribute &newLayout) { + Type curType = type; + auto ptrTy = curType.dyn_cast(); + if (ptrTy) + curType = ptrTy.getPointeeType(); + if (auto tensorTy = curType.dyn_cast()) + curType = RankedTensorType::get(tensorTy.getShape(), + tensorTy.getElementType(), newLayout); + if (ptrTy) + curType = triton::PointerType::get(curType, ptrTy.getAddressSpace()); + return curType; +} + +Attribute replaceCTALayout(Attribute layout, llvm::ArrayRef shape, + const ttg::CTALayoutAttr &newCTALayout) { + if (auto blockedLayout = layout.dyn_cast()) { + return ttg::BlockedEncodingAttr::get( + layout.getContext(), shape, blockedLayout.getSizePerThread(), + blockedLayout.getOrder(), ttg::getNumWarpsPerCTA(layout), 32, + newCTALayout); + } else if (auto sliceLayout = layout.dyn_cast()) { + return ttg::SliceEncodingAttr::get( + layout.getContext(), sliceLayout.getDim(), + replaceCTALayout(sliceLayout.getParent(), shape, newCTALayout)); + } else { + // Other layouts are generated by passes after PlanCTAPass + assert(0 && "replaceCTALayout not implemented"); + } +} + +class CTAPlanner { +public: + CTAPlanner(ttng::ClusterInfo *clusterInfo_); + ~CTAPlanner(); + + void run(triton::FuncOp &funcOp); + +private: + CastOp markBackward(CastOp cast) const; + CastOp markForward(CastOp cast) const; + bool isBackward(CastOp cast) const; + bool isForward(CastOp cast) const; + + void setTiling(llvm::ArrayRef CTAsPerCGA); + bool processDot(triton::FuncOp &funcOp); + bool processReduce(triton::FuncOp &funcOp); + void processStoreLikeOps(triton::FuncOp &funcOp); + + bool propagate(CastOp cast); + bool propagateBackward(CastOp cast); + bool propagateForward(CastOp cast); + + void eraseCastOp(CastOp cast); + void eraseCastOpFromQueue(CastOp cast); + void eraseCastOpsFromQueue(llvm::ArrayRef casts); + + void insertCasts(Operation *op, llvm::ArrayRef newOperandLayouts, + llvm::ArrayRef newResultLayouts); + void eliminateAdjacentCasts(CastOp cast0, CastOp cast1); + + bool isLoadStoreOp(Operation *op) const; + bool processLoadStore(Operation *op, Attribute layout); + + bool isElementwiseOp(Operation *op) const; + bool processElementwise(Operation *op, Attribute layout); + + bool processConstant(arith::ConstantOp constant, Attribute layout); + bool processSplat(triton::SplatOp splat, Attribute layout); + bool processMakeRange(triton::MakeRangeOp makeRange, Attribute layout); + bool processMakeTensorPtr(triton::MakeTensorPtrOp makeTensorPtr, + Attribute layout); + + bool processBroadcast(triton::BroadcastOp broadcast, Attribute layout); + bool processExpandDimsBackward(triton::ExpandDimsOp expandDims, + Attribute newResultLayout); + bool processExpandDimsForward(triton::ExpandDimsOp expandDims, + Attribute newSrcLayout); + + bool processConvertLayoutBackward(ttg::ConvertLayoutOp convertLayout, + CastOp cast); + bool processConvertLayoutForward(ttg::ConvertLayoutOp convertLayout, + CastOp cast); + + bool processIfOp(scf::IfOp ifOp, int index, const Type &newType); + bool processForOp(scf::ForOp forOp, int index, const Type &newType); + + bool processIfOpBackward(scf::IfOp ifOp, CastOp cast); + bool processForOpBackward(scf::ForOp forOp, CastOp cast); + bool processBlockArgBackward(BlockArgument arg, CastOp cast); + bool processForOpForward(scf::ForOp forOp, CastOp cast); + bool processYieldOpForward(scf::YieldOp yieldOp, CastOp cast); + + bool processOpFallback(Operation *op); + + bool processMultiUsersBackward(Value input, CastOp cast); + bool processMultiUsersForward(Value output, CastOp cast); + + // This flag indicates whether clusterInfo needs to be deleted in the + // destructor of CTAPlanner. The flag `ownInfo` is set to false when a + // non-null pointer to clusterInfo is passed to the constructor of CTAPlanner. + // Otherwise, a self-managed ClusterInfo will be created and the ownInfo will + // be set to true. + bool ownInfo; + ttng::ClusterInfo *clusterInfo; + bool tiled; + unsigned step; + unsigned stepUnchanged; + std::queue queue; +}; + +CTAPlanner::CTAPlanner(ttng::ClusterInfo *clusterInfo_) + : ownInfo(false), clusterInfo(clusterInfo_), tiled(false), step(0), + stepUnchanged(0) { + if (clusterInfo == nullptr) { + clusterInfo = new ttng::ClusterInfo(); + ownInfo = true; + } +} + +CTAPlanner::~CTAPlanner() { + if (ownInfo) { + delete clusterInfo; + // Actually not necessary but safer + ownInfo = false; + clusterInfo = nullptr; + } +} + +void CTAPlanner::run(triton::FuncOp &funcOp) { + assert(!tiled && "Please create a new CTAPlanner"); + static const unsigned maxSteps = 10000; + + auto nextStep = [&]() { + ++step; + assert(step < maxSteps && "Maximum number of steps exceeded"); + }; + + processDot(funcOp); + nextStep(); + + processReduce(funcOp); + nextStep(); + + if (!tiled) { + processStoreLikeOps(funcOp); + nextStep(); + } + + while (!queue.empty()) { + CastOp cast = queue.front(); + queue.pop(); + bool changed = propagate(cast); + if (changed) { + stepUnchanged = 0; + } else { + queue.push(cast); + ++stepUnchanged; + } + nextStep(); + } +} + +CastOp CTAPlanner::markBackward(CastOp cast) const { + cast->setAttr("direction", StringAttr::get(cast.getContext(), "backward")); + return cast; +} + +CastOp CTAPlanner::markForward(CastOp cast) const { + cast->setAttr("direction", StringAttr::get(cast.getContext(), "forward")); + return cast; +} + +bool CTAPlanner::isBackward(CastOp cast) const { + return cast->getAttrOfType("direction") == "backward"; +} + +bool CTAPlanner::isForward(CastOp cast) const { + return cast->getAttrOfType("direction") == "forward"; +} + +void CTAPlanner::setTiling(llvm::ArrayRef CTAsPerCGA) { + assert(!tiled && "CTA tiling is already determinted"); + assert(clusterInfo && "ClusterInfo pointer is null"); + assert(CTAsPerCGA.size() <= 3 && "setTiling not implemented"); + if (CTAsPerCGA.size() > 0) + clusterInfo->clusterDimX = CTAsPerCGA[0]; + if (CTAsPerCGA.size() > 1) + clusterInfo->clusterDimY = CTAsPerCGA[1]; + if (CTAsPerCGA.size() > 2) + clusterInfo->clusterDimZ = CTAsPerCGA[2]; + tiled = true; +} + +bool CTAPlanner::processDot(triton::FuncOp &funcOp) { + // TODO: This is a naive implementation and should be refactored + auto getCTATiling = [](int64_t M, int64_t N, int64_t K, + unsigned numCTAs) -> std::pair { + unsigned splitM = std::clamp(M / 64, 1, numCTAs); + unsigned splitN = numCTAs / splitM; + return {splitM, splitN}; + }; + + funcOp.walk([&](triton::DotOp dot) { + MLIRContext *ctx = dot.getContext(); + + auto aTy = dot.getA().getType().cast(); + auto bTy = dot.getB().getType().cast(); + auto dTy = dot.getD().getType().cast(); + + assert(aTy.getEncoding().isa() && + bTy.getEncoding().isa() && + dTy.getEncoding().isa() && + "PlanCTAPass should follow immediately after CoalescePass"); + + auto aLayout = aTy.getEncoding().cast(); + auto bLayout = bTy.getEncoding().cast(); + auto dLayout = dTy.getEncoding().cast(); + + unsigned M = dTy.getShape()[0]; + unsigned N = dTy.getShape()[1]; + unsigned K = aTy.getShape()[1]; + + unsigned splitM, splitN; + std::tie(splitM, splitN) = getCTATiling(M, N, K, ttg::getNumCTAs(dLayout)); + // FIXME: Should consider IR with more than one DotOps + setTiling({splitM, splitN, 1}); + + auto newCTALayout = ttg::CTALayoutAttr::get(ctx, {splitM, splitN}, + {splitM, splitN}, {1, 0}); + auto newDLayout = ttg::BlockedEncodingAttr::get( + ctx, dTy.getShape(), dLayout.getSizePerThread(), dLayout.getOrder(), + ttg::getNumWarpsPerCTA(dLayout), 32, newCTALayout); + auto newALayout = ttg::DotOperandEncodingAttr::get(ctx, aLayout.getOpIdx(), + newDLayout, 0); + auto newBLayout = ttg::DotOperandEncodingAttr::get(ctx, bLayout.getOpIdx(), + newDLayout, 0); + + insertCasts(dot.getOperation(), {newALayout, newBLayout, newDLayout}, + {newDLayout}); + }); + + return true; +} + +bool CTAPlanner::processReduce(triton::FuncOp &funcOp) { + ModuleOp mod = funcOp->getParentOfType(); + unsigned numCTAs = ttg::TritonGPUDialect::getNumCTAs(mod); + + funcOp.walk([&](triton::ReduceOp reduce) { + MLIRContext *context = reduce.getContext(); + Value src = reduce.getOperands()[0]; + unsigned axis = reduce.getAxis(); + + auto srcTy = src.getType().cast(); + auto srcShape = srcTy.getShape(); + auto srcLayout = srcTy.getEncoding(); + + auto rank = srcShape.size(); + auto order = ttg::getOrder(srcLayout); + auto sizePerThread = ttg::getSizePerThread(srcLayout); + auto CTAOrder = ttg::getCTAOrder(srcLayout); + + llvm::SmallVector CTAsPerCGA(rank, 0); + unsigned remainingCTAs = numCTAs; + for (int i = rank - 1; i >= 0; --i) { + unsigned dim = order[i]; + if (dim == axis) { + CTAsPerCGA[dim] = 1; + } else { + CTAsPerCGA[dim] = std::min(srcShape[dim] / sizePerThread[dim], + remainingCTAs); + remainingCTAs /= CTAsPerCGA[dim]; + } + } + + for (int i = rank - 1; i >= 0; --i) { + unsigned dim = order[i]; + if (dim != axis) { + CTAsPerCGA[dim] *= remainingCTAs; + break; + } + } + + auto CTALayout = + ttg::CTALayoutAttr::get(context, CTAsPerCGA, CTAsPerCGA, CTAOrder); + if (!tiled) + setTiling(CTALayout.getCTAsPerCGA()); + auto newSrcLayout = replaceCTALayout(srcLayout, srcShape, CTALayout); + auto newResultLayout = + ttg::SliceEncodingAttr::get(context, axis, newSrcLayout); + unsigned numOperands = reduce.getNumOperands(); + SmallVector newSrcLayoutVec(numOperands, newSrcLayout); + SmallVector newResultLayoutVec(numOperands, newResultLayout); + + insertCasts(reduce.getOperation(), newSrcLayoutVec, newResultLayoutVec); + }); + return true; +} + +void CTAPlanner::processStoreLikeOps(triton::FuncOp &funcOp) { + assert(!tiled && "CTA tiling is already determinted"); + + llvm::SmallVector stores; + funcOp.walk([&](Operation *op) { + if (llvm::isa( + op)) + stores.push_back(op); + }); + assert(stores.size() > 0 && "Cannot find store-like ops"); + + ttg::CTALayoutAttr CTALayout; + for (Operation *store : stores) { + if (auto tensorTy = + store->getOperand(0).getType().dyn_cast()) { + if (!tiled) { + // Use CTA tiling of the first store-like op as global CTA tiling + CTALayout = ttg::getCTALayout(tensorTy.getEncoding()); + setTiling(CTALayout.getCTAsPerCGA()); + } + auto newLayout = replaceCTALayout(tensorTy.getEncoding(), + tensorTy.getShape(), CTALayout); + processElementwise(store, newLayout); + } + } + + // If all store-like ops are processing scalar values and no ReduceOp is + // found, we can conclude that this is an all-scalar computation, since + // ReduceOp is the only op that converts tensor values to scalar values. + if (!tiled) + setTiling({1, 1, 1}); +} + +bool CTAPlanner::propagate(CastOp cast) { + return isBackward(cast) ? propagateBackward(cast) : propagateForward(cast); +} + +bool CTAPlanner::propagateBackward(CastOp cast) { + Value input = cast.getOperand(0); + Value output = cast.getResult(0); + unsigned numUsers = getNumUsers(input); + if (numUsers == 0) { + assert(0 && "Unreachable branch"); + } else if (numUsers == 1) { + Type outTy = output.getType(); + if (auto ptrTy = outTy.dyn_cast()) + outTy = ptrTy.getPointeeType(); + Attribute layout = outTy.cast().getEncoding(); + Operation *op = input.getDefiningOp(); + if (op == nullptr) { + assert(input.isa() && + "Unexpected Value without defining op"); + processBlockArgBackward(input.cast(), cast); + } else if (auto prevCast = llvm::dyn_cast(op)) { + eliminateAdjacentCasts(prevCast, cast); + } else if (isLoadStoreOp(op)) { + processLoadStore(op, layout); + } else if (isElementwiseOp(op)) { + processElementwise(op, layout); + } else if (auto constant = llvm::dyn_cast(op)) { + processConstant(constant, layout); + } else if (auto splat = llvm::dyn_cast(op)) { + processSplat(splat, layout); + } else if (auto makeRange = llvm::dyn_cast(op)) { + processMakeRange(makeRange, layout); + } else if (auto makeTensorPtr = + llvm::dyn_cast(op)) { + processMakeTensorPtr(makeTensorPtr, layout); + } else if (llvm::isa(op)) { + // ptr operand and result have the same layout, while other operands are + // scalar values + processElementwise(op, layout); + } else if (auto broadcast = llvm::dyn_cast(op)) { + processBroadcast(broadcast, layout); + } else if (auto expandDims = llvm::dyn_cast(op)) { + processExpandDimsBackward(expandDims, layout); + } else if (auto ifOp = llvm::dyn_cast(op)) { + processIfOpBackward(ifOp, cast); + } else if (auto forOp = llvm::dyn_cast(op)) { + processForOpBackward(forOp, cast); + } else if (auto convertLayout = llvm::dyn_cast(op)) { + return processConvertLayoutBackward(convertLayout, cast); + } else { + // Keep original layouts. This may result in a loss of performance. + return processOpFallback(op); + } + return true; + } else { + return processMultiUsersBackward(input, cast); + } +} + +bool CTAPlanner::propagateForward(CastOp cast) { + Value input = cast.getOperand(0); + Value output = cast.getResult(0); + unsigned numUsers = getNumUsers(output); + if (numUsers == 0) { + cast.erase(); + } else if (numUsers == 1) { + Type inTy = input.getType(); + if (auto ptrTy = inTy.dyn_cast()) + inTy = ptrTy.getPointeeType(); + Attribute layout = inTy.cast().getEncoding(); + Operation *op = *output.user_begin(); + if (auto nextCast = llvm::dyn_cast(op)) { + eliminateAdjacentCasts(cast, nextCast); + } else if (isLoadStoreOp(op)) { + processLoadStore(op, layout); + } else if (isElementwiseOp(op)) { + processElementwise(op, layout); + } else if (llvm::isa(op)) { + // ptr operand and result have the same layout, while other operands are + // scalar values + processElementwise(op, layout); + } else if (auto convertLayout = llvm::dyn_cast(op)) { + return processConvertLayoutForward(convertLayout, cast); + } else if (auto forOp = llvm::dyn_cast(op)) { + processForOpForward(forOp, cast); + } else if (auto yieldOp = llvm::dyn_cast(op)) { + processYieldOpForward(yieldOp, cast); + } else { + // Keep original layouts. This may result in a loss of performance. + return processOpFallback(op); + } + } else { + processMultiUsersForward(output, cast); + } + return true; +} + +void CTAPlanner::eraseCastOp(CastOp cast) { + Value output = cast.getResult(0); + assert(getNumUsers(output) == 0 && + "Cannot erase CastOp because it is still in use"); + cast.erase(); +} + +void CTAPlanner::eraseCastOpFromQueue(CastOp cast) { + eraseCastOpsFromQueue({cast}); +} + +void CTAPlanner::eraseCastOpsFromQueue(llvm::ArrayRef casts) { + llvm::DenseSet erased; + for (CastOp cast : casts) { + eraseCastOp(cast); + erased.insert(cast); + } + + decltype(queue) tempQueue; + std::swap(queue, tempQueue); + + // This is only a naive implementation. Should refactor with linked-list. + while (!tempQueue.empty()) { + auto cast = tempQueue.front(); + tempQueue.pop(); + if (!erased.contains(cast)) + queue.push(cast); + } +} + +void CTAPlanner::insertCasts(Operation *op, + llvm::ArrayRef newOperandLayouts, + llvm::ArrayRef newResultLayouts) { + assert(op->getNumOperands() == newOperandLayouts.size() && + "NumOperands mismatched"); + assert(op->getNumResults() == newResultLayouts.size() && + "NumResults mismatched"); + + Location loc = op->getLoc(); + OpBuilder builder(op->getContext()); + + builder.setInsertionPoint(op); + for (unsigned i = 0; i < op->getNumOperands(); ++i) { + Value operand = op->getOperand(i); + auto operandTy = operand.getType(); + if (triton::isTensorOrTensorPointerType(operandTy)) { + operandTy = replaceLayout(operandTy, newOperandLayouts[i]); + auto cast = markBackward(builder.create(loc, operandTy, operand)); + op->setOperand(i, cast.getResult(0)); + queue.push(cast); + } + } + + builder.setInsertionPointAfter(op); + for (unsigned i = 0; i < op->getNumResults(); ++i) { + Value result = op->getResult(i); + auto resultTy = result.getType(); + if (triton::isTensorOrTensorPointerType(resultTy)) { + resultTy = replaceLayout(resultTy, newResultLayouts[i]); + auto cast = + markForward(builder.create(loc, result.getType(), result)); + result.setType(resultTy); + result.replaceAllUsesExcept(cast.getResult(0), cast.getOperation()); + queue.push(cast); + } + } +} + +void CTAPlanner::eliminateAdjacentCasts(CastOp cast0, CastOp cast1) { + assert(cast0.getResult(0) == cast1.getOperand(0) && + "The two casts are not adjacent"); + assert(isForward(cast0) && isBackward(cast1) && + "Expected pattern of adjacent casts: forward + backward"); + + Value input = cast0.getOperand(0); + Value output = cast1.getResult(0); + + if (input.getType() == output.getType()) { + output.replaceAllUsesWith(input); + eraseCastOpsFromQueue({cast1, cast0}); + } else { + OpBuilder builder(cast1.getOperation()); + auto cvt = builder.create(cast1.getLoc(), + output.getType(), input); + output.replaceAllUsesWith(cvt.getResult()); + eraseCastOpsFromQueue({cast1, cast0}); + } +} + +bool CTAPlanner::isLoadStoreOp(Operation *op) const { + return llvm::isa(op); +} + +bool CTAPlanner::processLoadStore(Operation *op, Attribute layout) { + // Special logic for: + // LoadOp -> SliceLayout + // Transform to: + // LoadOp -> originalLayout -> ConvertLayout(DSmem) -> SliceLayout + if (auto sliceLayout = layout.dyn_cast()) { + auto dim = sliceLayout.getDim(); + auto CTAsPerCGA = ttg::getCTAsPerCGA(sliceLayout.getParent()); + if (CTAsPerCGA[dim] > 1) { + // Find an input or output value of LoadOp or StoreOp to get its layout + Value val = + op->getNumResults() > 0 ? op->getResult(0) : op->getOperand(0); + Attribute originalLayout = + val.getType().cast().getEncoding(); + // Insert casts using originalLayout. Adjacent casts will be eliminated + // and generate a ConvertLayoutOp with DSmem access + return processLoadStore(op, originalLayout); + } + } + + auto CTALayout = ttg::getCTALayout(layout); + + llvm::SmallVector newOperandLayouts; + for (unsigned i = 0; i < op->getNumOperands(); ++i) { + auto type = op->getOperand(i).getType(); + if (auto ptrTy = type.dyn_cast()) + type = ptrTy.getPointeeType(); + auto tensorTy = type.cast(); + auto newLayout = replaceCTALayout(tensorTy.getEncoding(), + tensorTy.getShape(), CTALayout); + newOperandLayouts.push_back(newLayout); + } + + llvm::SmallVector newResultLayouts; + for (unsigned i = 0; i < op->getNumResults(); ++i) { + auto type = op->getResult(i).getType(); + if (auto ptrTy = type.dyn_cast()) + type = ptrTy.getPointeeType(); + auto tensorTy = type.cast(); + auto newLayout = replaceCTALayout(tensorTy.getEncoding(), + tensorTy.getShape(), CTALayout); + newResultLayouts.push_back(newLayout); + } + + insertCasts(op, newOperandLayouts, newResultLayouts); + return true; +} + +bool CTAPlanner::isElementwiseOp(Operation *op) const { + if (llvm::isa(op)) + return true; + if (llvm::isa(op)) + return true; + if (llvm::isa(op)) + return true; + if (llvm::isa(op)) + return true; + return false; +} + +bool CTAPlanner::processElementwise(Operation *op, Attribute layout) { + llvm::SmallVector newOperandLayouts(op->getNumOperands(), layout); + llvm::SmallVector newResultLayouts(op->getNumResults(), layout); + insertCasts(op, newOperandLayouts, newResultLayouts); + return true; +} + +bool CTAPlanner::processConstant(arith::ConstantOp constant, Attribute layout) { + if (auto tensorTy = + constant.getResult().getType().dyn_cast()) { + if (auto attr = constant.getValue().dyn_cast()) { + + auto newTensorTy = RankedTensorType::get( + tensorTy.getShape(), tensorTy.getElementType(), layout); + constant.setValueAttr( + SplatElementsAttr::get(newTensorTy, attr.getSplatValue())); + } + } + insertCasts(constant.getOperation(), {}, {layout}); + return true; +} + +bool CTAPlanner::processSplat(triton::SplatOp splat, Attribute layout) { + insertCasts(splat.getOperation(), {{}}, {layout}); + return true; +} + +bool CTAPlanner::processMakeRange(triton::MakeRangeOp makeRange, + Attribute layout) { + insertCasts(makeRange.getOperation(), {}, {layout}); + return true; +} + +bool CTAPlanner::processMakeTensorPtr(triton::MakeTensorPtrOp makeTensorPtr, + Attribute layout) { + // All inputs of `makeTensorPtr` are scalar types + llvm::SmallVector dummyInAttrs(makeTensorPtr.getNumOperands(), {}); + insertCasts(makeTensorPtr.getOperation(), dummyInAttrs, {layout}); + return true; +} + +bool CTAPlanner::processBroadcast(triton::BroadcastOp broadcast, + Attribute layout) { + insertCasts(broadcast.getOperation(), {layout}, {layout}); + return true; +} + +bool CTAPlanner::processExpandDimsBackward(triton::ExpandDimsOp expandDims, + Attribute newResultLayout) { + auto newSrcLayout = ttg::SliceEncodingAttr::get( + newResultLayout.getContext(), expandDims.getAxis(), newResultLayout); + insertCasts(expandDims.getOperation(), {newSrcLayout}, {newResultLayout}); + return true; +} + +bool CTAPlanner::processExpandDimsForward(triton::ExpandDimsOp expandDims, + Attribute newSrcLayout) { + assert(0 && "processExpandDimsForward not implemented yet"); + return true; +} + +bool CTAPlanner::processConvertLayoutBackward( + ttg::ConvertLayoutOp convertLayout, CastOp cast) { + Value src = convertLayout.getSrc(); + Value result = convertLayout.getResult(); + assert(getNumUsers(result) == 1 && + "Expect to call processMultiUsersBackward first"); + result.replaceAllUsesWith(src); + convertLayout.erase(); + queue.push(cast); + return true; +} + +bool CTAPlanner::processConvertLayoutForward(ttg::ConvertLayoutOp convertLayout, + CastOp cast) { + Value src = convertLayout.getSrc(); + Value result = convertLayout.getResult(); + assert(getNumUsers(src) == 1 && + "Expect to call processMultiUsersForward first"); + src.setType(result.getType()); + result.replaceAllUsesWith(src); + convertLayout.erase(); + queue.push(cast); + return true; +} + +bool CTAPlanner::processIfOp(scf::IfOp ifOp, int index, const Type &newType) { + // Check index + assert(index < ifOp.getNumResults() && "Invalid result index of IfOp"); + assert(index < ifOp.thenYield().getNumOperands() && + "Invalid operand index of YieldOp"); + assert(index < ifOp.elseYield().getNumOperands() && + "Invalid operand index of YieldOp"); + + Location loc = ifOp.getLoc(); + OpBuilder builder(ifOp.getContext()); + + // Insert forward cast after ifOp + Value result = ifOp.getResult(index); + builder.setInsertionPointAfter(ifOp.getOperation()); + auto newCast = + markForward(builder.create(loc, result.getType(), result)); + result.setType(newType); + result.replaceAllUsesExcept(newCast.getResult(0), newCast.getOperation()); + queue.push(newCast); + + // Insert backward casts before yield + for (scf::YieldOp yield : {ifOp.thenYield(), ifOp.elseYield()}) { + Value yieldSrc = yield.getOperand(index); + builder.setInsertionPoint(yield.getOperation()); + newCast = markBackward(builder.create(loc, newType, yieldSrc)); + yield->setOperand(index, newCast.getResult(0)); + queue.push(newCast); + } + + return true; +} + +bool CTAPlanner::processForOp(scf::ForOp forOp, int index, + const Type &newType) { + Block *body = forOp.getBody(); + auto yield = llvm::cast(forOp.getBody()->getTerminator()); + + // Check index + assert(index + forOp.getNumControlOperands() < forOp.getNumOperands() && + "Invalid operand index of ForOp"); + assert(index + forOp.getNumInductionVars() < body->getNumArguments() && + "Invalid block arg index of ForOp"); + assert(index < yield.getNumOperands() && "Invalid operand index of YieldOp"); + assert(index < forOp.getNumResults() && "Invalid result index of IfOp"); + + Location loc = forOp.getLoc(); + OpBuilder builder(forOp.getContext()); + + // Insert backward cast before forOp + OpOperand &operand = + forOp->getOpOperand(index + forOp.getNumControlOperands()); + builder.setInsertionPoint(forOp.getOperation()); + auto newCast = + markBackward(builder.create(loc, newType, operand.get())); + operand.set(newCast.getResult(0)); + queue.push(newCast); + + // Insert forward cast after block arg + Value arg = body->getArgument(index + forOp.getNumInductionVars()); + builder.setInsertionPointToStart(body); + newCast = markForward(builder.create(loc, arg.getType(), arg)); + arg.setType(newType); + arg.replaceAllUsesExcept(newCast.getResult(0), newCast.getOperation()); + queue.push(newCast); + + // Insert backward cast before yield + Value yieldSrc = yield.getOperand(index); + builder.setInsertionPoint(yield.getOperation()); + newCast = markBackward(builder.create(loc, newType, yieldSrc)); + yield->setOperand(index, newCast.getResult(0)); + queue.push(newCast); + + // Insert forward cast after forOp + Value result = forOp.getResult(index); + builder.setInsertionPointAfter(forOp.getOperation()); + newCast = markForward(builder.create(loc, result.getType(), result)); + result.setType(newType); + result.replaceAllUsesExcept(newCast.getResult(0), newCast.getOperation()); + queue.push(newCast); + + return true; +} + +int findResultIndex(Operation *op, Value result) { + for (int i = 0; i < op->getNumResults(); ++i) + if (op->getResult(i) == result) + return i; + assert(0 && "Invalid index of op result"); + return -1; +} + +bool CTAPlanner::processIfOpBackward(scf::IfOp ifOp, CastOp cast) { + int index = findResultIndex(ifOp.getOperation(), cast.getOperand(0)); + auto newType = cast.getResult(0).getType(); + return processIfOp(ifOp, index, newType); +} + +bool CTAPlanner::processForOpBackward(scf::ForOp forOp, CastOp cast) { + int index = findResultIndex(forOp.getOperation(), cast.getOperand(0)); + auto newType = cast.getResult(0).getType(); + return processForOp(forOp, index, newType); +} + +bool CTAPlanner::processBlockArgBackward(BlockArgument arg, CastOp cast) { + if (auto forOp = llvm::dyn_cast(arg.getOwner()->getParentOp())) { + int index = int(arg.getArgNumber()) - forOp.getNumInductionVars(); + auto newType = cast.getResult(0).getType(); + return processForOp(forOp, index, newType); + } else { + assert(0 && "Unexpected parent op of block argument"); + return true; + } +} + +bool CTAPlanner::processForOpForward(scf::ForOp forOp, CastOp cast) { + int index = cast.getResult(0).use_begin()->getOperandNumber() - + forOp.getNumControlOperands(); + auto newType = cast.getOperand(0).getType(); + return processForOp(forOp, index, newType); +} + +bool CTAPlanner::processYieldOpForward(scf::YieldOp yieldOp, CastOp cast) { + int index = cast.getResult(0).use_begin()->getOperandNumber(); + auto newType = cast.getOperand(0).getType(); + if (auto ifOp = llvm::dyn_cast(yieldOp->getParentOp())) + return processIfOp(ifOp, index, newType); + else if (auto forOp = llvm::dyn_cast(yieldOp->getParentOp())) + return processForOp(forOp, index, newType); + else + assert(0 && "Unexpected parent op of YieldOp"); + return true; +} + +bool CTAPlanner::processOpFallback(Operation *op) { + Location loc = op->getLoc(); + OpBuilder builder(op->getContext()); + + builder.setInsertionPoint(op); + for (unsigned i = 0; i < op->getNumOperands(); ++i) { + Value operand = op->getOperand(i); + auto operandTy = operand.getType(); + if (triton::isTensorOrTensorPointerType(operandTy)) { + auto cast = markBackward(builder.create(loc, operandTy, operand)); + op->setOperand(i, cast.getResult(0)); + queue.push(cast); + } + } + + builder.setInsertionPointAfter(op); + for (unsigned i = 0; i < op->getNumResults(); ++i) { + Value result = op->getResult(i); + auto resultTy = result.getType(); + if (triton::isTensorOrTensorPointerType(resultTy)) { + auto cast = markForward(builder.create(loc, resultTy, result)); + result.replaceAllUsesExcept(cast.getResult(0), cast.getOperation()); + queue.push(cast); + } + } + + return true; +} + +bool CTAPlanner::processMultiUsersBackward(Value input, CastOp cast) { + Location loc = input.getLoc(); + OpBuilder builder(input.getContext()); + + llvm::DenseMap> typeToIndices; + for (OpOperand &operand : input.getUses()) { + auto brotherCast = llvm::dyn_cast(operand.getOwner()); + if (!brotherCast) { + if (stepUnchanged <= queue.size()) + return false; + builder.setInsertionPoint(operand.getOwner()); + brotherCast = markBackward( + builder.create(loc, cast.getResult(0).getType(), input)); + auto newCast = markForward(builder.create( + loc, input.getType(), brotherCast.getResult(0))); + operand.set(newCast.getResult(0)); + queue.push(brotherCast); + queue.push(newCast); + } + auto type = brotherCast.getResult(0).getType(); + typeToIndices[type].push_back(brotherCast); + } + + bool first = true; + for (auto it : typeToIndices) { + Type &type = it.first; + llvm::SmallVector &casts = it.second; + Value newInput = input; + if (!first) { + if (Operation *defOp = input.getDefiningOp()) { + builder.setInsertionPointAfter(defOp); + Operation *clonedOp = builder.clone(*defOp); + newInput = clonedOp->getResult(0); + } else { + assert(0 && "Layout conflict for block arg"); // TODO + } + } + first = false; + if (Operation *defOp = newInput.getDefiningOp()) { + builder.setInsertionPointAfter(defOp); + } else { + assert(newInput.isa() && + "Unexpected Value without defining op"); + builder.setInsertionPointToStart( + newInput.cast().getOwner()); + } + auto newCast = markBackward(builder.create(loc, type, newInput)); + queue.push(newCast); + auto newResult = newCast.getResult(0); + for (CastOp &brotherCast : casts) { + brotherCast.getResult(0).replaceAllUsesWith(newResult); + eraseCastOpFromQueue(brotherCast); + } + } + return true; +} + +bool CTAPlanner::processMultiUsersForward(Value castResult, CastOp cast) { + Value castSrc = cast.getOperand(0); + + Location loc = cast.getLoc(); + OpBuilder builder(cast.getContext()); + builder.setInsertionPointAfter(cast.getOperation()); + + while (!castResult.use_empty()) { + auto newCast = + markForward(builder.create(loc, castResult.getType(), castSrc)); + castResult.use_begin()->set(newCast.getResult(0)); + queue.push(newCast); + } + + eraseCastOp(cast); + return true; +} + +struct PlanCTAPass : public TritonGPUPlanCTAPassBase { + PlanCTAPass(ttng::ClusterInfo *clusterInfo_ = nullptr) + : clusterInfo(clusterInfo_) {} + + void runOnOperation() override { + ModuleOp mod = getOperation(); + + // Skip PlanCTAPass when numCTAs == 1 + if (ttg::TritonGPUDialect::getNumCTAs(mod) == 1) + return; + + mod.walk([&](triton::FuncOp funcOp) { + CTAPlanner planner(clusterInfo); + planner.run(funcOp); + + // FIXME: Clone funcOp so that the IR change can be identified after + // PlanCTAPass. Without this, the change after PlanCTAPass will not be + // displayed when MLIR_ENABLE_DUMP=1. This is not reasonable and should + // be fixed later. + OpBuilder builder(funcOp); + builder.clone(*funcOp.getOperation()); + funcOp.erase(); + }); + } + + ttng::ClusterInfo *clusterInfo; +}; + +} // namespace + +std::unique_ptr +mlir::createTritonNvidiaGPUPlanCTAPass(ttng::ClusterInfo *clusterInfo) { + return std::make_unique(clusterInfo); +} + +/* TODO + * - Use ConvertLayoutOp instead of UnrealizedConversionCastOp. + * - Move PlanCTAPass to the front of CoalescePass. + * - Design better tiling strategy for DotOp and ReduceOp. + * - Consider cases where there are more than one DotOps. + * - Use better data structure for erasing CastOps from queue (linked list?). + * - Process eliminable CastOps in higher priority. + * - Fix the clone func bug in PlanCTAPass::runOnOperation. + * - Add some comments to introduce the overall idea of this pass. + * - Add some lit tests for this pass. + */ diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/RewriteTensorPointer.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/RewriteTensorPointer.cpp new file mode 100644 index 000000000000..dfbe9d7cb901 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/RewriteTensorPointer.cpp @@ -0,0 +1,752 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/Pass/Pass.h" +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include "triton/Tools/Sys/GetEnv.hpp" + +#include +#include + +using namespace mlir; +namespace tt = mlir::triton; +namespace ttg = mlir::triton::gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace { +bool isDivisible(Value v, unsigned divisor) { + if (auto op = v.getDefiningOp()) { + return op.getValue().dyn_cast().getValue().getZExtValue() % + divisor == + 0; + } + if (v.getDefiningOp() && + isa(v.getDefiningOp())) { + return isDivisible(v.getDefiningOp()->getOperand(0), divisor); + } else if (v.getParentBlock()->isEntryBlock() && v.isa()) { + BlockArgument blockArg = v.cast(); + Operation *parentOp = blockArg.getOwner()->getParentOp(); + auto func = dyn_cast(parentOp); + assert(func); + if (auto attr = func.getArgAttrOfType(blockArg.getArgNumber(), + "tt.max_divisibility")) + return attr.getValue().getZExtValue() % divisor == 0; + return false; + } else if (v.getParentBlock()->isEntryBlock() && (!v.isa())) { + // in entryblock but not BlockArgument + return isDivisible(v.getDefiningOp()->getOperand(0), divisor); + } else if (!v.getParentBlock()->isEntryBlock()) { + // in non-entryblock + return isDivisible(v.getDefiningOp()->getOperand(0), divisor); + } else { + llvm::report_fatal_error( + "Operand of `MakeTensorPtrOp` is not the function's argument"); + return false; + } +} + +bool shouldRemove(tt::MakeTensorPtrOp &op, int computeCapability) { + if (computeCapability < 90 || !::triton::tools::getBoolEnv("ENABLE_TMA")) + return true; + auto resType = op.getResult() + .getType() + .cast() + .getPointeeType() + .cast(); + auto elemType = resType.getElementType(); + auto ord = op.getOrder(); + auto stride = op.getStrides(); + auto shape = ttg::getShapePerCTA(resType); + // TMA load/store requires the box dimension to be more than 32 bytes. + // Because we only support 32B-swizzle, 64B-swizzle and 128B-swizzleon for + // now. Remove this constraint when we support non-swizzle smem. + bool boxDimSwizzle = + shape[ord[0]] >= (256 / elemType.getIntOrFloatBitWidth()); + // we only support TMA load with 2D tensor for now. + // TMA load/store requires the stride to be divisible by 16 bytes. + bool strideDivisible = false; + if (stride.size() == 2) + strideDivisible = + isDivisible(stride[ord[1]], 128 / elemType.getIntOrFloatBitWidth()); + bool enableTMA = ::triton::tools::getBoolEnv("ENABLE_TMA"); + return !(boxDimSwizzle && strideDivisible && enableTMA); +} + +// TODO: When encoding exists use triton::gpu::CmpIOp as arith::CmpIOp doesn't +// play well with encoding attributes. Move back to arith::CmpIOp when this pass +// moves back to triton IR level. +Value createCmpOp(OpBuilder &builder, Location loc, RankedTensorType type, + arith::CmpIPredicate pred, Value lhs, Value rhs) { + if (type.getEncoding()) + return builder.create(loc, type, pred, lhs, rhs); + return builder.create(loc, type, pred, lhs, rhs); +} + +/// An additional struct to record the meta information of operations +/// with tensor pointers +struct RewritedInfo { +private: + Value base; + SmallVector shape; + SmallVector strides; + SmallVector offsets; + ArrayRef tensorShape; + Attribute layout; + + // A cache to avoid generating the same offset with range + DenseMap cachedOffsetWithRange; + + template + SmallVector insertOne(ArrayRef vec, unsigned axis) const { + SmallVector res(vec.begin(), vec.end()); + res.insert(res.begin() + axis, 1); + return res; + } + + // Example: order = [ 0, 2, 1, 3], dim = 2 + // resOrder = [2, 0, 3, 1, 4] + SmallVector insertOrder(ArrayRef order, + unsigned axis) const { + SmallVector resOrder(order.begin(), order.end()); + for (unsigned i = 0; i < resOrder.size(); ++i) + if (resOrder[i] >= axis) + ++resOrder[i]; + resOrder.insert(resOrder.begin(), axis); + return resOrder; + } + +public: + RewritedInfo() = default; + + RewritedInfo(const RewritedInfo &other) = default; + + RewritedInfo(Value base, const SmallVector &shape, + const SmallVector &strides, + const SmallVector &offsets, + const ArrayRef &tensorShape, Attribute layout) + : base(base), shape(shape), strides(strides), offsets(offsets), + tensorShape(tensorShape), layout(layout) { + assert(shape.size() == strides.size() && shape.size() == offsets.size() && + shape.size() == tensorShape.size()); + } + + unsigned int length() const { return shape.size(); } + + Value getOffset(unsigned i) { return offsets[i]; } + + SmallVector getOffsets() { return offsets; } + + void setOffset(unsigned i, Value newOffset) { + offsets[i] = newOffset; + cachedOffsetWithRange.clear(); + } + + void setOffsets(const SmallVector &newOffsets) { + offsets = newOffsets; + cachedOffsetWithRange.clear(); + } + + void setEncoding(Attribute newLayout) { layout = newLayout; } + + Value getExpandedOffsetWithRange(OpBuilder &builder, const Location &loc, + unsigned i) { + if (cachedOffsetWithRange.count(i)) + return cachedOffsetWithRange[i]; + + // Add range + auto indexI32RowType = + RankedTensorType::get({tensorShape[i]}, builder.getI32Type(), layout); + auto indexRowType = + RankedTensorType::get({tensorShape[i]}, builder.getI64Type(), layout); + Value splatOffset = + builder.create(loc, indexRowType, offsets[i]); + Value range = builder.create(loc, indexI32RowType, 0, + tensorShape[i]); + Value i64Range = builder.create(loc, indexRowType, range); + + // Expand dimensions + Value expandedResult = + builder.create(loc, splatOffset, i64Range); + for (int axis = 0; axis < tensorShape.size(); ++axis) { + if (axis == i) + continue; + + if (layout) { + auto argEncoding = layout.cast(); + auto retSizePerThread = insertOne(argEncoding.getSizePerThread(), axis); + auto retThreadsPerWarp = + insertOne(argEncoding.getThreadsPerWarp(), axis); + auto retWarpsPerCTA = insertOne(argEncoding.getWarpsPerCTA(), axis); + auto retOrder = insertOrder(argEncoding.getOrder(), axis); + + auto argCTALayout = argEncoding.getCTALayout(); + auto retCTAsPerCGA = insertOne(argCTALayout.getCTAsPerCGA(), axis); + auto retCTASplitNum = insertOne(argCTALayout.getCTASplitNum(), axis); + auto retCTAOrder = insertOrder(argCTALayout.getCTAOrder(), axis); + + auto retCTALayout = ttg::CTALayoutAttr::get( + loc.getContext(), retCTAsPerCGA, retCTASplitNum, retCTAOrder); + + auto retEncoding = ttg::BlockedEncodingAttr::get( + loc.getContext(), retSizePerThread, retThreadsPerWarp, + retWarpsPerCTA, retOrder, retCTALayout); + + auto newArgEncoding = + ttg::SliceEncodingAttr::get(loc.getContext(), axis, retEncoding); + auto newArgType = RankedTensorType::get(indexRowType.getShape(), + indexRowType.getElementType(), + newArgEncoding); + Value newArg = builder.create(loc, newArgType, + expandedResult); + expandedResult = builder.create(loc, newArg, axis); + } else + expandedResult = + builder.create(loc, expandedResult, axis); + } + + return cachedOffsetWithRange[i] = expandedResult; + } + + Value generatePtr(OpBuilder &builder, const Location &loc) { + assert(tensorShape.size() == offsets.size() && + tensorShape.size() == strides.size()); + auto ptrType = base.getType().cast(); + auto ptrTensorType = RankedTensorType::get(tensorShape, ptrType, layout); + + // Generate offsets per dimension + Value ptr = builder.create(loc, ptrTensorType, base); + for (unsigned i = 0; i < tensorShape.size(); ++i) { + auto offsetWithRange = getExpandedOffsetWithRange(builder, loc, i); + // We must splat strides into the expanded shape not a row for retaining + // the divisibility information given by strides + Value splatStride = builder.create( + loc, offsetWithRange.getType(), strides[i]); + Value offsetWithStride = + builder.create(loc, offsetWithRange, splatStride); + auto offsetType = offsetWithRange.getType().cast(); + auto indexTensorType = RankedTensorType::get( + tensorShape, offsetType.getElementType(), offsetType.getEncoding()); + Value broadcasted = builder.create(loc, indexTensorType, + offsetWithStride); + if (offsetType.getEncoding() != ptrTensorType.getEncoding()) { + auto newArgType = + RankedTensorType::get(tensorShape, offsetType.getElementType(), + ptrTensorType.getEncoding()); + broadcasted = + builder.create(loc, newArgType, broadcasted); + } + // Add to the pointer + ptr = builder.create(loc, ptrTensorType, ptr, broadcasted); + } + + return ptr; + } + + Value generateMask(OpBuilder &builder, const Location &loc, + const std::optional> &boundaryCheck) { + if (!boundaryCheck.has_value() || boundaryCheck.value().empty()) + return {}; + + // Generate mask per dimension + auto maskTensorType = + RankedTensorType::get(tensorShape, builder.getI1Type(), layout); + Value mask; + for (auto i : boundaryCheck.value()) { + auto offsetWithRange = getExpandedOffsetWithRange(builder, loc, i); + auto offsetType = offsetWithRange.getType().cast(); + RankedTensorType cmpTensorType = RankedTensorType::get( + offsetType.getShape(), builder.getI1Type(), offsetType.getEncoding()); + + // Compare with lower bound + Value lowerBound = builder.create( + loc, 0, offsetType.getElementType()); + Value splatLowerBound = builder.create( + loc, offsetWithRange.getType(), lowerBound); + Value cmpLower = + createCmpOp(builder, loc, cmpTensorType, arith::CmpIPredicate::sge, + offsetWithRange, splatLowerBound); + + // Compare with upper bound + Value splatUpperBound = + builder.create(loc, offsetWithRange.getType(), shape[i]); + Value cmpUpper = + createCmpOp(builder, loc, cmpTensorType, arith::CmpIPredicate::slt, + offsetWithRange, splatUpperBound); + + // And and broadcast + Value andResult = builder.create(loc, cmpLower, cmpUpper); + if (offsetType.getEncoding() != maskTensorType.getEncoding()) { + auto newArgType = + RankedTensorType::get(offsetType.getShape(), builder.getI1Type(), + maskTensorType.getEncoding()); + andResult = + builder.create(loc, newArgType, andResult); + } + + Value broadcasted = + builder.create(loc, maskTensorType, andResult); + + // And up all results + if (!mask) { + mask = broadcasted; + } else { + mask = builder.create(loc, mask, broadcasted); + } + } + + return mask; + } + + Value generateOther(OpBuilder &builder, const Location &loc, + const std::optional &padding) { + if (!padding.has_value()) + return Value(); + + // Create element attribute + auto elementType = base.getType().cast().getPointeeType(); + auto otherTensorType = + RankedTensorType::get(tensorShape, elementType, layout); + + // Set zero padding value + TypedAttr attr = + elementType.isIntOrIndex() + ? builder.getIntegerAttr(elementType, 0).cast() + : builder.getFloatAttr(elementType, 0).cast(); + + // Float NaN padding case + if (padding.value() == tt::PaddingOption::PAD_NAN) { + assert(!elementType.isIntOrIndex()); + auto apNaN = llvm::APFloat::getNaN( + attr.cast().getValue().getSemantics()); + attr = builder.getFloatAttr(elementType, apNaN); + } + + // Create tensor + Value constant = builder.create(loc, attr); + return builder.create(loc, otherTensorType, constant); + } +}; +} // namespace + +class TritonGPURewriteTensorPointerPass + : public TritonGPURewriteTensorPointerBase< + TritonGPURewriteTensorPointerPass> { +private: + int computeCapability; + DenseMap rewritedInfo; + +public: + explicit TritonGPURewriteTensorPointerPass(int computeCapability) + : computeCapability(computeCapability) {} + + static bool needRewrite(Operation *op, const DenseSet &valueToRemove) { + return std::any_of(op->getOperands().begin(), op->getOperands().end(), + [&valueToRemove](Value operand) { + return tt::isTensorPointerType(operand.getType()) && + valueToRemove.count(operand); + }); + } + + static SmallVector + generateNewOperands(const SmallVector &oldOperands, unsigned index, + const SmallVector &newValues) { + assert(index < oldOperands.size()); + SmallVector newOperands; + for (int i = 0; i < index; ++i) + newOperands.push_back(oldOperands[i]); + for (auto value : newValues) + newOperands.push_back(value); + for (auto i = index + 1; i < oldOperands.size(); ++i) + newOperands.push_back(oldOperands[i]); + return newOperands; + } + + Operation *rewriteMakeTensorPtrOp(OpBuilder &builder, tt::MakeTensorPtrOp op, + std::stack &eraser, + const DenseSet &valueToRemove) { + if (!valueToRemove.count(op.getResult())) + return nullptr; + // Save info for later use + auto ptrType = op.getResult().getType().cast(); + auto tensorType = ptrType.getPointeeType().cast(); + + // Cast I32 offsets into I64 + SmallVector i64Offsets; + for (auto offset : op.getOffsets()) { + auto i64Offset = builder.create( + op.getLoc(), builder.getI64Type(), offset); + i64Offsets.push_back(i64Offset); + } + + // Save information + rewritedInfo[op.getResult()] = + RewritedInfo(op.getBase(), op.getShape(), op.getStrides(), i64Offsets, + tensorType.getShape(), tensorType.getEncoding()); + + // Erase the original operation + eraser.push(op); + return nullptr; + } + + Operation *rewriteAdvanceOp(OpBuilder &builder, tt::AdvanceOp op, + std::stack &eraser, + const DenseSet &valueToRemove) { + if (!valueToRemove.count(op.getResult())) { + return nullptr; + } + // Get info from previous results + assert(rewritedInfo.count(op.getPtr())); + auto info = rewritedInfo[op.getPtr()]; + + // Calculate new offsets + assert(info.length() == op.getOffsets().size()); + SmallVector newOffsets; + for (int i = 0; i < info.length(); ++i) { + Value i64Offset = builder.create( + op.getLoc(), builder.getI64Type(), op.getOffsets()[i]); + Value newOffset = builder.create( + op.getLoc(), info.getOffset(i), i64Offset); + newOffsets.push_back(newOffset); + } + + // Save info for later use + info.setOffsets(newOffsets); + rewritedInfo[op.getResult()] = info; + + // Erase the original operation + eraser.push(op); + return nullptr; + } + + Operation *rewriteLoadStoreOp(OpBuilder &builder, Operation *op, + std::stack &eraser, + const DenseSet &valueToRemove) { + if (!valueToRemove.count(op->getOperand(0))) + return nullptr; + + // We only have to rewrite load/stores with tensor pointers + auto ptr = op->getOperand(0); + if (!tt::isTensorPointerType(ptr.getType())) + return nullptr; + + // Get info from previous results + assert(rewritedInfo.count(ptr)); + auto info = rewritedInfo[ptr]; + + // Load/store with tensor pointers implicitly will check the bound while + // accessing memory, so we should set `mask` and `other` (according to the + // padding). Also note that load with tensor pointers do not have `mask` and + // `other` while building IR from Python AST + std::optional> boundaryCheck; + if (auto loadOp = dyn_cast(op)) { + assert(!loadOp.getMask() && !loadOp.getOther()); + boundaryCheck = loadOp.getBoundaryCheck(); + if (auto valueType = + dyn_cast(loadOp.getResult().getType())) + info.setEncoding(valueType.getEncoding()); + } else if (auto storeOp = dyn_cast(op)) { + assert(!storeOp.getMask()); + boundaryCheck = storeOp.getBoundaryCheck(); + if (auto valueType = + dyn_cast(storeOp.getValue().getType())) + info.setEncoding(valueType.getEncoding()); + } + + // Generate new `ptr`, `mask` and `other` + auto newPtr = info.generatePtr(builder, op->getLoc()); + auto newMask = info.generateMask(builder, op->getLoc(), boundaryCheck); + Value newOther; + if (auto loadOp = dyn_cast(op)) + newOther = info.generateOther(builder, op->getLoc(), loadOp.getPadding()); + + // Create a new operation + if (auto loadOp = dyn_cast(op)) { + auto newResult = builder.create( + loadOp.getLoc(), loadOp.getResult().getType(), newPtr, newMask, + newOther, loadOp.getBoundaryCheckAttr(), loadOp.getPaddingAttr(), + loadOp.getCache(), loadOp.getEvict(), loadOp.getIsVolatile()); + op->getResult(0).replaceAllUsesWith(newResult); + } else if (auto storeOp = dyn_cast(op)) { + builder.create(storeOp.getLoc(), newPtr, storeOp.getValue(), + newMask, storeOp.getCache(), + storeOp.getEvict()); + } + + // Erase the original operation + eraser.push(op); + return nullptr; + } + + Operation *rewriteForOp(OpBuilder &builder, scf::ForOp op, + std::stack &eraser, + DenseSet &valueToRemove) { + // Generate new iteration operands and set rewrited information + SmallVector oldIterOperands = op.getIterOperands(); + SmallVector newIterOperands = op.getIterOperands(); + for (unsigned i = 0, oldI = 0, size = op.getNumIterOperands(); i < size; + ++i, ++oldI) { + if (!tt::isTensorPointerType(newIterOperands[i].getType())) + continue; + if (!valueToRemove.count(newIterOperands[i])) + continue; + + // Expand the tensor pointer into offsets + assert(rewritedInfo.count(newIterOperands[i])); + auto info = rewritedInfo[newIterOperands[i]]; + newIterOperands = + generateNewOperands(newIterOperands, i, info.getOffsets()); + i += info.length() - 1; + size += info.length() - 1; + } + + // Rebuild the loop type + auto newForOp = builder.create(op.getLoc(), op.getLowerBound(), + op.getUpperBound(), op.getStep(), + newIterOperands); + + // Create value mapping. Note that for tensor pointers, we use identity + // mapping. It may refer to a value in the old loop, but we will rewrite it + // later + IRMapping mapping; + for (unsigned i = 0, oldI = 0; oldI < op.getNumIterOperands(); + ++i, ++oldI) { + auto oldRegionIterArg = op.getRegionIterArg(oldI); + if (tt::isTensorPointerType(oldRegionIterArg.getType()) && + valueToRemove.count(oldIterOperands[oldI])) { + // Pass rewrited info inside + assert(rewritedInfo.count(oldIterOperands[oldI])); + auto info = rewritedInfo[oldIterOperands[oldI]]; + mapping.map(oldRegionIterArg, oldRegionIterArg); + for (unsigned j = 0; j < info.length(); ++j) + info.setOffset(j, newForOp.getRegionIterArg(i + j)); + rewritedInfo[oldRegionIterArg] = info; + i += info.length() - 1; + } else { + mapping.map(oldRegionIterArg, newForOp.getRegionIterArg(i)); + } + } + mapping.map(op.getInductionVar(), newForOp.getInductionVar()); + + // Clone body + builder.setInsertionPointToStart(newForOp.getBody()); + for (Operation &opInFor : *op.getBody()) { + Operation *newOp = builder.clone(opInFor, mapping); + for (unsigned i = 0; i < opInFor.getNumResults(); ++i) { + if (valueToRemove.count(opInFor.getResult(i))) + valueToRemove.insert(newOp->getResult(i)); + mapping.map(opInFor.getResult(i), newOp->getResult(i)); + } + } + + // supported nested scf.for ops + for (auto &[k, v] : mapping.getValueMap()) + if (valueToRemove.find(k) != valueToRemove.end()) + valueToRemove.insert(v); + + // Replace later usages + assert(op.getNumResults() == op.getNumIterOperands()); + for (unsigned i = 0, oldI = 0; oldI < op.getNumResults(); ++i, ++oldI) { + auto oldResult = op.getResult(oldI); + if (tt::isTensorPointerType(oldResult.getType()) && + valueToRemove.count(oldIterOperands[oldI])) { + // Pack new offsets into rewrited info + assert(rewritedInfo.count(oldIterOperands[oldI])); + auto info = rewritedInfo[oldIterOperands[oldI]]; + for (unsigned j = 0; j < info.length(); ++j) + info.setOffset(j, newForOp.getResult(i + j)); + i += info.length() - 1; + rewritedInfo[oldResult] = info; + } else { + oldResult.replaceAllUsesWith(newForOp.getResult(i)); + } + } + + // Erase later + eraser.push(op); + return newForOp; + } + + Operation *rewriteYieldOp(OpBuilder &builder, scf::YieldOp op, + std::stack &eraser, + const DenseSet &valueToRemove) { + // Replace tensor pointers with offsets + SmallVector newOperands = op->getOperands(); + for (unsigned i = 0, size = op.getNumOperands(); i < size; ++i) { + if (!tt::isTensorPointerType(newOperands[i].getType())) + continue; + if (!valueToRemove.count(newOperands[i])) + continue; + + assert(rewritedInfo.count(newOperands[i])); + auto info = rewritedInfo[newOperands[i]]; + newOperands = generateNewOperands(newOperands, i, info.getOffsets()); + i += info.length() - 1; + size += info.length() - 1; + } + op->setOperands(newOperands); + + // No need to erase + return nullptr; + } + + Operation *rewriteOp(Operation *op, std::stack &eraser, + DenseSet &valueToRemove) { + OpBuilder builder(op); + + // Rewrite `make_tensor_ptr` and `advance` and make a tensor of pointers + // Rewriting functions return the next operation to visit, if there is no + // next one, simply return `nullptr` + std::pair rewrited; + if (auto makeTensorPtrOp = dyn_cast(op)) { + return rewriteMakeTensorPtrOp(builder, makeTensorPtrOp, eraser, + valueToRemove); + } else if (auto advanceOp = dyn_cast(op)) { + return rewriteAdvanceOp(builder, advanceOp, eraser, valueToRemove); + } else if (isa(op) || isa(op)) { + return rewriteLoadStoreOp(builder, op, eraser, valueToRemove); + } else if (auto storeOp = dyn_cast(op)) { + return rewriteLoadStoreOp(builder, op, eraser, valueToRemove); + } else if (op->getDialect()->getNamespace() == "scf" || + op->getDialect()->getNamespace() == "cf") { + if (!needRewrite(op, valueToRemove)) + return op; + + if (auto forOp = dyn_cast(op)) { + return rewriteForOp(builder, forOp, eraser, valueToRemove); + } else if (auto yieldOp = dyn_cast(op)) { + return rewriteYieldOp(builder, yieldOp, eraser, valueToRemove); + } else { + llvm_unreachable("Currently we only support tensor pointer usages " + "inside a `scf::ForOp`, others such as `scf::IfOp`," + "`scf::WhileOp`, `cf::BranchOp` or `cf::CondBranchOp` " + "are not supported yet"); + } + } + + // Otherwise return the original one + return op; + } + + void visitOperation(Operation *op, std::stack &eraser, + DenseSet &valueToRemove) { + for (auto ®ion : op->getRegions()) { + for (auto &block : region) { + // We need an extra copy because erasing operations may break the + // iterator behavior + SmallVector blockCopy; + for (auto &nestedOp : block) + blockCopy.push_back(&nestedOp); + + // Rewrite and recursively visit + for (auto &nestedOp : blockCopy) { + if (auto newOp = rewriteOp(nestedOp, eraser, valueToRemove)) + visitOperation(newOp, eraser, valueToRemove); + } + } + } + } + + void runOnOperation() override { + ModuleOp mod = getOperation(); + + DenseSet valueToRemove; + mod.walk([&valueToRemove, + computeCapability = this->computeCapability](Operation *op) { + if (auto makeTensorPtrOp = dyn_cast(op)) { + if (shouldRemove(makeTensorPtrOp, computeCapability)) + valueToRemove.insert(op->getResult(0)); + } + if (llvm::isa(op)) { + auto src = op->getOperand(0); + if (tt::isTensorPointerType(src.getType())) { + auto makeTensorPtrOp = getMakeTensorPtrOp(src); + if (shouldRemove(makeTensorPtrOp, computeCapability)) { + valueToRemove.insert(op->getResult(0)); + } + } + } + if (llvm::isa(op)) { + auto src = op->getOperand(0); + if (tt::isTensorPointerType(src.getType())) { + auto makeTensorPtrOp = getMakeTensorPtrOp(src); + if (shouldRemove(makeTensorPtrOp, computeCapability)) + valueToRemove.insert(src); + } + } + if (auto forOp = dyn_cast(op)) { + SmallVector iterOperands = forOp.getIterOperands(); + for (unsigned i = 0, size = forOp.getNumIterOperands(); i < size; ++i) { + if (tt::isTensorPointerType(iterOperands[i].getType())) { + auto makeTensorPtrOp = getMakeTensorPtrOp(iterOperands[i]); + if (shouldRemove(makeTensorPtrOp, computeCapability)) + valueToRemove.insert(iterOperands[i]); + } + } + } else if (auto yieldOp = dyn_cast(op)) { + SmallVector operands = yieldOp->getOperands(); + for (unsigned i = 0, size = yieldOp.getNumOperands(); i < size; ++i) { + if (tt::isTensorPointerType(operands[i].getType())) { + auto makeTensorPtrOp = getMakeTensorPtrOp(operands[i]); + if (shouldRemove(makeTensorPtrOp, computeCapability)) + valueToRemove.insert(operands[i]); + } + } + } + }); + + // NOTES(Chenggang): we don't use `ConversionPatternRewriter`, because + // MLIR does not support one-multiple value mapping. For example, if we use + // `ConversionPatternRewriter`, we can not make a type converter, which + // converts `ptr` into multiple types `ptr<>, int64, int64, ...` + // (containing the base/offsets/strides...). What we can do is to convert + // `ptr` into a single type `Tuple, int64, int64, ...>`. But + // in this way, we also have to define `PackTuple` and `UnpackTuple` + // operations and make a canonicalization pass to optimize, which is much + // So here we recursively build the IR, to be specific, we have to rewrite + // `tt.make_tensor_ptr`, `tt.advance`, `tt.load`, `tt.store`, + // `scf.for` (tensor pointer usages may be in a loop fashion) + std::stack eraser; + visitOperation(getOperation(), eraser, valueToRemove); + + // The operation could not be erased during visit, because they may have + // later usages, so we erase after visit + rewritedInfo.clear(); + valueToRemove.clear(); + while (!eraser.empty()) { + auto op = eraser.top(); + eraser.pop(); + op->erase(); + } + } +}; + +std::unique_ptr +mlir::createTritonGPURewriteTensorPointerPass(int computeCapability) { + return std::make_unique(computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/Utility.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/Utility.cpp new file mode 100644 index 000000000000..df01171278b0 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/Utility.cpp @@ -0,0 +1,542 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +#include "mlir/Analysis/SliceAnalysis.h" +#include "mlir/Dialect/SCF/IR/SCF.h" +#include "mlir/IR/IRMapping.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/Triton/IR/Dialect.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "llvm/Support/Debug.h" +#include + +namespace mlir { + +namespace ttg = triton::gpu; + +namespace { + +// Suppose the kernel has following structure: +// ``` +// scf.for(...) { +// compute_0(i) +// barrier(...) +// compute_1(i) +// } +// ``` +// Due to the barrier between compute_0(i) and compute_1(i), we +// can not pre-compute compute_0(i+1) before compute_1(i) semantically. +// In some case, it may be still functionally correct to pre-compute +// compute_0(i+1) while it's very hard to prove it at compile time. +// +// Here we use a simple strategy: skip auto wrap specialize those kernels that +// use global barriers. +// +// Another remaining question is how to detect barrier in a triton program. +// There is not a barrier op in triton yet. It's usually implemented using +// atomic_* ops. Hence we simply detect if there are some atomc_* ops. It may +// miss some auto-WS opportunities and we leave it for the future to improve it. +bool hasUnsafeBarrier(triton::FuncOp funcOp) { + return funcOp + ->walk([](Operation *op) { + if (isa(op)) + return WalkResult::interrupt(); + return WalkResult::advance(); + }) + .wasInterrupted(); +} + +// Assigns `dependentSet` and returns ok if the analysis is successful. +// We do not support dependency analysis across load/store, thus a failure will +// be returned if encountering such cases. +LogicalResult getDependentPointers(Value ptr, DenseSet &dependentSet, + DenseSet &processedSet) { + // early return if processed + if (!processedSet.insert(ptr).second) + return success(); + + if (auto blockArg = ptr.dyn_cast()) { + if (!blockArg.getOwner()->isEntryBlock()) + return failure(); + auto parentOp = blockArg.getOwner()->getParentOp(); + if (auto forOp = dyn_cast(parentOp)) { + if (blockArg.getArgNumber() >= forOp.getNumInductionVars()) { + if (failed(getDependentPointers( + forOp.getOpOperandForRegionIterArg(blockArg).get(), + dependentSet, processedSet))) + return failure(); + + unsigned operandIdx = + blockArg.getArgNumber() - forOp.getNumInductionVars(); + return getDependentPointers( + forOp.getBody()->getTerminator()->getOperand(operandIdx), + dependentSet, processedSet); + } + } else if (auto funcOp = dyn_cast(parentOp)) { + dependentSet.insert(ptr); + return success(); + } + // unknown ops, return failure for correctness. + return failure(); + } + + auto definingOp = ptr.getDefiningOp(); + assert(definingOp); + if (auto makeTensorPtrOp = ptr.getDefiningOp()) { + return getDependentPointers(makeTensorPtrOp.getBase(), dependentSet, + processedSet); + } else if (auto advanceOp = ptr.getDefiningOp()) { + return getDependentPointers(advanceOp.getPtr(), dependentSet, processedSet); + } else if (auto addPtrOp = ptr.getDefiningOp()) { + return getDependentPointers(addPtrOp.getPtr(), dependentSet, processedSet); + } else if (auto loadOp = ptr.getDefiningOp()) { + // not support load dependent ptr + return failure(); + } else if (auto forOp = ptr.getDefiningOp()) { + unsigned idx = ptr.cast().getResultNumber(); + return getDependentPointers( + forOp.getBody()->getTerminator()->getOperand(idx), dependentSet, + processedSet); + } else if (auto ifOp = ptr.getDefiningOp()) { + unsigned idx = ptr.cast().getResultNumber(); + if (ifOp.elseBlock() && + failed(getDependentPointers(ifOp.elseYield()->getOperand(idx), + dependentSet, processedSet))) + return failure(); + return getDependentPointers(ifOp.thenYield()->getOperand(idx), dependentSet, + processedSet); + } else if (!definingOp->getNumRegions()) { + for (Value operand : definingOp->getOperands()) + if (failed(getDependentPointers(operand, dependentSet, processedSet))) + return failure(); + return success(); + } + // unknown ops, return failure for correctness. + return failure(); +} + +// Suppose the kernel has following structure: +// ``` +// scf.for(...) { +// v(i) = load(ptr) +// new_v(i) = some_compute(v(i), ...) +// store(new_v(i), ptr) +// } +// ``` +// +// There is an implicit dependency between load(i+1) and store(i), which means +// we can not pre-compute load(i+1) before store(i). +// +// To avoid such load after store conflict, we simply disallow mixed load and +// store for the same buffer. It's a conservative strategy and can be relaxed in +// case necessary. +bool hasUnsafeLoadAfterStore(triton::FuncOp funcOp) { + // TODO: support CFG + if (funcOp.getBody().getBlocks().size() > 1) + return true; + + DenseMap ptrStoreMap; + DenseMap ptrLoadMap; + if (funcOp + ->walk([&](triton::LoadOp loadOp) { + DenseSet dependentSet, processedSet; + if (failed(getDependentPointers(loadOp.getPtr(), dependentSet, + processedSet))) + return WalkResult::interrupt(); + for (Value v : dependentSet) + ptrLoadMap[v] = true; + return WalkResult::advance(); + }) + .wasInterrupted()) + return false; + auto result = funcOp->walk([&](Operation *op) { + if (auto storeOp = dyn_cast(op)) { + DenseSet dependentSet, processedSet; + if (failed(getDependentPointers(storeOp.getPtr(), dependentSet, + processedSet))) + return WalkResult::interrupt(); + + for (Value v : dependentSet) + ptrStoreMap[v] = true; + + // TODO: relax the restriction in case necessary. + // If a store is inside a region, e.g. scf.while/for/if, its + // dependent ptrs are not allowed to be loaded. + if (op->getParentOp() != funcOp) { + for (Value v : dependentSet) + if (ptrLoadMap.find(v) != ptrLoadMap.end()) + return WalkResult::interrupt(); + } + } else if (auto loadOp = dyn_cast(op)) { + DenseSet dependentSet, processedSet; + if (failed(getDependentPointers(loadOp.getPtr(), dependentSet, + processedSet))) + return WalkResult::interrupt(); + for (Value v : dependentSet) + if (ptrStoreMap.find(v) != ptrStoreMap.end()) + return WalkResult::interrupt(); + } + return WalkResult::advance(); + }); + + return result.wasInterrupted(); +} + +bool hasWSCandidateLoad(triton::FuncOp funcOp) { + SmallVector loadOps; + funcOp->walk([&](triton::LoadOp loadOp) { + if (isWSCandidateLoad(loadOp)) + loadOps.push_back(loadOp); + }); + if (loadOps.empty()) + return false; + + // All the candidate ops should be in the same block and have compatible + // types. + Block *block = loadOps[0]->getBlock(); + auto refTy = loadOps[0].getPtr().getType().dyn_cast(); + bool isPtrToTensor = refTy && refTy.getPointeeType().isa(); + for (auto loadOp : loadOps) { + if (loadOp->getBlock() != block) + return false; + // not support mixed ptr to tensor and tensor of ptr currently. + auto ty = loadOp.getPtr().getType().dyn_cast(); + if (isPtrToTensor != (ty && ty.getPointeeType().isa())) + return false; + } + + // S0 = dependent value set of all the candidate ops + // S1 = dependent value set of all the store ops + // S2 = S1 & S0 + // any value in S2 should not be the output of an op having regions. + // TODO: lift the limitation of WSPipeline pass to remove this check. + DenseSet loadDepSet; + DenseSet loadSet; + for (auto op : loadOps) { + if (failed(getDependentValues(op.getOperation(), loadDepSet))) + return false; + loadSet.insert(op->getResult(0)); + } + + DenseSet storeDepSet; + if (funcOp + ->walk([&](triton::StoreOp op) { + if (failed(getDependentValues(op.getOperation(), storeDepSet, + loadSet))) + return WalkResult::interrupt(); + return WalkResult::advance(); + }) + .wasInterrupted()) + return false; + + for (Value v : loadDepSet) + if (storeDepSet.find(v) != storeDepSet.end()) { + auto op = v.getDefiningOp(); + if (op && op->getNumRegions()) + return false; + } + + return true; +} + +} // namespace + +//===----------------------------------------------------------------------===// +// Helper functions for async agent +//===----------------------------------------------------------------------===// + +SmallVector getAgentIds(Operation *op) { + SmallVector agentIds; + if (auto attr = op->getAttrOfType("async_agent")) + for (AgentId agentId : attr.getValues()) + agentIds.push_back(agentId); + return agentIds; +} + +bool hasAgentId(Operation *op, AgentId agentId) { + for (AgentId candidate : getAgentIds(op)) + if (candidate == agentId) + return true; + return false; +} + +void setAgentIds(Operation *op, ArrayRef agentIds) { + SmallVector sortedAgentIds(agentIds.begin(), agentIds.end()); + sort(sortedAgentIds); + auto i32Ty = IntegerType::get(op->getContext(), 32); + auto size = static_cast(sortedAgentIds.size()); + auto vecTy = VectorType::get(size, i32Ty); + op->setAttr("async_agent", DenseIntElementsAttr::get(vecTy, sortedAgentIds)); +} + +SmallVector collectAgentIds(Operation *op) { + SetVector agentIds; + op->walk([&](Operation *curOp) { + for (AgentId agentId : getAgentIds(curOp)) + agentIds.insert(agentId); + }); + SmallVector res(agentIds.begin(), agentIds.end()); + llvm::sort(res); + return res; +} + +void addAgentIds(Operation *op, ArrayRef agents) { + auto agentsVec = getAgentIds(op); + DenseSet agentsSet(agentsVec.begin(), agentsVec.end()); + for (int a : agents) { + if (!agentsSet.contains(a)) { + agentsVec.push_back(a); + } + } + if (agentsVec.size() > 0) { + setAgentIds(op, agentsVec); + } +} + +SmallVector getMutexBarIds(Operation *op) { + SmallVector barIds; + if (auto attr = op->getAttrOfType("mutex.barId")) + for (int id : attr.getValues()) + barIds.push_back(id); + return barIds; +} + +SmallVector getMutexNumThreads(Operation *op) { + SmallVector numThreads; + if (auto attr = op->getAttrOfType("mutex.numThreads")) + for (int n : attr.getValues()) + numThreads.push_back(n); + return numThreads; +} + +//===----------------------------------------------------------------------===// +// Implementations for general auto WS +//===----------------------------------------------------------------------===// + +// Populates `depSet` with the values that `val` depends on and Returns success. +// Returns failure() if encountering any unsupported conditions. +LogicalResult getDependentValues(Value val, DenseSet &depSet, + const DenseSet &stopSet) { + auto tryInsertAndPropagate = [&](Value other) { + if (stopSet.find(other) == stopSet.end() && depSet.insert(other).second) + return getDependentValues(other, depSet, stopSet); + return success(); + }; + auto addControlOperandsForForOp = [&](scf::ForOp forOp) { + for (Value operand : + forOp->getOperands().take_front(forOp.getNumControlOperands())) + if (failed(tryInsertAndPropagate(operand))) + return failure(); + return success(); + }; + auto addControlOperandsForIfOp = [&](scf::IfOp ifOp) { + return tryInsertAndPropagate(ifOp.getCondition()); + }; + auto propagateParentOp = [&](Operation *op) { + while (Operation *parentOp = op->getParentOp()) { + if (auto forOp = dyn_cast(parentOp)) + return addControlOperandsForForOp(forOp); + else if (auto ifOp = dyn_cast(parentOp)) + return addControlOperandsForIfOp(ifOp); + else if (auto funcOp = dyn_cast(parentOp)) + return success(); + else + break; + op = parentOp; + } + // unknown ops, return failure for correctness. + return failure(); + }; + + if (auto blockArg = val.dyn_cast()) { + auto parentOp = blockArg.getOwner()->getParentOp(); + if (auto forOp = dyn_cast(parentOp)) { + // add control operands of forOp into dependent set + if (failed(addControlOperandsForForOp(forOp))) + return failure(); + if (blockArg.getArgNumber() >= forOp.getNumInductionVars()) { + Value operand = forOp.getOpOperandForRegionIterArg(blockArg).get(); + if (failed(tryInsertAndPropagate(operand))) + return failure(); + + unsigned operandIdx = + blockArg.getArgNumber() - forOp.getNumInductionVars(); + return tryInsertAndPropagate( + forOp.getBody()->getTerminator()->getOperand(operandIdx)); + } + return propagateParentOp(parentOp); + } else if (auto funcOp = dyn_cast(parentOp)) { + if (stopSet.find(val) == stopSet.end()) + depSet.insert(val); + return success(); + } else { + // unknown ops, return failure for correctness. + return failure(); + } + } + + auto definingOp = val.getDefiningOp(); + assert(definingOp); + if (auto forOp = val.getDefiningOp()) { + if (failed(addControlOperandsForForOp(forOp))) + return failure(); + unsigned idx = val.cast().getResultNumber(); + if (failed(tryInsertAndPropagate( + forOp->getOperand(idx + forOp.getNumControlOperands())))) + return failure(); + return tryInsertAndPropagate( + forOp.getBody()->getTerminator()->getOperand(idx)); + } else if (auto ifOp = val.getDefiningOp()) { + if (failed(addControlOperandsForIfOp(ifOp))) + return failure(); + unsigned idx = val.cast().getResultNumber(); + if (ifOp.elseBlock() && + failed(tryInsertAndPropagate(ifOp.elseYield()->getOperand(idx)))) + return failure(); + return tryInsertAndPropagate(ifOp.thenYield()->getOperand(idx)); + } else if (!definingOp->getNumRegions()) { + for (Value operand : definingOp->getOperands()) + if (failed(tryInsertAndPropagate(operand))) + return failure(); + return success(); + } else { + // unknown ops, return failure for correctness. + return failure(); + } + + return propagateParentOp(definingOp); +} + +LogicalResult getDependentValues(Operation *op, DenseSet &depSet, + const DenseSet &stopSet) { + if (op->getNumResults() > 0) { + for (Value result : op->getResults()) + if (failed(getDependentValues(result, depSet, stopSet))) + return failure(); + } else { + // Not support op with regions + if (op->getNumRegions() != 0) + return failure(); + for (Value operand : op->getOperands()) { + if (stopSet.find(operand) != stopSet.end()) + continue; + depSet.insert(operand); + if (failed(getDependentValues(operand, depSet, stopSet))) + return failure(); + } + } + return success(); +} + +DenseSet getDependentOps(DenseSet &depSet) { + DenseSet depOps; + for (Value val : depSet) { + Operation *op = val.getDefiningOp(); + if (auto blockArg = val.dyn_cast()) + op = blockArg.getOwner()->getParentOp(); + + while (op && !isa(op)) { + depOps.insert(op); + op = op->getParentOp(); + } + } + return depOps; +} + +bool isWSCandidateLoad(Operation *op) { + auto loadOp = dyn_cast(op); + if (!loadOp) + return false; + + Value result = loadOp->getResult(0); + auto resultTy = result.getType().cast(); + // Skip those tensors that are too small. + if (resultTy.getNumElements() <= 64) + return false; + // TODO: remove this limit once we refator ws pipeline pass. + if (resultTy.getNumElements() % 128 != 0) + return false; + // pattern match: load + convert_layout(blocked, shared) + if (!result.hasOneUse()) + return false; + auto cvtOp = dyn_cast(*result.getUsers().begin()); + if (!cvtOp) + return false; + auto encoding = + cvtOp.getResult().getType().cast().getEncoding(); + if (!encoding || !encoding.dyn_cast()) + return false; + if (ttg::getNumCTAs(encoding) > 1) + return false; + + DenseSet depSet; + if (failed(getDependentValues(op->getResult(0), depSet))) + return false; + auto depOps = getDependentOps(depSet); + for (Operation *depOp : depOps) { + if (isa(depOp)) + return false; + } + return op->getParentOfType() || + op->getParentOfType(); +} + +bool isWSSupported(ModuleOp mod, int computeCapability) { + // Early return if the target device is not feasible. + if (computeCapability / 10 < 9) { + return false; + } + + // TODO: support function call. + triton::FuncOp funcOp; + if (mod->walk([&](triton::FuncOp op) { + if (funcOp) + return WalkResult::interrupt(); + funcOp = op; + return WalkResult::advance(); + }) + .wasInterrupted() || + !funcOp) + return false; + + // Triton programs with global barrier are much harder to do auto warp + // specialization. Here we do some conservative checks to skip the bad cases. + if (hasUnsafeBarrier(funcOp)) + return false; + + // load after store for the same buffer forces an implicit dependency, which + // may break auto WS. Here we do some conservative checks to skip the bad + // cases. + if (hasUnsafeLoadAfterStore(funcOp)) + return false; + + if (!hasWSCandidateLoad(funcOp)) + return false; + + return true; +} + +} // namespace mlir diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSDecomposing.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSDecomposing.cpp new file mode 100644 index 000000000000..867f0040400b --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSDecomposing.cpp @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" + +#include "mlir/Analysis/SliceAnalysis.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +using namespace mlir; +namespace ttng = mlir::triton::nvidia_gpu; + +class Heuristics { + //===--------------------------Label rules--------------------------===// + // - Op without agent attr: opeations shared by all agents but will NOT + // be copied into each agent region + // - Op with one agent: exclusive for one agent + // - Op with agents: shared by agents and will be copied into each agent + // region + //===---------------------------------------------------------------===// +public: + Heuristics(MLIRContext *context, ModuleOp mod, const int &computeCapability) + : context(context), mod(mod), computeCapability(computeCapability), + builder(OpBuilder(context)) {} + virtual bool run() = 0; + +protected: + // Set agentId when condition is satisfied + virtual void + setAgentId_if(int agentId, + const std::function &condition) { + mod.walk([&](Operation *op) -> void { + if (condition(op)) { + setAgentIds(op, {agentId}); + } + }); + } + + static bool isTritonLoadOp(Operation *op) { return isa(op); } + + static bool isTritonDotOp(Operation *op) { return isa(op); } + + static bool isTritonStoreOp(Operation *op) { + return isa(op); + } + + /// Becuase we set some special filter rules in populateAgentRegion, + /// there may be unlabeled Ops, e.g. YieldOps, some definingOps of ForOps. + /// or Ops without relations to agentOps + virtual void populateUnlabledOpsAtLast(ArrayRef allAgents) { + // Label agents' parentOps + for (int i : allAgents) { + DenseSet agentParentOps; + getAllParentOps(agentParentOps, i); + for (auto op : agentParentOps) { + addAgentIds(op, {i}); + } + } + + // Get unlabeled Ops + DenseSet unlabeledOps; + mod.walk([&](Operation *op) -> void { + if (isa(op) || isa(op) || + isa(op)) { + return; + } + if (!op->hasAttr("async_agent")) { + unlabeledOps.insert(op); + } + }); + + // Label Ops using its parentOp + for (auto op : unlabeledOps) { + if (auto parent = op->getParentOp()) { + if (!isa(parent)) { + assert(parent->hasAttr("async_agent")); + auto agents = getAgentIds(parent); + setAgentIds(op, agents); + unlabeledOps.erase(op); + } + } + } + + // Label Ops using dependency + for (auto op : unlabeledOps) { + labelByUsers(op, allAgents); + unlabeledOps.erase(op); + } + assert(unlabeledOps.size() == 0); + } + + // Return all Ops that are marked with target agent + void getAgentOps(DenseSet &agentOps, int agentId) { + SmallVector tmpArray{agentId}; + auto agentAttr = builder.getI32VectorAttr(ArrayRef(tmpArray)); + mod.walk([&](Operation *op) -> void { + if (op->hasAttr("async_agent") && + op->getAttr("async_agent") == agentAttr) { + agentOps.insert(op); + } + }); + } + + void getAllParentOps(DenseSet &parentOps, int agentId) { + DenseSet targetOps; + getAgentOps(targetOps, agentId); + for (auto op : targetOps) { + getAllParentOps(parentOps, op); + } + } + + void getAllParentOps(DenseSet &parentOps, Operation *targetOp) { + auto op = targetOp; + while (auto parent = op->getParentOp()) { + if (!isa(parent) && !isa(parent)) { + parentOps.insert(parent); + op = parent; + } else { + break; + } + } + } + + void labelByUsers(Operation *op, ArrayRef allAgents) { + for (Value result : op->getResults()) { + for (Operation *userOp : result.getUsers()) { + if (!userOp->hasAttr("async_agent")) { + labelByUsers(userOp, allAgents); + } + addAgentIds(op, getAgentIds(userOp)); + } + } + if (!op->hasAttr("async_agent")) { + addAgentIds(op, allAgents); + } + } + +protected: + MLIRContext *context; + ModuleOp mod; + int computeCapability; + OpBuilder builder; +}; + +//===------------------------heuristics list------------------------===// +// List all heuristics here: +// - Heuristic_Load_MathStore: assign load and math+store to two +// different agents respectively. +//===---------------------------------------------------------------===// + +class Heuristic_Load_MathStore : public Heuristics { +public: + Heuristic_Load_MathStore(MLIRContext *context, ModuleOp mod, + const int &computeCapability) + : Heuristics(context, mod, computeCapability) {} + bool run() override { + constexpr int kLoadAgentId = 0; + constexpr int kStoreAgentId = 1; + constexpr int kNumAgents = 2; + + //===--------------------1. label key operations--------------------===// + setAgentId_if(kLoadAgentId, isWSCandidateLoad); + setAgentId_if(kStoreAgentId, isTritonStoreOp); + + //===--------------2. populate based on key operations--------------===// + // find the roots (outputs) of LoadAgent + DenseSet loadOps; + getAgentOps(loadOps, kLoadAgentId); + // find LoadAgent dependent ops + DenseSet loadValues; + DenseSet loadAgentDepValues; + for (Operation *op : loadOps) { + if (failed(getDependentValues(op, loadAgentDepValues))) + return false; + loadValues.insert(op->getResult(0)); + } + for (Operation *op : getDependentOps(loadAgentDepValues)) + addAgentIds(op, kLoadAgentId); + + // find the roots (outputs) of StoreAgent + DenseSet storeOps; + getAgentOps(storeOps, kStoreAgentId); + // find StoreAgent dependent ops + DenseSet storeAgentDepValues; + for (Operation *op : storeOps) + if (failed(getDependentValues(op, storeAgentDepValues, loadValues))) + return false; + for (Operation *op : getDependentOps(storeAgentDepValues)) + addAgentIds(op, kStoreAgentId); + + //===---------------------3. label unlabeld Ops---------------------===// + populateUnlabledOpsAtLast({kLoadAgentId, kDotAgentId}); + + // Erase labels of MakeTensorPtrOp and its definingOps, + // because we don't want them to be copied in each agent + SetVector backwardSlice; + mod.walk([&](triton::MakeTensorPtrOp op) -> void { + assert(isa(op->getParentOp())); + getBackwardSlice(op.getOperation(), &backwardSlice); + op->removeAttr("async_agent"); + }); + for (auto op : backwardSlice) { + op->removeAttr("async_agent"); + } + // Set num-agents for wsmaterialization pass + mod->setAttr("async.num-agents", builder.getI32IntegerAttr(kNumAgents)); + return true; + } +}; + +class TritonGPUWSDecomposingPass + : public TritonGPUWSDecomposingBase { +public: + TritonGPUWSDecomposingPass() = default; + TritonGPUWSDecomposingPass(int computeCapability) { + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + MLIRContext *context = &getContext(); + ModuleOp mod = getOperation(); + if (!ttng::TritonNvidiaGPUDialect::getWSSupportedAttr(mod)) + return signalPassFailure(); + + // Build Heuristics + Heuristic_Load_MathStore hLoadMathBasic(context, mod, computeCapability); + if (!(hLoadMathBasic.run())) { + return signalPassFailure(); + } + } +}; + +std::unique_ptr +mlir::createTritonNvidiaGPUWSDecomposingPass(int computeCapability) { + return std::make_unique(computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSFeasibilityChecking.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSFeasibilityChecking.cpp new file mode 100644 index 000000000000..15f19b889113 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSFeasibilityChecking.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace mlir { + +namespace ttng = triton::nvidia_gpu; + +namespace { + +class TritonGPUWSFeasibilityCheckingPass + : public TritonGPUWSFeasibilityCheckingBase< + TritonGPUWSFeasibilityCheckingPass> { +public: + TritonGPUWSFeasibilityCheckingPass() = default; + TritonGPUWSFeasibilityCheckingPass(int computeCapability) { + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + ModuleOp mod = getOperation(); + int wsSupported = isWSSupported(mod, this->computeCapability); + auto i32_ty = IntegerType::get(mod->getContext(), 32); + mod->setAttr(ttng::TritonNvidiaGPUDialect::getWSSupportedAttrName(), + IntegerAttr::get(i32_ty, llvm::APInt(32, wsSupported))); + } +}; + +} // namespace + +std::unique_ptr +createTritonNvidiaGPUWSFeasibilityCheckingPass(int computeCapability) { + return std::make_unique( + computeCapability); +} + +} // namespace mlir diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp new file mode 100644 index 000000000000..1aa80ace4ae0 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp @@ -0,0 +1,764 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" + +#include "mlir/IR/OperationSupport.h" +#include "triton/Analysis/Utility.h" +#include "triton/Dialect/Triton/IR/Types.h" +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +using namespace mlir; +namespace ttg = triton::gpu; +namespace ttng = triton::nvidia_gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace { + +enum class LoadType { + Uninitialized, + InsertSliceAsyncOp, + InsertSliceAsyncV2Op, + MultiKinds, +}; + +// This helper function returns the real threadId while ttng::GetThreadIdOp is +// actually threadId % 128 when warp specialization is enabled +Value getThreadId(OpBuilder &builder, Location loc) { + Value threadId = builder.create<::mlir::gpu::ThreadIdOp>( + loc, builder.getIndexType(), ::mlir::gpu::Dimension::x); + auto cast = builder.create( + loc, TypeRange{builder.getIntegerType(32)}, ValueRange{threadId}); + return cast.getResult(0); +} + +//===----------------------------------------------------------------------===// +// Materialize GetAgentIdOp +//===----------------------------------------------------------------------===// + +void materializeGetAgentIdOp(Operation *parentOp) { + parentOp->walk([](ttng::GetAgentIdOp op) { + // In Hopper, each agent is a warpgroup consisting with 4 warps. + auto loc = op.getLoc(); + OpBuilder builder(op); + + Value _128 = builder.create(loc, 128, 32); + Value threadId = getThreadId(builder, loc); + Value agentId = builder.create(loc, threadId, _128); + op.getResult().replaceAllUsesWith(agentId); + op->erase(); + + // Update agent condition and insert "agent.num-warps" + auto agentIdOp = agentId.getDefiningOp(); + builder.setInsertionPoint(agentIdOp); + Value globalRoleId = builder.create(loc, 0, 32); + int globalNumWarps = 0; + for (auto cmpOp : agentIdOp->getUsers()) { + assert(isa(cmpOp)); + for (auto u : cmpOp->getUsers()) { + if (isa(u) && isa(u->getParentOp()) && + u->hasAttr("async_agent") && getAgentIds(u).size() == 1) { + loc = u->getLoc(); + builder.setInsertionPoint(u); + int numRoles = 1; + if (u->hasAttr("agent.num-roles")) { + numRoles = + u->getAttrOfType("agent.num-roles").getInt(); + // TODO: more flexible ways to get numWarps. + auto numWarps = builder.getI32IntegerAttr(4 * numRoles); + auto numWarpsBase = builder.getI32IntegerAttr(globalNumWarps); + u->setAttr("agent.num-warps", numWarps); + u->walk([&](ttng::GetMutexRoleIdOp roleIdOp) { + roleIdOp->setAttr("agent.num-warps", numWarps); + roleIdOp->setAttr("agent.num-warps-base", numWarpsBase); + }); + } + globalNumWarps += numRoles * 4; + Value offset = + builder.create(loc, numRoles, 32); + Value lowerBound = builder.create( + loc, arith::CmpIPredicate::uge, agentId, globalRoleId); + globalRoleId = + builder.create(loc, globalRoleId, offset); + Value upperBound = builder.create( + loc, arith::CmpIPredicate::ult, agentId, globalRoleId); + Value cond = + builder.create(loc, lowerBound, upperBound); + cmpOp->getResult(0).replaceAllUsesWith(cond); + cmpOp->erase(); + break; + } + } + } + }); +} + +//===----------------------------------------------------------------------===// +// Materialize token operations +//===----------------------------------------------------------------------===// + +LoadType scanLoadTypes(ttng::CreateTokenOp createTokenOp) { + // TODO: Attach information of binded tensors to CreateTokenOp + std::set loadTypes; + createTokenOp->getBlock()->walk([&](Operation *op) { + if (auto insertOp = dyn_cast(op)) { + if (triton::isTensorPointerType(insertOp.getSrc().getType())) + loadTypes.insert(LoadType::InsertSliceAsyncV2Op); + else + loadTypes.insert(LoadType::InsertSliceAsyncOp); + } else if (isa(op)) { + loadTypes.insert(LoadType::InsertSliceAsyncOp); + } else if (isa(op)) { + loadTypes.insert(LoadType::InsertSliceAsyncV2Op); + } + }); + assert(loadTypes.size() > 0 && "InsertSliceOp not found"); + assert(loadTypes.size() == 1 && + "Multiple kinds of load types are not supported"); + return *loadTypes.begin(); +} + +Value getMBarrierPhaseBit(OpBuilder &builder, Operation *op, + bool skipFirstWait) { + // TODO: currently we only support one loop, no nested loop, while or + // condition. + auto loc = op->getLoc(); + auto forOp = op->getParentOfType(); + if (!forOp) { + return builder.create(loc, skipFirstWait, 1); + } + + auto defOp = op->getOperand(0).getDefiningOp(); + assert(isa(defOp) && + "mbarrier's definingOp is not createTokenOp"); + ttng::CreateTokenOp createTokenOp = dyn_cast(defOp); + Value numStage = + builder.create(loc, createTokenOp.getNum(), 32); + Value curStep = forOp.getBody()->getArguments().back(); + if (curStep.getType() == builder.getIndexType()) { + curStep = + builder.create(loc, numStage.getType(), curStep); + } + Value curPhase = builder.create(loc, curStep, numStage); + if (skipFirstWait) { + // If skipFirstWait, it waits for phaseBit 1 + Value _1 = builder.create(loc, 1, 32); + curPhase = builder.create(loc, curPhase, _1); + } + Value _2 = builder.create(loc, 2, 32); + // TODO: May use alternative methods of phaseBit calculation to avoid high + // overhead of RemOp + Value phaseBit = builder.create(loc, curPhase, _2); + Value _0 = builder.create(loc, 0, 32); + return builder.create(loc, arith::CmpIPredicate::ne, phaseBit, + _0); +} + +int getTxBytes(ttng::InsertSliceAsyncV2Op load) { + // Both support ptr of tensor and tensor of ptr. + RankedTensorType srcTensorType; + if (auto srcType = dyn_cast(load.getSrc().getType())) { + srcTensorType = srcType; + } else if (auto srcType = + dyn_cast(load.getSrc().getType())) { + srcTensorType = dyn_cast(srcType.getPointeeType()); + } else { + llvm_unreachable("Unexpected src type"); + } + auto shapePerCTA = ttg::getShapePerCTA(srcTensorType); + auto elemTy = + dyn_cast(load.getDst().getType()).getElementType(); + int bytesPerElem = elemTy.getIntOrFloatBitWidth() / 8; + return product(shapePerCTA) * bytesPerElem; +} + +int applyCommit(OpBuilder &builder, ttng::ProducerCommitOp &op, + Value mbarrier) { + // TODO: currently it only handles loads in ProducerCommitOp's nearest parent + // block. Neither support multiple ProducerCommitOp, e.g. fused attention, + // epilogue fusion. + int txCnt = 0; + SmallVector deprecatedOps; + auto agentIds = getAgentIds(op); + // Materialize InsertSliceOp + for (auto &ItrOp : op->getBlock()->getOperations()) { + // Check operations before ProducerCommitOp + if (OperationEquivalence::isEquivalentTo(&ItrOp, op.getOperation(), + OperationEquivalence::None)) { + break; + } + if (auto insertOp = dyn_cast(ItrOp)) { + deprecatedOps.push_back(&ItrOp); + builder.setInsertionPoint(insertOp); + if (!::mlir::triton::isTensorPointerType(insertOp.getSrc().getType())) { + // Transform to InsertSliceAsyncOp + auto newSliceOp = builder.create( + /*loc=*/insertOp.getLoc(), /*result=*/insertOp.getDst().getType(), + /*src=*/insertOp.getSrc(), /*dst=*/insertOp.getDst(), + /*index=*/insertOp.getIndex(), + /*mask=*/insertOp.getMask(), /*other=*/insertOp.getOther(), + /*cache=*/insertOp.getCache(), /*evict=*/insertOp.getEvict(), + /*isVolatile=*/insertOp.getIsVolatile(), + /*axis=*/insertOp.getAxis()); + insertOp.getResult().replaceAllUsesWith(newSliceOp.getResult()); + setAgentIds(newSliceOp, agentIds); + } else { + // Transform to InsertSliceAsyncV2Op + auto extractBarrierOp = dyn_cast( + builder.clone(*(mbarrier.getDefiningOp()))); + auto newSliceOp = builder.create( + /*loc=*/insertOp.getLoc(), /*result=*/insertOp.getDst().getType(), + /*src=*/insertOp.getSrc(), /*dst=*/insertOp.getDst(), + /*index=*/insertOp.getIndex(), + /*mbar*/ extractBarrierOp.getResult(), /*mask=*/insertOp.getMask(), + /*other=*/insertOp.getOther(), + /*cache=*/insertOp.getCache(), /*evict=*/insertOp.getEvict(), + /*isVolatile=*/insertOp.getIsVolatile(), + /*axis=*/insertOp.getAxis()); + insertOp.getResult().replaceAllUsesWith(newSliceOp.getResult()); + setAgentIds(newSliceOp, agentIds); + txCnt += getTxBytes(newSliceOp); + } + } + } + builder.setInsertionPoint(op); + for (auto d : deprecatedOps) { + d->erase(); + } + + return txCnt; +} + +void processProducerAcquireOp(OpBuilder &builder, ttng::ProducerAcquireOp op, + Value bufferEmpty) { + auto loc = op.getLoc(); + // The first producer_aquire should be met immediately, so initailly producer + // skips the fisrt wait + Value phase = getMBarrierPhaseBit(builder, op, 1); + auto waitOp = builder.create(loc, bufferEmpty, phase); + assert(op.getOperation()->hasAttr("async_agent")); + setAgentIds(waitOp, getAgentIds(op.getOperation())); +} + +void processProducerCommitOp(OpBuilder &builder, ttng::ProducerCommitOp op, + Value bufferFull, LoadType loadType) { + auto loc = op.getLoc(); + int txCnt = applyCommit(builder, op, bufferFull); + ttng::MBarrierArriveOp arriveOp; + + if (loadType == LoadType::InsertSliceAsyncOp) { + // Each thread arrives + Value pred = builder.create(loc, 1, 1); + arriveOp = builder.create( + loc, bufferFull, pred, /*remoteCTAId*/ nullptr, /*trackAsyncOp*/ true, + txCnt); + } else { + // Only thread 0 arrives + Value _0 = builder.create(loc, 0, 32); + Value threadId = getThreadId(builder, loc); + Value pred = builder.create(loc, arith::CmpIPredicate::eq, + threadId, _0); + arriveOp = builder.create( + loc, bufferFull, pred, /*remoteCTAId*/ nullptr, /*trackAsyncOp*/ false, + txCnt); + } + + assert(op.getOperation()->hasAttr("async_agent")); + setAgentIds(arriveOp, getAgentIds(op.getOperation())); +} + +void processConsumerWaitOp(OpBuilder &builder, ttng::ConsumerWaitOp op, + Value bufferFull) { + auto loc = op.getLoc(); + Value phase = getMBarrierPhaseBit(builder, op, 0); + auto waitOp = builder.create(loc, bufferFull, phase); + assert(op.getOperation()->hasAttr("async_agent")); + setAgentIds(waitOp, getAgentIds(op.getOperation())); +} + +void processConsumerReleaseOp(OpBuilder &builder, ttng::ConsumerReleaseOp op, + Value bufferEmpty, int numCTAs) { + auto loc = op.getLoc(); + + // Constants + Value _0 = builder.create(loc, 0, 32); + Value _4 = builder.create(loc, 4, 32); + Value _8 = builder.create(loc, 8, 32); + Value _32 = builder.create(loc, 32, 32); + Value _128 = builder.create(loc, 128, 32); + + // threadId = threadId % 128 + Value threadId = + builder.create(loc, getThreadId(builder, loc), _128); + + // k = threadId / 8 + Value k = builder.create(loc, threadId, _8); + + // row = k / 4 + Value row = builder.create(loc, k, _4); + + // col = k % 4 + Value col = builder.create(loc, k, _4); + + // remoteCTAId = (col ^ row) * 4 + col + Value remoteCTAId = builder.create( + loc, + Value{builder.create( + loc, Value{builder.create(loc, col, row)}, _4)}, + col); + + // pred0 = threadId % 8 == 0 + Value pred0 = builder.create( + loc, arith::CmpIPredicate::eq, + builder.create(loc, threadId, _8), _0); + + // pred1 = remoteCTAId < numCTAs + Value pred1 = builder.create( + loc, arith::CmpIPredicate::ult, remoteCTAId, + builder.create(loc, numCTAs, 32)); + + // pred = pred0 & pred1 + Value pred = builder.create(loc, pred0, pred1); + + // bufferEmpty arrive + auto arriveOp = builder.create(loc, bufferEmpty, pred, + remoteCTAId, false, 0); + + assert(op.getOperation()->hasAttr("async_agent")); + setAgentIds(arriveOp, getAgentIds(op.getOperation())); +} + +void materializeTokenOperations(Operation *parentOp, int numCTAs) { + SmallVector deprecatedOps; + parentOp->walk([&](ttng::CreateTokenOp createTokenOp) { + // Scan load type + LoadType loadType = scanLoadTypes(createTokenOp); + + // mBarrierTy + MLIRContext *context = createTokenOp.getContext(); + auto i64Ty = IntegerType::get(context, 64); + auto mBarrierTy = triton::PointerType::get(i64Ty, 3); + + // mBarriersTy + auto CTALayout = ttg::CTALayoutAttr::get(context, {1}, {1}, {0}); + auto sharedLayout = + ttg::SharedEncodingAttr::get(context, 1, 1, 1, {0}, CTALayout, false); + auto mBarriersTy = + RankedTensorType::get({createTokenOp.getNum()}, i64Ty, sharedLayout); + + // Process CreateTokenOp + OpBuilder builder(createTokenOp); + auto tokenLoc = createTokenOp.getLoc(); + unsigned bufferFullCount = + loadType == LoadType::InsertSliceAsyncV2Op ? 1 : 128; + Value bufferFullArray = builder.create( + tokenLoc, mBarriersTy, bufferFullCount); + Value bufferEmptyArray = + builder.create(tokenLoc, mBarriersTy, numCTAs); + + // Make sure that MBarriers are initialized in all CTAs + if (numCTAs > 1) { + builder.create(tokenLoc, false); + builder.create(tokenLoc); + } + + // Helper function for extracting bufferFull + auto extractBufferFull = [&](Location loc, Value idx) -> Value { + return builder.create(loc, mBarrierTy, + bufferFullArray, idx); + }; + + // Helper function for extracting bufferEmpty + auto extractBufferEmpty = [&](Location loc, Value idx) -> Value { + return builder.create(loc, mBarrierTy, + bufferEmptyArray, idx); + }; + + // Process token users + for (Operation *user : createTokenOp.getResult().getUsers()) { + auto loc = user->getLoc(); + builder.setInsertionPoint(user); + if (auto op = dyn_cast(user)) { + Value bufferEmpty = extractBufferEmpty(loc, op.getIdx()); + assert(user->hasAttr("async_agent")); + setAgentIds(bufferEmpty.getDefiningOp(), getAgentIds(user)); + processProducerAcquireOp(builder, op, bufferEmpty); + } else if (auto op = dyn_cast(user)) { + Value bufferFull = extractBufferFull(loc, op.getIdx()); + assert(user->hasAttr("async_agent")); + setAgentIds(bufferFull.getDefiningOp(), getAgentIds(user)); + processProducerCommitOp(builder, op, bufferFull, loadType); + } else if (auto op = dyn_cast(user)) { + Value bufferFull = extractBufferFull(loc, op.getIdx()); + assert(user->hasAttr("async_agent")); + setAgentIds(bufferFull.getDefiningOp(), getAgentIds(user)); + processConsumerWaitOp(builder, op, bufferFull); + } else if (auto op = dyn_cast(user)) { + Value bufferEmpty = extractBufferEmpty(loc, op.getIdx()); + assert(user->hasAttr("async_agent")); + setAgentIds(bufferEmpty.getDefiningOp(), getAgentIds(user)); + processConsumerReleaseOp(builder, op, bufferEmpty, numCTAs); + } else { + llvm_unreachable("Unexpected user of token"); + } + deprecatedOps.push_back(user); + } + + deprecatedOps.push_back(createTokenOp); + }); + for (auto op : deprecatedOps) { + op->erase(); + } + + // Insert a cluster barrier before the kernel exits. Without this barrier, + // mbarrier_remote_arrive will fail if the remote CTA already exits. + if (numCTAs > 1) { + parentOp->walk([&](triton::FuncOp funcOp) { + Block *block = &funcOp.getBody().front(); + auto returnOp = llvm::cast(block->getTerminator()); + OpBuilder builder(returnOp); + auto loc = returnOp.getLoc(); + builder.create(loc, false); + builder.create(loc); + }); + } +} + +//===----------------------------------------------------------------------===// +// Materialize mutex operations +//===----------------------------------------------------------------------===// + +void mutexSyncPingPang(Operation *parentOp, int numAgents, int &nameBarrierId, + int &globalNumRoles) { + // ping-pang mutex sync: using named barrier and only suitable for two roles. + // Take mutex syncronization between dot and store as an example: + // * For dot loop: + // * role 0 waits for named barrier 15 (loop enter), arrives named barrier + // 14 (loop leave) + // * role 1 waits for named barrier 14 (loop enter), arrives named barrier + // 15 (loop leave) + // * For store: + // * role 0 waits for named barrier 13 (store enter), arrives named barrier + // 12 (store leave) + // * role 1 waits for named barrier 12 (store enter), arrives named barrier + // 13 (store leave) + // As number of named barriers is limited (16), theoretically this mechanism + // only support few roles and agents. + int numRoles = 2, times = 0; + globalNumRoles += numRoles; + Value roleId; + parentOp->walk([&](ttng::GetMutexRoleIdOp getMutexRoleIdOp) { + // GetMutexRoleIdOp only occures once. + assert(times == 0); + OpBuilder builder(getMutexRoleIdOp); + numRoles = getMutexRoleIdOp.getNum(); + auto loc = getMutexRoleIdOp->getLoc(); + Value threadId = getThreadId(builder, loc); + assert(getMutexRoleIdOp->hasAttr("agent.num-warps")); + int numThreads = + 32 * getMutexRoleIdOp->getAttrOfType("agent.num-warps") + .getInt(); + int numThreadsBase = + 32 * + getMutexRoleIdOp->getAttrOfType("agent.num-warps-base") + .getInt(); + assert(numThreads % numRoles == 0); + // TODO: more flexible ways to determine numWarps of each agent. + Value numThreadsValue = + builder.create(loc, numThreads, 32); + Value numRolesValue = + builder.create(loc, numRoles, 32); + Value numThreadsBaseValue = + builder.create(loc, numThreadsBase, 32); + Value numThreadsPerRole = + builder.create(loc, numThreadsValue, numRolesValue); + Value numRemThreads = + builder.create(loc, threadId, numThreadsBaseValue); + roleId = + builder.create(loc, numRemThreads, numThreadsPerRole); + getMutexRoleIdOp.getResult().replaceAllUsesWith(roleId); + getMutexRoleIdOp->erase(); + times++; + }); + + parentOp->walk([&](ttng::CreateMutexOp createMutexOp) { + // Currently, inner-agent sync counts from barId 1 (see membar.cpp, bar 0 + // is used for whole block sync). + // We need to guarantee mutex sync won't use bars of inner-agent sync. + assert(nameBarrierId > globalNumRoles); + // Process CreateMutexOp + OpBuilder builder(createMutexOp); + // TODO: change the hard code of numThreads + auto loc = createMutexOp->getLoc(); + Value numThreads = builder.create(loc, 256, 32); + Value _0 = builder.create(loc, 0, 32); + Value isRole0 = builder.create(loc, arith::CmpIPredicate::eq, + roleId, _0); + assert(nameBarrierId < nameBarrierIdEnd && + nameBarrierId - 1 >= nameBarrierIdBegin); + Value namedBarrierId0 = + builder.create(loc, nameBarrierId, 32); + Value namedBarrierId1 = + builder.create(loc, nameBarrierId - 1, 32); + // Process mutex users + int numUsers = 0; + for (Operation *user : createMutexOp.getResult().getUsers()) { + numUsers++; + assert(numUsers <= 2); + auto loc = user->getLoc(); + builder.setInsertionPoint(user); + if (auto op = dyn_cast(user)) { + Value barEnter = builder.create( + loc, isRole0, namedBarrierId0, namedBarrierId1); + builder.create(loc, barEnter, numThreads); + } else if (auto op = dyn_cast(user)) { + Value barLeave = builder.create( + loc, isRole0, namedBarrierId1, namedBarrierId0); + builder.create(loc, barLeave, numThreads); + } else + llvm_unreachable("Unexpected user of mutex"); + user->erase(); + } + nameBarrierId -= 2; + nameBarrierIdEnd -= 2; + createMutexOp.erase(); + }); +} + +void processLockOp(OpBuilder &builder, ttng::LockOp op) { + auto loc = op.getLoc(); + assert(op->hasAttr("mutex.barId") && op->hasAttr("mutex.numThreads")); + auto barIds = getMutexBarIds(op); + auto threads = getMutexNumThreads(op); + assert(barIds.size() > 0 && barIds.size() == threads.size()); + for (int i = 0; i < barIds.size(); ++i) { + Value numThreads = + builder.create(loc, threads[i], 32); + Value barrier = builder.create(loc, barIds[i], 32); + builder.create(loc, barrier, numThreads); + } +} + +void processUnlockOp(OpBuilder &builder, ttng::UnlockOp op) { + auto loc = op.getLoc(); + assert(op->hasAttr("mutex.barId") && op->hasAttr("mutex.numThreads")); + auto barIds = getMutexBarIds(op); + auto threads = getMutexNumThreads(op); + assert(barIds.size() > 0 && barIds.size() == threads.size()); + for (int i = 0; i < barIds.size(); ++i) { + Value numThreads = + builder.create(loc, threads[i], 32); + Value barrier = builder.create(loc, barIds[i], 32); + builder.create(loc, barrier, numThreads); + } +} + +void materializeMutexOperationsOthers(ModuleOp parentOp) { + parentOp->walk([](ttng::CreateMutexOp createMutexOp) { + // Process CreateMutexOp + OpBuilder builder(createMutexOp); + + // Process mutex users + for (Operation *user : createMutexOp.getResult().getUsers()) { + auto loc = user->getLoc(); + builder.setInsertionPoint(user); + if (auto op = dyn_cast(user)) + processLockOp(builder, op); + else if (auto op = dyn_cast(user)) + processUnlockOp(builder, op); + else + llvm_unreachable("Unexpected user of mutex"); + user->erase(); + } + + createMutexOp.erase(); + }); +} + +void materializeMutexOperations(ModuleOp parentOp) { + nameBarrierIdEnd = 16; + int nameBarrierId = 15; + int globalNumRoles = 0; + // Materialize mutex operations from WSMutex, i.e. auto-mutex + parentOp->walk([&](scf::IfOp IfOp) { + int numRoles = 0; + if (IfOp->hasAttr("agent.num-roles")) { + assert(parentOp->hasAttr("async.num-agents")); + int numAgents = + parentOp->getAttrOfType("async.num-agents").getInt(); + numRoles = IfOp->getAttrOfType("agent.num-roles").getInt(); + // TODO: To support arbitrary number of roles, use mbarrier. + assert(numRoles == 2); + mutexSyncPingPang(IfOp, numAgents, nameBarrierId, globalNumRoles); + } + }); + // Materialize mutex operations for remaining cases. + // User needs to guarantee correctness of synchronization. + materializeMutexOperationsOthers(parentOp); +} + +// TODO: may also not support 8-warp kernel. +void tryRegisterRealloc(ModuleOp mod) { + constexpr int LoadRegisterRequirement = 40; + constexpr int MmaRegisterRequirement = 232; + OpBuilderWithAgentIds builder(mod.getContext()); + + auto isLoadAgent = [](scf::IfOp ifOp) -> bool { + return ifOp + ->walk([](Operation *op) { + if (isa(op)) + return WalkResult::interrupt(); + return WalkResult::advance(); + }) + .wasInterrupted(); + }; + + auto isMmaAgent = [](scf::IfOp ifOp) -> bool { + return ifOp + ->walk([](Operation *op) { + if (isa(op)) + return WalkResult::interrupt(); + return WalkResult::advance(); + }) + .wasInterrupted(); + }; + + // TODO: we need to make agent info more handy + SmallVector agentOps; + mod->walk([&agentOps](triton::FuncOp funcOp) { + Block *block = &funcOp.getBody().front(); + for (Operation &op : block->getOperations()) { + if (auto ifOp = dyn_cast(&op)) { + if (getAgentIds(ifOp).size() == 1) { + agentOps.push_back(ifOp); + } + } + } + }); + for (auto ifOp : agentOps) { + builder.setInsertionPointToStart(&(ifOp.getThenRegion().front())); + builder.setAgentIdsFromOp(ifOp); + auto loc = ifOp.getLoc(); + Type i32_ty = builder.getIntegerType(32); + // If an agent has both mma and load, do nothing. + if (isMmaAgent(ifOp) && isLoadAgent(ifOp)) + continue; + if (isMmaAgent(ifOp)) { + builder.createWithAgentIds( + loc, builder.getIntegerAttr(i32_ty, MmaRegisterRequirement)); + } else if (isLoadAgent(ifOp)) { + builder.createWithAgentIds( + loc, builder.getIntegerAttr(i32_ty, LoadRegisterRequirement)); + } + } +} + +//===----------------------------------------------------------------------===// +// WSMaterializationPass +//===----------------------------------------------------------------------===// + +struct WSMaterializationPass + : public TritonGPUWSMaterializationBase { + WSMaterializationPass() = default; + WSMaterializationPass(int computeCapability) { + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + ModuleOp mod = getOperation(); + if (!ttng::TritonNvidiaGPUDialect::getWSSupportedAttr(mod)) + return signalPassFailure(); + + if (computeCapability / 10 < 9) { + llvm_unreachable("WSMaterialization pass only supports sm_9x as of now."); + signalPassFailure(); + } + + int numCTAs = ttg::TritonGPUDialect::getNumCTAs(mod); + + materializeGetAgentIdOp(mod); + materializeTokenOperations(mod, numCTAs); + materializeMutexOperations(mod); + tryRegisterRealloc(mod); + + mod->walk([](Operation *op) { + bool hasTensor = 0; + auto results = op->getResults(); + auto operands = op->getOperands(); + for (auto i : results) { + if (isa(i.getType())) { + hasTensor = 1; + break; + } + } + if (!hasTensor) { + for (auto i : operands) { + if (isa(i.getType())) { + hasTensor = 1; + break; + } + } + } + + if (!hasTensor && !isa(op) && + !isa(op) && + !isa(op)) { + op->removeAttr("async_agent"); + } + }); + + // TODO: More flexible way to set num-warps + // One dma, one math warp group, set num-warps = 8 + auto i32_ty = IntegerType::get(mod->getContext(), 32); + mod->setAttr("triton_gpu.num-warps", + IntegerAttr::get(i32_ty, llvm::APInt(32, 8))); + + WalkResult result = mod->walk([&](scf::IfOp ifOp) { + if (ifOp->hasAttr("agent.num-roles")) { + return WalkResult::interrupt(); + } + return WalkResult::advance(); + }); + if (result.wasInterrupted()) { + mod->setAttr("triton_gpu.num-warps", + IntegerAttr::get(i32_ty, llvm::APInt(32, 12))); + } + mod->removeAttr("async.num-agents"); + } +}; + +} // namespace + +//===----------------------------------------------------------------------===// +// createTritonNvidiaGPUWSMaterializationPass +//===----------------------------------------------------------------------===// + +std::unique_ptr +mlir::createTritonNvidiaGPUWSMaterializationPass(int computeCapability) { + return std::make_unique(computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSMutex.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMutex.cpp new file mode 100644 index 000000000000..e949804c8560 --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMutex.cpp @@ -0,0 +1,315 @@ +#include + +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +#include "mlir/Analysis/SliceAnalysis.h" + +using namespace mlir; +namespace ttg = triton::gpu; +namespace ttng = triton::nvidia_gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace { + +// Target operations: dot, load, store. Add more when necessary. +#define KEY_TYPES triton::DotOp, ttg::InsertSliceOp, triton::StoreOp + +template +void getKeyTypeId(Operation *op, int &id, bool &found) { + if (isa(op)) + found = true; + + if (!found) { + id++; + if constexpr (sizeof...(Tails) > 0) + getKeyTypeId(op, id, found); + } +} + +template int getKeyTypeIdWrapper(Operation *op) { + bool found = false; + int id = 0; + getKeyTypeId(op, id, found); + return found ? id : -1; +} + +bool isEligible(Operation *agent, + DenseMap> &keyTypeOpMap, + scf::ForOp &persistentForOp) { + // metrics: + // 1. Have more than one key type of operation. + // 2. persistent (all key operations are in one forOp) + DenseSet keyTypes; + DenseSet keyOperations; + agent->walk([&](Operation *op) { + auto typeId = getKeyTypeIdWrapper(op); + if (typeId >= 0 && op != agent) { + keyTypes.insert(typeId); + keyOperations.insert(op); + keyTypeOpMap[typeId].insert(op); + } + }); + + if (keyTypes.size() <= 1) { + return false; + } + + auto getPersistentFor = [&](DenseSet keyOps, + scf::ForOp &innerMostForOp) -> bool { + DenseSet commonForOps0, commonForOps1; + DenseSet *commonForOpsPre = &commonForOps0, + *commonForOpsPro = &commonForOps1; + assert(keyOps.size() > 1); + SmallVector forOps; + agent->walk( + [&](scf::ForOp forOp) { forOps.push_back(forOp); }); + + bool hasCommon = false; + for (auto &f : forOps) { + bool isCommon = true; + for (auto &k : keyOps) { + if (!f->isAncestor(k)) { + isCommon = false; + break; + } + } + if (isCommon) { + innerMostForOp = f; + hasCommon = true; + } + } + return hasCommon; + }; + + // Persistent agents with more than one key types are eligible. + return getPersistentFor(keyOperations, persistentForOp); +} + +void mutexSync(ModuleOp &mod, scf::IfOp &ifOp, scf::ForOp &persistentForOp, + DenseMap> &keyTypeOpMap) { + // Modify keyTypeOpMap: DenseMap> --> DenseMap. Conservetively, assign each key operation one mutex. + // =======================detail description (TODO: to be + // deleted)========================== because it's hard to check if two + // operations with same typeid can share same mutex, we assign each key + // operation one mutex. To illustrate the hardness of this analysis, say we + // have two operations with same typeid: a and b, if there is another + // operation (say c) of different typeid between a and b, and their locations + // are a -- c -- b, then if the dependency is: + // * b depends on c, then a and b can NOT share the same mutex. + // * otherwise, a and b can share after move b before c. + // It would be more complicated when there are more types and operations. + DenseMap ProxyKeyTypeOpMap; + for (auto &[id, ops] : keyTypeOpMap) { + for (auto itr = ops.begin(); itr != ops.end(); ++itr) { + auto op = *itr; + ProxyKeyTypeOpMap[ProxyKeyTypeOpMap.size()] = op; + } + } + + int numRoles = ProxyKeyTypeOpMap.size(); + auto loc = ifOp.getLoc(); + OpBuilderWithAgentIds builder(ifOp.getContext()); + // Set num-roles for wsmaterialization pass + ifOp->setAttr("agent.num-roles", builder.getI32IntegerAttr(numRoles)); + builder.setAgentIdsFromOp(ifOp); + builder.setInsertionPointToStart(&(ifOp.getThenRegion().front())); + Value _0 = builder.create(loc, 0, 32); + Value curRoleId = + builder.createWithAgentIds(loc, numRoles); + Value isNotRole0 = builder.create( + loc, arith::CmpIPredicate::ne, curRoleId, _0); + + SmallVector mutexBarriers; + for (int i = 0; i < numRoles; ++i) { + auto v = builder.createWithAgentIds(loc); + mutexBarriers.push_back(v); + } + + // Update lower bound, step and pipelineIdx of persistentForOp + builder.setInsertionPoint(persistentForOp); + Value start = builder.createWithAgentIds( + loc, persistentForOp.getStep(), curRoleId); + Value oldLB = persistentForOp.getLowerBound(); + Value pipelineIdx = + persistentForOp->getOperand(persistentForOp->getNumOperands() - 1); + + start = builder.createWithAgentIds(loc, oldLB, start); + persistentForOp.setLowerBound(start); + + Value numRolesValue = + builder.createWithAgentIds(loc, numRoles, 32); + Value step = builder.createWithAgentIds( + loc, persistentForOp.getStep(), numRolesValue); + persistentForOp.setStep(step); + + Value newIdx = + builder.createWithAgentIds(loc, pipelineIdx, curRoleId); + persistentForOp.setIterArg(persistentForOp.getNumIterOperands() - 1, newIdx); + auto yield = + llvm::cast(persistentForOp.getBody()->getTerminator()); + auto idxPlusOneOp = + yield->getOperand(yield->getNumOperands() - 1).getDefiningOp(); + assert(isa(idxPlusOneOp)); + assert(idxPlusOneOp->getOperand(0) == + persistentForOp.getBody()->getArgument( + persistentForOp.getBody()->getNumArguments() - 1)); + idxPlusOneOp->setOperand(1, numRolesValue); + + // Add operations at the start of persistentForOp + builder.setInsertionPointToStart(persistentForOp.getBody()); + // If( role != 0 || !is_first_tile ) + Value isNotTileId0 = builder.create( + loc, arith::CmpIPredicate::ne, persistentForOp.getBody()->getArgument(0), + oldLB); + Value cond = builder.create(loc, isNotTileId0, isNotRole0); + + // Determine boundaries: get the largest exclusive op for each key op. + DenseMap lockLocs, unlockLocs; + DenseMap> parentOps; + for (int i = 0; i < numRoles; ++i) { + auto op = ProxyKeyTypeOpMap[i]->getParentOp(); + while (op != persistentForOp->getParentOp()) { + parentOps[i].push_back(op); + op = op->getParentOp(); + } + } + + std::map, std::pair::iterator, + SmallVector::iterator>> + rangeMap; + for (auto &[i, opsI] : parentOps) { + // Check exlusiveness + auto op = ProxyKeyTypeOpMap[i]; + for (auto &[j, opsJ] : parentOps) { + if (i == j) + continue; + auto pair = std::pair(i, j); + auto pairConj = std::pair(j, i); + auto end0 = rangeMap.count(pair) ? rangeMap[pair].first : opsI.end(); + auto end1 = rangeMap.count(pair) ? rangeMap[pair].second : opsJ.end(); + for (auto m = opsI.begin(); m != end0; ++m) { + auto itr = std::find(opsJ.begin(), end1, *m); + if (itr == end1) { + op = *m; + rangeMap[pair] = std::make_pair(m, itr); + rangeMap[pairConj] = rangeMap[pair]; + } else + goto exit; + } + } + exit:; + lockLocs[i] = op; + unlockLocs[i] = op; + } + + // Only cases where all lock/unlock locations are in same level make sense. + for (int i = 1; i < numRoles; ++i) { + if (lockLocs[i]->getParentOp() != lockLocs[i - 1]->getParentOp() || + unlockLocs[i]->getParentOp() != unlockLocs[i - 1]->getParentOp()) { + llvm_unreachable("Only cases where all locl/unlock locations are in same " + "level make sense"); + } + } + + // Extend boundaries: wait and release as early as possible + DenseMap prevTypeIds; + int prevId = -1; + persistentForOp->walk([&](Operation *op) { + for (int i = 0; i < numRoles; ++i) { + if (lockLocs[i] == op) { + prevTypeIds[i] = prevId; + prevId = i; + break; + } + } + }); + + // Update lockLocs + for (int i = 0; i < numRoles; ++i) { + if (prevTypeIds[i] == -1) + lockLocs[i] = cond.getDefiningOp(); + else + lockLocs[i] = unlockLocs[prevTypeIds[i]]; + } + // lock + for (int i = 0; i < numRoles; ++i) { + builder.setInsertionPointAfter(lockLocs[i]); + auto waitIfOp = builder.create(loc, cond); + builder.setInsertionPointToStart(&(waitIfOp.getThenRegion().front())); + builder.create(loc, mutexBarriers[i]); + } + + // unlock + for (int i = 0; i < numRoles; ++i) { + builder.setInsertionPointAfter(unlockLocs[i]); + builder.create(loc, mutexBarriers[i]); + } + + // Add attr "agent.mutex_role" for barrier analysis + int roleId = -1; + for (Operation &bodyOp : lockLocs[0]->getBlock()->getOperations()) { + Operation *op = &bodyOp; + if (roleId != -1) + op->walk([&](Operation *subOp) { + if (!isa(op) && !isa(op) && + !isa(op)) + subOp->setAttr("agent.mutex_role", builder.getI32IntegerAttr(roleId)); + }); + for (int i = 0; i < numRoles; ++i) { + if (lockLocs[i] == op) { + roleId = i; + op->setAttr("agent.mutex_role", builder.getI32IntegerAttr(i)); + break; + } + } + } +} + +//===----------------------------------------------------------------------===// +// WSMaterializationPass +//===----------------------------------------------------------------------===// + +struct WSMutexPass : public TritonGPUWSMutexBase { +public: + WSMutexPass() = default; + WSMutexPass(int computeCapability) { + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + MLIRContext *context = &getContext(); + ModuleOp mod = getOperation(); + mod.walk([&](triton::FuncOp funcOp) { + for (Operation &bodyOp : funcOp.getBody().front().getOperations()) { + Operation *op = &bodyOp; + scf::ForOp persistentForOp; + // premise: agent region is encapsulated with scf.if + if (isa(op) && getAgentIds(op).size() == 1) { + DenseMap> keyTypeOpMap; + if (isEligible(op, keyTypeOpMap, persistentForOp)) { + auto ifOp = cast(op); + mutexSync(mod, ifOp, persistentForOp, keyTypeOpMap); + } + } + } + }); + } +}; + +} // namespace + +//===----------------------------------------------------------------------===// +// createTritonNvidiaGPUWSMutexPass +//===----------------------------------------------------------------------===// + +std::unique_ptr +mlir::createTritonNvidiaGPUWSMutexPass(int computeCapability) { + return std::make_unique(computeCapability); +} diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSPipeline.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSPipeline.cpp new file mode 100644 index 000000000000..1dd523a8029b --- /dev/null +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSPipeline.cpp @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Utility.h" + +#include "mlir/Analysis/SliceAnalysis.h" + +#include +#include + +using namespace mlir; +namespace ttg = triton::gpu; +namespace ttng = triton::nvidia_gpu; + +#define GEN_PASS_CLASSES +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h.inc" + +namespace { +struct Channel { +public: + using Relation = std::pair; + + Channel(int producer, int consumer, Operation *src, Operation *dst) + : relation(producer, consumer), srcOp(src), dstOp(dst) {} + + bool operator==(const Channel &c) { + return relation == c.relation && srcOp == c.srcOp && dstOp == c.dstOp; + } + + Relation relation; + Operation *srcOp; + Operation *dstOp; +}; + +//===----------------------------------------------------------------------===// +// createToken +//===----------------------------------------------------------------------===// + +DenseMap +createToken(const DenseMap> &map, + triton::FuncOp funcOp, int numStages) { + DenseMap ret; + OpBuilder builder(funcOp); + builder.setInsertionPointToStart(&(funcOp.getBody().front())); + for (auto it = map.begin(); it != map.end(); ++it) { + Value v; + if (it->second.front()->srcOp->getParentOfType()) { + v = builder.create(funcOp.getLoc(), numStages); + } else { + // No need to pipeline + v = builder.create(funcOp.getLoc(), 1); + } + for (auto &c : it->second) { + ret[c] = v; + } + } + return ret; +} + +//===----------------------------------------------------------------------===// +// createBuffer +//===----------------------------------------------------------------------===// + +DenseMap createBuffer(const SmallVector &channels, + triton::FuncOp funcOp, int numStages) { + DenseMap bufferMap; + MLIRContext *context = funcOp.getContext(); + OpBuilder builder(funcOp); + builder.setInsertionPointToStart(&(funcOp.getBody().front())); + for (const auto &c : channels) { + auto loadOp = dyn_cast(c->srcOp); + Value loadResult = loadOp.getResult(); + if (auto tensorType = loadResult.getType().dyn_cast()) { + // Get basic information from tensorType + auto order = ttg::getOrder(tensorType.getEncoding()); + auto CTALayout = ttg::getCTALayout(tensorType.getEncoding()); + auto elemType = tensorType.getElementType(); + + // Get shape, layout and type of a slice + auto sliceShape = tensorType.getShape(); + auto sharedLayout = ttg::SharedEncodingAttr::get( + context, sliceShape, order, CTALayout, elemType); + auto sliceType = + RankedTensorType::get(sliceShape, elemType, sharedLayout); + + // Get shape, layout and type of the complete buffer + SmallVector bufferShape(sliceShape.begin(), sliceShape.end()); + if (loadOp->getParentOfType()) { + bufferShape.insert(bufferShape.begin(), numStages); + } else { + // No need to pipeline + bufferShape.insert(bufferShape.begin(), 1); + } + auto bufferType = + RankedTensorType::get(bufferShape, elemType, sharedLayout); + Value buffer = + builder.create(funcOp.getLoc(), bufferType); + bufferMap[c] = buffer; + } else { + llvm_unreachable("Unexpected result type"); + } + } + return bufferMap; +} + +//===----------------------------------------------------------------------===// +// appendPipelineIdxToLoopArgs +//===----------------------------------------------------------------------===// + +scf::ForOp appendPipelineIdxToLoopArgs(scf::ForOp forOp, int numStages, + scf::ForOp &parentForOp) { + auto loc = forOp.getLoc(); + Block *body = forOp.getBody(); + + // The agentId set of pipelineIdx is the union of agentId sets of all ops in + // the for loop + OpBuilderWithAgentIds builder(forOp.getContext()); + builder.setAgentIdsFromArray(collectAgentIds(forOp)); + + builder.setInsertionPoint(forOp); + Value numStagesVal = + builder.createWithAgentIds(loc, numStages, 32); + // Append pipelineIdx to block arguments + Value pipelineIdx = + body->insertArgument(body->getNumArguments(), builder.getI32Type(), loc); + + // pipelineIdx = (pipelineIdx + 1) % numStages + auto yieldOp = llvm::cast(body->getTerminator()); + builder.setInsertionPoint(yieldOp); + Value one = builder.createWithAgentIds(loc, 1, 32); + + Value pipelineIdxPlusOne = + builder.createWithAgentIds(loc, pipelineIdx, one); + + // Append pipelineIdx to yield operands + yieldOp->insertOperands(yieldOp.getNumOperands(), {pipelineIdxPlusOne}); + + // Copy iter operands of forOp + SmallVector newLoopArgs; + for (auto operand : forOp.getIterOperands()) + newLoopArgs.push_back(operand); + + // Append initial value of pipelineIdx to newLoopArgs + builder.setInsertionPoint(forOp); + Value initValue; + if (parentForOp) { + // Make sure prior pipelineIdx is inserted in the end of parentForOp + initValue = parentForOp.getBody()->getArguments().back(); + Value numSteps = builder.createWithAgentIds( + loc, forOp.getUpperBound(), forOp.getLowerBound()); + numSteps = builder.createWithAgentIds(loc, numSteps, + forOp.getStep()); + initValue = + builder.createWithAgentIds(loc, initValue, numSteps); + } else { + initValue = builder.createWithAgentIds(loc, 0, 32); + } + newLoopArgs.push_back(initValue); + + // Create newForOp and take the region of forOp + auto newForOp = builder.createWithAgentIds( + loc, forOp.getLowerBound(), forOp.getUpperBound(), forOp.getStep(), + newLoopArgs); + newForOp.getRegion().takeBody(forOp.getRegion()); + + // Replace forOp with newForOp + for (unsigned i = 0; i < forOp.getNumResults(); ++i) + forOp.getResult(i).replaceAllUsesWith(newForOp.getResult(i)); + forOp.erase(); + + return newForOp; +} + +//===----------------------------------------------------------------------===// +// appendPipelineIdxArgs +//===----------------------------------------------------------------------===// + +void appendPipelineIdxArgs(SmallVector &backbone, int numStages) { + + SmallVector orderedForOps; + for (auto &op : backbone) { + op->walk([&](Operation *subOp) { + if (auto forOp = dyn_cast(subOp)) { + orderedForOps.push_back(forOp); + } + }); + } + + for (auto &op : orderedForOps) { + scf::ForOp parentForOp = op->getParentOfType(); + auto newForOp = appendPipelineIdxToLoopArgs(op, numStages, parentForOp); + auto backboneForItr = + std::find(backbone.begin(), backbone.end(), op.getOperation()); + if (backboneForItr != backbone.end()) { + // Update backbone + *backboneForItr = newForOp.getOperation(); + } + } +} + +//===----------------------------------------------------------------------===// +// checkDependencyAndCollectUsedArgs +//===----------------------------------------------------------------------===// + +SmallVector checkDependencyAndCollectUsedArgs( + scf::ForOp forOp, AgentId agentId, + DenseMap &blockArgToYieldOperand) { + + std::unordered_set visited; + SetVector argSet; + + // DFS + std::function dfs = [&](Operation *op) { + if (visited.find(op) != visited.end()) + return; + visited.insert(op); + for (Value operand : op->getOperands()) { + if (auto blockArg = operand.dyn_cast()) { + if (!blockArgToYieldOperand[blockArg]) + continue; + argSet.insert(blockArg.getArgNumber() - forOp.getNumInductionVars()); + operand = blockArgToYieldOperand[blockArg]; + } + Operation *depOp = operand.getDefiningOp(); + assert(depOp && "Unexpected Value with no defining op"); + if (depOp->getBlock() != forOp.getBody()) + continue; + assert(hasAgentId(depOp, agentId) && "Dependency error"); + dfs(depOp); + } + }; + + // Start from operations that are marked with this agentId explicitly and + // check dependency with DFS traversal + forOp.walk([&](Operation *op) { + if (hasAgentId(op, agentId) && !isa(op)) + dfs(op); + }); + + // Collect used block args + SmallVector args(argSet.begin(), argSet.end()); + llvm::sort(args); + return args; +} + +//===----------------------------------------------------------------------===// +// createForOpsForEachAgentId +//===----------------------------------------------------------------------===// + +DenseMap createForOpsForEachAgentId(scf::ForOp forOp) { + // Collect operation list for each agentId + DenseMap> opList; + for (Operation &op : forOp.getBody()->without_terminator()) + for (AgentId agentId : getAgentIds(&op)) + opList[agentId].push_back(&op); + + // Prepare blockArgToYieldOperand mapping + DenseMap blockArgToYieldOperand; + auto yieldOp = llvm::cast(forOp.getBody()->getTerminator()); + assert(yieldOp.getNumOperands() == forOp.getNumRegionIterArgs()); + for (unsigned i = 0; i < forOp.getNumRegionIterArgs(); ++i) + blockArgToYieldOperand[forOp.getRegionIterArg(i)] = yieldOp.getOperand(i); + + auto loc = forOp.getLoc(); + OpBuilderWithAgentIds builder(forOp.getContext()); + DenseMap agentsToForOp; + + // Create newForOp for each agent + for (AgentId agentId : collectAgentIds(forOp)) { + auto usedArgs = checkDependencyAndCollectUsedArgs(forOp, agentId, + blockArgToYieldOperand); + + // Prepare newLoopArgs + SmallVector newLoopArgs; + for (unsigned argNumber : usedArgs) + newLoopArgs.push_back(forOp.getIterOperands()[argNumber]); + + // Create newForOp + builder.setAgentIdsFromArray({agentId}); + builder.setInsertionPoint(forOp); + auto newForOp = builder.createWithAgentIds( + loc, forOp.getLowerBound(), forOp.getUpperBound(), forOp.getStep(), + newLoopArgs); + + // Initialize Value mapping from forOp to newForOp + IRMapping mapping; + mapping.map(forOp.getInductionVar(), newForOp.getInductionVar()); + for (unsigned i = 0; i < usedArgs.size(); ++i) { + auto oldArg = forOp.getRegionIterArgs()[usedArgs[i]]; + auto newArg = newForOp.getRegionIterArgs()[i]; + mapping.map(oldArg, newArg); + } + + // Clone all operations with this agentId to newForOp + builder.setInsertionPointToStart(newForOp.getBody()); + for (Operation *op : opList[agentId]) { + Operation *newOp = builder.clone(*op, mapping); + setAgentIds(newOp, {agentId}); + for (unsigned i = 0; i < op->getNumResults(); ++i) + mapping.map(op->getResult(i), newOp->getResult(i)); + } + + // Create YieldOp for newForOp + SmallVector newYieldOperands; + for (unsigned i : usedArgs) + newYieldOperands.push_back(mapping.lookup(yieldOp.getOperand(i))); + auto newYieldOp = + builder.create(yieldOp.getLoc(), newYieldOperands); + setAgentIds(newYieldOp, {agentId}); + + // Replace results of forOp with results of newForOp + for (unsigned i = 0; i < usedArgs.size(); ++i) { + auto oldResult = forOp.getResult(usedArgs[i]); + auto newResult = newForOp.getResult(i); + oldResult.replaceAllUsesWith(newResult); + } + + agentsToForOp[agentId] = newForOp; + } + + return agentsToForOp; +} + +//===----------------------------------------------------------------------===// +// createIfOpsForEachAgentId +//===----------------------------------------------------------------------===// + +DenseMap createIfOpsForEachAgentId(scf::IfOp ifOp) { + // TODO: to be implemented + OpBuilderWithAgentIds builder(ifOp.getContext()); + DenseMap agentsToIfOp; + return agentsToIfOp; +} + +//===----------------------------------------------------------------------===// +// SpecializeAgentRegion +//===----------------------------------------------------------------------===// + +DenseMap SpecializeAgentRegion(triton::FuncOp funcOp) { + MLIRContext *context = funcOp.getContext(); + OpBuilder builder(context); + auto loc = funcOp.getLoc(); + + // Get block from funcOp + Block *block = &funcOp.getBody().front(); + auto returnOp = llvm::cast(block->getTerminator()); + + // Collect original operations + SmallVector opList; + for (Operation &op : block->getOperations()) + opList.push_back(&op); + + // Get curAgentId + builder.setInsertionPoint(returnOp); + Value curAgentId = builder.create(loc); + + // Resources for each agentId + DenseMap> agentsToBuilders; + DenseMap agentsToIfOp; + DenseMap agentsToIRMappings; + + for (AgentId agentId : collectAgentIds(funcOp)) { + // Create IfOp for each agentId + Value cond = builder.create( + loc, arith::CmpIPredicate::eq, curAgentId, + builder.create(loc, agentId, 32)); + + auto ifOp = builder.create(loc, cond); + agentsToIfOp[agentId] = ifOp; + setAgentIds(ifOp, {agentId}); + + // Create OpBuilderWithAgentIds for each agent + auto agentBuilder = std::make_shared(context); + agentsToBuilders[agentId] = agentBuilder; + agentBuilder->setAgentIdsFromArray({agentId}); + + // Set insertion point before yieldOp + auto yieldOp = ifOp.thenYield(); + setAgentIds(yieldOp, {agentId}); + agentBuilder->setInsertionPoint(yieldOp); + } + + // Clone all operations into corresponding if blocks + SmallVector cloned; + for (Operation *op : opList) { + auto agentIds = getAgentIds(op); + if (!agentIds.empty()) { + cloned.push_back(op); + for (AgentId agentId : getAgentIds(op)) { + IRMapping &mapping = agentsToIRMappings[agentId]; + Operation *newOp = agentsToBuilders[agentId]->clone(*op, mapping); + for (unsigned i = 0; i < op->getNumResults(); ++i) + mapping.map(op->getResult(i), newOp->getResult(i)); + } + } + } + + // Remove original operations that have been cloned in reverse order + for (auto it = cloned.rbegin(); it != cloned.rend(); ++it) { + Operation *op = *it; + op->erase(); + } + + return agentsToIfOp; +} + +//===----------------------------------------------------------------------===// +// collectAsyncChannels +//===----------------------------------------------------------------------===// + +void collectAsyncChannels(SmallVector> &channels, + triton::FuncOp &funcOp) { + funcOp.walk([&](Operation *op) { + for (auto result : op->getResults()) { + if (result.use_empty() || !op->hasAttr("async_agent")) { + continue; + } + auto producerAgent = + op->getAttrOfType("async_agent"); + if (producerAgent.getValues().size() > 1) { + continue; + } + for (Operation *userOp : result.getUsers()) { + if (!userOp->hasAttr("async_agent") || + userOp->getAttrOfType("async_agent") + .getValues() + .size() > 1) { + continue; + } + auto consumerAgentId = + userOp->getAttrOfType("async_agent") + .getValues()[0]; + auto producerAgentId = producerAgent.getValues()[0]; + if (producerAgentId != consumerAgentId) { + channels.push_back(std::make_unique( + producerAgentId, consumerAgentId, op, userOp)); + } + } + } + }); +} + +//===----------------------------------------------------------------------===// +// reduceChannels +//===----------------------------------------------------------------------===// + +void reduceChannels(SmallVector &channels, + + DenseMap> &map) { + // If producers or their consumers has the same convergent comsumer, + // and those producers, producers' consumers and the convergent comsumer are + // in the same block, They share the same token. + auto checkConverge = [](Operation *op1, Operation *op2) -> Operation * { + // Only check level-0 and level-1 convergence, e.g. + // producer: load0 load1 + // | | + // consumer: convertLayout0 convertLayout1 + // \ / + // consumer: dot + // The example above is level-1 convergence. + // If convertLayoutOps converge in deeper depth, this function will + // fail to detect. + // TODO: implement general level-N convergence. + if (op1 == op2) { + return op1; + } + if (op1->getBlock() == op2->getBlock() && op1->hasOneUse() && + op2->hasOneUse() && + *(op1->getUsers().begin()) == *(op2->getUsers().begin()) && + (*(op1->getUsers().begin()))->getBlock() == op1->getBlock()) { + return *(op1->getUsers().begin()); + } + return nullptr; + }; + assert(channels.size() > 0 && "channel size is zero"); + // Compare with existing channels in map + for (auto c0 = channels.begin(); c0 != channels.end(); ++c0) { + bool isConvergent = false; + for (auto &kv : map) { + if (kv.second.size() > 0 && + (*c0)->srcOp->getBlock() == kv.second.front()->srcOp->getBlock()) { + if (auto cvg = checkConverge((*c0)->dstOp, kv.second.front()->dstOp)) { + kv.second.push_back(*c0); + isConvergent = true; + break; + } + } + } + if (!isConvergent) { + map[(*c0)->dstOp].push_back(*c0); + } + } + + // Reorder channels and maps based on locations of producers + for (auto &kv : map) { + if (kv.second.size() > 1) { + auto &allOps = kv.second.front()->srcOp->getBlock()->getOperations(); + std::sort( + kv.second.begin(), kv.second.end(), [&](Channel *a, Channel *b) { + auto itrA = + std::find_if(allOps.begin(), allOps.end(), [&](Operation &op) { + Operation *opPointer = &op; + return opPointer == a->srcOp; + }); + auto itrB = + std::find_if(allOps.begin(), allOps.end(), [&](Operation &op) { + Operation *opPointer = &op; + return opPointer == b->srcOp; + }); + assert(itrA != allOps.end() && itrB != allOps.end()); + return std::distance(itrA, itrB) < 0; + }); + } + } +} + +//===----------------------------------------------------------------------===// +// getBackbone +//===----------------------------------------------------------------------===// + +SmallVector getBackbone(triton::FuncOp funcOp, + const SmallVector &channels) { + // Backbone: outermost Ops with regions in funcOp which contain at least one + // relation between producer and consumer. It assumes producer-consumer + // relation going across two outermost Ops in funcOp is forbidden. For + // example, In the example of runOnOperation(), only the outermost ForOp is + // backbone, the inner ForOp is not. + SmallVector backboneOps; + auto isBackbone = [&](Operation *backbone) -> bool { + for (auto c : channels) { + Operation *producer = c->srcOp, *consumer = c->dstOp; + while (producer && !isa(producer->getParentOp())) { + producer = producer->getParentOp(); + } + while (consumer && !isa(consumer->getParentOp())) { + consumer = consumer->getParentOp(); + } + if (producer == backbone && consumer == backbone) { + return true; + } + assert((producer != backbone || + isa(producer->getParentOp())) && + (consumer != backbone || + isa(consumer->getParentOp())) && + "Error: producer and consumer belongs to different backboneOps"); + } + return false; + }; + Operation *op; + for (Operation &bodyOp : funcOp.getBody().front().getOperations()) { + op = &bodyOp; + if (op->getNumRegions() > 0) { + // If this op as a whole is a producer or consumer, continue + if (getAgentIds(op).size() == 1) { + continue; + } + if (isBackbone(op)) { + backboneOps.push_back(op); + } + } + } + return backboneOps; +} + +//===----------------------------------------------------------------------===// +// buildAsyncComm +//===----------------------------------------------------------------------===// + +void buildAsyncComm(const DenseMap> &map, + const DenseMap &tokenMap, + const DenseMap &bufferMap, + int numStages) { + + auto getSameLevelOp = [](Operation *p, Operation *c) -> Operation * { + while (!isa(c)) { + if (c->getParentOp() == p->getParentOp()) { + return c; + } + c = c->getParentOp(); + } + llvm_unreachable("Falied to find consumer's same level Op with producer"); + }; + + auto consumerReleaseHeutistic = [&](Operation *p, + Operation *c) -> Operation * { + if (c->getBlock() == p->getBlock()) { + auto consumerAgentId = + c->getAttrOfType("async_agent") + .getValues()[0]; + for (auto it = c->getBlock()->rbegin(); it != c->getBlock()->rend(); + ++it) { + if (!it->hasAttr("async_agent")) { + continue; + } + auto asyncAttr = it->getAttrOfType("async_agent") + .getValues(); + if (asyncAttr.size() == 1 && asyncAttr[0] == consumerAgentId) { + return &(*it); + } + } + return nullptr; + } else { + return getSameLevelOp(p, c); + } + }; + + auto getAgents = [&](Operation *p, Operation *c, SmallVector &agentP, + SmallVector &agentC, + SmallVector &agentsPC) -> void { + agentP = collectAgentIds(p); + agentC = collectAgentIds(c); + agentsPC.reserve(agentP.size() + agentC.size()); + agentsPC.insert(agentsPC.end(), agentP.begin(), agentP.end()); + agentsPC.insert(agentsPC.end(), agentC.begin(), agentC.end()); + }; + // TODO: try to optimize locations of arriving and waiting token + // for fused-attention + for (auto kv : map) { + /*****************Token related*****************/ + auto headProducer = kv.second.front()->srcOp; + auto tailProducer = kv.second.back()->srcOp; + auto headConsumer = kv.second.front()->dstOp; + auto tailConsumer = kv.second.back()->dstOp; + auto token = tokenMap.find(kv.second.front())->second; + SmallVector agentP, agentC, agentsPC; + getAgents(headProducer, headConsumer, agentP, agentC, agentsPC); + OpBuilderWithAgentIds builder(headProducer->getContext()); + + if (auto funcOp = dyn_cast(headProducer->getParentOp())) { + builder.setInsertionPointToStart(&(funcOp.getBody().front())); + } else { + builder.setInsertionPoint(headProducer->getParentOp()); + } + builder.setAgentIdsFromArray(agentsPC); + Value pipelineIdx; + Value numStagesVal = builder.createWithAgentIds( + headProducer->getLoc(), numStages, 32); + if (auto forOp = headProducer->getParentOfType()) { + pipelineIdx = forOp.getBody()->getArguments().back(); + } else { + // existing"); + pipelineIdx = builder.createWithAgentIds( + headProducer->getLoc(), 0, 32); + } + + // insert ProducerAcquireOp + builder.setInsertionPoint(headProducer); + if (headProducer->getParentOfType()) { + pipelineIdx = builder.createWithAgentIds( + headProducer->getLoc(), pipelineIdx, numStagesVal); + } + builder.setAgentIdsFromArray(agentP); + builder.createWithAgentIds(headProducer->getLoc(), + token, pipelineIdx); + + // insert ProducerCommitOp + builder.setInsertionPointAfter(tailProducer); + builder.createWithAgentIds(tailProducer->getLoc(), + token, pipelineIdx); + + builder.setAgentIdsFromArray(agentC); + // insert ConsumerWaitOp + auto consumerWaitPoint = getSameLevelOp(headProducer, headConsumer); + builder.setInsertionPoint(consumerWaitPoint); + builder.createWithAgentIds(headConsumer->getLoc(), + token, pipelineIdx); + + // insert ConsumerReleaseOp + auto consumerReleasePoint = + consumerReleaseHeutistic(tailProducer, tailConsumer); + builder.setInsertionPointAfter(consumerReleasePoint); + builder.createWithAgentIds( + consumerReleasePoint->getLoc(), token, pipelineIdx); + + /*****************Buffer related*****************/ + /// splitLoadsInForLoop + for (auto &c : kv.second) { + assert(isa(c->srcOp) && "prodcuerOp is not tt.load"); + auto loadOp = cast(c->srcOp); + auto buffer = bufferMap.find(c)->second; + MLIRContext *context = loadOp->getContext(); + OpBuilderWithAgentIds builder(context); + builder.setInsertionPoint(loadOp->getParentOp()); + builder.setAgentIdsFromArray(agentsPC); + + builder.setInsertionPoint(loadOp); + Value loadResult = loadOp.getResult(); + if (auto tensorType = loadResult.getType().dyn_cast()) { + // Get basic information from tensorType + auto order = ttg::getOrder(tensorType.getEncoding()); + auto CTALayout = ttg::getCTALayout(tensorType.getEncoding()); + auto elemType = tensorType.getElementType(); + + // Get shape, layout and type of a slice + auto sliceShape = tensorType.getShape(); + auto sharedLayout = ttg::SharedEncodingAttr::get( + context, sliceShape, order, CTALayout, elemType); + auto sliceType = + RankedTensorType::get(sliceShape, elemType, sharedLayout); + + // Get shape, layout and type of the complete buffer + SmallVector bufferShape(sliceShape.begin(), sliceShape.end()); + if (loadOp->getParentOfType()) { + bufferShape.insert(bufferShape.begin(), numStages); + } else { + bufferShape.insert(bufferShape.begin(), 1); + } + auto bufferType = + RankedTensorType::get(bufferShape, elemType, sharedLayout); + + // Create InsertSliceOp + builder.setAgentIdsFromOp(loadOp); + builder.setInsertionPointAfter(loadOp); + auto insertSliceOp = builder.createWithAgentIds( + /*loc=*/loadOp.getLoc(), /*result=*/bufferType, + /*src=*/loadOp.getPtr(), /*dst=*/buffer, /*index=*/pipelineIdx, + /*mask=*/loadOp.getMask(), /*other=*/loadOp.getOther(), + /*cache=*/loadOp.getCache(), /*evict=*/loadOp.getEvict(), + /*isVolatile=*/loadOp.getIsVolatile(), /*axis=*/0); + + // Create ExtractSliceOp + auto attr = [&](int val) { return builder.getI64IntegerAttr(val); }; + SmallVector offsets = {pipelineIdx, attr(0), attr(0)}; + SmallVector sizes = {attr(1), attr(sliceShape[0]), + attr(sliceShape[1])}; + SmallVector strides = {attr(1), attr(1), attr(1)}; + builder.setAgentIdsFromValueUsers(loadResult); + builder.setInsertionPoint(c->dstOp); + auto extractSliceOp = builder.createWithAgentIds( + loadOp.getLoc(), sliceType, buffer, offsets, sizes, strides); + + // Replace all uses of loadResult + loadResult.replaceAllUsesWith(extractSliceOp.getResult()); + loadOp.erase(); + } + } + } +} + +//===----------------------------------------------------------------------===// +// agentDivision +//===----------------------------------------------------------------------===// + +DenseMap agentDivision(Operation *backbone) { + // A general agent division in backbone could be: + // * If opWithRegion has results, e.g. scf.for, this opWithRegion will be + // splitted into several new operations, each agent has one, which + // has the part of results related to this agent. One agent could own + // all orginal results or none of them, but one result must belong to + // one and only one agent. + // * if opWithRegions doesn't have result. Simply split for every agent. + // * So does operands of opWithRegions + // However, current backbones are all ForOps and IfOps. So we customize + // the implementation. + DenseMap agentBackbone; + backbone->walk([&](Operation *op) { + auto ids = getAgentIds(op); + if (op->getNumRegions() > 0 && ids.size() > 1) { + // ForOp: change iterArgs and yield results + if (auto forOp = dyn_cast(op)) { + auto forOps = createForOpsForEachAgentId(forOp); + if (op == backbone) { + for (auto kv : forOps) { + auto f = kv.second; + auto id = getAgentIds(f.getOperation()); + assert(id.size() == 1 && + "generated ForOp doesn't have one and only one agentId"); + agentBackbone[id.front()] = f.getOperation(); + } + } + forOp.erase(); + } else if (auto ifOp = dyn_cast(op)) { + // TODO: to be implemented + llvm_unreachable("If Op is unsupported"); + auto ifOps = createIfOpsForEachAgentId(ifOp); + assert(ifOps.size() > 0); + if (op == backbone) { + for (auto kv : ifOps) { + auto i = kv.second; + auto id = getAgentIds(i.getOperation()); + assert(id.size() == 1 && + "generated IfOp doesn't have one and only one agentId"); + agentBackbone[id.front()] = i.getOperation(); + } + } + } else { + llvm_unreachable("Unexpected Op with regions"); + } + } + }); + assert(agentBackbone.size() > 0 && "Agent division failed"); + return agentBackbone; +} + +//===----------------------------------------------------------------------===// +// cloneBackboneForEachAgentId +//===----------------------------------------------------------------------===// + +void cloneBackboneForEachAgentId(SmallVector &backbone) { + SmallVector newBackBone; + + for (Operation *op : backbone) { + auto loc = op->getLoc(); + OpBuilderWithAgentIds builder(op->getContext()); + builder.setInsertionPoint(op); + // First, agent division + DenseMap agentBackbone = agentDivision(op); + + // Second, remove irrelavant Ops + for (auto kv : agentBackbone) { + SmallVector deleteOps; + AgentId targetId = kv.first; + Operation *newBackbone = kv.second; + newBackbone->walk([&](Operation *subOp) { + auto ids = getAgentIds(subOp); + if (std::find(ids.begin(), ids.end(), targetId) == ids.end()) { + deleteOps.push_back(subOp); + } + }); + for (auto it = deleteOps.rbegin(); it != deleteOps.rend(); ++it) { + (*it)->erase(); + } + } + } +} + +//===----------------------------------------------------------------------===// +// WSPipelinePass +//===----------------------------------------------------------------------===// + +struct WSPipelinePass : public TritonGPUWSPipelineBase { + WSPipelinePass() = default; + WSPipelinePass(int numStages, int numWarps, int computeCapability) { + this->numStages = numStages; + this->numWarps = numWarps; + this->computeCapability = computeCapability; + } + + void runOnOperation() override { + auto mod = getOperation(); + if (!ttng::TritonNvidiaGPUDialect::getWSSupportedAttr(mod)) + return signalPassFailure(); + + mod.walk([&](triton::FuncOp funcOp) { + assert(funcOp.getBody().hasOneBlock() && + "FuncOp with more than one blocks is not supported"); + // Maintain all structures between funcOp and producer/consumer Op, for + // example: + /* +-----------------------------------+ + * | scf.for: | + * | A = tt.load {agentId = 0} | + * | scf.for: | + * | B = tt.load {agentId = 0} | + * | C = tt.dot A, B {agentId = 1} | + * +-----------------------------------+ + * || + * \||/ + * \/ + * +-----------------------------------------+ + * | token0 = create_token() | + * | token1 = create_token() | + * | buffer0 = alloc_buffer() | + * | buffer1 = alloc_buffer() | + * | if agent0: | + * | scf.for: | + * | producer_aquire token0 | + * | buffer0 = tt.load (load A)| + * | producer_commit token0 | + * | scf.for: | + * | producer_aquire token1 | + * | buffer1 = tt.load (load B)| + * | producer_commit token1 | + * | if agent1: | + * | scf.for: | + * | consumer_wait token0 | + * | scf.for: | + * | consumer_wait token1 | + * | A = extract_slice buffer0 | + * | B = extract_slice buffer1 | + * | C = tt.dot A, B | + * | consumer_arrive token1 | + * | consumer_arrive token0 | + * +-----------------------------------------+ + */ + + // First step: collect channels + SmallVector> channelsOrigin; + collectAsyncChannels(channelsOrigin, funcOp); + SmallVector channels; + for (const auto &c : channelsOrigin) { + channels.push_back(c.get()); + } + + // cvgOp-channels map + DenseMap> map; + reduceChannels(channels, map); + + // Prepare phase, getBackbone, appendPipelineIdxArgs + SmallVector backbone = getBackbone(funcOp, channels); + appendPipelineIdxArgs(backbone, numStages); + + // Create token, buffer and data tranfer between async agents + DenseMap tokenMap = createToken(map, funcOp, numStages); + DenseMap bufferMap = + createBuffer(channels, funcOp, numStages); + buildAsyncComm(map, tokenMap, bufferMap, numStages); + + // Clone backbone, remove irrelevant blockArgument for {forOp, ifOp} + cloneBackboneForEachAgentId(backbone); + + // Specialize agent region + SpecializeAgentRegion(funcOp); + }); + } +}; + +} // namespace + +//===----------------------------------------------------------------------===// +// createTritonNvidiaGPUWSPipelinePass +//===----------------------------------------------------------------------===// + +std::unique_ptr +mlir::createTritonNvidiaGPUWSPipelinePass(int numStages, int numWarps, + int computeCapability) { + return std::make_unique(numStages, numWarps, + computeCapability); +} diff --git a/lib/Hopper/CMakeLists.txt b/lib/Hopper/CMakeLists.txt new file mode 100644 index 000000000000..1e0d8dd3b5d3 --- /dev/null +++ b/lib/Hopper/CMakeLists.txt @@ -0,0 +1,24 @@ +# TODO: re-enable generation of the hopper helper. +# For now we just commit a pre-built bc file. +#cmake_path(GET LLVM_LIBRARY_DIR PARENT_PATH LLVM_DIR) +#set(CUDA_PATH "/usr/local/cuda") +#if(DEFINED ENV{CUDA_PATH}) +# set(CUDA_PATH $ENV{CUDA_PATH}) +#endif() +# +#set(outfile "libhopper_helpers.bc") +#add_custom_target(HopperHelpers ALL +# COMMAND ${LLVM_DIR}/bin/clang -c +# -O3 -emit-llvm +# -fno-unwind-tables -fno-exceptions +# --cuda-gpu-arch=sm_90a +# --cuda-device-only +# -D__CUDACC__ -D__CUDABE__ -D__CUDA_LIBDEVICE__ +# -I${CUDA_PATH}/include +# -target nvptx64-nvidia-gpulibs +# ${CMAKE_CURRENT_SOURCE_DIR}/HopperHelpers.c -o ${outfile} +# DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/HopperHelpers.c +# BYPRODUCTS ${outfile} +# COMMENT "Building LLVM bitcode ${outfile}" +# VERBATIM +#) diff --git a/lib/Hopper/HopperHelpers.c b/lib/Hopper/HopperHelpers.c new file mode 100644 index 000000000000..800b3c7e538f --- /dev/null +++ b/lib/Hopper/HopperHelpers.c @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "device_launch_parameters.h" +#include +#include +#include +#include +#include + +#ifdef __NVCC__ +#define __DEVICE__ __device__ inline +#else +#define __DEVICE__ +#endif + +#ifndef BARRIER_RANDOM_DELAY +#define BARRIER_RANDOM_DELAY 0 +#endif + +#if BARRIER_RANDOM_DELAY +__DEVICE__ uint64_t random_avalanche(uint64_t r) { + r ^= r >> 33; + r *= 0xff51afd7ed558ccd; + r ^= r >> 33; + r *= 0xc4ceb9fe1a85ec53; + r ^= r >> 33; + return r; +} + +__DEVICE__ uint64_t random_stateless_uint64() { + uint64_t r = blockIdx.z << 27 ^ blockIdx.y << 22 ^ blockIdx.x; + r = r << 32 ^ threadIdx.z << 20 ^ threadIdx.y << 10 ^ threadIdx.x; + + uint64_t timer; + asm volatile("mov.u64 %0, %%globaltimer;\n\t" : "=l"(timer) : : "memory"); + + r ^= timer; + return random_avalanche(r); +} +#endif + +__DEVICE__ void random_stateless_delay() { +#if BARRIER_RANDOM_DELAY + uint64_t r = random_stateless_uint64(); + + // About 2 milliseconds. + uint32_t ns = r >> (64 - 21); + asm volatile("nanosleep.u32 %0;\n\t" : : "r"(ns)); +#endif +} + +__DEVICE__ __attribute__((__always_inline__)) uint64_t +__nv_get_wgmma_desc(uint32_t smem_nvvm_pointer, uint32_t mode, + uint32_t height) { + uint64_t desc = 0; + uint64_t swizzling = (mode == 1 ? 128 : mode == 2 ? 64 : 32); + uint64_t smem_address_bit = smem_nvvm_pointer; + + uint64_t stride_dimension = swizzling << 3 >> 4; + uint64_t leading_dimension = height * swizzling >> 4; + // [benzh] from cutlass + uint64_t base_offset = 0; //(smem_address_bit >> 7) % (swizzling >> 4); + uint64_t start_addr = (smem_address_bit << 46) >> 50; + + desc |= ((uint64_t)mode) << 62; + desc |= stride_dimension << 32; + desc |= leading_dimension << 16; + desc |= base_offset << 49; + desc |= start_addr; + + return desc; +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_wgmma_fence() { + asm volatile("wgmma.fence.sync.aligned;\n"); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_wgmma_commit_group() { + asm volatile("wgmma.commit_group.sync.aligned;\n"); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_wgmma_wait_group() { + asm volatile("wgmma.wait_group.sync.aligned 0;\n"); +} + +// GMMA expects data to be in TN format. if A is column major, transa should be +// set GMMA expects data to be in TN format. if B is row major, transb should be +// set +__DEVICE__ __attribute__((__always_inline__)) float32 +__nv_wgmma_m64n64k16_f32_f16_f16_row_col(const uint64_t desc_a, + const uint64_t desc_b, float32 acc) { + const uint32_t scale_d = 1; + asm volatile("{\n" + ".reg .pred p;\n\t" + "setp.eq.u32 p, %34, 1;\n\t" + "wgmma.mma_async.sync.aligned.m64n64k16.f32.f16.f16\n" + "{%0, %1, %2, %3, %4, %5, %6, %7, \n" + " %8, %9, %10, %11, %12, %13, %14, %15,\n" + " %16, %17, %18, %19, %20, %21, %22, %23,\n" + " %24, %25, %26, %27, %28, %29, %30, %31},\n" + "%32, \n" + "%33, \n" + "p, 1, 1, 0, 0;\n" + "}" + : "+f"(acc.d0), "+f"(acc.d1), "+f"(acc.d2), "+f"(acc.d3), + "+f"(acc.d4), "+f"(acc.d5), "+f"(acc.d6), "+f"(acc.d7), + "+f"(acc.d8), "+f"(acc.d9), "+f"(acc.d10), "+f"(acc.d11), + "+f"(acc.d12), "+f"(acc.d13), "+f"(acc.d14), "+f"(acc.d15), + "+f"(acc.d16), "+f"(acc.d17), "+f"(acc.d18), "+f"(acc.d19), + "+f"(acc.d20), "+f"(acc.d21), "+f"(acc.d22), "+f"(acc.d23), + "+f"(acc.d24), "+f"(acc.d25), "+f"(acc.d26), "+f"(acc.d27), + "+f"(acc.d28), "+f"(acc.d29), "+f"(acc.d30), "+f"(acc.d31) + : "l"(desc_a), "l"(desc_b), "r"(scale_d)); + + return acc; +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_init(uint32_t bar, uint32_t expected, uint32_t pred) { + if (pred) { + asm volatile("{\n\t" + "mbarrier.init.shared.b64 [%0], %1;\n\t" + "}" + : + : "r"(bar), "r"(expected)); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_wait(uint32_t bar, uint32_t phase) { + uint32_t large_val = 0x989680; + asm volatile("{\n\t" + ".reg .pred P1; \n\t" + "LAB_WAIT: \n\t" + "mbarrier.try_wait.parity.shared.b64 P1, [%0], %1, %2; \n\t" + "@P1 bra.uni DONE; \n\t" + "bra.uni LAB_WAIT; \n\t" + "DONE: \n\t" + "}" + : + : "r"(bar), "r"(phase), "r"(large_val)); + random_stateless_delay(); +} + +__DEVICE__ __attribute__((__always_inline__)) int +__nv_mbarrier_peek(uint32_t bar, uint32_t phase) { + random_stateless_delay(); + int ready = 0; + asm volatile("{\n\t" + ".reg .pred p;\n\t" + "mbarrier.try_wait.shared.b64 p, [%1], %2;\n\t" + "selp.b32 %0, 1, 0, p;\n\t" + "}" + : "=r"(ready) + : "r"(bar), "l"((unsigned long long)phase) + : "memory"); + return ready; +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_arrive_normal(uint32_t bar, uint32_t pred) { + random_stateless_delay(); + if (pred) { + asm volatile("{\n\t" + "mbarrier.arrive.shared.b64 _, [%0];\n\t" + "}" + : + : "r"(bar)); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_arrive_cp_async(uint32_t bar, uint32_t pred) { + random_stateless_delay(); + if (pred) { + asm volatile("cp.async.mbarrier.arrive.noinc.shared.b64 [%0];" + : + : "r"(bar)); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_arrive_expect_tx(uint32_t bar, uint32_t txCount, uint32_t pred) { + random_stateless_delay(); + if (pred) { + asm volatile("{\n\t" + "mbarrier.arrive.expect_tx.shared.b64 _, [%0], %1;\n\t" + "}" + : + : "r"(bar), "r"(txCount)); + } +} + +// for warp special empty barrier. +__DEVICE__ __attribute__((__always_inline__)) void +__nv_mbarrier_arrive_remote(uint32_t bar, uint32_t ctaId, uint32_t pred) { + random_stateless_delay(); + if (pred) { + asm volatile("{\n\t" + ".reg .b32 remAddr32;\n\t" + "mapa.shared::cluster.u32 remAddr32, %0, %1;\n\t" + "mbarrier.arrive.shared::cluster.b64 _, [remAddr32];\n\t" + "}" + : + : "r"(bar), "r"(ctaId)); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_fence_mbarrier_init() { + asm volatile("{\n\t" + "fence.mbarrier_init.release.cluster; \n" + "}" :: + : "memory"); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_fence_async_shared_cta() { + asm volatile("fence.proxy.async.shared::cta;\n"); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_fence_async_shared_cluster() { + asm volatile("fence.proxy.async.shared::cluster;\n"); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_cp_async_bulk(char *gmem_ptr, unsigned smem_ptr, unsigned barrier, + int bytes, uint32_t pred) { + if (pred) { + asm volatile("cp.async.bulk.shared::cluster.global.mbarrier::complete_tx::" + "bytes [%0], [%1], %2, [%3];\n" + : + : "r"(smem_ptr), "l"(gmem_ptr), "r"(bytes), "r"(barrier) + : "memory"); + } +} +__DEVICE__ __attribute__((__always_inline__)) void +__nv_tma_load_tiled_2d(const uint64_t p_tma_desc, uint32_t dst_smem, + uint32_t barrier, int32_t c0, int32_t c1, + unsigned long long mem_desc, uint32_t pred) { + if (pred) { + asm volatile( + "cp.async.bulk.tensor.2d.shared::cluster.global.mbarrier::complete_tx" + "::bytes.L2::cache_hint [%0], [%1, {%2, %3}], " + "[%4], %5;\n" + : + : "r"(dst_smem), "l"(p_tma_desc), "r"(c0), "r"(c1), "r"(barrier), + "l"(mem_desc) + : "memory"); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_tma_load_tiled_mcast_2d( + const uint64_t p_tma_desc, uint32_t dst_smem, uint32_t barrier, int32_t c0, + int32_t c1, unsigned long long mem_desc, uint16_t mcast, uint32_t pred) { + if (pred) { + asm volatile("cp.async.bulk.tensor.2d.shared::cluster.global.mbarrier::" + "complete_tx::bytes.multicast::cluster.L2::cache_hint" + " [%0], [%1, {%2, %3}], [%4], %5, %6;" + : + : "r"(dst_smem), "l"(p_tma_desc), "r"(c0), "r"(c1), + "r"(barrier), "h"(mcast), "l"(mem_desc) + : "memory"); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_tma_load_tiled_4d(const uint64_t p_tma_desc, uint32_t dst_smem, + uint32_t barrier, int32_t c0, int32_t c1, int32_t c2, + int32_t c3, unsigned long long mem_desc, uint32_t pred) { + if (pred) { + asm volatile( + "cp.async.bulk.tensor.4d.shared::cluster.global.mbarrier::complete_tx" + "::bytes.L2::cache_hint [%0], [%1, {%2, %3, %4, %5}], " + "[%6], %7;\n" + : + : "r"(dst_smem), "l"(p_tma_desc), "r"(c0), "r"(c1), "r"(c2), "r"(c3), + "r"(barrier), "l"(mem_desc) + : "memory"); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_stmatrix_x1(uint32_t ptr, const uint32_t d0) { + asm volatile( + "stmatrix.sync.aligned.m8n8.x1.shared.b16 [%0], {%1};\n" ::"r"(ptr), + "r"(d0)); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_stmatrix_x2(uint32_t ptr, const uint32_t d0, const uint32_t d1) { + asm volatile( + "stmatrix.sync.aligned.m8n8.x2.shared.b16 [%0], {%1, %2};\n" ::"r"(ptr), + "r"(d0), "r"(d1)); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_stmatrix_x4(uint32_t ptr, const uint32_t d0, const uint32_t d1, + const uint32_t d2, const uint32_t d3) { + asm volatile( + "stmatrix.sync.aligned.m8n8.x4.shared.b16 [%0], {%1, %2, %3, %4};\n" :: + "r"(ptr), + "r"(d0), "r"(d1), "r"(d2), "r"(d3)); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_async_group_commit() { + asm volatile("cp.async.bulk.commit_group;"); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_async_group_wait0() { + asm volatile("cp.async.bulk.wait_group %0;" : : "n"(0) : "memory"); +} + +__DEVICE__ __attribute__((__always_inline__)) uint32_t +__nv_dsmem_addr(uint32_t buffer_ptr, uint32_t ctaid) { + uint32_t buffer_ptr_; + asm volatile("{\n\t" + "mapa.shared::cluster.u32 %0, %1, %2;\n\t" + "}" + : "=r"(buffer_ptr_) + : "r"(buffer_ptr), "r"(ctaid)); + return buffer_ptr_; +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_bar_arrive(uint32_t bar, uint32_t numThreads) { + random_stateless_delay(); + asm volatile("bar.arrive %0, %1;\n" ::"r"(bar), "r"(numThreads)); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_bar_wait(uint32_t bar, uint32_t numThreads) { + asm volatile("bar.sync %0, %1;\n" ::"r"(bar), "r"(numThreads)); + random_stateless_delay(); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_cga_barrier_sync() { + asm volatile("barrier.cluster.sync.aligned;\n" ::); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_cga_barrier_arrive() { + asm volatile("barrier.cluster.arrive;\n" ::); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_cga_barrier_wait() { + asm volatile("barrier.cluster.wait;\n" ::); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_cluster_arrive_relaxed() { + asm volatile("barrier.cluster.arrive.relaxed.aligned;\n" : :); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_cluster_arrive() { + asm volatile("barrier.cluster.arrive.aligned;\n" : :); +} + +__DEVICE__ __attribute__((__always_inline__)) void __nv_cluster_wait() { + asm volatile("barrier.cluster.wait.aligned;\n" : :); +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_tma_store_tiled_2d(const uint64_t p_tma_desc, int32_t src_smem, int32_t c0, + int32_t c1, uint32_t pred) { + if (pred) { + asm volatile("cp.async.bulk.tensor.2d.global.shared::cta.bulk_group" + "[%0, {%2, %3}], [%1];\n" + : + : "l"(p_tma_desc), "r"(src_smem), "r"(c0), "r"(c1) + : "memory"); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_tma_store_tiled_3d(const uint64_t p_tma_desc, uint32_t src_smem, + int32_t c0, int32_t c1, int32_t c2, uint32_t pred) { + if (pred) { + asm volatile("cp.async.bulk.tensor.3d.global.shared::cta.bulk_group" + "[%0, {%2, %3, %4}], [%1];\n" + : + : "l"(p_tma_desc), "r"(src_smem), "r"(c0), "r"(c1), "r"(c2) + : "memory"); + } +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_tma_store_tiled_4d(const uint64_t p_tma_desc, uint32_t src_smem, + int32_t c0, int32_t c1, int32_t c2, int32_t c3, + uint32_t pred) { + if (pred) { + asm volatile("cp.async.bulk.tensor.4d.global.shared::cta.bulk_group" + "[%0, {%2, %3, %4, %5}], [%1];\n" + : + : "l"(p_tma_desc), "r"(src_smem), "r"(c0), "r"(c1), "r"(c2), + "r"(c3) + : "memory"); + } +} +__DEVICE__ __attribute__((__always_inline__)) uint32_t +__nv_offset_of_stmatrix_v4(uint32_t threadIdx, uint32_t rowOfWarp, + uint32_t elemIdx, uint32_t leadingDimOffset, + uint32_t rowStride) { + uint32_t perPhase = 0; + uint32_t maxPhase = 0; + if (rowStride == 64) { + perPhase = 1; + maxPhase = 8; + } else if (rowStride == 32) { + perPhase = 2; + maxPhase = 4; + } else if (rowStride == 16) { + perPhase = 4; + maxPhase = 2; + } + + uint32_t iterOfCol = elemIdx / 8; + + uint32_t myRow = rowOfWarp + (threadIdx & 0xf); + uint32_t myCol = ((threadIdx >> 4) & 0x1) * 8; + myCol = myCol + iterOfCol * 16; + + uint32_t offset0 = (myCol / rowStride) * leadingDimOffset; + myCol = myCol % rowStride; + + uint32_t phase = (myRow / perPhase) % maxPhase; + + uint32_t lineOffset = (myRow % perPhase) * rowStride + myCol; + uint32_t colOffset = ((lineOffset / 8) ^ phase) * 8 + lineOffset % 8; + uint32_t offset1 = (myRow / perPhase) * 64 + colOffset; + + return offset1 + offset0; +} + +__DEVICE__ __attribute__((__always_inline__)) uint32_t +__nv_offset_of_stmatrix_v4_no_swizzle(uint32_t threadIdx, uint32_t rowOfWarp, + uint32_t elemIdx, uint32_t rowStride) { + uint32_t iterOfCol = elemIdx / 4; + uint32_t myRow = rowOfWarp + (threadIdx & 0xf); + uint32_t myCol = ((threadIdx >> 4) & 0x1) * 8; + + myCol = myCol + iterOfCol * 16; + uint32_t offset = myRow * rowStride + myCol * 2; + return offset; +} + +__DEVICE__ __attribute__((__always_inline__)) void +__nv_sts64(uint32_t ptr, uint32_t d0, uint32_t d1) { + asm volatile("st.shared.v2.b32 [%0], {%1, %2};\n" + : + : "r"(ptr), "r"(d0), "r"(d1)); +} + +__DEVICE__ __attribute__((__always_inline__)) uint32_t +__nv_offset_of_sts64(uint32_t threadIdx, uint32_t rowOfWarp, int32_t elemIdx, + uint32_t rowStride) { + uint32_t perPhase = 0; + uint32_t maxPhase = 0; + if (rowStride == 128) { + perPhase = 1; + maxPhase = 8; + } else if (rowStride == 64) { + perPhase = 2; + maxPhase = 4; + } else if (rowStride == 32) { + perPhase = 4; + maxPhase = 2; + } + + uint32_t laneId = threadIdx & 0x1f; + + uint32_t myRow = ((elemIdx >> 1) & 0x1) * 8 + laneId / 4; + uint32_t myCol = (elemIdx / 4) * 8 + (laneId % 4) * 2; + myRow += rowOfWarp; + + uint32_t phase = (myRow / perPhase) % maxPhase; + + uint32_t lineOffset = (myRow % perPhase) * rowStride + myCol * 4; + uint32_t colOffset = ((lineOffset / 16) ^ phase) * 16 + lineOffset % 16; + uint32_t offset = (myRow / perPhase) * 128 + colOffset; + + return offset; +} + +__DEVICE__ __attribute__((__always_inline__)) uint32_t +__nv_cvt_pack(uint16_t d0, uint16_t d1) { + uint32_t ret; + asm volatile("cvt.pack.sat.u16.s32 %0, %1, %2;\n" + : "=r"(ret) + : "r"(d0), "r"(d1)); + return ret; +} diff --git a/lib/Target/LLVMIR/CMakeLists.txt b/lib/Target/LLVMIR/CMakeLists.txt index 5a687f84bc6a..7751bbce06ae 100644 --- a/lib/Target/LLVMIR/CMakeLists.txt +++ b/lib/Target/LLVMIR/CMakeLists.txt @@ -23,5 +23,11 @@ add_mlir_translation_library(TritonLLVMIR MLIRSCFToControlFlow MLIRSupport MLIRTargetLLVMIRExport + NVGPUToLLVMIR TritonGPUToLLVM ) + +set_source_files_properties( + LLVMIRTranslation.cpp + PROPERTIES + COMPILE_FLAGS "-D__BUILD_DIR__=\\\"${CMAKE_BINARY_DIR}\\\"") diff --git a/lib/Target/LLVMIR/LLVMIRTranslation.cpp b/lib/Target/LLVMIR/LLVMIRTranslation.cpp index f2e90e9de874..33fefb951238 100644 --- a/lib/Target/LLVMIR/LLVMIRTranslation.cpp +++ b/lib/Target/LLVMIR/LLVMIRTranslation.cpp @@ -16,7 +16,9 @@ #include "mlir/Target/LLVMIR/LLVMTranslationInterface.h" #include "mlir/Transforms/Passes.h" #include "triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h" +#include "triton/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.h" #include "triton/Target/LLVMIR/Passes.h" +#include "triton/Target/PTX/TmaMetadata.h" #include "triton/Tools/Sys/GetEnv.hpp" #include "triton/Tools/Sys/GetPlatform.hpp" #include "llvm/ADT/APInt.h" @@ -235,8 +237,8 @@ static void linkLibdevice(llvm::Module &module) { module.addModuleFlag(reflect); } -static bool linkExternLib(llvm::Module &module, llvm::StringRef name, - llvm::StringRef path, bool isROCM) { +bool linkExternLib(llvm::Module &module, llvm::StringRef name, + llvm::StringRef path, bool isROCM) { llvm::SMDiagnostic err; auto &ctx = module.getContext(); @@ -276,6 +278,8 @@ translateLLVMToLLVMIR(llvm::LLVMContext *llvmContext, mlir::ModuleOp module, mlir::registerLLVMDialectTranslation(registry); mlir::registerROCDLDialectTranslation(registry); mlir::registerNVVMDialectTranslation(registry); + mlir::registerNVGPUDialectTranslation(registry); + module->getContext()->appendDialectRegistry(registry); llvm::DenseMap nvvmMetadata; @@ -322,6 +326,7 @@ translateLLVMToLLVMIR(llvm::LLVMContext *llvmContext, mlir::ModuleOp module, std::unique_ptr translateTritonGPUToLLVMIR(llvm::LLVMContext *llvmContext, mlir::ModuleOp module, int computeCapability, + mlir::triton::gpu::TMAMetadataTy &tmaInfos, bool isROCM) { mlir::PassManager pm(module->getContext()); mlir::registerPassManagerCLOptions(); @@ -344,7 +349,8 @@ translateTritonGPUToLLVMIR(llvm::LLVMContext *llvmContext, pm.addPass(mlir::createConvertSCFToCFPass()); pm.addPass(mlir::createConvertIndexToLLVMPass()); - pm.addPass(createConvertTritonGPUToLLVMPass(computeCapability, isROCM)); + pm.addPass( + createConvertTritonGPUToLLVMPass(computeCapability, &tmaInfos, isROCM)); pm.addPass(mlir::createArithToLLVMConversionPass()); pm.addPass(mlir::createCanonicalizerPass()); // Simplify the IR diff --git a/lib/Target/PTX/CMakeLists.txt b/lib/Target/PTX/CMakeLists.txt index 69aa5710cdd1..c03ccca74ff5 100644 --- a/lib/Target/PTX/CMakeLists.txt +++ b/lib/Target/PTX/CMakeLists.txt @@ -7,3 +7,8 @@ add_mlir_translation_library(TritonPTX LINK_LIBS PUBLIC TritonLLVMIR ) + +set_source_files_properties( + PTXTranslation.cpp + PROPERTIES + COMPILE_FLAGS "-D__BUILD_DIR__=\\\"${CMAKE_BINARY_DIR}\\\"") diff --git a/lib/Target/PTX/PTXTranslation.cpp b/lib/Target/PTX/PTXTranslation.cpp index f089f1b16874..0a195b81e703 100644 --- a/lib/Target/PTX/PTXTranslation.cpp +++ b/lib/Target/PTX/PTXTranslation.cpp @@ -10,6 +10,11 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Transforms/IPO/AlwaysInliner.h" +#include + +#include +#include #include #include @@ -38,7 +43,25 @@ static bool findAndReplace(std::string &str, const std::string &begin, return true; } +static void linkExternal(llvm::Module &module) { + namespace fs = std::filesystem; + + // TODO: enable generating bc file from clang. + static const auto this_file_path = std::filesystem::path(__FILE__); + static const auto path = + this_file_path.parent_path().parent_path().parent_path().parent_path() / + "python" / "triton" / "hopper_lib" / "libhopper_helpers.bc"; + + // static const std::filesystem::path path = + // std::filesystem::path(__BUILD_DIR__) / "lib" / "Hopper" / + // "libhopper_helpers.bc"; + if (mlir::triton::linkExternLib(module, "libhopper_helpers", path.string(), + /*isROCM*/ false)) + llvm::errs() << "Link failed for: libhopper_helpers.bc"; +} + std::string translateLLVMIRToPTX(llvm::Module &module, int cc, int version) { + linkExternal(module); // LLVM version in use may not officially support target hardware. // Supported versions for LLVM 14 are here: // https://github.com/llvm/llvm-project/blob/f28c006a5895fc0e329fe15fead81e37457cb1d1/clang/include/clang/Basic/BuiltinsNVPTX.def @@ -60,9 +83,14 @@ std::string translateLLVMIRToPTX(llvm::Module &module, int cc, int version) { std::string layout = ""; std::string features = ""; // std::string features = "+ptx" + std::to_string(maxPTX); + for (llvm::Function &f : module.functions()) { + if (!f.hasFnAttribute(llvm::Attribute::NoInline)) + f.addFnAttr(llvm::Attribute::AlwaysInline); + } initLLVM(); // verify and store llvm llvm::legacy::PassManager pm; + pm.add(llvm::createAlwaysInlinerLegacyPass()); pm.add(llvm::createVerifierPass()); pm.run(module); // module->print(llvm::outs(), nullptr); diff --git a/python/setup.py b/python/setup.py index 69479ceb13bb..2f2dec916921 100644 --- a/python/setup.py +++ b/python/setup.py @@ -71,9 +71,7 @@ def get_llvm_package_info(): arch = 'x86_64' if system == "Darwin": system_suffix = "apple-darwin" - cpu_type = os.popen('sysctl machdep.cpu.brand_string').read() - if "apple" in cpu_type.lower(): - arch = 'arm64' + arch = platform.machine() elif system == "Linux": vglibc = tuple(map(int, platform.libc_ver()[1].split('.'))) vglibc = vglibc[0] * 100 + vglibc[1] @@ -167,11 +165,15 @@ def __init__(self, name, path, sourcedir=""): class CMakeBuild(build_ext): - user_options = build_ext.user_options + [('base-dir=', None, 'base directory of Triton')] + user_options = build_ext.user_options + \ + [('base-dir=', None, 'base directory of Triton')] def initialize_options(self): build_ext.initialize_options(self) - self.base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) + self.base_dir = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + os.pardir)) def finalize_options(self): build_ext.finalize_options(self) @@ -180,9 +182,7 @@ def run(self): try: out = subprocess.check_output(["cmake", "--version"]) except OSError: - raise RuntimeError( - "CMake must be installed to build the following extensions: " + ", ".join(e.name for e in self.extensions) - ) + raise RuntimeError("CMake must be installed to build the following extensions: " + ", ".join(e.name for e in self.extensions)) match = re.search(r"version\s*(?P\d+)\.(?P\d+)([\d.]+)?", out.decode()) cmake_major, cmake_minor = int(match.group("major")), int(match.group("minor")) @@ -288,7 +288,7 @@ def build_extension(self, ext): "triton/tools", ], install_requires=[ - "filelock", + "filelock" ], include_package_data=True, ext_modules=[CMakeExtension("triton", "triton/_C/")], @@ -311,7 +311,7 @@ def build_extension(self, ext): test_suite="tests", extras_require={ "build": [ - "cmake>=3.18", + "cmake>=3.20", "lit", ], "tests": [ @@ -321,6 +321,7 @@ def build_extension(self, ext): "numpy", "pytest", "scipy>=1.7.1", + "torch", ], "tutorials": [ "matplotlib", diff --git a/python/src/triton.cc b/python/src/triton.cc index f1a5b5002b10..9301891bb0b8 100644 --- a/python/src/triton.cc +++ b/python/src/triton.cc @@ -1,4 +1,8 @@ -#include "mlir/IR/Builders.h" +#include +#include +#include + +#include "mlir/IR/Builders.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/MLIRContext.h" #include "mlir/IR/Verifier.h" @@ -21,13 +25,17 @@ #include "triton/Analysis/Allocation.h" #include "triton/Conversion/TritonGPUToLLVM/TritonGPUToLLVMPass.h" #include "triton/Conversion/TritonToTritonGPU/TritonToTritonGPUPass.h" +#include "triton/Dialect/NVGPU/IR/Dialect.h" #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/Triton/IR/Types.h" #include "triton/Dialect/Triton/Transforms/Passes.h" #include "triton/Dialect/TritonGPU/Transforms/Passes.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" +#include "triton/Dialect/TritonNvidiaGPU/Transforms/Passes.h" #include "triton/Target/HSACO/HSACOTranslation.h" #include "triton/Target/LLVMIR/LLVMIRTranslation.h" #include "triton/Target/PTX/PTXTranslation.h" +#include "triton/Target/PTX/TmaMetadata.h" #include "triton/Tools/Sys/GetEnv.hpp" #include "triton/Tools/Sys/GetPlatform.hpp" @@ -57,6 +65,8 @@ namespace py = pybind11; +PYBIND11_MAKE_OPAQUE(mlir::triton::gpu::TMAMetadataTy); + enum backend_t { HOST, CUDA, @@ -513,9 +523,11 @@ void init_triton_ir(py::module &&m) { mlir::DialectRegistry registry; registry.insert< mlir::triton::TritonDialect, mlir::triton::gpu::TritonGPUDialect, - mlir::math::MathDialect, mlir::arith::ArithDialect, - mlir::index::IndexDialect, mlir::scf::SCFDialect, - mlir::cf::ControlFlowDialect, mlir::LLVM::LLVMDialect>(); + mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect, + mlir::triton::nvgpu::NVGPUDialect, mlir::math::MathDialect, + mlir::arith::ArithDialect, mlir::index::IndexDialect, + mlir::scf::SCFDialect, mlir::cf::ControlFlowDialect, + mlir::LLVM::LLVMDialect>(); context.appendDialectRegistry(registry); context.loadAllAvailableDialects(); @@ -1550,6 +1562,11 @@ void init_triton_ir(py::module &&m) { .def( "add_sccp_pass", [](mlir::PassManager &self) { self.addPass(mlir::createSCCPPass()); }) + .def("add_plan_cta_pass", + [](mlir::PassManager &self, + mlir::triton::nvidia_gpu::ClusterInfo &clusterInfo) { + self.addPass(mlir::createTritonNvidiaGPUPlanCTAPass(&clusterInfo)); + }) .def("add_tritongpu_coalesce_pass", [](mlir::PassManager &self) { self.addPass(mlir::createTritonGPUCoalescePass()); @@ -1585,16 +1602,51 @@ void init_triton_ir(py::module &&m) { self.addPass(mlir::triton::createRewriteTensorPointerPass( computeCapability)); }) + .def("add_tritongpu_ws_feasibility_checking_pass", + [](mlir::PassManager &self, int computeCapability) { + self.addPass(mlir::createTritonNvidiaGPUWSFeasibilityCheckingPass( + computeCapability)); + }) + .def("add_tritongpu_wsdecomposing_pass", + [](mlir::PassManager &self, int computeCapability) { + self.addPass(mlir::createTritonNvidiaGPUWSDecomposingPass( + computeCapability)); + }) + .def("add_tritongpu_wspipeline_pass", + [](mlir::PassManager &self, int numStages, int numWarps, + int computeCapability) { + self.addPass(mlir::createTritonNvidiaGPUWSPipelinePass( + numStages, numWarps, computeCapability)); + }) + .def("add_tritongpu_wsmutex_pass", + [](mlir::PassManager &self, int computeCapability) { + self.addPass( + mlir::createTritonNvidiaGPUWSMutexPass(computeCapability)); + }) + .def("add_tritongpu_wsmaterialization_pass", + [](mlir::PassManager &self, int computeCapability) { + self.addPass(mlir::createTritonNvidiaGPUWSMaterializationPass( + computeCapability)); + }) .def( "add_convert_triton_to_tritongpu_pass", - [](mlir::PassManager &self, int numWarps, int threadsPerWarp) { + [](mlir::PassManager &self, int numWarps, int threadsPerWarp, + int numCTAs, int computeCapability) { self.addPass(mlir::triton::createConvertTritonToTritonGPUPass( - numWarps, threadsPerWarp)); + numWarps, threadsPerWarp, numCTAs, computeCapability)); }, - py::arg("numWarps") = 4, py::arg("threadsPerWarp") = 32) + py::arg("numWarps") = 4, py::arg("threadsPerWarp") = 32, + py::arg("numCTAs") = 1, py::arg("computeCapability") = 80) .def("add_tritongpu_pipeline_pass", - [](mlir::PassManager &self, int numStages) { - self.addPass(mlir::createTritonGPUPipelinePass(numStages)); + [](mlir::PassManager &self, int numStages, int numWarps, int numCTAs, + int computeCapability) { + self.addPass(mlir::createTritonGPUPipelinePass( + numStages, numWarps, numCTAs, computeCapability)); + }) + .def("add_tritongpu_materialize_load_store_pass", + [](mlir::PassManager &self, int numWarps, int computeCapability) { + self.addPass(mlir::createTritonNvidiaGPUMaterializeLoadStorePass( + numWarps, computeCapability)); }) .def("add_tritongpu_prefetch_pass", [](mlir::PassManager &self) { @@ -1617,10 +1669,19 @@ void init_triton_ir(py::module &&m) { [](mlir::PassManager &self) { self.addPass(mlir::createTritonGPUReorderInstructionsPass()); }) + .def("add_tritongpu_rewrite_tensor_pointer_pass", + [](mlir::PassManager &self, int computeCapability) { + self.addPass(mlir::createTritonGPURewriteTensorPointerPass( + computeCapability)); + }) .def("add_tritongpu_decompose_conversions_pass", [](mlir::PassManager &self) { self.addPass(mlir::createTritonGPUDecomposeConversionsPass()); }) + .def("add_tritongpu_fence_insertion_pass", + [](mlir::PassManager &self) { + self.addPass(mlir::createTritonNvidiaGPUFenceInsertionPass()); + }) .def("add_triton_gpu_to_llvm", [](mlir::PassManager &self) { self.addPass(mlir::triton::createConvertTritonGPUToLLVMPass()); @@ -1628,23 +1689,80 @@ void init_triton_ir(py::module &&m) { .def("add_scf_to_cfg", [](mlir::PassManager &self) { self.addPass(mlir::createConvertSCFToCFPass()); }); + + m.def("is_ws_supported", [](mlir::ModuleOp &mod) -> bool { + return mlir::triton::nvidia_gpu::TritonNvidiaGPUDialect::getWSSupportedAttr( + mod); + }); +} + +void init_triton_env_vars(py::module &m) { + m.def("get_env_vars", []() -> std::map { + std::map envVars; + for (const auto &envVar : triton::ENV_VARS) { + envVars[envVar] = triton::tools::getBoolEnv(envVar); + } + return envVars; + }); } void init_triton_translation(py::module &m) { using ret = py::return_value_policy; + py::class_(m, "ClusterInfo") + .def(py::init<>()) + .def_readwrite("clusterDimX", + &mlir::triton::nvidia_gpu::ClusterInfo::clusterDimX) + .def_readwrite("clusterDimY", + &mlir::triton::nvidia_gpu::ClusterInfo::clusterDimY) + .def_readwrite("clusterDimZ", + &mlir::triton::nvidia_gpu::ClusterInfo::clusterDimZ) + .def("__repr__", [](mlir::triton::nvidia_gpu::ClusterInfo &self) { + std::ostringstream oss; + oss << "(" << self.clusterDimX << ", " << self.clusterDimY << ", " + << self.clusterDimZ << ")"; + return oss.str(); + }); + + py::class_(m, "TMAInfo") + .def(py::init<>()) + .def_readwrite("tensorDataType", + &mlir::triton::gpu::TMAInfo::tensorDataType) + .def_readwrite("tensorRank", &mlir::triton::gpu::TMAInfo::tensorRank) + .def_readwrite("globalAddressArgIdx", + &mlir::triton::gpu::TMAInfo::globalAddressArgIdx) + .def_readwrite("globalStridesArgIdx", + &mlir::triton::gpu::TMAInfo::globalStridesArgIdx) + .def_readwrite("globalDimsArgIdx", + &mlir::triton::gpu::TMAInfo::globalDimsArgIdx) + .def_readwrite("boxDims", &mlir::triton::gpu::TMAInfo::boxDims) + .def_readwrite("elementStrides", + &mlir::triton::gpu::TMAInfo::elementStrides) + .def_readwrite("interleave", &mlir::triton::gpu::TMAInfo::interleave) + .def_readwrite("swizzle", &mlir::triton::gpu::TMAInfo::swizzle) + .def_readwrite("l2Promotion", &mlir::triton::gpu::TMAInfo::l2Promotion) + .def_readwrite("oobFill", &mlir::triton::gpu::TMAInfo::oobFill) + .def_readwrite("TMADescArgIdx", + &mlir::triton::gpu::TMAInfo::TMADescArgIdx); + py::bind_vector>(m, "TMAInfos"); + m.def("get_shared_memory_size", [](mlir::ModuleOp mod) { auto shared = mod->getAttrOfType("triton_gpu.shared"); return shared.getInt(); }); + m.def("get_num_warps", [](mlir::ModuleOp mod) { + auto shared = mod->getAttrOfType("triton_gpu.num-warps"); + return shared.getInt(); + }); m.def( "translate_triton_gpu_to_llvmir", - [](mlir::ModuleOp op, int computeCapability, bool isROCM) { + [](mlir::ModuleOp op, int computeCapability, + mlir::triton::gpu::TMAMetadataTy &tmaInfos, bool isROCM) { py::gil_scoped_release allow_threads; llvm::LLVMContext llvmContext; auto llvmModule = ::mlir::triton::translateTritonGPUToLLVMIR( - &llvmContext, op, computeCapability, isROCM); + &llvmContext, op, computeCapability, tmaInfos, isROCM); if (!llvmModule) llvm::report_fatal_error("Failed to translate TritonGPU to LLVM IR."); @@ -1770,6 +1888,7 @@ void init_triton_translation(py::module &m) { void init_triton(py::module &m) { py::module subm = m.def_submodule("triton"); + init_triton_env_vars(subm); // init_triton_codegen(subm.def_submodule("code_gen")); init_triton_runtime(subm.def_submodule("runtime")); init_triton_ir(subm.def_submodule("ir")); diff --git a/python/test/regression/test_performance.py b/python/test/regression/test_performance.py index 2f6005f79da0..63e9260d2ce4 100644 --- a/python/test/regression/test_performance.py +++ b/python/test/regression/test_performance.py @@ -56,7 +56,7 @@ def nvsmi(attrs): (4096, 64, 4096): {'float16': 0.179, 'float32': 0.214, 'int8': 0.102}, (8192, 64, 8192): {'float16': 0.278, 'float32': 0.000, 'int8': 0.177}, # test EVEN_K==False - (8192, 8192, 8176): {'float16': 0.786, 'float32': 0.696, 'int8': 0.51}, + (8192, 8192, 8176): {'float16': 0.786, 'float32': 0.743, 'int8': 0.51}, } } diff --git a/python/test/unit/hopper/__init__.py b/python/test/unit/hopper/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/test/unit/hopper/test_flashattention.py b/python/test/unit/hopper/test_flashattention.py new file mode 100644 index 000000000000..e46e1c1f2c59 --- /dev/null +++ b/python/test/unit/hopper/test_flashattention.py @@ -0,0 +1,480 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +""" +Fused Attention +=============== +This is a Triton implementation of the Flash Attention algorithm +(see: Dao et al., https://arxiv.org/pdf/2205.14135v2.pdf; Rabe and Staats https://arxiv.org/pdf/2112.05682v2.pdf) +""" + +# import numpy as np +import pytest +import torch + +import triton +import triton.language as tl + + +@triton.jit +def _fwd_kernel( + Q, K, V, sm_scale, + L, M, + Out, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + stride_oz, stride_oh, stride_om, stride_on, + Z, H, N_CTX, D0, + BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, +): + start_m = tl.program_id(0) + off_hz = tl.program_id(1) + + # TODO: may replace with TMA store without range offset + # initialize offsets for store + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = tl.arange(0, BLOCK_N) + # initialize pointer to m and l + m_prev = tl.zeros([BLOCK_M], dtype=tl.float32) - float("inf") + l_prev = tl.zeros([BLOCK_M], dtype=tl.float32) + acc = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + + stride_qh_2d = stride_qh // stride_qm // stride_qk + + q_tile_ptr = tl.make_block_ptr(base=Q, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_hz * stride_qh_2d + start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + k_tile_ptr = tl.make_block_ptr(base=K, + shape=(D0, BLOCK_DMODEL), + strides=(stride_kn, stride_kk), + offsets=(off_hz * stride_qh_2d, 0), + block_shape=(BLOCK_N, BLOCK_DMODEL), + order=(1, 0)) + v_tile_ptr = tl.make_block_ptr(base=V, + shape=(D0, BLOCK_DMODEL), + strides=(stride_vk, stride_vn), + offsets=(off_hz * stride_qh_2d, 0), + block_shape=(BLOCK_N, BLOCK_DMODEL), + order=(1, 0)) + out_tile_ptr = tl.make_block_ptr(base=Out, + shape=(D0, BLOCK_DMODEL), + strides=(stride_om, stride_on), + offsets=(off_hz * stride_qh_2d + start_m * BLOCK_M, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + # load q: it will stay in SRAM throughout + q = tl.load(q_tile_ptr) + + # loop over k, v and update accumulators + for start_n in range(0, (start_m + 1) * BLOCK_M, BLOCK_N): + # -- compute qk ---- + k = tl.load(k_tile_ptr, boundary_check=(0, 1)) + qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) + qk += tl.dot(q, tl.trans(k)) + qk *= sm_scale + qk = tl.where(offs_m[:, None] >= ( + start_n + offs_n[None, :]), qk, float("-inf")) + # compute new m + m_curr = tl.maximum(tl.max(qk, 1), m_prev) + # correct old l + l_prev *= tl.exp(m_prev - m_curr) + # attention weights + p = tl.exp(qk - m_curr[:, None]) + l_curr = tl.sum(p, 1) + l_prev + # rescale operands of matmuls + l_rcp = 1. / l_curr + p *= l_rcp[:, None] + acc *= (l_prev * l_rcp)[:, None] + # update acc + p = p.to(tl.float16) + v = tl.load(v_tile_ptr, boundary_check=(0, 1)) + acc += tl.dot(p, v) + # update m_i and l_i + l_prev = l_curr + m_prev = m_curr + # update pointers + k_tile_ptr = tl.advance(k_tile_ptr, [BLOCK_N, 0]) + v_tile_ptr = tl.advance(v_tile_ptr, [BLOCK_N, 0]) + # rematerialize offsets to save registers + start_m = tl.program_id(0) + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + # write back l and m + l_ptrs = L + off_hz * N_CTX + offs_m + m_ptrs = M + off_hz * N_CTX + offs_m + tl.store(l_ptrs, l_prev) + tl.store(m_ptrs, m_prev) + + acc = acc.to(tl.float16) + tl.store(out_tile_ptr, acc, boundary_check=(0, 1)) + + +@triton.jit +def _bwd_preprocess( + Out, DO, L, + NewDO, Delta, + BLOCK_M: tl.constexpr, D_HEAD: tl.constexpr, +): + off_m = tl.program_id(0) * BLOCK_M + tl.arange(0, BLOCK_M) + off_n = tl.arange(0, D_HEAD) + # load + o = tl.load(Out + off_m[:, None] * D_HEAD + off_n[None, :]).to(tl.float32) + do = tl.load(DO + off_m[:, None] * D_HEAD + off_n[None, :]).to(tl.float32) + denom = tl.load(L + off_m).to(tl.float32) + # compute + do = do / denom[:, None] + delta = tl.sum(o * do, axis=1) + # write-back + tl.store(NewDO + off_m[:, None] * D_HEAD + off_n[None, :], do) + tl.store(Delta + off_m, delta) + + +@triton.jit +def _bwd_kernel( + Q, K, V, sm_scale, Out, DO, + DQ, DK, DV, + L, M, + D, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + Z, H, N_CTX, D0, + num_block, + BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, +): + off_hz = tl.program_id(0) + off_z = off_hz // H + off_h = off_hz % H + # init tile_ptr + stride_qz_2d = stride_qz // stride_qm // stride_qk + stride_qh_2d = stride_qh // stride_qm // stride_qk + + q_tile_ptr = tl.make_block_ptr(base=Q, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + k_tile_ptr = tl.make_block_ptr(base=K, + shape=(D0, BLOCK_DMODEL), + strides=(stride_kn, stride_kk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + v_tile_ptr = tl.make_block_ptr(base=V, + shape=(D0, BLOCK_DMODEL), + strides=(stride_vk, stride_vn), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + do_tile_ptr = tl.make_block_ptr(base=DO, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + dq_tile_ptr = tl.make_block_ptr(base=DQ, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + dk_tile_ptr = tl.make_block_ptr(base=DK, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + dv_tile_ptr = tl.make_block_ptr(base=DV, + shape=(D0, BLOCK_DMODEL), + strides=(stride_qm, stride_qk), + offsets=( + off_z * stride_qz_2d + off_h * stride_qh_2d, 0), + block_shape=(BLOCK_M, BLOCK_DMODEL), + order=(1, 0)) + # offset pointers for batch/head + DQ += off_z * stride_qz + off_h * stride_qh + for start_n in range(0, num_block): + lo = start_n * BLOCK_M + # initialize row/col offsets + offs_qm = lo + tl.arange(0, BLOCK_M) + offs_n = start_n * BLOCK_M + tl.arange(0, BLOCK_M) + offs_m = tl.arange(0, BLOCK_N) + offs_k = tl.arange(0, BLOCK_DMODEL) + # initialize pointers to value-like data + dq_ptrs = DQ + (offs_qm[:, None] * stride_qm + offs_k[None, :] * stride_qk) + # pointer to row-wise quantities in value-like data + D_ptrs = D + off_hz * N_CTX + m_ptrs = M + off_hz * N_CTX + # initialize dv amd dk + dv = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + dk = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + # k and v stay in SRAM throughout + k = tl.load(k_tile_ptr, boundary_check=(0, 1)) + v = tl.load(v_tile_ptr, boundary_check=(0, 1)) + # loop over rows + for start_m in range(lo, num_block * BLOCK_M, BLOCK_M): + offs_m_curr = start_m + offs_m + # load q, k, v, do on-chip + q = tl.load(q_tile_ptr, boundary_check=(0, 1)) + # recompute p = softmax(qk, dim=-1).T + # NOTE: `do` is pre-divided by `l`; no normalization here + qk = tl.dot(q, tl.trans(k)) + qk = tl.where(offs_m_curr[:, None] >= ( + offs_n[None, :]), qk, float("-inf")) + m = tl.load(m_ptrs + offs_m_curr) + p = tl.exp(qk * sm_scale - m[:, None]) + # compute dv + do = tl.load(do_tile_ptr, boundary_check=(0, 1)) + dv += tl.dot(tl.trans(p.to(tl.float16)), do) + # compute dp = dot(v, do) + Di = tl.load(D_ptrs + offs_m_curr) + dp = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) - Di[:, None] + dp += tl.dot(do, tl.trans(v)) + # compute ds = p * (dp - delta[:, None]) + ds = p * dp * sm_scale + # compute dk = dot(ds.T, q) + dk += tl.dot(tl.trans(ds.to(tl.float16)), q) + # compute dq + dq = tl.load(dq_tile_ptr) + dq += tl.dot(ds.to(tl.float16), k) + tl.store(dq_tile_ptr, dq) + # increment pointers + dq_ptrs += BLOCK_M * stride_qm + q_tile_ptr = tl.advance(q_tile_ptr, [BLOCK_M, 0]) + do_tile_ptr = tl.advance(do_tile_ptr, [BLOCK_M, 0]) + dq_tile_ptr = tl.advance(dq_tile_ptr, [BLOCK_M, 0]) + q_tile_ptr = tl.advance(q_tile_ptr, [lo + (1 - num_block) * BLOCK_M, 0]) + do_tile_ptr = tl.advance(do_tile_ptr, [lo + (1 - num_block) * BLOCK_M, 0]) + dq_tile_ptr = tl.advance(dq_tile_ptr, [lo + (1 - num_block) * BLOCK_M, 0]) + # increment tile pointers + k_tile_ptr = tl.advance(k_tile_ptr, [BLOCK_M, 0]) + v_tile_ptr = tl.advance(v_tile_ptr, [BLOCK_M, 0]) + # write-back + tl.store(dv_tile_ptr, dv.to(tl.float16), boundary_check=(0, 1)) + tl.store(dk_tile_ptr, dk.to(tl.float16), boundary_check=(0, 1)) + dv_tile_ptr = tl.advance(dv_tile_ptr, [BLOCK_M, 0]) + dk_tile_ptr = tl.advance(dk_tile_ptr, [BLOCK_M, 0]) + + +empty = torch.empty(128, device="cuda") + + +class _attention(torch.autograd.Function): + + @staticmethod + def forward(ctx, q, k, v, sm_scale): + BLOCK = 128 + # shape constraints + Lq, Lk, Lv = q.shape[-1], k.shape[-1], v.shape[-1] + assert Lq == Lk and Lk == Lv + assert Lk in {16, 32, 64, 128} + o = torch.empty_like(q) + grid = (triton.cdiv(q.shape[2], BLOCK), q.shape[0] * q.shape[1], 1) + L = torch.empty( + (q.shape[0] * q.shape[1], q.shape[2]), + device=q.device, + dtype=torch.float32) + m = torch.empty( + (q.shape[0] * q.shape[1], q.shape[2]), + device=q.device, + dtype=torch.float32) + num_warps = 4 if Lk <= 64 else 8 + D0 = q.shape[0] * q.shape[1] * q.shape[2] + _fwd_kernel[grid]( + q, k, v, sm_scale, + L, m, + o, + q.stride(0), q.stride(1), q.stride(2), q.stride(3), + k.stride(0), k.stride(1), k.stride(2), k.stride(3), + v.stride(0), v.stride(1), v.stride(2), v.stride(3), + o.stride(0), o.stride(1), o.stride(2), o.stride(3), + q.shape[0], q.shape[1], q.shape[2], D0, + BLOCK_M=BLOCK, BLOCK_N=BLOCK, + BLOCK_DMODEL=Lk, num_warps=num_warps, + num_stages=2, + ) + + ctx.save_for_backward(q, k, v, o, L, m) + ctx.grid = grid + ctx.sm_scale = sm_scale + ctx.BLOCK_DMODEL = Lk + return o + + @staticmethod + def backward(ctx, do): + BLOCK = 128 + q, k, v, o, l, m = ctx.saved_tensors + do = do.contiguous() + dq = torch.zeros_like(q, dtype=torch.float32) + dk = torch.empty_like(k) + dv = torch.empty_like(v) + do_scaled = torch.empty_like(do) + delta = torch.empty_like(l) + D0 = q.shape[0] * q.shape[1] * q.shape[2] + _bwd_preprocess[(ctx.grid[0] * ctx.grid[1], )]( + o, do, l, + do_scaled, delta, + BLOCK_M=BLOCK, D_HEAD=ctx.BLOCK_DMODEL, + ) + _bwd_kernel[(ctx.grid[1],)]( + q, k, v, ctx.sm_scale, + o, do_scaled, + dq, dk, dv, + l, m, + delta, + q.stride(0), q.stride(1), q.stride(2), q.stride(3), + k.stride(0), k.stride(1), k.stride(2), k.stride(3), + v.stride(0), v.stride(1), v.stride(2), v.stride(3), + q.shape[0], q.shape[1], q.shape[2], D0, + ctx.grid[0], + BLOCK_M=BLOCK, BLOCK_N=BLOCK, + BLOCK_DMODEL=ctx.BLOCK_DMODEL, num_warps=8, + num_stages=1, + ) + return dq, dk, dv, None + + +attention = _attention.apply + + +@pytest.mark.parametrize('Z, H, N_CTX, D_HEAD', [(4, 48, 128, 64), + # (4, 48, 256, 64), + # (4, 48, 512, 64), + # (4, 48, 1024, 64), + # (4, 48, 2048, 64), + # (4, 48, 4096, 64), + # (4, 48, 8192, 64), out of memory + ]) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="requires arch 9+") +def test_op(Z, H, N_CTX, D_HEAD, dtype=torch.float16): + torch.manual_seed(20) + q = torch.empty( + (Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_( + mean=0.1, std=0.2).requires_grad_() + k = torch.empty( + (Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_( + mean=0.4, std=0.2).requires_grad_() + v = torch.empty( + (Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_( + mean=0.3, std=0.2).requires_grad_() + sm_scale = 0.2 + dout = torch.randn_like(q) + # reference implementation + M = torch.tril(torch.ones((N_CTX, N_CTX), device="cuda")) + p = torch.matmul(q, k.transpose(2, 3)) * sm_scale + for z in range(Z): + for h in range(H): + p[:, :, M == 0] = float("-inf") + p = torch.softmax(p.float(), dim=-1).half() + # p = torch.exp(p) + ref_out = torch.matmul(p, v) + ref_out.backward(dout) + ref_dv, v.grad = v.grad.clone(), None + ref_dk, k.grad = k.grad.clone(), None + ref_dq, q.grad = q.grad.clone(), None + # triton implementation + tri_out = attention(q, k, v, sm_scale) + # print(ref_out) + # print(tri_out) + tri_out.backward(dout) + tri_dv, v.grad = v.grad.clone(), None + tri_dk, k.grad = k.grad.clone(), None + tri_dq, q.grad = q.grad.clone(), None + # compare + torch.testing.assert_close(ref_out, tri_out, atol=1e-2, rtol=0) + torch.testing.assert_close(ref_dq, tri_dq, atol=1e-2, rtol=0) + torch.testing.assert_close(ref_dv, tri_dv, atol=1e-2, rtol=0) + torch.testing.assert_close(ref_dk, tri_dk, atol=1e-2, rtol=0) + + +try: + from flash_attn.flash_attn_interface import flash_attn_func + HAS_FLASH = True +except BaseException: + HAS_FLASH = False + +BATCH, N_HEADS, N_CTX, D_HEAD = 4, 48, 4096, 64 +# vary seq length for fixed head and batch=4 +configs = [triton.testing.Benchmark( + x_names=['N_CTX'], + x_vals=[2**i for i in range(10, 14)], + line_arg='provider', + line_vals=['triton'] + (['flash'] if HAS_FLASH else []), + line_names=['Triton'] + (['Flash'] if HAS_FLASH else []), + styles=[('red', '-'), ('blue', '-')], + ylabel='ms', + plot_name=f'fused-attention-batch{BATCH}-head{N_HEADS}-d{D_HEAD}-{mode}', + args={ + 'H': N_HEADS, + 'BATCH': BATCH, + 'D_HEAD': D_HEAD, + 'dtype': torch.float16, + 'mode': mode} +) for mode in ['fwd', 'bwd']] + + +@triton.testing.perf_report(configs) +def bench_flash_attention(BATCH, H, N_CTX, D_HEAD, mode, provider, dtype=torch.float16, device="cuda"): + assert mode in ['fwd', 'bwd'] + warmup = 25 + rep = 100 + if provider == "triton": + q = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + k = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + v = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + sm_scale = 1.3 + fn = lambda: attention(q, k, v, sm_scale) + if mode == 'bwd': + o = fn() + do = torch.randn_like(o) + fn = lambda: o.backward(do, retain_graph=True) + ms = triton.testing.do_bench(fn, warmup=warmup, rep=rep) + return ms + if provider == "flash": + lengths = torch.full((BATCH,), fill_value=N_CTX, device=device) + cu_seqlens = torch.zeros( + (BATCH + 1,), device=device, dtype=torch.int32) + cu_seqlens[1:] = lengths.cumsum(0) + qkv = torch.randn((BATCH * N_CTX, 3, H, D_HEAD), dtype=dtype, device=device, requires_grad=True) + fn = lambda: flash_attn_func(qkv, cu_seqlens, 0., N_CTX, causal=True) + if mode == 'bwd': + o = fn() + do = torch.randn_like(o) + fn = lambda: o.backward(do, retain_graph=True) + ms = triton.testing.do_bench(fn, warmup=warmup, rep=rep) + return ms + + +# only works on post-Ampere GPUs right now +# bench_flash_attention.run(save_path='.', print_data=True) diff --git a/python/test/unit/hopper/test_gemm.py b/python/test/unit/hopper/test_gemm.py new file mode 100644 index 000000000000..58d73a3c10b0 --- /dev/null +++ b/python/test/unit/hopper/test_gemm.py @@ -0,0 +1,469 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import itertools +import os +import re + +import pytest +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl +from .utils import get_proper_err, get_variant_golden + + +@triton.jit +def matmul_no_scf_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + FLOAT16_OUTPUT: tl.constexpr, USE_TMA_EPILOGUE: tl.constexpr +): + a_block_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(0, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_block_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, 0), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + a = tl.load(a_block_ptr) + b = tl.load(b_block_ptr) + + c = tl.dot(a, b) + + if FLOAT16_OUTPUT: + c = c.to(tl.float16) + + if USE_TMA_EPILOGUE: + c_block_ptr = tl.make_block_ptr(base=c_ptr, shape=(M, N), strides=(stride_cm, stride_cn), + offsets=(0, 0), block_shape=(BLOCK_M, BLOCK_N), order=(1, 0)) + tl.store(c_block_ptr, c) + else: + offs_m = tl.arange(0, BLOCK_M) + offs_n = tl.arange(0, BLOCK_N) + c_ptrs = c_ptr + offs_m[:, None] * stride_cm + offs_n[None, :] * stride_cn + tl.store(c_ptrs, c) + + +@pytest.mark.parametrize('M,N,K,NUM_CTAS,NUM_WARPS,TRANS_A,TRANS_B,OUTPUT_TYPE,USE_TMA_EPILOGUE,ENABLE_WS', + itertools.chain( + *[ + [ + # numCTAs = 1, no TMA multicast: + [64, 16, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [64, 32, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [64, 64, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [64, 64, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [64, 64, 32, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [64, 64, 64, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [128, 128, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [128, 128, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + # static mask, cluster 4x1 + [256, 64, 16, 4, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [256, 64, 16, 4, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + # dynamic mask, cluster 2x2 + [128, 128, 16, 4, 4, False, True, "float16", USE_TMA_EPILOGUE, ENABLE_WS], + [128, 128, 16, 4, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + # small M, N + [16, 16, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [16, 32, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [32, 16, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + [32, 32, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, ENABLE_WS], + ] for USE_TMA_EPILOGUE in [True, False] + for ENABLE_WS in [False, True] + ])) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_gemm_no_scf(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_TYPE, USE_TMA_EPILOGUE, ENABLE_WS): + if '-'.join(map(str, [USE_TMA_EPILOGUE, ENABLE_WS])) in [ + 'True-True' + ]: + pytest.skip("error, skip") + + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + + if OUTPUT_TYPE == "float16": + c = torch.empty((M, N), device=a.device, dtype=torch.float16) + else: + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + matmul_no_scf_kernel[(1, 1)](a_ptr=a, b_ptr=b, c_ptr=c, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_cm=c.stride(0), stride_cn=c.stride(1), + BLOCK_M=M, BLOCK_N=N, BLOCK_K=K, + num_warps=NUM_WARPS, + num_ctas=NUM_CTAS, + FLOAT16_OUTPUT=(OUTPUT_TYPE == "float16"), + USE_TMA_EPILOGUE=USE_TMA_EPILOGUE, + enable_warp_specialization=ENABLE_WS) + a_f32 = a.to(torch.float32) + b_f32 = b.to(torch.float32) + golden = torch.matmul(a_f32, b_f32) + golden_variant = get_variant_golden(a_f32, b_f32) + golden_abs_err, golden_rel_err = get_proper_err(golden, golden_variant) + torch.set_printoptions(profile="full") + assert_close( + c, + golden, + rtol=max(1e-2, 1.1 * golden_rel_err), + atol=max(1e-3, 1.1 * golden_abs_err), + check_dtype=False) + + +@triton.jit +def matmul_kernel( + a_ptr, b_ptr, w_ptr, bias_ptr, z_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_wm, stride_wn, + stride_zm, stride_zn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, + out_dtype: tl.constexpr, USE_TMA_STORE: tl.constexpr, + ADD_MATRIX: tl.constexpr, ADD_ROWS: tl.constexpr, ADD_COLS: tl.constexpr, + DO_SOFTMAX: tl.constexpr, CHAIN_DOT: tl.constexpr, + A_ORDER_0: tl.constexpr, A_ORDER_1: tl.constexpr, + B_ORDER_0: tl.constexpr, B_ORDER_1: tl.constexpr, + Z_ORDER_0: tl.constexpr, Z_ORDER_1: tl.constexpr +): + pid = tl.program_id(axis=0) + num_pid_n = tl.cdiv(N, BLOCK_N) + num_pid_m = tl.cdiv(M, BLOCK_M) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + block_offset_m = pid_m * BLOCK_M + block_offset_n = pid_n * BLOCK_N + + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(A_ORDER_0, A_ORDER_1)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(B_ORDER_0, B_ORDER_1)) + w_tile_ptr = tl.make_block_ptr(base=w_ptr, shape=(N, N), strides=(stride_wm, stride_wn), + offsets=(0, block_offset_n), block_shape=(BLOCK_N, BLOCK_N), order=(Z_ORDER_1, Z_ORDER_0)) + z = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + + offs_m = block_offset_m + tl.arange(0, BLOCK_M) + offs_n = block_offset_n + tl.arange(0, BLOCK_N) + z_ptrs = z_ptr + offs_m[:, None] * stride_zm + offs_n[None, :] * stride_zn + bias_ptrs = bias_ptr + offs_m[:, None] * stride_zm + offs_n[None, :] * stride_zn + mask = (offs_m < M)[:, None] & (offs_n < N)[None, :] + + for k in range(0, K, BLOCK_K): + a = tl.load(a_tile_ptr, boundary_check=(0, 1)) + b = tl.load(b_tile_ptr, boundary_check=(0, 1)) + z += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_K, 0]) + + z = z.to(out_dtype) + + if ADD_MATRIX: + z += tl.load(bias_ptrs, mask=mask) + if ADD_ROWS: + ZRs = bias_ptr + offs_m * stride_zm + z += tl.load(ZRs)[:, None] + if ADD_COLS: + ZCs = bias_ptr + offs_n * stride_zn + z += tl.load(ZCs)[None, :] + if DO_SOFTMAX: + max = tl.max(z, 1) + z = z - max[:, None] + num = tl.exp(z.to(tl.float32)).to(max.dtype) + den = tl.sum(num, 1) + z = num / den[:, None] + if CHAIN_DOT: + w = tl.load(w_tile_ptr) + z = tl.dot(z.to(w.dtype), w) + z = z.to(out_dtype) + + if USE_TMA_STORE: + z_block_ptr = tl.make_block_ptr(base=z_ptr, shape=(M, N), strides=(stride_zm, stride_zn), + offsets=(block_offset_m, block_offset_n), block_shape=(BLOCK_M, BLOCK_N), order=(Z_ORDER_0, Z_ORDER_1)) + tl.store(z_block_ptr, z, boundary_check=(0, 1)) + else: + tl.store(z_ptrs, z, mask=mask) + + +@pytest.mark.parametrize('BLOCK_M,BLOCK_N,BLOCK_K,NUM_WARPS,NUM_CTAS,M,N,K,TRANS_A,TRANS_B,TRANS_C,epilogue,out_dtype,USE_TMA_STORE,NUM_STAGES,ENABLE_WS', + [(128, 128, 64, 4, 1, *shape_w_c, 'none', out_dtype, use_tma_store, 3, enable_ws) + for shape_w_c in [ + # badcase from cublas-important-layers + [4096, 1, 1024, False, False, True], + [2048, 204, 1000, True, False, True], + [4096, 1, 1024, False, False, False], + [2048, 204, 1000, True, False, False], + ] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for enable_ws in [False, True] + ] + [(*shape_w_c, trans_a, trans_b, trans_c, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + # softmax works for one CTA + for shape_w_c in [ + [64, 64, 16, 4, 1, 64, 64, 64], + [128, 128, 64, 4, 1, None, None, None], + [16, 16, 64, 4, 1, 16, 16, 64], + [64, 64, 32, 8, 1, 64, 64, 64], + [128, 128, 64, 4, 1, 128, 128, 128], + ] + for epilogue in ['softmax'] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for trans_c in [False, True] + for num_stages in [3] + for enable_ws in [False, True] + ] + [(*shape_w_c, trans_a, trans_b, trans_c, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + for shape_w_c in [ + [64, 64, 16, 4, 1, 128, 128, 64], + *[[256, 64, 16, num_warps, num_ctas, 256, 256, 64] for num_warps in [4, 8] for num_ctas in [1, 2, 4]], + # for chain-dot + [128, 128, 64, 4, 1, None, None, None], + [64, 64, 16, 4, 1, None, None, None], + # small BLOCK_M and BLOCK_K + [16, 16, 64, 4, 1, 128, 128, 64], + *[[16, 32, 64, num_warps, num_ctas, 256, 256, 256] for num_warps in [4, 8] for num_ctas in [1, 2]], + # repeat + [64, 64, 32, 8, 1, 128, 256, 64], + [64, 64, 16, 8, 2, 128, 128, 64], + # irregular shape + [128, 128, 64, 4, 1, 500, 200, 128], + [128, 128, 64, 4, 2, 513, 193, 192], + ] + for epilogue in ['none', 'add-matrix', 'add-rows', 'add-cols', 'chain-dot'] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for trans_c in [False, True] + for num_stages in [3] + for enable_ws in [False, True] + if not (epilogue == 'chain-dot' and (shape_w_c[5] is not None or shape_w_c[0] != shape_w_c[1])) + ] + [(*shape_w_c, trans_a, trans_b, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + for shape_w_c in [ + [64, 64, 32, 4, 1, 128, 256, 64], + [128, 128, 16, 4, 4, 512, 256, 64], + [128, 256, 32, 4, 8, 256, 256, 192], + [512, 256, 32, 4, 8, 1024, 256, 192], + # BLOCK_K >= 128 + [64, 128, 128, 4, 1, 512, 256, 256], + [128, 128, 128, 4, 1, 256, 256, 192], + [128, 128, 128, 4, 2, 256, 256, 192], + # small BLOCK_M and BLOCK_K + [16, 32, 32, 4, 1, 128, 256, 64], + [32, 32, 16, 4, 1, 256, 256, 192], + [16, 32, 64, 4, 4, 512, 256, 64], + ] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for trans_c in [False, True] + for num_stages in [3] + for enable_ws in [False, True] + ] + [(64, n, 16, 4, 1, 512, 256, 256, False, True, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + # loop over instr shapes + for n in [16, 32, 64, 128, 256] + for trans_c in [False, True] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for num_stages in [2, 4, 5, 7] + for enable_ws in [False, True] + ] + [(*shape_w_c, *shape, False, True, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + # irregular shapes + for shape_w_c in [ + [128, 128, 64, 4, 1], + [256, 128, 64, 4, 2], + [128, 128, 128, 4, 2], + ] + for shape in list(itertools.product([*range(512, 4096, 360)], [*range(512, 4096, 360)], [512, 1024])) + for trans_c in [False, True] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for num_stages in [2, 3, 4] + for enable_ws in [False, True] + ]) +@pytest.mark.skipif(torch.cuda.get_device_capability() + [0] < 9, reason="Requires compute capability >= 9") +def test_gemm(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B, TRANS_C, epilogue, out_dtype, USE_TMA_STORE, NUM_STAGES, ENABLE_WS): + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B])) in [ + '16-32-64-4-4-512-256-64-True-False', + '16-32-64-4-4-512-256-64-True-True', + '16-32-64-4-4-512-256-64-False-False', + '16-32-64-4-4-512-256-64-False-True', + ]: + pytest.skip('shapePerCTA[1] < 16 not supported') + + # with ENABLE_TMA=0 and ENABLE_MMA_V3=0 + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_B])) in [ + '16-32-64-4-1-256-256-256-False', + '16-32-64-4-2-256-256-256-False', + '16-32-64-4-2-256-256-256-True', + '16-32-64-8-2-256-256-256-False', + '16-32-64-8-2-256-256-256-True', + ]: + pytest.skip('illegal memory access.') + + # with ENABLE_TMA=1 and ENABLE_MMA_V3=1 + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K])) in [ + '64-64-32-8-1-128-256-64', + ]: + pytest.skip('Tensor-likes are not close!') + + if NUM_CTAS > 1 and NUM_WARPS == 8: + pytest.skip('Tensor-likes are not close!') + + # with ENABLE_TMA=1 and ENABLE_MMA_V3=1 + if ENABLE_WS: + # example: + # [128-128-64-4-1-None-None-None-False-False-False-chain-dot-float16-False-3-True] + pytest.skip('hang!') + + M = BLOCK_M if M is None else M + N = BLOCK_N if N is None else N + K = BLOCK_K if K is None else K + + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + a_order = [0, 1] + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + a_order = [1, 0] + + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + b_order = [0, 1] + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + b_order = [1, 0] + + if out_dtype == 'float16' and epilogue != 'softmax': + # TODO: for out_dtype == 'float16' and epilogue == 'softmax', it will + # fail with the following error: 'llvm.fmul' op requires the same type + # for all operands and results + out_dtype = tl.float16 + torch_out_dtype = torch.float16 + else: + out_dtype = tl.float32 + torch_out_dtype = torch.float32 + + # avoid out of memory + if epilogue in ['add-matrix', 'add-rows', 'add-cols']: + if (TRANS_C): + bias = torch.randn((M, N), device='cuda', dtype=torch_out_dtype) + else: + bias = torch.randn((N, M), device='cuda', dtype=torch_out_dtype).T + else: + bias = torch.randn((1, 1), device='cuda', dtype=torch_out_dtype) + + if epilogue == 'chain-dot': + if (TRANS_C): + w = torch.randn((N, N), device='cuda', dtype=torch.float16).T + else: + w = torch.randn((M, M), device='cuda', dtype=torch.float16) + else: + w = torch.randn((1, 1), device='cuda', dtype=torch.float16).T + + if (TRANS_C): + z = torch.full((M, N), 1., device='cuda', dtype=torch_out_dtype) + z_order = [1, 0] + else: + z = torch.full((N, M), 1., device='cuda', dtype=torch_out_dtype).T + z_order = [0, 1] + + # torch result + a_f32 = a.to(torch.float32) + b_f32 = b.to(torch.float32) + dot = torch.matmul(a_f32, b_f32) + + def process_epilogue(d, bias, w, epilogue): + if epilogue == 'add-matrix': + ref = d + bias + elif epilogue == 'add-rows': + ref = d + bias[:, 0][:, None] + elif epilogue == 'add-cols': + ref = d + bias[0, :][None, :] + elif epilogue == 'softmax': + num = torch.exp(d - torch.max(d, dim=-1, keepdims=True)[0]) + denom = torch.sum(num, dim=-1, keepdims=True) + ref = num / denom + # ref = torch.softmax(d, 1) + elif epilogue == 'chain-dot': + ref = torch.matmul(d, w.to(torch.float32)) + else: + ref = d + return ref + golden = process_epilogue(dot, bias, w, epilogue) + + def grid(META): + return (triton.cdiv(M, META['BLOCK_M']) * triton.cdiv(N, META['BLOCK_N']),) + pgm = matmul_kernel[grid](a_ptr=a, b_ptr=b, w_ptr=w, bias_ptr=bias, z_ptr=z, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_wm=w.stride(0), stride_wn=w.stride(1), + stride_zm=z.stride(0), stride_zn=z.stride(1), + BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N, BLOCK_K=BLOCK_K, GROUP_SIZE_M=8, + out_dtype=out_dtype, + USE_TMA_STORE=USE_TMA_STORE, + ADD_MATRIX=epilogue == 'add-matrix', + ADD_ROWS=epilogue == 'add-rows', + ADD_COLS=epilogue == 'add-cols', + DO_SOFTMAX=epilogue == 'softmax', + CHAIN_DOT=epilogue == 'chain-dot', + A_ORDER_0=a_order[0], A_ORDER_1=a_order[1], + B_ORDER_0=b_order[0], B_ORDER_1=b_order[1], + Z_ORDER_0=z_order[0], Z_ORDER_1=z_order[1], + num_warps=NUM_WARPS, num_ctas=NUM_CTAS, num_stages=NUM_STAGES, + enable_warp_specialization=ENABLE_WS) + + torch.set_printoptions(profile="full") + # print("abs_err: {}, rel_err: {}".format(golden_abs_err, golden_rel_err)) + # print("golden: ") + # print(golden) + # print("result: ") + # print(z) + # print("max_gap: {}".format(torch.max(torch.abs(z - golden)))) + golden = torch.nn.functional.normalize(golden) + z = torch.nn.functional.normalize(z) + assert_close(z, golden, + rtol=1e-2, + atol=1e-3, + check_dtype=False) + + enable_mmav3 = os.environ.get('ENABLE_MMA_V3', 'not found').lower() + if enable_mmav3 in ["on", "true", "1"] and BLOCK_M >= 64 and NUM_CTAS == 1 and BLOCK_N <= 256: + ptx = pgm.asm['ptx'] + assert re.search(r'wgmma.mma_async.sync.aligned.m\d+n{}k16(?:.row.col)?.f32.f16.f16'.format(BLOCK_N), ptx) diff --git a/python/test/unit/hopper/test_gemm_fusion.py b/python/test/unit/hopper/test_gemm_fusion.py new file mode 100644 index 000000000000..1fd53d5c4579 --- /dev/null +++ b/python/test/unit/hopper/test_gemm_fusion.py @@ -0,0 +1,166 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import pytest +import torch + +import triton +import triton.language as tl + + +@triton.jit +def gemm_fusion_kernel(A, B, C, E, + M, N, K, + stride_am, stride_ak, stride_bn, stride_bk, stride_cn, stride_ck, stride_em, stride_ek, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr): + pid = tl.program_id(0) + + a_tile_ptr = tl.make_block_ptr(base=A, shape=(M, K), strides=(stride_am, stride_ak), offsets=(pid * BLOCK_M, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_tile_ptr = tl.make_block_ptr(base=B, shape=(N, K), strides=(stride_bn, stride_bk), offsets=(0, 0), block_shape=(BLOCK_N, BLOCK_K), order=(1, 0)) + c_tile_ptr = tl.make_block_ptr(base=C, shape=(N, K), strides=(stride_cn, stride_ck), offsets=(0, 0), block_shape=(BLOCK_N, BLOCK_K), order=(1, 0)) + e_tile_ptr = tl.make_block_ptr(base=E, shape=(M, K), strides=(stride_em, stride_ek), offsets=(pid * BLOCK_M, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + + acc_e = tl.zeros((BLOCK_M, BLOCK_K), dtype=tl.float32) + a = tl.load(a_tile_ptr) + for i in range(0, N, BLOCK_N): + b = tl.load(b_tile_ptr) + o_ab = tl.dot(a, tl.trans(b)) + c = tl.load(c_tile_ptr) + o_ab = o_ab.to(tl.float16) + acc_e += tl.dot(o_ab, c) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_N, 0]) + c_tile_ptr = tl.advance(c_tile_ptr, [BLOCK_N, 0]) + + acc_e = acc_e.to(tl.float16) + tl.store(e_tile_ptr, acc_e) + + +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="not passed on ampere") +def test_gemm_fusion(): + M, N, K = 4096, 4096, 64 + BLOCK_M, BLOCK_N, BLOCK_K = 128, 128, 64 + A = torch.empty( + (M, K), dtype=torch.float16, device='cuda').normal_( + mean=0.1, std=0.2) + B = torch.empty( + (N, K), dtype=torch.float16, device='cuda').normal_( + mean=0.1, std=0.2) + C = torch.empty( + (N, K), dtype=torch.float16, device='cuda').normal_( + mean=0.1, std=0.2) + E = torch.empty((M, K), dtype=torch.float16, device='cuda') + ref_out = torch.matmul(torch.matmul(A, B.T), C) + num_warps = 4 + grid = (triton.cdiv(M, BLOCK_M), 1) + gemm_fusion_kernel[grid](A, B, C, E, M, N, K, + A.stride(0), A.stride(1), B.stride(0), B.stride( + 1), C.stride(0), C.stride(1), E.stride(0), E.stride(1), + BLOCK_M, BLOCK_N, BLOCK_K, num_warps=num_warps) + + torch.testing.assert_close(ref_out, E, atol=1e-2, rtol=0) + + +@triton.jit +def batched_gemm_fusion( + Q, K, V, Out, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + stride_oz, stride_oh, stride_om, stride_on, + Z, NH, N_CTX, + BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, +): + start_m = tl.program_id(0) + off_hz = tl.program_id(1) + acc = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + + q_tile_ptr = tl.make_block_ptr(base=Q, + shape=(Z, NH, N_CTX, BLOCK_DMODEL), + strides=(stride_qz, stride_qh, stride_qm, stride_qk), + offsets=(off_hz // NH, off_hz % NH, start_m, 0), + block_shape=(1, 1, BLOCK_M, BLOCK_DMODEL), + order=(3, 2, 1, 0)) + k_tile_ptr = tl.make_block_ptr(base=K, + shape=(Z, NH, N_CTX, BLOCK_DMODEL), + strides=(stride_kz, stride_kh, stride_kn, stride_kk), + offsets=(off_hz // NH, off_hz % NH, 0, 0), + block_shape=(1, 1, BLOCK_N, BLOCK_DMODEL), + order=(3, 2, 1, 0)) + v_tile_ptr = tl.make_block_ptr(base=V, + shape=(Z, NH, N_CTX, BLOCK_DMODEL), + strides=(stride_vz, stride_vh, stride_vk, stride_vn), + offsets=(off_hz // NH, off_hz % NH, 0, 0), + block_shape=(1, 1, BLOCK_N, BLOCK_DMODEL), + order=(3, 2, 1, 0)) + o_tile_ptr = tl.make_block_ptr(base=Out, + shape=(Z, NH, N_CTX, BLOCK_DMODEL), + strides=(stride_oz, stride_oh, stride_om, stride_on), + offsets=(off_hz // NH, off_hz % NH, start_m, 0), + block_shape=(1, 1, BLOCK_M, BLOCK_DMODEL), + order=(3, 2, 1, 0)) + + q = tl.load(q_tile_ptr, boundary_check=(0, 1, 2, 3)) + q = tl.view(q, (BLOCK_M, BLOCK_DMODEL)) + for i in range(0, N_CTX, BLOCK_N): + k = tl.load(k_tile_ptr, boundary_check=(0, 1, 2, 3)) + k = tl.view(k, (BLOCK_N, BLOCK_DMODEL)) + qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) + qk += tl.dot(q, tl.trans(k)) + + p = qk.to(tl.float16) + v = tl.load(v_tile_ptr, boundary_check=(0, 1, 2, 3)) + v = tl.view(v, (BLOCK_N, BLOCK_DMODEL)) + acc += tl.dot(p, v) + + k_tile_ptr = tl.advance(k_tile_ptr, [0, 0, BLOCK_N, 0]) + v_tile_ptr = tl.advance(v_tile_ptr, [0, 0, BLOCK_N, 0]) + + acc = tl.view(acc, (1, 1, BLOCK_M, BLOCK_DMODEL)) + acc = acc.to(tl.float16) + tl.store(o_tile_ptr, acc) + + +@pytest.mark.skip(reason="don't support 4d across stack, left for future") +def test_batched_gemm_fusion(): + Z = 4 + NH = 48 + H = 64 + N_CTX = 2048 + BLOCK_M, BLOCK_N, BLOCK_DMODEL = 128, 128, H + torch.manual_seed(20) + A = torch.empty((Z, NH, N_CTX, H), dtype=torch.float16, device='cuda').normal_(mean=0.1, std=0.2) + B = torch.empty((Z, NH, N_CTX, H), dtype=torch.float16, device='cuda').normal_(mean=0.1, std=0.2) + C = torch.empty((Z, NH, N_CTX, H), dtype=torch.float16, device='cuda').normal_(mean=0.1, std=0.2) + E = torch.empty_like(A) + BT = B.transpose(-1, -2) + ref_out = torch.matmul(torch.matmul(A, BT), C) + num_warps = 4 + grid = (triton.cdiv(N_CTX, BLOCK_M), B * NH) + batched_gemm_fusion[grid](A, B, C, E, + A.stride(0), A.stride(1), A.stride(2), A.stride(3), + B.stride(0), B.stride(1), B.stride(2), B.stride(3), + C.stride(0), C.stride(1), C.stride(2), C.stride(3), + E.stride(0), E.stride(1), E.stride(2), E.stride(3), + Z, NH, N_CTX, + BLOCK_M, BLOCK_DMODEL, BLOCK_N, num_warps=num_warps) + + torch.testing.assert_close(ref_out, E, atol=1e-2, rtol=0) diff --git a/python/test/unit/hopper/test_mixed_io.py b/python/test/unit/hopper/test_mixed_io.py new file mode 100644 index 000000000000..cecabbaa732f --- /dev/null +++ b/python/test/unit/hopper/test_mixed_io.py @@ -0,0 +1,89 @@ +import pytest +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl + +dtype_mapping = { + 'float16': torch.float16, + 'float32': torch.float32, +} + + +@triton.jit +def add_kernel( + x_ptr, + y_ptr, + output_ptr, + n_elements, + BLOCK_SIZE: tl.constexpr, +): + pid = tl.program_id(axis=0) # We use a 1D launch grid so axis is 0. + block_start = pid * BLOCK_SIZE + offsets = block_start + tl.arange(0, BLOCK_SIZE) + mask = offsets < n_elements + + x_block_ptr = tl.make_block_ptr( + base=x_ptr, shape=(n_elements, ), strides=(1, ), offsets=(pid * BLOCK_SIZE, ), + block_shape=(BLOCK_SIZE, ), order=(0, ) + ) + x = tl.load(x_block_ptr, boundary_check=(0, ), padding_option='zero') + + y = tl.load(y_ptr + offsets, mask=mask) + output = x + y + tl.store(output_ptr + offsets, output, mask=mask) + + +@pytest.mark.parametrize('SIZE,BLOCK_SIZE,dtype_str', + [(98432, 1024, dtype_str) + for dtype_str in ['float16', 'float32'] + ]) +def test_add(SIZE, BLOCK_SIZE, dtype_str): + dtype = dtype_mapping[dtype_str] + output = torch.empty(SIZE, device='cuda', dtype=dtype) + x = torch.randn(SIZE, device='cuda', dtype=dtype) + y = torch.randn(SIZE, device='cuda', dtype=dtype) + + def grid(meta): + return (triton.cdiv(SIZE, meta['BLOCK_SIZE']),) + add_kernel[grid](x, y, output, SIZE, BLOCK_SIZE=BLOCK_SIZE) + + output_torch = x + y + torch.set_printoptions(profile='full') + assert_close(output, output_torch, rtol=1e-2, atol=1e-3, check_dtype=False) + + +@triton.jit +def load_reduce_kernel( + x_ptr, + y_ptr, + stride_xm, + stride_xn, + stride_y, + BLOCK_M: tl.constexpr, + BLOCK_N: tl.constexpr, +): + x_ptr = tl.make_block_ptr( + base=x_ptr, shape=(BLOCK_M, BLOCK_N), strides=(stride_xm, stride_xn), + offsets=(0, 0), block_shape=(BLOCK_M, BLOCK_N), order=(1, 0) + ) + x = tl.load(x_ptr) + y = tl.max(x, axis=1) + tl.store(y_ptr + tl.arange(0, BLOCK_M), y) + + +@pytest.mark.parametrize('BLOCK_M,BLOCK_N,dtype_str', + [(128, 64, dtype_str) + for dtype_str in ['float16'] + ]) +def test_load_reduce(BLOCK_M, BLOCK_N, dtype_str): + dtype = dtype_mapping[dtype_str] + x = torch.randn((BLOCK_M, BLOCK_N), device='cuda', dtype=dtype) + y = torch.empty((BLOCK_M, ), device='cuda', dtype=dtype) + + load_reduce_kernel[(1,)](x, y, x.stride(0), x.stride(1), y.stride(0), BLOCK_M, BLOCK_N) + + golden = x.max(dim=1)[0] + torch.set_printoptions(profile='full') + assert_close(y, golden, rtol=1e-2, atol=1e-3, check_dtype=False) diff --git a/python/test/unit/hopper/test_persistent_warp_specialized_fused-attention.py b/python/test/unit/hopper/test_persistent_warp_specialized_fused-attention.py new file mode 100644 index 000000000000..fdde9f2d1fcc --- /dev/null +++ b/python/test/unit/hopper/test_persistent_warp_specialized_fused-attention.py @@ -0,0 +1,395 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +""" +Fused Attention +=============== +persistent warp specialized version of python/tutorials/06-fused-attention.py. +As of now, it only supports non-persistent warp specialized version of _fwd kernel. +""" + +import pytest +import torch + +import triton +import triton.language as tl + + +@triton.autotune( + configs=[ + triton.Config({}, num_warps=4, num_stages=2, enable_warp_specialization=True), + ], + key=['Q', 'K', 'V'], +) +@triton.jit +def _fwd_kernel( + Q, K, V, sm_scale, + L, M, + Out, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + stride_oz, stride_oh, stride_om, stride_on, + Z, H, N_CTX, + BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, +): + start_m = tl.program_id(0) + off_hz = tl.program_id(1) + # initialize offsets + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = tl.arange(0, BLOCK_N) + offs_d = tl.arange(0, BLOCK_DMODEL) + off_q = off_hz * stride_qh + offs_m[:, None] * stride_qm + offs_d[None, :] * stride_qk + off_k = off_hz * stride_qh + offs_n[None, :] * stride_kn + offs_d[:, None] * stride_kk + off_v = off_hz * stride_qh + offs_n[:, None] * stride_qm + offs_d[None, :] * stride_qk + # Initialize pointers to Q, K, V + q_ptrs = Q + off_q + k_ptrs = K + off_k + v_ptrs = V + off_v + # initialize pointer to m and l + m_prev = tl.zeros([BLOCK_M], dtype=tl.float32) - float("inf") + l_prev = tl.zeros([BLOCK_M], dtype=tl.float32) + acc = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + # load q: it will stay in SRAM throughout + q = tl.load(q_ptrs) + # loop over k, v and update accumulator + for start_n in range(0, (start_m + 1) * BLOCK_M, BLOCK_N): + # -- compute qk ---- + k = tl.load(k_ptrs) + qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) + qk += tl.dot(q, k) + qk *= sm_scale + qk = tl.where(offs_m[:, None] >= (start_n + offs_n[None, :]), qk, float("-inf")) + # compute new m + m_curr = tl.maximum(tl.max(qk, 1), m_prev) + # correct old l + l_prev *= tl.exp(m_prev - m_curr) + # attention weights + p = tl.exp(qk - m_curr[:, None]) + l_curr = tl.sum(p, 1) + l_prev + # rescale operands of matmuls + l_rcp = 1. / l_curr + p *= l_rcp[:, None] + acc *= (l_prev * l_rcp)[:, None] + # update acc + p = p.to(Q.dtype.element_ty) + v = tl.load(v_ptrs) + acc += tl.dot(p, v) + # update m_i and l_i + l_prev = l_curr + m_prev = m_curr + # update pointers + k_ptrs += BLOCK_N * stride_kn + v_ptrs += BLOCK_N * stride_vk + # rematerialize offsets to save registers + start_m = tl.program_id(0) + offs_m = start_m * BLOCK_M + tl.arange(0, BLOCK_M) + # write back l and m + l_ptrs = L + off_hz * N_CTX + offs_m + m_ptrs = M + off_hz * N_CTX + offs_m + tl.store(l_ptrs, l_prev) + tl.store(m_ptrs, m_prev) + # initialize pointers to output + offs_n = tl.arange(0, BLOCK_DMODEL) + off_o = off_hz * stride_oh + offs_m[:, None] * stride_om + offs_n[None, :] * stride_on + out_ptrs = Out + off_o + tl.store(out_ptrs, acc) + + +@triton.jit +def _bwd_preprocess( + Out, DO, L, + NewDO, Delta, + BLOCK_M: tl.constexpr, D_HEAD: tl.constexpr, +): + off_m = tl.program_id(0) * BLOCK_M + tl.arange(0, BLOCK_M) + off_n = tl.arange(0, D_HEAD) + # load + o = tl.load(Out + off_m[:, None] * D_HEAD + off_n[None, :]).to(tl.float32) + do = tl.load(DO + off_m[:, None] * D_HEAD + off_n[None, :]).to(tl.float32) + denom = tl.load(L + off_m).to(tl.float32) + # compute + do = do / denom[:, None] + delta = tl.sum(o * do, axis=1) + # write-back + tl.store(NewDO + off_m[:, None] * D_HEAD + off_n[None, :], do) + tl.store(Delta + off_m, delta) + + +@triton.jit +def _bwd_kernel( + Q, K, V, sm_scale, Out, DO, + DQ, DK, DV, + L, M, + D, + stride_qz, stride_qh, stride_qm, stride_qk, + stride_kz, stride_kh, stride_kn, stride_kk, + stride_vz, stride_vh, stride_vk, stride_vn, + Z, H, N_CTX, + num_block, + BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, + BLOCK_N: tl.constexpr, +): + off_hz = tl.program_id(0) + off_z = off_hz // H + off_h = off_hz % H + # offset pointers for batch/head + Q += off_z * stride_qz + off_h * stride_qh + K += off_z * stride_qz + off_h * stride_qh + V += off_z * stride_qz + off_h * stride_qh + DO += off_z * stride_qz + off_h * stride_qh + DQ += off_z * stride_qz + off_h * stride_qh + DK += off_z * stride_qz + off_h * stride_qh + DV += off_z * stride_qz + off_h * stride_qh + for start_n in range(0, num_block): + lo = start_n * BLOCK_M + # initialize row/col offsets + offs_qm = lo + tl.arange(0, BLOCK_M) + offs_n = start_n * BLOCK_M + tl.arange(0, BLOCK_M) + offs_m = tl.arange(0, BLOCK_N) + offs_k = tl.arange(0, BLOCK_DMODEL) + # initialize pointers to value-like data + q_ptrs = Q + (offs_qm[:, None] * stride_qm + offs_k[None, :] * stride_qk) + k_ptrs = K + (offs_n[:, None] * stride_kn + offs_k[None, :] * stride_kk) + v_ptrs = V + (offs_n[:, None] * stride_qm + offs_k[None, :] * stride_qk) + do_ptrs = DO + (offs_qm[:, None] * stride_qm + offs_k[None, :] * stride_qk) + dq_ptrs = DQ + (offs_qm[:, None] * stride_qm + offs_k[None, :] * stride_qk) + # pointer to row-wise quantities in value-like data + D_ptrs = D + off_hz * N_CTX + m_ptrs = M + off_hz * N_CTX + # initialize dv amd dk + dv = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + dk = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + # k and v stay in SRAM throughout + k = tl.load(k_ptrs) + v = tl.load(v_ptrs) + # loop over rows + for start_m in range(lo, num_block * BLOCK_M, BLOCK_M): + offs_m_curr = start_m + offs_m + # load q, k, v, do on-chip + q = tl.load(q_ptrs) + # recompute p = softmax(qk, dim=-1).T + # NOTE: `do` is pre-divided by `l`; no normalization here + qk = tl.dot(q, tl.trans(k)) + qk = tl.where(offs_m_curr[:, None] >= (offs_n[None, :]), qk, float("-inf")) + m = tl.load(m_ptrs + offs_m_curr) + p = tl.exp(qk * sm_scale - m[:, None]) + # compute dv + do = tl.load(do_ptrs) + dv += tl.dot(tl.trans(p.to(Q.dtype.element_ty)), do) + # compute dp = dot(v, do) + Di = tl.load(D_ptrs + offs_m_curr) + dp = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) - Di[:, None] + dp += tl.dot(do, tl.trans(v)) + # compute ds = p * (dp - delta[:, None]) + ds = p * dp * sm_scale + # compute dk = dot(ds.T, q) + dk += tl.dot(tl.trans(ds.to(Q.dtype.element_ty)), q) + # compute dq + dq = tl.load(dq_ptrs) + dq += tl.dot(ds.to(Q.dtype.element_ty), k) + tl.store(dq_ptrs, dq) + # increment pointers + dq_ptrs += BLOCK_M * stride_qm + q_ptrs += BLOCK_M * stride_qm + do_ptrs += BLOCK_M * stride_qm + # write-back + dv_ptrs = DV + (offs_n[:, None] * stride_qm + offs_k[None, :] * stride_qk) + dk_ptrs = DK + (offs_n[:, None] * stride_kn + offs_k[None, :] * stride_kk) + tl.store(dv_ptrs, dv) + tl.store(dk_ptrs, dk) + + +empty = torch.empty(128, device="cuda") + + +class _attention(torch.autograd.Function): + + @staticmethod + def forward(ctx, q, k, v, sm_scale): + BLOCK = 128 + # shape constraints + Lq, Lk, Lv = q.shape[-1], k.shape[-1], v.shape[-1] + assert Lq == Lk and Lk == Lv + assert Lk in {16, 32, 64, 128} + o = torch.empty_like(q) + grid = (triton.cdiv(q.shape[2], BLOCK), q.shape[0] * q.shape[1], 1) + L = torch.empty((q.shape[0] * q.shape[1], q.shape[2]), device=q.device, dtype=torch.float32) + m = torch.empty((q.shape[0] * q.shape[1], q.shape[2]), device=q.device, dtype=torch.float32) + num_warps = 4 if Lk <= 64 else 8 + # Only support num_warps = 4 now + assert num_warps == 4 + + _fwd_kernel[grid]( + q, k, v, sm_scale, + L, m, + o, + q.stride(0), q.stride(1), q.stride(2), q.stride(3), + k.stride(0), k.stride(1), k.stride(2), k.stride(3), + v.stride(0), v.stride(1), v.stride(2), v.stride(3), + o.stride(0), o.stride(1), o.stride(2), o.stride(3), + q.shape[0], q.shape[1], q.shape[2], + BLOCK_M=BLOCK, BLOCK_N=BLOCK, + BLOCK_DMODEL=Lk, + ) + + ctx.save_for_backward(q, k, v, o, L, m) + ctx.grid = grid + ctx.sm_scale = sm_scale + ctx.BLOCK_DMODEL = Lk + return o + + @staticmethod + def backward(ctx, do): + BLOCK = 128 + q, k, v, o, l, m = ctx.saved_tensors + do = do.contiguous() + dq = torch.zeros_like(q, dtype=torch.float32) + dk = torch.empty_like(k) + dv = torch.empty_like(v) + do_scaled = torch.empty_like(do) + delta = torch.empty_like(l) + _bwd_preprocess[(ctx.grid[0] * ctx.grid[1], )]( + o, do, l, + do_scaled, delta, + BLOCK_M=BLOCK, D_HEAD=ctx.BLOCK_DMODEL, + ) + _bwd_kernel[(ctx.grid[1],)]( + q, k, v, ctx.sm_scale, + o, do_scaled, + dq, dk, dv, + l, m, + delta, + q.stride(0), q.stride(1), q.stride(2), q.stride(3), + k.stride(0), k.stride(1), k.stride(2), k.stride(3), + v.stride(0), v.stride(1), v.stride(2), v.stride(3), + q.shape[0], q.shape[1], q.shape[2], + ctx.grid[0], + BLOCK_M=BLOCK, BLOCK_N=BLOCK, + BLOCK_DMODEL=ctx.BLOCK_DMODEL, num_warps=8, + num_stages=1, + ) + return dq, dk, dv, None + + +attention = _attention.apply + + +@pytest.mark.parametrize('Z, H, N_CTX, D_HEAD', [(4, 48, 1024, 64)]) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_op(Z, H, N_CTX, D_HEAD, dtype=torch.float16): + # with ENABLE_TMA=0 and ENABLE_MMA_V3=0 + pytest.skip('unspecified launch failure') + + torch.manual_seed(20) + q = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0.1, std=0.2).requires_grad_() + k = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0.4, std=0.2).requires_grad_() + v = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0.3, std=0.2).requires_grad_() + sm_scale = 0.2 + dout = torch.randn_like(q) + # reference implementation + M = torch.tril(torch.ones((N_CTX, N_CTX), device="cuda")) + p = torch.matmul(q, k.transpose(2, 3)) * sm_scale + for z in range(Z): + for h in range(H): + p[:, :, M == 0] = float("-inf") + p = torch.softmax(p.float(), dim=-1).half() + # p = torch.exp(p) + ref_out = torch.matmul(p, v) + ref_out.backward(dout) + ref_dv, v.grad = v.grad.clone(), None + ref_dk, k.grad = k.grad.clone(), None + ref_dq, q.grad = q.grad.clone(), None + # # triton implementation + tri_out = attention(q, k, v, sm_scale) + # print(ref_out) + # print(tri_out) + tri_out.backward(dout) + tri_dv, v.grad = v.grad.clone(), None + tri_dk, k.grad = k.grad.clone(), None + tri_dq, q.grad = q.grad.clone(), None + # compare + assert torch.allclose(ref_out, tri_out, atol=1e-2, rtol=0) + assert torch.allclose(ref_dv, tri_dv, atol=1e-2, rtol=0) + assert torch.allclose(ref_dk, tri_dk, atol=1e-2, rtol=0) + assert torch.allclose(ref_dq, tri_dq, atol=1e-2, rtol=0) + + +try: + from flash_attn.flash_attn_interface import flash_attn_func + HAS_FLASH = True +except BaseException: + HAS_FLASH = False + +BATCH, N_HEADS, N_CTX, D_HEAD = 4, 48, 4096, 64 +# vary seq length for fixed head and batch=4 +configs = [triton.testing.Benchmark( + x_names=['N_CTX'], + # x_vals=[2**i for i in range(10, 14)], + x_vals=[2**i for i in range(10, 11)], + line_arg='provider', + line_vals=['triton'] + (['flash'] if HAS_FLASH else []), + line_names=['Triton'] + (['Flash'] if HAS_FLASH else []), + styles=[('red', '-'), ('blue', '-')], + ylabel='ms', + plot_name=f'fused-attention-batch{BATCH}-head{N_HEADS}-d{D_HEAD}-{mode}', + args={'H': N_HEADS, 'BATCH': BATCH, 'D_HEAD': D_HEAD, 'dtype': torch.float16, 'mode': mode} + # ) for mode in ['fwd', 'bwd']] +) for mode in ['fwd']] + + +@triton.testing.perf_report(configs) +def bench_flash_attention(BATCH, H, N_CTX, D_HEAD, mode, provider, dtype=torch.float16, device="cuda"): + assert mode in ['fwd', 'bwd'] + # warmup = 25 + # rep = 100 + warmup = 0 + rep = 1 + if provider == "triton": + q = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + k = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + v = torch.randn((BATCH, H, N_CTX, D_HEAD), dtype=dtype, device="cuda", requires_grad=True) + sm_scale = 1.3 + fn = lambda: attention(q, k, v, sm_scale) + if mode == 'bwd': + o = fn() + do = torch.randn_like(o) + fn = lambda: o.backward(do, retain_graph=True) + ms = triton.testing.do_bench(fn, warmup=warmup, rep=rep) + return ms + if provider == "flash": + lengths = torch.full((BATCH,), fill_value=N_CTX, device=device) + cu_seqlens = torch.zeros( + (BATCH + 1,), device=device, dtype=torch.int32) + cu_seqlens[1:] = lengths.cumsum(0) + qkv = torch.randn((BATCH * N_CTX, 3, H, D_HEAD), dtype=dtype, device=device, requires_grad=True) + fn = lambda: flash_attn_func(qkv, cu_seqlens, 0., N_CTX, causal=True) + if mode == 'bwd': + o = fn() + do = torch.randn_like(o) + fn = lambda: o.backward(do, retain_graph=True) + ms = triton.testing.do_bench(fn, warmup=warmup, rep=rep) + return ms + + +# # only works on post-Ampere GPUs right now +# bench_flash_attention.run(save_path='.', print_data=True) diff --git a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py new file mode 100644 index 000000000000..21fd0a5a61b0 --- /dev/null +++ b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py @@ -0,0 +1,987 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +import itertools + +import pytest +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl +from .utils import get_proper_err, get_variant_golden + + +def isMMAV3OrTMAEnabled(): + import os + for k in ('ENABLE_MMA_V3', 'ENABLE_TMA'): + if os.environ.get(k, '0').lower() in ['1', 'on', 'true']: + return True + return False + + +@triton.jit +def static_persistent_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + NUM_SM: tl.constexpr, +): + start_tile = tl.program_id(axis=0) + m_tiles = tl.cdiv(M, BLOCK_M) + n_tiles = tl.cdiv(N, BLOCK_N) + num_tiles = m_tiles * n_tiles + offs_k = tl.arange(0, BLOCK_K) + + for tile_id in range(start_tile, num_tiles, NUM_SM): + pid_m = tile_id // n_tiles + pid_n = tile_id % n_tiles + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + offs_am = (pid_m * BLOCK_M + tl.arange(0, BLOCK_M)) % M + offs_bn = (pid_n * BLOCK_N + tl.arange(0, BLOCK_N)) % N + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_ptrs) + b = tl.load(b_ptrs) + accumulator += tl.dot(a, b) + a_ptrs += BLOCK_K * stride_ak + b_ptrs += BLOCK_K * stride_bk + + offs_cm = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_cn = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_cm[:, None] * stride_cm + offs_cn[None, :] * stride_cn + tl.store(c_ptrs, accumulator) + + +@triton.jit +def static_persistent_tma_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + NUM_SM: tl.constexpr, +): + start_tile = tl.program_id(axis=0) + m_tiles = tl.cdiv(M, BLOCK_M) + n_tiles = tl.cdiv(N, BLOCK_N) + k_tiles = tl.cdiv(K, BLOCK_K) + num_tiles = m_tiles * n_tiles + + pre_pid_m = start_tile // n_tiles + pre_pid_n = start_tile % n_tiles + + block_offset_m = pre_pid_m * BLOCK_M + block_offset_n = pre_pid_n * BLOCK_N + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + for tile_id in range(start_tile, num_tiles, NUM_SM): + pid_m = tile_id // n_tiles + pid_n = tile_id % n_tiles + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + if tile_id >= NUM_SM: + a_tile_ptr = tl.advance(a_tile_ptr, [(pid_m - pre_pid_m) * BLOCK_M, -k_tiles * BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [-k_tiles * BLOCK_K, (pid_n - pre_pid_n) * BLOCK_N]) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_tile_ptr) + b = tl.load(b_tile_ptr) + accumulator += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_K, 0]) + + offs_m = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_n = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_m[:, None] * stride_cm + offs_n[None, :] * stride_cn + tl.store(c_ptrs, accumulator) + pre_pid_m = pid_m + pre_pid_n = pid_n + + +@pytest.mark.parametrize('M,N,K,BLOCK_M,BLOCK_N,BLOCK_K,NUM_WARPS,NUM_CTAS,TRANS_A,TRANS_B', [ + [4096, 4096, 64, 64, 64, 16, 4, 1, False, True], + [4096, 4096, 64, 64, 64, 32, 4, 1, False, True], + [4096, 4096, 64, 256, 64, 16, 4, 1, False, True], + [4096, 4096, 64, 128, 128, 16, 4, 1, False, True], + # TODO: fix issue for 8-warp persistent kernel + # [4096, 4096, 64, 128, 128, 16, 8, 1, False, True], + # [4096, 4096, 64, 128, 256, 16, 8, 1, False, True], +]) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_user_defined_persistent_non_warp_specialized_gemm(M, N, K, BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, TRANS_A, TRANS_B): + # TODO: fix RewriteTensorPtrPass + pytest.skip('RewriteTensorPtrPass issue') + + if (TRANS_A): + a = .1 * torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = .1 * torch.randn((M, K), device='cuda', dtype=torch.float16) + + if (TRANS_B): + b = .1 * torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = .1 * torch.randn((K, N), device='cuda', dtype=torch.float16) + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + num_SMs = torch.cuda.get_device_properties('cuda').multi_processor_count + grid = lambda META: (num_SMs,) + + def call_vintage(): + static_persistent_matmul_kernel[grid](a_ptr=a, b_ptr=b, c_ptr=c, M=M, N=N, K=K, stride_am=a.stride(0), stride_ak=a.stride(1), stride_bk=b.stride(0), stride_bn=b.stride(1), stride_cm=c.stride(0), stride_cn=c.stride(1), BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N, BLOCK_K=BLOCK_K, NUM_SM=num_SMs, num_warps=NUM_WARPS, num_ctas=NUM_CTAS) + return c + + def call_stylish(): + static_persistent_tma_matmul_kernel[grid](a_ptr=a, b_ptr=b, c_ptr=c, M=M, N=N, K=K, stride_am=a.stride(0), stride_ak=a.stride(1), stride_bk=b.stride(0), stride_bn=b.stride(1), stride_cm=c.stride(0), stride_cn=c.stride(1), BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N, BLOCK_K=BLOCK_K, NUM_SM=num_SMs, num_warps=NUM_WARPS, num_ctas=NUM_CTAS) + return c + + th_c = torch.matmul(a, b) + + # Test using old style of ptr calculation + tt_c = call_vintage() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + # Cealr c + c = torch.randn((M, N), device=a.device, dtype=torch.float32) + + # Test using make_block_ptr + tt_c = call_stylish() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + +@triton.jit +def warp_specialized_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, +): + tid = tl.program_id(axis=0) + n_tiles = tl.cdiv(N, BLOCK_N) + pid_m = tid // n_tiles + pid_n = tid % n_tiles + + offs_k = tl.arange(0, BLOCK_K) + rm = pid_m * BLOCK_M + tl.arange(0, BLOCK_M) + rn = pid_n * BLOCK_N + tl.arange(0, BLOCK_N) + offs_am = tl.max_contiguous(tl.multiple_of(rm % M, BLOCK_M), BLOCK_M) + offs_bn = tl.max_contiguous(tl.multiple_of(rn % N, BLOCK_N), BLOCK_N) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_ptrs) + b = tl.load(b_ptrs) + accumulator += tl.dot(a, b) + a_ptrs += BLOCK_K * stride_ak + b_ptrs += BLOCK_K * stride_bk + accumulator = accumulator.to(c_ptr.dtype.element_ty) + + offs_cm = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_cn = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_cm[:, None] * stride_cm + offs_cn[None, :] * stride_cn + mask = (offs_cm < M)[:, None] & (offs_cn < N)[None, :] + tl.store(c_ptrs, accumulator, mask=mask) + + +@triton.jit +def tma_warp_specialized_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, +): + tid = tl.program_id(axis=0) + n_tiles = tl.cdiv(N, BLOCK_N) + pid_m = tid // n_tiles + pid_n = tid % n_tiles + + block_offset_m = pid_m * BLOCK_M + block_offset_n = pid_n * BLOCK_N + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_tile_ptr) + b = tl.load(b_tile_ptr) + accumulator += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_K, 0]) + accumulator = accumulator.to(c_ptr.dtype.element_ty) + + offs_cm = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_cn = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_cm[:, None] * stride_cm + offs_cn[None, :] * stride_cn + mask = (offs_cm < M)[:, None] & (offs_cn < N)[None, :] + tl.store(c_ptrs, accumulator, mask=mask) + + +@pytest.mark.parametrize('M,N,K,BLOCK_M,BLOCK_N,BLOCK_K,NUM_CTAS,TRANS_A,TRANS_B', [ + [2048, 2048, 64, 64, 64, 16, 1, False, True], + [4096, 4096, 64, 64, 64, 16, 1, False, True], + [128, 4096, 64, 64, 64, 16, 1, False, True], + [4096, 128, 64, 64, 64, 16, 1, False, True], + [4096, 4096, 64, 64, 64, 32, 1, False, True], + [4096, 4096, 256, 128, 128, 16, 1, False, True], + [4096, 4096, 320, 128, 64, 64, 1, False, True], + [4096, 4096, 320, 64, 128, 64, 1, False, True], + [4096, 4096, 320, 128, 128, 64, 1, False, True], + [4096, 4096, 256, 256, 64, 16, 1, False, True], + [4096, 4096, 256, 256, 64, 64, 1, False, True], + [4096, 4096, 256, 64, 256, 16, 1, False, True], + [4096, 4096, 256, 64, 256, 64, 1, False, True], + [4096, 4096, 256, 256, 128, 16, 1, False, True], + [4096, 4096, 256, 256, 128, 64, 1, False, True], + [4096, 4096, 256, 128, 256, 16, 1, False, True], + [4096, 4096, 256, 128, 256, 64, 1, False, True], + # numCTAs > 1 + [2048, 2048, 64, 128, 128, 64, 2, False, True], + [2048, 2048, 64, 128, 128, 64, 2, False, True], + [2048, 2048, 128, 256, 128, 64, 4, False, True], + [4096, 4096, 128, 256, 128, 64, 4, False, True], + [4096, 4096, 256, 128, 256, 64, 4, False, True], + [4096, 4096, 256, 256, 256, 64, 4, False, True], +]) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_non_persistent_warp_specialized_gemm(M, N, K, BLOCK_M, BLOCK_N, BLOCK_K, NUM_CTAS, TRANS_A, TRANS_B): + pytest.skip('hang') + + if (TRANS_A): + a = .1 * torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = .1 * torch.randn((M, K), device='cuda', dtype=torch.float16) + + if (TRANS_B): + b = .1 * torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = .1 * torch.randn((K, N), device='cuda', dtype=torch.float16) + + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + grid = lambda META: (triton.cdiv(M, BLOCK_M) * triton.cdiv(N, BLOCK_N),) + + def call_vintage(): + warp_specialized_matmul_kernel[grid]( + a, b, c, + M, N, K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0), c.stride(1), + BLOCK_M, BLOCK_N, BLOCK_K, + num_warps=4, + num_ctas=NUM_CTAS, + enable_warp_specialization=True) + return c + + def call_stylish(): + tma_warp_specialized_matmul_kernel[grid]( + a, b, c, + M, N, K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0), c.stride(1), + BLOCK_M, BLOCK_N, BLOCK_K, + num_warps=4, + num_ctas=NUM_CTAS, + enable_warp_specialization=True) + return c + + th_c = torch.matmul(a, b) + + # Test using old style of ptr calculation + tt_c = call_vintage() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + # Cealr c + c = torch.randn((M, N), device=a.device, dtype=torch.float32) + + # # Test using make_block_ptr + tt_c = call_stylish() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + # # #############################################Performance Evaluation############################################# + # fn = lambda: call_vintage() + # ms = triton.testing.do_bench(fn, warmup=25, rep=100) + # cur_gpu_perf = round(2. * M * N * K / ms * 1e-9, 2) + # print(' '.join(['Performance of', str(M), str(N), str(K), ':', str(ms), 'ms, ', str(cur_gpu_perf), 'TFLOPS'])) + + +@triton.autotune( + configs=[ + triton.Config({}, num_stages=3, num_warps=4, enable_warp_specialization=True), + # triton.Config({}, num_stages=3, num_warps=4, enable_warp_specialization=False), + ], + key=['M', 'N', 'K'], +) +@triton.jit +def static_persistent_warp_specialized_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + NUM_SM: tl.constexpr, +): + start_tile = tl.program_id(axis=0) + m_tiles = tl.cdiv(M, BLOCK_M) + n_tiles = tl.cdiv(N, BLOCK_N) + num_tiles = m_tiles * n_tiles + offs_k = tl.arange(0, BLOCK_K) + + for tile_id in range(start_tile, num_tiles, NUM_SM): + pid_m = tile_id // n_tiles + pid_n = tile_id % n_tiles + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + offs_am = (pid_m * BLOCK_M + tl.arange(0, BLOCK_M)) % M + offs_bn = (pid_n * BLOCK_N + tl.arange(0, BLOCK_N)) % N + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_ptrs) + b = tl.load(b_ptrs) + accumulator += tl.dot(a, b) + a_ptrs += BLOCK_K * stride_ak + b_ptrs += BLOCK_K * stride_bk + + offs_cm = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_cn = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_cm[:, None] * stride_cm + offs_cn[None, :] * stride_cn + tl.store(c_ptrs, accumulator) + + +@triton.autotune( + configs=[ + triton.Config({}, num_stages=3, num_warps=4, enable_warp_specialization=True), + # triton.Config({}, num_stages=3, num_warps=4, enable_warp_specialization=False), + ], + key=['M', 'N', 'K'], +) +@triton.jit +def static_persistent_tma_warp_specialized_matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + NUM_SM: tl.constexpr, +): + start_tile = tl.program_id(axis=0) + m_tiles = tl.cdiv(M, BLOCK_M) + n_tiles = tl.cdiv(N, BLOCK_N) + k_tiles = tl.cdiv(K, BLOCK_K) + num_tiles = m_tiles * n_tiles + + pre_pid_m = start_tile // n_tiles + pre_pid_n = start_tile % n_tiles + + block_offset_m = pre_pid_m * BLOCK_M + block_offset_n = pre_pid_n * BLOCK_N + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + for tile_id in range(start_tile, num_tiles, NUM_SM): + pid_m = tile_id // n_tiles + pid_n = tile_id % n_tiles + accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + if tile_id >= NUM_SM: + a_tile_ptr = tl.advance(a_tile_ptr, [(pid_m - pre_pid_m) * BLOCK_M, -k_tiles * BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [-k_tiles * BLOCK_K, (pid_n - pre_pid_n) * BLOCK_N]) + + for k in range(0, K, BLOCK_K): + a = tl.load(a_tile_ptr) + b = tl.load(b_tile_ptr) + accumulator += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_K, 0]) + + offs_m = tl.arange(0, BLOCK_M) + pid_m * BLOCK_M + offs_n = tl.arange(0, BLOCK_N) + pid_n * BLOCK_N + + c_ptrs = c_ptr + offs_m[:, None] * stride_cm + offs_n[None, :] * stride_cn + tl.store(c_ptrs, accumulator) + pre_pid_m = pid_m + pre_pid_n = pid_n + + +@pytest.mark.parametrize('M,N,K,BLOCK_M,BLOCK_N,BLOCK_K,NUM_CTAS,TRANS_A,TRANS_B', [ + [2048, 2048, 64, 64, 64, 16, 1, False, True], + [4096, 4096, 64, 64, 64, 16, 1, False, True], + [128, 4096, 64, 64, 64, 16, 1, False, True], + [4096, 128, 64, 64, 64, 16, 1, False, True], + [4096, 4096, 64, 64, 64, 32, 1, False, True], + [4096, 4096, 256, 128, 128, 16, 1, False, True], + [4096, 4096, 320, 128, 64, 64, 1, False, True], + [4096, 4096, 320, 64, 128, 64, 1, False, True], + [4096, 4096, 320, 128, 128, 64, 1, False, True], + [4096, 4096, 256, 256, 64, 16, 1, False, True], + [4096, 4096, 256, 256, 64, 64, 1, False, True], + [4096, 4096, 256, 64, 256, 16, 1, False, True], + [4096, 4096, 256, 64, 256, 64, 1, False, True], + [4096, 4096, 256, 256, 128, 16, 1, False, True], + [4096, 4096, 256, 256, 128, 64, 1, False, True], + [4096, 4096, 256, 128, 256, 16, 1, False, True], + [4096, 4096, 256, 128, 256, 64, 1, False, True], +]) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_user_defined_persistent_warp_specialized_gemm(M, N, K, BLOCK_M, BLOCK_N, BLOCK_K, NUM_CTAS, TRANS_A, TRANS_B): + # TODO: fix RewriteTensorPtrPass + pytest.skip('RewriteTensorPtrPass issue') + if (TRANS_A): + a = .1 * torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = .1 * torch.randn((M, K), device='cuda', dtype=torch.float16) + + if (TRANS_B): + b = .1 * torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = .1 * torch.randn((K, N), device='cuda', dtype=torch.float16) + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + num_SMs = torch.cuda.get_device_properties('cuda').multi_processor_count + grid = lambda META: (num_SMs,) + + def call_vintage(): + static_persistent_warp_specialized_matmul_kernel[grid]( + a, b, c, + M, N, K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0), c.stride(1), + BLOCK_M, BLOCK_N, BLOCK_K, num_SMs) + return c + + def call_stylish(): + static_persistent_tma_warp_specialized_matmul_kernel[grid]( + a, b, c, + M, N, K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0), c.stride(1), + BLOCK_M, BLOCK_N, BLOCK_K, num_SMs) + return c + + th_c = torch.matmul(a, b) + + # Test using old style of ptr calculation + tt_c = call_vintage() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + # Cealr c + c = torch.randn((M, N), device=a.device, dtype=torch.float32) + + # Test using make_block_ptr + tt_c = call_stylish() + torch.testing.assert_allclose(th_c, tt_c, atol=1e-2, rtol=0) + + # #############################################Performance Evaluation############################################# + # fn = lambda: call_stylish() + # ms = triton.testing.do_bench(fn, warmup=25, rep=100) + # cur_gpu_perf = round(2. * M * N * K / ms * 1e-9, 2) + # print(' '.join(['Performance of', str(M), str(N), str(K), ':', str(ms), 'ms, ', str(cur_gpu_perf), 'TFLOPS'])) + + +@triton.jit +def static_persistent_matmul_no_scf_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + FLOAT16_OUTPUT: tl.constexpr, USE_TMA_EPILOGUE: tl.constexpr, + NUM_SM: tl.constexpr, USE_TMA_LOAD: tl.constexpr, +): + start_tile = tl.program_id(axis=0) + m_tiles = tl.cdiv(M, BLOCK_M) + n_tiles = tl.cdiv(N, BLOCK_N) + num_tiles = m_tiles * n_tiles + offs_k = tl.arange(0, BLOCK_K) + pre_pid_m = start_tile // n_tiles + pre_pid_n = start_tile % n_tiles + block_offset_m = pre_pid_m * BLOCK_M + block_offset_n = pre_pid_n * BLOCK_N + + if USE_TMA_LOAD: + a_block_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_block_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + if USE_TMA_EPILOGUE: + c_block_ptr = tl.make_block_ptr(base=c_ptr, shape=(M, N), strides=(stride_cm, stride_cn), + offsets=(block_offset_m, block_offset_n), block_shape=(BLOCK_M, BLOCK_N), order=(1, 0)) + + for tile_id in range(start_tile, num_tiles, NUM_SM): + pid_m = tile_id // n_tiles + pid_n = tile_id % n_tiles + + if USE_TMA_LOAD: + a_block_ptr = tl.advance(a_block_ptr, [(pid_m - pre_pid_m) * BLOCK_M, 0]) + b_block_ptr = tl.advance(b_block_ptr, [0, (pid_n - pre_pid_n) * BLOCK_N]) + a = tl.load(a_block_ptr) + b = tl.load(b_block_ptr) + else: + offs_am = pid_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_bn = pid_n * BLOCK_N + tl.arange(0, BLOCK_N) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + a = tl.load(a_ptrs) + b = tl.load(b_ptrs) + + c = tl.dot(a, b) + + if FLOAT16_OUTPUT: + c = c.to(tl.float16) + + if USE_TMA_EPILOGUE: + c_block_ptr = tl.advance(c_block_ptr, [(pid_m - pre_pid_m) * BLOCK_M, (pid_n - pre_pid_n) * BLOCK_N]) + tl.store(c_block_ptr, c) + else: + offs_m = pid_m * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = pid_n * BLOCK_N + tl.arange(0, BLOCK_N) + c_ptrs = c_ptr + offs_m[:, None] * stride_cm + offs_n[None, :] * stride_cn + tl.store(c_ptrs, c) + + pre_pid_m = pid_m + pre_pid_n = pid_n + + +@pytest.mark.parametrize('M,N,K,NUM_CTAS,NUM_WARPS,TRANS_A,TRANS_B,OUTPUT_TYPE,USE_TMA_EPILOGUE,USE_TMA_LOAD', + itertools.chain( + *[ + [ + # numCTAs = 1, no TMA multicast: + [64, 16, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [64, 32, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [64, 64, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [64, 64, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [64, 64, 32, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [64, 64, 64, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [128, 128, 16, 1, 4, False, True, "float16", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [128, 128, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + # small M, N + [16, 16, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [16, 32, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [32, 16, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + [32, 32, 16, 1, 4, False, True, "float32", USE_TMA_EPILOGUE, USE_TMA_LOAD], + ] for USE_TMA_EPILOGUE in [True, False] + for USE_TMA_LOAD in [True, False] + ])) +@pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") +def test_static_persistent_matmul_no_scf_kernel(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_TYPE, USE_TMA_EPILOGUE, USE_TMA_LOAD): + if isMMAV3OrTMAEnabled(): + pytest.skip("known failure") + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + + if OUTPUT_TYPE == "float16": + c = torch.empty((M, N), device=a.device, dtype=torch.float16) + else: + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + num_SMs = torch.cuda.get_device_properties('cuda').multi_processor_count + + # TODO: set `enable_warp_specialization=False` will lead to compilation error. + static_persistent_matmul_no_scf_kernel[(num_SMs,)](a_ptr=a, b_ptr=b, c_ptr=c, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_cm=c.stride(0), stride_cn=c.stride(1), + BLOCK_M=M if M < 128 else M // 2, BLOCK_N=N if N < 128 else N // 2, BLOCK_K=K, NUM_SM=num_SMs, + num_warps=NUM_WARPS, + num_ctas=NUM_CTAS, + FLOAT16_OUTPUT=(OUTPUT_TYPE == "float16"), + USE_TMA_EPILOGUE=USE_TMA_EPILOGUE, + USE_TMA_LOAD=USE_TMA_LOAD, + enable_warp_specialization=True) + a_f32 = a.to(torch.float32) + b_f32 = b.to(torch.float32) + golden = torch.matmul(a_f32, b_f32) + golden_variant = get_variant_golden(a_f32, b_f32) + golden_abs_err, golden_rel_err = get_proper_err(golden, golden_variant) + torch.set_printoptions(profile="full") + assert_close( + c, + golden, + rtol=max(1e-2, 1.1 * golden_rel_err), + atol=max(1e-3, 1.1 * golden_abs_err), + check_dtype=False) + + +@triton.jit +def full_static_persistent_matmul_kernel( + a_ptr, b_ptr, w_ptr, bias_ptr, z_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_wm, stride_wn, + stride_zm, stride_zn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, + out_dtype: tl.constexpr, USE_TMA_STORE: tl.constexpr, + ADD_MATRIX: tl.constexpr, ADD_ROWS: tl.constexpr, ADD_COLS: tl.constexpr, + DO_SOFTMAX: tl.constexpr, CHAIN_DOT: tl.constexpr, + A_ORDER_0: tl.constexpr, A_ORDER_1: tl.constexpr, + B_ORDER_0: tl.constexpr, B_ORDER_1: tl.constexpr, + NUM_SM: tl.constexpr +): + start_pid = tl.program_id(axis=0) + num_pid_n = tl.cdiv(N, BLOCK_N) + num_pid_m = tl.cdiv(M, BLOCK_M) + num_tiles = num_pid_m * num_pid_n + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = start_pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pre_pid_m = first_pid_m + ((start_pid % num_pid_in_group) % group_size_m) + pre_pid_n = (start_pid % num_pid_in_group) // group_size_m + + pre_block_offset_m = pre_pid_m * BLOCK_M + pre_block_offset_n = pre_pid_n * BLOCK_N + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(pre_block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(A_ORDER_0, A_ORDER_1)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, pre_block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(B_ORDER_0, B_ORDER_1)) + w_tile_ptr = tl.make_block_ptr(base=w_ptr, shape=(N, N), strides=(stride_wm, stride_wn), + offsets=(0, pre_block_offset_n), block_shape=(BLOCK_N, BLOCK_N), order=(0, 1)) + + if USE_TMA_STORE: + z_block_ptr = tl.make_block_ptr(base=z_ptr, shape=(M, N), strides=(stride_zm, stride_zn), + offsets=(pre_block_offset_m, pre_block_offset_n), block_shape=(BLOCK_M, BLOCK_N), order=(1, 0)) + + for tile_id in range(start_pid, num_tiles, NUM_SM): + group_id = tile_id // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + ((tile_id % num_pid_in_group) % group_size_m) + pid_n = (tile_id % num_pid_in_group) // group_size_m + block_offset_m = pid_m * BLOCK_M + block_offset_n = pid_n * BLOCK_N + + offs_m = block_offset_m + tl.arange(0, BLOCK_M) + offs_n = block_offset_n + tl.arange(0, BLOCK_N) + z_ptrs = z_ptr + offs_m[:, None] * stride_zm + offs_n[None, :] * stride_zn + bias_ptrs = bias_ptr + offs_m[:, None] * stride_zm + offs_n[None, :] * stride_zn + mask = (offs_m < M)[:, None] & (offs_n < N)[None, :] + + # TODO: lib/Dialect/TritonGPU/Transforms/RewriteTensorPointer.cpp does not support scf.if yet. + # if tile_id >= NUM_SM: + # a_tile_ptr = tl.advance(a_tile_ptr, [(pid_m - pre_pid_m) * BLOCK_M, -tl.cdiv(K, BLOCK_K) * BLOCK_K]) + # b_tile_ptr = tl.advance(b_tile_ptr, [-tl.cdiv(K, BLOCK_K) * BLOCK_K, (pid_n - pre_pid_n) * BLOCK_N]) + + a_tile_ptr = tl.advance(a_tile_ptr, [(pid_m - pre_pid_m) * BLOCK_M, 0]) + b_tile_ptr = tl.advance(b_tile_ptr, [0, (pid_n - pre_pid_n) * BLOCK_N]) + z = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) + for k in range(0, K, BLOCK_K): + a = tl.load(a_tile_ptr, boundary_check=(0, 1)) + b = tl.load(b_tile_ptr, boundary_check=(0, 1)) + z += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_K, 0]) + a_tile_ptr = tl.advance(a_tile_ptr, [0, -tl.cdiv(K, BLOCK_K) * BLOCK_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [-tl.cdiv(K, BLOCK_K) * BLOCK_K, 0]) + + if (out_dtype == tl.constexpr(tl.float16)): + z = z.to(tl.float16) + + if ADD_MATRIX: + z += tl.load(bias_ptrs, mask=mask) + if ADD_ROWS: + ZRs = bias_ptr + offs_m * stride_zm + z += tl.load(ZRs)[:, None] + if ADD_COLS: + ZCs = bias_ptr + offs_n * stride_zn + z += tl.load(ZCs)[None, :] + if DO_SOFTMAX: + max = tl.max(z, 1) + z = z - max[:, None] + num = tl.exp(z.to(tl.float32)).to(max.dtype) + den = tl.sum(num, 1) + z = num / den[:, None] + if CHAIN_DOT: + w = tl.load(w_tile_ptr) + w_tile_ptr = tl.advance(w_tile_ptr, [0, (pid_n - pre_pid_n) * BLOCK_N]) + z = tl.dot(z.to(w.dtype), w) + if (out_dtype == tl.constexpr(tl.float16)): + z = z.to(tl.float16) + + if USE_TMA_STORE: + z_block_ptr = tl.advance(z_block_ptr, [(pid_m - pre_pid_m) * BLOCK_M, (pid_n - pre_pid_n) * BLOCK_N]) + tl.store(z_block_ptr, z, boundary_check=(0, 1)) + else: + tl.store(z_ptrs, z, mask=mask) + + pre_pid_m = pid_m + pre_pid_n = pid_n + + +@pytest.mark.parametrize('BLOCK_M,BLOCK_N,BLOCK_K,NUM_WARPS,NUM_CTAS,M,N,K,TRANS_A,TRANS_B,epilogue,out_dtype,USE_TMA_STORE,NUM_STAGES,ENABLE_WS', + [ + (128, 128, 64, 4, 1, *shape_w_c, 'none', out_dtype, use_tma_store, 3, enable_ws) + for shape_w_c in [ + # bad from cublas-important-layers + [4096, 1, 1024, False, False], + [2048, 204, 1000, True, False], + ] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for enable_ws in [True] + ] + [ + (*shape_w_c, trans_a, trans_b, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + # softmax works for one CTA + for shape_w_c in [ + [64, 64, 16, 4, 1, 64, 64, 64], + [128, 128, 64, 4, 1, None, None, None], + [16, 16, 64, 4, 1, 16, 16, 64], + # TODO: enable when num_warps != 4 is supported. + # [64, 64, 32, 8, 1, 64, 64, 64], + [128, 128, 64, 4, 1, 128, 128, 128], + ] + for epilogue in ['softmax'] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for num_stages in [3] + for enable_ws in [True] + ] + [ + (*shape_w_c, trans_a, trans_b, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + for shape_w_c in [ + [64, 64, 32, 4, 1, 128, 256, 64], + # TODO: enable when num_ctas != 1 is supported. + # [128, 128, 16, 4, 4, 512, 256, 64], + # [128, 256, 32, 4, 8, 256, 256, 192], + # [512, 256, 32, 4, 8, 1024, 256, 192], + # BLOCK_K >= 128 + [64, 128, 128, 4, 1, 512, 256, 256], + [128, 128, 128, 4, 1, 256, 256, 192], + # TODO: enable when num_ctas != 1 is supported. + # [128, 128, 128, 4, 2, 256, 256, 192], + # small BLOCK_M and BLOCK_K + [16, 32, 32, 4, 1, 128, 256, 64], + [32, 32, 16, 4, 1, 256, 256, 192], + # TODO: enable when num_ctas != 1 is supported. + # [16, 32, 64, 4, 4, 512, 256, 64], + ] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for num_stages in [3] + for enable_ws in [True] + ] + [(*shape_w_c, trans_a, trans_b, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + for shape_w_c in [ + [64, 64, 16, 4, 1, 128, 128, 64], + *[[256, 64, 16, num_warps, num_ctas, 256, 256, 64] for num_warps in [4] for num_ctas in [1]], + # for chain-dot + [128, 128, 64, 4, 1, None, None, None], + [64, 64, 16, 4, 1, None, None, None], + # small BLOCK_M and BLOCK_K + [16, 16, 64, 4, 1, 128, 128, 64], + *[[16, 32, 64, num_warps, num_ctas, 256, 256, 256] for num_warps in [4] for num_ctas in [1]], + # # TODO: enable when num_warps != 4 is supported. + # # repeat + # # [64, 64, 32, 8, 1, 128, 256, 64], + # # [64, 64, 16, 8, 2, 128, 128, 64], + # irregular shape + [128, 128, 64, 4, 1, 500, 200, 128], + [128, 128, 64, 4, 1, 513, 193, 192], + ] + for epilogue in ['none', 'add-matrix', 'add-rows', 'add-cols', 'chain-dot'] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for trans_a in [False, True] + for trans_b in [False, True] + for num_stages in [3] + for enable_ws in [True] + if not (epilogue == 'chain-dot' and (shape_w_c[5] is not None or shape_w_c[0] != shape_w_c[1])) + ] + [ + (64, n, 16, 4, 1, 512, 256, 256, False, True, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + # loop over instr shapes + for n in [16, 32, 64, 128, 256] + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for num_stages in [2, 4, 5, 7] + for enable_ws in [True] + ] + [ + (*shape_w_c, *shape, False, True, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + # irregular shapes + for shape_w_c in [ + [128, 128, 64, 4, 1] + # [256, 128, 64, 4, 2], + # [128, 128, 128, 4, 2], + ] + for shape in list(itertools.product([*range(512, 4096, 360)], [*range(512, 4096, 360)], [512, 1024])) + for out_dtype in ['float16', 'float32'] + for use_tma_store in [False, True] + for num_stages in [2, 3, 4] + for enable_ws in [True] + ] + ) +@pytest.mark.skipif(torch.cuda.get_device_capability() + [0] < 9, reason="Requires compute capability >= 9") +def test_full_static_persistent_matmul_kernel(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B, epilogue, out_dtype, USE_TMA_STORE, NUM_STAGES, ENABLE_WS): + pytest.skip("known failure, will fix it later!!!") + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, epilogue, out_dtype, USE_TMA_STORE, NUM_STAGES, ENABLE_WS])) in [ + '128-128-128-4-1-256-256-192-none-float32-True-3-True', + ]: + pytest.skip('out of resource: shared memory, Required: 263168') + + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, USE_TMA_STORE, ENABLE_WS])) in ([ + '64-16-16-4-1-512-256-256-True-True', + ] + [ + f'128-128-64-4-1-{m}-{n}-{k}-True-True' for m in range(512, 4096, 360) for n in range(512, 4096, 360) for k in [512, 1024] + ]): + pytest.skip('known kernel hang problem when tma store is enabled') + + if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B])) in [ + '16-32-64-4-4-512-256-64-True-False', + '16-32-64-4-4-512-256-64-True-True', + '16-32-64-4-4-512-256-64-False-False', + '16-32-64-4-4-512-256-64-False-True', + ]: + pytest.skip('shapePerCTA[1] < 16 not supported') + + if epilogue == 'chain-dot': + pytest.skip('known failure: Assertion !region.empty() && unexpected empty region.') + + M = BLOCK_M if M is None else M + N = BLOCK_N if N is None else N + K = BLOCK_K if K is None else K + + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + a_order = [0, 1] + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + a_order = [1, 0] + + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + b_order = [0, 1] + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + b_order = [1, 0] + + if out_dtype == 'float16' and epilogue != 'softmax': + # TODO: for out_dtype == 'float16' and epilogue == 'softmax', it will + # fail with the following error: 'llvm.fmul' op requires the same type + # for all operands and results + out_dtype = tl.float16 + torch_out_dtype = torch.float16 + else: + out_dtype = tl.float32 + torch_out_dtype = torch.float32 + + # avoid out of memory + if epilogue in ['add-matrix', 'add-rows', 'add-cols']: + bias = torch.randn((M, N), device='cuda', dtype=torch_out_dtype) + else: + bias = torch.randn((1, 1), device='cuda', dtype=torch_out_dtype) + + if epilogue == 'chain-dot': + w = torch.randn((N, N), device='cuda', dtype=torch.float16).T + else: + w = torch.randn((1, 1), device='cuda', dtype=torch.float16).T + + z = torch.full((M, N), 1., device='cuda', dtype=torch_out_dtype) + + # torch result + a_f32 = a.to(torch.float32) + b_f32 = b.to(torch.float32) + dot = torch.matmul(a_f32, b_f32) + + def process_epilogue(d, bias, w, epilogue): + if epilogue == 'add-matrix': + ref = d + bias + elif epilogue == 'add-rows': + ref = d + bias[:, 0][:, None] + elif epilogue == 'add-cols': + ref = d + bias[0, :][None, :] + elif epilogue == 'softmax': + num = torch.exp(d - torch.max(d, dim=-1, keepdims=True)[0]) + denom = torch.sum(num, dim=-1, keepdims=True) + ref = num / denom + # ref = torch.softmax(d, 1) + elif epilogue == 'chain-dot': + ref = torch.matmul(d, w.to(torch.float32)) + else: + ref = d + return ref + golden = process_epilogue(dot, bias, w, epilogue) + + num_SMs = torch.cuda.get_device_properties('cuda').multi_processor_count + + def grid(META): + return (num_SMs,) + full_static_persistent_matmul_kernel[grid]( + a_ptr=a, b_ptr=b, w_ptr=w, bias_ptr=bias, z_ptr=z, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_wm=w.stride(0), stride_wn=w.stride(1), + stride_zm=z.stride(0), stride_zn=z.stride(1), + BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N, BLOCK_K=BLOCK_K, GROUP_SIZE_M=8, + out_dtype=out_dtype, + USE_TMA_STORE=USE_TMA_STORE, + ADD_MATRIX=epilogue == 'add-matrix', + ADD_ROWS=epilogue == 'add-rows', + ADD_COLS=epilogue == 'add-cols', + DO_SOFTMAX=epilogue == 'softmax', + CHAIN_DOT=epilogue == 'chain-dot', + A_ORDER_0=a_order[0], A_ORDER_1=a_order[1], + B_ORDER_0=b_order[0], B_ORDER_1=b_order[1], + num_warps=NUM_WARPS, num_ctas=NUM_CTAS, num_stages=NUM_STAGES, + enable_warp_specialization=ENABLE_WS, + NUM_SM=num_SMs) + + torch.set_printoptions(profile="full") + golden = torch.nn.functional.normalize(golden) + z = torch.nn.functional.normalize(z) + assert_close(z, golden, + rtol=1e-2, + atol=1e-3, + check_dtype=False) diff --git a/python/test/unit/hopper/test_tma_store_gemm.py b/python/test/unit/hopper/test_tma_store_gemm.py new file mode 100644 index 000000000000..0ec258d7cd9f --- /dev/null +++ b/python/test/unit/hopper/test_tma_store_gemm.py @@ -0,0 +1,123 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +import pytest +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl + + +def get_variant_golden(a, b): + SIZE_M = a.shape[0] + SIZE_K = a.shape[1] + SIZE_N = b.shape[1] + assert a.shape[1] == b.shape[0] + zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() + zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() + zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() + zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() + a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) + a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) + b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) + b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) + c_padded = torch.matmul(a_padded, b_padded) + return c_padded[:SIZE_M, :SIZE_N] + +# It's not easy to get a proper error threshold in different size +# Here the gemm calculation is padded to a different size in order to get +# a variant version of the golden result. And the error between golden and +# golden_variant provide reference on selecting the proper rtol / atol. + + +def get_proper_err(a, b, golden): + golden_variant = get_variant_golden(a, b) + golden_diff = golden - golden_variant + golden_abs_err = torch.max(torch.abs(golden_diff)).item() + golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() + return (golden_abs_err, golden_rel_err) + + +@triton.jit +def matmul_tma_load_store( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr, + OUTPUT_F16: tl.constexpr +): + a_block_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(0, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0)) + b_block_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, 0), block_shape=(BLOCK_K, BLOCK_N), order=(0, 1)) + c_block_ptr = tl.make_block_ptr(base=c_ptr, shape=(M, N), strides=(stride_cm, stride_cn), + offsets=(0, 0), block_shape=(BLOCK_M, BLOCK_N), order=(1, 0)) + a = tl.load(a_block_ptr) + b = tl.load(b_block_ptr) + + c = tl.dot(a, b) + if OUTPUT_F16: + c = c.to(tl.float16) + + tl.store(c_block_ptr, c) + + +@pytest.mark.parametrize('M,N,K,NUM_CTAS,NUM_WARPS,TRANS_A,TRANS_B,OUTPUT_F16', [ + [64, 64, 16, 1, 4, False, True, False], + [64, 64, 16, 1, 4, False, True, True], + [128, 64, 32, 1, 4, False, True, False], + [128, 64, 32, 1, 4, False, True, True], + [64, 128, 32, 1, 4, False, True, False], + [64, 128, 32, 1, 4, False, True, True], + [128, 128, 64, 1, 4, False, True, False], + [128, 128, 64, 1, 4, False, True, True], +]) +def test_tma_load_store(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_F16): + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + if OUTPUT_F16: + c = torch.empty((M, N), device=a.device, dtype=torch.float16) + + matmul_tma_load_store[(1, 1)](a_ptr=a, b_ptr=b, c_ptr=c, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_cm=c.stride(0), stride_cn=c.stride(1), + BLOCK_M=M, BLOCK_N=N, BLOCK_K=K, + num_warps=NUM_WARPS, + num_ctas=NUM_CTAS, + OUTPUT_F16=OUTPUT_F16) + golden = torch.matmul(a, b) + golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) + torch.set_printoptions(profile="full") + assert_close(c, golden, rtol=max(1e-4, 1.5 * golden_rel_err), atol=max(1e-4, 1.5 * golden_abs_err), check_dtype=False) diff --git a/python/test/unit/hopper/ttgir_tests/test_tma.py b/python/test/unit/hopper/ttgir_tests/test_tma.py new file mode 100644 index 000000000000..39af52123f15 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/test_tma.py @@ -0,0 +1,75 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import os + +import pytest +import torch +from test_util import get_proper_err +from torch.testing import assert_close + +import triton + + +@pytest.mark.parametrize('TTGIR,TRANS_A,TRANS_B', [ + # TODO: uncomment when it's done + # ["wgmma_tma_64_64_16_f16.ttgir", False, True], +]) +def test_tma_wgmma_64_64_16_f16(TTGIR, TRANS_A, TRANS_B): + capability = torch.cuda.get_device_capability() + if capability[0] < 9: + pytest.skip("Only test wgmma on devices with sm >= 90") + + SIZE_M = 64 + SIZE_N = 64 + SIZE_K = 16 + if (TRANS_A): + a = torch.randn((SIZE_K, SIZE_M), device='cuda', dtype=torch.float16).T + else: + a = torch.randn((SIZE_M, SIZE_K), device='cuda', dtype=torch.float16) + + if (TRANS_B): + b = torch.randn((SIZE_N, SIZE_K), device='cuda', dtype=torch.float16).T + else: + b = torch.randn((SIZE_K, SIZE_N), device='cuda', dtype=torch.float16) + + c = torch.empty((SIZE_M, SIZE_N), device=a.device, dtype=torch.float32) + + ttgir_path = os.path.dirname(__file__) + "/" + TTGIR + kernel = triton.compile(ttgir_path) + kernel[(1, 1, 1)](a.data_ptr(), b.data_ptr(), c.data_ptr(), + SIZE_M, SIZE_N, SIZE_K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0)) + + golden = torch.matmul(a, b) + torch.set_printoptions(profile="full", sci_mode=False) + golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) + assert_close( + c, + golden, + rtol=max(1e-4, + 1.5 * golden_rel_err), + atol=max( + 1e-4, + 1.5 * golden_abs_err), + check_dtype=False) diff --git a/python/test/unit/hopper/ttgir_tests/test_util.py b/python/test/unit/hopper/ttgir_tests/test_util.py new file mode 100644 index 000000000000..f2e0f88b2e01 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/test_util.py @@ -0,0 +1,52 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import torch + + +def get_variant_golden(a, b): + SIZE_M = a.shape[0] + SIZE_K = a.shape[1] + SIZE_N = b.shape[1] + assert a.shape[1] == b.shape[0] + zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() + zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() + zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() + zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() + a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) + a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) + b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) + b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) + c_padded = torch.matmul(a_padded, b_padded) + return c_padded[:SIZE_M, :SIZE_N] + +# It's not easy to get a proper error threshold in different size +# Here the gemm calculation is padded to a different size in order to get +# a variant version of the golden result. And the error between golden and +# golden_variant provide reference on selecting the proper rtol / atol. + + +def get_proper_err(a, b, golden): + golden_variant = get_variant_golden(a, b) + golden_diff = golden - golden_variant + golden_abs_err = torch.max(torch.abs(golden_diff)).item() + golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() + return (golden_abs_err, golden_rel_err) diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_NT.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_NT.ttgir new file mode 100644 index 000000000000..ec3dfb8f19b1 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_NT.ttgir @@ -0,0 +1,52 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<16x1xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %15 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %21 = tt.load %20 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x16xf16, #blocked0> + %22 = arith.muli %10, %11 : tensor<16x1xi32, #blocked2> + %23 = tt.addptr %12, %22 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %26 = tt.load %25 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64xf16, #blocked2> + %27 = triton_gpu.convert_layout %21 : (tensor<64x16xf16, #blocked0>) -> tensor<64x16xf16, #shared0> + %28 = triton_gpu.convert_layout %26 : (tensor<16x64xf16, #blocked2>) -> tensor<16x64xf16, #shared1> + %29 = tt.dot %27, %28, %cst {allowTF32 = true, transA = true, transB = true} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_TN.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_TN.ttgir new file mode 100644 index 000000000000..3e3aae12c814 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_64_64_16_f16_TN.ttgir @@ -0,0 +1,52 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<16x1xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %15 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %21 = tt.load %20 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x16xf16, #blocked0> + %22 = arith.muli %10, %11 : tensor<16x1xi32, #blocked2> + %23 = tt.addptr %12, %22 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %26 = tt.load %25 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64xf16, #blocked2> + %27 = triton_gpu.convert_layout %21 : (tensor<64x16xf16, #blocked0>) -> tensor<64x16xf16, #shared0> + %28 = triton_gpu.convert_layout %26 : (tensor<16x64xf16, #blocked2>) -> tensor<16x64xf16, #shared1> + %29 = tt.dot %27, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_64_64_16_f16.ttgir new file mode 100644 index 000000000000..b58dbd9212e9 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_64_64_16_f16.ttgir @@ -0,0 +1,59 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<16x1xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %15 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %ci0 = arith.constant 0 : i32 + %i1_true = arith.constant 1 : i1 + %i1_false = arith.constant 0 : i1 + %t = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + %mask0 = tt.splat %i1_true : (i1) -> tensor<64x16xi1, #blocked0> + %t0 = triton_gpu.insert_slice_async %20, %t, %ci0, %mask0 {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<64x16x!tt.ptr, #blocked0> -> tensor<1x64x16xf16, #shared0> + triton_gpu.async_commit_group + triton_gpu.async_wait {num = 1 : i32} + %21 = triton_gpu.extract_slice %t0[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + %22 = arith.muli %10, %11 : tensor<16x1xi32, #blocked2> + %23 = tt.addptr %12, %22 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %26 = tt.load %25 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64xf16, #blocked2> + %28 = triton_gpu.convert_layout %26 : (tensor<16x64xf16, #blocked2>) -> tensor<16x64xf16, #shared1> + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_mbarrier_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_mbarrier_64_64_16_f16.ttgir new file mode 100644 index 000000000000..d44d7f879b45 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_a_ldgsts_mbarrier_64_64_16_f16.ttgir @@ -0,0 +1,63 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<16x1xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %15 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %ci0 = arith.constant 0 : i32 + %i1_true = arith.constant 1 : i1 + %i1_false = arith.constant 0 : i1 + %t = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + // TODO: even an empty init external call here will break the UT + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : tensor<1xi64, #shared0> + // %mbar0 = triton_nvidia_gpu.extract_mbarrier %mbar[%ci0] : tensor<1xi64, #shared0>, i32 -> !tt.ptr + %mask0 = tt.splat %i1_true : (i1) -> tensor<64x16xi1, #blocked0> + %t0 = triton_gpu.insert_slice_async %20, %t, %ci0, %mask0 {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<64x16x!tt.ptr, #blocked0> -> tensor<1x64x16xf16, #shared0> + triton_gpu.async_wait {num = 1 : i32} + // triton_nvidia_gpu.mbarrier_arrive %mbar0 {trackAsyncOp = true} : !tt.ptr + // triton_nvidia_gpu.mbarrier_wait %mbar0, %i1_false : !tt.ptr + %21 = triton_gpu.extract_slice %t0[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + %22 = arith.muli %10, %11 : tensor<16x1xi32, #blocked2> + %23 = tt.addptr %12, %22 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %26 = tt.load %25 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64xf16, #blocked2> + %28 = triton_gpu.convert_layout %26 : (tensor<16x64xf16, #blocked2>) -> tensor<16x64xf16, #shared1> + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_64_64_16_f16.ttgir new file mode 100644 index 000000000000..3ee491653344 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_64_64_16_f16.ttgir @@ -0,0 +1,63 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<1x64xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %bstride1 = arith.muli %11, %15 : tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %bstride1 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %ci0 = arith.constant 0 : i32 + %i1_true = arith.constant 1 : i1 + %i1_false = arith.constant 0 : i1 + %at = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + %maska = tt.splat %i1_true : (i1) -> tensor<64x16xi1, #blocked0> + %at0 = triton_gpu.insert_slice_async %20, %at, %ci0, %maska {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<64x16x!tt.ptr, #blocked0> -> tensor<1x64x16xf16, #shared0> + triton_gpu.async_commit_group + triton_gpu.async_wait {num = 1 : i32} + %21 = triton_gpu.extract_slice %at0[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + %23 = tt.addptr %12, %10 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %bt = triton_gpu.alloc_tensor : tensor<1x16x64xf16, #shared1> + %maskb = tt.splat %i1_true : (i1) -> tensor<16x64xi1, #blocked2> + %bt0 = triton_gpu.insert_slice_async %25, %bt, %ci0, %maskb {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<16x64x!tt.ptr, #blocked2> -> tensor<1x16x64xf16, #shared1> + triton_gpu.async_commit_group + triton_gpu.async_wait {num = 1 : i32} + %28 = triton_gpu.extract_slice %bt0[%ci0, 0, 0][1, 16, 64][1, 1, 1] : tensor<1x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_64_64_16_f16.ttgir new file mode 100644 index 000000000000..3f175c2c414c --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_64_64_16_f16.ttgir @@ -0,0 +1,67 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<1x64xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %bstride1 = arith.muli %11, %15 : tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %bstride1 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %ci0 = arith.constant 0 : i32 + %i1_true = arith.constant 1 : i1 + %i1_false = arith.constant 0 : i1 + %at = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + %maska = tt.splat %i1_true : (i1) -> tensor<64x16xi1, #blocked0> + %mbar0 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %at0 = triton_gpu.insert_slice_async %20, %at, %ci0, %maska {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<64x16x!tt.ptr, #blocked0> -> tensor<1x64x16xf16, #shared0> + triton_nvidia_gpu.mbarrier_arrive %mbar0 {trackAsyncOp = true} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar0, %i1_false : !tt.ptr + // triton_gpu.async_wait {num = 1 : i32} + %21 = triton_gpu.extract_slice %at0[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + %23 = tt.addptr %12, %10 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %bt = triton_gpu.alloc_tensor : tensor<1x16x64xf16, #shared1> + %maskb = tt.splat %i1_true : (i1) -> tensor<16x64xi1, #blocked2> + %mbar1 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %bt0 = triton_gpu.insert_slice_async %25, %bt, %ci0, %maskb {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<16x64x!tt.ptr, #blocked2> -> tensor<1x16x64xf16, #shared1> + triton_nvidia_gpu.mbarrier_arrive %mbar1 {trackAsyncOp = true} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar1, %i1_false : !tt.ptr + // triton_gpu.async_wait {num = 1 : i32} + %28 = triton_gpu.extract_slice %bt0[%ci0, 0, 0][1, 16, 64][1, 1, 1] : tensor<1x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_vec_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_vec_64_64_16_f16.ttgir new file mode 100644 index 000000000000..ee4909a9ca48 --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_ldgsts_mbarrier_vec_64_64_16_f16.ttgir @@ -0,0 +1,69 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %0 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>> + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %2 = tt.expand_dims %0 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked0}>>) -> tensor<64x1xi32, #blocked0> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %4 = tt.splat %arg3 : (i32) -> tensor<64x1xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked0> + %6 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>>) -> tensor<1x16xi32, #blocked0> + %8 = tt.broadcast %7 : (tensor<1x16xi32, #blocked0>) -> tensor<64x16xi32, #blocked0> + %9 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %10 = tt.expand_dims %9 {axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<16x1xi32, #blocked2> + %11 = tt.splat %arg4 : (i32) -> tensor<1x64xi32, #blocked2> + %12 = tt.splat %arg1 : (!tt.ptr) -> tensor<16x1x!tt.ptr, #blocked2> + %13 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %15 = tt.expand_dims %13 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %bstride1 = arith.muli %11, %15 : tensor<1x64xi32, #blocked2> + %16 = tt.broadcast %bstride1 : (tensor<1x64xi32, #blocked2>) -> tensor<16x64xi32, #blocked2> + %17 = arith.muli %2, %4 : tensor<64x1xi32, #blocked0> + %18 = tt.addptr %5, %17 : tensor<64x1x!tt.ptr, #blocked0>, tensor<64x1xi32, #blocked0> + %19 = tt.broadcast %18 : (tensor<64x1x!tt.ptr, #blocked0>) -> tensor<64x16x!tt.ptr, #blocked0> + %20 = tt.addptr %19, %8 : tensor<64x16x!tt.ptr, #blocked0>, tensor<64x16xi32, #blocked0> + %ci0 = arith.constant 0 : i32 + %ci1 = arith.constant 1 : i32 + %i1_true = arith.constant 1 : i1 + %i1_false = arith.constant 0 : i1 + %at = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + %maska = tt.splat %i1_true : (i1) -> tensor<64x16xi1, #blocked0> + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : tensor<2xi64, #shared0> + %mbar0_s = triton_nvidia_gpu.extract_mbarrier %mbar[%ci0] : tensor<2xi64, #shared0>, i32 -> !tt.ptr + %at0 = triton_gpu.insert_slice_async %20, %at, %ci0, %maska {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<64x16x!tt.ptr, #blocked0> -> tensor<1x64x16xf16, #shared0> + triton_nvidia_gpu.mbarrier_arrive %mbar0_s {trackAsyncOp = true} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar0_s, %i1_false : !tt.ptr + // triton_gpu.async_wait {num = 1 : i32} + %21 = triton_gpu.extract_slice %at0[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + %23 = tt.addptr %12, %10 : tensor<16x1x!tt.ptr, #blocked2>, tensor<16x1xi32, #blocked2> + %24 = tt.broadcast %23 : (tensor<16x1x!tt.ptr, #blocked2>) -> tensor<16x64x!tt.ptr, #blocked2> + %25 = tt.addptr %24, %16 : tensor<16x64x!tt.ptr, #blocked2>, tensor<16x64xi32, #blocked2> + %bt = triton_gpu.alloc_tensor : tensor<1x16x64xf16, #shared1> + %maskb = tt.splat %i1_true : (i1) -> tensor<16x64xi1, #blocked2> + %mbar1_s = triton_nvidia_gpu.extract_mbarrier %mbar[%ci1] : tensor<2xi64, #shared0>, i32 -> !tt.ptr + %bt0 = triton_gpu.insert_slice_async %25, %bt, %ci0, %maskb {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, type = 1 : i32} : tensor<16x64x!tt.ptr, #blocked2> -> tensor<1x16x64xf16, #shared1> + triton_nvidia_gpu.mbarrier_arrive %mbar1_s {trackAsyncOp = true} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar1_s, %i1_false : !tt.ptr + // triton_gpu.async_wait {num = 1 : i32} + %28 = triton_gpu.extract_slice %bt0[%ci0, 0, 0][1, 16, 64][1, 1, 1] : tensor<1x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %30 = tt.splat %arg5 : (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/ttgir_tests/wgmma_tma_64_64_16_f16.ttgir b/python/test/unit/hopper/ttgir_tests/wgmma_tma_64_64_16_f16.ttgir new file mode 100644 index 000000000000..b05573e17b4e --- /dev/null +++ b/python/test/unit/hopper/ttgir_tests/wgmma_tma_64_64_16_f16.ttgir @@ -0,0 +1,64 @@ +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], CTAsPerCGA = [1, 1], order = [0, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + func.func public @matmul_kernel_0d1d2d3d4c5d6c7d8c(%aBasePtr : !tt.ptr {tt.divisibility = 16 : i32}, + %bBasePtr : !tt.ptr {tt.divisibility = 16 : i32}, + %cBasePtr : !tt.ptr {tt.divisibility = 16 : i32}, + %sizeM : i32 {tt.divisibility = 16 : i32}, + %sizeN : i32 {tt.divisibility = 16 : i32}, + %sizeK : i32 {tt.divisibility = 16 : i32}, + %aStride0 : i32 {tt.divisibility = 16 : i32}, + %aStride1 : i32 {tt.divisibility = 16 : i32}, + %bStride0 : i32 {tt.divisibility = 16 : i32}, + %bStride1 : i32 {tt.divisibility = 16 : i32}, + %cStride0 : i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %ci0 = arith.constant 0 : i32 + %ci1 = arith.constant 1 : i32 + %i1_true = arith.constant 1 : i1 + %aCoord0 = arith.constant 0 : i32 + %aCoord1 = arith.constant 0 : i32 + %bCoord0 = arith.constant 0 : i32 + %bCoord1 = arith.constant 0 : i32 + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32, txCount = 2048 : i32 } : tensor<2xi64, #shared0> + %mbar_a = triton_nvidia_gpu.extract_mbarrier %mbar[%ci0] : tensor<2xi64, #shared0>, i32 -> !tt.ptr + %mbar_b = triton_nvidia_gpu.extract_mbarrier %mbar[%ci1] : tensor<2xi64, #shared0>, i32 -> !tt.ptr + %1 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %3 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %14 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + + // Load A + %a_smem = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared0> + %a_smem_loaded = triton_gpu.load_tile_async %aBasePtr[%sizeM, %sizeK][%aStride0, %aStride1][%aCoord0, %aCoord1], %mbar_a, %a_smem[%ci0] {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, order = dense<[1, 0]> : tensor<2xi32>} : !tt.ptr -> tensor<1x64x16xf16, #shared0> + triton_nvidia_gpu.mbarrier_arrive %mbar_a {trackAsyncOp = false} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar_a, %i1_true : !tt.ptr + %21 = triton_gpu.extract_slice %a_smem_loaded[%ci0, 0, 0][1, 64, 16][1, 1, 1] : tensor<1x64x16xf16, #shared0> to tensor<64x16xf16, #shared0> + + // Load B + %b_smem = triton_gpu.alloc_tensor : tensor<1x16x64xf16, #shared1> + %b_smem_loaded= triton_gpu.load_tile_async %bBasePtr[%sizeK, %sizeN][%bStride0, %bStride1][%bCoord0, %bCoord1], %mbar_b, %b_smem[%ci0] {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, order = dense<[0, 1]> : tensor<2xi32>} : !tt.ptr -> tensor<1x16x64xf16, #shared1> + triton_nvidia_gpu.mbarrier_arrive %mbar_b {trackAsyncOp = false} : !tt.ptr + triton_nvidia_gpu.mbarrier_wait %mbar_b, %i1_true : !tt.ptr + %28 = triton_gpu.extract_slice %b_smem_loaded[%ci0, 0, 0][1, 16, 64][1, 1, 1] : tensor<1x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + + // Calling MMA + %29 = tt.dot %21, %28, %cst {allowTF32 = true, transA = false, transB = false} : tensor<64x16xf16, #shared0> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + + // Epilogue + %30 = tt.splat %cStride0: (i32) -> tensor<64x1xi32, #blocked1> + %31 = tt.splat %cBasePtr: (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked1> + %32 = tt.expand_dims %14 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x64xi32, #blocked1> + %33 = tt.broadcast %32 : (tensor<1x64xi32, #blocked1>) -> tensor<64x64xi32, #blocked1> + %34 = arith.muli %3, %30 : tensor<64x1xi32, #blocked1> + %35 = tt.addptr %31, %34 : tensor<64x1x!tt.ptr, #blocked1>, tensor<64x1xi32, #blocked1> + %36 = tt.broadcast %35 : (tensor<64x1x!tt.ptr, #blocked1>) -> tensor<64x64x!tt.ptr, #blocked1> + %37 = tt.addptr %36, %33 : tensor<64x64x!tt.ptr, #blocked1>, tensor<64x64xi32, #blocked1> + %38 = triton_gpu.convert_layout %29 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked1> + tt.store %37, %38 : tensor<64x64xf32, #blocked1> + return + } +} diff --git a/python/test/unit/hopper/utils.py b/python/test/unit/hopper/utils.py new file mode 100644 index 000000000000..845afbd009d7 --- /dev/null +++ b/python/test/unit/hopper/utils.py @@ -0,0 +1,32 @@ +import torch + + +def get_variant_golden(a, b): + SIZE_M = a.shape[0] + SIZE_K = a.shape[1] + SIZE_N = b.shape[1] + assert a.shape[1] == b.shape[0] + zero_M_K = torch.zeros((SIZE_M, SIZE_K), dtype=a.dtype).cuda() + zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K), dtype=a.dtype).cuda() + zero_K_N = torch.zeros((SIZE_K, SIZE_N), dtype=b.dtype).cuda() + zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N), dtype=b.dtype).cuda() + a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) + a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) + b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) + b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) + c_padded = torch.matmul(a_padded, b_padded) + return c_padded[:SIZE_M, :SIZE_N] + +# It's not easy to get a proper error threshold in different size +# Here the gemm calculation is padded to a different size in order to get +# a variant version of the golden result. And the error between golden and +# golden_variant provide reference on selecting the proper rtol / atol. + + +def get_proper_err(golden, golden_variant): + golden_diff = golden - golden_variant + golden_abs_err = torch.max(torch.abs(golden_diff)).item() + # avoid problems when golden_rel_err is 'inf' + abs_golden = torch.abs(golden) + torch.full_like(golden, torch.finfo(golden.dtype).smallest_normal) + golden_rel_err = torch.max(torch.abs(golden_diff) / abs_golden).item() + return (golden_abs_err, golden_rel_err) diff --git a/python/test/unit/language/test_core.py b/python/test/unit/language/test_core.py index 8d73c02638df..136922953aa1 100644 --- a/python/test/unit/language/test_core.py +++ b/python/test/unit/language/test_core.py @@ -21,6 +21,10 @@ dtypes_with_bfloat16 = dtypes + ['bfloat16'] torch_dtypes = ['bool'] + int_dtypes + ['uint8'] + float_dtypes + ['bfloat16'] +# TODO: enable multiple cta cluster testing. +# num_ctas_list = [1, 4] if torch.cuda.get_device_capability()[0] == 9 else [1] +num_ctas_list = [1] + def _bitwidth(dtype: str) -> int: # ex.: "int64" -> 64 @@ -42,7 +46,7 @@ def numpy_random(shape, dtype_str, rs: Optional[RandomState] = None, low=None, h high = iinfo.max if high is None else min(high, iinfo.max) dtype = getattr(np, dtype_str) x = rs.randint(low, high, shape, dtype=dtype) - x[x == 0] = 1 # Hack. Never return zero so tests of division don't error out. + x[x == 0] = 1 # Workaround. Never return zero so tests of division don't error out. return x elif dtype_str and 'float8' in dtype_str: x = rs.randint(20, 40, shape, dtype=np.int8) @@ -122,34 +126,44 @@ def check_type_supported(dtype, device): class MmaLayout: - def __init__(self, version, warps_per_cta): + def __init__(self, version, warps_per_cta, ctas_per_cga, cta_split_num, cta_order, instr_shape): self.version = version - self.warps_per_cta = warps_per_cta + self.warps_per_cta = str(warps_per_cta) + self.ctas_per_cga = str(ctas_per_cga) + self.cta_split_num = str(cta_split_num) + self.cta_order = str(cta_order) + self.instr_shape = str(instr_shape) def __str__(self): - return f"#triton_gpu.mma<{{versionMajor={self.version[0]}, versionMinor={self.version[1]}, warpsPerCTA={self.warps_per_cta}}}>" + return f"#triton_gpu.mma<{{versionMajor={self.version[0]}, versionMinor={self.version[1]}, warpsPerCTA={self.warps_per_cta}, CTAsPerCGA={self.ctas_per_cga}, CTASplitNum={self.cta_split_num}, CTAOrder={self.cta_order}, instrShape={self.instr_shape}}}>" class BlockedLayout: - def __init__(self, size_per_thread, threads_per_warp, warps_per_cta, order): - self.sz_per_thread = size_per_thread - self.threads_per_warp = threads_per_warp - self.warps_per_cta = warps_per_cta - self.order = order + def __init__(self, size_per_thread, threads_per_warp, warps_per_cta, order, ctas_per_cga, cta_split_num, cta_order): + self.sz_per_thread = str(size_per_thread) + self.threads_per_warp = str(threads_per_warp) + self.warps_per_cta = str(warps_per_cta) + self.order = str(order) + self.ctas_per_cga = str(ctas_per_cga) + self.cta_split_num = str(cta_split_num) + self.cta_order = str(cta_order) def __str__(self): - return f"#triton_gpu.blocked<{{sizePerThread={self.sz_per_thread}, threadsPerWarp={self.threads_per_warp}, warpsPerCTA={self.warps_per_cta}, order={self.order}}}>" + return f"#triton_gpu.blocked<{{sizePerThread={self.sz_per_thread}, threadsPerWarp={self.threads_per_warp}, warpsPerCTA={self.warps_per_cta}, order={self.order}, CTAsPerCGA={self.ctas_per_cga}, CTASplitNum={self.cta_split_num}, CTAOrder={self.cta_order}}}>" class SharedLayout: - def __init__(self, vec, per_phase, max_phase, order): + def __init__(self, vec, per_phase, max_phase, order, ctas_per_cga, cta_split_num, cta_order): self.vec = str(vec) self.per_phase = str(per_phase) self.max_phase = str(max_phase) self.order = str(order) + self.ctas_per_cga = str(ctas_per_cga) + self.cta_split_num = str(cta_split_num) + self.cta_order = str(cta_order) def __str__(self): - return f"#triton_gpu.shared<{{vec={self.vec}, perPhase={self.per_phase}, maxPhase={self.max_phase}, order={self.order}}}>" + return f"#triton_gpu.shared<{{vec={self.vec}, perPhase={self.per_phase}, maxPhase={self.max_phase}, order={self.order}, CTAsPerCGA={self.ctas_per_cga}, CTASplitNum={self.cta_split_num}, CTAOrder={self.cta_order}}}>" @pytest.mark.parametrize("dtype_x", list(dtypes) + ["bfloat16"]) @@ -165,7 +179,7 @@ def kernel(X, SIZE: tl.constexpr): # generic test functions -def _test_unary(dtype_x, expr, numpy_expr=None, device='cuda'): +def _test_unary(dtype_x, expr, numpy_expr=None, device='cuda', num_ctas=1): check_type_supported(dtype_x, device) # early return if dtype_x is not supported SIZE = 128 # define the kernel / launch-grid @@ -187,7 +201,7 @@ def kernel(Z, X, SIZE: tl.constexpr): # triton result x_tri = to_triton(x, device=device, dst_type=dtype_x) z_tri = to_triton(np.empty_like(z_ref), device=device, dst_type=dtype_x) - kernel[(1, )](z_tri, x_tri, SIZE=SIZE, num_warps=4) + kernel[(1, )](z_tri, x_tri, SIZE=SIZE, num_warps=4, num_ctas=num_ctas) # compare np.testing.assert_allclose(z_ref, to_numpy(z_tri), rtol=0.01) @@ -223,7 +237,7 @@ def _binary_op_dtype_override(a: str, b: str) -> Optional[np.dtype]: return overrides.get(key) -def _test_binary(dtype_x, dtype_y, expr, numpy_expr=None, mode_x='real', mode_y='real', device='cuda', y_low=None, y_high=None): +def _test_binary(dtype_x, dtype_y, expr, numpy_expr=None, mode_x='real', mode_y='real', device='cuda', num_ctas=1, y_low=None, y_high=None): check_type_supported(dtype_x, device) # early return if dtype_x is not supported check_type_supported(dtype_y, device) SIZE = 128 @@ -255,7 +269,8 @@ def kernel(Z, X, Y, SIZE: tl.constexpr): x_tri = to_triton(x, device=device, dst_type=dtype_x) y_tri = to_triton(y, device=device, dst_type=dtype_y) z_tri = to_triton(np.empty(SIZE, dtype=z_ref.dtype), device=device) - kernel[(1, )](z_tri, x_tri, y_tri, SIZE=SIZE, num_warps=4) + kernel[(1, )](z_tri, x_tri, y_tri, SIZE=SIZE, + num_warps=4, num_ctas=num_ctas) np.testing.assert_allclose(z_ref, to_numpy(z_tri), err_msg=expr, rtol=0.01) @@ -295,7 +310,8 @@ def _mod_operation_ill_conditioned(dtype_x, dtype_y) -> bool: for dtype_x in dtypes_with_bfloat16 for dtype_y in dtypes_with_bfloat16 ]) -def test_bin_op(dtype_x, dtype_y, op, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_bin_op(dtype_x, dtype_y, op, num_ctas, device): expr = f' x {op} y' if op == '%' and dtype_x in int_dtypes + uint_dtypes and dtype_y in int_dtypes + uint_dtypes: # LLVM has 'numpy.fmod', not 'numpy.remainder', semantics on integer remainders. @@ -313,28 +329,84 @@ def test_bin_op(dtype_x, dtype_y, op, device): numpy_expr = None if op == '%' and _mod_operation_ill_conditioned(dtype_x, dtype_y): with pytest.raises(AssertionError, match='Not equal to tolerance'): - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device) + _test_binary( + dtype_x, + dtype_y, + expr, + numpy_expr, + device=device, + num_ctas=num_ctas) elif (op in ('%', '/') and ((dtype_x in int_dtypes and dtype_y in uint_dtypes) or (dtype_x in uint_dtypes and dtype_y in int_dtypes))): with pytest.raises(triton.CompilationError) as exc_info: - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device) + _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device, num_ctas=num_ctas) assert re.match('Cannot use .* because they have different signedness', str(exc_info.value.__cause__)) else: - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device) + _test_binary( + dtype_x, + dtype_y, + expr, + numpy_expr, + device=device, + num_ctas=num_ctas) @pytest.mark.parametrize("dtype_x, dtype_y", [(dtype_x, dtype_y) for dtype_x in int_dtypes for dtype_y in int_dtypes] + [(dtype_x, dtype_y) for dtype_x in uint_dtypes for dtype_y in uint_dtypes] ) -def test_floordiv(dtype_x, dtype_y, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_floordiv(dtype_x, dtype_y, num_ctas, device): # Triton has IEEE, not numpy/torch, semantics for %, and those carry # through to //, so we have to use a nonstandard expression to get a # reference result for //. expr = 'x // y' numpy_expr = '((x - np.fmod(x, y)) / y)' - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device) + _test_binary( + dtype_x, + dtype_y, + expr, + numpy_expr, + device=device, + num_ctas=num_ctas) + + +def test_unsigned_name_mangling(device='cuda'): + # Test that uint32 and int32 are mangled differently by the compiler + SIZE = 128 + # define the kernel / launch-grid + + @triton.jit + def kernel(O1, O2, X, Y, SIZE: tl.constexpr): + off = tl.arange(0, SIZE) + x = tl.load(X + off) + y = tl.load(Y + off) + out1 = tl.abs(x) # uint32 -> nop + out2 = tl.abs(-y) # int32 -> should have an effect + tl.store(O1 + off, out1) + tl.store(O2 + off, out2) + + dtype_x = 'uint32' + dtype_y = 'int32' + # inputs + rs = RandomState(17) + x = numpy_random(SIZE, dtype_str=dtype_x, rs=rs) + y = numpy_random(SIZE, dtype_str=dtype_y, rs=rs) + # reference result + expect = (np.abs(x), np.abs(-y)) + # triton result + x_tri = to_triton(x, device=device, dst_type=dtype_x) + y_tri = to_triton(y, device=device, dst_type=dtype_y) + actual = tuple( + to_triton(np.empty_like(e), device=device) + for e in expect + ) + kernel[(1, )](actual[0], actual[1], x_tri, y_tri, SIZE=SIZE, num_warps=4) + + # Bitwise op, so expect exact equality + assert (expect[0] == to_numpy(actual[0])).all() + assert (expect[1] == to_numpy(actual[1])).all() def test_unsigned_name_mangling(device): @@ -383,7 +455,8 @@ def kernel(O1, O2, X, Y, SIZE: tl.constexpr): for dtype_x in dtypes + dtypes_with_bfloat16 for dtype_y in dtypes + dtypes_with_bfloat16 ]) -def test_bitwise_op(dtype_x, dtype_y, op, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_bitwise_op(dtype_x, dtype_y, op, num_ctas, device): expr = f'x {op} y' if (dtype_x in uint_dtypes and dtype_y in int_dtypes and _bitwidth(dtype_x) >= _bitwidth(dtype_y)): numpy_expr = f'x.astype(np.{dtype_x}) {op} y.astype(np.{dtype_x})' @@ -393,11 +466,17 @@ def test_bitwise_op(dtype_x, dtype_y, op, device): numpy_expr = None if 'float' in dtype_x + dtype_y: with pytest.raises(triton.CompilationError) as exc_info: - _test_binary(dtype_x, dtype_y, expr, numpy_expr='np.array([])', device=device) + _test_binary(dtype_x, dtype_y, expr, numpy_expr='np.array([])', device=device, num_ctas=num_ctas) # The CompilationError must have been caused by a C++ exception with this text. assert re.match('invalid operands of type', str(exc_info.value.__cause__)) else: - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device) + _test_binary( + dtype_x, + dtype_y, + expr, + numpy_expr, + device=device, + num_ctas=num_ctas) @pytest.mark.parametrize("dtype_x, dtype_y, op", [ @@ -406,7 +485,8 @@ def test_bitwise_op(dtype_x, dtype_y, op, device): for dtype_x in int_dtypes + uint_dtypes for dtype_y in int_dtypes + uint_dtypes ]) -def test_shift_op(dtype_x, dtype_y, op, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_shift_op(dtype_x, dtype_y, op, num_ctas, device): expr = f'x {op} y' bw = max(_bitwidth(dtype_x), _bitwidth(dtype_y)) if dtype_x.startswith('int'): @@ -414,7 +494,7 @@ def test_shift_op(dtype_x, dtype_y, op, device): else: dtype_z = f'uint{bw}' numpy_expr = f'x.astype(np.{dtype_z}) {op} y.astype(np.{dtype_z})' - _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device, y_low=0, y_high=65) + _test_binary(dtype_x, dtype_y, expr, numpy_expr, device=device, num_ctas=num_ctas, y_low=0, y_high=65) # --------------- @@ -439,7 +519,8 @@ def test_shift_op(dtype_x, dtype_y, op, device): ('nan', 'nan')] ]) -def test_compare_op(dtype_x, dtype_y, op, mode_x, mode_y, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_compare_op(dtype_x, dtype_y, op, mode_x, mode_y, num_ctas, device): expr = f'x {op} y' if (dtype_x in uint_dtypes and dtype_y in int_dtypes and _bitwidth(dtype_x) >= _bitwidth(dtype_y)): numpy_expr = f'x.astype(np.{dtype_x}) {op} y.astype(np.{dtype_x})' @@ -447,7 +528,36 @@ def test_compare_op(dtype_x, dtype_y, op, mode_x, mode_y, device): numpy_expr = f'x.astype(np.{dtype_y}) {op} y.astype(np.{dtype_y})' else: numpy_expr = None - _test_binary(dtype_x, dtype_y, expr, numpy_expr, mode_x=mode_x, mode_y=mode_y, device=device) + _test_binary(dtype_x, dtype_y, expr, numpy_expr, mode_x=mode_x, mode_y=mode_y, device=device, num_ctas=num_ctas) + + +# --------------- +# test broadcast +# --------------- +@pytest.mark.parametrize("dtype", dtypes_with_bfloat16) +def test_broadcast(dtype): + @triton.jit + def broadcast_kernel(x_ptr, y_ptr, y_broadcasted_ptr, M: tl.constexpr, N: tl.constexpr): + offset1 = tl.arange(0, M) + offset2 = tl.arange(0, N) + x = tl.load(x_ptr + N * offset1[:, None] + offset2[None, :]) + y = tl.load(y_ptr + offset2) + _, y_broadcasted = tl.broadcast(x, y) + tl.store(y_broadcasted_ptr + N * offset1[:, None] + offset2[None, :], y_broadcasted) + + M = 32 + N = 64 + rs = RandomState(17) + x = numpy_random((M, N), dtype_str=dtype, rs=rs) + y = numpy_random(N, dtype_str=dtype, rs=rs) + _, y_broadcasted_np = np.broadcast_arrays(x, y) + + x_tri = to_triton(x, device='cuda', dst_type=dtype) + y_tri = to_triton(y, device='cuda', dst_type=dtype) + y_broadcasted_tri = to_triton(np.empty((M, N), dtype=y_broadcasted_np.dtype), device='cuda', dst_type=dtype) + + broadcast_kernel[(1,)](x_tri, y_tri, y_broadcasted_tri, M=M, N=N) + assert (y_broadcasted_np == to_numpy(y_broadcasted_tri)).all() # --------------- @@ -592,7 +702,8 @@ def _kernel(dst): # test where # --------------- @pytest.mark.parametrize("dtype", dtypes_with_bfloat16 + ["*int32"]) -def test_where(dtype, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_where(dtype, num_ctas, device): select_ptrs = False if dtype == "*int32": dtype = "int64" @@ -633,7 +744,7 @@ def where_kernel(cond_ptr, a_ptr, b_ptr, output_ptr, n_elements, z_tri = to_triton(np.empty(SIZE, dtype=z.dtype), device=device, dst_type=dtype) grid = lambda meta: (triton.cdiv(SIZE, meta['BLOCK_SIZE']),) - where_kernel[grid](cond_tri, x_tri, y_tri, z_tri, SIZE, BLOCK_SIZE=1024, TEST_POINTERS=select_ptrs, TEST_SCALAR_POINTERS=False) + where_kernel[grid](cond_tri, x_tri, y_tri, z_tri, SIZE, BLOCK_SIZE=1024, TEST_POINTERS=select_ptrs, TEST_SCALAR_POINTERS=False, num_ctas=num_ctas) assert (z == to_numpy(z_tri)).all() if select_ptrs: where_kernel[grid](cond_tri, x_tri, y_tri, z_tri, SIZE, BLOCK_SIZE=1024, TEST_POINTERS=select_ptrs, TEST_SCALAR_POINTERS=True) @@ -641,7 +752,8 @@ def where_kernel(cond_ptr, a_ptr, b_ptr, output_ptr, n_elements, assert (z == to_numpy(z_tri)).all() -def test_where_broadcast(device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_where_broadcast(num_ctas, device): @triton.jit def where_kernel(cond_ptr, a_ptr, out_ptr, BLOCK_SIZE: tl.constexpr): xoffsets = tl.arange(0, BLOCK_SIZE)[:, None] @@ -672,7 +784,7 @@ def where_scalar_condition(a_ptr, out_ptr, BLOCK_SIZE: tl.constexpr): z_tri = to_triton(np.empty((SIZE, SIZE), dtype=z.dtype), device=device, dst_type=dtype) where_kernel[(1,)](cond_tri, x_tri, z_tri, SIZE) assert (z == to_numpy(z_tri)).all() - where_scalar_condition[(1,)](x_tri, z_tri, SIZE) + where_scalar_condition[(1,)](x_tri, z_tri, SIZE, num_ctas=num_ctas) z = np.where(0, x, 0) assert (z == to_numpy(z_tri)).all() @@ -686,8 +798,9 @@ def where_scalar_condition(a_ptr, out_ptr, BLOCK_SIZE: tl.constexpr): ] + [ (dtype_x, ' ~x') for dtype_x in int_dtypes ]) -def test_unary_op(dtype_x, expr, device): - _test_unary(dtype_x, expr, device=device) +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_unary_op(dtype_x, expr, num_ctas, device): + _test_unary(dtype_x, expr, device=device, num_ctas=num_ctas) # ---------------- # test math ops @@ -760,7 +873,8 @@ def make_ptr_str(name, shape): ':, :, None'] for d in ['int32', 'uint32', 'uint16'] ]) -def test_index1d(expr, dtype_str, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_index1d(expr, dtype_str, num_ctas, device): rank_x = expr.count(':') rank_y = expr.count(',') + 1 shape_x = [32 for _ in range(rank_x)] @@ -802,7 +916,8 @@ def generate_kernel(shape_x, shape_z): def catch_compilation_error(kernel): try: - kernel[(1, )](z_tri, x_tri, num_warps=1, SIZE=shape_x[0]) + kernel[(1, )](z_tri, x_tri, num_warps=1, + SIZE=shape_x[0], num_ctas=num_ctas) except triton.CompilationError as e: np.testing.assert_(True) except BaseException: @@ -1004,20 +1119,21 @@ def kernel(X, Z): assert f"atom.global.gpu.{sem_str}" in h.asm["ptx"] -def test_atomic_rmw_predicate(device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_atomic_rmw_predicate(num_ctas, device): @triton.jit def kernel(X): val = tl.program_id(0) if val < 64: tl.atomic_max(X, val) x = torch.zeros((1,), device=device, dtype=torch.int32) - kernel[(4096,)](x) + kernel[(4096,)](x, num_ctas=num_ctas) assert x.item() == 63 -@pytest.mark.parametrize("shape, axis", - [(shape, axis) for shape in [(2, 2), (2, 8), (8, 2), (8, 8), (32, 32)] for axis in [0, 1]]) -def test_tensor_atomic_rmw(shape, axis, device): +@pytest.mark.parametrize("shape, axis, num_ctas", + [(shape, axis, num_ctas) for shape in [(2, 2), (2, 8), (8, 2), (8, 8), (32, 32), (64, 64)] for axis in [0, 1] for num_ctas in num_ctas_list]) +def test_tensor_atomic_rmw(shape, axis, num_ctas, device): shape0, shape1 = shape # triton kernel @@ -1039,11 +1155,12 @@ def kernel(Z, X, AXIS: tl.constexpr, SHAPE0: tl.constexpr, SHAPE1: tl.constexpr) x_tri = to_triton(x, device=device) z_shape = (shape0, ) if axis == 1 else (shape1, ) z_tri = to_triton(np.zeros(z_shape, dtype="float32"), device=device) - kernel[(1,)](z_tri, x_tri, axis, shape0, shape1) + kernel[(1,)](z_tri, x_tri, axis, shape0, shape1, num_ctas=num_ctas) np.testing.assert_allclose(z_ref, to_numpy(z_tri), rtol=1e-4) -def test_tensor_atomic_rmw_block(device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_tensor_atomic_rmw_block(num_ctas, device): shape = (8, 8) @triton.jit @@ -1055,12 +1172,13 @@ def kernel(X, SHAPE0: tl.constexpr, SHAPE1: tl.constexpr): x = X + offs tl.atomic_min(x, val) x = torch.ones((8, 8), device=device, dtype=torch.float32) - kernel[(2,)](x, shape[0], shape[1]) + kernel[(2,)](x, shape[0], shape[1], num_ctas=num_ctas) assert torch.min(x).item() == 0.0 @pytest.mark.parametrize("sem", [None, 'acquire', 'release', 'acq_rel', 'relaxed']) -def test_atomic_cas(sem, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_atomic_cas(sem, num_ctas, device): # 1. make sure that atomic_cas changes the original value (Lock) @triton.jit def change_value(Lock): @@ -1086,7 +1204,7 @@ def serialized_add(data, Lock, SEM: tl.constexpr): Lock = torch.zeros((1,), device=device, dtype=torch.int32) data = torch.zeros((128,), device=device, dtype=torch.float32) ref = torch.full((128,), 64.0) - h = serialized_add[(64,)](data, Lock, SEM=sem) + h = serialized_add[(64,)](data, Lock, SEM=sem, num_ctas=num_ctas) sem_str = "acq_rel" if sem is None else sem np.testing.assert_allclose(to_numpy(data), to_numpy(ref)) assert f"atom.global.{sem_str}" in h.asm["ptx"] @@ -1112,7 +1230,8 @@ def serialized_add(data, Lock, SEM: tl.constexpr): ] + [ (f'int{x}', f'uint{x}', True) for x in [8, 16, 32, 64] ]) -def test_cast(dtype_x, dtype_z, bitcast, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_cast(dtype_x, dtype_z, bitcast, num_ctas, device): # bfloat16 on cc < 80 will not be tested check_type_supported(dtype_x, device) check_type_supported(dtype_z, device) @@ -1145,7 +1264,7 @@ def kernel(X, Z, BITCAST: tl.constexpr, SIZE: tl.constexpr): z_tri = torch.empty((size,), dtype=getattr(torch, dtype_z), device=device) else: z_tri = to_triton(np.empty((size, ), dtype=getattr(np, dtype_z_np)), device=device) - kernel[(1, )](x_tri, z_tri, BITCAST=bitcast, SIZE=size, num_warps=1) + kernel[(1, )](x_tri, z_tri, BITCAST=bitcast, SIZE=size, num_warps=1, num_ctas=num_ctas) # torch result if dtype_z.startswith('bfloat') or dtype_x.startswith('bfloat'): assert bitcast is False @@ -1182,7 +1301,8 @@ def kernel(X, Y, Z, N: tl.constexpr): @pytest.mark.parametrize("dtype_str", list(torch_dtypes)) -def test_store_constant(dtype_str, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_store_constant(dtype_str, num_ctas, device): check_type_supported(dtype_str, device) """Tests that boolean True is stored as 1""" @@ -1198,7 +1318,7 @@ def kernel(output_ptr, n_elements, BLOCK_SIZE: tl.constexpr): block_size = 128 ref = torch.ones([block_size], dtype=getattr(torch, dtype_str), device=device) output = torch.zeros([block_size], dtype=getattr(torch, dtype_str), device=device) - kernel[(1,)](output, block_size, BLOCK_SIZE=block_size) + kernel[(1,)](output, block_size, BLOCK_SIZE=block_size, num_ctas=num_ctas) assert torch.all(output == ref) @@ -1363,7 +1483,8 @@ def get_reduced_dtype(dtype_str, op): 'sum'] for dtype in dtypes_with_bfloat16 for shape in [32, 64, 128, 512]]) -def test_reduce1d(op, dtype_str, shape, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_reduce1d(op, dtype_str, shape, num_ctas, device): check_type_supported(dtype_str, device) # bfloat16 on cc < 80 will not be tested # triton kernel @@ -1409,7 +1530,7 @@ def kernel(X, Z, BLOCK: tl.constexpr): # triton result z_tri = to_triton(numpy_random((1,), dtype_str=z_dtype_str, rs=rs), device=device, dst_type=z_tri_dtype_str) - kernel[(1,)](x_tri, z_tri, BLOCK=shape) + kernel[(1,)](x_tri, z_tri, BLOCK=shape, num_ctas=num_ctas) z_tri = to_numpy(z_tri) # compare if op == 'sum': @@ -1452,7 +1573,8 @@ def kernel(X, Z, BLOCK: tl.constexpr): @pytest.mark.parametrize("op, dtype_str, shape, axis", reduce_configs1 + reduce_configs2) -def test_reduce2d(op, dtype_str, shape, axis, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_reduce2d(op, dtype_str, shape, axis, num_ctas, device): check_type_supported(dtype_str, device) # bfloat16 on cc < 80 will not be tested # triton kernel @@ -1492,7 +1614,8 @@ def kernel(X, Z, BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, AXIS: tl.constexp ret_numel = 1 if axis is None else shape[1 - axis] z_tri = to_triton(numpy_random((ret_numel,), dtype_str=z_dtype_str, rs=rs), device=device, dst_type=z_tri_dtype_str) - kernel[(1,)](x_tri, z_tri, BLOCK_M=shape[0], BLOCK_N=shape[1], AXIS=axis) + kernel[(1,)](x_tri, z_tri, BLOCK_M=shape[0], + BLOCK_N=shape[1], AXIS=axis, num_ctas=num_ctas) z_tri = to_numpy(z_tri) # compare if op == 'sum': @@ -1559,17 +1682,17 @@ def kernel(X, Z, BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, AXIS: tl.constexp scan_layouts = [ - BlockedLayout([1, 4], [4, 8], [4, 1], [0, 1]), - BlockedLayout([1, 4], [8, 4], [4, 1], [0, 1]), - BlockedLayout([4, 1], [4, 8], [1, 4], [0, 1]), - BlockedLayout([2, 2], [4, 8], [2, 2], [0, 1]), - BlockedLayout([2, 2], [8, 4], [2, 2], [0, 1]), - - BlockedLayout([1, 4], [4, 8], [4, 1], [1, 0]), - BlockedLayout([1, 4], [8, 4], [4, 1], [1, 0]), - BlockedLayout([4, 1], [4, 8], [1, 4], [1, 0]), - BlockedLayout([2, 2], [4, 8], [2, 2], [1, 0]), - BlockedLayout([2, 2], [8, 4], [2, 2], [1, 0]), + BlockedLayout([1, 4], [4, 8], [4, 1], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [8, 4], [4, 1], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([4, 1], [4, 8], [1, 4], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([2, 2], [4, 8], [2, 2], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([2, 2], [8, 4], [2, 2], [0, 1], [1, 1], [1, 1], [0, 1]), + + BlockedLayout([1, 4], [4, 8], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [8, 4], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([4, 1], [4, 8], [1, 4], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([2, 2], [4, 8], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([2, 2], [8, 4], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), ] @@ -1579,7 +1702,7 @@ def kernel(X, Z, BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, AXIS: tl.constexp def test_scan_layouts(M, N, src_layout, axis, device): ir = f""" #blocked = {src_layout} - module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ + module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ tt.func public @kernel_0d1d(%arg0: !tt.ptr {{tt.divisibility = 16 : i32}}, %arg1: !tt.ptr {{tt.divisibility = 16 : i32}}) {{ %cst = arith.constant dense<{N}> : tensor<{M}x1xi32, #blocked> %0 = tt.make_range {{end = {M} : i32, start = 0 : i32}} : tensor<{M}xi32, #triton_gpu.slice<{{dim = 1, parent = #blocked}}>> @@ -1628,11 +1751,11 @@ def test_scan_layouts(M, N, src_layout, axis, device): layouts = [ - BlockedLayout([1, 4], [8, 4], [4, 1], [1, 0]), - BlockedLayout([1, 4], [8, 4], [4, 1], [0, 1]), - BlockedLayout([4, 4], [2, 16], [4, 1], [1, 0]), - MmaLayout(version=(2, 0), warps_per_cta=[4, 1]), - MmaLayout(version=(2, 0), warps_per_cta=[2, 2]) + BlockedLayout([1, 4], [8, 4], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [8, 4], [4, 1], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([4, 4], [2, 16], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + MmaLayout(version=(2, 0), warps_per_cta=[4, 1], ctas_per_cga=[1, 1], cta_split_num=[1, 1], cta_order=[0, 1], instr_shape=[16, 8]), + MmaLayout(version=(2, 0), warps_per_cta=[2, 2], ctas_per_cga=[1, 1], cta_split_num=[1, 1], cta_order=[0, 1], instr_shape=[16, 8]) ] @@ -1643,10 +1766,11 @@ def test_reduce_layouts(M, N, src_layout, axis, device): rdims_2d = f"1x{N}" if axis == 0 else f"{M}x1" rdims_1d = f"{N}" if axis == 0 else f"{M}" store_range = "%7" if axis == 0 else "%1" + blocked = BlockedLayout([1, 1], [32, 1], [4, 1], [0, 1], [1, 1], [1, 1], [0, 1]) ir = f""" - #blocked = #triton_gpu.blocked<{{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}}> + #blocked = {blocked} #src = {src_layout} - module attributes {{"triton_gpu.num-warps" = 4 : i32}} {{ + module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ tt.func public @kernel_0d1d2c3d4c(%arg0: !tt.ptr {{tt.divisibility = 16 : i32}}, %arg1: i32 {{tt.divisibility = 16 : i32}}, %arg2: !tt.ptr {{tt.divisibility = 16 : i32}}) {{ %0 = tt.make_range {{end = {M} : i32, start = 0 : i32}} : tensor<{M}xi32, #triton_gpu.slice<{{dim = 1, parent = #blocked}}>> %1 = tt.expand_dims %0 {{axis = 1 : i32}} : (tensor<{M}xi32, #triton_gpu.slice<{{dim = 1, parent = #blocked}}>>) -> tensor<{M}x1xi32, #blocked> @@ -1701,9 +1825,9 @@ def test_reduce_layouts(M, N, src_layout, axis, device): layouts = [ - BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0]), - BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0]), - MmaLayout(version=(2, 0), warps_per_cta=[4, 1]) + BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + MmaLayout(version=(2, 0), warps_per_cta=[4, 1], ctas_per_cga=[1, 1], cta_split_num=[1, 1], cta_order=[0, 1], instr_shape=[16, 8]) ] @@ -1712,7 +1836,7 @@ def test_reduce_layouts(M, N, src_layout, axis, device): def test_store_op(M, src_layout, device): ir = f""" #src = {src_layout} - module attributes {{"triton_gpu.num-warps" = 4 : i32}} {{ + module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ tt.func public @kernel(%arg0: !tt.ptr {{tt.divisibility = 16 : i32}}, %arg1: !tt.ptr {{tt.divisibility = 16 : i32}}) {{ %0 = tt.make_range {{end = {M} : i32, start = 0 : i32}} : tensor<{M}xi32, #triton_gpu.slice<{{dim = 1, parent = #src}}>> %1 = tt.splat %arg0 : (!tt.ptr) -> tensor<{M}x!tt.ptr, #triton_gpu.slice<{{dim = 1, parent = #src}}>> @@ -1747,9 +1871,9 @@ def test_store_op(M, src_layout, device): layouts = [ - BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0]), - BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0]), - MmaLayout(version=(2, 0), warps_per_cta=[4, 1]) + BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + MmaLayout(version=(2, 0), warps_per_cta=[4, 1], ctas_per_cga=[1, 1], cta_split_num=[1, 1], cta_order=[0, 1], instr_shape=[16, 8]) ] @@ -1762,7 +1886,7 @@ def test_convert1d(M, src_layout, dst_layout, src_dim, dst_dim, device): ir = f""" #dst = {dst_layout} #src = {src_layout} - module attributes {{"triton_gpu.num-warps" = 4 : i32}} {{ + module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ tt.func public @kernel(%arg0: !tt.ptr {{tt.divisibility = 16 : i32}}, %arg1: !tt.ptr {{tt.divisibility = 16 : i32}}) {{ %0 = tt.splat %arg0 : (!tt.ptr) -> tensor<{M}x!tt.ptr, #triton_gpu.slice<{{dim = {src_dim}, parent = #src}}>> %1 = tt.make_range {{end = {M} : i32, start = 0 : i32}} : tensor<{M}xi32, #triton_gpu.slice<{{dim = {src_dim}, parent = #src}}>> @@ -1806,10 +1930,10 @@ def _welford_combine(mean_1, m2_1, weight_1, mean_2, m2_2, weight_2): layouts = [ - BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0]), - BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0]), - BlockedLayout([1, 4], [1, 32], [1, 4], [1, 0]), - BlockedLayout([1, 4], [8, 4], [2, 2], [0, 1]) + BlockedLayout([1, 4], [1, 32], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [1, 32], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [1, 32], [1, 4], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [8, 4], [2, 2], [0, 1], [1, 1], [1, 1], [0, 1]) ] @@ -1830,7 +1954,7 @@ def test_chain_reduce(M, N, src_layout, op, device, first_axis): tt.reduce.return %14 : i32""" ir = f""" #src = {src_layout} - module attributes {{"triton_gpu.num-warps" = 4 : i32}} {{ + module attributes {{"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32}} {{ tt.func public @sum_kernel_0d1d(%arg0: !tt.ptr {{tt.divisibility = 16 : i32}}, %arg1: !tt.ptr {{tt.divisibility = 16 : i32}}) {{ %cst = arith.constant dense<{N}> : tensor<{M}x1xi32, #src> %0 = tt.make_range {{end = {M} : i32, start = 0 : i32}} : tensor<{M}xi32, #triton_gpu.slice<{{dim = 1, parent = #src}}>> @@ -1916,7 +2040,8 @@ def var_mean_kernel(X, out_mean, out_var, BLOCK: tl.constexpr): for dtype in ['float8e4b15', 'float16', 'float32'] for shape in [(64, 64), (128, 128)] for perm in [(1, 0)]]) -def test_permute(dtype_str, shape, perm, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_permute(dtype_str, shape, perm, num_ctas, device): check_type_supported(dtype_str, device) # bfloat16 on cc < 80 will not be tested # triton kernel @@ -1937,10 +2062,12 @@ def kernel(X, stride_xm, stride_xn, x_tri = to_triton(x, device=device, dst_type=dtype_str) pgm = kernel[(1, 1)](x_tri, x_tri.stride(0), x_tri.stride(1), z_tri, z_tri.stride(1), z_tri.stride(0), - BLOCK_M=shape[0], BLOCK_N=shape[1]) + BLOCK_M=shape[0], BLOCK_N=shape[1], + num_ctas=num_ctas) pgm_contiguous = kernel[(1, 1)](x_tri, x_tri.stride(1), x_tri.stride(0), z_tri_contiguous, z_tri_contiguous.stride(0), z_tri_contiguous.stride(1), - BLOCK_M=shape[0], BLOCK_N=shape[1]) + BLOCK_M=shape[0], BLOCK_N=shape[1], + num_ctas=num_ctas) # numpy result if dtype_str == 'float8e4b15': ty = tl.float8e4b15 @@ -1960,6 +2087,7 @@ def kernel(X, stride_xm, stride_xn, assert 'ld.global.v4' in ptx assert 'st.global.v4' in ptx + # --------------- # test dot # --------------- @@ -1993,7 +2121,8 @@ def kernel(X, stride_xm, stride_xn, ('float16', 'float16'), ('float16', 'float32'), ('float32', 'float32')]]) -def test_dot(M, N, K, num_warps, col_a, col_b, epilogue, allow_tf32, in_dtype, out_dtype, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_dot(M, N, K, num_warps, col_a, col_b, epilogue, allow_tf32, in_dtype, out_dtype, num_ctas, device): check_cuda_only(device) capability = torch.cuda.get_device_capability() @@ -2010,9 +2139,16 @@ def test_dot(M, N, K, num_warps, col_a, col_b, epilogue, allow_tf32, in_dtype, o if out_dtype == 'float16': # TODO: support out_dtype=float16 for tl.dot on V100 pytest.skip("Only test out_dtype=float16 on devices with sm >=80") + if capability[0] == 9 and out_dtype == 'float16': + # TODO: support out_dtype=float16 for tl.dot on H100 + pytest.skip("Only test out_dtype=float16 on devices with sm<90") torch.backends.cuda.matmul.allow_tf32 = allow_tf32 + if num_ctas > 1 and in_dtype == 'int8': + # FIXME: mma v2 with num_ctas > 1 does not work + pytest.skip() + # triton kernel @triton.jit def kernel(X, stride_xm, stride_xk, @@ -2107,14 +2243,20 @@ def kernel(X, stride_xm, stride_xk, DO_SOFTMAX=epilogue == 'softmax', CHAIN_DOT=epilogue == 'chain-dot', ALLOW_TF32=allow_tf32, - num_warps=num_warps) + num_warps=num_warps, num_ctas=num_ctas) if epilogue == 'softmax' and (in_dtype != 'float32' or allow_tf32): ptx = pgm.asm["ptx"] start = ptx.find("shfl.sync") end = ptx.find("cvt.rn.f16.f32") red_code = ptx[start:end] assert len(red_code) > 0 - assert "shared" not in red_code + import os + enable_mmav3 = os.environ.get('ENABLE_MMA_V3', 'not found').lower() + enable_tma = os.environ.get('ENABLE_TMA', 'not found').lower() + # skip this check on hopper because there are some functions whose name contain "shared" in ptx. + # TODO: we should eliminate these unused functions in ptx code. + if not (enable_mmav3 in ["on", "true", "1"] and enable_tma in ["on", "true", "1"]): + assert "shared" not in red_code assert "bar.sync" not in red_code # torch result if in_dtype == 'int8': @@ -2151,13 +2293,14 @@ def kernel(X, stride_xm, stride_xk, assert 'ld.global.v4' in ptx assert 'st.global.v4' in ptx if in_dtype == 'float32' and allow_tf32: - assert 'mma.sync.aligned.m16n8k8.row.col.f32.tf32.tf32.f32' in ptx - elif in_dtype == 'float32' and allow_tf32: - assert 'mma.sync.aligned.m16n8k8.row.col.f32.tf32.tf32.f32' not in ptx - elif in_dtype == 'int8': - assert 'mma.sync.aligned.m16n8k32.row.col.satfinite.s32.s8.s8.s32' in ptx - elif out_dtype == tl.float16: + assert re.search(r'[mma|wgmma.mma_async].sync.aligned.m\d+n\d+k8(?:.row.col)?.f32.tf32.tf32', ptx) + elif in_dtype == 'float16' and out_dtype == tl.float32: + assert re.search(r'[mma|wgmma.mma_async].sync.aligned.m\d+n\d+k16(?:.row.col)?.f32.f16.f16', ptx) + elif in_dtype == 'float16' and out_dtype == tl.float16: assert 'mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16' in ptx + elif in_dtype == 'int8': + assert 'wgmma.mma_async.sync.aligned' in ptx or\ + 'mma.sync.aligned.m16n8k32.row.col.satfinite.s32.s8.s8.s32' in ptx @pytest.mark.parametrize('in_dtype', ['float32']) @@ -2197,7 +2340,16 @@ def kernel(Z, X, Y, z_ref = np.matmul(x, y) np.testing.assert_allclose(z_ref, to_numpy(z_tri), atol=0.01) assert "tt.dot" in h.asm['ttir'] - assert "triton_gpu.async_wait {num = 2 : i32}" in h.asm['ttgir'] + # with option ENABLE_MMA_V3 on, we will not pipeline the load op for Y + # as the loaded value is in rowmajor. But MMAv3 requires it's second + # operand is in colmajor because transpose is not supported for MMAv3 + # with float32 input. + import os + enable_mmav3 = os.environ.get('ENABLE_MMA_V3', 'not found').lower() + if enable_mmav3 in ["on", "true", "1"]: + assert "triton_gpu.async_wait {num = 1 : i32}" in h.asm['ttgir'] + else: + assert "triton_gpu.async_wait {num = 2 : i32}" in h.asm['ttgir'] @pytest.mark.parametrize("dtype_str", int_dtypes + uint_dtypes + float_dtypes + ['bfloat16']) @@ -2271,7 +2423,8 @@ def _kernel(out): @pytest.mark.parametrize("start", [0, 1, 7, 16]) -def test_arange(start, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_arange(start, num_ctas, device): BLOCK = 128 z_tri = torch.empty(BLOCK, dtype=torch.int32, device=device) @@ -2281,7 +2434,7 @@ def _kernel(z, BLOCK: tl.constexpr, off = tl.arange(0, BLOCK) val = tl.arange(START, END) tl.store(z + off, val) - _kernel[(1,)](z_tri, START=start, END=start + BLOCK, BLOCK=BLOCK) + _kernel[(1,)](z_tri, START=start, END=start + BLOCK, BLOCK=BLOCK, num_ctas=num_ctas) z_ref = torch.arange(start, BLOCK + start, dtype=torch.int32, device=device) np.testing.assert_allclose(to_numpy(z_tri), to_numpy(z_ref)) @@ -2291,7 +2444,8 @@ def _kernel(z, BLOCK: tl.constexpr, @pytest.mark.parametrize("dtype_str, size, size_diff", [(dtype_str, size, size_diff) for dtype_str in torch_dtypes for size in [128, 512] for size_diff in [0, 1, 2, 3, 4]]) -def test_masked_load(dtype_str, size, size_diff, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_masked_load(dtype_str, size, size_diff, num_ctas, device): dtype = getattr(torch, dtype_str) check_type_supported(dtype, device) # bfloat16 on cc < 80 will not be tested @@ -2316,7 +2470,7 @@ def _kernel(in_ptr, out_ptr, in_size: tl.constexpr, out_size: tl.constexpr): mask_str = "mask=in_offsets < in_size, other=1" if size_diff > 0 else "None" kernel = patch_kernel(_kernel, {'GENERATE_TEST_HERE': f"tl.load(in_ptr + in_offsets, {mask_str})"}) - kernel[(1,)](input, output, input_size, output_size) + kernel[(1,)](input, output, input_size, output_size, num_ctas=num_ctas) reference_out = torch.cat((input, torch.ones((size_diff,), dtype=dtype, device=device))) # print((output - reference_out).nonzero()) @@ -2325,6 +2479,7 @@ def _kernel(in_ptr, out_ptr, in_size: tl.constexpr, out_size: tl.constexpr): # Testing masked loads with an intermate copy to shared memory run. +# FIXME: Shape too small for ldmatrix when num_ctas=4 @pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16, torch.float32]) def test_masked_load_shared_memory(dtype, device): check_type_supported(dtype, device) # bfloat16 on cc < 80 will not be tested @@ -2399,16 +2554,19 @@ def _kernel(dst, src, CACHE: tl.constexpr): @pytest.mark.parametrize("N", [16, 10, 11, 1024]) -def test_vectorization(N, device): - src = torch.empty(1024, device=device) - dst = torch.empty(1024, device=device) +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_vectorization(N, num_ctas, device): + block_size = 1024 * num_ctas + src = torch.empty(block_size, device=device) + dst = torch.empty(block_size, device=device) @triton.jit def _kernel(dst, src, N, BLOCK_SIZE: tl.constexpr): offsets = tl.program_id(0) * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE) x = tl.load(src + offsets, mask=offsets < N) tl.store(dst + offsets, x, mask=offsets < N) - pgm = _kernel[(1,)](dst, src, N=N, BLOCK_SIZE=src.shape[0]) + pgm = _kernel[(1,)]( + dst, src, N=N, BLOCK_SIZE=block_size) ptx = pgm.asm["ptx"] if N % 16 == 0: assert "ld.global.v4.b32" in ptx @@ -2686,7 +2844,8 @@ def vecmul_kernel(ptr, n_elements, rep, type: tl.constexpr): @pytest.mark.parametrize("type", ["inline", "noinline"]) -def test_call(type, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_call(type, num_ctas, device): @triton.jit def kernel(ptr, n_elements, num1, num2, type: tl.constexpr): @@ -2698,7 +2857,7 @@ def kernel(ptr, n_elements, num1, num2, type: tl.constexpr): rand_val_tri = to_triton(rand_val, device=device) err_msg = "" try: - kernel[(size // 128,)](rand_val_tri, size, 3, 5, type) + kernel[(size // 128,)](rand_val_tri, size, 3, 5, type, num_ctas=num_ctas) except Exception as e: err_msg = str(e) @@ -2772,7 +2931,8 @@ def _kernel(dst): ('float32', 'math.pow', tl.math.libdevice_path()), ('float64', 'math.pow_dtype', tl.math.libdevice_path()), ('float64', 'math.norm4d', '')]) -def test_math_tensor(dtype_str, expr, lib_path, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_math_tensor(dtype_str, expr, lib_path, num_ctas, device): @triton.jit def kernel(X, Y, BLOCK: tl.constexpr): @@ -2816,7 +2976,7 @@ def kernel(X, Y, BLOCK: tl.constexpr): x_tri = to_triton(x, device=device) # triton result y_tri = to_triton(numpy_random((shape[0],), dtype_str=dtype_str, rs=rs), device=device) - kernel[(1,)](x_tri, y_tri, BLOCK=shape[0], extern_libs={'libdevice': lib_path}) + kernel[(1,)](x_tri, y_tri, BLOCK=shape[0], extern_libs={'libdevice': lib_path}, num_ctas=num_ctas) # compare if expr == 'math.ffs': np.testing.assert_equal(y_ref, to_numpy(y_tri)) @@ -2828,7 +2988,8 @@ def kernel(X, Y, BLOCK: tl.constexpr): [('float32', 'math.pow', ''), ('float64', 'math.pow_dtype', ''), ('float64', 'math.pow', tl.math.libdevice_path())]) -def test_math_scalar(dtype_str, expr, lib_path, device): +@pytest.mark.parametrize("num_ctas", num_ctas_list) +def test_math_scalar(dtype_str, expr, lib_path, num_ctas, device): @triton.jit def kernel(X, Y, BLOCK: tl.constexpr): @@ -2855,7 +3016,7 @@ def kernel(X, Y, BLOCK: tl.constexpr): # triton result x_tri = to_triton(x, device=device)[0].item() y_tri = to_triton(numpy_random((shape[0],), dtype_str=dtype_str, rs=rs), device=device) - kernel[(1,)](x_tri, y_tri, BLOCK=shape[0], extern_libs={'libdevice': lib_path}) + kernel[(1,)](x_tri, y_tri, BLOCK=shape[0], extern_libs={'libdevice': lib_path}, num_ctas=num_ctas) # compare np.testing.assert_allclose(y_ref, to_numpy(y_tri), rtol=0.01) @@ -3180,24 +3341,24 @@ def kernel(Out): layouts = [ - # MmaLayout(version=1, warps_per_cta=[1, 4]), - MmaLayout(version=(2, 0), warps_per_cta=[1, 4]), - # MmaLayout(version=1, warps_per_cta=[4, 1]), - MmaLayout(version=(2, 0), warps_per_cta=[4, 1]), - BlockedLayout([1, 8], [2, 16], [4, 1], [1, 0]), - BlockedLayout([1, 4], [4, 8], [2, 2], [1, 0]), - BlockedLayout([1, 1], [1, 32], [2, 2], [1, 0]), - BlockedLayout([8, 1], [16, 2], [1, 4], [0, 1]), - BlockedLayout([4, 1], [8, 4], [2, 2], [0, 1]), - BlockedLayout([1, 1], [32, 1], [2, 2], [0, 1]), - BlockedLayout([4, 4], [1, 32], [4, 1], [1, 0]) + # MmaLayout(1, [1, 4], [1, 1], [0, 1]), + # MmaLayout((2, 0), [1, 4], [1, 1], [1, 1], [0, 1], [16, 8]), + # MmaLayout(1, [4, 1], [1, 1], [0, 1]), + # MmaLayout((2, 0), [4, 1], [1, 1], [1, 1], [0, 1], [16, 8]), + BlockedLayout([1, 8], [2, 16], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 4], [4, 8], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 1], [1, 32], [2, 2], [1, 0], [1, 1], [1, 1], [0, 1]), + BlockedLayout([8, 1], [16, 2], [1, 4], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([4, 1], [8, 4], [2, 2], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([1, 1], [32, 1], [2, 2], [0, 1], [1, 1], [1, 1], [0, 1]), + BlockedLayout([4, 4], [1, 32], [4, 1], [1, 0], [1, 1], [1, 1], [0, 1]) ] intermediate_layouts = [ None, - SharedLayout(1, 1, 1, [1, 0]), - SharedLayout(4, 2, 4, [1, 0]), - SharedLayout(2, 2, 4, [1, 0]), + SharedLayout(1, 1, 1, [1, 0], [1, 1], [1, 1], [0, 1]), + SharedLayout(4, 2, 4, [1, 0], [1, 1], [1, 1], [0, 1]), + SharedLayout(2, 2, 4, [1, 0], [1, 1], [1, 1], [0, 1]), ] @@ -3235,7 +3396,7 @@ def test_convert2d(dtype, shape, src_layout, interm_layout, dst_layout, device): """ ir = layouts + """ - module attributes {"triton_gpu.num-warps" = 4 : i32} { + module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.threads-per-warp" = 32 : i32} { tt.func public @kernel_0d1d(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}) { %cst = arith.constant dense<128> : tensor<128x1xi32, #src> %0 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #src}>> diff --git a/python/test/unit/operators/test_flash_attention.py b/python/test/unit/operators/test_flash_attention.py index 55ff30774294..4bacf53b71ca 100644 --- a/python/test/unit/operators/test_flash_attention.py +++ b/python/test/unit/operators/test_flash_attention.py @@ -13,6 +13,13 @@ @pytest.mark.parametrize('causal', [True, False]) @pytest.mark.parametrize('seq_par', [True, False]) def test_op(Z, H, N_CTX, D_HEAD, dtype, causal, seq_par): + # with ENABLE_TMA=0 and ENABLE_MMA_V3=0 + import os + enable_mmav3 = os.environ.get('ENABLE_MMA_V3', 'not found').lower() + enable_tma = os.environ.get('ENABLE_TMA', 'not found').lower() + if enable_mmav3 in ["on", "true", "1"] and enable_tma in ["on", "true", "1"]: + pytest.skip('Segmentation fault') + capability = torch.cuda.get_device_capability() if capability[0] < 8: pytest.skip("Flash attention only supported for compute capability < 80") diff --git a/python/test/unit/operators/test_matmul.py b/python/test/unit/operators/test_matmul.py index 4e441e3a57d8..b173451e427e 100644 --- a/python/test/unit/operators/test_matmul.py +++ b/python/test/unit/operators/test_matmul.py @@ -103,7 +103,10 @@ def kernel(Y, X, N, BLOCK_SIZE: tl.constexpr): (128, 128, 32, 1, 4, 2, None, None, None, False, True, ADTYPE, BDTYPE), ] for ADTYPE, BDTYPE in [("float8e4b15", "float8e5"), ("float8e4b15", "float16"), - ("float16", "float8e4b15")] + ("float16", "float8e4b15"), + ("float8e5", "float8e5"), + ("float8e4", "float8e4"), + ("int8", "int8")] ] ), ) @@ -141,6 +144,8 @@ def init_input(n, m, t, dtype, is_float8): return init_input(m, n, False, dtype, is_float8).t() if is_float8: return torch.randint(20, 50, (n, m), device="cuda", dtype=torch.int8) + if dtype == "int8": + return torch.randint(-128, 127, (n, m), device="cuda", dtype=torch.int8) dtype = {"float16": torch.float16, "bfloat16": torch.bfloat16, "float32": torch.float32}[dtype] return .1 * torch.randn((n, m), device="cuda", dtype=dtype) @@ -155,6 +160,8 @@ def init_input(n, m, t, dtype, is_float8): if BT and b_fp8: th_b = th_b.view(th_b.shape[::-1]).T th_c = torch.matmul(th_a, th_b) + if ADTYPE == "int8" or BDTYPE == "int8": + th_c = th_c.to(torch.int8) try: if a_fp8: a = triton.reinterpret(a, getattr(tl, ADTYPE)) diff --git a/python/test/unit/runtime/test_cache.py b/python/test/unit/runtime/test_cache.py index e13921079992..6f9b94d907f2 100644 --- a/python/test/unit/runtime/test_cache.py +++ b/python/test/unit/runtime/test_cache.py @@ -70,7 +70,8 @@ def test_nested1_change(): def reset_tmp_dir(): os.environ["TRITON_CACHE_DIR"] = tmpdir if os.path.exists(tmpdir): - shutil.rmtree(tmpdir) + # https://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty + shutil.rmtree(tmpdir, ignore_errors=True) def test_reuse(): @@ -98,7 +99,7 @@ def inc_counter(*args, **kwargs): reset_tmp_dir() x = torch.empty(1, dtype=torch.int32, device='cuda') function = {'enable': kernel, 'disable': kernel_nospec}[mode] - target = {'enable': 3, 'disable': 1}[mode] + target = {'enable': 4, 'disable': 1}[mode] for i in [1, 2, 4, 8, 16, 32]: function[(1,)](x, i, BLOCK=512) assert counter == target diff --git a/python/test/unit/runtime/test_launch.py b/python/test/unit/runtime/test_launch.py index fc79ab67aac6..d3f9fd01bda8 100644 --- a/python/test/unit/runtime/test_launch.py +++ b/python/test/unit/runtime/test_launch.py @@ -38,7 +38,7 @@ def kernel(in_ptr0, out_ptr0, xnumel, XBLOCK: tl.constexpr): kernel[(10,)](inp, out, 10, XBLOCK=16) gc.collect() end, _ = tracemalloc.get_traced_memory() - assert end - begin < 5000 + assert end - begin < 30000 finally: tracemalloc.stop() diff --git a/python/test/unit/runtime/test_subproc.py b/python/test/unit/runtime/test_subproc.py index 0e0d33c6fd21..05e36eee8f1c 100644 --- a/python/test/unit/runtime/test_subproc.py +++ b/python/test/unit/runtime/test_subproc.py @@ -14,10 +14,10 @@ def reset_tmp_dir(): os.environ["TRITON_CACHE_DIR"] = tmpdir if os.path.exists(tmpdir): - shutil.rmtree(tmpdir) + shutil.rmtree(tmpdir, ignore_errors=True) -instance_descriptor = namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1"]) +instance_descriptor = namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1", "ids_of_folded_args", "divisible_by_8"]) def compile_fn(config, cc): @@ -39,7 +39,7 @@ def kernel_sub(a, b, o, N: tl.constexpr): def test_compile_in_subproc() -> None: major, minor = torch.cuda.get_device_capability(0) cc = major * 10 + minor - config = instance_descriptor(tuple(range(4)), ()) + config = instance_descriptor(tuple(range(4)), (), (), ()) multiprocessing.set_start_method('fork') proc = multiprocessing.Process( @@ -72,7 +72,7 @@ def test_compile_in_forked_subproc() -> None: reset_tmp_dir() major, minor = torch.cuda.get_device_capability(0) cc = major * 10 + minor - config = instance_descriptor(tuple(range(1)), ()) + config = instance_descriptor(tuple(range(1)), (), (), ()) assert multiprocessing.get_start_method() == 'fork' proc = multiprocessing.Process( diff --git a/python/test/unit/tools/test_aot.py b/python/test/unit/tools/test_aot.py index 69919a265200..1bcd14a81405 100644 --- a/python/test/unit/tools/test_aot.py +++ b/python/test/unit/tools/test_aot.py @@ -228,7 +228,7 @@ def test_launcher_has_no_available_kernel(): def test_ttgir_to_ptx(): src = """ -module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32} { +module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32, "triton_gpu.num-ctas" = 1 : i32} { tt.func public @sum_kernel_0d1d(%arg0: !tt.ptr, %arg1: !tt.ptr) { tt.return } diff --git a/python/triton/compiler/code_generator.py b/python/triton/compiler/code_generator.py index e9bca5a076c4..c574c21e80bf 100644 --- a/python/triton/compiler/code_generator.py +++ b/python/triton/compiler/code_generator.py @@ -350,7 +350,8 @@ def visit_FunctionDef(self, node): continue else: if i in self.attributes: - fn.set_arg_attr(idx, "tt.divisibility", self.attributes[i][1]) + for name, value in self.attributes[i]: + fn.set_arg_attr(idx, name, value) arg_values.append(tensor(fn.args(idx), self.prototype.param_types[idx])) idx += 1 @@ -496,7 +497,7 @@ def visit_then_else_blocks(self, node, liveins, then_block, else_block): # check type for defs, block_name in [(then_defs, 'then'), (else_defs, 'else')]: if name in defs: - assert defs[name].type == liveins[name].type,\ + assert defs[name].type == liveins[name].type, \ f'initial value for `{name}` is of type {liveins[name].type}, '\ f'but the {block_name} block redefines it as {defs[name].type}' if name in then_defs or name in else_defs: @@ -516,7 +517,7 @@ def visit_then_else_blocks(self, node, liveins, then_block, else_block): continue then_ty = then_defs[name].type else_ty = else_defs[name].type - assert then_ty == else_ty,\ + assert then_ty == else_ty, \ f'mismatched type for {name} between then block ({then_ty}) '\ f'and else block ({else_ty})' names.append(name) @@ -814,7 +815,7 @@ def visit_For(self, node): if name in liveins: assert _is_triton_tensor(self.local_defs[name]), f'{name} is not tensor' assert _is_triton_tensor(liveins[name]) - assert self.local_defs[name].type == liveins[name].type,\ + assert self.local_defs[name].type == liveins[name].type, \ f'Loop-carried variable {name} has initial type {liveins[name].type} '\ f'but is re-assigned to {self.local_defs[name].type} in loop! '\ f'Please make sure that the type stays consistent.' @@ -1084,7 +1085,7 @@ def str_to_ty(name): def kernel_suffix(signature, specialization): # suffix format: - # <'c' if equal to 1><'d' if divisible by 16> + # <'c' if equal to 1><'d' if divisible by 16><'e' if divisible by 8> suffix = '' for i, _ in enumerate(signature): suffix += str(i) @@ -1092,6 +1093,8 @@ def kernel_suffix(signature, specialization): suffix += 'c' if i in specialization.divisible_by_16: suffix += 'd' + if i in specialization.divisible_by_8: + suffix += 'e' return suffix @@ -1109,7 +1112,12 @@ def ast_to_ttir(fn, signature, specialization, constants, debug, arch): function_name = '_'.join([fn.__name__, kernel_suffix(signature.values(), specialization)]) tys = list(signature.values()) new_constants = {k: True if k in tys and tys[k] == "i1" else 1 for k in specialization.equal_to_1} - new_attrs = {k: ("multiple_of", 16) for k in specialization.divisible_by_16} + new_attrs = {k: [("tt.divisibility", 16)] for k in specialization.divisible_by_16} + for k in specialization.divisible_by_8: + attr = new_attrs[k] if k in new_attrs else [] + attr.append(("tt.max_divisibility", 8)) + new_attrs[k] = attr + all_constants = constants.copy() all_constants.update(new_constants) arg_types = [str_to_ty(v) for k, v in signature.items() if k not in constants] diff --git a/python/triton/compiler/compiler.py b/python/triton/compiler/compiler.py index 872630e5c417..09e673e7a6fe 100644 --- a/python/triton/compiler/compiler.py +++ b/python/triton/compiler/compiler.py @@ -11,8 +11,10 @@ from pathlib import Path from typing import Any, Tuple +import triton +import triton._C.libtriton.triton as _triton from .._C.libtriton.triton import (add_external_libs, compile_ptx_to_cubin, - get_shared_memory_size, ir, + get_num_warps, get_shared_memory_size, ir, translate_llvmir_to_hsaco, translate_llvmir_to_ptx, translate_triton_gpu_to_llvmir) from ..common.backend import get_backend, path_to_ptxas @@ -26,6 +28,8 @@ from ..tools.disasm import extract from .code_generator import ast_to_ttir from .make_launcher import make_stub +from .utils import (InfoFromBackendForTensorMap, TensorMapManager, + get_ids_of_tensormaps, parse_tma_info) def inline_triton_ir(mod): @@ -63,31 +67,64 @@ def optimize_ttir(mod, arch): return mod -def ttir_to_ttgir(mod, num_warps): +def ttir_to_ttgir(mod, num_warps, num_ctas, arch): pm = ir.pass_manager(mod.context) pm.enable_debug() - pm.add_convert_triton_to_tritongpu_pass(num_warps) + pm.add_convert_triton_to_tritongpu_pass(num_warps, 32, num_ctas, arch) pm.run(mod) return mod -def optimize_ttgir(mod, num_stages, arch): +def optimize_ttgir(mod, num_stages, num_warps, num_ctas, arch, + cluster_info, enable_warp_specialization, enable_persistent, optimize_epilogue): pm = ir.pass_manager(mod.context) pm.enable_debug() pm.add_tritongpu_coalesce_pass() + # TODO(Qingyi): Move PlanCTAPass to the front of CoalescePass + pm.add_plan_cta_pass(cluster_info) + if _is_cuda(arch): + pm.add_tritongpu_rewrite_tensor_pointer_pass(arch) + pm.add_plan_cta_pass(cluster_info) pm.add_tritongpu_remove_layout_conversions_pass() if isinstance(arch, int): pm.add_tritongpu_accelerate_matmul_pass(arch) pm.add_tritongpu_remove_layout_conversions_pass() + if optimize_epilogue: + pm.add_tritongpu_optimize_epilogue_pass() pm.add_tritongpu_optimize_dot_operands_pass() - pm.add_tritongpu_pipeline_pass(num_stages) - pm.add_tritongpu_prefetch_pass() + ws_enabled = False + # `num_warps` does not mean the total number of warps of a CTA when + # warp specialization is enabled. + # it's the responsibility of the compiler to figure out the exact + # `num_warps` to use. + # TODO: support the case where `num_warps` from user is not 4. + if arch // 10 >= 9 and enable_warp_specialization and num_warps == 4: + pm.add_tritongpu_ws_feasibility_checking_pass(arch) + pm.run(mod) + ws_enabled = _triton.ir.is_ws_supported(mod) + pm = _triton.ir.pass_manager(mod.context) + pm.enable_debug() + if ws_enabled: + pm.add_tritongpu_wsdecomposing_pass(arch) + pm.add_tritongpu_wspipeline_pass( + num_stages, num_warps, arch) + pm.add_tritongpu_wsmutex_pass(arch) + pm.add_tritongpu_wsmaterialization_pass(arch) + pm.add_cse_pass() + else: + pm.add_tritongpu_pipeline_pass( + num_stages, num_warps, num_ctas, arch) + pm.add_tritongpu_materialize_load_store_pass(num_warps, arch) + if arch // 10 <= 8: + pm.add_tritongpu_prefetch_pass() pm.add_tritongpu_optimize_dot_operands_pass() pm.add_tritongpu_remove_layout_conversions_pass() pm.add_tritongpu_decompose_conversions_pass() pm.add_tritongpu_reorder_instructions_pass() pm.add_cse_pass() pm.add_symbol_dce_pass() + if arch // 10 >= 9: + pm.add_tritongpu_fence_insertion_pass() pm.run(mod) return mod @@ -99,12 +136,12 @@ def _add_external_libs(mod, libs): add_external_libs(mod, list(libs.keys()), list(libs.values())) -def ttgir_to_llir(mod, extern_libs, arch): +def ttgir_to_llir(mod, extern_libs, arch, tma_infos): if extern_libs: _add_external_libs(mod, extern_libs) # TODO: separate tritongpu_to_llvmir for different backends if _is_cuda(arch): - return translate_triton_gpu_to_llvmir(mod, arch, False) + return translate_triton_gpu_to_llvmir(mod, arch, tma_infos, False) else: return translate_triton_gpu_to_llvmir(mod, 0, True) @@ -239,18 +276,22 @@ def convert_type_repr(x): return x -def make_hash(fn, arch, **kwargs): +def make_hash(fn, arch, env_vars, **kwargs): if isinstance(fn, JITFunction): configs = kwargs["configs"] signature = kwargs["signature"] constants = kwargs.get("constants", dict()) num_warps = kwargs.get("num_warps", 4) + num_ctas = kwargs.get("num_ctas", 1) num_stages = kwargs.get("num_stages", 3) + enable_warp_specialization = kwargs.get("enable_warp_specialization", False) + enable_persistent = kwargs.get("enable_persistent", False) debug = kwargs.get("debug", False) # Get unique key for the compiled code - get_conf_key = lambda conf: (sorted(conf.divisible_by_16), sorted(conf.equal_to_1)) + get_conf_key = lambda conf: (sorted(conf.divisible_by_16), sorted(conf.equal_to_1), sorted(conf.ids_of_folded_args), sorted(conf.divisible_by_8)) configs_key = [get_conf_key(conf) for conf in configs] - key = f"{fn.cache_key}-{''.join(signature.values())}-{configs_key}-{constants}-{num_warps}-{num_stages}-{debug}-{arch}" + env_vars_list = [f"{env_vars[k]}" for k in sorted(env_vars.keys())] + key = f"{fn.cache_key}-{''.join(signature.values())}-{configs_key}-{constants}-{num_warps}-{num_stages}-{num_ctas}-{num_stages}-{enable_warp_specialization}-{enable_persistent}-{debug}-{arch}-{env_vars_list}" return hashlib.md5(key.encode("utf-8")).hexdigest() assert isinstance(fn, str) return hashlib.md5((Path(fn).read_text() + version_key()).encode("utf-8")).hexdigest() @@ -303,7 +344,7 @@ def parse_mlir_module(path, context): return module -instance_descriptor = namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1"], defaults=[set(), set()]) +instance_descriptor = namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1", "ids_of_folded_args", "divisible_by_8"], defaults=[set(), set(), set(), set()]) # TODO: architecture descriptor class @@ -368,21 +409,36 @@ def compile(fn, **kwargs): context = ir.context() constants = kwargs.get("constants", dict()) num_warps = kwargs.get("num_warps", 4) + num_ctas = kwargs.get("num_ctas", 1) num_stages = kwargs.get("num_stages", 3 if is_cuda and arch >= 75 else 2) + # TODO[shuhaoj]: Default should be to enable warp specialization once possible + enable_warp_specialization = kwargs.get("enable_warp_specialization", False) + # TODO[shuhaoj]: persistent can be decoupled with warp specialization + enable_persistent = kwargs.get("enable_persistent", enable_warp_specialization) extern_libs = kwargs.get("extern_libs", dict()) if extern_libs is None: extern_libs = dict() debug = kwargs.get("debug", False) - + # Flag to control whether to store mma layout directly + optimize_epilogue = False + if os.environ.get('OPTIMIZE_EPILOGUE', '') == '1': + optimize_epilogue = True + # + cluster_info = _triton.ClusterInfo() + if "clusterDims" in kwargs: + cluster_info.clusterDimX = kwargs["clusterDims"][0] + cluster_info.clusterDimY = kwargs["clusterDims"][1] + cluster_info.clusterDimZ = kwargs["clusterDims"][2] + tma_infos = _triton.TMAInfos() # build compilation stages stages = dict() stages["ast"] = (lambda path: fn, None) stages["ttir"] = (lambda path: parse_mlir_module(path, context), lambda src: optimize_ttir(ast_to_ttir(src, signature, configs[0], constants, debug=debug, arch=arch), arch)) stages["ttgir"] = (lambda path: parse_mlir_module(path, context), - lambda src: optimize_ttgir(ttir_to_ttgir(src, num_warps), num_stages, arch)) + lambda src: optimize_ttgir(ttir_to_ttgir(src, num_warps, num_ctas, arch), num_stages, num_warps, num_ctas, arch, cluster_info, enable_warp_specialization, enable_persistent, optimize_epilogue)) stages["llir"] = (lambda path: Path(path).read_text(), - lambda src: ttgir_to_llir(src, extern_libs, arch)) + lambda src: ttgir_to_llir(src, extern_libs, arch, tma_infos)) if is_cuda: add_cuda_stages(arch, extern_libs, stages) elif is_hip: @@ -420,14 +476,8 @@ def compile(fn, **kwargs): signature = {k: v for k, v in enumerate(param_tys)} first_stage = list(stages.keys()).index(ir_name) - # cache manager - if is_cuda or is_hip: - so_path = make_stub(name, signature, constants) - else: - so_path = _device_backend.make_launcher_stub(name, signature, constants) - # create cache manager - fn_cache_manager = get_cache_manager(make_hash(fn, arch, **kwargs)) + fn_cache_manager = get_cache_manager(make_hash(fn, arch, _triton.get_env_vars(), **kwargs)) # determine name and extension type of provided function if isinstance(fn, JITFunction): name, ext = fn.__name__, "ast" @@ -448,18 +498,26 @@ def compile(fn, **kwargs): if metadata_path is not None: with open(metadata_path) as f: metadata = json.load(f) + if 'tensormaps_info' in metadata: + metadata['tensormaps_info'] = [ + InfoFromBackendForTensorMap(e) for e in metadata['tensormaps_info']] else: metadata = {"num_warps": num_warps, + "num_ctas": num_ctas, "num_stages": num_stages, + "enable_warp_specialization": enable_warp_specialization, + "enable_persistent": enable_persistent, "constants": _get_jsonable_constants(constants), "debug": debug, "arch": arch, } + metadata.update(_triton.get_env_vars()) if ext == "ptx": assert "shared" in kwargs, "ptx compilation must provide shared memory size" metadata["shared"] = kwargs["shared"] # Add device type to meta information metadata["device_type"] = device_type + metadata["cache_key"] = fn_cache_manager.key first_stage = list(stages.keys()).index(ext) asm = dict() @@ -498,18 +556,48 @@ def compile(fn, **kwargs): asm[ir_name] = str(next_module) if ir_name == "llir" and "shared" not in metadata: metadata["shared"] = get_shared_memory_size(module) + if ir_name == "ttgir" and enable_warp_specialization: + metadata["num_warps"] = get_num_warps(module) if ir_name == "ptx": metadata["name"] = get_kernel_name(next_module, pattern='// .globl') if ir_name == "amdgcn": metadata["name"] = get_kernel_name(next_module[0], pattern='.globl') asm["hsaco_path"] = next_module[1] + if ir_name == "ttgir": + metadata["enable_warp_specialization"] = _triton.ir.is_ws_supported(next_module) if not is_cuda and not is_hip: _device_backend.add_meta_info(ir_name, module, next_module, metadata, asm) module = next_module + + ids_of_folded_args = tuple([int(k) for k in configs[0].ids_of_folded_args]) if isinstance(fn, triton.runtime.JITFunction) else () + if "clusterDims" not in metadata: + metadata["clusterDims"] = [ + cluster_info.clusterDimX, + cluster_info.clusterDimY, + cluster_info.clusterDimZ] + + if len(tma_infos) > 0: + metadata["tensormaps_info"] = parse_tma_info(tma_infos, ids_of_folded_args) + # set constant + if "tensormaps_info" in metadata: + for i, _ in enumerate(metadata["tensormaps_info"]): + metadata["tensormaps_info"][i].ids_of_folded_args = ids_of_folded_args + + ids_of_tensormaps = get_ids_of_tensormaps(metadata.get("tensormaps_info", None)) + if isinstance(fn, triton.runtime.JITFunction) and "tensormaps_info" in metadata: + fn.tensormaps_info = metadata["tensormaps_info"] + + ids_of_const_exprs = tuple(fn.constexprs) if isinstance(fn, triton.runtime.JITFunction) else () + ids = {"ids_of_tensormaps": ids_of_tensormaps, "ids_of_folded_args": ids_of_folded_args, "ids_of_const_exprs": ids_of_const_exprs} + # cache manager + if is_cuda or is_hip: + so_path = make_stub(name, signature, constants, ids, enable_warp_specialization=enable_warp_specialization) + else: + so_path = _device_backend.make_launcher_stub(name, signature, constants, ids) # write-back metadata, if it didn't come from the cache if metadata_path is None: - metadata_group[metadata_filename] = fn_cache_manager.put(json.dumps(metadata), metadata_filename, binary=False) - fn_cache_manager.put_group(metadata_filename, metadata_group) + metadata_group[metadata_filename] = fn_cache_manager.put(json.dumps(metadata, default=vars), metadata_filename, binary=False) + fn_cache_manager.put_group(metadata_filename, metadata_group) # return handle to compiled kernel return CompiledKernel(fn, so_path, metadata, asm) @@ -520,6 +608,7 @@ class CompiledKernel: # Hooks for external tools to monitor the execution of triton kernels launch_enter_hook = None launch_exit_hook = None + tensormap_manager = TensorMapManager() def __init__(self, fn, so_path, metadata, asm): # initialize launcher @@ -530,10 +619,15 @@ def __init__(self, fn, so_path, metadata, asm): spec.loader.exec_module(mod) self.c_wrapper = getattr(mod, "launch") # initialize metadata - self.shared = metadata["shared"] if "shared" in metadata else 0 + self.shared = metadata["shared"] self.num_warps = metadata["num_warps"] + self.num_ctas = metadata["num_ctas"] self.num_stages = metadata["num_stages"] + self.clusterDims = metadata["clusterDims"] + if "tensormaps_info" in metadata: + self.tensormaps_info = metadata["tensormaps_info"] self.constants = metadata["constants"] + self.cache_key = metadata["cache_key"] self.device_type = metadata["device_type"] self.device_backend = get_backend(self.device_type) if self.device_type not in ["cuda", "hip"] else None # initialize asm dict @@ -579,17 +673,29 @@ def __getattribute__(self, name): self._init_handles() return super().__getattribute__(name) + # capture args and expand args with cutensormap* + def assemble_tensormap_to_arg(self, args, constants): + args_with_tma = list(args) + if hasattr(self, 'tensormaps_info'): + # tuple for hashable + args_ptr = tuple([arg.data_ptr() if hasattr(arg, 'data_ptr') else arg for arg in args]) + for i, e in enumerate(self.tensormaps_info): + args_with_tma.append(CompiledKernel.tensormap_manager[(self.cache_key, e, args_ptr)]) + return args_with_tma + def __getitem__(self, grid): self._init_handles() def runner(*args, stream=None): + args_expand = self.assemble_tensormap_to_arg(args, self.constants) if stream is None: if self.device_type in ["cuda", "rocm"]: stream = get_cuda_stream() else: stream = get_backend(self.device_type).get_stream(None) - self.c_wrapper(grid[0], grid[1], grid[2], self.num_warps, self.shared, stream, self.cu_function, - CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, self, *args) + self.c_wrapper(grid[0], grid[1], grid[2], self.num_warps, self.num_ctas, self.clusterDims[0], + self.clusterDims[1], self.clusterDims[2], self.shared, stream, self.cu_function, + CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, self, *args_expand) return runner def get_sass(self, fun=None): diff --git a/python/triton/compiler/make_launcher.py b/python/triton/compiler/make_launcher.py index 3da8ddccf5c5..c30b0be76262 100644 --- a/python/triton/compiler/make_launcher.py +++ b/python/triton/compiler/make_launcher.py @@ -5,6 +5,7 @@ from ..common import _build from ..runtime.cache import get_cache_manager from ..runtime.jit import version_key +from .utils import generate_cu_signature def is_hip(): @@ -15,24 +16,26 @@ def is_hip(): # ----- stub -------- -def make_so_cache_key(version_hash, signature, constants): +def make_so_cache_key(version_hash, signature, constants, ids, **kwargs): # Get unique key for the compiled code signature = {k: 'ptr' if v[0] == '*' else v for k, v in signature.items()} - key = f"{version_hash}-{''.join(signature.values())}{constants}" + key = f"{version_hash}-{''.join(signature.values())}-{constants}-{ids}" + for kw in kwargs: + key = f"{key}-{kwargs.get(kw)}" key = hashlib.md5(key.encode("utf-8")).hexdigest() return key -def make_stub(name, signature, constants): +def make_stub(name, signature, constants, ids, **kwargs): # name of files that are cached - so_cache_key = make_so_cache_key(version_key(), signature, constants) + so_cache_key = make_so_cache_key(version_key(), signature, constants, ids, **kwargs) so_cache_manager = get_cache_manager(so_cache_key) so_name = f"{name}.so" # retrieve stub from cache if it exists cache_path = so_cache_manager.get_file(so_name) if cache_path is None: with tempfile.TemporaryDirectory() as tmpdir: - src = generate_launcher(constants, signature) + src = generate_launcher(constants, signature, ids) src_path = os.path.join(tmpdir, "main.c") with open(src_path, "w") as f: f.write(src) @@ -64,7 +67,9 @@ def ty_to_cpp(ty): }[ty] -def generate_launcher(constants, signature): +def generate_launcher(constants, signature, ids): + start_desc = len(signature) + signature = generate_cu_signature(constants, signature, ids) arg_decls = ', '.join(f"{ty_to_cpp(ty)} arg{i}" for i, ty in signature.items()) def _extracted_type(ty): @@ -95,7 +100,7 @@ def format_of(ty): "int64_t": "L", }[ty] - format = "iiiiiKKOOO" + ''.join([format_of(_extracted_type(ty)) for ty in signature.values()]) + format = "iiiiiiiiiKKOOO" + ''.join([format_of(_extracted_type(ty)) for ty in signature.values()]) # generate glue code if is_hip(): @@ -239,6 +244,8 @@ def format_of(ty): }} """ else: + folded_without_constexprs = [c for c in ids['ids_of_folded_args'] if c not in ids['ids_of_const_exprs']] + params = [i for i in signature.keys() if i >= start_desc or (i not in constants and i not in folded_without_constexprs)] src = f""" #include \"cuda.h\" #include @@ -260,10 +267,32 @@ def format_of(ty): #define CUDA_CHECK(ans) {{ gpuAssert((ans), __FILE__, __LINE__); }} -static void _launch(int gridX, int gridY, int gridZ, int num_warps, int shared_memory, CUstream stream, CUfunction function, {arg_decls}) {{ - void *params[] = {{ {', '.join(f"&arg{i}" for i in signature.keys() if i not in constants)} }}; +static void _launch(int gridX, int gridY, int gridZ, int num_warps, int num_ctas, int clusterDimX, int clusterDimY, int clusterDimZ, int shared_memory, CUstream stream, CUfunction function, {arg_decls}) {{ + void *params[] = {{ {', '.join(f"&arg{i}" for i in params)} }}; if(gridX*gridY*gridZ > 0){{ - CUDA_CHECK(cuLaunchKernel(function, gridX, gridY, gridZ, 32*num_warps, 1, 1, shared_memory, stream, params, 0)); + if (num_ctas == 1) {{ + CUDA_CHECK(cuLaunchKernel(function, gridX, gridY, gridZ, 32*num_warps, 1, 1, shared_memory, stream, params, 0)); + }} else {{ + CUlaunchAttribute launchAttr[2]; + launchAttr[0].id = CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION; + launchAttr[0].value.clusterDim.x = clusterDimX; + launchAttr[0].value.clusterDim.y = clusterDimY; + launchAttr[0].value.clusterDim.z = clusterDimZ; + launchAttr[1].id = CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE; + launchAttr[1].value.clusterSchedulingPolicyPreference = CU_CLUSTER_SCHEDULING_POLICY_SPREAD; + CUlaunchConfig config; + config.gridDimX = gridX * clusterDimX; + config.gridDimY = gridY * clusterDimY; + config.gridDimZ = gridZ * clusterDimZ; + config.blockDimX = 32 * num_warps; + config.blockDimY = 1; + config.blockDimZ = 1; + config.sharedMemBytes = shared_memory; + config.hStream = stream; + config.attrs = launchAttr; + config.numAttrs = 2; + CUDA_CHECK(cuLaunchKernelEx(&config, function, params, 0)); + }} }} }} @@ -318,12 +347,16 @@ def format_of(ty): uint64_t _stream; uint64_t _function; int num_warps; + int num_ctas; + int clusterDimX; + int clusterDimY; + int clusterDimZ; int shared_memory; PyObject *launch_enter_hook = NULL; PyObject *launch_exit_hook = NULL; PyObject *compiled_kernel = NULL; {' '.join([f"{_extracted_type(ty)} _arg{i}; " for i, ty in signature.items()])} - if(!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel, {', '.join(f"&_arg{i}" for i, ty in signature.items())})) {{ + if(!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &num_ctas, &clusterDimX, &clusterDimY, &clusterDimZ, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel, {', '.join(f"&_arg{i}" for i, ty in signature.items())})) {{ return NULL; }} @@ -334,7 +367,7 @@ def format_of(ty): // raise exception asap {"; ".join([f"DevicePtrInfo ptr_info{i} = getPointer(_arg{i}, {i}); if (!ptr_info{i}.valid) return NULL;" if ty[0] == "*" else "" for i, ty in signature.items()])}; - _launch(gridX, gridY, gridZ, num_warps, shared_memory, (CUstream)_stream, (CUfunction)_function, {', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}"for i, ty in signature.items())}); + _launch(gridX, gridY, gridZ, num_warps, num_ctas, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (CUstream)_stream, (CUfunction)_function, {', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}"for i, ty in signature.items())}); if (launch_exit_hook != Py_None) {{ PyObject_CallObject(launch_exit_hook, args); diff --git a/python/triton/compiler/utils.py b/python/triton/compiler/utils.py new file mode 100644 index 000000000000..4c0c7230c916 --- /dev/null +++ b/python/triton/compiler/utils.py @@ -0,0 +1,297 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import annotations + +from ..runtime import driver + + +def generate_cu_signature(constants, signature, ids): + # CUtensorMap*s are always the last arguments + if ids["ids_of_tensormaps"] is not None: + signature = signature.copy() + num_signature = len(signature) + for i, _ in enumerate(ids["ids_of_tensormaps"]): + signature[num_signature + i] = '*CUtensorMap' + return signature + + +def dummy_tensormaps_info(n=2): + ret = [] + for i in range(n): + ret.append(InfoFromBackendForTensorMap(dummy=True)) + return ret + + +def parse_tma_info(infos, ids_of_folded_args): + ret = [] + for info in infos: + e = InfoFromBackendForTensorMap(infos=info) + e.ids_of_folded_args = ids_of_folded_args + ret.append(e) + return ret + + +def get_tma_mapping(tensormaps_info): + ret = {} + if tensormaps_info is not None: + for i, e in enumerate(tensormaps_info): + ret.update(e.get_address_tma_mapping()) + else: + ret = None + return ret + + +def get_ids_of_tensormaps(tensormaps_info): + ret = None + # order is not relevant + if tensormaps_info is not None: + ret = [e.get_id_of_tensormap() for e in tensormaps_info] + return ret + + +# decouple information for tensormap from backend +# please ignore the naming style, xx_yy is compiler.py style, xxYy is to comply with cuda tensormap style +# mixing style is for readability +class InfoFromBackendForTensorMap: + N = 2 + n = 0 + ntma = 0 + + def __init__(self, infos=None, dummy=False): + self.dummy = dummy + self.ids_of_folded_args = () + if not dummy and not isinstance(infos, dict): + self._extract_info_from_backend(infos) + elif not dummy and isinstance(infos, dict): + self._extract_info_from_dict(infos) + elif dummy: + self._dummy() + + def _dummy(self): + assert InfoFromBackendForTensorMap.n < InfoFromBackendForTensorMap.N + if InfoFromBackendForTensorMap.n == 0: + self.tensorDataType = driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT16"] + self.tensorRank = 4 + self.globalAddressArgIdx = 0 + self.globalStridesArgIdx = [7, 6, -1, -1] + self.globalDimsArgIdx = [5, 3, -1, -1] + self.boxDims = [16, 64, 1, 1] + self.elementStrides = [1, 1, 1, 1] + self.interleave = driver.utils.CUtensorMapInterleave["CU_TENSOR_MAP_INTERLEAVE_NONE"] + self.swizzle = driver.utils.CUtensorMapSwizzle["CU_TENSOR_MAP_SWIZZLE_32B"] + self.l2Promotion = driver.utils.CUtensorMapL2promotion["CU_TENSOR_MAP_L2_PROMOTION_L2_128B"] + self.TMADescArgIdx = 11 + self.oobFill = driver.utils.CUtensorMapFloatOOBfill["CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE"] + InfoFromBackendForTensorMap.n += 1 + return + if InfoFromBackendForTensorMap.n == 1: + self.tensorDataType = driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT16"] + self.tensorRank = 4 + self.globalAddressArgIdx = 1 + self.globalStridesArgIdx = [7, 6, -1, -1] + self.globalDimsArgIdx = [5, 3, -1, -1] + self.boxDims = [16, 64, 1, 1] + self.elementStrides = [1, 1, 1, 1] + self.interleave = driver.utils.CUtensorMapInterleave["CU_TENSOR_MAP_INTERLEAVE_NONE"] + self.swizzle = driver.utils.CUtensorMapSwizzle["CU_TENSOR_MAP_SWIZZLE_32B"] + self.l2Promotion = driver.utils.CUtensorMapL2promotion["CU_TENSOR_MAP_L2_PROMOTION_L2_128B"] + self.TMADescArgIdx = 12 + self.oobFill = driver.utils.CUtensorMapFloatOOBfill["CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE"] + InfoFromBackendForTensorMap.n += 1 + return + + def _extract_info_from_backend(self, infos): + self.tensorDataType = infos.tensorDataType + self.tensorRank = infos.tensorRank + self.globalAddressArgIdx = infos.globalAddressArgIdx + self.globalStridesArgIdx = infos.globalStridesArgIdx + self.globalDimsArgIdx = infos.globalDimsArgIdx + self.boxDims = infos.boxDims + self.elementStrides = infos.elementStrides + self.interleave = infos.interleave + self.swizzle = infos.swizzle + self.l2Promotion = infos.l2Promotion + self.oobFill = infos.oobFill + self.TMADescArgIdx = infos.TMADescArgIdx + + # dict could be from cached metadata json + def _extract_info_from_dict(self, infos: dict): + self.tensorDataType = infos['tensorDataType'] + self.tensorRank = infos['tensorRank'] + self.globalAddressArgIdx = infos['globalAddressArgIdx'] + self.globalStridesArgIdx = infos['globalStridesArgIdx'] + self.globalDimsArgIdx = infos['globalDimsArgIdx'] + self.boxDims = infos['boxDims'] + self.elementStrides = infos['elementStrides'] + self.interleave = infos['interleave'] + self.swizzle = infos['swizzle'] + self.l2Promotion = infos['l2Promotion'] + self.oobFill = infos['oobFill'] + self.TMADescArgIdx = infos['TMADescArgIdx'] + + def get_address_tma_mapping(self): + return {self.globalAddressArgIdx: self.TMADescArgIdx + len(self.ids_of_folded_args)} + + def get_id_of_tensormap(self): + return self.TMADescArgIdx + len(self.ids_of_folded_args) + + def getTMADescArgIdx(self): + return self.TMADescArgIdx + + # dtype:cuda.CUtensorMapDataType | int + def bytes_from_type(self, dtype): + return {driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_UINT8"]: 1, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_UINT16"]: 2, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_UINT32"]: 4, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_INT32"]: 4, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_UINT64"]: 8, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_INT64"]: 8, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT16"]: 2, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT32"]: 4, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT64"]: 8, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_BFLOAT16"]: 2, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ"]: 4, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_TFLOAT32"]: 4, + driver.utils.CUtensorMapDataType["CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ"]: 4}[dtype] + + def getTensorMapDataType(self): + return self.tensorDataType + + def getInterleave(self): + return self.interleave + + def getSwizzle(self): + return self.swizzle + + def getL2Promotion(self): + return self.l2Promotion + + def getOobFill(self): + return self.oobFill + + def getTensorRank(self): + return self.tensorRank + + def getBoxDims(self): + return self.boxDims + + def getElementStrides(self): + return self.elementStrides + + def getGlobalAddress(self, args): + idx = self.getOriginArgIdx(self.globalAddressArgIdx, args) + return args[idx] + + # args, captured kernel args in runtime + def getGlobalDims(self, args): + shape = [] + for e in self.globalDimsArgIdx: + t = 1 + # < 0 means folded arg or constant (-1 - value) + # -1 means extended dim which is 1, -2 means folded arg with constant 1 (-1 - value) + if e == -1: + t = 1 + elif e < 0 and e != -1: + t = -e - 1 + else: + idx = self.getOriginArgIdx(e, args) + t = args[idx] + shape.append(t) + return shape + + def getGlobalStrides(self, args): + t_globalDims = [int(e) for e in self.getGlobalDims(args)] + t_globalStridesArgIdx = self.globalStridesArgIdx.copy() + strides_in_elements = [] + # todo: get all stride from backend even in extended mode + for i in range(self.tensorRank): + t = 1 + if t_globalStridesArgIdx[i] == -1: + for ii in range(i): + t *= t_globalDims[ii] + # -2 means the sride in arguments is folded constant 1, we don't use 1 because it can not be distinguished from index 1 + elif t_globalStridesArgIdx[i] == -2: + t = 1 + else: + new_idx = self.getOriginArgIdx(t_globalStridesArgIdx[i], args) + t = args[new_idx] + + strides_in_elements.append(t) + + strides_in_elements = strides_in_elements[1:] + strides_in_bytes = [e * self.bytes_from_type(self.tensorDataType) for e in strides_in_elements] + return strides_in_bytes + + def getOriginArgIdx(self, idx, args): + if self.ids_of_folded_args: + ids_before_folding_arg = [i for i in range(len(args)) if i not in self.ids_of_folded_args] + return ids_before_folding_arg[idx] + else: + return idx + + def tensormap(self, args): + return driver.utils.cuTensorMapEncodeTiled( + self.getTensorMapDataType(), + self.getTensorRank(), + self.getGlobalAddress(args), + self.getGlobalDims(args), + self.getGlobalStrides(args), + self.getBoxDims(), + self.getElementStrides(), + self.getInterleave(), + self.getSwizzle(), + self.getL2Promotion(), + self.getOobFill() + ) + + # make hashable to use as partial key in cache + def __hash__(self): + return hash((self.ids_of_folded_args, self.globalAddressArgIdx, tuple(self.globalDimsArgIdx), tuple(self.globalStridesArgIdx), self.tensorDataType, + self.tensorRank, tuple(self.boxDims), tuple(self.elementStrides), self.interleave, self.swizzle, self.l2Promotion, self.oobFill)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + return (self.ids_of_folded_args, self.globalAddressArgIdx, self.globalDimsArgIdx, self.globalStridesArgIdx, self.tensorDataType, self.tensorRank, self.boxDims, self.elementStrides, self.interleave, self.swizzle, self.l2Promotion, self.oobFill) == ( + other.ids_of_folded_args, other.globalAddressArgIdx, other.globalDimsArgIdx, other.globalStridesArgIdx, other.tensorDataType, other.tensorRank, other.boxDims, other.elementStrides, other.interleave, other.swizzle, other.l2Promotion, other.oobFill) + + +class TensorMapManager: + def __init__(self): + self.tensormaps_device = {} + + def __getitem__(self, key: tuple): + if key in self.tensormaps_device: + return int(self.tensormaps_device[key]) + else: + (cache_key, e, args) = key + t_tensormap = e.tensormap(args) + TENSORMAP_SIZE_IN_BYTES = 128 + t_tensormap_device = driver.utils.cuMemAlloc(TENSORMAP_SIZE_IN_BYTES) + driver.utils.cuMemcpyHtoD( + t_tensormap_device, t_tensormap, TENSORMAP_SIZE_IN_BYTES) + self.tensormaps_device[key] = t_tensormap_device + return int(self.tensormaps_device[key]) + + def __del__(self): + for _, v in self.tensormaps_device.items(): + driver.utils.cuMemFree(v) diff --git a/python/triton/hopper_lib/libhopper_helpers.bc b/python/triton/hopper_lib/libhopper_helpers.bc new file mode 100644 index 0000000000000000000000000000000000000000..3f625a85a7614effc330ae9c169546e89af4db32 GIT binary patch literal 11976 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 literal 0 HcmV?d00001 diff --git a/python/triton/language/semantic.py b/python/triton/language/semantic.py index 3bb9ef075d37..003a9f689f38 100644 --- a/python/triton/language/semantic.py +++ b/python/triton/language/semantic.py @@ -1250,7 +1250,7 @@ def dot(lhs: tl.tensor, assert len(rhs.shape) == 2, f"Second input shape ({rhs.shape}) is not two dimensional!" assert lhs.shape[1].value == rhs.shape[0].value, f"First input shape ({lhs.shape}) and second input shape {rhs.shape} are not compatible for matmul (second index of first shape ({lhs.shape[1].value}) must be equal to first index of second shape ({rhs.shape[0].value})" assert lhs.shape[0].value >= 16 and lhs.shape[1].value >= 16 \ - and rhs.shape[1].value >= 16,\ + and rhs.shape[1].value >= 16, \ f"All values in both first input shape ({lhs.shape}) and second input shape ({rhs.shape}) must be >= 16!" if lhs.type.scalar.is_int(): assert lhs.type.scalar == tl.int8, "only int8 supported!" diff --git a/python/triton/ops/blocksparse/matmul.py b/python/triton/ops/blocksparse/matmul.py index 5366302068a6..eaf4f2f40dee 100644 --- a/python/triton/ops/blocksparse/matmul.py +++ b/python/triton/ops/blocksparse/matmul.py @@ -395,8 +395,8 @@ def backward(ctx, dc): a, dc, not ctx.trans_a, ctx.trans_c, ctx.trans_b, ctx.spdims, ctx.block, ctx.db_lut, ctx.db_width, ) dout = dc if ctx.has_out else None - return da, db, None, None, None,\ - None, None, None, None,\ + return da, db, None, None, None, \ + None, None, None, None, \ None, None, None, None, None, dout diff --git a/python/triton/ops/matmul.py b/python/triton/ops/matmul.py index 1ece9917e0b4..ac5cc04d9d38 100644 --- a/python/triton/ops/matmul.py +++ b/python/triton/ops/matmul.py @@ -114,8 +114,9 @@ def _kernel(A, B, C, M, N, K, _0 = tl.zeros((1, 1), dtype=C.dtype.element_ty) a = tl.load(A, mask=rk[None, :] < k_remaining, other=_0) b = tl.load(B, mask=rk[:, None] < k_remaining, other=_0) - a = a.to(C.dtype.element_ty) - b = b.to(C.dtype.element_ty) + if a.dtype != b.dtype: + a = a.to(C.dtype.element_ty) + b = b.to(C.dtype.element_ty) acc += tl.dot(a, b, out_dtype=dot_out_dtype) A += BLOCK_K * SPLIT_K * stride_ak B += BLOCK_K * SPLIT_K * stride_bk diff --git a/python/triton/runtime/autotuner.py b/python/triton/runtime/autotuner.py index 8784f88765d1..77091da42f25 100644 --- a/python/triton/runtime/autotuner.py +++ b/python/triton/runtime/autotuner.py @@ -33,7 +33,7 @@ def __init__(self, fn, arg_names, configs, key, reset_to_zero, prune_configs_by: 'prune_num_stages_by'(optional): a function used to prune num_stages. It takes configs:List[Config] as its input, and returns pruned configs. ''' if not configs: - self.configs = [Config({}, num_warps=4, num_stages=2)] + self.configs = [Config({}, num_warps=4, num_stages=2, num_ctas=1)] else: self.configs = configs self.key_idx = [arg_names.index(k) for k in key] @@ -78,7 +78,11 @@ def kernel_call(): if config.pre_hook: config.pre_hook(full_nargs) self.hook(args) - self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages, **current) + self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages, + num_ctas=config.num_ctas, + enable_warp_specialization=config.enable_warp_specialization, + # enable_persistent=False, + **current) try: return do_bench(kernel_call, warmup=self.warmup, rep=self.rep, quantiles=(0.5, 0.2, 0.8)) except OutOfResources: @@ -108,12 +112,12 @@ def run(self, *args, **kwargs): else: config = self.configs[0] self.best_config = config + full_nargs = {**self.nargs, **kwargs, **self.best_config.kwargs} if config.pre_hook is not None: - full_nargs = {**self.nargs, **kwargs, **self.best_config.kwargs} config.pre_hook(full_nargs) - ret = self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages, **kwargs, **config.kwargs) - self.nargs = None - return ret + return self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages, + num_ctas=config.num_ctas, + enable_warp_specialization=config.enable_warp_specialization, **kwargs, **config.kwargs) def prune_configs(self, kwargs): pruned_configs = self.configs @@ -126,10 +130,16 @@ def prune_configs(self, kwargs): if len(pruned_configs) > top_k: est_timing = { config: self.perf_model(**self.nargs, **kwargs, **config.kwargs, num_stages=config.num_stages, - num_warps=config.num_warps) + num_warps=config.num_warps, + num_ctas=config.num_ctas, + enable_warp_specialization=config.enable_warp_specialization, + enable_persistent=config.enable_persistent) for config in pruned_configs } - pruned_configs = sorted(est_timing.keys(), key=lambda x: est_timing[x])[:top_k] + pruned_configs = sorted( + est_timing.keys(), + key=lambda x: est_timing[x])[ + :top_k] return pruned_configs def warmup(self, *args, **kwargs): @@ -138,7 +148,10 @@ def warmup(self, *args, **kwargs): self.fn.warmup( *args, num_warps=config.num_warps, + num_ctas=config.num_ctas, num_stages=config.num_stages, + enable_warp_specialization=config.enable_warp_specialization, + enable_persistent=config.enable_persistent, **kwargs, **config.kwargs, ) @@ -157,15 +170,20 @@ class Config: :type num_warps: int :ivar num_stages: the number of stages that the compiler should use when software-pipelining loops. Mostly useful for matrix multiplication workloads on SM80+ GPUs. - :type num_stages: int + :type enable_warp_specialization: bool + :ivar enable_warp_specialization: enable specialization (spatial partitioning) or not. See https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#spatial-partitioning-also-known-as-warp-specialization :ivar pre_hook: a function that will be called before the kernel is called. Parameters of this function are args. """ - def __init__(self, kwargs, num_warps=4, num_stages=2, pre_hook=None): + def __init__(self, kwargs, num_warps=4, num_stages=2, num_ctas=1, enable_warp_specialization=False, pre_hook=None): self.kwargs = kwargs self.num_warps = num_warps + self.num_ctas = num_ctas self.num_stages = num_stages + self.enable_warp_specialization = enable_warp_specialization + # TODO[shuhaoj]: May make enable_persistent configurable in future if necessay. + self.enable_persistent = False self.pre_hook = pre_hook def __str__(self): @@ -173,7 +191,11 @@ def __str__(self): for k, v in self.kwargs.items(): res.append(f'{k}: {v}') res.append(f'num_warps: {self.num_warps}') + res.append(f'num_ctas: {self.num_ctas}') res.append(f'num_stages: {self.num_stages}') + res.append( + f'enable_warp_specialization: {self.enable_warp_specialization}') + res.append(f'enable_persistent: {self.enable_persistent}') return ', '.join(res) diff --git a/python/triton/runtime/backends/cuda.c b/python/triton/runtime/backends/cuda.c index 009d52679830..9b4be7eb2428 100644 --- a/python/triton/runtime/backends/cuda.c +++ b/python/triton/runtime/backends/cuda.c @@ -21,6 +21,169 @@ static inline void gpuAssert(CUresult code, const char *file, int line) { return NULL; \ } +#define ADD_ENUM_ITEM(value) \ + do { \ + PyObject *py_value = PyLong_FromLong(value); \ + PyDict_SetItemString(enum_dict, #value, py_value); \ + } while (0) + +#define ADD_ENUM_ITEM_0() +#define ADD_ENUM_ITEM_1(v1) ADD_ENUM_ITEM(v1) +#define ADD_ENUM_ITEM_2(v1, v2) \ + ADD_ENUM_ITEM(v1); \ + ADD_ENUM_ITEM(v2); +#define ADD_ENUM_ITEM_3(v1, v2, v3) \ + ADD_ENUM_ITEM(v1); \ + ADD_ENUM_ITEM(v2); \ + ADD_ENUM_ITEM(v3); +#define ADD_ENUM_ITEM_4(v1, v2, v3, v4) \ + ADD_ENUM_ITEM(v1); \ + ADD_ENUM_ITEM(v2); \ + ADD_ENUM_ITEM(v3); \ + ADD_ENUM_ITEM(v4); +#define ADD_ENUM_ITEM_5(v1, v2, v3, v4, v5) \ + ADD_ENUM_ITEM_2(v1, v2); \ + ADD_ENUM_ITEM_3(v3, v4, v5); +#define ADD_ENUM_ITEM_6(v1, v2, v3, v4, v5, v6) \ + ADD_ENUM_ITEM_2(v1, v2); \ + ADD_ENUM_ITEM_4(v3, v4, v5, v6); +#define ADD_ENUM_ITEM_7(v1, v2, v3, v4, v5, v6, v7) \ + ADD_ENUM_ITEM_3(v1, v2, v3); \ + ADD_ENUM_ITEM_4(v4, v5, v6, v7); +#define ADD_ENUM_ITEM_8(v1, v2, v3, v4, v5, v6, v7, v8) \ + ADD_ENUM_ITEM_4(v1, v2, v3, v4); \ + ADD_ENUM_ITEM_4(v5, v6, v7, v8); +#define ADD_ENUM_ITEM_9(v1, v2, v3, v4, v5, v6, v7, v8, v9) \ + ADD_ENUM_ITEM_5(v1, v2, v3, v4, v5); \ + ADD_ENUM_ITEM_4(v6, v7, v8, v9); +#define ADD_ENUM_ITEM_10(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) \ + ADD_ENUM_ITEM_5(v1, v2, v3, v4, v5); \ + ADD_ENUM_ITEM_5(v6, v7, v8, v9, v10); +#define ADD_ENUM_ITEM_11(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) \ + ADD_ENUM_ITEM_6(v1, v2, v3, v4, v5, v6); \ + ADD_ENUM_ITEM_5(v7, v8, v9, v10, v11); +#define ADD_ENUM_ITEM_12(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) \ + ADD_ENUM_ITEM_6(v1, v2, v3, v4, v5, v6); \ + ADD_ENUM_ITEM_6(v7, v8, v9, v10, v11, v12); +#define ADD_ENUM_ITEM_13(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \ + v13) \ + ADD_ENUM_ITEM_7(v1, v2, v3, v4, v5, v6, v7); \ + ADD_ENUM_ITEM_6(v8, v9, v10, v11, v12, v13); +#define ADD_ENUM_ITEM_14(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \ + v13, v14) \ + ADD_ENUM_ITEM_7(v1, v2, v3, v4, v5, v6, v7); \ + ADD_ENUM_ITEM_7(v8, v9, v10, v11, v12, v13, v14); + +#define DISPATCH_ARGS_N(_14, _13, _12, _11, _10, _9, _8, _7, _6, _5, _4, _3, \ + _2, _1, N, ...) \ + ADD_ENUM_ITEM_##N +#define DISPATCH_ARGS(...) \ + DISPATCH_ARGS_N(__VA_ARGS__, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, \ + 0) \ + (__VA_ARGS__) + +#define ADD_ENUM_TO_MODULE(module, enum_name, ...) \ + do { \ + PyObject *enum_dict = PyDict_New(); \ + DISPATCH_ARGS(__VA_ARGS__) \ + if (enum_dict != NULL) { \ + PyObject_SetAttrString(module, #enum_name, enum_dict); \ + } \ + } while (0) + +static void defineEnums(PyObject *self) { + ADD_ENUM_TO_MODULE( + self, CUtensorMapDataType, CU_TENSOR_MAP_DATA_TYPE_UINT8, + CU_TENSOR_MAP_DATA_TYPE_UINT16, CU_TENSOR_MAP_DATA_TYPE_UINT32, + CU_TENSOR_MAP_DATA_TYPE_INT32, CU_TENSOR_MAP_DATA_TYPE_UINT64, + CU_TENSOR_MAP_DATA_TYPE_INT64, CU_TENSOR_MAP_DATA_TYPE_FLOAT16, + CU_TENSOR_MAP_DATA_TYPE_FLOAT32, CU_TENSOR_MAP_DATA_TYPE_FLOAT64, + CU_TENSOR_MAP_DATA_TYPE_BFLOAT16, CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ, + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32, CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ); + + ADD_ENUM_TO_MODULE(self, CUtensorMapInterleave, CU_TENSOR_MAP_INTERLEAVE_NONE, + CU_TENSOR_MAP_INTERLEAVE_16B, + CU_TENSOR_MAP_INTERLEAVE_32B); + + ADD_ENUM_TO_MODULE(self, CUtensorMapSwizzle, CU_TENSOR_MAP_SWIZZLE_NONE, + CU_TENSOR_MAP_SWIZZLE_32B, CU_TENSOR_MAP_SWIZZLE_64B, + CU_TENSOR_MAP_SWIZZLE_128B); + + ADD_ENUM_TO_MODULE( + self, CUtensorMapL2promotion, CU_TENSOR_MAP_L2_PROMOTION_NONE, + CU_TENSOR_MAP_L2_PROMOTION_L2_64B, CU_TENSOR_MAP_L2_PROMOTION_L2_128B, + CU_TENSOR_MAP_L2_PROMOTION_L2_256B); + + ADD_ENUM_TO_MODULE(self, CUtensorMapFloatOOBfill, + CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE, + CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA); +} + +typedef struct { + PyObject_HEAD cuuint32_t value; +} PyCUuint32; + +typedef struct { + PyObject_HEAD cuuint64_t value; +} PyCUuint64; + +#define DEFINE_CUUINT_CONSTRUCTOR(NAME, TYPE, FORMAT, VALUE_TYPE) \ + static PyObject *Py##NAME##_New(PyTypeObject *type, PyObject *args, \ + PyObject *kwds) { \ + Py##NAME *self; \ + VALUE_TYPE value; \ + if (!PyArg_ParseTuple(args, FORMAT, &value)) \ + return NULL; \ + self = (Py##NAME *)type->tp_alloc(type, 0); \ + if (self != NULL) { \ + self->value = (TYPE)value; \ + } \ + return (PyObject *)self; \ + } + +DEFINE_CUUINT_CONSTRUCTOR(CUuint32, cuuint32_t, "l", long) +DEFINE_CUUINT_CONSTRUCTOR(CUuint64, cuuint64_t, "L", long long) + +static PyTypeObject PyCUuint32_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "cuda_utils.cuuint32_t", + .tp_basicsize = sizeof(PyCUuint32), + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_new = PyCUuint32_New, +}; + +static PyTypeObject PyCUuint64_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "cuda_utils.cuuint64_t", + .tp_basicsize = sizeof(PyCUuint64), + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_new = PyCUuint64_New, +}; + +static void defineTypes(PyObject *self) { + if (PyType_Ready(&PyCUuint32_Type) < 0) { + PyErr_SetString(PyExc_TypeError, "Failed to ready cuuint32_t type"); + return; + } + Py_INCREF(&PyCUuint32_Type); + if (PyModule_AddObject(self, "cuuint32_t", (PyObject *)&PyCUuint32_Type) < + 0) { + PyErr_SetString(PyExc_RuntimeError, + "Failed to add cuuint32_t type to module"); + return; + } + + if (PyType_Ready(&PyCUuint64_Type) < 0) { + PyErr_SetString(PyExc_TypeError, "Failed to ready cuuint64_t type"); + return; + } + Py_INCREF(&PyCUuint64_Type); + if (PyModule_AddObject(self, "cuuint64_t", (PyObject *)&PyCUuint64_Type) < + 0) { + PyErr_SetString(PyExc_RuntimeError, + "Failed to add cuuint64_t type to module"); + return; + } +} + static PyObject *getDeviceProperties(PyObject *self, PyObject *args) { int device_id; if (!PyArg_ParseTuple(args, "i", &device_id)) @@ -108,11 +271,124 @@ static PyObject *loadBinary(PyObject *self, PyObject *args) { n_spills); } +static PyObject *memAlloc(PyObject *self, PyObject *args) { + size_t bytesize; + CUdeviceptr dptr; + CUresult result; + + if (!PyArg_ParseTuple(args, "K", &bytesize)) { + return NULL; // Error parsing arguments + } + + CUDA_CHECK(cuMemAlloc(&dptr, bytesize)); + + return PyLong_FromUnsignedLongLong((unsigned long long)dptr); +} + +static PyObject *memcpyHtoD(PyObject *self, PyObject *args) { + unsigned long long dstDevicePtr, srcHostPtr; + size_t byteCount; + CUdeviceptr dstDevice; + const void *srcHost; + CUresult result; + + if (!PyArg_ParseTuple(args, "KKK", &dstDevicePtr, &srcHostPtr, &byteCount)) { + return NULL; // Error parsing arguments + } + + dstDevice = (CUdeviceptr)dstDevicePtr; + srcHost = (const void *)srcHostPtr; + + CUDA_CHECK(cuMemcpyHtoD(dstDevice, srcHost, byteCount)); + + Py_RETURN_NONE; +} + +static PyObject *memFree(PyObject *self, PyObject *args) { + CUdeviceptr dptr; + + if (!PyArg_ParseTuple(args, "K", &dptr)) { + return NULL; // Error parsing arguments + } + + CUDA_CHECK(cuMemFree(dptr)); + + Py_RETURN_NONE; +} + +// Helper function to convert a Python list to a cuuint64_t array +static cuuint64_t *list_to_cuuint64_array(PyObject *listObj) { + Py_ssize_t len = PyList_Size(listObj); + cuuint64_t *array = malloc(len * sizeof(cuuint64_t)); + for (Py_ssize_t i = 0; i < len; i++) { + PyObject *item = PyList_GetItem(listObj, i); + array[i] = (cuuint64_t)PyLong_AsUnsignedLongLong(item); + } + return array; +} + +// Helper function to convert a Python list to a cuuint32_t array +static cuuint32_t *list_to_cuuint32_array(PyObject *listObj) { + Py_ssize_t len = PyList_Size(listObj); + cuuint32_t *array = malloc(len * sizeof(cuuint32_t)); + for (Py_ssize_t i = 0; i < len; i++) { + PyObject *item = PyList_GetItem(listObj, i); + array[i] = (cuuint32_t)PyLong_AsUnsignedLong(item); + } + return array; +} + +static PyObject *tensorMapEncodeTiled(PyObject *self, PyObject *args) { + CUtensorMap *tensorMap = (CUtensorMap *)malloc(sizeof(CUtensorMap)); + CUtensorMapDataType tensorDataType; + cuuint32_t tensorRank; + void *globalAddress; + PyObject *globalDimObj, *globalStridesObj, *boxDimObj, *elementStridesObj; + CUtensorMapInterleave interleave; + CUtensorMapSwizzle swizzle; + CUtensorMapL2promotion l2Promotion; + CUtensorMapFloatOOBfill oobFill; + + // Parse arguments + if (!PyArg_ParseTuple(args, "iiKO!O!O!O!iiii", &tensorDataType, &tensorRank, + &globalAddress, &PyList_Type, &globalDimObj, + &PyList_Type, &globalStridesObj, &PyList_Type, + &boxDimObj, &PyList_Type, &elementStridesObj, + &interleave, &swizzle, &l2Promotion, &oobFill)) { + return NULL; // Error parsing arguments + } + + // Convert Python lists to C arrays + cuuint64_t *globalDim = list_to_cuuint64_array(globalDimObj); + cuuint64_t *globalStrides = list_to_cuuint64_array(globalStridesObj); + cuuint32_t *boxDim = list_to_cuuint32_array(boxDimObj); + cuuint32_t *elementStrides = list_to_cuuint32_array(elementStridesObj); + + // Call the function + CUDA_CHECK(cuTensorMapEncodeTiled(tensorMap, tensorDataType, tensorRank, + globalAddress, globalDim, globalStrides, + boxDim, elementStrides, interleave, swizzle, + l2Promotion, oobFill)); + + // Clean up + free(globalDim); + free(globalStrides); + free(boxDim); + free(elementStrides); + + // Return the tensor map as a normal pointer + return PyLong_FromUnsignedLongLong((unsigned long long)tensorMap); +} + static PyMethodDef ModuleMethods[] = { {"load_binary", loadBinary, METH_VARARGS, "Load provided cubin into CUDA driver"}, {"get_device_properties", getDeviceProperties, METH_VARARGS, "Get the properties for a given device"}, + {"cuMemAlloc", memAlloc, METH_VARARGS}, + {"cuMemcpyHtoD", memcpyHtoD, METH_VARARGS}, + {"cuMemFree", memFree, METH_VARARGS}, + {"cuTensorMapEncodeTiled", tensorMapEncodeTiled, METH_VARARGS}, {NULL, NULL, 0, NULL} // sentinel }; @@ -126,6 +402,10 @@ PyMODINIT_FUNC PyInit_cuda_utils(void) { if (m == NULL) { return NULL; } + + defineEnums(m); + defineTypes(m); PyModule_AddFunctions(m, ModuleMethods); + return m; } diff --git a/python/triton/runtime/driver.py b/python/triton/runtime/driver.py index 3850821536c5..5b778be4dc10 100644 --- a/python/triton/runtime/driver.py +++ b/python/triton/runtime/driver.py @@ -52,6 +52,15 @@ def __init__(self): spec.loader.exec_module(mod) self.load_binary = mod.load_binary self.get_device_properties = mod.get_device_properties + self.CUtensorMapDataType = mod.CUtensorMapDataType + self.CUtensorMapInterleave = mod.CUtensorMapInterleave + self.CUtensorMapSwizzle = mod.CUtensorMapSwizzle + self.CUtensorMapL2promotion = mod.CUtensorMapL2promotion + self.CUtensorMapFloatOOBfill = mod.CUtensorMapFloatOOBfill + self.cuTensorMapEncodeTiled = mod.cuTensorMapEncodeTiled + self.cuMemAlloc = mod.cuMemAlloc + self.cuMemcpyHtoD = mod.cuMemcpyHtoD + self.cuMemFree = mod.cuMemFree class CudaDriver(DriverBase): diff --git a/python/triton/runtime/jit.py b/python/triton/runtime/jit.py index 852e79bf02d0..a3a4e4ade3dc 100644 --- a/python/triton/runtime/jit.py +++ b/python/triton/runtime/jit.py @@ -11,6 +11,7 @@ from typing import (Callable, Generic, Iterable, List, Optional, TypeVar, Union, cast, overload) +import triton from ..common.backend import get_backend, path_to_ptxas TRITON_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -147,6 +148,11 @@ class JITFunction(KernelInterface[T]): # Hook for inspecting compiled functions and modules cache_hook = None divisibility = 16 + # As Hopper TMA load and store primitive requires the tensor stride to be 16-byte aligned. + # And we only support WGMMA with float16 dtype on Hopper for now. + # So whether the LoadOp and StoreOp will lowering into TMA copy depend on whether the tensor stride is divisible by 8. + # TODO: Make it more reasonable to handle multiple dtypes. + divisibility_8 = 8 @staticmethod def _key_of(arg): @@ -201,10 +207,29 @@ def is_divisible_by_16(x): if x is None: return True return False - divisible_by_16 = {i for i, arg in enumerate(args) if is_divisible_by_16(arg) and i not in self.do_not_specialize} - equal_to_1 = {i for i, arg in enumerate(args) if not isinstance(arg, bool) and isinstance(arg, int) and arg == 1 and i not in self.do_not_specialize} - return namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1"])(tuple(divisible_by_16), tuple(equal_to_1)) - # return _triton.code_gen.instance_descriptor(divisible_by_16, equal_to_1) + + def is_divisible_by_8(x): + if isinstance(x, int): + return x % JITFunction.divisibility_8 == 0 + if x is None: + return True + return False + divisible_by_16 = {i for i, arg in enumerate( + args) if is_divisible_by_16(arg) and i not in self.do_not_specialize} + divisible_by_8 = {i for i, arg in enumerate( + args) if is_divisible_by_8(arg) and i not in self.do_not_specialize} + equal_to_1 = { + i for i, arg in enumerate(args) if isinstance( + arg, int) and not isinstance( + arg, bool) and arg == 1 and i not in self.do_not_specialize} + # folded equal_to_1 and None + # TODO: method to collect all folded args + none_args = {i for i, arg in enumerate(args) if arg is None and i not in self.do_not_specialize} + ids_of_folded_args = equal_to_1 | none_args + return namedtuple("instance_descriptor", ["divisible_by_16", "equal_to_1", "ids_of_folded_args", "divisible_by_8"])( + tuple(divisible_by_16), tuple(equal_to_1), tuple(ids_of_folded_args), tuple(divisible_by_8)) + # return _triton.code_gen.instance_descriptor(divisible_by_16, + # equal_to_1) @staticmethod def _type_of(key): @@ -243,13 +268,13 @@ def _make_constants(self, constexpr_key): constants = dict(zip(self.constexprs, constexpr_key)) return constants - def _call_hook(self, key, signature, device, constants, num_warps, num_stages, extern_libs, configs): + def _call_hook(self, key, signature, device, constants, num_warps, num_ctas, num_stages, enable_warp_specialization, extern_libs, configs): if JITFunction.cache_hook is None: return False name = self.fn.__name__ module = self.fn.__module__ arg_reprs = ', '.join([f'{name}: {ty}' for name, ty in zip(self.arg_names, key[1])]) - repr = f"{name}[num_warps={num_warps}, num_stages={num_stages}]({arg_reprs})" + repr = f"{name}[num_warps={num_warps}, num_ctas={num_ctas}, num_stages={num_stages}, enable_warp_specialization={enable_warp_specialization}]({arg_reprs})" key = str(key) class LegacyCompiler: @@ -259,21 +284,22 @@ def __init__(self, module, name): pass kwargs = dict(signature=signature, device=device, constants=constants, - num_warps=num_warps, num_stages=num_stages, extern_libs=extern_libs, + num_warps=num_warps, num_ctas=num_ctas, num_stages=num_stages, enable_warp_specialization=enable_warp_specialization, extern_libs=extern_libs, configs=configs) - return JITFunction.cache_hook(key=key, repr=repr, fn=LegacyCompiler(module, name), compile={"key": key, **kwargs}, is_manual_warmup=False, already_compiled=False) + return JITFunction.cache_hook(key=key, repr=repr, fn=LegacyCompiler(module, name), compile={ + "key": key, **kwargs}, is_manual_warmup=False, already_compiled=False) def _get_arg_specialization_key(self, arg) -> str: arg_annotation = self.__annotations__.get(arg, '') if arg_annotation == '': return f'({arg}.data_ptr() % {JITFunction.divisibility} == 0) if hasattr({arg}, "data_ptr") \ - else ({arg} % {JITFunction.divisibility} == 0, {arg} == 1) if isinstance({arg}, int) \ + else ({arg} % {JITFunction.divisibility} == 0, {arg} % {JITFunction.divisibility_8} == 0, {arg} == 1) if isinstance({arg}, int) \ else (False,)' elif 'Tensor' in arg_annotation: return f'({arg}.data_ptr() % {JITFunction.divisibility} == 0)' elif arg_annotation == 'int': - return f'({arg} % {JITFunction.divisibility} == 0, {arg} == 1)' + return f'({arg} % {JITFunction.divisibility} == 0, {arg} % {JITFunction.divisibility_8} == 0, {arg} == 1)' else: return '(False,)' @@ -304,8 +330,11 @@ def _conclude_device_type(self, device_types: List[str], pinned_memory_flags: Li return device_types[0] if len(device_types) > 0 else 'cuda' def _make_launcher(self): - regular_args = [f'{arg}' for i, arg in enumerate(self.arg_names) if i not in self.constexprs] - constexpr_args = [f'{arg}' for i, arg in enumerate(self.arg_names) if i in self.constexprs] + regular_args = [f'{arg}' for i, arg in enumerate( + self.arg_names) if i not in self.constexprs] + constexpr_args = [ + f'{arg}' for i, arg in enumerate( + self.arg_names) if i in self.constexprs] args = ', '.join(regular_args) # cache key for regular argument type sig_keys = ', '.join([self._get_arg_sig_key(arg) for arg in regular_args]) @@ -325,15 +354,16 @@ def _make_launcher(self): args_signature = ', '.join(name if dflt == inspect._empty else f'{name} = {dflt}' for name, dflt in zip(self.arg_names, self.arg_defaults)) src = f""" -def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_stages=3, extern_libs=None, stream=None, warmup=False, device=None, device_type=None): +def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_ctas=1, num_stages=3, enable_warp_specialization=False, extern_libs=None, stream=None, warmup=False, device=None, device_type=None): from ..compiler import compile, CompiledKernel sig_key = {sig_keys}, constexpr_key = {f'{constexpr_keys},' if len(constexpr_keys) > 0 else ()} spec_key = {f'{spec_keys},' if len(spec_keys) > 0 else ()} - key = (version_key, sig_key, constexpr_key, spec_key, num_warps, num_stages, self.debug) + key = (version_key, sig_key, constexpr_key, spec_key, num_warps, num_ctas, num_stages, enable_warp_specialization, self.debug) if not extern_libs is None: key = (key, tuple(extern_libs.items())) assert num_warps > 0 and (num_warps & (num_warps - 1)) == 0, "num_warps must be a power of 2" + assert num_ctas > 0 assert grid is not None if callable(grid): grid = grid({{{grid_args}}}) @@ -367,8 +397,17 @@ def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_stages=3, e bin = cache[device].get(key, None) if bin is not None: + # build dict of constant values + args = [{args}] + all_args = {', '.join([f'{arg}' for arg in self.arg_names])}, + configs = self._get_config(*all_args), + constants = self._make_constants(constexpr_key) + constants.update({{i: None for i, arg in enumerate(all_args) if arg is None}}) + constants.update({{i: 1 for i in configs[0].equal_to_1}}) + # Create tensormaps and append to args + args = bin.assemble_tensormap_to_arg(args, constants) if not warmup: - bin.c_wrapper(grid_0, grid_1, grid_2, bin.num_warps, bin.shared, stream, bin.cu_function, CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, bin, {args}) + bin.c_wrapper(grid_0, grid_1, grid_2, bin.num_warps, bin.num_ctas, bin.clusterDims[0], bin.clusterDims[1], bin.clusterDims[2], bin.shared, stream, bin.cu_function, CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, bin, *args) return bin # kernel not cached -- compile else: @@ -385,10 +424,12 @@ def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_stages=3, e for i, arg in constants.items(): if callable(arg): raise TypeError(f"Callable constexpr at index {{i}} is not supported") - if not self._call_hook(key, signature, device, constants, num_warps, num_stages, extern_libs, configs): - bin = compile(self, signature=signature, device=device, constants=constants, num_warps=num_warps, num_stages=num_stages, extern_libs=extern_libs, configs=configs, debug=self.debug, device_type=device_type) + if not self._call_hook(key, signature, device, constants, num_warps, num_ctas, num_stages, enable_warp_specialization, extern_libs, configs): + bin = compile(self, signature=signature, device=device, constants=constants, num_warps=num_warps, num_ctas=num_ctas, num_stages=num_stages, enable_warp_specialization=enable_warp_specialization, extern_libs=extern_libs, configs=configs, debug=self.debug, device_type=device_type) + # Create tensormaps and append to args + args = bin.assemble_tensormap_to_arg(args, constants) if not warmup: - bin.c_wrapper(grid_0, grid_1, grid_2, bin.num_warps, bin.shared, stream, bin.cu_function, CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, bin, *args) + bin.c_wrapper(grid_0, grid_1, grid_2, bin.num_warps, bin.num_ctas, bin.clusterDims[0], bin.clusterDims[1], bin.clusterDims[2], bin.shared, stream, bin.cu_function, CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, bin, *args) self.cache[device][key] = bin return bin return None @@ -436,6 +477,8 @@ def __init__(self, fn, version=None, do_not_specialize=None, debug=None, noinlin self.__annotations__ = {name: _normalize_ty(ty) for name, ty in fn.__annotations__.items()} # index of constexprs self.constexprs = [self.arg_names.index(name) for name, ty in self.__annotations__.items() if 'constexpr' in ty] + # tma info + self.tensormaps_info = triton._C.libtriton.triton.TMAInfos() # launcher self.run = self._make_launcher() # re-use docs of wrapped function @@ -593,6 +636,9 @@ def stride(self, i): def __str__(self) -> str: return f'TensorWrapper[{self.dtype}]({self.base})' + def element_size(self): + return self.base.element_size() + def reinterpret(tensor, dtype): if isinstance(tensor, TensorWrapper): diff --git a/python/triton/testing.py b/python/triton/testing.py index d48264291f30..ff1fb8d0eecc 100644 --- a/python/triton/testing.py +++ b/python/triton/testing.py @@ -4,6 +4,7 @@ import sys from contextlib import contextmanager +from . import language as tl from ._C.libtriton.triton import runtime @@ -268,9 +269,15 @@ def _run(self, bench, save_path, show_plots, print_data): y_mean = bench.line_names y_min = [f'{x}-min' for x in bench.line_names] y_max = [f'{x}-max' for x in bench.line_names] - df = pd.DataFrame(columns=[bench.x_names[0]] + y_mean + y_min + y_max) + x_names_str = str(bench.x_names) + df = pd.DataFrame(columns=[x_names_str] + y_mean + y_min + y_max) for x in bench.x_vals: - x_args = {x_name: x for x_name in bench.x_names} + if not isinstance(x, list): + x = [x] + if len(x) == 1: + x = x * len(bench.x_names) + x_str = str(x) + x_args = {x_name: x_in for x_name, x_in in zip(bench.x_names, x)} row_mean, row_min, row_max = [], [], [] for y in bench.line_vals: ret = self.fn(**x_args, **{bench.line_arg: y}, **bench.args) @@ -281,17 +288,19 @@ def _run(self, bench, save_path, show_plots, print_data): row_mean += [y_mean] row_min += [y_min] row_max += [y_max] - df.loc[len(df)] = [x] + row_mean + row_min + row_max + df.loc[len(df)] = [x_str] + row_mean + row_min + row_max if bench.plot_name: plt.figure() ax = plt.subplot() - x = bench.x_names[0] + x = x_names_str for i, y in enumerate(bench.line_names): y_min, y_max = df[y + '-min'], df[y + '-max'] col = bench.styles[i][0] if bench.styles else None sty = bench.styles[i][1] if bench.styles else None ax.plot(df[x], df[y], label=y, color=col, ls=sty) - if y_min is not None and y_max is not None: + if not y_min.isnull().all() and not y_max.isnull().all(): + y_min = y_min.astype(float) + y_max = y_max.astype(float) ax.fill_between(df[x], y_min, y_max, alpha=0.15, color=col) ax.legend() xlabel = bench.xlabel if bench.xlabel else " = ".join(bench.x_names) @@ -304,7 +313,7 @@ def _run(self, bench, save_path, show_plots, print_data): plt.show() if save_path: plt.savefig(os.path.join(save_path, f"{bench.plot_name}.png")) - df = df[[bench.x_names[0]] + bench.line_names] + df = df[[x_names_str] + bench.line_names] if print_data: print(bench.plot_name + ':') print(df) @@ -372,7 +381,7 @@ def get_max_tensorcore_tflops(dtype, backend=None, device=None, clock_rate=None) ops_per_sub_core = 256 elif dtype in [torch.float16, torch.bfloat16]: ops_per_sub_core = 512 - elif dtype == torch.int8: + elif dtype in [torch.int8, tl.float8e4, tl.float8e4b15, tl.float8e5]: ops_per_sub_core = 1024 else: raise RuntimeError("dtype not supported") diff --git a/python/triton/third_party/cuda/include/cuda.h b/python/triton/third_party/cuda/include/cuda.h index c713bf316a16..ec111be805af 100755 --- a/python/triton/third_party/cuda/include/cuda.h +++ b/python/triton/third_party/cuda/include/cuda.h @@ -1,5 +1,5 @@ /* - * Copyright 1993-2018 NVIDIA Corporation. All rights reserved. + * Copyright 1993-2022 NVIDIA Corporation. All rights reserved. * * NOTICE TO LICENSEE: * @@ -144,7 +144,23 @@ typedef uint64_t cuuint64_t; #define cuDevicePrimaryCtxSetFlags cuDevicePrimaryCtxSetFlags_v2 #define cuDeviceGetUuid_v2 cuDeviceGetUuid_v2 #define cuIpcOpenMemHandle cuIpcOpenMemHandle_v2 -#define cuGraphInstantiate cuGraphInstantiate_v2 + +#define cuGraphInstantiate cuGraphInstantiateWithFlags + +#define cuGraphExecUpdate cuGraphExecUpdate_v2 +#define cuGetProcAddress cuGetProcAddress_v2 +#define cuGraphAddKernelNode cuGraphAddKernelNode_v2 +#define cuGraphKernelNodeGetParams cuGraphKernelNodeGetParams_v2 +#define cuGraphKernelNodeSetParams cuGraphKernelNodeSetParams_v2 +#define cuGraphExecKernelNodeSetParams cuGraphExecKernelNodeSetParams_v2 + +#define cuStreamWriteValue32 __CUDA_API_PTSZ(cuStreamWriteValue32_v2) +#define cuStreamWaitValue32 __CUDA_API_PTSZ(cuStreamWaitValue32_v2) +#define cuStreamWriteValue64 __CUDA_API_PTSZ(cuStreamWriteValue64_v2) +#define cuStreamWaitValue64 __CUDA_API_PTSZ(cuStreamWaitValue64_v2) +#define cuStreamBatchMemOp __CUDA_API_PTSZ(cuStreamBatchMemOp_v2) +#define cuStreamGetCaptureInfo __CUDA_API_PTSZ(cuStreamGetCaptureInfo_v2) +#define cuStreamGetCaptureInfo_v2 __CUDA_API_PTSZ(cuStreamGetCaptureInfo_v2) #if defined(__CUDA_API_PER_THREAD_DEFAULT_STREAM) #define cuMemcpy __CUDA_API_PTDS(cuMemcpy) @@ -163,13 +179,12 @@ typedef uint64_t cuuint64_t; #define cuMemsetD2D32Async __CUDA_API_PTSZ(cuMemsetD2D32Async) #define cuStreamGetPriority __CUDA_API_PTSZ(cuStreamGetPriority) + #define cuStreamGetId __CUDA_API_PTSZ(cuStreamGetId) #define cuStreamGetFlags __CUDA_API_PTSZ(cuStreamGetFlags) #define cuStreamGetCtx __CUDA_API_PTSZ(cuStreamGetCtx) #define cuStreamWaitEvent __CUDA_API_PTSZ(cuStreamWaitEvent) #define cuStreamEndCapture __CUDA_API_PTSZ(cuStreamEndCapture) #define cuStreamIsCapturing __CUDA_API_PTSZ(cuStreamIsCapturing) - #define cuStreamGetCaptureInfo __CUDA_API_PTSZ(cuStreamGetCaptureInfo) - #define cuStreamGetCaptureInfo_v2 __CUDA_API_PTSZ(cuStreamGetCaptureInfo_v2) #define cuStreamUpdateCaptureDependencies __CUDA_API_PTSZ(cuStreamUpdateCaptureDependencies) #define cuStreamAddCallback __CUDA_API_PTSZ(cuStreamAddCallback) #define cuStreamAttachMemAsync __CUDA_API_PTSZ(cuStreamAttachMemAsync) @@ -178,24 +193,17 @@ typedef uint64_t cuuint64_t; #define cuEventRecord __CUDA_API_PTSZ(cuEventRecord) #define cuEventRecordWithFlags __CUDA_API_PTSZ(cuEventRecordWithFlags) #define cuLaunchKernel __CUDA_API_PTSZ(cuLaunchKernel) - - - + #define cuLaunchKernelEx __CUDA_API_PTSZ(cuLaunchKernelEx) #define cuLaunchHostFunc __CUDA_API_PTSZ(cuLaunchHostFunc) #define cuGraphicsMapResources __CUDA_API_PTSZ(cuGraphicsMapResources) #define cuGraphicsUnmapResources __CUDA_API_PTSZ(cuGraphicsUnmapResources) - #define cuStreamWriteValue32 __CUDA_API_PTSZ(cuStreamWriteValue32) - #define cuStreamWaitValue32 __CUDA_API_PTSZ(cuStreamWaitValue32) - #define cuStreamWriteValue64 __CUDA_API_PTSZ(cuStreamWriteValue64) - #define cuStreamWaitValue64 __CUDA_API_PTSZ(cuStreamWaitValue64) - #define cuStreamBatchMemOp __CUDA_API_PTSZ(cuStreamBatchMemOp) - #define cuLaunchCooperativeKernel __CUDA_API_PTSZ(cuLaunchCooperativeKernel) #define cuSignalExternalSemaphoresAsync __CUDA_API_PTSZ(cuSignalExternalSemaphoresAsync) #define cuWaitExternalSemaphoresAsync __CUDA_API_PTSZ(cuWaitExternalSemaphoresAsync) + #define cuGraphInstantiateWithParams __CUDA_API_PTSZ(cuGraphInstantiateWithParams) #define cuGraphUpload __CUDA_API_PTSZ(cuGraphUpload) #define cuGraphLaunch __CUDA_API_PTSZ(cuGraphLaunch) #define cuStreamCopyAttributes __CUDA_API_PTSZ(cuStreamCopyAttributes) @@ -229,7 +237,7 @@ typedef uint64_t cuuint64_t; /** * CUDA API version number */ -#define CUDA_VERSION 11060 +#define CUDA_VERSION 12010 #ifdef __cplusplus extern "C" { @@ -251,6 +259,8 @@ typedef CUdevice_v1 CUdevice; /**< CUDA device */ typedef struct CUctx_st *CUcontext; /**< CUDA context */ typedef struct CUmod_st *CUmodule; /**< CUDA module */ typedef struct CUfunc_st *CUfunction; /**< CUDA function */ +typedef struct CUlib_st *CUlibrary; /**< CUDA library */ +typedef struct CUkern_st *CUkernel; /**< CUDA kernel */ typedef struct CUarray_st *CUarray; /**< CUDA array */ typedef struct CUmipmappedArray_st *CUmipmappedArray; /**< CUDA mipmapped array */ typedef struct CUtexref_st *CUtexref; /**< CUDA texture reference */ @@ -331,9 +341,43 @@ typedef enum CUctx_flags_enum { * and it no longer has any effect. All contexts * as of CUDA 3.2 behave as though the flag is enabled. */ CU_CTX_LMEM_RESIZE_TO_MAX = 0x10, /**< Keep local memory allocation after launch */ - CU_CTX_FLAGS_MASK = 0x1f + CU_CTX_COREDUMP_ENABLE = 0x20, /**< Trigger coredumps from exceptions in this context */ + CU_CTX_USER_COREDUMP_ENABLE= 0x40, /**< Enable user pipe to trigger coredumps in this context */ + CU_CTX_SYNC_MEMOPS = 0x80, /**< Force synchronous blocking on cudaMemcpy/cudaMemset */ + CU_CTX_FLAGS_MASK = 0xFF } CUctx_flags; +/** + * Event sched flags + */ +typedef enum CUevent_sched_flags_enum { + CU_EVENT_SCHED_AUTO = 0x00, /**< Automatic scheduling */ + CU_EVENT_SCHED_SPIN = 0x01, /**< Set spin as default scheduling */ + CU_EVENT_SCHED_YIELD = 0x02, /**< Set yield as default scheduling */ + CU_EVENT_SCHED_BLOCKING_SYNC = 0x04, /**< Set blocking synchronization as default scheduling */ +} CUevent_sched_flags; + +/** + * NVCL event scheduling flags + */ +typedef enum cl_event_flags_enum { + NVCL_EVENT_SCHED_AUTO = 0x00, /**< Automatic scheduling */ + NVCL_EVENT_SCHED_SPIN = 0x01, /**< Set spin as default scheduling */ + NVCL_EVENT_SCHED_YIELD = 0x02, /**< Set yield as default scheduling */ + NVCL_EVENT_SCHED_BLOCKING_SYNC = 0x04, /**< Set blocking synchronization as default scheduling */ +} cl_event_flags; + +/** + * NVCL context scheduling flags + */ +typedef enum cl_context_flags_enum { + NVCL_CTX_SCHED_AUTO = 0x00, /**< Automatic scheduling */ + NVCL_CTX_SCHED_SPIN = 0x01, /**< Set spin as default scheduling */ + NVCL_CTX_SCHED_YIELD = 0x02, /**< Set yield as default scheduling */ + NVCL_CTX_SCHED_BLOCKING_SYNC = 0x04, /**< Set blocking synchronization as default scheduling */ +} cl_context_flags; + + /** * Stream creation flags */ @@ -412,7 +456,7 @@ typedef enum CUstreamWaitValue_flags_enum { two remote writes arrive in a defined order, the wait is satisfied by the second write, and downstream work needs to observe the first write. Support for this operation is restricted to selected platforms and can be - queried with ::CU_DEVICE_ATTRIBUTE_CAN_USE_WAIT_VALUE_FLUSH.*/ + queried with ::CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES.*/ } CUstreamWaitValue_flags; /** @@ -425,7 +469,8 @@ typedef enum CUstreamWriteValue_flags_enum { ::cuStreamWriteValue32 will provide a memory fence before the write, which has similar semantics to __threadfence_system() but is scoped to the stream - rather than a CUDA thread. */ + rather than a CUDA thread. + This flag is not supported in the v2 API. */ } CUstreamWriteValue_flags; /** @@ -436,10 +481,19 @@ typedef enum CUstreamBatchMemOpType_enum { CU_STREAM_MEM_OP_WRITE_VALUE_32 = 2, /**< Represents a ::cuStreamWriteValue32 operation */ CU_STREAM_MEM_OP_WAIT_VALUE_64 = 4, /**< Represents a ::cuStreamWaitValue64 operation */ CU_STREAM_MEM_OP_WRITE_VALUE_64 = 5, /**< Represents a ::cuStreamWriteValue64 operation */ + CU_STREAM_MEM_OP_BARRIER = 6, /**< Insert a memory barrier of the specified type */ CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES = 3 /**< This has the same effect as ::CU_STREAM_WAIT_VALUE_FLUSH, but as a standalone operation. */ } CUstreamBatchMemOpType; +/** + * Flags for ::cuStreamMemoryBarrier + */ +typedef enum CUstreamMemoryBarrier_flags_enum { + CU_STREAM_MEMORY_BARRIER_TYPE_SYS = 0x0, /**< System-wide memory barrier. */ + CU_STREAM_MEMORY_BARRIER_TYPE_GPU = 0x1 /**< Limit memory barrier scope to the GPU. */ +} CUstreamMemoryBarrier_flags; + /** * Per-operation parameters for ::cuStreamBatchMemOp */ @@ -469,10 +523,21 @@ typedef union CUstreamBatchMemOpParams_union { CUstreamBatchMemOpType operation; unsigned int flags; } flushRemoteWrites; + struct CUstreamMemOpMemoryBarrierParams_st { /**< Only supported in the _v2 API */ + CUstreamBatchMemOpType operation; + unsigned int flags; + } memoryBarrier; cuuint64_t pad[6]; } CUstreamBatchMemOpParams_v1; typedef CUstreamBatchMemOpParams_v1 CUstreamBatchMemOpParams; +typedef struct CUDA_BATCH_MEM_OP_NODE_PARAMS_st { + CUcontext ctx; + unsigned int count; + CUstreamBatchMemOpParams *paramArray; + unsigned int flags; +} CUDA_BATCH_MEM_OP_NODE_PARAMS; + /** * Occupancy calculator flag */ @@ -648,9 +713,9 @@ typedef enum CUdevice_attribute_enum { CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS = 89, /**< Device can coherently access managed memory concurrently with the CPU */ CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED = 90, /**< Device supports compute preemption. */ CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM = 91, /**< Device can access host registered memory at the same virtual address as the CPU */ - CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS = 92, /**< ::cuStreamBatchMemOp and related APIs are supported. */ - CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS = 93, /**< 64-bit operations are supported in ::cuStreamBatchMemOp and related APIs. */ - CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR = 94, /**< ::CU_STREAM_WAIT_VALUE_NOR is supported. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1 = 92, /**< Deprecated, along with v1 MemOps API, ::cuStreamBatchMemOp and related APIs are supported. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1 = 93, /**< Deprecated, along with v1 MemOps API, 64-bit operations are supported in ::cuStreamBatchMemOp and related APIs. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1 = 94, /**< Deprecated, along with v1 MemOps API, ::CU_STREAM_WAIT_VALUE_NOR is supported. */ CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH = 95, /**< Device supports launching cooperative kernels via ::cuLaunchCooperativeKernel */ CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH = 96, /**< Deprecated, ::cuLaunchCooperativeKernelMultiDevice is deprecated. */ CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN = 97, /**< Maximum optin shared memory per block */ @@ -677,12 +742,18 @@ typedef enum CUdevice_attribute_enum { CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS = 117, /**< The returned attribute shall be interpreted as a bitmask, where the individual bits are described by the ::CUflushGPUDirectRDMAWritesOptions enum */ CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING = 118, /**< GPUDirect RDMA writes to the device do not need to be flushed for consumers within the scope indicated by the returned attribute. See ::CUGPUDirectRDMAWritesOrdering for the numerical values returned here. */ CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES = 119, /**< Handle types supported with mempool based IPC */ - - - - + CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH = 120, /**< Indicates device supports cluster launch */ CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED = 121, /**< Device supports deferred mapping CUDA arrays and CUDA mipmapped arrays */ - + CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS = 122, /**< 64-bit operations are supported in ::cuStreamBatchMemOp and related MemOp APIs. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR = 123, /**< ::CU_STREAM_WAIT_VALUE_NOR is supported by MemOp APIs. */ + CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED = 124, /**< Device supports buffer sharing with dma_buf mechanism. */ + CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED = 125, /**< Device supports IPC Events. */ + CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT = 126, /**< Number of memory domains the device supports. */ + CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED = 127, /**< Device supports accessing memory using Tensor Map. */ + CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS = 129, /**< Device supports unified function pointers. */ + CU_DEVICE_ATTRIBUTE_IS_NUMA_NODE = 130, + CU_DEVICE_ATTRIBUTE_NUMA_ID = 131, + CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED = 132, /**< Device supports switch multicast and reduction operations. */ CU_DEVICE_ATTRIBUTE_MAX } CUdevice_attribute; @@ -724,6 +795,10 @@ typedef enum CUpointer_attribute_enum { CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE = 15, /**< 1 if the memory this pointer is referencing can be used with the GPUDirect RDMA API **/ CU_POINTER_ATTRIBUTE_ACCESS_FLAGS = 16, /**< Returns the access flags the device associated with the current context has on the corresponding memory referenced by the pointer given */ CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE = 17 /**< Returns the mempool handle for the allocation if it was allocated from a mempool. Otherwise returns NULL. **/ + , + CU_POINTER_ATTRIBUTE_MAPPING_SIZE = 18, /**< Size of the actual underlying mapping that the pointer belongs to **/ + CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR = 19, /**< The start address of the mapping that the pointer belongs to **/ + CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID = 20 /**< A process-wide unique id corresponding to the physical allocation the pointer belongs to **/ } CUpointer_attribute; /** @@ -788,7 +863,7 @@ typedef enum CUfunction_attribute_enum { * The maximum size in bytes of dynamically-allocated shared memory that can be used by * this function. If the user-specified dynamic shared memory size is larger than this * value, the launch will fail. - * See ::cuFuncSetAttribute + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute */ CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES = 8, @@ -797,80 +872,78 @@ typedef enum CUfunction_attribute_enum { * this sets the shared memory carveout preference, in percent of the total shared memory. * Refer to ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR. * This is only a hint, and the driver can choose a different ratio if required to execute the function. - * See ::cuFuncSetAttribute + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute */ CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT = 9, + /** + * If this attribute is set, the kernel must launch with a valid cluster + * size specified. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET = 10, + /** + * The required cluster width in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH = 11, + /** + * The required cluster height in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT = 12, + /** + * The required cluster depth in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH = 13, + /** + * Whether the function can be launched with non-portable cluster size. 1 is + * allowed, 0 is disallowed. A non-portable cluster size may only function + * on the specific SKUs the program is tested on. The launch might fail if + * the program is run on a different hardware platform. + * + * CUDA API provides cudaOccupancyMaxActiveClusters to assist with checking + * whether the desired size can be launched on the current device. + * + * Portable Cluster Size + * + * A portable cluster size is guaranteed to be functional on all compute + * capabilities higher than the target compute capability. The portable + * cluster size for sm_90 is 8 blocks per cluster. This value may increase + * for future compute capabilities. + * + * The specific hardware unit may support higher cluster sizes that’s not + * guaranteed to be portable. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED = 14, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /** + * The block scheduling policy of a function. The value type is + * CUclusterSchedulingPolicy / cudaClusterSchedulingPolicy. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = 15, CU_FUNC_ATTRIBUTE_MAX } CUfunction_attribute; @@ -895,7 +968,7 @@ typedef enum CUsharedconfig_enum { } CUsharedconfig; /** - * Shared memory carveout configurations. These may be passed to ::cuFuncSetAttribute + * Shared memory carveout configurations. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute */ typedef enum CUshared_carveout_enum { CU_SHAREDMEM_CARVEOUT_DEFAULT = -1, /**< No preference for shared memory or L1 (default) */ @@ -926,7 +999,7 @@ typedef enum CUcomputemode_enum { * Memory advise values */ typedef enum CUmem_advise_enum { - CU_MEM_ADVISE_SET_READ_MOSTLY = 1, /**< Data will mostly be read and only occassionally be written to */ + CU_MEM_ADVISE_SET_READ_MOSTLY = 1, /**< Data will mostly be read and only occasionally be written to */ CU_MEM_ADVISE_UNSET_READ_MOSTLY = 2, /**< Undo the effect of ::CU_MEM_ADVISE_SET_READ_MOSTLY */ CU_MEM_ADVISE_SET_PREFERRED_LOCATION = 3, /**< Set the preferred location for the data as the specified device */ CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION = 4, /**< Clear the preferred location for the data */ @@ -935,7 +1008,7 @@ typedef enum CUmem_advise_enum { } CUmem_advise; typedef enum CUmem_range_attribute_enum { - CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY = 1, /**< Whether the range will mostly be read and only occassionally be written to */ + CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY = 1, /**< Whether the range will mostly be read and only occasionally be written to */ CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION = 2, /**< The preferred location of the range */ CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY = 3, /**< Memory range has ::CU_MEM_ADVISE_SET_ACCESSED_BY set for specified device */ CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION = 4 /**< The last location to which the range was prefetched */ @@ -957,7 +1030,7 @@ typedef enum CUjit_option_enum * IN: Specifies minimum number of threads per block to target compilation * for\n * OUT: Returns the number of threads the compiler actually targeted. - * This restricts the resource utilization fo the compiler (e.g. max + * This restricts the resource utilization of the compiler (e.g. max * registers) such that a block with the given number of threads should be * able to launch based on register limitations. Note, this option does not * currently take into account any other resource limitations, such as @@ -966,7 +1039,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int\n * Applies to: compiler only */ - CU_JIT_THREADS_PER_BLOCK, + CU_JIT_THREADS_PER_BLOCK = 1, /** * Overwrites the option value with the total wall clock time, in @@ -974,7 +1047,7 @@ typedef enum CUjit_option_enum * Option type: float\n * Applies to: compiler and linker */ - CU_JIT_WALL_TIME, + CU_JIT_WALL_TIME = 2, /** * Pointer to a buffer in which to print any log messages @@ -983,7 +1056,7 @@ typedef enum CUjit_option_enum * Option type: char *\n * Applies to: compiler and linker */ - CU_JIT_INFO_LOG_BUFFER, + CU_JIT_INFO_LOG_BUFFER = 3, /** * IN: Log buffer size in bytes. Log messages will be capped at this size @@ -992,7 +1065,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int\n * Applies to: compiler and linker */ - CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES, + CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES = 4, /** * Pointer to a buffer in which to print any log messages that @@ -1001,7 +1074,7 @@ typedef enum CUjit_option_enum * Option type: char *\n * Applies to: compiler and linker */ - CU_JIT_ERROR_LOG_BUFFER, + CU_JIT_ERROR_LOG_BUFFER = 5, /** * IN: Log buffer size in bytes. Log messages will be capped at this size @@ -1010,7 +1083,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int\n * Applies to: compiler and linker */ - CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES, + CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES = 6, /** * Level of optimizations to apply to generated code (0 - 4), with 4 @@ -1018,7 +1091,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int\n * Applies to: compiler only */ - CU_JIT_OPTIMIZATION_LEVEL, + CU_JIT_OPTIMIZATION_LEVEL = 7, /** * No option value required. Determines the target based on the current @@ -1026,7 +1099,7 @@ typedef enum CUjit_option_enum * Option type: No option value needed\n * Applies to: compiler and linker */ - CU_JIT_TARGET_FROM_CUCONTEXT, + CU_JIT_TARGET_FROM_CUCONTEXT = 8, /** * Target is chosen based on supplied ::CUjit_target. Cannot be @@ -1034,7 +1107,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int for enumerated type ::CUjit_target\n * Applies to: compiler and linker */ - CU_JIT_TARGET, + CU_JIT_TARGET = 9, /** * Specifies choice of fallback strategy if matching cubin is not found. @@ -1043,7 +1116,7 @@ typedef enum CUjit_option_enum * Option type: unsigned int for enumerated type ::CUjit_fallback\n * Applies to: compiler only */ - CU_JIT_FALLBACK_STRATEGY, + CU_JIT_FALLBACK_STRATEGY = 10, /** * Specifies whether to create debug information in output (-g) @@ -1051,21 +1124,21 @@ typedef enum CUjit_option_enum * Option type: int\n * Applies to: compiler and linker */ - CU_JIT_GENERATE_DEBUG_INFO, + CU_JIT_GENERATE_DEBUG_INFO = 11, /** * Generate verbose log messages (0: false, default)\n * Option type: int\n * Applies to: compiler and linker */ - CU_JIT_LOG_VERBOSE, + CU_JIT_LOG_VERBOSE = 12, /** * Generate line number information (-lineinfo) (0: false, default)\n * Option type: int\n * Applies to: compiler only */ - CU_JIT_GENERATE_LINE_INFO, + CU_JIT_GENERATE_LINE_INFO = 13, /** * Specifies whether to enable caching explicitly (-dlcm) \n @@ -1073,19 +1146,24 @@ typedef enum CUjit_option_enum * Option type: unsigned int for enumerated type ::CUjit_cacheMode_enum\n * Applies to: compiler only */ - CU_JIT_CACHE_MODE, + CU_JIT_CACHE_MODE = 14, + + /** + * \deprecated + * This jit option is deprecated and should not be used. + */ + CU_JIT_NEW_SM3X_OPT = 15, /** - * The below jit options are used for internal purposes only, in this version of CUDA + * This jit option is used for internal purpose only. */ - CU_JIT_NEW_SM3X_OPT, - CU_JIT_FAST_COMPILE, + CU_JIT_FAST_COMPILE = 16, /** - * Array of device symbol names that will be relocated to the corresponing + * Array of device symbol names that will be relocated to the corresponding * host addresses stored in ::CU_JIT_GLOBAL_SYMBOL_ADDRESSES.\n * Must contain ::CU_JIT_GLOBAL_SYMBOL_COUNT entries.\n - * When loding a device module, driver will relocate all encountered + * When loading a device module, driver will relocate all encountered * unresolved symbols to the host addresses.\n * It is only allowed to register symbols that correspond to unresolved * global variables.\n @@ -1093,7 +1171,7 @@ typedef enum CUjit_option_enum * Option type: const char **\n * Applies to: dynamic linker only */ - CU_JIT_GLOBAL_SYMBOL_NAMES, + CU_JIT_GLOBAL_SYMBOL_NAMES = 17, /** * Array of host addresses that will be used to relocate corresponding @@ -1102,7 +1180,7 @@ typedef enum CUjit_option_enum * Option type: void **\n * Applies to: dynamic linker only */ - CU_JIT_GLOBAL_SYMBOL_ADDRESSES, + CU_JIT_GLOBAL_SYMBOL_ADDRESSES = 18, /** * Number of entries in ::CU_JIT_GLOBAL_SYMBOL_NAMES and @@ -1110,92 +1188,186 @@ typedef enum CUjit_option_enum * Option type: unsigned int\n * Applies to: dynamic linker only */ - CU_JIT_GLOBAL_SYMBOL_COUNT, + CU_JIT_GLOBAL_SYMBOL_COUNT = 19, /** - * Enable link-time optimization (-dlto) for device code (0: false, default).\n + * \deprecated + * Enable link-time optimization (-dlto) for device code (Disabled by default).\n * This option is not supported on 32-bit platforms.\n * Option type: int\n * Applies to: compiler and linker + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 */ - CU_JIT_LTO, + CU_JIT_LTO = 20, /** + * \deprecated * Control single-precision denormals (-ftz) support (0: false, default). * 1 : flushes denormal values to zero * 0 : preserves denormal values * Option type: int\n * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 */ - CU_JIT_FTZ, + CU_JIT_FTZ = 21, /** + * \deprecated * Control single-precision floating-point division and reciprocals * (-prec-div) support (1: true, default). * 1 : Enables the IEEE round-to-nearest mode * 0 : Enables the fast approximation mode * Option type: int\n * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 */ - CU_JIT_PREC_DIV, + CU_JIT_PREC_DIV = 22, /** + * \deprecated * Control single-precision floating-point square root * (-prec-sqrt) support (1: true, default). * 1 : Enables the IEEE round-to-nearest mode * 0 : Enables the fast approximation mode * Option type: int\n * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 */ - CU_JIT_PREC_SQRT, + CU_JIT_PREC_SQRT = 23, /** + * \deprecated * Enable/Disable the contraction of floating-point multiplies * and adds/subtracts into floating-point multiply-add (-fma) * operations (1: Enable, default; 0: Disable). * Option type: int\n * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_FMA = 24, + + /** + * \deprecated + * Array of kernel names that should be preserved at link time while others + * can be removed.\n + * Must contain ::CU_JIT_REFERENCED_KERNEL_COUNT entries.\n + * Note that kernel names can be mangled by the compiler in which case the + * mangled name needs to be specified.\n + * Wildcard "*" can be used to represent zero or more characters instead of + * specifying the full or mangled name.\n + * It is important to note that the wildcard "*" is also added implicitly. + * For example, specifying "foo" will match "foobaz", "barfoo", "barfoobaz" and + * thus preserve all kernels with those names. This can be avoided by providing + * a more specific name like "barfoobaz".\n + * Option type: const char **\n + * Applies to: dynamic linker only + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_REFERENCED_KERNEL_NAMES = 25, + + /** + * \deprecated + * Number of entries in ::CU_JIT_REFERENCED_KERNEL_NAMES array.\n + * Option type: unsigned int\n + * Applies to: dynamic linker only + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_REFERENCED_KERNEL_COUNT = 26, + + /** + * \deprecated + * Array of variable names (__device__ and/or __constant__) that should be + * preserved at link time while others can be removed.\n + * Must contain ::CU_JIT_REFERENCED_VARIABLE_COUNT entries.\n + * Note that variable names can be mangled by the compiler in which case the + * mangled name needs to be specified.\n + * Wildcard "*" can be used to represent zero or more characters instead of + * specifying the full or mangled name.\n + * It is important to note that the wildcard "*" is also added implicitly. + * For example, specifying "foo" will match "foobaz", "barfoo", "barfoobaz" and + * thus preserve all variables with those names. This can be avoided by providing + * a more specific name like "barfoobaz".\n + * Option type: const char **\n + * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_REFERENCED_VARIABLE_NAMES = 27, + + /** + * \deprecated + * Number of entries in ::CU_JIT_REFERENCED_VARIABLE_NAMES array.\n + * Option type: unsigned int\n + * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_REFERENCED_VARIABLE_COUNT = 28, + + /** + * \deprecated + * This option serves as a hint to enable the JIT compiler/linker + * to remove constant (__constant__) and device (__device__) variables + * unreferenced in device code (Disabled by default).\n + * Note that host references to constant and device variables using APIs like + * ::cuModuleGetGlobal() with this option specified may result in undefined behavior unless + * the variables are explicitly specified using ::CU_JIT_REFERENCED_VARIABLE_NAMES.\n + * Option type: int\n + * Applies to: link-time optimization specified with CU_JIT_LTO + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 + */ + CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES = 29, + + /** + * Generate position independent code (0: false)\n + * Option type: int\n + * Applies to: compiler only */ - CU_JIT_FMA, + CU_JIT_POSITION_INDEPENDENT_CODE = 30, CU_JIT_NUM_OPTIONS } CUjit_option; +/* + * Indicates that compute device class supports accelerated features. + */ +#define CU_COMPUTE_ACCELERATED_TARGET_BASE 0x10000 + /** * Online compilation targets */ typedef enum CUjit_target_enum { - - CU_TARGET_COMPUTE_20 = 20, /**< Compute device class 2.0 */ - CU_TARGET_COMPUTE_21 = 21, /**< Compute device class 2.1 */ - - CU_TARGET_COMPUTE_30 = 30, /**< Compute device class 3.0 */ CU_TARGET_COMPUTE_32 = 32, /**< Compute device class 3.2 */ CU_TARGET_COMPUTE_35 = 35, /**< Compute device class 3.5 */ CU_TARGET_COMPUTE_37 = 37, /**< Compute device class 3.7 */ - - CU_TARGET_COMPUTE_50 = 50, /**< Compute device class 5.0 */ CU_TARGET_COMPUTE_52 = 52, /**< Compute device class 5.2 */ CU_TARGET_COMPUTE_53 = 53, /**< Compute device class 5.3 */ - - CU_TARGET_COMPUTE_60 = 60, /**< Compute device class 6.0.*/ CU_TARGET_COMPUTE_61 = 61, /**< Compute device class 6.1.*/ CU_TARGET_COMPUTE_62 = 62, /**< Compute device class 6.2.*/ - - CU_TARGET_COMPUTE_70 = 70, /**< Compute device class 7.0.*/ CU_TARGET_COMPUTE_72 = 72, /**< Compute device class 7.2.*/ - CU_TARGET_COMPUTE_75 = 75, /**< Compute device class 7.5.*/ - CU_TARGET_COMPUTE_80 = 80, /**< Compute device class 8.0.*/ - CU_TARGET_COMPUTE_86 = 86 /**< Compute device class 8.6.*/ + CU_TARGET_COMPUTE_86 = 86, /**< Compute device class 8.6.*/ + CU_TARGET_COMPUTE_87 = 87, /**< Compute device class 8.7.*/ + CU_TARGET_COMPUTE_89 = 89, /**< Compute device class 8.9.*/ + CU_TARGET_COMPUTE_90 = 90, /**< Compute device class 9.0.*/ + /**< Compute device class 9.0. with accelerated features.*/ + CU_TARGET_COMPUTE_90A = CU_COMPUTE_ACCELERATED_TARGET_BASE + CU_TARGET_COMPUTE_90 } CUjit_target; /** @@ -1234,33 +1406,36 @@ typedef enum CUjitInputType_enum * PTX source code\n * Applicable options: PTX compiler options */ - CU_JIT_INPUT_PTX, + CU_JIT_INPUT_PTX = 1, /** * Bundle of multiple cubins and/or PTX of some device code\n * Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY */ - CU_JIT_INPUT_FATBINARY, + CU_JIT_INPUT_FATBINARY = 2, /** * Host object with embedded device code\n * Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY */ - CU_JIT_INPUT_OBJECT, + CU_JIT_INPUT_OBJECT = 3, /** * Archive of host objects with embedded device code\n * Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY */ - CU_JIT_INPUT_LIBRARY, + CU_JIT_INPUT_LIBRARY = 4, /** + * \deprecated * High-level intermediate code for link-time optimization\n * Applicable options: NVVM compiler options, PTX compiler options + * + * Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0 */ - CU_JIT_INPUT_NVVM, + CU_JIT_INPUT_NVVM = 5, - CU_JIT_NUM_INPUT_TYPES + CU_JIT_NUM_INPUT_TYPES = 6 } CUjitInputType; typedef struct CUlinkState_st *CUlinkState; @@ -1315,7 +1490,7 @@ typedef enum CUlimit_enum { * Resource types */ typedef enum CUresourcetype_enum { - CU_RESOURCE_TYPE_ARRAY = 0x00, /**< Array resoure */ + CU_RESOURCE_TYPE_ARRAY = 0x00, /**< Array resource */ CU_RESOURCE_TYPE_MIPMAPPED_ARRAY = 0x01, /**< Mipmapped array resource */ CU_RESOURCE_TYPE_LINEAR = 0x02, /**< Linear resource */ CU_RESOURCE_TYPE_PITCH2D = 0x03 /**< Pitch 2D resource */ @@ -1361,6 +1536,9 @@ typedef struct CUaccessPolicyWindow_st { CUaccessProperty hitProp; /**< ::CUaccessProperty set for hit. */ CUaccessProperty missProp; /**< ::CUaccessProperty set for miss. Must be either NORMAL or STREAMING */ } CUaccessPolicyWindow_v1; +/** + * Access policy window + */ typedef CUaccessPolicyWindow_v1 CUaccessPolicyWindow; /** @@ -1378,7 +1556,24 @@ typedef struct CUDA_KERNEL_NODE_PARAMS_st { void **kernelParams; /**< Array of pointers to kernel parameters */ void **extra; /**< Extra options */ } CUDA_KERNEL_NODE_PARAMS_v1; -typedef CUDA_KERNEL_NODE_PARAMS_v1 CUDA_KERNEL_NODE_PARAMS; + +/** + * GPU kernel node parameters + */typedef struct CUDA_KERNEL_NODE_PARAMS_v2_st { + CUfunction func; /**< Kernel to launch */ + unsigned int gridDimX; /**< Width of grid in blocks */ + unsigned int gridDimY; /**< Height of grid in blocks */ + unsigned int gridDimZ; /**< Depth of grid in blocks */ + unsigned int blockDimX; /**< X dimension of each thread block */ + unsigned int blockDimY; /**< Y dimension of each thread block */ + unsigned int blockDimZ; /**< Z dimension of each thread block */ + unsigned int sharedMemBytes; /**< Dynamic shared-memory size per thread block in bytes */ + void **kernelParams; /**< Array of pointers to kernel parameters */ + void **extra; /**< Extra options */ + CUkernel kern; /**< Kernel to launch, will only be referenced if func is NULL */ + CUcontext ctx; /**< Context for the kernel task to run in. The value NULL will indicate the current context should be used by the api. This field is ignored if func is set. */ +} CUDA_KERNEL_NODE_PARAMS_v2; +typedef CUDA_KERNEL_NODE_PARAMS_v2 CUDA_KERNEL_NODE_PARAMS; /** * Memset node parameters @@ -1417,9 +1612,33 @@ typedef enum CUgraphNodeType_enum { CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL = 8, /**< External semaphore signal node */ CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT = 9, /**< External semaphore wait node */ CU_GRAPH_NODE_TYPE_MEM_ALLOC = 10,/**< Memory Allocation Node */ - CU_GRAPH_NODE_TYPE_MEM_FREE = 11 /**< Memory Free Node */ + CU_GRAPH_NODE_TYPE_MEM_FREE = 11,/**< Memory Free Node */ + CU_GRAPH_NODE_TYPE_BATCH_MEM_OP = 12 /**< Batch MemOp Node */ } CUgraphNodeType; +/** + * Graph instantiation results +*/ +typedef enum CUgraphInstantiateResult_enum +{ + CUDA_GRAPH_INSTANTIATE_SUCCESS = 0, /**< Instantiation succeeded */ + CUDA_GRAPH_INSTANTIATE_ERROR = 1, /**< Instantiation failed for an unexpected reason which is described in the return value of the function */ + CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE = 2, /**< Instantiation failed due to invalid structure, such as cycles */ + CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED = 3, /**< Instantiation for device launch failed because the graph contained an unsupported operation */ + CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED = 4 /**< Instantiation for device launch failed due to the nodes belonging to different contexts */ +} CUgraphInstantiateResult; + +/** + * Graph instantiation parameters + */ +typedef struct CUDA_GRAPH_INSTANTIATE_PARAMS_st +{ + cuuint64_t flags; /**< Instantiation flags */ + CUstream hUploadStream; /**< Upload stream */ + CUgraphNode hErrNode_out; /**< The node which caused instantiation to fail, if any */ + CUgraphInstantiateResult result_out; /**< Whether instantiation was successful. If it failed, the reason why */ +} CUDA_GRAPH_INSTANTIATE_PARAMS; + typedef enum CUsynchronizationPolicy_enum { CU_SYNC_POLICY_AUTO = 1, CU_SYNC_POLICY_SPIN = 2, @@ -1428,20 +1647,124 @@ typedef enum CUsynchronizationPolicy_enum { } CUsynchronizationPolicy; /** - * Graph kernel node Attributes - */ -typedef enum CUkernelNodeAttrID_enum { - CU_KERNEL_NODE_ATTRIBUTE_ACCESS_POLICY_WINDOW = 1, /**< Identifier for ::CUkernelNodeAttrValue::accessPolicyWindow. */ - CU_KERNEL_NODE_ATTRIBUTE_COOPERATIVE = 2 /**< Allows a kernel node to be cooperative (see ::cuLaunchCooperativeKernel). */ -} CUkernelNodeAttrID; + * Cluster scheduling policies. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute + */ +typedef enum CUclusterSchedulingPolicy_enum { + CU_CLUSTER_SCHEDULING_POLICY_DEFAULT = 0, /**< the default policy */ + CU_CLUSTER_SCHEDULING_POLICY_SPREAD = 1, /**< spread the blocks within a cluster to the SMs */ + CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING = 2 /**< allow the hardware to load-balance the blocks in a cluster to the SMs */ +} CUclusterSchedulingPolicy; + +typedef enum CUlaunchMemSyncDomain_enum { + CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT = 0, + CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE = 1 +} CUlaunchMemSyncDomain; + +typedef struct CUlaunchMemSyncDomainMap_st { + unsigned char default_; + unsigned char remote; +} CUlaunchMemSyncDomainMap; + +typedef enum CUlaunchAttributeID_enum { + CU_LAUNCH_ATTRIBUTE_IGNORE = 0 /**< Ignored entry, for convenient composition */ + , CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW = 1 /**< Valid for streams, graph nodes, launches. */ + , CU_LAUNCH_ATTRIBUTE_COOPERATIVE = 2 /**< Valid for graph nodes, launches. */ + , CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY = 3 /**< Valid for streams. */ + , CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION = 4 /**< Valid for graph nodes, launches. */ + , CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = 5 /**< Valid for graph nodes, launches. */ + , CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION = 6 /**< Valid for launches. Setting + programmaticStreamSerializationAllowed to non-0 + signals that the kernel will use programmatic + means to resolve its stream dependency, so that + the CUDA runtime should opportunistically allow + the grid's execution to overlap with the previous + kernel in the stream, if that kernel requests the + overlap. The dependent launches can choose to wait + on the dependency using the programmatic sync + (cudaGridDependencySynchronize() or equivalent PTX + instructions). */ + , CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT = 7 /**< Valid for launches. Event recorded through this + launch attribute is guaranteed to only trigger + after all block in the associated kernel trigger + the event. A block can trigger the event through + PTX launchdep.release or CUDA builtin function + cudaTriggerProgrammaticLaunchCompletion(). A + trigger can also be inserted at the beginning of + each block's execution if triggerAtBlockStart is + set to non-0. The dependent launches can choose to + wait on the dependency using the programmatic sync + (cudaGridDependencySynchronize() or equivalent PTX + instructions). Note that dependents (including the + CPU thread calling cuEventSynchronize()) are not + guaranteed to observe the release precisely when + it is released. For example, cuEventSynchronize() + may only observe the event trigger long after the + associated kernel has completed. This recording + type is primarily meant for establishing + programmatic dependency between device tasks. The + event supplied must not be an interprocess or + interop event. The event must disable timing (i.e. + created with ::CU_EVENT_DISABLE_TIMING flag set). + */ + , CU_LAUNCH_ATTRIBUTE_PRIORITY = 8 /**< Valid for streams, graph nodes, launches. */ + , CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP = 9 + , CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN = 10 +#ifdef __CUDA_API_VERSION_INTERNAL + , CU_LAUNCH_ATTRIBUTE_MAX +#endif +} CUlaunchAttributeID; -/** - * Graph kernel node attributes union, used with ::cuKernelNodeSetAttribute/::cuKernelNodeGetAttribute - */ -typedef union CUkernelNodeAttrValue_union { - CUaccessPolicyWindow accessPolicyWindow; /**< Attribute ::CUaccessPolicyWindow. */ - int cooperative; /**< Nonzero indicates a cooperative kernel (see ::cuLaunchCooperativeKernel). */ -} CUkernelNodeAttrValue_v1; +typedef union CUlaunchAttributeValue_union { + char pad[64]; /**< Pad to 64 bytes */ + CUaccessPolicyWindow accessPolicyWindow; /**< Attribute ::CUaccessPolicyWindow. */ + int cooperative; /**< Nonzero indicates a cooperative kernel (see ::cuLaunchCooperativeKernel). */ + CUsynchronizationPolicy syncPolicy; /**< ::CUsynchronizationPolicy for work queued up in this stream */ + struct { + unsigned int x; + unsigned int y; + unsigned int z; + } clusterDim; /**< Cluster dimensions for the kernel node. */ + CUclusterSchedulingPolicy clusterSchedulingPolicyPreference; /**< Cluster scheduling policy preference for the kernel node. */ + int programmaticStreamSerializationAllowed; + struct { + CUevent event; + int flags; /* Does not accept ::CU_EVENT_RECORD_EXTERNAL */ + int triggerAtBlockStart; + } programmaticEvent; + int priority; /**< Execution priority of the kernel. */ + CUlaunchMemSyncDomainMap memSyncDomainMap; + CUlaunchMemSyncDomain memSyncDomain; +} CUlaunchAttributeValue; + +typedef struct CUlaunchAttribute_st { + CUlaunchAttributeID id; + char pad[8 - sizeof(CUlaunchAttributeID)]; + CUlaunchAttributeValue value; +} CUlaunchAttribute; + +typedef struct CUlaunchConfig_st { + unsigned int gridDimX; /**< Width of grid in blocks */ + unsigned int gridDimY; /**< Height of grid in blocks */ + unsigned int gridDimZ; /**< Depth of grid in blocks */ + unsigned int blockDimX; /**< X dimension of each thread block */ + unsigned int blockDimY; /**< Y dimension of each thread block */ + unsigned int blockDimZ; /**< Z dimension of each thread block */ + unsigned int sharedMemBytes; /**< Dynamic shared-memory size per thread block in bytes */ + CUstream hStream; /**< Stream identifier */ + CUlaunchAttribute *attrs; /**< nullable if numAttrs == 0 */ + unsigned int numAttrs; /**< number of attributes populated in attrs */ +} CUlaunchConfig; + +typedef CUlaunchAttributeID CUkernelNodeAttrID; +#define CU_KERNEL_NODE_ATTRIBUTE_ACCESS_POLICY_WINDOW CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW +#define CU_KERNEL_NODE_ATTRIBUTE_COOPERATIVE CU_LAUNCH_ATTRIBUTE_COOPERATIVE +#define CU_KERNEL_NODE_ATTRIBUTE_CLUSTER_DIMENSION CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION +#define CU_KERNEL_NODE_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE +#define CU_KERNEL_NODE_ATTRIBUTE_PRIORITY CU_LAUNCH_ATTRIBUTE_PRIORITY +#define CU_KERNEL_NODE_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP +#define CU_KERNEL_NODE_ATTRIBUTE_MEM_SYNC_DOMAIN CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN + +typedef CUlaunchAttributeValue CUkernelNodeAttrValue_v1; typedef CUkernelNodeAttrValue_v1 CUkernelNodeAttrValue; /** @@ -1464,21 +1787,14 @@ typedef enum CUstreamCaptureMode_enum { CU_STREAM_CAPTURE_MODE_RELAXED = 2 } CUstreamCaptureMode; -/** - * Stream Attributes - */ -typedef enum CUstreamAttrID_enum { - CU_STREAM_ATTRIBUTE_ACCESS_POLICY_WINDOW = 1, /**< Identifier for ::CUstreamAttrValue::accessPolicyWindow. */ - CU_STREAM_ATTRIBUTE_SYNCHRONIZATION_POLICY = 3 /**< ::CUsynchronizationPolicy for work queued up in this stream */ -} CUstreamAttrID; +typedef CUlaunchAttributeID CUstreamAttrID; +#define CU_STREAM_ATTRIBUTE_ACCESS_POLICY_WINDOW CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW +#define CU_STREAM_ATTRIBUTE_SYNCHRONIZATION_POLICY CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY +#define CU_STREAM_ATTRIBUTE_PRIORITY CU_LAUNCH_ATTRIBUTE_PRIORITY +#define CU_STREAM_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP +#define CU_STREAM_ATTRIBUTE_MEM_SYNC_DOMAIN CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN -/** - * Stream attributes union, used with ::cuStreamSetAttribute/::cuStreamGetAttribute - */ -typedef union CUstreamAttrValue_union { - CUaccessPolicyWindow accessPolicyWindow; /**< Attribute ::CUaccessPolicyWindow. */ - CUsynchronizationPolicy syncPolicy; /**< Value for ::CU_STREAM_ATTRIBUTE_SYNCHRONIZATION_POLICY. */ -} CUstreamAttrValue_v1; +typedef CUlaunchAttributeValue CUstreamAttrValue_v1; typedef CUstreamAttrValue_v1 CUstreamAttrValue; /** @@ -1490,6 +1806,15 @@ typedef enum CUdriverProcAddress_flags_enum { CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM = 1 << 1 /**< Search for per-thread versions of driver symbols. */ } CUdriverProcAddress_flags; +/** + * Flags to indicate search status. For more details see ::cuGetProcAddress + */ +typedef enum CUdriverProcAddressQueryResult_enum { + CU_GET_PROC_ADDRESS_SUCCESS = 0, /**< Symbol was succesfully found */ + CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND = 1, /**< Symbol was not found in search */ + CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT = 2 /**< Symbol was found but version supplied was not sufficient */ +} CUdriverProcAddressQueryResult; + /** * Execution Affinity Types */ @@ -1515,8 +1840,40 @@ typedef struct CUexecAffinityParam_st { CUexecAffinitySmCount smCount; /** Value for ::CU_EXEC_AFFINITY_TYPE_SM_COUNT */ } param; } CUexecAffinityParam_v1; +/** + * Execution Affinity Parameters + */ typedef CUexecAffinityParam_v1 CUexecAffinityParam; +/** + * Library options to be specified with ::cuLibraryLoadData() or ::cuLibraryLoadFromFile() + */ +typedef enum CUlibraryOption_enum +{ + CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE = 0, + + /** + * Specifes that the argument \p code passed to ::cuLibraryLoadData() will be preserved. + * Specifying this option will let the driver know that \p code can be accessed at any point + * until ::cuLibraryUnload(). The default behavior is for the driver to allocate and + * maintain its own copy of \p code. Note that this is only a memory usage optimization + * hint and the driver can choose to ignore it if required. + * Specifying this option with ::cuLibraryLoadFromFile() is invalid and + * will return ::CUDA_ERROR_INVALID_VALUE. + */ + CU_LIBRARY_BINARY_IS_PRESERVED = 1, + + CU_LIBRARY_NUM_OPTIONS +} CUlibraryOption; + +typedef struct CUlibraryHostUniversalFunctionAndDataTable_st +{ + void *functionTable; + size_t functionWindowSize; + void *dataTable; + size_t dataWindowSize; +} CUlibraryHostUniversalFunctionAndDataTable; + /** * Error codes */ @@ -1587,6 +1944,13 @@ typedef enum cudaError_enum { */ CUDA_ERROR_STUB_LIBRARY = 34, + /** + * This indicates that requested CUDA device is unavailable at the current + * time. Devices are often unavailable due to use of + * ::CU_COMPUTEMODE_EXCLUSIVE_PROCESS or ::CU_COMPUTEMODE_PROHIBITED. + */ + CUDA_ERROR_DEVICE_UNAVAILABLE = 46, + /** * This indicates that no CUDA-capable devices were detected by the installed * CUDA driver. @@ -1744,6 +2108,12 @@ typedef enum cudaError_enum { */ CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY = 224, + /** + * This indicates that the code to be compiled by the PTX JIT contains + * unsupported call to cudaDeviceSynchronize. + */ + CUDA_ERROR_UNSUPPORTED_DEVSIDE_SYNC = 225, + /** * This indicates that the device kernel source is invalid. This includes * compilation/linker errors encountered in device code or user error. @@ -2014,6 +2384,21 @@ typedef enum cudaError_enum { */ CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED = 809, + /** + * This error indicates that the MPS client has been terminated by the server. To continue using CUDA, the process must be terminated and relaunched. + */ + CUDA_ERROR_MPS_CLIENT_TERMINATED = 810, + + /** + * This error indicates that the module is using CUDA Dynamic Parallelism, but the current configuration, like MPS, does not support it. + */ + CUDA_ERROR_CDP_NOT_SUPPORTED = 811, + + /** + * This error indicates that a module contains an unsupported interaction between different versions of CUDA Dynamic Parallelism. + */ + CUDA_ERROR_CDP_VERSION_MISMATCH = 812, + /** * This error indicates that the operation is not permitted when * the stream is capturing. @@ -2090,12 +2475,10 @@ typedef enum cudaError_enum { */ CUDA_ERROR_EXTERNAL_DEVICE = 911, - - - - - - + /** + * Indicates a kernel launch error due to cluster misconfiguration. + */ + CUDA_ERROR_INVALID_CLUSTER_SIZE = 912, /** * This indicates that an unknown internal error has occurred. @@ -2114,17 +2497,6 @@ typedef enum CUdevice_P2PAttribute_enum { CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED = 0x04 /**< Accessing CUDA arrays over the link supported */ } CUdevice_P2PAttribute; - - - - - - - - - - - /** * CUDA stream callback * \param hStream The stream the callback was added to, as passed to ::cuStreamAddCallback. May be NULL. @@ -2355,7 +2727,6 @@ typedef struct CUDA_ARRAY_SPARSE_PROPERTIES_st { } CUDA_ARRAY_SPARSE_PROPERTIES_v1; typedef CUDA_ARRAY_SPARSE_PROPERTIES_v1 CUDA_ARRAY_SPARSE_PROPERTIES; - /** * CUDA array memory requirements */ @@ -2366,7 +2737,6 @@ typedef struct CUDA_ARRAY_MEMORY_REQUIREMENTS_st { } CUDA_ARRAY_MEMORY_REQUIREMENTS_v1; typedef CUDA_ARRAY_MEMORY_REQUIREMENTS_v1 CUDA_ARRAY_MEMORY_REQUIREMENTS; - /** * CUDA Resource descriptor */ @@ -2480,6 +2850,79 @@ typedef struct CUDA_RESOURCE_VIEW_DESC_st } CUDA_RESOURCE_VIEW_DESC_v1; typedef CUDA_RESOURCE_VIEW_DESC_v1 CUDA_RESOURCE_VIEW_DESC; +/** + * Size of tensor map descriptor + */ +#define CU_TENSOR_MAP_NUM_QWORDS 16 + +/** + * Tensor map descriptor. Requires compiler support for aligning to 64 bytes. + */ +typedef struct CUtensorMap_st { +#if __cplusplus >= 201103L + alignas(64) +#elif __STDC_VERSION__ >= 201112L + _Alignas(64) +#endif + cuuint64_t opaque[CU_TENSOR_MAP_NUM_QWORDS]; +} CUtensorMap; + +/** + * Tensor map data type + */ +typedef enum CUtensorMapDataType_enum { + CU_TENSOR_MAP_DATA_TYPE_UINT8 = 0, + CU_TENSOR_MAP_DATA_TYPE_UINT16, + CU_TENSOR_MAP_DATA_TYPE_UINT32, + CU_TENSOR_MAP_DATA_TYPE_INT32, + CU_TENSOR_MAP_DATA_TYPE_UINT64, + CU_TENSOR_MAP_DATA_TYPE_INT64, + CU_TENSOR_MAP_DATA_TYPE_FLOAT16, + CU_TENSOR_MAP_DATA_TYPE_FLOAT32, + CU_TENSOR_MAP_DATA_TYPE_FLOAT64, + CU_TENSOR_MAP_DATA_TYPE_BFLOAT16, + CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ, + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32, + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ +} CUtensorMapDataType; + +/** + * Tensor map interleave layout type + */ +typedef enum CUtensorMapInterleave_enum { + CU_TENSOR_MAP_INTERLEAVE_NONE = 0, + CU_TENSOR_MAP_INTERLEAVE_16B, + CU_TENSOR_MAP_INTERLEAVE_32B +} CUtensorMapInterleave; + +/** + * Tensor map swizzling mode of shared memory banks + */ +typedef enum CUtensorMapSwizzle_enum { + CU_TENSOR_MAP_SWIZZLE_NONE = 0, + CU_TENSOR_MAP_SWIZZLE_32B, + CU_TENSOR_MAP_SWIZZLE_64B, + CU_TENSOR_MAP_SWIZZLE_128B +} CUtensorMapSwizzle; + +/** + * Tensor map L2 promotion type + */ +typedef enum CUtensorMapL2promotion_enum { + CU_TENSOR_MAP_L2_PROMOTION_NONE = 0, + CU_TENSOR_MAP_L2_PROMOTION_L2_64B, + CU_TENSOR_MAP_L2_PROMOTION_L2_128B, + CU_TENSOR_MAP_L2_PROMOTION_L2_256B +} CUtensorMapL2promotion; + +/** + * Tensor map out-of-bounds fill type + */ +typedef enum CUtensorMapFloatOOBfill_enum { + CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0, + CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA +} CUtensorMapFloatOOBfill; + /** * GPU Direct v3 tokens */ @@ -2964,6 +3407,15 @@ typedef enum CUmemAllocationGranularity_flags_enum { CU_MEM_ALLOC_GRANULARITY_RECOMMENDED = 0x1 /**< Recommended granularity for allocation for best performance */ } CUmemAllocationGranularity_flags; +/** +* Specifies the handle type for address range +*/ +typedef enum CUmemRangeHandleType_enum +{ + CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD = 0x1, + CU_MEM_RANGE_HANDLE_TYPE_MAX = 0x7FFFFFFF +} CUmemRangeHandleType; + /** * Sparse subresource types */ @@ -3066,9 +3518,9 @@ typedef struct CUmemAllocationProp_st { CUmemLocation location; /** * Windows-specific POBJECT_ATTRIBUTES required when - * ::CU_MEM_HANDLE_TYPE_WIN32 is specified. This object atributes structure + * ::CU_MEM_HANDLE_TYPE_WIN32 is specified. This object attributes structure * includes security attributes that define - * the scope of which exported allocations may be tranferred to other + * the scope of which exported allocations may be transferred to other * processes. In all other cases, this field is required to be zero. */ void *win32HandleMetaData; @@ -3092,6 +3544,40 @@ typedef struct CUmemAllocationProp_st { } CUmemAllocationProp_v1; typedef CUmemAllocationProp_v1 CUmemAllocationProp; +/** +* Flags for querying different granularities for a multicast object +*/ +typedef enum CUmulticastGranularity_flags_enum { + CU_MULTICAST_GRANULARITY_MINIMUM = 0x0, /**< Minimum required granularity */ + CU_MULTICAST_GRANULARITY_RECOMMENDED = 0x1 /**< Recommended granularity for best performance */ +} CUmulticastGranularity_flags; + +/** +* Specifies the properties for a multicast object. +*/ +typedef struct CUmulticastObjectProp_st { + /** + * The number of devices in the multicast team that will bind memory to this + * object + */ + unsigned int numDevices; + /** + * The maximum amount of memory that can be bound to this multicast object + * per device + */ + size_t size; + /** + * Bitmask of exportable handle types (see ::CUmemAllocationHandleType) for + * this object + */ + unsigned long long handleTypes; + /** + * Flags for future use, must be zero now + */ + unsigned long long flags; +} CUmulticastObjectProp_v1; +typedef CUmulticastObjectProp_v1 CUmulticastObjectProp; + /** * Memory access descriptor */ @@ -3101,6 +3587,9 @@ typedef struct CUmemAccessDesc_st { } CUmemAccessDesc_v1; typedef CUmemAccessDesc_v1 CUmemAccessDesc; +/** + * CUDA Graph Update error types + */ typedef enum CUgraphExecUpdateResult_enum { CU_GRAPH_EXEC_UPDATE_SUCCESS = 0x0, /**< The update succeeded */ CU_GRAPH_EXEC_UPDATE_ERROR = 0x1, /**< The update failed for an unexpected reason which is described in the return value of the function */ @@ -3113,6 +3602,29 @@ typedef enum CUgraphExecUpdateResult_enum { CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED = 0x8 /**< The update failed because the node attributes changed in a way that is not supported */ } CUgraphExecUpdateResult; +/** + * Result information returned by cuGraphExecUpdate + */ +typedef struct CUgraphExecUpdateResultInfo_st { + /** + * Gives more specific detail when a cuda graph update fails. + */ + CUgraphExecUpdateResult result; + + /** + * The "to node" of the error edge when the topologies do not match. + * The error node when the error is associated with a specific node. + * NULL when the error is generic. + */ + CUgraphNode errorNode; + + /** + * The from node of error edge when the topologies do not match. Otherwise NULL. + */ + CUgraphNode errorFromNode; +} CUgraphExecUpdateResultInfo_v1; +typedef CUgraphExecUpdateResultInfo_v1 CUgraphExecUpdateResultInfo; + /** * CUDA memory pool attributes */ @@ -3189,7 +3701,7 @@ typedef struct CUmemPoolProps_st { /** * Windows-specific LPSECURITYATTRIBUTES required when * ::CU_MEM_HANDLE_TYPE_WIN32 is specified. This security attribute defines - * the scope of which exported allocations may be tranferred to other + * the scope of which exported allocations may be transferred to other * processes. In all other cases, this field is required to be zero. */ void *win32SecurityAttributes; @@ -3313,14 +3825,12 @@ typedef enum CUgraphMem_attribute_enum { */ #define CUDA_ARRAY3D_SPARSE 0x40 - /** * This flag if set indicates that the CUDA array or CUDA mipmapped array * will allow deferred memory mapping */ #define CUDA_ARRAY3D_DEFERRED_MAPPING 0x80 - /** * Override the texref format with a format inferred from the array. * Flag for ::cuTexRefSetArray() @@ -3358,11 +3868,21 @@ typedef enum CUgraphMem_attribute_enum { */ #define CU_TRSF_SEAMLESS_CUBEMAP 0x40 +/** + * C++ compile time constant for CU_LAUNCH_PARAM_END + */ +#define CU_LAUNCH_PARAM_END_AS_INT 0x00 + /** * End of array terminator for the \p extra parameter to * ::cuLaunchKernel */ -#define CU_LAUNCH_PARAM_END ((void*)0x00) +#define CU_LAUNCH_PARAM_END ((void*)CU_LAUNCH_PARAM_END_AS_INT) + +/** + * C++ compile time constant for CU_LAUNCH_PARAM_BUFFER_POINTER + */ +#define CU_LAUNCH_PARAM_BUFFER_POINTER_AS_INT 0x01 /** * Indicator that the next value in the \p extra parameter to @@ -3373,7 +3893,12 @@ typedef enum CUgraphMem_attribute_enum { * \p extra array, then ::CU_LAUNCH_PARAM_BUFFER_POINTER will have no * effect. */ -#define CU_LAUNCH_PARAM_BUFFER_POINTER ((void*)0x01) +#define CU_LAUNCH_PARAM_BUFFER_POINTER ((void*)CU_LAUNCH_PARAM_BUFFER_POINTER_AS_INT) + +/** + * C++ compile time constant for CU_LAUNCH_PARAM_BUFFER_SIZE + */ +#define CU_LAUNCH_PARAM_BUFFER_SIZE_AS_INT 0x02 /** * Indicator that the next value in the \p extra parameter to @@ -3383,7 +3908,7 @@ typedef enum CUgraphMem_attribute_enum { * in the \p extra array if the value associated with * ::CU_LAUNCH_PARAM_BUFFER_SIZE is not zero. */ -#define CU_LAUNCH_PARAM_BUFFER_SIZE ((void*)0x02) +#define CU_LAUNCH_PARAM_BUFFER_SIZE ((void*)CU_LAUNCH_PARAM_BUFFER_SIZE_AS_INT) /** * For texture references loaded into the module, use default texunit from @@ -3437,19 +3962,21 @@ typedef enum CUflushGPUDirectRDMAWritesTarget_enum { * The additional write options for ::cuGraphDebugDotPrint */ typedef enum CUgraphDebugDot_flags_enum { - CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE = 1<<0, /** Output all debug data as if every debug flag is enabled */ - CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES = 1<<1, /** Use CUDA Runtime structures for output */ - CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS = 1<<2, /** Adds CUDA_KERNEL_NODE_PARAMS values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS = 1<<3, /** Adds CUDA_MEMCPY3D values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS = 1<<4, /** Adds CUDA_MEMSET_NODE_PARAMS values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS = 1<<5, /** Adds CUDA_HOST_NODE_PARAMS values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS = 1<<6, /** Adds CUevent handle from record and wait nodes to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS = 1<<7, /** Adds CUDA_EXT_SEM_SIGNAL_NODE_PARAMS values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS = 1<<8, /** Adds CUDA_EXT_SEM_WAIT_NODE_PARAMS values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES = 1<<9, /** Adds CUkernelNodeAttrValue values to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES = 1<<10, /** Adds node handles and every kernel function handle to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS = 1<<11, /** Adds memory alloc node parameters to output */ - CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS = 1<<12 /** Adds memory free node parameters to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE = 1<<0, /**< Output all debug data as if every debug flag is enabled */ + CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES = 1<<1, /**< Use CUDA Runtime structures for output */ + CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS = 1<<2, /**< Adds CUDA_KERNEL_NODE_PARAMS values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS = 1<<3, /**< Adds CUDA_MEMCPY3D values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS = 1<<4, /**< Adds CUDA_MEMSET_NODE_PARAMS values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS = 1<<5, /**< Adds CUDA_HOST_NODE_PARAMS values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS = 1<<6, /**< Adds CUevent handle from record and wait nodes to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS = 1<<7, /**< Adds CUDA_EXT_SEM_SIGNAL_NODE_PARAMS values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS = 1<<8, /**< Adds CUDA_EXT_SEM_WAIT_NODE_PARAMS values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES = 1<<9, /**< Adds CUkernelNodeAttrValue values to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES = 1<<10, /**< Adds node handles and every kernel function handle to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS = 1<<11, /**< Adds memory alloc node parameters to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS = 1<<12, /**< Adds memory free node parameters to output */ + CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS = 1<<13 /**< Adds batch mem op node parameters to output */ + , CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO = 1<<14 /**< Adds edge numbering information */ } CUgraphDebugDot_flags; /** @@ -3470,54 +3997,17 @@ typedef enum CUuserObjectRetain_flags_enum { * Flags for instantiating a graph */ typedef enum CUgraphInstantiate_flags_enum { - CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH = 1 /**< Automatically free memory allocated in a graph before relaunching. */ + CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH = 1 /**< Automatically free memory allocated in a graph before relaunching. */ + , CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD = 2 /**< Automatically upload the graph after instantiaton. */ + , CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH = 4 /**< Instantiate the graph to be launchable from the device. */ + , CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY = 8 /**< Run the graph using the per-node priority attributes rather than the + priority of the stream it is launched into. */ } CUgraphInstantiate_flags; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +typedef enum cuDeviceIsNumaNode_enum { + CU_DEVICE_NOT_NUMA_NODE = 0x01, + CU_DEVICE_IS_NUMA_NODE = 0x02, +} cuDeviceIsNumaNode; /** @} */ /* END CUDA_TYPES */ @@ -3603,9 +4093,8 @@ CUresult CUDAAPI cuGetErrorName(CUresult error, const char **pStr); /** * \brief Initialize the CUDA driver API - * * Initializes the driver API and must be called before any other function from - * the driver API. Currently, the \p Flags parameter must be 0. If ::cuInit() + * the driver API in the current process. Currently, the \p Flags parameter must be 0. If ::cuInit() * has not been called, any function from the driver API will return * ::CUDA_ERROR_NOT_INITIALIZED. * @@ -3732,7 +4221,7 @@ CUresult CUDAAPI cuDeviceGet(CUdevice *device, int ordinal); CUresult CUDAAPI cuDeviceGetCount(int *count); /** - * \brief Returns an identifer string for the device + * \brief Returns an identifier string for the device * * Returns an ASCII string identifying the device \p dev in the NULL-terminated * string pointed to by \p name. \p len specifies the maximum length of the @@ -3769,7 +4258,7 @@ CUresult CUDAAPI cuDeviceGetName(char *name, int len, CUdevice dev); * Note there is a later version of this API, ::cuDeviceGetUuid_v2. It will * supplant this version in 12.0, which is retained for minor version compatibility. * - * Returns 16-octets identifing the device \p dev in the structure + * Returns 16-octets identifying the device \p dev in the structure * pointed by the \p uuid. * * \param uuid - Returned UUID @@ -3799,7 +4288,7 @@ CUresult CUDAAPI cuDeviceGetUuid(CUuuid *uuid, CUdevice dev); /** * \brief Return an UUID for the device (11.4+) * - * Returns 16-octets identifing the device \p dev in the structure + * Returns 16-octets identifying the device \p dev in the structure * pointed by the \p uuid. If the device is in MIG mode, returns its * MIG UUID which uniquely identifies the subscribed MIG compute instance. * @@ -4080,7 +4569,7 @@ CUresult CUDAAPI cuDeviceGetTexture1DLinearMaxWidth(size_t *maxWidthInElements, * supports native atomic operations. * - ::CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO: Ratio of single precision performance * (in floating-point operations per second) to double precision performance. - * - ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS: Device suppports coherently accessing + * - ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS: Device supports coherently accessing * pageable memory without calling cudaHostRegister on it. * - ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS: Device can coherently access managed memory * concurrently with the CPU. @@ -4088,7 +4577,7 @@ CUresult CUDAAPI cuDeviceGetTexture1DLinearMaxWidth(size_t *maxWidthInElements, * - ::CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM: Device can access host registered * memory at the same virtual address as the CPU. * - ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN: The maximum per block shared memory size - * suported on this device. This is the maximum value that can be opted into when using the cuFuncSetAttribute() call. + * supported on this device. This is the maximum value that can be opted into when using the cuFuncSetAttribute() or cuKernelSetAttribute() call. * For more details see ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES * - ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES: Device accesses pageable memory via the host's * page tables. @@ -4110,9 +4599,7 @@ CUresult CUDAAPI cuDeviceGetTexture1DLinearMaxWidth(size_t *maxWidthInElements, * - ::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS: The returned attribute shall be interpreted as a bitmask, where the individual bits are described by the ::CUflushGPUDirectRDMAWritesOptions enum * - ::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING: GPUDirect RDMA writes to the device do not need to be flushed for consumers within the scope indicated by the returned attribute. See ::CUGPUDirectRDMAWritesOrdering for the numerical values returned here. * - ::CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES: Bitmask of handle types supported with mempool based IPC - * - ::CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED: Device supports deferred mapping CUDA arrays and CUDA mipmapped arrays. - * * \param pi - Returned device attribute value * \param attrib - Device attribute to query @@ -4165,6 +4652,20 @@ CUresult CUDAAPI cuDeviceGetAttribute(int *pi, CUdevice_attribute attrib, CUdevi * to one another: a developer may set both these flags that allows to * set both wait and signal specific attributes in the same \p nvSciSyncAttrList. * + * Note that this API updates the input \p nvSciSyncAttrList with values equivalent + * to the following public attribute key-values: + * NvSciSyncAttrKey_RequiredPerm is set to + * - NvSciSyncAccessPerm_SignalOnly if ::CUDA_NVSCISYNC_ATTR_SIGNAL is set in \p flags. + * - NvSciSyncAccessPerm_WaitOnly if ::CUDA_NVSCISYNC_ATTR_WAIT is set in \p flags. + * - NvSciSyncAccessPerm_WaitSignal if both ::CUDA_NVSCISYNC_ATTR_WAIT and + * ::CUDA_NVSCISYNC_ATTR_SIGNAL are set in \p flags. + * NvSciSyncAttrKey_PrimitiveInfo is set to + * - NvSciSyncAttrValPrimitiveType_SysmemSemaphore on any valid \p device. + * - NvSciSyncAttrValPrimitiveType_Syncpoint if \p device is a Tegra device. + * - NvSciSyncAttrValPrimitiveType_SysmemSemaphorePayload64b if \p device is GA10X+. + * NvSciSyncAttrKey_GpuId is set to the same UUID that is returned for this + * \p device from ::cuDeviceGetUuid. + * * \param nvSciSyncAttrList - Return NvSciSync attributes supported. * \param dev - Valid Cuda Device to get NvSciSync attributes for. * \param flags - flags describing NvSciSync usage. @@ -4240,6 +4741,37 @@ CUresult CUDAAPI cuDeviceGetMemPool(CUmemoryPool *pool, CUdevice dev); */ CUresult CUDAAPI cuDeviceGetDefaultMemPool(CUmemoryPool *pool_out, CUdevice dev); +/** + * \brief Returns information about the execution affinity support of the device. + * + * Returns in \p *pi whether execution affinity type \p type is supported by device \p dev. + * The supported types are: + * - ::CU_EXEC_AFFINITY_TYPE_SM_COUNT: 1 if context with limited SMs is supported by the device, + * or 0 if not; + * + * \param pi - 1 if the execution affinity type \p type is supported by the device, or 0 if not + * \param type - Execution affinity type to query + * \param dev - Device handle + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE + * \notefnerr + * + * \sa + * ::cuDeviceGetAttribute, + * ::cuDeviceGetCount, + * ::cuDeviceGetName, + * ::cuDeviceGetUuid, + * ::cuDeviceGet, + * ::cuDeviceTotalMem + */ +CUresult CUDAAPI cuDeviceGetExecAffinitySupport(int *pi, CUexecAffinityType type, CUdevice dev); + /** * \brief Blocks until remote writes are visible to the specified scope * @@ -4354,7 +4886,7 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuDeviceGetProperties(CUdevprop *prop, CUdevi * * \deprecated * - * This function was deprecated as of CUDA 5.0 and its functionality superceded + * This function was deprecated as of CUDA 5.0 and its functionality superseded * by ::cuDeviceGetAttribute(). * * Returns in \p *major and \p *minor the major and minor revision numbers that @@ -4537,6 +5069,31 @@ CUresult CUDAAPI cuDevicePrimaryCtxRelease(CUdevice dev); * Deprecated: This flag is deprecated and the behavior enabled * by this flag is now the default and cannot be disabled. * + * - ::CU_CTX_COREDUMP_ENABLE: If GPU coredumps have not been enabled globally + * with ::cuCoredumpSetAttributeGlobal or environment variables, this flag can + * be set during context creation to instruct CUDA to create a coredump if + * this context raises an exception during execution. These environment variables + * are described in the CUDA-GDB user guide under the "GPU core dump support" + * section. + * The initial settings will be taken from the global settings at the time of + * context creation. The other settings that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * + * - ::CU_CTX_USER_COREDUMP_ENABLE: If user-triggered GPU coredumps have not + * been enabled globally with ::cuCoredumpSetAttributeGlobal or environment + * variables, this flag can be set during context creation to instruct CUDA to + * create a coredump if data is written to a certain pipe that is present in the + * OS space. These environment variables are described in the CUDA-GDB user + * guide under the "GPU core dump support" section. + * It is important to note that the pipe name *must* be set with + * ::cuCoredumpSetAttributeGlobal before creating the context if this flag is + * used. Setting this flag implies that ::CU_CTX_COREDUMP_ENABLE is set. + * The initial settings will be taken from the global settings at the time of + * context creation. The other settings that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * * \param dev - Device for which the primary context flags are set * \param flags - New flags for the device * @@ -4552,6 +5109,7 @@ CUresult CUDAAPI cuDevicePrimaryCtxRelease(CUdevice dev); * ::cuDevicePrimaryCtxGetState, * ::cuCtxCreate, * ::cuCtxGetFlags, + * ::cuCtxSetFlags, * ::cudaSetDeviceFlags */ CUresult CUDAAPI cuDevicePrimaryCtxSetFlags(CUdevice dev, unsigned int flags); @@ -4578,6 +5136,7 @@ CUresult CUDAAPI cuDevicePrimaryCtxSetFlags(CUdevice dev, unsigned int flags); * \sa * ::cuDevicePrimaryCtxSetFlags, * ::cuCtxGetFlags, + * ::cuCtxSetFlags, * ::cudaGetDeviceFlags */ CUresult CUDAAPI cuDevicePrimaryCtxGetState(CUdevice dev, unsigned int *flags, int *active); @@ -4624,37 +5183,6 @@ CUresult CUDAAPI cuDevicePrimaryCtxReset(CUdevice dev); /** @} */ /* END CUDA_PRIMARY_CTX */ -/** - * \brief Returns information about the execution affinity support of the device. - * - * Returns in \p *pi whether execution affinity type \p type is supported by device \p dev. - * The supported types are: - * - ::CU_EXEC_AFFINITY_TYPE_SM_COUNT: 1 if context with limited SMs is supported by the device, - * or 0 if not; - * - * \param pi - 1 if the execution affinity type \p type is supported by the device, or 0 if not - * \param type - Execution affinity type to query - * \param dev - Device handle - * - * \return - * ::CUDA_SUCCESS, - * ::CUDA_ERROR_DEINITIALIZED, - * ::CUDA_ERROR_NOT_INITIALIZED, - * ::CUDA_ERROR_INVALID_CONTEXT, - * ::CUDA_ERROR_INVALID_VALUE, - * ::CUDA_ERROR_INVALID_DEVICE - * \notefnerr - * - * \sa - * ::cuDeviceGetAttribute, - * ::cuDeviceGetCount, - * ::cuDeviceGetName, - * ::cuDeviceGetUuid, - * ::cuDeviceGet, - * ::cuDeviceTotalMem - */ -CUresult CUDAAPI cuDeviceGetExecAffinitySupport(int *pi, CUexecAffinityType type, CUdevice dev); - /** * \defgroup CUDA_CTX Context Management * @@ -4677,7 +5205,7 @@ CUresult CUDAAPI cuDeviceGetExecAffinitySupport(int *pi, CUexecAffinityType type * * Creates a new CUDA context and associates it with the calling thread. The * \p flags parameter is described below. The context is created with a usage - * count of 1 and the caller of ::cuCtxCreate() must call ::cuCtxDestroy() or + * count of 1 and the caller of ::cuCtxCreate() must call ::cuCtxDestroy() * when done using the context. If a context is already current to the thread, * it is supplanted by the newly created context and may be restored by a subsequent * call to ::cuCtxPopCurrent(). @@ -4727,6 +5255,33 @@ CUresult CUDAAPI cuDeviceGetExecAffinitySupport(int *pi, CUexecAffinityType type * by this flag is now the default and cannot be disabled. * Instead, the per-thread stack size can be controlled with ::cuCtxSetLimit(). * + * - ::CU_CTX_COREDUMP_ENABLE: If GPU coredumps have not been enabled globally + * with ::cuCoredumpSetAttributeGlobal or environment variables, this flag can + * be set during context creation to instruct CUDA to create a coredump if + * this context raises an exception during execution. These environment variables + * are described in the CUDA-GDB user guide under the "GPU core dump support" + * section. + * The initial attributes will be taken from the global attributes at the time of + * context creation. The other attributes that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * + * - ::CU_CTX_USER_COREDUMP_ENABLE: If user-triggered GPU coredumps have not + * been enabled globally with ::cuCoredumpSetAttributeGlobal or environment + * variables, this flag can be set during context creation to instruct CUDA to + * create a coredump if data is written to a certain pipe that is present in the + * OS space. These environment variables are described in the CUDA-GDB user + * guide under the "GPU core dump support" section. + * It is important to note that the pipe name *must* be set with + * ::cuCoredumpSetAttributeGlobal before creating the context if this flag is + * used. Setting this flag implies that ::CU_CTX_COREDUMP_ENABLE is set. + * The initial attributes will be taken from the global attributes at the time of + * context creation. The other attributes that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * Setting this flag on any context creation is equivalent to setting the + * ::CU_COREDUMP_ENABLE_USER_TRIGGER attribute to \p true globally. + * * Context creation will fail with ::CUDA_ERROR_UNKNOWN if the compute mode of * the device is ::CU_COMPUTEMODE_PROHIBITED. The function ::cuDeviceGetAttribute() * can be used with ::CU_DEVICE_ATTRIBUTE_COMPUTE_MODE to determine the @@ -4760,6 +5315,8 @@ CUresult CUDAAPI cuDeviceGetExecAffinitySupport(int *pi, CUexecAffinityType type * ::cuCtxPushCurrent, * ::cuCtxSetCacheConfig, * ::cuCtxSetLimit, + * ::cuCoredumpSetAttributeGlobal, + * ::cuCoredumpSetAttribute, * ::cuCtxSynchronize */ CUresult CUDAAPI cuCtxCreate(CUcontext *pctx, unsigned int flags, CUdevice dev); @@ -4770,7 +5327,7 @@ CUresult CUDAAPI cuCtxCreate(CUcontext *pctx, unsigned int flags, CUdevice dev); * Creates a new CUDA context with execution affinity and associates it with * the calling thread. The \p paramsArray and \p flags parameter are described below. * The context is created with a usage count of 1 and the caller of ::cuCtxCreate() must - * call ::cuCtxDestroy() or when done using the context. If a context is already + * call ::cuCtxDestroy() when done using the context. If a context is already * current to the thread, it is supplanted by the newly created context and may * be restored by a subsequent call to ::cuCtxPopCurrent(). * @@ -4830,6 +5387,33 @@ CUresult CUDAAPI cuCtxCreate(CUcontext *pctx, unsigned int flags, CUdevice dev); * by this flag is now the default and cannot be disabled. * Instead, the per-thread stack size can be controlled with ::cuCtxSetLimit(). * + * - ::CU_CTX_COREDUMP_ENABLE: If GPU coredumps have not been enabled globally + * with ::cuCoredumpSetAttributeGlobal or environment variables, this flag can + * be set during context creation to instruct CUDA to create a coredump if + * this context raises an exception during execution. These environment variables + * are described in the CUDA-GDB user guide under the "GPU core dump support" + * section. + * The initial attributes will be taken from the global attributes at the time of + * context creation. The other attributes that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * + * - ::CU_CTX_USER_COREDUMP_ENABLE: If user-triggered GPU coredumps have not + * been enabled globally with ::cuCoredumpSetAttributeGlobal or environment + * variables, this flag can be set during context creation to instruct CUDA to + * create a coredump if data is written to a certain pipe that is present in the + * OS space. These environment variables are described in the CUDA-GDB user + * guide under the "GPU core dump support" section. + * It is important to note that the pipe name *must* be set with + * ::cuCoredumpSetAttributeGlobal before creating the context if this flag is + * used. Setting this flag implies that ::CU_CTX_COREDUMP_ENABLE is set. + * The initial attributes will be taken from the global attributes at the time of + * context creation. The other attributes that control coredump output can be + * modified by calling ::cuCoredumpSetAttribute from the created context after + * it becomes current. + * Setting this flag on any context creation is equivalent to setting the + * ::CU_COREDUMP_ENABLE_USER_TRIGGER attribute to \p true globally. + * * Context creation will fail with ::CUDA_ERROR_UNKNOWN if the compute mode of * the device is ::CU_COMPUTEMODE_PROHIBITED. The function ::cuDeviceGetAttribute() * can be used with ::CU_DEVICE_ATTRIBUTE_COMPUTE_MODE to determine the @@ -4867,6 +5451,8 @@ CUresult CUDAAPI cuCtxCreate(CUcontext *pctx, unsigned int flags, CUdevice dev); * ::cuCtxSetCacheConfig, * ::cuCtxSetLimit, * ::cuCtxSynchronize, + * ::cuCoredumpSetAttributeGlobal, + * ::cuCoredumpSetAttribute, * ::CUexecAffinityParam */ CUresult CUDAAPI cuCtxCreate_v3(CUcontext *pctx, CUexecAffinityParam *paramsArray, int numParams, unsigned int flags, CUdevice dev); @@ -5091,10 +5677,69 @@ CUresult CUDAAPI cuCtxGetDevice(CUdevice *device); * ::cuCtxGetLimit, * ::cuCtxGetSharedMemConfig, * ::cuCtxGetStreamPriorityRange, + * ::cuCtxSetFlags, * ::cudaGetDeviceFlags */ CUresult CUDAAPI cuCtxGetFlags(unsigned int *flags); +/** + * \brief Sets the flags for the current context + * + * \param flags - Flags to set on the current context + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * \notefnerr + * + * \sa ::cuCtxCreate, + * ::cuCtxGetApiVersion, + * ::cuCtxGetCacheConfig, + * ::cuCtxGetCurrent, + * ::cuCtxGetDevice, + * ::cuCtxGetLimit, + * ::cuCtxGetSharedMemConfig, + * ::cuCtxGetStreamPriorityRange, + * ::cuCtxGetFlags, + * ::cudaGetDeviceFlags, + * ::cuDevicePrimaryCtxSetFlags, + */ +CUresult CUDAAPI cuCtxSetFlags(unsigned int flags); + +/** + * \brief Returns the unique Id associated with the context supplied + * + * Returns in \p ctxId the unique Id which is associated with a given context. + * The Id is unique for the life of the program for this instance of CUDA. + * If context is supplied as NULL and there is one current, the Id of the + * current context is returned. + * + * \param ctx - Context for which to obtain the Id + * \param ctxId - Pointer to store the Id of the context + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE + * \notefnerr + * + * \sa ::cuCtxCreate, + * ::cuCtxDestroy, + * ::cuCtxGetApiVersion, + * ::cuCtxGetCacheConfig, + * ::cuCtxGetDevice, + * ::cuCtxGetFlags, + * ::cuCtxGetLimit, + * ::cuCtxPushCurrent + */ +CUresult CUDAAPI cuCtxGetId(CUcontext ctx, unsigned long long *ctxId); + /** * \brief Block for a context's tasks to complete * @@ -5168,9 +5813,9 @@ CUresult CUDAAPI cuCtxSynchronize(void); * memory which can no longer be used for user allocations. If these * reservations of device memory fail, ::cuCtxSetLimit() will return * ::CUDA_ERROR_OUT_OF_MEMORY, and the limit can be reset to a lower value. - * This limit is only applicable to devices of compute capability 3.5 and - * higher. Attempting to set this limit on devices of compute capability less - * than 3.5 will result in the error ::CUDA_ERROR_UNSUPPORTED_LIMIT being + * This limit is only applicable to devices of compute capability < 9.0. + * Attempting to set this limit on devices of other compute capability + * versions will result in the error ::CUDA_ERROR_UNSUPPORTED_LIMIT being * returned. * * - ::CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT controls the maximum number of @@ -5191,10 +5836,10 @@ CUresult CUDAAPI cuCtxSynchronize(void); * returned. * * - ::CU_LIMIT_MAX_L2_FETCH_GRANULARITY controls the L2 cache fetch granularity. - * Values can range from 0B to 128B. This is purely a performence hint and + * Values can range from 0B to 128B. This is purely a performance hint and * it can be ignored or clamped depending on the platform. * - * - ::CU_LIMIT_PERSISTING_L2_CACHE_SIZE controls size in bytes availabe for + * - ::CU_LIMIT_PERSISTING_L2_CACHE_SIZE controls size in bytes available for * persisting L2 cache. This is purely a performance hint and it can be * ignored or clamped depending on the platform. * @@ -5318,7 +5963,7 @@ CUresult CUDAAPI cuCtxGetCacheConfig(CUfunc_cache *pconfig); * the current context. This is only a preference. The driver will use * the requested configuration if possible, but it is free to choose a different * configuration if required to execute the function. Any function preference - * set via ::cuFuncSetCacheConfig() will be preferred over this context-wide + * set via ::cuFuncSetCacheConfig() or ::cuKernelSetCacheConfig() will be preferred over this context-wide * setting. Setting the context-wide cache configuration to * ::CU_FUNC_CACHE_PREFER_NONE will cause subsequent kernel launches to prefer * to not change the cache configuration unless required to launch the kernel. @@ -5357,7 +6002,8 @@ CUresult CUDAAPI cuCtxGetCacheConfig(CUfunc_cache *pconfig); * ::cuCtxSetLimit, * ::cuCtxSynchronize, * ::cuFuncSetCacheConfig, - * ::cudaDeviceSetCacheConfig + * ::cudaDeviceSetCacheConfig, + * ::cuKernelSetCacheConfig */ CUresult CUDAAPI cuCtxSetCacheConfig(CUfunc_cache config); @@ -5873,6 +6519,32 @@ CUresult CUDAAPI cuModuleLoadFatBinary(CUmodule *module, const void *fatCubin); */ CUresult CUDAAPI cuModuleUnload(CUmodule hmod); +/** + * CUDA Lazy Loading status + */ +typedef enum CUmoduleLoadingMode_enum { + CU_MODULE_EAGER_LOADING = 0x1, /**< Lazy Kernel Loading is not enabled */ + CU_MODULE_LAZY_LOADING = 0x2, /**< Lazy Kernel Loading is enabled */ +} CUmoduleLoadingMode; + +/** + * \brief Query lazy loading mode + * + * Returns lazy loading mode + * Module loading mode is controlled by CUDA_MODULE_LOADING env variable + * + * \param mode - Returns the lazy loading mode + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * \notefnerr + * + * \sa + * ::cuModuleLoad, + */ +CUresult CUDAAPI cuModuleGetLoadingMode(CUmoduleLoadingMode *mode); + /** * \brief Returns a function handle * @@ -5908,9 +6580,9 @@ CUresult CUDAAPI cuModuleGetFunction(CUfunction *hfunc, CUmodule hmod, const cha * * Returns in \p *dptr and \p *bytes the base pointer and size of the * global of name \p name located in module \p hmod. If no variable of that name - * exists, ::cuModuleGetGlobal() returns ::CUDA_ERROR_NOT_FOUND. Both - * parameters \p dptr and \p bytes are optional. If one of them is - * NULL, it is ignored. + * exists, ::cuModuleGetGlobal() returns ::CUDA_ERROR_NOT_FOUND. + * One of the parameters \p dptr or \p bytes (not both) can be NULL in which + * case it is ignored. * * \param dptr - Returned global device pointer * \param bytes - Returned global size in bytes @@ -5939,77 +6611,11 @@ CUresult CUDAAPI cuModuleGetFunction(CUfunction *hfunc, CUmodule hmod, const cha CUresult CUDAAPI cuModuleGetGlobal(CUdeviceptr *dptr, size_t *bytes, CUmodule hmod, const char *name); /** - * \brief Returns a handle to a texture reference - * - * Returns in \p *pTexRef the handle of the texture reference of name \p name - * in the module \p hmod. If no texture reference of that name exists, - * ::cuModuleGetTexRef() returns ::CUDA_ERROR_NOT_FOUND. This texture reference - * handle should not be destroyed, since it will be destroyed when the module - * is unloaded. + * \brief Creates a pending JIT linker invocation. * - * \param pTexRef - Returned texture reference - * \param hmod - Module to retrieve texture reference from - * \param name - Name of texture reference to retrieve - * - * \return - * ::CUDA_SUCCESS, - * ::CUDA_ERROR_DEINITIALIZED, - * ::CUDA_ERROR_NOT_INITIALIZED, - * ::CUDA_ERROR_INVALID_CONTEXT, - * ::CUDA_ERROR_INVALID_VALUE, - * ::CUDA_ERROR_NOT_FOUND - * \notefnerr - * - * \sa ::cuModuleGetFunction, - * ::cuModuleGetGlobal, - * ::cuModuleGetSurfRef, - * ::cuModuleLoad, - * ::cuModuleLoadData, - * ::cuModuleLoadDataEx, - * ::cuModuleLoadFatBinary, - * ::cuModuleUnload, - * ::cudaGetTextureReference - */ -CUresult CUDAAPI cuModuleGetTexRef(CUtexref *pTexRef, CUmodule hmod, const char *name); - -/** - * \brief Returns a handle to a surface reference - * - * Returns in \p *pSurfRef the handle of the surface reference of name \p name - * in the module \p hmod. If no surface reference of that name exists, - * ::cuModuleGetSurfRef() returns ::CUDA_ERROR_NOT_FOUND. - * - * \param pSurfRef - Returned surface reference - * \param hmod - Module to retrieve surface reference from - * \param name - Name of surface reference to retrieve - * - * \return - * ::CUDA_SUCCESS, - * ::CUDA_ERROR_DEINITIALIZED, - * ::CUDA_ERROR_NOT_INITIALIZED, - * ::CUDA_ERROR_INVALID_CONTEXT, - * ::CUDA_ERROR_INVALID_VALUE, - * ::CUDA_ERROR_NOT_FOUND - * \notefnerr - * - * \sa ::cuModuleGetFunction, - * ::cuModuleGetGlobal, - * ::cuModuleGetTexRef, - * ::cuModuleLoad, - * ::cuModuleLoadData, - * ::cuModuleLoadDataEx, - * ::cuModuleLoadFatBinary, - * ::cuModuleUnload, - * ::cudaGetSurfaceReference - */ -CUresult CUDAAPI cuModuleGetSurfRef(CUsurfref *pSurfRef, CUmodule hmod, const char *name); - -/** - * \brief Creates a pending JIT linker invocation. - * - * If the call is successful, the caller owns the returned CUlinkState, which - * should eventually be destroyed with ::cuLinkDestroy. The - * device code machine size (32 or 64 bit) will match the calling application. + * If the call is successful, the caller owns the returned CUlinkState, which + * should eventually be destroyed with ::cuLinkDestroy. The + * device code machine size (32 or 64 bit) will match the calling application. * * Both linker and compiler options may be specified. Compiler options will * be applied to inputs to this linker action which must be compiled from PTX. @@ -6021,6 +6627,8 @@ CUresult CUDAAPI cuModuleGetSurfRef(CUsurfref *pSurfRef, CUmodule hmod, const ch * options are used. No other references to inputs are maintained after this * call returns. * + * \note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted + * * \param numOptions Size of options arrays * \param options Array of linker and compiler options * \param optionValues Array of option values, each cast to void * @@ -6056,6 +6664,8 @@ cuLinkCreate(unsigned int numOptions, CUjit_option *options, void **optionValues * ::CU_JIT_WALL_TIME, ::CU_JIT_INFO_LOG_BUFFER, ::CU_JIT_ERROR_LOG_BUFFER, * ::CU_JIT_TARGET_FROM_CUCONTEXT, or ::CU_JIT_TARGET. * + * \note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted + * * \param state A pending linker action. * \param type The type of the input data. * \param data The input data. PTX must be NULL-terminated. @@ -6097,6 +6707,8 @@ cuLinkAddData(CUlinkState state, CUjitInputType type, void *data, size_t size, c * This method is equivalent to invoking ::cuLinkAddData on the contents * of the file. * + * \note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted + * * \param state A pending linker action * \param type The type of the input data * \param path Path to the input file @@ -6166,6 +6778,619 @@ cuLinkDestroy(CUlinkState state); /** @} */ /* END CUDA_MODULE */ +/** + * \defgroup CUDA_MODULE_DEPRECATED Module Management [DEPRECATED] + * + * ___MANBRIEF___ deprecated module management functions of the low-level CUDA + * driver API (___CURRENT_FILE___) ___ENDMANBRIEF___ + * + * This section describes the deprecated module management functions of the low-level + * CUDA driver application programming interface. + * + * @{ + */ + +/** + * \brief Returns a handle to a texture reference + * + * \deprecated + * + * Returns in \p *pTexRef the handle of the texture reference of name \p name + * in the module \p hmod. If no texture reference of that name exists, + * ::cuModuleGetTexRef() returns ::CUDA_ERROR_NOT_FOUND. This texture reference + * handle should not be destroyed, since it will be destroyed when the module + * is unloaded. + * + * \param pTexRef - Returned texture reference + * \param hmod - Module to retrieve texture reference from + * \param name - Name of texture reference to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_NOT_FOUND + * \notefnerr + * + * \sa + * ::cuModuleGetFunction, + * ::cuModuleGetGlobal, + * ::cuModuleGetSurfRef, + * ::cuModuleLoad, + * ::cuModuleLoadData, + * ::cuModuleLoadDataEx, + * ::cuModuleLoadFatBinary, + * ::cuModuleUnload + */ +__CUDA_DEPRECATED CUresult CUDAAPI cuModuleGetTexRef(CUtexref *pTexRef, CUmodule hmod, const char *name); + +/** + * \brief Returns a handle to a surface reference + * + * \deprecated + * + * Returns in \p *pSurfRef the handle of the surface reference of name \p name + * in the module \p hmod. If no surface reference of that name exists, + * ::cuModuleGetSurfRef() returns ::CUDA_ERROR_NOT_FOUND. + * + * \param pSurfRef - Returned surface reference + * \param hmod - Module to retrieve surface reference from + * \param name - Name of surface reference to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_NOT_FOUND + * \notefnerr + * + * \sa + * ::cuModuleGetFunction, + * ::cuModuleGetGlobal, + * ::cuModuleGetTexRef, + * ::cuModuleLoad, + * ::cuModuleLoadData, + * ::cuModuleLoadDataEx, + * ::cuModuleLoadFatBinary, + * ::cuModuleUnload + */ +__CUDA_DEPRECATED CUresult CUDAAPI cuModuleGetSurfRef(CUsurfref *pSurfRef, CUmodule hmod, const char *name); + +/** @} */ /* END CUDA_MODULE_DEPRECATED */ + +/** + * \defgroup CUDA_LIBRARY Library Management + * + * ___MANBRIEF___ library management functions of the low-level CUDA driver API + * (___CURRENT_FILE___) ___ENDMANBRIEF___ + * + * This section describes the library management functions of the low-level CUDA + * driver application programming interface. + * + * @{ + */ + +/** + * \brief Load a library with specified code and options + * + * Takes a pointer \p code and loads the corresponding library \p library into + * all contexts existent at the time of the call and future contexts at the time + * of creation until the library is unloaded with ::cuLibraryUnload(). + * + * The pointer may be obtained by mapping a \e cubin or \e PTX or \e fatbin file, + * passing a \e cubin or \e PTX or \e fatbin file as a NULL-terminated text string, or + * incorporating a \e cubin or \e fatbin object into the executable resources and + * using operating system calls such as Windows \c FindResource() to obtain the pointer. + * + * Options are passed as an array via \p jitOptions and any corresponding parameters are passed in + * \p jitOptionsValues. The number of total JIT options is supplied via \p numJitOptions. + * Any outputs will be returned via \p jitOptionsValues. + * + * Library load options are passed as an array via \p libraryOptions and any corresponding parameters are passed in + * \p libraryOptionValues. The number of total library load options is supplied via \p numLibraryOptions. + * + * \param library - Returned library + * \param code - Code to load + * \param jitOptions - Options for JIT + * \param jitOptionsValues - Option values for JIT + * \param numJitOptions - Number of options + * \param libraryOptions - Options for loading + * \param libraryOptionValues - Option values for loading + * \param numLibraryOptions - Number of options for loading + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_PTX, + * ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_NO_BINARY_FOR_GPU, + * ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND, + * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED, + * ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND + * + * \sa ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuModuleLoad, + * ::cuModuleLoadData, + * ::cuModuleLoadDataEx + */ +CUresult CUDAAPI cuLibraryLoadData(CUlibrary *library, const void *code, + CUjit_option *jitOptions, void **jitOptionsValues, unsigned int numJitOptions, + CUlibraryOption *libraryOptions, void** libraryOptionValues, unsigned int numLibraryOptions); + +/** + * \brief Load a library with specified file and options + * + * Takes a filename \p fileName and loads the corresponding library \p library into + * all contexts existent at the time of the call and future contexts at the time of + * creation until the library is unloaded with ::cuLibraryUnload(). + * + * The file should be a \e cubin file as output by \b nvcc, or a \e PTX file either + * as output by \b nvcc or handwritten, or a \e fatbin file as output by \b nvcc + * from toolchain 4.0 or later. + * + * Options are passed as an array via \p jitOptions and any corresponding parameters are + * passed in \p jitOptionsValues. The number of total options is supplied via \p numJitOptions. + * Any outputs will be returned via \p jitOptionsValues. + * + * Library load options are passed as an array via \p libraryOptions and any corresponding parameters are passed in + * \p libraryOptionValues. The number of total library load options is supplied via \p numLibraryOptions. + * + * \param library - Returned library + * \param fileName - File to load from + * \param jitOptions - Options for JIT + * \param jitOptionsValues - Option values for JIT + * \param numJitOptions - Number of options + * \param libraryOptions - Options for loading + * \param libraryOptionValues - Option values for loading + * \param numLibraryOptions - Number of options for loading + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_PTX, + * ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_NO_BINARY_FOR_GPU, + * ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND, + * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED, + * ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryUnload, + * ::cuModuleLoad, + * ::cuModuleLoadData, + * ::cuModuleLoadDataEx + */ +CUresult CUDAAPI cuLibraryLoadFromFile(CUlibrary *library, const char *fileName, + CUjit_option *jitOptions, void **jitOptionsValues, unsigned int numJitOptions, + CUlibraryOption *libraryOptions, void **libraryOptionValues, unsigned int numLibraryOptions); + +/** + * \brief Unloads a library + * + * Unloads the library specified with \p library + * + * \param library - Library to unload + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuModuleUnload + */ +CUresult CUDAAPI cuLibraryUnload(CUlibrary library); + +/** + * \brief Returns a kernel handle + * + * Returns in \p pKernel the handle of the kernel with name \p name located in library \p library. + * If kernel handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND. + * + * \param pKernel - Returned kernel handle + * \param library - Library to retrieve kernel from + * \param name - Name of kernel to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuKernelGetFunction, + * ::cuLibraryGetModule, + * ::cuModuleGetFunction + */ +CUresult CUDAAPI cuLibraryGetKernel(CUkernel *pKernel, CUlibrary library, const char *name); + +/** + * \brief Returns a module handle + * + * Returns in \p pMod the module handle associated with the current context located in + * library \p library. If module handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND. + * + * \param pMod - Returned module handle + * \param library - Library to retrieve module from + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuModuleGetFunction + */ +CUresult CUDAAPI cuLibraryGetModule(CUmodule *pMod, CUlibrary library); + +/** + * \brief Returns a function handle + * + * Returns in \p pFunc the handle of the function for the requested kernel \p kernel and + * the current context. If function handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND. + * + * \param pFunc - Returned function handle + * \param kernel - Kernel to retrieve function for the requested context + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuLibraryGetKernel, + * ::cuLibraryGetModule, + * ::cuModuleGetFunction + */ +CUresult CUDAAPI cuKernelGetFunction(CUfunction *pFunc, CUkernel kernel); + +/** + * \brief Returns a global device pointer + * + * Returns in \p *dptr and \p *bytes the base pointer and size of the global with + * name \p name for the requested library \p library and the current context. + * If no global for the requested name \p name exists, the call returns ::CUDA_ERROR_NOT_FOUND. + * One of the parameters \p dptr or \p bytes (not both) can be NULL in which + * case it is ignored. + * + * \param dptr - Returned global device pointer for the requested context + * \param bytes - Returned global size in bytes + * \param library - Library to retrieve global from + * \param name - Name of global to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuLibraryGetModule, + * cuModuleGetGlobal + */ +CUresult CUDAAPI cuLibraryGetGlobal(CUdeviceptr *dptr, size_t *bytes, CUlibrary library, const char *name); + +/** + * \brief Returns a pointer to managed memory + * + * Returns in \p *dptr and \p *bytes the base pointer and size of the managed memory with + * name \p name for the requested library \p library. If no managed memory with the + * requested name \p name exists, the call returns ::CUDA_ERROR_NOT_FOUND. One of the parameters + * \p dptr or \p bytes (not both) can be NULL in which case it is ignored. + * Note that managed memory for library \p library is shared across devices and is registered + * when the library is loaded into atleast one context. + * + * \note The API requires a CUDA context to be present and initialized on at least one device. + * If no context is present, the call returns ::CUDA_ERROR_NOT_FOUND. + * + * \param dptr - Returned pointer to the managed memory + * \param bytes - Returned memory size in bytes + * \param library - Library to retrieve managed memory from + * \param name - Name of managed memory to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + */ +CUresult CUDAAPI cuLibraryGetManaged(CUdeviceptr *dptr, size_t *bytes, CUlibrary library, const char *name); + +/** + * \brief Returns a pointer to a unified function + * + * Returns in \p *fptr the function pointer to a unified function denoted by \p symbol. + * If no unified function with name \p symbol exists, the call returns ::CUDA_ERROR_NOT_FOUND. + * If there is no device with attribute ::CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS present in the system, + * the call may return ::CUDA_ERROR_NOT_FOUND. + * + * \param fptr - Returned pointer to a unified function + * \param library - Library to retrieve function pointer memory from + * \param symbol - Name of function pointer to retrieve + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_NOT_FOUND, + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + */ +CUresult CUDAAPI cuLibraryGetUnifiedFunction(void **fptr, CUlibrary library, const char *symbol); + +/** + * \brief Returns information about a kernel + * + * Returns in \p *pi the integer value of the attribute \p attrib for the kernel + * \p kernel for the requested device \p dev. The supported attributes are: + * - ::CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK: The maximum number of threads + * per block, beyond which a launch of the kernel would fail. This number + * depends on both the kernel and the requested device. + * - ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES: The size in bytes of + * statically-allocated shared memory per block required by this kernel. + * This does not include dynamically-allocated shared memory requested by + * the user at runtime. + * - ::CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES: The size in bytes of user-allocated + * constant memory required by this kernel. + * - ::CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES: The size in bytes of local memory + * used by each thread of this kernel. + * - ::CU_FUNC_ATTRIBUTE_NUM_REGS: The number of registers used by each thread + * of this kernel. + * - ::CU_FUNC_ATTRIBUTE_PTX_VERSION: The PTX virtual architecture version for + * which the kernel was compiled. This value is the major PTX version * 10 + * + the minor PTX version, so a PTX version 1.3 function would return the + * value 13. Note that this may return the undefined value of 0 for cubins + * compiled prior to CUDA 3.0. + * - ::CU_FUNC_ATTRIBUTE_BINARY_VERSION: The binary architecture version for + * which the kernel was compiled. This value is the major binary + * version * 10 + the minor binary version, so a binary version 1.3 function + * would return the value 13. Note that this will return a value of 10 for + * legacy cubins that do not have a properly-encoded binary architecture + * version. + * - ::CU_FUNC_CACHE_MODE_CA: The attribute to indicate whether the kernel has + * been compiled with user specified option "-Xptxas --dlcm=ca" set. + * - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: The maximum size in bytes of + * dynamically-allocated shared memory. + * - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: Preferred shared memory-L1 + * cache split ratio in percent of total shared memory. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET: If this attribute is set, the + * kernel must launch with a valid cluster size specified. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether + * the function can be launched with non-portable cluster size. 1 is allowed, + * 0 is disallowed. A non-portable cluster size may only function on the + * specific SKUs the program is tested on. The launch might fail if the + * program is run on a different hardware platform. CUDA API provides + * cudaOccupancyMaxActiveClusters to assist with checking whether the desired + * size can be launched on the current device. A portable cluster size is + * guaranteed to be functional on all compute capabilities higher than the + * target compute capability. The portable cluster size for sm_90 is 8 blocks + * per cluster. This value may increase for future compute capabilities. The + * specific hardware unit may support higher cluster sizes that’s not + * guaranteed to be portable. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block + * scheduling policy of a function. The value type is CUclusterSchedulingPolicy. + * + * \note If another thread is trying to set the same attribute on the same device using + * ::cuKernelSetAttribute() simultaneously, the attribute query will give the old or new + * value depending on the interleavings chosen by the OS scheduler and memory consistency. + * + * \param pi - Returned attribute value + * \param attrib - Attribute requested + * \param kernel - Kernel to query attribute of + * \param dev - Device to query attribute of + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuKernelSetAttribute, + * ::cuLibraryGetKernel, + * ::cuLaunchKernel, + * ::cuKernelGetFunction, + * ::cuLibraryGetModule, + * ::cuModuleGetFunction, + * ::cuFuncGetAttribute + */ +CUresult CUDAAPI cuKernelGetAttribute(int *pi, CUfunction_attribute attrib, CUkernel kernel, CUdevice dev); + +/** + * \brief Sets information about a kernel + * + * This call sets the value of a specified attribute \p attrib on the kernel \p kernel + * for the requested device \p dev to an integer value specified by \p val. + * This function returns CUDA_SUCCESS if the new value of the attribute could be + * successfully set. If the set fails, this call will return an error. + * Not all attributes can have values set. Attempting to set a value on a read-only + * attribute will result in an error (CUDA_ERROR_INVALID_VALUE) + * + * Note that attributes set using ::cuFuncSetAttribute() will override the attribute + * set by this API irrespective of whether the call to ::cuFuncSetAttribute() is made + * before or after this API call. However, ::cuKernelGetAttribute() will always + * return the attribute value set by this API. + * + * Supported attributes are: + * - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: This is the maximum size in bytes of + * dynamically-allocated shared memory. The value should contain the requested + * maximum size of dynamically-allocated shared memory. The sum of this value and + * the function attribute ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES cannot exceed the + * device attribute ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN. + * The maximal size of requestable dynamic shared memory may differ by GPU + * architecture. + * - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: On devices where the L1 + * cache and shared memory use the same hardware resources, this sets the shared memory + * carveout preference, in percent of the total shared memory. + * See ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR + * This is only a hint, and the driver can choose a different ratio if required to execute the function. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block + * scheduling policy of a function. The value type is CUclusterSchedulingPolicy. + * + * \note The API has stricter locking requirements in comparison to its legacy counterpart + * ::cuFuncSetAttribute() due to device-wide semantics. If multiple threads are trying to + * set the same attribute on the same device simultaneously, the attribute setting will depend + * on the interleavings chosen by the OS scheduler and memory consistency. + * + * \param attrib - Attribute requested + * \param val - Value to set + * \param kernel - Kernel to set attribute of + * \param dev - Device to set attribute of + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_OUT_OF_MEMORY + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuKernelGetAttribute, + * ::cuLibraryGetKernel, + * ::cuLaunchKernel, + * ::cuKernelGetFunction, + * ::cuLibraryGetModule, + * ::cuModuleGetFunction, + * ::cuFuncSetAttribute + */ +CUresult CUDAAPI cuKernelSetAttribute(CUfunction_attribute attrib, int val, CUkernel kernel, CUdevice dev); + +/** + * \brief Sets the preferred cache configuration for a device kernel. + * + * On devices where the L1 cache and shared memory use the same hardware + * resources, this sets through \p config the preferred cache configuration for + * the device kernel \p kernel on the requested device \p dev. This is only a preference. + * The driver will use the requested configuration if possible, but it is free to choose a different + * configuration if required to execute \p kernel. Any context-wide preference + * set via ::cuCtxSetCacheConfig() will be overridden by this per-kernel + * setting. + * + * Note that attributes set using ::cuFuncSetCacheConfig() will override the attribute + * set by this API irrespective of whether the call to ::cuFuncSetCacheConfig() is made + * before or after this API call. + * + * This setting does nothing on devices where the size of the L1 cache and + * shared memory are fixed. + * + * Launching a kernel with a different preference than the most recent + * preference setting may insert a device-side synchronization point. + * + * + * The supported cache configurations are: + * - ::CU_FUNC_CACHE_PREFER_NONE: no preference for shared memory or L1 (default) + * - ::CU_FUNC_CACHE_PREFER_SHARED: prefer larger shared memory and smaller L1 cache + * - ::CU_FUNC_CACHE_PREFER_L1: prefer larger L1 cache and smaller shared memory + * - ::CU_FUNC_CACHE_PREFER_EQUAL: prefer equal sized L1 cache and shared memory + * + * \note The API has stricter locking requirements in comparison to its legacy counterpart + * ::cuFuncSetCacheConfig() due to device-wide semantics. If multiple threads are trying to + * set a config on the same device simultaneously, the cache config setting will depend + * on the interleavings chosen by the OS scheduler and memory consistency. + * + * \param kernel - Kernel to configure cache for + * \param config - Requested cache configuration + * \param dev - Device to set attribute of + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_OUT_OF_MEMORY + * + * \sa ::cuLibraryLoadData, + * ::cuLibraryLoadFromFile, + * ::cuLibraryUnload, + * ::cuLibraryGetKernel, + * ::cuKernelGetFunction, + * ::cuLibraryGetModule, + * ::cuModuleGetFunction, + * ::cuFuncSetCacheConfig, + * ::cuCtxSetCacheConfig, + * ::cuLaunchKernel + */ +CUresult CUDAAPI cuKernelSetCacheConfig(CUkernel kernel, CUfunc_cache config, CUdevice dev); + +/** @} */ /* END CUDA_LIBRARY */ /** * \defgroup CUDA_MEM Memory Management @@ -6322,8 +7547,14 @@ CUresult CUDAAPI cuMemAllocPitch(CUdeviceptr *dptr, size_t *pPitch, size_t Width * \brief Frees device memory * * Frees the memory space pointed to by \p dptr, which must have been returned - * by a previous call to ::cuMemAlloc() or ::cuMemAllocPitch(). + * by a previous call to one of the following memory allocation APIs - ::cuMemAlloc(), + * ::cuMemAllocPitch(), ::cuMemAllocManaged(), ::cuMemAllocAsync(), ::cuMemAllocFromPoolAsync() * + * Note - This API will not perform any implict synchronization when the pointer was allocated with + * ::cuMemAllocAsync or ::cuMemAllocFromPoolAsync. Callers must ensure that all accesses to the + * pointer have completed before invoking ::cuMemFree. For best performance and memory reuse, users + * should use ::cuMemFreeAsync to free memory allocated via the stream ordered memory allocator. + * * \param dptr - Pointer to memory to free * * \return @@ -6336,12 +7567,12 @@ CUresult CUDAAPI cuMemAllocPitch(CUdeviceptr *dptr, size_t *pPitch, size_t Width * * \sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate, * ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost, - * ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned, - * ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD, - * ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync, - * ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync, - * ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFreeHost, - * ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc, + * ::cuMemAllocPitch, ::cuMemAllocManaged, ::cuMemAllocAsync, ::cuMemAllocFromPoolAsync, + * ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned, ::cuMemcpy3D, ::cuMemcpy3DAsync, + * ::cuMemcpyAtoA, ::cuMemcpyAtoD, ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, + * ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync, ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, + * ::cuMemcpyHtoAAsync, ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFreeHost, + * ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc, ::cuMemFreeAsync, * ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16, * ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32, * ::cudaFree @@ -6640,7 +7871,7 @@ CUresult CUDAAPI cuMemHostGetFlags(unsigned int *pFlags, void *p); * ::cuStreamAttachMemAsync will be required to enable access on such devices. * * If the association is later changed via ::cuStreamAttachMemAsync to - * a single stream, the default association as specifed during ::cuMemAllocManaged + * a single stream, the default association as specified during ::cuMemAllocManaged * is restored when that stream is destroyed. For __managed__ variables, the * default association is always ::CU_MEM_ATTACH_GLOBAL. Note that destroying a * stream is an asynchronous operation, and as a result, the change to default @@ -6807,6 +8038,8 @@ CUresult CUDAAPI cuDeviceGetPCIBusId(char *pciBusId, int len, CUdevice dev); * IPC functionality is restricted to devices with support for unified * addressing on Linux and Windows operating systems. * IPC functionality on Windows is restricted to GPUs in TCC mode + * Users can test their device for IPC functionality by calling + * ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED * * \param pHandle - Pointer to a user allocated CUipcEventHandle * in which to return the opaque event handle @@ -6848,6 +8081,8 @@ CUresult CUDAAPI cuIpcGetEventHandle(CUipcEventHandle *pHandle, CUevent event); * IPC functionality is restricted to devices with support for unified * addressing on Linux and Windows operating systems. * IPC functionality on Windows is restricted to GPUs in TCC mode + * Users can test their device for IPC functionality by calling + * ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED * * \param phEvent - Returns the imported event * \param handle - Interprocess handle to open @@ -6891,6 +8126,8 @@ CUresult CUDAAPI cuIpcOpenEventHandle(CUevent *phEvent, CUipcEventHandle handle) * IPC functionality is restricted to devices with support for unified * addressing on Linux and Windows operating systems. * IPC functionality on Windows is restricted to GPUs in TCC mode + * Users can test their device for IPC functionality by calling + * ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED * * \param pHandle - Pointer to user allocated ::CUipcMemHandle to return * the handle in. @@ -6944,6 +8181,8 @@ CUresult CUDAAPI cuIpcGetMemHandle(CUipcMemHandle *pHandle, CUdeviceptr dptr); * IPC functionality is restricted to devices with support for unified * addressing on Linux and Windows operating systems. * IPC functionality on Windows is restricted to GPUs in TCC mode + * Users can test their device for IPC functionality by calling + * ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED * * \param pdptr - Returned device pointer * \param handle - ::CUipcMemHandle to open @@ -6987,6 +8226,8 @@ CUresult CUDAAPI cuIpcOpenMemHandle(CUdeviceptr *pdptr, CUipcMemHandle handle, u * IPC functionality is restricted to devices with support for unified * addressing on Linux and Windows operating systems. * IPC functionality on Windows is restricted to GPUs in TCC mode + * Users can test their device for IPC functionality by calling + * ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED * * \param dptr - Device pointer returned by ::cuIpcOpenMemHandle * @@ -7021,7 +8262,9 @@ CUresult CUDAAPI cuIpcCloseMemHandle(CUdeviceptr dptr); * best used sparingly to register staging areas for data exchange between * host and device. * - * This function has limited support on Mac OS X. OS 10.7 or higher is required. + * On systems where ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES + * is true, ::cuMemHostRegister will not page-lock the memory range specified + * by \p ptr but only populate unpopulated pages. * * The \p Flags parameter enables different options to be specified that * affect the allocation, as follows. @@ -9313,7 +10556,6 @@ CUresult CUDAAPI cuArrayGetSparseProperties(CUDA_ARRAY_SPARSE_PROPERTIES *sparse */ CUresult CUDAAPI cuMipmappedArrayGetSparseProperties(CUDA_ARRAY_SPARSE_PROPERTIES *sparseProperties, CUmipmappedArray mipmap); - /** * \brief Returns the memory requirements of a CUDA array * @@ -9361,7 +10603,6 @@ CUresult CUDAAPI cuArrayGetMemoryRequirements(CUDA_ARRAY_MEMORY_REQUIREMENTS *me */ CUresult CUDAAPI cuMipmappedArrayGetMemoryRequirements(CUDA_ARRAY_MEMORY_REQUIREMENTS *memoryRequirements, CUmipmappedArray mipmap, CUdevice device); - /** * \brief Gets a CUDA array plane from a CUDA array * @@ -9391,7 +10632,7 @@ CUresult CUDAAPI cuMipmappedArrayGetMemoryRequirements(CUDA_ARRAY_MEMORY_REQUIRE * * \sa * ::cuArrayCreate, - * ::cudaGetArrayPlane + * ::cudaArrayGetPlane */ CUresult CUDAAPI cuArrayGetPlane(CUarray *pPlaneArray, CUarray hArray, unsigned int planeIdx); @@ -9841,6 +11082,39 @@ CUresult CUDAAPI cuMipmappedArrayGetLevel(CUarray *pLevelArray, CUmipmappedArray */ CUresult CUDAAPI cuMipmappedArrayDestroy(CUmipmappedArray hMipmappedArray); +/** +* \brief Retrieve handle for an address range +* +* Get a handle of the specified type to an address range. The address range +* must have been obtained by a prior call to either ::cuMemAlloc or ::cuMemAddressReserve. +* If the address range was obtained via ::cuMemAddressReserve, it must also be fully mapped via ::cuMemMap. +* +* Users must ensure the \p dptr and \p size are aligned to the host page size. +* +* When requesting CUmemRangeHandleType::CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD, +* users are expected to query for dma_buf support for the platform +* by using ::CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED device attribute before calling +* this API. The \p handle will be interpreted as a pointer to an integer to store the dma_buf file descriptor. +* Users must ensure the entire address range is backed and mapped when +* the address range is allocated by ::cuMemAddressReserve. All the physical +* allocations backing the address range must be resident on the same device and +* have identical allocation properties. Users are also expected to retrieve a +* new handle every time the underlying physical allocation(s) corresponding +* to a previously queried VA range are changed. +* +* \param[out] handle - Pointer to the location where the returned handle will be stored. +* \param[in] dptr - Pointer to a valid CUDA device allocation. Must be aligned to host page size. +* \param[in] size - Length of the address range. Must be aligned to host page size. +* \param[in] handleType - Type of handle requested (defines type and size of the \p handle output parameter) +* \param[in] flags - Reserved, must be zero +* +* \return +* CUDA_SUCCESS +* CUDA_ERROR_INVALID_VALUE +* CUDA_ERROR_NOT_SUPPORTED +*/ +CUresult CUDAAPI cuMemGetHandleForAddressRange(void *handle, CUdeviceptr dptr, size_t size, CUmemRangeHandleType handleType, unsigned long long flags); + /** @} */ /* END CUDA_MEM */ /** @@ -9907,13 +11181,13 @@ CUresult CUDAAPI cuMemAddressFree(CUdeviceptr ptr, size_t size); * \brief Create a CUDA memory handle representing a memory allocation of a given size described by the given properties * * This creates a memory allocation on the target device specified through the -* \p prop strcuture. The created allocation will not have any device or host +* \p prop structure. The created allocation will not have any device or host * mappings. The generic memory \p handle for the allocation can be * mapped to the address space of calling process via ::cuMemMap. This handle * cannot be transmitted directly to other processes (see * ::cuMemExportToShareableHandle). On Windows, the caller must also pass * an LPSECURITYATTRIBUTE in \p prop to be associated with this handle which -* limits or allows access to this handle for a recepient process (see +* limits or allows access to this handle for a recipient process (see * ::CUmemAllocationProp::win32HandleMetaData for more). The \p size of this * allocation must be a multiple of the the value given via * ::cuMemGetAllocationGranularity with the ::CU_MEM_ALLOC_GRANULARITY_MINIMUM @@ -9951,7 +11225,7 @@ CUresult CUDAAPI cuMemCreate(CUmemGenericAllocationHandle *handle, size_t size, * are unmapped and when all outstanding references to the handle (including it's * shareable counterparts) are also released. The generic memory handle can be * freed when there are still outstanding mappings made with this handle. Each -* time a recepient process imports a shareable handle, it needs to pair it with +* time a recipient process imports a shareable handle, it needs to pair it with * ::cuMemRelease for the handle to be freed. If \p handle is not a valid handle * the behavior is undefined. * @@ -9978,6 +11252,12 @@ CUresult CUDAAPI cuMemRelease(CUmemGenericAllocationHandle handle); * \p offset + \p size must be less than the size of the memory allocation. * Both \p ptr, \p size, and \p offset must be a multiple of the value given via * ::cuMemGetAllocationGranularity with the ::CU_MEM_ALLOC_GRANULARITY_MINIMUM flag. +* If \p handle represents a multicast object, \p ptr, \p size and \p offset must +* be aligned to the value returned by ::cuMulticastGetGranularity with the flag +* ::CU_MULTICAST_MINIMUM_GRANULARITY. For best performance however, it is +* recommended that \p ptr, \p size and \p offset be aligned to the value +* returned by ::cuMulticastGetGranularity with the flag +* ::CU_MULTICAST_RECOMMENDED_GRANULARITY. * * Please note calling ::cuMemMap does not make the address accessible, * the caller needs to update accessibility of a contiguous mapped VA @@ -10065,17 +11345,13 @@ CUresult CUDAAPI cuMemMap(CUdeviceptr ptr, size_t size, size_t offset, CUmemGene * ::CUarrayMapInfo::resource::array must be set to a valid sparse CUDA array handle. * The CUDA array must be either a 2D, 2D layered or 3D CUDA array and must have been allocated using * ::cuArrayCreate or ::cuArray3DCreate with the flag ::CUDA_ARRAY3D_SPARSE - * or ::CUDA_ARRAY3D_DEFERRED_MAPPING. - * For CUDA arrays obtained using ::cuMipmappedArrayGetLevel, ::CUDA_ERROR_INVALID_VALUE will be returned. * If ::CUarrayMapInfo::resourceType is set to ::CUresourcetype::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY * then ::CUarrayMapInfo::resource::mipmap must be set to a valid sparse CUDA mipmapped array handle. * The CUDA mipmapped array must be either a 2D, 2D layered or 3D CUDA mipmapped array and must have been * allocated using ::cuMipmappedArrayCreate with the flag ::CUDA_ARRAY3D_SPARSE - * or ::CUDA_ARRAY3D_DEFERRED_MAPPING. - * * ::CUarrayMapInfo::subresourceType specifies the type of subresource within the resource. * ::CUarraySparseSubresourceType_enum is defined as: @@ -10114,11 +11390,9 @@ CUresult CUDAAPI cuMemMap(CUdeviceptr ptr, size_t size, size_t offset, CUmemGene * as returned by ::cuMipmappedArrayGetSparseProperties, ::CUarrayMapInfo::subresource::miptail::layer must specify a valid layer index. * Otherwise, must be zero. * - * If ::CUarrayMapInfo::resource::array or ::CUarrayMapInfo::resource::mipmap was created with ::CUDA_ARRAY3D_DEFERRED_MAPPING * flag set the ::CUarrayMapInfo::subresourceType and the contents of ::CUarrayMapInfo::subresource will be ignored. * - * ::CUarrayMapInfo::memOperationType specifies the type of operation. ::CUmemOperationType is defined as: \code typedef enum CUmemOperationType_enum { @@ -10190,6 +11464,12 @@ CUresult CUDAAPI cuMemUnmap(CUdeviceptr ptr, size_t size); * in the array given by \p desc and \p count, set the access flags for the * target locations. The range must be a fully mapped address range * containing all allocations created by ::cuMemMap / ::cuMemCreate. +* When setting the access flags for a virtual address range mapping a multicast +* object, \p ptr and \p size must be aligned to the value returned by +* ::cuMulticastGetGranularity with the flag ::CU_MULTICAST_MINIMUM_GRANULARITY. +* For best performance however, it is recommended that \p ptr and \p size be +* aligned to the value returned by ::cuMulticastGetGranularity with the flag +* ::CU_MULTICAST_RECOMMENDED_GRANULARITY. * * \param[in] ptr - Starting address for the virtual address range * \param[in] size - Length of the virtual address range @@ -10778,6 +12058,264 @@ CUresult CUDAAPI cuMemPoolImportPointer(CUdeviceptr *ptr_out, CUmemoryPool pool, /** @} */ /* END CUDA_MALLOC_ASYNC */ +/** + * \defgroup CUDA_MULTICAST Multicast Object Management + * + * ___MANBRIEF___ Functions for creating multicast objects, adding devices to them and binding/unbinding memory + * (___CURRENT_FILE___) ___ENDMANBRIEF___ + * + * This section describes the CUDA multicast object operations exposed by the + * low-level CUDA driver application programming interface. + * + * @{ + * + * \section CUDA_MULTICAST_overview overview + * + * A multicast object created via ::cuMulticastCreate enables certain memory + * operations to be broadcasted to a team of devices. Devices can be added to a + * multicast object via ::cuMulticastAddDevice. Memory can be bound on each + * participating device via either ::cuMulticastBindMem or ::cuMulticastBindAddr. + * Multicast objects can be mapped into a device's virtual address space using + * the virtual memmory management APIs (see ::cuMemMap and ::cuMemSetAccess). + * + * \section CUDA_MULTICAST_support Supported Platforms + * + * Support for multicast on a specific device can be queried using the device + * attribute ::CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED + */ + +/** + * \brief Create a generic allocation handle representing a multicast object described by the given properties. + * + * This creates a multicast object as described by \p prop. The number of + * participating devices is specified by ::CUmulticastObjectProp::numDevices. + * Devices can be added to the multicast object via ::cuMulticastAddDevice. + * All participating devices must be added to the multicast object before memory + * can be bound to it. Memory is bound to the multicast object via either + * ::cuMulticastBindMem or ::cuMulticastBindAddr, and can be unbound via + * ::cuMulticastUnbind. The total amount of memory that can be bound per device + * is specified by :CUmulticastObjectProp::size. This size must be a multiple of + * the value returned by ::cuMulticastGetGranularity with the flag + * ::CU_MULTICAST_GRANULARITY_MINIMUM. For best performance however, the size + * should be aligned to the value returned by ::cuMulticastGetGranularity with + * the flag ::CU_MULTICAST_GRANULARITY_RECOMMENDED. + * + * After all participating devices have been added, multicast objects can also + * be mapped to a device's virtual address space using the virtual memory + * management APIs (see ::cuMemMap and ::cuMemSetAccess). Multicast objects can + * also be shared with other processes by requesting a shareable handle via + * ::cuMemExportToShareableHandle. Note that the desired types of shareable + * handles must be specified in the bitmask ::CUmulticastObjectProp::handleTypes. + * Multicast objects can be released using the virtual memory management API + * ::cuMemRelease. + * + * \param[out] mcHandle Value of handle returned. + * \param[in] prop Properties of the multicast object to create. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_NOT_SUPPORTED + * + * \sa ::cuMulticastAddDevice, ::cuMulticastBindMem, ::cuMulticastBindAddr, ::cuMulticastUnbind + * \sa ::cuMemCreate, ::cuMemRelease, ::cuMemExportToShareableHandle, ::cuMemImportFromShareableHandle + */ +CUresult CUDAAPI cuMulticastCreate(CUmemGenericAllocationHandle *mcHandle, const CUmulticastObjectProp *prop); + +/** + * \brief Associate a device to a multicast object. + * + * Associates a device to a multicast object. The added device will be a part of + * the multicast team of size specified by CUmulticastObjectProp::numDevices + * during ::cuMulticastCreate. + * The association of the device to the multicast object is permanent during + * the life time of the multicast object. + * All devices must be added to the multicast team before any memory can be + * bound to any device in the team. Any calls to ::cuMulticastBindMem or + * ::cuMulticastBindAddr will block until all devices have been added. + * Similarly all devices must be added to the multicast team before a virtual + * address range can be mapped to the multicast object. A call to ::cuMemMap + * will block until all devices have been added. + * + * \param[in] mcHandle Handle representing a multicast object. + * \param[in] dev Device that will be associated to the multicast + * object. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_NOT_SUPPORTED + * + * \sa ::cuMulticastCreate, ::cuMulticastBindMem, ::cuMulticastBindAddr + */ +CUresult CUDAAPI cuMulticastAddDevice(CUmemGenericAllocationHandle mcHandle, CUdevice dev); + +/** + * \brief Bind a memory allocation represented by a handle to a multicast object. + * + * Binds a memory allocation specified by \p memHandle and created via + * ::cuMemCreate to a multicast object represented by \p mcHandle and created + * via ::cuMulticastCreate. The intended \p size of the bind, the offset in the + * multicast range \p mcOffset as well as the offset in the memory \p memOffset + * must be a multiple of the value returned by ::cuMulticastGetGranularity with + * the flag ::CU_MULTICAST_GRANULARITY_MINIMUM. For best performance however, + * \p size, \p mcOffset and \p memOffset should be aligned to the granularity of + * the memory allocation(see ::cuMemGetAllocationGranularity) or to the value + * returned by ::cuMulticastGetGranularity with the flag + * ::CU_MULTICAST_GRANULARITY_RECOMMENDED. + * + * The \p size + \p memOffset must be smaller than the size of the allocated + * memory. Similarly the \p size + \p mcOffset must be smaller than the size + * of the multicast object. + * The memory allocation must have beeen created on one of the devices + * that was added to the multicast team via ::cuMulticastAddDevice. + * Externally shareable as well as imported multicast objects can be bound only + * to externally shareable memory. + * Note that this call will return CUDA_ERROR_OUT_OF_MEMORY if there are + * insufficient resources required to perform the bind. This call may also + * return CUDA_ERROR_SYSTEM_NOT_READY if the necessary system software is not + * initialized or running. + * + * \param[in] mcHandle Handle representing a multicast object. + * \param[in] mcOffset Offset into the multicast object for attachment. + * \param[in] memHandle Handle representing a memory allocation. + * \param[in] memOffset Offset into the memory for attachment. + * \param[in] size Size of the memory that will be bound to the + * multicast object. + * \param[in] flags Flags for future use, must be zero for now. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_NOT_SUPPORTED, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_SYSTEM_NOT_READY + * + * \sa ::cuMulticastCreate, ::cuMulticastAddDevice, ::cuMemCreate + */ +CUresult CUDAAPI cuMulticastBindMem(CUmemGenericAllocationHandle mcHandle, size_t mcOffset, CUmemGenericAllocationHandle memHandle, size_t memOffset, size_t size, unsigned long long flags); + +/** + * \brief Bind a memory allocation represented by a virtual address to a multicast object. + * + * Binds a memory allocation specified by its mapped address \p memptr to a + * multicast object represented by \p mcHandle. + * The memory must have been allocated via ::cuMemCreate or ::cudaMallocAsync. + * The intended \p size of the bind, the offset in the multicast range + * \p mcOffset and \p memptr must be a multiple of the value returned by + * ::cuMulticastGetGranularity with the flag ::CU_MULTICAST_GRANULARITY_MINIMUM. + * For best performance however, \p size, \p mcOffset and \p memptr should be + * aligned to the value returned by ::cuMulticastGetGranularity with the flag + * ::CU_MULTICAST_GRANULARITY_RECOMMENDED. + * + * The \p size must be smaller than the size of the allocated memory. + * Similarly the \p size + \p mcOffset must be smaller than the total size + * of the multicast object. + * The memory allocation must have beeen created on one of the devices + * that was added to the multicast team via ::cuMulticastAddDevice. + * Externally shareable as well as imported multicast objects can be bound only + * to externally shareable memory. + * Note that this call will return CUDA_ERROR_OUT_OF_MEMORY if there are + * insufficient resources required to perform the bind. This call may also + * return CUDA_ERROR_SYSTEM_NOT_READY if the necessary system software is not + * initialized or running. + * + * \param[in] mcHandle Handle representing a multicast object. + * \param[in] mcOffset Offset into multicast va range for attachment. + * \param[in] memptr Virtual address of the memory allocation. + * \param[in] size Size of memory that will be bound to the + * multicast object. + * \param[in] flags Flags for future use, must be zero now. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_NOT_SUPPORTED, + * ::CUDA_ERROR_OUT_OF_MEMORY, + * ::CUDA_ERROR_SYSTEM_NOT_READY + * + * \sa ::cuMulticastCreate, ::cuMulticastAddDevice, ::cuMemCreate + */ +CUresult CUDAAPI cuMulticastBindAddr(CUmemGenericAllocationHandle mcHandle, size_t mcOffset, CUdeviceptr memptr, size_t size, unsigned long long flags); + +/** + * \brief Unbind any memory allocations bound to a multicast object at a given offset and upto a given size. + * + * Unbinds any memory allocations hosted on \p dev and bound to a multicast + * object at \p mcOffset and upto a given \p size. + * The intended \p size of the unbind and the offset in the multicast range + * ( \p mcOffset ) must be a multiple of the value returned by + * ::cuMulticastGetGranularity flag ::CU_MULTICAST_GRANULARITY_MINIMUM. + * The \p size + \p mcOffset must be smaller than the total size of the + * multicast object. + * + * \note + * Warning: + * The \p mcOffset and the \p size must match the corresponding values specified + * during the bind call. Any other values may result in undefined behavior. + * + * \param[in] mcHandle Handle representing a multicast object. + * \param[in] dev Device that hosts the memory allocation. + * \param[in] mcOffset Offset into the multicast object. + * \param[in] size Desired size to unbind. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_DEVICE, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_NOT_SUPPORTED + * + * \sa ::cuMulticastBindMem, ::cuMulticastBindAddr + */ +CUresult CUDAAPI cuMulticastUnbind(CUmemGenericAllocationHandle mcHandle, CUdevice dev, size_t mcOffset, size_t size); + +/** +* \brief Calculates either the minimal or recommended granularity for multicast object +* +* Calculates either the minimal or recommended granularity for a given set of +* multicast object properties and returns it in granularity. This granularity +* can be used as a multiple for size, bind offsets and address mappings of the +* multicast object. +* +* \param[out] granularity Returned granularity. +* \param[in] prop Properties of the multicast object. +* \param[in] option Determines which granularity to return. +* +* \returns +* ::CUDA_SUCCESS, +* ::CUDA_ERROR_INVALID_VALUE, +* ::CUDA_ERROR_NOT_INITIALIZED, +* ::CUDA_ERROR_DEINITIALIZED, +* ::CUDA_ERROR_NOT_PERMITTED, +* ::CUDA_ERROR_NOT_SUPPORTED +* +* \sa ::cuMulticastCreate, ::cuMulticastBindMem, ::cuMulticastBindAddr, ::cuMulticastUnbind +*/ +CUresult CUDAAPI cuMulticastGetGranularity(size_t *granularity, const CUmulticastObjectProp *prop, CUmulticastGranularity_flags option); + +/** @} */ /* END CUDA_MULTICAST */ + /** * \defgroup CUDA_UNIFIED Unified Addressing * @@ -11277,7 +12815,7 @@ CUresult CUDAAPI cuMemAdvise(CUdeviceptr devPtr, size_t count, CUmem_advise advi * a GPU id or CU_DEVICE_CPU depending on whether the last location for prefetch was a GPU or the CPU * respectively. If any page in the memory range was never explicitly prefetched or if all pages were not * prefetched to the same location, CU_DEVICE_INVALID will be returned. Note that this simply returns the - * last location that the applicaton requested to prefetch the memory range to. It gives no indication as to + * last location that the application requested to prefetch the memory range to. It gives no indication as to * whether the prefetch operation to that location has completed or even begun. * * \param data - A pointers to a memory location where the result @@ -11591,6 +13129,39 @@ CUresult CUDAAPI cuStreamGetPriority(CUstream hStream, int *priority); */ CUresult CUDAAPI cuStreamGetFlags(CUstream hStream, unsigned int *flags); +/** + * \brief Returns the unique Id associated with the stream handle supplied + * + * Returns in \p streamId the unique Id which is associated with the given stream handle. + * The Id is unique for the life of the program. + * + * The stream handle \p hStream can refer to any of the following: + *
    + *
  • a stream created via any of the CUDA driver APIs such as ::cuStreamCreate + * and ::cuStreamCreateWithPriority, or their runtime API equivalents such as + * ::cudaStreamCreate, ::cudaStreamCreateWithFlags and ::cudaStreamCreateWithPriority. + * Passing an invalid handle will result in undefined behavior.
  • + *
  • any of the special streams such as the NULL stream, ::CU_STREAM_LEGACY and + * ::CU_STREAM_PER_THREAD. The runtime API equivalents of these are also accepted, + * which are NULL, ::cudaStreamLegacy and ::cudaStreamPerThread respectively.
  • + *
+ * + * \param hStream - Handle to the stream to be queried + * \param streamId - Pointer to store the Id of the stream + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE + * \notefnerr + * + * \sa ::cuStreamDestroy, + * ::cuStreamCreate, + * ::cuStreamGetPriority, + * ::cudaStreamGetId + */ +CUresult CUDAAPI cuStreamGetId(CUstream hStream, unsigned long long *streamId); + /** * \brief Query the context associated with a stream * @@ -11742,7 +13313,7 @@ CUresult CUDAAPI cuStreamWaitEvent(CUstream hStream, CUevent hEvent, unsigned in * ::cuStreamDestroy, * ::cuMemAllocManaged, * ::cuStreamAttachMemAsync, - * ::cuStreamLaunchHostFunc, + * ::cuLaunchHostFunc, * ::cudaStreamAddCallback */ CUresult CUDAAPI cuStreamAddCallback(CUstream hStream, CUstreamCallback callback, void *userData, unsigned int flags); @@ -11909,35 +13480,7 @@ CUresult CUDAAPI cuStreamEndCapture(CUstream hStream, CUgraph *phGraph); CUresult CUDAAPI cuStreamIsCapturing(CUstream hStream, CUstreamCaptureStatus *captureStatus); /** - * \brief Query capture status of a stream - * - * Note there is a later version of this API, ::cuStreamGetCaptureInfo_v2. It will - * supplant this version in 12.0, which is retained for minor version compatibility. - * - * Query the capture status of a stream and and get an id for - * the capture sequence, which is unique over the lifetime of the process. - * - * If called on ::CU_STREAM_LEGACY (the "null stream") while a stream not created - * with ::CU_STREAM_NON_BLOCKING is capturing, returns ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT. - * - * A valid id is returned only if both of the following are true: - * - the call returns CUDA_SUCCESS - * - captureStatus is set to ::CU_STREAM_CAPTURE_STATUS_ACTIVE - * - * \return - * ::CUDA_SUCCESS, - * ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT - * \notefnerr - * - * \sa - * ::cuStreamGetCaptureInfo_v2, - * ::cuStreamBeginCapture, - * ::cuStreamIsCapturing - */ -CUresult CUDAAPI cuStreamGetCaptureInfo(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, cuuint64_t *id_out); - -/** - * \brief Query a stream's capture state (11.3+) + * \brief Query a stream's capture state * * Query stream state related to stream capture. * @@ -11948,11 +13491,6 @@ CUresult CUDAAPI cuStreamGetCaptureInfo(CUstream hStream, CUstreamCaptureStatus * - the call returns CUDA_SUCCESS * - the returned capture status is ::CU_STREAM_CAPTURE_STATUS_ACTIVE * - * This version of cuStreamGetCaptureInfo is introduced in CUDA 11.3 and will supplant the - * previous version in 12.0. Developers requiring compatibility across minor versions to - * CUDA 11.0 (driver version 445) should use ::cuStreamGetCaptureInfo or include a fallback - * path. - * * \param hStream - The stream to query * \param captureStatus_out - Location to return the capture status of the stream; required * \param id_out - Optional location to return an id for the capture sequence, which is @@ -11983,12 +13521,11 @@ CUresult CUDAAPI cuStreamGetCaptureInfo(CUstream hStream, CUstreamCaptureStatus * \notefnerr * * \sa - * ::cuStreamGetCaptureInfo, * ::cuStreamBeginCapture, * ::cuStreamIsCapturing, * ::cuStreamUpdateCaptureDependencies */ -CUresult CUDAAPI cuStreamGetCaptureInfo_v2(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, +CUresult CUDAAPI cuStreamGetCaptureInfo(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, cuuint64_t *id_out, CUgraph *graph_out, const CUgraphNode **dependencies_out, size_t *numDependencies_out); /** @@ -12019,7 +13556,6 @@ CUresult CUDAAPI cuStreamGetCaptureInfo_v2(CUstream hStream, CUstreamCaptureStat * \sa * ::cuStreamBeginCapture, * ::cuStreamGetCaptureInfo, - * ::cuStreamGetCaptureInfo_v2 */ CUresult CUDAAPI cuStreamUpdateCaptureDependencies(CUstream hStream, CUgraphNode *dependencies, size_t numDependencies, unsigned int flags); @@ -12536,7 +14072,8 @@ CUresult CUDAAPI cuEventDestroy(CUevent hEvent); * ::CUDA_ERROR_NOT_INITIALIZED, * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_HANDLE, - * ::CUDA_ERROR_NOT_READY + * ::CUDA_ERROR_NOT_READY, + * ::CUDA_ERROR_UNKNOWN * \notefnerr * * \sa ::cuEventCreate, @@ -12711,7 +14248,8 @@ CUresult CUDAAPI cuEventElapsedTime(float *pMilliseconds, CUevent hStart, CUeven * ::CUDA_SUCCESS, * ::CUDA_ERROR_NOT_INITIALIZED, * ::CUDA_ERROR_INVALID_VALUE, - * ::CUDA_ERROR_INVALID_HANDLE + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_OPERATING_SYSTEM * \notefnerr * * \note If the Vulkan memory imported into CUDA is mapped on the CPU then the @@ -13003,7 +14541,8 @@ CUresult CUDAAPI cuDestroyExternalMemory(CUexternalMemory extMem); * ::CUDA_SUCCESS, * ::CUDA_ERROR_NOT_INITIALIZED, * ::CUDA_ERROR_NOT_SUPPORTED, - * ::CUDA_ERROR_INVALID_HANDLE + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_OPERATING_SYSTEM * \notefnerr * * \sa ::cuDestroyExternalSemaphore, @@ -13054,6 +14593,21 @@ CUresult CUDAAPI cuImportExternalSemaphore(CUexternalSemaphore *extSem_out, cons * if the NvSciSyncAttrList used to create the NvSciSyncObj had not set the flags in * ::cuDeviceGetNvSciSyncAttributes to CUDA_NVSCISYNC_ATTR_SIGNAL, this API will return * CUDA_ERROR_NOT_SUPPORTED. + * NvSciSyncFence associated with semaphore object of the type + * ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC can be deterministic. For this the + * NvSciSyncAttrList used to create the semaphore object must have value of + * NvSciSyncAttrKey_RequireDeterministicFences key set to true. Deterministic fences + * allow users to enqueue a wait over the semaphore object even before corresponding + * signal is enqueued. For such a semaphore object, CUDA guarantees that each signal + * operation will increment the fence value by '1'. Users are expected to track count + * of signals enqueued on the semaphore object and insert waits accordingly. When such + * a semaphore object is signaled from multiple streams, due to concurrent stream + * execution, it is possible that the order in which the semaphore gets signaled is + * indeterministic. This could lead to waiters of the semaphore getting unblocked + * incorrectly. Users are expected to handle such situations, either by not using the + * same semaphore object with deterministic fence support enabled in different streams + * or by adding explicit dependency amongst such streams so that the semaphore is + * signaled in order. * * If the semaphore object is any one of the following types: * ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX, @@ -13179,7 +14733,7 @@ CUresult CUDAAPI cuDestroyExternalSemaphore(CUexternalSemaphore extSem); /** @} */ /* END CUDA_EXTRES_INTEROP */ /** - * \defgroup CUDA_MEMOP Stream memory operations + * \defgroup CUDA_MEMOP Stream Memory Operations * * ___MANBRIEF___ Stream memory operations of the low-level CUDA driver API * (___CURRENT_FILE___) ___ENDMANBRIEF___ @@ -13187,19 +14741,8 @@ CUresult CUDAAPI cuDestroyExternalSemaphore(CUexternalSemaphore extSem); * This section describes the stream memory operations of the low-level CUDA * driver application programming interface. * - * The whole set of operations is disabled by default. Users are required - * to explicitly enable them, e.g. on Linux by passing the kernel module - * parameter shown below: - * modprobe nvidia NVreg_EnableStreamMemOPs=1 - * There is currently no way to enable these operations on other operating - * systems. - * - * Users can programmatically query whether the device supports these - * operations with ::cuDeviceGetAttribute() and - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS. - * * Support for the ::CU_STREAM_WAIT_VALUE_NOR flag can be queried with - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR. + * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V2. * * Support for the ::cuStreamWriteValue64() and ::cuStreamWaitValue64() * functions, as well as for the ::CU_STREAM_MEM_OP_WAIT_VALUE_64 and @@ -13218,6 +14761,14 @@ CUresult CUDAAPI cuDestroyExternalSemaphore(CUexternalSemaphore extSem); * None of the operations accepts pointers to managed memory buffers * (::cuMemAllocManaged). * + * \note + * Warning: + * Improper use of these APIs may deadlock the application. Synchronization + * ordering established through these APIs is not visible to CUDA. CUDA tasks + * that are (even indirectly) ordered by these APIs should also have that order + * expressed with CUDA-visible dependencies such as events. This ensures that + * the scheduler does not serialize them in an improper order. + * * @{ */ @@ -13234,11 +14785,16 @@ CUresult CUDAAPI cuDestroyExternalSemaphore(CUexternalSemaphore extSem); * should be obtained with ::cuMemHostGetDevicePointer(). This function cannot * be used with managed memory (::cuMemAllocManaged). * - * Support for this can be queried with ::cuDeviceGetAttribute() and - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS. - * * Support for CU_STREAM_WAIT_VALUE_NOR can be queried with ::cuDeviceGetAttribute() and - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR. + * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V2. + * + * \note + * Warning: + * Improper use of this API may deadlock the application. Synchronization + * ordering established through this API is not visible to CUDA. CUDA tasks + * that are (even indirectly) ordered by this API should also have that order + * expressed with CUDA-visible dependencies such as events. This ensures that + * the scheduler does not serialize them in an improper order. * * \param stream The stream to synchronize on the memory location. * \param addr The memory location to wait on. @@ -13275,6 +14831,14 @@ CUresult CUDAAPI cuStreamWaitValue32(CUstream stream, CUdeviceptr addr, cuuint32 * Support for this can be queried with ::cuDeviceGetAttribute() and * ::CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS. * + * \note + * Warning: + * Improper use of this API may deadlock the application. Synchronization + * ordering established through this API is not visible to CUDA. CUDA tasks + * that are (even indirectly) ordered by this API should also have that order + * expressed with CUDA-visible dependencies such as events. This ensures that + * the scheduler does not serialize them in an improper order. + * * \param stream The stream to synchronize on the memory location. * \param addr The memory location to wait on. * \param value The value to compare with the memory location. @@ -13298,18 +14862,12 @@ CUresult CUDAAPI cuStreamWaitValue64(CUstream stream, CUdeviceptr addr, cuuint64 /** * \brief Write a value to memory * - * Write a value to memory. Unless the ::CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER - * flag is passed, the write is preceded by a system-wide memory fence, - * equivalent to a __threadfence_system() but scoped to the stream - * rather than a CUDA thread. + * Write a value to memory. * * If the memory was registered via ::cuMemHostRegister(), the device pointer * should be obtained with ::cuMemHostGetDevicePointer(). This function cannot * be used with managed memory (::cuMemAllocManaged). * - * Support for this can be queried with ::cuDeviceGetAttribute() and - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS. - * * \param stream The stream to do the write in. * \param addr The device address to write to. * \param value The value to write. @@ -13333,10 +14891,7 @@ CUresult CUDAAPI cuStreamWriteValue32(CUstream stream, CUdeviceptr addr, cuuint3 /** * \brief Write a value to memory * - * Write a value to memory. Unless the ::CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER - * flag is passed, the write is preceded by a system-wide memory fence, - * equivalent to a __threadfence_system() but scoped to the stream - * rather than a CUDA thread. + * Write a value to memory. * * If the memory was registered via ::cuMemHostRegister(), the device pointer * should be obtained with ::cuMemHostGetDevicePointer(). @@ -13376,9 +14931,17 @@ CUresult CUDAAPI cuStreamWriteValue64(CUstream stream, CUdeviceptr addr, cuuint6 * ::cuStreamWaitValue32(), ::cuStreamWaitValue64(), ::cuStreamWriteValue32(), * and ::cuStreamWriteValue64() for details of specific operations. * - * Basic support for this can be queried with ::cuDeviceGetAttribute() and - * ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS. See related APIs for details - * on querying support for specific operations. + * See related APIs for details on querying support for specific operations. + * + * \note + * Warning: + * Improper use of this API may deadlock the application. Synchronization + * ordering established through this API is not visible to CUDA. CUDA tasks + * that are (even indirectly) ordered by this API should also have that order + * expressed with CUDA-visible dependencies such as events. This ensures that + * the scheduler does not serialize them in an improper order. For more + * information, see the Stream Memory Operations section in the programming + * guide(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html). * * \param stream The stream to enqueue the operations in. * \param count The number of operations in the array. Must be less than 256. @@ -13449,6 +15012,28 @@ CUresult CUDAAPI cuStreamBatchMemOp(CUstream stream, unsigned int count, CUstrea * dynamically-allocated shared memory. * - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: Preferred shared memory-L1 * cache split ratio in percent of total shared memory. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET: If this attribute is set, the + * kernel must launch with a valid cluster size specified. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in + * blocks. + * - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether + * the function can be launched with non-portable cluster size. 1 is allowed, + * 0 is disallowed. A non-portable cluster size may only function on the + * specific SKUs the program is tested on. The launch might fail if the + * program is run on a different hardware platform. CUDA API provides + * cudaOccupancyMaxActiveClusters to assist with checking whether the desired + * size can be launched on the current device. A portable cluster size is + * guaranteed to be functional on all compute capabilities higher than the + * target compute capability. The portable cluster size for sm_90 is 8 blocks + * per cluster. This value may increase for future compute capabilities. The + * specific hardware unit may support higher cluster sizes that’s not + * guaranteed to be portable. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block + * scheduling policy of a function. The value type is CUclusterSchedulingPolicy. * * \param pi - Returned attribute value * \param attrib - Attribute requested @@ -13468,7 +15053,8 @@ CUresult CUDAAPI cuStreamBatchMemOp(CUstream stream, unsigned int count, CUstrea * ::cuFuncSetCacheConfig, * ::cuLaunchKernel, * ::cudaFuncGetAttributes, - * ::cudaFuncSetAttribute + * ::cudaFuncSetAttribute, + * ::cuKernelGetAttribute */ CUresult CUDAAPI cuFuncGetAttribute(int *pi, CUfunction_attribute attrib, CUfunction hfunc); @@ -13495,6 +15081,23 @@ CUresult CUDAAPI cuFuncGetAttribute(int *pi, CUfunction_attribute attrib, CUfunc * carveout preference, in percent of the total shared memory. * See ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR * This is only a hint, and the driver can choose a different ratio if required to execute the function. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in + * blocks. The width, height, and depth values must either all be 0 or all be + * positive. The validity of the cluster dimensions is checked at launch time. + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block + * scheduling policy of a function. The value type is CUclusterSchedulingPolicy. * * \param hfunc - Function to query attribute of * \param attrib - Attribute requested @@ -13514,7 +15117,8 @@ CUresult CUDAAPI cuFuncGetAttribute(int *pi, CUfunction_attribute attrib, CUfunc * ::cuFuncSetCacheConfig, * ::cuLaunchKernel, * ::cudaFuncGetAttributes, - * ::cudaFuncSetAttribute + * ::cudaFuncSetAttribute, + * ::cuKernelSetAttribute */ CUresult CUDAAPI cuFuncSetAttribute(CUfunction hfunc, CUfunction_attribute attrib, int value); @@ -13558,7 +15162,8 @@ CUresult CUDAAPI cuFuncSetAttribute(CUfunction hfunc, CUfunction_attribute attri * ::cuCtxSetCacheConfig, * ::cuFuncGetAttribute, * ::cuLaunchKernel, - * ::cudaFuncSetCacheConfig + * ::cudaFuncSetCacheConfig, + * ::cuKernelSetCacheConfig */ CUresult CUDAAPI cuFuncSetCacheConfig(CUfunction hfunc, CUfunc_cache config); @@ -13641,10 +15246,11 @@ CUresult CUDAAPI cuFuncSetSharedMemConfig(CUfunction hfunc, CUsharedconfig confi CUresult CUDAAPI cuFuncGetModule(CUmodule *hmod, CUfunction hfunc); /** - * \brief Launches a CUDA function + * \brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel * - * Invokes the kernel \p f on a \p gridDimX x \p gridDimY x \p gridDimZ - * grid of blocks. Each block contains \p blockDimX x \p blockDimY x + * Invokes the function ::CUfunction or the kernel ::CUkernel \p f + * on a \p gridDimX x \p gridDimY x \p gridDimZ grid of blocks. + * Each block contains \p blockDimX x \p blockDimY x * \p blockDimZ threads. * * \p sharedMemBytes sets the amount of dynamic shared memory that will be @@ -13713,15 +15319,213 @@ CUresult CUDAAPI cuFuncGetModule(CUmodule *hmod, CUfunction hfunc); * If either of these conditions is not met, then ::cuLaunchKernel() will * return ::CUDA_ERROR_INVALID_IMAGE. * - * \param f - Kernel to launch - * \param gridDimX - Width of grid in blocks - * \param gridDimY - Height of grid in blocks - * \param gridDimZ - Depth of grid in blocks - * \param blockDimX - X dimension of each thread block - * \param blockDimY - Y dimension of each thread block - * \param blockDimZ - Z dimension of each thread block - * \param sharedMemBytes - Dynamic shared-memory size per thread block in bytes - * \param hStream - Stream identifier + * Note that the API can also be used to launch context-less kernel ::CUkernel + * by querying the handle using ::cuLibraryGetKernel() and then passing it + * to the API by casting to ::CUfunction. Here, the context to launch + * the kernel on will either be taken from the specified stream \p hStream + * or the current context in case of NULL stream. + * + * \param f - Function ::CUfunction or Kernel ::CUkernel to launch + * \param gridDimX - Width of grid in blocks + * \param gridDimY - Height of grid in blocks + * \param gridDimZ - Depth of grid in blocks + * \param blockDimX - X dimension of each thread block + * \param blockDimY - Y dimension of each thread block + * \param blockDimZ - Z dimension of each thread block + * \param sharedMemBytes - Dynamic shared-memory size per thread block in bytes + * \param hStream - Stream identifier + * \param kernelParams - Array of pointers to kernel parameters + * \param extra - Extra options + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_INVALID_IMAGE, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_LAUNCH_FAILED, + * ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES, + * ::CUDA_ERROR_LAUNCH_TIMEOUT, + * ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING, + * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED, + * ::CUDA_ERROR_NOT_FOUND + * \note_null_stream + * \notefnerr + * + * \sa ::cuCtxGetCacheConfig, + * ::cuCtxSetCacheConfig, + * ::cuFuncSetCacheConfig, + * ::cuFuncGetAttribute, + * ::cudaLaunchKernel, + * ::cuLibraryGetKernel, + * ::cuKernelSetCacheConfig, + * ::cuKernelGetAttribute, + * ::cuKernelSetAttribute + */ +CUresult CUDAAPI cuLaunchKernel(CUfunction f, + unsigned int gridDimX, + unsigned int gridDimY, + unsigned int gridDimZ, + unsigned int blockDimX, + unsigned int blockDimY, + unsigned int blockDimZ, + unsigned int sharedMemBytes, + CUstream hStream, + void **kernelParams, + void **extra); + +/** + * \brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel with launch-time configuration + * + * Invokes the function ::CUfunction or the kernel ::CUkernel \p f with the specified launch-time configuration + * \p config. + * + * The ::CUlaunchConfig structure is defined as: + * \code + typedef struct CUlaunchConfig_st { + unsigned int gridDimX; + unsigned int gridDimY; + unsigned int gridDimZ; + unsigned int blockDimX; + unsigned int blockDimY; + unsigned int blockDimZ; + unsigned int sharedMemBytes; + CUstream hStream; + CUlaunchAttribute *attrs; + unsigned int numAttrs; + } CUlaunchConfig; + * \endcode + * where: + * - ::CUlaunchConfig::gridDimX is the width of the grid in blocks. + * - ::CUlaunchConfig::gridDimY is the height of the grid in blocks. + * - ::CUlaunchConfig::gridDimZ is the depth of the grid in blocks. + * - ::CUlaunchConfig::blockDimX is the X dimension of each thread block. + * - ::CUlaunchConfig::blockDimX is the Y dimension of each thread block. + * - ::CUlaunchConfig::blockDimZ is the Z dimension of each thread block. + * - ::CUlaunchConfig::sharedMemBytes is the dynamic shared-memory size per + * thread block in bytes. + * - ::CUlaunchConfig::hStream is the handle to the stream to perform the launch + * in. The CUDA context associated with this stream must match that associated + * with function f. + * - ::CUlaunchConfig::attrs is an array of ::CUlaunchConfig::numAttrs + * continguous ::CUlaunchAttribute elements. The value of this pointer is not + * considered if ::CUlaunchConfig::numAttrs is zero. However, in that case, it + * is recommended to set the pointer to NULL. + * - ::CUlaunchConfig::numAttrs is the numbers of attributes populating the + * first ::CUlaunchConfig::numAttrs positions of the ::CUlaunchConfig::attrs + * array. + * + * Launch-time configuration is specified by adding entries to + * ::CUlaunchConfig::attrs. Each entry is an attribute ID and a corresponding + * attribute value. + * + * The ::CUlaunchAttribute structure is defined as: + * \code + typedef struct CUlaunchAttribute_st { + CUlaunchAttributeID id; + CUlaunchAttributeValue value; + } CUlaunchAttribute; + * \endcode + * where: + * - ::CUlaunchAttribute::id is a unique enum identifying the attribute. + * - ::CUlaunchAttribute::value is a union that hold the attribute value. + * + * An example of using the \p config parameter: + * \code + CUlaunchAttribute coopAttr = {.id = CU_LAUNCH_ATTRIBUTE_COOPERATIVE, + .value = 1}; + CUlaunchConfig config = {... // set block and grid dimensions + .attrs = &coopAttr, + .numAttrs = 1}; + + cuLaunchKernelEx(&config, kernel, NULL, NULL); + * \endcode + * + * The ::CUlaunchAttributeID enum is defined as: + * \code + typedef enum CUlaunchAttributeID_enum { + CU_LAUNCH_ATTRIBUTE_IGNORE = 0, + CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW = 1, + CU_LAUNCH_ATTRIBUTE_COOPERATIVE = 2, + CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY = 3, + CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION = 4, + CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = 5, + CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION = 6, + CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT = 7, + } CUlaunchAttributeID; + * \endcode + * + * and the corresponding ::CUlaunchAttributeValue union as : + * \code + typedef union CUlaunchAttributeValue_union { + cuuint64_t pad[8]; + CUaccessPolicyWindow accessPolicyWindow; + int cooperative; + CUsynchronizationPolicy syncPolicy; + struct { + unsigned int x; + unsigned int y; + unsigned int z; + } clusterDim; + CUclusterSchedulingPolicy clusterSchedulingPolicyPreference; + int programmaticStreamSerializationAllowed; + struct { + CUevent event; + int flags; + int triggerAtBlockStart; + } programmaticEvent; + } CUlaunchAttributeValue; + * \endcode + * + * Setting ::CU_LAUNCH_ATTRIBUTE_COOPERATIVE to a non-zero value causes the + * kernel launch to be a cooperative launch, with exactly the same usage and + * semantics of ::cuLaunchCooperativeKernel. + * + * Setting ::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION to a non-zero + * values causes the kernel to use programmatic means to resolve its stream + * dependency -- enabling the CUDA runtime to opportunistically allow the grid's + * execution to overlap with the previous kernel in the stream, if that kernel + * requests the overlap. + * + * ::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT records an event along with the + * kernel launch. Event recorded through this launch attribute is guaranteed to + * only trigger after all block in the associated kernel trigger the event. A + * block can trigger the event through PTX launchdep.release or CUDA builtin + * function cudaTriggerProgrammaticLaunchCompletion(). A trigger can also be + * inserted at the beginning of each block's execution if triggerAtBlockStart is + * set to non-0. Note that dependents (including the CPU thread calling + * cuEventSynchronize()) are not guaranteed to observe the release precisely + * when it is released. For example, cuEventSynchronize() may only observe the + * event trigger long after the associated kernel has completed. This recording + * type is primarily meant for establishing programmatic dependency between + * device tasks. The event supplied must not be an interprocess or interop + * event. The event must disable timing (i.e. created with + * ::CU_EVENT_DISABLE_TIMING flag set). + * + * The effect of other attributes is consistent with their effect when set via + * persistent APIs. + * + * See ::cuStreamSetAttribute for + * - ::CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW + * - ::CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY + * + * See ::cuFunctionSetAttribute for + * - ::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION + * - ::CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE + * + * Kernel parameters to \p f can be specified in the same ways that they can be + * using ::cuLaunchKernel. + * + * Note that the API can also be used to launch context-less kernel ::CUkernel + * by querying the handle using ::cuLibraryGetKernel() and then passing it + * to the API by casting to ::CUfunction. Here, the context to launch + * the kernel on will either be taken from the specified stream ::CUlaunchConfig::hStream + * or the current context in case of NULL stream. + * + * \param config - Config to launch + * \param f - Function ::CUfunction or Kernel ::CUkernel to launch * \param kernelParams - Array of pointers to kernel parameters * \param extra - Extra options * @@ -13737,7 +15541,9 @@ CUresult CUDAAPI cuFuncGetModule(CUmodule *hmod, CUfunction hfunc); * ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES, * ::CUDA_ERROR_LAUNCH_TIMEOUT, * ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING, - * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED + * ::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE, + * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED, + * ::CUDA_ERROR_NOT_FOUND * \note_null_stream * \notefnerr * @@ -13745,34 +15551,32 @@ CUresult CUDAAPI cuFuncGetModule(CUmodule *hmod, CUfunction hfunc); * ::cuCtxSetCacheConfig, * ::cuFuncSetCacheConfig, * ::cuFuncGetAttribute, - * ::cudaLaunchKernel + * ::cudaLaunchKernel, + * ::cudaLaunchKernelEx, + * ::cuLibraryGetKernel, + * ::cuKernelSetCacheConfig, + * ::cuKernelGetAttribute, + * ::cuKernelSetAttribute */ -CUresult CUDAAPI cuLaunchKernel(CUfunction f, - unsigned int gridDimX, - unsigned int gridDimY, - unsigned int gridDimZ, - unsigned int blockDimX, - unsigned int blockDimY, - unsigned int blockDimZ, - unsigned int sharedMemBytes, - CUstream hStream, - void **kernelParams, - void **extra); - - - - - - - +CUresult CUDAAPI cuLaunchKernelEx(const CUlaunchConfig *config, + CUfunction f, + void **kernelParams, + void **extra); /** - * \brief Launches a CUDA function where thread blocks can cooperate and synchronize as they execute + * \brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel where thread blocks + * can cooperate and synchronize as they execute * - * Invokes the kernel \p f on a \p gridDimX x \p gridDimY x \p gridDimZ + * Invokes the function ::CUfunction or the kernel ::CUkernel \p f on a \p gridDimX x \p gridDimY x \p gridDimZ * grid of blocks. Each block contains \p blockDimX x \p blockDimY x * \p blockDimZ threads. * + * Note that the API can also be used to launch context-less kernel ::CUkernel + * by querying the handle using ::cuLibraryGetKernel() and then passing it + * to the API by casting to ::CUfunction. Here, the context to launch + * the kernel on will either be taken from the specified stream \p hStream + * or the current context in case of NULL stream. + * * \p sharedMemBytes sets the amount of dynamic shared memory that will be * available to each thread block. * @@ -13807,7 +15611,13 @@ CUresult CUDAAPI cuLaunchKernel(CUfunction f, * If either of these conditions is not met, then ::cuLaunchCooperativeKernel() will * return ::CUDA_ERROR_INVALID_IMAGE. * - * \param f - Kernel to launch + * Note that the API can also be used to launch context-less kernel ::CUkernel + * by querying the handle using ::cuLibraryGetKernel() and then passing it + * to the API by casting to ::CUfunction. Here, the context to launch + * the kernel on will either be taken from the specified stream \p hStream + * or the current context in case of NULL stream. + * + * \param f - Function ::CUfunction or Kernel ::CUkernel to launch * \param gridDimX - Width of grid in blocks * \param gridDimY - Height of grid in blocks * \param gridDimZ - Depth of grid in blocks @@ -13831,7 +15641,8 @@ CUresult CUDAAPI cuLaunchKernel(CUfunction f, * ::CUDA_ERROR_LAUNCH_TIMEOUT, * ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING, * ::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE, - * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED + * ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED, + * ::CUDA_ERROR_NOT_FOUND * \note_null_stream * \notefnerr * @@ -13840,7 +15651,11 @@ CUresult CUDAAPI cuLaunchKernel(CUfunction f, * ::cuFuncSetCacheConfig, * ::cuFuncGetAttribute, * ::cuLaunchCooperativeKernelMultiDevice, - * ::cudaLaunchCooperativeKernel + * ::cudaLaunchCooperativeKernel, + * ::cuLibraryGetKernel, + * ::cuKernelSetCacheConfig, + * ::cuKernelGetAttribute, + * ::cuKernelSetAttribute */ CUresult CUDAAPI cuLaunchCooperativeKernel(CUfunction f, unsigned int gridDimX, @@ -13870,7 +15685,7 @@ CUresult CUDAAPI cuLaunchCooperativeKernel(CUfunction f, * All kernels launched must be identical with respect to the compiled code. Note that * any __device__, __constant__ or __managed__ variables present in the module that owns * the kernel launched on each device, are independently instantiated on every device. - * It is the application's responsiblity to ensure these variables are initialized and + * It is the application's responsibility to ensure these variables are initialized and * used appropriately. * * The size of the grids as specified in blocks, the size of the blocks themselves @@ -13910,6 +15725,9 @@ CUresult CUDAAPI cuLaunchCooperativeKernel(CUfunction f, * where: * - ::CUDA_LAUNCH_PARAMS::function specifies the kernel to be launched. All functions must * be identical with respect to the compiled code. + * Note that you can also specify context-less kernel ::CUkernel by querying the handle + * using ::cuLibraryGetKernel() and then casting to ::CUfunction. In this case, the context to + * launch the kernel on be taken from the specified stream ::CUDA_LAUNCH_PARAMS::hStream. * - ::CUDA_LAUNCH_PARAMS::gridDimX is the width of the grid in blocks. This must match across * all kernels launched. * - ::CUDA_LAUNCH_PARAMS::gridDimY is the height of the grid in blocks. This must match across @@ -15077,7 +16895,7 @@ CUresult CUDAAPI cuGraphAddEmptyNode(CUgraphNode *phGraphNode, CUgraph hGraph, c * ::cuGraphAddEmptyNode, * ::cuGraphAddKernelNode, * ::cuGraphAddMemcpyNode, - * ::cuGraphAddMemsetNode, + * ::cuGraphAddMemsetNode */ CUresult CUDAAPI cuGraphAddEventRecordNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, CUevent event); @@ -15169,7 +16987,7 @@ CUresult CUDAAPI cuGraphEventRecordNodeSetEvent(CUgraphNode hNode, CUevent event * ::cuGraphAddEmptyNode, * ::cuGraphAddKernelNode, * ::cuGraphAddMemcpyNode, - * ::cuGraphAddMemsetNode, + * ::cuGraphAddMemsetNode */ CUresult CUDAAPI cuGraphAddEventWaitNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, CUevent event); @@ -15267,7 +17085,7 @@ CUresult CUDAAPI cuGraphEventWaitNodeSetEvent(CUgraphNode hNode, CUevent event); * ::cuGraphAddEmptyNode, * ::cuGraphAddKernelNode, * ::cuGraphAddMemcpyNode, - * ::cuGraphAddMemsetNode, + * ::cuGraphAddMemsetNode */ CUresult CUDAAPI cuGraphAddExternalSemaphoresSignalNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, const CUDA_EXT_SEM_SIGNAL_NODE_PARAMS *nodeParams); @@ -15371,7 +17189,7 @@ CUresult CUDAAPI cuGraphExternalSemaphoresSignalNodeSetParams(CUgraphNode hNode, * ::cuGraphAddEmptyNode, * ::cuGraphAddKernelNode, * ::cuGraphAddMemcpyNode, - * ::cuGraphAddMemsetNode, + * ::cuGraphAddMemsetNode */ CUresult CUDAAPI cuGraphAddExternalSemaphoresWaitNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, const CUDA_EXT_SEM_WAIT_NODE_PARAMS *nodeParams); @@ -15431,6 +17249,161 @@ CUresult CUDAAPI cuGraphExternalSemaphoresWaitNodeGetParams(CUgraphNode hNode, C */ CUresult CUDAAPI cuGraphExternalSemaphoresWaitNodeSetParams(CUgraphNode hNode, const CUDA_EXT_SEM_WAIT_NODE_PARAMS *nodeParams); +/** + * \brief Creates a batch memory operation node and adds it to a graph + * + * Creates a new batch memory operation node and adds it to \p hGraph with \p + * numDependencies dependencies specified via \p dependencies and arguments specified in \p nodeParams. + * It is possible for \p numDependencies to be 0, in which case the node will be placed + * at the root of the graph. \p dependencies may not have any duplicate entries. + * A handle to the new node will be returned in \p phGraphNode. + * + * When the node is added, the paramArray inside \p nodeParams is copied and therefore it can be + * freed after the call returns. + * + * \note + * Warning: + * Improper use of this API may deadlock the application. Synchronization + * ordering established through this API is not visible to CUDA. CUDA tasks + * that are (even indirectly) ordered by this API should also have that order + * expressed with CUDA-visible dependencies such as events. This ensures that + * the scheduler does not serialize them in an improper order. For more + * information, see the Stream Memory Operations section in the programming + * guide(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html). + * + * \param phGraphNode - Returns newly created node + * \param hGraph - Graph to which to add the node + * \param dependencies - Dependencies of the node + * \param numDependencies - Number of dependencies + * \param nodeParams - Parameters for the node + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_NOT_SUPPORTED, + * ::CUDA_ERROR_INVALID_VALUE + * \note_graph_thread_safety + * \notefnerr + * + * \sa + * ::cuStreamBatchMemOp, + * ::cuStreamWaitValue32, + * ::cuStreamWriteValue32, + * ::cuStreamWaitValue64, + * ::cuStreamWriteValue64, + * ::cuGraphBatchMemOpNodeGetParams, + * ::cuGraphBatchMemOpNodeSetParams, + * ::cuGraphCreate, + * ::cuGraphDestroyNode, + * ::cuGraphAddChildGraphNode, + * ::cuGraphAddEmptyNode, + * ::cuGraphAddKernelNode, + * ::cuGraphAddMemcpyNode, + * ::cuGraphAddMemsetNode + */ +CUresult CUDAAPI cuGraphAddBatchMemOpNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, const CUDA_BATCH_MEM_OP_NODE_PARAMS *nodeParams); + +/** + * \brief Returns a batch mem op node's parameters + * + * Returns the parameters of batch mem op node \p hNode in \p nodeParams_out. + * The \p paramArray returned in \p nodeParams_out is owned by the node. + * This memory remains valid until the node is destroyed or its + * parameters are modified, and should not be modified + * directly. Use ::cuGraphBatchMemOpNodeSetParams to update the + * parameters of this node. + * + * \param hNode - Node to get the parameters for + * \param nodeParams_out - Pointer to return the parameters + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_VALUE + * \note_graph_thread_safety + * \notefnerr + * + * \sa + * ::cuStreamBatchMemOp, + * ::cuGraphAddBatchMemOpNode, + * ::cuGraphBatchMemOpNodeSetParams + */ +CUresult CUDAAPI cuGraphBatchMemOpNodeGetParams(CUgraphNode hNode, CUDA_BATCH_MEM_OP_NODE_PARAMS *nodeParams_out); + +/** + * \brief Sets a batch mem op node's parameters + * + * Sets the parameters of batch mem op node \p hNode to \p nodeParams. + * + * The paramArray inside \p nodeParams is copied and therefore it can be + * freed after the call returns. + * + * \param hNode - Node to set the parameters for + * \param nodeParams - Parameters to copy + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_HANDLE, + * ::CUDA_ERROR_OUT_OF_MEMORY + * \note_graph_thread_safety + * \notefnerr + * + * \sa + * ::cuStreamBatchMemOp, + * ::cuGraphAddBatchMemOpNode, + * ::cuGraphBatchMemOpNodeGetParams + */ +CUresult CUDAAPI cuGraphBatchMemOpNodeSetParams(CUgraphNode hNode, const CUDA_BATCH_MEM_OP_NODE_PARAMS *nodeParams); + +/** + * \brief Sets the parameters for a batch mem op node in the given graphExec + * + * Sets the parameters of a batch mem op node in an executable graph \p hGraphExec. + * The node is identified by the corresponding node \p hNode in the + * non-executable graph, from which the executable graph was instantiated. + * + * The following fields on operations may be modified on an executable graph: + * + * op.waitValue.address + * op.waitValue.value[64] + * op.waitValue.flags bits corresponding to wait type (i.e. CU_STREAM_WAIT_VALUE_FLUSH bit cannot be modified) + * op.writeValue.address + * op.writeValue.value[64] + * + * Other fields, such as the context, count or type of operations, and other types of operations such as membars, + * may not be modified. + * + * \p hNode must not have been removed from the original graph. + * + * The modifications only affect future launches of \p hGraphExec. Already + * enqueued or running launches of \p hGraphExec are not affected by this call. + * \p hNode is also not modified by this call. + * + * The paramArray inside \p nodeParams is copied and therefore it can be + * freed after the call returns. + * + * \param hGraphExec - The executable graph in which to set the specified node + * \param hNode - Batch mem op node from the graph from which graphExec was instantiated + * \param nodeParams - Updated Parameters to set + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * \note_graph_thread_safety + * \notefnerr + * + * \sa + * ::cuStreamBatchMemOp, + * ::cuGraphAddBatchMemOpNode, + * ::cuGraphBatchMemOpNodeGetParams, + * ::cuGraphBatchMemOpNodeSetParams, + * ::cuGraphInstantiate + */ +CUresult CUDAAPI cuGraphExecBatchMemOpNodeSetParams(CUgraphExec hGraphExec, CUgraphNode hNode, const CUDA_BATCH_MEM_OP_NODE_PARAMS *nodeParams); + /** * \brief Creates an allocation node and adds it to a graph * @@ -16019,18 +17992,50 @@ CUresult CUDAAPI cuGraphDestroyNode(CUgraphNode hNode); * validated. If instantiation is successful, a handle to the instantiated graph * is returned in \p phGraphExec. * - * If there are any errors, diagnostic information may be returned in \p errorNode and - * \p logBuffer. This is the primary way to inspect instantiation errors. The output - * will be null terminated unless the diagnostics overflow - * the buffer. In this case, they will be truncated, and the last byte can be - * inspected to determine if truncation occurred. + * The \p flags parameter controls the behavior of instantiation and subsequent + * graph launches. Valid flags are: + * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH, which configures a + * graph containing memory allocation nodes to automatically free any + * unfreed memory allocations before the graph is relaunched. + * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH, which configures the graph for launch + * from the device. If this flag is passed, the executable graph handle returned can be + * used to launch the graph from both the host and device. This flag can only be used + * on platforms which support unified addressing. This flag cannot be used in + * conjunction with ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH. + * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, which causes the graph + * to use the priorities from the per-node attributes rather than the priority + * of the launch stream during execution. Note that priorities are only available + * on kernel nodes, and are copied from stream priority during stream capture. + * + * If \p hGraph contains any allocation or free nodes, there can be at most one + * executable graph in existence for that graph at a time. An attempt to instantiate + * a second executable graph before destroying the first with ::cuGraphExecDestroy + * will result in an error. + * + * If \p hGraph contains kernels which call device-side cudaGraphLaunch() from multiple + * contexts, this will result in an error. + * + * Graphs instantiated for launch on the device have additional restrictions which do not + * apply to host graphs: + * + * - The graph's nodes must reside on a single context. + * - The graph can only contain kernel nodes, memcpy nodes, memset nodes, and child graph nodes. + * Operation-specific restrictions are outlined below. + * - Kernel nodes: + * - Use of CUDA Dynamic Parallelism is not permitted. + * - Cooperative launches are permitted as long as MPS is not in use. + * - Memcpy nodes: + * - Only copies involving device memory and/or pinned device-mapped host memory are permitted. + * - Copies involving CUDA arrays are not permitted. + * - Both operands must be accessible from the current context, and the current context must + * match the context of other nodes in the graph. * * \param phGraphExec - Returns instantiated graph * \param hGraph - Graph to instantiate - * \param phErrorNode - In case of an instantiation error, this may be modified to - * indicate a node contributing to the error - * \param logBuffer - A character buffer to store diagnostic messages - * \param bufferSize - Size of the log buffer in bytes + * \param flags - Flags to control instantiation. See ::CUgraphInstantiate_flags. * * \return * ::CUDA_SUCCESS, @@ -16041,55 +18046,136 @@ CUresult CUDAAPI cuGraphDestroyNode(CUgraphNode hNode); * \notefnerr * * \sa - * ::cuGraphInstantiateWithFlags, + * ::cuGraphInstantiate, * ::cuGraphCreate, * ::cuGraphUpload, * ::cuGraphLaunch, * ::cuGraphExecDestroy */ -CUresult CUDAAPI cuGraphInstantiate(CUgraphExec *phGraphExec, CUgraph hGraph, CUgraphNode *phErrorNode, char *logBuffer, size_t bufferSize); +CUresult CUDAAPI cuGraphInstantiate(CUgraphExec *phGraphExec, CUgraph hGraph, unsigned long long flags); /** * \brief Creates an executable graph from a graph * - * Instantiates \p hGraph as an executable graph. The graph is validated for any - * structural constraints or intra-node constraints which were not previously - * validated. If instantiation is successful, a handle to the instantiated graph - * is returned in \p phGraphExec. + * Instantiates \p hGraph as an executable graph according to the \p instantiateParams structure. + * The graph is validated for any structural constraints or intra-node constraints + * which were not previously validated. If instantiation is successful, a handle to + * the instantiated graph is returned in \p phGraphExec. * - * The \p flags parameter controls the behavior of instantiation and subsequent - * graph launches. Valid flags are: + * \p instantiateParams controls the behavior of instantiation and subsequent + * graph launches, as well as returning more detailed information in the event of an error. + * ::CUDA_GRAPH_INSTANTIATE_PARAMS is defined as: + * + * \code + typedef struct { + cuuint64_t flags; + CUstream hUploadStream; + CUgraphNode hErrNode_out; + CUgraphInstantiateResult result_out; + } CUDA_GRAPH_INSTANTIATE_PARAMS; + * \endcode + * + * The \p flags field controls the behavior of instantiation and subsequent + * graph launches. Valid flags are: * * - ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH, which configures a * graph containing memory allocation nodes to automatically free any * unfreed memory allocations before the graph is relaunched. * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD, which will perform an upload of the graph + * into \p hUploadStream once the graph has been instantiated. + * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH, which configures the graph for launch + * from the device. If this flag is passed, the executable graph handle returned can be + * used to launch the graph from both the host and device. This flag can only be used + * on platforms which support unified addressing. This flag cannot be used in + * conjunction with ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH. + * + * - ::CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, which causes the graph + * to use the priorities from the per-node attributes rather than the priority + * of the launch stream during execution. Note that priorities are only available + * on kernel nodes, and are copied from stream priority during stream capture. + * * If \p hGraph contains any allocation or free nodes, there can be at most one - * executable graph in existence for that graph at a time. + * executable graph in existence for that graph at a time. An attempt to instantiate a + * second executable graph before destroying the first with ::cuGraphExecDestroy will + * result in an error. * - * An attempt to instantiate a second executable graph before destroying the first - * with ::cuGraphExecDestroy will result in an error. + * If \p hGraph contains kernels which call device-side cudaGraphLaunch() from multiple + * contexts, this will result in an error. * - * \param phGraphExec - Returns instantiated graph - * \param hGraph - Graph to instantiate - * \param flags - Flags to control instantiation. See ::CUgraphInstantiate_flags. + * Graphs instantiated for launch on the device have additional restrictions which do not + * apply to host graphs: + * + * - The graph's nodes must reside on a single context. + * - The graph can only contain kernel nodes, memcpy nodes, memset nodes, and child graph nodes. + * Operation-specific restrictions are outlined below. + * - Kernel nodes: + * - Use of CUDA Dynamic Parallelism is not permitted. + * - Cooperative launches are permitted as long as MPS is not in use. + * - Memcpy nodes: + * - Only copies involving device memory and/or pinned device-mapped host memory are permitted. + * - Copies involving CUDA arrays are not permitted. + * - Both operands must be accessible from the current context, and the current context must + * match the context of other nodes in the graph. + * + * In the event of an error, the \p result_out and \p hErrNode_out fields will contain more + * information about the nature of the error. Possible error reporting includes: + * + * - ::CUDA_GRAPH_INSTANTIATE_ERROR, if passed an invalid value or if an unexpected error occurred + * which is described by the return value of the function. \p hErrNode_out will be set to NULL. + * - ::CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE, if the graph structure is invalid. \p hErrNode_out + * will be set to one of the offending nodes. + * - ::CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED, if the graph is instantiated for device + * launch but contains a node of an unsupported node type, or a node which performs unsupported + * operations, such as use of CUDA dynamic parallelism within a kernel node. \p hErrNode_out will + * be set to this node. + * - ::CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED, if the graph is instantiated for device + * launch but a node’s context differs from that of another node. This error can also be returned + * if a graph is not instantiated for device launch and it contains kernels which call device-side + * cudaGraphLaunch() from multiple contexts. \p hErrNode_out will be set to this node. + * + * If instantiation is successful, \p result_out will be set to ::CUDA_GRAPH_INSTANTIATE_SUCCESS, + * and \p hErrNode_out will be set to NULL. + * + * \param phGraphExec - Returns instantiated graph + * \param hGraph - Graph to instantiate + * \param instantiateParams - Instantiation parameters * * \return * ::CUDA_SUCCESS, - * ::CUDA_ERROR_DEINITIALIZED, - * ::CUDA_ERROR_NOT_INITIALIZED, - * ::CUDA_ERROR_INVALID_VALUE + * ::CUDA_ERROR_INVALID_VALUE, * \note_graph_thread_safety * \notefnerr * * \sa - * ::cuGraphInstantiate, * ::cuGraphCreate, - * ::cuGraphUpload, - * ::cuGraphLaunch, + * ::cuGraphInstantiate, * ::cuGraphExecDestroy */ -CUresult CUDAAPI cuGraphInstantiateWithFlags(CUgraphExec *phGraphExec, CUgraph hGraph, unsigned long long flags); +CUresult CUDAAPI cuGraphInstantiateWithParams(CUgraphExec *phGraphExec, CUgraph hGraph, CUDA_GRAPH_INSTANTIATE_PARAMS *instantiateParams); + +/** + * \brief Query the instantiation flags of an executable graph + * + * Returns the flags that were passed to instantiation for the given executable graph. + * ::CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD will not be returned by this API as it does + * not affect the resulting executable graph. + * + * \param hGraphExec - The executable graph to query + * \param flags - Returns the instantiation flags + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * \note_graph_thread_safety + * \notefnerr + * + * \sa + * ::cuGraphInstantiate, + * ::cuGraphInstantiateWithParams + */ +CUresult CUDAAPI cuGraphExecGetFlags(CUgraphExec hGraphExec, cuuint64_t *flags); /** * \brief Sets the parameters for a kernel node in the given graphExec @@ -16104,6 +18190,11 @@ CUresult CUDAAPI cuGraphInstantiateWithFlags(CUgraphExec *phGraphExec, CUgraph h * - The owning context of the function cannot change. * - A node whose function originally did not use CUDA dynamic parallelism cannot be updated * to a function which uses CDP + * - If \p hGraphExec was not instantiated for device launch, a node whose function originally + * did not use device-side cudaGraphLaunch() cannot be updated to a function which uses + * device-side cudaGraphLaunch() unless the node resides on the same context as nodes which + * contained such calls at instantiate-time. If no such calls were present at instantiation, + * these updates cannot be performed at all. * * The modifications only affect future launches of \p hGraphExec. Already * enqueued or running launches of \p hGraphExec are not affected by this call. @@ -16489,7 +18580,7 @@ CUresult CUDAAPI cuGraphExecExternalSemaphoresWaitNodeSetParams(CUgraphExec hGra * enqueued or running launches of \p hGraphExec are not affected by this call. * \p hNode is also not modified by this call. * - * \note Currently only kernel nodes are supported. + * \note Currently only kernel, memset and memcpy nodes are supported. * * \param hGraphExec - The executable graph in which to set the specified node * \param hNode - Node from the graph from which graphExec was instantiated @@ -16519,7 +18610,7 @@ CUresult CUDAAPI cuGraphNodeSetEnabled(CUgraphExec hGraphExec, CUgraphNode hNode * * \p hNode must not have been removed from the original graph. * - * \note Currently only kernel nodes are supported. + * \note Currently only kernel, memset and memcpy nodes are supported. * * \param hGraphExec - The executable graph in which to set the specified node * \param hNode - Node from the graph from which graphExec was instantiated @@ -16653,6 +18744,14 @@ CUresult CUDAAPI cuGraphDestroy(CUgraph hGraph); * - A node whose function originally did not use CUDA dynamic parallelism cannot be updated * to a function which uses CDP. * - A cooperative node cannot be updated to a non-cooperative node, and vice-versa. + * - If the graph was instantiated with CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, the + * priority attribute cannot change. Equality is checked on the originally requested + * priority values, before they are clamped to the device's supported range. + * - If \p hGraphExec was not instantiated for device launch, a node whose function originally + * did not use device-side cudaGraphLaunch() cannot be updated to a function which uses + * device-side cudaGraphLaunch() unless the node resides on the same context as nodes which + * contained such calls at instantiate-time. If no such calls were present at instantiation, + * these updates cannot be performed at all. * - Memset and memcpy nodes: * - The CUDA device(s) to which the operand(s) was allocated/mapped cannot change. * - The source/destination memory must be allocated from the same contexts as the original @@ -16666,18 +18765,20 @@ CUresult CUDAAPI cuGraphDestroy(CUgraph hGraph); * * Note: The API may add further restrictions in future releases. The return code should always be checked. * - * cuGraphExecUpdate sets \p updateResult_out to CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED under - * the following conditions: - * - * - The count of nodes directly in \p hGraphExec and \p hGraph differ, in which case \p hErrorNode_out - * is NULL. - * - A node is deleted in \p hGraph but not not its pair from \p hGraphExec, in which case \p hErrorNode_out - * is NULL. - * - A node is deleted in \p hGraphExec but not its pair from \p hGraph, in which case \p hErrorNode_out is - * the pairless node from \p hGraph. - * - The dependent nodes of a pair differ, in which case \p hErrorNode_out is the node from \p hGraph. - * - * cuGraphExecUpdate sets \p updateResult_out to: + * cuGraphExecUpdate sets the result member of \p resultInfo to CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED + * under the following conditions: + * - The count of nodes directly in \p hGraphExec and \p hGraph differ, in which case resultInfo->errorNode + * is set to NULL. + * - \p hGraph has more exit nodes than \p hGraph, in which case resultInfo->errorNode is set to one of + * the exit nodes in hGraph. + * - A node in \p hGraph has a different number of dependencies than the node from \p hGraphExec it is paired with, + * in which case resultInfo->errorNode is set to the node from \p hGraph. + * - A node in \p hGraph has a dependency that does not match with the corresponding dependency of the paired node + * from \p hGraphExec. resultInfo->errorNode will be set to the node from \p hGraph. resultInfo->errorFromNode + * will be set to the mismatched dependency. The dependencies are paired based on edge order and a dependency + * does not match when the nodes are already paired based on other edges examined in the graph. + * + * cuGraphExecUpdate sets the result member of \p resultInfo to: * - CU_GRAPH_EXEC_UPDATE_ERROR if passed an invalid value. * - CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED if the graph topology changed * - CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED if the type of a node changed, in which case @@ -16691,10 +18792,8 @@ CUresult CUDAAPI cuGraphDestroy(CUgraph hGraph); * - CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED if something about a node is unsupported, like * the node's type or configuration, in which case \p hErrorNode_out is set to the node from \p hGraph * - * If \p updateResult_out isn't set in one of the situations described above, the update check passes - * and cuGraphExecUpdate updates \p hGraphExec to match the contents of \p hGraph. If an error happens - * during the update, \p updateResult_out will be set to CU_GRAPH_EXEC_UPDATE_ERROR; otherwise, - * \p updateResult_out is set to CU_GRAPH_EXEC_UPDATE_SUCCESS. + * If the update fails for a reason not listed above, the result member of \p resultInfo will be set + * to CU_GRAPH_EXEC_UPDATE_ERROR. If the update succeeds, the result member will be set to CU_GRAPH_EXEC_UPDATE_SUCCESS. * * cuGraphExecUpdate returns CUDA_SUCCESS when the updated was performed successfully. It returns * CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE if the graph update was not performed because it included @@ -16702,8 +18801,7 @@ CUresult CUDAAPI cuGraphDestroy(CUgraph hGraph); * * \param hGraphExec The instantiated graph to be updated * \param hGraph The graph containing the updated parameters - * \param hErrorNode_out The node which caused the permissibility check to forbid the update, if any - * \param updateResult_out Whether the graph update was permitted. If was forbidden, the reason why + * \param resultInfo the error info structure * * \return * ::CUDA_SUCCESS, @@ -16712,9 +18810,9 @@ CUresult CUDAAPI cuGraphDestroy(CUgraph hGraph); * \notefnerr * * \sa - * ::cuGraphInstantiate, + * ::cuGraphInstantiate */ -CUresult CUDAAPI cuGraphExecUpdate(CUgraphExec hGraphExec, CUgraph hGraph, CUgraphNode *hErrorNode_out, CUgraphExecUpdateResult *updateResult_out); +CUresult CUDAAPI cuGraphExecUpdate(CUgraphExec hGraphExec, CUgraph hGraph, CUgraphExecUpdateResultInfo *resultInfo); /** * \brief Copies attributes from source node to destination node. @@ -17123,12 +19221,79 @@ CUresult CUDAAPI cuOccupancyMaxPotentialBlockSizeWithFlags(int *minGridSize, int /** * \brief Returns dynamic shared memory available per block when launching \p numBlocks blocks on SM * - * Returns in \p *dynamicSmemSize the maximum size of dynamic shared memory to allow \p numBlocks blocks per SM. + * Returns in \p *dynamicSmemSize the maximum size of dynamic shared memory to allow \p numBlocks blocks per SM. + * + * \param dynamicSmemSize - Returned maximum dynamic shared memory + * \param func - Kernel function for which occupancy is calculated + * \param numBlocks - Number of blocks to fit on SM + * \param blockSize - Size of the blocks + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_UNKNOWN + * \notefnerr + */ +CUresult CUDAAPI cuOccupancyAvailableDynamicSMemPerBlock(size_t *dynamicSmemSize, CUfunction func, int numBlocks, int blockSize); + +/** + * \brief Given the kernel function (\p func) and launch configuration + * (\p config), return the maximum cluster size in \p *clusterSize. + * + * The cluster dimensions in \p config are ignored. If func has a required + * cluster size set (see ::cudaFuncGetAttributes / ::cuFuncGetAttribute),\p + * *clusterSize will reflect the required cluster size. + * + * By default this function will always return a value that's portable on + * future hardware. A higher value may be returned if the kernel function + * allows non-portable cluster sizes. + * + * This function will respect the compile time launch bounds. + * + * \param clusterSize - Returned maximum cluster size that can be launched + * for the given kernel function and launch configuration + * \param func - Kernel function for which maximum cluster + * size is calculated + * \param config - Launch configuration for the given kernel function + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_UNKNOWN + * \notefnerr + * + * \sa + * ::cudaFuncGetAttributes, + * ::cuFuncGetAttribute + */ +CUresult CUDAAPI cuOccupancyMaxPotentialClusterSize(int *clusterSize, CUfunction func, const CUlaunchConfig *config); + +/** + * \brief Given the kernel function (\p func) and launch configuration + * (\p config), return the maximum number of clusters that could co-exist + * on the target device in \p *numClusters. + * + * If the function has required cluster size already set (see + * ::cudaFuncGetAttributes / ::cuFuncGetAttribute), the cluster size + * from config must either be unspecified or match the required size. + * Without required sizes, the cluster size must be specified in config, + * else the function will return an error. + * + * Note that various attributes of the kernel function may affect occupancy + * calculation. Runtime environment may affect how the hardware schedules + * the clusters, so the calculated occupancy is not guaranteed to be achievable. * - * \param dynamicSmemSize - Returned maximum dynamic shared memory - * \param func - Kernel function for which occupancy is calculated - * \param numBlocks - Number of blocks to fit on SM - * \param blockSize - Size of the blocks + * \param numClusters - Returned maximum number of clusters that + * could co-exist on the target device + * \param func - Kernel function for which maximum number + * of clusters are calculated + * \param config - Launch configuration for the given kernel function * * \return * ::CUDA_SUCCESS, @@ -17136,13 +19301,15 @@ CUresult CUDAAPI cuOccupancyMaxPotentialBlockSizeWithFlags(int *minGridSize, int * ::CUDA_ERROR_NOT_INITIALIZED, * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_INVALID_CLUSTER_SIZE, * ::CUDA_ERROR_UNKNOWN * \notefnerr * * \sa + * ::cudaFuncGetAttributes, + * ::cuFuncGetAttribute */ -CUresult CUDAAPI cuOccupancyAvailableDynamicSMemPerBlock(size_t *dynamicSmemSize, CUfunction func, int numBlocks, int blockSize); - +CUresult CUDAAPI cuOccupancyMaxActiveClusters(int *numClusters, CUfunction func, const CUlaunchConfig *config); /** @} */ /* END CUDA_OCCUPANCY */ /** @@ -17179,12 +19346,12 @@ CUresult CUDAAPI cuOccupancyAvailableDynamicSMemPerBlock(size_t *dynamicSmemSize * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetArray(CUtexref hTexRef, CUarray hArray, unsigned int Flags); @@ -17209,12 +19376,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetArray(CUtexref hTexRef, CUarray hA * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmappedArray(CUtexref hTexRef, CUmipmappedArray hMipmappedArray, unsigned int Flags); @@ -17256,11 +19423,11 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmappedArray(CUtexref hTexRef, C * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, + * \sa + * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTexture + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddress(size_t *ByteOffset, CUtexref hTexRef, CUdeviceptr dptr, size_t bytes); @@ -17310,12 +19477,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddress(size_t *ByteOffset, CUtexr * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTexture2D + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddress2D(CUtexref hTexRef, const CUDA_ARRAY_DESCRIPTOR *desc, CUdeviceptr dptr, size_t Pitch); @@ -17341,16 +19508,13 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddress2D(CUtexref hTexRef, const * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaCreateChannelDesc, - * ::cudaBindTexture, - * ::cudaBindTexture2D, - * ::cudaBindTextureToArray, - * ::cudaBindTextureToMipmappedArray + * ::cudaCreateChannelDesc */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetFormat(CUtexref hTexRef, CUarray_format fmt, int NumPackedComponents); @@ -17388,15 +19552,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetFormat(CUtexref hTexRef, CUarray_f * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetArray, * ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTexture, - * ::cudaBindTexture2D, - * ::cudaBindTextureToArray, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddressMode(CUtexref hTexRef, int dim, CUaddress_mode am); @@ -17427,12 +19588,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetAddressMode(CUtexref hTexRef, int * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetFilterMode(CUtexref hTexRef, CUfilter_mode fm); @@ -17463,12 +19624,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetFilterMode(CUtexref hTexRef, CUfil * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapFilterMode(CUtexref hTexRef, CUfilter_mode fm); @@ -17492,12 +19653,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapFilterMode(CUtexref hTexRef, * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapLevelBias(CUtexref hTexRef, float bias); @@ -17523,12 +19684,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapLevelBias(CUtexref hTexRef, * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapLevelClamp(CUtexref hTexRef, float minMipmapLevelClamp, float maxMipmapLevelClamp); @@ -17552,13 +19713,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMipmapLevelClamp(CUtexref hTexRef, * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFlags, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTextureToArray, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMaxAnisotropy(CUtexref hTexRef, unsigned int maxAniso); @@ -17589,12 +19749,9 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetMaxAnisotropy(CUtexref hTexRef, un * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddressMode, - * ::cuTexRefGetAddressMode, ::cuTexRefGetBorderColor, - * ::cudaBindTexture, - * ::cudaBindTexture2D, - * ::cudaBindTextureToArray, - * ::cudaBindTextureToMipmappedArray + * \sa + * ::cuTexRefSetAddressMode, + * ::cuTexRefGetAddressMode, ::cuTexRefGetBorderColor */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetBorderColor(CUtexref hTexRef, float *pBorderColor); @@ -17631,15 +19788,12 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetBorderColor(CUtexref hTexRef, floa * ::CUDA_ERROR_INVALID_CONTEXT, * ::CUDA_ERROR_INVALID_VALUE * - * \sa ::cuTexRefSetAddress, + * \sa + * ::cuTexRefSetAddress, * ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray, * ::cuTexRefSetFilterMode, ::cuTexRefSetFormat, * ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray, - * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat, - * ::cudaBindTexture, - * ::cudaBindTexture2D, - * ::cudaBindTextureToArray, - * ::cudaBindTextureToMipmappedArray + * ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat */ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefSetFlags(CUtexref hTexRef, unsigned int Flags); @@ -18049,8 +20203,7 @@ __CUDA_DEPRECATED CUresult CUDAAPI cuTexRefDestroy(CUtexref hTexRef); * * \sa * ::cuModuleGetSurfRef, - * ::cuSurfRefGetArray, - * ::cudaBindSurfaceToArray + * ::cuSurfRefGetArray */ __CUDA_DEPRECATED CUresult CUDAAPI cuSurfRefSetArray(CUsurfref hSurfRef, CUarray hArray, unsigned int Flags); @@ -18487,6 +20640,348 @@ CUresult CUDAAPI cuSurfObjectGetResourceDesc(CUDA_RESOURCE_DESC *pResDesc, CUsur /** @} */ /* END CUDA_SURFOBJECT */ +/** + * \defgroup CUDA_TENSOR_MEMORY Tensor Core Managment + * + * ___MANBRIEF___ tensor core management functions of the low-level CUDA + * driver API (___CURRENT_FILE___) ___ENDMANBRIEF___ + * + * This section describes the tensor core management functions of the + * low-level CUDA driver application programming interface. The tensor + * core API is only supported on devices of compute capability 9.0 or higher. + * + * @{ + */ + +/** + * \brief Create a tensor map descriptor object representing tiled memory region + * + * Creates a descriptor for Tensor Memory Access (TMA) object specified + * by the parameters describing a tiled region and returns it in \p tensorMap. + * + * Tensor map objects are only supported on devices of compute capability 9.0 or higher. + * Additionally, a tensor map object is an opaque value, and, as such, should only be + * accessed through CUDA API calls. + * + * The parameters passed are bound to the following requirements: + * + * - \p tensorMap address must be aligned to 64 bytes. + * + * - \p tensorDataType has to be an enum from ::CUtensorMapDataType which is defined as: + * \code + typedef enum CUtensorMapDataType_enum { + CU_TENSOR_MAP_DATA_TYPE_UINT8 = 0, // 1 byte + CU_TENSOR_MAP_DATA_TYPE_UINT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_UINT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_INT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_UINT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_INT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_BFLOAT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ // 4 bytes + } CUtensorMapDataType; + * \endcode + * + * - \p tensorRank must be non-zero and less than or equal to the maximum supported dimensionality of 5. If \p interleave is not + * ::CU_TENSOR_MAP_INTERLEAVE_NONE, then \p tensorRank must additionally be greater than or equal to 3. + * + * - \p globalAddress, which specifies the starting address of the memory region described, must be 32 byte aligned when \p interleave is + * ::CU_TENSOR_MAP_INTERLEAVE_32B and 16 byte aligned otherwise. + * + * - \p globalDim array, which specifies tensor size of each of the \p tensorRank dimensions, must be non-zero and less than or + * equal to 2^32. + * + * - \p globalStrides array, which specifies tensor stride of each of the lower \p tensorRank - 1 dimensions in bytes, must be a + * multiple of 16 and less than 2^40. Additionally, the stride must be a multiple of 32 when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B. + * Each following dimension specified includes previous dimension stride: + * \code + globalStrides[0] = globalDim[0] * elementSizeInBytes(tensorDataType) + padding[0]; + for (i = 1; i < tensorRank - 1; i++) + globalStrides[i] = globalStrides[i – 1] * globalStrides[i] + padding[i]; + assert(globalStrides[i] >= globalDim[i]); + * \endcode + * + * - \p boxDim array, which specifies number of elements to be traversed along each of the \p tensorRank dimensions, must be less + * than or equal to 8. + * When \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, { \p boxDim[0] * elementSizeInBytes( \p tensorDataType ) } must be a multiple + * of 16 bytes. + * + * - \p elementStrides array, which specifies the iteration step along each of the \p tensorRank dimensions, must be non-zero and less + * than or equal to 8. Note that when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the first element of this array is ignored since + * TMA doesn’t support the stride for dimension zero. + * When all elemets of \p elementStrides array is one, \p boxDim specifies the number of elements to load. However, if the \p elementStrides[i] + * is not equal to one, then TMA loads ceil( \p boxDim[i] / \p elementStrides[i]) number of elements along i-th dimension. To load N elements along + * i-th dimension, \p boxDim[i] must be set to N * \p elementStrides[i]. + * + * - \p interleave specifies the interleaved layout of type ::CUtensorMapInterleave, which is defined as: + * \code + typedef enum CUtensorMapInterleave_enum { + CU_TENSOR_MAP_INTERLEAVE_NONE = 0, + CU_TENSOR_MAP_INTERLEAVE_16B, + CU_TENSOR_MAP_INTERLEAVE_32B + } CUtensorMapInterleave; + * \endcode + * TMA supports interleaved layouts like NC/8HWC8 where C8 utilizes 16 bytes in memory assuming 2 byte per channel or NC/16HWC16 where C16 + * uses 32 bytes. + * When \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE and \p swizzle is not ::CU_TENSOR_MAP_SWIZZLE_NONE, the bounding box inner dimension + * (computed as \p boxDim[0] multiplied by element size derived from \p tensorDataType) must be less than or equal to the swizzle size. + * - CU_TENSOR_MAP_SWIZZLE_32B implies the bounding box inner dimension will be <= 32. + * - CU_TENSOR_MAP_SWIZZLE_64B implies the bounding box inner dimension will be <= 64. + * - CU_TENSOR_MAP_SWIZZLE_128B implies the bounding box inner dimension will be <= 128. + * + * - \p swizzle, which specifies the shared memory bank swizzling pattern, has to be of type ::CUtensorMapSwizzle which is defined as: + * \code + typedef enum CUtensorMapSwizzle_enum { + CU_TENSOR_MAP_SWIZZLE_NONE = 0, + CU_TENSOR_MAP_SWIZZLE_32B, + CU_TENSOR_MAP_SWIZZLE_64B, + CU_TENSOR_MAP_SWIZZLE_128B + } CUtensorMapSwizzle; + * \endcode + * Data is organized in specific order in global memory; however, it may not match the order in which data are accessed by application in + * the shared memory. This difference in data organization may cause bank conflicts when shared memory is accessed. In order to avoid this + * problem, data can be loaded to shard memory with shuffling across shared memory banks. + * Note that it’s expected that when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \p swizzle should be ::CU_TENSOR_MAP_SWIZZLE_32B mode. + * Other interleave modes can have any swizzling patterns. + * + * - \p l2Promotion specifies L2 fetch size which indicates the byte granurality at which L2 requests is filled from DRAM. It must be of + * type ::CUtensorMapL2promotion, which is defined as: + * \code + typedef enum CUtensorMapL2promotion_enum { + CU_TENSOR_MAP_L2_PROMOTION_NONE = 0, + CU_TENSOR_MAP_L2_PROMOTION_L2_64B, + CU_TENSOR_MAP_L2_PROMOTION_L2_128B, + CU_TENSOR_MAP_L2_PROMOTION_L2_256B + } CUtensorMapL2promotion; + * \endcode + * + * - \p oobFill, which indicates whether zero or a special NaN constant should be used to fill out-of-bound elements, must be of type + * ::CUtensorMapFloatOOBfill which is defined as: + * \code + typedef enum CUtensorMapFloatOOBfill_enum { + CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0, + CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA + } CUtensorMapFloatOOBfill; + * \endcode + * Note that ::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA can only be used when \p tensorDataType represents a floating data type. + * + * \param tensorMap - Tensor map object to create + * \param tensorDataType - Tensor data type + * \param tensorRank - Dimensionality of tensor + * \param globalAddress - Starting address of memory region described by tensor + * \param globalDim - Array containing tensor size (number of elements) along each of the \p tensorRank dimensions + * \param globalStrides - Array containing stride size (in bytes) along each of the \p tensorRank - 1 dimensions + * \param boxDim - Array containing traversal box size (number of elments) along each of the \p tensorRank dimensions. Specifies how many elements to be traversed along each tensor dimension. + * \param elementStrides - Array containing traversal stride in each of the \p tensorRank dimensions + * \param interleave - Type of interleaved layout the tensor addresses + * \param swizzle - Bank swizzling pattern inside shared memory + * \param l2Promotion - L2 promotion size + * \param oobFill - Indicate whether zero or special NaN constant must be used to fill out-of-bound elements + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE + * + * \sa + * ::cuTensorMapEncodeIm2col, + * ::cuTensorMapReplaceAddress + */ +CUresult CUDAAPI cuTensorMapEncodeTiled(CUtensorMap *tensorMap, CUtensorMapDataType tensorDataType, cuuint32_t tensorRank, void *globalAddress, const cuuint64_t *globalDim, const cuuint64_t *globalStrides, const cuuint32_t *boxDim, const cuuint32_t *elementStrides, CUtensorMapInterleave interleave, CUtensorMapSwizzle swizzle, CUtensorMapL2promotion l2Promotion, CUtensorMapFloatOOBfill oobFill); + + +/** + * \brief Create a tensor map descriptor object representing im2col memory region + * + * Creates a descriptor for Tensor Memory Access (TMA) object specified + * by the parameters describing a im2col memory layout and returns it in \p tensorMap. + * + * Tensor map objects are only supported on devices of compute capability 9.0 or higher. + * Additionally, a tensor map object is an opaque value, and, as such, should only be + * accessed through CUDA API calls. + * + * The parameters passed are bound to the following requirements: + * + * - \p tensorMap address must be aligned to 64 bytes. + * + * - \p tensorDataType has to be an enum from ::CUtensorMapDataType which is defined as: + * \code + typedef enum CUtensorMapDataType_enum { + CU_TENSOR_MAP_DATA_TYPE_UINT8 = 0, // 1 byte + CU_TENSOR_MAP_DATA_TYPE_UINT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_UINT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_INT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_UINT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_INT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT64, // 8 bytes + CU_TENSOR_MAP_DATA_TYPE_BFLOAT16, // 2 bytes + CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32, // 4 bytes + CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ // 4 bytes + } CUtensorMapDataType; + * \endcode + * + * - \p tensorRank must be one of dimensions 3, 4, or 5. + * + * - \p globalAddress, which specifies the starting address of the memory region described, must be 32 byte aligned when \p interleave is + * ::CU_TENSOR_MAP_INTERLEAVE_32B and 16 byte aligned otherwise. + * + * - \p globalDim array, which specifies tensor size of each of the \p tensorRank dimensions, must be non-zero and less than or + * equal to 2^32. + * + * - \p globalStrides array, which specifies tensor stride of each of the lower \p tensorRank - 1 dimensions in bytes, must be a + * multiple of 16 and less than 2^40. Additionally, the stride must be a multiple of 32 when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B. + * Each following dimension specified includes previous dimension stride: + * \code + globalStrides[0] = globalDim[0] * elementSizeInBytes(tensorDataType) + padding[0]; + for (i = 1; i < tensorRank - 1; i++) + globalStrides[i] = globalStrides[i – 1] * globalStrides[i] + padding[i]; + assert(globalStrides[i] >= globalDim[i]); + * \endcode + * + * - \p pixelBoxLowerCorner array specifies the coordinate offsets {D, H, W} of the bounding box from top/left/front corner. The number of + * offsets and their precision depends on the tensor dimensionality: + * - When \p tensorRank is 3, one signed offset within range [-32768, 32767] is supported. + * - When \p tensorRank is 4, two signed offsets each within range [-128, 127] are supported. + * - When \p tensorRank is 5, three offsets each within range [-16, 15] are supported. + * + * - \p pixelBoxUpperCorner array specifies the coordinate offsets {D, H, W} of the bounding box from bottom/right/back corner. The number of + * offsets and their precision depends on the tensor dimensionality: + * - When \p tensorRank is 3, one signed offset within range [-32768, 32767] is supported. + * - When \p tensorRank is 4, two signed offsets each within range [-128, 127] are supported. + * - When \p tensorRank is 5, three offsets each within range [-16, 15] are supported. + * The bounding box specified by \p pixelBoxLowerCorner and \p pixelBoxUpperCorner must have non-zero area. + * + * - \p channelsPerPixel, which specifies the number of elements which must be accessed along C dimension, must be less than or equal to 256. + * + * - \p pixelsPerColumn, which specifies the number of elements that must be accessed along the {N, D, H, W} dimensions, must be less than or + * equal to 1024. + * + * - \p elementStrides array, which specifies the iteration step along each of the \p tensorRank dimensions, must be non-zero and less + * than or equal to 8. Note that when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the first element of this array is ignored since + * TMA doesn’t support the stride for dimension zero. + * When all elemets of \p elementStrides array is one, \p boxDim specifies the number of elements to load. However, if the \p elementStrides[i] + * is not equal to one, then TMA loads ceil( \p boxDim[i] / \p elementStrides[i]) number of elements along i-th dimension. To load N elements along + * i-th dimension, \p boxDim[i] must be set to N * \p elementStrides[i]. + * + * - \p interleave specifies the interleaved layout of type ::CUtensorMapInterleave, which is defined as: + * \code + typedef enum CUtensorMapInterleave_enum { + CU_TENSOR_MAP_INTERLEAVE_NONE = 0, + CU_TENSOR_MAP_INTERLEAVE_16B, + CU_TENSOR_MAP_INTERLEAVE_32B + } CUtensorMapInterleave; + * \endcode + * TMA supports interleaved layouts like NC/8HWC8 where C8 utilizes 16 bytes in memory assuming 2 byte per channel or NC/16HWC16 where C16 + * uses 32 bytes. + * When \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE and \p swizzle is not ::CU_TENSOR_MAP_SWIZZLE_NONE, the bounding box inner dimension + * (computed as \p boxDim[0] multiplied by element size derived from \p tensorDataType) must be less than or equal to the swizzle size. + * - CU_TENSOR_MAP_SWIZZLE_32B implies the bounding box inner dimension will be <= 32. + * - CU_TENSOR_MAP_SWIZZLE_64B implies the bounding box inner dimension will be <= 64. + * - CU_TENSOR_MAP_SWIZZLE_128B implies the bounding box inner dimension will be <= 128. + * + * - \p swizzle, which specifies the shared memory bank swizzling pattern, has to be of type ::CUtensorMapSwizzle which is defined as: + * \code + typedef enum CUtensorMapSwizzle_enum { + CU_TENSOR_MAP_SWIZZLE_NONE = 0, + CU_TENSOR_MAP_SWIZZLE_32B, + CU_TENSOR_MAP_SWIZZLE_64B, + CU_TENSOR_MAP_SWIZZLE_128B + } CUtensorMapSwizzle; + * \endcode + * Data is organized in specific order in global memory; however, it may not match the order in which data are accessed by application in + * the shared memory. This difference in data organization may cause bank conflicts when shared memory is accessed. In order to avoid this + * problem, data can be loaded to shard memory with shuffling across shared memory banks. + * Note that it’s expected that when \p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \p swizzle should be ::CU_TENSOR_MAP_SWIZZLE_32B mode. + * Other interleave modes can have any swizzling patterns. + * + * - \p l2Promotion specifies L2 fetch size which indicates the byte granurality at which L2 requests is filled from DRAM. It must be of + * type ::CUtensorMapL2promotion, which is defined as: + * \code + typedef enum CUtensorMapL2promotion_enum { + CU_TENSOR_MAP_L2_PROMOTION_NONE = 0, + CU_TENSOR_MAP_L2_PROMOTION_L2_64B, + CU_TENSOR_MAP_L2_PROMOTION_L2_128B, + CU_TENSOR_MAP_L2_PROMOTION_L2_256B + } CUtensorMapL2promotion; + * \endcode + * + * - \p oobFill, which indicates whether zero or a special NaN constant should be used to fill out-of-bound elements, must be of type + * ::CUtensorMapFloatOOBfill which is defined as: + * \code + typedef enum CUtensorMapFloatOOBfill_enum { + CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0, + CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA + } CUtensorMapFloatOOBfill; + * \endcode + * Note that ::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA can only be used when \p tensorDataType represents a floating data type. + * + * \param tensorMap - Tensor map object to create + * \param tensorDataType - Tensor data type + * \param tensorRank - Dimensionality of tensor, needs to be at least of dimension 3 + * \param globalAddress - Starting address of memory region described by tensor + * \param globalDim - Array containing tensor size (number of elements) along each of the \p tensorRank dimensions + * \param globalStrides - Array containing stride size (in bytes) along each of the \p tensorRank - 1 dimensions + * \param pixelBoxLowerCorner - Array containing DHW dimentions of lower box corner + * \param pixelBoxUpperCorner - Array containing DHW dimentions of upper box corner + * \param channelsPerPixel - Number of channels per pixel + * \param pixelsPerColumn - Number of pixels per column + * \param elementStrides - Array containing traversal stride in each of the \p tensorRank dimensions + * \param interleave - Type of interleaved layout the tensor addresses + * \param swizzle - Bank swizzling pattern inside shared memory + * \param l2Promotion - L2 promotion size + * \param oobFill - Indicate whether zero or special NaN constant must be used to fill out-of-bound elements + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE + * + * \sa + * ::cuTensorMapEncodeTiled, + * ::cuTensorMapReplaceAddress + */ +CUresult CUDAAPI cuTensorMapEncodeIm2col(CUtensorMap *tensorMap, CUtensorMapDataType tensorDataType, cuuint32_t tensorRank, void *globalAddress, const cuuint64_t *globalDim, const cuuint64_t *globalStrides, const int *pixelBoxLowerCorner, const int *pixelBoxUpperCorner, cuuint32_t channelsPerPixel, cuuint32_t pixelsPerColumn, const cuuint32_t *elementStrides, CUtensorMapInterleave interleave, CUtensorMapSwizzle swizzle, CUtensorMapL2promotion l2Promotion, CUtensorMapFloatOOBfill oobFill); + +/** + * \brief Modify an existing tensor map descriptor with an updated global address + * + * Modifies the descriptor for Tensor Memory Access (TMA) object passed in \p tensorMap with + * an updated \p globalAddress. + * + * Tensor map objects are only supported on devices of compute capability 9.0 or higher. + * Additionally, a tensor map object is an opaque value, and, as such, should only be + * accessed through CUDA API calls. + * + * \param tensorMap - Tensor map object to modify + * \param globalAddress - Starting address of memory region described by tensor, must follow previous alignment requirements + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_INVALID_VALUE + * + * \sa + * ::cuTensorMapEncodeTiled, + * ::cuTensorMapEncodeIm2col + */ +CUresult CUDAAPI cuTensorMapReplaceAddress(CUtensorMap *tensorMap, void *globalAddress); + +/** @} */ +/* END CUDA_TENSOR_MEMORY */ + /** * \defgroup CUDA_PEER_ACCESS Peer Context Memory Access * @@ -18945,9 +21440,18 @@ CUresult CUDAAPI cuGraphicsUnmapResources(unsigned int count, CUgraphicsResource * typedef can be picked up from the corresponding typedefs header file. For example, * cudaTypedefs.h consists of function pointer typedefs for driver APIs defined in cuda.h. * - * The API will return ::CUDA_ERROR_NOT_FOUND if the requested driver function is not - * supported on the platform, no ABI compatible driver function exists for the specified - * \p cudaVersion or if the driver symbol is invalid. + * The API will return ::CUDA_SUCCESS and set the returned \p pfn to NULL if the + * requested driver function is not supported on the platform, no ABI + * compatible driver function exists for the specified \p cudaVersion or if the + * driver symbol is invalid. + * + * It will also set the optional \p symbolStatus to one of the values in + * ::CUdriverProcAddressQueryResult with the following meanings: + * - ::CU_GET_PROC_ADDRESS_SUCCESS - The requested symbol was succesfully found based + * on input arguments and \p pfn is valid + * - ::CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND - The requested symbol was not found + * - ::CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT - The requested symbol was found but is + * not supported by cudaVersion specified * * The requested flags can be: * - ::CU_GET_PROC_ADDRESS_DEFAULT: This is the default mode. This is equivalent to @@ -18967,21 +21471,255 @@ CUresult CUDAAPI cuGraphicsUnmapResources(unsigned int count, CUgraphicsResource * \param pfn - Location to return the function pointer to the requested driver function * \param cudaVersion - The CUDA version to look for the requested driver symbol * \param flags - Flags to specify search options. + * \param symbolStatus - Optional location to store the status of the search for + * \p symbol based on \p cudaVersion. See ::CUdriverProcAddressQueryResult + * for possible values. * * \return * ::CUDA_SUCCESS, * ::CUDA_ERROR_INVALID_VALUE, - * ::CUDA_ERROR_NOT_SUPPORTED, - * ::CUDA_ERROR_NOT_FOUND + * ::CUDA_ERROR_NOT_SUPPORTED * \note_version_mixing * * \sa * ::cudaGetDriverEntryPoint */ -CUresult CUDAAPI cuGetProcAddress(const char *symbol, void **pfn, int cudaVersion, cuuint64_t flags); +CUresult CUDAAPI cuGetProcAddress(const char *symbol, void **pfn, int cudaVersion, cuuint64_t flags, CUdriverProcAddressQueryResult *symbolStatus); /** @} */ /* END CUDA_DRIVER_ENTRY_POINT */ +/** + * \defgroup CUDA_COREDUMP Coredump Attributes Control API + * + * ___MANBRIEF___ coredump attribute control functions for the low-level CUDA API + * (___CURRENT_FILE___) ___ENDMANBRIEF___ + * + * This section describes the coredump attribute control functions of the low-level CUDA + * driver application programming interface. + * + * @{ + */ + +/** + * Flags for choosing a coredump attribute to get/set + */ +typedef enum CUcoredumpSettings_enum { + CU_COREDUMP_ENABLE_ON_EXCEPTION = 1, + CU_COREDUMP_TRIGGER_HOST, + CU_COREDUMP_LIGHTWEIGHT, + CU_COREDUMP_ENABLE_USER_TRIGGER, + CU_COREDUMP_FILE, + CU_COREDUMP_PIPE, + CU_COREDUMP_MAX +} CUcoredumpSettings; + +/** + * \brief Allows caller to fetch a coredump attribute value for the current context + * + * Returns in \p *value the requested value specified by \p attrib. It is up to the caller + * to ensure that the data type and size of \p *value matches the request. + * + * If the caller calls this function with \p *value equal to NULL, the size of the memory + * region (in bytes) expected for \p attrib will be placed in \p size. + * + * The supported attributes are: + * - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from + * this context will create a coredump at the location specified by ::CU_COREDUMP_FILE. + * The default value is ::false unless set to ::true globally or locally, or the + * CU_CTX_USER_COREDUMP_ENABLE flag was set during context creation. + * - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will + * also create a coredump. The default value is ::true unless set to ::false globally or + * or locally. + * - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps + * will not have a dump of GPU memory or non-reloc ELF images. The default value is + * ::false unless set to ::true globally or locally. + * - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be + * created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default + * value is ::false unless set to ::true globally or locally. + * - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where + * any coredumps generated by this context will be written. The default value is + * ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA applications and ::PID is the process ID of the CUDA application. + * - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe + * that will be monitored if user-triggered coredumps are enabled. The default value is + * ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA application and ::PID is the process ID of the CUDA application. + * + * \param attrib - The enum defining which value to fetch. + * \param value - void* containing the requested data. + * \param size - The size of the memory region \p value points to. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED + * + * \sa + * ::cuCoredumpGetAttributeGlobal, + * ::cuCoredumpSetAttribute, + * ::cuCoredumpSetAttributeGlobal + */ +CUresult CUDAAPI cuCoredumpGetAttribute(CUcoredumpSettings attrib, void* value, size_t *size); + +/** + * \brief Allows caller to fetch a coredump attribute value for the entire application + * + * Returns in \p *value the requested value specified by \p attrib. It is up to the caller + * to ensure that the data type and size of \p *value matches the request. + * + * If the caller calls this function with \p *value equal to NULL, the size of the memory + * region (in bytes) expected for \p attrib will be placed in \p size. + * + * The supported attributes are: + * - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from + * this context will create a coredump at the location specified by ::CU_COREDUMP_FILE. + * The default value is ::false. + * - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will + * also create a coredump. The default value is ::true. + * - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps + * will not have a dump of GPU memory or non-reloc ELF images. The default value is + * ::false. + * - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be + * created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default + * value is ::false. + * - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where + * any coredumps generated by this context will be written. The default value is + * ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA applications and ::PID is the process ID of the CUDA application. + * - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe + * that will be monitored if user-triggered coredumps are enabled. The default value is + * ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA application and ::PID is the process ID of the CUDA application. + * + * \param attrib - The enum defining which value to fetch. + * \param value - void* containing the requested data. + * \param size - The size of the memory region \p value points to. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE + * + * \sa + * ::cuCoredumpGetAttribute, + * ::cuCoredumpSetAttribute, + * ::cuCoredumpSetAttributeGlobal + */ +CUresult CUDAAPI cuCoredumpGetAttributeGlobal(CUcoredumpSettings attrib, void *value, size_t *size); + +/** + * \brief Allows caller to set a coredump attribute value for the current context + * + * This function should be considered an alternate interface to the CUDA-GDB environment + * variables defined in this document: https://docs.nvidia.com/cuda/cuda-gdb/index.html#gpu-coredump + * + * An important design decision to note is that any coredump environment variable values + * set before CUDA initializes will take permanent precedence over any values set with this + * this function. This decision was made to ensure no change in behavior for any users that + * may be currently using these variables to get coredumps. + * + * \p *value shall contain the requested value specified by \p set. It is up to the caller + * to ensure that the data type and size of \p *value matches the request. + * + * If the caller calls this function with \p *value equal to NULL, the size of the memory + * region (in bytes) expected for \p set will be placed in \p size. + * + * ::CU_COREDUMP_ENABLE_USER_TRIGGER and ::CU_COREDUMP_PIPE cannot be set on a per-context basis. + * + * The supported attributes are: + * - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from + * this context will create a coredump at the location specified by ::CU_COREDUMP_FILE. + * The default value is ::false. + * - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will + * also create a coredump. The default value is ::true. + * - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps + * will not have a dump of GPU memory or non-reloc ELF images. The default value is + * ::false. + * - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where + * any coredumps generated by this context will be written. The default value is + * ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA applications and ::PID is the process ID of the CUDA application. + * + * \param attrib - The enum defining which value to set. + * \param value - void* containing the requested data. + * \param size - The size of the memory region \p value points to. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_NOT_PERMITTED, + * ::CUDA_ERROR_DEINITIALIZED, + * ::CUDA_ERROR_NOT_INITIALIZED, + * ::CUDA_ERROR_INVALID_CONTEXT, + * ::CUDA_ERROR_CONTEXT_IS_DESTROYED + * + * \sa + * ::cuCoredumpGetAttributeGlobal, + * ::cuCoredumpGetAttribute, + * ::cuCoredumpSetAttributeGlobal + */ +CUresult CUDAAPI cuCoredumpSetAttribute(CUcoredumpSettings attrib, void* value, size_t *size); + +/** + * \brief Allows caller to set a coredump attribute value globally + * + * This function should be considered an alternate interface to the CUDA-GDB environment + * variables defined in this document: https://docs.nvidia.com/cuda/cuda-gdb/index.html#gpu-coredump + * + * An important design decision to note is that any coredump environment variable values + * set before CUDA initializes will take permanent precedence over any values set with this + * this function. This decision was made to ensure no change in behavior for any users that + * may be currently using these variables to get coredumps. + * + * \p *value shall contain the requested value specified by \p set. It is up to the caller + * to ensure that the data type and size of \p *value matches the request. + * + * If the caller calls this function with \p *value equal to NULL, the size of the memory + * region (in bytes) expected for \p set will be placed in \p size. + * + * The supported attributes are: + * - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from + * this context will create a coredump at the location specified by ::CU_COREDUMP_FILE. + * The default value is ::false. + * - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will + * also create a coredump. The default value is ::true. + * - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps + * will not have a dump of GPU memory or non-reloc ELF images. The default value is + * ::false. + * - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be + * created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default + * value is ::false. + * - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where + * any coredumps generated by this context will be written. The default value is + * ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running + * the CUDA applications and ::PID is the process ID of the CUDA application. + * - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe + * that will be monitored if user-triggered coredumps are enabled. This value may not be + * changed after ::CU_COREDUMP_ENABLE_USER_TRIGGER is set to ::true. The default + * value is ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine + * running the CUDA application and ::PID is the process ID of the CUDA application. + * + * \param attrib - The enum defining which value to set. + * \param value - void* containing the requested data. + * \param size - The size of the memory region \p value points to. + * + * \return + * ::CUDA_SUCCESS, + * ::CUDA_ERROR_INVALID_VALUE, + * ::CUDA_ERROR_NOT_PERMITTED + * + * \sa + * ::cuCoredumpGetAttribute, + * ::cuCoredumpGetAttributeGlobal, + * ::cuCoredumpSetAttribute + */ +CUresult CUDAAPI cuCoredumpSetAttributeGlobal(CUcoredumpSettings attrib, void *value, size_t *size); + +/** @} */ /* END CUDA_COREDUMP */ + CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExportTableId); /** @@ -19053,6 +21791,7 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp #undef cuMemsetD2D16Async #undef cuMemsetD2D32Async #undef cuStreamGetPriority + #undef cuStreamGetId #undef cuStreamGetFlags #undef cuStreamGetCtx #undef cuStreamWaitEvent @@ -19063,9 +21802,7 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp #undef cuEventRecord #undef cuEventRecordWithFlags #undef cuLaunchKernel - - - + #undef cuLaunchKernelEx #undef cuLaunchHostFunc #undef cuGraphicsMapResources #undef cuGraphicsUnmapResources @@ -19074,6 +21811,11 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp #undef cuStreamWriteValue64 #undef cuStreamWaitValue64 #undef cuStreamBatchMemOp + #undef cuStreamWriteValue32_v2 + #undef cuStreamWaitValue32_v2 + #undef cuStreamWriteValue64_v2 + #undef cuStreamWaitValue64_v2 + #undef cuStreamBatchMemOp_v2 #undef cuMemPrefetchAsync #undef cuLaunchCooperativeKernel #undef cuSignalExternalSemaphoresAsync @@ -19083,6 +21825,8 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp #undef cuStreamIsCapturing #undef cuStreamGetCaptureInfo #undef cuStreamGetCaptureInfo_v2 + #undef cuGraphInstantiateWithParams + #undef cuGraphExecUpdate #undef cuGraphUpload #undef cuGraphLaunch #undef cuDevicePrimaryCtxRelease @@ -19093,11 +21837,16 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp #undef cuStreamSetAttribute #undef cuStreamGetAttribute #undef cuGraphInstantiate + #undef cuGraphAddKernelNode + #undef cuGraphKernelNodeGetParams + #undef cuGraphKernelNodeSetParams + #undef cuGraphExecKernelNodeSetParams #undef cuMemMapArrayAsync #undef cuMemFreeAsync #undef cuMemAllocAsync #undef cuMemAllocFromPoolAsync #undef cuStreamUpdateCaptureDependencies + #undef cuGetProcAddress CUresult CUDAAPI cuMemHostRegister(void *p, size_t bytesize, unsigned int Flags); CUresult CUDAAPI cuGraphicsResourceSetMapFlags(CUgraphicsResource resource, unsigned int flags); @@ -19274,6 +22023,7 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuMemsetD2D32Async(CUdeviceptr dstDevice, size_t dstPitch, unsigned int ui, size_t Width, size_t Height, CUstream hStream); CUresult CUDAAPI cuStreamGetPriority(CUstream hStream, int *priority); + CUresult CUDAAPI cuStreamGetId(CUstream hStream, unsigned long long *streamId); CUresult CUDAAPI cuStreamGetFlags(CUstream hStream, unsigned int *flags); CUresult CUDAAPI cuStreamGetCtx(CUstream hStream, CUcontext *pctx); CUresult CUDAAPI cuStreamWaitEvent(CUstream hStream, CUevent hEvent, unsigned int Flags); @@ -19284,9 +22034,7 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuEventRecord(CUevent hEvent, CUstream hStream); CUresult CUDAAPI cuEventRecordWithFlags(CUevent hEvent, CUstream hStream, unsigned int flags); CUresult CUDAAPI cuLaunchKernel(CUfunction f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, void **extra); - - - + CUresult CUDAAPI cuLaunchKernelEx(const CUlaunchConfig *config, CUfunction f, void **kernelParams, void **extra); CUresult CUDAAPI cuLaunchHostFunc(CUstream hStream, CUhostFn fn, void *userData); CUresult CUDAAPI cuGraphicsMapResources(unsigned int count, CUgraphicsResource *resources, CUstream hStream); CUresult CUDAAPI cuGraphicsUnmapResources(unsigned int count, CUgraphicsResource *resources, CUstream hStream); @@ -19295,6 +22043,18 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuStreamWriteValue64(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); CUresult CUDAAPI cuStreamWaitValue64(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); CUresult CUDAAPI cuStreamBatchMemOp(CUstream stream, unsigned int count, CUstreamBatchMemOpParams *paramArray, unsigned int flags); + + CUresult CUDAAPI cuStreamWriteValue32_ptsz(CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWaitValue32_ptsz(CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWriteValue64_ptsz(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWaitValue64_ptsz(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); + CUresult CUDAAPI cuStreamBatchMemOp_ptsz(CUstream stream, unsigned int count, CUstreamBatchMemOpParams *paramArray, unsigned int flags); + + CUresult CUDAAPI cuStreamWriteValue32_v2(CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWaitValue32_v2(CUstream stream, CUdeviceptr addr, cuuint32_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWriteValue64_v2(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); + CUresult CUDAAPI cuStreamWaitValue64_v2(CUstream stream, CUdeviceptr addr, cuuint64_t value, unsigned int flags); + CUresult CUDAAPI cuStreamBatchMemOp_v2(CUstream stream, unsigned int count, CUstreamBatchMemOpParams *paramArray, unsigned int flags); CUresult CUDAAPI cuMemPrefetchAsync(CUdeviceptr devPtr, size_t count, CUdevice dstDevice, CUstream hStream); CUresult CUDAAPI cuLaunchCooperativeKernel(CUfunction f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, CUstream hStream, void **kernelParams); CUresult CUDAAPI cuSignalExternalSemaphoresAsync(const CUexternalSemaphore *extSemArray, const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS *paramsArray, unsigned int numExtSems, CUstream stream); @@ -19305,7 +22065,14 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuStreamEndCapture(CUstream hStream, CUgraph *phGraph); CUresult CUDAAPI cuStreamIsCapturing(CUstream hStream, CUstreamCaptureStatus *captureStatus); CUresult CUDAAPI cuStreamGetCaptureInfo(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, cuuint64_t *id_out); + CUresult CUDAAPI cuStreamGetCaptureInfo_ptsz(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, cuuint64_t *id_out); CUresult CUDAAPI cuStreamGetCaptureInfo_v2(CUstream hStream, CUstreamCaptureStatus *captureStatus_out, cuuint64_t *id_out, CUgraph *graph_out, const CUgraphNode **dependencies_out, size_t *numDependencies_out); + CUresult CUDAAPI cuGraphAddKernelNode(CUgraphNode *phGraphNode, CUgraph hGraph, const CUgraphNode *dependencies, size_t numDependencies, const CUDA_KERNEL_NODE_PARAMS_v1 *nodeParams); + CUresult CUDAAPI cuGraphKernelNodeGetParams(CUgraphNode hNode, CUDA_KERNEL_NODE_PARAMS_v1 *nodeParams); + CUresult CUDAAPI cuGraphKernelNodeSetParams(CUgraphNode hNode, const CUDA_KERNEL_NODE_PARAMS_v1 *nodeParams); + CUresult CUDAAPI cuGraphExecKernelNodeSetParams(CUgraphExec hGraphExec, CUgraphNode hNode, const CUDA_KERNEL_NODE_PARAMS_v1 *nodeParams); + CUresult CUDAAPI cuGraphInstantiateWithParams(CUgraphExec *phGraphExec, CUgraph hGraph, CUDA_GRAPH_INSTANTIATE_PARAMS *instantiateParams); + CUresult CUDAAPI cuGraphExecUpdate(CUgraphExec hGraphExec, CUgraph hGraph, CUgraphNode *hErrorNode_out, CUgraphExecUpdateResult *updateResult_out); CUresult CUDAAPI cuGraphUpload(CUgraphExec hGraph, CUstream hStream); CUresult CUDAAPI cuGraphLaunch(CUgraphExec hGraph, CUstream hStream); CUresult CUDAAPI cuStreamCopyAttributes(CUstream dstStream, CUstream srcStream); @@ -19314,6 +22081,8 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuIpcOpenMemHandle(CUdeviceptr *pdptr, CUipcMemHandle handle, unsigned int Flags); CUresult CUDAAPI cuGraphInstantiate(CUgraphExec *phGraphExec, CUgraph hGraph, CUgraphNode *phErrorNode, char *logBuffer, size_t bufferSize); + CUresult CUDAAPI cuGraphInstantiate_v2(CUgraphExec *phGraphExec, CUgraph hGraph, CUgraphNode *phErrorNode, char *logBuffer, size_t bufferSize); + CUresult CUDAAPI cuMemMapArrayAsync(CUarrayMapInfo *mapInfoList, unsigned int count, CUstream hStream); CUresult CUDAAPI cuMemFreeAsync(CUdeviceptr dptr, CUstream hStream); @@ -19321,16 +22090,18 @@ CUresult CUDAAPI cuGetExportTable(const void **ppExportTable, const CUuuid *pExp CUresult CUDAAPI cuMemAllocFromPoolAsync(CUdeviceptr *dptr, size_t bytesize, CUmemoryPool pool, CUstream hStream); CUresult CUDAAPI cuStreamUpdateCaptureDependencies(CUstream hStream, CUgraphNode *dependencies, size_t numDependencies, unsigned int flags); + CUresult CUDAAPI cuGetProcAddress(const char *symbol, void **pfn, int cudaVersion, cuuint64_t flags); + #elif defined(__CUDA_API_PER_THREAD_DEFAULT_STREAM) -static inline CUresult cuGetProcAddress_ptsz(const char *symbol, void **funcPtr, int driverVersion, cuuint64_t flags) { +static inline CUresult cuGetProcAddress_v2_ptsz(const char *symbol, void **funcPtr, int driverVersion, cuuint64_t flags, CUdriverProcAddressQueryResult *symbolStatus) { const int procAddressMask = (CU_GET_PROC_ADDRESS_LEGACY_STREAM| CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM); if ((flags & procAddressMask) == 0) { flags |= CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM; } - return cuGetProcAddress(symbol, funcPtr, driverVersion, flags); + return cuGetProcAddress_v2(symbol, funcPtr, driverVersion, flags, symbolStatus); } -#define cuGetProcAddress cuGetProcAddress_ptsz +#define cuGetProcAddress_v2 cuGetProcAddress_v2_ptsz #endif #ifdef __cplusplus diff --git a/python/tutorials/05-layer-norm.py b/python/tutorials/05-layer-norm.py index 1737e7e36345..b19ff00ae2c1 100644 --- a/python/tutorials/05-layer-norm.py +++ b/python/tutorials/05-layer-norm.py @@ -251,7 +251,7 @@ def forward(ctx, x, normalized_shape, weight, bias, eps): # enqueue kernel _layer_norm_fwd_fused[(M,)](x_arg, y, weight, bias, mean, rstd, x_arg.stride(0), N, eps, - BLOCK_SIZE=BLOCK_SIZE, num_warps=num_warps) + BLOCK_SIZE=BLOCK_SIZE, num_warps=num_warps, num_ctas=1) ctx.save_for_backward(x, weight, bias, mean, rstd) ctx.BLOCK_SIZE = BLOCK_SIZE ctx.num_warps = num_warps @@ -287,7 +287,7 @@ def backward(ctx, dy): # accumulate partial sums in separate kernel _layer_norm_bwd_dwdb[grid](_dw, _db, dw, db, GROUP_SIZE_M, N, BLOCK_SIZE_M=32, - BLOCK_SIZE_N=128) + BLOCK_SIZE_N=128, num_ctas=1) return dx, None, dw, db, None @@ -345,19 +345,21 @@ def bench_layer_norm(M, N, dtype, provider, mode='backward', eps=1e-5, device='c quantiles = [0.5, 0.2, 0.8] # utility functions if provider == 'triton': - y_fwd = lambda: layer_norm(x, w_shape, weight, bias, eps) + def y_fwd(): return layer_norm(x, w_shape, weight, bias, eps) # noqa: F811, E704 if provider == 'torch': - y_fwd = lambda: torch.nn.functional.layer_norm(x, w_shape, weight, bias, eps) + def y_fwd(): return torch.nn.functional.layer_norm(x, w_shape, weight, bias, eps) # noqa: F811, E704 if provider == 'apex': - apex_layer_norm = apex.normalization.FusedLayerNorm(w_shape).to(x.device).to(x.dtype) - y_fwd = lambda: apex_layer_norm(x) + apex_layer_norm = apex.normalization.FusedLayerNorm( + w_shape).to(x.device).to(x.dtype) + + def y_fwd(): return apex_layer_norm(x) # noqa: F811, E704 # forward pass if mode == 'forward': gbps = lambda ms: 2 * x.numel() * x.element_size() / ms * 1e-6 ms, min_ms, max_ms = triton.testing.do_bench(y_fwd, quantiles=quantiles, rep=500) # backward pass if mode == 'backward': - gbps = lambda ms: 3 * x.numel() * x.element_size() / ms * 1e-6 + def gbps(ms): return 3 * x.numel() * x.element_size() / ms * 1e-6 # noqa: F811, E704 y = y_fwd() ms, min_ms, max_ms = triton.testing.do_bench(lambda: y.backward(dy, retain_graph=True), quantiles=quantiles, grad_to_none=[x], rep=500) diff --git a/python/tutorials/09-experimental-tma-matrix-multiplication.py b/python/tutorials/09-experimental-tma-matrix-multiplication.py new file mode 100644 index 000000000000..62a0627d813f --- /dev/null +++ b/python/tutorials/09-experimental-tma-matrix-multiplication.py @@ -0,0 +1,188 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl + + +@triton.autotune( + configs=[ + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=7, num_warps=4), + # triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=7, num_warps=4, num_ctas=2), + # triton.Config({'BLOCK_SIZE_M': 512, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=7, num_warps=4, num_ctas=4), + ], + key=['M', 'N', 'K'], +) +@triton.jit +def matmul_kernel( + a_ptr, b_ptr, z_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_zm, stride_zn, + BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, + A_ORDER_0: tl.constexpr, A_ORDER_1: tl.constexpr, + B_ORDER_0: tl.constexpr, B_ORDER_1: tl.constexpr +): + pid = tl.program_id(axis=0) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + block_offset_m = pid_m * BLOCK_SIZE_M + block_offset_n = pid_n * BLOCK_SIZE_N + + a_tile_ptr = tl.make_block_ptr(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), + offsets=(block_offset_m, 0), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_K), order=(A_ORDER_0, A_ORDER_1)) + b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), + offsets=(0, block_offset_n), block_shape=(BLOCK_SIZE_K, BLOCK_SIZE_N), order=(B_ORDER_0, B_ORDER_1)) + z = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + + offs_m = block_offset_m + tl.arange(0, BLOCK_SIZE_M) + offs_n = block_offset_n + tl.arange(0, BLOCK_SIZE_N) + z_ptrs = z_ptr + offs_m[:, None] * stride_zm + offs_n[None, :] * stride_zn + mask = (offs_m < M)[:, None] & (offs_n < N)[None, :] + + for k in range(0, K, BLOCK_SIZE_K): + a = tl.load(a_tile_ptr) + b = tl.load(b_tile_ptr) + z += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_SIZE_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_SIZE_K, 0]) + + z = z.to(tl.float16) + + tl.store(z_ptrs, z, mask=mask) + + +def matmul(a, b, a_order, b_order): + # checks constraints + assert a.shape[1] == b.shape[0], "incompatible dimensions" + M, K = a.shape + K, N = b.shape + + z = torch.empty((M, N), device=a.device, dtype=torch.float16) + + def grid(META): + return (triton.cdiv(M, META['BLOCK_SIZE_M']) * triton.cdiv(N, META['BLOCK_SIZE_N']),) + matmul_kernel[grid](a_ptr=a, b_ptr=b, z_ptr=z, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_zm=z.stride(0), stride_zn=z.stride(1), + A_ORDER_0=a_order[0], A_ORDER_1=a_order[1], + B_ORDER_0=b_order[0], B_ORDER_1=b_order[1] + ) + return z + + +problem_list = [ + [2048, 512, 512, False, True], + [2048, 1024, 1024, False, False], + [2048, 2048, 2048, True, False], + [2048, 4096, 4096, True, True], +] + + +def test_matmul(): + for case in problem_list: + M, N, K, TRANS_A, TRANS_B = case + print(M, N, K, TRANS_A, TRANS_B) + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + a_order = [0, 1] + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + a_order = [1, 0] + + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + b_order = [0, 1] + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + b_order = [1, 0] + + golden = torch.matmul(a, b) + z = matmul(a, b, a_order, b_order) + + golden = torch.nn.functional.normalize(golden) + z = torch.nn.functional.normalize(z) + torch.set_printoptions(profile="full") + assert_close(z, golden, rtol=1e-2, atol=1e-3, check_dtype=False) + + +@triton.testing.perf_report( + triton.testing.Benchmark( + # argument names to use as an x-axis for the plot + x_names=['M', 'N', 'K', 'TRANS_A', 'TRANS_B'], + x_vals=problem_list, # different possible values for `x_name` + line_arg='provider', + # argument name whose value corresponds to a different line in the plot + # possible values for `line_arg`` + line_vals=['cublas', 'triton'], + # label name for the lines + line_names=["cuBLAS", "Triton"], + # line styles + styles=[('green', '-'), ('green', '--'), + ('blue', '-'), ('blue', '--')], + ylabel="TFLOPS", # label name for the y-axis + plot_name="matmul-performance", + # name for the plot. Used also as a file name for saving the plot. + args={}, + ) +) +def benchmark(M, N, K, TRANS_A, TRANS_B, provider): + if (TRANS_A): + a = torch.randn((K, M), device='cuda', dtype=torch.float16).T + a_order = [0, 1] + else: + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + a_order = [1, 0] + + if (TRANS_B): + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + b_order = [0, 1] + else: + b = torch.randn((K, N), device='cuda', dtype=torch.float16) + b_order = [1, 0] + + quantiles = [0.5, 0.2, 0.8] + if provider == 'cublas': + ms, min_ms, max_ms = triton.testing.do_bench( + lambda: torch.matmul(a, b), rep=100, quantiles=quantiles, fast_flush=False) + if provider == 'triton': + ms, min_ms, max_ms = triton.testing.do_bench( + lambda: matmul(a, b, a_order, b_order), rep=100, quantiles=quantiles, fast_flush=False) + + def perf(ms): + return 2 * M * N * K * 1e-12 / (ms * 1e-3) + return perf(ms), perf(max_ms), perf(min_ms) + + +test_matmul() +benchmark.run(show_plots=False, print_data=True) diff --git a/python/tutorials/10-experimental-tmastg-matrix-multiplication.py b/python/tutorials/10-experimental-tmastg-matrix-multiplication.py new file mode 100644 index 000000000000..a6c081850a19 --- /dev/null +++ b/python/tutorials/10-experimental-tmastg-matrix-multiplication.py @@ -0,0 +1,191 @@ +# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import torch +from torch.testing import assert_close + +import triton +import triton.language as tl + + +@triton.autotune( + configs=[ + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=7, num_warps=4), + # triton.Config({'BLOCK_SIZE_M': 512, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=7, num_warps=4, num_ctas=4), + ], + key=['M', 'N', 'K'], +) +@triton.jit +def matmul_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, + GROUP_SIZE_M: tl.constexpr, +): + pid = tl.program_id(axis=0) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + block_offset_m = pid_m * BLOCK_SIZE_M + block_offset_n = pid_n * BLOCK_SIZE_N + + a_tile_ptr = tl.make_block_ptr( + base=a_ptr, shape=( + M, K), strides=( + stride_am, stride_ak), offsets=( + block_offset_m, 0), block_shape=( + BLOCK_SIZE_M, BLOCK_SIZE_K), order=( + 1, 0)) + b_tile_ptr = tl.make_block_ptr( + base=b_ptr, shape=( + K, N), strides=( + stride_bk, stride_bn), offsets=( + 0, block_offset_n), block_shape=( + BLOCK_SIZE_K, BLOCK_SIZE_N), order=( + 0, 1)) + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + + for k in range(0, K, BLOCK_SIZE_K): + a = tl.load(a_tile_ptr) + b = tl.load(b_tile_ptr) + accumulator += tl.dot(a, b) + a_tile_ptr = tl.advance(a_tile_ptr, [0, BLOCK_SIZE_K]) + b_tile_ptr = tl.advance(b_tile_ptr, [BLOCK_SIZE_K, 0]) + + c_block_ptr = tl.make_block_ptr(base=c_ptr, shape=(M, N), strides=(stride_cm, stride_cn), + offsets=(block_offset_m, block_offset_n), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_N), order=(1, 0)) + + tl.store(c_block_ptr, accumulator) + + +def get_variant_golden(a, b): + SIZE_M = a.shape[0] + SIZE_K = a.shape[1] + SIZE_N = b.shape[1] + assert a.shape[1] == b.shape[0] + zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() + zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() + zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() + zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() + a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) + a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) + b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) + b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) + c_padded = torch.matmul(a_padded, b_padded) + return c_padded[:SIZE_M, :SIZE_N] + + +def get_proper_err(a, b, golden): + golden_variant = get_variant_golden(a, b) + golden_diff = golden - golden_variant + golden_abs_err = torch.max(torch.abs(golden_diff)).item() + golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() + return (golden_abs_err, golden_rel_err) + + +def matmul(a, b): + # checks constraints + assert a.shape[1] == b.shape[0], "incompatible dimensions" + M, K = a.shape + K, N = b.shape + assert ( + K % 32 == 0 + ), "We don't check memory-out-of-bounds with K so K must be divisible by BLOCK_SIZE_K" + + c = torch.empty((M, N), device=a.device, dtype=torch.float32) + + def grid(META): + return (triton.cdiv(M, META['BLOCK_SIZE_M']) * triton.cdiv(N, META['BLOCK_SIZE_N']),) + + matmul_kernel[grid](a_ptr=a, b_ptr=b, c_ptr=c, + M=M, N=N, K=K, + stride_am=a.stride(0), stride_ak=a.stride(1), + stride_bk=b.stride(0), stride_bn=b.stride(1), + stride_cm=c.stride(0), stride_cn=c.stride(1)) + return c + + +a = torch.randn((512, 512), device='cuda', dtype=torch.float16) +b = torch.randn((512, 512), device='cuda', dtype=torch.float16).T +c = matmul(a, b) + +golden = torch.matmul(a, b) +golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) +torch.set_printoptions(profile="full") +assert_close( + c, + golden, + rtol=max(1e-4, 1.5 * golden_rel_err), + atol=max(1e-4, 1.5 * golden_abs_err), + check_dtype=False) + + +@triton.testing.perf_report( + triton.testing.Benchmark( + # argument names to use as an x-axis for the plot + x_names=['M', 'N', 'K'], + x_vals=[ + [2048, 512, 512], + [2048, 1024, 1024], + [2048, 2048, 2048], + [2048, 4096, 4096], + [2048, 8192, 8192] + ], # different possible values for `x_name` + line_arg='provider', + # argument name whose value corresponds to a different line in the plot + # possible values for `line_arg`` + line_vals=['cublas', 'triton'], + # label name for the lines + line_names=["cuBLAS", "Triton"], + # line styles + styles=[('green', '-'), ('green', '--'), + ('blue', '-'), ('blue', '--')], + ylabel="TFLOPS", # label name for the y-axis + plot_name="matmul-performance", + # name for the plot. Used also as a file name for saving the plot. + args={}, + ) +) +def benchmark(M, N, K, provider): + a = torch.randn((M, K), device='cuda', dtype=torch.float16) + b = torch.randn((N, K), device='cuda', dtype=torch.float16).T + quantiles = [0.5, 0.2, 0.8] + if provider == 'cublas': + ms, min_ms, max_ms = triton.testing.do_bench( + lambda: torch.matmul(a, b), rep=100, quantiles=quantiles, fast_flush=False) + if provider == 'triton': + ms, min_ms, max_ms = triton.testing.do_bench( + lambda: matmul(a, b), rep=100, quantiles=quantiles, fast_flush=False) + + def perf(ms): + return 2 * M * N * K * 1e-12 / (ms * 1e-3) + return perf(ms), perf(max_ms), perf(min_ms) + + +benchmark.run(show_plots=False, print_data=True) diff --git a/test/Analysis/test-alias.mlir b/test/Analysis/test-alias.mlir index 6a5b2e5f5375..75740d929da2 100644 --- a/test/Analysis/test-alias.mlir +++ b/test/Analysis/test-alias.mlir @@ -75,6 +75,20 @@ tt.func @insert_slice_async(%A : !tt.ptr, %i1 : i1) { tt.return } +// CHECK-LABEL: insert_slice_async_v2 +tt.func @insert_slice_async_v2(%A : !tt.ptr, %i1 : i1) { + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %a_ptr = tt.broadcast %A : (!tt.ptr) -> tensor<16x16x!tt.ptr, #AL> + %mask = tt.splat %i1 : (i1) -> tensor<16x16xi1, #AL> + %other = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #AL> + // CHECK: %cst_0 -> %cst_0 + %tensor = arith.constant dense<0.000000e+00> : tensor<1x16x16xf16, #A_SHARED> + %index = arith.constant 0 : i32 + // CHECK: %3 -> %cst_0 + %a = triton_nvidia_gpu.insert_slice_async_v2 %a_ptr, %tensor, %index, %mbar, %mask, %other {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, operand_segment_sizes = array} : tensor<16x16x!tt.ptr, #AL>, tensor<1x16x16xf16, #A_SHARED>, i32, !tt.ptr, tensor<16x16xi1, #AL>, tensor<16x16xf16, #AL> -> tensor<1x16x16xf16, #A_SHARED> + tt.return +} + // CHECK-LABEL: insert_slice tt.func @insert_slice(%A : !tt.ptr, %i1 : i1) { %a_ptr = tt.broadcast %A : (!tt.ptr) -> tensor<16x16x!tt.ptr, #AL> @@ -99,6 +113,16 @@ tt.func @extract_slice(%A : !tt.ptr) { tt.return } +// CHECK-LABEL: extract_m_barrier +tt.func @extract_m_barrier() { + // CHECK: %0 -> %0 + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : tensor<2xi64, #A_SHARED> + %c0 = arith.constant 0 : i32 + // CHECK: %1 -> %0 + %mbar0 = triton_nvidia_gpu.extract_mbarrier %mbar[%c0] : tensor<2xi64, #A_SHARED>, i32 -> !tt.ptr + tt.return +} + // CHECK-LABEL: if_cat tt.func @if_cat(%i1 : i1) { // CHECK: %cst -> %cst diff --git a/test/Analysis/test-allocation.mlir b/test/Analysis/test-allocation.mlir index 6db70b2ac591..93d80448c998 100644 --- a/test/Analysis/test-allocation.mlir +++ b/test/Analysis/test-allocation.mlir @@ -1,14 +1,14 @@ // RUN: triton-opt %s -split-input-file --mlir-disable-threading -test-print-allocation 2>&1 | FileCheck %s -#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #sliceAd0 = #triton_gpu.slice<{dim = 0, parent = #AL}> -#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0]}> -#A_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -#A_SHARED_T = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [0, 1]}> -#B_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1]}> -#A_DOT = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> -#B_DOT = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_SHARED_T = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#B_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_DOT = #triton_gpu.dot_op<{opIdx = 0, parent = #C}> +#B_DOT = #triton_gpu.dot_op<{opIdx = 1, parent = #C}> module attributes {"triton_gpu.num-warps" = 4 : i32} { @@ -28,10 +28,10 @@ tt.func @matmul_loop(%lb : index, %ub : index, %step : index, %A : !tt.ptr, scf.for %iv = %lb to %ub step %step iter_args(%a_ptr = %a_ptr_init, %b_ptr = %b_ptr_init, %prev_c = %c_init) -> (tensor<128x32x!tt.ptr, #AL>, tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C>) { %a_ = tt.load %a_ptr, %a_mask, %a_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> - // CHECK: scratch offset = 0, size = 4608 + // CHECK: offset = 0, size = 4608 %a = triton_gpu.convert_layout %a_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A_DOT> %b_ = tt.load %b_ptr, %b_mask, %b_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #BL> - // CHECK-NEXT: scratch offset = 0, size = 4224 + // CHECK-NEXT: offset = 0, size = 4224 %b = triton_gpu.convert_layout %b_ : (tensor<32x128xf16, #BL>) -> tensor<32x128xf16, #B_DOT> %c = tt.dot %a, %b, %prev_c {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A_DOT> * tensor<32x128xf16, #B_DOT> -> tensor<128x128xf32, #C> @@ -56,17 +56,17 @@ tt.func @reusable(%A : !tt.ptr) { %a_ptr = tt.broadcast %A : (!tt.ptr) -> tensor<128x32x!tt.ptr, #AL> %b_ptr = tt.broadcast %A : (!tt.ptr) -> tensor<32x128x!tt.ptr, #AL> %a1_ = tt.load %a_ptr, %cst1, %cst2 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> - // CHECK-NEXT: scratch offset = 0, size = 4608 + // CHECK-NEXT: offset = 0, size = 4608 %a1 = triton_gpu.convert_layout %a1_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A_DOT> %a2_ = tt.load %b_ptr, %cst3, %cst4 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #AL> - // CHECK-NEXT: scratch offset = 0, size = 1152 + // CHECK-NEXT: offset = 0, size = 1152 %a2 = triton_gpu.convert_layout %a2_ : (tensor<32x128xf16, #AL>) -> tensor<32x128xf16, #B_DOT> %a3_ = tt.load %a_ptr, %cst1, %cst2 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> - // CHECK-NEXT: scratch offset = 0, size = 4608 + // CHECK-NEXT: offset = 0, size = 4608 %a3 = triton_gpu.convert_layout %a3_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A_DOT> %c = tt.dot %a1, %a2, %c_init {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A_DOT> * tensor<32x128xf16, #B_DOT> -> tensor<128x128xf32, #C> %a4_ = tt.load %b_ptr, %cst3, %cst4 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #AL> - // CHECK-NEXT: scratch offset = 0, size = 1152 + // CHECK-NEXT: offset = 0, size = 1152 %a4 = triton_gpu.convert_layout %a4_ : (tensor<32x128xf16, #AL>) -> tensor<32x128xf16, #B_DOT> %c1 = tt.dot %a3, %a4, %c {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A_DOT> * tensor<32x128xf16, #B_DOT> -> tensor<128x128xf32, #C> tt.return @@ -83,11 +83,11 @@ tt.func @preallocate(%A : !tt.ptr) { %cst0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> // CHECK-NEXT: offset = 1024, size = 512 %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 512 + // CHECK-NEXT: offset = 2048, size = 512 %cst2 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 2048, size = 1024 - %a = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> // CHECK-NEXT: offset = 3072, size = 1024 + %a = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> + // CHECK-NEXT: offset = 4096, size = 1024 %b = tt.cat %cst0, %cst2 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> // CHECK-NEXT: offset = 0, size = 1024 %c = tt.cat %cst1, %cst2 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> @@ -118,12 +118,12 @@ tt.func @unused(%A : !tt.ptr) { %cst0 = arith.constant dense<0.000000e+00> : tensor<32x16xf16, #A_SHARED> // CHECK-NEXT: offset = 0, size = 512 %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst2 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %a = tt.cat %cst1, %cst2 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return - // CHECK: size = 2048 + // CHECK: size = 3072 } // cst0 is alive through the entire function, it cannot be released before the end of the function @@ -131,28 +131,28 @@ tt.func @unused(%A : !tt.ptr) { tt.func @longlive(%A : !tt.ptr) { // CHECK: offset = 0, size = 512 %cst0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 - %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> // CHECK-NEXT: offset = 1024, size = 512 + %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> + // CHECK-NEXT: offset = 2048, size = 512 %cst2 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 1024 + // CHECK-NEXT: offset = 3072, size = 1024 %a = tt.cat %cst1, %cst2 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 - %cst3 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> // CHECK-NEXT: offset = 1024, size = 512 + %cst3 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> + // CHECK-NEXT: offset = 2048, size = 512 %cst4 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 1024 + // CHECK-NEXT: offset = 3072, size = 1024 %b = tt.cat %cst3, %cst4 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 512 + // CHECK-NEXT: offset = 3072, size = 512 %cst5 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 512 + // CHECK-NEXT: offset = 3072, size = 512 %cst6 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 1024 + // CHECK-NEXT: offset = 3072, size = 1024 %c = tt.cat %cst3, %cst4 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 1024 + // CHECK-NEXT: offset = 1024, size = 1024 %d = tt.cat %cst0, %cst0 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return - // CHECK-NEXT: size = 2560 + // CHECK-NEXT: size = 4096 } // This example triggers graph coloring with > 1 colors. @@ -160,12 +160,12 @@ tt.func @longlive(%A : !tt.ptr) { tt.func @multi_color(%A : !tt.ptr) { // CHECK: offset = 0, size = 64 %cst = arith.constant dense<0.000000e+00> : tensor<4x8xf16, #A_SHARED> - // CHECK-NEXT: offset = 1216, size = 32 + // CHECK-NEXT: offset = 1536, size = 32 %cst_0 = arith.constant dense<0.000000e+00> : tensor<4x4xf16, #A_SHARED> - // CHECK-NEXT: offset = 1248, size = 128 + // CHECK-NEXT: offset = 1664, size = 128 %cst_1 = arith.constant dense<0.000000e+00> : tensor<16x4xf16, #A_SHARED> %cst_2 = arith.constant dense<0.000000e+00> : tensor<16x32xf16, #AL> - // CHECK-NEXT: scratch offset = 64, size = 1152 + // CHECK-NEXT: scratch offset = 128, size = 1152 %0 = triton_gpu.convert_layout %cst_2 : (tensor<16x32xf16, #AL>) -> tensor<16x32xf16, #AL> %1 = triton_gpu.convert_layout %cst : (tensor<4x8xf16, #A_SHARED>) -> tensor<4x8xf16, #AL> // CHECK-NEXT: offset = 0, size = 128 @@ -179,16 +179,16 @@ tt.func @multi_color(%A : !tt.ptr) { %cst_5 = arith.constant dense<0.000000e+00> : tensor<4x8xf16, #A_SHARED> %4 = triton_gpu.convert_layout %cst_5 : (tensor<4x8xf16, #A_SHARED>) -> tensor<4x8xf16, #AL> %5 = triton_gpu.convert_layout %cst_5 : (tensor<4x8xf16, #A_SHARED>) -> tensor<4x8xf16, #AL> - // CHECK-NEXT: offset = 256, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst_6 = arith.constant dense<0.000000e+00> : tensor<8x32xf16, #A_SHARED> - // CHECK-NEXT: offset = 2528, size = 128 + // CHECK-NEXT: offset = 3104, size = 128 %cst_7 = arith.constant dense<0.000000e+00> : tensor<2x32xf16, #A_SHARED> %6 = triton_gpu.convert_layout %cst_0 : (tensor<4x4xf16, #A_SHARED>) -> tensor<4x4xf16, #AL> - // CHECK-NEXT: offset = 256, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst_8 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> // CHECK-NEXT: offset = 256, size = 32 %cst_9 = arith.constant dense<0.000000e+00> : tensor<4x4xf16, #A_SHARED> - // CHECK-NEXT: offset = 256, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst_10 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> %7 = triton_gpu.convert_layout %cst_1 : (tensor<16x4xf16, #A_SHARED>) -> tensor<16x4xf16, #AL> %8 = triton_gpu.convert_layout %cst_4 : (tensor<4x32xf16, #A_SHARED>) -> tensor<4x32xf16, #AL> @@ -198,7 +198,7 @@ tt.func @multi_color(%A : !tt.ptr) { %10 = triton_gpu.convert_layout %cst_7 : (tensor<2x32xf16, #A_SHARED>) -> tensor<2x32xf16, #AL> %cst_12 = arith.constant dense<0.000000e+00> : tensor<4x16xf16, #AL> %cst_13 = arith.constant dense<0.000000e+00> : tensor<8x32xf16, #AL> - // CHECK-NEXT: size = 2656 + // CHECK-NEXT: size = 3232 tt.return } @@ -207,15 +207,15 @@ tt.func @multi_color(%A : !tt.ptr) { tt.func @multi_color_multi_rounds(%arg0: !tt.ptr) { // CHECK: offset = 0, size = 32 %cst = arith.constant dense<0.000000e+00> : tensor<4x4xf16, #A_SHARED> - // CHECK-NEXT: offset = 1184, size = 128 + // CHECK-NEXT: offset = 1280, size = 128 %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x4xf16, #A_SHARED> - // CHECK-NEXT: offset = 1312, size = 8192 + // CHECK-NEXT: offset = 2048, size = 8192 %cst_1 = arith.constant dense<0.000000e+00> : tensor<1024x4xf16, #A_SHARED> %cst_2 = arith.constant dense<0.000000e+00> : tensor<16x32xf16, #AL> - // CHECK-NEXT: scratch offset = 32, size = 1152 + // CHECK-NEXT: scratch offset = 128, size = 1152 %0 = triton_gpu.convert_layout %cst_2 : (tensor<16x32xf16, #AL>) -> tensor<16x32xf16, #AL> %1 = triton_gpu.convert_layout %cst : (tensor<4x4xf16, #A_SHARED>) -> tensor<4x4xf16, #AL> - // CHECK-NEXT: offset = 11968, size = 128 + // CHECK-NEXT: offset = 1152, size = 128 %cst_3 = arith.constant dense<0.000000e+00> : tensor<2x32xf16, #A_SHARED> %2 = triton_gpu.convert_layout %cst : (tensor<4x4xf16, #A_SHARED>) -> tensor<4x4xf16, #AL> // CHECK-NEXT: offset = 0, size = 512 @@ -225,7 +225,7 @@ tt.func @multi_color_multi_rounds(%arg0: !tt.ptr) { // CHECK-NEXT: scratch offset = 0, size = 1152 %5 = triton_gpu.convert_layout %cst_2 : (tensor<16x32xf16, #AL>) -> tensor<16x32xf16, #AL> %6 = triton_gpu.convert_layout %cst_3 : (tensor<2x32xf16, #A_SHARED>) -> tensor<2x32xf16, #AL> - // CHECK-NEXT: size = 12096 + // CHECK-NEXT: size = 10240 tt.return } @@ -241,6 +241,27 @@ tt.func @alloc(%A : !tt.ptr) { // CHECK-NEXT: size = 512 } +// mbarrier's shared memory cannot be reused +// CHECK-LABEL: alloc_m_barrier +tt.func @alloc_m_barrier() { + // CHECK: offset = 0, size = 16 + %mbar0 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : tensor<2xi64, #A_SHARED> + // CHECK-NEXT: offset = 16, size = 16 + %mbar1 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : tensor<2xi64, #A_SHARED> + // CHECK-NEXT: size = 32 + tt.return +} + +// CHECK-LABEL: alloc_m_barrier_scalar +tt.func @alloc_m_barrier_scalar() { + // CHECK: offset = 0, size = 8 + %mbar0 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + // CHECK-NEXT: offset = 8, size = 8 + %mbar1 = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + // CHECK-NEXT: size = 16 + tt.return +} + // CHECK-LABEL: scratch tt.func @scratch() { %cst0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #AL> @@ -291,22 +312,22 @@ tt.func @extract_slice(%A : !tt.ptr) { tt.func @if(%i1 : i1) { // CHECK: offset = 0, size = 512 %cst0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> scf.if %i1 { - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %a = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %b = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> } // CHECK-NEXT: offset = 0, size = 512 %cst2 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst3 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %a = tt.cat %cst2, %cst3 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return - // CHECK-NEXT: size = 2048 + // CHECK-NEXT: size = 3072 } // B0 -> (B1) -> (B2) -> B0 @@ -315,25 +336,25 @@ tt.func @if(%i1 : i1) { tt.func @if_else(%i1 : i1) { // CHECK: offset = 0, size = 512 %cst0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 512, size = 512 + // CHECK-NEXT: offset = 1024, size = 512 %cst1 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> scf.if %i1 { - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %a = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %b = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> } else { - // CHECK-NEXT: offset = 1024, size = 512 + // CHECK-NEXT: offset = 2048, size = 512 %cst2 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 1536, size = 512 + // CHECK-NEXT: offset = 3072, size = 512 %cst3 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> - // CHECK-NEXT: offset = 2048, size = 1024 + // CHECK-NEXT: offset = 4096, size = 1024 %a = tt.cat %cst2, %cst3 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> } - // CHECK-NEXT: offset = 1024, size = 1024 + // CHECK-NEXT: offset = 2048, size = 1024 %a = tt.cat %cst0, %cst1 {axis = 0} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return - // CHECK-NEXT: size = 3072 + // CHECK-NEXT: size = 5120 } // Block arguments and yields are memory aliases that do not trigger a new diff --git a/test/Analysis/test-membar.mlir b/test/Analysis/test-membar.mlir index 621dd10e2cdd..63b4ef5d2ca1 100644 --- a/test/Analysis/test-membar.mlir +++ b/test/Analysis/test-membar.mlir @@ -1,14 +1,14 @@ // RUN: triton-opt %s -split-input-file --mlir-disable-threading --convert-scf-to-cf -test-print-membar 2>&1 | FileCheck %s -#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #sliceAd0 = #triton_gpu.slice<{dim = 0, parent = #AL}> -#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0]}> -#A_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -#A_SHARED_T = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [0, 1]}> -#B_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1]}> -#A_DOT = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> -#B_DOT = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_SHARED_T = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#B_SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A_DOT = #triton_gpu.dot_op<{opIdx = 0, parent = #C}> +#B_DOT = #triton_gpu.dot_op<{opIdx = 1, parent = #C}> module attributes {"triton_gpu.num-warps" = 4 : i32} { @@ -447,58 +447,58 @@ tt.func @for_if_for(%lb : index, %ub : index, %step : index, %A : !tt.ptr, // CHECK-LABEL: cf_if tt.func @cf_if(%i1 : i1) { - %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> - %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> + %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> cf.cond_br %i1, ^bb1, ^bb2 ^bb1: // pred: ^bb0 // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> cf.br ^bb2 ^bb2: // 2 preds: ^bb0, ^bb1 // CHECK: gpu.barrier // CHECK-NEXT: triton_gpu.convert_layout - %1 = triton_gpu.convert_layout %cst : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<16x16xf16, #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}>> + %1 = triton_gpu.convert_layout %cst : (tensor<16x16xf16, #A_SHARED>) -> tensor<16x16xf16, #AL> tt.return } tt.func @cf_if_else(%i1 : i1) { - %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> - %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> + %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> cf.cond_br %i1, ^bb1, ^bb2 ^bb1: // pred: ^bb0 // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> - cf.br ^bb3(%0 : tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) + %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> + cf.br ^bb3(%0 : tensor<32x16xf16, #A_SHARED>) ^bb2: // pred: ^bb0 // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %1 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> - cf.br ^bb3(%1 : tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -^bb3(%2: tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>): // 2 preds: ^bb1, ^bb2 + %1 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> + cf.br ^bb3(%1 : tensor<32x16xf16, #A_SHARED>) +^bb3(%2: tensor<32x16xf16, #A_SHARED>): // 2 preds: ^bb1, ^bb2 cf.br ^bb4 ^bb4: // pred: ^bb3 - %3 = triton_gpu.convert_layout %cst : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<16x16xf16, #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}>> + %3 = triton_gpu.convert_layout %cst : (tensor<16x16xf16, #A_SHARED>) -> tensor<16x16xf16, #AL> // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %4 = tt.cat %2, %2 {axis = 0 : i64} : (tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<64x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %4 = tt.cat %2, %2 {axis = 0 : i64} : (tensor<32x16xf16, #A_SHARED>, tensor<32x16xf16, #A_SHARED>) -> tensor<64x16xf16, #A_SHARED> tt.return } tt.func @cf_if_else_return(%i1 : i1) { - %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> - %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %cst = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> + %cst_0 = arith.constant dense<0.000000e+00> : tensor<16x16xf16, #A_SHARED> cf.cond_br %i1, ^bb1, ^bb2 ^bb1: // pred: ^bb0 // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %0 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return ^bb2: // pred: ^bb0 // CHECK: gpu.barrier // CHECK-NEXT: tt.cat - %1 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>, tensor<16x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>>) -> tensor<32x16xf16, #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}>> + %1 = tt.cat %cst, %cst_0 {axis = 0 : i64} : (tensor<16x16xf16, #A_SHARED>, tensor<16x16xf16, #A_SHARED>) -> tensor<32x16xf16, #A_SHARED> tt.return } diff --git a/test/Conversion/triton_ops.mlir b/test/Conversion/triton_ops.mlir index 4acfbb1e8166..16687c71a334 100644 --- a/test/Conversion/triton_ops.mlir +++ b/test/Conversion/triton_ops.mlir @@ -2,9 +2,9 @@ tt.func @cast_ops(%scalar_ptr: !tt.ptr, %scalar_f32: f32, %scalar_i64: i64) { // scalar -> scalar - // CHECK: i64 -> !tt.ptr + // CHECK: i64 -> !tt.ptr %0 = tt.int_to_ptr %scalar_i64 : i64 -> !tt.ptr - // CHECK: !tt.ptr -> i64 + // CHECK: !tt.ptr -> i64 %1 = tt.ptr_to_int %scalar_ptr : !tt.ptr -> i64 // CHECK: f32 to f16 %2 = arith.truncf %scalar_f32 : f32 to f16 @@ -14,9 +14,9 @@ tt.func @cast_ops(%scalar_ptr: !tt.ptr, %scalar_f32: f32, %scalar_i64: i64) %tensor_f32_0d = tt.splat %scalar_f32 : (f32) -> tensor %tensor_i64_0d = tt.splat %scalar_i64 : (i64) -> tensor - // CHECK: tensor -> tensor> + // CHECK: tensor -> tensor> %3 = tt.int_to_ptr %tensor_i64_0d : tensor -> tensor> - // CHECK: tensor> -> tensor + // CHECK: tensor> -> tensor %4 = tt.ptr_to_int %tensor_ptr_0d : tensor> -> tensor // CHECK: tensor to tensor %5 = arith.truncf %tensor_f32_0d : tensor to tensor @@ -26,9 +26,9 @@ tt.func @cast_ops(%scalar_ptr: !tt.ptr, %scalar_f32: f32, %scalar_i64: i64) %tensor_f32_1d = tt.splat %scalar_f32 : (f32) -> tensor<16xf32> %tensor_i64_1d = tt.splat %scalar_i64 : (i64) -> tensor<16xi64> - // CHECK: tensor<16xi64> -> tensor<16x!tt.ptr> + // CHECK: tensor<16xi64> -> tensor<16x!tt.ptr> %6 = tt.int_to_ptr %tensor_i64_1d : tensor<16xi64> -> tensor<16x!tt.ptr> - // CHECK: tensor<16x!tt.ptr> -> tensor<16xi64> + // CHECK: tensor<16x!tt.ptr> -> tensor<16xi64> %7 = tt.ptr_to_int %tensor_ptr_1d : tensor<16x!tt.ptr> -> tensor<16xi64> // CHECK: tensor<16xf32> to tensor<16xf16> %8 = arith.truncf %tensor_f32_1d : tensor<16xf32> to tensor<16xf16> @@ -37,19 +37,19 @@ tt.func @cast_ops(%scalar_ptr: !tt.ptr, %scalar_f32: f32, %scalar_i64: i64) tt.func @addptr_ops(%scalar_ptr: !tt.ptr, %scalar_i32: i32) { // scalar -> scalar - // CHECK: !tt.ptr + // CHECK: !tt.ptr %0 = tt.addptr %scalar_ptr, %scalar_i32 : !tt.ptr, i32 // 0D tensor -> 0D tensor %tensor_ptr_0d = tt.splat %scalar_ptr : (!tt.ptr) -> tensor> %tensor_i32_0d = tt.splat %scalar_i32 : (i32) -> tensor - // CHECK: tensor> + // CHECK: tensor> %1 = tt.addptr %tensor_ptr_0d, %tensor_i32_0d : tensor>, tensor // 1D tensor -> 1D tensor %tensor_ptr_1d = tt.splat %scalar_ptr : (!tt.ptr) -> tensor<16x!tt.ptr> %tensor_i32_1d = tt.splat %scalar_i32 : (i32) -> tensor<16xi32> - // CHECK: tensor<16x!tt.ptr> + // CHECK: tensor<16x!tt.ptr> %2 = tt.addptr %tensor_ptr_1d, %tensor_i32_1d : tensor<16x!tt.ptr>, tensor<16xi32> tt.return } diff --git a/test/Conversion/triton_to_tritongpu.mlir b/test/Conversion/triton_to_tritongpu.mlir index 7a0f4b08abd0..185d88906d32 100644 --- a/test/Conversion/triton_to_tritongpu.mlir +++ b/test/Conversion/triton_to_tritongpu.mlir @@ -1,7 +1,7 @@ // RUN: triton-opt %s -split-input-file -convert-triton-to-tritongpu=num-warps=2 | FileCheck %s tt.func @ops() { - // CHECK: module attributes {"triton_gpu.num-warps" = 2 : i32, "triton_gpu.threads-per-warp" = 32 : i32} {{.*}} + // CHECK: module attributes {"triton_gpu.compute-capability" = 80 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32, "triton_gpu.threads-per-warp" = 32 : i32} {{.*}} %a = arith.constant dense<1.00e+00> : tensor<128x32xf16> %b = arith.constant dense<2.00e+00> : tensor<32x128xf16> %c = arith.constant dense<3.00e+00> : tensor<128x128xf32> @@ -33,10 +33,10 @@ tt.func @load_ops(%ptr: !tt.ptr {tt.divisibility = 16 : i32}) { tt.func @reduce_ops(%ptr: !tt.ptr {tt.divisibility = 16 : i32}) { // Test if the total number of threadsPerWarp is 32 // Test if the total number of warps is 2 - // CHECK: #[[blocked0:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 2], order = [0, 1]}> - // CHECK: #[[blocked1:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 2], order = [0, 1]}> - // CHECK: #[[blocked2:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 2], order = [0, 1]}> - // CHECK: module attributes {"triton_gpu.num-warps" = 2 : i32, "triton_gpu.threads-per-warp" = 32 : i32} {{.*}} + // CHECK: #[[blocked0:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> + // CHECK: #[[blocked1:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> + // CHECK: #[[blocked2:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> + // CHECK: module attributes {"triton_gpu.compute-capability" = 80 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32, "triton_gpu.threads-per-warp" = 32 : i32} {{.*}} %c0 = arith.constant dense<1.00e+00> : tensor<4x4xf32> %c1 = arith.constant dense<2.00e+00> : tensor<8x2xf32> %c2 = arith.constant dense<3.00e+00> : tensor<16x16xf32> diff --git a/test/Conversion/tritongpu_to_llvm.mlir b/test/Conversion/tritongpu_to_llvm.mlir index 3b7c66bda561..e74bfceff152 100644 --- a/test/Conversion/tritongpu_to_llvm.mlir +++ b/test/Conversion/tritongpu_to_llvm.mlir @@ -1,9 +1,9 @@ // RUN: triton-opt %s -split-input-file --convert-triton-gpu-to-llvm | FileCheck %s -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK: llvm.func @test_empty_kernel(%arg0: i64, %arg1: !llvm.ptr) // Here the 128 comes from the 4 in module attribute multiples 32 - // CHECK: attributes {nvvm.kernel = 1 : ui1, nvvm.maxntid = [128 : i32]} {{.*}} + // CHECK: nvvm.kernel = 1 : ui1, nvvm.maxntid = [128 : i32] tt.func @test_empty_kernel(%lb : index, %A : !tt.ptr) { // CHECK: llvm.return tt.return @@ -12,8 +12,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_load tt.func @basic_load(%a_ptr_init : tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>, %cst_0 : tensor<256xf32, #blocked0>) { // CHECK: llvm.inline_asm @@ -25,8 +25,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: vectorized_load tt.func @vectorized_load(%a_ptr_init : tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>, %cst_0 : tensor<256xf32, #blocked0>) { // CHECK: llvm.inline_asm @@ -40,8 +40,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: vectorized_load_f16 tt.func @vectorized_load_f16(%a_ptr_init: tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>, %cst_0 : tensor<256xf16, #blocked0>) { // CHECK: llvm.inline_asm @@ -56,8 +56,8 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- // TODO: masked load with vectorization is pending on TODO -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [8], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [8], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: masked_load_const_other tt.func @masked_load_const_other(%a_ptr_init : tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>) { %cst_0 = arith.constant dense<0.000000e+00> : tensor<256xf32, #blocked0> @@ -69,8 +69,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- // TODO: masked load with vectorization is pending on TODO -#blocked0 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [8], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [8], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: masked_load_const_other_vec tt.func @masked_load_const_other_vec(%a_ptr_init : tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>) { %cst_0 = arith.constant dense<0.000000e+00> : tensor<256xf32, #blocked0> @@ -81,8 +81,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: store_with_cache_attr tt.func @store_with_cache_attr(%a_ptr_init : tensor<256x!tt.ptr, #blocked0>, %cst : tensor<256xi1, #blocked0>, %cst_0 : tensor<256xf32, #blocked0>) { // CHECK: llvm.inline_asm @@ -96,8 +96,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}> -module attributes {"triton_gpu.num-warps" = 2 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32} { // CHECK-LABEL: global_load_store_no_vec tt.func @global_load_store_no_vec(%arg0: !tt.ptr {tt.divisibility = 4 : i32}, %arg1: !tt.ptr {tt.divisibility = 4 : i32}, %arg2: !tt.ptr {tt.divisibility = 4 : i32}, %arg3: i32) { %c256_i32 = arith.constant 256 : i32 @@ -148,8 +148,8 @@ module attributes {"triton_gpu.num-warps" = 2 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}> -module attributes {"triton_gpu.num-warps" = 2 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32} { // CHECK-LABEL: global_load_store_vec4 tt.func @global_load_store_vec4(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32) { %c256_i32 = arith.constant 256 : i32 @@ -185,9 +185,9 @@ module attributes {"triton_gpu.num-warps" = 2 : i32} { // ----- // This test verifies the vectorization of Load and Store Ops. -#blocked = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> // Note, the %n_elements doesn't have a "tt.divisibility" hint, so Triton assumes it's divisibility is 1, this should effect the mask's alignment and further restrict the load/store ops' vector width to be 1. -module attributes {"triton_gpu.num-warps" = 2 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32} { tt.func @vecadd_masked_vec1(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %n_elements: i32) { %c64_i32 = arith.constant 64 : i32 %0 = tt.get_program_id x : i32 @@ -215,8 +215,8 @@ module attributes {"triton_gpu.num-warps" = 2 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: global_load_store_vec2 tt.func @global_load_store_vec2(%arg0: !tt.ptr {tt.divisibility = 8 : i32}, %arg1: !tt.ptr {tt.divisibility = 8 : i32}, %arg2: !tt.ptr {tt.divisibility = 8 : i32}, %arg3: i32) { %c256_i32 = arith.constant 256 : i32 @@ -260,8 +260,53 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { + // CHECK-LABEL: global_load_store_vec2 + tt.func @global_load_store_vec2(%arg0: !tt.ptr {tt.divisibility = 8 : i32}, %arg1: !tt.ptr {tt.divisibility = 8 : i32}, %arg2: !tt.ptr {tt.divisibility = 8 : i32}, %arg3: i32) { + %c256_i32 = arith.constant 256 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.muli %0, %c256_i32 : i32 + %2 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #blocked0> + %3 = tt.splat %1 : (i32) -> tensor<256xi32, #blocked0> + %4 = arith.addi %3, %2 : tensor<256xi32, #blocked0> + %5 = tt.splat %arg0 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked0> + %6 = tt.addptr %5, %4 : tensor<256x!tt.ptr, #blocked0>, tensor<256xi32, #blocked0> + %7 = tt.splat %arg1 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked0> + %8 = tt.addptr %7, %4 : tensor<256x!tt.ptr, #blocked0>, tensor<256xi32, #blocked0> + + // Load 8 elements from A with four vectorized load instruction + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + + // Load 8 elements from B with four vectorized load instruction + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + // CHECK: @${{.*}} ld.global.v2.b32 { ${{.*}}, ${{.*}} }, [ ${{.*}} + 0 ]; + + %9 = tt.load %6 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #blocked0> + %10 = tt.load %8 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #blocked0> + %11 = arith.addf %9, %10 : tensor<256xf32, #blocked0> + %12 = tt.splat %arg2 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked0> + %13 = tt.addptr %12, %4 : tensor<256x!tt.ptr, #blocked0>, tensor<256xi32, #blocked0> + + // Store 8 elements to global with four vectorized store instruction + // CHECK: @${{.*}} st.global.v2.b32 [ ${{.*}} + 0 ], { ${{.*}}, ${{.*}} }; + // CHECK: @${{.*}} st.global.v2.b32 [ ${{.*}} + 0 ], { ${{.*}}, ${{.*}} }; + // CHECK: @${{.*}} st.global.v2.b32 [ ${{.*}} + 0 ], { ${{.*}}, ${{.*}} }; + // CHECK: @${{.*}} st.global.v2.b32 [ ${{.*}} + 0 ], { ${{.*}}, ${{.*}} }; + tt.store %13, %11 : tensor<256xf32, #blocked0> + tt.return + } +} + +// ----- + +#blocked0 = #triton_gpu.blocked<{sizePerThread = [8], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: global_load_store_vec8 tt.func @global_load_store_vec8(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32) { %c256_i32 = arith.constant 256 : i32 @@ -302,9 +347,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_view_broadcast tt.func @basic_view_broadcast(%arg : tensor<256xf32,#blocked0>) { // CHECK: llvm.mlir.undef @@ -327,8 +372,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_make_range tt.func @basic_make_range() { // CHECK: nvvm.read.ptx.sreg.tid.x @@ -342,8 +387,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_addf tt.func @basic_addf(%arg0 : tensor<256xf32,#blocked0>, %arg1 : tensor<256xf32,#blocked0>) { // CHECK: llvm.fadd @@ -355,8 +400,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_addi tt.func @basic_addi(%arg0 : tensor<256xi32,#blocked0>, %arg1 : tensor<256xi32,#blocked0>) { // CHECK: llvm.add @@ -368,10 +413,10 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_program_id tt.func @basic_program_id() { - // CHECK: nvvm.read.ptx.sreg.ctaid.x : i32 + // CHECK: llvm.inline_asm asm_dialect = att operand_attrs = [] "mov.u32 $0, %ctaid.x;", "=r" : () -> i32 %0 = tt.get_program_id x : i32 tt.return } @@ -379,8 +424,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_addptr tt.func @basic_addptr(%arg0 : tensor<256x!tt.ptr,#blocked0>, %arg1 : tensor<256xi32,#blocked0>) { // CHECK: llvm.getelementptr @@ -392,8 +437,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#shared0 = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#shared0 = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK: llvm.mlir.global external @global_smem // CHECK-LABEL: basic_alloc_tensor tt.func @basic_alloc_tensor() { @@ -409,8 +454,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#shared0 = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#shared0 = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK: llvm.mlir.global external @global_smem // CHECK-LABEL: basic_extract_slice tt.func @basic_extract_slice() { @@ -444,7 +489,7 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_async_wait tt.func @basic_async_wait() { // CHECK: cp.async.wait_group 0x4 @@ -455,15 +500,15 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0]}> -#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0]}> -#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0]}> -#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0]}> +#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #slice2d1 = #triton_gpu.slice<{dim = 1, parent=#block2}> #slice3d0 = #triton_gpu.slice<{dim = 0, parent=#block3}> -#AL = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -#A = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#AL = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_insert_slice_async_fallback tt.func @basic_insert_slice_async_fallback(%arg0: !tt.ptr {tt.divisibility = 1 : i32}) { %off0_ = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #slice2d1> @@ -494,15 +539,15 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0]}> -#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0]}> -#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0]}> -#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0]}> +#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #slice2d1 = #triton_gpu.slice<{dim = 1, parent=#block2}> #slice3d0 = #triton_gpu.slice<{dim = 0, parent=#block3}> -#AL = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -#A = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#AL = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_insert_slice_async_v4 tt.func @basic_insert_slice_async_v4(%arg0: !tt.ptr {tt.divisibility = 32 : i32}) { %off0_ = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #slice2d1> @@ -536,15 +581,15 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0]}> -#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0]}> -#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0]}> -#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0]}> +#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [4], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [4, 1], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #slice2d1 = #triton_gpu.slice<{dim = 1, parent=#block2}> #slice3d0 = #triton_gpu.slice<{dim = 0, parent=#block3}> -#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -#A = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_insert_slice_async_v1 tt.func @basic_insert_slice_async_v1(%arg0: !tt.ptr {tt.divisibility = 4 : i32}) { %off0_ = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #slice2d1> @@ -565,7 +610,7 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { %index = arith.constant 1 : i32 // CHECK: llvm.inline_asm - // CHECK-SAME: cp.async.ca.shared.global [ ${{.*}} + 0 ], [ ${{.*}} + 0 ], 0x4, 0x4 + // CHECK: cp.async.ca.shared.global [ ${{.*}} + 0 ], [ ${{.*}} + 0 ], 0x4, 0x4 // CHECK: llvm.inline_asm // CHECK-SAME: cp.async.ca.shared.global [ ${{.*}} + 0 ], [ ${{.*}} + 0 ], 0x4, 0x4 // CHECK: llvm.inline_asm @@ -582,14 +627,14 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0]}> -#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [8, 1], warpsPerCTA = [4, 1], order = [1, 0]}> -#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0]}> +#block0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [8], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#block2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [8, 1], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#block3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 8], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #slice2d1 = #triton_gpu.slice<{dim = 1, parent=#block2}> #slice3d0 = #triton_gpu.slice<{dim = 0, parent=#block3}> -#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -#A = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_insert_slice_async_v1_multictas tt.func @basic_insert_slice_async_v1_multictas(%arg0: !tt.ptr {tt.divisibility = 4 : i32}) { %off0_ = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #slice2d1> @@ -639,8 +684,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK: basic_splat tt.func @basic_splat(%ptr: !tt.ptr) { // CHECK: llvm.mlir.undef @@ -653,8 +698,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: basic_store tt.func @basic_store(%ptrs: tensor<256x!tt.ptr, #blocked0>, %vals: tensor<256xf32, #blocked0>, %mask: tensor<256xi1, #blocked0>) { // CHECK: llvm.inline_asm @@ -668,9 +713,9 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [0, 1]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_blocked_blocked tt.func @convert_layout_blocked_blocked(%arg0: tensor<16x16xf32, #blocked0>) { @@ -715,9 +760,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [16, 2], warpsPerCTA = [1, 1], order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [16, 2], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_blocked_blocked_vec tt.func @convert_layout_blocked_blocked_vec(%arg0: tensor<16x16xf32, #blocked0>) { @@ -738,9 +783,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_blocked_blocked_multi_rep tt.func @convert_layout_blocked_blocked_multi_rep(%arg0: tensor<16x16xf32, #blocked0>) { @@ -767,18 +812,18 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0]}> -#shared0 = #triton_gpu.shared<{vec = 1, perPhase=2, maxPhase=8 ,order = [1, 0]}> -#mma0 = #triton_gpu.mma<{versionMajor=2, warpsPerCTA=[1,1]}> +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared0 = #triton_gpu.shared<{vec = 1, perPhase=2, maxPhase=8, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma0 = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [1, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#mma0, kWidth=2}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#mma0, kWidth=2}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: convert_dot tt.func @convert_dot(%A: tensor<16x16xf16, #blocked0>, %B: tensor<16x16xf16, #blocked0>) { %AA = triton_gpu.convert_layout %A : (tensor<16x16xf16, #blocked0>) -> tensor<16x16xf16, #shared0> %BB = triton_gpu.convert_layout %B : (tensor<16x16xf16, #blocked0>) -> tensor<16x16xf16, #shared0> // CHECK: llvm.inline_asm - // CHECK-SAME: ldmatrix.sync.aligned.m8n8.x4 + // CHECK: ldmatrix.sync.aligned.m8n8.x4 // CHECK: llvm.inline_asm // CHECK-SAME: ldmatrix.sync.aligned.m8n8.x4 %AA_DOT = triton_gpu.convert_layout %AA : (tensor<16x16xf16, #shared0>) -> tensor<16x16xf16, #dot_operand_a> @@ -796,19 +841,19 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { } // TODO: problems in MLIR's parser on slice layout -// #blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0]}> -// module attributes {"triton_gpu.num-warps" = 1 : i32} { +// #blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [8, 4], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +// module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // tt.func @make_range_sliced_layout() { // %0 = tt.make_range {end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked0}>> -// return +// tt.return // } // } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [32, 1], warpsPerCTA = [1, 4], order = [1, 0]}> -#mma = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [2, 2]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [32, 1], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_mmav2_block tt.func @convert_layout_mmav2_blocked(%arg0: tensor<32x16xf32, #mma>) { @@ -826,9 +871,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -#mma = #triton_gpu.mma<{versionMajor = 1, versionMinor = 3, warpsPerCTA = [2, 2]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 1, versionMinor = 3, warpsPerCTA = [2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 16]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_mmav1_block tt.func @convert_layout_mmav1_blocked(%arg0: tensor<32x64xf32, #mma>) { @@ -849,9 +894,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0]}> -#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK: llvm.mlir.global external @global_smem() {addr_space = 3 : i32} : !llvm.array<0 x i8> // CHECK-LABEL: convert_layout_blocked_shared tt.func @convert_layout_blocked_shared(%arg0: tensor<128x32xf32, #blocked0>) { @@ -866,9 +911,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: convert_blocked1d_to_slice0 tt.func @convert_blocked1d_to_slice0(%src:tensor<32xi32, #blocked0>) { // CHECK-COUNT-4: llvm.load {{.*}} : !llvm.ptr, 3> @@ -879,9 +924,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [1, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: convert_blocked1d_to_slice1 tt.func @convert_blocked1d_to_slice1(%src:tensor<32xi32, #blocked0>) { // CHECK-COUNT-8: llvm.load {{.*}} : !llvm.ptr, 3> @@ -892,9 +937,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: convert_blocked_to_blocked_ptr tt.func @convert_blocked_to_blocked_ptr(%src:tensor<32x!tt.ptr, #blocked0>) { // CHECK: llvm.ptrtoint @@ -909,12 +954,12 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0]}> -#mma = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [2, 2]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#mma, kWidth=2}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#mma, kWidth=2}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { tt.func @matmul_kernel_dot_operand_layout(%ptr:!tt.ptr {tt.divisibility = 16 : i32}, %a:tensor<128x32xf16, #shared>, %b:tensor<32x256xf16, #shared>) { %cst = arith.constant dense<0.000000e+00> : tensor<128x256xf32, #mma> @@ -934,13 +979,13 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -#shared0 = #triton_gpu.shared<{vec = 4, perPhase = 1, maxPhase = 8, order = [1, 0]}> -#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0]}> -#mma = #triton_gpu.mma<{versionMajor = 1, versionMinor = 3, warpsPerCTA = [2, 2]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared0 = #triton_gpu.shared<{vec = 4, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 1, versionMinor = 3, warpsPerCTA = [2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 16]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#mma, isMMAv1Row=true}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#mma, isMMAv1Row=true}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { tt.func @matmul884_kernel_dot_operand_layout(%ptr:!tt.ptr {tt.divisibility = 16 : i32}, %a:tensor<32x64xf16, #shared0>, %b:tensor<64x64xf16, #shared1>) { %cst = arith.constant dense<0.000000e+00> : tensor<32x64xf32, #mma> @@ -959,11 +1004,11 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#blocked}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#blocked}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { tt.func @matmul_fmadot(%ptr:!tt.ptr {tt.divisibility = 16 : i32}, %a:tensor<32x16xf32, #shared>, %b:tensor<16x32xf32, #shared>) { %cst = arith.constant dense<0.000000e+00> : tensor<32x32xf32, #blocked> @@ -981,12 +1026,12 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#mma = #triton_gpu.mma<{versionMajor=2, warpsPerCTA=[2, 2]}> -#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0]}> -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor=2, warpsPerCTA=[2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> +#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#mma, kWidth=1}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#mma, kWidth=1}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: matmul_tf32dot tt.func @matmul_tf32dot(%ptr:!tt.ptr {tt.divisibility = 16 : i32}, %a:tensor<32x16xf32, #shared>, %b:tensor<16x32xf32, #shared>) { @@ -1020,8 +1065,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: atomic_add_f32 tt.func @atomic_add_f32(%arg0 : tensor<256x!tt.ptr, #blocked0>, %arg1 : tensor<256xi1, #blocked0>, %arg2 : tensor<256xf32, #blocked0>) { // CHECK: llvm.inline_asm @@ -1035,21 +1080,21 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: atomic_add_f32_scalar tt.func @atomic_add_f32_scalar(%arg0 : !tt.ptr, %arg1 : i1, %arg2 : f32) { // CHECK: llvm.icmp "eq" // CHECK: llvm.inline_asm // CHECK-SAME: @$3 atom.global.gpu.relaxed.add.f32 - %0 = "tt.atomic_rmw" (%arg0, %arg2, %arg1) {atomic_rmw_op = 5 : i32, sem = 1: i32} : (!tt.ptr, f32, i1) -> f32 + %0 = "tt.atomic_rmw" (%arg0, %arg2, %arg1) {atomic_rmw_op = 5 : i32, sem = 1 : i32} : (!tt.ptr, f32, i1) -> f32 tt.return } } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: store_f32 tt.func @store_f32(%arg0 : tensor<256x!tt.ptr, #blocked0>, %arg1 : tensor<256xf32, #blocked0>) { // CHECK: llvm.inline_asm @@ -1063,7 +1108,7 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: store_f32_scalar tt.func @store_f32_scalar(%arg0 : !tt.ptr, %arg1 : f32) { // CHECK: llvm.icmp "eq" @@ -1076,16 +1121,38 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { +// CHECK-LABEL: test_get_program_id +tt.func @test_get_program_id(%a: tensor<32x!tt.ptr, #blocked0>) { + %blockidx = tt.get_program_id x: i32 + %blockidy = tt.get_program_id y: i32 + %blockidz = tt.get_program_id z: i32 + // CHECK: ctaid.x + // CHECK: ctaid.y + // CHECK: ctaid.z + %v0 = arith.addi %blockidx, %blockidy : i32 + %v1 = arith.addi %v0, %blockidz : i32 + %0 = tt.splat %v1 : (i32) -> tensor<32xi32, #blocked0> + tt.store %a, %0 : tensor<32xi32, #blocked0> + + tt.return +} + +} + +// ----- +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 4 : i32, "triton_gpu.num-warps" = 4 : i32} { +// CHECK-LABEL: test_get_program_id tt.func @test_get_program_id(%a: tensor<32x!tt.ptr, #blocked0>) { - %blockidx = tt.get_program_id x : i32 - %blockidy = tt.get_program_id y : i32 + %blockidx = tt.get_program_id x: i32 + %blockidy = tt.get_program_id y: i32 %blockidz = tt.get_program_id z : i32 - // CHECK: nvvm.read.ptx.sreg.ctaid.x - // CHECK: nvvm.read.ptx.sreg.ctaid.y - // CHECK: nvvm.read.ptx.sreg.ctaid.z + // CHECK: clusterid.x + // CHECK: clusterid.y + // CHECK: clusterid.z %v0 = arith.addi %blockidx, %blockidy : i32 %v1 = arith.addi %v0, %blockidz : i32 %0 = tt.splat %v1 : (i32) -> tensor<32xi32, #blocked0> @@ -1097,15 +1164,17 @@ tt.func @test_get_program_id(%a: tensor<32x!tt.ptr, #blocked0>) { } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { + +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK-LABEL: test_get_num_program tt.func @test_get_num_program(%a: tensor<32x!tt.ptr, #blocked0>) { - // CHECK: nvvm.read.ptx.sreg.nctaid.x - // CHECK: nvvm.read.ptx.sreg.nctaid.y - // CHECK: nvvm.read.ptx.sreg.nctaid.z %blockdimx = tt.get_num_programs {axis=0:i32} : i32 %blockdimy = tt.get_num_programs {axis=1:i32} : i32 %blockdimz = tt.get_num_programs {axis=2:i32} : i32 + // CHECK: nctaid.x + // CHECK: nctaid.y + // CHECK: nctaid.z %v0 = arith.addi %blockdimx, %blockdimy : i32 %v1 = arith.addi %v0, %blockdimz : i32 %0 = tt.splat %v1 : (i32) -> tensor<32xi32, #blocked0> @@ -1116,8 +1185,28 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { + +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 4 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func @test_get_num_program(%a: tensor<32x!tt.ptr, #blocked0>) { + %blockdimx = tt.get_num_programs {axis=0:i32} : i32 + %blockdimy = tt.get_num_programs {axis=1:i32} : i32 + %blockdimz = tt.get_num_programs {axis=2:i32} : i32 + // CHECK: nclusterid.x + // CHECK: nclusterid.y + // CHECK: nclusterid.z + %v0 = arith.addi %blockdimx, %blockdimy : i32 + %v1 = arith.addi %v0, %blockdimz : i32 + %0 = tt.splat %v1 : (i32) -> tensor<32xi32, #blocked0> + tt.store %a, %0 : tensor<32xi32, #blocked0> + + tt.return + } +} + +// ----- +#blocked0 = #triton_gpu.blocked<{sizePerThread = [2], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: test_index_cache tt.func @test_index_cache() { // CHECK: nvvm.read.ptx.sreg.tid.x @@ -1129,9 +1218,9 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0]}> -#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: test_base_index_cache tt.func @test_base_index_cache(%arg0: tensor<128x32xf32, #blocked0>) { // CHECK: nvvm.read.ptx.sreg.tid.x @@ -1143,9 +1232,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { } // ----- -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0]}> -#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared0 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: test_index_cache_different_block tt.func @test_index_cache_different_block(%arg0: tensor<128x32xf32, #blocked0>, %arg1: i1) { // CHECK: nvvm.read.ptx.sreg.tid.x @@ -1162,12 +1251,12 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { // ----- -#mma = #triton_gpu.mma<{versionMajor=2, warpsPerCTA=[2, 2]}> -#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0]}> -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor=2, warpsPerCTA=[2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> +#shared = #triton_gpu.shared<{vec = 1, perPhase = 1, maxPhase = 1, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #dot_operand_a = #triton_gpu.dot_op<{opIdx=0, parent=#mma, kWidth=1}> #dot_operand_b = #triton_gpu.dot_op<{opIdx=1, parent=#mma, kWidth=1}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { // CHECK-LABEL: matmul_tf32_cst_b tt.func @matmul_tf32_cst_b(%ptr:!tt.ptr {tt.divisibility = 16 : i32}, %a: tensor<32x16xf32, #dot_operand_a>, %c: tensor<32x32xf32, #mma>) { @@ -1187,9 +1276,9 @@ module attributes {"triton_gpu.num-warps" = 4 : i32} { // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0]}> -#mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [2, 2]}> -module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32} { +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [2, 2], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32} { // CHECK-LABEL: matmul_f16_cst_operands tt.func public @matmul_f16_cst_operands(%arg0: !tt.ptr {tt.divisibility = 16 : i32}) attributes {noinline = false} { %cst = arith.constant dense<0.000000e+00> : tensor<32x32xf32, #mma> @@ -1225,8 +1314,8 @@ module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-war } // ----- -#blocked = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0]}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +#blocked = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [1], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: test_s8_to_bf16_conversion tt.func @test_s8_to_bf16_conversion(%in: tensor<32xi8, #blocked>) { // We can't vectorize if we only process @@ -1239,9 +1328,9 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { } // ----- -#mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], instrShape = [16, 8]}> #dot = #triton_gpu.dot_op<{opIdx = 0, parent = #mma, kWidth = 4}> -module attributes {"triton_gpu.num-warps" = 1 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { // CHECK-LABEL: test_s8_to_bf16_vectorized_conversion tt.func @test_s8_to_bf16_vectorized_conversion(%in: tensor<16x16xi8, #mma>) { // CHECK-NOT: llvm.sitofp @@ -1253,3 +1342,41 @@ module attributes {"triton_gpu.num-warps" = 1 : i32} { tt.return } } + +// ----- + +// CHECK-LABEL: sum_reduction +// CHECK: %[[M:.+]] = llvm.mlir.constant(-1 : i32) : i32 +// CHECK: nvvm.redux.sync add %{{.*}}, %[[M]] +// CHECK: nvvm.barrier0 +// CHECK: shfl.sync.bfly.b32 +// CHECK: shfl.sync.bfly.b32 +// CHECK: nvvm.barrier0 +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +module attributes {"triton_gpu.compute-capability" = 80 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.threads-per-warp" = 32 : i32} { + tt.func public @sum_reduction(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}) attributes {noinline = false} { + %cst = arith.constant dense<1024> : tensor<1x1xi32, #blocked> + %0 = tt.make_range {end = 1 : i32, start = 0 : i32} : tensor<1xi32, #blocked1> + %1 = tt.make_range {end = 1 : i32, start = 0 : i32} : tensor<1xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %2 = tt.expand_dims %1 {axis = 1 : i32} : (tensor<1xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<1x1xi32, #blocked> + %3 = arith.muli %2, %cst : tensor<1x1xi32, #blocked> + %4 = tt.splat %arg0 : (!tt.ptr) -> tensor<1x1x!tt.ptr, #blocked> + %5 = tt.addptr %4, %3 : tensor<1x1x!tt.ptr, #blocked>, tensor<1x1xi32, #blocked> + %6 = tt.make_range {end = 1024 : i32, start = 0 : i32} : tensor<1024xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %7 = tt.expand_dims %6 {axis = 0 : i32} : (tensor<1024xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x1024xi32, #blocked> + %8 = tt.broadcast %5 : (tensor<1x1x!tt.ptr, #blocked>) -> tensor<1x1024x!tt.ptr, #blocked> + %9 = tt.addptr %8, %7 : tensor<1x1024x!tt.ptr, #blocked>, tensor<1x1024xi32, #blocked> + %10 = tt.load %9 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<1x1024xi32, #blocked> + %11 = "tt.reduce"(%10) <{axis = 1 : i32}> ({ + ^bb0(%arg2: i32, %arg3: i32): + %15 = arith.addi %arg2, %arg3 : i32 + tt.reduce.return %15 : i32 + }) : (tensor<1x1024xi32, #blocked>) -> tensor<1xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %12 = triton_gpu.convert_layout %11 : (tensor<1xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<1xi32, #blocked1> + %13 = tt.splat %arg1 : (!tt.ptr) -> tensor<1x!tt.ptr, #blocked1> + %14 = tt.addptr %13, %0 : tensor<1x!tt.ptr, #blocked1>, tensor<1xi32, #blocked1> + tt.store %14, %12 {cache = 1 : i32, evict = 1 : i32} : tensor<1xi32, #blocked1> + tt.return + } +} diff --git a/test/Conversion/tritongpu_to_llvm_hopper.mlir b/test/Conversion/tritongpu_to_llvm_hopper.mlir new file mode 100644 index 000000000000..053330d47a49 --- /dev/null +++ b/test/Conversion/tritongpu_to_llvm_hopper.mlir @@ -0,0 +1,80 @@ +// RUN: triton-opt %s -split-input-file --convert-triton-gpu-to-llvm 2>&1 | FileCheck %s + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 4], CTAOrder = [0, 1]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 4], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 4 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK-LABEL: @tma_multicast_no_broadcast + tt.func @tma_multicast_no_broadcast(%basePtr: !tt.ptr {tt.divisibility = 8 : i32}, + %dim0: i64, %dim1: i64, + %stride0: i64, %stride1: i64, + %coord0: i32, %coord1: i32) { + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %dst = triton_gpu.alloc_tensor : tensor<1x64x64xf16, #shared> + %c0 = arith.constant 0 : i32 + %src = tt.make_tensor_ptr %basePtr, [%dim0, %dim1], [%stride0, %stride1], [%coord0, %coord1] {order = array} : !tt.ptr, 1> + // CHECK: nvgpu.tma_load_tiled %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} {operand_segment_sizes = array} : !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32 + %res = triton_nvidia_gpu.insert_slice_async_v2 %src, %dst, %c0, %mbar {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, operand_segment_sizes = array} : !tt.ptr, 1>, tensor<1x64x64xf16, #shared>, i32, !tt.ptr -> tensor<1x64x64xf16, #shared> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 4 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK-LABEL: @tma_multicast_const_mask + tt.func @tma_multicast_const_mask(%basePtr: !tt.ptr {tt.divisibility = 8 : i32}, + %dim0: i64, %dim1: i64, + %stride0: i64, %stride1: i64, + %coord0: i32, %coord1: i32) { + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %dst = triton_gpu.alloc_tensor : tensor<1x64x64xf16, #shared> + %c0 = arith.constant 0 : i32 + %src = tt.make_tensor_ptr %basePtr, [%dim0, %dim1], [%stride0, %stride1], [%coord0, %coord1] {order = array} : !tt.ptr, 1> + // CHECK: %[[C15:.*]] = llvm.mlir.constant(15 : i16) : i16 + // CHECK: nvgpu.tma_load_tiled %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %[[C15]] + %res = triton_nvidia_gpu.insert_slice_async_v2 %src, %dst, %c0, %mbar {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, operand_segment_sizes = array} : !tt.ptr, 1>, tensor<1x64x64xf16, #shared>, i32, !tt.ptr -> tensor<1x64x64xf16, #shared> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 2], CTAOrder = [0, 1]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 4], CTASplitNum = [1, 2], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 4 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK-LABEL: @tma_multicast_variable_mask + tt.func @tma_multicast_variable_mask(%basePtr: !tt.ptr {tt.divisibility = 8 : i32}, + %dim0: i64, %dim1: i64, + %stride0: i64, %stride1: i64, + %coord0: i32, %coord1: i32) { + %mbar = triton_nvidia_gpu.alloc_mbarrier { count = 128 : i32 } : !tt.ptr + %dst = triton_gpu.alloc_tensor : tensor<1x64x64xf16, #shared> + %c0 = arith.constant 0 : i32 + %src = tt.make_tensor_ptr %basePtr, [%dim0, %dim1], [%stride0, %stride1], [%coord0, %coord1] {order = array} : !tt.ptr, 1> + // CHECK: nvgpu.cluster_id + // CHECK: nvgpu.tma_load_tiled + %res = triton_nvidia_gpu.insert_slice_async_v2 %src, %dst, %c0, %mbar {axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false, operand_segment_sizes = array} : !tt.ptr, 1>, tensor<1x64x64xf16, #shared>, i32, !tt.ptr -> tensor<1x64x64xf16, #shared> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#shared = #triton_gpu.shared<{vec = 4, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 1 : i32} { + // CHECK-LABEL: @tma_store + tt.func @tma_store(%basePtr: !tt.ptr {tt.divisibility = 8 : i32}, + %dim0: i64, %dim1: i64, + %stride0: i64, %stride1: i64, + %coord0: i32, %coord1: i32) { + %src = triton_gpu.alloc_tensor : tensor<64x64xf32, #shared> + %c0 = arith.constant 0 : i32 + %dst = tt.make_tensor_ptr %basePtr, [%dim0, %dim1], [%stride0, %stride1], [%coord0, %coord1] {order = array} : !tt.ptr, 1> + // CHECK: nvgpu.tma_store_tiled %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !llvm.ptr, !llvm.ptr, i1, i32, i32 + triton_nvidia_gpu.store_async %dst, %src {cache = 1 : i32} : !tt.ptr, 1>, tensor<64x64xf32, #shared> + tt.return + } +} diff --git a/test/NVGPU/test_cga.mlir b/test/NVGPU/test_cga.mlir new file mode 100644 index 000000000000..f04e10db7e2f --- /dev/null +++ b/test/NVGPU/test_cga.mlir @@ -0,0 +1,33 @@ +// RUN: triton-translate %s | FileCheck %s +#SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> +module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 2 : i32} { + tt.func @test_mbarrier() { + %addr = arith.constant 32 : i32 + %data = arith.constant 123 : i32 + %pred = arith.constant 1 : i1 + %id0 = arith.constant 0 : i32 + %id1 = arith.constant 1 : i32 + // CHECK: call void @__nv_cga_barrier_sync() + // CHECK: call void @__nv_cga_barrier_arrive() + // CHECK: call void @__nv_cga_barrier_wait() + nvgpu.cga_barrier_sync + nvgpu.cga_barrier_arrive + nvgpu.cga_barrier_wait + + %ptr = llvm.mlir.null : !llvm.ptr + + // CHECK: %[[X:.+]] = tail call i32 asm "mov.u32 $0, %cluster_ctaid.x;", "=r"() + // CHECK: %[[Y:.+]] = tail call i32 asm "mov.u32 $0, %cluster_ctaid.y;", "=r"() + // CHECK: %[[Z:.+]] = tail call i32 asm "mov.u32 $0, %cluster_ctaid.z;", "=r"() + // CHECK: %[[NX:.+]] = tail call i32 asm "mov.u32 $0, %cluster_nctaid.x;", "=r"() + // CHECK: %[[NY:.+]] = tail call i32 asm "mov.u32 $0, %cluster_nctaid.y;", "=r"() + // CHECK: %[[A0:.+]] = mul i32 %[[NY]], %[[Z]] + // CHECK: %[[A1:.+]] = add i32 %[[A0]], %[[Y]] + // CHECK: %[[A2:.+]] = mul i32 %[[A1]], %[[NX]] + // CHECK: add i32 %[[A2]], %[[X]] + %v = nvgpu.cluster_id + llvm.store %v, %ptr : !llvm.ptr + + tt.return + } +} // end module diff --git a/test/NVGPU/test_mbarrier.mlir b/test/NVGPU/test_mbarrier.mlir new file mode 100644 index 000000000000..049db82b4f46 --- /dev/null +++ b/test/NVGPU/test_mbarrier.mlir @@ -0,0 +1,19 @@ +// RUN: triton-translate %s | FileCheck %s +#SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> +module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 2 : i32} { + tt.func @test_mbarrier() { + %mbarrier = llvm.mlir.null : !llvm.ptr + %pred = arith.constant 1 : i1 + // CHECK: call void @__nv_mbarrier_init + nvgpu.mbarrier_init %mbarrier, %pred { count = 32 : i32 } : !llvm.ptr + // CHECK: call void @__nv_mbarrier_arrive_cp_async + nvgpu.mbarrier_arrive %mbarrier, %pred {arriveType = 1 : i32}: !llvm.ptr + // CHECK: call void @__nv_mbarrier_arrive_normal + nvgpu.mbarrier_arrive %mbarrier, %pred {arriveType = 0 : i32}: !llvm.ptr + // CHECK: call void @__nv_mbarrier_arrive_expect_tx + nvgpu.mbarrier_arrive %mbarrier, %pred {arriveType = 2 : i32, txCount = 128 : i32}: !llvm.ptr + // CHECK: call void @__nv_mbarrier_wait + nvgpu.mbarrier_wait %mbarrier, %pred : !llvm.ptr, i1 + tt.return + } +} // end module diff --git a/test/NVGPU/test_tma.mlir b/test/NVGPU/test_tma.mlir new file mode 100644 index 000000000000..eaa8f99d389f --- /dev/null +++ b/test/NVGPU/test_tma.mlir @@ -0,0 +1,47 @@ +// RUN: triton-translate %s | FileCheck %s +#SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> +module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 2 : i32} { + tt.func @test_tma(%im2colOffsets0 : !llvm.struct<(i16, i16)>, %im2colOffsets1 : !llvm.struct<(i16, i16, i16)>) { + %mbarrier = llvm.mlir.null : !llvm.ptr + %tmaDesc = llvm.mlir.null : !llvm.ptr + %dst = llvm.mlir.null : !llvm.ptr + %l2desc = arith.constant 0 : i64 + %c0 = arith.constant 0 : i32 + %c1 = arith.constant 1 : i32 + %c2 = arith.constant 2 : i32 + %c3 = arith.constant 3 : i32 + %c4 = arith.constant 4 : i32 + %pred = arith.constant 1 : i1 + %mask = arith.constant 15 : i16 + + // CHECK: void @__nv_tma_load_tiled_2d + // CHECK: void @__nv_tma_load_tiled_3d + // CHECK: void @__nv_tma_load_tiled_4d + // CHECK: void @__nv_tma_load_tiled_5d + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1 {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2 {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2, %c3 {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32, i32 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2, %c3, %c4 {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32, i32, i32 + + // CHECK: void @__nv_tma_load_tiled_mcast_2d + // CHECK: void @__nv_tma_load_tiled_mcast_3d + // CHECK: void @__nv_tma_load_tiled_mcast_4d + // CHECK: void @__nv_tma_load_tiled_mcast_5d + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %mask {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i16 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2, %mask {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32, i16 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2, %c3, %mask {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32, i32, i16 + nvgpu.tma_load_tiled %dst, %mbarrier, %tmaDesc, %l2desc, %pred, %c0, %c1, %c2, %c3, %c4, %mask {operand_segment_sizes = array}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, i1, i32, i32, i32, i32, i32, i16 + + // CHECK: tail call void @__nv_tma_load_im2col_4d + // CHECK: tail call void @__nv_tma_load_im2col_5d + // CHECK: tail call void @__nv_tma_load_im2col_mcast_4d + // CHECK: tail call void @__nv_tma_load_im2col_mcast_5d + nvgpu.tma_load_im2col %dst, %mbarrier, %tmaDesc, %l2desc, %im2colOffsets0, %pred, %c0, %c1, %c2, %c3 {mcastMask = 0 : i16}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, !llvm.struct<(i16, i16)>, i1, i32, i32, i32, i32 + nvgpu.tma_load_im2col %dst, %mbarrier, %tmaDesc, %l2desc, %im2colOffsets1, %pred, %c0, %c1, %c2, %c3, %c4 {mcastMask = 0 : i16}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, !llvm.struct<(i16, i16, i16)>, i1, i32, i32, i32, i32, i32 + + nvgpu.tma_load_im2col %dst, %mbarrier, %tmaDesc, %l2desc, %im2colOffsets0, %pred, %c0, %c1, %c2, %c3 {mcastMask = 1 : i16}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, !llvm.struct<(i16, i16)>, i1, i32, i32, i32, i32 + nvgpu.tma_load_im2col %dst, %mbarrier, %tmaDesc, %l2desc, %im2colOffsets1, %pred, %c0, %c1, %c2, %c3, %c4 {mcastMask = 1 : i16}: !llvm.ptr, !llvm.ptr, !llvm.ptr, i64, !llvm.struct<(i16, i16, i16)>, i1, i32, i32, i32, i32, i32 + + tt.return + } +} // end module diff --git a/test/NVGPU/test_wgmma.mlir b/test/NVGPU/test_wgmma.mlir new file mode 100644 index 000000000000..9f24eb5220bc --- /dev/null +++ b/test/NVGPU/test_wgmma.mlir @@ -0,0 +1,16 @@ +// RUN: triton-translate %s | FileCheck %s +#SHARED = #triton_gpu.shared<{vec = 2, perPhase = 2, maxPhase = 4, order = [1, 0]}> +module attributes {"triton_gpu.num-warps" = 4 : i32, "triton_gpu.num-ctas" = 2 : i32} { + tt.func @test_tma(%opC : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>) { + %buffer = llvm.mlir.null : !llvm.ptr + %height = arith.constant 16 : i32 + // CHECK: call i64 @__nv_get_wgmma_desc + %descA = nvgpu.wgmma_desc_create %buffer, %height {mode = 2 : i32}: (!llvm.ptr, i32) -> (i64) + // CHECK: call i64 @__nv_get_wgmma_desc + %descB = nvgpu.wgmma_desc_create %buffer, %height {mode = 2 : i32}: (!llvm.ptr, i32) -> (i64) + + // CHECK: wgmma.mma_async.sync.aligned.m64n64k16.f32.f16.f16 + %acc0 = nvgpu.wgmma %descA, %descA, %opC {m=64:i32, n=64:i32, k=16:i32, eltTypeC=7:i32, eltTypeA=4:i32, eltTypeB=4:i32, layoutA=0:i32, layoutB=0:i32} : (i64, i64, !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>) -> (!llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>) + tt.return + } +} // end module diff --git a/test/Triton/reorder-broadcast.mlir b/test/Triton/reorder-broadcast.mlir index 0049793e7e30..fbe44dace289 100644 --- a/test/Triton/reorder-broadcast.mlir +++ b/test/Triton/reorder-broadcast.mlir @@ -13,8 +13,8 @@ tt.func @test_splat_elementwise_pattern(%arg0: f32) -> (tensor<128x128xf32>, ten %add = arith.addf %a, %b : tensor<128x128xf32> - // CHECK-NEXT: %[[ptr:.*]] = tt.int_to_ptr %[[c1]] : i64 -> !tt.ptr - // CHECK-NEXT: %{{.*}} = tt.splat %[[ptr]] : (!tt.ptr) -> tensor<128x128x!tt.ptr> + // CHECK-NEXT: %[[ptr:.*]] = tt.int_to_ptr %[[c1]] : i64 -> !tt.ptr + // CHECK-NEXT: %{{.*}} = tt.splat %[[ptr]] : (!tt.ptr) -> tensor<128x128x!tt.ptr> %c1_t = tt.splat %c1 : (i64) -> tensor<128x128xi64> %ptr = tt.int_to_ptr %c1_t : tensor<128x128xi64> -> tensor<128x128x!tt.ptr> diff --git a/test/Triton/rewrite-tensor-pointer.mlir b/test/Triton/rewrite-tensor-pointer.mlir deleted file mode 100644 index d5fe58a7c9a5..000000000000 --- a/test/Triton/rewrite-tensor-pointer.mlir +++ /dev/null @@ -1,83 +0,0 @@ -// RUN: triton-opt %s -triton-rewrite-tensor-pointer | FileCheck %s -tt.func public @matmul_kernel(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { - %c31_i32 = arith.constant 31 : i32 - %c127_i32 = arith.constant 127 : i32 - %c1 = arith.constant 1 : index - %c0 = arith.constant 0 : index - %cst = arith.constant dense<0.000000e+00> : tensor<128x32xf32> - %c0_i32 = arith.constant 0 : i32 - %c1_i64 = arith.constant 1 : i64 - %c32_i32 = arith.constant 32 : i32 - %c128_i32 = arith.constant 128 : i32 - %c8_i32 = arith.constant 8 : i32 - %0 = tt.get_program_id x : i32 - %1 = tt.get_program_id y : i32 - %2 = arith.addi %arg3, %c127_i32 : i32 - %3 = arith.divsi %2, %c128_i32 : i32 - %4 = arith.addi %arg4, %c31_i32 : i32 - %5 = arith.divsi %4, %c32_i32 : i32 - %6 = arith.muli %5, %c8_i32 : i32 - %7 = arith.divsi %0, %6 : i32 - %8 = arith.muli %7, %c8_i32 : i32 - %9 = arith.subi %3, %8 : i32 - %10 = arith.cmpi slt, %9, %c8_i32 : i32 - %11 = arith.select %10, %9, %c8_i32 : i32 - %12 = arith.remsi %0, %11 : i32 - %13 = arith.addi %8, %12 : i32 - %14 = arith.remsi %0, %6 : i32 - %15 = arith.divsi %14, %11 : i32 - %16 = arith.muli %13, %c128_i32 : i32 - %17 = arith.muli %1, %c32_i32 : i32 - %18 = arith.extsi %arg3 : i32 to i64 - %19 = arith.extsi %arg5 : i32 to i64 - %20 = arith.extsi %arg6 : i32 to i64 - // CHECK-NOT: tt.make_tensor_ptr - %21 = tt.make_tensor_ptr %arg0, [%18, %19], [%20, %c1_i64], [%16, %17] {order = array} : !tt.ptr> - %22 = arith.muli %15, %c32_i32 : i32 - %23 = arith.extsi %arg4 : i32 to i64 - %24 = arith.extsi %arg7 : i32 to i64 - // CHECK-NOT: tt.make_tensor_ptr - %25 = tt.make_tensor_ptr %arg1, [%19, %23], [%24, %c1_i64], [%17, %22] {order = array} : !tt.ptr> - %26 = arith.addi %arg5, %c31_i32 : i32 - %27 = arith.divsi %26, %c32_i32 : i32 - %28 = arith.index_cast %27 : i32 to index - %29:3 = scf.for %arg9 = %c0 to %28 step %c1 iter_args(%arg10 = %cst, %arg11 = %21, %arg12 = %25) -> (tensor<128x32xf32>, !tt.ptr>, !tt.ptr>) { - // CHECK: tt.load %{{.*}}, %{{.*}}, %{{.*}} {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16> - %55 = tt.load %arg11 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : !tt.ptr> -> tensor<128x32xf16> - // CHECK: tt.load %{{.*}}, %{{.*}}, %{{.*}} {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x32xf16> - %56 = tt.load %arg12 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : !tt.ptr> -> tensor<32x32xf16> - %57 = tt.dot %55, %56, %arg10 {allowTF32 = true} : tensor<128x32xf16> * tensor<32x32xf16> -> tensor<128x32xf32> - // CHECK-NOT: tt.advance - %58 = tt.advance %arg11, [%c0_i32, %c32_i32] : !tt.ptr> - // CHECK-NOT: tt.advance - %59 = tt.advance %arg12, [%c32_i32, %c0_i32] : !tt.ptr> - scf.yield %57, %58, %59 : tensor<128x32xf32>, !tt.ptr>, !tt.ptr> - } - %30 = arith.truncf %29#0 : tensor<128x32xf32> to tensor<128x32xf16> - %31 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32> - %32 = tt.splat %16 : (i32) -> tensor<128xi32> - %33 = arith.addi %32, %31 : tensor<128xi32> - %34 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32> - %35 = tt.splat %22 : (i32) -> tensor<32xi32> - %36 = arith.addi %35, %34 : tensor<32xi32> - %37 = tt.expand_dims %33 {axis = 1 : i32} : (tensor<128xi32>) -> tensor<128x1xi32> - %38 = tt.splat %arg8 : (i32) -> tensor<128x1xi32> - %39 = arith.muli %37, %38 : tensor<128x1xi32> - %40 = tt.expand_dims %36 {axis = 0 : i32} : (tensor<32xi32>) -> tensor<1x32xi32> - %41 = tt.broadcast %39 : (tensor<128x1xi32>) -> tensor<128x32xi32> - %42 = tt.broadcast %40 : (tensor<1x32xi32>) -> tensor<128x32xi32> - %43 = arith.addi %41, %42 : tensor<128x32xi32> - %44 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x32x!tt.ptr> - %45 = tt.addptr %44, %43 : tensor<128x32x!tt.ptr>, tensor<128x32xi32> - %46 = tt.splat %arg3 : (i32) -> tensor<128xi32> - %47 = arith.cmpi slt, %33, %46 : tensor<128xi32> - %48 = tt.expand_dims %47 {axis = 1 : i32} : (tensor<128xi1>) -> tensor<128x1xi1> - %49 = tt.splat %arg4 : (i32) -> tensor<32xi32> - %50 = arith.cmpi slt, %36, %49 : tensor<32xi32> - %51 = tt.expand_dims %50 {axis = 0 : i32} : (tensor<32xi1>) -> tensor<1x32xi1> - %52 = tt.broadcast %48 : (tensor<128x1xi1>) -> tensor<128x32xi1> - %53 = tt.broadcast %51 : (tensor<1x32xi1>) -> tensor<128x32xi1> - %54 = arith.andi %52, %53 : tensor<128x32xi1> - tt.store %45, %30, %54 {cache = 1 : i32, evict = 1 : i32} : tensor<128x32xf16> - tt.return -} diff --git a/test/TritonGPU/coalesce.mlir b/test/TritonGPU/coalesce.mlir index a6834d539f5c..56c325683f55 100644 --- a/test/TritonGPU/coalesce.mlir +++ b/test/TritonGPU/coalesce.mlir @@ -1,21 +1,20 @@ // RUN: triton-opt %s -split-input-file -tritongpu-coalesce | FileCheck %s -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1]}> +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> #slice1dim1 = #triton_gpu.slice<{dim = 1, parent = #blocked1}> #slice2dim0 = #triton_gpu.slice<{dim = 0, parent = #blocked2}> -module attributes {"triton_gpu.num-warps" = 4 : i32} { +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { - -// CHECK: [[row_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0]}> -// CHECK: [[col_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1]}> -// CHECK: [[load_ptr:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64x!tt.ptr, [[row_layout]]> +// CHECK: [[row_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +// CHECK: [[col_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +// CHECK: [[load_ptr:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64x!tt.ptr, [[row_layout]]> // CHECK: [[load_mask:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64xi1, [[row_layout]]> // CHECK: [[load_other:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64xf32, [[row_layout]]> // CHECK: [[load_val:%.*]] = tt.load [[load_ptr]], [[load_mask]], [[load_other]] {{.*}} : tensor<64x64xf32, [[row_layout]]> -// CHECK: [[store_ptr:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64x!tt.ptr, [[col_layout]]> +// CHECK: [[store_ptr:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64x!tt.ptr, [[col_layout]]> // CHECK: [[store_val:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64xf32, [[col_layout]]> // CHECK: [[store_mask:%.*]] = triton_gpu.convert_layout {{.*}} -> tensor<64x64xi1, [[col_layout]]> // CHECK: tt.store [[store_ptr]], [[store_val]], [[store_mask]] @@ -51,3 +50,22 @@ tt.func @transpose(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, } } + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [1, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 2 : i32} { + +// CHECK: [[NEW_LOADED_LAYOUT:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [2, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +tt.func @load_tensor(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: i32 {tt.divisibility = 16 : i32}, %arg2: i32 {tt.divisibility = 16 : i32}) { + %c0 = arith.constant 0 : i32 + %c1 = arith.constant 1 : i64 + %0 = arith.extsi %arg1 : i32 to i64 + %1 = arith.extsi %arg2 : i32 to i64 + %2 = tt.make_tensor_ptr %arg0, [%0, %1], [%1, %c1], [%c0, %c0] { order = array } : !tt.ptr, 1> + // CHECK: !tt.ptr, 1> -> tensor<32x32xf32, [[NEW_LOADED_LAYOUT]]> + %3 = tt.load %2 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<32x32xf32, #blocked> + tt.return +} + +} diff --git a/test/TritonGPU/combine.mlir b/test/TritonGPU/combine.mlir index e123841e42cc..3693930cc1ab 100644 --- a/test/TritonGPU/combine.mlir +++ b/test/TritonGPU/combine.mlir @@ -1,16 +1,12 @@ // RUN: triton-opt %s -split-input-file -tritongpu-remove-layout-conversions 2>&1 | FileCheck %s -#layout0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#layout1 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#layout2 = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [4, 1]}> +#layout0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#layout1 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> -// CHECK: [[$target_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -// CHECK: [[$row_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -// CHECK: [[$col_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [0, 1]}> -// CHECK: [[$col_layout_novec:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}> -// CHECK-LABEL: cst module attributes {"triton_gpu.num-warps" = 4 : i32} { +// CHECK: [[$target_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +// CHECK-LABEL: cst tt.func @cst() -> tensor<1024xi32, #layout1> { %cst = arith.constant dense<0> : tensor<1024xi32, #layout0> %1 = triton_gpu.convert_layout %cst : (tensor<1024xi32, #layout0>) -> tensor<1024xi32, #layout1> @@ -165,13 +161,20 @@ tt.func @if_else_both_convert(%arg0: i32, %arg1: !tt.ptr {tt.divisibility = } -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}> +// ----- + +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> #slice1dim1 = #triton_gpu.slice<{dim = 1, parent = #blocked1}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> #slice2dim0 = #triton_gpu.slice<{dim = 0, parent = #blocked2}> -#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0]}> -#blocked4 = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked5 = #triton_gpu.blocked<{sizePerThread = [4], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> + +// CHECK: [[$row_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +// CHECK: [[$col_layout:#.*]] = #triton_gpu.blocked<{sizePerThread = [4, 1], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +// CHECK: [[$col_layout_novec:#.*]] = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> // CHECK-LABEL: transpose module attributes {"triton_gpu.num-warps" = 4 : i32} { @@ -220,11 +223,11 @@ tt.func @transpose(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: i32 module attributes {"triton_gpu.num-warps" = 4 : i32} { tt.func @loop(%arg0: !tt.ptr, %arg1: i32, %arg2: !tt.ptr, %arg3: i32, %arg4: i32) { // CHECK-NOT: triton_gpu.convert_layout - // CHECK: [[loop_ret:%.*]]:2 = scf.for {{.*}} -> (tensor<64x64xf32, [[$row_layout]]>, tensor<64x64x!tt.ptr, [[$row_layout]]>) + // CHECK: [[loop_ret:%.*]]:2 = scf.for {{.*}} -> (tensor<64x64xf32, [[$row_layout]]>, tensor<64x64x!tt.ptr, [[$row_layout]]>) // CHECK-NEXT: {{.*}} = tt.load {{.*}} : tensor<64x64xf32, [[$row_layout]]> // CHECK-NEXT: {{.*}} = arith.addf {{.*}} : tensor<64x64xf32, [[$row_layout]]> - // CHECK-NEXT: {{.*}} = tt.addptr {{.*}} : tensor<64x64x!tt.ptr, [[$row_layout]]>, tensor<64x64xi32, [[$row_layout]]> - // CHECK-NEXT: scf.yield {{.*}} : tensor<64x64xf32, [[$row_layout]]>, tensor<64x64x!tt.ptr, [[$row_layout]]> + // CHECK-NEXT: {{.*}} = tt.addptr {{.*}} : tensor<64x64x!tt.ptr, [[$row_layout]]>, tensor<64x64xi32, [[$row_layout]]> + // CHECK-NEXT: scf.yield {{.*}} : tensor<64x64xf32, [[$row_layout]]>, tensor<64x64x!tt.ptr, [[$row_layout]]> // CHECK-NEXT: } // CHECK-NEXT: {{.*}} = triton_gpu.convert_layout [[loop_ret]]#0 : (tensor<64x64xf32, [[$row_layout]]>) -> tensor<64x64xf32, [[$col_layout_novec]]> // CHECK-NOT: triton_gpu.convert_layout @@ -333,28 +336,28 @@ tt.func @vecadd(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr %c256_i32 = arith.constant 256 : i32 %0 = tt.get_program_id x : i32 %1 = arith.muli %0, %c256_i32 : i32 - %2 = tt.splat %1 : (i32) -> tensor<256xi32, #layout1> - %3 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #layout1> - %4 = tt.splat %1 : (i32) -> tensor<256xi32, #layout1> - %5 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #layout1> - %6 = tt.splat %1 : (i32) -> tensor<256xi32, #layout1> - %7 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #layout1> - %8 = tt.splat %arg0 : (!tt.ptr) -> tensor<256x!tt.ptr, #layout1> - %9 = arith.addi %6, %7 : tensor<256xi32, #layout1> - %10 = tt.splat %arg1 : (!tt.ptr) -> tensor<256x!tt.ptr, #layout1> - %11 = arith.addi %4, %5 : tensor<256xi32, #layout1> - %12 = tt.addptr %8, %9 : tensor<256x!tt.ptr, #layout1>, tensor<256xi32, #layout1> - %13 = tt.load %12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #layout1> - %14 = triton_gpu.convert_layout %13 : (tensor<256xf32, #layout1>) -> tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}>> - %15 = tt.addptr %10, %11 : tensor<256x!tt.ptr, #layout1>, tensor<256xi32, #layout1> - %16 = tt.load %15 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #layout1> - %17 = triton_gpu.convert_layout %16 : (tensor<256xf32, #layout1>) -> tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}>> - %18 = arith.addf %14, %17 : tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}>> - %19 = tt.splat %arg2 : (!tt.ptr) -> tensor<256x!tt.ptr, #layout1> - %20 = arith.addi %2, %3 : tensor<256xi32, #layout1> - %21 = tt.addptr %19, %20 : tensor<256x!tt.ptr, #layout1>, tensor<256xi32, #layout1> - %22 = triton_gpu.convert_layout %18 : (tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}>>) -> tensor<256xf32, #layout1> - tt.store %21, %22 : tensor<256xf32, #layout1> + %2 = tt.splat %1 : (i32) -> tensor<256xi32, #blocked5> + %3 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #blocked5> + %4 = tt.splat %1 : (i32) -> tensor<256xi32, #blocked5> + %5 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #blocked5> + %6 = tt.splat %1 : (i32) -> tensor<256xi32, #blocked5> + %7 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #blocked5> + %8 = tt.splat %arg0 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked5> + %9 = arith.addi %6, %7 : tensor<256xi32, #blocked5> + %10 = tt.splat %arg1 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked5> + %11 = arith.addi %4, %5 : tensor<256xi32, #blocked5> + %12 = tt.addptr %8, %9 : tensor<256x!tt.ptr, #blocked5>, tensor<256xi32, #blocked5> + %13 = tt.load %12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #blocked5> + %14 = triton_gpu.convert_layout %13 : (tensor<256xf32, #blocked5>) -> tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}>> + %15 = tt.addptr %10, %11 : tensor<256x!tt.ptr, #blocked5>, tensor<256xi32, #blocked5> + %16 = tt.load %15 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<256xf32, #blocked5> + %17 = triton_gpu.convert_layout %16 : (tensor<256xf32, #blocked5>) -> tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}>> + %18 = arith.addf %14, %17 : tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}>> + %19 = tt.splat %arg2 : (!tt.ptr) -> tensor<256x!tt.ptr, #blocked5> + %20 = arith.addi %2, %3 : tensor<256xi32, #blocked5> + %21 = tt.addptr %19, %20 : tensor<256x!tt.ptr, #blocked5>, tensor<256xi32, #blocked5> + %22 = triton_gpu.convert_layout %18 : (tensor<256xf32, #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}>>) -> tensor<256xf32, #blocked5> + tt.store %21, %22 : tensor<256xf32, #blocked5> tt.return } } @@ -902,14 +905,14 @@ tt.func public @mnist(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: ! // ----- +#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [8], order = [0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [8, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 8], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked5 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [8, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> // cmpf and cmpi have different operands and result types // CHECK-LABEL: cmp -#blocked0 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [8], order = [0]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [8, 1], order = [0, 1]}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 4], order = [0, 1]}> -#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 8], order = [0, 1]}> -#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [8, 1], order = [1, 0]}> -#blocked5 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [8, 1], order = [1, 0]}> module attributes {"triton_gpu.num-warps" = 4 : i32} { tt.func public @cmp(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: !tt.ptr {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}) { %c64 = arith.constant 64 : index @@ -1087,10 +1090,10 @@ tt.func public @if_no_tensor(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, % // Check if the SimplifyReduceCvt rewriter pattern doesn't hang. // CHECK-LABEL: reduce_cvt // CHECK-NOT: triton_gpu.convert_layout -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 2], order = [0, 1]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0]}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 1], order = [0, 1]}> -#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [2, 1], order = [1, 0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [2], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [2, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> module attributes {"triton_gpu.num-warps" = 2 : i32} { tt.func public @reduce_cvt1(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: i32, %arg2: i32) { %cst = arith.constant dense<0> : tensor<1x2xi32, #blocked> @@ -1122,7 +1125,7 @@ module attributes {"triton_gpu.num-warps" = 2 : i32} { // ----- -// Check if SimplifyReduceCvt handles convert_layout lifted from the for loop. +// Check if the SimplifyReduceCvt handles convert_layout lifted from the for loop. // CHECK-LABEL: reduce_cvt2 // Match the reduction // CHECK: tt.reduce @@ -1130,10 +1133,10 @@ module attributes {"triton_gpu.num-warps" = 2 : i32} { // CHECK: (tensor<1x256xf32, #blocked>) -> tensor<1xf32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> // CHECK-NEXT: triton_gpu.convert_layout // CHECK-NOT: triton_gpu.convert_layout -#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1]}> -#blocked1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0]}> -#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1]}> -#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [1, 0]}> +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1], threadsPerWarp = [32], warpsPerCTA = [4], order = [0], CTAsPerCGA = [1], CTASplitNum = [1], CTAOrder = [0]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [1, 32], warpsPerCTA = [1, 4], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> module attributes {"triton_gpu.num-warps" = 4 : i32} { tt.func public @reduce_cvt2(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}) { %cst = arith.constant dense<0.000000e+00> : tensor<1x256xf32, #blocked> diff --git a/test/TritonGPU/dot-operands.mlir b/test/TritonGPU/dot-operands.mlir index 9c6e07ff7cba..688e8ebd1810 100644 --- a/test/TritonGPU/dot-operands.mlir +++ b/test/TritonGPU/dot-operands.mlir @@ -71,9 +71,9 @@ tt.func @succeeds_if_arg_is_not_convert_layout( #mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4]}> module attributes {"triton_gpu.num-warps" = 4 : i32} { -// CHECK: #[[BA:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 2], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -// CHECK: #[[BB:.*]] = #triton_gpu.blocked<{sizePerThread = [2, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1]}> -// CHECK: #[[MMA:.*]] = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4]}> +// CHECK: #[[BA:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 2], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = []}> +// CHECK: #[[BB:.*]] = #triton_gpu.blocked<{sizePerThread = [2, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = []}> +// CHECK: #[[MMA:.*]] = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = [], instrShape = []}> // CHECK: tt.func @push_convert_both_operands // CHECK: %[[ALOAD:.*]] = tt.load %{{.*}} {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x16xf16, #[[BA]]> @@ -106,9 +106,9 @@ tt.func @push_convert_both_operands( #mma = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4]}> module attributes {"triton_gpu.num-warps" = 4 : i32} { -// CHECK: #[[BA:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 2], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -// CHECK: #[[BB:.*]] = #triton_gpu.blocked<{sizePerThread = [2, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1]}> -// CHECK: #[[MMA:.*]] = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4]}> +// CHECK: #[[BA:.*]] = #triton_gpu.blocked<{sizePerThread = [1, 2], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = []}> +// CHECK: #[[BB:.*]] = #triton_gpu.blocked<{sizePerThread = [2, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = []}> +// CHECK: #[[MMA:.*]] = #triton_gpu.mma<{versionMajor = 2, versionMinor = 0, warpsPerCTA = [1, 4], CTAsPerCGA = [], CTASplitNum = [], CTAOrder = [], instrShape = []}> // CHECK: tt.func @update_kwidth_slice // CHECK: %[[CST:.+]] = arith.constant dense<1.000000e+00> : tensor<16x16xf32, #triton_gpu.dot_op<{opIdx = 1, parent = #[[MMA]], kWidth = 2}>> diff --git a/test/TritonGPU/loop-pipeline-hopper.mlir b/test/TritonGPU/loop-pipeline-hopper.mlir new file mode 100644 index 000000000000..7c54ce39b839 --- /dev/null +++ b/test/TritonGPU/loop-pipeline-hopper.mlir @@ -0,0 +1,305 @@ +// RUN: triton-opt %s -split-input-file -tritongpu-pipeline=compute-capability=90 -canonicalize | FileCheck %s + +// 4 warps +// matmul: 128x32 @ 32x128 -> 128x128 +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#ALs0 = #triton_gpu.slice<{parent=#AL, dim=0}> +#BLs0 = #triton_gpu.slice<{parent=#BL, dim=0}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> +#B = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> + +// CHECK: tt.func @matmul_loop +// CHECK-DAG: %[[CONSTANT_0:.*]] = arith.constant 0 : i32 +// CHECK-DAG: %[[CONSTANT_1:.*]] = arith.constant 1 : i32 +// CHECK-DAG: %[[CONSTANT_2:.*]] = arith.constant 2 : i32 +// CHECK-DAG: %[[CONSTANT_3:.*]] = arith.constant 3 : i32 +// CHECK-DAG: %[[LOOP_COND_0:.*]] = arith.cmpi slt, %[[LB:.*]], %[[UB:.*]] +// CHECK: %[[ABUFFER:.*]] = triton_gpu.alloc_tensor +// CHECK-DAG: %[[LOOP_COND_0_SPLAT_A:.*]] = tt.splat %[[LOOP_COND_0]] +// CHECK: %[[A0BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_0]], %[[LOOP_COND_0_SPLAT_A]] +// CHECK: %[[BBUFFER:.*]] = triton_gpu.alloc_tensor +// CHECK-DAG: %[[LOOP_COND_0_SPLAT_B:.*]] = tt.splat %[[LOOP_COND_0]] +// CHECK: %[[B0BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_0]], %[[LOOP_COND_0_SPLAT_B]] +// CHECK-DAG: %[[IV_1:.*]] = arith.addi %[[LB]], %[[STEP:.*]] +// CHECK-DAG: %[[LOOP_COND_1:.*]] = arith.cmpi slt, %[[IV_1]], %[[UB]] +// CHECK-DAG: %[[LOOP_COND_1_SPLAT_A:.*]] = tt.splat %[[LOOP_COND_1]] +// CHECK: %[[A1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]], %[[LOOP_COND_1_SPLAT_A]] +// CHECK-DAG: %[[LOOP_COND_1_SPLAT_B:.*]] = tt.splat %[[LOOP_COND_1]] +// CHECK: %[[B1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]], %[[LOOP_COND_1_SPLAT_B]] +// CHECK: triton_gpu.async_wait {num = 2 : i32} +// CHECK: %[[A0:.*]] = triton_gpu.extract_slice %[[A1BUFFER]][0, 0, 0] +// CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] +// CHECK: %[[arg_a0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_a0]] +// CHECK: %[[arg_b0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_b0]] +// CHECK: tt.dot %[[arg_a0_dot_op]], %[[arg_b0_dot_op]], {{.*}} +// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, {{.*}} +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, {{.*}} +// CHECK: triton_gpu.async_wait {num = 2 : i32} +// CHECK: %[[NEXT_A:.*]] = triton_gpu.extract_slice %[[NEXT_A_BUFFER]][{{.*}}, 0, 0] +// CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][{{.*}}, 0, 0] +// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}} +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { +tt.func @matmul_loop(%lb : index, %ub : index, %step : index, + %A : !tt.ptr {tt.divisibility = 16 : i32}, + %B : !tt.ptr {tt.divisibility = 16 : i32}) { + // A ptrs + %a_ptr_splat = tt.splat %A : (!tt.ptr) -> tensor<128x32x!tt.ptr, #AL> + %a_tmp0 = tt.make_range {end = 32: i32, start = 0: i32} : tensor<32xi32, #ALs0> + %a_tmp1 = tt.expand_dims %a_tmp0 {axis = 0 : i32} : (tensor<32xi32, #ALs0>) -> tensor<1x32xi32, #AL> + %a_offs = tt.broadcast %a_tmp1 : (tensor<1x32xi32, #AL>) -> tensor<128x32xi32, #AL> + %a_ptr_init = tt.addptr %a_ptr_splat, %a_offs : tensor<128x32x!tt.ptr, #AL>, tensor<128x32xi32, #AL> + // B ptrs + %b_ptr_splat = tt.splat %B : (!tt.ptr) -> tensor<32x128x!tt.ptr, #BL> + %b_tmp0 = tt.make_range {end = 128: i32, start = 0: i32} : tensor<128xi32, #BLs0> + %b_tmp1 = tt.expand_dims %b_tmp0 {axis = 0 : i32} : (tensor<128xi32, #BLs0>) -> tensor<1x128xi32, #BL> + %b_offs = tt.broadcast %b_tmp1 : (tensor<1x128xi32, #BL>) -> tensor<32x128xi32, #BL> + %b_ptr_init = tt.addptr %b_ptr_splat, %b_offs : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + + + %a_mask = arith.constant dense : tensor<128x32xi1, #AL> + %a_other = arith.constant dense<0.00e+00> : tensor<128x32xf16, #AL> + %b_mask = arith.constant dense : tensor<32x128xi1, #BL> + %b_other = arith.constant dense<0.00e+00> : tensor<32x128xf16, #BL> + %c_init = arith.constant dense<0.00e+00> : tensor<128x128xf32, #C> + + %a_off = arith.constant dense<4> : tensor<128x32xi32, #AL> + %b_off = arith.constant dense<4> : tensor<32x128xi32, #BL> + + scf.for %iv = %lb to %ub step %step iter_args(%a_ptr = %a_ptr_init, %b_ptr = %b_ptr_init, %prev_c = %c_init) -> (tensor<128x32x!tt.ptr, #AL>, tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C>) { + %a_ = tt.load %a_ptr {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> + %a = triton_gpu.convert_layout %a_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A> + %b_ = tt.load %b_ptr, %b_mask, %b_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #BL> + %b = triton_gpu.convert_layout %b_ : (tensor<32x128xf16, #BL>) -> tensor<32x128xf16, #B> + + %c = tt.dot %a, %b, %prev_c {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A> * tensor<32x128xf16, #B> -> tensor<128x128xf32, #C> + + %next_a_ptr = tt.addptr %a_ptr, %a_off : tensor<128x32x!tt.ptr, #AL>, tensor<128x32xi32, #AL> + %next_b_ptr = tt.addptr %b_ptr, %b_off : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + scf.yield %next_a_ptr, %next_b_ptr, %c : tensor<128x32x!tt.ptr, #AL>, tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C> + } + tt.return +} +} + +// ----- + +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#ALs0 = #triton_gpu.slice<{parent=#AL, dim=0}> +#BLs0 = #triton_gpu.slice<{parent=#BL, dim=0}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> +#B = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> +// CHECK: tt.func @matmul_loop_nested +// CHECK-DAG: %[[CONSTANT_0:.*]] = arith.constant 0 : i32 +// CHECK-DAG: %[[CONSTANT_1:.*]] = arith.constant 1 : i32 +// CHECK-DAG: %[[CONSTANT_2:.*]] = arith.constant 2 : i32 +// CHECK-DAG: %[[CONSTANT_3:.*]] = arith.constant 3 : i32 +// CHECK: scf.for +// CHECK: %[[ABUFFER:.*]] = triton_gpu.alloc_tensor +// CHECK: %[[A0BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_0]] +// CHECK: %[[BBUFFER:.*]] = triton_gpu.alloc_tensor +// CHECK: %[[B0BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_0]] +// CHECK: %[[A1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]] +// CHECK: %[[B1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]] +// CHECK: triton_gpu.async_wait {num = 2 : i32} +// CHECK: %[[A0:.*]] = triton_gpu.extract_slice %[[A1BUFFER]][0, 0, 0] +// CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] +// CHECK: %[[arg_a0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_a0]] +// CHECK: %[[arg_b0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_b0]] +// CHECK: tt.dot %[[arg_a0_dot_op]], %[[arg_b0_dot_op]], {{.*}} +// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, {{.*}} +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, {{.*}} +// CHECK: triton_gpu.async_wait {num = 2 : i32} +// CHECK: %[[NEXT_A:.*]] = triton_gpu.extract_slice %[[NEXT_A_BUFFER]][{{.*}}, 0, 0] +// CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][{{.*}}, 0, 0] +// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}} +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { +tt.func @matmul_loop_nested(%lb : index, %ub : index, %step : index, + %A : !tt.ptr {tt.divisibility = 16 : i32}, + %B : !tt.ptr {tt.divisibility = 16 : i32}) { + scf.for %iv0 = %lb to %ub step %step { + // A ptrs + %a_ptr_splat = tt.splat %A : (!tt.ptr) -> tensor<128x32x!tt.ptr, #AL> + %a_tmp0 = tt.make_range {end = 32: i32, start = 0: i32} : tensor<32xi32, #ALs0> + %a_tmp1 = tt.expand_dims %a_tmp0 {axis = 0 : i32} : (tensor<32xi32, #ALs0>) -> tensor<1x32xi32, #AL> + %a_offs = tt.broadcast %a_tmp1 : (tensor<1x32xi32, #AL>) -> tensor<128x32xi32, #AL> + %a_ptr_init = tt.addptr %a_ptr_splat, %a_offs : tensor<128x32x!tt.ptr, #AL>, tensor<128x32xi32, #AL> + // B ptrs + %b_ptr_splat = tt.splat %B : (!tt.ptr) -> tensor<32x128x!tt.ptr, #BL> + %b_tmp0 = tt.make_range {end = 128: i32, start = 0: i32} : tensor<128xi32, #BLs0> + %b_tmp1 = tt.expand_dims %b_tmp0 {axis = 0 : i32} : (tensor<128xi32, #BLs0>) -> tensor<1x128xi32, #BL> + %b_offs = tt.broadcast %b_tmp1 : (tensor<1x128xi32, #BL>) -> tensor<32x128xi32, #BL> + %b_ptr_init = tt.addptr %b_ptr_splat, %b_offs : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + + %a_mask = arith.constant dense : tensor<128x32xi1, #AL> + %a_other = arith.constant dense<0.00e+00> : tensor<128x32xf16, #AL> + %b_mask = arith.constant dense : tensor<32x128xi1, #BL> + %b_other = arith.constant dense<0.00e+00> : tensor<32x128xf16, #BL> + %c_init = arith.constant dense<0.00e+00> : tensor<128x128xf32, #C> + + %a_off = arith.constant dense<4> : tensor<128x32xi32, #AL> + %b_off = arith.constant dense<4> : tensor<32x128xi32, #BL> + + scf.for %iv = %lb to %ub step %step iter_args(%a_ptr = %a_ptr_init, %b_ptr = %b_ptr_init, %prev_c = %c_init) -> (tensor<128x32x!tt.ptr, #AL>, tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C>) { + %a_ = tt.load %a_ptr, %a_mask, %a_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> + %a = triton_gpu.convert_layout %a_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A> + %b_ = tt.load %b_ptr, %b_mask, %b_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #BL> + %b = triton_gpu.convert_layout %b_ : (tensor<32x128xf16, #BL>) -> tensor<32x128xf16, #B> + + %c = tt.dot %a, %b, %prev_c {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A> * tensor<32x128xf16, #B> -> tensor<128x128xf32, #C> + + %next_a_ptr = tt.addptr %a_ptr, %a_off : tensor<128x32x!tt.ptr, #AL>, tensor<128x32xi32, #AL> + %next_b_ptr = tt.addptr %b_ptr, %b_off : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + scf.yield %next_a_ptr, %next_b_ptr, %c : tensor<128x32x!tt.ptr, #AL>, tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C> + } + } + tt.return +} +} + +// ----- + +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#ALs0 = #triton_gpu.slice<{parent=#AL, dim=0}> +#BLs0 = #triton_gpu.slice<{parent=#BL, dim=0}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +#A = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> +#B = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> +// CHECK: tt.func @matmul_loop_single_pipeline +// CHECK-DAG: %[[CONSTANT_0:.*]] = arith.constant 0 : i32 +// CHECK-DAG: %[[CONSTANT_1:.*]] = arith.constant 1 : i32 +// CHECK-DAG: %[[CONSTANT_2:.*]] = arith.constant 2 : i32 +// CHECK-DAG: %[[CONSTANT_3:.*]] = arith.constant 3 : i32 +// CHECK: %[[BBUFFER:.*]] = triton_gpu.alloc_tensor +// CHECK: %[[B0BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_0]] +// CHECK: %[[B1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]] +// CHECK: triton_gpu.async_wait {num = 1 : i32} +// CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] +// CHECK: %[[arg_b0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_b0]] +// CHECK: tt.dot {{.*}}, %[[arg_b0_dot_op]], {{.*}} +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, {{.*}} +// CHECK: triton_gpu.async_wait {num = 1 : i32} +// CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][{{.*}}, 0, 0] +// CHECK: scf.yield {{.*}}, {{.*}}, %[[NEXT_B_BUFFER]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, {{.*}} +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { +tt.func @matmul_loop_single_pipeline(%lb : index, %ub : index, %step : index, + %A : !tt.ptr {tt.divisibility = 16 : i32}, + %B : !tt.ptr {tt.divisibility = 16 : i32}) { + // A ptrs + %a_ptr_splat = tt.splat %A : (!tt.ptr) -> tensor<128x32x!tt.ptr, #AL> + %a_tmp0 = tt.make_range {end = 32: i32, start = 0: i32} : tensor<32xi32, #ALs0> + %a_tmp1 = tt.expand_dims %a_tmp0 {axis = 0 : i32} : (tensor<32xi32, #ALs0>) -> tensor<1x32xi32, #AL> + %a_offs = tt.broadcast %a_tmp1 : (tensor<1x32xi32, #AL>) -> tensor<128x32xi32, #AL> + %a_ptr_init = tt.addptr %a_ptr_splat, %a_offs : tensor<128x32x!tt.ptr, #AL>, tensor<128x32xi32, #AL> + // B ptrs + %b_ptr_splat = tt.splat %B : (!tt.ptr) -> tensor<32x128x!tt.ptr, #BL> + %b_tmp0 = tt.make_range {end = 128: i32, start = 0: i32} : tensor<128xi32, #BLs0> + %b_tmp1 = tt.expand_dims %b_tmp0 {axis = 0 : i32} : (tensor<128xi32, #BLs0>) -> tensor<1x128xi32, #BL> + %b_offs = tt.broadcast %b_tmp1 : (tensor<1x128xi32, #BL>) -> tensor<32x128xi32, #BL> + %b_ptr_init = tt.addptr %b_ptr_splat, %b_offs : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + + %a_mask = arith.constant dense : tensor<128x32xi1, #AL> + %a_other = arith.constant dense<0.00e+00> : tensor<128x32xf16, #AL> + + %a_ = tt.load %a_ptr_init, %a_mask, %a_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #AL> + %a = triton_gpu.convert_layout %a_ : (tensor<128x32xf16, #AL>) -> tensor<128x32xf16, #A> + + %b_mask = arith.constant dense : tensor<32x128xi1, #BL> + %b_other = arith.constant dense<0.00e+00> : tensor<32x128xf16, #BL> + %c_init = arith.constant dense<0.00e+00> : tensor<128x128xf32, #C> + + %b_off = arith.constant dense<4> : tensor<32x128xi32, #BL> + + scf.for %iv = %lb to %ub step %step iter_args(%b_ptr = %b_ptr_init, %prev_c = %c_init) -> (tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C>) { + %b_ = tt.load %b_ptr, %b_mask, %b_other {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #BL> + %b = triton_gpu.convert_layout %b_ : (tensor<32x128xf16, #BL>) -> tensor<32x128xf16, #B> + %c = tt.dot %a, %b, %prev_c {allowTF32 = true, transA = false, transB = false} : tensor<128x32xf16, #A> * tensor<32x128xf16, #B> -> tensor<128x128xf32, #C> + %next_b_ptr = tt.addptr %b_ptr, %b_off : tensor<32x128x!tt.ptr, #BL>, tensor<32x128xi32, #BL> + scf.yield %next_b_ptr, %c : tensor<32x128x!tt.ptr, #BL>, tensor<128x128xf32, #C> + } + tt.return +} +} + +// ----- + +// TODO: MCast is not supported yet +//// 4 warps, TMA Load +//// matmul: 128x32 @ 32x128 -> 128x128 +//#C = #triton_gpu.mma<{versionMajor = 3, warpsPerCTA = [4, 1]}> +//#SA = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [2, 1], CTASplitNum = [2, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +//#SB = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [2, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], hasLeadingOffset=true}> +//#BA = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [2, 1], CTASplitNum = [2, 1], CTAOrder = [1, 0]}> +//#BB = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [2, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +//// C-HECK: func @matmul_loop +//// C-HECK-DAG: %[[CONSTANT_0:.*]] = arith.constant 0 : i32 +//// C-HECK-DAG: %[[CONSTANT_1:.*]] = arith.constant 1 : i32 +//// C-HECK-DAG: %[[CONSTANT_2:.*]] = arith.constant 2 : i32 +//// C-HECK-DAG: %[[CONSTANT_3:.*]] = arith.constant 3 : i32 +//// C-HECK: %[[MBARRIER_AB:.*]] = triton_nvidia_gpu.alloc_mbarrier {count = 1 : i32} +//// C-HECK: %[[EMPTY_BARRIER_B:.*]] = triton_nvidia_gpu.alloc_mbarrier {count = 2 : i32} +//// C-HECK: %[[ABUFFER:.*]] = triton_gpu.alloc_tensor +//// C-HECK: %[[MBARRIER_AB0:.*]] = triton_nvidia_gpu.extract_mbarrier %[[MBARRIER_AB]][%c0_i32] +//// C-HECK: triton_nvidia_gpu.mbarrier_arrive %[[MBARRIER_AB0]] +//// C-HECK: %[[A0BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, %[[CONSTANT_0]], %[[MBARRIER_AB0]] +//// C-HECK: %[[BBUFFER:.*]] = triton_gpu.alloc_tensor +//// C-HECK: %[[EMPTY_BARRIER_B0:.*]] = triton_nvidia_gpu.extract_mbarrier %[[EMPTY_BARRIER_B]][%c0_i32] +//// C-HECK: triton_nvidia_gpu.mbarrier_wait %[[EMPTY_BARRIER_B0]], %true +//// C-HECK: %[[B0BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, %[[CONSTANT_0]], %[[MBARRIER_AB0]] +//// C-HECK: %[[MBARRIER_AB1:.*]] = triton_nvidia_gpu.extract_mbarrier %[[MBARRIER_AB]][%c1_i32] +//// C-HECK: triton_nvidia_gpu.mbarrier_arrive %[[MBARRIER_AB1]] +//// C-HECK: %[[A1BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, %[[CONSTANT_1]], %[[MBARRIER_AB1]] +//// C-HECK: %[[B1BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, %[[CONSTANT_1]], %[[MBARRIER_AB1]] +//// C-HECK: %[[A0:.*]] = triton_gpu.extract_slice %[[A1BUFFER]][0, 0, 0] +//// C-HECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] +//// C-HECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] +// // C-HECK: %[[MBARRIER_AB_ITER:.*]] = triton_nvidia_gpu.extract_mbarrier %[[MBARRIER_AB]][{{.*}}] +// // C-HECK: triton_nvidia_gpu.mbarrier_wait %[[MBARRIER_AB_ITER]], {{.*}} +// // C-HECK: triton_nvidia_gpu.dot_async %[[arg_a0]], %[[arg_b0]], {{.*}} +// // C-HECK: triton_nvidia_gpu.dot_wait {{.*}} +// // C-HECK: %[[EMPTY_BARRIER_B_ITER_ARRIVE:.*]] = triton_nvidia_gpu.extract_mbarrier %[[EMPTY_BARRIER_B]][{{.*}}] +// // C-HECK: triton_nvidia_gpu.mbarrier_arrive %[[EMPTY_BARRIER_B_ITER_ARRIVE]] +// // C-HECK: %[[MBARRIER_AB_NEXT_ITER:.*]] = triton_nvidia_gpu.extract_mbarrier %[[MBARRIER_AB]][{{.*}}] +// // C-HECK: %[[NEXT_A_BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, {{.*}}, %[[MBARRIER_AB_NEXT_ITER]] +// // C-HECK: %[[NEXT_A:.*]] = triton_gpu.extract_slice %[[NEXT_A_BUFFER]][{{.*}}, 0, 0] +// // C-HECK: %[[EMPTY_BARRIER_B_ITER_WAIT:.*]] = triton_nvidia_gpu.extract_mbarrier %[[EMPTY_BARRIER_B]][{{.*}}] +// // C-HECK: triton_nvidia_gpu.mbarrier_wait %[[EMPTY_BARRIER_B_ITER_WAIT]], {{.*}} +// // C-HECK: %[[NEXT_B_BUFFER:.*]] = triton_nvidia_gpu.insert_slice_async_v2 {{.*}}, {{.*}}, {{.*}}, %[[MBARRIER_AB_NEXT_ITER]] +// // C-HECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][{{.*}}, 0, 0] +// // C-HECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}} +//module attributes {"triton_gpu.num-ctas" = 2 : i32, "triton_gpu.num-warps" = 4 : i32} { +// tt.func @matmul_loop(%lb : index, %ub : index, %step : index, +// %A : !tt.ptr {tt.divisibility = 16 : i32}, +// %B : !tt.ptr {tt.divisibility = 16 : i32}) -> (!tt.ptr, 1>, !tt.ptr, 1>, tensor<128x128xf32, #C>) { +// %c0 = arith.constant 0 : i32 +// %c32_i32 = arith.constant 32 : i32 +// %c1 = arith.constant 1 : i64 +// %c32 = arith.constant 32 : i64 +// %c128 = arith.constant 128 : i64 +// %a_tileptr_init = tt.make_tensor_ptr %A, [%c128, %c32], [%c32, %c1], [%c0, %c0] { order = array } : !tt.ptr, 1> +// %b_tileptr_init = tt.make_tensor_ptr %B, [%c32, %c128], [%c1, %c32], [%c0, %c0] { order = array } : !tt.ptr, 1> +// %c_init = arith.constant dense<0.00e+00> : tensor<128x128xf32, #C> +// +// %res:3 = scf.for %iv = %lb to %ub step %step iter_args(%a_tileptr = %a_tileptr_init, %b_tileptr = %b_tileptr_init, %prev_c = %c_init) -> (!tt.ptr, 1>, !tt.ptr, 1>, tensor<128x128xf32, #C>) { +// %a = tt.load %a_tileptr {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<128x32xf16, #BA> +// %b = tt.load %b_tileptr {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<32x128xf16, #BB> +// +// %sa = triton_gpu.convert_layout %a : (tensor<128x32xf16, #BA>) -> tensor<128x32xf16, #SA> +// %sb = triton_gpu.convert_layout %b : (tensor<32x128xf16, #BB>) -> tensor<32x128xf16, #SB> +// %c = tt.dot %sa, %sb, %prev_c {allowTF32 = true} : tensor<128x32xf16, #SA> * tensor<32x128xf16, #SB> -> tensor<128x128xf32, #C> +// +// %a_tileptr_next = tt.advance %a_tileptr, [%c0, %c32_i32] : !tt.ptr, 1> +// %b_tileptr_next = tt.advance %b_tileptr, [%c32_i32, %c0] : !tt.ptr, 1> +// +// scf.yield %a_tileptr_next, %b_tileptr_next, %c : !tt.ptr, 1>, !tt.ptr, 1>, tensor<128x128xf32, #C> +// } +// tt.return %res#0, %res#1, %res#2 : !tt.ptr, 1>, !tt.ptr, 1>, tensor<128x128xf32, #C> +// } +//} diff --git a/test/TritonGPU/loop-pipeline.mlir b/test/TritonGPU/loop-pipeline.mlir index 7e49a2f2a462..626e7bdb1c85 100644 --- a/test/TritonGPU/loop-pipeline.mlir +++ b/test/TritonGPU/loop-pipeline.mlir @@ -2,12 +2,12 @@ // 4 warps // matmul: 128x32 @ 32x128 -> 128x128 -#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0]}> -#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0]}> +#AL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 1]}> +#BL = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 1]}> #ALs0 = #triton_gpu.slice<{parent=#AL, dim=0}> #BLs0 = #triton_gpu.slice<{parent=#BL, dim=0}> #BLs1 = #triton_gpu.slice<{parent=#BL, dim=1}> -#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1]}> +#C = #triton_gpu.mma<{versionMajor = 2, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> #A = #triton_gpu.dot_op<{opIdx = 0, parent = #C, kWidth=2}> #B = #triton_gpu.dot_op<{opIdx = 1, parent = #C, kWidth=2}> @@ -32,21 +32,23 @@ // CHECK: triton_gpu.async_wait {num = 2 : i32} // CHECK: %[[A0:.*]] = triton_gpu.extract_slice %[[A1BUFFER]][0, 0, 0] // CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] -// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_1]] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] // CHECK: %[[arg_a0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_a0]] // CHECK: %[[arg_b0_dot_op_0:.*]] = triton_gpu.convert_layout %[[arg_b0]] // CHECK: %[[arg_b0_dot_op_1:.*]] = arith.mulf %[[arg_b0_dot_op_0]] // CHECK: tt.dot %[[arg_a0_dot_op]], %[[arg_b0_dot_op_1]], {{.*}} -// CHECK-DAG: %[[INSERT_IDX:.*]] = arith.remsi %[[PIPELINE_IDX]], %[[CONSTANT_3]] -// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.remsi %[[LOOP_IDX]], %[[CONSTANT_3]] -// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[INSERT_IDX]] -// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[INSERT_IDX]] +// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] : i32 +// CHECK-DAG: %[[CMP_LOOP:.*]] = arith.cmpi uge, %[[NEXT_LOOP_IDX]], %[[CONSTANT_3]] +// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.select %[[CMP_LOOP]], %[[CONSTANT_0]], %[[NEXT_LOOP_IDX]] +// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[PIPELINE_IDX]] +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[PIPELINE_IDX]] // CHECK: triton_gpu.async_wait {num = 2 : i32} // CHECK: %[[NEXT_A:.*]] = triton_gpu.extract_slice %[[NEXT_A_BUFFER]][%[[EXTRACT_IDX]], 0, 0] // CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][%[[EXTRACT_IDX]], 0, 0] -// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] -// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] -// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[NEXT_LOOP_IDX]] +// CHECK-DAG: %[[PIPELINE_IDX_PLUS_ONE:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] +// CHECK-DAG: %[[CMP_PIPELINE:.*]] = arith.cmpi uge, %[[PIPELINE_IDX_PLUS_ONE]], %[[CONSTANT_3]] +// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.select %[[CMP_PIPELINE]], %[[CONSTANT_0]], %[[PIPELINE_IDX_PLUS_ONE]] +// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[EXTRACT_IDX]] tt.func @matmul_loop(%lb : index, %ub : index, %step : index, %A : !tt.ptr {tt.divisibility = 16 : i32}, %B : !tt.ptr {tt.divisibility = 16 : i32}) -> tensor<128x128xf32, #C> { @@ -106,20 +108,22 @@ tt.func @matmul_loop(%lb : index, %ub : index, %step : index, // CHECK: triton_gpu.async_wait {num = 2 : i32} // CHECK: %[[A0:.*]] = triton_gpu.extract_slice %[[A1BUFFER]][0, 0, 0] // CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] -// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_1]] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}, %[[arg_a0:.*]] = %[[A0]], %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] // CHECK: %[[arg_a0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_a0]] // CHECK: %[[arg_b0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_b0]] // CHECK: tt.dot %[[arg_a0_dot_op]], %[[arg_b0_dot_op]], {{.*}} -// CHECK-DAG: %[[INSERT_IDX:.*]] = arith.remsi %[[PIPELINE_IDX]], %[[CONSTANT_3]] -// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.remsi %[[LOOP_IDX]], %[[CONSTANT_3]] -// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[INSERT_IDX]] -// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[INSERT_IDX]] +// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] : i32 +// CHECK-DAG: %[[CMP_LOOP:.*]] = arith.cmpi uge, %[[NEXT_LOOP_IDX]], %[[CONSTANT_3]] +// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.select %[[CMP_LOOP]], %[[CONSTANT_0]], %[[NEXT_LOOP_IDX]] +// CHECK: %[[NEXT_A_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[PIPELINE_IDX]] +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[PIPELINE_IDX]] // CHECK: triton_gpu.async_wait {num = 2 : i32} // CHECK: %[[NEXT_A:.*]] = triton_gpu.extract_slice %[[NEXT_A_BUFFER]][%[[EXTRACT_IDX]], 0, 0] // CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][%[[EXTRACT_IDX]], 0, 0] -// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] -// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] -// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[NEXT_LOOP_IDX]] +// CHECK-DAG: %[[PIPELINE_IDX_PLUS_ONE:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] +// CHECK-DAG: %[[CMP_PIPELINE:.*]] = arith.cmpi uge, %[[PIPELINE_IDX_PLUS_ONE]], %[[CONSTANT_3]] +// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.select %[[CMP_PIPELINE]], %[[CONSTANT_0]], %[[PIPELINE_IDX_PLUS_ONE]] +// CHECK: scf.yield {{.*}}, {{.*}}, {{.*}}, %[[NEXT_A_BUFFER]], %[[NEXT_B_BUFFER]], %[[NEXT_A]], %[[NEXT_B]], {{.*}}, {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[EXTRACT_IDX]] tt.func @matmul_loop_nested(%lb : index, %ub : index, %step : index, %A : !tt.ptr {tt.divisibility = 16 : i32}, %B : !tt.ptr {tt.divisibility = 16 : i32}) -> tensor<128x128xf32, #C>{ @@ -176,17 +180,19 @@ tt.func @matmul_loop_nested(%lb : index, %ub : index, %step : index, // CHECK: %[[B1BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[CONSTANT_1]] // CHECK: triton_gpu.async_wait {num = 1 : i32} // CHECK: %[[B0:.*]] = triton_gpu.extract_slice %[[B1BUFFER]][0, 0, 0] -// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_1]] +// CHECK: scf.for {{.*}} iter_args({{.*}}, {{.*}}, {{.*}}, %[[arg_b0:.*]] = %[[B0]], {{.*}}, {{.*}}, %[[PIPELINE_IDX:.*]] = %[[CONSTANT_2]], %[[LOOP_IDX:.*]] = %[[CONSTANT_0]] // CHECK: %[[arg_b0_dot_op:.*]] = triton_gpu.convert_layout %[[arg_b0]] // CHECK: tt.dot {{.*}}, %[[arg_b0_dot_op]], {{.*}} -// CHECK-DAG: %[[INSERT_IDX:.*]] = arith.remsi %[[PIPELINE_IDX]], %[[CONSTANT_3]] -// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.remsi %[[LOOP_IDX]], %[[CONSTANT_3]] -// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[INSERT_IDX]] +// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] : i32 +// CHECK-DAG: %[[CMP_LOOP:.*]] = arith.cmpi uge, %[[NEXT_LOOP_IDX]], %[[CONSTANT_3]] +// CHECK-DAG: %[[EXTRACT_IDX:.*]] = arith.select %[[CMP_LOOP]], %[[CONSTANT_0]], %[[NEXT_LOOP_IDX]] +// CHECK: %[[NEXT_B_BUFFER:.*]] = triton_gpu.insert_slice_async {{.*}}, {{.*}}, %[[PIPELINE_IDX]] // CHECK: triton_gpu.async_wait {num = 1 : i32} // CHECK: %[[NEXT_B:.*]] = triton_gpu.extract_slice %[[NEXT_B_BUFFER]][%[[EXTRACT_IDX]], 0, 0] -// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] -// CHECK-DAG: %[[NEXT_LOOP_IDX:.*]] = arith.addi %[[LOOP_IDX]], %[[CONSTANT_1]] -// CHECK: scf.yield {{.*}}, {{.*}}, %[[NEXT_B_BUFFER]], %[[NEXT_B]], {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[NEXT_LOOP_IDX]] +// CHECK-DAG: %[[PIPELINE_IDX_PLUS_ONE:.*]] = arith.addi %[[PIPELINE_IDX]], %[[CONSTANT_1]] +// CHECK-DAG: %[[CMP_PIPELINE:.*]] = arith.cmpi uge, %[[PIPELINE_IDX_PLUS_ONE]], %[[CONSTANT_3]] +// CHECK-DAG: %[[NEXT_PIPELINE_IDX:.*]] = arith.select %[[CMP_PIPELINE]], %[[CONSTANT_0]], %[[PIPELINE_IDX_PLUS_ONE]] +// CHECK: scf.yield {{.*}}, {{.*}}, %[[NEXT_B_BUFFER]], %[[NEXT_B]], {{.*}}, {{.*}}, %[[NEXT_PIPELINE_IDX]], %[[EXTRACT_IDX]] tt.func @matmul_loop_single_pipeline(%lb : index, %ub : index, %step : index, %A : !tt.ptr {tt.divisibility = 16 : i32}, %B : !tt.ptr {tt.divisibility = 16 : i32}) -> tensor<128x128xf32, #C> { diff --git a/test/TritonGPU/materialize-load-store.mlir b/test/TritonGPU/materialize-load-store.mlir new file mode 100644 index 000000000000..65ca0e6c65a7 --- /dev/null +++ b/test/TritonGPU/materialize-load-store.mlir @@ -0,0 +1,63 @@ +// RUN: ENABLE_TMA=1 triton-opt %s -split-input-file -triton-nvidia-gpu-materialize-load-store=compute-capability=90 -canonicalize | FileCheck %s + +// CHECK-LABEL: @matmul_loop +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func @matmul_loop(%A : !tt.ptr {tt.divisibility = 16 : i32}) -> (tensor<64x16xf16, #blocked>) { + %c0 = arith.constant 0 : i32 + %c1 = arith.constant 1 : i64 + %c16 = arith.constant 16 : i64 + %c64 = arith.constant 64 : i64 + // CHECK: %[[TENSOR_PTR:.*]] = tt.make_tensor_ptr + %a_tileptr_init = tt.make_tensor_ptr %A, [%c64, %c16], [%c16, %c1], [%c0, %c0] { order = array } : !tt.ptr, 1> + // CHECK: %[[BUFFER:.*]] = triton_gpu.alloc_tensor : tensor<1x64x16xf16, #shared> + // CHECK: %[[MBAR:.*]] = triton_nvidia_gpu.alloc_mbarrier {count = 1 : i32} : !tt.ptr + // CHECK: triton_nvidia_gpu.mbarrier_arrive %[[MBAR]], %{{.*}} {operand_segment_sizes = array, trackAsyncOp = false, txCount = 2048 : i32} : !tt.ptr, i1 + // CHECK: %[[INSERT:.*]] = triton_nvidia_gpu.insert_slice_async_v2 %[[TENSOR_PTR]], %[[BUFFER]], %{{.*}}, %[[MBAR]] + // CHECK: %[[EXT:.*]] = triton_gpu.extract_slice %[[INSERT]][0, 0, 0] [1, 64, 16] [1, 1, 1] : tensor<1x64x16xf16, #shared> to tensor<64x16xf16, #shared> + // CHECK: triton_nvidia_gpu.mbarrier_wait %[[MBAR]], %false : + // CHECK: %[[CVT:.*]] = triton_gpu.convert_layout %[[EXT]] : (tensor<64x16xf16, #shared>) -> tensor<64x16xf16, #blocked> + // CHECK: tt.return %[[CVT]] : tensor<64x16xf16, #blocked> + %res = tt.load %a_tileptr_init {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blocked> + tt.return %res : tensor<64x16xf16, #blocked> + } +} + +// CHECK-LABEL: matmul_no_scf + +#blockedA0 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blockedB0 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blockedA1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blockedB1 = #triton_gpu.blocked<{sizePerThread = [2, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 16, 16]}> +#sharedA = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#sharedB = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func public @matmul_no_scf(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg4: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg5: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg6: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg7: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg8: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x16xf32, #mma> + %c0_i32 = arith.constant 0 : i32 + %c1_i64 = arith.constant 1 : i64 + %0 = arith.extsi %arg3 : i32 to i64 + %1 = arith.extsi %arg5 : i32 to i64 + %2 = arith.extsi %arg6 : i32 to i64 + %3 = tt.make_tensor_ptr %arg0, [%0, %1], [%2, %c1_i64], [%c0_i32, %c0_i32] {order = array} : , 1> + %4 = arith.extsi %arg4 : i32 to i64 + %5 = arith.extsi %arg7 : i32 to i64 + %6 = tt.make_tensor_ptr %arg1, [%1, %4], [%c1_i64, %5], [%c0_i32, %c0_i32] {order = array} : , 1> + // CHECK: %[[LOADED_A:.*]] = triton_gpu.extract_slice + // CHECK: %[[LOADED_B:.*]] = triton_gpu.extract_slice + // CHECK-NOT: triton_gpu.convert_layout {{.*}}#shared{{.*}}->{{.*}}#blocked + // CHECK: tt.dot %[[LOADED_A]], %[[LOADED_B]] + %7 = tt.load %3 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blockedA1> + %8 = tt.load %6 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<16x16xf16, #blockedB1> + %9 = triton_gpu.convert_layout %7 : (tensor<64x16xf16, #blockedA1>) -> tensor<64x16xf16, #sharedA> + %10 = triton_gpu.convert_layout %8 : (tensor<16x16xf16, #blockedB1>) -> tensor<16x16xf16, #sharedB> + %11 = tt.dot %9, %10, %cst {allowTF32 = true} : tensor<64x16xf16, #sharedA> * tensor<16x16xf16, #sharedB> -> tensor<64x16xf32, #mma> + %12 = triton_gpu.convert_layout %11 : (tensor<64x16xf32, #mma>) -> tensor<64x16xf32, #blockedA1> + %13 = arith.truncf %12 : tensor<64x16xf32, #blockedA1> to tensor<64x16xf16, #blockedA1> + %14 = arith.extsi %arg8 : i32 to i64 + %15 = tt.make_tensor_ptr %arg2, [%0, %4], [%14, %c1_i64], [%c0_i32, %c0_i32] {order = array} : , 1> + tt.store %15, %13 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32} : !tt.ptr, 1>, tensor<64x16xf16, #blockedA1> + tt.return + } +} diff --git a/test/TritonGPU/rewrite-tensor-pointer.mlir b/test/TritonGPU/rewrite-tensor-pointer.mlir new file mode 100644 index 000000000000..d6f46f76be73 --- /dev/null +++ b/test/TritonGPU/rewrite-tensor-pointer.mlir @@ -0,0 +1,64 @@ +// RUN: triton-opt %s -tritongpu-rewrite-tensor-pointer | FileCheck %s + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [4, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0]}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func public @matmul_kernel_0d1d2d3d456d7d8c9c10d11c121314c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: !tt.ptr {tt.divisibility = 16 : i32}, %arg4: i32, %arg5: i32, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}, %arg9: i32, %arg10: i32) { + %c127_i32 = arith.constant 127 : i32 + %c64_i32 = arith.constant 64 : i32 + %c0_i32 = arith.constant 0 : i32 + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #blocked> + %c1_i64 = arith.constant 1 : i64 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg5, %c127_i32 : i32 + %2 = arith.divsi %1, %c128_i32 : i32 + %3 = arith.addi %arg4, %c127_i32 : i32 + %4 = arith.divsi %3, %c128_i32 : i32 + %5 = arith.muli %2, %c8_i32 : i32 + %6 = arith.divsi %0, %5 : i32 + %7 = arith.muli %6, %c8_i32 : i32 + %8 = arith.subi %4, %7 : i32 + %9 = "triton_gpu.cmpi"(%8, %c8_i32) {predicate = 2 : i64} : (i32, i32) -> i1 + %10 = arith.select %9, %8, %c8_i32 : i32 + %11 = arith.remsi %0, %10 : i32 + %12 = arith.addi %7, %11 : i32 + %13 = arith.remsi %0, %5 : i32 + %14 = arith.divsi %13, %10 : i32 + %15 = arith.muli %12, %c128_i32 : i32 + %16 = arith.muli %14, %c128_i32 : i32 + %17 = arith.extsi %arg4 : i32 to i64 + %18 = arith.extsi %arg6 : i32 to i64 + %19 = arith.extsi %arg7 : i32 to i64 + // CHECK-NOT: tt.make_tensor_ptr + %20 = tt.make_tensor_ptr %arg0, [%17, %18], [%19, %c1_i64], [%15, %c0_i32] {order = array} : , 1> + %21 = arith.extsi %arg5 : i32 to i64 + %22 = arith.extsi %arg8 : i32 to i64 + // CHECK-NOT: tt.make_tensor_ptr + %23 = tt.make_tensor_ptr %arg1, [%18, %21], [%c1_i64, %22], [%c0_i32, %16] {order = array} : , 1> + %24:3 = scf.for %arg11 = %c0_i32 to %arg6 step %c64_i32 iter_args(%arg12 = %cst, %arg13 = %20, %arg14 = %23) -> (tensor<128x128xf32, #blocked>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + // CHECK: tt.load %{{.*}}, %{{.*}}, %{{.*}} {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : tensor<128x64xf16, + %28 = tt.load %arg13 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : !tt.ptr, 1> -> tensor<128x64xf16, #blocked> + // CHECK: tt.load %{{.*}}, %{{.*}}, %{{.*}} {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : tensor<64x128xf16, + %29 = tt.load %arg14 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false, padding = 2 : i32} : !tt.ptr, 1> -> tensor<64x128xf16, #blocked1> + %30 = triton_gpu.convert_layout %28 : (tensor<128x64xf16, #blocked>) -> tensor<128x64xf16, #triton_gpu.dot_op<{opIdx = 0, parent = #blocked2}>> + %31 = triton_gpu.convert_layout %29 : (tensor<64x128xf16, #blocked1>) -> tensor<64x128xf16, #triton_gpu.dot_op<{opIdx = 1, parent = #blocked2}>> + %32 = triton_gpu.convert_layout %arg12 : (tensor<128x128xf32, #blocked>) -> tensor<128x128xf32, #blocked2> + %33 = tt.dot %30, %31, %32 {allowTF32 = true} : tensor<128x64xf16, #triton_gpu.dot_op<{opIdx = 0, parent = #blocked2}>> * tensor<64x128xf16, #triton_gpu.dot_op<{opIdx = 1, parent = #blocked2}>> -> tensor<128x128xf32, #blocked2> + %34 = triton_gpu.convert_layout %33 : (tensor<128x128xf32, #blocked2>) -> tensor<128x128xf32, #blocked> + // CHECK-NOT: tt.advance + %35 = tt.advance %arg13, [%c0_i32, %c64_i32] : , 1> + // CHECK-NOT: tt.advance + %36 = tt.advance %arg14, [%c64_i32, %c0_i32] : , 1> + scf.yield %34, %35, %36 : tensor<128x128xf32, #blocked>, !tt.ptr, 1>, !tt.ptr, 1> + } + %25 = arith.truncf %24#0 : tensor<128x128xf32, #blocked> to tensor<128x128xf16, #blocked> + %26 = arith.extsi %arg10 : i32 to i64 + %27 = tt.make_tensor_ptr %arg3, [%17, %21], [%26, %c1_i64], [%15, %16] {order = array} : , 1> + // CHECK: tt.store %{{.*}}, %{{.*}}, %{{.*}} {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked> + tt.store %27, %25 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32} : !tt.ptr, 1>, tensor<128x128xf16, #blocked> + tt.return + } +} diff --git a/test/TritonGPU/wsdecomposing.mlir b/test/TritonGPU/wsdecomposing.mlir new file mode 100644 index 000000000000..059554a59195 --- /dev/null +++ b/test/TritonGPU/wsdecomposing.mlir @@ -0,0 +1,754 @@ +// RUN: triton-opt -split-input-file -triton-nvidia-gpu-ws-decomposing='compute-capability=90' %s 2>&1 | FileCheck %s +// XFAIL: * +// TODO: change this test to not check for a fixed IR. + +// Check if all opereations are labeled with appropriate attributes. +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32} { + // CHECK-LABEL: @simple_gemm + tt.func public @simple_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + %93 = tt.dot %91, %92, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %94 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + + // CHECK-NEXT: %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<128x128xf32, #mma> + // CHECK-NEXT: %cst_0 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %cst_1 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %c31_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 31 : i32 + // CHECK-NEXT: %c127_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 127 : i32 + // CHECK-NEXT: %c1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 1 : index + // CHECK-NEXT: %c0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : index + // CHECK-NEXT: %c32_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 32 : i32 + // CHECK-NEXT: %c128_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 128 : i32 + // CHECK-NEXT: %c8_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 8 : i32 + // CHECK-NEXT: %0 = tt.get_program_id {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + // CHECK-NEXT: %1 = tt.get_program_id {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : i32 + // CHECK-NEXT: %2 = arith.addi %arg3, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %3 = arith.divsi %2, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %4 = arith.addi %arg4, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %5 = arith.divsi %4, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %6 = arith.muli %5, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %7 = arith.divsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %8 = arith.muli %7, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %9 = arith.subi %3, %8 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %10 = arith.cmpi slt, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %11 = arith.select %10, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %12 = arith.remsi %0, %11 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %13 = arith.addi %8, %12 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %14 = arith.remsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %15 = arith.divsi %14, %11 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %16 = arith.muli %13, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %17 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %18 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %19 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %20 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %21 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %22 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %23 = tt.splat %16 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %24 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %25 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %26 = arith.addi %23, %17 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %27 = arith.addi %24, %19 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %28 = arith.addi %25, %21 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %29 = arith.muli %15, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %31 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %32 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %33 = arith.addi %30, %18 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %34 = arith.addi %31, %20 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %35 = arith.addi %32, %22 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %36 = tt.splat %arg3 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %37 = tt.splat %arg3 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %38 = arith.remsi %26, %36 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %39 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %40 = tt.splat %arg4 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %41 = arith.remsi %33, %39 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %42 = arith.muli %1, %c32_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + // CHECK-NEXT: %43 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %44 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %45 = tt.splat %42 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %46 = tt.splat %42 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %47 = arith.addi %45, %43 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %48 = arith.addi %46, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %49 = tt.expand_dims %38 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %50 = tt.splat %arg6 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %51 = arith.muli %49, %50 {async_agent = dense<0> : vector<1xi32>} : tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %52 = tt.expand_dims %47 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + // CHECK-NEXT: %53 = tt.broadcast %51 {async_agent = dense<0> : vector<1xi32>} : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %54 = tt.broadcast %52 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %55 = arith.addi %53, %54 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %56 = tt.splat %arg0 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + // CHECK-NEXT: %57 = tt.addptr %56, %55 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %58 = tt.expand_dims %48 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + // CHECK-NEXT: %59 = tt.expand_dims %41 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %60 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %61 = arith.muli %59, %60 {async_agent = dense<0> : vector<1xi32>} : tensor<1x128xi32, #blocked> + // CHECK-NEXT: %62 = tt.broadcast %58 {async_agent = dense<0> : vector<1xi32>} : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %63 = tt.broadcast %61 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %64 = arith.addi %62, %63 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %65 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: %66 = tt.addptr %65, %64 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: %67 = arith.addi %arg5, %c31_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %68 = arith.divsi %67, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %69 = arith.index_cast %68 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 to index + // CHECK-NEXT: %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + // CHECK-NEXT: %89 = tt.load %arg11 {async_agent = dense<0> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: %90 = tt.load %arg12 {async_agent = dense<0> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + // CHECK-NEXT: %91 = triton_gpu.convert_layout %89 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + // CHECK-NEXT: %92 = triton_gpu.convert_layout %90 {async_agent = dense<1> : vector<1xi32>} : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + // CHECK-NEXT: %93 = tt.dot %91, %92, %arg10 {allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + // CHECK-NEXT: %94 = tt.addptr %arg11, %cst_1 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %95 = tt.addptr %arg12, %cst_0 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: scf.yield {async_agent = dense<[0, 1]> : vector<2xi32>} %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: } {async_agent = dense<[0, 1]> : vector<2xi32>} + // CHECK-NEXT: %71 = arith.truncf %70#0 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + // CHECK-NEXT: %72 = tt.expand_dims %27 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %73 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %74 = arith.muli %72, %73 {async_agent = dense<1> : vector<1xi32>} : tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %75 = tt.expand_dims %34 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + // CHECK-NEXT: %76 = tt.broadcast %74 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %77 = tt.broadcast %75 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %78 = arith.addi %76, %77 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %79 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + // CHECK-NEXT: %80 = tt.addptr %79, %78 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %81 = "triton_gpu.cmpi"(%28, %37) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %82 = tt.expand_dims %81 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + // CHECK-NEXT: %83 = "triton_gpu.cmpi"(%35, %40) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %84 = tt.expand_dims %83 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + // CHECK-NEXT: %85 = tt.broadcast %82 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %86 = tt.broadcast %84 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %87 = arith.andi %85, %86 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %88 = triton_gpu.convert_layout %71 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + // CHECK-NEXT: tt.store %80, %88, %87 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32} { + // CHECK-LABEL: @nested_for_gemm + tt.func public @nested_for_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %cst_2 = arith.constant dense<0.000000e+00> : tensor<128x32xf16, #shared> + %cst_3 = arith.constant dense<0.000000e+00> : tensor<32x128xf16, #shared1> + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %96:2 = scf.for %arg13 = %c0 to %69 step %c1 iter_args(%arg14 = %cst_2, %arg15 = %cst_3) -> (tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1>) { + %89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + scf.yield %91, %92 : tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1> + } + %93 = tt.dot %96#0, %96#1, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %94 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + + // CHECK-NEXT: %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<128x128xf32, #mma> + // CHECK-NEXT: %cst_0 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %cst_1 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %c31_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 31 : i32 + // CHECK-NEXT: %c127_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 127 : i32 + // CHECK-NEXT: %c1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 1 : index + // CHECK-NEXT: %c0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : index + // CHECK-NEXT: %c32_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 32 : i32 + // CHECK-NEXT: %c128_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 128 : i32 + // CHECK-NEXT: %c8_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 8 : i32 + // CHECK-NEXT: %0 = tt.get_program_id {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + // CHECK-NEXT: %1 = tt.get_program_id {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : i32 + // CHECK-NEXT: %2 = arith.addi %arg3, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %3 = arith.divsi %2, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %4 = arith.addi %arg4, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %5 = arith.divsi %4, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %6 = arith.muli %5, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %7 = arith.divsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %8 = arith.muli %7, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %9 = arith.subi %3, %8 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %10 = arith.cmpi slt, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %11 = arith.select %10, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %12 = arith.remsi %0, %11 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %13 = arith.addi %8, %12 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %14 = arith.remsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %15 = arith.divsi %14, %11 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %16 = arith.muli %13, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %17 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %18 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %19 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %20 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %21 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %22 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %23 = tt.splat %16 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %24 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %25 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %26 = arith.addi %23, %17 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %27 = arith.addi %24, %19 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %28 = arith.addi %25, %21 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %29 = arith.muli %15, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %31 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %32 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %33 = arith.addi %30, %18 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %34 = arith.addi %31, %20 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %35 = arith.addi %32, %22 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %36 = tt.splat %arg3 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %37 = tt.splat %arg3 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %38 = arith.remsi %26, %36 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %39 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %40 = tt.splat %arg4 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %41 = arith.remsi %33, %39 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %42 = arith.muli %1, %c32_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + // CHECK-NEXT: %43 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %44 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %45 = tt.splat %42 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %46 = tt.splat %42 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %47 = arith.addi %45, %43 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %48 = arith.addi %46, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %49 = tt.expand_dims %38 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %50 = tt.splat %arg6 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %51 = arith.muli %49, %50 {async_agent = dense<0> : vector<1xi32>} : tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %52 = tt.expand_dims %47 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + // CHECK-NEXT: %53 = tt.broadcast %51 {async_agent = dense<0> : vector<1xi32>} : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %54 = tt.broadcast %52 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %55 = arith.addi %53, %54 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %56 = tt.splat %arg0 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + // CHECK-NEXT: %57 = tt.addptr %56, %55 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %58 = tt.expand_dims %48 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + // CHECK-NEXT: %59 = tt.expand_dims %41 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %60 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %61 = arith.muli %59, %60 {async_agent = dense<0> : vector<1xi32>} : tensor<1x128xi32, #blocked> + // CHECK-NEXT: %62 = tt.broadcast %58 {async_agent = dense<0> : vector<1xi32>} : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %63 = tt.broadcast %61 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %64 = arith.addi %62, %63 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %65 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: %66 = tt.addptr %65, %64 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: %67 = arith.addi %arg5, %c31_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %68 = arith.divsi %67, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %69 = arith.index_cast %68 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 to index + // CHECK-NEXT: %cst_2 = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<128x32xf16, #shared> + // CHECK-NEXT: %cst_3 = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<32x128xf16, #shared1> + // CHECK-NEXT: %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + // CHECK-NEXT: %89:2 = scf.for %arg13 = %c0 to %69 step %c1 iter_args(%arg14 = %cst_2, %arg15 = %cst_3) -> (tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1>) { + // CHECK-NEXT: %93 = tt.load %arg11 {async_agent = dense<0> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: %94 = tt.load %arg12 {async_agent = dense<0> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + // CHECK-NEXT: %95 = triton_gpu.convert_layout %93 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + // CHECK-NEXT: %96 = triton_gpu.convert_layout %94 {async_agent = dense<1> : vector<1xi32>} : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + // CHECK-NEXT: scf.yield {async_agent = dense<[0, 1]> : vector<2xi32>} %95, %96 : tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1> + // CHECK-NEXT: } {async_agent = dense<[0, 1]> : vector<2xi32>} + // CHECK-NEXT: %90 = tt.dot %89#0, %89#1, %arg10 {allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + // CHECK-NEXT: %91 = tt.addptr %arg11, %cst_1 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %92 = tt.addptr %arg12, %cst_0 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: scf.yield {async_agent = dense<[0, 1]> : vector<2xi32>} %90, %91, %92 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: } {async_agent = dense<[0, 1]> : vector<2xi32>} + // CHECK-NEXT: %71 = arith.truncf %70#0 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + // CHECK-NEXT: %72 = tt.expand_dims %27 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %73 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %74 = arith.muli %72, %73 {async_agent = dense<1> : vector<1xi32>} : tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %75 = tt.expand_dims %34 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + // CHECK-NEXT: %76 = tt.broadcast %74 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %77 = tt.broadcast %75 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %78 = arith.addi %76, %77 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %79 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + // CHECK-NEXT: %80 = tt.addptr %79, %78 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %81 = "triton_gpu.cmpi"(%28, %37) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %82 = tt.expand_dims %81 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + // CHECK-NEXT: %83 = "triton_gpu.cmpi"(%35, %40) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %84 = tt.expand_dims %83 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + // CHECK-NEXT: %85 = tt.broadcast %82 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %86 = tt.broadcast %84 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %87 = arith.andi %85, %86 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %88 = triton_gpu.convert_layout %71 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + // CHECK-NEXT: tt.store %80, %88, %87 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32} { + // CHECK-LABEL: @if_in_for_gemm + tt.func public @if_in_for_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %arg9_i32 = arith.index_cast %arg9 : index to i32 + %96 = arith.cmpi ne, %arg9_i32, %c31_i32 : i32 + %89 = scf.if %96 -> (tensor<128x32xf16, #blocked1>) { + %r0_0 = arith.select %96, %c31_i32, %c127_i32 : i32 + %r0_1 = tt.splat %r0_0 : (i32) -> tensor<128x32xi32, #blocked1> + %new_addr = tt.addptr %arg11, %r0_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %new_89 = tt.load %new_addr {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + scf.yield %new_89 : tensor<128x32xf16, #blocked1> + } else { + %new_89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + scf.yield %new_89 : tensor<128x32xf16, #blocked1> + } + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + %93 = tt.dot %91, %92, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %base_94 = scf.if %96 -> (tensor<128x32x!tt.ptr, #blocked1>) { + %r1_0 = arith.select %96, %c31_i32, %c127_i32 : i32 + %r1_1 = tt.splat %r1_0 : (i32) -> tensor<128x32xi32, #blocked1> + %98 = tt.addptr %arg11, %r1_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + scf.yield %98 : tensor<128x32x!tt.ptr, #blocked1> + } else { + %98 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + scf.yield %98 : tensor<128x32x!tt.ptr, #blocked1> + } + %94 = tt.addptr %base_94, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + // CHECK-NEXT: %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<128x128xf32, #mma> + // CHECK-NEXT: %cst_0 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %cst_1 = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<32> : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %c31_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 31 : i32 + // CHECK-NEXT: %c127_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 127 : i32 + // CHECK-NEXT: %c1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 1 : index + // CHECK-NEXT: %c0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : index + // CHECK-NEXT: %c32_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 32 : i32 + // CHECK-NEXT: %c128_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 128 : i32 + // CHECK-NEXT: %c8_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 8 : i32 + // CHECK-NEXT: %0 = tt.get_program_id {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + // CHECK-NEXT: %1 = tt.get_program_id {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 1 : i32} : i32 + // CHECK-NEXT: %2 = arith.addi %arg3, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %3 = arith.divsi %2, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %4 = arith.addi %arg4, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %5 = arith.divsi %4, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %6 = arith.muli %5, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %7 = arith.divsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %8 = arith.muli %7, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %9 = arith.subi %3, %8 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %10 = arith.cmpi slt, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %11 = arith.select %10, %9, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %12 = arith.remsi %0, %11 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %13 = arith.addi %8, %12 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %14 = arith.remsi %0, %6 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %15 = arith.divsi %14, %11 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %16 = arith.muli %13, %c128_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %17 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %18 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %19 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %20 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %21 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %22 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %23 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %24 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %25 = tt.splat %16 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %26 = arith.addi %23, %17 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %27 = arith.addi %24, %19 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %28 = arith.addi %25, %21 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %29 = arith.muli %15, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %31 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %32 = tt.splat %29 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %33 = arith.addi %30, %18 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %34 = arith.addi %31, %20 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %35 = arith.addi %32, %22 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %36 = tt.splat %arg3 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %37 = tt.splat %arg3 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %38 = arith.remsi %26, %36 {async_agent = dense<1> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + // CHECK-NEXT: %39 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %40 = tt.splat %arg4 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %41 = arith.remsi %33, %39 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + // CHECK-NEXT: %42 = arith.muli %1, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %43 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %44 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %45 = tt.splat %42 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %46 = tt.splat %42 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %47 = arith.addi %45, %43 {async_agent = dense<1> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + // CHECK-NEXT: %48 = arith.addi %46, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + // CHECK-NEXT: %49 = tt.expand_dims %38 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %50 = tt.splat %arg6 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %51 = arith.muli %49, %50 {async_agent = dense<1> : vector<1xi32>} : tensor<128x1xi32, #blocked1> + // CHECK-NEXT: %52 = tt.expand_dims %47 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + // CHECK-NEXT: %53 = tt.broadcast %51 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %54 = tt.broadcast %52 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %55 = arith.addi %53, %54 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %56 = tt.splat %arg0 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + // CHECK-NEXT: %57 = tt.addptr %56, %55 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %58 = tt.expand_dims %48 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + // CHECK-NEXT: %59 = tt.expand_dims %41 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %60 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x128xi32, #blocked> + // CHECK-NEXT: %61 = arith.muli %59, %60 {async_agent = dense<0> : vector<1xi32>} : tensor<1x128xi32, #blocked> + // CHECK-NEXT: %62 = tt.broadcast %58 {async_agent = dense<0> : vector<1xi32>} : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %63 = tt.broadcast %61 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + // CHECK-NEXT: %64 = arith.addi %62, %63 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128xi32, #blocked> + // CHECK-NEXT: %65 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: %66 = tt.addptr %65, %64 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: %67 = arith.addi %arg5, %c31_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %68 = arith.divsi %67, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + // CHECK-NEXT: %69 = arith.index_cast %68 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 to index + // CHECK-NEXT: %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + // CHECK-NEXT: %89 = arith.index_cast %arg9 {async_agent = dense<1> : vector<1xi32>} : index to i32 + // CHECK-NEXT: %90 = arith.cmpi ne, %89, %c31_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %91 = scf.if %90 -> (tensor<128x32xf16, #blocked1>) { + // CHECK-NEXT: %99 = arith.select %90, %c31_i32, %c127_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %100 = tt.splat %99 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %101 = tt.addptr %arg11, %100 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %102 = tt.load %101 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: scf.yield {async_agent = dense<1> : vector<1xi32>} %102 : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: } else { + // CHECK-NEXT: %99 = tt.load %arg11 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: scf.yield {async_agent = dense<1> : vector<1xi32>} %99 : tensor<128x32xf16, #blocked1> + // CHECK-NEXT: } {async_agent = dense<1> : vector<1xi32>} + // CHECK-NEXT: %92 = tt.load %arg12 {async_agent = dense<0> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + // CHECK-NEXT: %93 = triton_gpu.convert_layout %91 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + // CHECK-NEXT: %94 = triton_gpu.convert_layout %92 {async_agent = dense<1> : vector<1xi32>} : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + // CHECK-NEXT: %95 = tt.dot %93, %94, %arg10 {allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + // CHECK-NEXT: %96 = scf.if %90 -> (tensor<128x32x!tt.ptr, #blocked1>) { + // CHECK-NEXT: %99 = arith.select %90, %c31_i32, %c127_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + // CHECK-NEXT: %100 = tt.splat %99 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %101 = tt.addptr %arg11, %100 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: scf.yield {async_agent = dense<1> : vector<1xi32>} %101 : tensor<128x32x!tt.ptr, #blocked1> + // CHECK-NEXT: } else { + // CHECK-NEXT: %99 = tt.addptr %arg11, %cst_1 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: scf.yield {async_agent = dense<1> : vector<1xi32>} %99 : tensor<128x32x!tt.ptr, #blocked1> + // CHECK-NEXT: } {async_agent = dense<1> : vector<1xi32>} + // CHECK-NEXT: %97 = tt.addptr %96, %cst_1 {async_agent = dense<1> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + // CHECK-NEXT: %98 = tt.addptr %arg12, %cst_0 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + // CHECK-NEXT: scf.yield {async_agent = dense<[0, 1]> : vector<2xi32>} %95, %97, %98 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + // CHECK-NEXT: } {async_agent = dense<[0, 1]> : vector<2xi32>} + // CHECK-NEXT: %71 = arith.truncf %70#0 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + // CHECK-NEXT: %72 = tt.expand_dims %27 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %73 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %74 = arith.muli %72, %73 {async_agent = dense<1> : vector<1xi32>} : tensor<128x1xi32, #blocked2> + // CHECK-NEXT: %75 = tt.expand_dims %34 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + // CHECK-NEXT: %76 = tt.broadcast %74 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %77 = tt.broadcast %75 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %78 = arith.addi %76, %77 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %79 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + // CHECK-NEXT: %80 = tt.addptr %79, %78 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + // CHECK-NEXT: %81 = "triton_gpu.cmpi"(%28, %37) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + // CHECK-NEXT: %82 = tt.expand_dims %81 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + // CHECK-NEXT: %83 = "triton_gpu.cmpi"(%35, %40) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + // CHECK-NEXT: %84 = tt.expand_dims %83 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + // CHECK-NEXT: %85 = tt.broadcast %82 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %86 = tt.broadcast %84 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %87 = arith.andi %85, %86 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi1, #blocked2> + // CHECK-NEXT: %88 = triton_gpu.convert_layout %71 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + // CHECK-NEXT: tt.store %80, %88, %87 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + } +} diff --git a/test/TritonGPU/wsmaterialization.mlir b/test/TritonGPU/wsmaterialization.mlir new file mode 100644 index 000000000000..4ab8be6c5d96 --- /dev/null +++ b/test/TritonGPU/wsmaterialization.mlir @@ -0,0 +1,414 @@ +// RUN: triton-opt -split-input-file -triton-nvidia-gpu-ws-materialization='compute-capability=90' %s | FileCheck %s + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32} { + // CHECK-LABEL: @simple_gemm + // CHECK: triton_nvidia_gpu.alloc_mbarrier + // CHECK: scf.if + // CHECK: scf.for + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_wait + // CHECK: triton_gpu.insert_slice + // CHECK: triton_gpu.insert_slice + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_arrive + // CHECK: scf.yield + // CHECK: scf.if + // CHECK: triton_nvidia_gpu.bar_wait + // CHECK: scf.for + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_wait + // CHECK: triton_gpu.extract_slice + // CHECK: triton_gpu.extract_slice + // CHECK: tt.dot + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_arrive + // CHECK: scf.yield + // CHECK: triton_nvidia_gpu.bar_arrive + // CHECK: triton_nvidia_gpu.bar_wait + // CHECK: tt.store + // CHECK: triton_nvidia_gpu.bar_arrive + tt.func public @simple_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %0 = triton_gpu.alloc_tensor : tensor<3x32x128xf16, #shared> + %1 = triton_gpu.alloc_tensor : tensor<3x128x32xf16, #shared1> + %2 = triton_nvidia_gpu.create_token {num = 3 : i32} : tensor<3x!triton_nvidia_gpu.token> + %3 = triton_nvidia_gpu.create_mutex : !triton_nvidia_gpu.mutex + %4 = triton_nvidia_gpu.create_mutex : !triton_nvidia_gpu.mutex + %5 = triton_nvidia_gpu.get_agent_id : i32 + %c0_i32 = arith.constant 0 : i32 + %6 = arith.cmpi eq, %5, %c0_i32 : i32 + scf.if %6 { + %cst = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 31 : i32 + %c127_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 127 : i32 + %c1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 1 : index + %c0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : index + %c32_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 32 : i32 + %c128_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 128 : i32 + %c8_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 8 : i32 + %8 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %9 = tt.get_program_id y {async_agent = dense<0> : vector<1xi32>} : i32 + %10 = arith.addi %arg3, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %11 = arith.divsi %10, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = arith.addi %arg4, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %13 = arith.divsi %12, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %14 = arith.muli %13, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %15 = arith.divsi %8, %14 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %16 = arith.muli %15, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %17 = arith.subi %11, %16 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %18 = arith.cmpi slt, %17, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %19 = arith.select %18, %17, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %20 = arith.remsi %8, %19 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %21 = arith.addi %16, %20 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %22 = arith.remsi %8, %14 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %23 = arith.divsi %22, %19 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %24 = arith.muli %21, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %25 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %26 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %27 = tt.splat %24 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %28 = arith.addi %27, %25 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %29 = arith.muli %23, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = arith.addi %30, %26 {async_agent = dense<0> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %32 = tt.splat %arg3 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %33 = arith.remsi %28, %32 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %34 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %35 = arith.remsi %31, %34 {async_agent = dense<0> : vector<1xi32>, tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %36 = arith.muli %9, %c32_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %37 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %38 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %39 = tt.splat %36 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %40 = tt.splat %36 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %41 = arith.addi %39, %37 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %42 = arith.addi %40, %38 {async_agent = dense<0> : vector<1xi32>} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %43 = tt.expand_dims %33 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %44 = tt.splat %arg6 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked1> + %45 = arith.muli %43, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<128x1xi32, #blocked1> + %46 = tt.expand_dims %41 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %47 = tt.broadcast %45 {async_agent = dense<0> : vector<1xi32>} : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %48 = tt.broadcast %46 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %49 = arith.addi %47, %48 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32xi32, #blocked1> + %50 = tt.splat %arg0 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %51 = tt.addptr %50, %49 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %52 = tt.expand_dims %42 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %53 = tt.expand_dims %35 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %54 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x128xi32, #blocked> + %55 = arith.muli %53, %54 {async_agent = dense<0> : vector<1xi32>} : tensor<1x128xi32, #blocked> + %56 = tt.broadcast %52 {async_agent = dense<0> : vector<1xi32>} : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %57 = tt.broadcast %55 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %58 = arith.addi %56, %57 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128xi32, #blocked> + %59 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %60 = tt.addptr %59, %58 {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %61 = arith.addi %arg5, %c31_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %62 = arith.divsi %61, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %63 = arith.index_cast %62 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 to index + %c0_i32_2 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %64:3 = scf.for %arg9 = %c0 to %63 step %c1 iter_args(%arg10 = %51, %arg11 = %60, %arg12 = %c0_i32_2) -> (tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>, i32) { + triton_nvidia_gpu.producer_acquire %2, %arg12 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %65 = triton_gpu.insert_slice %arg10, %1, %arg12 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32x!tt.ptr, #blocked1> -> tensor<3x128x32xf16, #shared1> + %66 = triton_gpu.insert_slice %arg11, %0, %arg12 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128x!tt.ptr, #blocked> -> tensor<3x32x128xf16, #shared> + %67 = tt.addptr %arg10, %cst_1 {async_agent = dense<0> : vector<1xi32>} : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %68 = tt.addptr %arg11, %cst {async_agent = dense<0> : vector<1xi32>} : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %c1_i32_3 = arith.constant {async_agent = dense<0> : vector<1xi32>} 1 : i32 + %c3_i32 = arith.constant {async_agent = dense<0> : vector<1xi32>} 3 : i32 + %69 = arith.addi %arg12, %c1_i32_3 {async_agent = dense<0> : vector<1xi32>} : i32 + %70 = arith.remsi %69, %c3_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + triton_nvidia_gpu.producer_commit %2, %arg12 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + scf.yield %67, %68, %70 : tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>, i32 + } {async_agent = dense<0> : vector<1xi32>} + } + %c1_i32 = arith.constant 1 : i32 + %c1_i32_0 = arith.constant 1 : i32 + %7 = arith.cmpi sge, %5, %c1_i32_0 : i32 + scf.if %7 { + %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<128x128xf32, #mma> + %c31_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 31 : i32 + %c127_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 127 : i32 + %c1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 1 : index + %c0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : index + %c32_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 32 : i32 + %c128_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 128 : i32 + %c8_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 8 : i32 + %8 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %9 = arith.addi %arg3, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %10 = arith.divsi %9, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %11 = arith.addi %arg4, %c127_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = arith.divsi %11, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %13 = arith.muli %12, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %14 = arith.divsi %8, %13 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %15 = arith.muli %14, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %16 = arith.subi %10, %15 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %17 = arith.cmpi slt, %16, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %18 = arith.select %17, %16, %c8_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %19 = arith.remsi %8, %18 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %20 = arith.addi %15, %19 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %21 = arith.remsi %8, %13 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %22 = arith.divsi %21, %18 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %23 = arith.muli %20, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %24 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %26 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %27 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %28 = tt.splat %23 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = tt.splat %23 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %30 = arith.addi %28, %24 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %31 = arith.addi %29, %26 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %32 = arith.muli %22, %c128_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %33 = tt.splat %32 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %34 = tt.splat %32 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %33, %25 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = arith.addi %34, %27 {async_agent = dense<1> : vector<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %37 = tt.splat %arg3 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = tt.splat %arg4 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %39 = arith.addi %arg5, %c31_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %40 = arith.divsi %39, %c32_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %41 = arith.index_cast %40 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 to index + %c0_i32_1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + triton_nvidia_gpu.lock %3 {mutex.barId = dense<1> : vector<1xi32>, mutex.numThreads = dense<256> : vector<1xi32>} : !triton_nvidia_gpu.mutex + %42:2 = scf.for %arg9 = %c0 to %41 step %c1 iter_args(%arg10 = %cst, %arg11 = %c0_i32_1) -> (tensor<128x128xf32, #mma>, i32) { + triton_nvidia_gpu.consumer_wait %2, %arg11 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %62 = triton_gpu.extract_slice %1[%arg11, 0, 0] [1, 128, 32] [1, 1, 1] {async_agent = dense<1> : vector<1xi32>} : tensor<3x128x32xf16, #shared1> to tensor<128x32xf16, #shared1> + %63 = triton_gpu.extract_slice %0[%arg11, 0, 0] [1, 32, 128] [1, 1, 1] {async_agent = dense<1> : vector<1xi32>} : tensor<3x32x128xf16, #shared> to tensor<32x128xf16, #shared> + %64 = triton_gpu.convert_layout %62 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x32xf16, #shared1>) -> tensor<128x32xf16, #shared1> + %65 = triton_gpu.convert_layout %63 {async_agent = dense<1> : vector<1xi32>} : (tensor<32x128xf16, #shared>) -> tensor<32x128xf16, #shared> + %66 = tt.dot %64, %65, %arg10 {allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<128x32xf16, #shared1> * tensor<32x128xf16, #shared> -> tensor<128x128xf32, #mma> + %c1_i32_2 = arith.constant {async_agent = dense<1> : vector<1xi32>} 1 : i32 + %c3_i32 = arith.constant {async_agent = dense<1> : vector<1xi32>} 3 : i32 + %67 = arith.addi %arg11, %c1_i32_2 {async_agent = dense<1> : vector<1xi32>} : i32 + %68 = arith.remsi %67, %c3_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + triton_nvidia_gpu.consumer_release %2, %arg11 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + scf.yield %66, %68 : tensor<128x128xf32, #mma>, i32 + } {async_agent = dense<1> : vector<1xi32>} + triton_nvidia_gpu.unlock %3 {mutex.barId = dense<2> : vector<1xi32>, mutex.numThreads = dense<256> : vector<1xi32>} : !triton_nvidia_gpu.mutex + triton_nvidia_gpu.lock %4 {mutex.barId = dense<3> : vector<1xi32>, mutex.numThreads = dense<256> : vector<1xi32>} : !triton_nvidia_gpu.mutex + %43 = arith.truncf %42#0 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %44 = tt.expand_dims %30 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %45 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<128x1xi32, #blocked2> + %46 = arith.muli %44, %45 {async_agent = dense<1> : vector<1xi32>} : tensor<128x1xi32, #blocked2> + %47 = tt.expand_dims %35 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %48 = tt.broadcast %46 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %49 = tt.broadcast %47 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %50 = arith.addi %48, %49 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi32, #blocked2> + %51 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %52 = tt.addptr %51, %50 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %53 = "triton_gpu.cmpi"(%31, %37) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %54 = tt.expand_dims %53 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %55 = "triton_gpu.cmpi"(%36, %38) {async_agent = dense<1> : vector<1xi32>, predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %56 = tt.expand_dims %55 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %57 = tt.broadcast %54 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %58 = tt.broadcast %56 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %59 = arith.andi %57, %58 {async_agent = dense<1> : vector<1xi32>} : tensor<128x128xi1, #blocked2> + %60 = triton_gpu.convert_layout %43 {async_agent = dense<1> : vector<1xi32>} : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %52, %60, %59 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + triton_nvidia_gpu.unlock %4 {mutex.barId = dense<4> : vector<1xi32>, mutex.numThreads = dense<256> : vector<1xi32>} : !triton_nvidia_gpu.mutex + } + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"async.num-agents" = 2 : i32, "triton_gpu.compute-capability" = 90 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK-LABEL: @matmal_from_wsmutex + // CHECK: triton_nvidia_gpu.alloc_mbarrier + // CHECK: scf.if + // CHECK: scf.for + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_wait + // CHECK: triton_gpu.insert_slice + // CHECK: triton_gpu.insert_slice + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_arrive + // CHECK: scf.yield + // CHECK: scf.if + // CHECK: triton_nvidia_gpu.bar_wait + // CHECK: scf.for + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_wait + // CHECK: triton_gpu.extract_slice + // CHECK: triton_gpu.extract_slice + // CHECK: tt.dot + // CHECK: triton_nvidia_gpu.extract_mbarrier + // CHECK: triton_nvidia_gpu.mbarrier_arrive + // CHECK: scf.yield + // CHECK: triton_nvidia_gpu.bar_arrive + // CHECK: triton_nvidia_gpu.bar_wait + // CHECK: tt.store + // CHECK: triton_nvidia_gpu.bar_arrive + tt.func public @matmal_from_wsmutex(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg4: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg5: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg6: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg7: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg8: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}) { + %0 = triton_gpu.alloc_tensor : tensor<3x64x16xf16, #shared> + %1 = triton_gpu.alloc_tensor : tensor<3x16x64xf16, #shared1> + %2 = triton_nvidia_gpu.create_token {num = 3 : i32} : tensor<3x!triton_nvidia_gpu.token> + %3 = triton_nvidia_gpu.get_agent_id : i32 + %c0_i32 = arith.constant 0 : i32 + %4 = arith.cmpi eq, %3, %c0_i32 : i32 + scf.if %4 { + %cst = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<16> : tensor<16x64xi32, #blocked> + %cst_0 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<16> : tensor<64x16xi32, #blocked1> + %c63_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 63 : i32 + %c114_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 114 : i32 + %c16_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 16 : i32 + %c0_i32_1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %c64_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 64 : i32 + %6 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + %7 = arith.addi %arg3, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %8 = arith.divsi %7, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %9 = arith.addi %arg4, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %10 = arith.divsi %9, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %11 = arith.muli %8, %10 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %13 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %14 = tt.splat %arg3 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %15 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %16 = tt.splat %arg6 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64x1xi32, #blocked1> + %17 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %18 = tt.expand_dims %17 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x16xi32, #blocked1> + %19 = tt.broadcast %18 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x16xi32, #blocked1>) -> tensor<64x16xi32, #blocked1> + %20 = tt.splat %arg0 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<64x16x!tt.ptr, #blocked1> + %21 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %22 = tt.expand_dims %21 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<16x1xi32, #blocked> + %23 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x64xi32, #blocked> + %24 = tt.broadcast %22 {async_agent = dense<0> : vector<1xi32>} : (tensor<16x1xi32, #blocked>) -> tensor<16x64xi32, #blocked> + %25 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<16x64x!tt.ptr, #blocked> + %c3_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 3 : i32 + %c0_i32_2 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %26 = scf.for %arg9 = %6 to %11 step %c114_i32 iter_args(%arg10 = %c0_i32_2) -> (i32) : i32 { + %27 = arith.divsi %arg9, %10 {async_agent = dense<0> : vector<1xi32>} : i32 + %28 = arith.remsi %arg9, %10 {async_agent = dense<0> : vector<1xi32>} : i32 + %29 = arith.muli %27, %c64_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %31 = arith.addi %30, %12 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %32 = arith.remsi %31, %14 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %33 = arith.muli %28, %c64_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %34 = tt.splat %33 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %35 = arith.addi %34, %13 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %36 = arith.remsi %35, %15 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %37 = tt.expand_dims %32 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %38 = arith.muli %37, %16 {async_agent = dense<0> : vector<1xi32>} : tensor<64x1xi32, #blocked1> + %39 = tt.broadcast %38 {async_agent = dense<0> : vector<1xi32>} : (tensor<64x1xi32, #blocked1>) -> tensor<64x16xi32, #blocked1> + %40 = arith.addi %39, %19 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16xi32, #blocked1> + %41 = tt.addptr %20, %40 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16x!tt.ptr, #blocked1>, tensor<64x16xi32, #blocked1> + %42 = tt.expand_dims %36 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x64xi32, #blocked> + %43 = arith.muli %42, %23 {async_agent = dense<0> : vector<1xi32>} : tensor<1x64xi32, #blocked> + %44 = tt.broadcast %43 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x64xi32, #blocked>) -> tensor<16x64xi32, #blocked> + %45 = arith.addi %24, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<16x64xi32, #blocked> + %46 = tt.addptr %25, %45 {async_agent = dense<0> : vector<1xi32>} : tensor<16x64x!tt.ptr, #blocked>, tensor<16x64xi32, #blocked> + %c3_i32_3 = arith.constant {async_agent = dense<0> : vector<1xi32>} 3 : i32 + %47 = arith.subi %arg5, %c0_i32_1 {async_agent = dense<0> : vector<1xi32>} : i32 + %48 = arith.divui %47, %c16_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %49 = arith.muli %arg10, %48 {async_agent = dense<0> : vector<1xi32>} : i32 + %c3_i32_4 = arith.constant {async_agent = dense<0> : vector<1xi32>} 3 : i32 + %50:3 = scf.for %arg11 = %c0_i32_1 to %arg5 step %c16_i32 iter_args(%arg12 = %41, %arg13 = %46, %arg14 = %49) -> (tensor<64x16x!tt.ptr, #blocked1>, tensor<16x64x!tt.ptr, #blocked>, i32) : i32 { + %52 = arith.remsi %arg14, %c3_i32_4 {async_agent = dense<0> : vector<1xi32>} : i32 + triton_nvidia_gpu.producer_acquire %2, %52 {async_agent = dense<0> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %53 = triton_gpu.insert_slice %arg12, %0, %52 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x16x!tt.ptr, #blocked1> -> tensor<3x64x16xf16, #shared> + %54 = triton_gpu.insert_slice %arg13, %1, %52 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64x!tt.ptr, #blocked> -> tensor<3x16x64xf16, #shared1> + triton_nvidia_gpu.producer_commit %2, %52 {async_agent = dense<0> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %55 = tt.addptr %arg12, %cst_0 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16x!tt.ptr, #blocked1>, tensor<64x16xi32, #blocked1> + %56 = tt.addptr %arg13, %cst {async_agent = dense<0> : vector<1xi32>} : tensor<16x64x!tt.ptr, #blocked>, tensor<16x64xi32, #blocked> + %c1_i32_6 = arith.constant {async_agent = dense<0> : vector<1xi32>} 1 : i32 + %57 = arith.addi %arg14, %c1_i32_6 {async_agent = dense<0> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<0> : vector<1xi32>} %55, %56, %57 : tensor<64x16x!tt.ptr, #blocked1>, tensor<16x64x!tt.ptr, #blocked>, i32 + } {async_agent = dense<0> : vector<1xi32>} + %c1_i32_5 = arith.constant {async_agent = dense<0> : vector<1xi32>} 1 : i32 + %51 = arith.addi %arg10, %c1_i32_5 {async_agent = dense<0> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<0> : vector<1xi32>} %51 : i32 + } {async_agent = dense<0> : vector<1xi32>} + } {async_agent = dense<0> : vector<1xi32>} + %c1_i32 = arith.constant 1 : i32 + %5 = arith.cmpi eq, %3, %c1_i32 : i32 + scf.if %5 { + %c0_i32_0 = arith.constant 0 : i32 + %6 = triton_nvidia_gpu.get_mutex_role_id {async_agent = dense<1> : vector<1xi32>, num = 2 : i32} : i32 + %7 = arith.cmpi ne, %6, %c0_i32_0 : i32 + %8 = triton_nvidia_gpu.create_mutex {async_agent = dense<1> : vector<1xi32>} : !triton_nvidia_gpu.mutex + %9 = triton_nvidia_gpu.create_mutex {async_agent = dense<1> : vector<1xi32>} : !triton_nvidia_gpu.mutex + %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 63 : i32 + %c114_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 114 : i32 + %c16_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 16 : i32 + %c0_i32_1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %c64_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 64 : i32 + %10 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + %11 = arith.addi %arg3, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = arith.divsi %11, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %13 = arith.addi %arg4, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %14 = arith.divsi %13, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %15 = arith.muli %12, %14 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %16 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %17 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %18 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64x1xi32, #blocked2> + %19 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked2> + %c3_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 3 : i32 + %c0_i32_2 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %20 = arith.muli %c114_i32, %6 {async_agent = dense<1> : vector<1xi32>} : i32 + %21 = arith.addi %10, %20 {async_agent = dense<1> : vector<1xi32>} : i32 + %c2_i32 = arith.constant {async_agent = dense<1> : vector<1xi32>} 2 : i32 + %22 = arith.muli %c114_i32, %c2_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + %23 = arith.addi %c0_i32_2, %6 {async_agent = dense<1> : vector<1xi32>} : i32 + %24 = scf.for %arg9 = %21 to %15 step %22 iter_args(%arg10 = %23) -> (i32) : i32 { + %25 = arith.cmpi ne, %arg9, %10 : i32 + %26 = arith.ori %25, %7 {agent.mutex_role = 0 : i32} : i1 + scf.if %26 { + triton_nvidia_gpu.lock %8 {agent.mutex_role = 0 : i32} : !triton_nvidia_gpu.mutex + } {agent.mutex_role = 0 : i32} + %27 = arith.divsi %arg9, %14 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %28 = arith.remsi %arg9, %14 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %29 = arith.muli %27, %c64_i32 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %30 = tt.splat %29 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %31 = arith.addi %30, %17 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %32 = arith.muli %28, %c64_i32 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %33 = tt.splat %32 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %34 = arith.addi %33, %16 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %c3_i32_3 = arith.constant {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} 3 : i32 + %35 = arith.subi %arg5, %c0_i32_1 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %36 = arith.divui %35, %c16_i32 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %37 = arith.muli %arg10, %36 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + %c3_i32_4 = arith.constant {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} 3 : i32 + %38:2 = scf.for %arg11 = %c0_i32_1 to %arg5 step %c16_i32 iter_args(%arg12 = %cst, %arg13 = %37) -> (tensor<64x64xf32, #mma>, i32) : i32 { + %48 = arith.remsi %arg13, %c3_i32_4 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + triton_nvidia_gpu.consumer_wait %2, %48 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %49 = triton_gpu.extract_slice %0[%48, 0, 0] [1, 64, 16] [1, 1, 1] {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<3x64x16xf16, #shared> to tensor<64x16xf16, #shared> + %50 = triton_gpu.convert_layout %49 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : (tensor<64x16xf16, #shared>) -> tensor<64x16xf16, #shared> + %51 = triton_gpu.extract_slice %1[%48, 0, 0] [1, 16, 64] [1, 1, 1] {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<3x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + %52 = triton_gpu.convert_layout %51 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : (tensor<16x64xf16, #shared1>) -> tensor<16x64xf16, #shared1> + %53 = tt.dot %50, %52, %arg12 {agent.mutex_role = 0 : i32, allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + triton_nvidia_gpu.consumer_release %2, %48 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %c1_i32_6 = arith.constant {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} 1 : i32 + %54 = arith.addi %arg13, %c1_i32_6 {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + scf.yield {agent.mutex_role = 0 : i32, async_agent = dense<1> : vector<1xi32>} %53, %54 : tensor<64x64xf32, #mma>, i32 + } {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} + triton_nvidia_gpu.unlock %8 : !triton_nvidia_gpu.mutex + scf.if %26 { + triton_nvidia_gpu.lock %9 {agent.mutex_role = 1 : i32} : !triton_nvidia_gpu.mutex + } {agent.mutex_role = 1 : i32} + %39 = tt.expand_dims %31 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<64x1xi32, #blocked2> + %40 = arith.muli %39, %18 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<64x1xi32, #blocked2> + %41 = tt.addptr %19, %40 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<64x1x!tt.ptr, #blocked2>, tensor<64x1xi32, #blocked2> + %42 = tt.expand_dims %34 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %43 = tt.broadcast %41 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : (tensor<64x1x!tt.ptr, #blocked2>) -> tensor<64x64x!tt.ptr, #blocked2> + %44 = tt.broadcast %42 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : (tensor<1x64xi32, #blocked2>) -> tensor<64x64xi32, #blocked2> + %45 = tt.addptr %43, %44 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : tensor<64x64x!tt.ptr, #blocked2>, tensor<64x64xi32, #blocked2> + %46 = triton_gpu.convert_layout %38#0 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked2> + tt.store %45, %46 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked2> + triton_nvidia_gpu.unlock %9 : !triton_nvidia_gpu.mutex + %c1_i32_5 = arith.constant {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} 1 : i32 + %47 = arith.addi %arg10, %c2_i32 {agent.mutex_role = 1 : i32, async_agent = dense<1> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<1> : vector<1xi32>} %47 : i32 + } {async_agent = dense<1> : vector<1xi32>} + } {"agent.num-roles" = 2 : i32, async_agent = dense<1> : vector<1xi32>} + tt.return + } +} diff --git a/test/TritonGPU/wsmutex.mlir b/test/TritonGPU/wsmutex.mlir new file mode 100644 index 000000000000..78b9037c51fa --- /dev/null +++ b/test/TritonGPU/wsmutex.mlir @@ -0,0 +1,166 @@ +// RUN: triton-opt -triton-nvidia-gpu-ws-mutex='compute-capability=90' %s | FileCheck %s + + +// CHECK: scf.if +// CHECK: scf.for +// CHECK: triton_nvidia_gpu.create_mutex +// CHECK: triton_nvidia_gpu.create_mutex +// CHECK: triton_nvidia_gpu.lock +// CHECK: agent.mutex_role = 0 : i32 +// CHECK: triton_nvidia_gpu.unlock +// CHECK: triton_nvidia_gpu.lock +// CHECK: agent.mutex_role = 1 : i32 +// CHECK: triton_nvidia_gpu.unlock + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"async.num-agents" = 2 : i32, "triton_gpu.compute-capability" = 90 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func public @static_persistent_warp_specialized_matmul_kernel_0d1d2d3de4de5de6de7c8c9de10de11c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg4: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg5: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg6: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg7: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}, %arg8: i32 {tt.divisibility = 16 : i32, tt.max_divisibility = 8 : i32}) { + %0 = triton_gpu.alloc_tensor : tensor<3x64x16xf16, #shared> + %1 = triton_gpu.alloc_tensor : tensor<3x16x64xf16, #shared1> + %2 = triton_nvidia_gpu.create_token {num = 3 : i32} : tensor<3x!triton_nvidia_gpu.token> + %3 = triton_nvidia_gpu.get_agent_id : i32 + %c0_i32 = arith.constant 0 : i32 + %4 = arith.cmpi eq, %3, %c0_i32 : i32 + scf.if %4 { + %cst = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<16> : tensor<16x64xi32, #blocked> + %cst_0 = arith.constant {async_agent = dense<0> : vector<1xi32>} dense<16> : tensor<64x16xi32, #blocked1> + %c63_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 63 : i32 + %c114_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 114 : i32 + %c16_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 16 : i32 + %c0_i32_1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %c64_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 64 : i32 + %6 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + %7 = arith.addi %arg3, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %8 = arith.divsi %7, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %9 = arith.addi %arg4, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %10 = arith.divsi %9, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %11 = arith.muli %8, %10 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %13 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %14 = tt.splat %arg3 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %15 = tt.splat %arg4 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %16 = tt.splat %arg6 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64x1xi32, #blocked1> + %17 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %18 = tt.expand_dims %17 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x16xi32, #blocked1> + %19 = tt.broadcast %18 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x16xi32, #blocked1>) -> tensor<64x16xi32, #blocked1> + %20 = tt.splat %arg0 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<64x16x!tt.ptr, #blocked1> + %21 = tt.make_range {async_agent = dense<0> : vector<1xi32>, end = 16 : i32, start = 0 : i32} : tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %22 = tt.expand_dims %21 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<16xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<16x1xi32, #blocked> + %23 = tt.splat %arg7 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<1x64xi32, #blocked> + %24 = tt.broadcast %22 {async_agent = dense<0> : vector<1xi32>} : (tensor<16x1xi32, #blocked>) -> tensor<16x64xi32, #blocked> + %25 = tt.splat %arg1 {async_agent = dense<0> : vector<1xi32>} : (!tt.ptr) -> tensor<16x64x!tt.ptr, #blocked> + %c3_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 3 : i32 + %c0_i32_2 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %26 = scf.for %arg9 = %6 to %11 step %c114_i32 iter_args(%arg10 = %c0_i32_2) -> (i32) : i32 { + %27 = arith.divsi %arg9, %10 {async_agent = dense<0> : vector<1xi32>} : i32 + %28 = arith.remsi %arg9, %10 {async_agent = dense<0> : vector<1xi32>} : i32 + %29 = arith.muli %27, %c64_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %30 = tt.splat %29 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %31 = arith.addi %30, %12 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %32 = arith.remsi %31, %14 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %33 = arith.muli %28, %c64_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %34 = tt.splat %33 {async_agent = dense<0> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %35 = arith.addi %34, %13 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %36 = arith.remsi %35, %15 {async_agent = dense<0> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %37 = tt.expand_dims %32 {async_agent = dense<0> : vector<1xi32>, axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<64x1xi32, #blocked1> + %38 = arith.muli %37, %16 {async_agent = dense<0> : vector<1xi32>} : tensor<64x1xi32, #blocked1> + %39 = tt.broadcast %38 {async_agent = dense<0> : vector<1xi32>} : (tensor<64x1xi32, #blocked1>) -> tensor<64x16xi32, #blocked1> + %40 = arith.addi %39, %19 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16xi32, #blocked1> + %41 = tt.addptr %20, %40 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16x!tt.ptr, #blocked1>, tensor<64x16xi32, #blocked1> + %42 = tt.expand_dims %36 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x64xi32, #blocked> + %43 = arith.muli %42, %23 {async_agent = dense<0> : vector<1xi32>} : tensor<1x64xi32, #blocked> + %44 = tt.broadcast %43 {async_agent = dense<0> : vector<1xi32>} : (tensor<1x64xi32, #blocked>) -> tensor<16x64xi32, #blocked> + %45 = arith.addi %24, %44 {async_agent = dense<0> : vector<1xi32>} : tensor<16x64xi32, #blocked> + %46 = tt.addptr %25, %45 {async_agent = dense<0> : vector<1xi32>} : tensor<16x64x!tt.ptr, #blocked>, tensor<16x64xi32, #blocked> + %c3_i32_3 = arith.constant {async_agent = dense<0> : vector<1xi32>} 3 : i32 + %47 = arith.subi %arg5, %c0_i32_1 {async_agent = dense<0> : vector<1xi32>} : i32 + %48 = arith.divui %47, %c16_i32 {async_agent = dense<0> : vector<1xi32>} : i32 + %49 = arith.muli %arg10, %48 {async_agent = dense<0> : vector<1xi32>} : i32 + %c3_i32_4 = arith.constant {async_agent = dense<0> : vector<1xi32>} 3 : i32 + %50:3 = scf.for %arg11 = %c0_i32_1 to %arg5 step %c16_i32 iter_args(%arg12 = %41, %arg13 = %46, %arg14 = %49) -> (tensor<64x16x!tt.ptr, #blocked1>, tensor<16x64x!tt.ptr, #blocked>, i32) : i32 { + %52 = arith.remsi %arg14, %c3_i32_4 {async_agent = dense<0> : vector<1xi32>} : i32 + triton_nvidia_gpu.producer_acquire %2, %52 {async_agent = dense<0> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %53 = triton_gpu.insert_slice %arg12, %0, %52 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x16x!tt.ptr, #blocked1> -> tensor<3x64x16xf16, #shared> + %54 = triton_gpu.insert_slice %arg13, %1, %52 {async_agent = dense<0> : vector<1xi32>, axis = 0 : i32, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<16x64x!tt.ptr, #blocked> -> tensor<3x16x64xf16, #shared1> + triton_nvidia_gpu.producer_commit %2, %52 {async_agent = dense<0> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %55 = tt.addptr %arg12, %cst_0 {async_agent = dense<0> : vector<1xi32>} : tensor<64x16x!tt.ptr, #blocked1>, tensor<64x16xi32, #blocked1> + %56 = tt.addptr %arg13, %cst {async_agent = dense<0> : vector<1xi32>} : tensor<16x64x!tt.ptr, #blocked>, tensor<16x64xi32, #blocked> + %c1_i32_6 = arith.constant {async_agent = dense<0> : vector<1xi32>} 1 : i32 + %57 = arith.addi %arg14, %c1_i32_6 {async_agent = dense<0> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<0> : vector<1xi32>} %55, %56, %57 : tensor<64x16x!tt.ptr, #blocked1>, tensor<16x64x!tt.ptr, #blocked>, i32 + } {async_agent = dense<0> : vector<1xi32>} + %c1_i32_5 = arith.constant {async_agent = dense<0> : vector<1xi32>} 1 : i32 + %51 = arith.addi %arg10, %c1_i32_5 {async_agent = dense<0> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<0> : vector<1xi32>} %51 : i32 + } {async_agent = dense<0> : vector<1xi32>} + } {async_agent = dense<0> : vector<1xi32>} + %c1_i32 = arith.constant 1 : i32 + %5 = arith.cmpi eq, %3, %c1_i32 : i32 + scf.if %5 { + %cst = arith.constant {async_agent = dense<1> : vector<1xi32>} dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 63 : i32 + %c114_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 114 : i32 + %c16_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 16 : i32 + %c0_i32_0 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %c64_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 64 : i32 + %6 = tt.get_program_id x {async_agent = dense<[0, 1]> : vector<2xi32>, axis = 0 : i32} : i32 + %7 = arith.addi %arg3, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %8 = arith.divsi %7, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %9 = arith.addi %arg4, %c63_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %10 = arith.divsi %9, %c64_i32 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %11 = arith.muli %8, %10 {async_agent = dense<[0, 1]> : vector<2xi32>} : i32 + %12 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %13 = tt.make_range {async_agent = dense<1> : vector<1xi32>, end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %14 = tt.splat %arg8 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64x1xi32, #blocked2> + %15 = tt.splat %arg2 {async_agent = dense<1> : vector<1xi32>} : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked2> + %c3_i32 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 3 : i32 + %c0_i32_1 = arith.constant {async_agent = dense<[0, 1]> : vector<2xi32>} 0 : i32 + %16 = scf.for %arg9 = %6 to %11 step %c114_i32 iter_args(%arg10 = %c0_i32_1) -> (i32) : i32 { + %17 = arith.divsi %arg9, %10 {async_agent = dense<1> : vector<1xi32>} : i32 + %18 = arith.remsi %arg9, %10 {async_agent = dense<1> : vector<1xi32>} : i32 + %19 = arith.muli %17, %c64_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + %20 = tt.splat %19 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %21 = arith.addi %20, %13 {async_agent = dense<1> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = arith.muli %18, %c64_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + %23 = tt.splat %22 {async_agent = dense<1> : vector<1xi32>} : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %24 = arith.addi %23, %12 {async_agent = dense<1> : vector<1xi32>} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %c3_i32_2 = arith.constant {async_agent = dense<1> : vector<1xi32>} 3 : i32 + %25 = arith.subi %arg5, %c0_i32_0 {async_agent = dense<1> : vector<1xi32>} : i32 + %26 = arith.divui %25, %c16_i32 {async_agent = dense<1> : vector<1xi32>} : i32 + %27 = arith.muli %arg10, %26 {async_agent = dense<1> : vector<1xi32>} : i32 + %c3_i32_3 = arith.constant {async_agent = dense<1> : vector<1xi32>} 3 : i32 + %28:2 = scf.for %arg11 = %c0_i32_0 to %arg5 step %c16_i32 iter_args(%arg12 = %cst, %arg13 = %27) -> (tensor<64x64xf32, #mma>, i32) : i32 { + %38 = arith.remsi %arg13, %c3_i32_3 {async_agent = dense<1> : vector<1xi32>} : i32 + triton_nvidia_gpu.consumer_wait %2, %38 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %39 = triton_gpu.extract_slice %0[%38, 0, 0] [1, 64, 16] [1, 1, 1] {async_agent = dense<1> : vector<1xi32>} : tensor<3x64x16xf16, #shared> to tensor<64x16xf16, #shared> + %40 = triton_gpu.convert_layout %39 {async_agent = dense<1> : vector<1xi32>} : (tensor<64x16xf16, #shared>) -> tensor<64x16xf16, #shared> + %41 = triton_gpu.extract_slice %1[%38, 0, 0] [1, 16, 64] [1, 1, 1] {async_agent = dense<1> : vector<1xi32>} : tensor<3x16x64xf16, #shared1> to tensor<16x64xf16, #shared1> + %42 = triton_gpu.convert_layout %41 {async_agent = dense<1> : vector<1xi32>} : (tensor<16x64xf16, #shared1>) -> tensor<16x64xf16, #shared1> + %43 = tt.dot %40, %42, %arg12 {allowTF32 = true, async_agent = dense<1> : vector<1xi32>} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + triton_nvidia_gpu.consumer_release %2, %38 {async_agent = dense<1> : vector<1xi32>} : tensor<3x!triton_nvidia_gpu.token>, i32 + %c1_i32_5 = arith.constant {async_agent = dense<1> : vector<1xi32>} 1 : i32 + %44 = arith.addi %arg13, %c1_i32_5 {async_agent = dense<1> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<1> : vector<1xi32>} %43, %44 : tensor<64x64xf32, #mma>, i32 + } {async_agent = dense<1> : vector<1xi32>} + %29 = tt.expand_dims %21 {async_agent = dense<1> : vector<1xi32>, axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<64x1xi32, #blocked2> + %30 = arith.muli %29, %14 {async_agent = dense<1> : vector<1xi32>} : tensor<64x1xi32, #blocked2> + %31 = tt.addptr %15, %30 {async_agent = dense<1> : vector<1xi32>} : tensor<64x1x!tt.ptr, #blocked2>, tensor<64x1xi32, #blocked2> + %32 = tt.expand_dims %24 {async_agent = dense<1> : vector<1xi32>, axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x64xi32, #blocked2> + %33 = tt.broadcast %31 {async_agent = dense<1> : vector<1xi32>} : (tensor<64x1x!tt.ptr, #blocked2>) -> tensor<64x64x!tt.ptr, #blocked2> + %34 = tt.broadcast %32 {async_agent = dense<1> : vector<1xi32>} : (tensor<1x64xi32, #blocked2>) -> tensor<64x64xi32, #blocked2> + %35 = tt.addptr %33, %34 {async_agent = dense<1> : vector<1xi32>} : tensor<64x64x!tt.ptr, #blocked2>, tensor<64x64xi32, #blocked2> + %36 = triton_gpu.convert_layout %28#0 {async_agent = dense<1> : vector<1xi32>} : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked2> + tt.store %35, %36 {async_agent = dense<1> : vector<1xi32>, cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked2> + %c1_i32_4 = arith.constant {async_agent = dense<1> : vector<1xi32>} 1 : i32 + %37 = arith.addi %arg10, %c1_i32_4 {async_agent = dense<1> : vector<1xi32>} : i32 + scf.yield {async_agent = dense<1> : vector<1xi32>} %37 : i32 + } {async_agent = dense<1> : vector<1xi32>} + } {async_agent = dense<1> : vector<1xi32>} + tt.return + } +} diff --git a/test/TritonGPU/wspipeline.mlir b/test/TritonGPU/wspipeline.mlir new file mode 100644 index 000000000000..c2b0a1b70813 --- /dev/null +++ b/test/TritonGPU/wspipeline.mlir @@ -0,0 +1,148 @@ +// RUN: triton-opt %s --triton-nvidia-gpu-ws-decomposing='compute-capability=90' --triton-nvidia-gpu-ws-pipeline='compute-capability=90' | FileCheck %s + +// CHECK: triton_gpu.alloc_tensor +// CHECK: triton_gpu.alloc_tensor +// CHECK: triton_nvidia_gpu.create_token +// CHECK: triton_nvidia_gpu.get_agent_id + +// CHECK: arith.cmpi eq +// CHECK: scf.if +// CHECK: scf.for +// CHECK: triton_nvidia_gpu.producer_acquire +// CHECK: triton_gpu.insert_slice +// CHECK: triton_gpu.insert_slice +// CHECK: triton_nvidia_gpu.producer_commit +// CHECK: scf.yield +// CHECK: async_agent = dense<0> : vector<1xi32> + +// CHECK: arith.cmpi eq +// CHECK: scf.if +// CHECK: scf.for +// CHECK: triton_nvidia_gpu.consumer_wait +// CHECK: triton_gpu.extract_slice +// CHECK: triton_gpu.extract_slice +// CHECK: tt.dot +// CHECK: triton_nvidia_gpu.consumer_release +// CHECK: scf.yield +// CHECK: async_agent = dense<1> : vector<1xi32> + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32, "triton_gpu.enable-warp-specialization" = 1 : i32} { + tt.func public @_kernel_0d1d2d3d4d5d6d7c8c9d10d11c(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + %93 = tt.dot %91, %92, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %94 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + } +} diff --git a/test/TritonNvidiaGPU/ws-feasibility-checking.mlir b/test/TritonNvidiaGPU/ws-feasibility-checking.mlir new file mode 100644 index 000000000000..d2a901daae08 --- /dev/null +++ b/test/TritonNvidiaGPU/ws-feasibility-checking.mlir @@ -0,0 +1,896 @@ +// RUN: triton-opt -split-input-file -triton-nvidia-gpu-ws-feasibility-checking='compute-capability=90' %s 2>&1 | FileCheck %s + +// Check if all opereations are labeled with appropriate attributes. +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +// CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 +// CHECK-LABEL @simple_gemm +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + tt.func public @simple_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + %93 = tt.dot %91, %92, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %94 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @nested_for_gemm + tt.func public @nested_for_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %cst_2 = arith.constant dense<0.000000e+00> : tensor<128x32xf16, #shared> + %cst_3 = arith.constant dense<0.000000e+00> : tensor<32x128xf16, #shared1> + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %96:2 = scf.for %arg13 = %c0 to %69 step %c1 iter_args(%arg14 = %cst_2, %arg15 = %cst_3) -> (tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1>) { + %89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + scf.yield %91, %92 : tensor<128x32xf16, #shared>, tensor<32x128xf16, #shared1> + } + %93 = tt.dot %96#0, %96#1, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %94 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [4, 8], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [8, 4], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 2, maxPhase = 4, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @if_in_for_gemm + tt.func public @if_in_for_gemm(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<128x128xf32, #mma> + %cst_0 = arith.constant dense<32> : tensor<32x128xi32, #blocked> + %cst_1 = arith.constant dense<32> : tensor<128x32xi32, #blocked1> + %c31_i32 = arith.constant 31 : i32 + %c127_i32 = arith.constant 127 : i32 + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32_i32 = arith.constant 32 : i32 + %c128_i32 = arith.constant 128 : i32 + %c8_i32 = arith.constant 8 : i32 + %0 = tt.get_program_id x : i32 + %1 = tt.get_program_id y : i32 + %2 = arith.addi %arg3, %c127_i32 : i32 + %3 = arith.divsi %2, %c128_i32 : i32 + %4 = arith.addi %arg4, %c127_i32 : i32 + %5 = arith.divsi %4, %c128_i32 : i32 + %6 = arith.muli %5, %c8_i32 : i32 + %7 = arith.divsi %0, %6 : i32 + %8 = arith.muli %7, %c8_i32 : i32 + %9 = arith.subi %3, %8 : i32 + %10 = arith.cmpi slt, %9, %c8_i32 : i32 + %11 = arith.select %10, %9, %c8_i32 : i32 + %12 = arith.remsi %0, %11 : i32 + %13 = arith.addi %8, %12 : i32 + %14 = arith.remsi %0, %6 : i32 + %15 = arith.divsi %14, %11 : i32 + %16 = arith.muli %13, %c128_i32 : i32 + %17 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %18 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %19 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %22 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %23 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %24 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %25 = tt.splat %16 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %26 = arith.addi %23, %17 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %27 = arith.addi %24, %19 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %28 = arith.addi %25, %21 : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %29 = arith.muli %15, %c128_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %31 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %32 = tt.splat %29 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %33 = arith.addi %30, %18 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %34 = arith.addi %31, %20 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = arith.addi %32, %22 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %36 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %37 = tt.splat %arg3 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %38 = arith.remsi %26, %36 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>> + %39 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %40 = tt.splat %arg4 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %41 = arith.remsi %33, %39 {tt.contiguity = dense<128> : tensor<1xi32>, tt.divisibility = dense<128> : tensor<1xi32>} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>> + %42 = arith.muli %1, %c32_i32 : i32 + %43 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %44 = tt.make_range {end = 32 : i32, start = 0 : i32} : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %45 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %46 = tt.splat %42 : (i32) -> tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %47 = arith.addi %45, %43 : tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>> + %48 = arith.addi %46, %44 : tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>> + %49 = tt.expand_dims %38 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked1}>>) -> tensor<128x1xi32, #blocked1> + %50 = tt.splat %arg6 : (i32) -> tensor<128x1xi32, #blocked1> + %51 = arith.muli %49, %50 : tensor<128x1xi32, #blocked1> + %52 = tt.expand_dims %47 {axis = 0 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 0, parent = #blocked1}>>) -> tensor<1x32xi32, #blocked1> + %53 = tt.broadcast %51 : (tensor<128x1xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %54 = tt.broadcast %52 : (tensor<1x32xi32, #blocked1>) -> tensor<128x32xi32, #blocked1> + %55 = arith.addi %53, %54 : tensor<128x32xi32, #blocked1> + %56 = tt.splat %arg0 : (!tt.ptr) -> tensor<128x32x!tt.ptr, #blocked1> + %57 = tt.addptr %56, %55 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %58 = tt.expand_dims %48 {axis = 1 : i32} : (tensor<32xi32, #triton_gpu.slice<{dim = 1, parent = #blocked}>>) -> tensor<32x1xi32, #blocked> + %59 = tt.expand_dims %41 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked}>>) -> tensor<1x128xi32, #blocked> + %60 = tt.splat %arg7 : (i32) -> tensor<1x128xi32, #blocked> + %61 = arith.muli %59, %60 : tensor<1x128xi32, #blocked> + %62 = tt.broadcast %58 : (tensor<32x1xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %63 = tt.broadcast %61 : (tensor<1x128xi32, #blocked>) -> tensor<32x128xi32, #blocked> + %64 = arith.addi %62, %63 : tensor<32x128xi32, #blocked> + %65 = tt.splat %arg1 : (!tt.ptr) -> tensor<32x128x!tt.ptr, #blocked> + %66 = tt.addptr %65, %64 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + %67 = arith.addi %arg5, %c31_i32 : i32 + %68 = arith.divsi %67, %c32_i32 : i32 + %69 = arith.index_cast %68 : i32 to index + %70:3 = scf.for %arg9 = %c0 to %69 step %c1 iter_args(%arg10 = %cst, %arg11 = %57, %arg12 = %66) -> (tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked>) { + %arg9_i32 = arith.index_cast %arg9 : index to i32 + %96 = arith.cmpi ne, %arg9_i32, %c31_i32 : i32 + %89 = scf.if %96 -> (tensor<128x32xf16, #blocked1>) { + %r0_0 = arith.select %96, %c31_i32, %c127_i32 : i32 + %r0_1 = tt.splat %r0_0 : (i32) -> tensor<128x32xi32, #blocked1> + %new_addr = tt.addptr %arg11, %r0_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %new_89 = tt.load %new_addr {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + scf.yield %new_89 : tensor<128x32xf16, #blocked1> + } else { + %new_89 = tt.load %arg11 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<128x32xf16, #blocked1> + scf.yield %new_89 : tensor<128x32xf16, #blocked1> + } + %90 = tt.load %arg12 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<32x128xf16, #blocked> + %91 = triton_gpu.convert_layout %89 : (tensor<128x32xf16, #blocked1>) -> tensor<128x32xf16, #shared> + %92 = triton_gpu.convert_layout %90 : (tensor<32x128xf16, #blocked>) -> tensor<32x128xf16, #shared1> + %93 = tt.dot %91, %92, %arg10 {allowTF32 = true} : tensor<128x32xf16, #shared> * tensor<32x128xf16, #shared1> -> tensor<128x128xf32, #mma> + %base_94 = scf.if %96 -> (tensor<128x32x!tt.ptr, #blocked1>) { + %r1_0 = arith.select %96, %c31_i32, %c127_i32 : i32 + %r1_1 = tt.splat %r1_0 : (i32) -> tensor<128x32xi32, #blocked1> + %98 = tt.addptr %arg11, %r1_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + scf.yield %98 : tensor<128x32x!tt.ptr, #blocked1> + } else { + %98 = tt.addptr %arg11, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + scf.yield %98 : tensor<128x32x!tt.ptr, #blocked1> + } + %94 = tt.addptr %base_94, %cst_1 : tensor<128x32x!tt.ptr, #blocked1>, tensor<128x32xi32, #blocked1> + %95 = tt.addptr %arg12, %cst_0 : tensor<32x128x!tt.ptr, #blocked>, tensor<32x128xi32, #blocked> + scf.yield %93, %94, %95 : tensor<128x128xf32, #mma>, tensor<128x32x!tt.ptr, #blocked1>, tensor<32x128x!tt.ptr, #blocked> + } + %71 = arith.truncf %70#0 : tensor<128x128xf32, #mma> to tensor<128x128xf16, #mma> + %72 = tt.expand_dims %27 {axis = 1 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi32, #blocked2> + %73 = tt.splat %arg8 : (i32) -> tensor<128x1xi32, #blocked2> + %74 = arith.muli %72, %73 : tensor<128x1xi32, #blocked2> + %75 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %76 = tt.broadcast %74 : (tensor<128x1xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %77 = tt.broadcast %75 : (tensor<1x128xi32, #blocked2>) -> tensor<128x128xi32, #blocked2> + %78 = arith.addi %76, %77 : tensor<128x128xi32, #blocked2> + %79 = tt.splat %arg2 : (!tt.ptr) -> tensor<128x128x!tt.ptr, #blocked2> + %80 = tt.addptr %79, %78 : tensor<128x128x!tt.ptr, #blocked2>, tensor<128x128xi32, #blocked2> + %81 = "triton_gpu.cmpi"(%28, %37) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %82 = tt.expand_dims %81 {axis = 1 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<128x1xi1, #blocked2> + %83 = "triton_gpu.cmpi"(%35, %40) {predicate = 2 : i64} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>, tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %84 = tt.expand_dims %83 {axis = 0 : i32} : (tensor<128xi1, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi1, #blocked2> + %85 = tt.broadcast %82 : (tensor<128x1xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %86 = tt.broadcast %84 : (tensor<1x128xi1, #blocked2>) -> tensor<128x128xi1, #blocked2> + %87 = arith.andi %85, %86 : tensor<128x128xi1, #blocked2> + %88 = triton_gpu.convert_layout %71 : (tensor<128x128xf16, #mma>) -> tensor<128x128xf16, #blocked2> + tt.store %80, %88, %87 {cache = 1 : i32, evict = 1 : i32} : tensor<128x128xf16, #blocked2> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @tma_warp_specialized_matmul + tt.func public @tma_warp_specialized_matmul(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant 63 : i32 + %c16_i32 = arith.constant 16 : i32 + %c0_i32 = arith.constant 0 : i32 + %c1_i64 = arith.constant 1 : i64 + %c64_i32 = arith.constant 64 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg4, %c63_i32 : i32 + %2 = arith.divsi %1, %c64_i32 : i32 + %3 = arith.divsi %0, %2 : i32 + %4 = arith.remsi %0, %2 : i32 + %5 = arith.muli %3, %c64_i32 : i32 + %6 = arith.muli %4, %c64_i32 : i32 + %7 = arith.extsi %arg3 : i32 to i64 + %8 = arith.extsi %arg5 : i32 to i64 + %9 = arith.extsi %arg6 : i32 to i64 + %10 = tt.make_tensor_ptr %arg0, [%7, %8], [%9, %c1_i64], [%5, %c0_i32] {order = array} : , 1> + %11 = arith.extsi %arg4 : i32 to i64 + %12 = arith.extsi %arg7 : i32 to i64 + %13 = tt.make_tensor_ptr %arg1, [%8, %11], [%c1_i64, %12], [%c0_i32, %6] {order = array} : , 1> + %14:3 = scf.for %arg9 = %c0_i32 to %arg5 step %c16_i32 iter_args(%arg10 = %cst, %arg11 = %10, %arg12 = %13) -> (tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + %46 = tt.load %arg11 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blocked2> + %47 = tt.load %arg12 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<16x64xf16, #blocked3> + %48 = triton_gpu.convert_layout %46 : (tensor<64x16xf16, #blocked2>) -> tensor<64x16xf16, #shared> + %49 = triton_gpu.convert_layout %47 : (tensor<16x64xf16, #blocked3>) -> tensor<16x64xf16, #shared1> + %50 = tt.dot %48, %49, %arg10 {allowTF32 = true} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %51 = tt.advance %arg11, [%c0_i32, %c16_i32] : , 1> + %52 = tt.advance %arg12, [%c16_i32, %c0_i32] : , 1> + scf.yield %50, %51, %52 : tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1> + } + %15 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %16 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %17 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %18 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %19 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %20 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %21 = arith.addi %16, %19 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %22 = arith.addi %18, %20 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %23 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %24 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %25 = arith.addi %15, %23 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %26 = arith.addi %17, %24 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %27 = tt.expand_dims %21 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi32, #blocked4> + %28 = tt.splat %arg8 : (i32) -> tensor<64x1xi32, #blocked4> + %29 = arith.muli %27, %28 : tensor<64x1xi32, #blocked4> + %30 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked4> + %31 = tt.addptr %30, %29 : tensor<64x1x!tt.ptr, #blocked4>, tensor<64x1xi32, #blocked4> + %32 = tt.expand_dims %25 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi32, #blocked4> + %33 = tt.broadcast %31 : (tensor<64x1x!tt.ptr, #blocked4>) -> tensor<64x64x!tt.ptr, #blocked4> + %34 = tt.broadcast %32 : (tensor<1x64xi32, #blocked4>) -> tensor<64x64xi32, #blocked4> + %35 = tt.addptr %33, %34 : tensor<64x64x!tt.ptr, #blocked4>, tensor<64x64xi32, #blocked4> + %36 = tt.splat %arg3 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %37 = "triton_gpu.cmpi"(%22, %36) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %38 = tt.expand_dims %37 {axis = 1 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi1, #blocked4> + %39 = tt.splat %arg4 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %40 = "triton_gpu.cmpi"(%26, %39) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %41 = tt.expand_dims %40 {axis = 0 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi1, #blocked4> + %42 = tt.broadcast %38 : (tensor<64x1xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %43 = tt.broadcast %41 : (tensor<1x64xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %44 = arith.andi %42, %43 : tensor<64x64xi1, #blocked4> + %45 = triton_gpu.convert_layout %14#0 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked4> + tt.store %35, %45, %44 {cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked4> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @store_after_load + tt.func public @store_after_load(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant 63 : i32 + %c16_i32 = arith.constant 16 : i32 + %c0_i32 = arith.constant 0 : i32 + %c1_i64 = arith.constant 1 : i64 + %c64_i32 = arith.constant 64 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg4, %c63_i32 : i32 + %2 = arith.divsi %1, %c64_i32 : i32 + %3 = arith.divsi %0, %2 : i32 + %4 = arith.remsi %0, %2 : i32 + %5 = arith.muli %3, %c64_i32 : i32 + %6 = arith.muli %4, %c64_i32 : i32 + %7 = arith.extsi %arg3 : i32 to i64 + %8 = arith.extsi %arg5 : i32 to i64 + %9 = arith.extsi %arg6 : i32 to i64 + %10 = tt.make_tensor_ptr %arg0, [%7, %8], [%9, %c1_i64], [%5, %c0_i32] {order = array} : , 1> + %11 = arith.extsi %arg4 : i32 to i64 + %12 = arith.extsi %arg7 : i32 to i64 + %13 = tt.make_tensor_ptr %arg1, [%8, %11], [%c1_i64, %12], [%c0_i32, %6] {order = array} : , 1> + %14:3 = scf.for %arg9 = %c0_i32 to %arg5 step %c16_i32 iter_args(%arg10 = %cst, %arg11 = %10, %arg12 = %13) -> (tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + %46 = tt.load %arg11 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blocked2> + %47 = tt.load %arg12 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<16x64xf16, #blocked3> + %48 = triton_gpu.convert_layout %46 : (tensor<64x16xf16, #blocked2>) -> tensor<64x16xf16, #shared> + %49 = triton_gpu.convert_layout %47 : (tensor<16x64xf16, #blocked3>) -> tensor<16x64xf16, #shared1> + %50 = tt.dot %48, %49, %arg10 {allowTF32 = true} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %51 = tt.advance %arg11, [%c0_i32, %c16_i32] : , 1> + %52 = tt.advance %arg12, [%c16_i32, %c0_i32] : , 1> + scf.yield %50, %51, %52 : tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1> + } + %15 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %16 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %17 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %18 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %19 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %20 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %21 = arith.addi %16, %19 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %22 = arith.addi %18, %20 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %23 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %24 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %25 = arith.addi %15, %23 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %26 = arith.addi %17, %24 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %27 = tt.expand_dims %21 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi32, #blocked4> + %28 = tt.splat %arg8 : (i32) -> tensor<64x1xi32, #blocked4> + %29 = arith.muli %27, %28 : tensor<64x1xi32, #blocked4> + %30 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked4> + %31 = tt.addptr %30, %29 : tensor<64x1x!tt.ptr, #blocked4>, tensor<64x1xi32, #blocked4> + %32 = tt.expand_dims %25 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi32, #blocked4> + %33 = tt.broadcast %31 : (tensor<64x1x!tt.ptr, #blocked4>) -> tensor<64x64x!tt.ptr, #blocked4> + %34 = tt.broadcast %32 : (tensor<1x64xi32, #blocked4>) -> tensor<64x64xi32, #blocked4> + %35 = tt.addptr %33, %34 : tensor<64x64x!tt.ptr, #blocked4>, tensor<64x64xi32, #blocked4> + %36 = tt.splat %arg3 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %37 = "triton_gpu.cmpi"(%22, %36) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %38 = tt.expand_dims %37 {axis = 1 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi1, #blocked4> + %39 = tt.splat %arg4 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %40 = "triton_gpu.cmpi"(%26, %39) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %41 = tt.expand_dims %40 {axis = 0 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi1, #blocked4> + %42 = tt.broadcast %38 : (tensor<64x1xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %43 = tt.broadcast %41 : (tensor<1x64xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %44 = arith.andi %42, %43 : tensor<64x64xi1, #blocked4> + %45 = triton_gpu.convert_layout %14#0 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked4> + %46 = tt.load %35, %44 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x64xf32, #blocked4> + %47 = arith.addf %45, %46 : tensor<64x64xf32, #blocked4> + tt.store %35, %47, %44 {cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked4> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 0 : i32 + // CHECK-LABEL: @load_after_store + tt.func public @load_after_store(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant 63 : i32 + %c16_i32 = arith.constant 16 : i32 + %c0_i32 = arith.constant 0 : i32 + %c1_i64 = arith.constant 1 : i64 + %c64_i32 = arith.constant 64 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg4, %c63_i32 : i32 + %2 = arith.divsi %1, %c64_i32 : i32 + %3 = arith.divsi %0, %2 : i32 + %4 = arith.remsi %0, %2 : i32 + %5 = arith.muli %3, %c64_i32 : i32 + %6 = arith.muli %4, %c64_i32 : i32 + %7 = arith.extsi %arg3 : i32 to i64 + %8 = arith.extsi %arg5 : i32 to i64 + %9 = arith.extsi %arg6 : i32 to i64 + %10 = tt.make_tensor_ptr %arg0, [%7, %8], [%9, %c1_i64], [%5, %c0_i32] {order = array} : , 1> + %11 = arith.extsi %arg4 : i32 to i64 + %12 = arith.extsi %arg7 : i32 to i64 + %13 = tt.make_tensor_ptr %arg1, [%8, %11], [%c1_i64, %12], [%c0_i32, %6] {order = array} : , 1> + %14:3 = scf.for %arg9 = %c0_i32 to %arg5 step %c16_i32 iter_args(%arg10 = %cst, %arg11 = %10, %arg12 = %13) -> (tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + %46 = tt.load %arg11 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blocked2> + %47 = tt.load %arg12 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<16x64xf16, #blocked3> + %48 = triton_gpu.convert_layout %46 : (tensor<64x16xf16, #blocked2>) -> tensor<64x16xf16, #shared> + %49 = triton_gpu.convert_layout %47 : (tensor<16x64xf16, #blocked3>) -> tensor<16x64xf16, #shared1> + %50 = tt.dot %48, %49, %arg10 {allowTF32 = true} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %51 = tt.advance %arg11, [%c0_i32, %c16_i32] : , 1> + %52 = tt.advance %arg12, [%c16_i32, %c0_i32] : , 1> + scf.yield %50, %51, %52 : tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1> + } + %15 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %16 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %17 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %18 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %19 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %20 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %21 = arith.addi %16, %19 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %22 = arith.addi %18, %20 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %23 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %24 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %25 = arith.addi %15, %23 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %26 = arith.addi %17, %24 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %27 = tt.expand_dims %21 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi32, #blocked4> + %28 = tt.splat %arg8 : (i32) -> tensor<64x1xi32, #blocked4> + %29 = arith.muli %27, %28 : tensor<64x1xi32, #blocked4> + %30 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked4> + %31 = tt.addptr %30, %29 : tensor<64x1x!tt.ptr, #blocked4>, tensor<64x1xi32, #blocked4> + %32 = tt.expand_dims %25 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi32, #blocked4> + %33 = tt.broadcast %31 : (tensor<64x1x!tt.ptr, #blocked4>) -> tensor<64x64x!tt.ptr, #blocked4> + %34 = tt.broadcast %32 : (tensor<1x64xi32, #blocked4>) -> tensor<64x64xi32, #blocked4> + %35 = tt.addptr %33, %34 : tensor<64x64x!tt.ptr, #blocked4>, tensor<64x64xi32, #blocked4> + %36 = tt.splat %arg3 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %37 = "triton_gpu.cmpi"(%22, %36) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %38 = tt.expand_dims %37 {axis = 1 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi1, #blocked4> + %39 = tt.splat %arg4 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %40 = "triton_gpu.cmpi"(%26, %39) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %41 = tt.expand_dims %40 {axis = 0 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi1, #blocked4> + %42 = tt.broadcast %38 : (tensor<64x1xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %43 = tt.broadcast %41 : (tensor<1x64xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %44 = arith.andi %42, %43 : tensor<64x64xi1, #blocked4> + %45 = triton_gpu.convert_layout %14#0 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked4> + %46 = tt.load %35, %44 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x64xf32, #blocked4> + %47 = arith.addf %45, %46 : tensor<64x64xf32, #blocked4> + tt.store %35, %47, %44 {cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked4> + %48 = tt.load %35, %44 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x64xf32, #blocked4> + %49 = arith.addf %45, %48 : tensor<64x64xf32, #blocked4> + tt.store %35, %49, %44 {cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked4> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [16, 2], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [16, 2], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [2, 16], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [2, 16], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 64, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 4, maxPhase = 2, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 0 : i32 + // CHECK-LABEL: @global_bar + tt.func public @global_bar(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}, %arg100: !tt.ptr {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<64x64xf32, #mma> + %c63_i32 = arith.constant 63 : i32 + %c16_i32 = arith.constant 16 : i32 + %c0_i32 = arith.constant 0 : i32 + %c1_i32 = arith.constant 1 : i32 + %c1_i64 = arith.constant 1 : i64 + %c64_i32 = arith.constant 64 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg4, %c63_i32 : i32 + %2 = arith.divsi %1, %c64_i32 : i32 + %3 = arith.divsi %0, %2 : i32 + %4 = arith.remsi %0, %2 : i32 + %5 = arith.muli %3, %c64_i32 : i32 + %6 = arith.muli %4, %c64_i32 : i32 + %7 = arith.extsi %arg3 : i32 to i64 + %8 = arith.extsi %arg5 : i32 to i64 + %9 = arith.extsi %arg6 : i32 to i64 + %10 = tt.make_tensor_ptr %arg0, [%7, %8], [%9, %c1_i64], [%5, %c0_i32] {order = array} : , 1> + %11 = arith.extsi %arg4 : i32 to i64 + %12 = arith.extsi %arg7 : i32 to i64 + %13 = tt.make_tensor_ptr %arg1, [%8, %11], [%c1_i64, %12], [%c0_i32, %6] {order = array} : , 1> + %14:3 = scf.for %arg9 = %c0_i32 to %arg5 step %c16_i32 iter_args(%arg10 = %cst, %arg11 = %10, %arg12 = %13) -> (tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + %46 = tt.load %arg11 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x16xf16, #blocked2> + %47 = tt.load %arg12 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<16x64xf16, #blocked3> + %48 = triton_gpu.convert_layout %46 : (tensor<64x16xf16, #blocked2>) -> tensor<64x16xf16, #shared> + %49 = triton_gpu.convert_layout %47 : (tensor<16x64xf16, #blocked3>) -> tensor<16x64xf16, #shared1> + %50 = tt.dot %48, %49, %arg10 {allowTF32 = true} : tensor<64x16xf16, #shared> * tensor<16x64xf16, #shared1> -> tensor<64x64xf32, #mma> + %51 = tt.advance %arg11, [%c0_i32, %c16_i32] : , 1> + %52 = tt.advance %arg12, [%c16_i32, %c0_i32] : , 1> + scf.yield %50, %51, %52 : tensor<64x64xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1> + } + %15 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %16 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %17 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %18 = tt.make_range {end = 64 : i32, start = 0 : i32} : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %19 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %20 = tt.splat %5 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %21 = arith.addi %16, %19 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %22 = arith.addi %18, %20 : tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %23 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %24 = tt.splat %6 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %25 = arith.addi %15, %23 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %26 = arith.addi %17, %24 : tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %27 = tt.expand_dims %21 {axis = 1 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi32, #blocked4> + %28 = tt.splat %arg8 : (i32) -> tensor<64x1xi32, #blocked4> + %29 = arith.muli %27, %28 : tensor<64x1xi32, #blocked4> + %30 = tt.splat %arg2 : (!tt.ptr) -> tensor<64x1x!tt.ptr, #blocked4> + %31 = tt.addptr %30, %29 : tensor<64x1x!tt.ptr, #blocked4>, tensor<64x1xi32, #blocked4> + %32 = tt.expand_dims %25 {axis = 0 : i32} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi32, #blocked4> + %33 = tt.broadcast %31 : (tensor<64x1x!tt.ptr, #blocked4>) -> tensor<64x64x!tt.ptr, #blocked4> + %34 = tt.broadcast %32 : (tensor<1x64xi32, #blocked4>) -> tensor<64x64xi32, #blocked4> + %35 = tt.addptr %33, %34 : tensor<64x64x!tt.ptr, #blocked4>, tensor<64x64xi32, #blocked4> + %36 = tt.splat %arg3 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %37 = "triton_gpu.cmpi"(%22, %36) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>> + %38 = tt.expand_dims %37 {axis = 1 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 1, parent = #blocked4}>>) -> tensor<64x1xi1, #blocked4> + %39 = tt.splat %arg4 : (i32) -> tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %40 = "triton_gpu.cmpi"(%26, %39) {predicate = 2 : i64} : (tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>, tensor<64xi32, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>> + %41 = tt.expand_dims %40 {axis = 0 : i32} : (tensor<64xi1, #triton_gpu.slice<{dim = 0, parent = #blocked4}>>) -> tensor<1x64xi1, #blocked4> + %42 = tt.broadcast %38 : (tensor<64x1xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %43 = tt.broadcast %41 : (tensor<1x64xi1, #blocked4>) -> tensor<64x64xi1, #blocked4> + %44 = arith.andi %42, %43 : tensor<64x64xi1, #blocked4> + %45 = triton_gpu.convert_layout %14#0 : (tensor<64x64xf32, #mma>) -> tensor<64x64xf32, #blocked4> + "tt.atomic_cas"(%arg100, %c0_i32, %c1_i32) {sem = 1 : i32}: (!tt.ptr, i32, i32) -> i32 + %46 = tt.load %35, %44 {cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x64xf32, #blocked4> + %47 = arith.addf %45, %46 : tensor<64x64xf32, #blocked4> + tt.store %35, %47, %44 {cache = 1 : i32, evict = 1 : i32} : tensor<64x64xf32, #blocked4> + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @store_in_nested_for + tt.func public @store_in_nested_for(%arg0: !tt.ptr {tt.divisibility = 16 : i32}, %arg1: !tt.ptr {tt.divisibility = 16 : i32}, %arg2: !tt.ptr {tt.divisibility = 16 : i32}, %arg3: i32 {tt.divisibility = 16 : i32}, %arg4: i32 {tt.divisibility = 16 : i32}, %arg5: i32 {tt.divisibility = 16 : i32}, %arg6: i32 {tt.divisibility = 16 : i32}, %arg7: i32 {tt.divisibility = 16 : i32}, %arg8: i32 {tt.divisibility = 16 : i32}) { + %cst = arith.constant dense<0.000000e+00> : tensor<256x128xf32, #mma> + %c63_i32 = arith.constant 63 : i32 + %c127_i32 = arith.constant 127 : i32 + %c255_i32 = arith.constant 255 : i32 + %c114_i32 = arith.constant 114 : i32 + %c64_i32 = arith.constant 64 : i32 + %c0_i32 = arith.constant 0 : i32 + %c1_i64 = arith.constant 1 : i64 + %c128_i32 = arith.constant 128 : i32 + %c256_i32 = arith.constant 256 : i32 + %0 = tt.get_program_id x : i32 + %1 = arith.addi %arg3, %c255_i32 : i32 + %2 = arith.divsi %1, %c256_i32 : i32 + %3 = arith.addi %arg4, %c127_i32 : i32 + %4 = arith.divsi %3, %c128_i32 : i32 + %5 = arith.addi %arg5, %c63_i32 : i32 + %6 = arith.divsi %5, %c64_i32 : i32 + %7 = arith.muli %2, %4 : i32 + %8 = arith.divsi %0, %4 : i32 + %9 = arith.remsi %0, %4 : i32 + %10 = arith.muli %8, %c256_i32 : i32 + %11 = arith.muli %9, %c128_i32 : i32 + %12 = arith.extsi %arg3 : i32 to i64 + %13 = arith.extsi %arg5 : i32 to i64 + %14 = arith.extsi %arg6 : i32 to i64 + %15 = tt.make_tensor_ptr %arg0, [%12, %13], [%14, %c1_i64], [%10, %c0_i32] {order = array} : , 1> + %16 = arith.extsi %arg4 : i32 to i64 + %17 = arith.extsi %arg7 : i32 to i64 + %18 = tt.make_tensor_ptr %arg1, [%13, %16], [%c1_i64, %17], [%c0_i32, %11] {order = array} : , 1> + %19 = tt.make_range {end = 256 : i32, start = 0 : i32} : tensor<256xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %20 = tt.make_range {end = 128 : i32, start = 0 : i32} : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %21 = tt.splat %arg8 : (i32) -> tensor<256x1xi32, #blocked2> + %22 = tt.splat %arg2 : (!tt.ptr) -> tensor<256x1x!tt.ptr, #blocked2> + %23:4 = scf.for %arg9 = %0 to %7 step %c114_i32 iter_args(%arg10 = %15, %arg11 = %18, %arg12 = %8, %arg13 = %9) -> (!tt.ptr, 1>, !tt.ptr, 1>, i32, i32) : i32 { + %24 = arith.divsi %arg9, %4 : i32 + %25 = arith.remsi %arg9, %4 : i32 + %26 = "triton_gpu.cmpi"(%arg9, %c114_i32) {predicate = 5 : i64} : (i32, i32) -> i1 + %27:2 = scf.if %26 -> (!tt.ptr, 1>, !tt.ptr, 1>) { + %43 = arith.subi %24, %arg12 : i32 + %44 = arith.muli %43, %c256_i32 : i32 + %45 = arith.subi %c0_i32, %6 : i32 + %46 = arith.muli %45, %c64_i32 : i32 + %47 = tt.advance %arg10, [%44, %46] : , 1> + %48 = arith.subi %25, %arg13 : i32 + %49 = arith.muli %48, %c128_i32 : i32 + %50 = tt.advance %arg11, [%46, %49] : , 1> + scf.yield %47, %50 : !tt.ptr, 1>, !tt.ptr, 1> + } else { + scf.yield %arg10, %arg11 : !tt.ptr, 1>, !tt.ptr, 1> + } + %28:3 = scf.for %arg14 = %c0_i32 to %arg5 step %c64_i32 iter_args(%arg15 = %cst, %arg16 = %27#0, %arg17 = %27#1) -> (tensor<256x128xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1>) : i32 { + %43 = tt.load %arg16 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<256x64xf16, #blocked3> + %44 = tt.load %arg17 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x128xf16, #blocked4> + %45 = triton_gpu.convert_layout %43 : (tensor<256x64xf16, #blocked3>) -> tensor<256x64xf16, #shared> + %46 = triton_gpu.convert_layout %44 : (tensor<64x128xf16, #blocked4>) -> tensor<64x128xf16, #shared1> + %47 = tt.dot %45, %46, %arg15 {allowTF32 = true} : tensor<256x64xf16, #shared> * tensor<64x128xf16, #shared1> -> tensor<256x128xf32, #mma> + %48 = tt.advance %arg16, [%c0_i32, %c64_i32] : , 1> + %49 = tt.advance %arg17, [%c64_i32, %c0_i32] : , 1> + scf.yield %47, %48, %49 : tensor<256x128xf32, #mma>, !tt.ptr, 1>, !tt.ptr, 1> + } + %29 = arith.muli %24, %c256_i32 : i32 + %30 = tt.splat %29 : (i32) -> tensor<256xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %31 = arith.addi %19, %30 : tensor<256xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>> + %32 = arith.muli %25, %c128_i32 : i32 + %33 = tt.splat %32 : (i32) -> tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %34 = arith.addi %20, %33 : tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>> + %35 = tt.expand_dims %31 {axis = 1 : i32} : (tensor<256xi32, #triton_gpu.slice<{dim = 1, parent = #blocked2}>>) -> tensor<256x1xi32, #blocked2> + %36 = arith.muli %35, %21 : tensor<256x1xi32, #blocked2> + %37 = tt.addptr %22, %36 : tensor<256x1x!tt.ptr, #blocked2>, tensor<256x1xi32, #blocked2> + %38 = tt.expand_dims %34 {axis = 0 : i32} : (tensor<128xi32, #triton_gpu.slice<{dim = 0, parent = #blocked2}>>) -> tensor<1x128xi32, #blocked2> + %39 = tt.broadcast %37 : (tensor<256x1x!tt.ptr, #blocked2>) -> tensor<256x128x!tt.ptr, #blocked2> + %40 = tt.broadcast %38 : (tensor<1x128xi32, #blocked2>) -> tensor<256x128xi32, #blocked2> + %41 = tt.addptr %39, %40 : tensor<256x128x!tt.ptr, #blocked2>, tensor<256x128xi32, #blocked2> + %42 = triton_gpu.convert_layout %28#0 : (tensor<256x128xf32, #mma>) -> tensor<256x128xf32, #blocked2> + tt.store %41, %42 {cache = 1 : i32, evict = 1 : i32} : tensor<256x128xf32, #blocked2> + scf.yield %28#1, %28#2, %24, %25 : !tt.ptr, 1>, !tt.ptr, 1>, i32, i32 + } + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 1 : i32 + // CHECK-LABEL: @matched_load_type + tt.func public @matched_load_type( + %arg0: !tt.ptr, 1>, + %arg1: !tt.ptr, 1>, + %arg2: tensor<256x128x!tt.ptr, #blocked2> + ) { + %cst = arith.constant dense<0.000000e+00> : tensor<256x128xf32, #mma> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c10 = arith.constant 10 : index + scf.for %iv = %c0 to %c10 step %c1 iter_args() -> () { + %a = tt.load %arg0 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<256x64xf16, #blocked3> + %b = tt.load %arg1 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<64x128xf16, #blocked4> + %shm_a = triton_gpu.convert_layout %a : (tensor<256x64xf16, #blocked3>) -> tensor<256x64xf16, #shared> + %shm_b = triton_gpu.convert_layout %b : (tensor<64x128xf16, #blocked4>) -> tensor<64x128xf16, #shared1> + %d = tt.dot %shm_a, %shm_b, %cst {allowTF32 = true} : tensor<256x64xf16, #shared> * tensor<64x128xf16, #shared1> -> tensor<256x128xf32, #mma> + %out = triton_gpu.convert_layout %d : (tensor<256x128xf32, #mma>) -> tensor<256x128xf32, #blocked2> + tt.store %arg2, %out {cache = 1 : i32, evict = 1 : i32} : tensor<256x128xf32, #blocked2> + } + tt.return + } +} + +// ----- + +#blocked = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [4, 1], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked1 = #triton_gpu.blocked<{sizePerThread = [1, 1], threadsPerWarp = [32, 1], warpsPerCTA = [2, 2], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked2 = #triton_gpu.blocked<{sizePerThread = [1, 4], threadsPerWarp = [1, 32], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked3 = #triton_gpu.blocked<{sizePerThread = [1, 8], threadsPerWarp = [4, 8], warpsPerCTA = [4, 1], order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#blocked4 = #triton_gpu.blocked<{sizePerThread = [8, 1], threadsPerWarp = [8, 4], warpsPerCTA = [1, 4], order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1]}> +#mma = #triton_gpu.mma<{versionMajor = 3, versionMinor = 0, warpsPerCTA = [4, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [1, 0], instrShape = [16, 128, 16]}> +#shared = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [1, 0], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +#shared1 = #triton_gpu.shared<{vec = 8, perPhase = 1, maxPhase = 8, order = [0, 1], CTAsPerCGA = [1, 1], CTASplitNum = [1, 1], CTAOrder = [0, 1], hasLeadingOffset = true}> +module attributes {"triton_gpu.compute-capability" = 90 : i32, "triton_gpu.num-ctas" = 1 : i32, "triton_gpu.num-warps" = 4 : i32} { + // CHECK: "triton_gpu.enable-warp-specialization" = 0 : i32 + // CHECK-LABEL: @mismatch_load_type + tt.func public @mismatch_load_type( + %arg0: !tt.ptr, 1>, + %arg1: tensor<64x128x!tt.ptr, #blocked4>, + %arg2: tensor<256x128x!tt.ptr, #blocked2> + ) { + %cst = arith.constant dense<0.000000e+00> : tensor<256x128xf32, #mma> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c10 = arith.constant 10 : index + scf.for %iv = %c0 to %c10 step %c1 iter_args() -> () { + %a = tt.load %arg0 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : !tt.ptr, 1> -> tensor<256x64xf16, #blocked3> + %b = tt.load %arg1 {boundaryCheck = array, cache = 1 : i32, evict = 1 : i32, isVolatile = false} : tensor<64x128x!tt.ptr, #blocked4> -> tensor<64x128xf16, #blocked4> + %shm_a = triton_gpu.convert_layout %a : (tensor<256x64xf16, #blocked3>) -> tensor<256x64xf16, #shared> + %shm_b = triton_gpu.convert_layout %b : (tensor<64x128xf16, #blocked4>) -> tensor<64x128xf16, #shared1> + %d = tt.dot %shm_a, %shm_b, %cst {allowTF32 = true} : tensor<256x64xf16, #shared> * tensor<64x128xf16, #shared1> -> tensor<256x128xf32, #mma> + %out = triton_gpu.convert_layout %d : (tensor<256x128xf32, #mma>) -> tensor<256x128xf32, #blocked2> + tt.store %arg2, %out {cache = 1 : i32, evict = 1 : i32} : tensor<256x128xf32, #blocked2> + } + tt.return + } +} diff --git a/unittest/Conversion/TritonGPUToLLVM/CMakeLists.txt b/unittest/Conversion/TritonGPUToLLVM/CMakeLists.txt index 172cd3bb898c..9806939ca990 100644 --- a/unittest/Conversion/TritonGPUToLLVM/CMakeLists.txt +++ b/unittest/Conversion/TritonGPUToLLVM/CMakeLists.txt @@ -3,3 +3,9 @@ add_triton_ut( SRCS PTXAsmFormatTest.cpp LIBS TritonGPUToLLVM ) + +add_triton_ut( + NAME TestEmitIndices + SRCS EmitIndicesTest.cpp DumpLayout.cpp + LIBS TritonGPUIR TritonNvidiaGPUIR ${dialect_libs} ${conversion_libs} +) diff --git a/unittest/Conversion/TritonGPUToLLVM/DumpLayout.cpp b/unittest/Conversion/TritonGPUToLLVM/DumpLayout.cpp new file mode 100644 index 000000000000..ce4c50f79fbe --- /dev/null +++ b/unittest/Conversion/TritonGPUToLLVM/DumpLayout.cpp @@ -0,0 +1,383 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "DumpLayout.h" + +#include "../../../lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h" + +namespace mlir { +namespace triton { +namespace gpu { + +namespace { + +//===----------------------------------------------------------------------===// +// IndexEmitter +//===----------------------------------------------------------------------===// + +class IndexEmitter { +public: + struct Cache { + llvm::DenseMap, + CacheKeyDenseMapInfo> + baseIndexCache; + llvm::DenseMap>, + CacheKeyDenseMapInfo> + indexCache; + OpBuilder::InsertPoint indexInsertPoint; + }; + + IndexEmitter(MLIRContext *context_) + : context(context_), option(context), typeConverter(context, option), + cacheInfo({&cache.baseIndexCache, &cache.indexCache, + &cache.indexInsertPoint}), + base(typeConverter, cacheInfo), rewriter(context), + loc(UnknownLoc::get(context)) { + rewriter.setInsertionPointToStart(&block); + cache.indexInsertPoint = rewriter.saveInsertionPoint(); + } + + llvm::SmallVector> + emitIndices(Attribute layout, llvm::ArrayRef shape, + bool withCTAOffset) { + auto type = RankedTensorType::get(shape, rewriter.getF16Type(), layout); + return base.emitIndices(loc, rewriter, layout, type, withCTAOffset); + } + + llvm::DenseMap + emitDistributedToShared(Attribute srcLayout, SharedEncodingAttr sharedLayout, + Type elemTy, llvm::ArrayRef shape, + bool withCTAOffset) { + auto srcTy = RankedTensorType::get(shape, elemTy, srcLayout); + SharedMemoryObject smemObj(getMockSmemBase(), shape, + sharedLayout.getOrder(), loc, rewriter); + return base.getSwizzledSharedPtrs(loc, /*inVec=*/1, srcTy, sharedLayout, + elemTy, smemObj, rewriter, + smemObj.offsets, smemObj.strides); + } + +private: + Value getMockSmemBase() { + Value mockSmemBase = base.getSRegValue(rewriter, loc, "%mock_smem_base"); + auto llPtrTy = LLVM::LLVMPointerType::get( + typeConverter.convertType(rewriter.getI8Type()), 3); + auto cast = rewriter.create( + loc, TypeRange{llPtrTy}, ValueRange{mockSmemBase}); + return cast.getResult(0); + } + + // Non-static members are initialized in declaration order + MLIRContext *context; + LowerToLLVMOptions option; + TritonGPUToLLVMTypeConverter typeConverter; + Cache cache; + ConvertTritonGPUOpToLLVMPatternBase::IndexCacheInfo cacheInfo; + ConvertTritonGPUOpToLLVMPatternBase base; + Block block; + ConversionPatternRewriter rewriter; + Location loc; +}; + +//===----------------------------------------------------------------------===// +// MLIR expression evaluation +//===----------------------------------------------------------------------===// + +int eval(Value value, int ctaid, int tid); + +int evalThreadIdOp(mlir::gpu::ThreadIdOp threadIdOp, int ctaid, int tid) { + auto dim = threadIdOp.getDimension(); + if (dim == mlir::gpu::Dimension::x) + return tid; + else if (dim == mlir::gpu::Dimension::y) + return 0; + else if (dim == mlir::gpu::Dimension::z) + return 0; + else + assert(0 && "Invalid thread dim"); + return 0; +} + +int evalInlineAsmOp(mlir::LLVM::InlineAsmOp asmOp, int ctaid, int tid) { + std::string asmStr = asmOp.getAsmString().str(); + if (asmStr.find("%cluster_ctaid.x") != std::string::npos) + return ctaid; + else if (asmStr.find("%cluster_ctaid.y") != std::string::npos) + return 0; + else if (asmStr.find("%cluster_ctaid.z") != std::string::npos) + return 0; + else if (asmStr.find("%cluster_nctaid.x") != std::string::npos) + assert(0 && "%cluster_nctaid.x not supported"); + else if (asmStr.find("%cluster_nctaid.y") != std::string::npos) + return 1; + else if (asmStr.find("%cluster_nctaid.z") != std::string::npos) + return 1; + else if (asmStr.find("%mock_smem_base") != std::string::npos) + return 0; + else + assert(0 && "Unrecognized ASM string"); + return 0; +} + +int evalGEPOp(mlir::LLVM::GEPOp gepOp, int ctaid, int tid) { + assert(gepOp.getNumOperands() == 2 && "Unrecognized format of GEPOp"); + int base = eval(gepOp.getBase(), ctaid, tid); + int offset = eval(gepOp.getOperand(1), ctaid, tid); + auto llPtrTy = gepOp.getRes().getType().cast(); + int bytesPerElem = llPtrTy.getElementType().getIntOrFloatBitWidth() / 8; + return base + offset * bytesPerElem; +} + +int eval(Value value, int ctaid, int tid) { + Operation *op = value.getDefiningOp(); + assert(op && "Unrecognized source value in the index expression"); + if (auto constantOp = llvm::dyn_cast(op)) { + auto attr = constantOp.getValue(); + return attr.cast().getInt(); + } else if (auto addOp = llvm::dyn_cast(op)) { + return eval(addOp.getLhs(), ctaid, tid) + eval(addOp.getRhs(), ctaid, tid); + } else if (auto mulOp = llvm::dyn_cast(op)) { + return eval(mulOp.getLhs(), ctaid, tid) * eval(mulOp.getRhs(), ctaid, tid); + } else if (auto udivOp = llvm::dyn_cast(op)) { + return eval(udivOp.getLhs(), ctaid, tid) / + eval(udivOp.getRhs(), ctaid, tid); + } else if (auto uremOp = llvm::dyn_cast(op)) { + return eval(uremOp.getLhs(), ctaid, tid) % + eval(uremOp.getRhs(), ctaid, tid); + } else if (auto xorOp = llvm::dyn_cast(op)) { + return eval(xorOp.getLhs(), ctaid, tid) ^ eval(xorOp.getRhs(), ctaid, tid); + } else if (auto trunciOp = llvm::dyn_cast(op)) { + return eval(trunciOp.getIn(), ctaid, tid); + } else if (auto castOp = llvm::dyn_cast(op)) { + return eval(castOp.getOperand(0), ctaid, tid); + } else if (auto threadOp = llvm::dyn_cast(op)) { + return evalThreadIdOp(threadOp, ctaid, tid); + } else if (auto asmOp = llvm::dyn_cast(op)) { + return evalInlineAsmOp(asmOp, ctaid, tid); + } else if (auto gepOp = llvm::dyn_cast(op)) { + return evalGEPOp(gepOp, ctaid, tid); + } else { + assert(0 && "Unrecognized op type in the index expression"); + return 0; + } +} + +} // namespace + +//===----------------------------------------------------------------------===// +// Dump Distributed Layout +//===----------------------------------------------------------------------===// + +std::string dumpDistributedLayout(Attribute layout, + llvm::ArrayRef shape, + bool multiCTA) { + assert(isaDistributedLayout(layout) && + "Unsupported layout type for dumpDistributedLayout"); + + assert(shape.size() > 0 && "Empty shape"); + assert(shape.size() <= 2 && + "High order tensor is not supported in dumpLayout"); + + int numThreads = 32 * getNumWarpsPerCTA(layout); + int numCTAs = getNumCTAs(layout); + auto f16Ty = FloatType::getF16(layout.getContext()); + int numElems = getTotalElemsPerThread(layout, shape, f16Ty); + + if (!multiCTA) + assert(numCTAs == 1 && "numCTAs must be 1 when multiCTA is false"); + + IndexEmitter emitter(layout.getContext()); + auto indices = emitter.emitIndices(layout, shape, multiCTA); + assert(indices.size() == numElems && "Incorrect number of indices emitted"); + + auto genStr = [multiCTA](int ctaid, int tid, int idx) -> std::string { + std::ostringstream oss; + if (multiCTA) + oss << "CTA" << ctaid << ":"; + oss << "T" << tid << ":" << idx; + return oss.str(); + }; + + std::ostringstream oss; + + auto dumpLayout1d = [&]() { + for (int idx = 0; idx < numElems; ++idx) + assert(indices[idx].size() == 1 && "Incorrect rank of indices emitted"); + + int size = shape[0]; + std::vector mapping(size); + + for (int ctaid = 0; ctaid < numCTAs; ++ctaid) { + for (int tid = 0; tid < numThreads; ++tid) { + for (int idx = 0; idx < numElems; ++idx) { + int i = eval(indices[idx][0], ctaid, tid); + assert(i >= 0 && i < size && "Invalid index emitted"); + std::string &value = mapping[i]; + if (value.empty()) + value = genStr(ctaid, tid, idx); + else + value = value + "|" + genStr(ctaid, tid, idx); + } + } + } + + for (int i = 0; i < size; ++i) { + if (i > 0) + oss << ","; + oss << mapping[i]; + } + oss << "\n"; + }; + + auto dumpLayout2d = [&]() { + for (int idx = 0; idx < numElems; ++idx) + assert(indices[idx].size() == 2 && "Incorrect rank of indices emitted"); + + int row = shape[0], col = shape[1]; + std::vector> mapping( + row, std::vector(col)); + + for (int ctaid = 0; ctaid < numCTAs; ++ctaid) { + for (int tid = 0; tid < numThreads; ++tid) { + for (int idx = 0; idx < numElems; ++idx) { + int r = eval(indices[idx][0], ctaid, tid); + int c = eval(indices[idx][1], ctaid, tid); + assert(r >= 0 && r < row && c >= 0 && c < col && + "Invalid index emitted"); + std::string &value = mapping[r][c]; + if (value.empty()) + value = genStr(ctaid, tid, idx); + else + value = value + "|" + genStr(ctaid, tid, idx); + } + } + } + + for (int r = 0; r < row; ++r) { + for (int c = 0; c < col; ++c) { + if (c > 0) + oss << ","; + oss << mapping[r][c]; + } + oss << "\n"; + } + }; + + if (shape.size() == 1) + dumpLayout1d(); + else + dumpLayout2d(); + + return oss.str(); +} + +//===----------------------------------------------------------------------===// +// Dump Shared Layout +//===----------------------------------------------------------------------===// + +std::string dumpSharedLayout(Attribute layout, llvm::ArrayRef shape, + Type elemTy, bool multiCTA) { + assert(shape.size() == 2 && "Only 2d shape supported in dumpSharedLayout"); + int row = shape[0], col = shape[1]; + int size = row * col; + int bytesPerElem = elemTy.getIntOrFloatBitWidth() / 8; + int totalBytes = size * bytesPerElem; + + int numWarps = 1; + int numThreads = 32 * numWarps; + int numCTAs = getNumCTAs(layout); + + if (!multiCTA) + assert(numCTAs == 1 && "numCTAs must be 1 when multiCTA is false"); + + auto sharedLayout = layout.cast(); + auto blockedLayout = BlockedEncodingAttr::get( + /*context=*/layout.getContext(), /*shape=*/shape, + /*sizePerThread=*/{1, 1}, /*order=*/sharedLayout.getOrder(), + /*numWarps=*/numWarps, 32, /*CTALayout=*/sharedLayout.getCTALayout()); + + int numElems = getTotalElemsPerThread(blockedLayout, shape, elemTy); + + IndexEmitter emitter(layout.getContext()); + auto blockedIndices = emitter.emitIndices(blockedLayout, shape, multiCTA); + auto sharedPtrs = emitter.emitDistributedToShared(blockedLayout, sharedLayout, + elemTy, shape, multiCTA); + + assert(blockedIndices.size() == numElems && + "Incorrect number of indices emitted by blockedLayout"); + assert(sharedPtrs.size() == numElems && + "Incorrect number of pointers emitted by sharedLayout"); + + for (int idx = 0; idx < numElems; ++idx) + assert(blockedIndices[idx].size() == 2 && + "Incorrect rank of indices emitted by blockedLayout"); + + auto genStr = [](int r, int c) -> std::string { + std::ostringstream oss; + oss << "(" << r << ":" << c << ")"; + return oss.str(); + }; + + std::vector mapping(size); + for (int ctaid = 0; ctaid < numCTAs; ++ctaid) { + for (int tid = 0; tid < numThreads; ++tid) { + for (int idx = 0; idx < numElems; ++idx) { + int r = eval(blockedIndices[idx][0], ctaid, tid); + int c = eval(blockedIndices[idx][1], ctaid, tid); + assert(r >= 0 && r < row && c >= 0 && c < col && + "Invalid index emitted"); + int ptr = eval(sharedPtrs[idx], ctaid, tid); + assert(ptr % bytesPerElem == 0 && ptr < totalBytes && + "Invalid pointer emitted"); + std::string &value = mapping[ptr / bytesPerElem]; + if (value.empty()) + value = genStr(r, c); + else + value = value + "|" + genStr(r, c); + } + } + } + + const int bytesPerBank = 4; + const int totalBanks = 32; + const int bytesPerLine = + std::min(col * bytesPerElem, bytesPerBank * totalBanks); + int elemsPerLine = bytesPerLine / bytesPerElem; + + std::ostringstream oss; + + for (int i = 0; i < size; ++i) { + int r = i / elemsPerLine; + int c = i % elemsPerLine; + if (c > 0) + oss << ","; + oss << mapping[i]; + if (c == elemsPerLine - 1) + oss << "\n"; + } + + return oss.str(); +} + +} // namespace gpu +} // namespace triton +} // namespace mlir diff --git a/unittest/Conversion/TritonGPUToLLVM/DumpLayout.h b/unittest/Conversion/TritonGPUToLLVM/DumpLayout.h new file mode 100644 index 000000000000..6e600f6ac779 --- /dev/null +++ b/unittest/Conversion/TritonGPUToLLVM/DumpLayout.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef TRITON_UNITTEST_CONVERSION_TRITONGPU_TO_LLVM_DUMP_LAYOUT_H +#define TRITON_UNITTEST_CONVERSION_TRITONGPU_TO_LLVM_DUMP_LAYOUT_H + +#include "triton/Dialect/TritonGPU/IR/Dialect.h" + +namespace mlir { +namespace triton { +namespace gpu { + +std::string dumpDistributedLayout(Attribute layout, + llvm::ArrayRef shape, bool multiCTA); + +std::string dumpSharedLayout(Attribute layout, llvm::ArrayRef shape, + Type elemTy, bool multiCTA); + +} // namespace gpu +} // namespace triton +} // namespace mlir + +#endif diff --git a/unittest/Conversion/TritonGPUToLLVM/EmitIndicesTest.cpp b/unittest/Conversion/TritonGPUToLLVM/EmitIndicesTest.cpp new file mode 100644 index 000000000000..90e6ef8c3d1d --- /dev/null +++ b/unittest/Conversion/TritonGPUToLLVM/EmitIndicesTest.cpp @@ -0,0 +1,677 @@ +/* + * Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mlir/Dialect/GPU/IR/GPUDialect.h" + +#include "DumpLayout.h" + +#include +#include + +namespace mlir { +namespace triton { +namespace gpu { + +//===----------------------------------------------------------------------===// +// EmitIndicesTest +//===----------------------------------------------------------------------===// + +class EmitIndicesTest : public ::testing::Test { +public: + void SetUp() { + context.getOrLoadDialect(); + context.getOrLoadDialect(); + context.getOrLoadDialect(); + } + +protected: + void runBlocked1dSingleCTA(int size, unsigned sizePerThread, + unsigned warpsPerCTA, const std::string &refStr) { + // If we pass initializer lists to the constructor of BlockedEncodingAttr, + // there might be multiple constructors matching the same parameter list. + // For example, the initializer list "order = {0}" can also match the + // parameter "unsigned numWarps", which is not what we want + llvm::SmallVector sizePerThread_ = {sizePerThread}; + llvm::SmallVector threadsPerWarp = {32}; + llvm::SmallVector warpsPerCTA_ = {warpsPerCTA}; + llvm::SmallVector order = {0}; + auto layout = + BlockedEncodingAttr::get(&context, sizePerThread_, threadsPerWarp, + warpsPerCTA_, order, getSingleCTALayout1d()); + runDistributed1d(size, layout, /*multiCTA=*/false, refStr); + } + + void runBlocked2dSingleCTA(int row, int col, + llvm::ArrayRef sizePerThread, + llvm::ArrayRef threadsPerWarp, + llvm::ArrayRef warpsPerCTA, + llvm::ArrayRef order, + const std::string &refStr) { + auto layout = + BlockedEncodingAttr::get(&context, sizePerThread, threadsPerWarp, + warpsPerCTA, order, getSingleCTALayout2d()); + runDistributed2d(row, col, layout, /*multiCTA=*/false, refStr); + } + + void runBlocked2dMultiCTA( + int row, int col, llvm::ArrayRef sizePerThread, + llvm::ArrayRef threadsPerWarp, + llvm::ArrayRef warpsPerCTA, llvm::ArrayRef order, + llvm::ArrayRef CTAsPerCGA, llvm::ArrayRef CTASplitNum, + llvm::ArrayRef CTAOrder, const std::string &refStr) { + auto CTALayout = + CTALayoutAttr::get(&context, CTAsPerCGA, CTASplitNum, CTAOrder); + auto layout = BlockedEncodingAttr::get( + &context, sizePerThread, threadsPerWarp, warpsPerCTA, order, CTALayout); + runDistributed2d(row, col, layout, /*multiCTA=*/true, refStr); + } + + void runSliceBlockedSingleCTA(int size, + llvm::ArrayRef sizePerThread, + llvm::ArrayRef threadsPerWarp, + llvm::ArrayRef warpsPerCTA, + llvm::ArrayRef order, + unsigned sliceDim, const std::string &refStr) { + auto parent = + BlockedEncodingAttr::get(&context, sizePerThread, threadsPerWarp, + warpsPerCTA, order, getSingleCTALayout2d()); + auto layout = SliceEncodingAttr::get(&context, sliceDim, parent); + runDistributed1d(size, layout, /*multiCTA=*/false, refStr); + } + + void runSliceBlockedMultiCTA(int size, llvm::ArrayRef sizePerThread, + llvm::ArrayRef threadsPerWarp, + llvm::ArrayRef warpsPerCTA, + llvm::ArrayRef order, + llvm::ArrayRef CTAsPerCGA, + llvm::ArrayRef CTASplitNum, + llvm::ArrayRef CTAOrder, + unsigned sliceDim, const std::string &refStr) { + auto CTALayout = + CTALayoutAttr::get(&context, CTAsPerCGA, CTASplitNum, CTAOrder); + auto parent = BlockedEncodingAttr::get( + &context, sizePerThread, threadsPerWarp, warpsPerCTA, order, CTALayout); + auto layout = SliceEncodingAttr::get(&context, sliceDim, parent); + runDistributed1d(size, layout, /*multiCTA=*/true, refStr); + } + + void runMmaSingleCTA(int row, int col, unsigned versionMajor, + unsigned versionMinor, + llvm::ArrayRef warpsPerCTA, + llvm::ArrayRef instrShape, + const std::string &refStr) { + auto layout = + MmaEncodingAttr::get(&context, versionMajor, versionMinor, warpsPerCTA, + getSingleCTALayout2d(), instrShape); + runDistributed2d(row, col, layout, /*multiCTA=*/false, refStr); + } + + void runDotOpSingleCTA(int row, int col, unsigned versionMajor, + unsigned versionMinor, + llvm::ArrayRef warpsPerCTA, + llvm::ArrayRef instrShape, unsigned opIdx, + const std::string &refStr) { + auto parent = + MmaEncodingAttr::get(&context, versionMajor, versionMinor, warpsPerCTA, + getSingleCTALayout2d(), instrShape); + auto layout = DotOperandEncodingAttr::get(&context, opIdx, parent, 0); + runDistributed2d(row, col, layout, /*multiCTA=*/false, refStr); + } + + void runSharedSingleCTA(int row, int col, bool rowMajor, + const std::string &elemTyStr, + const std::string &refStr) { + auto elemTy = getElemTy(elemTyStr); + auto layout = + SharedEncodingAttr::get(&context, {row, col}, getMatrixOrder(rowMajor), + getSingleCTALayout2d(), elemTy); + llvm::outs() << layout << "\n"; + runShared(row, col, layout, elemTy, /*multiCTA=*/false, refStr); + } + +private: + std::string skipSpaces(const std::string &input) { + std::string output; + for (char c : input) + if (c != ' ') + output += c; + return output; + } + + void assertSameStr(const std::string &refStr, const std::string &output) { + if (refStr != output) { + llvm::outs() << "RefStr =\n" + << refStr << "\n" + << "\n" + << "Output =\n" + << output << "\n"; + FAIL() << "Incorrect output string"; + } + } + + void runDistributed1d(int size, Attribute layout, bool multiCTA, + const std::string &refStr) { + assertSameStr(skipSpaces(refStr), + dumpDistributedLayout(layout, {size}, multiCTA)); + } + + void runDistributed2d(int row, int col, Attribute layout, bool multiCTA, + const std::string &refStr) { + assertSameStr(skipSpaces(refStr), + dumpDistributedLayout(layout, {row, col}, multiCTA)); + } + + void runShared(int row, int col, const SharedEncodingAttr &layout, + Type elemTy, bool multiCTA, const std::string &refStr) { + assertSameStr(skipSpaces(refStr), + dumpSharedLayout(layout, {row, col}, elemTy, multiCTA)); + } + + CTALayoutAttr getSingleCTALayout1d() { + return CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{1}, + /*CTASplitNum=*/{1}, /*CTAOrder=*/{0}); + } + + CTALayoutAttr getSingleCTALayout2d() { + return CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{1, 1}, + /*CTASplitNum=*/{1, 1}, /*CTAOrder=*/{1, 0}); + } + + llvm::SmallVector getMatrixOrder(bool rowMajor) { + if (rowMajor) + return {1, 0}; + else + return {0, 1}; + } + + Type getElemTy(const std::string &elemTyStr) { + if (elemTyStr == "F16") + return FloatType::getF16(&context); + else + assert(0 && "getElemTy not implemented"); + } + +protected: + MLIRContext context; +}; + +//===----------------------------------------------------------------------===// +// Tests for BlockedEncodingAttr +//===----------------------------------------------------------------------===// + +TEST_F(EmitIndicesTest, BlockedLayout_SingleCTA_1D) { + // clang-format off + std::string refStr = + "T0:0,T1:0,T2:0,T3:0,T4:0,T5:0,T6:0,T7:0,T8:0,T9:0,T10:0,T11:0,T12:0,T13:0,T14:0,T15:0,T16:0,T17:0,T18:0,T19:0,T20:0,T21:0,T22:0,T23:0,T24:0,T25:0,T26:0,T27:0,T28:0,T29:0,T30:0,T31:0\n"; + // clang-format on + + runBlocked1dSingleCTA(/*size=*/32, /*sizePerThread*/ 1, /*warpsPerCTA*/ 1, + /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_SingleCTA_Order_1_0) { + // clang-format off + std::string refStr = + " T0:0, T1:0, T2:0, T3:0, T32:0, T33:0, T34:0, T35:0\n" + " T4:0, T5:0, T6:0, T7:0, T36:0, T37:0, T38:0, T39:0\n" + " T8:0, T9:0,T10:0,T11:0, T40:0, T41:0, T42:0, T43:0\n" + "T12:0,T13:0,T14:0,T15:0, T44:0, T45:0, T46:0, T47:0\n" + "T16:0,T17:0,T18:0,T19:0, T48:0, T49:0, T50:0, T51:0\n" + "T20:0,T21:0,T22:0,T23:0, T52:0, T53:0, T54:0, T55:0\n" + "T24:0,T25:0,T26:0,T27:0, T56:0, T57:0, T58:0, T59:0\n" + "T28:0,T29:0,T30:0,T31:0, T60:0, T61:0, T62:0, T63:0\n" + + "T64:0,T65:0,T66:0,T67:0, T96:0, T97:0, T98:0, T99:0\n" + "T68:0,T69:0,T70:0,T71:0, T100:0,T101:0,T102:0,T103:0\n" + "T72:0,T73:0,T74:0,T75:0, T104:0,T105:0,T106:0,T107:0\n" + "T76:0,T77:0,T78:0,T79:0, T108:0,T109:0,T110:0,T111:0\n" + "T80:0,T81:0,T82:0,T83:0, T112:0,T113:0,T114:0,T115:0\n" + "T84:0,T85:0,T86:0,T87:0, T116:0,T117:0,T118:0,T119:0\n" + "T88:0,T89:0,T90:0,T91:0, T120:0,T121:0,T122:0,T123:0\n" + "T92:0,T93:0,T94:0,T95:0, T124:0,T125:0,T126:0,T127:0\n"; + // clang-format on + + runBlocked2dSingleCTA(/*row=*/16, /*col=*/8, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{2, 2}, + /*order=*/{1, 0}, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_SingleCTA_Order_0_1) { + // clang-format off + std::string refStr = + " T0:0, T8:0,T16:0,T24:0, T64:0, T72:0, T80:0, T88:0\n" + " T1:0, T9:0,T17:0,T25:0, T65:0, T73:0, T81:0, T89:0\n" + " T2:0,T10:0,T18:0,T26:0, T66:0, T74:0, T82:0, T90:0\n" + " T3:0,T11:0,T19:0,T27:0, T67:0, T75:0, T83:0, T91:0\n" + " T4:0,T12:0,T20:0,T28:0, T68:0, T76:0, T84:0, T92:0\n" + " T5:0,T13:0,T21:0,T29:0, T69:0, T77:0, T85:0, T93:0\n" + " T6:0,T14:0,T22:0,T30:0, T70:0, T78:0, T86:0, T94:0\n" + " T7:0,T15:0,T23:0,T31:0, T71:0, T79:0, T87:0, T95:0\n" + + "T32:0,T40:0,T48:0,T56:0, T96:0,T104:0,T112:0,T120:0\n" + "T33:0,T41:0,T49:0,T57:0, T97:0,T105:0,T113:0,T121:0\n" + "T34:0,T42:0,T50:0,T58:0, T98:0,T106:0,T114:0,T122:0\n" + "T35:0,T43:0,T51:0,T59:0, T99:0,T107:0,T115:0,T123:0\n" + "T36:0,T44:0,T52:0,T60:0, T100:0,T108:0,T116:0,T124:0\n" + "T37:0,T45:0,T53:0,T61:0, T101:0,T109:0,T117:0,T125:0\n" + "T38:0,T46:0,T54:0,T62:0, T102:0,T110:0,T118:0,T126:0\n" + "T39:0,T47:0,T55:0,T63:0, T103:0,T111:0,T119:0,T127:0\n"; + // clang-format on + + runBlocked2dSingleCTA(/*row=*/16, /*col=*/8, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{2, 2}, + /*order=*/{0, 1}, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_SingleCTA_Vectorize) { + // clang-format off + std::string refStr = + " T0:0, T0:1, T0:2, T0:3, T1:0, T1:1, T1:2, T1:3, T2:0, T2:1, T2:2, T2:3, T3:0, T3:1, T3:2, T3:3\n" + " T4:0, T4:1, T4:2, T4:3, T5:0, T5:1, T5:2, T5:3, T6:0, T6:1, T6:2, T6:3, T7:0, T7:1, T7:2, T7:3\n" + " T8:0, T8:1, T8:2, T8:3, T9:0, T9:1, T9:2, T9:3, T10:0,T10:1,T10:2,T10:3, T11:0,T11:1,T11:2,T11:3\n" + "T12:0,T12:1,T12:2,T12:3, T13:0,T13:1,T13:2,T13:3, T14:0,T14:1,T14:2,T14:3, T15:0,T15:1,T15:2,T15:3\n" + "T16:0,T16:1,T16:2,T16:3, T17:0,T17:1,T17:2,T17:3, T18:0,T18:1,T18:2,T18:3, T19:0,T19:1,T19:2,T19:3\n" + "T20:0,T20:1,T20:2,T20:3, T21:0,T21:1,T21:2,T21:3, T22:0,T22:1,T22:2,T22:3, T23:0,T23:1,T23:2,T23:3\n" + "T24:0,T24:1,T24:2,T24:3, T25:0,T25:1,T25:2,T25:3, T26:0,T26:1,T26:2,T26:3, T27:0,T27:1,T27:2,T27:3\n" + "T28:0,T28:1,T28:2,T28:3, T29:0,T29:1,T29:2,T29:3, T30:0,T30:1,T30:2,T30:3, T31:0,T31:1,T31:2,T31:3\n" + + "T32:0,T32:1,T32:2,T32:3, T33:0,T33:1,T33:2,T33:3, T34:0,T34:1,T34:2,T34:3, T35:0,T35:1,T35:2,T35:3\n" + "T36:0,T36:1,T36:2,T36:3, T37:0,T37:1,T37:2,T37:3, T38:0,T38:1,T38:2,T38:3, T39:0,T39:1,T39:2,T39:3\n" + "T40:0,T40:1,T40:2,T40:3, T41:0,T41:1,T41:2,T41:3, T42:0,T42:1,T42:2,T42:3, T43:0,T43:1,T43:2,T43:3\n" + "T44:0,T44:1,T44:2,T44:3, T45:0,T45:1,T45:2,T45:3, T46:0,T46:1,T46:2,T46:3, T47:0,T47:1,T47:2,T47:3\n" + "T48:0,T48:1,T48:2,T48:3, T49:0,T49:1,T49:2,T49:3, T50:0,T50:1,T50:2,T50:3, T51:0,T51:1,T51:2,T51:3\n" + "T52:0,T52:1,T52:2,T52:3, T53:0,T53:1,T53:2,T53:3, T54:0,T54:1,T54:2,T54:3, T55:0,T55:1,T55:2,T55:3\n" + "T56:0,T56:1,T56:2,T56:3, T57:0,T57:1,T57:2,T57:3, T58:0,T58:1,T58:2,T58:3, T59:0,T59:1,T59:2,T59:3\n" + "T60:0,T60:1,T60:2,T60:3, T61:0,T61:1,T61:2,T61:3, T62:0,T62:1,T62:2,T62:3, T63:0,T63:1,T63:2,T63:3\n"; + // clang-format on + + runBlocked2dSingleCTA(/*row=*/16, /*col=*/16, /*sizePerThread=*/{1, 4}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{2, 1}, + /*order=*/{1, 0}, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAOrder_1_0) { + // clang-format off + std::string refStr = + "CTA0: T0:0,CTA0: T1:0,CTA0: T2:0,CTA0: T3:0, CTA1: T0:0,CTA1: T1:0,CTA1: T2:0,CTA1: T3:0\n" + "CTA0: T4:0,CTA0: T5:0,CTA0: T6:0,CTA0: T7:0, CTA1: T4:0,CTA1: T5:0,CTA1: T6:0,CTA1: T7:0\n" + "CTA0: T8:0,CTA0: T9:0,CTA0:T10:0,CTA0:T11:0, CTA1: T8:0,CTA1: T9:0,CTA1:T10:0,CTA1:T11:0\n" + "CTA0:T12:0,CTA0:T13:0,CTA0:T14:0,CTA0:T15:0, CTA1:T12:0,CTA1:T13:0,CTA1:T14:0,CTA1:T15:0\n" + "CTA0:T16:0,CTA0:T17:0,CTA0:T18:0,CTA0:T19:0, CTA1:T16:0,CTA1:T17:0,CTA1:T18:0,CTA1:T19:0\n" + "CTA0:T20:0,CTA0:T21:0,CTA0:T22:0,CTA0:T23:0, CTA1:T20:0,CTA1:T21:0,CTA1:T22:0,CTA1:T23:0\n" + "CTA0:T24:0,CTA0:T25:0,CTA0:T26:0,CTA0:T27:0, CTA1:T24:0,CTA1:T25:0,CTA1:T26:0,CTA1:T27:0\n" + "CTA0:T28:0,CTA0:T29:0,CTA0:T30:0,CTA0:T31:0, CTA1:T28:0,CTA1:T29:0,CTA1:T30:0,CTA1:T31:0\n" + + "CTA2: T0:0,CTA2: T1:0,CTA2: T2:0,CTA2: T3:0, CTA3: T0:0,CTA3: T1:0,CTA3: T2:0,CTA3: T3:0\n" + "CTA2: T4:0,CTA2: T5:0,CTA2: T6:0,CTA2: T7:0, CTA3: T4:0,CTA3: T5:0,CTA3: T6:0,CTA3: T7:0\n" + "CTA2: T8:0,CTA2: T9:0,CTA2:T10:0,CTA2:T11:0, CTA3: T8:0,CTA3: T9:0,CTA3:T10:0,CTA3:T11:0\n" + "CTA2:T12:0,CTA2:T13:0,CTA2:T14:0,CTA2:T15:0, CTA3:T12:0,CTA3:T13:0,CTA3:T14:0,CTA3:T15:0\n" + "CTA2:T16:0,CTA2:T17:0,CTA2:T18:0,CTA2:T19:0, CTA3:T16:0,CTA3:T17:0,CTA3:T18:0,CTA3:T19:0\n" + "CTA2:T20:0,CTA2:T21:0,CTA2:T22:0,CTA2:T23:0, CTA3:T20:0,CTA3:T21:0,CTA3:T22:0,CTA3:T23:0\n" + "CTA2:T24:0,CTA2:T25:0,CTA2:T26:0,CTA2:T27:0, CTA3:T24:0,CTA3:T25:0,CTA3:T26:0,CTA3:T27:0\n" + "CTA2:T28:0,CTA2:T29:0,CTA2:T30:0,CTA2:T31:0, CTA3:T28:0,CTA3:T29:0,CTA3:T30:0,CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA(/*row=*/16, /*col=*/8, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{1, 0}, + /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAOrder_0_1) { + // clang-format off + std::string refStr = + "CTA0: T0:0,CTA0: T1:0,CTA0: T2:0,CTA0: T3:0, CTA2: T0:0,CTA2: T1:0,CTA2: T2:0,CTA2: T3:0\n" + "CTA0: T4:0,CTA0: T5:0,CTA0: T6:0,CTA0: T7:0, CTA2: T4:0,CTA2: T5:0,CTA2: T6:0,CTA2: T7:0\n" + "CTA0: T8:0,CTA0: T9:0,CTA0:T10:0,CTA0:T11:0, CTA2: T8:0,CTA2: T9:0,CTA2:T10:0,CTA2:T11:0\n" + "CTA0:T12:0,CTA0:T13:0,CTA0:T14:0,CTA0:T15:0, CTA2:T12:0,CTA2:T13:0,CTA2:T14:0,CTA2:T15:0\n" + "CTA0:T16:0,CTA0:T17:0,CTA0:T18:0,CTA0:T19:0, CTA2:T16:0,CTA2:T17:0,CTA2:T18:0,CTA2:T19:0\n" + "CTA0:T20:0,CTA0:T21:0,CTA0:T22:0,CTA0:T23:0, CTA2:T20:0,CTA2:T21:0,CTA2:T22:0,CTA2:T23:0\n" + "CTA0:T24:0,CTA0:T25:0,CTA0:T26:0,CTA0:T27:0, CTA2:T24:0,CTA2:T25:0,CTA2:T26:0,CTA2:T27:0\n" + "CTA0:T28:0,CTA0:T29:0,CTA0:T30:0,CTA0:T31:0, CTA2:T28:0,CTA2:T29:0,CTA2:T30:0,CTA2:T31:0\n" + + "CTA1: T0:0,CTA1: T1:0,CTA1: T2:0,CTA1: T3:0, CTA3: T0:0,CTA3: T1:0,CTA3: T2:0,CTA3: T3:0\n" + "CTA1: T4:0,CTA1: T5:0,CTA1: T6:0,CTA1: T7:0, CTA3: T4:0,CTA3: T5:0,CTA3: T6:0,CTA3: T7:0\n" + "CTA1: T8:0,CTA1: T9:0,CTA1:T10:0,CTA1:T11:0, CTA3: T8:0,CTA3: T9:0,CTA3:T10:0,CTA3:T11:0\n" + "CTA1:T12:0,CTA1:T13:0,CTA1:T14:0,CTA1:T15:0, CTA3:T12:0,CTA3:T13:0,CTA3:T14:0,CTA3:T15:0\n" + "CTA1:T16:0,CTA1:T17:0,CTA1:T18:0,CTA1:T19:0, CTA3:T16:0,CTA3:T17:0,CTA3:T18:0,CTA3:T19:0\n" + "CTA1:T20:0,CTA1:T21:0,CTA1:T22:0,CTA1:T23:0, CTA3:T20:0,CTA3:T21:0,CTA3:T22:0,CTA3:T23:0\n" + "CTA1:T24:0,CTA1:T25:0,CTA1:T26:0,CTA1:T27:0, CTA3:T24:0,CTA3:T25:0,CTA3:T26:0,CTA3:T27:0\n" + "CTA1:T28:0,CTA1:T29:0,CTA1:T30:0,CTA1:T31:0, CTA3:T28:0,CTA3:T29:0,CTA3:T30:0,CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA(/*row=*/16, /*col=*/8, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{0, 1}, + /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAWrap_Dim1) { + // clang-format off + std::string refStr = + "CTA0: T0:0|CTA1: T0:0, CTA0: T1:0|CTA1: T1:0, CTA0: T2:0|CTA1: T2:0, CTA0: T3:0|CTA1: T3:0\n" + "CTA0: T4:0|CTA1: T4:0, CTA0: T5:0|CTA1: T5:0, CTA0: T6:0|CTA1: T6:0, CTA0: T7:0|CTA1: T7:0\n" + "CTA0: T8:0|CTA1: T8:0, CTA0: T9:0|CTA1: T9:0, CTA0:T10:0|CTA1:T10:0, CTA0:T11:0|CTA1:T11:0\n" + "CTA0:T12:0|CTA1:T12:0, CTA0:T13:0|CTA1:T13:0, CTA0:T14:0|CTA1:T14:0, CTA0:T15:0|CTA1:T15:0\n" + "CTA0:T16:0|CTA1:T16:0, CTA0:T17:0|CTA1:T17:0, CTA0:T18:0|CTA1:T18:0, CTA0:T19:0|CTA1:T19:0\n" + "CTA0:T20:0|CTA1:T20:0, CTA0:T21:0|CTA1:T21:0, CTA0:T22:0|CTA1:T22:0, CTA0:T23:0|CTA1:T23:0\n" + "CTA0:T24:0|CTA1:T24:0, CTA0:T25:0|CTA1:T25:0, CTA0:T26:0|CTA1:T26:0, CTA0:T27:0|CTA1:T27:0\n" + "CTA0:T28:0|CTA1:T28:0, CTA0:T29:0|CTA1:T29:0, CTA0:T30:0|CTA1:T30:0, CTA0:T31:0|CTA1:T31:0\n" + + "CTA2: T0:0|CTA3: T0:0, CTA2: T1:0|CTA3: T1:0, CTA2: T2:0|CTA3: T2:0, CTA2: T3:0|CTA3: T3:0\n" + "CTA2: T4:0|CTA3: T4:0, CTA2: T5:0|CTA3: T5:0, CTA2: T6:0|CTA3: T6:0, CTA2: T7:0|CTA3: T7:0\n" + "CTA2: T8:0|CTA3: T8:0, CTA2: T9:0|CTA3: T9:0, CTA2:T10:0|CTA3:T10:0, CTA2:T11:0|CTA3:T11:0\n" + "CTA2:T12:0|CTA3:T12:0, CTA2:T13:0|CTA3:T13:0, CTA2:T14:0|CTA3:T14:0, CTA2:T15:0|CTA3:T15:0\n" + "CTA2:T16:0|CTA3:T16:0, CTA2:T17:0|CTA3:T17:0, CTA2:T18:0|CTA3:T18:0, CTA2:T19:0|CTA3:T19:0\n" + "CTA2:T20:0|CTA3:T20:0, CTA2:T21:0|CTA3:T21:0, CTA2:T22:0|CTA3:T22:0, CTA2:T23:0|CTA3:T23:0\n" + "CTA2:T24:0|CTA3:T24:0, CTA2:T25:0|CTA3:T25:0, CTA2:T26:0|CTA3:T26:0, CTA2:T27:0|CTA3:T27:0\n" + "CTA2:T28:0|CTA3:T28:0, CTA2:T29:0|CTA3:T29:0, CTA2:T30:0|CTA3:T30:0, CTA2:T31:0|CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA(/*row=*/16, /*col=*/4, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 1}, /*CTAOrder=*/{1, 0}, + /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAWrap_Dim0) { + // clang-format off + std::string refStr = + "CTA0: T0:0|CTA2: T0:0,CTA0: T1:0|CTA2: T1:0,CTA0: T2:0|CTA2: T2:0,CTA0: T3:0|CTA2: T3:0, CTA1: T0:0|CTA3: T0:0,CTA1: T1:0|CTA3: T1:0,CTA1: T2:0|CTA3: T2:0,CTA1: T3:0|CTA3: T3:0\n" + "CTA0: T4:0|CTA2: T4:0,CTA0: T5:0|CTA2: T5:0,CTA0: T6:0|CTA2: T6:0,CTA0: T7:0|CTA2: T7:0, CTA1: T4:0|CTA3: T4:0,CTA1: T5:0|CTA3: T5:0,CTA1: T6:0|CTA3: T6:0,CTA1: T7:0|CTA3: T7:0\n" + "CTA0: T8:0|CTA2: T8:0,CTA0: T9:0|CTA2: T9:0,CTA0:T10:0|CTA2:T10:0,CTA0:T11:0|CTA2:T11:0, CTA1: T8:0|CTA3: T8:0,CTA1: T9:0|CTA3: T9:0,CTA1:T10:0|CTA3:T10:0,CTA1:T11:0|CTA3:T11:0\n" + "CTA0:T12:0|CTA2:T12:0,CTA0:T13:0|CTA2:T13:0,CTA0:T14:0|CTA2:T14:0,CTA0:T15:0|CTA2:T15:0, CTA1:T12:0|CTA3:T12:0,CTA1:T13:0|CTA3:T13:0,CTA1:T14:0|CTA3:T14:0,CTA1:T15:0|CTA3:T15:0\n" + "CTA0:T16:0|CTA2:T16:0,CTA0:T17:0|CTA2:T17:0,CTA0:T18:0|CTA2:T18:0,CTA0:T19:0|CTA2:T19:0, CTA1:T16:0|CTA3:T16:0,CTA1:T17:0|CTA3:T17:0,CTA1:T18:0|CTA3:T18:0,CTA1:T19:0|CTA3:T19:0\n" + "CTA0:T20:0|CTA2:T20:0,CTA0:T21:0|CTA2:T21:0,CTA0:T22:0|CTA2:T22:0,CTA0:T23:0|CTA2:T23:0, CTA1:T20:0|CTA3:T20:0,CTA1:T21:0|CTA3:T21:0,CTA1:T22:0|CTA3:T22:0,CTA1:T23:0|CTA3:T23:0\n" + "CTA0:T24:0|CTA2:T24:0,CTA0:T25:0|CTA2:T25:0,CTA0:T26:0|CTA2:T26:0,CTA0:T27:0|CTA2:T27:0, CTA1:T24:0|CTA3:T24:0,CTA1:T25:0|CTA3:T25:0,CTA1:T26:0|CTA3:T26:0,CTA1:T27:0|CTA3:T27:0\n" + "CTA0:T28:0|CTA2:T28:0,CTA0:T29:0|CTA2:T29:0,CTA0:T30:0|CTA2:T30:0,CTA0:T31:0|CTA2:T31:0, CTA1:T28:0|CTA3:T28:0,CTA1:T29:0|CTA3:T29:0,CTA1:T30:0|CTA3:T30:0,CTA1:T31:0|CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA( + /*row=*/8, /*col=*/8, /*sizePerThread=*/{1, 1}, /*threadsPerWarp=*/{8, 4}, + /*warpsPerCTA=*/{1, 1}, /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{1, 2}, /*CTAOrder=*/{1, 0}, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAWrapBeforeBroadcast_Dim1) { + // clang-format off + std::string refStr = + "CTA0: T0:0|CTA0: T1:0|CTA0: T2:0|CTA0: T3:0 | CTA1: T0:0|CTA1: T1:0|CTA1: T2:0|CTA1: T3:0\n" + "CTA0: T4:0|CTA0: T5:0|CTA0: T6:0|CTA0: T7:0 | CTA1: T4:0|CTA1: T5:0|CTA1: T6:0|CTA1: T7:0\n" + "CTA0: T8:0|CTA0: T9:0|CTA0:T10:0|CTA0:T11:0 | CTA1: T8:0|CTA1: T9:0|CTA1:T10:0|CTA1:T11:0\n" + "CTA0:T12:0|CTA0:T13:0|CTA0:T14:0|CTA0:T15:0 | CTA1:T12:0|CTA1:T13:0|CTA1:T14:0|CTA1:T15:0\n" + "CTA0:T16:0|CTA0:T17:0|CTA0:T18:0|CTA0:T19:0 | CTA1:T16:0|CTA1:T17:0|CTA1:T18:0|CTA1:T19:0\n" + "CTA0:T20:0|CTA0:T21:0|CTA0:T22:0|CTA0:T23:0 | CTA1:T20:0|CTA1:T21:0|CTA1:T22:0|CTA1:T23:0\n" + "CTA0:T24:0|CTA0:T25:0|CTA0:T26:0|CTA0:T27:0 | CTA1:T24:0|CTA1:T25:0|CTA1:T26:0|CTA1:T27:0\n" + "CTA0:T28:0|CTA0:T29:0|CTA0:T30:0|CTA0:T31:0 | CTA1:T28:0|CTA1:T29:0|CTA1:T30:0|CTA1:T31:0\n" + + "CTA2: T0:0|CTA2: T1:0|CTA2: T2:0|CTA2: T3:0 | CTA3: T0:0|CTA3: T1:0|CTA3: T2:0|CTA3: T3:0\n" + "CTA2: T4:0|CTA2: T5:0|CTA2: T6:0|CTA2: T7:0 | CTA3: T4:0|CTA3: T5:0|CTA3: T6:0|CTA3: T7:0\n" + "CTA2: T8:0|CTA2: T9:0|CTA2:T10:0|CTA2:T11:0 | CTA3: T8:0|CTA3: T9:0|CTA3:T10:0|CTA3:T11:0\n" + "CTA2:T12:0|CTA2:T13:0|CTA2:T14:0|CTA2:T15:0 | CTA3:T12:0|CTA3:T13:0|CTA3:T14:0|CTA3:T15:0\n" + "CTA2:T16:0|CTA2:T17:0|CTA2:T18:0|CTA2:T19:0 | CTA3:T16:0|CTA3:T17:0|CTA3:T18:0|CTA3:T19:0\n" + "CTA2:T20:0|CTA2:T21:0|CTA2:T22:0|CTA2:T23:0 | CTA3:T20:0|CTA3:T21:0|CTA3:T22:0|CTA3:T23:0\n" + "CTA2:T24:0|CTA2:T25:0|CTA2:T26:0|CTA2:T27:0 | CTA3:T24:0|CTA3:T25:0|CTA3:T26:0|CTA3:T27:0\n" + "CTA2:T28:0|CTA2:T29:0|CTA2:T30:0|CTA2:T31:0 | CTA3:T28:0|CTA3:T29:0|CTA3:T30:0|CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA(/*row=*/16, /*col=*/1, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{1, 0}, + /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, BlockedLayout_MultiCTA_CTAWrapBeforeBroadcast_Dim0) { + // clang-format off + std::string refStr = + "CTA0:T0:0|CTA0: T8:0|CTA0:T16:0|CTA0:T24:0 | CTA2:T0:0|CTA2: T8:0|CTA2:T16:0|CTA2:T24:0," + "CTA0:T1:0|CTA0: T9:0|CTA0:T17:0|CTA0:T25:0 | CTA2:T1:0|CTA2: T9:0|CTA2:T17:0|CTA2:T25:0," + "CTA0:T2:0|CTA0:T10:0|CTA0:T18:0|CTA0:T26:0 | CTA2:T2:0|CTA2:T10:0|CTA2:T18:0|CTA2:T26:0," + "CTA0:T3:0|CTA0:T11:0|CTA0:T19:0|CTA0:T27:0 | CTA2:T3:0|CTA2:T11:0|CTA2:T19:0|CTA2:T27:0," + "CTA0:T4:0|CTA0:T12:0|CTA0:T20:0|CTA0:T28:0 | CTA2:T4:0|CTA2:T12:0|CTA2:T20:0|CTA2:T28:0," + "CTA0:T5:0|CTA0:T13:0|CTA0:T21:0|CTA0:T29:0 | CTA2:T5:0|CTA2:T13:0|CTA2:T21:0|CTA2:T29:0," + "CTA0:T6:0|CTA0:T14:0|CTA0:T22:0|CTA0:T30:0 | CTA2:T6:0|CTA2:T14:0|CTA2:T22:0|CTA2:T30:0," + "CTA0:T7:0|CTA0:T15:0|CTA0:T23:0|CTA0:T31:0 | CTA2:T7:0|CTA2:T15:0|CTA2:T23:0|CTA2:T31:0," + + "CTA1:T0:0|CTA1: T8:0|CTA1:T16:0|CTA1:T24:0 | CTA3:T0:0|CTA3: T8:0|CTA3:T16:0|CTA3:T24:0," + "CTA1:T1:0|CTA1: T9:0|CTA1:T17:0|CTA1:T25:0 | CTA3:T1:0|CTA3: T9:0|CTA3:T17:0|CTA3:T25:0," + "CTA1:T2:0|CTA1:T10:0|CTA1:T18:0|CTA1:T26:0 | CTA3:T2:0|CTA3:T10:0|CTA3:T18:0|CTA3:T26:0," + "CTA1:T3:0|CTA1:T11:0|CTA1:T19:0|CTA1:T27:0 | CTA3:T3:0|CTA3:T11:0|CTA3:T19:0|CTA3:T27:0," + "CTA1:T4:0|CTA1:T12:0|CTA1:T20:0|CTA1:T28:0 | CTA3:T4:0|CTA3:T12:0|CTA3:T20:0|CTA3:T28:0," + "CTA1:T5:0|CTA1:T13:0|CTA1:T21:0|CTA1:T29:0 | CTA3:T5:0|CTA3:T13:0|CTA3:T21:0|CTA3:T29:0," + "CTA1:T6:0|CTA1:T14:0|CTA1:T22:0|CTA1:T30:0 | CTA3:T6:0|CTA3:T14:0|CTA3:T22:0|CTA3:T30:0," + "CTA1:T7:0|CTA1:T15:0|CTA1:T23:0|CTA1:T31:0 | CTA3:T7:0|CTA3:T15:0|CTA3:T23:0|CTA3:T31:0\n"; + // clang-format on + + runBlocked2dMultiCTA(/*row=*/1, /*col=*/16, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{4, 8}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{1, 0}, + /*refStr=*/refStr); +} + +//===----------------------------------------------------------------------===// +// Tests for SliceEncodingAttr +//===----------------------------------------------------------------------===// + +TEST_F(EmitIndicesTest, SliceLayout_SingleCTA_SliceDim1) { + // clang-format off + std::string refStr = + " T0:0| T1:0| T2:0| T3:0| T4:0| T5:0| T6:0| T7:0," + " T8:0| T9:0|T10:0|T11:0|T12:0|T13:0|T14:0|T15:0," + "T16:0|T17:0|T18:0|T19:0|T20:0|T21:0|T22:0|T23:0," + "T24:0|T25:0|T26:0|T27:0|T28:0|T29:0|T30:0|T31:0\n"; + // clang-format on + + runSliceBlockedSingleCTA(/*size=*/4, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{4, 8}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*sliceDim=*/1, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, SliceLayout_SingleCTA_SliceDim0) { + // clang-format off + std::string refStr = + "T0:0| T8:0|T16:0|T24:0," + "T1:0| T9:0|T17:0|T25:0," + "T2:0|T10:0|T18:0|T26:0," + "T3:0|T11:0|T19:0|T27:0," + "T4:0|T12:0|T20:0|T28:0," + "T5:0|T13:0|T21:0|T29:0," + "T6:0|T14:0|T22:0|T30:0," + "T7:0|T15:0|T23:0|T31:0\n"; + // clang-format on + + runSliceBlockedSingleCTA(/*size=*/8, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{4, 8}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*sliceDim=*/0, /*refStr=*/refStr); +} + +TEST_F(EmitIndicesTest, SliceLayout_MultiCTA) { + // clang-format off + std::string refStr = + "CTA0: T0:0|CTA0: T1:0|CTA0: T2:0|CTA0: T3:0 | CTA1: T0:0|CTA1: T1:0|CTA1: T2:0|CTA1: T3:0," + "CTA0: T4:0|CTA0: T5:0|CTA0: T6:0|CTA0: T7:0 | CTA1: T4:0|CTA1: T5:0|CTA1: T6:0|CTA1: T7:0," + "CTA0: T8:0|CTA0: T9:0|CTA0:T10:0|CTA0:T11:0 | CTA1: T8:0|CTA1: T9:0|CTA1:T10:0|CTA1:T11:0," + "CTA0:T12:0|CTA0:T13:0|CTA0:T14:0|CTA0:T15:0 | CTA1:T12:0|CTA1:T13:0|CTA1:T14:0|CTA1:T15:0," + "CTA0:T16:0|CTA0:T17:0|CTA0:T18:0|CTA0:T19:0 | CTA1:T16:0|CTA1:T17:0|CTA1:T18:0|CTA1:T19:0," + "CTA0:T20:0|CTA0:T21:0|CTA0:T22:0|CTA0:T23:0 | CTA1:T20:0|CTA1:T21:0|CTA1:T22:0|CTA1:T23:0," + "CTA0:T24:0|CTA0:T25:0|CTA0:T26:0|CTA0:T27:0 | CTA1:T24:0|CTA1:T25:0|CTA1:T26:0|CTA1:T27:0," + "CTA0:T28:0|CTA0:T29:0|CTA0:T30:0|CTA0:T31:0 | CTA1:T28:0|CTA1:T29:0|CTA1:T30:0|CTA1:T31:0," + + "CTA2: T0:0|CTA2: T1:0|CTA2: T2:0|CTA2: T3:0 | CTA3: T0:0|CTA3: T1:0|CTA3: T2:0|CTA3: T3:0," + "CTA2: T4:0|CTA2: T5:0|CTA2: T6:0|CTA2: T7:0 | CTA3: T4:0|CTA3: T5:0|CTA3: T6:0|CTA3: T7:0," + "CTA2: T8:0|CTA2: T9:0|CTA2:T10:0|CTA2:T11:0 | CTA3: T8:0|CTA3: T9:0|CTA3:T10:0|CTA3:T11:0," + "CTA2:T12:0|CTA2:T13:0|CTA2:T14:0|CTA2:T15:0 | CTA3:T12:0|CTA3:T13:0|CTA3:T14:0|CTA3:T15:0," + "CTA2:T16:0|CTA2:T17:0|CTA2:T18:0|CTA2:T19:0 | CTA3:T16:0|CTA3:T17:0|CTA3:T18:0|CTA3:T19:0," + "CTA2:T20:0|CTA2:T21:0|CTA2:T22:0|CTA2:T23:0 | CTA3:T20:0|CTA3:T21:0|CTA3:T22:0|CTA3:T23:0," + "CTA2:T24:0|CTA2:T25:0|CTA2:T26:0|CTA2:T27:0 | CTA3:T24:0|CTA3:T25:0|CTA3:T26:0|CTA3:T27:0," + "CTA2:T28:0|CTA2:T29:0|CTA2:T30:0|CTA2:T31:0 | CTA3:T28:0|CTA3:T29:0|CTA3:T30:0|CTA3:T31:0\n"; + // clang-format on + + runSliceBlockedMultiCTA(/*size=*/16, /*sizePerThread=*/{1, 1}, + /*threadsPerWarp=*/{8, 4}, /*warpsPerCTA=*/{1, 1}, + /*order=*/{1, 0}, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{1, 0}, + /*sliceDim=*/1, /*refStr=*/refStr); +} + +//===----------------------------------------------------------------------===// +// Tests for MmaEncodingAttr +//===----------------------------------------------------------------------===// + +TEST_F(EmitIndicesTest, MmaLayout) { + // clang-format off + std::string refStr = + " T0:0, T0:1, T1:0, T1:1, T2:0, T2:1, T3:0, T3:1\n" + " T4:0, T4:1, T5:0, T5:1, T6:0, T6:1, T7:0, T7:1\n" + " T8:0, T8:1, T9:0, T9:1,T10:0,T10:1,T11:0,T11:1\n" + "T12:0,T12:1,T13:0,T13:1,T14:0,T14:1,T15:0,T15:1\n" + "T16:0,T16:1,T17:0,T17:1,T18:0,T18:1,T19:0,T19:1\n" + "T20:0,T20:1,T21:0,T21:1,T22:0,T22:1,T23:0,T23:1\n" + "T24:0,T24:1,T25:0,T25:1,T26:0,T26:1,T27:0,T27:1\n" + "T28:0,T28:1,T29:0,T29:1,T30:0,T30:1,T31:0,T31:1\n" + " T0:2, T0:3, T1:2, T1:3, T2:2, T2:3, T3:2, T3:3\n" + " T4:2, T4:3, T5:2, T5:3, T6:2, T6:3, T7:2, T7:3\n" + " T8:2, T8:3, T9:2, T9:3,T10:2,T10:3,T11:2,T11:3\n" + "T12:2,T12:3,T13:2,T13:3,T14:2,T14:3,T15:2,T15:3\n" + "T16:2,T16:3,T17:2,T17:3,T18:2,T18:3,T19:2,T19:3\n" + "T20:2,T20:3,T21:2,T21:3,T22:2,T22:3,T23:2,T23:3\n" + "T24:2,T24:3,T25:2,T25:3,T26:2,T26:3,T27:2,T27:3\n" + "T28:2,T28:3,T29:2,T29:3,T30:2,T30:3,T31:2,T31:3\n"; + // clang-format on + + runMmaSingleCTA(/*row=*/16, /*col=*/8, /*versionMajor=*/2, /*versionMinor=*/1, + /*warpsPerCTA=*/{1, 1}, /*instrShape=*/{16, 8}, + /*refStr=*/refStr); +} + +//===----------------------------------------------------------------------===// +// Tests for SharedEncodingAttr +//===----------------------------------------------------------------------===// + +TEST_F(EmitIndicesTest, SharedLayout) { + // clang-format off + std::string refStr = + "(0: 0),(0: 1),(0: 2),(0: 3),(0: 4),(0: 5),(0: 6),(0: 7),(0: 8),(0: 9),(0:10),(0:11),(0:12),(0:13),(0:14),(0:15),(0:16),(0:17),(0:18),(0:19),(0:20),(0:21),(0:22),(0:23),(0:24),(0:25),(0:26),(0:27),(0:28),(0:29),(0:30),(0:31)\n" + "(1: 0),(1: 1),(1: 2),(1: 3),(1: 4),(1: 5),(1: 6),(1: 7),(1: 8),(1: 9),(1:10),(1:11),(1:12),(1:13),(1:14),(1:15),(1:16),(1:17),(1:18),(1:19),(1:20),(1:21),(1:22),(1:23),(1:24),(1:25),(1:26),(1:27),(1:28),(1:29),(1:30),(1:31)\n" + "(2: 8),(2: 9),(2:10),(2:11),(2:12),(2:13),(2:14),(2:15),(2: 0),(2: 1),(2: 2),(2: 3),(2: 4),(2: 5),(2: 6),(2: 7),(2:24),(2:25),(2:26),(2:27),(2:28),(2:29),(2:30),(2:31),(2:16),(2:17),(2:18),(2:19),(2:20),(2:21),(2:22),(2:23)\n" + "(3: 8),(3: 9),(3:10),(3:11),(3:12),(3:13),(3:14),(3:15),(3: 0),(3: 1),(3: 2),(3: 3),(3: 4),(3: 5),(3: 6),(3: 7),(3:24),(3:25),(3:26),(3:27),(3:28),(3:29),(3:30),(3:31),(3:16),(3:17),(3:18),(3:19),(3:20),(3:21),(3:22),(3:23)\n" + "(4:16),(4:17),(4:18),(4:19),(4:20),(4:21),(4:22),(4:23),(4:24),(4:25),(4:26),(4:27),(4:28),(4:29),(4:30),(4:31),(4: 0),(4: 1),(4: 2),(4: 3),(4: 4),(4: 5),(4: 6),(4: 7),(4: 8),(4: 9),(4:10),(4:11),(4:12),(4:13),(4:14),(4:15)\n" + "(5:16),(5:17),(5:18),(5:19),(5:20),(5:21),(5:22),(5:23),(5:24),(5:25),(5:26),(5:27),(5:28),(5:29),(5:30),(5:31),(5: 0),(5: 1),(5: 2),(5: 3),(5: 4),(5: 5),(5: 6),(5: 7),(5: 8),(5: 9),(5:10),(5:11),(5:12),(5:13),(5:14),(5:15)\n" + "(6:24),(6:25),(6:26),(6:27),(6:28),(6:29),(6:30),(6:31),(6:16),(6:17),(6:18),(6:19),(6:20),(6:21),(6:22),(6:23),(6: 8),(6: 9),(6:10),(6:11),(6:12),(6:13),(6:14),(6:15),(6: 0),(6: 1),(6: 2),(6: 3),(6: 4),(6: 5),(6: 6),(6: 7)\n" + "(7:24),(7:25),(7:26),(7:27),(7:28),(7:29),(7:30),(7:31),(7:16),(7:17),(7:18),(7:19),(7:20),(7:21),(7:22),(7:23),(7: 8),(7: 9),(7:10),(7:11),(7:12),(7:13),(7:14),(7:15),(7: 0),(7: 1),(7: 2),(7: 3),(7: 4),(7: 5),(7: 6),(7: 7)\n"; + // clang-format on + + runSharedSingleCTA(/*row=*/8, /*col=*/32, /*rowMajor=*/true, + /*elemTyStr=*/"F16", /*refStr=*/refStr); +} + +//===----------------------------------------------------------------------===// +// The following unittests are tools for Triton developers to visualize layouts. +// You can modify parameters and shapes here to create your own layout and +// tensor. The output will be saved into a csv file which can be opened with +// Microsoft Excel. +//===----------------------------------------------------------------------===// + +TEST_F(EmitIndicesTest, LayoutVisualizer_Blocked) { + CTALayoutAttr CTALayout = + CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{2, 2}, + /*CTASplitNum=*/{2, 2}, /*CTAOrder=*/{1, 0}); + + Attribute blockedLayout = BlockedEncodingAttr::get( + /*context=*/&context, /*sizePerThread=*/{1, 4}, + /*threadsPerWarp=*/{2, 16}, + /*warpsPerCTA=*/{4, 1}, /*order=*/{1, 0}, /*CTALayout=*/CTALayout); + + llvm::SmallVector shape = {/*row=*/128, /*col=*/128}; + + std::ofstream ofs("blockedLayout.csv"); + ofs << dumpDistributedLayout(blockedLayout, shape, /*multiCTA=*/true); +} + +TEST_F(EmitIndicesTest, LayoutVisualizer_Slice) { + CTALayoutAttr CTALayout = + CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{1, 1}, + /*CTASplitNum=*/{1, 1}, /*CTAOrder=*/{1, 0}); + + Attribute blockedLayout = BlockedEncodingAttr::get( + /*context=*/&context, /*sizePerThread=*/{1, 1}, /*threadsPerWarp=*/{4, 8}, + /*warpsPerCTA=*/{1, 1}, /*order=*/{1, 0}, /*CTALayout=*/CTALayout); + + Attribute sliceLayout = SliceEncodingAttr::get( + /*context=*/&context, /*dim=*/1, /*parent=*/blockedLayout); + + llvm::SmallVector shape = {4}; + + std::ofstream ofs("sliceLayout.csv"); + ofs << dumpDistributedLayout(sliceLayout, shape, /*multiCTA=*/false); +} + +TEST_F(EmitIndicesTest, LayoutVisualizer_Mma) { + CTALayoutAttr CTALayout = + CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{1, 1}, + /*CTASplitNum=*/{1, 1}, /*CTAOrder=*/{1, 0}); + + Attribute mmaLayout = MmaEncodingAttr::get( + /*context=*/&context, /*versionMajor=*/2, /*versionMinor=*/1, + /*warpsPerCTA=*/{1, 1}, /*CTALayout=*/CTALayout, /*instrShape=*/{16, 8}); + + llvm::SmallVector shape = {/*row=*/16, /*col=*/8}; + + std::ofstream ofs("mmaLayout.csv"); + ofs << dumpDistributedLayout(mmaLayout, shape, /*multiCTA=*/false); +} + +TEST_F(EmitIndicesTest, LayoutVisualizer_Shared) { + CTALayoutAttr CTALayout = + CTALayoutAttr::get(/*context=*/&context, /*CTAsPerCGA=*/{1, 1}, + /*CTASplitNum=*/{1, 1}, /*CTAOrder=*/{1, 0}); + + Attribute sharedLayout = SharedEncodingAttr::get( + /*context=*/&context, /*vec=*/1, /*perPhase=*/2, /*maxPhase=*/8, + /*order=*/{0, 1}, /*CTALayout=*/CTALayout); + + llvm::SmallVector shape = {/*row=*/16, /*col=*/16}; + Type elemTy = FloatType::getF16(&context); + + std::ofstream ofs("sharedLayout.csv"); + ofs << dumpSharedLayout(sharedLayout, shape, elemTy, /*multiCTA=*/false); +} + +} // namespace gpu +} // namespace triton +} // namespace mlir + +//===----------------------------------------------------------------------===// +// Main +//===----------------------------------------------------------------------===// + +int main(int argc, char *argv[]) { + testing::InitGoogleTest(&argc, argv); + // FIXME: These tests are temporarily disabled due to ctaid.x|y|z are swapped + // return RUN_ALL_TESTS(); +} diff --git a/unittest/Dialect/TritonGPU/CMakeLists.txt b/unittest/Dialect/TritonGPU/CMakeLists.txt index a2444cfa0a92..bbd4080be9f5 100644 --- a/unittest/Dialect/TritonGPU/CMakeLists.txt +++ b/unittest/Dialect/TritonGPU/CMakeLists.txt @@ -1,5 +1,5 @@ add_triton_ut( NAME TestSwizzling SRCS SwizzleTest.cpp - LIBS TritonGPUIR ${dialect_libs} ${conversion_libs} + LIBS TritonGPUIR TritonNvidiaGPUIR ${dialect_libs} ${conversion_libs} ) diff --git a/unittest/Dialect/TritonGPU/SwizzleTest.cpp b/unittest/Dialect/TritonGPU/SwizzleTest.cpp index dc4456e87acc..2b9faeaf405a 100644 --- a/unittest/Dialect/TritonGPU/SwizzleTest.cpp +++ b/unittest/Dialect/TritonGPU/SwizzleTest.cpp @@ -27,15 +27,20 @@ TEST_P(SwizzleDotOperandTestFixture, DotOperands) { // init context MLIRContext ctx; ctx.loadDialect(); + + auto CTALayout = + triton::gpu::CTALayoutAttr::get(&ctx, {1, 1}, {1, 1}, {0, 1}); + // create encoding - auto parent = triton::gpu::MmaEncodingAttr::get(&ctx, 2, 0, {1, 1}); + auto parent = triton::gpu::MmaEncodingAttr::get(&ctx, 2, 0, {1, 1}, CTALayout, + {16, 64, 16}); auto encoding = triton::gpu::DotOperandEncodingAttr::get( &ctx, params.opIdx, parent, 32 / params.typeWidth); // create element type Type eltType = IntegerType::get(&ctx, params.typeWidth); - auto layout = - SharedEncodingAttr::get(&ctx, encoding, params.shape, {1, 0}, eltType); + auto layout = SharedEncodingAttr::get(&ctx, encoding, params.shape, {1, 0}, + CTALayout, eltType); ASSERT_EQ(layout.getVec(), params.refSwizzle.vec); ASSERT_EQ(layout.getPerPhase(), params.refSwizzle.perPhase); From 223c2d32a221e00a7d0c8be7e90e1a953a00d277 Mon Sep 17 00:00:00 2001 From: Philippe Tillet Date: Mon, 7 Aug 2023 11:56:16 -0700 Subject: [PATCH 02/34] [CI] disable XPU tests (not compiling) (#2044) cc @EikanWang . I'm disabling this for now since it broke with the H100 merge, but please feel free to fix the compilation errors and submit a PR. --- .github/workflows/integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 0247db53f1be..b7f333d65309 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -27,7 +27,7 @@ jobs: run: | if [ x"${{ github.repository }}" == x"openai/triton" ]; then echo '::set-output name=matrix-required::[["self-hosted", "A100"], ["self-hosted", "H100"]]' - echo '::set-output name=matrix-optional::[["self-hosted", "gfx908"], ["self-hosted", "arc770"]]' + echo '::set-output name=matrix-optional::[["self-hosted", "gfx908"]]' else echo '::set-output name=matrix-required::["ubuntu-latest"]' echo '::set-output name=matrix-optional::["ubuntu-latest"]' From 54f1ac950ec9d2088ecd680557cebd44ee328640 Mon Sep 17 00:00:00 2001 From: Philippe Tillet Date: Mon, 7 Aug 2023 12:03:26 -0700 Subject: [PATCH 03/34] [CI] disable AMD CI (#2045) --- .github/workflows/integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b7f333d65309..10fbc864676a 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -27,7 +27,7 @@ jobs: run: | if [ x"${{ github.repository }}" == x"openai/triton" ]; then echo '::set-output name=matrix-required::[["self-hosted", "A100"], ["self-hosted", "H100"]]' - echo '::set-output name=matrix-optional::[["self-hosted", "gfx908"]]' + echo '::set-output name=matrix-optional::[]' else echo '::set-output name=matrix-required::["ubuntu-latest"]' echo '::set-output name=matrix-optional::["ubuntu-latest"]' From 521cfae44d6ab525585c23c716482b2fe9209e3c Mon Sep 17 00:00:00 2001 From: Phil Tillet Date: Mon, 7 Aug 2023 12:43:16 -0700 Subject: [PATCH 04/34] [CI] disabled float32 perf regression tests --- python/test/regression/test_performance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/test/regression/test_performance.py b/python/test/regression/test_performance.py index 63e9260d2ce4..f4f247a09696 100644 --- a/python/test/regression/test_performance.py +++ b/python/test/regression/test_performance.py @@ -64,7 +64,7 @@ def nvsmi(attrs): @pytest.mark.parametrize('M, N, K, dtype_str', [(M, N, K, dtype_str) for M, N, K in matmul_data[DEVICE_NAME].keys() - for dtype_str in ['float16', 'float32']]) + for dtype_str in ['float16']]) def test_matmul(M, N, K, dtype_str): stream = torch.cuda.Stream() torch.cuda.set_stream(stream) From 98523bcc4805f5949513076620e21ac578e33964 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 7 Aug 2023 15:55:44 -0700 Subject: [PATCH 05/34] [BACKEND] Support MMA V3 with float16 accumulator (#2049) Also fixes a bug exposed in convertLayout lowering for float16. We shouldn't be using cvt.pack.sat.u16.s32 to pack 16bits values as this needs to take a 32bits register. Also this prevented optimization at llvm ir level. --- include/triton/Dialect/NVGPU/IR/NVGPUOps.td | 9 --- .../TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp | 25 ++++-- .../TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp | 78 ++++++++++++++----- lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp | 25 +----- lib/Hopper/HopperHelpers.c | 9 --- python/test/unit/language/test_core.py | 5 +- 6 files changed, 79 insertions(+), 72 deletions(-) diff --git a/include/triton/Dialect/NVGPU/IR/NVGPUOps.td b/include/triton/Dialect/NVGPU/IR/NVGPUOps.td index af53c9a3132c..857983cf3caa 100644 --- a/include/triton/Dialect/NVGPU/IR/NVGPUOps.td +++ b/include/triton/Dialect/NVGPU/IR/NVGPUOps.td @@ -344,15 +344,6 @@ def NVGPU_Sts64Op : NVGPU_Op<"sts64", [MemoryEffects<[MemWrite]>]> { }]; } -def NVGPU_CvtPackOp : NVGPU_Op<"cvt_pack", []> { - let arguments = (ins AnyTypeOf<[F16, I16]>:$d0, AnyTypeOf<[F16, I16]>:$d1); - let results = (outs I32:$result); - let assemblyFormat = "operands attr-dict `:` type(operands) `->` type($result)"; - string llvmBuilder = [{ - $result = createCvtPack(builder, $d0, $d1); - }]; -} - def NVGPU_ClusterCTAIdOp : NVGPU_Op<"cluster_id", [Pure]> { let results = (outs I32:$result); let assemblyFormat = "attr-dict"; diff --git a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp index 9a43272f163a..85e343386ba4 100644 --- a/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/ConvertLayoutOpToLLVM.cpp @@ -697,6 +697,15 @@ struct ConvertLayoutOpConversion return success(); } + // Pack two 16-bit values into a 32-bit register. + static Value pack16bitsTo32(ConversionPatternRewriter &rewriter, Location loc, + Value hb, Value lb) { + hb = zext(i32_ty, bitcast(hb, i16_ty)); + lb = zext(i32_ty, bitcast(lb, i16_ty)); + Value pack = or_(lb, shl(hb, i32_val(16))); + return pack; + } + // blocked -> shared. // Swizzling in shared memory to avoid bank conflict. Normally used for // A/B operands of dots. @@ -768,14 +777,14 @@ struct ConvertLayoutOpConversion numElemsPerSwizzlingRow, true); Value addr = gep(elemPtrTy, smemBase, offset); - Value data0 = rewriter.create( - loc, i32_ty, inVals[elemIdx + 1], inVals[elemIdx + 0]); - Value data1 = rewriter.create( - loc, i32_ty, inVals[elemIdx + 3], inVals[elemIdx + 2]); - Value data2 = rewriter.create( - loc, i32_ty, inVals[elemIdx + 5], inVals[elemIdx + 4]); - Value data3 = rewriter.create( - loc, i32_ty, inVals[elemIdx + 7], inVals[elemIdx + 6]); + Value data0 = pack16bitsTo32(rewriter, loc, inVals[elemIdx + 1], + inVals[elemIdx + 0]); + Value data1 = pack16bitsTo32(rewriter, loc, inVals[elemIdx + 3], + inVals[elemIdx + 2]); + Value data2 = pack16bitsTo32(rewriter, loc, inVals[elemIdx + 5], + inVals[elemIdx + 4]); + Value data3 = pack16bitsTo32(rewriter, loc, inVals[elemIdx + 7], + inVals[elemIdx + 6]); rewriter.create( loc, bitcast(addr, ptrI8SharedTy), diff --git a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp index 7424341ca79f..2ca238090ddb 100644 --- a/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp +++ b/lib/Conversion/TritonGPUToLLVM/DotOpToLLVM/WGMMA.cpp @@ -216,6 +216,50 @@ DotOpMmaV3SmemLoader loadB(TritonGPUToLLVMTypeConverter *typeConverter, loc}; } +// Return a vector of Value of the accumulator start at startIndex and pack the +// values into 32bits in case the accumulator is fp16. +llvm::SmallVector loadC(ConversionPatternRewriter &rewriter, + Location loc, const SmallVector &elements, + int startIndex, int numElements) { + if (!elements[0].getType().isF16()) { + llvm::SmallVector mmaOut(numElements); + for (int i = 0; i < numElements; ++i) + mmaOut[i] = elements[startIndex + i]; + return mmaOut; + } + // For FP16 we need to pack accumulator into 32-bit integers. + llvm::SmallVector mmaOut(numElements / 2); + for (int i = 0; i < numElements / 2; ++i) { + Value a0 = elements[startIndex + 2 * i]; + Value a1 = elements[startIndex + 2 * i + 1]; + Type cPackTy = vec_ty(rewriter.getF16Type(), 2); + Value pack = rewriter.create(loc, cPackTy); + pack = insert_element(cPackTy, pack, a0, i32_val(0)); + pack = insert_element(cPackTy, pack, a1, i32_val(1)); + pack = bitcast(pack, rewriter.getIntegerType(32)); + mmaOut[i] = pack; + } + return mmaOut; +} + +// If the accumulator is fp16 unpack it from 32-bit integers. +SmallVector unpackAccumulator(ConversionPatternRewriter &rewriter, + Location loc, + const SmallVector &packed, + RankedTensorType tensorTy) { + if (!tensorTy.getElementType().isF16()) + return packed; + // For fp16 the accumualtor is pack into 32-bit integers so we need to unpack + // it. + SmallVector results; + for (Value elem : packed) { + elem = bitcast(elem, vec_ty(rewriter.getF16Type(), 2)); + results.push_back(extract_element(rewriter.getF16Type(), elem, i32_val(0))); + results.push_back(extract_element(rewriter.getF16Type(), elem, i32_val(1))); + } + return results; +} + LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, ConversionPatternRewriter &rewriter, Location loc, Operation *op, Value a, Value b, Value c, Value d, @@ -236,11 +280,6 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, auto dShapePerCTA = getShapePerCTA(dTensorTy); auto instrShape = mmaEncoding.getInstrShape(); auto accSize = 2 * (instrShape[1] / 4); - Type resElemTy = dTensorTy.getElementType(); - llvm::SmallVector elemTypes(accSize, resElemTy); - auto accTy = - LLVM::LLVMStructType::getLiteral(rewriter.getContext(), elemTypes); - int M = 4 * instrShape[0]; int N = instrShape[1]; int K = instrShape[2]; @@ -258,9 +297,6 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, auto fc = typeConverter->unpackLLElements(loc, loadedC, rewriter, dTensorTy); triton::nvgpu::WGMMAEltType eltTypeC = getMmaRetType(d); - assert(eltTypeC != triton::nvgpu::WGMMAEltType::f16 && - "TODO support f16 return type. This requires packing C into " - "vector<2xf16> type."); triton::nvgpu::WGMMAEltType eltTypeA = getMmaOperandType(a, allowTF32); triton::nvgpu::WGMMAEltType eltTypeB = eltTypeA; @@ -276,13 +312,16 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, rewriter.create(loc, 0); rewriter.create(loc); - llvm::SmallVector mmaOut(accSize); + SmallVector mmaResults; for (int m = 0; m < numRepM; ++m) { for (int n = 0; n < numRepN; ++n) { - // reuse the same mmaOut - for (int i = 0; i < accSize; ++i) { - mmaOut[i] = fc[(m * numRepN + n) * accSize + i]; - } + llvm::SmallVector mmaOut = + loadC(rewriter, loc, fc, (m * numRepN + n) * accSize, accSize); + llvm::SmallVector elemTypes; + for (Value accEl : mmaOut) + elemTypes.push_back(accEl.getType()); + auto accTy = + LLVM::LLVMStructType::getLiteral(rewriter.getContext(), elemTypes); Value d = typeConverter->packLLElements(loc, mmaOut, rewriter, accTy); for (int k = 0; k < numRepK; ++k) { auto a = aLoader.smemLoad(m, k); @@ -294,7 +333,7 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, } auto acc = typeConverter->unpackLLElements(loc, d, rewriter, accTy); for (int i = 0; i < acc.size(); ++i) { - fc[(m * numRepN + n) * accSize + i] = acc[i]; + mmaResults.push_back(acc[i]); } } } @@ -303,13 +342,14 @@ LogicalResult convertDot(TritonGPUToLLVMTypeConverter *typeConverter, if (sync) rewriter.create(loc, 0); - for (auto &elem : fc) { - elem = bitcast(elem, resElemTy); - } + SmallVector results = + unpackAccumulator(rewriter, loc, mmaResults, dTensorTy); + // replace with new packed result Type structTy = LLVM::LLVMStructType::getLiteral( - mmaEncoding.getContext(), SmallVector(fc.size(), resElemTy)); - auto res = typeConverter->packLLElements(loc, fc, rewriter, structTy); + mmaEncoding.getContext(), + SmallVector(results.size(), dTensorTy.getElementType())); + auto res = typeConverter->packLLElements(loc, results, rewriter, structTy); rewriter.replaceOp(op, res); return success(); } diff --git a/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp b/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp index 9506566859cc..c67897f8cf3f 100644 --- a/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp +++ b/lib/Dialect/NVGPU/ToLLVMIR/NVGPUToLLVMIR.cpp @@ -326,8 +326,7 @@ llvm::Value *createWGMMA(llvm::IRBuilderBase &builder, uint32_t m, uint32_t n, uint32_t asmOpIdx = 0; // Operand C - uint32_t numCRegs = m * n / 128; - assert(numCRegs == structTypeC->getStructNumElements()); + uint32_t numCRegs = structTypeC->getStructNumElements(); asmOs << "{"; for (uint32_t i = 0; i < numCRegs; ++i) { argTypes.push_back(structTypeC->getElementType(i)); @@ -335,7 +334,7 @@ llvm::Value *createWGMMA(llvm::IRBuilderBase &builder, uint32_t m, uint32_t n, asmOs << "$" << asmOpIdx++ << (i == numCRegs - 1 ? "" : ","); // LLVM does not support `+` semantic, we must repeat the arguments for both // input and outputs - if (structTypeC->getElementType(0)->isFloatTy()) + if (structTypeC->getElementType(i)->isFloatTy()) conOs << "=f,"; else conOs << "=r,"; @@ -706,26 +705,6 @@ void createSts64(llvm::IRBuilderBase &builder, llvm::Value *offset, return; } -llvm::Value *createCvtPack(llvm::IRBuilderBase &builder, llvm::Value *d0, - llvm::Value *d1) { - std::string funcName("__nv_cvt_pack"); - - llvm::Type *retTy = builder.getInt32Ty(); - llvm::SmallVector args; - llvm::SmallVector argTys; - auto i16Ty = builder.getInt16Ty(); - - argTys.push_back(i16Ty); - args.push_back(builder.CreateBitCast(d0, i16Ty)); - argTys.push_back(i16Ty); - args.push_back(builder.CreateBitCast(d1, i16Ty)); - - auto *module = builder.GetInsertBlock()->getModule(); - auto *func = dyn_cast( - getExternalFuncOP(module, funcName, retTy, argTys).getCallee()); - return builder.CreateCall(func, args); -} - static llvm::Value *getSRegValue(llvm::IRBuilderBase &builder, llvm::StringRef name) { std::string ptxStr; diff --git a/lib/Hopper/HopperHelpers.c b/lib/Hopper/HopperHelpers.c index 800b3c7e538f..8b7e20841140 100644 --- a/lib/Hopper/HopperHelpers.c +++ b/lib/Hopper/HopperHelpers.c @@ -501,12 +501,3 @@ __nv_offset_of_sts64(uint32_t threadIdx, uint32_t rowOfWarp, int32_t elemIdx, return offset; } - -__DEVICE__ __attribute__((__always_inline__)) uint32_t -__nv_cvt_pack(uint16_t d0, uint16_t d1) { - uint32_t ret; - asm volatile("cvt.pack.sat.u16.s32 %0, %1, %2;\n" - : "=r"(ret) - : "r"(d0), "r"(d1)); - return ret; -} diff --git a/python/test/unit/language/test_core.py b/python/test/unit/language/test_core.py index 136922953aa1..b321afcbb20f 100644 --- a/python/test/unit/language/test_core.py +++ b/python/test/unit/language/test_core.py @@ -2139,9 +2139,6 @@ def test_dot(M, N, K, num_warps, col_a, col_b, epilogue, allow_tf32, in_dtype, o if out_dtype == 'float16': # TODO: support out_dtype=float16 for tl.dot on V100 pytest.skip("Only test out_dtype=float16 on devices with sm >=80") - if capability[0] == 9 and out_dtype == 'float16': - # TODO: support out_dtype=float16 for tl.dot on H100 - pytest.skip("Only test out_dtype=float16 on devices with sm<90") torch.backends.cuda.matmul.allow_tf32 = allow_tf32 @@ -2297,7 +2294,7 @@ def kernel(X, stride_xm, stride_xk, elif in_dtype == 'float16' and out_dtype == tl.float32: assert re.search(r'[mma|wgmma.mma_async].sync.aligned.m\d+n\d+k16(?:.row.col)?.f32.f16.f16', ptx) elif in_dtype == 'float16' and out_dtype == tl.float16: - assert 'mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16' in ptx + assert re.search(r'[mma|wgmma.mma_async].sync.aligned.m\d+n\d+k16(?:.row.col)?.f16.f16.f16', ptx) elif in_dtype == 'int8': assert 'wgmma.mma_async.sync.aligned' in ptx or\ 'mma.sync.aligned.m16n8k32.row.col.satfinite.s32.s8.s8.s32' in ptx From 30a331e6280c9a39f7f9a4c4cc569618cf8dd639 Mon Sep 17 00:00:00 2001 From: Keren Zhou Date: Mon, 7 Aug 2023 19:05:56 -0700 Subject: [PATCH 06/34] [FRONTEND] Support jit functions without arguments (#2043) Issue https://github.com/openai/triton/issues/1973 Co-authored-by: Philippe Tillet --- python/test/unit/language/print_helper.py | 11 ++++++++++- python/test/unit/language/test_subprocess.py | 5 ++--- python/triton/compiler/make_launcher.py | 10 +++++----- python/triton/runtime/jit.py | 9 +++++---- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/python/test/unit/language/print_helper.py b/python/test/unit/language/print_helper.py index afdd12960737..feb0d219d7f2 100644 --- a/python/test/unit/language/print_helper.py +++ b/python/test/unit/language/print_helper.py @@ -28,6 +28,11 @@ def kernel_static_print(X, Y, BLOCK: tl.constexpr): tl.store(Y + tl.arange(0, BLOCK), x) +@triton.jit +def kernel_no_arg_print(): + print("", tl.program_id(0)) + + def test_print(func: str, data_type: str): shape = (128, ) # limit the range of integers so that the sum does not overflow @@ -39,7 +44,11 @@ def test_print(func: str, data_type: str): kernel_print[(1,)](x, y, BLOCK=shape[0]) elif func == "static_print": kernel_static_print[(1,)](x, y, BLOCK=shape[0]) - assert_close(y, x) + elif func == "no_arg_print": + kernel_no_arg_print[(1,)](num_warps=4) + + if func != "no_arg_print": + assert_close(y, x) if __name__ == "__main__": diff --git a/python/test/unit/language/test_subprocess.py b/python/test/unit/language/test_subprocess.py index 0baf89fce851..78b8d09fb9f8 100644 --- a/python/test/unit/language/test_subprocess.py +++ b/python/test/unit/language/test_subprocess.py @@ -15,7 +15,7 @@ @pytest.mark.parametrize("func_type, data_type", - [("device_print", data_type) for data_type in torch_types] + [("print", "int32"), ("static_print", "int32")]) + [("device_print", data_type) for data_type in torch_types] + [("print", "int32"), ("static_print", "int32"), ("no_arg_print", "int32")]) def test_print(func_type: str, data_type: str): proc = subprocess.Popen([sys.executable, print_path, func_type, data_type], stdout=subprocess.PIPE, shell=False) outs, _ = proc.communicate() @@ -29,10 +29,9 @@ def test_print(func_type: str, data_type: str): new_lines.add(value) except Exception as e: print(e) - if func_type != "static_print": + if func_type != "static_print" and func_type != "no_arg_print": for i in range(128): assert i in new_lines - assert len(new_lines) == 128 else: assert len(new_lines) == 1 diff --git a/python/triton/compiler/make_launcher.py b/python/triton/compiler/make_launcher.py index c30b0be76262..981a888f5451 100644 --- a/python/triton/compiler/make_launcher.py +++ b/python/triton/compiler/make_launcher.py @@ -198,7 +198,7 @@ def format_of(ty): PyObject *compiled_kernel = NULL; {' '.join([f"{_extracted_type(ty)} _arg{i}; " for i, ty in signature.items()])} - if (!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel, {', '.join(f"&_arg{i}" for i, ty in signature.items())})) {{ + if (!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel{', ' + ', '.join(f"&_arg{i}" for i, ty in signature.items()) if len(signature) > 0 else ''})) {{ return NULL; }} @@ -208,7 +208,7 @@ def format_of(ty): // raise exception asap {"; ".join([f"DevicePtrInfo ptr_info{i} = getPointer(_arg{i}, {i}); if (!ptr_info{i}.valid) return NULL;" if ty[0] == "*" else "" for i, ty in signature.items()])}; - _launch(gridX, gridY, gridZ, num_warps, shared_memory, (hipStream_t)_stream, (hipFunction_t)_function, {', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}" for i, ty in signature.items())}); + _launch(gridX, gridY, gridZ, num_warps, shared_memory, (hipStream_t)_stream, (hipFunction_t)_function{', ' + ', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}" for i, ty in signature.items()) if len(signature) > 0 else ''}); if (launch_exit_hook != Py_None) {{ PyObject_CallObject(launch_exit_hook, args); }} @@ -267,7 +267,7 @@ def format_of(ty): #define CUDA_CHECK(ans) {{ gpuAssert((ans), __FILE__, __LINE__); }} -static void _launch(int gridX, int gridY, int gridZ, int num_warps, int num_ctas, int clusterDimX, int clusterDimY, int clusterDimZ, int shared_memory, CUstream stream, CUfunction function, {arg_decls}) {{ +static void _launch(int gridX, int gridY, int gridZ, int num_warps, int num_ctas, int clusterDimX, int clusterDimY, int clusterDimZ, int shared_memory, CUstream stream, CUfunction function{', ' + arg_decls if len(arg_decls) > 0 else ''}) {{ void *params[] = {{ {', '.join(f"&arg{i}" for i in params)} }}; if(gridX*gridY*gridZ > 0){{ if (num_ctas == 1) {{ @@ -356,7 +356,7 @@ def format_of(ty): PyObject *launch_exit_hook = NULL; PyObject *compiled_kernel = NULL; {' '.join([f"{_extracted_type(ty)} _arg{i}; " for i, ty in signature.items()])} - if(!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &num_ctas, &clusterDimX, &clusterDimY, &clusterDimZ, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel, {', '.join(f"&_arg{i}" for i, ty in signature.items())})) {{ + if(!PyArg_ParseTuple(args, \"{format}\", &gridX, &gridY, &gridZ, &num_warps, &num_ctas, &clusterDimX, &clusterDimY, &clusterDimZ, &shared_memory, &_stream, &_function, &launch_enter_hook, &launch_exit_hook, &compiled_kernel{', ' + ', '.join(f"&_arg{i}" for i, ty in signature.items()) if len(signature) > 0 else ''})) {{ return NULL; }} @@ -367,7 +367,7 @@ def format_of(ty): // raise exception asap {"; ".join([f"DevicePtrInfo ptr_info{i} = getPointer(_arg{i}, {i}); if (!ptr_info{i}.valid) return NULL;" if ty[0] == "*" else "" for i, ty in signature.items()])}; - _launch(gridX, gridY, gridZ, num_warps, num_ctas, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (CUstream)_stream, (CUfunction)_function, {', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}"for i, ty in signature.items())}); + _launch(gridX, gridY, gridZ, num_warps, num_ctas, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (CUstream)_stream, (CUfunction)_function{', ' + ', '.join(f"ptr_info{i}.dev_ptr" if ty[0]=="*" else f"_arg{i}"for i, ty in signature.items()) if len(signature) > 0 else ''}); if (launch_exit_hook != Py_None) {{ PyObject_CallObject(launch_exit_hook, args); diff --git a/python/triton/runtime/jit.py b/python/triton/runtime/jit.py index a3a4e4ade3dc..0abf5a4a4134 100644 --- a/python/triton/runtime/jit.py +++ b/python/triton/runtime/jit.py @@ -352,11 +352,12 @@ def _make_launcher(self): spec_keys = ', '.join(specializations) grid_args = ','.join([f'"{arg}": {arg}' for arg in self.arg_names]) args_signature = ', '.join(name if dflt == inspect._empty else f'{name} = {dflt}' for name, dflt in zip(self.arg_names, self.arg_defaults)) + args_signature = args_signature + ', ' if len(args_signature) > 0 else '' src = f""" -def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_ctas=1, num_stages=3, enable_warp_specialization=False, extern_libs=None, stream=None, warmup=False, device=None, device_type=None): +def {self.fn.__name__}({args_signature}grid=None, num_warps=4, num_ctas=1, num_stages=3, enable_warp_specialization=False, extern_libs=None, stream=None, warmup=False, device=None, device_type=None): from ..compiler import compile, CompiledKernel - sig_key = {sig_keys}, + sig_key = {f'{sig_keys},' if len(sig_keys) > 0 else ()} constexpr_key = {f'{constexpr_keys},' if len(constexpr_keys) > 0 else ()} spec_key = {f'{spec_keys},' if len(spec_keys) > 0 else ()} key = (version_key, sig_key, constexpr_key, spec_key, num_warps, num_ctas, num_stages, enable_warp_specialization, self.debug) @@ -399,7 +400,7 @@ def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_ctas=1, num if bin is not None: # build dict of constant values args = [{args}] - all_args = {', '.join([f'{arg}' for arg in self.arg_names])}, + all_args = {', '.join([f'{arg}' for arg in self.arg_names]) + ', ' if len(self.arg_names) > 0 else ()} configs = self._get_config(*all_args), constants = self._make_constants(constexpr_key) constants.update({{i: None for i, arg in enumerate(all_args) if arg is None}}) @@ -413,7 +414,7 @@ def {self.fn.__name__}({args_signature}, grid=None, num_warps=4, num_ctas=1, num else: # build dict of constant values args = [{args}] - all_args = {', '.join([f'{arg}' for arg in self.arg_names])}, + all_args = {', '.join([f'{arg}' for arg in self.arg_names]) + ', ' if len(self.arg_names) > 0 else ()} configs = self._get_config(*all_args), constants = self._make_constants(constexpr_key) constants.update({{i: None for i, arg in enumerate(all_args) if arg is None}}) From 3ec05fb023714c0411772df36a7eebc2fc6ec087 Mon Sep 17 00:00:00 2001 From: Philippe Tillet Date: Mon, 7 Aug 2023 19:32:55 -0700 Subject: [PATCH 07/34] [CI] H100 tests always use ENABLE_TMA=1 ENABLE_MMA_V3=1 (#2051) --- .github/workflows/integration-tests.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 10fbc864676a..a4898aa182f5 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -95,16 +95,6 @@ jobs: # run runtime tests serially to avoid race condition with cache handling. python3 -m pytest runtime/ - - name: Disable MMAV3 and TMA - if: ${{(matrix.runner[0] == 'self-hosted') && (matrix.runner[1] == 'H100')}} - run: | - echo "ENABLE_TMA=0" >> "${GITHUB_ENV}" - echo "ENABLE_MMA_V3=0" >> "${GITHUB_ENV}" - - - name: Clear cache - run: | - rm -rf ~/.triton - - name: Run python tests on CUDA with ENABLE_TMA=0 and ENABLE_MMA_V3=0 if: ${{ env.BACKEND == 'CUDA' && env.ENABLE_TMA == '0' && env.ENABLE_MMA_V3 == '0'}} run: | From 6a1ac650439a38b5dcdd7c2e115326a4f93dd1eb Mon Sep 17 00:00:00 2001 From: "danny.jang" Date: Tue, 8 Aug 2023 11:34:09 +0900 Subject: [PATCH 08/34] [FRONTEND] improve error message for type mismatch (#2038) --- python/triton/language/semantic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/triton/language/semantic.py b/python/triton/language/semantic.py index 003a9f689f38..a5aa44745ff1 100644 --- a/python/triton/language/semantic.py +++ b/python/triton/language/semantic.py @@ -980,7 +980,7 @@ def _store_block_pointer(ptr, val, mask, boundary_check, cache, eviction, builde val = broadcast_impl_shape(val, block_shape, builder) assert val.type.is_block(), "Value argument must be block type or a scalar" assert block_shape == val.type.get_block_shapes(), "Block shape and value shape mismatch" - assert ptr.type.element_ty.element_ty == val.type.element_ty, "Block element type and value element type mismatch" + assert ptr.type.element_ty.element_ty == val.type.element_ty, f"Block element type({ptr.type.element_ty.element_ty}) and value element type({val.type.element_ty}) mismatch" elt_ty = ptr.type.element_ty.element_ty assert elt_ty != tl.int1, "`tl.int1` should be rewrited in `tl.make_block_ptr`" From 341f5b61be50ce1173111bdc520d656d64d0692c Mon Sep 17 00:00:00 2001 From: Qingyi Liu Date: Tue, 8 Aug 2023 11:11:00 +0800 Subject: [PATCH 09/34] [BACKEND] Add BarrierOp after AllocMBarrierOp when numCTAs == 1 (#2040) Make sure that other threads within CTA do not operate on mbarrier until it is initialized by thread 0. Co-authored-by: Philippe Tillet --- .../Transforms/WSMaterialization.cpp | 6 ++-- lib/Hopper/HopperHelpers.c | 32 ------------------ .../test_persistent_warp_specialized_gemm.py | 6 +++- python/triton/hopper_lib/libhopper_helpers.bc | Bin 11976 -> 14640 bytes 4 files changed, 9 insertions(+), 35 deletions(-) diff --git a/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp index 1aa80ace4ae0..bdc20f0c0a22 100644 --- a/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp +++ b/lib/Dialect/TritonNvidiaGPU/Transforms/WSMaterialization.cpp @@ -380,8 +380,10 @@ void materializeTokenOperations(Operation *parentOp, int numCTAs) { Value bufferEmptyArray = builder.create(tokenLoc, mBarriersTy, numCTAs); - // Make sure that MBarriers are initialized in all CTAs - if (numCTAs > 1) { + if (numCTAs == 1) { + builder.create(tokenLoc); + } else { + // Make sure that MBarriers are initialized in all CTAs builder.create(tokenLoc, false); builder.create(tokenLoc); } diff --git a/lib/Hopper/HopperHelpers.c b/lib/Hopper/HopperHelpers.c index 8b7e20841140..328577602cd5 100644 --- a/lib/Hopper/HopperHelpers.c +++ b/lib/Hopper/HopperHelpers.c @@ -104,38 +104,6 @@ __DEVICE__ __attribute__((__always_inline__)) void __nv_wgmma_wait_group() { asm volatile("wgmma.wait_group.sync.aligned 0;\n"); } -// GMMA expects data to be in TN format. if A is column major, transa should be -// set GMMA expects data to be in TN format. if B is row major, transb should be -// set -__DEVICE__ __attribute__((__always_inline__)) float32 -__nv_wgmma_m64n64k16_f32_f16_f16_row_col(const uint64_t desc_a, - const uint64_t desc_b, float32 acc) { - const uint32_t scale_d = 1; - asm volatile("{\n" - ".reg .pred p;\n\t" - "setp.eq.u32 p, %34, 1;\n\t" - "wgmma.mma_async.sync.aligned.m64n64k16.f32.f16.f16\n" - "{%0, %1, %2, %3, %4, %5, %6, %7, \n" - " %8, %9, %10, %11, %12, %13, %14, %15,\n" - " %16, %17, %18, %19, %20, %21, %22, %23,\n" - " %24, %25, %26, %27, %28, %29, %30, %31},\n" - "%32, \n" - "%33, \n" - "p, 1, 1, 0, 0;\n" - "}" - : "+f"(acc.d0), "+f"(acc.d1), "+f"(acc.d2), "+f"(acc.d3), - "+f"(acc.d4), "+f"(acc.d5), "+f"(acc.d6), "+f"(acc.d7), - "+f"(acc.d8), "+f"(acc.d9), "+f"(acc.d10), "+f"(acc.d11), - "+f"(acc.d12), "+f"(acc.d13), "+f"(acc.d14), "+f"(acc.d15), - "+f"(acc.d16), "+f"(acc.d17), "+f"(acc.d18), "+f"(acc.d19), - "+f"(acc.d20), "+f"(acc.d21), "+f"(acc.d22), "+f"(acc.d23), - "+f"(acc.d24), "+f"(acc.d25), "+f"(acc.d26), "+f"(acc.d27), - "+f"(acc.d28), "+f"(acc.d29), "+f"(acc.d30), "+f"(acc.d31) - : "l"(desc_a), "l"(desc_b), "r"(scale_d)); - - return acc; -} - __DEVICE__ __attribute__((__always_inline__)) void __nv_mbarrier_init(uint32_t bar, uint32_t expected, uint32_t pred) { if (pred) { diff --git a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py index 21fd0a5a61b0..bfdffa446ed0 100644 --- a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py +++ b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py @@ -280,7 +280,11 @@ def tma_warp_specialized_matmul_kernel( ]) @pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") def test_non_persistent_warp_specialized_gemm(M, N, K, BLOCK_M, BLOCK_N, BLOCK_K, NUM_CTAS, TRANS_A, TRANS_B): - pytest.skip('hang') + if '-'.join(map(str, [M, N, K, BLOCK_M, BLOCK_N, BLOCK_K, NUM_CTAS, TRANS_A, TRANS_B])) in [ + '4096-4096-256-128-256-16-1-False-True', + '4096-4096-256-128-256-64-1-False-True' + ]: + pytest.skip('Insufficient register resources') if (TRANS_A): a = .1 * torch.randn((K, M), device='cuda', dtype=torch.float16).T diff --git a/python/triton/hopper_lib/libhopper_helpers.bc b/python/triton/hopper_lib/libhopper_helpers.bc index 3f625a85a7614effc330ae9c169546e89af4db32..773a44892b73dd087c7d4b969f573363e57c3c2a 100644 GIT binary patch literal 14640 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 XGj$avQ?c0xbj77`QFTutHf!`>!1u8g delta 5289 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 Date: Tue, 8 Aug 2023 05:43:50 +0200 Subject: [PATCH 10/34] [NFC] Integration fix for upstream D156857 (#2021) Use camel case accessors ("getStaticOffsets" etc.) for `ExtractSliceOp`. This change works with and without the changes from D156857. After D156857 has landed, only camel case accessors work for ops that implement the `OffsetSizeAndStrideOpInterface`. https://reviews.llvm.org/D156857 Co-authored-by: Philippe Tillet --- lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp | 2 +- lib/Dialect/TritonGPU/IR/Dialect.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp index b9e5b563f541..a5fedf4b4701 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVM.cpp @@ -575,7 +575,7 @@ struct ExtractSliceOpConversion // newShape = rank_reduce(shape) // Triton only supports static tensor sizes SmallVector strideVals; - for (auto i = 0; i < op.static_sizes().size(); ++i) { + for (auto i = 0; i < op.getStaticSizes().size(); ++i) { if (op.getStaticSize(i) == 1) { offsetVals.erase(offsetVals.begin() + i); } else { diff --git a/lib/Dialect/TritonGPU/IR/Dialect.cpp b/lib/Dialect/TritonGPU/IR/Dialect.cpp index 98aceb91f3a6..b4daaee795ce 100644 --- a/lib/Dialect/TritonGPU/IR/Dialect.cpp +++ b/lib/Dialect/TritonGPU/IR/Dialect.cpp @@ -1606,10 +1606,10 @@ LogicalResult ConvertLayoutOp::canonicalize(ConvertLayoutOp op, auto newArg = rewriter.create( op->getLoc(), newType, extract_slice.getSource()); rewriter.replaceOpWithNewOp( - op, resType, newArg.getResult(), extract_slice.offsets(), - extract_slice.sizes(), extract_slice.strides(), - extract_slice.static_offsets(), extract_slice.static_sizes(), - extract_slice.static_strides()); + op, resType, newArg.getResult(), extract_slice.getOffsets(), + extract_slice.getSizes(), extract_slice.getStrides(), + extract_slice.getStaticOffsets(), extract_slice.getStaticSizes(), + extract_slice.getStaticStrides()); return mlir::success(); } From 4ed8381fdb6461b40a660e9ff0501d180d2cb20b Mon Sep 17 00:00:00 2001 From: Alex Collins <109211184+acollins3@users.noreply.github.com> Date: Tue, 8 Aug 2023 05:39:41 +0100 Subject: [PATCH 11/34] Linux arm64 support (#2003) We are interested in having python wheels for triton built for Linux arm64 platforms, such as NVIDIA's Grace CPU. This change is fairly simple, however: - It requires a linux arm64 build of LLVM to be available (see MR here: https://github.com/ptillet/triton-llvm-releases/pull/15) - For now my changes use the LLVM build hosted here: https://github.com/acollins3/triton-llvm-releases/releases/tag/llvm-17.0.0-c5dede880d17 - The Triton release process will need to be updated to include arm64 wheels. Is this something you have time to work on @ptillet? It would be difficult for me to update this part without more access permissions. With these changes, I managed to build a set of python wheels and have hosted them here for us to use in the meantime: https://github.com/acollins3/triton/releases/tag/triton-2.1.0-arm64 --- python/setup.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/python/setup.py b/python/setup.py index 2f2dec916921..19df069974ba 100644 --- a/python/setup.py +++ b/python/setup.py @@ -68,7 +68,9 @@ def get_pybind11_package_info(): def get_llvm_package_info(): # added statement for Apple Silicon system = platform.system() - arch = 'x86_64' + arch = platform.machine() + if arch == 'aarch64': + arch = 'arm64' if system == "Darwin": system_suffix = "apple-darwin" arch = platform.machine() @@ -84,6 +86,9 @@ def get_llvm_package_info(): name = f'llvm+mlir-17.0.0-{arch}-{system_suffix}-{release_suffix}' version = "llvm-17.0.0-c5dede880d17" url = f"https://github.com/ptillet/triton-llvm-releases/releases/download/{version}/{name}.tar.xz" + # FIXME: remove the following once github.com/ptillet/triton-llvm-releases has arm64 llvm releases + if arch == 'arm64' and 'linux' in system_suffix: + url = f"https://github.com/acollins3/triton-llvm-releases/releases/download/{version}/{name}.tar.xz" return Package("llvm", name, url, "LLVM_INCLUDE_DIRS", "LLVM_LIBRARY_DIR", "LLVM_SYSPATH") @@ -124,7 +129,10 @@ def download_and_copy_ptxas(): base_dir = os.path.dirname(__file__) src_path = "bin/ptxas" version = "12.1.105" - url = f"https://conda.anaconda.org/nvidia/label/cuda-12.1.1/linux-64/cuda-nvcc-{version}-0.tar.bz2" + arch = platform.machine() + if arch == "x86_64": + arch = "64" + url = f"https://conda.anaconda.org/nvidia/label/cuda-12.1.1/linux-{arch}/cuda-nvcc-{version}-0.tar.bz2" dst_prefix = os.path.join(base_dir, "triton") dst_suffix = os.path.join("third_party", "cuda", src_path) dst_path = os.path.join(dst_prefix, dst_suffix) From 31e79aa384d18f258c82e8a9aeec47591c1bb630 Mon Sep 17 00:00:00 2001 From: ben-zhang-609 <110140741+ben-zhang-609@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:52:55 +0800 Subject: [PATCH 12/34] [TESTS] remove get_proper_err, get_variant_golden (#2039) Co-authored-by: Philippe Tillet --- python/test/unit/hopper/test_gemm.py | 13 +---- .../test_persistent_warp_specialized_gemm.py | 7 +-- .../test/unit/hopper/test_tma_store_gemm.py | 33 +----------- .../test/unit/hopper/ttgir_tests/test_tma.py | 9 +--- .../test/unit/hopper/ttgir_tests/test_util.py | 52 ------------------- python/test/unit/hopper/utils.py | 32 ------------ ...perimental-tmastg-matrix-multiplication.py | 34 ++---------- 7 files changed, 12 insertions(+), 168 deletions(-) delete mode 100644 python/test/unit/hopper/ttgir_tests/test_util.py delete mode 100644 python/test/unit/hopper/utils.py diff --git a/python/test/unit/hopper/test_gemm.py b/python/test/unit/hopper/test_gemm.py index 58d73a3c10b0..480f7b1f3563 100644 --- a/python/test/unit/hopper/test_gemm.py +++ b/python/test/unit/hopper/test_gemm.py @@ -29,7 +29,6 @@ import triton import triton.language as tl -from .utils import get_proper_err, get_variant_golden @triton.jit @@ -127,14 +126,12 @@ def test_gemm_no_scf(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_TYPE a_f32 = a.to(torch.float32) b_f32 = b.to(torch.float32) golden = torch.matmul(a_f32, b_f32) - golden_variant = get_variant_golden(a_f32, b_f32) - golden_abs_err, golden_rel_err = get_proper_err(golden, golden_variant) torch.set_printoptions(profile="full") assert_close( c, golden, - rtol=max(1e-2, 1.1 * golden_rel_err), - atol=max(1e-3, 1.1 * golden_abs_err), + rtol=1e-2, + atol=1e-3, check_dtype=False) @@ -450,12 +447,6 @@ def grid(META): enable_warp_specialization=ENABLE_WS) torch.set_printoptions(profile="full") - # print("abs_err: {}, rel_err: {}".format(golden_abs_err, golden_rel_err)) - # print("golden: ") - # print(golden) - # print("result: ") - # print(z) - # print("max_gap: {}".format(torch.max(torch.abs(z - golden)))) golden = torch.nn.functional.normalize(golden) z = torch.nn.functional.normalize(z) assert_close(z, golden, diff --git a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py index bfdffa446ed0..e729fcb54633 100644 --- a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py +++ b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py @@ -26,7 +26,6 @@ import triton import triton.language as tl -from .utils import get_proper_err, get_variant_golden def isMMAV3OrTMAEnabled(): @@ -645,14 +644,12 @@ def test_static_persistent_matmul_no_scf_kernel(M, N, K, NUM_CTAS, NUM_WARPS, TR a_f32 = a.to(torch.float32) b_f32 = b.to(torch.float32) golden = torch.matmul(a_f32, b_f32) - golden_variant = get_variant_golden(a_f32, b_f32) - golden_abs_err, golden_rel_err = get_proper_err(golden, golden_variant) torch.set_printoptions(profile="full") assert_close( c, golden, - rtol=max(1e-2, 1.1 * golden_rel_err), - atol=max(1e-3, 1.1 * golden_abs_err), + rtol=1e-2, + atol=1e-3, check_dtype=False) diff --git a/python/test/unit/hopper/test_tma_store_gemm.py b/python/test/unit/hopper/test_tma_store_gemm.py index 0ec258d7cd9f..6d912d89caed 100644 --- a/python/test/unit/hopper/test_tma_store_gemm.py +++ b/python/test/unit/hopper/test_tma_store_gemm.py @@ -28,36 +28,6 @@ import triton.language as tl -def get_variant_golden(a, b): - SIZE_M = a.shape[0] - SIZE_K = a.shape[1] - SIZE_N = b.shape[1] - assert a.shape[1] == b.shape[0] - zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() - zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() - zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() - zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() - a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) - a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) - b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) - b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) - c_padded = torch.matmul(a_padded, b_padded) - return c_padded[:SIZE_M, :SIZE_N] - -# It's not easy to get a proper error threshold in different size -# Here the gemm calculation is padded to a different size in order to get -# a variant version of the golden result. And the error between golden and -# golden_variant provide reference on selecting the proper rtol / atol. - - -def get_proper_err(a, b, golden): - golden_variant = get_variant_golden(a, b) - golden_diff = golden - golden_variant - golden_abs_err = torch.max(torch.abs(golden_diff)).item() - golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() - return (golden_abs_err, golden_rel_err) - - @triton.jit def matmul_tma_load_store( a_ptr, b_ptr, c_ptr, @@ -118,6 +88,5 @@ def test_tma_load_store(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_F num_ctas=NUM_CTAS, OUTPUT_F16=OUTPUT_F16) golden = torch.matmul(a, b) - golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) torch.set_printoptions(profile="full") - assert_close(c, golden, rtol=max(1e-4, 1.5 * golden_rel_err), atol=max(1e-4, 1.5 * golden_abs_err), check_dtype=False) + assert_close(c, golden, rtol=1e-2, atol=1e-3, check_dtype=False) diff --git a/python/test/unit/hopper/ttgir_tests/test_tma.py b/python/test/unit/hopper/ttgir_tests/test_tma.py index 39af52123f15..d48d2aa42986 100644 --- a/python/test/unit/hopper/ttgir_tests/test_tma.py +++ b/python/test/unit/hopper/ttgir_tests/test_tma.py @@ -23,7 +23,6 @@ import pytest import torch -from test_util import get_proper_err from torch.testing import assert_close import triton @@ -63,13 +62,9 @@ def test_tma_wgmma_64_64_16_f16(TTGIR, TRANS_A, TRANS_B): golden = torch.matmul(a, b) torch.set_printoptions(profile="full", sci_mode=False) - golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) assert_close( c, golden, - rtol=max(1e-4, - 1.5 * golden_rel_err), - atol=max( - 1e-4, - 1.5 * golden_abs_err), + rtol=1e-2, + atol=1e-3, check_dtype=False) diff --git a/python/test/unit/hopper/ttgir_tests/test_util.py b/python/test/unit/hopper/ttgir_tests/test_util.py deleted file mode 100644 index f2e0f88b2e01..000000000000 --- a/python/test/unit/hopper/ttgir_tests/test_util.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) 2023 NVIDIA Corporation & Affiliates. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import torch - - -def get_variant_golden(a, b): - SIZE_M = a.shape[0] - SIZE_K = a.shape[1] - SIZE_N = b.shape[1] - assert a.shape[1] == b.shape[0] - zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() - zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() - zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() - zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() - a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) - a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) - b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) - b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) - c_padded = torch.matmul(a_padded, b_padded) - return c_padded[:SIZE_M, :SIZE_N] - -# It's not easy to get a proper error threshold in different size -# Here the gemm calculation is padded to a different size in order to get -# a variant version of the golden result. And the error between golden and -# golden_variant provide reference on selecting the proper rtol / atol. - - -def get_proper_err(a, b, golden): - golden_variant = get_variant_golden(a, b) - golden_diff = golden - golden_variant - golden_abs_err = torch.max(torch.abs(golden_diff)).item() - golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() - return (golden_abs_err, golden_rel_err) diff --git a/python/test/unit/hopper/utils.py b/python/test/unit/hopper/utils.py deleted file mode 100644 index 845afbd009d7..000000000000 --- a/python/test/unit/hopper/utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import torch - - -def get_variant_golden(a, b): - SIZE_M = a.shape[0] - SIZE_K = a.shape[1] - SIZE_N = b.shape[1] - assert a.shape[1] == b.shape[0] - zero_M_K = torch.zeros((SIZE_M, SIZE_K), dtype=a.dtype).cuda() - zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K), dtype=a.dtype).cuda() - zero_K_N = torch.zeros((SIZE_K, SIZE_N), dtype=b.dtype).cuda() - zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N), dtype=b.dtype).cuda() - a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) - a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) - b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) - b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) - c_padded = torch.matmul(a_padded, b_padded) - return c_padded[:SIZE_M, :SIZE_N] - -# It's not easy to get a proper error threshold in different size -# Here the gemm calculation is padded to a different size in order to get -# a variant version of the golden result. And the error between golden and -# golden_variant provide reference on selecting the proper rtol / atol. - - -def get_proper_err(golden, golden_variant): - golden_diff = golden - golden_variant - golden_abs_err = torch.max(torch.abs(golden_diff)).item() - # avoid problems when golden_rel_err is 'inf' - abs_golden = torch.abs(golden) + torch.full_like(golden, torch.finfo(golden.dtype).smallest_normal) - golden_rel_err = torch.max(torch.abs(golden_diff) / abs_golden).item() - return (golden_abs_err, golden_rel_err) diff --git a/python/tutorials/10-experimental-tmastg-matrix-multiplication.py b/python/tutorials/10-experimental-tmastg-matrix-multiplication.py index a6c081850a19..c2e894ee3e2a 100644 --- a/python/tutorials/10-experimental-tmastg-matrix-multiplication.py +++ b/python/tutorials/10-experimental-tmastg-matrix-multiplication.py @@ -84,31 +84,6 @@ def matmul_kernel( tl.store(c_block_ptr, accumulator) -def get_variant_golden(a, b): - SIZE_M = a.shape[0] - SIZE_K = a.shape[1] - SIZE_N = b.shape[1] - assert a.shape[1] == b.shape[0] - zero_M_K = torch.zeros((SIZE_M, SIZE_K)).cuda() - zero_3M_K = torch.zeros((3 * SIZE_M, SIZE_K)).cuda() - zero_K_N = torch.zeros((SIZE_K, SIZE_N)).cuda() - zero_3K_N = torch.zeros((3 * SIZE_K, SIZE_N)).cuda() - a_padded = torch.cat((a, zero_M_K, zero_M_K), 0) - a_padded = torch.cat((a_padded, zero_3M_K, zero_3M_K), 1) - b_padded = torch.cat((b, zero_K_N, zero_K_N), 0) - b_padded = torch.cat((b_padded, zero_3K_N, zero_3K_N), 1) - c_padded = torch.matmul(a_padded, b_padded) - return c_padded[:SIZE_M, :SIZE_N] - - -def get_proper_err(a, b, golden): - golden_variant = get_variant_golden(a, b) - golden_diff = golden - golden_variant - golden_abs_err = torch.max(torch.abs(golden_diff)).item() - golden_rel_err = torch.max(torch.abs(golden_diff / golden)).item() - return (golden_abs_err, golden_rel_err) - - def matmul(a, b): # checks constraints assert a.shape[1] == b.shape[0], "incompatible dimensions" @@ -134,15 +109,16 @@ def grid(META): a = torch.randn((512, 512), device='cuda', dtype=torch.float16) b = torch.randn((512, 512), device='cuda', dtype=torch.float16).T c = matmul(a, b) +c = torch.nn.functional.normalize(c) + +golden = torch.nn.functional.normalize(torch.matmul(a, b)) -golden = torch.matmul(a, b) -golden_abs_err, golden_rel_err = get_proper_err(a, b, golden) torch.set_printoptions(profile="full") assert_close( c, golden, - rtol=max(1e-4, 1.5 * golden_rel_err), - atol=max(1e-4, 1.5 * golden_abs_err), + rtol=1e-2, + atol=1e-3, check_dtype=False) From f21a053ee6f536e7d52a79a14a77b3572687d486 Mon Sep 17 00:00:00 2001 From: BoxiangW <45734921+BoxiangW@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:57:44 -0400 Subject: [PATCH 13/34] [TUTORIALS] support flash attention 2 with KV's sequence length longer than Q's (#2033) Implemented this situation with and without causal mask. My implementation with causal mask looks like: 111000 111100 111110 Where only the right upper triangle part will be masked. I added `P_SEQ` for the notation of extra sequence length for KV. Co-authored-by: Philippe Tillet --- python/tutorials/06-fused-attention.py | 70 +++++++++++++------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/python/tutorials/06-fused-attention.py b/python/tutorials/06-fused-attention.py index 65d16da73c68..c331760197bd 100644 --- a/python/tutorials/06-fused-attention.py +++ b/python/tutorials/06-fused-attention.py @@ -32,16 +32,17 @@ def _fwd_kernel( stride_kz, stride_kh, stride_kn, stride_kk, stride_vz, stride_vh, stride_vk, stride_vn, stride_oz, stride_oh, stride_om, stride_on, - Z, H, N_CTX, + Z, H, N_CTX, P_SEQ, BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, BLOCK_N: tl.constexpr, IS_CAUSAL: tl.constexpr, ): start_m = tl.program_id(0) off_hz = tl.program_id(1) - qvk_offset = off_hz * stride_qh + q_offset = off_hz * stride_qh + kv_offset = off_hz * stride_kh Q_block_ptr = tl.make_block_ptr( - base=Q + qvk_offset, + base=Q + q_offset, shape=(N_CTX, BLOCK_DMODEL), strides=(stride_qm, stride_qk), offsets=(start_m * BLOCK_M, 0), @@ -49,16 +50,16 @@ def _fwd_kernel( order=(1, 0) ) K_block_ptr = tl.make_block_ptr( - base=K + qvk_offset, - shape=(BLOCK_DMODEL, N_CTX), + base=K + kv_offset, + shape=(BLOCK_DMODEL, N_CTX + P_SEQ), strides=(stride_kk, stride_kn), offsets=(0, 0), block_shape=(BLOCK_DMODEL, BLOCK_N), order=(0, 1) ) V_block_ptr = tl.make_block_ptr( - base=V + qvk_offset, - shape=(N_CTX, BLOCK_DMODEL), + base=V + kv_offset, + shape=(N_CTX + P_SEQ, BLOCK_DMODEL), strides=(stride_vk, stride_vn), offsets=(0, 0), block_shape=(BLOCK_N, BLOCK_DMODEL), @@ -80,7 +81,7 @@ def _fwd_kernel( q = (q * qk_scale).to(tl.float16) # loop over k, v and update accumulator lo = 0 - hi = (start_m + 1) * BLOCK_M if IS_CAUSAL else N_CTX + hi = P_SEQ + (start_m + 1) * BLOCK_M if IS_CAUSAL else N_CTX + P_SEQ for start_n in range(lo, hi, BLOCK_N): # -- load k, v -- k = tl.load(K_block_ptr) @@ -88,7 +89,7 @@ def _fwd_kernel( # -- compute qk --- qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) if IS_CAUSAL: - qk = tl.where(offs_m[:, None] >= (start_n + offs_n[None, :]), qk, float("-inf")) + qk = tl.where(P_SEQ + offs_m[:, None] >= (start_n + offs_n[None, :]), qk, float("-inf")) qk += tl.dot(q, k) # -- compute scaling constant --- m_i_new = tl.maximum(m_i, tl.max(qk, 1)) @@ -110,7 +111,7 @@ def _fwd_kernel( tl.store(l_ptrs, m_i + tl.math.log2(l_i)) # write back O O_block_ptr = tl.make_block_ptr( - base=Out + qvk_offset, + base=Out + q_offset, shape=(N_CTX, BLOCK_DMODEL), strides=(stride_om, stride_on), offsets=(start_m * BLOCK_M, 0), @@ -146,8 +147,8 @@ def _bwd_kernel( stride_qz, stride_qh, stride_qm, stride_qk, stride_kz, stride_kh, stride_kn, stride_kk, stride_vz, stride_vh, stride_vk, stride_vn, - Z, H, N_CTX, - num_block, + Z, H, N_CTX, P_SEQ, + num_block_q, num_block_kv, BLOCK_M: tl.constexpr, BLOCK_DMODEL: tl.constexpr, BLOCK_N: tl.constexpr, CAUSAL: tl.constexpr, @@ -158,20 +159,20 @@ def _bwd_kernel( qk_scale = sm_scale * 1.44269504 # offset pointers for batch/head Q += off_z * stride_qz + off_h * stride_qh - K += off_z * stride_qz + off_h * stride_qh - V += off_z * stride_qz + off_h * stride_qh + K += off_z * stride_kz + off_h * stride_kh + V += off_z * stride_vz + off_h * stride_vh DO += off_z * stride_qz + off_h * stride_qh DQ += off_z * stride_qz + off_h * stride_qh - DK += off_z * stride_qz + off_h * stride_qh - DV += off_z * stride_qz + off_h * stride_qh - for start_n in range(0, num_block): + DK += off_z * stride_kz + off_h * stride_kh + DV += off_z * stride_vz + off_h * stride_vh + for start_n in range(0, num_block_kv): if CAUSAL: - lo = start_n * BLOCK_M + lo = tl.math.max(start_n * BLOCK_M - P_SEQ, 0) else: lo = 0 # initialize row/col offsets offs_qm = lo + tl.arange(0, BLOCK_M) - offs_n = start_n * BLOCK_M + tl.arange(0, BLOCK_M) + offs_n = start_n * BLOCK_M + tl.arange(0, BLOCK_M) offs_m = tl.arange(0, BLOCK_N) offs_k = tl.arange(0, BLOCK_DMODEL) # initialize pointers to value-like data @@ -183,20 +184,20 @@ def _bwd_kernel( # pointer to row-wise quantities in value-like data D_ptrs = D + off_hz * N_CTX l_ptrs = L + off_hz * N_CTX - # initialize dv amd dk - dv = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + # initialize dk amd dv dk = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) + dv = tl.zeros([BLOCK_M, BLOCK_DMODEL], dtype=tl.float32) # k and v stay in SRAM throughout k = tl.load(k_ptrs) v = tl.load(v_ptrs) # loop over rows - for start_m in range(lo, num_block * BLOCK_M, BLOCK_M): + for start_m in range(lo, num_block_q * BLOCK_M, BLOCK_M): offs_m_curr = start_m + offs_m # load q, k, v, do on-chip q = tl.load(q_ptrs) # recompute p = softmax(qk, dim=-1).T if CAUSAL: - qk = tl.where(offs_m_curr[:, None] >= (offs_n[None, :]), float(0.), float("-inf")) + qk = tl.where(P_SEQ + offs_m_curr[:, None] >= (offs_n[None, :]), float(0.), float("-inf")) else: qk = tl.zeros([BLOCK_M, BLOCK_N], dtype=tl.float32) qk += tl.dot(q, tl.trans(k)) @@ -223,10 +224,10 @@ def _bwd_kernel( q_ptrs += BLOCK_M * stride_qm do_ptrs += BLOCK_M * stride_qm # write-back - dv_ptrs = DV + (offs_n[:, None] * stride_qm + offs_k[None, :] * stride_qk) dk_ptrs = DK + (offs_n[:, None] * stride_kn + offs_k[None, :] * stride_kk) - tl.store(dv_ptrs, dv) + dv_ptrs = DV + (offs_n[:, None] * stride_qm + offs_k[None, :] * stride_qk) tl.store(dk_ptrs, dk) + tl.store(dv_ptrs, dv) empty = torch.empty(128, device="cuda") @@ -245,7 +246,7 @@ def forward(ctx, q, k, v, causal, sm_scale): BLOCK_N = 64 grid = (triton.cdiv(q.shape[2], BLOCK_M), q.shape[0] * q.shape[1], 1) L = torch.empty((q.shape[0] * q.shape[1], q.shape[2]), device=q.device, dtype=torch.float32) - + P_SEQ = 0 if q.shape[-2] == k.shape[-2] else k.shape[-2] - q.shape[-2] num_warps = 4 if Lk <= 64 else 8 _fwd_kernel[grid]( q, k, v, sm_scale, @@ -255,7 +256,7 @@ def forward(ctx, q, k, v, causal, sm_scale): k.stride(0), k.stride(1), k.stride(2), k.stride(3), v.stride(0), v.stride(1), v.stride(2), v.stride(3), o.stride(0), o.stride(1), o.stride(2), o.stride(3), - q.shape[0], q.shape[1], q.shape[2], + q.shape[0], q.shape[1], q.shape[2], P_SEQ, BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N, BLOCK_DMODEL=Lk, IS_CAUSAL=causal, num_warps=num_warps, @@ -266,6 +267,7 @@ def forward(ctx, q, k, v, causal, sm_scale): ctx.sm_scale = sm_scale ctx.BLOCK_DMODEL = Lk ctx.causal = causal + ctx.P_SEQ = P_SEQ return o @staticmethod @@ -290,8 +292,8 @@ def backward(ctx, do): q.stride(0), q.stride(1), q.stride(2), q.stride(3), k.stride(0), k.stride(1), k.stride(2), k.stride(3), v.stride(0), v.stride(1), v.stride(2), v.stride(3), - q.shape[0], q.shape[1], q.shape[2], - ctx.grid[0], + q.shape[0], q.shape[1], q.shape[2], ctx.P_SEQ, + ctx.grid[0], triton.cdiv(k.shape[2], BLOCK), BLOCK_M=BLOCK, BLOCK_N=BLOCK, BLOCK_DMODEL=ctx.BLOCK_DMODEL, num_warps=8, CAUSAL=ctx.causal, @@ -303,17 +305,17 @@ def backward(ctx, do): attention = _attention.apply -@pytest.mark.parametrize('Z, H, N_CTX, D_HEAD', [(6, 9, 1024, 64)]) +@pytest.mark.parametrize('Z, H, N_CTX, D_HEAD, P_SEQ', [(6, 9, 1024, 64, 128)]) @pytest.mark.parametrize('causal', [False, True]) -def test_op(Z, H, N_CTX, D_HEAD, causal, dtype=torch.float16): +def test_op(Z, H, N_CTX, D_HEAD, P_SEQ, causal, dtype=torch.float16): torch.manual_seed(20) q = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0., std=0.5).requires_grad_() - k = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0., std=0.5).requires_grad_() - v = torch.empty((Z, H, N_CTX, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0., std=0.5).requires_grad_() + k = torch.empty((Z, H, N_CTX + P_SEQ, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0., std=0.5).requires_grad_() + v = torch.empty((Z, H, N_CTX + P_SEQ, D_HEAD), dtype=dtype, device="cuda").normal_(mean=0., std=0.5).requires_grad_() sm_scale = 0.5 dout = torch.randn_like(q) # reference implementation - M = torch.tril(torch.ones((N_CTX, N_CTX), device="cuda")) + M = torch.tril(torch.ones((N_CTX, N_CTX + P_SEQ), device="cuda"), diagonal=P_SEQ) p = torch.matmul(q, k.transpose(2, 3)) * sm_scale if causal: p[:, :, M == 0] = float("-inf") From a76ecd74e73726b584b4334d4327fc554a0ce445 Mon Sep 17 00:00:00 2001 From: Bin Fan Date: Mon, 7 Aug 2023 23:04:57 -0700 Subject: [PATCH 14/34] add num_stages parameter to aot compile.py (#2000) This allows the AOT client to tune the number of stages for the generated kernel. set the default number to 3 to match the triton compiler. --- python/triton/tools/compile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/triton/tools/compile.py b/python/triton/tools/compile.py index 46f98db432f0..05c905072468 100644 --- a/python/triton/tools/compile.py +++ b/python/triton/tools/compile.py @@ -43,6 +43,7 @@ parser.add_argument("path", help="Path to Python source containing desired kernel in its scope. File will be executed.") parser.add_argument("--kernel-name", "-n", type=str, default="", help="Name of the kernel to compile", required=True) parser.add_argument("--num-warps", "-w", type=int, default=1, help="Number of warps to launch the kernel") + parser.add_argument("--num-stages", "-ns", type=int, default=3, help="Number of stages meta-parameter for the kernel") parser.add_argument("--out-name", "-on", type=str, default=None, help="Out name for the compiled kernel") parser.add_argument("--out-path", "-o", type=Path, default=None, help="Out filename") parser.add_argument("--signature", "-s", type=str, help="Signature of the kernel", required=True) @@ -96,7 +97,7 @@ def constexpr(s): config = triton.compiler.instance_descriptor(divisible_by_16=divisible_by_16, equal_to_1=equal_to_1) for i in equal_to_1: constexprs.update({i: 1}) - ccinfo = triton.compile(kernel, signature=signature, constants=constexprs, configs=[config], num_warps=args.num_warps) + ccinfo = triton.compile(kernel, signature=signature, constants=constexprs, configs=[config], num_warps=args.num_warps, num_stages=args.num_stages) arg_names = [] arg_types = [] for i in signature.keys(): From b525880d8b10726be0959c91b93551d674e4396f Mon Sep 17 00:00:00 2001 From: goostavz <109190422+goostavz@users.noreply.github.com> Date: Tue, 8 Aug 2023 14:30:04 +0800 Subject: [PATCH 15/34] [Backend] Fix CTA->warp ordering for MMAv3 and fix dot-chain scripts in hopper tests (#2041) Co-authored-by: goostavz Co-authored-by: Philippe Tillet Co-authored-by: ben-zhang-609 <110140741+ben-zhang-609@users.noreply.github.com> --- .../TritonGPUToLLVM/TritonGPUToLLVMBase.h | 40 ++++-------- python/test/unit/hopper/test_gemm.py | 63 +++++++++---------- 2 files changed, 40 insertions(+), 63 deletions(-) diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h index 450d2b5635c9..ed150fce425d 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h @@ -984,32 +984,6 @@ class ConvertTritonGPUOpToLLVMPatternBase { return ret; } - SmallVector - emitBaseIndexForMmaLayoutV2(Location loc, ConversionPatternRewriter &rewriter, - const MmaEncodingAttr &mmaLayout, - RankedTensorType type) const { - auto shape = type.getShape(); - auto warpsPerCTA = mmaLayout.getWarpsPerCTA(); - assert(warpsPerCTA.size() == 2); - auto order = triton::gpu::getOrder(mmaLayout); - Value threadId = getThreadId(rewriter, loc); - Value warpSize = i32_val(32); - Value laneId = urem(threadId, warpSize); - Value warpId = udiv(threadId, warpSize); - - SmallVector multiDimWarpId = - delinearize(rewriter, loc, warpId, warpsPerCTA, order); - multiDimWarpId[0] = urem(multiDimWarpId[0], i32_val(shape[0] / 16)); - multiDimWarpId[1] = urem(multiDimWarpId[1], i32_val(shape[1] / 8)); - Value offWarp0 = mul(multiDimWarpId[0], i32_val(16)); - Value offWarp1 = mul(multiDimWarpId[1], i32_val(8)); - - SmallVector multiDimBase(2); - multiDimBase[0] = add(udiv(laneId, i32_val(4)), offWarp0); - multiDimBase[1] = add(mul(i32_val(2), urem(laneId, i32_val(4))), offWarp1); - return multiDimBase; - } - SmallVector> emitOffsetForMmaLayoutV2(const MmaEncodingAttr &mmaLayout, RankedTensorType type) const { @@ -1062,8 +1036,18 @@ class ConvertTritonGPUOpToLLVMPatternBase { else warpsN = shape[1] / instrShape[1]; - SmallVector multiDimWarpId = - delinearize(rewriter, loc, warpId, _warpsPerCTA, order); + SmallVector multiDimWarpId(2); + if (mmaLayout.isHopper()) { + // TODO[goostavz]: the tiling order from CTA->warp level is different for + // MMAv2/3. This is a workaround since we don't explicitly have warpGrp + // level in the layout definition, and the tiling order of warpGrp->warp + // must be fixed to meet the HW's needs. We may need to consider to + // explicitly define warpGrpPerCTA for MMAv3 layout. + multiDimWarpId[0] = urem(warpId, warpsPerCTA[0]); + multiDimWarpId[1] = urem(udiv(warpId, warpsPerCTA[0]), warpsPerCTA[1]); + } else { + multiDimWarpId = delinearize(rewriter, loc, warpId, _warpsPerCTA, order); + } Value warpId0 = urem(multiDimWarpId[0], i32_val(warpsM)); Value warpId1 = urem(multiDimWarpId[1], i32_val(warpsN)); diff --git a/python/test/unit/hopper/test_gemm.py b/python/test/unit/hopper/test_gemm.py index 480f7b1f3563..b778cf38c939 100644 --- a/python/test/unit/hopper/test_gemm.py +++ b/python/test/unit/hopper/test_gemm.py @@ -149,6 +149,7 @@ def matmul_kernel( DO_SOFTMAX: tl.constexpr, CHAIN_DOT: tl.constexpr, A_ORDER_0: tl.constexpr, A_ORDER_1: tl.constexpr, B_ORDER_0: tl.constexpr, B_ORDER_1: tl.constexpr, + W_ORDER_0: tl.constexpr, W_ORDER_1: tl.constexpr, Z_ORDER_0: tl.constexpr, Z_ORDER_1: tl.constexpr ): pid = tl.program_id(axis=0) @@ -167,8 +168,9 @@ def matmul_kernel( offsets=(block_offset_m, 0), block_shape=(BLOCK_M, BLOCK_K), order=(A_ORDER_0, A_ORDER_1)) b_tile_ptr = tl.make_block_ptr(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), offsets=(0, block_offset_n), block_shape=(BLOCK_K, BLOCK_N), order=(B_ORDER_0, B_ORDER_1)) + # for chain-dot, BLOCK_N must always be equal to N, and each program loads the whole W matrix w_tile_ptr = tl.make_block_ptr(base=w_ptr, shape=(N, N), strides=(stride_wm, stride_wn), - offsets=(0, block_offset_n), block_shape=(BLOCK_N, BLOCK_N), order=(Z_ORDER_1, Z_ORDER_0)) + offsets=(0, 0), block_shape=(BLOCK_N, BLOCK_N), order=(W_ORDER_0, W_ORDER_1)) z = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32) offs_m = block_offset_m + tl.arange(0, BLOCK_M) @@ -213,7 +215,7 @@ def matmul_kernel( tl.store(z_ptrs, z, mask=mask) -@pytest.mark.parametrize('BLOCK_M,BLOCK_N,BLOCK_K,NUM_WARPS,NUM_CTAS,M,N,K,TRANS_A,TRANS_B,TRANS_C,epilogue,out_dtype,USE_TMA_STORE,NUM_STAGES,ENABLE_WS', +@pytest.mark.parametrize('BLOCK_M,BLOCK_N,BLOCK_K,NUM_WARPS,NUM_CTAS,M,N,K,TRANS_A,TRANS_B,TRANS_OUTPUT,epilogue,out_dtype,USE_TMA_STORE,NUM_STAGES,ENABLE_WS', [(128, 128, 64, 4, 1, *shape_w_c, 'none', out_dtype, use_tma_store, 3, enable_ws) for shape_w_c in [ # badcase from cublas-important-layers @@ -225,7 +227,7 @@ def matmul_kernel( for out_dtype in ['float16', 'float32'] for use_tma_store in [False, True] for enable_ws in [False, True] - ] + [(*shape_w_c, trans_a, trans_b, trans_c, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + ] + [(*shape_w_c, trans_a, trans_b, trans_output, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) # softmax works for one CTA for shape_w_c in [ [64, 64, 16, 4, 1, 64, 64, 64], @@ -239,10 +241,10 @@ def matmul_kernel( for use_tma_store in [False, True] for trans_a in [False, True] for trans_b in [False, True] - for trans_c in [False, True] + for trans_output in [False, True] for num_stages in [3] for enable_ws in [False, True] - ] + [(*shape_w_c, trans_a, trans_b, trans_c, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) + ] + [(*shape_w_c, trans_a, trans_b, trans_output, epilogue, out_dtype, use_tma_store, num_stages, enable_ws) for shape_w_c in [ [64, 64, 16, 4, 1, 128, 128, 64], *[[256, 64, 16, num_warps, num_ctas, 256, 256, 64] for num_warps in [4, 8] for num_ctas in [1, 2, 4]], @@ -264,11 +266,11 @@ def matmul_kernel( for use_tma_store in [False, True] for trans_a in [False, True] for trans_b in [False, True] - for trans_c in [False, True] + for trans_output in [False, True] for num_stages in [3] for enable_ws in [False, True] - if not (epilogue == 'chain-dot' and (shape_w_c[5] is not None or shape_w_c[0] != shape_w_c[1])) - ] + [(*shape_w_c, trans_a, trans_b, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + if not (epilogue == 'chain-dot' and (shape_w_c[6] is not None or shape_w_c[1] != shape_w_c[6])) + ] + [(*shape_w_c, trans_a, trans_b, trans_output, 'none', out_dtype, use_tma_store, num_stages, enable_ws) for shape_w_c in [ [64, 64, 32, 4, 1, 128, 256, 64], [128, 128, 16, 4, 4, 512, 256, 64], @@ -287,18 +289,18 @@ def matmul_kernel( for use_tma_store in [False, True] for trans_a in [False, True] for trans_b in [False, True] - for trans_c in [False, True] + for trans_output in [False, True] for num_stages in [3] for enable_ws in [False, True] - ] + [(64, n, 16, 4, 1, 512, 256, 256, False, True, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + ] + [(64, n, 16, 4, 1, 512, 256, 256, False, True, trans_output, 'none', out_dtype, use_tma_store, num_stages, enable_ws) # loop over instr shapes for n in [16, 32, 64, 128, 256] - for trans_c in [False, True] + for trans_output in [False, True] for out_dtype in ['float16', 'float32'] for use_tma_store in [False, True] for num_stages in [2, 4, 5, 7] for enable_ws in [False, True] - ] + [(*shape_w_c, *shape, False, True, trans_c, 'none', out_dtype, use_tma_store, num_stages, enable_ws) + ] + [(*shape_w_c, *shape, False, True, trans_output, 'none', out_dtype, use_tma_store, num_stages, enable_ws) # irregular shapes for shape_w_c in [ [128, 128, 64, 4, 1], @@ -306,7 +308,7 @@ def matmul_kernel( [128, 128, 128, 4, 2], ] for shape in list(itertools.product([*range(512, 4096, 360)], [*range(512, 4096, 360)], [512, 1024])) - for trans_c in [False, True] + for trans_output in [False, True] for out_dtype in ['float16', 'float32'] for use_tma_store in [False, True] for num_stages in [2, 3, 4] @@ -314,7 +316,7 @@ def matmul_kernel( ]) @pytest.mark.skipif(torch.cuda.get_device_capability() [0] < 9, reason="Requires compute capability >= 9") -def test_gemm(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B, TRANS_C, epilogue, out_dtype, USE_TMA_STORE, NUM_STAGES, ENABLE_WS): +def test_gemm(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B, TRANS_OUTPUT, epilogue, out_dtype, USE_TMA_STORE, NUM_STAGES, ENABLE_WS): if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, TRANS_B])) in [ '16-32-64-4-4-512-256-64-True-False', '16-32-64-4-4-512-256-64-True-True', @@ -331,13 +333,7 @@ def test_gemm(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, '16-32-64-8-2-256-256-256-False', '16-32-64-8-2-256-256-256-True', ]: - pytest.skip('illegal memory access.') - - # with ENABLE_TMA=1 and ENABLE_MMA_V3=1 - if '-'.join(map(str, [BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K])) in [ - '64-64-32-8-1-128-256-64', - ]: - pytest.skip('Tensor-likes are not close!') + pytest.skip('Known legacy issue, ldmatrix can only support x4') if NUM_CTAS > 1 and NUM_WARPS == 8: pytest.skip('Tensor-likes are not close!') @@ -378,27 +374,23 @@ def test_gemm(BLOCK_M, BLOCK_N, BLOCK_K, NUM_WARPS, NUM_CTAS, M, N, K, TRANS_A, # avoid out of memory if epilogue in ['add-matrix', 'add-rows', 'add-cols']: - if (TRANS_C): - bias = torch.randn((M, N), device='cuda', dtype=torch_out_dtype) - else: + if (TRANS_OUTPUT): bias = torch.randn((N, M), device='cuda', dtype=torch_out_dtype).T + else: + bias = torch.randn((M, N), device='cuda', dtype=torch_out_dtype) else: bias = torch.randn((1, 1), device='cuda', dtype=torch_out_dtype) - if epilogue == 'chain-dot': - if (TRANS_C): - w = torch.randn((N, N), device='cuda', dtype=torch.float16).T - else: - w = torch.randn((M, M), device='cuda', dtype=torch.float16) - else: - w = torch.randn((1, 1), device='cuda', dtype=torch.float16).T + # for chain-dot only + w = torch.randn((N, N), device='cuda', dtype=torch.float16).T + w_order = [0, 1] - if (TRANS_C): - z = torch.full((M, N), 1., device='cuda', dtype=torch_out_dtype) - z_order = [1, 0] - else: + if (TRANS_OUTPUT): z = torch.full((N, M), 1., device='cuda', dtype=torch_out_dtype).T z_order = [0, 1] + else: + z = torch.full((M, N), 1., device='cuda', dtype=torch_out_dtype) + z_order = [1, 0] # torch result a_f32 = a.to(torch.float32) @@ -442,6 +434,7 @@ def grid(META): CHAIN_DOT=epilogue == 'chain-dot', A_ORDER_0=a_order[0], A_ORDER_1=a_order[1], B_ORDER_0=b_order[0], B_ORDER_1=b_order[1], + W_ORDER_0=w_order[0], W_ORDER_1=w_order[1], Z_ORDER_0=z_order[0], Z_ORDER_1=z_order[1], num_warps=NUM_WARPS, num_ctas=NUM_CTAS, num_stages=NUM_STAGES, enable_warp_specialization=ENABLE_WS) From 11cf33473004622dcb1bf37082ec183289714bec Mon Sep 17 00:00:00 2001 From: allatit23 <138413300+allatit23@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:28:10 +0800 Subject: [PATCH 16/34] [hopper][ws] use per-agent thread idx by default (#2054) Co-authored-by: Allen Zhao --- .../TritonGPUToLLVM/TritonGPUToLLVMBase.h | 20 +++++++++++++++++-- .../test_persistent_warp_specialized_gemm.py | 10 ---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h index ed150fce425d..6a8e1f1dd640 100644 --- a/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h +++ b/lib/Conversion/TritonGPUToLLVM/TritonGPUToLLVMBase.h @@ -11,6 +11,7 @@ #include "Utility.h" #include "mlir/IR/TypeUtilities.h" #include "triton/Analysis/AxisInfo.h" +#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h" #include "triton/Target/PTX/TmaMetadata.h" #include @@ -31,6 +32,7 @@ using ::mlir::triton::gpu::DotOperandEncodingAttr; using ::mlir::triton::gpu::MmaEncodingAttr; using ::mlir::triton::gpu::SliceEncodingAttr; using ::mlir::triton::gpu::TMAMetadataTy; +namespace ttng = ::mlir::triton::nvidia_gpu; typedef DenseMap TensorPtrMapT; @@ -238,12 +240,26 @@ class ConvertTritonGPUOpToLLVMPatternBase { return llvmStruct; } - Value getThreadId(ConversionPatternRewriter &rewriter, Location loc) const { - auto tid = rewriter.create<::mlir::gpu::ThreadIdOp>( + // Returns CTA level thread idx + Value getThreadIdInCTA(ConversionPatternRewriter &rewriter, + Location loc) const { + Value tid = rewriter.create<::mlir::gpu::ThreadIdOp>( loc, ::mlir::gpu::Dimension::x); return rewriter.create(loc, i32_ty, tid); } + // Returns CTA level thread idx for not ws mode. + // Returns agent level thread idx for ws mode. + Value getThreadId(ConversionPatternRewriter &rewriter, Location loc) const { + Value tid = getThreadIdInCTA(rewriter, loc); + auto mod = rewriter.getBlock()->getParent()->getParentOfType(); + if (ttng::TritonNvidiaGPUDialect::getWSSupportedAttr(mod)) { + Value _128 = rewriter.create(loc, 128, 32); + tid = rewriter.create(loc, tid, _128); + } + return tid; + } + static Value getSRegValue(OpBuilder &b, Location loc, const std::string &sRegStr) { PTXBuilder builder; diff --git a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py index e729fcb54633..099b08e7cb5f 100644 --- a/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py +++ b/python/test/unit/hopper/test_persistent_warp_specialized_gemm.py @@ -28,14 +28,6 @@ import triton.language as tl -def isMMAV3OrTMAEnabled(): - import os - for k in ('ENABLE_MMA_V3', 'ENABLE_TMA'): - if os.environ.get(k, '0').lower() in ['1', 'on', 'true']: - return True - return False - - @triton.jit def static_persistent_matmul_kernel( a_ptr, b_ptr, c_ptr, @@ -610,8 +602,6 @@ def static_persistent_matmul_no_scf_kernel( ])) @pytest.mark.skipif(torch.cuda.get_device_capability()[0] < 9, reason="Requires compute capability >= 9") def test_static_persistent_matmul_no_scf_kernel(M, N, K, NUM_CTAS, NUM_WARPS, TRANS_A, TRANS_B, OUTPUT_TYPE, USE_TMA_EPILOGUE, USE_TMA_LOAD): - if isMMAV3OrTMAEnabled(): - pytest.skip("known failure") if (TRANS_A): a = torch.randn((K, M), device='cuda', dtype=torch.float16).T else: From 658747feff69e42457fd51d76072de1f1896c545 Mon Sep 17 00:00:00 2001 From: Philippe Tillet Date: Tue, 8 Aug 2023 01:11:32 -0700 Subject: [PATCH 17/34] [FRONTEND] remove ptxas from git (#2055) --- .gitignore | 3 +++ python/triton/third_party/cuda/bin/ptxas | Bin 20495600 -> 0 bytes 2 files changed, 3 insertions(+) delete mode 100755 python/triton/third_party/cuda/bin/ptxas diff --git a/.gitignore b/.gitignore index 62dda302a407..ef7867cbde86 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ venv.bak/ # JetBrains project files .idea cmake-build-* + +# Third-party binaries +ptxas diff --git a/python/triton/third_party/cuda/bin/ptxas b/python/triton/third_party/cuda/bin/ptxas deleted file mode 100755 index 8b47936ea212371f303abe1700dd467765002161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20495600 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
?)<5(gvYl3vV?I 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 z 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íkGc#;NL`+E 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

^l3k7JgSX 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�e^o?1{zyUx+*jsd*jZYu`B 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

cE~K6I4;yI+H=zE+e+U%)2mczCKNB4W-&=J0 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

k|ASr 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

p~6aD&UN_``8 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

N8-@S2c2>a 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�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%0De4H#25JYQRq2dZ5Xe<5 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

ascn~0m4R7U!tG`I=x4~M^J^U@nO2QO`e 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

9I{3hlRzXzyvHlRF3exJv# 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
  • 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
    x1a5E11zc2rA&j7)~d>khKQ1^&xcn~^- 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

    %Mf2JDGjp@vDv4*Ss!0wpDDlu}FyA8AzoJZ1X$$ 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%0A7fHz{{c&G}FD4e1I=d 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

    3&EAeJom zkyjIe{iUmtmsiO!mV}WHb;#@8Ynke`&C-Vu#1TQE>hRz^zenDEU_j!o8pk`e}^#D zXP@FwEInj~=fY8+ZZV&$g6?MUl|$69T3_nvIonB%;^9u6SCo&tf|UgTZzl= zKyqql?|d~NAu@*FW1>r8P`=n=Z&^KDn$$_w^;D4BTCM_>t%ckQv*B9<0fEKYv+7qb0JMJ&8U0}QwFh2IKUIVmOZ zSFLFC2gTPFdOdaWwLsXv z`)wb-9w%h0G?|mHZwuK&1bf6YY*`AP!BW)7`xsqJd%Jxg^RFvr1QUs$T-LYs;HxVB z^<0dMp|}a+V7y_D@BM_g&~{pe0IvOeNG3Ns>$gs6nDV>cFt_yCE#B;6+RxG}nO_Yt z1rv~8bHFE6{K{J7!>>=^NRc9|B#S3E!WF+LL-WVD5uR_Y@2>na^>yqO%)hmm3JJ)+ z!QhZ8#%wC};onSA>!q~5%MES=Z@`}7tRnbc{|21;s+B1H(*|V(6m~SI6mmP3DNcn^rGWK=ko0*R#d#3I{ zbb;i6;@j0^!6gS_!`E-PL;P_O&wdxB25H=2gYks|>-0gQcc$e&r(^xK*~59#<1g4_ zKz>gHUsN$N?KK~MuNJep`yC{U&+p%1M|Z#_EQ7!3EN&1PXy4v{Kcb6iU$dn55!ib` zd8EL$pOVMeg+B7=B4+q%a&(fGN8laV-4`>H>r#d>FwixV*}k~va}M2ax6cb?0I4{D zfP9_-KC9w$qgQ+7;cCw+qk@Y@1moB3B z**8cXBw7uj0uro<2^B%=u8Sab$9wx`5hM*&Z4Z96@{iwBS)?HobH2~KDP>sZw{=JU z)y}U&{a9iHaA%{6{K^sg(DO~iZ4AFCy@v%Q@M)=Rw85TSLPlD}C9niV`PLjdlaZ?H zdL+h@c>YzNu$>>f`Z7QAF+-FnKSJ*KX$&#F(&J9#k7|CXq#DA2E}3IU1O-v(in1=5 zGHEq@-@O2e0u;8~XdUH-OsKAu5?)iXt-Dnoi{fkivSej0rAeXGMsXjW%_hnVQ2b@? zzny2VmEyuvRVzhfERH@lnqueYY#G51ID#tjvkYQU#n0{Jf6;uP6viE@lnE6SYM`oM zOj?J$^Qwdq-dnP@ySg{L#A2MS6h^NLnQ>20L>ioNarm`svYlTerQ_w;aTWPB4PsHn zuTt`#;00l`R8@YYCs?m0Sg0yLyb_fB23@^Rg-$PUA@L1|XB5z&80BL&=u zqegme^w(b8Ra2s(y`qHn=XMwKhIX%2YS)18D^Ug(?+QR&p(uzA9=!Wb!6n*A2KBm5 zy;~VK^k;<&i;4lP(W_;2V~8AckmPhgqy@(TB1>?OAp|A?ir#!MsS;VSv=aZ6ng0P? zc!~6Z1qIj?zgUzufb0)C;-8bv{n}wNuwO8A4(JCKgUwX&o|1 zdr5c*UN{GL5ZVfDH>OPn!cA1;bE9vb&x8AyM8t$7B_|vu)_4Fz1cKUR zSrSW7o780`zzaMsy-ON;m>Qy4#%w+gj)sJ45K%!_iQk?WuE6T@K;z^o03CHUBe^#k zHG1^^fCE2gn(vpEi#8xiMhE+M!x3WR}o97P5;pnPv2fV}RHqpKJZ8(SD(Nd(Ocx!Ww>JLvJH1xUU7udsg%ZsPAO}&p$Cuf zYl?ft8a0LcL+LeQjr{Oru4kKMXd`fF0r4~q6kQ=;lOrxQ@N~V9y{yTcc&ZI1Tea5q z1s^Ade+5<}GQ`V-Y=GXuB}2E1rB8(LvHkDmUV?h%UT*wl`R0)!L}}(wfr_9xr4Cn#=>YM|Nj`yi0+zpB=oR8`Dl=+T?LNPZ}xY zMqF^4B2-yKB?%_O0VH$Ehv_h2z*LCqh4p26hmrA3dI##d8t?1|FxgQMfl$AB(I#~wP3LIvUPr&7tvw6-xl7m$fhtdAkg30uC%7KIeeeD|~L(Cd`S?+k|YX zCUfHRaIoO2wa)+W!RNQqS`$s?fzK^nnE&@`&(&kSKV4`Gm^OKQj+91@;6~g%LI`@6 zb>_i+OuHor4qEvwcW@#HJRjL3(~pdU;_99`WL+>S>0q3?Gh&hC&WU@*uVpU5I zR~&ml{0s)8p(H+Uo=Dt@pDsdnmnL)KXQPnqpChd~*WDL{Y=b8Az|WIsv53yso~j3a zzVF1e8BCize%eWgAHFPea5XNu(YvL?8AOX#&cILNLGxm1=xW`mBWP|aR3{SE?;SLo z?+JLGr(Son-Cx{wCJX5v^z;Jac0TB~!tE|?f}FUWBxEZ!nG?51g9TQt<<1tFJ8}EH zw04vx^T6%bXYe#1(4MLXZqE@~iN}-2?O17~neNa7w`)%4!BtS!GcayzNvF^1^r-{4 zS4wv`OLwEO#<}67;w=I?2dW%Y@D|hXfNglSDj~W??V-TiBjlr^(ZwyQ#<)FIskh!L zF>eUFFYq-#d7;nyJN-p7pHn1*+=(t+KwLHk!=sQ?^pqgUiOU_JzlyBACUfHQZfR}) za8p_w9~H%*(Z+(nTH-cdkTy6LY)Kf(1U{~Gi?*5OOdSdOdqZs0s~6`wBj$a-&6W?_bOLjH1SSOn;(Zzz1BLfZ+Qd5Xe!Y;rtjU~s zuMOr@wbpi;fYXWh&!n|ln#=?5AGG0Vj(Jj=^uYV^LfeIDlgIlYX(W{!ardYpANFc% z9^5K&`@|L+euVcS04jA$#S?5^wQS*H{RDUz63&$L(!012snv>pD*cYK_siIWOr_rKf85SKp|To0n4 z=L)&)w8?bpLAj9C(_~IPxB@JjYOVOM0$QgYoGxUSYcdZ#IH4uW{$Dz@_0WSma+vlZ zrcGWCN~Mv3+=!1$diV?)_$Ku4<48IZ5I+1c9($D?~%h(o6MF2 zo)-N=8oyN%m?aCgX}2{G&VAWXcwT=L&t*G> z=2gM-a%ro#4)f_z3>&6H4=lnQd-O*kkJ!6rLtj%)KIa!5`Sp%we!WPBxAUQ3`Y`~l z9q31)W%YdYV+W|90)BgKdY$^QOvutTnNvTmgbr0}lP3A-#~DI)g(maRkG9#2lXcqh z^3ab7^8D@Jm^OL+7$=SV`k>6gsyG7`CfGnif&ScRL})v5hb~8u{+q>9I7lrf?7idl zEOy<~VTn%cUC>R^-CCXi-txeIRMo4Nt0*y=QQNAQ2lqSVCo}mcT6c4eIV;_LSjf+I zk~_~j|5skSJvbFPS`}6QMB2KV+M-itL6)w}7J5I{J>FPwkv-m6B3%!_t^=%F@1VH> zy?ouWQa*Zl5s)ZNdbC7P=+w)Tglv>1bL!=LLbl^hY0c?}%@VR@n#@Blryaqd?xY<> z554@VDbpTcZ!vkj+#-!!%Z-#*c%O~6qsw-W)@k=0y^ z?9-zCr173Sgm_wbto)=Y|HNGjVb`IF(7qWFiMn}@Kzr@s%>Fxw)=mH5?G~>c3Z1MN zC=G4XUQ#gSD@JqVy&jtT4?U&V&Dd)Iy~{@{h4GJNt$g(E6HslXcP)yAuTH&tRmk?= zC1g&$y8t>=t=)XPkU90Pm5}w;WFC5#-Gqg?BrHvO=-mi;R`+hEOPc7+3ES+0tOW`&b%Z$HR@MchAUA9_OEU>fKDC?e3&Cmp;(D z|25)y){%MA+HWRD64AS_q@llP?<?ayh1zYhH0hy#JLM(X z+Dx0g{(UWt+<32a=%IfHh4v{;>$)oBM*9lwwM6T>D!^Ljv2Sfv4uBN4es6c6?$j;% z0*Co*>9hmUV(1ZMI!25i8{kD(x zFg@`8O9pf9aHdTj?>|W+cit_7^T2xp8Qelm>w)*HrQI<^8yN3nrJ)hJQxClN7TR1* z%L6n6D_AbN3GG)pDvohl2S;b5GmjS#RT9DE-~hqo_0rvL^oOhhsa7C~xp%C&eMvUB z#F5@`+AyJ`u#S4Z?(tW*e0%)WO@{Iz4kdtIc14>5dU=Lrr+oBs1E{{z%OmxY;MB|K zg>26l0jpCl&w~zCYuAqwGN)cP6S5wf%tJ35*JB)%Y7f*yFNdZv?d?pPyk1@{jr@0_ z%)vu1M+@yy+@bcUY+h1sbY)#0+~?G8V7>f88v0NV&_gd@725fl)3kq|9zgGwqoqRs&$4SidUrXH zsF^-_i=fP@cc%&2cunTiyZ41`?+9tlsdsaQY>g)K(7PFRSQOo~=jow$J8Ls-ZKh3L z@4l8sZoEV0;GuU1h4v{;8w1tc=p{mR15qWhgyaTTLV8MfU3pOPBC@9PlMMcewjbuQ zsq&GjLjJstpIMttbEC-hd$~6dxtqmFbStf(7K``;?U=b49kumvyO1}wcU{w44>teT zeZ5`M)xO@YOW~;v#i<3*`?Y8+TBB*uh@hw8ONRv7BxB+ymTI+bNwC2>~ucWp5n#@CwKR(D!PShc?haR6I zv^|(Mc|ATs8hJ?v+a7v+j?iw^v<^Lf-}2C4F~a*|%17=WCtb)wij-{yXl{y}NFwS7LU zMb&%C#@x^M&+qR0kr{nI`j7$E!ynKrfd1^Xtcj2Qgn>jM{(~Wc7N`FFS;*#VGN=9= z6tb3sq&27hd?;iGt`ag2{aN(`4{+p-LhGSF&4l(ercGXdj+928(80Ec{+ukd8#Jx! zYLOeg>wBKaBSafmf2K=A_v=nQ^ye=^J6O~50L?%Z+|ofpo2qGJ7Wcu?Mc?r>*4=>e zNFq2N93VIkOLv*n9h|4}UG7yF`(Z>v+ z=MB+tfu5&YcGO4Dp8`{&^!)3qMU9+#e!GyBX)>ptH-!#WYhA98)|`62Q(8M*lX>WQ z#U5^Q^7YcBhn}Ayw7r=&c|C70jl7|QYY#m?PiS{&T2`Z&b@I{OJdu}(RP|iM{BEHguW5OJF?v2$Xq#zThn}zB#naeMjulQLfna>7@8P4t*5RYqr1387 zwfSpxF=$uxbNSV184{Tv*6JFGU)|n&DzVk~mPKGQ`j)Zvy{VErybflT`F57~j_#2h zZ&o4VpUSi!0ndtoqcbXn?moN(TXd&RvR=HbJFZFOh$@tISF3!{)Q+2cAa47UprYZZXFt&e^c&a{w*l*;NSVc;)M7YLZGE|hyRDy5JL^{ zA@Ihb@I~p7qM?pAKLLqQ_5~mP#4{9?HdKB@75U-1Ymq9*zby$i>LWv5?_-1}rQc)f z>vl2br=Twzi$i?LFOIIZ0v;yBpqf)eoiBIb2j+XX`M&QyvG-m79BjU?-wE@*+A=(; zWO!0y4A1%SH1oAk$_HLS?3W&G3O`UvdfWL3GG&$^Y*X*V@&;j9J;Fjrouz53PLQt$ zqlLQXL@;(hF-e0%uo29Wi2VLI)=(Kjel-oBj>^ zA5ZE<^f3eI-&|me(!bRu`*9&`Xf1?WGbU|S3n4yF14}488WGCqosP4sbiN(|fQ5&+ zqd)HC0ewbME20(N;}9+bJk=|uA*yUr(H2(*T~f_+wT$y#O1tCi`069Wco>HffG_vo zUafrj{9ESBdlaV2lPmn%b3SRVxd=GSzV*(tsjz{JyS8_3@12}u-bdXhiJd|mwh>oh zk|@zTd?~N<$MUHbr?n&15{F>NK7^)p+uhBQvB= zzBRHe+pvy=VX3l{@Cr`)t@ZGwioEcu!i+L_mT9P3TWGNfuf8z6Og#d&K|cbv8lSJ3 zO2J#Wo@ysQv$T9M{-h8dh%3lgUl{HMtJ2i@@E2%2J@d^C^u$wfy~2!T&_`+^EPv%& zn}GEP^Pg9;zXguC5w32l@UgW%twP~T!8?hwiq(sGWXW?qJKVH4)4yi^ZN7};~y^9k-o4PZ_Pm_J*b$J=EWpjx*zmlQm=SSg6IFjMe&)$ zuq;n0Th@0zd>)k>t{7H z^>zD~%(qi6LB8R8Xpr3^dv^hZG3+DY?N&=$mzzcy-jAbNOtYn(uLeLn*oMlGsdN-J z6v6i+_?1X5g8Fj{a7U>KDn4*Hm|BAe4*N=TkJy{T%BZ!d97d!sq}RB)!(dUUNJ%Nd z=HTB{&X;Q_KyxY5Tu*B5LKq!6C-qtvgGeKb$&}y=gW*G=^6jZ5+eejDwpa?w3^w&s z;;@kF%FJJf5lOg5dW<<{f7-de9&4^=Y1>%7 zg%`74usyzz!c?`!g6q%n{mM;uLxz-LNr7}((Baz+$)5A7KC+x9pJ%zfJo-y@L6)`J$@u zyN|Tt`8stwJQwQ)Y+|eJleN<3r{9f24S-QQKdGhg#Hph z6$vVV%of;7y!>kOBkb!zBN_UDepQjfiZ7T24Y8d-a=_xw2JUeYiG%xo((ClT+^fm> z-vIXs+Lw8sGk&tOiuIamK#yW?da@hsEq%_%<&a_&Pzkv{2#P^h(JH59+umRhoH zl*&AyJEk@V*{_1Ad73Ri95F1|buyMX4w`e9Gy+q$bd zlaz^T&;+a_xPx#mf~*__ud$WE)TxR4=93L<1q86yxF-|=5n!%&8G0k3N$Vg@QV;#Y z$`mVEjCs^b%eDg7Ra6_UMY&#yYeSjm!^1IqT!i8o&z@k)WBPiYW<#82KzY0ZdnQUA zr6<;qJpT0ocX4r#|9j=(wtm_4BTc3`ArIw&`8v{c>s(?n#+Gqw%;sFl%xcpXnMJv< z43+J}?2)yfw^+!!w?i_tQq-Ax-8}&{8WK;9I<4c8yqJq!Q1jiXD-|w4HXFxveMjb~R&>L^xRYMgiENZvXXTbG$9Bm=q89O5O({Cc zO@0)am>L~V7WzzU|F#;&LCs2PrzM8>JN1Sb`wS5O6b%zE`Tvu9UVFAQ=_UW=OgoKeMJP)Cm>L2vP34u-4)~ zu!GSO&hf!=i^q*a$`RPF3X;)=M}~P4nN^h>>-~vqtlo<@<4yPbEDH`kElQl(Bqcgq zCiLN1!ErJivS&)NyPAu%oH&^zWG9>;WKKQ)RLIJ-*XMzgCFR_6DvsY5C#MPRs!kSd z@;JFr8u>dn;)0WvWjw5_h)PU`n;q{CNU451ZrhJ?v*)?ydOlqSy!K4sjp47Web@ND z`aPJZf_qI9@ZTT@pL1j}4xDg#LC7A`PNN509$d;j z|K|+p*~6^V5!#tdn=D*%qKB4nhpF6%XMy4GgtoJ$jk)8K8yz83wTTL$H5&Jt4QNp$ z!cPv9n}BB;5-2d-R~o%o=Tz}j(THi&YRV}XZk>A6^rH9Sw&#(NJo*Yq#a zWFTE}AOZ0B17?`;J}qUMeDU}kkSIL1KUz@X#N#p{8?L<-CmxUK$*tAWu=T)WJ%Jz06ct!c_F~VX8gCmeVPd*3J)!^6)`$! z4*T?~kX@D|WKKLZ$miDfYA4DA54+!D+A}*ylOA{&BD6oZw`h~c!ysv7C^zD1pZW{! z3{C5>Piq(R6#h(9gfPQ4kqH5#FysG^i{LPGVtl{PmTP}?oaiR;oO76 z34qhCdGI^H=^6NMf1K`xERn+LxIZakSDe;|mK515#|oJfr$dCSpoNfm;I!8wZt{Us zh1LV7Z@Os>P`yP|ao16D(-K@q>q+B>VdK?` zO4Hpp@ac>PP5-V)2DB4*8Vp=2vsR1=%eeX2Igr~^NJ?ueVs{$G#X{Eo7$I{4?r?$c z$J!0_0NmJ8?ztK5lu(H20l078VA=|fGm`~eZnUm+_yRZL;^*HbU5z0sUq7E5vBdH< zbrO&M63f>V$v}5vh#pk_kn6ML-$VrKB7Y(4ew2{8$iEx6_VLj|<|Y5vnYNiuF?h-U zHKwg-i|vX~lFHYB2!6wSO{t8z5XT%)J}F&!=EE|DqfYr8C1g(?DP&Ih+#+P1wHQ6* zv*}gtd4dk@J>;YB1LZPp^7?tLbl89!ana8$3wc=oq1dnn@-=l}&4oRj8p_uk+F|!E zrpkm`;e-O>PmTrd$0Gv44D`bX$;lxSrv$?g#8crTKS?~(e4rnbsd*I|aq0MI6 znP%%Yd8VfDIfZny>lcEchM9 z$M|o5Kl3>tQD#50fe6hBmt{g0(%yj+F2_LTRJFGC2x-j&E_W?p+SbPltp{Abe~D># zaCn|9Tymnjq>%yKh-W;sO=zcRS_iZS3RQoiitA@4ldtJ6jX%>8_!HmHtW!hzntd-a z^Y6!j1i<6aGvRlD$AS27e>@%qBnm-yr7L3BxaTw>Thv&{oOp}~*+qv7nFk(szrZ~| zqC;9<*i-1EK7rAZGwTr9K&Oq)C&`bZsa0+ z4(=heQBCWxPw&j+HlgZco^bF7WDhx%d6_sxJ8n^rXbc zqB%UEt~ek%&&cl%aSbb5{WIs7oLY3gD>UhYl*(FgU3foK!z#pdzu$QT+^@EuN5J3r zqu+nK1oxlubAR=D0e>E4|W#u&d{a@7Q8~F1G_4!KvJW_qW zfIp8?pU>gXx2Vr2^XD7X=VSQu_3Cp2{(PPKeDILf|F!D#xBPju`urJxzFB>KpFiKE zKEKVMZ&aUO;LjJU&yVxxi`3@`e?CopzJot^RiAI*&*!MmSMukx)#nTNa~Jjb9RA!{ zeLk5#pP)V;!=Kxz&kguht^j`8@UcZT#$+k7{e~ z=Zt-l@jdWJ#CNdsp()^7D1*AamY6`J07(Yil#ZOA4bLj)M8BHNw4Y`Pt%nJ`OlW5_ zZL%gXH#%Axxt<$w$x!_72_DwzL{+UBiexhrsE?lVJI%}|m&&kb{VBNo%3#e^@=Mc! zrL(~4Od;D+Uqt6DaC$iSFRHb+DMDrxI5p9*X%^G2)j_BS8hQ)uG^R}!4LQ;CrICY8 zWpEyjTNj~i&mFoT=e5Uq3O`eeaTmm70?X;rcp)|(vmnBG13n0l+!Jkvf9BY)IL)^H zN&j83|A6*kFsz*l5%YAQ=)_kSAv5AhC%#@4vQ@vfBVP~PHxGP`eT;h^p@T{fe0?*M zX*)1&^7#6%H1as5=E07rM=;?GJiai$6b>1gk6_|qv<`S$9S)-7g%B==nUhp1lj~u+ zoi94gwD*%`cq4Fl0p&Rjw&RsNH>HUZIpul1kiD$QobuczWcv@sljpn{-1Dr)(zAy= zj~3d&Oq;ws|0IpPuT%LR_98=QD>bddfi8KJr?8r+YB9EWlL4DaY!Ir+FXYCCk~+05IA$e_D`S#UBO!m0>VhMu$r4w9=q z1w5T~UUsBks;x*(DEtu|(MKDut_wn49xPHr5u17b&UHR!z1>n-zurO5EZ}?wONwIC zj|t5u6v<78g(*jmnd`ke>)Bjo*2_(k@iwf&cwcGH{BL87S07b!lLS^Br9*NMYgl(C zVO3S9o4D+4|F#g7>x*8NIPSqEndj$G&$itu4)B{jq+NnShZS9P#weR^PFW^w(ATyCYlOWK?DW))h7^mNKI0u9)v^?6Y828P`ThJF5qyhsRcTpmcG z4x_0dtp85?W~;}TCG$H4U0TAQCmy&6p2Ea(b7J3VW5yzf8k^R77=+%WXfFa}~{+4>B z@AJB?|Fz8cd(+>TPw(JX1@Xx(|BSh3>nZ^5HpUu0sQ8|)5JzXqQG58dv$Y6%E8+icp zZ)(H0$0?n#ug{l2M(pBH_+TjfW2j^&_}(vX&lv9=9spcrxi&jjoja*A$6~nRC zqM^m|E_!z^&w0^KT+QgrD@IRwx!VtqNAbN_vy%%N?hCeQkmUU~N^1zgP zAWhw|vgGI5J;^XCZE0Hcrx&$+cRg~jfFbfqH?)gRp-Ey`oObOF-VyWp;UI zKg6tGcL;`5MR~7*xhQ$3z|1}Mw&WZp`{YX@v&(x9v_$egzhfCH?h*FagFta%>EQ#e zTIL)orldMVPo=ki1L+Tw$-M|h$qSD8FWFqn}i;@3> zEQ)o%RD=9sHkSOgL3ZkUNf##jWUH6_p(S5^FT~v~(D%GZE?n@t2>jXcso@nR+q+X8 zf<+XqW#;dJ#6fWipn>Xu5KhnM@A4v}K%qg|B~%deu(BYMi#8rLU1|S* zZ|govrc??h%#iw}FcBs7&%x|l)_q%NU#Y(a;PtoeFefX1cFRAXZthnV-N(${c_2Xv zJH44`W5``A$xhxPBBQ!5t#K^0%=Ji*W(ZkdEm8LUlM%i5@Z5rHJK z>a_d|>9j7Al~fG26}7l%GE@Gf6N?_n!vEaMv~M$Q^2x$7X`~G|;+ZUbU1+b+w2ow9 zH=$}pRB@Aq7}rw8?gVbPHj&21?YB6I5hDK60kGW_p3Wi6X4JNJjR!}Y%THdXpQz;( zh^>-5X2mkD$3t;1)#Jf(I+07^f-Ih@h#&WA|J)VNspuwtT{l!`Vs>=$JuJRvIIcui zEEhcILQYvht8}wK%ZcYMLUxx%pcBvig)FMcoOpg4vcRg-y`M>^u6UkQ!jvccB$OU_ zt}C?PQtA|(<>c|a=Wgz>h#Ens7$gpuR-0&))x$_e!33m=mDVD?Rsl%|+DrqV39=-; zqVNX@byS_XTG5ZC-I3I8EQ;R5RG?0yR2fJ{0!77Fu6Q!*r*)DMuEoq}Ks@b%+^Z7p zuunx`PCV@pvi2HwPCV6yOuA}qh9-03=>}=-sZXR+S3Gr`#0`E#X-~gPWN#ER?c+?F zJf7xABWc`-r+s`_XwTNP4*S?#s8WflhBxuH+{Iit|9gwKz7}&)F#tKbLwO~@P&Fhf zgcO`Y@veG-u5Y4#!Os(T&R6fT_~VOmcy~KZ#xsk45)1Ka^$QGhuJP?SKXa04&r8Si zlzzb=JD@#(1$+yI#M1u=aGZecB4jN-6f%#q3crryfnAIP^TA?n^k$(wl4-rLnD0?| zZE*B{X=EGi36ar{!57F=s9w}NM=_Vbuy67Ju&@((095R84j>IzeLO`&ope6# zf5C>YqOmN-Ss2C##8*G?h7`Vv{w-iI@MWIZTRw(+JQ{oS0ZvY|v(SFQnNu&|cvtMZ zSQ>eb8*w>>_pe)dSfh!`bwLK%E(K}AKTr|OICB*O0|scZRRmLLDH^WOg0G}TiXegj zd|?351VTgDT7&mvtXFvebk@OuJ$x`gZEVK9Pk4qIA5WHPti=F5pghaKC$Z$YQDkJu z)5=&M1umu{+oH*w%jK)m+6+zRTnFCRbJ3FxiQ;Xr45F zDJL#{*Foj&T_C@Dh<@cTWIDL1aYN>J9`Ot_ex80ai+6K0INsNTFQT9~OheC!_Y=Xj zRAjp~nG^5Jq_z2)%!&8+!QoJ?EnMr5_lHLDB)`^)NDsW%71|e=HhH|KNF!O)Nc{NO zdSNAg2>suicrGVX(+-sVF3Y7a-b{b2jSPRp_TYFMyqiV8PmA7(x5Yws*S`cIPQ3LO zvd)^!iMK1kJyCeeTO+Nx+SisNSw`dZ4weVr9=VZe&tcl+@it8wnfH|p&DHT79KAWx2gLngaIh2v_pK0MIdQ*O$nMfeb>hCikagB%2JUtAl^g9j zT=1ZGzC0lP)^$ufm}!%T^c&L1`+76M1Jch4ZKbAlK>B#0T1`}OA)SotoF%o^%cpSFe z2ahL$$EL`3YceMumq}~$HJJwGf3USaouiysY!5OZb>ir-`GC+tUf72hGK9u>l88_hq+N1U0epvEfCQ@+P zqZ9Ek0Ii(6HJOY2rM3B*%uD`5c>E3ZCZdNuI!S2P^R83?`AZ|`a3h|f{82)Clcsgp zqrd-|r_hC{YS`5rD&5^qy9#Ljeg_LB`;qSc;>aiL{^G7{m`P{gr~~4(Ex1++fJ>J8 z;B=CZ^(qrGCr*zRvJ_3`fzw7Z{-GaBlO8y|doa(nEz>5C(>tY+zw50ik9G5ApJVy%dkhMj@+ZR=Jf;{UNG&Ik*Prr&MvKhCm0?KogNTAa@ zA}FUkSA&b91aLgtj`ci>nkvX2+BJZZOzYX+2K{82DNEF z3Qwbi%R^x}zhoUjfmhcrs}W zan~uYqlE0`#Xj=t0iK7FSKBvPUdk<0r-i)r5BGrVJBd~vlru=Hyfa8qdj{!WS1@Cm z(k6+kXel@P8*60j{*(K9KlKs&dVlD0o=*OT;Bx*L94aN5*`!Gxa_%T(D@lMv=G4n8 z!1GY8<-U=eoW1QVu8}@=_NU934d<@6b@{v7S?~Ljw)L`;Oke`;WzhX0y3K4{TMWm& z58YTezo``2a0#CH0DZ-akF;KHL4z2*9^54*ph^%BUi^c_5J}B~&*2pXL*Sxbq*wYR z({`?b8-e+uNals%_d^*Q^a1FC@-K4=!W#=)ewwG~VaeJUI&4%5ZnLg|JAbezdt@lQ z2DFh^uAf^#7ON3nW!!*Inc~9MEB1+5Yk%GC{*`Tg+E>H?=(;XA|JH-UrWiAwkn6#} z6NPN)>&WJqXK3+Ic$^2$bg69PSu^jTmiY)Aay-II>$fX^%=KW?CCr~@xOWi{U$1~K zr}#6LChozX3?X~+HRjKlSbPoX+X~;kR$vK*d(s1NusE*?MH;DRRcQAgFcyZZr|_Z* zT)Kn|fb|t!x?B?qXN4kthr^=Yrm$r>;4IP?V3y?#GYgNv$DS6_SU=VIx9?+bIyIkW zx3^OVFdsjBKR6$UgEOf3*p3+F!N+oNwG`Qx|sPk z3-=5H`Xe2LA^R30usqhOFt|L5Z!I*LbDeq>8~{Z&V}Z10gnm|ZaZt!EdIibEV*sOy zHxa$v7Ta=0F#|t-hpAGZ<*aRg=GI8sufZ-yqXMbr41L$ggDQRB6EdS{RQU`v8C5z= zzX2ZBodf-lVTH%z|9ufRdK5J(`vLXnGDc(xc|8p<)r#j1=sj^b8wKkIn&{Z4a@mMi z>GYI8e$4nIO9nr1RdD?50Ut?8y!2&}xYM645V9>A7*71$0;3FP=F3;_1;^ER@VOKcx{-)I)~yX| znd~|Z7$>d{fajrFt9aH2SLaDB4;DKA}?~=P`F16KlvH=1K|L6`PS5ut)ogRTVMqlh!*oAH-o3Y7Yoiz+Db=! zbslsbRB?tr3&Qv+=uX@L3AmmVgQKMc(^G4zb3OS4TpC4o(>x#f-6CYG zo|xa~2!(s_yV`q04QT1H_E+inRsB$S9mG#jBm++7gfbwxT|fGK zFP{4z$h!YlLW<3QIpYa)y-$-d7UIr8K>1XF+oTvjk2va~UwD2=k$o`NM?M?D^H5}M ziOfsC5(s-KJB?3>)=`@YRuH_(I|v3Lf{IBXjLNp{e3oNd*cS1T<6<<)HLY*%>+O#(XR85CoKKx=3Q(KSW?oy}Rb0EU=%R7BZ*ZJOIv%l50OA^O9?_cGEK)ciPP( z^I4Qv!H$TJD67?O>h;bozjU8j&vBltckkd%fstRLGGds548_l14u&(1iqrd^M1fFV z1WJ5t(WQAl2a;1KLEPtGCEFa9zJ{8GpVvXbShO{7m*u4R{qT+f3)jP zJH98%0{Ad)l?3Ed=WWcVb+bMA^ahZ`;gd>R>M|%$55rOa1WVr#ud2E1jpn33{}xQJ z^RJt%%L8zyA|U_v%f9l|Cp`E!2F^^z;UCoZ0<1+Q=3^z1@c!a;jiD}(su{8rbsMrK zE5Q{}49039LyDX=qD&wT1xF~c`cRsEQorZdQ22Y7dRzCJTACuOW)^PXB*HzPdRwo` zwtHxn2N&A|qaT=d7Z#){D>+biT;oXUBORb1mD+0{ZABE0Y0S=Ns^{WJCWN!WZDAqI zp?q&Xnw4;ta#S-*H!Q}~n%YvJEN`@-$h!X=G@WFKu!7db@P(?eavOSG;VoD}YY@!I zr-D}Bu2^G*%#ue1Evcu&@<787n^lh9W=HjKS@kC3zC#t|a1A3<3TPzEA>Og#MNi;1h6mz(;^n&-ND}5^8+|C;3Lhl&i>M*crO8YUN+V)&yVw1p1W`Zp^EbSt8AO+ zJnA9OdN5C4eN>x27bZ}+Dy4Cfg{v%qCseqKb@EM_(yw4*3@ILhFO(EpJtb1ifIs?3 z@jxekDeB7uZt{$|MKIZ1?;7W_9NXa5O%>(1Ot#H0d&EPI-C+aXSB{B!r(#p#wsLYF zs#wiG$x(nSXWAq*5WY|nx*L6LrDxZ{)O;j#*_nw-C^7rF{}#Kx4Tlnk%I}|uTO?JK z)6ud$|H|JzgM60`p<$+TY*{YyCqn)>{8y@7+g|Q%{d0 z$%NLw&NtiTHy?@=D)}wJ4UsC!?+V!+-}8`%{5}Gb|4Y|DncRC|L=0&zhcB%4?{Sgl z2e9GoBh9jo{?c@_mu~*(@SE)N#QKs-p1W`(qKfkTt8B;TO!JUuJ(#DjKK{|xKbg|6 zU}6j@9)d5d^$!+COD8knk3Ld7(B5B)?(3gNedWK`h46=~-j#_T(+2ks0%p_J9E2&- zb(EY3P<|@sj44WW0Kz&a@!l^?b`&7nB0HBdnMhGPdW*EP>V6@RI-m9UH232|wpVv& zuk)G>U7b1(&YNQrsNT3HQ0BGbSd1#SWx&-i3M2Y)QN2f zLE-k=^eGsVQqlMW76qMO!p9*)k;(Jv+lsbO*d#JBH8NJ+WWzHUu7@nZho`%6jbUtWo_VqEWHb$D%I4AzIK4+aXFY#OAZ+Lz6D<>j26R!0A@q3Pt zJv2qyvEz3UkR*lQXQj=8^_Ob+fOl8NYN0S)F=A>_TEX zHF6i4N@wb?5bks|fQJ-hbC@sEG)jS=uA=?upW$1uphfARGGIYr4;lWK>OCVeX_Fbu zb5``mA6Ym}VbLE&r|JuuK>e|!_R(TvW|LvHgWh@X{X{IX~&7f*Mux%vXI$v*a5mq3WqIZZ1<9j zQB&)DWC?AV0uC`rNmdt)CAtIQ^?=y6u^s`~O4H&_w+t%S%LCQ9<}dw@Wpi!VhSnAE zg+lB7sGth1H^U!&(E8`r{%9SRh`oHo^hZ0K#q0faNaY5_>DhaElGE-M;5c!5y6_^b zmva-Rr%5|gN~9e-0AB`@qyRWu+DxTRYYKpWBuBIN9+t-*P-MeIUIbq#&>e}ELV*tJ zYx;ohf5-WQPVy6MA7j?%M@;{+>6o~FfkP-9i`V*6K~6; zo$N`{jva5^p^c>Q)=oNonAUvPh4+HS|KB-|rT=4L41_hvz~sB|g~DVBDyYKbaQLGS zCNIzN$D|H^T;9`&!RK_-f6O_J@i}>BaD1M$ljmA|r{Kzo&*Oz9x9R2G#OHC+&iIMa zjvb#*0!dQ%oGNYpK)!%0KL4+D30nZnWhZpD#s(5yH`g{g2kF>-0X z3RCHRVn%2P+_Zu#imTx@Oyi0o-A^2j`MsF?iR#oQXICI5ScXw6gr69odIqNu2*Z&p zJTJWpGAh=~pA`MVxG2L1Hyt6dm_`TDq@JMTyzFbHCp7F-=6|!l2j_nW(Xy;@KK$<@ zWSIa)mrU?}u>j3^RZz8c6#orxB`=)?kVhw(w`D_qszFDS`yDZl6d4Bs*bV|%VSRsfkzM_mu$-&z%6CSZ-IF5mfRjK9!jpkut_}d zf;8rR)j2^Q`Is*ut~iS}c&3 zF_PSnnSrzY@T3;M(H*Bg(vku8m2l8W%;zI;FDjrNYWp=?+eWwg@VTRq)zb@|$>%-W zxt%PE2*5j1_dJyz@S!;1v)e^!Febq3tPq;36qSBheIXX7*#@R&gT;Ogcn|@+(QCI! z?F97IX_J!iho3a_134{NI%6T-8&o=fd55_=>J}gA{QF%dyZ&||Go|yLv@=|AZ z_e2{AS>9-A$L`LgLsv<;Ge1e2@7{)O#&Ks-WA_8pepRc0`&C6DT+ARf1@3~fWuXWZ z*jHJ9+_?gT$-A`C$lJ`vy<_3OU{{R1jDJSIgD;fpk&R|XxgO`jAAMYpU5CeUJskdT zOnmjEx$3QN#&~LTKa3!twjcc#PcUbc2-s;=ON0+cX}FkpdRp4a21Z%Sq7zSVFXry{ z>hA1#S_Ca6g{Nnw>lyrPAhpFLsOrkzg%YHGVwp$!-6@@3-q3!wG1#KTJ@O=UHph(T2OrIND~0rHP`o|=CIjG= z8wDp$yfqb0Jf|0X6K|)%vOO&TfP+3^;FmXgBTS<>~dv_RGv-om@B zw0Z=*k+8LCpIN%>Ep$5I7&tf!dFjz;DRZI^tOy2Z`oi25XvT~e&^!jzJ|^mdM*g5N zSHFCCZ!=~;(JfwYTWI%Eva=aSBQdKN&~E+t4W9Mz8$_^99KA2hxkkgp#L+j>&fuG+ z9Vd?J2w9gALT1NN3Urkej&@6%Z_rX+Q#gW49K1c_yO|?!1FRWqqQgp!d!1ST`As&! zeF0x6z@?4_CaE>?MEIi*;681TIN;#Ds~Eh+*sCYZsC@mO7-wl12M5GieGyX1^&)sD z&PEH)e%9-niL;HuwEemrJAm3lSH9=OLU5hf((h0P9Q;`#W4o0)ttkMx@5dzPNZlgy zpAUB5uu`80Xg)v17~E3Qygn(;sLJt}#5x%H-<^Wy%!K2NP?6Vk~^2KrsRqEDID*z3dB$ z9(Ch@!u5QBoBz}KJiGtXIg{Kemu)v4^S>)-&#b+=}g^O$cB4j2m&X#rt z4-o=8E*=Gvq;SzjI^9fbT}|Plx*eN!FEO)H!R8tOIukgc0CX}2Ey}7425KM2rdAz) z0J-8P#-DlI^k-5IW88F_0D}mKn>8}We#1rHCLm6Hk(to<8X-6WnE~4eP^`o{aJo#$ zhC9}|Ogvc$$rY%^d5m1DQM@E_^$zKAMw|& zWIru8oBW?=F7&<2<1DLC05ze)T9E2RJvPDt4dADxw>6~x1V7y>>XqS#Bnfh1&C}kYzhz;0<{kyb{+5sgik%_ zfu^QU{+S1L%B_fii*xAaEhUvxF*R6Tkx7+lU^5vK%ymO`F3t`O>7N?HdKW1jFzMV7 z_8qZkc7~ODHurOXy%=E#6*tHm88R{F`^=kChGl+RcWP%l5=V+hG8aR48VA%3f!=XE zGy;$Z?3$+1D25Ek!vEl|8#JNq7rY9Tjk};JTwVnK6N|E{HN6s&oyI;5md0p#pfC)@ zN7lntFc>D^L7Mb6Cg1Ufk-90>9DWD)T4kpezlA*5ezn7@cDStX6 zo_dy@AA=gQWVeIa}AUug3b3F@le8g+optmk&0i%c`z$oMju?U!5 z4ZKnQE53K`=XTD6ppxg~7!j#BZ3#Mgt3h)rZwuS}e6*(4K6=W!h38(m~MpQ%r!89cttqvDNE=@67Ia{w80rs?qK9EDcWD9`%kA=9(( zB>fNc>|Z%B_+&ULG^rA4v)@Q)m(xN+QCr&x-fl=m%V~XHjk?TW1u+MIV zQE;0M?J8b=>ls3gw6-x3OZZY@W3<;ES2Nx4L<1E=)M)Wcjz9Hknm;W~`?*OxzOIiZ2rWa!6m_gY zcIx`kj`Nl_JoZdwKE8+%Z@>toUpe!!=rZIZ-M)n87>UdbFQ#Mn9@-}lHd!+jU~@O_7neK0`CoP6IV zWKoi0EZ>KCx>XPYqXCyy4_3h{FMNsl>y1vd<9Wd$=IalbYzw&lWeX>|U4#rHKNK=P z=*dFqS||%cng5PLb|mo?OHL6fyu$@WOz0W{R#Rxe^}KI|D+ue<6$C2G+Ms@Zcty$f z?h?RbXaGU(9w_6DbsDg)ccd4b=7b}5^s=GDL5K4qUh%CWv{;Tvt{}YOgvUVGZ8_d3e>hhTZ#cQ0ch(O>q4RB)0=2GIlgc(kEw%#^KptCZCh}m4<9E9*-Bz}3?KiHYR&wN zgU9JVF(2O<7@UvzUZ^^XF|5#sk6nc9E@F2KA6@j>diZw@t(uWWa7zY(DE# zZzycJk#Eh=o0PClz@g$e>xAd}+00x&x9{Vb&B9POpuMa3KkR)Ad{o8t|85dO0>}** zV^GAP0YMRo48(>{mv0C3hi&m*stJntyRM-Sa z0#XE2)M_=Ljk`u6ip79P{@-)v&fI(VmCeRJe)iu_C3o&UJC8GG&YahrQ3GFg4&jF~ z-A^WOLhnJ20OSf0Gw%rC%1s5w_Vr+|(RcgR!`k;SGD>-ZLaC6U{|3*%e5T-Gx3 zjIPiJr~)KmuxlC|Q2}{rrv{-ynd1z;*(w|S>BZDw7ic0(pNZVhkFxq>rl^L$Ak{R< z^)y>WIi?p<_tkzS)>FiOm7(@4S~8YphvFX7&zPY<4VtaLAd`n)G zwG195#|NHK+hmN71q@tcoJyR7NS}BCZqx=RppjB)JIbhN9V++)5B9}E3*|zHHkO4VHvRbi zM%#Giekps>s|({Hlm} z5t(yOrT(zJ;1FRiXd+of*bDlpZm;2P&yivr$(+s~T+A_f7oRtcDeqYKvlX99e7Gjk z{3M5uEh>_6<|%RTk*U!35~D2=AH>_@%6y4$>#^y<%D-2H)c8r2PImk%v~uRj@y4&v z^b(^!vmoC16`EdRG$lIz1lhI{R!#oh zA%9x&nHoP?3Xwx!JmYGmHC12uVyMVy~Jo@Fk|i|8$+ETp@@$9rZ2nj_dK)#GBt1KREo*sjNF03bdqRTUVS+`{b6-_kjUDaA)^E}7e*m<9 z`jPC^E$4O-?Itlxc`_>gt@`~;)%t-k$>YE3f8`i*j*El;n-y65U;>Lt&sMcrpg2Lb z`Junbj+{ut>59-1n;%&5H&`|JT52h)8u7b`Bt>erh{^RR4j*%nRhHOHx0Zt!8j=KI50<=4=t-(jU48%n>+l zYj44vmp6OSgP6kYJN`+ z<%QA7<88?!vX&_W;~?Z_1*RRZzzk$a0+CB1w!M2;3eX^LPFtw@|HYZqf78C!nRvG? zs$)4k@8nP9csJO)^F;JI#k;}TA@h4$0u|uyGje;zie{q(pzskOtLH`;0jRBLEUsaA zzUT(Igws0AB~16+uqoEmucPtbVLdGPnfb1qnN8#gOANV?8~FDRLzZjKv-eki7i<|xkkjik3DtomX7Uu5q;93kl~T;Eow?juir zK>ErMN;NGgj1X9{rPWY6M(q8|)}N88KQ7fD=9u==%+_P;k-Z8!?vDYZ?*D2#))K+GA8v6R_`Vs6FOgup$^ zrX;Km9Icx?KAyME&-P8SZ==b#WZ?(mq-cCZFkM*VNu#aL^R4YIRPAjdmsgVOGf!bO zo$=4hPbN}B5*B0m^;2N&hZEu%EJxT297T8mV>tA@;8$-*B%Ds2inRKrB@sa>?FA9% zeUGv7s|OW6UOO>)e6%V)vpri4l=InQPj)JN3{`CVXlC1t4{1LE*%@f7Q?)%TxfUb} zfwnvo>{SI;d;~QL#zb6;NxL1C%w%oejg1X8+TGYCkh{b-TcoXccMboL64Yd>>#B(> zh07Hppjqw?RcKA!=MjPL;uQ2n>gQwCRJ+JFlqCH*)X}&Jsgzi@|9WwI?_NXGiGCzN>u@-J*GB8WoX6vE%oUo<^nJCZqq4G zS0ft2zFb!L=+NmAgkLi_YpTQ^W{FR%J68_FCyg=&@fv445_XYUxv*p;zVMP!YC6%*99-d_B6<1TE(?ZQw^c&4Sc7b(&+^hQY z0(rtL`*COFb8~;p(TG2ByrNbZHF$LMYnZfdy$$)Z^*r+n~Qxn;yev5Wrkpl zkn0_N7VMxqy&xJJSA3UwCmB+)Eq*JeJ!(SBlZxobe)nR%q`P(G@kkPHZGKtHLEiUc z;H{5Z_T5=rA~PQgy}cN3zIi3I>R}Q9PRQ;7YYdnGwq2x4kvEj_fnZ#rhBHRs>GNjM z9qP5aQm|?7r4!>UlhSU3w0GhfGy}16djTtH7e~x9zt+76>7F#y1Yx1KL)@1Jr3JXf z#*SU%f=G=cL3*6BUSi}r@_Z$U*QIyMT9zG(TEzN^q{o#C>?H=PWO^hss-Q<$=W${j zmQgmP`=;s~xUY!N%1JqRpZNzF26!rZ<^ady#=k5gzjjABE}`xwS^(Qyi$&nr)PehXV8gZAb zWn`Z?_$pIi=P+0}y&1wspu1^A7K#hBNJgGye+E4g%HY7>XgTID?>rR#4$GyJaY&Hw zoy-vj%p`XA9gWWPCL4m-2O|!cNqUT7FCEZq=a;wFN(?J03FE43;C6#{Y59WE5z=RKULq*&1Ou_j1JUdu z$6EPq{c4Gk*T^=Mq`op~p{!+QFTyKpn2~vq$`sf{6D%?x&lm+Z$^cutCe#VWAZ4}v&xrHM;O!G~=46xE3 zA5EW`ZpHWD*CeJsB-;n`4J>CP-pbTzgpPH%O~DdLjGe)qugW?M`-zN(kS76>G0(~U zCsIGW)4IRURc-fI{qMZJIN+8en8{Pea(bp1JrXua{l=@nF8}^SEMqhz!WxWJ20S+~ z5qBpWOS_&)G7-lq@kv0wS2xncW|)-?cPFA5*c7u9j?Vq8p(f<$l<}Z3^_%NIwC@*Z zuaYDFl#Cro?iY*il(h`cqy-cMZx<-A;|>tsAQw?6gGz5fa`@DIc6lPSi~UV8l0l{$ zJ1`V?cm>(PENx-|iUnf{E5NuUnQ9y)C~_HdxD2WL30VV-`zd0b*YjA{&x0!^1|BC9 zwgr!!i6>gB5Y*hA@CavvPyj{3FkHzDK_h13+6V?sBTa~GOzy1wuBYMe+t<@QugDQSK%GevFArDAT0ZKQ zG+vHXUD?1!2SrRqvJzaVNt}snhe!)g+%0~x27@6D=?phA_n#Q@>%lPmy|_Y-{37bK z1%Kuq)Un_Dy*p$rPoxt5NHAq3OyuVyMF_m6!>nqE&-3Q!zKKw0Loi4o4v!fKLWSZ+ zjzO7EB;M{xt9@?opJk7KLMDnN$DOCfz4tp}u*`?;9#it8^;2LU1I&f2J8-d)O$5sh zMta)5+F>y+o1t?y1N{)T{;<_U#z>JZ$)^?jX2TRUjzV;?d?*etg58J<-5YhU5lk0* zKeyqd`A-rbE;2bJiI1$?Wi8G7RBm-~4%{p6R{{b&0h(8^%2QIek= z^d+JYZ2DD9{@HuGoqrBjFHSXVsm>(gA<{*pcK4Gg1yHZ0*$40shc0Z8C zj+qy^=YP&!I3FEKgWV&oSdGgd5X19}t6|O?byXp3D9qG3p@`1=DfZ zc+_C<5Oy($h$A4A1a0MA>UOxjEJpvIc-!9pCtjBQUq>o_)c%u{i~m{gWw4J#_!p%F zYz^!q!zbMm4i0OE^wBtt&8G9yBl$~=@oj#~KEBn<<@i25B*yp>rZ?I|lcTqIZu9u` z);nxGFRJlmtMPPR51N0g#LDn*X@M&RCkGy>BD{dpf5Ao$T|#^qjw5(GBS^@sPf?HG zi1~}g?=H3Om-R2n9u6a;Mw0w)$t|*$v3nIGvjmET*kML|N*>T*#HSRf zPCdkS1a&UiP=Mz_0S2OYlawJ~9K^*TU?h7&{V{Rb4tl~ijH^K428G+N&4`hw^Rt;U zrXqGc#iiE$;lUT>NDq)^nn23nPS3d=I$2alt z0UjxEVk$GHe>o~W+3W|umm~X-G}t8ZQ#4=JvUiUfcqD%I&68l4n_yAsX~zo^ZXB!C z%912Q3JrRS5mHE-hB8G6Oi3QB@)6-Yg-9wHbulV`IPe$!Jk=AM?EG}N>hc2_$>XtY zt{nJ_U&q1Y%L?pp6D$fIA9-F@*UoBn=jqJ0E`_obcU_t^sQ6iQ{7v|a9e=x?lU==t zx|$>%)>O(`uKy|y{%%xY@3tziDEPZXb!rW(>7A!T9Plyun!sOtWiu{Wn%I@{aWwm; zo&Wt#V&nj6)Jf_Sc@?sjoEAbD>sN;g&D4>B7tkC?!5X4kyNC66m?P||9uv2ON_i&I z9+Pj~54S%nd)7Z}e4VjBIn?-8Fyjt08N{(a{WCKBcVK_Zx9)G-f2+oyW}n|qjem}; zWd$?l#K%uIr7-)O5ZWUYVzAo?QL^M6rs;3FxNtiZGosy?qaF)a2Sc8>F>V0RTnALtB5x<-Z)0v7_T&Vhc zcRNs+OUzdI$)t3DiqAlEiInVfLxW{q<<;`rH1LoQc=S<(DL% z&AUO?GWZjkD6#&?S=BBAC}pVUjH0w~e}@t9Dc4Kb{($=gYpwkqtNPnZ^%q>-YDbH0 zcbYLJjg*3Rp>LAOcV{kwFk$kINEx8^t4RELt^L{lq#XHe@vEKExTJHZ<3*S zzn*m0sSG(ScDEf(v24BRr)I!k76tY}34?`)Ljx5T6hVK&Phf8U@#I;rl^-r#DlsvP zEd5F1bNO|$mMP6dk6`qj#;0+j%F&c60#nlw!Zr&Og8=xA0+;_99Co;#z1=MQdF-#{ z$iE;Hc9Qs;eXXn|=kJ6+USZ+%cz)IzT1*h0L64Dse>#q8HCKnrPBJ3oXr@VKaxjp} z!ybqV!GTthmfv81GPI8m7xqqWe~TuMc*#yK%`& zno@;@+@L*qz@`0YYz)H6%*V$;;1o&ogW@c5{YJAl^|s0f&5z5GUq=?!B;|uiSIb)J zdHu2@CQ?2K&5~e8Gnq12qDfr=f3MzyFPWjqU*QG!fD|PozWxOlwoB6&x_KhL|lUz>O*!Ba>9GJfG%Uix1za*)m{=tQ?P$OUnQUIap01 z^w7Px@0z3{Ilpv`MFxh&qXLsf8UCb5dPvW(@b~)1Bt2{*i$IcinXT+8b3Z1$u)GV# zL+6D^I+WtBe|}N$BGuym*liHf*p1zjR!R(GcNjyL+PTCgn_QshC8nC2*oq_H>Q;Fy zNA>=3(ySR@EKMOX(fK&xOCzo#{PG#K!=uJeZhKVXe45?*kg)qGnmZ)seCt;K#}w7} zhhz#)s{ege9S^fPS#do%gK2SRkOn*-dWTN2ofM zQXOnAVV`Tl^On4OLD6T7{cZT4?c=@vVL9G!$fCgW%u*NADbpxclBpUlC<9lhN{t(5 zaSoVOOuu(rXRpP+7o-2z|HD4lW$4TKfGC&wGyIjrtsF&yl*ylA=F?jJ#ScK??I4&A9NQ)bzId|k z-J`F3{yFhK-TS@n{vtzrWo$-?wqk4#{4=2^geQbyEw37o2i2%*G5ztU72z#(f;yK! z8y1ZH$g=X%R=qlK$6+mJ5Z&F>t$5VFc}G)Hq3Uh7A4ekC);8VWs|f#XE;+-gt+?4a z_piD;fVytX)rS(;9q*SFeqGVCWYh#_Ww(-1=@or-_d4uJAHjAu{nF4^w_NU6g1sFA z&Fxues$z%k-2JSx0_DSXUr7pr>ON}U((;BmIOzMj`=C>MpjNMLuPpIws3<}+HNAkK zimP<@erH8_X~72F-JYU75U9MS6aYUZfYAhSE&`r@oC$3$(BLZp_eUToh$*g(b)^10ngsP9$I0 zg5(R9#DWVpw>zqkUl7DIbrw__=n=hP_(Wm|oVyFlH3%gIU{Xh+<9FD%kRpk^9<@z4 z)!0NocJDtLW2bYCrL8cF)snPqMf+q!?bRs6Jjkj_@#;sm>i;|_KRGX@7j!F z?>fqi9DI|%?)KIPPs7&|?@n+18Yd7PT=9K-yAgX2djNcGgI2u(A3fUyOm~i(DF{qoOMKGc zCjb-tWJ_^gK=TBtJLuLy`ipM8McqQ{#3f6-Z&3%f)qGDat~C0!7VXgM4{E-n*G~bU zf{Wi$@qT85)$IpC#^{zn;)cp&2#KT&Y1P+*dk`a}PodLMF#KmUl+RG>9e}F%C^QaV zJlizSS@ib<%|lFwF)@8D&)Xn+j{zKozr^!18!MWq@7e?C;5M!LGxPwp5wbMTUs2%S zRh&lM9U*>D*}Y~rK2Haqqu+tkZu73ys!NQTM^lR*GeEI75E_O$Ozw*HH-$MMxF0jY zINWcW(w=nErlWB`ouZPl1YJI;M$vemSQ$j@?M8kOPRm7W7yk=%XD%lgA2B;4YZosL znR(GCPhdjhBqxCHm8bDjQ8CgAY+v1uBGw-A2_W?<&U$iWV0U#~(^$qf135EAKu`(+ zW|T2Gr0I9cZhz35>W+FqZiSBQCyd?UFSRtQ;+$sd(II`#&+2xcfhm zr?LOjD(Csa6vW^EX{|=t|A|Lgb_iazVf#O|VcGwg7e(LyX<-ORS^;Li65s!=yHKlg zMULGWV+9!dzp)PDtN{vIt-$`@jQzirlP~eHaJ2yD!Ej86j8&dZO1UWyl@Y!Ez=ZAI zU1d;p4>ij29g$o97wj`6svd){V#}w!Be*vHmM`g%wk@z_A!UMzWqLN$q~rIMbMY<( zEIS|=ai9kN5l3Y?-lpPht$4eEx3J3bc$i(d78)y0#oKOpyH>pYfcLaY>?;S; zFP>8N~_mK>FEBE?bpd)msVMB;MguZcrb31$sP<$c&_xCC+1QRznE5PZr+ zL94zA3>xk68(L{vbvfP?1VWeKPi+7GS-`sTf2>fF=?i4pO45Fxcbe4V(znpevtd3m z)zrE+3b78LoFC5uh43|oZTr%{8Q5%@LEZ$P77?tu3#_KdI|=_ zxv~&$jm$QgyDDG}+!g%b0CQ_2pF9l~gEPGCpjWn^@m|eZ3WaeBP30UbJ=CjK9;Y!T zNe@fZ45phCZ5%|$CL<@hOo6q_iN+aP!lNaM0AU;c`FX)ZRLAywXb=TxIVLGm^Xvu%MdI#v`^E3Rd6cvfy2X|VDY;}jxi0Oe%@7+Ry?5-U z*e-b<*&3Lgfvs6M+FiW`B~HPl3o^WP%~^q zoDp>z^zyy}Yky0DNjG+i0=r3pwKXcRNa{OJfo(OxBB{?aRQ9dMYE@e#^!IC=l&xW6`Sg`jF*bGKc8;pe=`+U54?k^Ns^wo zoFHjtVZEZ6NDBO&0=wJ_P>0hbeYS3N!idwjr`li`S~!BB}p*1$KoA7D@e|DzGym z_%9_1HTw3t0z1?MlYKL(e}w`&@Ve?-B=z5`z}_*zBB}q`ML6})ye1`}lsjoBS*4VfE2e1DRR z@*4G^-HRN&RN`^ho0uBQ>Jm{JpgnRZrCyw?&$uvZtj1XO^iR$@YkHc{V95^b-Hn@W zpu->`7M!NPfn(O?{fzt%e^w+Z*THPyRD|2#hFA#!cA?3T;f&fnsLIgKf-B+bKC3q@ z8LJ%lr{d7FG=7HJqXwtW$o9$(3}(7i>!gfevugZqCUn-V`VtW`|2C{+Z|0&V>uP z#2cz{R5=_anLA)09>mU)K$-hMidH=WlTJ>AA^2N>ci+QoMH5d!6r%4lF39Je&hS2s zPK#xwdFXcr%7(D>pn4HZaqM@vogN5L7Ox%K%T}I4qjv90uj~OUbT`d&0xChdJD1Z{ zIfKjHRXLN(8JZ_w!1v&CCOjXa+>^^aG*6Bw_u_I-&7+C(AzbdIc``(~H2hI4?Jh0d?=UuYMzfoIh)IeYMysR`7kbL zYo0BloWteAG|vW6KAg)rnx{^bbGdxD=J|^#_v3P|=BXFuBe>j8^Q;l&Be{Hp<{?`q z`rn_+M{1szMfoT$_t!kniSht0AEkMIBg#i}d4T45T$J;;e6;5Il_(G7a-Qb7N0g7@ z@<7eANR*G|@-dpHN|f`te5~fVS(FEHIbZYKB+7%iJV^6gE6T@ld9dcWN|c9i`8dtP zc@o_FhH`m`=9wbCAJ65XnrEUYpTOngH4n#?xc3d?@(G%!SbRT`%fmF!8KOL#%O`4{ zQ$+bBE)Ul{!$f%mmrv3>gG9N2%Of<;08u`f%LSU}a8W*m%O`7|EKxp{%cp3bOi@0K z%cp9d6j2_@<2eRqFl)3QJSY&l+WODq2~Eml+Wby z8Jg!kQ6A0ZGd0gvQ9g^yqczV)Q9hf?XK9}4#FpLr&LNkud;i&$8E^+zPvn>T&(W$+ zhdGfP#3zwi(cO4XXfPh2r+{-f0UOY&H^M!HQkqu1990t^c@}?(i}0o_{M2x-gkA*T z62UK45f{)ryUDZU-j~XKNzpuPgLLmhRn^?f{i#~@t^CxO8u~qeDITP;Tj(h~8vat0 z(?h?smAi-T!6M5^{-$-l22FgBChNJYc?;vpyW9a+2Fjc0|v77u5KLgL}@P?LDb4ZSNK z`h_-&ha*Dk#lw-I*Th5r&>zLaQK9F=!+_9};^FAf!{Q+?bgy_A7+NSEjtTujJRBRU z5D)pGYsJH$(3Rq0aOe{8a9n7Tco-5ICmx1|*i`3kJU(=qcymH%n0Oc#I#xWK7&<~c z3=j1Y4=05(#KVYC`#v6fL1?ddI63sCcsM2WsdzXw^nrLdEwoKMj0|lM52uF$;$c+i z74c9QdQm)_5qd^EoEdstJd6(Aj|b%+ayO=g?&L4~u(drwUM1S=svqE|MueZ+b|p}5 zDoDS~{U!NoJXC^}?-a1+HGqUFO-e9Tsoe~OXVs}`5NnR_q1;G)VV4!&Nu5GzQ z`MprfdN@Q;b6sh{r=fplCJo}6va(^_>Kscqi;#GL>z;Eic>LNV8%0+%j z&MX~L1bgtnBy14}rJheKPA!FdZ48`en&)*?LU9p)#$Wmg`NuTRYxqga@hoouUaLM1 zmE$)Rn+Sv*DxOCGLhiRa;7hxeDa3Ohpn&dF(G|iI)!dVR3l5kjSEWBZS(q3>Q=8&ULX3=CSl#B&z zs6Sp&oK1=MFQteIM82z4shRuYla)sJ7sP&~aRQ6}sjSNDTGiYDzE^ zn$b`THXZW0UjsmNxU}F)Zx9q35@XmCYDRsf-Zw%oFx)PXVTt#h&=Gix@iXPqbmncU z7%HavBf#Mcd4{R7QtwuT6(Tx`2Ik!qnvNe5UY-G%xwv`!;qiW9UbIK7QRr0{N=0Bw zon0>@89q_njO2MC{ZCq^6t76D$0tfjD0@+Xou!nhl;D-B9{slpAe%HZc`bWz4XF+b zh@PQ3beq=)s>2A1KCRuEiQ^oUG8lnns!Hf(!&Rf}eou8Gl}c^Xnabyt%O_aP%ect9 zV1zD;2s#{LkonWB(K~$iG2d~&hG>FAcQ|B57ni1@kxrj_!$9dsN`!ZUl`LoQQ$zv_ zEdTX6n~rq?a3XXp=gSzP(6QzMnsqGFuu6QRS;N9%4!e?-&0#ss!65A!d^>8B6G(y= zhfIy8W<=|ypuJ#QOCVDJ52r71FXgq*nkQ<65hHK?jiQT4`f@7- zg`QVnR{Ba&^#q?*0CxJi93Y*dug$8?tGH2Eh@#P#u;20tX*+%KDR0B>6E!-F&Vkn( z)+5NIbec~^!-B-%^fE4)aRko6S4a=IxK|$C8y;pil1EiJ2^t?&g?kJq;^W)kT8O>Ey~XG$QOkZ((Kbro}{bZucEU_($$5{l3+4^t>__=t{wvt1YJ4JZPH3t zN2q!nOI1B~x|#=&PSI7fs`IvGRA(~#s5*I%>@<9U3DhMHItbT?jMVY#_4S_x{yClXCB{jW(-VhcwSVxWf&@K+)VSYWf!>~;v66nKtVo`IdMGr^Hs{?+Ki(aZFm8A(4*eVh1PS_C zZ1Sy0`kAi4zT)lo$1QSw*(8zj$rCmjI~7P3G}hx8MPqjWTG3c(M>O`;m+@(g^-1PW zYZ9ifhpqBfUWufyy?;!ezMfMk$TI1|N?$_}5-bQudn68h)hVzcK&2688%bZ^DX{x^ z8z!gkf3gVm#z%7WwU65R*Z&6bWRMCgUJvFRh4{4{F5 zU4CjSmUOb2RM;ftr#lrQg61}5r4#4hB&I%lP!T|+hxkzi<^V!t(#cy2>}qZ4*;8lU386K_6~yXYiLBB`RtjP;?MUF6V8MU`~@g!O6edjkpa8OgR1xASu4l>O92F zR_2mB3Q=Cr#&PkG%?w5PqYe2&>iA>DjSBGV$BzmzRQJED!94b`ZC;0=cVb@ah%1VD zoeF3pQCI8F-u@=Q5f@4+^QfD|%()4i<- z#_mZc1zz6N-tHzRe-wih(@AJH?4c&>;r%M~25h6|ySV3{r9M|PCyXDRA$xWb$n`22Fdb=NZ7o5J# zl*+C2c2m8iw++JB-peqy@5n@QMK-nz*+}p$WT|x_7emf>Wk%G$Dy}l)x5lq9mo)?tn`+$&Y-u_f&dX*c7%5a^dd}}*e^MDgJ`MD zTkD&86=kC+^KR1@Y{v26G`d#UHE@d{Ldu^EdIAMHi#e3kpiLt=#a34)0_o}nn}You zSuJoWG-te{u*3v;UbRBPnfKYKZWBHTs=M+bMRniSS*h-k1gNgGDH*CeNu6A)gxM|% z&zrD57S&np3nB8O%KX`3`9#9(3kxWENM@~Eeu^aez0Y)=&QfY6oel9R0*aK!UIlIi zU%Szi@~w3CDC+Sqxr02r0Yv!C%kriDN_Y|JLN>+M&dV~axQ=brdY z*XioH)skSgERI80Gk|tMSN%+Nz)DwR)+9t%b0l4fTM>nSg@S&FuE+%g{|o%kIU=T4 zaJUUbVz@?K@U^YRZLDBw8w3UNU4Xqg!6!uzG4;WfL%oZ8fEU!49^9zLUv;;Q`ubo% zg8F_-f~(jtM+4g2Fex=bN2}DlqmF6;)5~v&uH@6sGr*DZIQ6F8k zQW8>=TM<&^J~{{J75r}Ky$a0A?=D;g{KvOz7`9W3tQMer@W|w@(!e(w3~rh$PtZ?C3WTUvl zFgQVR&y!FqD6R<5CdK_S0p54d_GBn-zB&!K`thg~_t2}cC~gVa&q6mOMsJk=jSjR( zd2NeocP!c!bcQM9gBJGuZ~vF`zkIHa-<7lCYft&MiNA9G7kn-8ezww4g``Cd6$3aI z429=ac0<@;#b9I}dg&FOUSu9>6q$#RD9su+1$*X7M-lQ5?NI)@c=}rSd`wb3T>)e4 zk99t-QHKP#kY0{6Q`QuGF8)gM@dtdhq~JSc1#nNMLC*XX2n$&=@lE&1N6r0ZrTo3> z1fq-jz#LXk{{NZ$d#7Ls;8Q@97y32j-$UL=%8F^tzqb~z;^*Hp&&yhOrf|w!F<44K z{Yjbszlg6rgCxE#fnrYhLc-2)e7)H*zQXk3aI8_(y5z63(WKZ?n@KhO0kK9_c9plK z40|OTb-xx;+BTuPVtd_+os+Xc8aXtLM34wFtZhy*{bM;IxhVbP1Nm}nJy`9wuj0A< zm5B2TD6%Eq=9P4SA+tV$s}2EIz2v$0TowG7_$p2H7ptds{HOC*!vA&nYT=?^J{ymVQoe^y(D(9VWFOM04?imWzCBQm?Rc1#!*{6_ z{FU(A3tuf+R-56_+S2L>;)72~tgeRP%A&QF1=&U<(fCGZXkL(?7mi_{^Z+`~dV%`z4Mu zDS4%-zwFCM>Wc->Ki+)cN6I0e%g!wOa(I)!68Z<>s|Eebo=gn=k>_W^-2yV5O8t1yNnhKqqw%Sm zSHyhzrodc}iDL6?JLpaK#=j+AUM@qk7%_d)z8!P^te)YqN?Z95cGqObSFS?A_g))) ze7?Cj-qyhoF?FzsG+;()260FdmrO*R#Q5~-w$kT{Y{|wBkWa@le|)Nzu6)tG9|MWV zdW01eBkNHX;&z3-U?k6Ee!d4tr|}aOy+mu>I9WM%h;J@#0B9OQL<8r&VgZ75 z-i<{%39SD+t^7Ji+1Fn4*zsfDZPqdUl<$)GNw1{!!T3QwP`Yo3;v7%|1*i^HVC_F6 zFm;U}UBeDA9wgmfum(H=0jk8?&8xy<+_P%ANssP3h<%M-cu)i-PLpg?=9~O}GKopJ zn24iIL_TO6zQ*>E^mI4*w8Gb00&6V|zP%GKH;$I4@zHWe*wOM*1hk5EODVr*z!fJJ z=Z2a8Sy(fPP2w+FzRr8C{A!`ns9bjv{^;f(1X;oJLzcuuGXYe6EKxFZ7NJBK=S2+^ zWNjQ2%T!=*GUgaeCJ%Hfu&+OowJm1p2m$t@Mk96jj0xDj5b8-pX?P1o1Vy9XGe!5} z|Fs64=D{V17tF3q`*v95k_{hol@>O7LGt*>QzK~pslrF(KrwlR7`-r#%tYg!}z1b z=dNNqJ_q!YeDbQ>?f5j-c!x5{hwzVeicg-29|%7AFDc{YK(*!WcU~ zC-jr}%>D)8GdaGg|5c)B_zXf(48FPbeF^puV=@NcT&2J!UBd_m-(+4c`KA#21>fA? z4zZk~e|F}ApnEzYFq3FQp=M2aW{@p314>uQdDB@~Huq@jZUcXJO#LR`D*r#IEUF*g zN_aEZb!X(`z~>SnbM5lKv0!nGhNP7!BekA`AkD`&mv5Bw?n7E`#5HXc*8;<1h6Ec} zkFm3ETZ9#u5E381+HXI+r3>R%3~MgWw9@bX-Q$lYZ)@CJVZi zU@e19dBez%Jj#?een+7_oEdhaxo&z0u_Vm|yHkM;F~JTMU~o1{>E%c$5aJThc>3~1AqE`VDRS380Auiy>PjJnR zo;f~)L+q^y%4_vZARB@+-FI`o>hN#op~GZ85*xa}p6?cfz7}VA54xM>)!gKX0?YZ9 zu0jJ|y=+;UC2%_=LEM@=Dz^O8*Q$RtJ0xC5Q#X^O&n?hJ1gUJllm|-^wLzb`CgEj5 z1r}g0U8cYy>2oJEK>@bd1UnRDiCF@9(kxvLkP}B4N=(YU-bQL&kY8`@m2JEYQ0flS z;~+G{ibM7QrQTV!I*ZC{95jr)7e1cmX4+HZ-oIz{&R>}(ao$MUD&zczi#{87l`ugP zx5ot{w5(M?^>#yCEAjCiWnlYX{W~ruyFxL=h6=iFZ@su~580IIy1jGN*Wcl*a17CP zd*Y_jLHw1j+wQ)zm8z0?+2NmzN!O@(Zqk@{Pa;wd(n-N*H!Lm zC-zCcqpR`NoF8#rN^HhjGqEWW2OqS2>81clMRnRUWSR zAskcvywWk%*71Fn*7X@(CpqI(yG+o7heC<)t7iZ6=zzB6|4=@fc~EYYcR<|_zqYjH zdr1dZurYuD&&p*D}_t7h=WAkaX zzB^v8ca5;m*Db0;Tgc1v-#1@3@0T<3Ce--w`I@f2zRXI#eZJ1(uQXrx&mBt~*ze+Zwrr_|TBtAQ_$>o)~f4}YbJ z`zyZMC$0_V7ik64UI~zDqXbs#`iehaeO3GOsr~;yUqQ#Wa=yqv6Fy%%_sXw2TT|={ zZ5@B5`8pn7)qFwMbOiOPIP+!1_k9oVo$meu`L=#W7H@g0>q4tlaJlMVJvky1u?oh? zyK*HW7KOgt<|6uIs|NC5TD<2U1LOzr4hy%S$i3S+4>5UQVPA9x|ExOu-6V8d_!%)n z!2|dp4x$}16{GNeOjqc1$4mcW4;^7|ckiP+bVmE>4jq^GbC4e+Xffue+B!d3ib4jHc=7^tIv)uB$;BKS-=z{3wl@o0fGXo#Q z#CR`O6LUSr6lY>CN1ph26Jv?Dm-AuWk)#(QW2jw%nE#FJ<2_e(eO`|D%i02EG3MpB z0O?@e(7c?V#in=cikO!RGKBlUNS{DKVQ{78tF=>K;tjZ)&M{0e#WgHo(uq*Y6bv(! zZ=7z1TfmNn5EWdCc2%s{E48wwtKmF(zHI`Z!Ur*djg!>`{{HT`6Zk|Z{scy@r)cvx z>NxxS)qE{6zL^}4U0he!_+)JkJ;wZf29W!dP- z@1xH;oWH4tgfUr%ctMwpe8KyblnUhu$iA@b<aCdE!xTR4X z+a?b-Sg_&3rnDAD0_J_>XoPQ|opXp&f&tuA=bH#lEN{0f2|MzQ+wH(0t|ChVeByBS}~?q7X5bss*PsJGrdP1UI(#JTnECWQ|j ze3H(r!WK`v^ZWSVtv}z}40BWPI_w(!etqys%$__xK5wEgjW1;=&D^!hQ3by#4#OSg zZgb-16kJV}Qh654289LN=o%~B0fPMsdGOB7qRR%&jlB4>;>*_>exrhIsL6nAd7Eyx zs!a0)DqqJ_T4gRO%ciQ>*3Xv*(J|1L7s}jUpnBXc^gS*aqT7Xf0f?)~KZNMb!)_zRk*xa;91IFAKM9(Jw(j=CNet7UT;Q!YEs?dxIv zZJk~ZU#rF+24fQIfmgg(50pU)t}NQ)34U2v785xei-gw$>ZGiG!O6;be#uX$ z`(0iSR|17%GDd+pS=Pe_d{FD*CnSs0I$0mQ4+#9xt_ROR`+E2^D6#YT{{RC?tcNkT z&@{ze55Jx-8|hXgfTOO5`HFHUFy%&B4}XSRzLWdIPSyBgmOK7M`va{i><>ioUEU+k z`Ap)k^b*2fm)FDupi!)ed@v}>njrkDH9`A_u_k^2B&s!WUI%+bA(-`PiR}@%G0Cz& zyr=dDV*RoAhvo71hx@TV+?(+JP%*&19^U@D#LQnwuT5e-oIFpEcpQ1@UO18k`u{On z07qR9vlQi?&6FEuJv=kF)9YcIYJ7evHJ-?NFn5S3@)C(v|5};pq)#ROPMbnQ=<<3v z8)y_0k_`rBSr3F?wH|2yFxJD*fy5u>ddNP~z8==?l$hCg5k{ZHdN_u>^6~eFJKz`= z=>L160FJsIrYXuD&XgNvJ^Ttj?oRFxb*k}MW2kXj4|aKpWhKZ=@dEB*%Sy&2+nI=7 zG=!yj5SE%DEPV|N#8rm%0a-trad&nrvA&W;%L@#NQw? z8FYO;3%37o5XtP%WnR- z^3n}A$VT27N%P5s9;r|3igE`qk30oar$F+1qiEKc zst*@6IjT~DS&k{34l|nod-)UvX1`8sK59Dgpb>T$aV_TnA{&a5wcl_MdB~3WZBhsA zsH^Noxn6blPp1>%km-nZ&5O}RVJ!RrjFw-n3pT|!7QXxz84DRLQQaukcyBWE+Rvx; zv(8-lTM~(1kp9aSUPNniX1()~8W;wkH873QvD$9>jEi#8@X!mkg4uZ0vkx?O-`M=K zXgOB&KaoOk-EAk#>)W2czN&wo6Qoo^KOe|p?0V+S7;`JCj*)Sglz+?lku{D<$fH!R z=y8qXLX=ln%2%Ph%u=3-@`IN0ER+{o%GcmN+&PqZ)#%rCD9^BzuSa>ZrHnC#&b5?p zLirR+`B;>XRpo;AP>v{gz>jF$i1ZGns_$zY$DzCjt})sEV3a?xlo2i)ddpHi2IaMu z^0g@c(New|<=9rF;X*lP%?+qkOKVJQ?LvEaeMO zKGsq`8RbJQWu$ovrCQ2oqP&Na+#2{l1LaRFlSusy>#NkI*Vl@gzqn|{KCW^oIBrivyuQH<0aS1S@(8)MzM4?wo zhZEgwIYl`Fr^wvOI2o93Y^CH#KmahG(84*vakD5_8deRZ4;AOLupANLwjnIbZDynI z-lzFXKspU;<<*#obg%P`LyS5F#`jsU!{O+Sm3lOsV0_tXBOYM>CbuI@f^a(`Uuon~ zFWinA@_8k>-<$o56!g{@?Y%hwwpgvqMOZ7f#`)fSfqK$4@rLcYVn72l4&& zKHL2NRnAxr>CIjATV1(W)~25rYyNRW1E&!FYvx~Jqe{6Gd{(+o$^S`N6 z^B>RmHKd1KR-g8soVnhlxpz@6>7mX!6k*gc<&w2`%0~O0pup^M3FSBLKrRtVXd-TE z5+xAg@k6_*rR4G_HJts!X|9#z@)!mo=6c|1G}r868Vu+-bN%hc_>zkm01}ZuF^u0o zYhCYE+a<~emvnue|A2uBe&2SSnm{Fgl6!{b&+`;H6bw~h_Ib|00U9ySd&NyPry4ia zG-oboc0m4g`AT7IxK->9Wixc_4)fIRFwe3(bT9TTA-RI^PuGcf(T&L0l(- zLn9mDT?3=fY{Zo$#lE6w`v7@AOScyLbR3oXTK7(ky#X|G+q;9k)bMu>v(d%<_#o&a zljL$i7f%4Eap>aX#`tt$i9eC+Ka3vkveLusx8)4xkY3!yb$^Un0rPqPx9cN{9?n!? z15L8A(?c6TeysFxK>7B!9dDxtHwG=}VIQ$gK@ax;Iu1R&S>G`|sQk%clu!sYL}iLw zu|ZNoFH*`Ap#-~v!`j=@@v@ej!Kg*3UcG274q{En;0W(elwj>lD9UisW00el!y#kA z^37N<+w}$%3&w}PC>)F(;wGk1@f{c^ zYZ-a0>USi*_rXLU@O?B3!X4AM_4*i&b%gXFV;x}wH)0(-Cghja%a+%lsXCYpVod=f zHa%PMJ6AQli5gB4zvYlV1>&|3RNarn?;~(}3$QgTIsWVLJ8_+C`KM>74t5d0VfI5Z zL@}pEmLwUgHtN7q#j3SFj$q9u*^SGn8;M{$j^2I^;t~Wp1LlStDaW}L*wsg?vD^3U zBE%*5m!!a!5$$F!wj)9)fE|%d<1Qo^L>`AS@|m`C8jDPQ#+%T*bD^|n21I0F%mLPOh^2cjY4fu*BXTtSi&9IpnRhgDDg;mvt{a4SBD9eW%}wqnPodLxj7qZwCUhL)%UFPuG@X2l(H-&yN4wRS({#9wdqXS;cZ3AHh5vQ*L@vvBw4$ zum0`$FIpq}J%v=;;JOPXznS2dl_VZ#B=e^g0IdD1r|@oTo;E z!=)s>Ivg+^2z~ZeQW-Ae~XzDEU+Up=TL=_ z_M?D8lR+-W2f-i*lYA-|(vPQ(+HBK56HS=sszw$4J%s-PC%L^O1Lk9K(Z$#hH&w)C#-fXaf6>oR3dmkz?7#HWyzRzv}NC)}`&F$nY5sEVp zX5%sP6dQDn%|h3pLn=zqsE-=OPl^Wof)tuYipDFfXxsrsqZx|E=8hDNebE#R)_90T zv#x=PQ-V7bVqVF?*v)-(7RD*|QI-$IJ~{``arV(a{UQE7Dw(GA7fX9_H2t&YOFKP` zS}mvMBT~S-NDrT1D{CtS;9hA3%kGbzGdqzB3;Aa>Oe=B^q^4|^2Y`@Lh(!}4o>RP<1* zM*I*sqJ=-`7^k3z)wzluCIdPSJv{JYg7jcJKephD42YecfbP90zg+ja@@KicCHb>m zc$!~Pqz(1tS3%g&hTfgOg#SK}zm)$zp1+*`KAj)nzc1u(;lF>%Z{okN<+tLm?!R>s zPRUKfEq=Q9-13UldV1%{FCr=0e^LIZhLZeISpdY}(Ie;wXuL@Gm*h{PCp|dvutr3D z&6$Q6i<)oVoQ%BXx9Yg-6KCaG+b0+43vQj{NOL&m&eeU_PD9q9S$e~{lTeKVf6I-( z)A(=omlZSXOYy-sd6HheP4oN%U2yqsomS=z71!X|QCje+t8k~b@DF%)dFxzWYy<7V z%~uB6U8yrLf-ha(8RZqd%6w4VcDcOYwol5^7px=fm3V_P8wQU5;S;LTece~nz}j&< z5dAOnHlW*@XCk%g-HGh2!K;22z|d};MV|qU>dy109Y<(FTQm;(Iq>E3-a1XI9*iGS z-%+*bZt+UO2laT-1jJea%jHxXO-)>_qS`m3Y0nP&`Fnfy9dV=4GPXI6!wl~~L*buyaX85RGJ_1lRP=!OzcjCvlmb<)@Cl%Lscbrdk zO`jI}DGZTI2t%l;Wv3AzL*>v0d{O1y!Dq`cYcrbM0T9gONv;_I%yMV|!vKrG)Cr(T zV5`i#E_5MYo92p{OBNhV1tn^p>)cMup2{NgL$c6 zq~l-5S`ps`DE{&(-Yqzog6GPQT)uH5Y65c~b*`>j@u(3WsKe~&4iv#8T-2!hv;Tq` z9Qx3WW&Z3fTAvhp{hromOcp%^@sQ`!+w{VE@AwgwNJBUeezM~pb*_AG!lO<(?ine% zyKV^J$27sM)lGM{!n91qR=sem)~6_|@by2#N>|o^R+5}o?hnoDY8u(hF88PEc$!qq zY$y8T@-0&Hx|(JYaSZ0X7S6F`I7^kdP7mhVW46B&B}Y2%eh85ujw8x4>8IkmR56l zlu<4!zm3bfQJ&j7li7Yy>t$j=ZkVx6R^;?Mq+fw}f`%?NU4jYWOXo9pUE^?M;8?w}f`%Eur1g7)CA1rF z8SO9eTS9v}{xi_t^m~3wXgA&x+5<1}TSB|>me9Tw%Mw2$w9{LOcItuJGYF${{%4Icc$*2omJ*;Nh_;u zNzwhY(#rhjIrYMCb^pAqV(tEbUf5cs-Ctjv(W-g=K)-PB%g`1+OHbZ|dhMVTO?QweumI9dvrNic@g_tq=l|e^!QeJ_$+(Q;KWQb%%FiTE*eMi5Z1D z(o@gsg^&0xWLSL2aCt-eP`JmNQ_7rgxcsM{Ua;YO@B6y59`b!{D24gy%wp|^Ug^5K z)(M$0JAI~hL+wm$X5CEfgT|TK$N1Y)TdWOD14JOJtZ>6TxZ~f~-8&8xI~&Ui-+<2M zhnV~l+AEs@dG^$MeZ33O!whe4U?i>BuRF^Mzt%kW06?Fy!2rx8ZhFr!3bclFxckXsvo zCLwvyFUZo_GpV1;`dPIj@1_4M%7lgYo3{0f4dWGhDKD;Uw5~sG!!9Z zkDJP>=!piiAZljff9()>La7n7<3uO3w4qa5XKHV+!@|LzH|BkU%Cx?rGWX5{=NE37 zscW|f&-0JIPxIV`hIRkAv<70C4(LB~Z$&YqVO*LlUyE|DhH*Rq`aT`ytcGzs1}dM2 za(2Tw9s-rIK*!}ajLVk4KLO?b4dZfU`AC%W8phFWpWI$gl=B@%GKSsWH>60(0$`U8GUuv-4aKM8E*w+pS z0*e6{+Hb3IL`=Yd9k57uw(0Kq=we^p2Tlskf(#H_tMEZH^INTtc27Fk{8C>>Hdd$7w zIrmimk~@GndK~JXw1@r<^e-7@yvi|a>A%+8pR^S@+AHbat={c{&r`O9+|5q+*G~6W z&Y88rRQFD&dxvvSJJ!9w*M!=(RCmzn&%RH8Sf8;CzDL*$w%~?}@;~G`{bN#LB`d3| zZA-D%O?HDBb8(r<#IOmh^={?+aNi2Lo1B(k(0FkzoIlO5Z!{V|t<|e1Wx%eqb_v|X zBV7Kmqjdl6Bg*_00a!V{tvC)rla#&v7~Ma%t)&m!E8IaW0+1M9_tXo);p!_}3Ic0& z?ez_=q4k`eP^lh1~`^jSj zV+{I%%RcJ#!gniMYN#$T->#uBsO?X!-I=~e*IwI@xp8luv+`r#gb@rwz1TXh=N=+H zA&+>siVvStuk^Q?^kYl5k3wJEt-?-&!^tbm*#$lgd|CQ80qeiMNc0bU18GUj{?!AW zVg0Ko6ahh^f14Rcg}(7-2fv!vV-E&n^zSRtKgOEq-`BSO1;n@u_O`qz>`G%WpJPT@ z`Zpf^t26tT1pdzG0{&$Gwi*44zMl6MWej0@#LZI$fdvPz#f;87t;CmtK*RKT!%BRa z#qND+^Nv+~i+I@3R+m4!4tX+h@;CTW9?Tp#pB^CG6(KBf_4st~pMrpA!~8GK^=DU= zIO!U>G(C0deB$QS+bZ7C&m7-2=S^SQUDbix>(M}pwkR777k?YT`OkK(npKZAWkg-Y zz6*zFo*F#4_or&rBx!*+B4hx(#rd_bFSvtN{R#o@9n%wAx4X@`isVAAqz*$!(W-xn z8cVA;Xw^T#1Aux|X`Ty+m$Y?T)r|mMb?7+vJ1sO8AH=>*@^pQ3q+@D;tqNOXGIJEj*NPsZb( zwZIOBU4ZA(>Okd*RVG#{imAfUwhGZ!Wiex-@^JbsRe2TqK(8?FOQ<_-DFQ(lH^3{l zQZ0vs)sj-N3TssvqtMTp+T4I%L-GRsr}bI%HvZ^d@u!AVY5EWEKNWw{FnK7^wBpaH z;!i&Q;5SVG(QAgGKy@`NB3OEYtkf;-sHX^ov>UyqA6}+02vrb-SdUL+Xwhp(vZ4PP z7UdehMl;{w1t7@JV(UHTM{nR1bO4~oP4pN4!!66Yf6Wp+dAI29&)SBz`4`i`3IesE zRACa|qd%{CoGn*37O<0|IgG*j8(=1r%%J~^@z4c7zM(r|+)%7)uS zksGeRQ^zQYxqI+ObbEehntBz$p~FG9N)GNesx!YoQglY*sJ|%6t{x?d+*P5+0Tu5Z z(Fs(v065f&1tI$9>s!68ay&~Vyvt{=r%~%e>x>nr`+IHmT`;6#DlL}_l?;+aEAD*V zhh#yu!Tux!80()R$DP>7qqAKW8ft?_;|IhxL7%h~YfyJZCjBy{;)OkH%|=>UmiQm+ z4P5e`1kkwy791owvLeU-;B>rq@6Vif$jU=Vm)Cx?bq=iAtbuj8F}+9i_*O>e_nHY{$HL&W3+FeJ@>v$->to< zIsZ-0%FDbV_m1xu?4#AAd0wY_3J+?Fo(4Z~`HmGW6gQ+jKx?Yy@reG;8*b|>+sZ8c zSOWQA&fm(s-;{0rqRjbCOJc|{i4(us6TR^55ol7a5oJ-jGX8D zGOY7_31B!Igya{I^%jKFPhQk|e{Z9ofmH9SkP0H}+lUU>`q`IY?**(uPhs@?Z8$tp zPU!NO@Q+|av(-N&YJU#{m`U$Lsm`8J``Z$Z*HKaH`whlQH$7^7gGk)4;+N;P%Iw|=QR|ABQ2``PdDO+-eV0t0I}KRIt~9Dd^R9_zi9*-0wuCi)h9LGi3Gz7U09 zwUoxGA4VI=ueN}AJ6-ub306KanaT?itbArNmA_q*7+U@g8t*h(<|SD9b;kF|-_)Oyy+>R({XEBqsEW z;>3D>NHUe*n_%Ui{v(N=pPXRjGm@$Noub6h()ZgWdOknF%J18oMCC^&Sow#^RKEJ0 z#L)6mGL>JEVC8$0nb5QZE3ZtZ^534F7+OXrgO>3LR{kn_ZrIa(cfb(V)XnGWo&l{f zlmc7Pyc~VT7`C*#Z|k0s0R>Q75%8xK+08kSAILuK-B?D+AYcJcor;^nbKPz273so` z=U+ey2nE1eTZ6KJk<#V_IU|c4zK$8<50e|)d{_H#9Gk_Do zm;I|ESpUgaz+M8l2>c~?9MhJTgYF~yo zl^MPpdeJ2s&(pyT|7BSSZ|wzJc!tYAdabMQyNcs=_w8AZN*HLz=C&MWn(R1~&^^Bm zHI$LpU~T1>q(;K$_9gvHhtEFPw)atob3HUz0?|Anw5Pjo&44<(iyr-xv&{O+3g6Ye zZ&j>?NgF=-TiP5IR8M6MVhB9FfN4as_9~mP-GAMzgBCYdneSrqnAG|7Ecd?LxfA`R zDHzyZ)Lw>w*AW;yh3diyk_{Wf7R^%!HMq=uTmC3VrA}XpTKdZPJ2yfjc|0c}Orf$h z^bkO6G94LCI1Th~w_s97JKgWV6d>$5uah3~_cwRfd&>V)J14VR}U_C4Fe^`Tp!iea3jqgo<1(_PMrX6&H@rs_b6uz9rjP zQ7J7e@RIn7cum0`Q*17%8;Xq;H4`u8lA2iTFXkn6L9uU)bpcHQkX%4xqAZ}Zc>y`t zGGrlGX$-2JvrH@}1CMGw`93w)(*^8w8(i$a?+#k0FfJWY?7x85Q=j4mp+?{lMrcI+ zo&G~EsF;Q^xVk7A;pazUjnYN7{Q}?q)!lT!y))e%NZ(tV1;hT{^?9o(*sQY0-t|Rn z%&y1+^}wKQ((B&!RjZ(2Ix3sLt;MNl2iy89-={)~V-?w|D>oHvqax`2S9P^JQ(Im$ ze?4=Fdw)+x>FowTB>!JQpu|766;}1sxu4_d4Ss6E(<6Awn7h5izpxTGLLq%FVm*YX zmx*X-t6@eg^QR#rMA49nKJ;UF^b8+qi7&k%fLG3nC52P7xaHdxV)VCnFPxaIJrP*z zo0?k?fQhozuor>@cZWxyNL#VDSSt$%XQ#Geo3>&Daj)zt@Nw!7`?K$|_&C$p$7$Fb zzjo4Z;UN`2LS6o}DgNxmR55;2qUnMEN7}i-M^W92KMM;ah@Du`riv2VwHI1yNw2nS zmAXSVunQZ+5-%|x50R(8(02NWH zB379-BB+-nqLTmjch1c2Cg6Sj`Dk|LoHOV7JHOxW{9eZiDzs=);f!pwbqGF0tBd-w zG@c!Yx^SEIQP5CnNpd0@x$@o*h}+UuCo>km6u|vHGF?AW(WTF{(e6-9_|pW=b_$B7~*r!T4FL1xIxT2-mrdy6~SAH z$-846?~Dw;W7_*xH~967zB1e)_z`1*B>Q+q`N{F)ITT~7O8*uW~NtvCIf- zqgv-hn*MqIDPU+ZjW`;&|B7wIBFpa?>IKfNMD6~B$^F=+YAg4 zvpYyl+$9B?_z49}d*=*JL$#${Xoi%^e9?o$z`65%;SXU$SGU+Ujk-mw- zwJ0V7lAPYkTg=!LQS$ei^mb$YBWfCq_5aQ<5E86O_r;xH$xJ7>-bk;PX>F_tCK}_= zzY7&roShx#SvYJ>Ox_;PUf6Fsi=QkHUqd(RsUE{BW8FJE^mkGvn%$>>Q?vC^rP_7o zqS^fw2};FzFAs62HU^=Mcf2@iM(UC>l$YP)+rF77c25O4j!+hVQ6tfg8CT|mYE)== z%cQrB3&h;wDf)=griV4}7DeytND%mN)W%Vy%ZItYks|yiZb_NPd1gAsG6^NQcbGEp z7TEl_32Te0ncQf0)>r{vj%Me+XQB)-G9qb}evD2XX9wOZgQXv%a-XLk z@7sefzHrhWY(hri_n?bs=|S#M=F(66H!pGHdg;~^ya^kS{wi(BiltwrdC}dc7fFif z;l)#_Zzjs?bdu7!xb%wtjn4g;Y7>oD2j^zTJ;zriwUeK@3_vM0`?^Y#tIXDyDrHnu z)hLT9z}fGOEnq$`6L+lsQtUfQ zlb?;WzEUZlQT16AR8YPLGp&uP(h8~S_-N}Nr3fv7(EtSISe5%XDW{T-kR-4voSic+ zkQ*&jUX_kDem$t_k1gw)M!TQY?QWBHli$w?45bE9;Lnj>iU*v4hvLg7!(ZUe8 z&P|sTHR9f%6_!0js=~P?%&5%NsN6eLNC99~;9?{NBzQGI3Fk;-bCAB5stezypytDlyDcRcA<#D?Q=pB_9Sskl!utpW=c$<%EoB*7Lk^Us5 zWaLKrEmCzY?l9 zBH&`;e2AW48xReZ#wYhe z67jQaxGcN)Il3qQaj8Kz-`PM=HuzXHAha|{1$ti~T%5KdO;KT07J*#q}%z~z?Kcd5Z zGs{YaaL(4WK^{M+s1E0!f_o$+?omZXZ+?ayHJpqloMj#vee^^!`czq|k$H(Vh&R@S z3Xn6oM?p+(51>~#zdj_(nH%T#Q_)MIEA+Blx>i%@OH}$ej=P?uw!reYOx+n(9$?u(_^&2hgXPpV7 zfmz>5Sc~2NsrGtC^l*AzbLY?!5Ew`vhP1U>x!ym>n>AKJW#(rJXMh3^NZ*Z3)d7{B z{x+}5Ym|+?C_ul~->fjzK4bmY1wVDX1Qd>#>qO51D5kU~%WA~ocROFPPmT0XX`c%{ z6$v#GZZ0k#3rlvPd~9qQ>DPUB?@xt)hf|UPoWLrLRO2~;Rl1ec{x2rlFM|tn43j7N92(S<3`TQk?b)a!DViB+?@@%aAy^yv+5U%3) zy?y!IA-ykWkg3w?s*&$1gLqF3VjG`Hzem&WQC`2#@%lX~H;H~{4yi+dG1txAPvQ3+ z#;yOOVOa5@Lon8s1A94BYIdrjXWIC6TCP>5Z0Kl(>KkjjD4IJ>%KO{=Fd71x=U{FH zbtT}r=Vm7;Zm@Q8*JV!hIjDMjY4WRTcxLNWbS9uGrPxpNUAGPvXb1b6jA!u#_djYN0T!88Iy96 zbq0*@h^*B+Zw;5X4u9t`TtGJLxBvcK7?mAUZcTbu ztb10Bve@m-ipa0^Q4DRH(%TdEtXT4suxiOkNIQutJ1bH+zem!2$b(^Y{V;U zoh5}olHP8eD>)Y+%WNk2d4x#>M{ZBPNCMSd5kV>vNxxy8N}`1nqn%Q-kf6)D_eGY$ z%1nXA#GUw5M!{3bY-e1D6OW|c9!-}!P2t7yDksjov%!2J3xNeo*yLY#7isA)hj&M_Og6smbp=T zWba?{^AU3%E9FpTZ|#3B=6q=I+Y#tg)EU{k-GguEOuHu!WJPdKpi~)hAbCi7WwJ#J zOCa4!KIOzGoUb}EGl=Q>)|s1@!0FY}^j#rbzaRcPO>|SuFpiV)-{JCaMM5c>aDAv0FB=r^z{O z$T(!1Df-Z7Qtun=o2hEr1QvP(7LrUy%QP_#`KvcYNXiE9tz@nW(7`&TULPT@*x&K% zD_&cH)70xD@sTU!%l^g0zXMp@J9RxvoS7{huTI38aaw1=-f(z-5bRZSulpT!$v;eR zH|QtWY;LS_W?^L)!B)QAI!Dh>cce}ijI2<<4!&FM$y^@)IjS!BmwUASNXD1QUWQZR zPHRrgS=-82Qr)G1NvZRIw3cw%1|+pHRvLH4Z43Wi5?7wt`#Fuzi&Iy9ET$WD8HZZ0 z)NiHl_?dNd&rm(H&KLRq>^k&jD>B>FD7t5;z9x55D*2+u7ykDkNIHw>hX>z8{H>2V za~l%QwZsK(7bt#maFFGxbrwx!iOk6zQF|MNC3ZK)_FEcgd~P;zW)OZ~Efx&KVq`O2 z=EI=hk|dV}j&K$>X;?DD^D00@T{9f(Oq50Qrs|!WIuH@JN$2Z9FjPA?Qk0Y&$L*QT zAqdEvhKr{Byk%93k^W~=D=Gr3E6};DD6vkH>6O%JF?-$$8LTs}4r%n5lv;*>9jo*9 zi$7i|{96ArQpuW!dv_AQgk|p5i`m87=|2VaJPS$kKzk;j?L@aWsd*C22j1MExT>Q4 zF8dS6h-EGI=nz~}1JaE-H?>$3z%|rius1L4jyVqszKY3aY~ev>TID=FJV(QeAcn%u zM!XO&YWyVhUf~P+!bF$i1mxV@QXsOUtn-F;<)I;6QSd37SM}$~m@_n6_eUa3<6ps? z?KLvD^8@}bqSBd_Bx#HtNZuf*Rm~n)sROJuD%rsH1S_>$S2`{AZO6MPjcA=U{%q{x z8Ku_5Dj#p-;(^bmXXR2M7hnMb|^XNl?{{e+eiV>b@zqh}17*7E)f>0*9HgwNiEH6|eKV2J~ zx%I6tKbgucO}#yF`3waec=`PD_sO|JUe+f+`^%v9iJ?R`bOMpJPRrvX5WDJUF})?F z#96&KH}9WzBcOyHME5lHMZo)``({q6wAh-<#hf@d^>0T}3k-!16(9D!`7virX%+Xs zyyc$qv1LHts#0~Xj@i$f_GY*L{AC2_4S)m9)Vut2E;_I0YICu)3k5+;!W6Uc4NBxv z$BS8rf`t~F;pIuJk^YS2XJdo90T!|MOzA&;hAj%@3tH$)cG|m>uZWhrNX_8mwQ!g9 zaw7XR_$YK3@0y$7cwm@I5{>V~I}VPVldYRxA{vYpAB`h|nxvqtZ^jrR7U5e58)dET zHs!ocziS$@^8?Xvr*+p1Cpx`3-vcB4P4ctVBcjAUZ`?Kcnb_UY0NUBk7=N=CI^Z*| z+u+n~ZH99T6j5~aJgC86iH5t3%vb5vumR|OlE5RxeqB4a;?L&Z8Ima`W-M|Ol+CLXw5Q{XzHa zx0mV{?;5RBc#k^C2D1%C?O=(TsHlB_kYGZPH?#>`y@3E?L4Hd_RE0&s2z;zb8YfAs zv5J`aUOc;|JeEybq7M-Z1NZM|w+}iC7CXuMT6;hy5TVlkXmd%8ovX3;OWSSRDOYZ` ziQ>2XL23ITsc=&ntKz;qxw(Y+Uow;-YhU8bZ4qTE7&&88kgZb0_ZXQZX%d>g1Sa?^ zl0Vb()>9vy)+y*jSgCO)Tqy7<+>!7_F{d8fv(HFRRA1JIs|gKuI?w&piYlN5k&NnL zRlY%UfS}Jt*+-ol7YqL0;KFMnH!w0!Qo^ZO9Ijq$WCW!t5oFAMR*7j3y6$e2@~_10 z--Kl0DQ|YCL;mU~oUfL+zn9w7lEkvLO^K{1p|aJ@5<8G(_1Dw=_#~!YMSd%ze+;7 z$^5F|2+U@b{_>{hSHI`ycNoCGrY2b(&j9)7c{`sG9iPshh>>|hrnnf|J?t~}8BDCN=1p4l~6PNJ<1Ts0|_5K>~CiX3vFHwrvgVP0`QP%J_T_~-Q{+v8+mekDW zdGujj39t^k@1Cn+{iBk_{$OFA^|D^{vPvZjnL<(4RxeAyKxr)sU;Wz4+C>)q$#ZAb zaA$qdt}j<=x6L?8XoTOP@w%~?eV1$#J0m+p!}+Jb#r7a@ovb%|gAFprlEr4!n`Agc zYKF#kH97Nw4hZuFjx=y-mzJDbQppLXE;NpHmn|ic7E9;FvZ*wm^IN@gp8G?ffwirS zIT`7|5F97_$f<5FI&YgO+KaJZ*9IRBhE40w&yi_ORxyB_1u2BcNTWjDmMun}0$6`~ zf?7FiwUiN6nu4=oYjCxy$J+ScPuEBrK7k?0d@y^2w zVEJJUzBWO_!#_#Z&_&OD+PHA9z`3N|q440;sflS)zh< zsvBb28{i%eX6GrU3CkS!Q)fW5g1|`~%P)$M!Pg4+@x;aVgtTTBnVCLb15oct5-awHl+*E0@fp8ZzbK5k7EiD0Z_II z^4RCD{ozq;F6lt5yOXTJ*zNfuuo4 z^X%fN*+%7CccAToXKF9TBl4Go&Y-)P@unrA`d)1NFlG{>M1ZgtYr}it6B4?!XDOHsKizem2Xw+z7^94!R7qV zG^3PO6y#WiUVDkpBvo@1E$W3P_uo-@bs-jfWyq2N-ueBb2+Fs{vXMX{bHvD4l#q3l zP3m4jbHZrdehsOqTk4nU{CKuzFp+VM%q)_DWn=vX@>RPtf2H{tOEUPDX*{x}CUeL{ z`~->f`G#!lxJZ=Owouw}TIsz%sUpRYgHYxu5B^N%c;>E$qGPxxTGMe&W6q;;jDDz+ zVpZFtlV4T5VL3^{^ND>GDw35kgK3zI@5Tx{W1AIb!6h??itzO zr&0rzYpf{q@;AVYDX_P?yGoWxpkKw5E9wJcRuo9k*<#^KYN1EXo6e9H?Zfkg0jzNU zc7F4am7J1VRzTRjr*Cj>S?rcxsQ@t}Rm=tfpDtC=`@`-``cgC?|M)O`U`ARf zLhfAt`1nlVIeQD!@w$88-A4zJ1Q^DnJ?3K*W%O@OG$%h@6MoOQP3#|m2AbM8xKxHM zNKBf{{fBI`JbKIDk5kxK_0Ekgslk;-x`QwJg-~&pSjCSszqxI&l?PE47!Pz{;%N79 zKAp?vZzef^FiifF`Ye!yviZxNa6&y|YYgMM%R05~=6c~`jP%d>j>fD?`$*dpJdfzE zt``xAoUMYX?pCAbhL;udy{xPWz$xqrjiT)sR z$^IE04=v%2=Vqsj0As?DzBgIq-_wrA%2YsCaa2wd?|o^W_{% z#lxDElh7h^Jlbre=kj7Ys}{Qpyzi#_3DJeSnYzWGWH-#C83q|wl3C*I1OsF* zgkG{v^|E9i02WcFk*!^X-Gulfd63CK4W)aK-b>rkrL@Qo6|t78K3&rcS$Y=@?*RD; z=jVbWo%v0Qh794;Ou(qA2&~*IRxc~*ouv3(WZ5Ck=P<;D^ZD&TpvIFcNpNu;cRXS5 zA0m24)0{Wk>+19>iJ0a@W@R?1wa7x)Btn~EFx)+NK)oK6@5#fkrZawChgDXK;Y4PF zs$&&BlDKu8$=wIf?Hi0|lg+S`A*@&HLX|{)3q>%xg+Yng&7sIvg0~0UFMgyCL(_z~ zH4xO>FC*;HEOHX?n;WGy6+ZE2YRag+Ag@GuV5BANZf#~e2vmtVjm%k!Er^CHkshp< z4)ag8B>}yoG~&#GWlo1SNGjB1p0bKJl~{ArSXGpb4qf>|)IP?EClQ+DUe(ad5jSV5 zIR;vX^LA&GAyXy1ootkU`S#I4(ZO6VumMmg%e(w}21wY%#w~H@zp~T^0wqBZbd!)S z`3OgG@mdpC)+zY5+~jQ51ZHA5^BA!RdMn*`#x$4Yo`j>`B$Fk8W+M@kD$&NxX%bO# zrNY(%d;UDB36aL4M)XY&(h{La)V4y4zc5eF$3x@!RCk7Xm?t$~cCCn3p7%aD>^^qO zvXU!3NWLbQrW1t~`yF3HPXK^uXsX1_00t@;Ks|HB1l^U=`rW z&7rW`Z=OQM$fTeqMZ!BvUS|$vPa8<{nW{RTMINNr7NL-445yP^gwj*5P0I_5z5yt= zt*YNl*Rc@gB`+4L=f%mS$tWDHjm!*5t!YsH3s}W9^=*a?t#hj3~v2_4Wml63zi%|LCM6kn(IvIG}02IfU^PKByF4v1c0pTv>aRU zgVTl}%2u-F)8tFKGR-D<`g1xURVKSJBan^;l8>6HRS>q@zATsre(zt~R;U(;U68zQ zgV`SqsYy!SRX9h;k<1BzpqSqGUdzJMGFG~)VX7^f=C&@pdN=h~ow|}ezJ#5&iq_@<93@l!z zNGX0p@~b%WK)d49A7mqyoPV5dE3p&f5%kjl%9#X4EL9+;&>1O&K3z=m{Dj>0A$LJk zm|sX_o5h;0j^_pLqh~iG5hdbYEwZedW>vReZO5ypqz;Ve-!*bU1L_T@?x`la6P4~z zv)mnWi9EL*kgg~-fXKEY!lsJJRXHe|hS~Dve#2gyaoRMUD{z32BgbV{ZFW}k@HWkn zS4g7_`04+;RV`5~v`WQ(v*s5VV1mZLT6uL9(R(@-SbzK{7fam&Fz#(qW$;7I_;v3i>9BYr29G1O6i>%h8Ub@DyPZmyfa6VNJ?hM=DR>3!Bwd(5CfmD+rHnO3Ll>HtUm$s@f2E1F+bl-ZqR0XC`44IT%`aV%0I=irjr`W!6g(vmNC z+Gr-RV2{H}%w;9kP$YHB;#1H_@zlGsz`sbZ)Tv9uqdy6pb|i@3h9V(QX-96RkgjC>ppL4pPYCyCP-a`&++`NBGnOM6;k zj&nByaZdZkGgTXFa8Zs2!*heyIB}r!T?g99I**Dwy1~s4MTEt^DUukg#`G#GG|U1M5 z1Vaf$MGF5LQU%R7b22MBK^vJnC?)u&g>G|nOv|g&9I_&Kp#nv`BGN39G3EJ+tE6OV zP5pTM{!|@4Q(>wqu4qx_b)5F9)O((rSlr#z_7Y123i%K@suX-QeM-3m={ zYsVl3hVtXL%ej?`QUkaSDE%_En6_Kh2V?XCs}N_gQ92x~wbjAa>{hBNz9@;7b%E%n z$|Frri`pwgm$*$M1V_DAYJx<$zw4Pnd^Y9(8vBU<7_)Q!qunV_vN9_di8fN{W7J+n zf=aTG%ouw#;!e3jC-x=Va^;GUDP?*MR?oVsf zeB^pb61^5250hYBw|WLsV9ierR2Z27^2|1oga;q4HU zax~O^k$htFHgRyC{TD$GN(*?U+SBArS^@t_Bsn2 zQm>8>vWL-}{bt^jA-PFoyNkcB;%w*Xdm;WME4g)qNVQS}E3FC%LBF|FD4?>K$d||e z+M}76F}>$zCkcevUDlJ%g1lvm)<@hJlEd47Xo8zM_Hm3WgQ3)`ld%srzSGrvuU;1q z>pICHCMepjJF^^gpIWsTN+EVhP7>RX!+IEQ+Fe?bX~&uqZutvj`uk-_p=&8L9nSJn zYrKSTF*5CPv?(!a_9_{^xiuIH38p~WX4v2DaVPN?-?;QtC8dEynbry7uoT-{ zX|^@V*?0{H6QwFsMhl36l+Z~olW@;HD%jjJ<^$EcwOog=y0=8wv(Du6&J``;g)5SKF22l4?sP6&5uV$U+)lYB z=dz}RGlzNZM6>x)&X72%mHjEs0#=H#=!nKbpy zxN~{IMPqzt>SlBUcXmpT(qE$xp%~U_k`eJXfKcuzf$t??_-%5&ab^^`S!g>moKKo- zvR4L_CtdGEZ{AF&6l+5?I;CxI@Lh{y`dgBvM2$eKoZMd%-nsgg+Qv>i=9OWB6CE4G z3UYz4@SL^Aj;ooxvo_FyjrWe`-qWtzkO*&Qa}fchqm*J7i0p@%RdS-gC!8_rxLfN) zrXn|Q_ic0k>|7NM*GE?pq-Qe$q5Qq1=1sBlmr7I#`>4{-x*u<|M6QEsI{D$=O5y<_ z$gaYv28qn;?vHE>twQpF7zS$b@N3EaQl;9ZUah7AyPWhxugk)Q%&yf-{?&MV1XPPH~VOKv-#uaApeEu^8O)%vQYP{>_&Dua<<`e1X9Gp{~%Y>vf@uS|a1 z7oFHxVvBo?f;ugsG%{bO-%iB0YHQ?8HS$Rsh=}xZlaUcUC3x6xY|2h0Ma+DbWDdWg zhBeY3=LJ=)$SaM^IlSbxoaMZ5dh>*X&kO1O(!kB4;7T6_uSpF`&ZmTY=(D{%@fwx9 zILJOHfj%}k3-$SmlamSigGk$xt_V8%6e<3}Netecg(ui1jw9Jzs7IlQBl~8)7}LDt zzOf%_TV5`Gf0hw&vXxWjFv@OZHj#%N3S4MGSf01#xQ|R_%dyhP+$GNiiPqXeopOjM z<`+gJn+w8LjFj;Q@0ZE376_$jNo2peQXLnA*4a*`m3m}NMpz$kYFC=!M5x(Fi~QZ2 zyNCW&6raQ-gVgC2wLVfPIDvwTs@fG-WL{ISZ@XC4oBX?c)$A--X?IlZ6kOLnnC#)4 z-y$<+h`e1nBkYVhmvksh;r?LfQt9ch`9{hWU>0BcLAt3s?0tAihwJP?;Kit#quG`b zLrRPAN_Cp4ZSg?n}mNJ9b8T?vE44QA|O;KX|j=j?Eg2lEP zlWQM>D2wg)3%bV-eo=^YO1{!ak9o-Rht6HCq!&hy&Ka=Fz0Dtm534#A?7VHHg}KYE z_tTMydUM3o^r#CbRCzsbr0rCOQ5)pGwnX;dBBL2=-2x&x%;(CfcERHIQ8^g4y|#h& z6WJz2s%W<=P(7A&VKwJb*a==HmGCD*N-!i6!OE7s((wHRkB1FqoL;K5`%0MdZa8R+PuG8|4dk<2|}D zcouYQVpG&z-QZQf#QU8m1EcP8X)ETnwZ1wcot#Aaq`-Qt#d(RWuWoVI{zSDBqZPEE zx|KiBiW1pc|Hu!q^v;xXc7==$rI{}Cy7aDXvrM^?mdRNGXi)s7=wM|Y{IcI>ihBR# z-M5EjGo094@D&V#h(<5C^Z#&kuulvdj!_wAi&cj@T+eZ-ngbs}p1PW9?4xGKd#9VJ zmkpwvP!9UgaU5s&S4LXP_{Pl66<0Cs$tPbqbzMyz$4*ZjFi`XDZi;c`O4i!lO#go9%?QL?6$SanMHIM<`qN#P^(dFw>@C+LS6#uU6s5H|BQFYa6t z;=VnM=N)!UOR4)WZwhKk?os5caJ`(*XI9rE$72wt{giTd+hS&G-eDw(t|Is1QPw{} zFK)AFq_*);)gcUEdV9x<+&5bTZ?q*4u5K`HTkyVp_?YU0k(MC*FwU2RqrFYZ%{)bT zT9SMycNQ6H|B3y9ObKWUNiak>(h_r~Y!hC{+_h8$`Qx~f3<-K^FnPMOfLL%s$Ueg7 z`h3S=a+j;h0V z@v?Ms{}ut{M641=(82~Ak2-2xkAhz=I3WGfm}A78sVqHOB$KNXN5t%}m*TPK%4qmK zBEQ{{0r?UC#;v$xm&yyHLN38o!1B+#HBVI&-j=*CUnuHaRw25_F=`qjC2Y{GAhwIP z{AfbkeEY4hwBHfHyV6Ew@id#IvZ@DZi%ujKU^y}Bs(So{j#n#&W>>20;twXBkTUgz zlxbBxRlB?<`j<~)UfAyAzYxn#>4`a4!y4}+s$KYoQfmr8UEpKGEv3x9jqrX1+;j4< z0`E#S%gT?`-dnYcd5t>tOr$zIYgRdGKQD*pf+SENn`!}%$zA( z(?|>Suzkt_g@oNDM`*6-0>N{VMietfjFQsZqzw0F3ZS|#-JtE4gr$Uo7gQ*?cD#~8 ziqgLV#t0ez^E&v*gOm9f+=uU#JMb?@2kWo$&))tRH2ksw%HuYbY_80+{R-dV-*t@u z4DoKLb*#7Uv5RX;t;?LN%i%Z6v-1b-1?7{km=JR=SHN{i%r1{ze0ixAk>gI(zN{j* zMG?e^C!2PE^t7nA+H=zxg{ru=r1yID@AS zLLou4&IQUnx;N(Qq`b^-3=Q`UhEb8Kb!wAFE;~LNC{_| zGJiftg8e}!gA`VsFfzyp7_90D5u$j>$*ENL_pPotvfm|fL>Mi-zf;e>_pynWv5~r@)$vGVXV$|7LE%qEM5J9RA<0mIF5!}rK4)Qu|L%!79pGy=u;)uSMDpX zYhL@uaDQTh*APV1Vr1^;6`swxA@4&Zd?a>oL#*;HCr#7m@PkjX{(hhv$nWf=j1H%UI-FZDS(mYV55qu7QtznGzS*aQgoniQ(i5b5k=9 z=A#yWjf_Cc5c`6I?u6I$$TmwBsuVVmHa$4#2D~g`mQg4APDRCjTJE7K+OkZfL~j}8 zqn?@jLsTCJ-Irg$+6l{n3KpvZ;LvJMPH`wh6M>_c{s*~g6ALK&;HIT~>jsZ4%iHw| z{&tp?y7R73&PH&i?6zW3%epBm%Hzp$23|DTR)Z9+I<$zJHGLM{qeJLJBVK1E{#x%I zo$hOBJu3;63*2NYR&A+eN3lucDJOh0h0}CXbVmFMB=0`yB3f;F0fn{AFW^#Md}q3A z)bsEKj7e&BGYe>eFIYS|6kc45+~xuv{3VoyQ~~W2T?r=<_I!|mn44s6^$O=ElAyC!7mA-1B;uqJAn(jxtko>jK)i4%xJRACc+}NWZU{ z;naQdT{=&vGWm|5pIkTL9#F(^H79_sw{f0*wEa~1s2 z^NbV(6?k^>9=w4?MsarosJVG>#?+JfP5?7wydmi|%IB69~RD@T_e0&Dvgy3)R`W2Ie zIuQawlXK1HL_k4#KIbw%{$DUUTi{_T=!P&l)T1d;5uYQ>(0#qn7I--g4=`>{q%=1D z-l?r6$twEwKURkjN~CLp%<^E5Oq;v{&&8hG)0}GnX|N8!VXU75I*T>_8Cs9U26(8{ zL1SR7KZ9hbqP;JB^I)uhAJF+kO%-81Um9sDt#{QS6qfMPdcSMrB0)mOvIDZSwWq~r zct&iNB+3Q61|WE;9~5SWlAmmhtZxo|DtXaxETJQqoXfdjJgai1Fuera(|X*2aq!Ut zr&wn&xM{wWQh7fqdybh)ex)Kkym$##G6C6*;+b=^vG#*JPZuSWjy!3s{g@=|Q3=oR zce->u`7i8t&vbCB=&+8JawtM7DZ;Ttq2zo4W5j3ZDP4fE;c@6PNYmWBb?w^llE@1*PgOrIokAy_R zq*V2jc%W-JId@6_QUf;`DRCA^4Sdde%J}B}e2{W)5E=K{vq@IbYQZK(`c!!nIfP#R z+%(<`K&$ux`w4|I|5KC)oXhm7RV2C1aw3{4<~je~Ehp%a0-jMjw?H$MD7WQw&Sl8( zmF4ceoPgC?-YKuYl9N-ggis1I>YZ=Md5^>1zLHy z~SEtaZF8ughCu64fFG7{hc~p>iSMu+RcD@`&iKk00V#7UA0|9dYOC zY4CtXT7U+Ju}{OUhzp2kEdr@fMqaXys>K0L+YwCHej}r(JN1|wIx&hmlWr_ z``Ncbonp>^Ory0};|^rvPsE(Em=k9e;+Wfr;->9w(P3FAux?i<(+PH5yy0gg8EHY9 z>R56T`vAnnC{>4w-^wwMK`aHx8kk;%wwj!UQv+rAc{5IR;&`10-R;}sfKBgx8=~67 z>#3dU^pQzYKuKw2&h-2kx4jCm<(}q`oO|cjw;dCU0waBz)Ou{Gm5_T5XGvUBB{YUJ zxQKiuiiGBiS+k=&bc<7ETbYlnq?}^)%*TY4>zyp|+DD;y?XEE%IA|IV9Of5qnb6C^ zGjO6iq_{)wiH`-Ib83UW#g_Cf9{8J#*P~^gXSzhK$opN3W1&-1;!`^y?0P0lI$x$b zFJ=sK9AkG}=Q)$CmQUs*RY$nlDIg=ayb4FE5Qm-!ZY!P&10i!if2A+r%(fg)5!Pwl z862&d5QRnHfIITm)KLa3jwSDYL^GrpdhfS>RNKIXcvr|efsG=E7-$^^J_9rjc2m)! zRTrEakSlM@V-<;rfOVnH5*78Ztng+dvqQ$A`1W?5oCSIL`tRj6?{Fz5miLh2%hx&A zlRL~$akV7gfHH`!>nXZ_uzjfnSx`xI#Y@dd>J2Ns)NU{JdQ!clEl!O%HEE}C3~7On zl1&*|b^Es)`LR``4fjW{EW=FlMbr50lhHs<&W~WKsdlG$Wdz>Q2)#VF9dl3*|7v+G zyJ1i65UI-FZvA#;!QMziP~=?EpY$s1%2AMkxa2re4Q^%=fY6YfMq$l zLFVpHwkgX_@!Z;(51W@9rx~@rnlSMwu!_#ot9p9nPp+O>p@83zPCc$>SipyQig2Br`*4RKb%o;a zsNnP@2HhX~o)$jbrlyeoVf-mep;n}N$ZFhEv>L|CbTF5bD2zV;VLl>T^-;A?9|Jl{ za+foA1^VP0QD#WZNr+T$on%(ZK}K%x-{7KM&@sE`8(w!1W1VCZ)RF7l&J?Y>GO73Meb9SRr7hW&AOaS*{qjM)PVC( z-unysJ#z)`GJuo!GpuqsSNwAQ$!1A2xlJiVDxZkPW}@6NqsY6o;! zg+Hs3GTSG?e;#TyPnIXR@ismta|lA)vH4^O?cXKU!+f}n)fm6^gUWoL9JR**G-0m< zu`K|x)ncgcBQ_Bs3_)zMYz@IHuFYZ1IDfo+JxOCi1Xm9#R463Z{_bA>vL|D<-i72M ztEeNf#7(`p3`>|qsNCHBcd&)p?;0=Wj%uV)dDWG<-}VcbM`efLrx&T@=ru}oaFwE! zqOK;Xi{FU+YIF$Vm}HzrGx8^jOZWAf3yR1is7N>>vinY$R*$!bb(kFn-wb zNy1P?q(7C;ym9U)9`mM0CA*7}nV9()m00!D?(A&cdnJS?6qY3UaM1Q2Y z%;jv_zUmtSv$HEHcEu7SE%vph^O-1=R=}ryP?^DpuR8k{Fg?er;ds7ESik5ZQ zS1hqFYs&qgPaTfaGUO8X2Wt6zjER`uwI3;ey}Nf*?=I9gLgp0ICJWr{c2FG%q>8jk-3Y?9?g0k0=^lMqVoFZb$w)}k{1 zZ;0$dz8$u)zTQ#1g?vt75vi&N1Pp)*3AD3`hVlineKbR$BBbcuFwd>bGY607-c_U} zQsOLcvUe(=I4)|TOSM4kcI7NSuk4N702XBm@6W4uS{jg_Rcf~#tyY`7C)T(Jll>m7 z?9_Y>5^i*1U2YX$>2>T+wF=lMoAN5?peFagJ}PrB%FB04n=3DN50;--DmkDEtvegktpMEhGL}@HdETvHRf)4a95mDfjD? z%vU7^U7QG!zo>Fgh=eg)C1Vuf+s}u+ay~c{DXEp_g~VEEo!))Eyr-inutyJDB@uePlI7s#8aD_y?I}c$k<;XpxR6Q z2C3d^bh8?YRA@S(JjoQ+KY>n|b?)b0`o9y2Yxc={zHRP)nN`j0Wo{%g%qLVgbhnVV zO~w7{Nd9zv%Nsx!5sjWWA{(U;#j25X?TF9BE#yU2qAV^@Qn{h0@}t`b>GmOTghN$hunUq-XYJkc?G?xDlHDomrc$66@)qr^q0Sq-#E#A zg-zoIl8NN({Mh~y*1_-yZP!DnhUG3%f$@0_IgGtZ6UzdJ=;%x6A6LxJrt^^YDY z40|~C^7&}Js6~AA0{1$IH$*!(6A&u!%7T}OI%lNCPc?On2eH2t4<@+-q=G==SmSQN zq}!StNgqmvVjEk@=U;2=qp2RjGO6}fj4~0#R3NnV=sr^G)(UvR*!0Q~h%{Fl52Oka z#*y((?^ExU$=@m4`_`B$8bdvFRI2Im(ELY-%1 zirF_yOa|IyskFLf&sZ_^HZuPvRf+~8Z+kcegM}n=PoPrVK}6)GPHadxIz{Zad>dU5de(*+eDtK%m|>|ly+F@@6bXQyn}^EO+@xjwbE0_^)!a0pFzvTuk`)P*CdJh%Z#eA>^V9U( zpA2qz5`XT(jNJY@wPAOo>RI8{WBnWvWJV*$k*II*fXMxsa)Ot!n8&)Dsa!{;vFyU8 zs_nf7a3VpIQ=O$zZWTPo`J6qFmo_F}ZaYY4OTw#4lh2y=HnXoCoU@$jObpIz8{4_* zXiJk+7TBt8Y_b=THw0D9CPCuZ8<_}CYT3;&@@>MA=l+qDjUsjFeXOwg=#NJ%BBHp` z9!&?`(qD3*!DpF+rhLtzaSHP8o~AV6&*#@mj>x}zP(sab;P%){tg(_d!B1Nv4i^`! zpL0`s*ZTP@3>D`|3QS6gHl#z%M^wJ9ZUJ!Na&JJTc+ma!{qNuE9j)?JQNwqvSJez} z`wkI_>*k&Nc%%n++{>?3>34vqtZF=UH|fAZMBmFO`P`B?hy{GMIvTTwWP>04d?Rxy ztE9_Rx2T{TL*~=h-z6GfT`(WX^dYrmc-VlWCx`+x5jfzCE!y5nKj!(v_@GF8&eCB2 z7J3+?CpS>e1jqT|(|xL6(F{-F18v+7CjO8!QDdrk6Z;Cg?z3jaNx zu!7$Znq_^67nlJ_-#=U3F1UbfI*JixWP_! zKl^j7R1^J_smUyHt3vt>>lcZ2bS7`=&c%4g;qhkb;K;bBO|<};$8x6yakR%=LHJfz znCe2c7l2!@N-EjOn*vHt%!Aagg-WKm=kL%*P`PMGxI*Na%(sX{FTO|jO>T2kpNhIR z9@soLJKl|BE}r4O+O<%$_40`i(B}3}? zNTViy8N-J2>AvKrwndcpJ{L47`gJ}Y?vmd6m%xzp|KIjY-?x1gg-0%k7}EZ@R=;^o z?__L^GPci9QIQ|#$@(P_%!R9|{Ub$wseCFka|?Yo6?lWekS*mIrzEaZy~Ooo{eI_YSA}v^piAE*-bdNNqJR&kzbCHInArE z7#jt-6^F<(EPMfl`sW1awp*#Es0yn?V(@eM-LimmEV)*sBfe~5{7&U>qmWlDyLzSc z_s!Y5zr}7dM&>_Zcr=E>BIY13KElR?LQYO%!adEIYxx*jE9!2nROf?daZ$_97x( zxxZ6*GV!QK4LeO$(4{`=<*#4a3+h=_mJv5nKRi>^Y2MOg?tITo_oHyd8hi%@eRBoQ zG}_WYq3;MI;NasOr+w4AwVO41ehe%*%qnl0m-REU&}2;4LlM4ox{Q`kc&eY7H2H*k zY&N}%hT0w{w*e*sJ$DVEIG3&L_C;-gYqf=mnq9p(SL@+rAFiU#S6BK~r2CD`XBehT zS6ZUR)l~JV`T0E0IXU?N?_PwezUY=OR~qRbQJpF-PVP0Z;OX!2kUN-{_w`lZ0{`_i z?;6sn(o}k`)Z3HcyGhSIqzlVF(Z|NaQGzcR?rBJdy|d$CNNcHELW1JoGB+}-8qSK` zk`+iwyhETz1C5HKrpt-d`sFkP(0O(st8zal3i8#jA}1a+2}MqT>qSm`i-k~qmo zA0|yY`ZT{FL_}oNQ-!N{Xc9iQAyO;tH}bktZC6wiICOqs|DY%#CQyKoUN0YK4)lSv z){2&Kv1g40)i1;BTZKJp{rd~}*r~0wCa-*oL>i*7tG+>*X8Yl9x7q!a^eW5*QMh?SuV_* zFTZeVbzGS+vH6+Lyh2Ov2(-6p{ML~>7xZe{k7GHlFbEDKAi+HTz?w-^oeS!7Px9-* z2~4|hq${^s%OS|SABbyi`kfoOBS?Z@;+UWL75U1WwUT9-l9NE5RHEUNT8YI9c;;@9 zx|RPTb~8%IByzi>GNEF=?tVcD=5O&MK@rV)i~D)f0Mpf9gf$JUCOQMcrAT>fdgLpu z;4xv=)%iUwi^J0>E5={!!Pd$Oh?kK4Ix%g^)tfI-MLZ?K3ufCpnaW)->eV+g6FR}k z;zUC{#cveoHu9$L7pl>Gjk0$^+|+wO&*S^oqxlvgU%d|$=-2y~FYp1qYYXLv$KcyO zlKt%YG_oNinjlWLTIR%URzy$0uQc;hl9dP(+3I)I7sXWBNMA#mPuN(h)N8Sr^A(Q% zpzbO1>8kpBnNtL;yyQVn^bRMvz2O}I7`j+|d&ATBizx#p8HI5FH7eZymZmWnknjQG z?BNk={z$TxA&VW}ovMm%!b$%U^SAFx8`)JWMfm=?YHe%qC3ZEk=!eG8(~ew4+uPzj zXrxb}mvAnbCO)Y_RNe7*IW&o|dtUw@$*<~@IL;K3fZI`fz<6Nubp7=z`5MmXWAZgV zC|n?`GyWzC;G)bp9um&g&71`#t{TGbtLfI_&@>}0?1HkkNT9Jq62O5ddS1@#IE>HQ zLHh~JI$j)C_C^iC2BUAtOR2nU_g;c!Z_se`jj}hTndqCbwk@*5+#mb`eIWj8;2^m+f91sjbDlOIX*l+Yd+r}|NAjJkLh{UN?t%}RcKLi#V z#M1J?k|SVm%q<6kitURSKiX;}28J(8W*Id+SVC=4+f^MkAC#&)21@nEdYz2gH;u$G zwOXnHBO?^Nb^8%r+W%J8u4906uWD9xQGMvGr}yb6_%yZM*eLlm_N%&8C=daOg62bo zuaN2@0Ieg~r+BUMFfEcEw4&TCiN6%{<|CG(^SSV$M&@qlmB!I=&@ngL6(S0+5>nRQ zMIGXK3bBfUTr2p0e3S-IQ-7OIDL`WSMPoeTQsf`do2d%oC74n<>PABL@|mn=DXTak z=Rl3Cb`|i)iCe(31pL*iR3=olmvuyrFs^J<=df zyj$T!uKPSUSM8DxsP5=~(Lqm*8pYQ_uWWv+Su>>w4a^Ci_T-<(2Xp)2(H|@U&#>1XCyJ0#oDxAgI zOW63@LGP0~wsLw#5TJnJ8yIUDVC;tlY5*w+Barz^3Q0diVTaA z4@-$a^52mX<_T@EKOZLS&ooyEIQl4W&isNmx+rp&(^ud8X_-9ZVm$~U3qGB2VhC-v z8|k}MC8j4*`4(^3EhCOkg#Qd3D(zg45o+dBd`84m>jNgyPP^!okzNnMR27^~p4oPj z=aN5)w}idJW7Z{Lbd=>r*dz`kyEY1Is9Z*(tUO_}M8+<~!H`gdVa0zsthn{1;%MHl zat69_G@of*gfxS625XdJotl>^O_mGTaiHK9!^JvKv@pUdM>;dXNXMzI^^#DD`LIYe zH;Pr6k-kuRm>oaTbUs*gN+m`kt8WslMlF$%Y2+1N)jx?fB1Y1eof?@KSp>70;Uvx$ zsoMG=w~@?R*^xUZ^`dtnhOj|19So(HRi_(K>}Y1WZm_AgMlr zigvtG21*anK^;~!T6QGQdD=ZnOe^o@(a(iK3>&`qFLc7A0+rmG;0N)NqZXQ zTNLM|BQMIXom7ZeCP6wC>nn;EJEs`fnED%;=YGE%HrDymMydd}!Ob3a4?b}eU3?A6 zMK?hpCd<8&#~JVkH@NFl65)9Dmg=_cB+eCM#3pVE%M@lYbem;A64hN8wS#|H?hVSN!xvM~|u`${_h^Hu6RQ)rpRNw;-Bf|4Rk; zD3lmM4e5QKY9EIsR9DdX0KyP;eo{upvndQ>^JbW+@vSev2+8JnfdxukSFr7mt@Mh2 zmCk3_M>~(>h})+pAA@D*mWDvPigD}d-JXs$K8>aRZs+pFZ3hDMK`ita=Y(c!`av9~ z2uP$Pcc$tfm~&7rjO02&>GdPWiTYRHg0YSYdLi7L##cHEg+V=6{rC_?4GG&t;Xsn zL;lK(n3^6Cjp<%nLY6B$GLFE8lw-$w>Rbuh>#cH+RP#UFW$Z40qYd3<7jD*vMPV?NABQ8{IMd)c@_EJGOHL>hqR?=!oM>ZQbgk}S||{Wb+R@?h=zOrABOk*OBBlWU_T5Tg&|m-xjA$~H`&V5 zNt*l$$wEl1PlM@);vXfROy43j(=ms6IcCH&Ct(km4-4t3wV#aJ9ZJELyM+o1`~&fY zouM+*ad>38!ixLy%p^tu!|sP3m3$U~B%(}0^1mhgdFV58Dzdj&ogOc8Jh{=CQylv! z`Af}!+^2<%UX-PvlCiG2)w>eMO65%=ZlwQm5e7e;(MMV3t1lH^s5&)ps*$;pRG6ad z{3c|P#sk~r$o9{ecY#*Z!c!HUG~AoG*i1<{M2er8NUrVnZua=PyblkdZf7=JJfp$7 zT7<0XM%1Tdhy;?L?k^M8Sd^{^oRL#tb?(k5MNI17d1IH@{)jZ;2#@BpEk;@l(G<(J zM4xDiaj1x-TRVzS3Jh=;q9J90Q^X0vh`8%$lEb8u#hNkk3cs_nH1v+vy4409cR z(?~xKZO#iK#H99CSSxPZMkuxXv|%@i-gt2$+sMI4uHJOhO|svtQ~kSS(q~hz7@@Rn zmKKWaP_*30vyOv`J@g%I&1WAjxVQX*v{=V}xzwYTnTKzeDt}UDI#f=q+Nl5%B`UuQcSfl`q~TzbI!Xbwc=S@A#w#3me5;=n0L)iqESn4 zL{r;ey@DD!>}{6yuSQV6papaz&Sw{b#w`78b4HrdsSpZR-MEX^N&G0B+xSL~#mjDm zXvgo4Zhdvk2ow772%P6xp6JbtoRV&Kr9{YiG z=m-V!6YVbolW$DEQ!Sz~SQ)-# zw~4F9QCToQ8ut%+k2s-?;ZYqXgM^TT>ku^m9$hOXN<4){4EcZRSmZy*Y{>rq{$suR9>q*E% z(3f~omwl-a*BsZ5B%CjDCjPsTo<)|rH=vbnq1)m$e{$~0JE)u|rLY-YgC&AIiYAF8 zWwVhPqh1M#WnNr^KjHw~t4!zdE1K+sr$e7(SRF~ z0i`zA`%#9KxX`ClzA17b`3P0|4jDug{#RaCXx8l~%7}e5hL;Bz#R%)$l04cPBR@ea z?X~^(m$ez2k?un_PBd9=x~jpkg{jpC>u{%$xt2G%B@l9 zBp%-p?&DeBh-!KZVm7^{&M=+YVxCpULE?%4)#bW9z5Dk9hVreKt_B{=1)O*q@R#9fAlBkA{Ku-*ye5?83k;KLI(=r`h4n(;h{_$Q1bPS;qqY&T zyC)-=NNj1ck4ezkMy_PEo@#PN;}e#jAi4S(V}PjK5WrQxHn$nc1ud|{x`xR-_lMyB$e|wI->#`{qpeJ-?*QPB^h06 z|GQ>({1^#R9sH(*49HrK>rL;>ZBpAn{NZLcWoHD!-K%ejHEv@9R3ZHdrSz=5$Q1ZR zM^JR0E}H7(a6^?RFCBiGs#l+nO>=beF|`zlEn;H)ZH^e;VyJ479W_17gqP%=<-o4? zm)*hKE43Bp5N`qKy-a>~-1<1gAzOEmw*WhgJFpvm(nx=nI@J7Mz=JpcbG}nN|Fyim z-~2br{BJ4DKit^=*Zhm!Uj+-m9v!b2!3nPWZ`Pp8xJ@pm8nO<2^*+l$X^EFMd?`-y zL3lSSVchmzRl0aJoZxqJVwjO#F&GORRojodf{2LV(IF>zn^X7ru+@q_PP88klfzFY zU&vL<*DZYgxO})Z;O$c<_^toq!zYr@=f?6O(t@F=MPs@6?=^n;pvZ4Dj=MvUN}l2K z;xW95=)~RwtZS}6o7+q_>M*MIm zf<^c;)H3rcy<>rW*GAgqBvmd~8|hfcLOz=xg6N0}V;(=nw;{sxnku0BCK;4)ef3h_ zioy8Gaieu!puyvTh4&yZt+2cSl6v@+f5HX}*DB%rkZFjEb2>DjvLtg{DDKoMqodL< zs2d;=%c4$l>m=we7A4)S?UWUp0_;ds=i4^NXxI}ZZE)r_WM>cRD<`-Ez_GR=62xHK zAB*a;9JO1iLPII2n_h^UbGh=6mm+c;#L+os_ryBfN);T2{7T_6DpgjCeb;7Q?2L?0 z1&y)))XrnK@^Iz>BK`+9lz>mAC(6}@^JaE-rkzY#5f$#o+oyF4st$?8M+E(+-9Z4E zRBmbNZ7fUwN?|RwlM7>hS5mTG$HT!+(MStM?kF}ab)s9FJcCkL$h)N>xoQ4g*ZGs& zLu(_2llvsJ%udVjb}m-|b}uMNE=4duX)xKyPiPRy6*qzbIY2vWfhBYxZ$Fxh^qDw+ zd`?PKc-Mw#+fpr}IZw=%Jf_Xw<6fIl_g@4`tg$}-UUdkLJ5rFR%A2~_!b=jZ=?qw? z-o5$xVRkmR`qIeDP9}{U!$|Vd$cRWIkKTwhvMw}5V0-GWsqHXi>RvRFLcZ3jgt@wY z=c@YfHTB6~dGg2m^72QCkMh3qN4YO9mX|+%h5qK{kBfQv-^m{*Q<*P+JeRLels}e| znh5Vj{`ekisOYoUc(qL9B!k+FT>R-j2?V|_>+Z`J>qNd7J3+o!e=_-^$XAtoaUU@3 z%NL*Id6;}rZV_@WTN0j)XiseSX?KbWQ^3JoVt@(jCUKqwK#)5UzLSejMBpe!1b20) zGlzs1k?T+{jDZpWv2jGvp`*-aj|d>IM1;6Nnn3_*(oCG^0t(b}NU`4c*3Sz~`B73- zgl?a1dh*GCkf|FgpH!BzzI<{F`8hEv#aV{#POv^M(o!zh^(3OPrm)CWHzNb_C88U7 z&YjIC3gqJ1l|4=FMd#`RT2QL{E(N5r#Xd|@V7yo0CF$pl6!6cPIGe@oK|$+ryHDAE zO>-7DC$wjoPjAh>%r4H?5pC0iFcfoP@U3%AOMe%${*00N8417*(_e@`$?#zErWX)VW|uf2VkaSmWhb@Gb=Xa*D~} zBhGJ(ONbNpardHgG&Q}5G*8#S>2%ONbhj832D!GG40Uu+5o+X4Gxxl^^~qJ>#dKCL zb}OGzssp>rJ(H(tUA1}=tcf_3te}S&&t;%fX8+n&-uOp?+>2}cN6k`VPW(US&ILZI z>fZMW1Pp@gps2CZ8a1}0r7g6cmQ=ABn7~8_Oa+lv)Od*&1#7A^ii(gpGr;aPnA2)& zTifdC}w4$}TxAB3k2EqYyzrVHio|y#nw)dWMKR2Hb%-(CS z_xk_;>%ac%|5zBa%Iq__>b8CD+EHQEsZS~?8Co)8Gnraq?(~JkS?zl5gIM4gCKz37 zOw}eonj$vMTkgh~y>$&6S7jy_u}W9jR_W|jRu`50G1pAGG@TpV>5F5T#awYxg)Bx* z5VPO0Zs<1C?0m)dFe9JwWd&&admxG&!2ydNHW@8C=P86Ftg-ZF%sQ8*o3xbS`3wyv zUBac4ZGWMj?df^^_KC)v;Qv)YzhlOdS{Y!^B-eS8luA zU_+5e9b=xpG~5O(sej4@P7Vk3nNx<9+{u|ZspSd55KLeO4nvK71BG!kIMT`f+04rD z^tYp~I=N{i9njsCA1BqQ=!XqF`8nHwoF~S5SAKzZ*agp|4SXs)a;!YMlr6t}BQxP* zCv?t4?E7RERpr$CRBt_Y$*6KBvg7C)ZGu^Z3V?KXA{4D2xDjoBd%=e#tYAds^S2TWlbK8Iq z?m46`ug_}NKe~`*Box*GH@|PDsm@;iVQ-!KK!f+NMCU3XotC5fzb;J;)obC^o12gK zX-?ZzG@5(Qd&NY#Y~L~Ke#XfL;2(2W#RPQ3oO|mom7+?_Yn(r`JpsJ*H)J{&gGm;L z)*%JKx{&OR5*3J9o9K7{+oF;$$)n(CNR2UscXD#C7G4q*h#V;F-S!FLS#%hHd5 zi@bBPUE~cE1y+{|R-do5gr$x$10idOAS<}T)CGJNh(h{f2LS6a#lY&?W^#8?v?C8b zngRnp!Gol;x!C^6jluXkP`3ep133vO!q*5I8iX~IY7Yv#E1o=2^}kj)&mOz<)8(7Cu|5)V9Z<&Rk5!O8#jSa{j8 z>bUz0bL6r|wQRLKBI_?ae(BL3)r!wo-gV{XDv8h4Yv_gw2W$VWapM z9>N}f;k^%Gbu=IC5ykiU{~w*l+JVY{>^!!BoR**Lt&^VcNZzG-5?Q~Q_)r*P{T;xZ z>Aur|xth=p>ht&r5l12gKZSXOw`%CJJTp?lJw^oBx?9iXgit=BRtUiw(}k@TVd z*-I`pv$qa^@qYO=;S2S-8=KL(yFE(?w8 z%aaQ>-4FRLc>s>hx><}_Pg$`xEqjHZ{w{7DR#QKkR;N;E;Ad&L$zT7>1&O zm4ab_!&cr6gRd&%?qhz()!dTHZ^n8*H%>mau1CAlzm`;W%h;J*Umlxds}xwp+%Ds7 zePHYUrrWfAm;iYlX1e-~e7GXeeMCra{S#>+94*xp>NHLz2UYmxZ_;U*eqldlrbUe# zwLd?pPd60mZCLQOzp5~fhhU8~j>LkU{#OSN#P&UETvI)$-F_zP{0jn|MWX$~00$l; z+Fsv5e&7Q8`KyiAOqJibP>s#5k~~IY0TGZ$LNmLhCmXA4V#_YmVqeq>JKqRVt)R!M41X48=1V=P&I|0SLH?b)MA%WNtO z9DdFD*LKZ%cU|IW9@SsST`*V0^ZTbRI<@*OfvVs>eri*D0#D4`Q&42B;zoL@M5QK@nF8P_&I-0h^9_4O}C zld|CEX1za`cM0lqm$3%1%wC=r@FY#sX(=4fT-n5(7*%p)FMXuuF}Ex8qJ!y~LZ_8D zvmR5N*d3)KHaWSEtJJiyIV{VJg6_tg=t!xB-84a42(bW*hzb|#B<@=ea9bE6;@>+K zAw28k-3a&0{kq{7{b$~l51yR(RJ3<)=cia+Gp&iWsv@zZy)nOz>sUw35VtiK#Bmz9 zK)kxqEK!wRMmyz_-wCc+YIei?QlrNfivQ5ivhqIVG?W|(s>q(Ht4>SY%A1ot7NB~c z1+$A4$cQ7PW8sLbg$n-TWdtGWpvq;t9#Mx1f5?S`YD*bJB?{Cb((#C-xRqLjMkBUk z#9Vp^J%x%Wmrbi<{=1o;cy)EMeNH#hJoPv9=4|jiv%f#pVyMf+GUgU0Q48N`4h>9V z9h11r(1|k9^hixtX8^0CKDIITg_-Ua|6jYn_00OJ_riA#G4Ee0<`qlYv(i&HwTqLJ z(Am^@+*+wE_53^g)_e4izN?E)?i?0ExL!v2mSDDU-Oz~v@?k^CtdN+jb!4TjIf$MB zg%-QC1#EBCSFnAR$#rw2s|7$MP)X=|t4c<(Wda2O(5`O&BWaJRrYS`ChcxDhbR3B8 zGk}Y>znOxefx;~o4)Cj?!(4>x76<}ShnenXvym}J{;%8F%T|+EAa}&80-|gXI&ZrC zjSwkXVWMGbzRDb1GpH|XwmBo4gJQx2a*>r{qu^*ddyuSh60R{h*tpUnv~kyrh?2IU|gPV(SK9mzlu_oy) zDED7{`%+dLO+9c#Q);lDc+zTzSAriza(-_PvDCDVj}1V0`MF^w>&y~V3`Y1yZF=(( zq2`Ur!+I4~(k_`H4f(}%%>tUd6AdYFvL%4l|9;KnVNVJG9pPBeL=06Bi+JT?dnii> z49|2mqgY6g7(%|(Zq z^b=bC^kYeQ4a?a!VEY7<`M7sh9X`<&X>>^XSKj%H3B~$s9&*y(i+dNh#CB-|D@}K} z&qng6u}_EP@VCyf?@DGS?k!6ZnAqKuFKyLx_#i=){5;Q-snhAVG ztVn2{H~rE5?-)IYN}Gn|Z1yeyvND?nUuH* zR`Uc;wdWDt=JzJ)q9s^h1#)l@uf3=xy*XZceJcGZS(l{O2X~Sj(vRuJ2&pV}Xxo{h zEoJzh)~(QxC}BvLP({Mk%25?2)Zx5iMww9T^CG2n?hKX9bzXC5+YIGv4f9o|N1CA8 zS<*_ZeA5);>cD(+MJta@PB6am5Bb#LkfYVd6<$$(WwwWUh?(qm3(0e#}7cQx)KCr^_N<| zE$JL#UUJVZdnU198@CuwHZg4t?TZg9LyCwN)!LaTzLd;tZ$4~qL(QAfdB9R+LbuG7 z3;8sTmIsmH^c1Q1yygFPxna@LpRg;2dLz{i$er}+B*;vSie;9}JH^Q!LytQYc_tfY z`cU(zZh)Sg-oE%><^y#r4j4=;{k2XzoZR6m0nK0+(2YnaxHBUBN6|;ib{a7ahX+=$ zX9oMRu`gTRHDw)jT)#nqU`(J@l%3|=I4;gg1#1YUJEo#GQ<0OEQAsGVG3l3>^z_U? z=XL48K_YZQJ3!P;=Po5ZG>vew=b21K3Tl?UYM8y4s8>DSc}>B59zuFJ2_dBMfK~2) zahaJ}b1`PAL8uSf?Vn~pSv7l;A;zr_QDAiMafhk4k$Bop_7?M;Xy&@om8o@?Um>f7 z-1R2CjyQD*1n?%P%36ryvJt&qgbclaubCG)&&}l_#3e!*Q%rZLGz@)FC7`mn=B~I<&VRI#kLb zynbQuBu58sBRR-DW z;KI5+_9J1;H#^(<#Iq}sdvNTC&6yYX@i=1hfDNz2n=#K_ix{nK&u_?^YRc@XNS%_| zb5{B)T1%OJp;wh>UV{Z2cJ*N<&=J8RO^uT}|Gutm&xaXs`kjHrVbj@xx9HFn zloI0X>ZiK)9A?-!+w1)4mh&w0X|x9VuCV@DoYgM}%F z&t9`uC$RX_%|)k+TRPWukSl%SK`Y%qno4_q8sewzu#>%;x|W}w={w!Y{!EXTXZnr` z9p?5;vJP|AurY|iT)*R>RlhlmsslxC>}c!L(IR!>^671Tx`Rxevutr&pG*ut)3I|`)^yHWX7p6)ECt7#CK<`97=@WY zq!RcF7od?WJ~JaFTFfw&L?esisj`PJ=C7x*^;_gkKnt2FIrHPgUP+@b8UOf zsKz@t-AHQN9y78JIII6`-puH}*tSQbbFw;L7;j3gJm9vcG4=NHn#`V~Qm-xdGkXqC z|79TT2}OLuag~O4GJD!6m0IK6wAPfqBK_Ng^_itl z3>Lp&CYuJF`lP0Ohb1C1@rBlPy)vq%E3u#p-*DaD)cLJ1zcpf`dxfkG;~=e}OZl9` zi*sgnJRId5n6I>VV77fxwz`4&x?UMJFyjkR#xS3Pg4wQ(>ZT7H+fUxWAWE=0&b+j1 z#8d89)yr0sG_apT2iCi5P`&x_lnu-mj=X@5qHh=~4_s+T5=V(9$&+`wZ@YiPZCh8Y zYxl^mzOt^@hIGAoXy(O3xZH;Z#NgC$Lowr00+xsUJa~O3Ue!NQY4FY^suF%s)@;ad z_Q9CKQWMz)%C(EL`&IukMOf)%zsCPlgsx7upZ_zv8=dUG^8kZlhgGv~QfJVh4Ahs| z4Y@lLikjIyDgC?$^xl8S$da=1Lr3e9`_p4Niw^TQe-E3uQiT^svh#4skfCM6OUi~T zp2vw@dxo&3qf7I3XU+Vw6Xo>A2r6`8H?eF~#aL%evaHHk6E8cy_V-K6F-p9#kJb|R zMYTlv#A{R~?u#1NEAn7fn=CtCR(C%ub8Y!CNp1ewLNxbZvqaGu9l@Y=i>s}_UB%9 zu=Ww0Z)k>r_D+j?v&u65NVkt`7S7UrBVt+K>J1dIl@`_6~R(juIcy_ z)Nd#IIU03Vn;jba-s}Qi#c<>VbM9{AdkHtjyN?264hKDiA_(we?%QkXm>Odu!(?pc6d(XYtCv4MUxStjwGZ z&G+fxit$Qcnb5nh%(>}E2)LDMZ+j*43V2hd4dy_4`p+5BFya-Q5y#X(nMNWA2`qD^H%Wu04k{r$=Zqp+0l#-7T8i z{HzkO9oS&j8Z~SDisi57*Ps@^ao#8Jt65hB%PNmBj7T(Vw=FHJUAOe)S_0%&mjhYb zoEz1%+HHItWxiGN4Xs({#(mt`<6EZvU4GrQ?xvc}!CO2Q2x`2>5B@|-v_I8s3LaC2 z=)DL+jx0b(=>ZUO7wZ%}VQ>}V&tc;;YW462OZ@%)zaTg~q% zeyjMc2z2~(w*(Rl6}oEnzoPTMIsD_uMA!Api9>si6^VaKhYno(SJ((LXc%&TR2UxR15TnR<(fv)qz8 z9C>{H7I@TSnM=l&a(GF!|6F`mX3t_Ww0qj=8`>|AXZCz0;lu+Yb6D(TCkgw#0loyV zX9iUo+NT?NdU>pM`86f?G3X8h1L+UOS|7ec9Zes>VZVrz&fZO3Grcc!U$Gx8F-b>d z;C0hS%tTm{GUYp+J?%8aXGX1hu`iB74BNqBf9=~%){3A>sS zZF_#5OT(3|pgFQmln8esWlvUF>4MDUd}wa=8qYT08e{!eH|eCx-jJ+L_}AZQ?*LFf zpWUp6iiA>5_LFqyfEoD@s_tId$^Yge$TP9>0RJULl9vKdG;n(=@yN{|wuj(h%%1K% zDr8+C3W50>q9r2_XkrvnRD2P#(BPFBM5_w+@m8o09Wh<_%M`vK5o>6_Iw?O}Oq0>E zBSh{O$Y4w@LOK_g6DMCNm(QNl9cH9AGw}gkKpN#43>u^9Ec1VJu{^;oFAw%pcZ7ey zhB@Y!2QPqJ7k5}!7~KQ9S7=58HG9X#Ivuo`A^z!6Gm@!vfF4bvUeVpB1P_Z_%&+TF*QELO%mmne}x-z#wBtOk5Bqd>1f{D}v|T zL(D!degH*M1DdpVLd6*zIINyA(D>2+x z=Jh6T&}GLvRAra;HJ%P~*`aFhB8PK}&so9cw!(7zwBs;gh)G%Wc{cm-Oy-jB7N9Q4TSD7_tt`BleEr}kW!GtEFfBC7-r|64+qi?4=sArnNhsb}P&K%s) zg;Ruuw|~PWg*$#Nx&KuX)Q~RNn3&v0i@jGdl5WjUSAl-%I&7 z{ik-B70HJEzi96lrq>TtTnE$NVxr<$0_^%Jpri1BEmPZ1{i~+$B>t7@7}lG4WoKq% zr8$x9+ML-@Vc;^p(?0^xeP7U#90tW`f*nCXDtT%0Uue9vq;0`MbA@Xlsc+KO`s^D* zMee_9g6n{h@99Hf#PCY}O@u zm6N>~0LgWlvu5fe5J>X`AhwUXrOZt9o=ji4lW|nti@==tQA$hOtcpzEGS^2nYdP1N zQz4QwTh2Lib7l`br*lKKO0YjwCEQXMw<7W3yE$)_?oPJH%F)(p$n4mitm#bDY%B$+ zc4Mh=#RvJFv=yoQT2z5Yjjmlg(;ZcQ#aki2=O586&or-s7vG*Gq|q}Q6L2H$j(Dx4 z3LZ&Rv}MxGW-s8=ZqO9D29CS}JGm|Ts^6c$l0T!T%?lNj1WJvm7-{C4!_;IjxADX6MXJiCxbk1-eB;vVOj69!=D2 zVqwNsxsN7Fce8F+T$k{UO1Ks7qfGlzn)V8&ogglD&fCY9GVPg{cC%8>4L<@HdFHyK zE7NHwezTqUK=*1L8Vojrp>-hs%-v0swsNlC9WyHxuU&h(d$M!I+lkUW!4`Nz11^%c z>XuIWHO@Vwd)E$GRqkZvyvn&ZdDQ-k-DJi7;G?`EkH?xaC%LpVY>zhikGgZnsxeOX zP+o9sa&KG(;$!v)eN^Ak4P2ocf4N~l;}M;os6^2X7U#Y9`+tO+zHLXi-@jy9DDjSR z$GB^m$G!AnZ;;NnJK8PxlB6ap_68T2)K+yO)DM6&m~GU_?Cx ze{!-%sFEX!N&U-^`tr!!4FB;HaUX@r*;R^imKyC%uaqO7N+&D9es1eEcN5vD5)TmH z;kEVp$t6y9q59y}k0oVM3}B+>Qa&;(q5&0{^sn(=6&`jmG_BJ*0gax2n? z+of;@eWmFaq{soUG`&3iMAE%ze6seUN+;JV7&3B-g3D<9M`Xh>xT;dND1DP}aGvGj?9={GuyUxyOvxPG|TgmeMKdiqxUDZR1P@ zF~OjzkSaTIk|rlksjouZ^DId-Jfc&_l5pO4(#@! zQu+U80A}`h6cQ^n<0HM6crt7f1JkOa%vAsyW*@{lqd?L-qYBN6@|oTx+@N0) zpIN&hb#2mR&u#@CO1vda?!tKHt~NIkGTVjvm&i$1^dAW9{G41RJg^Pu6y(JEZ+J zv-S@&o%rhwweO@-K)CyrxJm-(OU~umC>e$-oXQ>tlrNbkdyn)}X20>1k4hQ$%1SkU`M}2K9;ET92R825d#n(x z-nZRk?b@i_Cmx~Q?rD~=c2Bbh*Y0WJ% zDx7sAI z+?Mvy%q_REz!KhB(xuyzxwf)&d3o>DPnD(~y_o$ApiZF%wWu;0&Z=p(!3lsg0aITj zEj*Jis-Q!`p`<6er-s9xYQE7!lERTswIiR($fr&&F&58-#VtA?!kckK#7Bg|j?Z&2 zXhhzZ^zOA{KSZc!B@p-39djk(zN=Bo2I3OVJ*~e6KSfcq6R>>A5>A(x($o@te<4Vp3=C+KTi%vzh*klJ&$GDu2_)LCrqr)ZUI5vfiU zN%us5sp=~ZdQYB)`kp0jmu>@rkP zH`Euy@Ao2^ob(88lY3EwJH$UWC2hX9Ivc!`s}t=HRzC>MF`S=VYTVAK^rz=L?W1}A zb@(h*;?4T*-c@~T`0Mklbfe-nhG;lc=Enl^XvTYiGAx1*@ctwqnb7d_uu z^!)4anfeR>@N3kk)P5`964XoDZe`=QPrsUz5&(_&Dt`2PyndBl!GjwS;f1|-W zwOU+y72nL6<&l|p(BVi}#=}H?(Uh)NQ{1S6%AurG4|V#?0C1MbR+vzqH&*Z9<#hMPz4|h9!M=KAK13~bw+KH!Oks|PN0{Tt>29_- z6G1gNq0oycy`Cer_XAazkejs$hGI5;=}z{CWUeQ=!o)=TZDv+_4zv90I`OZ> z3-OMC&46$BzkshDv79ec91Fk9o= z)GbL&nP>?1r2<4I1D80AUPqUoP_OC;X7Ip1V5~%A_wzNh3bhmtzkPwshFGjDpH$1Y zZ2e~?h#U1EJ1AhH(Y>pJMv@(z%6Rkn4ak{6O+v81;a6c&$_-_^qw)d_|CGdCB+_kw znr^C75##`N28=E21z*!<=XS3-g|_;)n%)x?2-dQQ`YvIUvSSuK)F$P%mP33Qv)!Gr zIM|@g$jM$#+2F4Csvy107T#nh%oav-WP{n$vJ+IeOpEh%UpY7}eO5`IC&_kjb8xfx zUiy1#p})UXb0pOjlKy&NlKd15DtHY^fnm7$58d=uGuUEr(t4b5hQ2#@bpM=mxmIG9U+Rf+$Q>3=r zX&=LHazQty{G;R$n{XM!%S;Hd79)voakAeaN4)(4d{%9DR<}YAVur#h=cwYGDJSke zV|KclzHNVvjR<1xXOz}%a#o8apXx0hKDJG;(_-SXwxmYY^qI_2)*;GzbeMJA`(_=g ztgiz?sq~o%{oF^b$_J}%z59ehbrsCVb=NYn{}kJ-W+Cae&4L4YBw#rOpPyo-)x7GZMw3h z-Z$H5vK^;m%F@DBU}|(tpV`v4?TC%&LcSx_yxayKUL@4)}Ud(l}6j?gLbwjnm9jzlh%I&7A`TYVG>*kjFXPRZI$4Q^-p5AIw#wKdZ{ zgnQSnSJ`yOK84<&?N_&Zt@@R3Unq$}jj-~j7P=P5p}P2d^oo(i^MVD!m%=&PYUaqE zw+44*b05{I zf2Hv|yQHKI1TV*75gvF;Y%Cb<3vqV`dL&b}QxPFm`3MW7g$Xb2Hn7Q{HK?#OEKOX) zlvVk4DgWo&jCoY<9%jIdz5TkS{x?mc4BOL(WghmK;WB5nLW3GE&A<0Ui#Wn@8ZInI zG`}4Ai8UM=19z5ox{uXtbaz_)uK2pTR_n(bY~0T-vy1#0x`fARN- zP-VlbqT+<36Z$2_({s)`NCwyR}t7Jf$;-vQG9lDr14!u$Xt4I_f#MTa6eKvg1w3^eZqc z6?2U-Ff9G34NY_aT}dxKvaD#Ka!pi#0V7u6D5$!-+P~5-J>c%df^Nb5a>zmLYuA6M z<|(QiS=K%s$WM*L5-kM#XX6j|yRW&kft#R`nk;-uKrD+A3_GS_slkC_U9;C%*1Hkv zx)Ur4(Kk0!ZI|?}uXA$GklgwTyTN82%!1;CeBAO&N`fvD^8B$y@0$;`ewkC}17hYZ zI_ZWi-w19rBsQ9-+^OsvTMj-BzD~yb6OO|LSK4RNoW7u3@<_T>cZSg2Ue zF1Pu!TY5ep!RMg)J+UycUb1JgH>anW9H_A+dz#%jJ&WCVPc-Gp1%LHV!=(vR{y^|2 zG0`FAzQ0_QyUxjOGKux&y{#9OVS(vn?!Cm~vo-O}`{3!Nj z;p}PTYJ==2Cq0Ls5a=sH@#W=qD;TltFr;ojko0ZWw$2`6_|-=?T2ja&QX2oG>*!>q z-((H9@E0S%`r2+96vwtwJAY&`Y89bOvf{S_ye|ogGLJ4LIw?1497A=4FNIFXkSgyv8ERIW;oy-RmNi`T;!plrL48h)= z6T#A-naH+3!cTGVH1!8Elonr^Z(nB8xc?806x>H^)*6E_6b13^z7wQrUoxz=Z`p^K z^#xlS@c52iYy3$rNKUQ2U)r%wwvG`;`kFt&6+Nh#OPg8?frz7ZE3@m?8y{AN9>JO9 z0xMc$-evO>Fc$2_5f?I-qKXLWOS$Ss<&gdB4%$}n`0t+ zhIc%m-;;!1xVLoc=b4oa#*o*-H-m^quyBMC@=YniZ_6?t#XK2N4~n%WI;a1cX+~Yq zh<4G%yon4U{iLw*9fIr4pRrZDYlW%Wd&=4#<^LhVoBFl%q{W}4LBz!4;Q_ZtRf_ahiists;e z0<&h8ki8U<++<3{yj!#>+Wxdj98=OJ`!hh@e25kBAOwCpY0tCG$Gp2mf(9bIv+|cT z7vi@!;Zg~oa^KPDaV=@8JV}iRD87aRBhzr1yP?MwKIQF$%xS5d(-H(Y*7mZrY+`MD z?F#gQDa+@eY{g;bT0qaaDJy!K*^9}eWPLoH3ZDc<7x7Wkje+b&ELsl@En0684<9;% z(2*)m$+o@2RblpK{l9vcXhYjx*}ps4Hj{J(|C3~mmG&`sUW~a?PHsZvxf8~1_lT>V z(8xrCm)%=YPb^1gNpElbi1IQgdlxy-^fO>3YvOUHi-)9+Qv_cWKc&~4KHT1ZX8LOC z2)}C2i)Sph9C&e|6JTXk>I0~EmZrz%OA)lSGuqd$!|#OKr`vj2hk#Rum(hdkmU4I= zkgV$}7}q1-@th(xMC|=ZXT1z46wM+t-J$& zdCV3^miWek#WE7d#>|o`JRcV?OtdbeDUcqXxo-aOl*^pkBkKga8Wt>$(@SPAvdus8 zl=LnWg#(@apWqimhuPfqbW2C#&4wjC%gHKkve`%4_Ku~DjqBQ*+d?vzTXXqww@m8f zxSr|5M&byt(MA;AwRPz1CI~qK+-=R?Em9eYb3?pml#Gz~!0Y~;6glVK0fu>3HWyn- zI63)0H8a<9e6$|$y-@JdV%`@orsS*bTK*CY&aFH$-?Yx!zBGjP=c@hQ_*0i~B(Ta2 zhNAnAphqmx`Gu4ajlSlS@Al)})u2xdRO$EgborqDCR|8qAd`Xu56AK!#f>ZFf(!W%`Pkmmo!lSw{sr^iw)Z7$Y<@UVxX^*CB@L-WZFl-Fv9=v002=$0 z$Zjdg6cU{TD6NXdk^2OYqY%PVz1)ah*A$JgrW^Ap`CGGVQ>HP>5klDRIngGVYZH-0 zFoN6Qz6r#D)~m)=g}xxqSfAtafrol6?HnHB$8QoG%;GWMpWaM{A}o}Sp7vrs)BiCD zMOQGK6znOkflz#)lrv!cQy*ed0*x@*M>BiRadN{*2wZA1O1S>Rr(9a%cKef;8L`(NgUk66 z&3*36YVbV%D*#8hzo5(|b#OFlWQAJpO||TMW)G&Q4>B8}uZ6LO1&+3duphlEM?lYp zr2fKqiHue_p~t<&V6cb(h`;i0L#gGm;?A#psR1whtpo(uh0LK{;$h;@k{s*DXz4A% zFHL_UIr^#vT^#TQfJKcitgzX_1ZmsGV^3I)tF2t>y->u+!L1P zZ&i;@cvBOJDOT;HgDkp5MD3&QL*fmc+({;>kVOu?!z@iP@qY4H+fQvm#$oeZgeb09Ai9mVzNzEBHZ`FI(dmG!=nx2Ez+s>Ck{gqaV?eBQA zqT}AX-s4s8TL-IGF+c~^o5^nT6D2g@MW-xg0I zV1Lkb1G{dUzb6-!w+#dz0-#0L!$Ac17_i{oPF650dbf)bykeGt?{@KnWzo9@vf!xb z-2!v)?@{{}X@a@oyLX832W~dA%x-7-5#HEb)$u2UTZ%avHn~T4&k%Jk!T*r%)6k>D z30g|L>x?cRLx3hgxs0)y`BDUVrg=>;3L7riuFrLP^ewqn=$oiffFflF}hV zALyi9LZ@l`80{E}Qb($+sjF{Dtm~DrYYsQx-twRN6+W6vcT&b|Fs8RU#5aZ(3}p&6 zYpv(3vr#9P;j^)tf5ET(v|&@aV($|0wT1NE=|f;!zOb16lq#!8F;_U)HE<&~2jfnR z60ow<3FoX!OWn0tQgD${?O%{AHq(M0R@r+DbFt!Y`2n{kZR>BRwn*lOzaL{)RYh9K z!4&QPU;BTRlOJ){kd%j{S$WWqPr-TvY_00FY?oK9)f%Sf==nkO9G;h9sb=H<7W}$ASPuVO!$| z7kbDRdU08&UZ_?KL!9b+&R9h%@HKi;b59;ULcMlrg?*{er zb76aty<3C(B&^bcXOivB&o&ETGOt4>=eE>)WjIpkjQG!Csq@9vSwWu=NWw2>7~5ma z%dSt&M{&!^ev1vlS$zjhw(ZfpI#~%o+V-dua#8j#oHw+GWY$;8*K!^l5kb=y*keOv z53D==BUASkrtY)(KdSo?(~jzPa=%oyim}F4U7{JYx}a+`N+Y&I6|6H z`@`M{fn}i&!q~%@2LJwPa?h^87j+~${~fgF6!rfyX;BzB=e`Ni*wk)?HFMGc$%f1> z>Ye`^N{B9$8*c+PwN$G=|1*mS2!m>5sk@HYU8#ivfS8GCXiJVH z+nUX`HO0HYh-08@{Lf8}I_hpWMQ|@4vu^WES7U8ju!^X4|5~-^c5-Dh7XyLmqr&R6 zinf%g#ANTfYKW=E-}>1DR+D|78pTu^q$p#|OIGblXCFu)+^HGG*p>s*@f6MU>#alwJL*J%W^Q9ywPfOD;Rb<2 z6K30JnjzyeK0*7>QUJGiFflK5Uj07Y^gH<{yiYBZTwrJa2;!D5#NWPEiOH&ap?!36 zK@giWt3CBvGeiQr*m`exlJjRVVZhED;AVO)Z9t*3%d3MXe8yQJ{wuTl^3)MiI;qjg zC3%nFox?SYFA9Q8qyo=QR&19hi%#I);oL>CdB)s7K$LJ?nsC2)ACGZ%kN_vJKCD7NAYWdaaZ~ka6OsbHQaMj${+<`FGEyw*(*!Kif~6> z@iA_qc1;(SBYj#zcJ|}rKR0lH{tcmv2kg&lBxN)kH1JWhF^?A|KwmalJ=uRSzNqB% z_OU&tdF{{!DFK+a{{g^s?k_Tc&8%NIfIzfTdr8B6=7-=v4bBfcof{NDF5cd%z}6hb z|5JjQDc$6gD7U`6%gKG03{ylMoNNb=J$Ksu!eE(Gat6y3%rVGe*LzZ@_a$@xdke}b zHS65%8DAQHMutas2lfbjDdHal;tc#?Y(%Kp!7QLvlJ|XJC4I#ydiH}mLzBG|=@;{U z|Nr3LW2xyQ_Z-4K|KhRcKE=S_pwBHJuakBGJHbETTJplvJYQ z?%N=*`S5Cg$M!>LH}hs`L*}jW80Wq8cM{%&>O}2g`fjc_y>EP=`oXd2QzVfp2E}7 zTBOx;FD*4_CYBeQ0e^AK>;f>lZ+2%osg>SGroAutf4-S|3Ul-kpd@&j{|X{Mf^A#4 zeW3_$H^_sFN0@Es!+7d5w`>0x@J{$i2)s5%0Sesp^Mc0<^giKzqlx8^`P^JUah{&r z$DW1J*=9rk6COr)(w4SD6EC3*-b94Suw&PNU!P03UqzBtCm>{dsoSaF?z-Ljk&5P; zM7LRRy$@P!!6ohMK09iE;(NCL4VCx2s(-qD3vcv7u&6&kFPmcq0$I>o!R${e2D)!C zw!n7$B3>F0dw~YfS;?T#8VK>5T0-y8J3o=-Zn8vMtVc63cBK6WAJY3>Pu)n6M} z?GUV*w5#SL$g>7qLGvgWjm!dPwa*_`7W0O>-R?RJ z4=oFndG!!nVO0_gtUS{{EX8-lEV|ALXs7Oq4;xGWXtS)_tE-0AjB~P*qseY5(SBYt zRs{GlFyr@zMyxhs^|$G0@3cdBdX*=F@-}$O2&IF9U;IgA$!E3*B>>ULhcGR}oKFDD zoD!nRL2b&q0O2_lMsyjk)@fp5^m4LOQ&vrw_Hw6&m~&oY6wir@cxj*B>wrUWY7WlT zQq^;WeiLyhejH}=_)HtGZV3Hs1ha^F;L8NJ%bsC-RMnA#%edF%5Y(~+?&>z>*UgPL%eneJ8xb2 zhSVa&37BYirjF^I_Nh`lkTuRT;m($(j&0kMp{djnareq(++ENZ*;-<$>?IZ#U8AP| z)LX|5?bB%VgkIC)?%y~fCa?g9e-oSd#Szjdi93V_=E zPQzMjr)_SSwm+a!=q;@4h`v*yxuiwf5a2Oenv@JZ;~G6K;^9bgH00QL9ZH#2H)4|CASB1vum1BPQqRGG`zcoaw!%G)<7ow z8;&63ajj&Rf0Ktaso`b*Q?LP!`yDC|zlRoKVRQ)R9->^VBVh@?s zIu5zXj`~T@VF@ehEd76QdScHf(5Kq(WDfyzGJEzpIc);Qb069gD|yB}euKL%=~706 z@EV&j?M~S19h`hT?KKkJmJj=5UPCfWn%Q4^)yhm?e~PFWxIDT>W9g11`RS*yE!j}JUd6EL z-Z3-xT=!J-HB~m#ot9vWOi(QY?u;V}6d$BOr4hc*%)N{@L0#5&a&iJR(_6EH%rkRL zoet|W-F-bv4IOCPYuE5tv(i82f3CdkN?==xl`wKPo2jT9e4xZhCI}J7tNcA0yFp2=Q%5{ z(%>_D=R293htpbSZ?%&hH<|`l?ojKQy@#_fRK?Q=ootKEb12b_`ASW==h~6qUeeWQ zgSG71KqKgn5U-)&yN!$a?B8Inp&xWjeaY!!1mU63wdhb{>`Um)hgf5uHMWA z>UgI&^Lgiq-U!}#I+UPj078r{f-Qa^SUXuARN61yA4q?|(u+*rQtSu>=qq-ZN$<<( zo6#=;m!v|O{txd;^k)Yk2&!b!jp<^e<#I7}V4^*7=w$4T#kJ6sQ=A(*I?$V%Q(>!iZJ2slzC(v zk|G_(&L#7(S15MZm43B1z7EZu9m0P1aeIfJdqj5c-nDa_Rez#hj4emUy!H+rYx+(Z zRlV%Dsw@O@4i&!;e40!AT?M&+?YpTDdvpFiz-QEvW(o|dL1Q*|*BLayk3wm#_nOD@ z6yz9c3GO#l)mfaJ>|}>9AVUeZJK0`kSYib97NH012QjDNkHJaiE918NLCmRtG#En~ z`$5b}{4vl)y_pvfEhiP2aDeXVa{@W$$nVDz{`3b=(PDUR&Gb!4RX8ilz&W7l6esr| zP_&SaI=LsMP2GNFvxxtgxA(I-B3-ch-RKYGVFF!Bz&iq&Kz?nwd~ZL~`tbk#MODBT zXoV@o!)hPwDM^@(5sWHHIQ35_+{UELLy!ge?j1U?sh!+%3fX>AH&*cWHd>)Ad5=p4 zOFH}R(>2{VtZ;WbtG~-97PAP>bm@Qch9=ta;-4;ydW;m}-^dEq7(F)|A|ghN2vES# zrJFlrM2U!v;74&HI%DMwdmql*;N3pG*E5Gur;D$g$&-PKR~e=l)ZGe! z?d1N2bhKKK1iziYrFd80Q1_2P6^Y?YM^hI4@bfGmEplkAFRuAv{~U01#_Jvx?o{n%LMWq65;$luVOI&5#qd$_w2 z3!d|x*Z21aABM>)@bJ`N_lstdofVw`B1zgch`OPdL2-(5@`@A&&1ux5cOIM>JBJ~g zg12XM(j)TuX1ityZ``Ja_IfY{-*{!!zW0uqIlSw@0&q~nL2~vxEXAyd)c@FR2qdK1y{j!=y_9dQ{;Hn+&|8&w&^SksKwFL<_z3UN@B@#cv_1d@g(aQ#Jjm|EpdKnkVk|E$-*U7zTMnKFW!-a&-aQ|Qu2L;@| zm&9nxI-mK_y8e(f;UROtCk!IyPGnXiD!BFmZAkua@EyR{rRI&#LU8{!5)FZ|s2g|x znE5M6zQrjqk-(qTFOtstp{p@(Ml#bmL;-+uH}Iagk8RNGbzpacJ0qz%whLF6-z)7h z$UM_1@fB-AmeT3qqklJZau6R2bKu^rW`oZW4pa%^e-qO0UB_UYT&+R2dXR0_M1Vv) zIB;Ugm^%v9m2qAEC*KCQI&n8Osu}`u^&#EUWPZm$2F4o8&47A^I81COqtmWyD$^2s zoKbD}8k5j8;N9@V)|Ac~Pt<$O8=7NV_TrHKWiUJ1WDJ69ihsJ(^g>$M0p49uH0 zP6w&Sgwod~Vc4XCZ}`a7>*->H=g`TqIz6oxe#YEyZs+Hk@>pBCg@>w{w3Bdy2jEJq zXKNwRj*(pFPcsM9U>UW*)lb2onk>%BmHf{;Vahx`wY@BE+R4tO13Gt5JfygxA&56; zSQ!L!SV%DamtQ&f0c3vn)Fvt{39e-!AuUZt)s#Em4MkSGPWCK71q2RuC>I3#Zq3BX zH1NYXi~V_YYi2(Mi-+K2F}6(r4!d8% z%^G?oiq~N8fkG+=?s-=>S`nV1L3lJaW*WQv-yH!Zs$IYAlcHo;7tKpT*;X;a`x$~r zn*Y;7ndWS@2!{T`MqJ;U4Yhl)x|KAGd2TQAv-!Ll(RCB}Hjnt%lJ}w{I=k_Hc4-h2 zy^%EnX{zQ5_{M7S?P}A|$?sJy!og&{)*K+HUyPfq2#CAu=WF#ftNVd-1s{XvFBOh> zId#qwvSW$}nUgz@&v&BVeKx-h?Z(!Ec12o$h{!a!TNQyF4c=Eks`CacO!hVEG*=6| z{HNY9AZ-@$P}5?4^UU^(QWpJKeB>n|s@0DT_n2_%RefPAXTLgK=R6yA?(;m_jgyV= z$r8(2ew0LZ9C?U2lgY#4BTGkYw#=Txa2Pvzb9xYBJTnk6y2}aFx|n)6f40XA?5*en zwt}B9-ZkH+I@I@`W=t{5fPYy-vR#sQZQB;(TWq?8MVNYkM9kWCfyk?$pz>NDyCz6g zL$@)bBc;h2!oFr>E&8|rWxur=#e-&dPB5iEbCS2f7jsQX|9|d~VcTW%GW$3opGB47 zv|sRgVcNeTszOVmdkv{Naz@*5!ien5;nRtmBWJKm2%XuBNaSX! zH4b({c-MydcczqM?f@#PZI_LF(i_2rEOZFDuLSgDH^R9z>n5f?_YsI!W}oBS^j+mI z`=xa3%-k7pb~l73j~1Yd<}-Mc(-Z6|gE|zz77;IEW7h}=E#m!_M^H}tx_Cf3;y0-m zokO8IR~>D6LVspH$yu?Iro-f?5D{QI2_2gbBlL>Sh!`95vSXg;CiMKhrVn-UwVPD zx$Bv^c_#WNhZ}Z7ouj&Qt<U3ju?}txy@1rb?Y8 z{;Z%&8)Wb>1hGmtJX^fRkXr5k=n`b#4_B>qR?oE5H7t4}`9t z!#VujRhO203HI%a!704}t5?4SiNfTQ$XZH6N6Dv+ckK{@@_ z`7iv{AYhWd*6}Yv&s0&;SZ0@MQ~(bMcH-<94kUV6YthyPPpRP4D%L& zjuNE6)8c=ua#6__&ktVqS?Ad;<~{?0@*DO-b6}knsdr51!bfqbbJMr@(pxX`-_DZ} zS!SOzg89BPoZOFjGFRdfyHxt44?&MuGM7pYq2WGjznuKCS!X9(O^N8xYqJKcm?m?Y zl{D)*UX0jCQm2U~ISE9Mk69UY?p)1jUffeqih?~~+ z=D5r&hj1I?Z;-dtQPm23#^nk%E#mx!6GeFBHRsUf?zyVJ%6 zH;DO#!woP%vJ9C}^OS|$Aw4Lr@H;vbStd>Z@sQR$_>95!>m{k0);_ixu`Iy2wC$z+ zoI{Oo7J$Q8;mgI9O!TB3H{VY_3tN31d#}~hMhfr)coiL5Pf`bwQFZ|b19sp;STSZ? zJD;8HCDf7aR7j^LC;I{J5en;3>7Rk1339>wn=Nd`*=7oT_U}8Gn~q6u==|6eTtTZ` zT)P`mQ)0bcWlnaw*?l?D@7^cfFPPX+2;8X#?qho&e6;_9>Jun2;*ww*Z$xit`ztRj z@mRKXe2nLhYGqGZ?tL$^J`gaKAK`0cepQLR^%8r^=-bQ$OR&)vd4wcUEK37Kd8+(j z&+I24Gf$#nySHn1uP@A+>g=<1N&@yKkNGW*dZjo8tURq8Y-`r>GFHlXD$lL8#Uxa| zm&d3pVUZu%BB=pIZn8zx`|N>5zN)VwR}eJwV);@F%I}K5$?QGGx#?r9hggBzt4=5l zJ|vK^H-9>cRWiQdqX4jIS;)nUj!x7#(xXA2VH|kEHbP1nM-7xMAov8J#@^j*L{vaf z0wUhzKlO~|=*6EbWWhvV`7mCP-9aw6gl4~#Dj>GHn1G@<5M9w2T#JZv^kL-9y=I>6 z$bOH)(EPDr1o8?HViz6|jGRJpkx+6mfInd9LqZ-QwIt6{m|j{@hJPMs>rg0YIF^~0 zUs@784qKer$E1A{sD#(loSB7E_nRVKGq?$Cp7cgY<9-xQA59(x>N~ko05sUI#R)|y z!F7N*n54}|1W&kDjlqWvX%qPPkSQ$< z(ny{PVt!=ixj&F%Enn9v*D~e0k0+5rIAIkiNY~Own%cW(B*oa9RyxU$xQ{o3lajRs zzZ{TMB!T-Gw0U4&a5lJ^)R?y%YWvm3_A`fY>68A9rL{UD9XtueEi{*)Nbm%6ANrTD6byYOf58w%@hS^uCod)CTa+-H$Y8-YvGeQ|)y#mHLPoPjdwEsM>eEq3m?!S_H73~nvIogEGV1nAwT zrD$ZVs}&0t6Xh+tiI2vbCgEcK0BmM-|IO@Vro0 zzSF7S9e3gz9@2-pRcK=bFL9K%o90{0O+=WwEG>JUB;9RcHnD|A`W8lYx5CkfNHd*H zU21PuLbqS?KDA|!bI(@qjQL4-Kag*CnCZ{y^kLTqHcB;?gU zs4pky4AJ@|(1=GQ)3M+Xz077iR+-5Q zS)l9>fsl~2ShDhCo6}^faMof_Eg@%6q*?)<9a0o~0fe%npVwtMcXf4hQ#uYKeuvIG{OkpvK z*j!=G5=wHVv0^*Fy7=2M0>?H;J1niuR=1MwuV}Lvr4MSp-JY)2=;UZt#GI#yfWkpR zC#pM1*NIB&<2SG_=+RXb)A@@CgcW=SzDqM;#_nXlP3FPlH)m3f-%LbH@Sl)KZH<*? zn!P2B{(qjPtFCCGzr}aKu@S@#nC`uRs;|V>@RTM5*J z6L}_n>=y5=#@yEQ-S+UZKmChPog@82?+k1uo4SILnHPuDJW3p^WsY}cD)Wky**_E& z*WPqn-sb_DnFBn@k3gcOi@nzS8c{_kNmY3r^LeQ4n8*Ll>UyT%c#>BlZ4ls!6B3%0 zG@@%~(Gvbz^!)4S8Bh{!5v|{;YoA+rko!?$W@Iqm~EB zpg%Tb_HW#C$4Bfi*+Q<#a*~yXcMiP89qGXyez z6Kquvl{Ltk5^fon*@9%2O+eDL?63%y4Uhtpe5%4;6T7!Hr;&rA)%>vNUsHkmS%nh! zhV4oLCapDO8Dgo>r>j{4|1TE~21U(We%|al$q>%2)4#EJS|{6o%Vgp;?q3*O;c`g! z6`}t%Vohzss9wmMStAF?L!H$-)FV1OO5=o}Oxo&AYa#&nE9P$cmbKt~=~n#kGwWlF zs5$O6uWPO^eHopeAq+N$zU22b!i~9Y{9hWG%HPh5yD2o~ew-Kl7SVB(vNL-|rOy=q zSQTsg14+UmGgWc78K#avrb$KqLz69qI4@Z}ZjBH~7G%w3g$RJWC%r}G{;!)9WU|Nt zuWh}?R|th9JUz=O+KlpNFL|dwI9k(V^ja7xZC8=~{|h_%KSpSKa65Vy$IW%pS0>fn zBnx>nt+}64%#J6TRPr2bQqRawYP@<}@DqxK`;qMLFw+#6%yb_+dv+50xwh9gu{NL( z=1YV`mMIQ=Zi|HIiTjzsj->aC>JsfD)DRnzj_U!HX=qlGTmOGQj-@!iUe)8;$yFW6+ zcYk5xDkU{pCTxxtd&z)lW4%k*ugU=p(r@EUe`_l3yEY>I@#zWs#By%rt%UFT<8f5s zadP-5CZf(hYmr)tl9%wD1)7UiMyn>W(3Er^@jt~llwi8Mh8A`*&Et~Zw?vUNE`bK) z>f}e`Y7&?(q>)w<^k=#*S^H!X#SiO`N0rwfkL&G|9(VEx7pTYGh18K3_i#I717_bb8>Bv@&sENfRkRvrA)o z?LKH0Oc+DwTFIb49{-^Q3iIwYg-o%3a8;POrf>ij$Of!T_Y^afs)3`pl~&aI2w`-d zh`Q9sdUw<-ipQAx-P5KQdGl9{)k)VUvGPz7nki zS7Hzy`}XH7VWw|&YXCyCxBA;UFENU)6*1rSo5#C$F#Xxh zpM)x#pbbeX<@z&Itj%g(;oGY4TTDXZo%+~8$^_{e)yj|lc>M1rjg12r+oIjwIE_*F$HPgS z91TGPPhi?&kxWAnMVzQ!8?3b4Lqs?t!pH~?vQd%xU$slcL!>Jr@D}Ob!X=HsaeRKC ziui_*wJTnUaRXK&+^1%`@BF`93z3gOqiFGK%qX-LORKBQT4+&{oT!i^Z#1hwAEVjM zFNWQq{wa=*YW}a-h1LTXLbRi)zyqC!iyR?~p&Rfj{%sFhvXO|n>!j;)a(FfHuxOrP zVKq<~2<^k8NE5vfiWp@GgSPQd;8C|@D zP4H{}g{=dI-r%E|l5qPoXDH3g5_1Rw6(?I%&2#Y)P(-_;#Zy|35HiBmO=_J#KK)l= zrC|BJc>B30Tk=wwM@+LNY8XungHQzrVdW#@7@{U!J;(x+I%qNf%b0q5dK|bwhOuAu zX-j4%6z_U=4F>U#^ltEy+-6889}c!8Vc$2iG6EOF+i%x8@kf#WD`aKoHtVAS4d(6d z!82PCnr`&py$>`6?1XustuWR2;L+_4M=?RY!Pt5?h&`yIw1LwQ@*@O|m{Eh#2JS5j zU?z#-v{JeL44(6TkmZe7p+Re`QZW+*p@MP;!CO)fg0RI{N{)k}=U~i)4C!!s3%=Y$ zjtAhRxOqdC4Hg>2q}FJ`4XTC5hKNYpBXqR#Wd3i!!}!70c>qz~G;uICYN@rRb`=es zA;q$(plE@d2p&RwG~?5t7c!1k()EYPhqr?)B&i2kLsI|g#k+Y({=jWk9HgQQ)7}9BQ#j5x*}$8)wPi}hCuve2)>Upgbp!hzvdz0RO5&g=GpVP z@KZz1^RyOp59D1L*j?n+ACEiCgL!p-+c+|gK_F>F|)$qJQ%Mq6`GBvhlf#Fz58U$ zq%je5suxBaRETa7PQwBUU@Tw0eQ;X20s1gKMt$|%XKtc1l>h~7-6wNU`>G$iiUz1x)b3tj}g)q@1TRo zwZ-m#m|jz9T$8~ck1gS&)^`cdWeiN9Ttu!dlY1y5GKv7e^8aG(UErgt&b|KxA_R@y zu||!G8c$;jr)ZOE&mk3b1|~2g10olViZ*ScMa4GO8Hoy*I5WcTHcDG3K}lW+-W#Q@$~tD;ujV?$fKpn-^V&)@6YO(cj)`%f{S*&GLlM%7RAQD z9WT!I{k!zoUTw_Xoat}P4Me?u+|~p)(5DfD>>UlCs&PV!_D?}=7{8U%3ssjH!Af~F)7c;7?Z>1b!`v! zs{7Zzt}ws3yceevhiZLQ@@YjuO_V2ll{rUFD6c45@i(8k%qk+x;m{N$EvEL6hfGFLQpwP%sOeOQP9>Y2)tP-PDL|aL+Dz2E>P7GcMCiR+elz{2lCd*JUfsRKAI=#9d+M&yngt1E0J*t4XGhbZrlS z#BRdL*hx0gr;UzV9aYaFsw$v_A$K`#c9+r_-=ZL#dKBoCowPn^v|=kSM7fCiKYUU6 z;=vuPpSFh#d|OAGg#^A&8v^p{0`jZ<(*W@cq6D?uqzy;w@}5v9?tQgXXmZSxd3Y0= z606!*{m~Q=n(~CimHcH0A|(di-#75aVY(393!K%2Jl3F+W4-wT^k`NFVE$BpN_bJV zhKEIodWc~zxycZQIe)ItL65vg1yyo!sNClP^Uw48{it`q*Dnsf-nWXrj!ynnwkoT0 z#s$LwJ{2HB#qufh#tYcXzKN}vRoy%36RCmqkD?;w=370&=g{Kw;0_ZH-q_?k0Vv-F zlrbX7rd|&j$_nVl{sGH3^0yMZKcT?Q@r}dttt5^#qYUL2NHEU+@aW>?zw~A$F}XK3 zLtF|dds^{}g6xJ5q3titdH}MI{2*=C@ncQ!uNAQyRPXok3Z= zpF#&)@GBWd=rGVCbfNYy?yCoryP{3=hNk>UraTuyu{im-nc6L?QRyX~Y$gumYhzO{ zjwbvf%VzPPi0c^SsPZ3s@Uo)G;wZ5+3gS2GLy%KGrM;f{Lmxi0tEXO{=*?>ImNn)= z0gdnJn7$wXuQCNkAr-r##twC*x_>$|e7vFlW_OAc%TJM&jpM+mRBJ`?vN&IyI7Glr z7Eku)dT)A5c%YLW>`y+6XH{Z@4e+wSt&~iQk63FEymz zTasAgO{)yoO|MLRzx|~m@Dv8DG}%$_okxsdd~vowE@&L$;keyg*OSsR)^Q$w#oe?^nP?h$ISyOd~El?5RqZkK&lxVSS`w>9}(IE78rt*0>kG#zzMt9DlWmQKc+ z2it;PizDl6`(y6kXO7=G(|xq>V8~6XkMFczVF9_XIH^qV zgIHxeMc%b*&W^%10c`IytZ*iD$K8Fn4*HiqdTr4pID&gYuzK=hWq!p)YH0<*YktU8 ze|=4eOz2#hsR$dRBRj5G-LpxLwO8#$8x*=Eoq~Ako{)m6)&>fc50J#Psq1ueiMjct zy=f@CnNfIiM&V6u;Z1enjbddJBHOlhaN*4dKq&uY7dK(=JOZFD7aNYDxcfbw63k!- z>)C)UjJY;WCQ;Ai_V&N=tIK4rr)fR}u@i~UEDCnaZAN!O#IP@STt~b-5TbTl-_bdI zkJdevfRt`u#B?jH*d+I@cvE*ijbQS5c!+HvH6bmh*0^uw{L4!=8IA)n7(ljX8!Z>y62p5K?|*M-{|u*IE6!ezZ;jUXt*dyF zquU0hv-f=vFv{RSb^$A*kQ(b;VC;YTEy?>}{#5i8r;^~8=}1?%>6e05ep~!Ye`Cy$pH^Yh@65q5j(wuu ziZ}h-obsYgw^es?PlFS%Pu6}4$#}ClwP%o`kh3~n{TyY^?ZyRwbLEVV1+O-*K)s|# z|Kt(ZWW=yGm%QbqTj2!B$=d_NF63kHpO7z)vays8J)LN4t5lAxxA3O;^~!-ziOojb zjQ6Wb%JU_2C<*sZJ0Fy)=eTojMZ7Rxv6K0HsrmYw&4yF)W|WZb-MfbH?I!@p1&RuB z0z#sBbgiLw6N%iiCyd$jZw!uMkY#f{Zv7?}-ySDZ!}Y+_5{Agl;X&6*>4+`4l@jk% zU@b0UkTo&;!2GQ@{SsP_k8TYIinaDKqQ!F#LsgtB{3hRQ_T)buDLCzZi}tm*5=xY- ze4t|+#^R>mQzrh{w3_aq6<`+{Odd(e>>|?tVJt>kx=a_`HIU%p1myuOWrR3fF(Tze zXjwy#R|;Pw1cS^D`+Lib=~%-B zd|4x^qw!oTH9;$SbH1A5P4gD7o0h^4A@peU|3n)Mf6^KRN{zUt&?9w%zPw|)LW}gp zw7{Fj0oycV+EC;E)wCcfk#O2Pig(x>eN{DhZ>IZ#d4bmNpjrgUsKi@*rGy{-u%V%lm>?Y5#66k-4cifq0VVzYCsoRsms6ujED0 zNwI9IP1m`@GD~PI@VivY+RVk@rNI z$CVluTj|$1tZ?$DiLV!J41|>acW}a%Q?rxa3`1Czq@_=b5^^r04}&Y$Ffn)c5-yQXg;VboN2;2u z$64&koJE;hE0254;ug&0Xr*MQ^Tf)r0=%8s5qY!OgoIkVgbMy`oyzJ`@ur(k<#GVQ zT0V!p(E`F>j7N|}1ZPrI+t0_(VOv^K9W{rT5UwM5eQi9%FW;g=6RA|GmRm2Z;)1Up z&sS%3RJ=O$)okBB%>Zy`V;sKkWLE5zP)Ylao}!cm>m5_7NXcoP?kebwW@ z+pyakT>T&X_+LBW3Nv1vni#X@s0{O*`0+7)_itO2@4{ZXA0a3WU`OSswTQ^K? zZ+_KWv^T<64Bo&zvhmI?$sT6jh%g^8m`tB2l>TWpHHEok7qHPAXMjrAkDt15s z@}0;#obZ;GuC3y3{6>H9zc>QjXW2^=jz+bBW^NDnFJ33^bt&9E#|5`L=4SsQcEaSx z@(+6i4{5O}Za4YP=o9!apl`f~n*M9Q%{wjbk*4Hsl@ zn^7x%PxL!le(Jw94{ z4jQN12dp~FiFEU1Tv39oE;m=V@uKz=xh{SLaB`g55YzMb`E$ba1n*F^!}25k9dF`3 z9_+TT7THx`UhaHV`%Lzqpho_@CD;OBjI{eYq;D{EIw!>{qci^Hn=F-n7-|;K_wNzr zL4^A;K@T}$RgfAgQDNEWQOQH1?$c4S4KXWKIh3cdM!{Nr&yB-k{tG#7aef^9tBJdN z{qzW!&VaKM57oxoxmr9I^TrSbZ#6H5;xL-`XYyLW&*^QwxkhgaCz;QC3+f+PJdC}g zH9ZY@I@-)Jd-{|>dpA$jv+Ift}RoD3=Jihg-P93&G5MOT5=9KyjsE&PIf~z|x7}qc9k>4agK; z!#O_RVvIjy&@4uwOZZC-*$RBXjb5*i&i?9*;gkKnyZ@KT?nlsSa2f!9h|d0c17GaU z{sx}k5j+GrEWL|MkX#lORo16B6K5QBgC8YWzWB{>yAp|#?PFWAA@hur)~ZTx zMqvY;IZ%5LJO+`j}`&#sqKln%i+^NjkP z45^*r@6ez0@q8xcZl!VCG5{~~k3OI+gGcJUjtQinxeUP^opjfc@72Q5-RRGwP~XsW z>5FsKrsx@RnzfgIxWhmH8)451l29VBZle}Cy@GKVVV}hM<gR$8q*uFqAdGg!-PWqUuO&hBHc0F`Y0e4fu03GwEVe+jz(e$%rne(L8T}F zsmudp79Z2-qfNW~5g!2&3kkZQc^p0+{oc2MiC$^L54f8Ix0TupP~Vgc`_4+_D%CudU~z(eBUBsrYc4pA zy~+gR6|ZNf>6z6USpyklXEmx;;-n=v4yu&gPf=QiCF^C;7zyk0=VA5uUk~x8IjjoR z)E>+4P5f5!yOCe`tDuye<^2AVU%~m6@L&1+>9F1(rB9AXoXCbbR%<@u4zT}K z7>kd3_aCy$D~ljzIZgGd5{JrU=d_6XaK!C$_p22S^j?-XvZw^2brkO++_52&szf zeyiMn;OBghd(Wz(zlfPy+r%H`y^8uT6DhI4G206vPgOEQgXLB|Yb3`-0#}=W*eTG2 z3_MpEcXd{jJ#=H|DwDa9Q?{X@Tr7bx#p592 zO##LKj!-)8J~`jU2?-B8EyTqro=7qN9SLI6vO=mF&M*AzVSHA{H4~`xu|ap{$qqSpDXV>4nB>oE_nw0E^~xyw>xhGqw6fLdu(ageYm5w zI6|z4*NPQjVBYp-DLK1~Q4_Fysn`?Qz@bHB5IolaEVi9_8?a$f14|ylAj?GU8Ax>% zb1=lT$Y1vNz*dFHH>XK|!KYNBV|`mE4QN>+uM*0|-8~;6uhI$A%*R0X3eb6FM|2Pz zZ{aoi@pTCMW-qa&xg)w?=;Fm6X|_jFWBeNRZmwQMMHB3xMF9+IboQHQY{@9hot*YY zyRub^x>>C{p@A;msWQ)3a^*g_UVl5ZvFrJ4_fMT%4rM|oUl#ajZv zn{%(88Z4gddc*pLie@(LoYLOhH)#-fWp|oI*+%O{%2{TtMhU+otb)=a$fUM#u*FZ- zlJJtbuFU6-)fO{bLeO$|%A}qtA#OqP5fS&f_AOkN56i@-%Ee>e0{z@6A@{6F;DR!- z9O6D^LSBJ{AYTp-v)7nzrPX4dUTELrc=G}DLgGo|%Bn?KG^l1 zV7)>HN}}F5EwrX2;nk?x;8@(}V2CWK`D~=RgvDE#TgBD%b$+Q`wrD;TR#jU?J@v|F z8#Y!ukpFm#LXl4|x!`rgat>zbV?(Yu0SV_F&Dnf5oij zh!>#MZf!gZUL zPGwi^2z|_oB^zM#dbXwY)tWTBVgqr`y!GRPCYC%X8%m9SXvO~R32lrzwFC?Hw3(y^bKUCkZx2=dDtdonugKX%`>5Es4u z#3Q_2haf^L*c3(GKJY6_Tn7_LEwvBr`*I#Gd$4`q@A*xXw(pbvJUN@i0QzANgkE68 z_%3%7DUUUqWa{z`8-{?l@}3tiF}Q~X!A9)?rT!QgV2-n;#fdKlUw+QN{bAdmObe%k zA)YdPab7=7_si*ib{Z9cla0L*>N7E0O{oouCbhm>utQQJ4ZFl-u z^VzI|$^`X{t>XK0-6xdr?pK2EtP(?z_dA(8bUUiRAjZk)=w);>#mS{HR&Pz;#a2I^ z3-DIR?Cc-kSz6p_wfCI5N_lLN#aR@kX* zIXCV5*6~Ur+`doSP2z<1eHD7^*WOf8ZUpfMyZj1tGN~QKecv8le5ftXw$hNdQ7uJ8AGJ1V(%!59CvGRcWqbg!$gBq(LnEs zz3yo8b#`)_{HJ$R9~m#fuesilQTH)#S_zC_=Fjvr;uVw0I&mmrrUxU^#-2sD$kq2|Euy z628BRHd1e$5FY<~gnuOgeJA@4f}Z+^x0Sw)X)d zcdv8L?(MH+33-o=OP08}gF_7yFJ67oZa98Zc0Wu=*xj8~(t7u~?05siP?0tgSl9XN zAmtj^&30fJEuM(Gfh4`*y4UO7N1e>(;EBgCivq7=>K5g;=_c#we%%~D$LQ2N^6tC5G-Un;4zT6lEYrQ3Q8bp4O0S?k}@cHGi`+DTW z4fQ8J&RCrEfAT;B@Qdg&D%RIH6Gq%O6Q}uuzr0M@wQuiMgQhDNt$5ssYx4Vb?Vy?I zY$AZ4e|qknzK6|ukntqPMC!Vo8*9`7E^a!X3&sf(bT(JUdOF{pEmxQ7!I%!2>tzR+ zqPi~U*3-B#UsF^*_wn(YT#e;KjU{_2b@aXVWetW@W|lEw-npcUwe~Py*X^_gDH0@N z2DrRYx7b9nR14DY8F`sEtp`{v^H5}-AOOvZ`^&#GPVBS z*!*XDq@0*b7KXF(k@m{AveOXbiwEb#2}{~SW zB=C-TQwprYyb$`{gA^N)d_jNaF&60XQwl`)eHyV}7l#v^sJux7aQVt$?WEBi6nQNT zsr`g5y{)T#zot;Jh3iYZl4b4t4PZ>RazSvGf#Br?9iFW1I)wgv%-eib7opO(lLwzH zy32hyT;>$5GCv@3gyWW|me%d4D4F zx&6bwXu0dYe}8AN?>hzc`yLoNU|hP=`|fSDGQ_2iP8{ytatB40iA){@3=#+L&daX@ z=J5^A>V~e98b;d=YV%W1EcE{i zPOoihDE#0e{WbHG{Ru=V*ne{VfpK@x@2s`*eVkYPiq8`+@jNJBZl8h~qk*>UM9PL1 zH2#wT{*Dy>!t8w{?!NL9%_1}QC^Kepce^RVkxOEa;iqZ&Xx;i96$iMAmDFvf)^JXu zjWSCg$al^)f}=c*RB9jKn zKfQ4X-y~=?fkjLIA0wL%b_Us!i-!=+s8}R~{zydo)c1!Y+T25j5N+(xg!kjA>7<*q ztJ!lzr`;g}rDJ}7kiMwpb3^#Fp6jfHD+l7!{NeZ{63BrfK%@`s9=Oo|g_#&Q`CasX zxGaDiCY0GIvP6*Y@hV}$@lq?nA;zW*f4Lr;KllEI^ z`2FO`0l}r^(_MU$P_MwLPGl!ACVppfF_|LD;G7nPM zH^iOvrwri8m--2Y5yS+Jp+k!Dr7HYjX)6%k%gwtgKQ85H+X1{}ud*GqWJ#4FXezJU zMnuCb_qZ|c!y4nPI^@EG6Ansd*ZoX-L9PhV_)cvrK8?mioC*nZj5+M4gNo$GjC_o zR3Nnh>CTnX3|)_433pw^>mU@K&4e$ncm0S2gl`6#aKX9;!t14K4j6~ zOoBgtOrBB*QwyZf>`w++{8xTpBBMWVJD2{fWCcuz<{*?TWqWihZBaw^A)|OfDtJ!55$Ooe$oAeH#gBUwUy?IQacbpKF=y1(<{|Y zqdPT`y@>fkKBUFszjEhgc=(;2P{arO#@fl$3&3u};50_u8HwzC-ZFAQB#~mMtNiOK zIYt!Ic|&glxv7)+EhX6<8j~pxKllk6%pRH>SNK6eC;I_nUSSo`@PGfTMU7walA!N) zTcK(DK5B-X%<~#JiQq1?_0o@UpS@0B$Xg%5zfT*=7nvBbd)>e^QM9_`yT)mkK>8ia zm^U;}Z}=xx*`4kOR8XQ4M9VCL5jxS5en&@52>Ah|+U(hhMc&i}1R$thko=0-x#P(T z^2}ZG>;v}Nf81$E@WlKke(m=~qudSJ(68jWZbR}|y{?Wc)U_W3yg|#z48h3R0m~bGOS#&|4!<*F2gTGCyK*B#g7-rK$Id zo!izqtDkXqrPdV(ZZ*b`b@8Wk4hwL4QYygd)Q<$@cWb3 z6r2@H+ioZ=qGQRr)c!*faS{R?umjZ4&?2IkrMMz>TE)GDIy?7@JbkE_@O~sNH6b7Pu4fwZoJr|Fdop95Xm;Xq~UhE{|ff02`sJj#wAa`Fl{xx*a8(iAByfG9S$;vD9l_-=k< z73uajaIX}C-bh2YhT|36xOsr|>wpJ!8?e!EW^G_uB`;{ZzO*RuIU;MAJ@>ZmF8>%9 zgNfbfCx?%|@La%x*9pZ>{9VK$c|-(iwUBEaW5RV$EV~ya$nOpSM&bJh!h%sBo_fE^9qJ;rT!P7U6*Q;a5u8eVxnY{UN{e7vNG?{X7AuaDP`sk z-VXZZWIS$wcFsG~1OV8CR+CdP8m}vPin$NG9-m*u&E#H&07}BRcN*T(FUH-s{D~{=Y2;qsrwT=JmuM$%_$LGp4Dahr zgC{sW+A*_PNrjLQRT>EqJcCT9tX)ggy+(` zvN(!Te{`{)aRnk(<@f{02>Y)IOJb(%4?s$D#gtu2hz|~3%D<*JhIrp~D~IaesIAS` z@7t1>H<>Uj&-+hcT$)Yue&Jlq)`s?V6~Ys6T6;wkbO<$rX0mD4_R!Kc{nOHgLkfa= zM5Eq+M%h-r`*p0}6saJ&m>&WZw8%dPb1d`|8>d2p6Wz_jN$)ims|EoI4t%iq3qUQ{ z3_iCsh)h;_E(-wf1%ffaUsnlb2WKsD8{+eHft+1T*j4MedVB8Cgy4Mqd4Rd5y&T$rmMv{YXlb=phPJ!-!-j zKaC@ke+jQO;+=9r)*9qN7k|9B*0m#PR0+j~RoL zMlg!vN{wV>3u(sUWU{){81CI>7}m5=JLbpXWHzZnFc#!T_AWTM|4w%n7{gPWD;h*j z*|J=fh)Yw*l{w25t;Bry>EOE$7+}r^gOhl9Elv1meiDHOH#&iWLD1J%V{Q-DOQrIr zE-Ui?`z*`yDoKzLwtFLqt8uC_XDM6#UjTwZ8bbbwuxTk z*Vq4w&qko9fJWusvPEHcPoWS!akS<;tu2ssGo68f5+f_2PlGlqbB0CYCqj;aYcI5fqFrV!~Ivy zjlp>*bAh=D&_r>^40SYtMd&+}NE=gjEM!siQXO$JpElJFUMZq&hfMD>c3 zxVVLD>^>9q%61ub;Nwy6d|BEg9>HqZ1h9)IJ59X0`*ZT!{mFYGob`wymnVVA9|oG8 z+XHiZaeWGqb3-~0-^F?OUTLlbUm>q_#7nVdeZs$Gi=A~%XMWa0<|df+Q_W2<>zd9F zEqj~MZc??`h=Le#H{EPGrgs6nS>9d}o%Ez?v&w^g_Qs@qTnI~JbeGVAH~o78zp1qb z9U?4^`?%7JND;*R7wYHcnD+zSXFNw8tY1l~)&*oGrw;X#--bHaK5!ZcdQg<_fozDZ zlY~E`Om=x_OO2inI)y6LHY%iy;Os=B;=zmj7863ZbsRxj#wT`}x%2{9NEGp9>v^(s5bCh(t@! zpSd$T5)z3UOXR>0D>vH; zJW#CPAs|fdZMeE9iP@&o39dSUqQtS@%HMHOxAJcO5{rl?uu^wTq3Oo8rW-_Zvfi4B z&-sgSUCqA8Qpp$kr@@T%c?R3o?qfA5>shih`yiG4R$TA0f82b)i9d^lxQ&=AbMo0y0&q-J4LH&Eo)DTiXFNs&c;d<6omZm#=(kb7 z^0HHVyZ-Ipiv5by6tv7X8ujwcV3l4{9ek@;@o!pGTOV5(d|?HlmGz>UR%hDm7j&z9 z->rJ4&#kb58ls-RcEP%l6$m7JJzV%e&*D7265P};l-llQF}U^ox%a;D*n$Z4;MeUhBxBgnjO4E z(5CWehjpiocHC#+8~5%u0y;w0u2Pl1@Tcf_{u47TO5xoq#G}?6j0sLF@TuIw?lv>q zPP(1an0Ub=P&u~`2TLI)9|tY@g5}_3URAqhNwnpb#LZ?&tT0Pr2anB?P$4P_>=X!> zJH4TQeR=Y$CIBr7XQ%R2gy79sw9U=wrIImKQ~EbqL_6uvnL20VW8&O0m+LkBFX}r? z^8~FT?h&TwSVfGg+vN5v*(t-N^aQHtIWy;^Kf{)w*>c~^PB25G+?eOT$>DggJeXl8 zGn%y)%(9btO*Hy2v-;rk>sz>WKCJrYWNa7P(EoNDwxnaui z*Iz}i_2}3rmDlKo%BG%~7*h`_)L2B&+Ye!WABt-1-#5{NoMZu;?fm{>v|Z2pnP=&= zJRK!dpG~3ZxBnvu4=TY%1L)1mK8c0m3Yl6B@l^R!ybd-!JPP+uzk*8}LUelG08ZzQ z{23fuJf>fVrCrbrVVVAMDa6u0v&-Ca0f?O&vVuw1gpHw?vK)+?$+=Nc0HUw~RnWPq z-n@6|CP9L?GXI8m+Aqtn^fffe{HL$ucdD0ocR{Yl_}s`Q@TN|_N9M&x&{WayuH0Sj zEM!4^cAl#%K{(VHuig1qA$wLko!Q?tPiA@ipU&sdR1)<`VPJ0WJ`o!3WU7Hw_GJFV z+}lMYV(y>rC*4`iFTX?h3$>j zz2z*w7$`(NyWBy3h^8vK6TZbO0zR)yQk8;NWN)QcG&=i=D!OC86(M9Y!AxVRjm20? z-g2kj1O0G>n3%ni{u_6-RwuKJ>tT>Lhv3O{J8)>rc+`*qm%A%C-c@u(y(!jIPeLl0 zFgcm)xbiNKdl$^k9?Q#i|IV$JnEP04>zlFS$DlT6b)5Dfoh}-j4eiNMtuC#gslhO# zh?2Wr9O2(`-C908RHb0@7)G!Tk-kl&RkIkm%r{{{q99cUWNvTvSu+kB`0an_&?-UH zH65B9OjWK!A6#oYWU8D_WCrRbOjj%o#%*+XS1gIP6RNJ538yP3(3N19$==B-o{3=H zW8K90!@^_bh*YuxN9l~*F5`f7&=@#6>2WYI*PJ--WcY6KX6lVf-sGJ(WXYvvEMbir zax!pggXkiMi!$a?m=oIMP34^QB#Kk53$VlaJXdY43pr4Y<0_i!NfaZ9oOpKgVUW}5tH@)O;0o6SjY5c_`;a`U9%B@ z$8JfrKWg7@vAgLr=@3gWDy`~(47P9II6!>uh4Qy8s}>}8OLE;Hv2+QOzJTAN`z!bZ z8Et?*TcgMSyvE3?%^tvB;D7Zs&N8p<0Y7@F>ZHHTGzQkg4Z4&~iIXuF?jN%1aF)Nq zhG+>Cw%L3G3vkfJ|H@Y{EBZ?nZ>IKCIkPs2CtJmx$ChW=#_ca6y@+}>+h4)Jo$(mv z*3k4$^A_hJkEV0gb7ajc_gYK5V&bd2_>7$R_KAB=d}~ZE9I!f1a#41H>DTl^ha)HRHm8YTQ-77qn0M}w5t*^UX1R>e$bc?U zSxq|O22j+0;r-o=@;sv}0k_Jkvp=ByKu(kIMt-{OWCv5djSVhGXzjo`!dA}?pBn-G z2J_jG?ACmr;g&2cjxT@(lgX!n5FKj(as(~aNA*(NJ*^t!)l&aQkC;hc0GRM~ZUD#5 z=fk(uiPCt zb#{rn3ooy3GZR0hIxFe`eZI5&a%kvq+EdPi`mcOt80`srH!J`$mHsV%l>`8UskAm( z`5v(A+Rtwv9Oz*dONlv5NI)lTym5-Q`v!_Y@Y>ngE&|$wz06_4UhwHNx}Lh{%` zJYW~-3C$KpWC!S^^I#`_HkfE}ZK&e-t~FYd+jn%d4%&}pALJQWu|x)AH0oF7M)CcD zz3$fR{gip-+xHoOe2codJ`dqB{!0dv-R|vg1b|*R)ac95IscI_2cWTyz98Di3Pdgc-$=SK}S5cIL#~F6cLsu(KMYrPBwVLzSFJ_%(Djw}~+>?O$fI z>^K`)S3q~nh8A}p63qw<|Ih#Wu-z@{8J(?v<4bIE7iqFK4`MfeC^PaG&Ywk03z7P} zinEIZo(CE)GpgR*xeuGIRA29FBN4olR;ROT-(o645kpNtg*yUN=*Pq-yUP&S%xyv0 ziz@r4En69sZBf}KTXu6$cE8FLt(f*!1ZBTe*(zJsN?G*|q8SfQJrb5x^ zJCT%-x0AAMec5^R*KJ z6`2zL9MJdN{g%S+us2B_6~k>E1J;mQ^FH3jzbK>pWyEV91|IeF!q{@!LQuQcZ}Bd5H9z73aCo{XH5km~hjO(w+9baxHh#|G{6uYZ~IT{?LfxWQ+ENRn#Y7SVL_mq?YZYW7cb_ zyT7D782Q0zKYi$A(oe=%LaSdGz zR7fF4M_?1|eI6fg1;{#2vErVl6^O!DWuJFntm)j!Xj6S9q0G;X5$qxAxdIt1Ci`qj zm)CX|cXc=Fuk)kMK3DzDd3S`3hYZ-Wv6*?mJMmVdk@cJc4RPWugDruADJQH>)0{ps z4dnshQwEFB2=(@dYO0tPC=;m(9$}n<9$Z0L_H@c5|1~KW?$K*GMR|#0(~ok}r&6Qu z_5cs{p5VF&ABX->F&05a3XWQ=Aiu$FommCE8CufVJD%In_R3?ppeGJBAkNt#XkF{1 zx^m$dI-Ocy3MTT5WoV4oqaBeao9*hygQz5&bCG|RA;NAIn*2OW5ll6ILCpsZ2nrHK zNhRjo`b$%69NL| zFM*rNS1h=*=(iA7iG^-$&kJv;;eqHz+_|`zN~TY&yp6)PsMnJ3y@>l|6KBLn z*wF<8<@6mTNsL%KW_H{V$pYKi?+!pTXZhp6#2{M$qhqhkp&42h|A%i`G&{6Ovn2m5 zCnNivo|0;zi9xZ=f7puMUeAGE9-HZz^$P%462}iS9k%P_7Zm4B2k+n}+>YZ$aV6C;Zo5|w{v}u}0ZRizGR+XUnc%BcK ztY0;${UZ{`w(l3pCC8+`$gCJ8a%#N^YY{4<2-{b$rSyO_MdbXMT|O*v(Ia7#YU2ID zBvQc}f}rqmFfJ<8^GD9V3{>Zi^hRJF;?9+io8kYv zZcd4p699wgfaBB_(vNYzlW!b|gxyeSxF=M`K#JBZ;ZN8E*?xbpr`XI~D>IKg!g`h& zu6&_9AOfT5lj%LSD;GJvvIFZ%fRBI(Wzv2iOQ;E!BT(L(7(#glz zwEZWMB`QuPiM_UojBezLfCpXZfr8|HUx2{nj^6dpT&QNsJB>kHY_pG zI_-%vaUE&shFOhxEg`?}410it$>H%yv@xh}bK=46BDf8MnTzNjTI?0|3yF@-K1Xl* z#xg(cJBpYRCnKAuo@ont-{7U?EAniGoH%U!b7RI^-)y@1U(Nvc^2&Vh8N@L zadxS9Sws5=HvCU_`v*q@Y+?Yo+e_Cak4=3rBFGqsf}IKY4r9b8=Gpt7>4cpENr7 z>&;RM)I$mq1qay>Zr^L9(CItqFgHd}ote#3Z%zegbsdg4If=Q?1u#9!tJr87{C8@_ zz00iy`*GZay<|iCe%s!cX|H|1ZLV0&O{rjZO3;uy>9?2zWA^TIfu-SsGAAP)5K@S| z;`32+f8K{|hyP^C545rTF{SR47;q7!D4ckux;YYWkK<$C}txqOYJ=&?0j!y zYR?JI_qxNSL;=zsY{Cu^a;V!{iN_!ZgwYL*xUeGe*I#NktW&6b;M3RqUj|PVv@`uo z;*c17PI>>7(N)QB2nW8Rd)WIq%`xCviCxbkT~x(T!{}lh7l{~9p9s(!RZ^4fVPjw_ zum`2QM6*%b$%9f8V$J(T1q!N|y8)q8X;wamxi6L{z9XaQ;$?IBDS_2rN;~%RO=nfc znv#{MHPh088lx`np*^&W9U;1wvd28voWyQ1C$SD`xJ)v%sa#~gkZUK_w3yS}S+tWl z>3?hE=Eb~fI)W9xbL&1jY9i4LEh&4ZL10qeA3C@g>kjul{|>fN&b;$rIsw}01U;!V z3A@(*jlO!bv0%5p06eyd%)HqP{E^EgrMg-#SWeUXTB-kBFU+DjKlnL2_npJ<`En_F z+D7F3No=;h`E$L71s!wWP31flFa0|V| zg2ojmyG%O4zjC(AEzPKWDYnk^E>&QJ#7_)MsgWhWYch*=oI^s&ZHP!7Z!SxwRJ6o> zxNs*&N()r;4s0MWxAw4V{0iJHXh;21XI@6myTR1H3WAisRS=5(Fb?%vVKv*{azk+8nsV3r$aK1Ew2g2Oa zSQAHuXw#g^x~&PA3S?rdEvl7m5oPkeZBXr72Gwr|PuHfKi zOf<#v6&dkX%rh|7AHpRRvEhF(6)m+*j%(Lv4S8s!G^hY){LzqXa z_4!NkTT|e}v5WZ`s5gti$-KmkMQc1by3Ue4_+{-$)U+ zStJC}vOYL6MBg;SwL6FAxWK+pZXDAZYg+U}o{_WWGdg()zWWcj^Ab3&cDw zb^l>lHZl3nT_nD57DO^h&a)jbX;Jt0Yxsx}`@7$InoGSRsTB;Df6IAmyhrV`jU!g4M$+vk;5P_DP(&H z@a>?1}Wq@Xwl0OW20yp2N>3 zh3P~h&l=2*q3+59{ksnI9qvc441!AQ>`iMfklki}N)ef6IxbB}u4f$f-2L(a|MlTA zef^HLT%HqcyTANcswPiDV0lV^>WlDd#mRCAMxJuwm(^&Q2;zm_UrFua#5Ne5KCiw4 zPaa$(AvV9&GGtAnD6)$&rN!v~b1qwlacnbOjbBD~ny8mjWr@z#8CNmML+WvKxf5!d z4?zd_Py9ES&WQ--$ck$Mi5mW0ZtBsd>!5Pp9@>HP+uPr+gA0I|$Fu$^tl6}<3h%7O zRCa{+)s7_(HzRbYcdNMkQnRqiaq;y914Fjk`MvM2SOR z#9t|w|8DEqmtlQWURJFb{~Z079rw9wWOFp`1xk;&aN3uqFyOW}{bO4VAMx zD+*j=obbG|J z$JvRU*zKfOn64<7%M!&8f6c(l|IM?z2MOG@hNf1kTjLB23Xs!DD+H;&tuHM;9H|a# z-Z^D*s2-5q)U8&Hc7iC;IDw#ws2)e_YjsAQZ5FMGDeWJ&P+ZQ^(hJUyd%sdYEgwz{ zxbrrkDn6IxNW8qf=*bVyx=ddspy>shvd5W)ja<(732x_3*lUprc6k%rVF+2Lobv+C z8A}0f4ENk6cx2vY(UZpvNdUaxLicUGJaSY%o3@kwCnLeMHM5zD;EOERbTT5Xz@lp7 z`UTb>!)#~*HBH$|OsCptJ?Pg{re9!`Q7DN9L30qega|r^@su-5niKWFFY(gsV5KgSyaVIUG!1^=wz+2Q6{JwoC)&^jACbm@x} zkHqj%N*ep&7!nFslX;p0RSeZs&=E*-wZ;@~*O9%k-uv1DD?~$PYy^x!OE9=HWcw+b zIvF9D4#*au(V`=w#cYUgNlXT9>7$jX;%UC3`XIntur2Vd7$zUWBQMs_zE?m_R48yx zW&nd3dw$5g&ZQc8+DZRX{rM;N^v9dJ5UiLWL|&^G5!Hbn?+? zIcA@h!}0khcx98f-Py*1x@osx5vOQ`)gpwS*}_poQi!TJbwW> zwFMwpx(kUlamIM0NQY)>OvwXO;`~f>PsNfj0==h8O!%YBPk00-P#L0`eN=EyiA1IYf# zuo(L=>0`91CEhWuSkG^IfagZU0_om6id{5$MBit$E}UDA(Z{_xEDcS9O-FOZ08!C6kvyCuc97+s| zG4pL;K`~q%GPAL;g=n9~!t*(^_|+(>H`f32Px0=XU!rs1E+Z{13Cu7SoDDRv)2NrF z)rwA0v%ptuW8d+HuL>#-_ZRyf6+te|f$i(rX3G6oHFE+7o4-WXW5mD!7 zyPO-ZVk1RbQ{otl~Quu?DVG0;D% z@82!HIk)^&iz|Tt5dr+eb)8FJ&P_m{_%}Ju8&Br2QM*G28oX)jv`0p^3ZX5ngWL!s|bhqM{y_e z>P%SmawBK`5@U&3oAqm2YPXT>{0-Df?{4_v*mh_2`pb3_3$eI%gS*RK5qHp8-C1~F zS-Zhm-Ic57tlp5jbT=LFO8%Z#BK8@sUvYP5bYOS1qhto8 zZ&lrl(&X;buP#fXOt`un)ETY`ru$MwHL!v(nE92NgTo2QTN>@rJn?wiqTmwIj!qv% z?iDz@&jBh)|`qd~Fro5t*jD z?z*gm>L9BqCwxTc^B4de!#e1DRQM0CHfPXAV_&<&JGMAZev++wq8()$qo>z>ZW^j#Uch?wd7fYiYn(TDoio~%8VcSYBT2Ou1zx2ZR%R!H=|rt{ zc`xoBTGLTkd(yX_kkKIEF;>|V+GC39dXvZ_SZ(x1W~&?$&M}Azw~CJfMiSiB*FF>U z^Al#bFH#wkQr0)il&8K{UR=8k&%NltyF##7M@dgynN|erXsL1VTf@|2wHtSF<2e{L zD9$8NNB{l9KjY4YdMo@u7jeRmFxC+2<$kLMEtT+6Oz|1|x0 zsERR}8H-{D5zJVsZq(wFvLCR7^YcwqhupmJ)Vb+(?G|?8{uT2kFmcD{CoY;=s*Yb- zo;)1^4dz8}4x6{Ai$1Mz-c$)DK=3s4#yL^*)=_a`kR2OG<0lO0^*~EWlQw}lJqVn# z`1n7~SNDhJO9mE7;bG@XY!>X#u=!G}^(?KjzG(-}mmvstzL<&Jd~HiiihG}oyN4Cb zRd0T-5}*C>JpC>|Pe0{6;X)GV73Mu%^{nBtoPCz$!KsavvAVs^jbCB~8er!EOp@_D zfKM{(OL;Chw|Ph9)&)EIaQGf2_|9Rqh))20nIFJClT}7i_yy>}q2<|c!U<{4-94Z{ zgt^8sGum-gX>`06D}s6F) z_$@;mQxoY%t6AlhTV2$t--pvNn%B%`&7orDV7KdC z+yeZa)r81<>I>TGF6%VgT(A2Nd)4(C+uXL=g8RzaUT5{zTs>#?6S+(G;R9aD-}6fC zHv2F-fF2AAB+i6iLL3O9!1tH}_*R}C)jrptea;J&(_2{sgBOgz+@$uGBrZ(tKPd4Z zsr@4pV^gV2au9yPLcAjKtJph=0)6Kf2y%)m!=T&kqWopIz>ShrSc$ zJ8(2z&EB;*1?k{=CMHKESaR+=C^03qZ)D;K!~UD2n@dVZSt&A}lc=fC+lh8_sE2Mh1^;F5?_enSGxAmr(dTm>Zhu1sl$3Z*C2knH0KTmBc?Ms1gsZCWT`%PI} zR?5sgy|uj4Q`TO3zd3)P8DL+ZRvsZcgct8!$Z(?WQ_k({jC=yaJrh;&(bT$;T|19U zy%#ba#yBTn?iuIzEC7nBUgi9TGP+1WY? zp-8xE=Lub}9hZ8sI6UTw@Wh=8YINp7iG%9X|4JtQDmn$LQ<*b6$eF4FzZmOB2Zr{2 z_bzNhm~k_8Q-j#!DxP#|knCsbZE6sUd6x@sw#-O_+(FB|mPPFfQQl$<0a~2&bKKNE zL)iS42evCiKwh?CX9u>8oZXmuuSEI(BE8MTedlS{9$|+3#%^1ehWVNXc$IzjD?G!Q z>BHC-?{4nz8kM}YUYx@KL0SCIK)G~-j8k+XEc|aC2 z{l$TqLb86}X6p?fYcSA)A$B6z%WS2tdXoJG7k2&Gb(U4Y7K7g_;?<7CzXOBYoYh?S z_1JnJ)4mp|0bys~kIefYQ%{T3*2`WkG-kd=ao#J9P8J#@qaO+Ih{(Xun-Wbn(a-F` z{4xEM1!vGt_|N~Oc&%Wk(%!z_Az}+0rBsPFJ)BFRBDJTsoM^{_P0ilOA(Qi?z+02^ zB79N!;)0NA{ZmO!_EOY?t9*wemL~UAcnxIXTablfsJwv>Uo4X|?V7V|ype`{aK?jR z8Uy6SFBHN!`C|mA1p?FLt&#*LT`K|PR7JbI^srb#VxZJ$3mlw1PGkQHfU}02du#xc zd`#OYPfYU3Sl1gBVbCxToT;qbYe7;Q2+)Wjx9li_1meG1k#7wIlMXcC0`exx{$CFHfRP0wX3+kOug$UZHlg1jUApu5Z3}bbGz@X>DPXv8F09 zx;?4;Ds@B6GT_7!7!Q;rjvAa@iGdY;*_%z$^x*6&<1o%|->ZeQ2_506tKeEy(0z7X zhpoW`fEbmSHo1}oocx?vcy{Sm0-IX2f>8t#rJo`ONeGiR6FHB^s3H6s?&+~kXH~iU zQ&F#7a;W~czr&c9CU)eT6M`8_LNzyA&HaQWZd)?hFMJcS$Fyw2^R?@FzWIP}3!f)( ziLjEaRP*M?-2S<>J2j^E*LD1sK%`0vr`g=-n0~Z=Ra&Dzp-bIJ^>IX15jTk8^P7dU7uu3tS+XkRZ7z}yu`S@bz0Gfh5=syufvJ-a4~bA>l2 z)N$5(1Z}wHpwzw*$p=(#fAUX(^jYC@{GDOpa^feb9AX_eEb$-QD97l;w{pG3VTxfL zlx))m=19g1ha@yIq!sIgue`9EktSZRig=A;i<4z#Q*$dSN3~)BF!xLzjaS2ZI0+bx|6(`~Lu26bQg4{kwBtMeCz#e%mN~bc!0f^}DB~E}jNIO!O@)7GnW%2`1W^+aym*uLCXPo7 zhcaa_aRgpyXbA8@Yu_*UI%&mdiZ;=#9dgi;b<|P-nevXs#W8m;WdHq|aH|~-mGEjChlg&Fz3IhH)Hs`?~ z+vv76mvu5nQ7hT)RxOX?*#hS^jCHOqEe4O;lKuZfK^SZP-2gY-EmOr85sY?n~?9TE| zBXT&ys*?PFRLf=s!|gNjfdhLe!Z!Vu?@^H*H*+h$9rFiId@XTgRyhyEuXh%2-KoeG z>2A6Z>fcbDc-`&7rLSu*4De_d^|jR6VRshs_qN44uwF=ASIR+Xs`>aQkidsUfxTEh znnG99ol+WuOh@XPalyIu_mWE-Wj+VIuW00qgGeSydJWefZ_+e#vaQ(A$Y;FB;U$n! z!tkW;;5M~)FtIw7B`i{JAF}ZA$CXW8YU)=B(BP^67ZV0wX2rrlH@`K$ZR()l>HP>W_rid)AuoRjCnKc zxKkfcpM?$e9G5sN+O$E*+40Ri6OlW1LgU};JKFRwTG!Koig6r|2~&tW{kGPzX?UF*ex+?BIKhu3j92Cp^xd_rD7*S4v%D7_W8ciE8NHajp ztJ!|avslN>Rq&kh^Zi6VmtHqEd68IZ$$CxXb&`xpL=|PqNgT|m{IAtrTU5oj__~w+ zZ<SVivH@EWX~k;b`{=mCln>m;e-_exrXxLWwr^x_8b|-b}B7%!|VgN{o8dM zEbLn-ph?pjt(qoT6Mc7kQya)A4W%}NwE`R*;c)P zM4R6B;=7wsiO$5g*WD%+1hdKTpNe*zw!80e=F{y?)Q~F9j(&4%HR`aA*~K<~E{>Yd z&deK3#JsXikiUbHn^XG$Yzn|eo4QdR1jv6#31)&VUgVGxy_0&aSWC-bCiOXcbfWr< z#N0@KY2qv|eh3rNP0#*Fx74Yp`YME7vj-DD@!|n?ZEn5Y-NJ5{!!C4rgRF_58@f_A{?@n1uh2ws(P# zvbyvC6Br>V`b3QyTPm@QEvT(fX-gC|LuOzGCYlOrRMh-7sl`fb)EPy&CC&`+^l^Yz z+jV!lt=+o2w%b;>wN|Z{gj)b_fY;WxqE?*8DBvvwMDlxo&Ut1sLA&k#U;iI3%{^{7g4k3&eJPk1N4^&Nw^l=eUQCzrlXtQE3h`CS}txN+?_z!bVi zh$`mMg;D7no2Mr)NH17Wo@&DFL5DKHT8^;!`K(;}Rs2vd)*>^tLd2tTck_}Ha&fN8 zn-aOu6D<^+<|WEP1+T&*O8B9cO39t`TKeS=bLZSiaGq{?qx*h$xB@P4=K<04sjcVa z5@q|NUU{i&;?(cLMg{*~ZE?(jv}{;Zi9R?a^&?vnN%MiZsqc!%IYNRw^pNV4BaNOI z?B+Ek{0_E)Sd92tFnh_Gf6dIzJuAe5RPSlv)GZs4JpLmF=>`5L(K|#UBTSPruT_po zct6uJ4gq)}_=^02FDjU2ifXfpLDXrNif$$VqM+^{q-Nz4%gVpC<3+N z1H{n7slbFQoX|WQX}tdwC^n!Q?Z}SN$c$P2X;dh-tBrOw&5KMOU8<#7srKx6%NZ~H zvoH58GXq7Q$0R(Cfv~OU)5V@0M&H~u=~qU8)W)H;@d?9^NN*p;W;wnqy>U44FEHId zgH9PPiJ2J1d7VNP>CFSZEFr67Mwr^=f0k4_pJ9LyFydM4XOF&XLOZoJVL{Z38|8@`s6F#!nyf9XT3Mz zHq7mP7JmZfv?;7fthL+qIWX3mX(clFnmt=SGkq?zJ$P-)lI+m^(^nZ)O0b@vbk8CGz!n;o}YIrDZAV-w2-4Aj8pi7<+nwrZ&{?gs*CX4km zk;1I6{L&$T{}QjjAd+P=JCf6SWLeU&73A-0hSM3T#ly#p76{IjCs5zS7ZV7Ts~dA)ZwtGB?!7Uf)6j{M zkB$z;U}+vxll(ixyfIsnC&#=;?qFc%G%#0aOQRU+{X3|DzUwqM%(=o@(lEzsNZdtD zzv7N_7qaV{`BnSG7A=p1MWwU7@?n!$g;+OL5|kE+zx>F<(aWFuy74@hon$hGYD+0? z;jprZGd=F3tqqWGvGwJCGV`>s&EIe{o>5V>$t>Jdv{ zqFzF%w6~<$ak+mU^Ka+7$meY+P=S-y3?7M9YfvsdZw`MhZen6D;HmktCT8~nO|f~p zSg+^J!89u2zKYH*eK1}2T4V4eQT8xocmBP%?0#59P`Z|AcGHq4z1h&gH}-^cVP<13 z;W3om{e9RhDqfU0V%EA_#9frqY41_Czi0uZyDRYcw&BJ}MQ(SB^&`l{4%Upujh4r5 zdRpJqSDz^7AvP!KM4pY;ZA^7VGuvk7Mn9H3#&6LatVXtp=n`b%oSb&se zU!I}p70RiTXA54a5p|74T3zATz~D*=&?Kd;TCXm809 z-tsE7pBucy>vK!gz*Dh?zR2sX<*9lzJVW;dJE(~rcE9!(8x5~%BL}w_0)oQUYSI>B z_zg`F_Z7AgsyK`O#XpBOgY`L@#WeFNKf$H*Ip(ADIXIWGy5FbP`M;$|0RKkzA(Y|& zY6v|R@0no$%Ip{aIVj9hgjio1IXi|emE2&=f;7FMa0{*4P!L-5O-qy~j{~$1xp&n+ zqh4M)6X?EZqw|HCO*h0jSyGdXMB@vAM8gX`DQHTbpb|Hm5*O9aalTOB|JwigW34K;gq8J0jkfRnqf8GZ#_15I;#+CI{@2}6PaaX9{$_W4F`KPo_z0ec zP9O$AATVY+n7n1ONed1*><<(=VQ@vU2e;=lh6jY*dmn8B%Xd&v>gJ?59vSE}H6-Bf<)kQGQ7bcT!Y2cjKa;9wzv#g>iN8uk{U;G0z3C*MQL>9@n2Cc$=$Oc@jjCVEnP;A*!>-} z&%ch?XR=##x~982pbmSFvF+O-TQJ@wm*q)_CbLIM+d6`34{9rQj5b$b7BmPC!PV{A zbA_anf7I-X9{+RxGoQ6r0i55X%PfY)5U)?cjcoNztpKjAM9E7**34JgY%ine9yA~{&U|$ym z@sI4H)EIb}FbrBVqZmiF8`ts_?01{+cJcfP%Ee5%ddj7$Sjc_M5a5y(-`Jm2sHgW$ z@C%Yla16xpZ10?At^o-YMmHM9^0iK88RV_Aavr6pKEWgqcbC6Yj}mlb{{Xakvs>IJ zyLTRz-Z9L5e*7NyKyE3wV>y}spsjCY2Y!};z}%7#N%KhR+(Ys9&e!!9a~Qs*cVY$I zNB(!o4+zT{b$W3HOrT3Sh?$3Q$BLPBBIN&HdjM z<_?o>Ci=NbxA=DIF-%74`)K8SZ8Q=!P^;P{N*hF6vMMXkN{)VA8}>b zsAz?8-BqBE()~v{*`?I^R|eV_dG~Ae)=wG?tmp0AYvxVCC8Ox-ff0|=3@g;mTiAUk zJbquib>Bzl{~|4`jiQ=Or=2! zR!`=yvr>+$O&kg(QZYMkz<U0rC=JGcF z0DDk7XsA-wiBuUcSZ;BzUbd0J#XI}&aZ>=-B>+aZe^~nEVdFQORvr-0C66+SPRE*w z0g?~bgV_-tduIG*MwrOWe;Rul?wdn5$Fi5n!A1>MnC)6n8-Tg+*S3S*_cczo0!lb= zmeoN&%FMhunHFJ@Rmag+Gj~qrTqUeDe(g1Xfs1=Phmzm;QHtkd^?o8f0fBw?2q17tx^ZImh{Ioa2bu7 z^>i{Hs4d%{`&odJ4Hog7@K!%89X|BiGDlIyOl|fBc)bCD)tlixKUm!q7Qj}Q*{Yf? z?w0&6&DMO$my(O_Nx^s}I&@Yk;!N)T=jobarYxU8Vo-k-%6f1#*ElA>V1>zaK4oD;w*of z;mh6@QFu7LpE+7Hfy8feIOBE?V;#Bfl96nY4yqv7{puQL^ zj*|+-SX*upd1#BFt2Gwv&oFhYhVQ}rf-H_ool!sp z0+;UoBkW}|dn`MI;~QU}WHQLX$^40lmwi&1|1?kXPiK%za-6g3ahfM*69mbs_wDns z+_G2sWLFJNc0EM`1VoFepZMQa9d_J%k4nw5@I8Ade6Ml0lC|HQVV_eb@9t9=(@i+ddgt4XD{Cx$iX!MJT?7TmUw zumSK}0~Bm#-dyATPN11d$1G zDXKR~T6$$Tm#H;~1@_=_MIkHD-RZqxMvb_0udVldp3{3d@Mp4T{26LR=S}BcTb*2E zJFD)a*-n4FS!gO8tE^-AV&K&x^g1atcn$Vj=U&^)N|HMF+EzNWUFGMF^P+RF?cRK)T}fK{ zm3sF%zm5O{=~rraI*q4~&`Piugb|MZtKaJVJ-bc)68?tW=d67R{`e(kkis=A*1IJj zli)RWjB$h&Z{2{m-}TVu1=sCHaqI?MbHJ}xtn&N`$BC&ET5^24zXE@ENRbAe%^4@Y zhHnv8kocDp-d!;+paH=!XJDQ))p*rk7i(>+JGu?Oqm?_II zySE*BYXE-D=;Y_ZxeM_=w}IfMw}w`GM@QT~^1<{BNphAy^TBppOns2rA+`~chtXKk zz^{ZR8An45vBY)e!1mQ0k3K6Z%g8qsoaZ>?RP&g33}@nw3wF3H$-p+vkQ}L( zz*ivOOtijo{_Jyd$sKJPfXp8HI<5&Bf6CaeIi?xfu z$}PP*zxhK}0wZ!v(KO(S`~$yeFUxWV-{7qHAzf8|#v~T)rqan`B z&3Vm=*$yXnlRK@gXWBfTKGp^Q>ij3Q@IiB8h*ji&e|ON{jkgs(8c=SwGOJerz2hv@kwPruTF~c90HPi2WvqJMP%Z%MTzDiEAH=HBiKA-qYn)B`;&~e(C_qKluhWmlRcZI38QpA z41Mdc+v7_&-&(VFw6m#VQ+JnlK>zD}cYYh`{fF-Dl_!;9fbDjpcJW>nqTu}lqc%>X zqgB3?NDO?;ZdM;#n8NhFZ=fPUVJWsVQ-8tGZdPvecDKAI%+8|H?1%iN#fl9bTX;fB zb(lBX_zBj=kGU&Um1`UYN8G)*S}mlBTncadaDSTb|5K=L&}=TN^&TqTS%sy3^08?Vf6m;%e zMlDWek51uzS2>xTJoxgg8JusXXuS0q)}G3rF_q8CRrPD_hq=Q7698Xc%gwoMBxrz- zrB0(HqeeTd%%8~-Dp#zfBW*t?j0jp=SnG_;VN0$(oWf^ zw?}RCCo$H+tzz06+^;xyai6t{X!tQ4v>=_11u2S_8<0@Us2KD}6i&ZJ%xY=y2AXOS z=k9zs{UPGaDL`v|<}D|yxQ9|`xvE7*=79n5`1QH-KQMf*(6cQ}9!Pt5h}hhNLTHR5 zCAYEA6myMjN8lKC7ByAXj_*!*-_3KyMeWqxXeA4|(0bJt@e;#B{Ex*OGL`Xb!rd=d zbnnIA!M@?)?!6VTTjHJjcK^5o;Jrqh3f*LN4YUbcae4?Tj5WW({S;mBMliJwJqfMx z+DAvqpOhP(QIyNyyJsF)lpqAnQP($Bg!la3@;>%#8Qx&5Zn-@4m35>J?W@OeZ{`*1 zi@N;}um)wu(BqM%>MzRnqw`-Lp)El_hGys>18Oz-;|iY{T`k@&x=Jbmx0L0-e{8Y5 zU;L~uj|kD`U$4SFx72fJ0aF|7L*K$mO&!sAgCR~@gJI1R-{wTijqdfnS}%(Qd7JUR zIz{mHx*JBXw%OP*tm@oM-IbWcGUAAPQ<{U7@# z>ltR6H)l99|4AFWU#SS^q66LgDu!P$I=dw`F1j*w0nOs-JIvIv$BiNDD1l?5n&BO>3mJ-Z)h?B$?H4PCzL3;z^aeFeYr zW8vLvY9`dA{9}9})*93fRf&Fo1-bIC4Od)PTcns@I$f2;+`03cV(!mPO|xj$ByxU9@#i>Jx{@Fsug38%6gp~*)T5GIAl}&OOxCnLaPf4q$oe5h| z$cLL-g@L!D%HaltkM-NX^_lYgZ`U8qTCcl{I*jH>B=E)e$PZcAfvpIZU)HMnCjnu> zxf9DRj>Yhmk$#*)iCh>AmpV5FN#Fg(@Wl8H+-~FU+wpE6N0J9V=PY|z-IGeB=%v5` zN5Xwl+Euaf&&A5OBytxpk8{@JwLHNcY3t5HJDT4#Orr7AcE{>=U(3A(D*crM@j8q? zLR*rvVmVg0hgzw(?)mG_Oum=>udBfGnd%J3uA`e z@+C7?RJ1qxvo+D~#@^d3eqsNJKB+hRN9WrkKVwm?W^b^WsG_i$F!mjr->`e{03yn^ z+Od*Reo}KymJ-ZW#4j=LDggFjyAQ=_HT!U?-G-72uz``M*=_hqZ?)NmtF;Z6{4~9$ z+%*ZdlEsz9-PcmseeK$P+G=-bko>bdk^QE{*M}~p@=tqkqkhdEY_>`Bfgg8~-K-r- z;-3l$`s{Wr-NX->J;3LCOh(oDkO?jtY|1W@@kw9Ylxhyrq_`=Y%Iv1RpLD^#@(19{ z7FO;!n=-+s)EC+jEEYB;ZexQ@Da+%&>|~a#hCC{!ZHX8Rf97m~miA~<`G!pG781>1 zp3wvU$oxn9RL1A+dgQlXzZ$d1J^dq1hoF8dgWp*2+Z6n+)^D<{FDtxza`F;^eLVM@ zE>dH;hwDcaD^WjG7+mo4+G-wnAE(03_>76_$$P!t)qxrw?l}>|>55+|c3XyIGk^KX z(=BdkHn;^sa01u`tJrlDKrhYt_@S4<(7&#NqhjKwiQ7yp<9ukWDB~Y)rwZdj%LJ(4 zeujal;a{(_*QMmu(kGrV!`L6UN_(}ex5?1;iC*a8f=1-XheqPig}mF5s{OXy8}XY zEK4wj#bpbRTF1RmO20gHJXC8YI=bRNlqq=x31$VH%ziq`n^_l=UTG#Z69P0yH*4x- zO`NRT3>29bv}p=>S6vODr+`n7(1BrL)8O5V2@VeGHHi8STi`B!h7`D+1PjFR00*}l z9DI7$(PjRtMgFYiBOCmysP&mme9^Y{YYk(x%qVf7T`X_R5_V?S@(}LaPVKzh#|yU2 zfj?BseGr>uPr|r79=+Sp2rvU;?&#Y53N%ur1ki(i2?Y~UR>#S2ZCIw;ODhx=ChDAn z$!(+;BK_z=7p}(b_amd2ORDB7ql3Ig+2(h))z&g>bmlnXP$~-IX&db)zMZOXLB#F+ z@rUAlFwr}Ydvm)>6Z}8l*t8sQH(Ik+-HV2iJkQ;t#}JS0{x(rItC_^1=TQ8AJcr~R z#hgPY>%pS>kDNpCzj+RAxS?E+d~FhStv7_x{6fW%!olcLR+!i{X#nVfnUBm;Qs}H(s!YoB2u#7oqPEHN51P6 zd=}8)6!ed#u|bNG3yz&d9H2heM$l(mcy!StOp(7zg&vMm2R-U$&myS^q!W1&kN(EZk_O;2NlOC5?$ameGTZTodacUj9~VA7euz^r&4ffGLDb9FF~2$xy@_9 zG`B1HId5@w-Gb`W*!04=eOMe5PA|1>&~%7uN@UCctPwd&@gXm-*Ts>#=y;--|1w&2gyynn<$ zxw&7vPg(x5{1@SQyz|W!bO-NNcyYk+i2xmA2T^l*>WCn^6n94H8G>z%OM?7=KRb_0 z;#nvI;b&Z`{X&ALj^`pKezo*95uRFSxXWMA#N@I%b7HR17sN5S@qIfb?;ozqA~xfm zMULfOdnD$Cv44q--winA$Chu|+F!og4M#2y6Ikdkf&rRJP+3`zAt?0}?$mK!8SeNH z^Q<qhQeJBitgR`m zf)&(Io$q;io?;uphhN8ntGq4S`7%-vWOX>8!cB7O*tmBwo9e~n;e`8K%a}Px`CEVv z0fjoHdTRt8f|p5xm%k5Ax(_pOB37xVkQr0fG+(SCppjulc&orC-2Ezp9cDmiS^z@K z^w{!^285rufVbTW&YKmwg?aCS+AQL%(!9xwbS-}Zvyh~4lznRF*N-7ir z6WnBWVtx^aXXMO2oL4`~S()Anq33hVCgQhPXXh zrmdpui;Mfuo{=kRxu<&Hs(hrHZVgas z-P9;2zvF^mGoGG?$@W#J5CASt0mY?eXe&eZQM|mFiW{1O^3B0-i+=l-M?!F#X)4Cu zPjy+BX`{52LFe^l`FBz3l_+ImA2u#Zu6KU4;Q>ln{*Hg$!;}~59rrOR$=#qB#5iN@ zpcP}^-dvuwFw0#Eq_O%6L*z(jLt#Lv6jqw;%Ue8@ya@%m-+}ajQdt28g za+B7#P*Z~!nI!w}lT3iU)1Ayj8f(Pj9s4hhpEt40{e6NR>?O~yFeQrCr-XN16HedA zIeT4hR(ai1_Ef=)Fkj+Qt%sFg<t;p54YuH(DWb zoI2$Z8Ui9Cm2Ob+tO~zUBTY;eLRV+1}BG^<>Mk!;U405~yK_Z&iYf$!{&I5|?mW z72vek?ZtVtm5lvsp}+Js19FR7j921+Vdw-xEbLR`LO8h~>P6@DHe9i~;E%Yn z2v;F`z+ogzDu2W;%D?R=67KQ;fB3hJ&XK

    kD?kx%q1LmKLdWWjOnmYq0{a&%}Q= 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 bjEAu_n7WK$)w&pS|)?A9p0VQFJ)) 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�O&>-xz$gE6W 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 BrDTqN{2{_io(9j9xN?mTPqatZR;>wSb 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¥u5lSdC6Om)=ajtqWk(T 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%0D9pwV;f!63EXC$K>%kfd7W#ke!? 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�Juyq(J-pG`ze@?qUtm36CGK&Pp0T}mCdmDY|c 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 #dF9CQn=RlFh#}LLT05^3{2+hL- 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�p6#4^ zKUrTMac1?hmgU#ct9zn@5z(=TaJr5buc(ST;g6kW^8L(b$O>5XyL}FH)K`6U? zwW}FT8dXa8HSdcnh?Z!Yq!Dz}?L616%)hxP;}yx`B<8SLm7{}U=vpC@;Ag$k$9}jy zHF+ndtJ@m77^A$lPh@FscM_~y2{Lyx*x+$8Nf||^z;J%*0-&;Ec_M%Hj^#k$DDxU6>!VZslSPCA+9Y>~*62!O>6OX4Zm#RieTej_Mm_^#acP15G=IH*l6~U%ntD zCtS$KSqRVM?-AWem`n;<;W%oG!3#j<*)~0c>e{u+Q@z!Mn73ljS>!Zff{nB z2e|eUnGQnaI_WgHqZfLh#Zg5;9WHo)ivfOrR>DtBCaY*^uc)zqSfO{WLb;^~<+dT; z8@Hf5kX0O#qvrhUuFXR8fT?oSc?ow6NCsKdc~I}XTBmpr{g!7%7cH64_-8{eQTDjr zp}K_xf+g{5-jN-`F2DGpwL(&99qz7>CsjikkN@!Z1YjDX4cr^SN2$R4s=1e>6|G6V z#KDeYZ|OH6A!EltzuEf>Ou&*)a)DqvW@{N}=aB0GCqtH_yeCwhYV||axh{2h9lhk{BRBs0l z$qQ%e?bMWtEmrEa-$eB$qk1RoTW=z+w~=}uexL1c)8KkXzNKFKO;m4VRPWXcm7dz3 z2?|cdJ42JMjj4!J3f$F(RjAp^FY{Tdf?>#*GK;lg9d4riuY7K*@mJc{=LV3@2sZ8H z@!S>Ke-BbX4dAyWo__Y^8f2k)GeIWNPIHFw^H@#8wek(AZ1LqtZDim5QFlQx&9nup z#)w`UGDvL=VJ}nj^`D_`0maV(Q=wgPkBRM{a$OpmKxw1|d@#8)#)!wiR zI9h)V|FqRqU?ks2j}S0{R4XltVUZ~#PR4n?@A)^hryoyU7@lhwNfo@&DV@)C+^X-U z6_c@xsNiXTsQgFgeV!5SSYG24UxtOueXgo1Sw;S2h9d#uk2hNeYQz^#3wnqX8-tTN z^wi1|1kykZFddLA@Xv|?^+DC$m|V*?f6#d;BBR3i5erO>hWj@evIj0P?qGvy8bK8p zo&SkY;g97<1(9G&NFF7MA%iMMY=1DGm~YyIL>sK)xA5NqT~$U?yMWuldyBu>_3h4y z%NVh~)#eyw#vW#(Quoi6BU3Lktf7`7hJENFd_Rpye`vRLT3;3J{SKukDl!h}`23?O z9PRD?8vnL~1}l}b{x+k$5eZtx_xt4Mxw=C=9Hh@F^?QF7YgNhI*z#4z1$b3;-w_pg znPC0a4|tXF1MZ%#BjOdeiG1%qzNQ=6ykDnUE+nZ;QD#@IAA`aVvAtV?BS^(3&4j#- z3BisPiToj6ci}nQfZ0F18)Pewsg)FpYwf@Kj(1F&(@z4-G6`Z z(&g4;?semvVrwuW@YH`m1Qr6ZA=m{5RBL`LzMQ|`q2FC#MT!I%VDLs4;TLIRfS$zk z?1tOqg7&J^nRXoP2*eA*q!}4_Fgw8>eB{zbgA_Uj$#NR$daJ^_g@`e}`I8%KIC+ys zo5`Z-6(%cVNI%i_gKaph3XH-QLju1Hk%at9J1Eh6Bfov0we4pSOiI|tBHSY492E_T zgab}sCb2<4NF&}FX&>X)&Yr2O>q=|W7W@CNeJ zHsG{~xWoa!sRy(_3yFA| ziGSA*Es3wEFXCK~cSGiz*H{7{9v$)Fg8Y@fLT`+}QrTSKuk=+}7Ov+m#@~2FL*(WG zAf}+d2aN_l{ox}-XN~7KH8drgqo0PNEiXLpa7NuJokao7@K}DM3ceIo@OAq;(oB1i z_mRHP@RKwm_{gC7d@=z&6w{f1ig(-LpU1+>He9aM=_gvY$)=@Fyln?nPrD#I9yugx zx6u3ZSn`VZv|YbW5Dz-o^m{q zR>BX{2I@fcolY^!^53xn`^gLVt+Y08k)qZqKE;i&q53q{X!p}3NDd$5xhn}VTFqfE z;um8X4T5VfxU3gnb;pp{)R{Jnj#xe4QRjZ5FQJ1t1LnW2-4`w!-0+ zJbYV)-JD|wAheJ=h8PG zx2>r{oX}69E{~i(JCfD4err1Iv~KU-H6ne$w(i~$se>led9CTbf+Q2kvDz^Hzj+QS z`=9X~45&_j;X+}vrSgM3TvZOwLDcfINo9$YbeP{>^ZtY(zNKa5?4i~9SE_GmxR7B< z*&o&e-?vcp?=H0n_kPwaQ?#(uxBi=}z#m zg6z^!k#(ff|CXU5{5{POhFDxTJd_p&gn`I@869lIX35O4OX!(UM_I1sNww`PUC;q$ zxPFGb3mvEMg1P6p|HT>HG(Q8^_80c*@of(g0w6nPp}@@f|*pW2A5 zQJ&n;WV~UY4et8gUNX}z4xrc#_MF_m<;EFj|CfV}S4k0~MN zuROeb^Aq;cxv7sgl1~-cj_p?Q*NAv9@}v~bv$Ppgf18)xdnlbz6uZK>x@t4N*W4fJ zpi`qdi^<9uK-qxL-F4P6u$C^`i8WN-nY=Px*4`l2RgZZpu*^Cmffex7i7;?LD)euuJc zv57Y@KzH4tTF$U}H-4!BV#WZVi<)Y&A{4jScyIoK)46R~pd2pFe3`lx&7ldskZ0bQ zh{DGIrd(L03K?Fl5@u8tp6|BVN80=|O{s@@t+bZ}r8htzJIQm8LEb%ga{d__%sqnp z*KBNPIal+5W3$_tOfq&F#I5^7bGKJjH4!~u|KhD#Loyo9Wz}%1a@fxG!IYI}5{ieA zIRL4VO7ai-?&RhTgxBBCxqW$oX4;e9+QRd%k|X5NAzk}$^B`^^ z6Vklq=oD`Wx{+Xrcy*+6g!gY7jRgZ#qlinIA|pDd&C+Dnl-ra~G$Hx=__DG@boi@{ zUbQwFQ^-pyr_9=w)LXpGB_fh0@sl~XR{2hHiGI|%U_07---^obCLT9mvV|kCW z5E0!$or1*AF(Te2S(-S}KN}o8-K>b>amb0OxmmepCs{Ao)oZrvv)=TE`rtn<3i`t; z3YhPN?(Ud9+M;-7*3ML;+31L#Eg z7_=vk;WuMn$baQ5AP)s<3V!!EKHaO#pbVUh_Gf7Ui1n{4E<^0feZwr#@ZZb;s&*<% zU-%)IlzA+0P2f#|gPo<3^y}^Ve_HRNUev>4Y+Lx}ukjP;{oKv2=nczSq(5oQLjIzh zxJOqPZ&*w7FF>Wm(b_D|D4JI$VKxVgaA!xNKX}V`zsTobvSjIUw`*yy7*MX3ck=@- zEhe6q&>q;oSyf_->}H3&Zqzz*$a*WB`Mc4ywGbU*(sRBq@k(wZ+Fa>R*CKTK%c89& zHbSAhzWa^+N^1~87xL68?v^gLbA7YqLPHcuF@Waq)?e@zKmQ+n`KNUDe#1J;HX4Ak z@V@Y?GwJyKyC|f+o*Fc+k-@`yfdxlTI2NbzF6m*sP)1Is48?FJv%|rsJ$DP=FR%kY z*X_EmzKIXaz;ABkQUhnuD>d9poyK*>5(aNIPpRrs=j3&lk7fC20tPJ~1%;CHT934V z@2Fa4guoK2XhV2 zwp(sMy-XkTXRI^)#?1Ts>onma96oewOYYWU?YQ^D&wI-^H0+lkDXR*GXWxe?BVUx6{LqBSGKJty z6A9DA{{DhGF1nU%6Cq)>&A9JWE^<8I#gncj?a}jDPElg7fA=&VP~nNHPz?JlBP{(m z!jN=BPA@2+(^G6xkc<}5QMYU%ou&8NctLo=iTYeGdaf|2O9dLQinWIy^9+1xZHn8YWcvU;mqk@O>?KzzzJtt0yC zkh6HTDoUtGR5a!NTBW}asckL3ki*02E>l!-R8i?8ePn1qq2d}Y`-gbs!3XGd6kIa@ zbcJ=Ev1l&}Ofi83(a^*dVFVkU!s}|ZaGkn(hPsM6Kn^7m)Qky0fYU}>{d|kK@j!!K z4}zyqMqQu)W~ zAmoklIq*`VGv+)$2TT!W@GhFjR_h$Ii?PI4Z5(IhM(o6ee@~*klB9&ixMytA$RSva z|EQrY&|^x!Bhm}Mon2YsCCb;-2U}Zl$Y4G{#%Sc8I7y?Tr|X!zU~F`Aw{AYjP522+ zPF+jvmU{6QMQxnooy?BkrJXgh(QV6cxhde?4EYJ?A&p(SK=!Hn7^B{dPG%<bvI6n2H~gKfF=mmJ9(bE^9{P92+5O!&j}!Sb zRsU-;?7nHF?;ntF-Zb93!8WHjmwzkcoj1KBe47+QEx$SZn%S$E_G405Syu0-fq3`*Abkp-;h%x}*pH1zD_j{5_iHS0 ziW(01zb~IQEIE9FwHCJ^2(MyC6*qF0Q0r2&!-78l@0`Cp5*3yEFLnO1?q4)s;^toB z$^H-L^RmGb|3Wgaxtk3Q^=~r!JpW=)elkiSc`sl*Md^XkKy*+66uUMH-Qs;alo8$3 z_|bMx!Ce!QT}67s8Y4vPh~+ld<7@^Grb%6rq>grjyLQ{4XNlm;ABp5Ooc)jt*-V)t zesppK3!V`qh;X2a_-9(eI?qNTl%C@IPosQ0Yf$w;3pIe#10o&w=5B?VV}o6R0s*6b1^$vx3il> z%PTuncX{$hYy2T}c3vxQvgK<(y2o3ilRKp6Zu8#Aj9Sy?J!nNz$>zKF47C z80yQ8@+2GzmuhZ^-Ujbr((l9u3)L~>UUBf6O>ioedx7hUt%y5{cmWzX4D&AnN|g6zD?g!_c> za_sdZh%EUd!mrR5$ypJ1DBj3@>zGNz`}EHPv?Yy80qQ0socW`8M-F4A&pU=o0w&KS zz7uEgA6I(jh#$2)>=dh1kjMZJ)vD}v;6EtJNd9-q9b=Acg6qqPdY8be)j4aV>z}q= zsiN^ucMC70gP7B#ka+nY6aV~W*PGhZ_Z|EfAW*DKG@qY=sp?(^SUQPu=x1Wd+=u^X z5Wm%&-Onm9vpECYv+7_lG4j9sbVaE{4VrRs(38i2&qH+TnWX{nBffg-_N!XV-h*C z<8wqta4kx}Bj-YXt27Cvy=qu9AUM|h(?*6@YF)iuA2}yspiQaTusvFR3=tv}Wp>nI zBx87Gt=q`+I0Hpjt==RaPDp6nDQ{98Q|1)E&JBU%2_Bmtn)N{zpmlx=a6!pD-f z&Eo=2#vX-)ixW)3MLxbm2iVuY;5l>D6F#TFxY5k-1Wm`{ESBnPBP{O>rwZcxYy z0i5_m2neXjHQZk@zT#B?Lx=YZ&jxIn04o`zm0{|Zh3gxaN?>~x-VV3dli+<=HZ%Sw zEaGO7C}yEXnr$*tcc}n>`l`uX3~sVXc)~wA)|sp|uh~&)QGwr37=GSf6RzhARi3}# zer;R9zFE=2QEh*twMt78SWsY6#h}(i4fUrMmYFMiy*j!M+GtHX=NG^GNqEz?Hh*z1 zud-wA4)`Iu1t@I!GC_Bu@TW5C0u+7qvv$jSzt29fQs5K0BMZAO%Dqdaz?YqYXG-OU zb1ybgdI$UcR{zqD6an*`c{&@N>0H6l^i@O)IH1jYtj&8wr>1;*5Wc8xNH0TFmJTA5 znxJy&@`SzdAsZ9A?kN}#C}sqvS;i{Ow2dZ&4HI%&u;x=HbX|(DQ^gZ#O`-f!_K402 zRDUbRzp6y)faR^;6v8)dCJ^PG{@mv&wM)Syqi~lO%h#OYKn(s6eC!O3J4e7BEVt*y zykX?>9pfPX4`|WOiX!lxbYmQW&zLF+EIK$Wp34%d&?C61ET-8O3;WW|qA6v&>kLjH z|L+7B} zKH<=R!BWcTz_ucGujD4_EPm442GB>_NazGl@m{Y4LWioHMga6}eN`m)uMIJ{ka zmGT}!K1nxkOnHBfL!S2~h@AdR^lXEQrn>v;qB!T3An8%SbL{m`JBweTbW|W9So)@@ zG*Q#(>6YdwC_21sASODI+$-VHS0gR$8xehVd~YJ6|K3VS8?)Z;GdpL+64FCaKy;_? zB&)Bm@zCpA&Q?71D+c1BpNB*274_jxD7@&t>{D_0^F}k!CKtsE^ z{5Mr0&s1xIfKi|&uQtXI&PWY8z%&n)0NDi&13bewqd4n0y+!T3CC)mBUeJk-L)^%g zQ|zHE0+-G-;!@HYE9uyvK0WshJIDltv&nQwUxf$r#Q=viYfjq0q=L~xn;ypd$YjY} z?v(BVOrbI;4=x|k?*EKvcN&YbPc~1+f~;TsAh#|)w+l5k{CqEvPWBGnM8O?JfwFIj zdua15{Zp|IR}N-};jg0eb1s0#31UO8O}N)?Th-`HlS$wWf9Lg?|5RIep+yWoyuqHY zh(ykwq+}bm29-FAak&eka{I=&KhaDV^l?C}ksx5uNtje;DBmFA#)PwPk)!b@;jta>KN7Dm^16%1@ycHtZ{&4X!DH!9?qKH+ z$B=M{zYm!x3eT~xaht^0oYEn}4YRjtZwjlqQU9#yzAqe!s0y6Icd{BJzg7I*775fy zu_%*Ifnkf-Arp0}J^oaK%`R3S{QF00jJ03v zw#&S;JLWn?MY^_KH&VA98H~oE!h$Mj?iyUa-_L6 z)FjVYzx!mXE!-CXgZ)4!=UeH9lVw+pPr4t27e{o`ecL;9MhO5k@(DDi8Rm-j*>Lm^ z7s;1GWGxzTtfj&*@#U6ym=zV(AX##dq$)d47ZppqG=v~Bo`31R8tGMxbbhaStq1~R z<_BC8l$wT{Hy}746v>ao1@g{G`{zt+-s06X_^A%>DIx+sM%b7BpYuijc*TByNC9>p z_ny`+y>o*3TGZ zaONZbav_&}CtkV$?}gm{Vj8(4gZk56=ug%LW*e%W=ZE5cqj*Nyme+Dq&nlnZ>>o8K zif6@%HtZoMZ`KNiN?1WwXB9C0ya1cr=tNyZjld(k2I4s41 zcCW9{hXB5ig5@cD-Oh)BxjSloTY32E0e*p}`ugeK8-v*J(?&{|*kl7b;_vr{KdH75 zjw-xC(A8h@vT!}%n14J_Ds7q5N(O=Hr8QTdktw&&^qzr?KizjQbi+T8tZ}uxXz(7Z z#AMDN=K6D*?2#oCfcf9Df6kI-XoH4OO0j+nUi(W$56U0gy!g0N z`gkociBVG0ix!>|APu6I^ds8g1o}> z)dxJWqq`>e1*PRYFRauSI%z$;kBW z$$X2wjv{>1*mA`P{IBSe;u;TanN?@~PYY{?%p1|*ot*{lsX`CwmsfFGes+g5|C?-w z!22fO8GLB$8RdDY^&YhmnM!LAeqahCw>$Gb$`oXYr8%`pIE;z$AUxb8f;8pdL%=xj z?ZgI?Z1>;tN0K#QhpfK%H=??G>(IH3u>aV6qWh(x5S|0J z^UkbiOHfNV@S39!#e29=EG?Y6+L?~XATeT{`en5_r!pyBr#H}b$<>5fE4`mz0`Ayp z9jzO0c|0FM;rr~xym1|7U}ko1y+o^;8rr;

      WP6!U_cc&{0z>yJ}%4A)}b4Qokt69S-uN|CSt%(~(3h5}g8f$z0X^0zS9AQ&h9K~fO z;-lg))!|V_7U|-%s`Vk0TuY3^!;PdixSz*Oc%eT{Cd|?_rZ~LczAvmD$`prt%w1YQ zLfE#zIqm}j4$w7dW--j1@OAx~)g+AXr8&P#9u(cd;lP|Ia*PoOvJXe!)ZeIb1>j`h*TZ3=j6X7{PdVx0cb>X30M*9~!G}?Db zJv?W;-%i@$tItGuor&3noz3dL13BqXSXRs9MvwS7(cUS4WCj`?M0B4%1AbyXEW2Pk+|yZHx2~`7T6N)%)nSrCX8y8d0!4v@=Zqnr!Yk7= zq{(L9P98jO&$<4jIE*$SB}{^Vb35|)@fBdYzDMUHQM2y|R{qg;u4J-nmZQmh?A`G~ zU#TlC^Z`M6NK;K!xB=e-(=R(41LqNvv)wbAOiU#MOAaGg*4woUX_Gl@Bx4U=3L1h< zBzpK!pETnQp5AatRd|zJJN%jx0D{dk28kRkpd#S<;NSS#ILGden?}R(i28V9cmC7Z zQkl1>!&~eU(t4D*BT9BPk4RZ*E3w*ZWU#mv+Ui!_UX4OUg;@$O{TA)@uM3~kIVf*+ z*o|Al5*}5B&q6MO4@@VLc$BalIUsl7+<98c3JYm)gkC6@bySN+9Dd)_v@@8&>GbfY zhUTEZ`b2%&{}_6MNd&D#9XP3$*hOjYVxD}W&Yv(M>s`!?W3t|{JV1eXF*dVLr~o?h zPmJJ~|EJbxy@{wBh|e*x)|;B}#*cU?!s|i%C*row-E1Uqg8F%p6f?SK2^|p{Ht{dB4Z8 zwykBWQ~V7V9LprNZKI4ZD0dWTH58KT1aF*w`4G z8d3QfqhoAo9Jn`z#%`-dTb3oO&Cb`*?VL+`p_SAP2I2&Bc(@%Bq4g!77^nCGcVkea zZOs&VIBYbWsHjA#oCwVAcs@r@B@KA%GUeP8m>{r3vto%51*F-}Vs&ZEI_@i&@lYh8 zt(6&d(o>>tr!`=aDUTg8X8Z`}*3H8-zE4omHl6BWTZ~XnBIU?xL);3~Xj7ZK_IlOm z!Y|DmnUx`7gc{*(J)iN@;I)s)^w?lq{E{~R< z&YKfK#}O>X`PH)2(&Knq*mi7c)T&J94!8TIie)JW&=F3tPo5yva=Z5UfD~8zn&3k- zbcjH6!@ymmu1SD#?TQlUrfFkxIX@)bvV+iK$Vo}Vz=GzHV806S4^C8UQCCvDU8kNh z)hjdJMF?u2tSxPseM+`-OQ!q9n(R;tw)vk_JSbR5uRCg^TiDg;+^W2A!@gipEPXpaN$*?1@0M_&^#!3j8mfnbsG^#!;<0sRS(wF?otzfpIF}}_Wmlj(6awk?+PD>oFk7!ard9pQ|HEC z^N>YK|MD+Hmfm9k`Al`+_#(Rgb)YCQE%U@w%A`Sn=uy2~^;-Q|g%GoxdXl1eZ0yOe zEBs{E*%->@MUykzfc9s)E7v6DE)e>Ee^{2tP~L&4;mT)Kr>fU^E+te`4y{wQi&5If33pp?wcvoIWix%> z2EJg1;hTL7Cs}1UEWwgUTl0of`W%?71CL)fdMII*mXj87y=6iL#n=-~kW|=#`dmY# zX%(Q89Gd~4tdd#Ur_T z{T96cY9r_;0i}tzVHIP>24JW_ErgA(k(QKhgpMiPr4Lm{c>19G^0nvor|zximBBtT zvc}jqrseWuLpgxk_AB@|ro~~=t15$jFGfr4WCN2J2W?jjg9bKo&kr($_0S#}w((iW z$jgI}s@@>gmW;Q;bU4=}%&G^oD*KOr7{992v$w&oY=mDU_Q9{r+u#?+j%&`%lxye< z3?fFaXL6@!{iCzqI|iZG`T_Jh<*n%T;|h8i|CtJYb-xL}b`RiJGg6NQr|?TKWD-$` zybY55`D=ratg(V*f?vJ-B$nyW;VgIO>q5KPW=MX`3ek(K`0szx`RIh}gz;e3`-FQjPiDvWV zJ!IDZUDTfGoB(Bscqb%gf7rECypA_+A!u|TjF{(e*ZVDdPAJcIIH|ET-(G)g;H3h8>}D^unIwR{G=#rCr|${B zF;?UsBDEWTCn2W~ueW@P8*f^zH)90U#DuHR%pm!iysAm5?K?Cth(wa}+(ft;r;#@H z-5cGdG5g0CLEKUzf%CIfum~vo9d;lmKID(9Pqm~Qb~(jUkOrM^EyETM-2WhFgPF+a znU+^_C;6@QW5(4x#mT0~@*-P^#au=oI(m91A3CMuxkLf%mOrzRNMagO`Rqm+)8ftm z&W-M z$3p2pD)bWsR1IW=KpAkqP5VQzAXPBCQ6E!}Tckrv~mYB z5#~hr#>(3Lb#~NC*-_ghXS&L_xm}q>-R|8&y~p_fDP(Ksmel~kE$qd0>Y`d=2ea8O zUo>RQg$dz{ zz&}6Haxt*z4qq~Qn~g?*9<^=uaCJR=jMa*EQ&Mr8cO4-OmhvE7{^XGKnCW&fM-2={ z$9#X1c=Kp7oh#ltnwwUGLWt;+uftE9Z95y5u!C42q}^a)j7yX+uP(dQEsy5fT9$`P zkSGyOg=#_N#W^j@Ep`@v&ugt7Z50pbk8 zc30nT;cbJk@>COn^lxD$p%>1t4fn!e2Ls|o#eo4*b%Ip*epa4*5od-gVc}^2H#7V= z%gFc}VriDin#E_l4VMT$$nt(NX<2_yamheGc#LgD6yAz66q^Ut-Q{};u@o1cW6%cipv@nlzN^DiPpbo=xLbn*Xk_bz~O zRn^}3Oq;e-XgMiV2wGu~0aHP~R4b&m$V@Y7PauU@S_q{;uB{jWCCUVXye7;H$?-4} zrCjP&@9pQaB4|-80opL>Ba?zcXnBN}gokhrK`5_~^2-1BTYI0GleE=x|9<}O{~Kub z+RwB0+H0@9_S&zl@Z-BBo6s3#n>3Ww%{a{&tcIOBKIg&2H}R3ui-4{5pBR9ASls|` z_RHg9*>7R_5v1Eb^8s__V`lJCJc%;Q=bfXtl5*ZX%<{o>W)}7sivfF}yvT>L4%oI{OyF*{2#!EPbyV;{edEqIs>v+7tZNV^qz{sN5;eN(uakFkVJ}!hc zjfK$jIg7-k2g3k%rov(hpBPlQD`o`-Hyqv1&UggviiK&g(I*2&JD)G4vO=|q%yA0+ z#>T$8qDUq3z)Zby(#(g<9WP?EH}N!3^90N)j)zd-CICE}*~wXwX;i^PGh0{?QwudQ zf*JsGijkfus8$W*Fd(Hun3L#A(Kex_5k;sd!;7rf7FmBq-a%aKnnaN>3yvg?r6L$! zWDP8`-dc2oQ#%(%r<3jY&f!z665J;FER#VEglX;7OCPK;HuebK>eNhX=SefWap`=` zoWC@Gg~uuatVH(Q5tw|&L#CnL*w={ZEU>~}4s@u*(KUFiy>`yPw-=q9o&NT)8f%@o zXVCOh4FcmP7H);Cv7Y8t93l5yr0B4Axwk@c;3@H-qDAUG482f`v$LNjtp{&JqY1}L z0a$6Qjg&htE@h!I!o$1Bau*%(EaLH9F`(ffOvu@UG=rH%)+>vw4?sL`-NG8KJz@YO z!d4OAP{evz5XO&6r|&(yh|WnZsAi;RLr;~(jmOc=xi2|1_*tA!#XuP{u3d^SUa2cr z!qo=x1iQmxt>s%)o|`2P6n$*JhAkzC$VErIguM^J8XIXe?z6~sW#)?0%gk&eDs1@yIbN={MJf4U{M&ah~Y4osho6`&!^RYI4DUM%Lmp%-iF`+Nx&$vzrrx} zHTF!*>uFIj(i6D)>9w#rp^p_ZG;z(2muhjuB~wKO9sM7Ng^nMQmZ(XMjITB351)*U z9&8E4v$BmG-_fmJkvLv#lX%=X5;SM_!WjE!Oj5QQZ9fCgKv?|^IRnn|OO*YulCu(- zwqWg^cD)Loapl`X1^u{y@?sX?p{$Tq#*Q5W=uAd>F&Qk|vS(ynT8dd8v>>}p2y5pH zjm+2aC9Yh7Z(&p43C5E~Y~ZKZB@5^&qQh2OS1w~Lg#enP-pD)$T>wkukQm5NYNXqR zG-_*z-8BGTt!-k5%Y%t;;SnpmW1ZSHk~pV!#Y6M?{upKE$M7}Y7|U07Cj-V4RpyF5 ztG5QW?3vqZX68=Cb8T{DDo!~c-@cq<)iY>n88coE%H8P?!e29|4}%8o2e~E$^H1{) zI1JRr)9F|lg^?7ShSy&gMZ2a3UYp$4E?~^QxmFUqgFO*2mQC(6v3G?NCKXQ=9tY-? z_%(6Jo#GbpYGXvcj9@akHHqDw9UcAMy$R8?wzF z*uk&l_*m)TZbZMa9&%?Oi+9C+zDn)I(@oB1o-=5qc(mU=7&Vom|Av9k$h->*;xq2& zWfc(p0wcPN+inP{6~x0t9r7CewZ4m2_=&`{xSgy7gloK;C%lQZz5o?Y8KI$a^5Q-m zDSO3qx^}GuE$2EfrdEjirEh;dHjoUhV~2VDV5(KF8QA($3nmV!MIQwxEg$E=SMJG#reh0iw(NI)R`uhL7cqeTuYykD0SZZA-EjStW%(*u>VwEiU_yBXR0(C5lY`VdX;d=$cn$l~H^2p3FF^{0OJZ3sGi@`}aa zXSk>1%p!~wrOD1mIQZa5Cjw8UtpVdqJ&XKEH{zw=I~U#ucejZp;MJ z7o~@qs{I-d)fU9Wyb?v0#0nKC&2r`~^5H%6r(Cb8_%k;}?XF`N!Hp*-Iy!E~5{@XU zJgr5QM?ho!jbl`vb_sXB54>dO3gs*hGy1!S-j36J8oLGt5A+PGT{mrV9Sk!?dn)eR zn23H>kQeZu;rDmFNzUzae}P>5j`k1!Uh@z4CX^PK=0AUjq3=^@hOR%MipX{V;Nr*h zxTX4Z>nknNLl=g6+BzrV2I2z#hhVcDRXVeEm%86{p>**xaWBdMb`u2>pRlie1;CtZ z9sIreU}$BQ1ki{!lw6FluB7>3=uiBBmcvE)xhEO&&7ut9WwGg;h#|~RBpeGP&&=9B z(vc)i(D8Jgv5S?gStxbv2cUEv&!exvL% zaz_==3?xn@D^K0}B3Sr(d780st3o5`02W$cW!)g33pC$XXb0T!#dJV~&rvu> zzJu*|=pRT)zb^l_Evo!-CiPyO3DdJ%`I2i?`OJj#!R)wq$nyqfc0*(UOzb@R1L^{I z$o1F^oWjhlg0*f$P;GWC8He?@kAaSjZPH6;)Y>aTQ06h#HJ9eA%e-E?}65tQbXC(&;9k0Wc~;f{*Am=*|sVy3|P1@!;SJR*ec322&e zSYW1v;l7HWVC+`Xr?9U=ot<)05~J4V6HwOmbx)9iO}oiJb&gX{81O-ngiTH^tN5wT zx$YVTiQ-f$=UPq=$+?zMT>zq92FI@d1hyj&aY^A(^lNq-cZ+mz)PeU6DBa3E50b#+ zFMs&2eBsDj=(x0b7WM&BKT*P`1-)q2P$m~OZt8JwQ{U-20nrc;-`8@5Ouv>n_F^iA z5X0E;5lqFZiBMv|UFp}KlzKA8YW%~&2Xs9>ylTNFly|don@7p7H%ED+fw6vjVbqrb z?<+5ikMgr;1biWo&ORU0SB~a&lkNuu0o49b~ zDSbjODXabP=IHG}`N47H^FcnaE&75=kN6D|@8!>?Pguu*vET26DEGHl=Y-Mz-O{r@ zK7w&%8|9z$5ByYG{Q1ZFIj;EQu~TN0ALqPA`Jr<7{bncWK^ds`(eh(H;DG6I-QR+ST| z1W-x91Yi=V2T)I-5kMn>762^(b)?+vp{cB}1_s?)#XwbGklj zn=#Ei7SOiyt-2YQse|ff6mA{Hkd28e1@y0YdRi*fDDSCnq>!ApnUHOfoJv~Ltvv^waV4e~|zoqlhg`hSRi zJHcoFSJE#hB&Sdy|NUXn?)1}4hKAe|3z9qcf&a|^-|!#Vk(>wa^ce8(@!#4}^t+^X zcl!NP`tR`nT>7EIt|1Yu4m#|xfqy&}^)ZKxMHF@zh{%0kIEBIMJ}1eyR)Y-W-u4x=F*dOMVt4!vuXmkzz;S0tuGZ%%pX z*jbJ<*kU|Yk4$K#IL9|N&YAWfnaV%ZJ!aY)8CDqWOiK#%@{iKT|8aW{OYxqVsjb<) zn}7%QB4QLnj4KRw|5)IBlp&6~&>S#^^mbs$;jh@r$zm%fbBx8W$YQ#^;p{|sKGiSr zEF$$(5$pq~8O70|XrBLJ972X6qTnAo^bRO59jJ+{p{}U?N8zTS<}+ydv? zeCRfTkM=GXjr0PEPm!~3E(|42b?e^v~ z>`VnRfP=a3oKruUxA^#oAM*2WKX`~?e*Tp-h3uop=dt|%y}j_i%k>xEcgOI(k>>Sv zd*l6MHUIkZ=TJ=_-gxN;cD%ju|6jz$w=ewPB;+XYe+>K&Tl{M|Tq&`82Y~q8V;^Xl zp?DwL;jRdI>H&7xkC_brzvuyi=BOUf@IR>sG?I${tRA3vJ}>(c(C9393ChElO!+{cdz+`6=pVg7z3Y4*~O#`eQ@!sH8x%xv9l$;{8SB-d|MPTgJDUS;n1vZ0 zi|h3cU;7e!U;8E=LEAFS&s&nl&)@%8-xcj$&$ln0`lq>USkX5MW=4$e^-wK22NTtI zH)EsXga1?0upXId1@g&a`zDL+E0Z(TzDcir^T~eDg+D0B#pza(tgMqd5-qbCPPaI# z;e=f5n4FM{9g`Dsv14*VE_O^#$ibRG=p~|vr9e?bd6z zfo^gA4BuP*-}oNzkq_ne|j3zoDplE(Y;Q%iLVN#<`H|N2vHhiUw%1?S zwjPGqLtBs)Yt-fjiNwil#|n0wt~5a^MC2OslOIj<0SakI2dW zpWjpcinWtosOvZGUsgXcy?*5S<=gtDx*}(aLw_5GQcV%ZOJKF_97_=_EMGje_jCJB zkMaL9dWd!JUqFw1TL2Rj{=icOn_j+c7$KU1oWbx1o+<BAzV?;4+L$r^T)Ns;zEZ?`&;~TX^zehlR(ep6GTD z>3$hcIBql6Z;$h=(#yeE>$@Ky^JP<%Yg|XkMw3)}J%HACdDA1#NTCstQh5%eM~*o~ z#$%)QyI7{!j8t*!@oKBT``J*ebpYNZ%4mNc34k}g6Wn(Bu2}ZlBQqcEc0<+H=Gf%> z-5;=Q&I5>ctQDt@Mgo_Gj$&rmH(8%pD~@Z81dO&%!$EyopJ(LV@ZjwPR)n?ist{6D zxOC2mOq4hrB?1^RuKOymm5@>RJ8BoeZ?z$G@o$554TnyTT}W=IbLF+amlNpK`)%W8V+*^XgTbQ4qyp{`Norfcj+~aFKy5q&T)xG28 zVBfD1hPNS>sfJ*a8EyO<$BmlL9un+Dt=gC3BiOtBu$1>O%9BcyTC8+6?;+bMaXYm> z+*SAzF9P2&V7+KWTLbw>5WRYdLie%-=!oK9D<2AJ%fbw)=ut z50dnITTn}@+j;}H-Qr`dWV@she+V~s#Up=`GX8`zqIk%x^*P4rQm(nC+Uk=-`muNV zd1t^Bl+*p{;lZ8ch+y;nv3It25-lW~+{Z7)`>+ezkrExy%i8qNt1%q>>VEF<$&bS0 zsNyF}q4#>YS{|<0D1HtwdP?#?#r%C_lxq<7f`q-G>5O;(211I48PMkPk5@zX0srn- zLsswPoo=VzSB$4;f( z!frpA`+Z6EzE2^EWls)U`5iB1hQL+a;Jm|$8taE9_f7tAPvqX@s)dTZ;?XZ(=*Pn{ zkGe;p4tQfmpS@7+3qtftlHSenIsJ+0sSktIhdzm391P^pH#Ud} zdG#BzLd1!%OB_>`odRCh?Jd13$Pi=xrqO{2K;1w{h(Cyk801}SR=2VKA-r_6J*L_q zo?SK)Odit^pmFKb*XsV!#b_^sbJ1GdR378@Pa6=7lXX}A3Cy@ zW*a#z6h~IDL(07xeSi{j@*CA6moBt zVAcQP*47v$&tHL4GB){T@Z{yj;K#s(Dn5n=s}ANc;$8k0gc_I#gZFdNXwp8h>;)sS z$-UM?)Fq0o_JoKl@MjgclA?7au@tDrI+;`Bim@$+?ytuiHwdioUd4yOLvu&5^G{$> zeIa<%-~L)?xqbM?*z|+H^=m`;KJ59X^)_}5`}Xx!R6zUfDf-P-?)i zYd5d7?&|~x$#n$JP2!>MBY4`zdl3RxsoT7IU9MEed!2IUIu7TCgo~5Nh|3E~P$o(m zyhGVf?UQB=Igg&UGSE{Ep>;8c>Zecu25(%bADV!icX4ZWkPp}WJB#9(jEQFIi#VQ! zLjfK?2zvhULceZPy8lF@$FlXK>m88>atE7zQqA6^o=c4XX%n<@iH8Qy8b|m%uJE`|37@1Xo&z1%POA5J(%SFWthce$rir7#* zatUg}C&go!8(gWbEO7q{Kgp5+O^D$pbT4A~C4_ff1hm~3Bt;@}rAvC?Y7rr!bJZ86 zDw!|nKoszr)2IW(2y}6ei;(4_0#RQE0(>LMLxydjN$Ml#W~RWs>-GB?nL7a&KDl9z z`s5~!k$m!3I`B3Gy6s3VbOFsB23*GcXgJ<4b2s@NHxrEfAPSauZ$Z4r-~Ri?cR+HW zA6MG*>+Qu25TH0orVm5wp1cW)nCfmrTT2ol#wI~2Ji2T3sD|UkeofSL15HNyS7RAIWAk8Ywce^nGQJlByQ)oH}Vz;iEB}&($g2=vPo-4-1;*vvgZ;G7%PrbqyqrK5ijyNsMLqJ!=?=ZLt9D{C)-sG}!H5;J|1P0eLAMSz^Df<}Me~NSNlh5OEy%HSioRXMo zSJk^`05PGbtb?L`CE1-neIBBNshSTR7133QNOad=U_&c}iFVAoHIk!?GogQi3&uiK z$b2Ao9c)5KCyzYyeuhR9*O7G~g@jk|I^k|7%)_eFW7ew37Q`@Z6Xu?Qa13dCy|hv9 zEw4ny7Z_>1>S5<4Bl@xiOu@hkFd~Pvm>cxqWd_iKx0^kR^UlPTF_ZAmZ4(g!zM}l7 zu^v@T{{GU_W&X_OMwM{0p=qDQmqPKG8Kd3>bxPi=XKxGh8Cgh4Q52vtywevOzn}s7 zg1OpAcfd#yvuk@+TD{%74(c8*frLm6jL(+f;X1zLm5ukTwDHJZONr2~#-0~Z@0K3& z64)14O2;i%_;bf|z`cS*#*fbs(p-wd8$iPrc*StVC@_t6ht!g(q*)-yM1;XlhT#t& ziOwG;K4?=OkY#AQgdwz*P0)duN`_!M7rhJa&N!~yisPpK_6%CwJ;^T>tEaD)JFTC{EnBd2P%hQHRMz0X)~ zbB>8=m-W1{%gG-0eqD6SYph3@UqtnZ#d_j zi#J75A55rUW@N6G@pfJ$)=6fNQRQx$OuIJXkCQ1?^_?|jZFNG!^}=c_E@nB6_-+Fx zfp?*VfXcI(dH(H_7+vt$O7zQPYqRM{6e#1OVjOdi-Ng|TxH1TpiR;Q(hvgTPAO^IZ z9m$tO80>ugUD#o985KOEMunu85cepfgGQXDM@8DP3Gm5?aZ}D%pX(kdbz7vjOL}Nn zJu9KS^Va@N;^C;<=UyNapy+6M@WIm4Ypg$UcF_7t2%k@4F9fc?HtlJ4Z2Bm9V5A2T zkC8hP#2}qWyGh3`&;&N%L}a=rI!((3C?hl6dL~j$Nb!k~21w|UE)ozP2zH?l zr6+$N)oM5-I6$hZ{4I{1DP(tUSk6|Oj?1l&iCK9nlfd#Oc6%$+kH74{l_+)|b5S%` zQW!&sM68=A5h$1QnH(UpQa(e`&YwtTD?_1x0cR#O04ii6lI3bc6;+VK`nZgJjEqFD z;jO@fPa-SKg{Dfzg1YcKB9(8;;Vmt-Ni6P`==a^YK>2oTn)q_XdosS{31{dk` zd5*c&)^O}DVkp9~YdN4=R3e0z`|N7eSPEBjF!hSFbF{D`zW*X8-y_cX6Xhe=U90?O zz+Ve`gce!N0ltb+V~@ib*HW+@+r8FuMsZ%;-_&=LVTmi{WteE;I<0b?Fs_wGuRuVc z>p+x(=z4nCR~z6qkrmX)$Y9;JAZ&wT2ww{WB=Py9VDD34!(wUn*qP41FIyH!UQrr2 z_q@abRux9Xx$bwsdC-e`s!D@{uN0?{p1zC&)7~{G!@!M-Ev}q0GAnVOn^z9k`zF8~ z)PS;#Y8cP9tTfU`AsI$BnFm{&2$f)D3-;mC)yPWpEqg9Tw=H-e9Yj#I!GMQua4Zuv zLR;k6X-7*CRL;I`-9Y{{tvksVyqA=M0m=d8F~kHfppnK#)eC)EbfT0rFzj+423?9%O>GCo4Or*04!QSxe z`{<76NPl95|JeuW@&{bo;V_mQgC8{9S3>Zz;n>Ro>UL9e3iw%P{s1yFQ-QbPTg_1X zz$qqOF7+hjZl)#l>hYQFv>ans3qGg@4DHd549Setes9$F1;tt)M0ur1z|loJGI)#% z8698rHL6Ve?lhUfCzKNuzynKFm~Y8_FO?e9IB8%+dj zunwSL*GT|tmiJPg$~)()hmRqE+)to!CrtMX9E)aNrx^zLqs4u@MdHsYGFhDiK}Y$3vf%+=WDI! zAlJ%qUy{<|I2AXYO}wxha?jdoN2kljYSl=j$DsM%_wc!TRKX(-8HIGgk2NdRHH+aQ zV|dGyw+SGn2T4VpUC9njtpNn`r^NyyJK)n)r6`d#LAW~+wFWMKs8=0b5eo2d6a{xK zT^?)YuwPmaZfwEFKa$g=GVHt4s50!k)1Wf!?tt__b@y-tlDhluIJ?eM%7I_C&pcin zC9JJ#e(y9PkaC&r6va3AlercHOa$P6HYr{Hper*bq`Yj>975SnRyRBxDEI^D4HU%| zO(H_KD2ECbQJ5pJwfRFUM(KJ@T1yYvnaw)79Wf$~2@nGp2LfNCEA}pi?R&fGl>6SU zI%NYYhVSjw*;6Zj#OD1tCOwpj6!dYN0;g^fw|*|;07%bZ{s4MofXGe=MI>gc#_ZpVTDsE;`l3!H#2kq@MW3&0URS?b?7RcKt>!^1*G0bXR-Chmr*f{Hh3LC3)u>2 zou-Ymu5xlgu5fJKQjbdclw~oB;=X$*gJRxvpTMgHVz0w}!LOUR)Laix&b4pw0@R-i zLhj{~3VQY^`wZq|F!5qaR?WBZUTMTc%(M@~T#QyfPM&01Wm-3i776XB+)7c$Qr8ra z+WC|>r_nQ?>DG-~5YCy8n&rqf28qv@_B~_fI1*8ucnK52JB?-MnG&~T=wJuX%%4}a0EV1Lk8Ak;$e^LT9HH^IkLrUnxQZJ6f)k6Cv z@9wAAGuqEaGR#tp%P>%vmfMzmWT? zYv10Sy^2$0*kjyB6R9YLqGul*CBAjyeUv;XmMNXD)PuJ{P2Mtz{~IW?O96=43E|TL z^9KRihx8<0I`S|e{vetuWcmFBUVK2SRf@t$vs4c8PGmp!oVg@z0~D-AnTE4XntWz0 z&f=Z_*dHmOPjb%)S{@ID?GoGkYfc?+qs51S$mp&_d4~^?%appxw;bfvhf?R5Yp}R| zy~N=T#@R?xU}MbUV={{e6L|T(NT1a~70lZADDH*rpp?pBF7>iDHyF{JR-N}ERN6gHRD z5Sua>uQWDXpRyoALE$IRXlx&^%Qj(^V#36d??Z~D#V$$8QxJf!NK7tC5J8|r&4E9D zSBna88+Sid4x2xw@PTNi_sF&y5&CWM91y15^KC~dF^ zs`1fDPsW50?@sWw?0J!9ZnF5+aVrBc*y=)fQ)FIb@K{+FQp)BzZ~uPp=%V=- zocE9V2il+sZ4lddkxK6^9Hz?P1&dVD;%vo?F|)|E&Od#!!R@|xh&Bx~wJtb?3@3Yqr3 z)CNR>;=qk%Ngz+|;16&AfN!W(vr8kp2!@!LA$G5$o(Qp8{2@V$29;!}MLFz{L}1a1 zp~Xw_EFG)a6+$xS>sUfP*R`3^b?4?d+6`mTbdFUWM2H0vIbY3?5I#?4`Rb{q=_-*@V#nFN=19Iy6G5#_K*xa} z?bv{*4LWM^QbEj_1bpK5CD`3#S2cnVv*UOk6GJ9f3}l(NDe*aCDT#@_#B{Y}S=ERPVzle9s$fj6*2_+_BZW02SqH!;!iX)2<*Q4W1O5p5PgxAtRHFC_ zXxvbxW;5!7Agwi(&U9>DA_|Zku@r`FtBuk_iH_LWv2%~jKIN@IhkgdxtvXwxsg?b~xa|qMAXfHti6bZD- zh$Lwhj1HPZWh&`|3)KL;LQd$wo)73s93!=YseRfJ1#@)Jo)k(k8aJR2B;9wXUS-&K zr%q+q-C?8P)4N9?ki+P{J5I%^Sk*xtf#D5E`DfTE(nk-tL!-9wM-!tlaEl1R&z)mivepHwb)?v3gSsC1+W zeZ@mpw zQ{#9S`zRNyh_#PQh4$G4k-B0?i@H<3jM8rXP4~kuDb=Pd5IZ+^9^Rz`lhbxRUGTep zm*6M!1wlc78nnQ$qpW*esWbwDdE6%tF3O&iVguvLUXR7ICfH?`UGjs8&hm>fomW(m-X?58B#_)|eOL?> zN1zVm0;DIGc)bx45E0}H$~C34{_%^;0+=f1&vo10mHy0$3ucDXW!nmr0Qxa=yw~%~ z$33sddSX}^G2saJIl~^`tmLg zP-l_`s#`lxRW76Gb59j99SyW5L{AO7-;!qN!-7bCN zlVT%DqCm07$E*iv4~|)n6i!dHzG9-*)#+{6+#G2zGAE*AVU9d%6Uq20wS|OY29N(D z1vX9&AJqLW=a8xA#s{&z=PJk}JQ4p2ECTy?QIsgVGLNBP?8H!t^C`#csXjysr?eOt zVf=^NRJ-Dh)W88ygHO#u_R_e}fGmx%CAHY?j5k`a7sc6d1WZ9!l~TrI*IW9Jz&d#q zOvw1Mk-isM_Ok!YrPLu>S1A)7cMV{3arJa*0&n-5^NpdiIQy7!a<=46pcO`eFt>jd z{Lr#8AC>70X4mJQC$no<42<-XzyN!PjWmvTQ5bVvoZ?Ajy=fTRvuk&(%yTBxkdH$1 zqOjn`VG@0mMia2BM`;__L<%$-m_xCmM>MePYKG#clnfAx;(Uz+1sWE|mdJQPs#Q40 zA5W@5!Kja&g?kk7RSO%fKnwTJA}*ss9NE-|zI{Ou`jXnO%%_TGICqw@dn&WI-mSds zEO#Com0R&v^l`+&k+|R{cb6E#qR`uMF7I_I=R-{PoWx5w6L5<}CW)d?pF#c57@!C$ z3n|zbEY!4#Dg8C20oPYc>M(swgCD?tI9i8!O2Q;GggpE)U#WtN)By<;g{FT&^VPE0 z*@-V&)l=MG09m|u%Ofw(IFH;WTN4u%+=M+8zgDiOKYAOU zor9XWN4pvCFyP{9VCj5H0usN4u`M#i<2Ck?a)x|_P1wcF*Rnyou<6>{obBzk_BK$n zWBE6JCyw!OQab`A9>Sj!*}{66w=Y|@4R%(k&DqecojDJT*_?f(G_#_QTK{{8^2Xb* z){aKNu4~vjX*xJ6P|DBzjx;ecSK)6a7qic7h}ox2#}3e1>t4Z~ztV*(;alJh5>tzmi9}y50S7WO<~+fyoZ$Vr8+|>NMY_H;>e? z+w#{W^J}aWvHEECRgs?q02$cLsLQ|>&80G^gdL2yHL?bd^f53NZF&3wyj4K~F(Xs9 z)uFx(b$X=-IM5`y4v9oJB0$|}EnE}2(i*tVV>k+egnJfccfY_TK}2%yE2?5~b_?#A z?fg(DV1*j6g5^sSLl8CqzeH(>A}n`wv`lN`kQY5Ffk&-{oiw1Fi6)yXRt=h9YDuS3 z*`tSzI_iYRJKJO9&ul;gz}oWIO6wt6Jbp+#ln(b<-H5AU9M#fV6uI2l{|UiG>JSr@ zvCTqhz{J*>3shjO#HZ_*ftWMEAUxNuEIYrwQZ6fXV8B>0)|G@@WKPFhc3XdJQ9$0oIdv5#9XR$DKsgfX>g1TkdtuEX%h85Cn#q0+ue>S}wM{JvGXb{tKKYAfw> zl#kK$NI6>^z~=c{J~WTLs(LLy?nx}J=I=>bF~6+xdm>G}U&%J2stA78MORx6L=?xJ z_g@tDDlX!uE{e>+YRLx3DB>020i!Tg1JMYIx|q@n6!Bx~prkH5)=J4(>clV;Lx)=u zvlrI0M=U{cklmlB0xLr)*tMQ0d)9XfDswfgPWhF-9qf78SkYIDlTE8@vL*Sr)##}j z-VXXt-%q0jjD}DdRtHC^4ErRy-GcN6rACp6WCOFg56cJ^2e+;`0|9NrK-+{N#f0S@ zx~Q-{_?WKq!$UdEUMSKaP>RDir^u8h&8q7C9wTbM!J`!UJetcReU$f`YVBW9&|_&r zl&1qwnV5a*^3<*=iBQU&oZ2<+GTa%$MT^A8po65gRE|=QqDXydgSR6gd+LXMEOAN@l&h^x?i1@ww&Kl!|` z1wL$-$nd&d99LSN8b-xRfJJI}N@7aNnamTaZ4V%p`?zu9c|6vyQnYy7En(Eo;k)5h z_{e^Vo|U|s~qNowHm)bM1Z?Ro@^M7EaB#hp9H70ze24sewKch4Z!<@@n!UXJsZ zM!J(>OBq&7Pg>S+8S~??$w;*)!}h=vR3+SQ4w4TTI6(!P$+;>##62*H=%r5pnR-eh zG>YTtLGZ;!YK0roRN%x($<7x50FNYFGZan^agDy1q6-Uy z%`?nm7z7h|^?8zhoz%$u7(v)h(>yJWJ0RLnF!$D^{{ld2yir9PnHdO~ zg?kI}cDREuEH0e{A_rp|Io6ZZq^dO2AAlEDPfLtUiu25&1!t8SnHGSc{;a=w^v~ce zOGP^)9YBFNtOLSbJ&JI7lxGd&JT}nZop4Lg?!Lv;%>P1xsF`QHl{5FsfSY+2^H$dw z#a{*dFW2~!N!+>MT+d#l>&Fx8tRKi4a6hqo{3SXbbqKic@f-SFrOtmS$ie(LgpK`}B%BNfgj%4^p$&-jl< zPCRhiHz=h$$YuAc4)T3e9t4HF7optQPhuGD18{_k(rA6xL1!uUZ;E7`0aFDPWwRT3 zM%7R9&BuU{oEL%2ssuz@afX~ZhQTj9m>Mok?0+IieU*M)51~@K&f7ST`ri|JsyPVKzZ&| zU7q`z6qY1jO5CVQEkQ7J13c}zr4l+yjfJ~_uo$7M_iV6OvvXhd@RvuOvE(b$tPh=| zwy_^#37q;;X-s5@PV%8s*3ZZU-cd#*Qb3^*?FWk=B@yR|EsVu7(AdFL@RUN-N4OHb zv3Iwk2LGVwgL^Av9m)Cn`NB|{-=Y2_;X`B)k3RBY%^uEq__T0hVHL-nDa$QU+%x6e zK1KH<-4?!Xq>kZou)-+eu16zy<&(eC$DlJQ8Yl|6ulxFE`;v&^yxp=gV5g`S8|&eR zkUd^ya92xXg6&UGCxuM=QndH%4~G_T$!H1Cb5mlLSNwts%3ID->NB-pVMg1g9wY^u z_H{I}n)Z67F#*E=(U2Wg7I>80!%=wx&s23$ZPJO@slI4r zO2MD_5l9$dU=Frd+&wbVjt~$EZF<#Zp!x&%!)N8^-LKWwlQ%K)K6n#zmT1DC)?2WY3<=~o-_V*;MjK({j z%S^v6k*$yFUo7tNF%{q?*v^LkZYvPjW8?8<2uNMa2C% z$X67Gn1>Fvac~~jJn2n!&w*#?pw^4YKo{>|zyJ!KFwGOAhh745oFxpi&@|R3!=K>e zoa%j+p%nE4NHSIh+m{PD<*Uu{v|I(|gLiL!L74;8W(t_pV3Y)TW>%fq33- zfMr=TB51P^&oxfrpHlvr&I@PYLU~$-vwhXGUKl(a^-*#;on<-0uxhdw@FDC^<7}rW z@fU=IZO(0e#GVfe%Z+RtWfZWF-8A@cb^3+GepqFK&1~Anm1Nd(HA?7vw)_?I-g<8S z4j34_(91y$jsocq!Dzmmlt0*BW@0+`6D$nj;zlFgh*mUlm(m6qpU;C&$^EY1BLMG0 z{}M$opYViwuey(;;Dv1c=Or=;%mX_8V4H7$-Xdim$L$e%zdF{BUyxZ0ZaFZmD=}ZR z9;5}M)U>8Vz%XUb+gok}Iw11kVG0lD$UH*qfN^I@{rN`)O3p{cVyUM_YEt=NjnQ@9 zNczdWm+>k{lpdo6CQn4ub$BLYwz52wtk3c(3k@?4H);TvKU+o+xaj3Hm zjRvyTeil*!WHp1Bi5-RNb^&ellXslZH&B3mO|Y+$mW&Y4`mDGnOK6qKSn7g3Msr>)-5uE8YR)gwQ-> z1Fk!iIn(hG>QH5h?D!Je>hQuBmZ~qHM|iAkr2jX+5Jm~4`6}iI&%BaT&3lK|D@WId z!piye1zvsp?fVC0RPF16zGG`s?f+Ie3BvY`qB!?cY{TOGdo=%%CEP18*m?bR41dyA z>68JXSwq5}*w*fBgO^n~LRZCwDgY+oNC43@ihi6gxc4X~D#rWxU-o5me!X20NQnpbs{MWQ}=kpsD6y0mz~d@g1V8;nD?LK*Ux7`X?w?gwUFMq zu=n;6_Xkjev>d>BA+s|aNWMW5P@6IDIs(wRKs102>s&3t#ap}!=(SwUUG%*LAGffB zBsD~)BmrV`l!T;A%O+OSdWRqv-yqfNkp}UPa%rR?90d%ZQ3CG{qY!Yq1T}eaEfNQ# zb`rpvKu}il+8Kx+SM@sJuF>#nxcqsmgkJi!Dp zZdk+paQS2S0Nk*K9k~24d?(znhKJ$u$8fPFl!OE>12F=GL6|UL^RwYVAj(wbzL*Ne zAVpNWTuLIwo0yQ=aUh_IXkY>~n~*QbSko7qV=Rj4)9wJ>3AEiZWxX%uPMw0Sfbz<8 zbFlRog4B(YTER_#!_!(Nyu}xu^o6(k!aEp#kRtqQU-%kHufo^*!q+j}YbalMFT;c5 z;Qbih?}HtIlahYe2aAn6sPHM{FsR{j1y2H0*qTc_PMaCwfY zLHpNfH>bm!w42m!hmP;l?tpf8YBzx4Qs}4Muy!l78`Z8%Nl91a1HM8tQ(#4>dLO)2 zr4jmd`qKCM()9b%IKDK)zBIH<;#)$$G6f5b%LP_+t@Ncqe`R_}Q}3k#4>ka19hc`e`?;-3skSwOgm%2D+pp@_Y4Z@xko^tNN@~u+(9# zFHNT}O|LIazb}pBOEc_C6T#!`f97S;$}Q=fO07uYoRT*@FCmpu(};2e0FHI;Bp^a>4QxlTu~?dG)G zr`-YV?$mBTG*VlKopu|v+eDWXMTvnRumjw#VBw6_ zK6tIblO#>25AIcIB)s1TI|`O^hJA1d-vmcW`Z6C}E^t6`qz^WIaJ_)^}+o<*zv)`J~)K$fRd88Oknk`avxmjgG~hs_3C|aqYrNJ z(xaY9z~s}N+O5O%PVrd)SdbDOI;Md!YFZ^RkP(HnK}-_4FKrFd)*{b3aWQR?yx3+h z?yAUugs+MOkdx_3#l3Ko1?eBte0IH=zNn60oz zyX)vmZx4jRh*=fM>6kw4?$mA=lt;=E{3nzGjdcuPC1RO%+HKHolgfdrvBQ$;0f|`^ zDWyxgehQNiiK$=+>5DS)i<){=D8DDI_1u3lewzYlhN@URaKp*;SC z;tGxuF89HeKG^i7ulK=?zBDa9xWh{Ws;mYq6rMkuUqncbA#nS&JD}a2Udm667a4*1 z5lkpdS*qPIUAESzf|?)KAP;`?nX1AU8M9lr3@zVJ0(I4J|e6)9Aw-3IM8X*a3e4!WJ;62+G+eJxAWGHMND z5w^}N8E_}#TUB_@7vAd&@AHNCGaN#P!hsUI z7Jo?=R^f{S3J{GAx{#cI;Kuy!cquIAqxN{uexg(i?CiDcK0=(Q~~{7B1Aeq zc-RMrkXZ^snlc|;?t?3Ru<3*AeQ=||>bosIxZMY@_Q7jC7}Q(`m{iSaw@JyrflB{m}PpFI0!c3W9R(NbFu20!%85RJWM0~NodkMi%|~)eb)_t zK0Sy7t=UV0&N;W-HZnB+8ElC_SERic3r|6;eUCiT{C2Eo0WPt}YYyM;y7_!;AEaQ# zHq{0eS?bx_V?z_4S(H5=i>^OF{P`Uh!NrtE^_WIq2+vw_aq$I--&OGwBM0Ic@=Z zagp^7)_I+m*K*+&B*M}k4pfAUnYEFyGhNEULfzmerM^xT5K-&9jeA(%y_g#%nxAma z(Vy-b09!aW+@-&bvzt}YqF0skPQmIhV!<_X$umJ-^1X-E-MIDD88F|+HejhtaKv$h zYF2qR5M2@pTh(0LEiyrXFJ*z3!!I~(6D;j$Fwm{AUQ{#ZF(dUW1XUSb zv%i!=e2}YyA+_K;O)dCFPvU}ak~xd(y|a;(i{RmGVbOPXBJ3Ok@}0u6KpgHz3af?R zn+xl2?-$m8XJh?$pk~DuG{9D@|JJq3O4=>IV5<>T!I}tOdmh&Y6`!$!+yFq^U~vt& zP#>%TkN4JqD_{muYrthO?;Xh)_`7Ds!+3ill#k!U0St5jmd-(^wJUrs#nSSm1r()a=T?a`$(b3%8jtRa&R-RH;D?g6r7HqRwA_&PBc91lAY9KOoC= zl4U4f$2HsADTqPqs4Uz%i-AB5yxy{Hn&ig$2LyA0@kSICw^!nWSaM!aT(=!v9~vxF zeX4+r&|j7)rAA!bdqv^s#8DhedSBKCqgdA)MHeuqF6X^Px*Trm09gj_l6DxAo`y|+ zH|pH4(?=B@i7$!y@Xr(_4tDkfOL~-;H6*l1Oi)Oo_F?B_jp0v`gBUL3@>QXIV|%85 zkff@^r}0%E{m<23Ept|(F}<&9`p*K=ivD5d-j3Xg{!w_{6iAHy5M%1e-s9fyUr*gL zK4{v2ldBzz&jUa8_@QKXe7K&h@WC(;aOM~A3Df)ef;S4U`@){vjRt!65Ex;2wj?hqV}_WTwc|${p5GIuIOifcB4f<`<2VLsC0VL z&kYy-lp}6w(Jy?$%K&tGwZ4pY(SG(9mv2#Nzgk}|`pE%quIQ&SHIc0I1ihfQA-G-uHtuMnb>&w!FNP+d`4D~|yc*OYEm!s}VtRPe0 zFzpln?b7dJ?+J#8SvhCwkFc72iR|%I{D=6MFaB@;fq34q;prcUKf)LPXU5;{+kc7p zpfCP5#;^3nJHPogLjHgf6@Jc-=;tm|{;jtDgoxVvo{6 zY9}c7{i+w^;^g0ritYd6d`l&3ew^{Ma{7HmtiN;BeUY_A&P&#+$BR&`-L?h23a3XM zcx2NG-!h^Jlgds85B}NEpy7q`fL-^v%_~DL*W>QV_LWx!QYRgK+0phSY~kvk&k-H? z%+JT?MUg4sJax+G zh?A}B-&zAKV%DS0FOYVh(s-M;3HswX;%^5@v*&W$?qH#Xu-k~g%t$-YYw)-_mi3ML;HTl7~ojb^&g1 z7c5TB&dv=^06!JKKQ#Z~Q1j^T_Y}Xs3g0)@-;={9qeJ;|iPKqfHRy#BN1qqPIi$Y9 z{j`2Gs{E;VVRuyheC2-$)4V^vQ>MCM6d0L-9R-2xOe>$@Kyqhvt85 z+?en9=(t$wapPkserQuDv4o{BhzVgf$hk}&C}gXd*(v$K{k?Wi<*^Bulc2=3q39ve z=KX8(Y$n}KyK1aq-A>;HcMWYS(uWk^L%{|5j4HQu@8y=GTw}e>y#_6~mSML*kH`+bP9FZE(& zq1;n_{H?k(dT;M&{yxCWYy*8`A1fi>ad0m7-yY2ue_*-K74iKj{pOIr(=QuQ?ojFx z&=>dW?1zDsG(N>UyREuSEF^vMfb%=Bw-jAEag49uzmob+XlnC|=>6lG2b9?9(VdjN z{}GWs2EKxVjdT`5+|0u2&pNUpt(B2bjrEF|UA_s@ZF&T+pPAOv_K!vOa}ReCDFZb{ zs&FrAEq2kS9fU8kkAt{P494c3Go$&5%#%hY39%isWx5Ea#nJ6Qu0lH0X#=(_Uy3)D zva9Lembew?3=_YP**EF!{Xb3(k5Bxx+WyHJ#8+pYOxU=mCGq`g`=*~u0A4A+6dF)! zc!H5`0Z?sc*GdFlvOh;6aE|djiOAe45g04t5;4h0F8~m;H?BhjrSY*6jv4!L68^_K z7!LAGhu5p19IDjy2N7$rv9q)mQzqm}K%rY?{nfNfB7=HdQ$2G6gd-Vt5O>_uq@o=b#BOLJD5SX3L1%gP#QlnC<8D#*!j1Q>jBuk2I`B1 zQ*Cu>3gKV#!l`aLvkKv-dEr!JokI)ZCwSptR_y03gdgsO%e2)!)cfuvFP!SB^H3rD zH7Hzy4;2dMu0r@@Ubsvr{&yk#UW5ztK85uDu@D2L+zXO=u4L^v4vZWXjm-V14iwN}EJ z#duC7sEyo*O3&Kv{tP&#w~rbACGQcV`l|Q+#Rn$(RA+8}hCMX1ABe>{%71+IjuAHl zIUwU=>VpG}^mS;5)ZFss{Y?ApQavssW%T!5auTl$Wc2jk7<4!?NZcCc(E!YpuDu;o zJFpgJG;6_i;4|N(rXw}?Q;8j^55^@PaOWT${N>Fh{0vcf@OFNn`8R}j{7&Hiat}nZ z;`~|gJ6hvc$oR{33bS*8S$5IeI2CQQeFZ(sOpWR#89p;jqXG_@-4PiEcG!Y%pSbgD z-=)&&Bv(PZu0}S@1FP&iHn5Lc-Kl|-a_&To9PPD{&zs#Zj+<9vFPYs0W5Ka-qi``` zF2OU9fWk)l-_RH49bl}AM?QzA39M(J+?G2F4(S@fyR_xyxLhCi*ML27jv$D=)sPI| zfe(_%NPmj}Ojo$X_)&Bmg0MDT0p28t1UVfF+skK30fa&{eFgkL5W*;q8WDu}c>s)Se{0t^c5| zk#}f*O$Paz1)c*2wyL*eegx323e_6F>vMm>N+4kv6A5&VB)qklYdz%Dq~0}RcjL~! zK&`Q`&;1%AJbB0ZRsKftS7r_Q;(F8%m;Z(_4o8hl9Adc!XL+pt)SROec+K`Ip2}!) zO1{|6lXB?@;*oj=&xu|4De)|d%&CpUjm%`pigUJJ&N}2wIQPv_IbX(vUgaETT<3^q zQ8{v&M&?2IYH+%?)XQ0qoGng=&bh9TbG&igZ^g6p*g3es#>m{HbC!8I8<6u#=M0_m z(n8J>Y)h}0xF-Z@lfo>Ry?!MN@O@hqK<&n_`Chw04a z$ZTXjEfR2|aovHEXi+7;P;X>*;SCnnszMSSDTyW-*ZmE_cu;5_N?LAY9@dE}CDGxM zC}dpMD~YP3Xp{!@uwgO_uDrO-I@eMGsf_=7<&jd=E7^vhLB zGM67N+-jt+0iI-p!_j*{ukzH3@1;HjmwpZ5g;OYT_WS=1s*s*W`uR95`PK*33aUgUy>wdqzYQWYfkc1nD<%9+yp1 zvJzU&?~p_5V=^9`h8{-oBF%_I&!8h0WK8DAlwm(d?K9h(6JGmkTgx#8J#I1dxGSO3 z4Q=Xd{#fqiiI}3Lx9>rPGt&P~E}%0UUY-;R{Nkk&e^-Ob-PIJANW+T#o z^5tOXuwr8)eF%V}u$~O6k;^Z~Sytie)wigCMg}P9eUwhK6hW!?j@CWlLeSrxkD%gs zusegjdyZnTH@*u7yAypentN@M`!L!?fIBg!a=mubqV{7L;Vx$+Lyi2}9n_w81G?k`vmoEjzSUrXAmU<7`)Uik)m0F=I^$7%| z-V3q@;Y7Jdg^=^JUrVLa?*TDJhG;^eU686&g{MhPOuRY|dcvuoE@M(HVGN5=_-ICLC zkS(yNLg{uNM^efGbjOZ{J3tq?BtmKDTt%@@oO~7y-Bi$@X$MRE9EC9TPuHpjcw?t9 z?6J7*;w6BLy7`w91)lgUITu_~JExBI1*S75Ouv)4X7{!sCaP%B;W6SyLzgor)Dw} zp6`2}kLMvX(_O#cd(>NRRaaMaAEFESHALol7Pu+$eXNe!fC*lX~ zFsEXFycs`=#E(9+@uNNcpc=Tp2JRPrp8;3ee#c`6ebxu`+A-5Qu%ZfnU)gYdS1ZKNVV~Ouz6W3h?0Neymrpl)<*rzUOZSxn$}x+M z*OJ zQwsSuzN3O)so+0~<3CM{SN%U%!EYgaX$AZjwefV%j{R3vQPM3Je~xX1KgU$zPZ7DZ zkp6U0>3*xw{Sv1;*iyQNmC`%yP^Y$bg?8;`uid>0-7#^x-=w4KSjZMjW7&44#SPMO z)?dT{pjWY3&e)sM>{Ce3Gx2BTCe#dq8uLDhmC~_DYNtfT;|j^yagzSFv6+%wsgRr> zClM8pDao-4Nm-mkw9!mSK72#^#1|*|?TD;=vPdDhFi!IG#?je0_5v-5sPQCox_Y>c zP!*k^)J_|PWOQ7UarmaIVs7`zt*!QT=@V|e94DgjCTVhPTf}ZhPX0;lcBaC_?UtED zyUmK}426lCEHkBwm~=XQh3k2zFXPtAOro`BrPD)Nrc^bSPN$Iy(}nSBOQll^XCI*@ zNu^E-l6A|acczji*W!0Ot;3FMBQh_)K_7e8)p*nn1ZQ| zR;TUDq;-KfQ+l2BOb;te^W#izos6YrCC9-y+ep+f}-nyi*~3DNg8CEepcF3gOZ?prPoQ%)J|b~H_qhNDarAv+vKuWq`N+d6S`H)g79iVxSYlY zcpe^}25(yL;;L%Jr=Uj{P0Qmr!$t?DEV|1sN-O2;q8(Ef&9^TY=&H~zy6xY#MULz* zmmk2I^c7TYr5LZs!plWry6Te|yo=45BJb+s?goYF1mNvnB|VeAj!#sWPD;s?MU{N; zFImUZ$kSS2c&<`YMSDGC;POn-=g-NEc@hxD&qaNeeMslRx5}j^WnB+*iB|4q0Fv*d2 zOLU4oC#{o1?3U>CsKO-2*6DT9Cy22MlT2Fab<#7nSD573x+OZ*J}dns$JQ;;X{N#? z$JQ;;=?sNQ4ys$C(^vnL*2&RydY$y`?jeOqrm6Hg>6u04_JBAkXC9Z2oS9;tttlMgy}_vNk(Q$CW_1y)=gEIWMsC4={SW+MrKQx z-g{j7Nk(Q$CW_1y*3DCxWMsC4X^_GsBeNw;KmDJy?s1CoXYj|l*vI00du9NWY@PG* z=V-bG+{Ldk~GIg0)YgO)Aref0vH=melzX zf1K!`&7O(g?Et1O>W%s(3O;98D!ijf7rIexd$)s9JEIhmHYrIY)U8CJfHPIbi+`zGlgWRmc(sDoP=&TCX?i9N!*siNvI~1N#1xw z=MGvZlR6xTsbjuk&P*-I=k~gV6fu=Va+X3O9qZOanuBj0DU~PN6n$9QB$?dmWWw}_ zU`n3IKHm-)?2fe?O!O8-=($)$v*L1;a579+rx=8GM>NG(91T)X?EzSEi-I~vLD>m= zu;TPq3iLrNZqP%?K`QF)ze(TRO#&Ax0*jIb0^dbVqze@M^C|Hx)eXH!fxes)%GIL9 zcU177jY_4u7W&`6N~>Qb(aXtdk@UJbRui-*{@8;9EDVb``UkXl(OxsaU!ui}rkVl1 zs~f*s(f?St{@ner5eb?5y}!7ez$C(mbR=r}UZ9Y?O`hCHntX^q$QRumO;Cy5y1|o$ zD)b^Pw6DDeB>_t7%o3nowNP;jI2`j`U!^siW*#!#Vf z0<_u;H~W@GIT;4hp_+^Z2=LJj)mBFEfyTo*U2d1wI4$haS+`FBYt3 zAb+JB&+-L61Nn2^c(#9(z4TQhUvd2qHZK{9b~F{}J4;*+JBh+f zK+kelcmni3HarM}r98^xoWluXG8AFGEEPriVVKKxL2e z2PmA>qbS~-p`fOr?27R}A#z3J{64`#Z9jCb7B3=4gI7c!SR`#_(bti4MdS=f60Jr~ zjT`DGsEC|_ZfHjp8gfHtE6_n{p~KzKfC4=)394pq!wtP#fu5fh`oTh%o9-j1h+Izs zRB`SjZq#2Dls5r|dhMtVXePU%j}uf}&JK2@hSEiyK1Jtg+Rto+KEnc`T0Z&sr3H@j`Z-0p=(8_OTN{2YRMbX#XsH6_+F+@oHWHzVnRyC|Ya=7nJ9oL9!zfW3iL%_a zai10{Y9kSjf_z+lO7n zep0IHWjCI65%{<+sqr@{c)se&Qhr}IK1=yO1f=~kUPNri?awS;o^W%qE`lrWi_Ew# zb91p@M8k>e<*tohZWL=EP;m|1sBiDo`9L(cL|K4#RBv(r%ME3L0-7k$4V~$RvW4QJ zIla_@ZYWC?(DYJs73dZu>J_u8?-chlE^^wm+e2?vOAj&XYs&Egb#W@x5;rPJC~*U6 zbOMT;Q>8Sk%M~d1NB4A-YK}>ODyR|#^%EKQog#2-D%5vX(zqW9wU1E3xJy!@mMJKn zLO4jMzg@s{9+xJdVB9h4RqpL>Xf8&04s@IfokUP|A;Dk;+J?r3S}4+uy;+{|ixdyF zQt%xJU#N(_OchN-r(@JmufIdOseqtI6I4tFT%H!XK!NfT54L^ZJ-)eoyb3L$Ku|9R zFVaGfgJ?`GrH6LaLVIQc{cNtZRVsW+CeX(eXdeJpu&p|UPjuTlRSVTAoCG~p3)Lx{ z1pWSYovmW4e0mSRqJ^HLbCVK-bG4{}&7e#z%G(U8lNL2phjQ1(M{{(35xdIM`{i$1 z=m?!u#V^yes4>l;`e;#?HG^uLtuyWl9m?&ORa)p&9aJ&S(xR?!1~poXx~Un|@d`>d zLGdh$gqllg3|nuLevwdJV@QHNrG@Gm!-f2d5<8+N7$+&-Mp}NMP3Y?=w=^BHI z8mdL<8iR@|R8V|@!~M}#`@t>=jR8-|i?7}Jbf$F43^X^p7t^6sS&u8I*>Thz%{13P zDX6>BqEuP^6_k`Eo`RIpu2u?4%F>}!S#Qsf-jK4w&DiyTf|9ayC{@-Z1tn$O*Nm)F z6_k{vL#eWUuGHD}=VoNBR8Ufu4yDSPub}=GujR*@k#(_xdMYhSmDOEANm#+~6c_L*QLk%J z6Pl3~QcxeKb!k#RGh7SRxpb=ArG^%&b7>OvgPWvtq{2FvPE}m`h!&-DsfwDeMd@6s zqRvuKpT}J)Za^edpW3?}yiwYv9G4 zJ)wTapOx3nK8|EfR9l~VOR_|Z5}r?q`tAnl4Jk`_J|$|Ig4$0S9wH6%u!tKPUXh@o zJ0fq_LJKm14%R}C%mmt23+2m5 zK&8~MlY-)T#GdfHOK&jh1O+uY73xVhie(86Q_8wgLGiTO4|tBFv&Ldd zDp|jGqjnKW#KzQAsC+kyWeHSDS?^vaz0sCh`bp#sG1ECMK^9ti!kpn^H}rG`dUaap zI0bqZP%HW?(CG+QTN*W4T*QY`accU&;P=8E?>Y|`HjxQmU=tcgNfI`hBJXQ6RYotpgRCFa8DDa)t z+2V(^coAwD;4jnSMPo|BCy4%y0$oZA`tMkcmm>n6^G2N|Yx*XMkOqmsvN6VzMu2q6{o&UuqD%S0}I#cVKV|q@@q_eI$ zravf5)8U+b2oW zd5yzf1v)1!^f?8}t)vx(2u@wyu0T6?QfhdH8`V}p%}s^!2o&$G77qv|amcYLC3VnX zNEk3F<$QdlbjJZ2_48W}jI~9D97Jo@9 zJT(WqOHoI$?_VLEz?1Rpgqu>3*h|^fS0yY~@bXm+vogkyR`Bvw3wNZz^HzX__3)h) z{9QoVmDtzbdX!X&$@;%PQQB`2{vP~U`Da`H9ZHCDCh2H9QK^K*3jVP;{_%|QqZK?) zys-R-GRAjS@VrWt>rdRqO18h1qWZ@Zr0LT2&)TAsp=#7TtUzV0zm^H~4_fG&OrR$# zP^s_-si3N@yT(gfdHDAYP)^paa#yq1LX8HKuv7jiEs0o0m5xN6!Tf`kq{ucRiG&|K z(3PStVfb{smPAaJXG-$%yjXzTH-<>J^ z=MK!Hv?Rib=}6ST+%V4N3D!h-GKnNbUm3zA+&la6Vc!o)9rVJ7iJ^{kk>D@^?M7iK!S1v+iMMEZ$ezQIgl zwl0-U7+$A%23$Z(C!SH6hAzc}D*I{an%6D`-8W;UvHXG)hPiwrWR9 z-(7V0bT=z>tld~eyHM8J^-}0qyThaV;9_YkYj>5R-CbF07gFe0yThY9SE2hORRz)jHlbZs(YD5vZu@II+FHVNtHQ+BTAY5xwN_H96qn7&w<)f*PF3jm36qD{b$vEW z+WBZacw5}DE>P%LyTj|c1}Su`-Qm%FH&hzS*Qs0;sjlB-RiwCzepI3RKl0sk__OkO z{K4&(`R>76x(Si73ey{h#nfJ5S{rA2rv*CImP==SbXZI?6(*_Emo3og423Bc*Qq5; zUzJJgeuy*eYk^J=DNL>CMk+@^OPEF~Ozq-Kh4_|jJhfJsiVlnE^&vVx^=N@kHz`cg zPc30OSz$UkZr$nWbwWl>(TqPHEKTfp_;i*+C$%eWR=X4viN9Cqq;@T)+v&B9Rc|VL zZQU#-WAS|2F;&Wl|6dy52pf2JTHvh$NViw`$={QJa&DQ2(?ZWvpv}K@qKhAMfJdv3 zW;^7OHG31Jrhn;0m!IAEl?r|vU3F?-nt{l&A3siu43m|(RUw&`Qi(*8Bu)A$BvnL` z{sj$3ktXVm%Ae1dp13O|o|V8K}b)a%?uf%+Bb zec3@v73c%mK@Xj$1iSOHQ-0CvUqOVVy1-F7`hLoy&)Y>K@uE+Qq6lc4(+=x3DCaoi zo_OKevhZ?VF!B)<6N{D>I>q4gB7WSodau@_Kz9R`(%rnkEZOHd3Vu%u@HK;E%p7O| zzDmKLbu^w2o_iro7q>(gIi@306P{&0+>L6lpzckD>Y|`{HBym+x-S*#i-FR@epmyv zA|uq(3W~?LJxG>##`|JN7OJ#cH~f*K$jn18 z#qR73@P-yICb}}fZ~VQqe`rhW*W$CVUyIMeel0!=`%9($7qrBFEk1MoM=JP>S|H!h z;xm`OvA?um#=p29mqGk2)Z#D6JpQ%#b@qE=GLUa*@e?zazwvj{ei{E+*ssNBVZRoi zh5cH57WSVj?U(VNh5cH5=K7CR@G|~0mv3nCnakgJjp^@ zUdDgs@(nFMbNL&8EA8j;&m1&DXZ-)?495RjyvTnU;74llqWxxoH?(+>|1!XDJX6}w z5d_#-RT>i$>rTsGgMf=Mj zeimx+BL8K8AF0KQ_L~9T(Beh@%K*ReG-BZ#+fX&*Psg+uuShK8yUP#b@4r4J|&4{MTFB&*PtL?bqV7 zuwRSM!hS723;R!&_Vf5BTl=;6%=I6s;CcL$rF=t+&s_e-lcfDJ{xffX3$^$x@}Cx; zdHXfA_$>0@iPC-<|5@0t#b;r^7N3RvT6`Avmq`0%{AXdm7N5EPBNe=i|IFnZT72g6 zH};bDhv@qIZe{%cUp^@UdDgs@(nFM zbNL&Om-au^g7&vii_aqeY4Mr2Uqg$}BL8)l_CMbe`?dHi?APM6uwRSM!v5o={japd zel0$8{YNVJH(DUy(Bdi#mr2T8C{cXS>Xa4`8495Rj zyvTnU;74llqWxxoH?(+>|1!XD>?-Zw+!Fh>_$=(#;dkoNCwiTzr9=K7CR@J%g{Z)owE%inmE zv|q-5=Iw8x7N14_)8aF4zlIi{MgBWd+Arfj3;VVBEbQ0fv#?)_&%*u=(ta8LS=g_| zXRiN91ux@2bNPlApSk>v?WO(vNZ5jr82`V7O#oQG{}*-quRbsBAqB;&CJG59THRk& zRD9RK(H{5KfiYSVvGpKR5StP_$v?Ct zS!yy-A>kD#EzzV%OOmA~@3)mc;d`Gg(c~U2NtT-U6q2KnN>&t6J`pb=`J0+g=$UUv zSK&`r^-Tcn6nuBW7c2OO-T1ERj=Oi;NGGu9Qx)hVZs^hK_SnS=l%<|YQ1J}*N8M1~ zJ9P~0__LoxtiJf!r!bvE`j;w9k10&)Nb=nz9>tQsXGpTDwR8t-GE5=)heFboYNAUA z{1G-Od)#i*l89Y^2_%%tQjnbECYiAeJJUo={9lHe?9O+Y!z5xWW~L<1DkLMRc1A0; z^SGjk{g5NtBbV@=oa@~934|AWXrD;J+dfs?d76Ts+5-7I^Q03PpQZd~6+FKz@EX!z zJRI!F1pO7QDeY}Ay6mtVi6d+v(0>*Y4%r=4POY^Nec zL??k#H@4pj-7s`{#=&3{W%vAwFnUb}M!#q!oiU%BnUSQY6;zl|_mB&O8UJ)-k$&pt z$eR@uTlIi~dNvhmpc}R3dFhMiQlZ)?sOVR4bVjI6xzZcgk>4{y{Y61-&sf$J1@#E| zFe6!KDyV;CjM|qY?Rq$4)M^Fw_l!{s1WJv4|0e#9cr3pe9up+{>6mrGl#yQKw0Xk%SXngzNAW}4k1D6 zEee#SW)AJIKw0XGaE@c^%c@i~>v-F4rJz_~MyR(Bxtz0ww(EEPJOSdzm9U+BK;#OVbyQHM+desBkWKINgo)-wKK~$q043g5o$i zlG3zjrz;#;+7KPAKsiJ*hqhIqQmTlqWT|RkzP(>MM@r2IdanXysofM?Uw3SE;v~6E zUZmhzbe8yz3SP<=s;7{zn*QECm+34&bNsymuXg>Xzy;{~-$<|?F6a!w@!n&c2I#SY zZ>9zI&;ZBUz?BXVv1LEar;jpL-nQ2^RaJEuIy$Jj$^k;l?)1PC8?8F(X$^XUEw)BQ z=aQkgyp9`sg9bR=2G%A370dvEp{GYxqU?%W@yEH|=;@&1Er{OBk^FLtJ$q!;N)qul zhO{K0>xe4`^xUjd^f@h)cr2uzNxVcwA-P&hA})!ON%*>$pAOVhA?c|l5%0Q4CgCge zB$Cg6k&c-g_ijp(s(3u8nmnkGNbid0&L?Z4RFT`e7b;9r9r0wHWG1~j?G%zg+$MKr zBR2V=U3MNyqtl9?rHdq;+q#VDuG7+q>*u(MDe05|I6=$g4#i}qLl_`+%O%Jl5$?qlDKO(fh4(#uhEjYt2j=gujdjiiMyWTB>Kw!@;m91 zT6(-A*OO?^ai5@0(pAx46cT>?8k2}toGHmzg(Q|zlejr)Vz0fz^Z+FltvZ=7)qX3z z!*9v_3*{5x;?+t%;itiMRYys8DbT-@5`R^oYaA$)uwUCViCjz%&rFyx@+u_!NWW`n zdPI!J*E%FX**${l`?16HXvaJW6BD)#AmqX9oD%ozfHh_{J9%`E`o?gvU3A71V?D zT;&yn5;s}u6;#5@XvZojeoE$g1+_jEs)vI52!It0G+8HPZBS4gA<3EO%N^3fPgCNl zn&@3gjAy3K>ge|`3dt8lvQ<(2Kg}y~xq@dSeo^pmHIF}5!Lt!sd^1LT7?Ym(i5~TN z#6{ARZzm|BMA)MW>I48*oT#AQNkAbull_0Cf@jyAui)Qx@T7WvYX2XrkgyULDI^;+ zB>6BZ?Z1{R(P~1?Oy83%QSdhqUaLfE{8$Cgt;VkyvB@z)>%?OfC_i4=BB*HQ?>SI% zBB`E`VZYoit!C(h3UqT?=;I2M=h~hksF;9!-+_|BliX6T5m26daHjY8p}eP##|tkIg=xCtb;w?^iWFFDYx{{)3@+)Y&Zu1CM!l<`K23!xcB9@` zP@knj?f6DkI&1hp1@*sFs8`&mEeh)MRH(TMY8wD)yaAUa^j<^U(9|w*Lkrx{)P8Y8 z-}zcPhZRok95?hnH#D_}+|WxEC|Ai&#kpT3I2X`__+J#&8zedi)FLkstD{zNj4#nZ*xQ2DbTOdLeFhN{4&CDTiQWmZspz_l9%VT>eQN@TjG0F+YryIO>j(4wXrLkY zr!~{gG+{ZM~NG zJ8-BqSmb$gSr@Q(#sB(wHTc_#zxlz@8{bT8-gKsm>tkBG&G5{EJ$H@H&&esMEH(qX z3QVg$`oZ$8O=hUZSW*LH3lx5pfW z|0&^1##L?GSlviV3H--ZH@-}tM^!f-1Bd$C^sRx@Y!IC4=m+~wL@`h0srI*q^I;<$ ztH{Zz>{@k4w_LMZjd|j?pEos`tv~A3D#tuww^}EGLv7&Sz@a>U>z|0<3=f8W^GUzH zHPfnVi=o^WXc*XU%>05iHs5bBty=!Nw|33X5K{*yZ7KAx3J)J=y<5GlX=77U^`VnU z=@SBnDl4C|*4IYc2O3)K-IOm5{Fp&6dr-wd}k!&US)0&`H+dAH#5)!?j5fnp^f#eIkZx?6;cM~ZTO&xzh0JgsEKIP; z2+@*+itw|xUF9gFSZsvm@!41D?1<2}{?;Qxdn(U0mM(q?2aKg5`XG%1Th9+PoZo*F zRq*Qb@vEw_$arA&37fnVy;r#GuCTs~){NZMvBB)N9ZHp|7SCNUjeKL|Lf~KM9v=nUBM0hB{r!2f^A2cb)@!&-`9=pNzTUpo~S0376+%u34PQf2LP7z3L zP3yokxXs6M^61Pw0d}^e%L7fIgfnT?O;<={jf6nFggzFS3mC+ zI){Hvi+1BLR+iON&F&3Q;A2Xr_-BUCHaZ5D;TJyE(?{q;v}QB%dcPx)^*=TP+xOK6 zzHV!mt_wuz+bR3%0x|kh7uZ1`k@=^i0&sCxA1DEe{^2Vf6JPs@ueGr}oERuil!>qP zfr|LIDf09z@wF~cMc?WIg+x!>QcQ^`^ON~(IM5x(Lp5_xGsEEraokS3PW;uERl_l; z547`|+|tEV_>LWB_^t+SjG3s>?7n|F^0vTxqzN3sEi7ec< zX;gvNs`G)EkMOw)v~?UVtwTc#))=8hBpO2n$~7V*K<3PXzMIM9Q3ci-QjGC*h`^<5 zfOTQ2K*K!N`Z!ZOzgk$;U|M5J3PEXF(5-0`Zti!dd|POet})zJS28YTQ#Jt_ETZsN zlpq!OSh5y6dEe{hJ)aYWc~0h1?)@5 z#cS=ly9J%c_k4mqymma?M4i*3(P-?{^#wN*g@2U0`!hl`Wod?Avuk>fzo!{~ojS7U z=Ha`Vs%Ce~shkto*J0+&6;lgQ&iKF8w_J}#NqrjUANUJZW+E(}CZ0hx)f5)=UeIPn z7PECDi};8N>~_8iFWv-YYPYs2-E_-5tF|`UCa~pvYju1i(JT1=$0&e-WbA4*!$s7; z*2T__=R0mZJD-yEvl||LZy((9Ywm9ACvwaAM)}9)hUl*vwmHHq?lt?@9Ga?Gd!#S z@lt}uc4J|5$CfXf&`9~njW(2FHiAm5kC%9(gmR*ny3QQV46@MwDTQ9*LKHxDA&h1q z6ijouP_Tr?I%edJl1+&P&G4v#`oZ~j@lnP2N`i0{dBrmdKk+MP1^un}F|4mep6o>k}zx2>?6&;t8z#xRg%6+)9~R-wsW zC!^_1dHzcB_%ix!TEUWH6soZ7!e)K2q=?kVzi4}O&*o%NAp8oSKs0*te39;TzQ|D1 zL^i+kI*fmSA{Nq;mH3YJC=8D+F(XI-R#{1Lps~#zo%(KGNdpwR3cLd3IA0c?TI`LK zm9(y0~q zI2r>A;pY^yJ4r$sRAm5%fVCO%OkkQ3_}Ss(tW)d8PmUyS^B9lZ*?c; zAq9x1warsxEF2(gD>BiW_DSFYD;X0R$UJ66X`?ak0gQqaecHtJ`9ReN8YudJRpFV$ zJU1XpypahdZ3j#&0iW%dn}`Ey*yh+qjPd1FMCSCL1&?nUQM%Wd=fxn|8$o|RppuZ} z8DrtGj3oDkZ!a=iQ`@VEoR0A^3XogLqaF|qtRGSOt1<5ohUcNrtck_OeD3T5s9TKD z{>HFjMcfbgCXd=T!de~LJnII4FU}hgHg}t~4SDF<{1Ypz4d!HTVW?)-AZ9khHx=My zD>``^`b%8@)O!jzq$gighyi7XI?pc%kTDmd+v)OviR+XvNdPlbSL2K1*P5lZmCuAH z7NZOE1#0ZLKqpo2D_w1b{s^)%T$+|3u**YD#(WymgzZ2#!_RSRfI4F^cBLep?=d42 z)O#YQZGv2alOjI_m`~20lL_8{8d8*pxH8fruWwc&})M+znw;} z_9^uuTH9YFNb2(4vGced!?U|kSl-3e zo)}&8`IxH~H#(%YRwPDhMGZKv6>@!$gzuSk2lT0;Q{n4NW~Eey3Pbe^x{#M>_Q@Sp zy;JA|Qd^lS;8~fYD0ST^H5pSf1qtDg$S9LYhjGxMJlP><(fA@fqzlfDNtErs+zh+? z@DUS{T#!nk7?p~~Wmd1Hv50d;GFzn>SoeolrN3 z@!>iL;~bLE#befPZ517U-*ZjAz`7z|U~SQe(qD`q}yiARI71QbD)!(vLNiHTmFpzUx zdn?IKbS({+3d-TyENOXHwex4ksP#(Y9_1^MD2ZTwT;E8>4%JpSomLi|6@gMf;Dl} zC29t$#)hG4#Q4IA{~{;;zbgyF`)CAkJ?g^ozps9%XasFUBN$4JAntj)5$uib`i`rZ zj(e?m5vqrGe{O1mgUs*(u7?rfx!ed&MolMBE+xU8=Tb}Z zhKI`ZG6UBpYD?G|A@A0~yY=wycSg{_T!Alqp0|D&Cl_i5!$fKsiqzt?<@0UNKC1ET zOo-qXaJp~uFkGl{1L!T?JBvhy&-Y^fE*Q8el~!BHNhv5c2#8YdeLvNx{xBP6J~Z90`fO0jClYeZelSQaUaYJ$)so zzl1J;o&E|B?MH;~V4rtKPxux3+Wg-j+Zn;TQ406wG6?RYV4D-%zS1v@;7C9-3GOnu z5|=@9ANIL@$x)j&ydSz-7vAO84Klokz^&BjZI2$@5%)#x)}-*hQ-pUPC%hL?eA8e* z-ub7D?;4a6@m;CJHyw7xHw~wJ$XJIR-{_K2D|{W%Tzva2L>*$AV!WdCr~en@`v{VB zIPr~%58LM{;+s605Z}FHT&Hwg#5a8} ze^e9X)J-@!e5fXezcP=4{5)S61?{N@%HieKpAh617C=sHXgtP?qH%x3Dn*QAmXC%l zNa1{`N!gq7cz@ISoa2XlPM42q$1RVcfC%wh#E)N;rO-U&&Zdh9Ea^1ffoK?`-P_7#a7vplTn zS>yLW#F%Bf>{NS^Jk6M8s@R`e+Yu7~6Aq&#j~J1K?pSjBXFE_;+bF`qkx z#wz64c%0)tPSmrF>y?h9xr-9y`pb5TFn@zxPh<7dJqYt}Q4$wW*HM@sLldLH-=ZW9 z*)dL`ao{i~$n7kvj#Gw&$e;CM6u1{7PGnAuBAh`WjZ>U4;4qClAJMu~1o;^>1WX>N zYz(@6N&|I_R3;+IN5HYe3S)LEr_p)eZ{qHV-9%xYH>RY(SNaj%?nIo=6}db$tE_naQ`HaOR;-BbBqKEov^0KNp~C`Tt^^G8mFF z%;N)SoO0*ilgBCWb&4cTo{R@KU5!ruiffaOizH58$=PQkopBN`!$cECgczMfx_pk4 zXx>-K4Bi375ci!&AiU3EHzs6@#8LRvJJl4v6W6lad7vUje0?{>2Yg7zVp0VIKIcO8 zv7`%8yO*#tI1TxdgZsy7mp?hS%dFX5OzQ$WX~+~lc5B=lu{$`0dzCBCfC%m0G)(C; z!unaRFQRGtQO(6Srp!cePl^XOj*+uF$jBa-GP1YB_nAlb97J}hbN^Bo-|EHZ+f{0O z|LPj2?1@)P7UOWf=oI5{<)ZTskdz$Xx9G;jNzPHghyboV=vae&elJD9UpiPO`olo+~H(vTv?WW zX#|%6%GugIB%vfKb&iiobOUegn50N{fyE@$Jtiq~#w1F%rh#|hOWOsp2*MfH2z@XL zH3AC}Nt~B)$I-q8Y7KDOn`nzj4x-lMS5~wv!3fg!7W?XIJB@6mUi0Tt&CZUZP42b_ zOBL4S-StBbBDQf&N3*3!9avdY`i0NRFTq6}*6PrV<~&+`Xm`P)&9hD>g4Vt*TVV}I zPy(w(`0`E}7qn;L%Ha9RS= zxN{A%Zp?(<)*&-;dm*oZiPn7qlF8-8u{p$s$@pTc&OY;;I75TM{;?l$8aOIopN`;k z7`Vj_&OSUtLG_7kK&qA)Ecm=sIo&^YqjTDk*1`eSRE#Bcm;WufCW?g_5Z{uSNeL!nkvuO_U zbh`zMhVI2JS{P&+ORK7ImR5+J$A=i|D*U)COe?pk@Ozl>GHp4o!dJ_}g`)73l!Z@~ zg^SO&nfKy;zhJHp_;C-qO|tf1F(GUJ7(D7jOcl;&J6A43Ae;4hv#_j%D~iuiZPk1F zfCx({Z)p9&s|#~hJ~k5V(^H5(2_IdKzy~JB>OFQHTC<8xYgTWk{xF25MRr)H)JLpS zIs*~kpDqfJRWU+XN7Uvit1-Qv7p=UFQo`-MsW<}*?ZQ+0)Rzyup7cuuVZi)>FLHkg zX@uL(#+_4OG6;%AHJ6*rZk3N(S#<_oHTA!aNN8>8?H*e#Q>cX$F?JLdOJI3aE_7)f zjor$+c%X~v=rVScFM^wNpu*xOgzFevCmT_byVb^mnRf>a$Q2_2@d>;sq8myeP< zjI(u^r06hR>X09uYU?l#I!ub|Fr9QDD(En&zWn-LgKqtNGLz!LE`XWGBhk_b zW@~R3rHUcZ71k5PQy-duzbE2=FVf+Dnuoq~EgvRYI=nK+L;T-IpYMo8jBm1*{?n@7 zWbK@jM(DRF9{tPFvIr&5XspLBy3k)U7zJ;{^2Tn$@wUA8M&!y zMKN55EFHeHH~a8)%6xWatcX0zOBChKlRyp1Qh8((6hlgavH{w8;(eoGO0V2Ei>CI< z^{#|=Ipw%<_%d5s+`bztz`n%(|S4(r+r?x6`=2 zm=-sD`F5I4vmQ#r9IRvE&p-|4m)6aU;+(m6Q$=pn3^eSzQCDm6fJ;-vUi<9n-mFRy_EZ-Ku( z{&uMM7SLJK+Do}O`sI8i&U!Op60<3v+e*X@?JHR*2@00Pnu-?}39+NeQSp3Hz1H^s2WkAjR{FmorTznF48?YV0^D+KM z>pcI#@3-*(ZTx=+|KG&`#k0xL=yf7lVGmpE9+$dRUaB$88kG-+!mVl2D}Fk4Am;^4|1{5#g2 z74+n+By+|2_vk#SFMi)ozeyeO`%?U-UWdvkTGd#K=R*w92m@<21E3@O_%Y5<1EbTo0@MR9jR^~NyeQRxqy@>XV~d?K-}r zO^_^c1Cx9B26w>QrSeZ$epn-gfzLxWz|UbcU8iB;6tX?xro_zWCqWdz^H z@xXyRf7iaBQMYJ)tgM8h>zu&c`~j6;h0DiTtFdV^(0H>EEJ7$7_xuOI>c)4#V+6lI z@K!g{%)Sx27~e5k#8UF*D3^o%h^N#=E@{I4(8-(klzlj*s&dIG>#@4LY~7S|aQ?<; z=#RhJTXlQ49Dhe#^A_x>x)|YFYy@co7jBm1UjyRT@joYa8TYVdi1P58G`?8T9!F^h zU58_LH3e&|HU0tuSU8$k;!t!)H!5N8Cwdkj8G9Lu>TE#{q_*b0O*%_eY^}`f9 zZ^9AIi?qqFJ~kXb?fV<{CcvWjZ-RwjEw)4svJVFFOIpv%#o?b_MYey8U>6i~d=zVk zA1o)(*vSa}89=-0>{`2!Yi&cg;+-kA`;WrTgWv`u^a0{Fu&+(!QGjp_8^P1T!fW+o zJrnrmfzOLwLXNxYB7zY4*eF!8ia&xu!wG)}f9*>6zJ!Mh_F?r} zg34gH3JeOTV+6Y;hJ7}(X{;Ap>> zv5+R09Nhmf@`+*Fx-G97WsTq>E=5n(rPL65jf%{{vFgS?Ed54&zvJ4--6SrsKi8PI zgi2hFU$!5r8*QHXIAScUW1dk)=q4)Vr(q~DzlNxk|2 zB)%u;@Y6Ufv-`9~l+=GRtzYewPAhZ1j7BGHZ3^dvM~@3cTT`yxcjU~1rjm6p;lTok z|CiyLWiQ~*iXZUDD5nk6G#O?45f|vpasRNb*kifu|4<~j+5f+)H+cqW8BG&ZzPqdk zK6cjAc&%@Z%_uhJN6K>Yi7Vd!2zj&%vho3k{C76_Q%r6IXTxJVA9m`I^?MqpR?xj$ zw|@3+`(>2ujo@Gag@At&;5!=-JC%aaULQ{THGS4E_LlBH;r27O_Lb+98LvID9)(5U zHqBf8byKdrKOOU8Fs>rZyS3>Gw8Gl4at02W;bo&Rs)=5HPqZogJoS5_Z)c%{#D2W0 zkBMv0rXcOb>xr_okI#Q()$6>c8LLuoXuK7b+b%sh<;H7Yd#ewANE!#PMuNf*eh^V` zH41wJ2hpW^(C^{f6-MwLyTFrNnnrvm%@2|e9>fpyM!_na!o;%O1BpivbU5)>Z0#RJ z4y~L_rg+1Z6JQ2yd#0=XMNwi3j~HkDr#99;u%#7(W$%05yb+UZFC*u8!(-l=f_t$j z7}(ktb2G+^o5KJ89~ddnzQ6tJCTktCt`Wksa+|QN-3Zb60NOo>BK{-slzzR!^(tx=wg5P z0tm79hyO_5X8YmZYCwFGM--tvT|AlCA#QIF#|^096gn9$M@3e>gp+&LdW_&G9NV)t z-v|!F7od2b`24R?9ayU#JPQZIyqTErCHVEw-u<*6d=SDeM%^OvX!u#0k!9C>f+kB< zBQ|pTdLB;rqP4%aip{a}N%+}ij$U3IL6!Nt^Sp(<3zddI*A(tTt;Txd z^t45G6-AfSPRzlvqv#m-^TC?Rf#GMPn0aLzX|ZOV@DNlhC@swItl&RI&|{|fh~FOZ;jqMo1!ijV*My|en7y{p39Ne~`!Kb`HmL zCzxsxQ_&+cjL)0*M&(C_{}tWR zj58y5-vNKo*Itp~KhfuL)jKE|1{!l`V1|=A1DevpbQbw@?6~m63AH=gM=tm!u(j3R z&3R)d1@^bYP!&5aKb#W&-OS^|T_U`Lv@zG;G0=#Bq-=;Mzu~zZ?H6IsXU?P?Z1$`P zkIXlg7EZ(SMsl&L+uDfDs9O&Pw&!9zliO6*ZguUJR_z)CTMxAR&-_B;H5A<1c6Yn~ zPP6(bDq+5a=4w~kxm(wk6j}U-6Fm~q|?Qj((BGd>ydE{)<`Zry- z#A;>zasJ`G5~BaJ#Pcxj=Q5P$uvMH!C-!-=r-to`od!43{&8$>AKZUW6{XpHKh}X1 z=K0&{@EEmC&6p=gFO1ufu zTuxjx5o(4n#*HXEe2`Y56l3zDBNb}`#cXb)VY}HTiMTPjd??9JMWmfDa-mpbZuj+z}CD# zV=Mm}RQs}VIOJa*+PthczEr*h$3-`eM7v;KIK#GI?9sO$1yBSJ%2dJeM!S6Ra0RD5 zAZaE)LdFQ${jsx$9{nRka%5mT9rlA_;~P&JOD{!6!yC9k=XeU=KBZfd#nI2YBs%L% zzPDTYg};b=7WY(#xTiY6qH&^$(EY+SMS*CpS^7md|E|incWxE=S3J967Wxcq(yyn1 z!A;yIZ%6ZXUsGSrXQVkaFiK}mdEal%)E2c%w8)=V7Cw_~>Ec+{o~xfm0Hd(mcAT}T z>T3)V`x-%djiN{^Ki`V9q8RGbAEuVD-+x}bJt+9fA-HI-eO>tpf^U!m9T zYlWF(Oa&W3dN33BTh;gys`0+b@p7v0n-ITbgh{E#YprALViOT5c0R&&(T?`WM5nwL zh~?5%Q5h~OZT4s`37GeLl=Vi+b7P~SrOns02~06wBFXwc5ZB-PCdKVeBs)7ky>C)z z@BFv(n}*lX`jW5Fk<3o2xyo)zV{KbkwGPl+`#B9wn|AJ?c0}_pKI^08u-2vdjfex0 z=EFm-e>&F)J&z+#=Nq92KG8{{q6X1cIV0Es{aHmg{1PNi^X{$9L78W8f_sMooEw2% ze!(92;tSuAq&LQ66qh2=&{71Ry59r>YoqmU*pnaFUL4q#Utu+3&q|54F|frG*j|9g zc@(1o72;TtH+*|OJ*@LPpijpJ4IIOkl$J_Vk%cH?Vpw0oeT zE$-tO!7cddjojSCLv}Mzm%H->i4S8YE>v@CSCpq)w>HM#7QKx1Ugg&E$mNIdyv8CL z4&bu@pL@LgEC{E4c}xF;Bs;m5ZlF(s&Ec}6^RZQ^e|Zqs62HPsRAT{>Cv7{%*CKpf zhl(!8_$}n4FMapK`msyx_RCR6BzW#qpA%s!yqI4X_INnuJOT;EUGwobu&=e9?=V$V zZj{wWZq4;#=X`JtN7T_B$PY6iUh%_p{ES@Gs?7SroZNKEyEFtk(`if6VmPj#ne~Sm{8B1$M zT?-~?S%GoOsESBgNd=8N%xI@x+^8lvar=h{Yy0=_`oK=rc9(1R@?s#ABk% zdve1ZcX_NGJEKa4@<4-hM{Z+Y`iyRCW6$A!j^?E*!qTBgYQf`3@E8(2D(Zn?qzUik z-toqQYD@yDRE|xlsn`ZV^~(vc0o`4l_p;dUz+~-@ZG|x=gn1kWJYb=u49b;JE_GbQ z33fFZhz5er8#Rh15j_zGhHAH420(x+>(-;EGmg`)9^Uv$AoNher^rs$(*>Q&u69A8^uwM$W8AG)A>F=>S-tx-A?Sr_eb zb@hDOYKwpQv6)nW%w+SRJKJDds~x3bp)k6@F`CRpW6X)3M=F=@W~~d11*6eS99T+Q z8Q9vfm7bavI}W%EbWp{U^3hfKEZ$hKk5jl9b*6GMLlyu+BI|(2KqS?5g4rCt!)&>Z z+1FFeyx*nJHXt_wsi0{U`3Ps=iQF7Sv_wsa2IvB9%pR z9_3>8KtV@oG?gs9{Pyv2FTac1yQx$b#94Ux77!ya;pG`FUR7b_%PhTo9C$IxryM!I z(8a7eSukheW!8JKzuS(lDCs5#LAT#+@^ooiWF2bGZD3EV z5qHGDV8zO(isbY7w(f$cr;JFu+>hJnZpb^cC)CQRb=!ayj{)X@mu2A(}@I`~gV^M_J2 zMd3AGi(yoODy#mLejC9fQM&rq2LAps09XxYeL^eI-jsOR8LjFu^b8lfrh zqSyM;8`zF3C7K$-csZZut3N}9>{){nXQ9pDU=bah0nc&|=qM`?Vf${Fkq-{k>zIPS1YMOz5!A{&&RDGMGfrcIfTN!uJcCQ3* zU|&}wNVkNEW*Ir9%qZU%qg%pq{Las6te}}QxQW({U;+u3DfBYNg4pGJ6;TBwMiw~1 zg?J`jlv`_;qZLw4ed0c{h4PNCgEWtZP`isRcF^KzO(ZHOhOeiKyxN;S;V$7j?0$}S zG&F|9zyRY-8gccHzKgrhNG6wgFE{27NF?SS%O>VN00R0Y5+|@$5UWY7Wzkt+y%Lq- z9T(fimXyKaV-OyA_Ujw)IW&q5;1ix4)Kg_II0qLg{_Xaq4BuWhmPV*Hb`BSQ5WmZ) z;`(m(u0s33vy<)0YQGFMnuBLgQ+?neL6I@{VP51D8WcN?{x>jgQ!KEhN7eqqnWu4i zJjeN&V?bksUPQ@f3UYGc6q$Tu-$C5B0Wd!*P9rhg82` zf<=f3)9&x3aCJpYGl8o_S1ypBfbX7tr|B8)wauZyVguiPU(h;FEkwWir%BS?>%2D-fw+-85H z91lwzZTCRiqhgam!t-?12WVmv&-j0hCjzH#I zQsXUNTQ+}63C0p9qX@QVVNT|D9zA)(gY(hf6ejocBUsc^_Si``RenA4u@?^l#Ima( zU7UFL)Lrj=13fQdHVnsL1T&-?CQb6N3h_tUB#HUCz}DhGL%wOn5c}BtNHb{__*z6= zo{f!$E~81t3K|^w=TP5=X_HU`WT8FafocBf#?pZ3!A^%%G`{z!d7}V#YIaA14FLQo z-&ARdg!Yae(P>xHWo4xeSFkiA(h9>R*v6YqvN*FN>&M&imU<>FTf3(Y^V{^bb=j?=|haMS=PHgSY;}P6J_>$I+ zDxg*4F&l-40`uUpK^Z(se_{HH)&;DNRdWZ81VdSEEPmMSg?x^D$A(}#MC?h?kJD0# z+Ny6h2KHki;tjBGZh7^7dl6zOepTX(`+4$nYktww}CU5AHft z8KJpgi!Ft>yj>Xu`WiTP$Zq%Tp3`Y9XXQujZJ_-`3;dpHs#)8{ONSt4_K=6xx zGBXQq2LF|G(T+haVkXud?6m$t#!oE3ooE%5PGJ{0k?gXasg)y!YOuiEtv^*!gw*+q{|E=AN+smnpS}j>40qJ#-V{Q*?cpSr?b(?8q8PfklL zijh6d^4ncnX7Mzf_%Uo>JI-z=JIL;MJlP2|xjw#YgZhYFhn!>Q<&@=GQ@J7Wa@G6o z^`Bp&vhTP#@-nagJcRY1c{KdlKx0iFhjAWXfuGg;tKlqMBjbBuKbC-gifNtLWBA48 zR+6c)Jn&cVw^wq87-X;He1XdPaUh=0tM}XMHt(l1m(!WJsmy1;A1Hpsj+fOK!9vvW zv_bD<%rv~eaTg6Mrw#fPD%r<>!5ESzP4MJ)bS>}{Ub92%D)!)s?RiFM4Nfu3uSO_(xePG}Q_;1vHrSesPbKL9w=t@7?T zj^0~jznh2`9q@CRmr?e_jegdLErb0D2)yZNI#&I8Fq+)?o*h@lYj=?&rtxgde{=lD z&}2$wyJeVBBd(m-&Oc0~ewyc3z~>!{Yh#)Tz=~7rozci7ck?gnTU^>aKvekr3w?S6 z-xTwFfOk{OSi0VEZ1q=7sGco7JbTu8Q2n36$6xvL2X>tCM|DPaUGll{p@RuLe#xE=*FFR5zGj1G@>TYq0cXJ{KwmB z#(G`_Jr=Pj``M?gH&=A*ED+i8!1WyK8UJmAmG{Hg@4uqgGT;H7G{O|I*)1MvyohQ- z-ITyrdDuDQFEp0o;h(&gug8N}Wx0l~lH6BDl_x8&4C&wRdPxp7jdKcXa!rV`ggC2@Uoon+8< zW(TLGKmB>-aIj-t!S~}Q#>On6v<7+h{wOT^if;L8C%+DiU%^+zkFUUaddCkg@M!87 z-*zq$`IVTMIbk;d#z%+feuh22G^1zrp&QU2`)`{uuKLh#(M0|Is}J?X=d$CVXl0L| z@IJ9aXZf$2;j2DGH}L%@R3F-c&t=6p?cWl+<3duh3O{m|^~4{<|FT~E8SkX457DZK zW!-SJawGE9N`q$b`gm{ z^9tvA+3U;c7RL%QbS0NV1udFHInYs%YQaH2od(V2lF+uMw)WRDy7H)a)K)<%xUmiX z%OquNU=^#vQQp*G=LsrLj-T&EkSk?86w|&o0Mn4v+2MB%b4w zc(@?*&^CcZ4&JW7B>d;2+rNu8eS9KFy1{DDQnAJqJ9& z8oqPj?}S`v7r}`+IAP%(BiMIBNDD}7aSc0E#s4yr@kk0yHl7L+@xVkpZ5*){(~^HP ztm0pFf+CP`b|uH-LRzq;7c0Hf+E%MA<)WAb$O7IH5X5_+ihGE1Q$rGw zeBbYxbM}^?t?lpi`{%<;vuAG4%slhVGtWHp%rnwIA}ys$cEK3TBc8G0zC^AwQo!YH zn7}-(eX&RJ;!(AUD7Zf`p6{!TDh=$TQ~*WJABaX66>eRGCPV!bGp`rKe}yzO6w$G- zpc_!(Jy=&GJm7GVk^HnIH3pCBU?MnLf27#<$p+WNxI8~=-B|M|6Rwzp4l`3eT{Kj8-l_d7H^KrSV-eU;S(o?na zSu|nLxsECY$}kaEAIqI}?s16O`hB~Rrfk@*?fizP=DueTz`|s$%0go968n=Cc>}0B z>+CArS1{>vXJUrhW8r0hC2W813S0y)7g&%<0(uaFkc|)P z;#Z*12BbIGvcgJ7@Vr@9IL_p}%64*T0ShQitmgt>b}_n$%bEgQixRDNiPnefJNxL( zeEX@R*Ro6EROM2_myd+$Yj4O7EXfmc8S&tW1qI|_A1=z8j@D* z0~_$KEWoGJ0lRF#%aB7wtHAElbLlA=c9|#AQyg~6Pt#NW zWkaKf!IXO1?3CM)l7{jOI;zXrQHd;u_nfTy_Fh_xA}q-ZuR+wLnbjweG{5=~{|5Vt zQ>n$!U8YpPETW59teO;cGh)(Ee?`}_<6TwHR`rDa-C{QOjQYo*!bz!Zsa@NTnZnu@ z{b#j_u`Wm->)!TQUuT28yE|CHMtbT&cly~4mLiGgC=^&;V~$1Yo}wL)=kZ2`;oUZq zpz8DnJk!S4+O$Jin5!Px^0#fTR6-9y+QJPYCDgZ=A2`Ln9+<}qa(j4JO2g3%#KSC) z_8!jCEtdZvHuwFW2J42p!ilX91k3EAL(o`7!Hl385T{%5y;7Oj$8Vd7+SrVGoG#U) zF|mFqoOnIXY7#Ea0ovxlfL0WRwTb8HL97OM0#**iGA-eMX3!;F0DcRB8)6?1vkPqD z2i3PIY&AOs%?JpnZv(1kqAs%4AIYt6$!x>qrJ|55|{auc|XPmJN8Sr{lWqZ6N{}@IWU7W{$fmphYI7+w}Vigl!9S8D;s6Vt`WDKr)fR#@+( zB0K8pP$IW}ks|GqY#moI-q3RjV++1K6|5yY_`KNid$cYbNWV^*K$zmVUnqu2>02Tf?fW1VX^zt0Ti738m*wKm<$20h|FHgiFfmtsy3aX|tn7a0LHx&65Ok^_D<>BjCJ)P1 zwg!gv_vkxa&o9k(H7k)W3_t=dYq7KU1d1T~6U6zh=6kd8F60AG|HtLeXZZoH-OEJz zW&d&c0W6T7_qElKFIkp!Hv0eR=EI&MI!TN0R>p1_nB zxXc5pCg=6nPr3Fl>FaepuSDLu5~zy9WK9WFb%!Nj09TXq&W}U*^?wcljh&n~AP%82 z4MNtZwjm4nnw*t~9$>)sD-V1D5Tpmc5Zn??g<8j}H*jBZ7|+TMf|0AuzhnsBAnOnI z(sm8<)QIhu*i`JZHx+u5wa8<2w^#MVdTuS{?Pp!e4m8b_Ve zVXi-!#&4gtC+n>A6bdkc&-#&KES?^le#g_W@}Y*^qt#6ihN+emD<(6z&)wiYIf4%@ zP(nB1>s(w)Ox{>R4AFKL+vhR~al~Gr5?f8PZ_=_Sn8@Gl_B@G)R?r^s=h%1ABwnYV z`UUP(1!E3Pzrtd0mtdhtYv5cZGzD29XxlYfn;q_YMdK*>#y7q#_1aEIzGCldF2V{( z^~CsWc?%Tx(I-`^hOVL-T*xve@12S961TqcnvIG1xSgzoF1QrDs1s7^GPKI-x7aqC zUjR6+Z#U(mmB~BhOU3$zy{&1Jgn9C~%=^YAX?Y7oUhEgwBS#99-`dz(nVxcyT_#{b zod%6(O4%#z923*a{>p}0iWKaBc;z;JS?{V#)8GKpl7jlB!=dI=(AM!|Y3=6DS)}Yw zPx-T*@??6-PwkXnr>9UGB%swGMNCm>262TsRy*)empG3_7`9khv1N$RvkJY!Er>_k z;f&2gj1|R)zWsnxj;9_^* z)r8M=mnxu*oW~_?Y&(v(>kq>R)}Z=>ioV-ptlWtt9Dj1>&8DCHIec#Qql?YQeaP%UjV2UN3iF=U|s2KDoy`IHjr(zfjjXET9Ocl z+Zfc$aJ%{yK$ouIl+a_SGNIOb9OsN?FMH?wgHLM3S+~#b9*4ku^j*OWW4C=*a>9;_ z(8XkS@-2ZGu#@*~1RG_6pVqez!bNt7n31tr@OatNqQiS8XWL1dZkQva$Y4}W;d(<2 zt0(Er{G?8%GhOyAh3V$l*v@<(BtUpKqZ>U9-C1-dpR${|8*jsKNh_Kyv6hj}0&in= zmUdK-=Ls8o$ty}a-G~(=r89BWsd){mOc@wjpb3(F7q88vqVKZDVVs_u5Bk$ zQs~W?4E<1((8%?vI$WTHFU2{V)(#VjzZUSL4{Vyj`E0je^WQ&+1H=q4SS8eorML%J zWP4Qbfx-4xLN{X51t_A2*fBxFyC`W96C`oOCJA#QTF15g>h!gomYia|veSE(XZP%A zEUnLgAy7d1?d4?jK#g_AWLkJ-$sf&iJ)+Kx|E0igr|hJo)2imC$;_N05q2)^EzXb zne7m}j(k93j)%`n%W;*RqYW=yrIh`L-HO-v_Lb26iyG??4@PZsqarwEOmEQ#G5ho*eBPcAiDiA}H#NQR9A&XL{V4$zW z8`mF=t4-_HqODNm^BnZVARKlop<|d2v5_YaioN)R3$VeKK0D!y7SeJ`F9+GZ zY&(d#Uq)lmycBsIYwzLo1@C~3fO-@X-J1?D|GVyek6@GM^M1R+3Z%#tA$IN~aA-;P zFEk%Y=#r$a39ea4DAiqmBIY>+!Xg!Skt{J1{^N0M&?D34Y`~T)=M5aTT5N4r^;!A$ zTP-Q;Lo@38|73lbjCw>ze!(849uNK%Mz!TFMJ{$_q>(HYxh1 zHR3a=tCs>GIGn8v0OqiDhaGg8b=-$B;^nN^(!3-MK~`bx4uq*GNZRG!jHrZ$U_3&} zyZmp%EJ7#)ZTazSq2ckx;X?*!igO};<}GB}L9LLmlZ zL3D*3h&&stKWwWFPwI``6o0Mgz# zqyw+_2&qq`;tcg9_f3L0kpjbKx8^_`#u~tYp$|<$k163}=t-=9`>i}M3C%%UQi{j7 zSzkk;l$5D<sS}dXM$TTUmRiZn#+&z~l6JFpKd{ka z`qDLsM{IgI6wfo$Y6#^R(NipjlJ+lSjgxqOr$)vFz*>qL)JWM}DC$(jTi@pH1M>b6 za;LO6!!G^SE9hVc;RuuETz6s-f-ukV3mD6DjvbNK=G^+ha;;XT4=1;?^5 zr-2De+#KibUjIwOks*Xuw8N{%JWmm6!W?HYkR%OLx~)L}uBDGK$9X;rz|+lfJoRs9 z*$g+`G$(y6_VyK95|U-gV%+l~K;^${gY;Fl>wji@6U!7RlnDE;?W2B1XtuT0e~$iS z+nXCi!=j(X_NMyx&jRN(y^$wzYtom^Oq+}+?t^!xJ-G6pO%nn<1tu&A%nzzr$dXy)n|A3uluk*Z2rIZi=Zh8>cndK-@veVctDVs1{N9E+A27{)D%8jdW-zos z=&LLVCzJ)Y5&P0HDdBvC-F!+Thl+U)4luvUa`vH)O)THegs=Th-LA!Zh}j!H{I3;n?Mn|4&Gw(^5bR(tes+)y(fv`+gWMEP-GK>N)T)t7VZBP#eUFi!94sKV0PT{Lw?_a{j;v#6OOZJ!>AedMe#NsAzeESx=pz!$=oY|glp_sWP zT|G5cv>V$pxX+O~S<{2MD0=Vm%MHRqfFvMLm0(^g50w&U1(;m+S;4IMq<`ZD9NB{) zp>%pP)^hqFBck#oG6=UEW2u3&$0 z>=n+yM+z51Yh}3yP%b59fIa=2;saKj1UvACT-gp|9ZV_rZJQf>9l1kL?XG7I5=I&7 zGN-1mcejfcfG`qL?BMja@bbIB$>HbFO08?QfcH2`DxulzQgzoV5m=7p;w($$XAtri zp|;qNm}Gm^q|W3eJig1Hz(%oy2hoO}YX3|#@uO!gs6PZ$%Ra-rIepyoZOlB&?8(jh z4T=ezJ2~iYHM>W&C9PGKNoVrj$RjI+8P#FCicq2o zF&WH*l$oBl_efy!%Q}vh_O;vE+i3%T@aLZ=5tm#0Y))@_O6B2JJ2LE!)Bu2W9WYD zv{G>RSHub&-tml8iezRF#`Azo0$*$s_+12Y7Z$-}E%;!xhWzp3bozP22HxKW{xz1b z<^&-%eTAU~2O&1Amx)a-j1-xwL@C> zDrgED-a#z`t8%ldr|jj+%h02C$i>j_)6b4(*mO4;wF($tM!uei|168%C&^k48|Gxx zV*VvvA|QO47aBf=ZC0BP<~)1l`?bVN*VTc8gj=E zZ-%EUy5fg7E)*368GFY`TXeX%c@=`B7^6ydR;u=66WeN zKTe%gmaTetnoXq(3Gbuybz^pSN_jR4=*fIih!wm|cYk^c78Z$v`Ap$F>Bh#c{y^wv zLZd`W$(q)EWaXX57X2Dio5!0^kQfE)T4|?$m+AQ!E~eiNno4O^wWvE~RXiW9NMMvPq6Of9{t8{_r^x6Ee{|@BKLD(s;n@^1|=858YL%HVj2FGU3>x3%wi5*j~cXp zdq>k$J~^9SPzv4 z)cc9XL(eP%DUF|iT6)sQG-K@o-xlVUE1m=e3mU3P^iVE^CMGwfNn=5`x9^0hQc?Q& zeo6Em6nkL17|igWZP?#Iin$#toSb&^&)k@@2vj1>MIdyXqfdhNhyox|E(fpJu{SdI zulA}mo1yOmsJ3{nEcJE7Sc9b0)S;BIuK`ZgVQjg61Ta`rDBxJ8u;F7Ee)As0x0Nlx4(pdaRU}7ULsH6! z#tqST)u*LgBl?1g@+ebC?^D^17eQPi^hJgm5lW$7A+1}B^;sy`mI~~42p%>Tl}J-< zv1;QID%Ry2APpui>j{4-`ab$J6&_LOMSL9^0na~Ge1VHP9c9Cc7Pv#eEwafyzb*DB z7BK9`xB_!5r=GDdKimotU{UsPZ9Q@BFJ;;7ez_bcX`Tj^8@ncHVpopMLwx z5aggA8r4|64!L=kIjg}~&0_#pMOJXL;c)F(GIr!I;TLY{KUsL=!}t`=RjQE3f%jf= zRDD>Xc=H91kPRy|J(#NT`}y)cu1PY=u0NJ254Qw9{R6srjs5Mdf5A3H-w`;M?j>v| zCgn~^w7 zE`p)Loyf&8oHg=kM_}Y#L+B1|(=0>=HqILPmSYnSv;uz-{ykcMFa3cCzn-l>tc7Q? zTQ_k?0+H4?Fut39kMGv%c>j|;*k;GB`zqgIjQ0(5W@8L1fB$8Dfm!j!E&O{(|3B8F zuCWK8qy;U!sTz3dZ8<&Nf>^5IChAtK8L6Hi(Du(;Z*V=q2AwBfRt@wS$;%wUhv35r znCSXZ9nypYS5ygi3P7%KJf_!g2H82xSJxlvLO-nBO_VSoXMzV0XnhLtVx;~#j?P20 zb}&<1`nq7+)vFvz|Jn-790qTa!AdLm%9i_?I^PP8lc`l!(2pQ5j(spxz^FyE(!Z(+ zYaT&;!%96YQ`gB<-WWnAx0M$^%zK&4d+sZn?-vk%BqL4)$kR|r{?eoz4XnY9|I4n z7w@&lnx38DFv)sAxAp?>$@CV&hzCHo<5|8eT5?-E>#LBF@^#4`vt0*r~(v5PPu%DEvjcSIH|o*D0#$Dp$spL{gTRz2EXefyaS4)5?lVa~l@P*#zh zMZ-I>yT?Y&VNN)c#E;92$s_VuivVtev7pB5O5pGT0B(Iev4q*xeb!pM#Yr&}MgWShIkxH^esW2K*5=d}}^u*8%at zt#}I+jGNtvg7@&iMLwes-iX_b%DUcHl_!s5!ND^L`@NAnogO-``xuZsuKixcf0FG- z8JxKb;+_JWk10@%`)d)bZ|UvDl_)$(2V&GZ-Rg{-YPb;s8V2qRT#ctrP){I#6RTCD z5S*yqYF76iQBUnrFKsF>+4H_%d9n$W2Z#HNF}eIuOr9#*{>|V9+Ni+0iF<+{s0QBL z+Ow5F;Cz||_aNS@c=vlzHI zX#1n>7-==yCwCSc6xsfTRBekz4!`D57+@IusX!yJW$MlKc=#y1*19?#Z>aDvHJ%Cj zSU|17*z5@mQ4JNI>&C(jo{ETF!G5j%rQD@AtHuOtoODA%nUbwNavb$IMI|PwN5@zW zp90tBbI@*8hm$_LVd3u}CedE_r#wg1<~g9Jq36r0ElmJ~Ze=bC55hb=4=bx`Jn|SK zW&PTgT4s>%o}zzi5wcp1Yci~Q_$bH;tK;#83J0EVi#GMMNKAAONEn-o?x8Qcg6FjM zmvWNI{`E&cf*-27A%U=a>rsvD-u(hpuI$~sMDJv?!rztSq$c&Nh9!(ARB$)+EBlWX z0Mtfb$XhBHr5y#@#oMu~`F>J(&!WqbyA+>M&5geR*u?@6Gq)78fXu87W#&4Oxj=Mi~%Aa#2EWv5nDD`9Lkw3`PpPm=}Sxg?yD5cj4|g zK5sF!QFk`Wne;;xk0){kF=3~Uc$=V1x;{$g&tlS}9mJm!x>vRXhBcxcjFj!TBdHy7 ze9W6U>quHr=60AZtVR+s2~-Jrn1KY0kruC7;(cM7cLSMUg?F>oz6`H^jCB~j@eUF) z0vaAmiUM=MC7Lg@2M<^@2$vPebW{$3d8KGm74zC~-GtjexqqwM1$;g$l~loKfw80- z_M--wGpUBO*$_I3(>KF-769RAqvkDyKq++y;%#*NwFX}a?G`CpHj0`_TINQ?h;ff< zF~o`{M+I}>r&%hJz34|&TbD>*Ykiuh>~y(5_&@&hfBfgO@t47P zD#Wi#%&lmclmnJ5RgI~+YJ{Tdp1?p=e+ja1B+t>@>Ds;Y5Yn=d##JWxmZ}%4`cg3nZ!E}cNMAC+gYPjgn4ce9v z1fH}-euod6_godaRFxrqRN5c2`GJV}{EbvNwYmb_l@8ZoTT!9cE1{2|NKt1rp^s`w zomzh=BfM*A0o#Xh+Yc=QP^r$qOU%TA8-@JL!;_3?tnHOY&~=yr$kxPxBiDR@96q^l zHs4OK3=F{MT*S(tvdRNZNCM2G0t_rQg^$;gJ$Q)tfv$rVSzmKq7%pWO<5U0s&yY77ihXF#UOd&%`pcd%7GHLAG4;m8XfG{)wX zQ?pW+1s587|5e}F3(jB4`wpx{nc%ZqIZ4pr*bTpOVtO2_vk|W9vw@3H;X0;ALxr{Y zi|tBMqen$3{E=H6AZ$N3y~ckeCyW zU#Axq(;N0+i2LhNNS%>~u-1+YextCd^#UQEVl;+N$PRqN4@#^;5-IU(YUD`~hz0QU zkqTm5hZK7Q^9)JQ?n`Ub+TVDxTb~ro^ccS=q`k^`V2tw>@7J*_ z3B8KvHK!@zKjC}i1;~e2H?h;W9HL{}c6jw)j+&@YdJeyM-18j#T{RR_L2Iv2LeJns zS+y2@6t7A?$>7S5MX&^~KZtD5T>Vyj`~U~u{h0Fy%BpglqH67U;b zDs4V~2NleCV_vo&eGCu8WJ( z!XW4;xJrOyf3CFz$O$2eSnm`&%!z_WUu=v5gKlnj)h{_L{3RpzyMiu=>3i_Xk`cLu%=Gdvx`fOiL))uR1sQ3s~ohmO_@XVn_s{nL>%U$py(leu%y zX#J(&+fM^^z%XCrBro950KO8UGXQl))E~*)QHjq{hWCOj;Hl~c|kW5&a3uE28NN>5y&d*o0lJ%+NE`N1!fV>X~MY^9hMCTUEw=2<_wyR z#;;ZNZE8`2TJ(%RGI<{+-^*A}Ts!qBJYaE{jmZtuv8}4P5dqwJQK^aSbOv8ztHWav z$$4ljam22CTqxTV)tCn=m`YEm`MbTYufs*7(UgfGVSV!VFZr#&ea5eK}T z?r6QxUMrN)ED)w$8uMBSJ&0KrpWADvcAwkZQsy?5$#T5)29SSsC+DjYqRD)9CvV{4 zkrmLW)`_Xs1(YZ&wn15mKf<$qAQB<$a02q*Jk}@(lkVF9IMdIvuG?-l0 z&Ng>3v?vpZAZuoZW+6b{liZi^Ffl^o=e9m7=oJ$JT|q`n3S%-R#2!UI&Y*DvB$vD$ zXbvvCZxiHKjs@LT)cTDqG>Zhqb)dbMSASVuTOJ-*twu&jqN?z@W|#Ugv9kj%xe$ss zDb@NjnX$hfnu3!+@eHMSmoiX5Sa>o}e_?M+eOE6Xz3x)$-^oxj!97kjU#b9+9&i$; z>y#3zK>I+XbIBB5MEgjjbT$dq5ZlYAOEPfp1t7ddEg;xPPO)0_lIm;*FZ$Tgdb#8i zFNyM}L2qKtHQ<7>gkd7e;ukNQuOT4h2O~pOesf&WK99<`0Ebv5<`(9+7W*jTtyPV& z7=<5keN|^^Ed{NUARA=s3My#iD8_swBAtgi0-JCLoc zdIEi}?&QfF9@^^^5AFRE6G7|bLwlWkXs;8?PzFk*f|oNzKcR%$&|$5kw_91$h`jiT zx(m)IAt%>+Gt*wRs!yPb`PB#cR|!#s+l0yOF!!PK$SXMMLJuLVtb*|27|9EmN{9wR z%F6SAn~|4_h-rX1l4iHi-187WbzyAA%fC+ZUr0!8YJBPnOvop-PGE38F_(By>lx%4 zNk89svC*n;q+k%CaqJzO?SwPHv&2f>ff!8Jdz0)3Lbs!k0& z_gnO^V~3=N@Nta3y^srcmSAV*wa8jt@|O7#eyckr&b~teU-c@QSlua+HbunDNHDf= zIc%iNZy-8Z{`X{?KLp{7tR{{_mtj1VRSp!Q_z_-&5=qGAvyI?RKOvk(R5h!1WHFHv zY87?8g1?bk@x&PJEwA`8vRUF#0{|`?4v>MrjTGb-S|F+bMdfs>;&w<=!&pTw{#bH^ zHSU!tCC5FKjmqR0gm=+LYbpt})feCzG~(;bKIY5#wHoquG}jurzY&(?_(MhWBS;g{ z+9eFGoWS&Ift4JQPO~I|m7f5f+0MCMt3qg8hde4?6Ag`lfv&0zff{=xzwml0xBjKr z=CwjVvgBrL(6FE*+y^HO@x7PO42t~0eQ}t^Vu;&sSjxvECpp*>-S=RwD61%}M(!8r zh7a)-?8T|Go(!&bJZOQp4OV=Y zMZOFiq#?Q9?9JTwAi26zPE5Y+T-_;W=6+ZonlB&%azfZ;%x6H`7CTtU#;)Y83ya#8Fk;o+?0$mUGT6u&cE74SJMzJlpwyx7Ca+b0DKGa z|0$8@L*x+*LuHOXiX4u}sE@_z?~Y_oeBpW|nwKIQ{0F6M0nAH4h0sFyAXerE24I`d zjp~G4Zd7NBNVx8OkR2ECVgox{#bREGP3T;+8n%7b%ql_^7DwF(;x#X}+LNGyUoo0b zHIlw8W*A}IQLqnN-inMm)4lznS;!`b^)%P0cI3l|DT2-EU!sM z8Q)iIbI{H?HF|?uuQ%%0(WQ^ehFK*b+7=8Gl8eYTds?Eg= z)5`{y)ZL7<5UGgo4O;L1P7Dm!Iu-^l)H()1CoyA}5nA;wwsMvo2aFN)1{}s7%7Ba6 z8!NHswR!j7?hNc_br@%)Q>g~`0`mDr<44m_8GTST&a`YPvv5x99&EUWq6G8z0Iwi$ zUn+vw{$)a6V|)`Y<&>Z!P=O6bC)fqltLmLeH1g8nhYgcp3j!_1Y?= zmh7?4;h@sUMc5H_59W{3-<=+DA0wN3S=skQEo;-KT|jRa%a>%pOKC30R9i6 zZSF-PQ&kOqkZoCG6=g3bs3O5#$)8zz#q6kiCILm=a~Z=EM~;(de|3~g<<=Ow7CUE^ zr9+BPJL@R;?&VIH{K#I{u4CsTwL~8xcOrzJ_44Nc)AZVnG7FK7P@N1Bmk6sl*LjSr zH{$mcu#dh5JIFWsID=pG8B-Gbdsvb7UIvS%$%U10;2SA(x*C@KEc{;ZJj_DNj){2o z%NGwv{_tQ|nY;!&6n zD-j8eX-*a_exS9O;fqYqIXym7_<_C$TFFeG{)VsUU0>0DpSFFv+;2&rG6HB#wvYo*rjVny%Od7!?cv}0y zU_s-GBgo;9Ao0We;8F24hUc3&`L|3g7D88fEEZcOkvgtwi#R(Ce6?zeC>OjMCPFIP zQE2l+yFG2AzMm23%~l1VJY-vOPyphx_4|z)+u>~evn9_qYNF+>uO^xz_>;7LL#vG5 zeuHPov!R`XNxX(;;~7Suej1m?fF~bR?zw&=2yH2?bZa;vMmoN^#u1zc34y+!%k?|* z!+Vx`wIkT5md}KSYTsO;7={w9F>tkkrx@anOoA~V2rjOPpcQ-GZtWg-R`3N+)%A0$ zpx9wEf_f4OlAze8qkJ8{EW5QvwjbvQ8_5@Vdf?Ib6Tct(pb%)_>5bo5S{mBrGj3Cr zFfWpp?D9NGdtJ{{EYg|-c^Vo(RqJpE=Co~t!P2h4t?G=wM@TfTlYxmPU9QM_l)Lxy ze&fM)`0yGJJ%*q0k-XjIu5V@qGd;%F)#}DSBhGd2KeCna_~V7HVPzH|cwO%-QLrH| z*Pn~)ht%fQpaCyc*m`e4p{gZ=L4s2pfjqx)|6?fQtL`W`x)9sGYNSFlFc@)QBh{UC z?=kiv#NzV6)OmcjTk&tlb*SsKLwF=*UwO^<=YarV*zB2}e12h!sQ_D-!{*LbN7jwN zu_^R%SFAYaV3x%_gJ>HH=p`flcw&n5U~bR3|kr zDl4;$pW`+1{dFM`?lEr!T+mIq{sFpg<{_l==}E4T!E6p86g=j=j7Im(^F?m2L&yV| z9<rh>oG61;#2yM8K#b`m~=O?co`90 z!Ob841!q+)9&8;hXa^|q<{Ysv!JCYo)ZAI!oM06XkW;>AC{ z4jDlHSjQXhbk&pvMO%W1;6sV2uN%IE95^z#fDbD&2btpK01rhSUIZ+=i!^P?c`);8 z%E15yp*p)eck66?3W-IuaEJW#Oxs*Q2E19J9FRwrmH!6yj&twdb=8RxIo(SZI8?&ao02aN_ zdxn7r=%=?o0@M(GFrTfffIwx*v&`y?tSMyE{QB+r(egqMir{F>>5Jrqpg&ZWUj~#L z94)V4Ne->5KSE@iMPLQ?`3jIMNI}wzeC>1L>+f{wWyR);*c_(k zlhh~k-N1YerY^FDPzkHC;7MYZ`L0Ahb0l(czFFxh@2g5UA7F;Z(>cj((tPJNl>ZA- z@xCnkoEYPBFv2B+C1G%2IE=;CFkXhSf#NwajFk;y7(o)jVmXX5$L+<@@(~_3K9VB_ z+`J12l5&GxpP(NQO$F+6r`D$?)mM>R-|>1;ALuNo#_L0l+tL2XDfN}1zVR4!?kD_s zSV0pu3Hok-#FyoZ{Jk&}@vte)@N9;R=1@<);>S($Lz!y*(F`?mPo}DM_3|mBI$;E$ zEHA^DCA|FNYDz=DM=2V0Ty;ek!h(E{svSD*bM5g(vVIuAp?^hIl%O0wSJPc% z5X_FcMP&@*V6`I0+HNp>CBnH;H)p=ce-XlY);5IceWLC>rl}GC-?C%}%uOHw8%fBc z+(&n`s*dK4O+r#Ej-&%bQj3M8MX5--hSY_b80y6j92rFME0NTm5glbAX{teWy7XEDLB81~U8|MYa$Z{S)%GzR$Ym zRkbW1c!p4LW2rG}AUvi6XKkbALZSN>zKm55;BV%t8vJ$bRQ&bE#JQ&$9F77<;2dLI zLFTwp5evsp5RniysW5Yr8-(s}aFq>I#zT>^hpQs4vec|Y7QgWrg(3$92exTGVHXV*q*YE>k}O3HLefEFoFd=7SVR zQf9|RxRtCoP$Ok9p#vFNg%&CyS|sU5tRhX$9p<+LcrQ9Fz<9d$n_fg=Jps&SWkZvh zA#wowkXPUA+G7rq;l#thut7Ce(Bp!NBTYQ_p&HdOfuz5+<46C=G?C;m+;RO;qoDgo zk(wBEb%yn(@KYQ`o@Yk#_Tc}QjIZPN#CJ+wjjxxG7GNvx+8xLh^p4k*vCBs|_yJ6{ zilwF%F|p5GbsNqKEvS)HsLjULTmK>G%=Hl4x1_f&ezBrpF^|TMK7-2)7{&1I=q+!( z7!QhW;BbE9ec#IGe=zd7I~S6K8pR#-uC9eS;9Wn0Qg^vpe;7D`a>#h_?_`2{cs_o3 zUN1y8BSKL+8h#9aS*`y3yY?!pT98`xR0SG|@!N^N z{>Wd17Kd6C>M=$wp(16QIwLGGjq4P$Nk~+qW!cCEHBp%q>Y`@*4 zNPnbohe*T)sc4xhKBHyRtl!!E^(mu2K-wZ1r`7Nm|6r`VR(`<%n%&{Q*dJj-4oOwj zwe<)}gRI;Cfu&o2s09&n7tSrwHr04)9Z@yoeIO5WO9~wSpnRSX9Rd^~QKMnT@Lx2{SpLJQ!uOG8(G`_R*mD$+%W#o@964}X zmP04##BYo(_090)LzJn)NY_-&yszSnF}4!6XiI4E6&W?tAMx&tWVEv6A+QSKzE0;@0_yFI8vwP~!+4wQj1Kxw7I6 z&1T-T_)z|j_r7vGG1;mRc1H#kg``=M5old9P`-_;br+qFS7 zVp2YcZ}@Vum%x|tKzaeMOcbd&NQ@Dw6jhbTE%e7Wj8%J@1_&hQLH?!tI(Kra^1 zqlRagfF4!GM@3dOa(Ag3SzSz)6w#MAr?*W4mFeMogk1ic8Fd`21vpL zLg|nRm00QZ)r0_ZED-TYIxtHd_RMKaGR#H0Wy;#Z~=p(a{1SX zZB{3q94>Oh=OpfuwVd`AMLn*jvPf2bU>sB%Uc>vtQtuG&4=c4UT*eBC_QH5Fa1G82 zw7QJsbXbDObX=raYfP>#9WuGPQePvH3zEpZ>^6r}D`i*1VhOt+i~rN?NqNbuW)X7bC02af&D7Ep$={9V{WM9X+Z7li(dv6@{G!0}$17;NJSG0h@*6AgpR5PDh| zeU2UsBfSf!&8l@}2m5G`@T?T#eqAvZj^MlM3~^sRsu39f34qzkDq2NtA{NkE<4OGD zK~^O+k`3NMMNJ=Nt3j?dpfRPrhX750Ju)V~n8O9m} z`3$X7HdUYp7zW3aNS+L9(j*LX>ySVNnrflPLdr^-GC;qCi#F`EVUS%UwS5tLj<&Ct z{ge16?&3{muBhy<}f@A|e^> zj!J}+`mz<-q8h7UF+niL5wOs;lA;g#5#x^_n09_86O2VKrxBmregfe?)pA6Tke{lL zh?SEhcePj-#&C$0jR+oQ;jFdvC0o{^@K!NlEP+E1mL+fuRc8oEMhF~}-Pr9O%8D)g8zl}=&>}-y z;t&%ts&R6%D;DWOa?BT&AJormsbYP_OttH)K_IEVS_D(->m%!{5@jTRVNuu$|As}Q z8mAZt%poVGsO}foV^ObQEH2n8n3z@Bg27fzm*e(raY{Ao9%Hu_7my*?9hxyXS~iTM zK`tr)b5oaue`8A>Qnw1qxBIgbF-iStLNKMGuZfC8LEw+M?dpERKvd&I<17UJSXk8i z6QQ31{#p=|ioY0QlIlB-U`l<_N5y!tpgrAe{IO_M5V6D`%bLSM8W!L4Rc~*?qycd) z_y*-IW3`x4WZh9W+eT_-6n|T+Ujk*Az(BR_DE)&*tEAN7ATis@lxzK_le)PLT83KG zPnqB6+J2W+|3>5&OUJ)oKT0n|{i5W*U;nc(C1m|g7zoxsT=aiZ>1U{Xmw{sce$78` zkK>>BU4)L18%=-Y4>dprB=qXWDw2md7gSY!#YRL&SGv~svk=*FM%4V#<6y0#r(%F1P6+xioXg}St|Q9HoAjoQon@f*ed z;R|Lfq2D7DgvaBE7n>RE+2FMUFA5(qr!Uwj*mzqEBoFDHZi5k5S|jniNt2t$7* zbUr#T9%dZI7B=4FT3o2C`T@Si8;hZI9aiXxs9lgzW1`ryEPo{D`RaGjxn-@`@PYyw zAon*bq3e*Y8n{XAD>ZyWT^$SF9uK<>{dtf6Uj5Ntp1tpthlf5MX!04Oiw!rN`w%lr z`|9EsaQr$1^fzN)`8?z%SJ`Zz-l&92QH#}bi7}7sxDshVCk>5g#67Cx%1Z8xsps!5v5%XdQ@QG z&itjXYEh^D#AAS=Zz1xBujW8vXD@!S+f*_8{l+=5}3F zWKL$1w*=eD4!vGK&L5dD90^u0%&!3WDBKxzom3(pu+Ec34b7eA9DK(0an||1s_&Zw zV-iZA+Pk?hTA+Iy%fA0_VtlBst?s02q`(5LGdFMz3{S{y#(kg02?a{HACel&@qZ>& z9Jw~pS?6-dYF*R0f6+mCxkhV0XW{eW>JHDB51(p04;!Mulir%3qh>$~2#h2Brc??e zt-I#)4H)rYBkr5{BL3|&js6MWDZQk&$na#rY)b)A4{M}de0Di5uU%JrBQEk3W{bN$ z;&2)Ei?|4o1UIU;Yq1{T;=WKiOshw+RT3;TD}ynm#CZCkQ6qYW-og8F;v3G+iem#2 zRyO2%>W*f3;N+(6NTznkX=bCCluxNH5v|_e`U|c-%7bFFM_sWx(tR;uFBg@LQI!oOFjVVGhrbvkG;5`Stf`N1G34Nmx!{ z?uj)xbQEim-W_0?@SctE9(Ax5n}BM%$002(cjhYc4ZAR1;JHlRnzXARlRi|##GMSnN?5Ax4EqEDO;ZYgD{qRLt8EW6S+;)3l2=g0j|p z)GAL^wke@MvY^0l=$H5uBU6^bRIKHtXBWN<`c9$oL5l zuRNJQslktI&U!3NDlUr`u;cJYf-juJ*i;cZf@B+*nIS;AArdz-_a3tqsaPijqRqAO z`r$%qsK+u0@;Ju~^jSth=1&9w2d7SalKS-z&07!;H|RgL;loPI7=z{T#`#z!qmsSu2%qFmuB0`PXi4VAvp*7d|;fHxNO%eP-u*fuTgl? z41^T>r7l+z3~)ZI55a$U8BeSSyIWr)zoOOJr?;o5hw93ct7Dt0(0oT)!wZrdF5A>E zxlOf6?P-a(XDSSduAiT@1_uTw!Ks&U8fudI7N^(v`qtcffbb^4%O+O1a%DqZtm(w9 zTnKQklUWKg-KgdVm)(g*r!aVHK?#0xpe_p z=HGfJmiji&A_eNS|DCJGQ8BXX4d-+ZRo=UMF(2o3%QHqx@KI3sAXS~^*_)Wh?nMaiTo?>BplQHh2c?!x-mc@SWr=DT>0 zcIX4G;attNZ|l-%Erk z?U=78!c>o#&n3cr7=9`qw&zRMOJ+GLspSZQL5wvJVIWt+UnTwXK~#i5BD^K>K1gC3 zRB_L$j%=DnNo+kvj<~7PKn+VkB8MB|MjUa&WIcu%>@hA97K2{p(c=kX$9}mS zZG}4nw)6-d@y;k}(i^lRSy1xRQGhsN)*F+rUI)HFxsrmaqiXR2pqn<$Sq-?U2qYR6 z-f|tce#;>`4)kCJ6mO#Cb;B&?tswcWVZo#*{mjOg_mofYjlC`2zIDKF;3hR9w%jFq z4411@@xKJK=G^A?;0dp5xAMRPq#KaG5-R2wWmhx`Mi&Sfp-i46!-g!v)myJOZ^BQ4 z$EXpZ-!0i=uP2IYRRxfvj2Axu?}xQgl$E{J`a|f8DzZ(^cl*4U{Fx+dqeZ?A6v#GI zulaM_hE1j zlk;h3zKe^*XC_Lq+8Ads68(iDu@Qu`NdvFwieY1}(A8w?#^V$n{n%NS8%uM_VW)ws z6H$ofji_26o-RQ`YzPe;WEw9rdzx_w+yKWX^xyI($C+2xvtt)s{w`f%w?p2v~i}MFBlw0;k83yAbXbl+bEq<-Om~&ycEh_EExbQO!G{y{ zB<%iy9H1!XxGaGda*dOq1Jm+DDNz`E?pAR%0#|@>vWiCqz@4<%RlL-AUlg^8K5>cs zoyg~g%kXm9_Mmq-cUgR@PKcskSMegQq_xh%yT>7CZIvl=yjLW4Q}NSYY{wj#!Fg-vQY?@ zs1^*d?nWl}YKgTZjWQ1?xd!+n3uXcYot#u52z#Bo2ZIPaP%8Sg#%z!4g(U%xabXhk z3%*919+Hw@KNWjzD(}+34>1X?bw_O+c0vW*XjN$$l{1)I+ z7#BZW6C21Mt=!=hrN#Q+c3&w7r$7nM05;^n3MV%~98gJk4X>=U;YnBmm4KWC4?{0N z#(p=Qt-<&|3B-+OTag5PVC(@TRFyiEn%|>19z)ZctKNR0x`RubzEcUo#>i3K!SzlF z-6_7`M+)v{pjFi!uZr&`d}|$jgL%e+xiI6x~KaH%`D4l!yKzx*x{xn1t4NMF^M;-KKh6H#wxt&=f?(|Ch zS^D}1mmL)E^<0hNlhi3Ie*AP7<^=MFUrT8;-O1u#_)Z6jj%j($XH}7(~jRqZDK!fIdFp$3L&uzN&PXb6qJPvaZ+#3tKYsDAK9}~ zqxn7-L<|3_u~qIFgnNtH1K=~*%}=nwm46C2@FdbV*tt0cK-1(IEU1uI%o?oAmWG-VR>$b3Mmqy~&eWULb->(L*u=tJ(I^$HBIKp`7ro?(6QC5;Og zmb7p=s!e_J^OScluTEoGyB=xguYpF)G;3o6yG<-uUqOPgcqV3_4r#N?yaHjd71?`8 zZ}#@BXQt3zkd`mB+e0M z1mROy9ZVk9S?4Shph`F?w!vMF>y11(vzh3IKQszjGaZ4+*#0Q@^%5<@sj8Da;U`$I z`GC`AK(Ytmtvzx8e9j#{{T962R4!x_5AJs5kS>8dA)%PFQ8QNgnm;gtu>Xh;KwUML z?HX&hOOCTyjv=r`BG1#Dda=(<#)Nag^(2H4v;lDz`*Vtf0wwe$vQfrk3pVqQ`8hav zv37KQ8w9Se1!wU^9+0@MOVAtkckPNlD)x7s!4u{(tkrDhj~j#%!qYbDTD&OK8^dkB z-orTWgNGYq+)PM^`fhr>3F8lMepI0q6pTTHr5@Kt?(m?<7r$aZ>C@^sxChN)z=GFU zFwLu3C~-iloYM-ViCUKmn*&PV3k(EU zsl>XBbs9@FBm(Y`5KSRE_D{U##RVKpK`h{ZK-gRk*DP}6tbv_y!Mj-4lhBBd3mCbAzD5VfA~q-xG-e?5k6ev_$9^!+TuvQ z0q#|LMDoN|iDV85rKC{^o0kxn*s+%E5`%ATajrn3wQ1`-4l9DUUhuTtHx}asbT(rc z5#s&6Ua% zlpaIa+mKSnExR0QZd0jvc2;;DH;b6VX16fIvLN@>+3sm@p_A9 zW@&K!bRUg5#A`8wG$>Yq$Q8vXNrGWhq)v4-h8Fsuah00sRBGf@w^fwV9g+Z_XvT7jf=_9T&ifpF)C=k)fYk7hgAD=;gT zLUM`-3KQex+Qj%00-JVJG=akJCD#jS3rwC@xrh)r+;wc`AM-0{DVL?*WV|!6z*;(v zn;@Z~>4j!4;AkDtRh>X~w9e8kbQ=w!t^!wR#4)fI%Myfq0~#tUKP;eL`1zBhW8(lX zy}ST>D|@wyU4|SoP3U{X6@PZ=Psn73-xEB}VsIQ>C3Fc$$M*i#UwnUw@!{9d+HP&M zog)4PiA$%7=lfmh;eoAhd+eH$t7l( zSq)fmjJf?>*>i)n;Qk`gLXYtL6{2`9{TV8u2Jt-@Z3@h*?kwT&?X*%VpljPg63UB{ z4tAM?(00Kc8kt|R3}J276KU#=+F?aI>eTRJ`wACYTHk)IjghO^dcU>ar(%vLcQ~Ni zHZxVXo@tD+4oGk?2_utX^)cr>aey~i&|(M-IBgiRTK}eXoTr4JVm)QhtB;+ZtgZi> zQ8v5v&u49UWGTGcX5N*f9qpr?>7}e#2q^XKId%_bBWT{Am=qsCXWWf`mA8{dV-#`- z%hn#+l8LrpmMBnv!B~U6w)AW*lCGNe6%arr=Z;OJEdAC<0j^ z2O(1;flS0o=*_wgg4+Y#+U{;*2iA~Y0L%fV2fQtaY;#;S&A=lc^B@HT} zf1$@(J5=3mV6#b;i@9mF;3Ja3ex!dA8SsQ!kb&?$H}-zQ;W^qvyd9 zLbhySoor1pukMBipbog3Embz$H4oXnM(Cd#k&c^p`ToezhwzCGOo7|^nw|V~9@Tm~ z$3=!+<#qOkubktz62>1yfvP(GjFe!xD8WhtVBK_d1K)Fm3Nu@O<~-HogxX_9`82Py zd^)^jEqC=+Rt|w+h)(HK;BtL1zHPk?yN^EfL&w<**qew$2sn@`)XFQ-^%R#ous0k7 zO~LdGNUU%&1>e=>Go7vb6C(&I8~%!6qv+Sqz?%-c29}hA)6>FicFUYD>ZaX_%+f@> z@q!@aHK5P@7gk>2KN$|a>7;{^4t3nv)QO6kOyP2L5W=3WCTYiTOSUl1#BFN7v95)< zGpb_z8TlA!C-@a#_33r|fNhc(Ir9lD;LsMq80TetNj)=on5XMS+OC996oqwo!->py zw${sZp64aetM#VFGIZq*(yL{X2pb?tuLDSbw&|EjzWkk()m@6%3$UOUiSPumV$1UwXIVKJ|MP&+6Hc4tjF=yfp>j@Hz%U)3Fw zu!abFy#a*fn}^)S1FIytF37(=GVFKA339bawN1MQN6ib0{m!b7)l<~FXxwzyB+%v8KpQw_F2?O;H;Qb$4u7`tD?wlCjOUFJ_q#?cU)oDA!!al= z%i)EgD|pz~45$0NY$Wt5?5{=E=xY*He^Hy$jjDxS0CYVkPS>w!b3oTG&Z;FHVh3rF zGfA0isL7jAq8_h4QzX*va&fj^Z<8?{9P=D5sXU&{wTnAZTu^RTvw1mkmh7S9slZUb zF-H=ucrvmls=d;t+6%4mGyf8&+P(O~<#Ez0Y{idBI(;F5J7JGzJ=*d#p zv+kuWEZjbd{z!U$p8VIRe<(~acpqJRcd%-Bz=iKAwU)=cLcdW70KK6@=&Dd@oH;tz zZ)6ox1P;+fswZ=9;e2C&YoFpj0vTQ(qTEMu)hNrQCa?;hxG~|{y`(ozT=lYCV=)!W zg`8$^x$kOT(i^VJ^l>ZdPO2 zK&PkCTNr>&r<9TS4myP?4c7~3w9_YcZt}!-r!GW18cQrhoL6Y+n0fG;4!=d5*ja`0 z-bnM2z+xbRL$;u;!5KIz^6AefmL8U3kJHpovkr-814x_upL+c=h2041ZRUjX&5-j9qV%gON~hb^+}~rjOlEl zQ8rM=eIz4Om;kRsjNe#K@dFH0S_1QZLtpjBQWoJQB4mz>Bk68O!bxNhgh@6X9446} zxgBlgcN7GcqYa@tebNY}=3Y=a*B$tUMEw4kA*O)WV7AUSoG+F;ogX_%O|}sp4VWAOPQ`wS%E&9xNYgw@wN`g)~jCyCS>{Tlm7oC>%I<0 zlQY(cODgCkPl`gT>48IFvx+-*b!3aMeQw046LZoPN&FH!Q(ga$x%ZEcs=D+4Gh~!OQ*X3UV~rB+R1=|HSg~dV+qp0UGdcsQ zqQ;6eE!47>DytJ3w-7>S26B5DNGtx>e*D#4+hzM>b-QZS3ML=~Y*o;zsIA2xtusah zbqkRy`8;3e-bn(wKR(~TzC1K@@44sqd7t#hX3#CFDV6|HZy@olZJILn&ZGei){utlZ6{B%E(Hm%eV6C&rt&zjf;v zpch2G3~FuX1E;aDcxRxaS}rMbr%*_8kA!4Juzk-OWgTxH8HIMk{F%@fT3F$*H&C^G zRCIOdq$$0;eX-47XNOAfy!4>I&eO*CO-rfA%xj`=TC*NY8$8gUpC2h-Z{_|@<=d5I z2&Z*tJ6g`Rax0MF3~Q2oc!{xnLbJLbHOLfBHOBio`I+NUA4hBaFprY3ed;_RuSKHL z&exmL?tCt*vrEFNeE{f5x>q)oVHzzoL(0zg>?=;iYutWHy0@KIL_F~ z*zU}Q`+L!Ukte6?>npEsLb{pSviuc|U%r#Vl@~^h?<71q5h3|5(&f-8hb52m;CR#LE@Feq`X`FdrO zcj;v|V;kG(WHAG*dGXAMm;tnVmNr=VAF?1`72T$aUB*LGPN~kzI(t~T=S_X!dX;da zb(3e*S!)icGs_mSm89qD)zEBexYyLsMyl3id+D1zmFXc+I`bMF(^ zGV>TS^H};1Q%IA89Yonx)JX4A1Y{$NnU0)-baBS1#Z*-qA2nVFLi*Ni;L7Y1XLIR$!{ym9n0#<$=uC%Sc)2*Ai$$E);QV)Y z=6vC4F$$Wl1cn$)yU%659dp~YU~rgNbT-8T1CyuLb$m*Jk({Z0 zf#F?Apg)go{t8^sHvxsXXVY{PAdD6Qb}%nb+}(|f&L;PQ+Q|D$k9M9)I?o#K$pl~G zR&1*Bx4kSA9hh%mw!2G~~ZT@;y7x1?D+sO`qXcTZ-y`mw$A?P0#hyz8FWTYr5g z#yT}=F(_{wOo`u5V_o*PV*`~bf-e4+OUAUjG(kA=%nTncYfU)=k!gITVP%EPA?7a9 zRHvM(Fu<8|tHMMyPr7zfZ1SSIj@q>Q#hA0Gj%wP7hDWodsp<>%%U@L5y8btPy0Y8z zvS+g71+F8&$-uJ|-wl0@xt%gy^a<>Y1b0iKut!5-amD13*jb6g>?dM)r?Rteazk|y z@RFYQV%Z_~1%){;&X2iA#}(>Lig|J8=?eBx&-sNU&r z>XbQ2+>)CDI*r9Vhu3&sf6?>AcZ{||4^y=SGje9IEj545!+4=J(D5}j_`A&aVub~R zwpr99-o5*+B&V$Dljl1hSh;UfeLC_)+gqmXD@U{){=R!`DMdmVKhypuSx}pEV0_{> z<2y04z2vcXQCRFt{rNxdkomu$u<+&i7suQ*CetjyXZUCqpzh^E7vOXs&zN=SWmv4k z$;0b#k6DK&d*80(+Tz9ANhx%8GyHA#QKY&~0<&UZ9@?g>a^7gx8kzrJ&P#PF?AN-!It0mpOXBX9^ zA%<9cXTq~((noPAI?(e;@Mu^{an;jZNT5|WJ%-Q)bX8S+f=~ePVJ(H`C$g`iFnbD& zVRm3TvBEYJ`^>z|wQ{#Wa!@Cl#DG5FQ4S{*Vz!=5?*722jpbopK4gzVs;9) z6YAU633%$=zYpo4=3WxIn(2C;?QcKG7%CnL@+XBM7Odx}p&mq7FDcpzeVg|XY8e~(|^+I6>t8+c< z%t=FAA~P9Tvd18n^%l^kR59gl4&k_Y+f~-*daeJ{W5tTmu7%-A!w4enE)E%s_bcGx zG;^#+Rp}?Zc=Lm#cuwhuhS%$45$T@}3q3p~&R=AF3N#;SAk9~P@8pY>dl@uAlsB{A zmLRViSZ3wbH%7MLUk3*(31=s>_s&0~gK~jvV%+JAq<44F%HL?RUAk}t_<4FN`i?fx z^?dh0FngfU%FQ>~7ta^msry$~cxqLpMKsQQj%YDbZgGI#0fX~LDj4Ta=BwX?4tMOG zMTTq+SosR`K69b-RPUa;>>Hz{u$Pyem&w4hG_q_WTrS_Gb+WSqbWEfidJQMQ!;z{P zTb^q$3J`tENll`+cvA11C&^6l)j-pBEB}wAX$ZbO`-}+*_fau89=vVv9P^LgY8Ew- z>v@Q}Dl+h51oQE}mCXSMo7?fgLF^9ICWrN(!25t5!2>~VDuui~$p9B>5;SpFV;{85 z!PH;f_ag+(`#Br+a{J3Zo&#N;!@{2LVa{_+M>D50yWZ{CC00(J!?OdI;`zl}b}P4& z2Pr@_Ckm^=tTNh|j~;D}Z}4^p;h1vsoG6iEs! zA5A+4LA-NV%d@~~8W*%ww0H(tmyKR&)of4c+u=saBn~T4!{+2JdJx%Cn)6TM6)6V`B zXMsnX=Pp)8*41`zmRB`_fVZOF>e~BP+)6V4jy_c*uja;?=Md*2f)ohN;T(1T!)f>)wlLL)V!h=isYJf)U{ z*yb0ghF8cy4RiEt_OC&UXW5^bu=?`EN!~S4dWF1LH55eiy{9bfv|Yw zy15l|O}j0n7pcu--Pii+XE`#*WRU<^W6_C_Vf*@k;Z_3gwy#WoX+!Z zX8Z^oDU=rVAc6%YLQrwqPXt7C(Y~U^RJw#?Nfh+4Ij9ib5cVY01hi>pnF!sr0ii{v zJ98okJKAyV$O+Hi2ig*XO_c7{o*z2&ySeeA9QJy)6yyakJB4Z?42ZbVtKK}Lu<)}% z<6gJCuVdkbBld`{z!*~adiKbj1~qbHIpVuykNW-{zAxk1oL4=*!H9+o`p#VoIIM?j zs3?7zCyjFiU-1f}JMc#vc9lb1%oC((i;YAJ`3Ff9+Mual@Hk?--eIzj^?rFzE0NtN>YpiEdM>N_n%;8;J?f6v{cVd^WQ(K_W{1A-7~Z# z-!ii9xtXs|d@08HCfYy6um9uVci_8%@3wQ&F1E^>0xI7ai}WuI`;`!N{G*#O_RD|?`l?bUdA}AUmgXT41hQk}E|sr=!acmgrD z?}n}*i7&UfDQ-P_)q<DW9QA#jtYFsb|} zl`doPYHIJlt4z*?u>fOgi0d&36H)iNXQ>D-?%CkxqFW0tL?3+)`rZaX!N}M>YCvV+J5hy z(T!KN^Ctiena9254Tcfb$9RTg;k=UTiLtoI+Ja`0Gj}7S)3S|}(RJfA0CDAB?DiS= z#2#r4b<(>EXXE~-afoVs)Iit6X1bW-h3XOs)f@G^IC>t+@A8S`^zKKhG`6&d zXAgefv#O66-@CFR@gRikQT_j(b?l0Dw2*LCJjPGoir=a|{{y-7LH?DM?{$6;5%7jRN1!j+n1f~r}t$S4m~XzdeXU3|8N!QKhfE);m7Ww@3#&;-RnPX$=;`@Em`CD z>QFbqTe2_eo75S$WQ|vgE!p3bqRHCjm+#9i(4m5VTe1uFvlnoAq%SaYZn`){;AlJholu}- zJ}3^|gezn2OrodGov*F$$Q^R5(9Bjd_f03JxC@%hKJ{diCX2u-js)b;p5R4|}*}rn7U>$#Ki8`AL3p@MDU*lbgIxhsw z^@Sv7sRTh_kh(vH8wGBSI3r^m!~{gPV^Zhgn&Ymp4Up=e1SZAQ8YBT==(y*yO7 z_<0zJ#gAuis0nmD=6-25W!Bq~i)xpBO(IsVH#j70QM+yTXcyo!t&CTU)cO5@{7|XI zy_r9%#T(w}-(%+QziaLZ(_EjziGy5nR10tD`}c(Qn)_!%!U_C>!2MB8L~`DA^v=Uk z)Wd6&y{`w8fe$$6MX`_%CISQdqIE$l_XhdQ{8+1{W^UwjHn^&yv;P=pr-%qQ{)JyE zSM0?(geiU#6Ho63YL`?de5PeF)H}FElb$U$!dNZlqO6_yc_cY6I$PqorN30ux`O7` zANB8)6AYVzt5+;iS7>9gjH&V32B6_L(<_y6k2~H%MG@M9Q5Rvd7dc z@4RaCGM#Vg&`hRED=*z+2IFh&N-dtqJVOIcxGnYEV_3OfvaRR;&i-Tlc|X~ti+#rN ze#o9Yy|%-&>-CrUN>=98G5oVN6raWZ#bl$4&YoxXl$#jJ)9iIK;a(RSGi62R*UG)j z+$>vDL}(~ubH{W{Y;t=j^IiWw>0L2H8z3-hq*`2KwX8sq!?mNALc+;O&gNzS`O84x zhcP*(X4_57R?TB4CqiwLq(IGNzZZ)%U4GOJ+P6JJzr5~j$^rN0pPy_01~ zeZmQu)-}0*9+ES$$Hn({3DYJCT!eq=%Lr)kY%7DXFLipvTe8NLmm~@cPxwH3OF(L( zFz19ItbQWVxH;wd4lKt5S0L;}q#tD}DsU@@jh6y~n6_O`uO}`p{QdLUgO!W71C87@ zF_d`-DW5lENij#Yx{YDN#8FP#THJE1LR_^nfIdkunbn!CQdOMhM ztqJ-yre=$|=9f_|@M2Fc+($0Sq6oCJk&@y#Sy9#r1Kf%GY^R_uYOx!%*lZH?IaD;! zxRGtBHWYE_|0I6KY0J#0RvdK@Bf%!GKf6q;amf6!4IlIyt}Qq0H#-r5Yq{Z%ws|IP z4mYM-zEY4`WkcQNcX@)jEu_bOx50^s@N}EyPfya>B<{6VJ5ODv-|*qO?6@L1&kwQo zNA&@17A^&-sX-G^pTf`vgjcgUM9+)Yq%?Tbs$Z{Zgj-(~q}mD8-=KzQgo0_utSy7o z)(ihPy-cb8v{TT+mOJ=WIyfv#6Q1+p zPhpFLD@jnlA$?A-C||1bUxdDGhR*eACcS}|3ahJ&zeZuFcQkV z4s?0w=|$K8naDqtH>#G#3#y8*K(J(q@;jo(BwWKbI@0&*?+(jX?!=Kr;fBR{{ zn}r&DeE=ay)vM~taeurj0~dgnXsqaz>+S!^@cG6;a zlf}jd=2jGf>)ab_KwDD_!MjXEO7})F={(LNa{M7SU54H{PYPVB;?9<0>HfK>aVocM z;(ZAms?J}=G+V20XROl-HQ@)jyh3;QNNd*iSmZzlThnIPiVJ;k=~A_#_%Hh;ZYAt&SK3f#v&gQCrlM}nu>a2R{X=5 z=OXqJDyYm>(J$S`-`iu%zneTeSG)wb-%QyGu47?n| zKRJIf$EM|P-C7U!Fa|TXEMg)O^P+4jFQOpZeH36t;NjS)2D>vAZsyDoB|n2YmjB?o z-RbB#_GBanf$?W!^K(&C_Ucf8?^vyUO*aEqMN7DeH4?+n4;- zuQXi%V-2^cgFrFuwS#b|eO6-L99+X4#zA4( z>*g|rkPM)?wmg+R?MD6K70`wP>@gp908D5HQsL-T*1=#H|2ZU5tVSQE@KC1*T@Tdj zLARMG{>8$n(rv;$M*qmOH2@2?Vkvh<0_i@Wb-hnFn>KD!8q@8yf zcW_OVqz?_rXG-~}A2M?|?|If{o70Vf-mDBXWAHQSUV?amojpi5;X3 zt;VPQeM~9V!^-J?YIseouDg|acwKgmTo-Gl%xL<}`5Q8{ry_HVy+00|bLVc{j2HkB z20S{!RoE^o-^+PHiMzBcJ4=_cCVuFjKS+v^jBILK<99qi!>ld01Fdw)>e_6m=i_BD1;@bghQeITPW+tCfUIU5 z6C|sv2VxJsDcmUnC^yMaob2vksxaw^IZQ^Gj&GFHL>z?W<-grX9tzD8##k$)ALltu zx;5ec0|&n;eNf_NIQNFTMV=ZM7Aiycg*}RHGp9k#X{Q$>I4RPQm%bJH;bLOG3ecj2 z*J@&MNC=9LcMDnztXjGMq)Q3sV9Izv{(|f&v+W`Fk=Urjyyn^@LVUGDSg;>lP^kG{ z=lt)pY|#*#;*mI7z_#1m>I<`2zJFz|l7%QY+Oh2{Ukql-#knaG=(_ByqZw}7H+b{* zV65}JuE7k?8~Ry_=lHRpJTgdgC%r3=yKPPBpky0E_wz|-S!-!D^}mM%kNFt_ z#yTt9O4$h{-h(rbG;!rS{gMRP*9^XAq+ zpVK}u4Cjd+vpJ~~a&|8+lMJ*Lf-Br;t+TQ5@%H1vqXQ$TuQyNm9z#~FS-p)L8)t_H zKAI_~VTw-2@I7klpmSkz9&Q-6h)hT0(0->k-PkK{7>qL+=~ceWnPeyv>XT9Tb9#JA z{qjhPuy{LqPlLKY8c-uXrB)-J2IGkNoYw>3Y;GmjR5$jypmx427R4=@1QF*Ubx@x$ zBY=iY+KX8fyc2|3xbGDx^0ca0p(=nlxrftoWNX}-xdZesS`eFj*@VKygB?eJwA*gr zkChumE06-8D8JX(n`Ey*m!IiJgpu#rzr%1%iNe)`kc6F(V!ILJh;1qN8)BJKjnBf8 z^?$EhO1&ORSF_yETfbG*FSYy!P>w&H zUf7*WudQ%f@EF}*gJDmt+Z?sJmh-`lV{`T{i*!eCU?+m_-q-5bo(3|knLFM16b_;nzsB69QTKjbPcgDCP8;#S{^EU7AByzJ@XLCDw2osrnV;SG*X5g{ zQ>_XN`rZM0S&M+J==vj=Ky>(0J7=X_QVr;I(w0a1s~4qVx0;d8&B zOR9Ko8D0i~#;I5Wi;!k_Gd<3Q$Ak*QM1Ei2bduBGR4C;|g>j-iW@ z7`*M|7)eb?2BUJL9gDGUQ+OE9R>RvlGn;beb9};w1@o~w%cM%cjJ#<+vYT?mF6pNb z+SQnwq4v@c!0E2!PhhVakZ<0{UfojIYS|ZU2Gz;T)vUy=lr?sGd(>QQagki#(L`-& z4p}_BhG7zZCW%z15G1T818WE_JBeK5K^^(4ff@img5twhcoe?p$Vcy*_C*zZOdbsR zejaAceR<86{wYsF8m1h*o4f+q$67|9RN8TGzl)qPcm3V`Onf?q(2|GJ@7Wk;AFvb{ z*u|Tkh&lb4f5>s8@C+Rsn%bes{x9Zucz#XPh~fR$xn53P7>>4JqOe}f5Oc)3)D}C@ zwP6}-0~<@TNAx2VJ}=g^HRk-r%4e7ZdX@@LjyJt;QocsYc`UfTitY9$E3eZ83dT{Z zP)D~7G#E3dZfq;^zb6UctQQAAbWZT6G;@ZQK1;k%1AIEizs{kXQ3Jr@_8@431_^i~`#Kn47A|He=f&L;ReLLfIy z#Nbd46#(Waa;-y1{zgs>`<8nY-vXs%j>>)qOqxRJ``E@K9AweXiv@OJAODdO&>5TgjsgdV-yN0t`51nx;)QEQ#U_6X z8)n&w(6j0!hiiy#dfsk$*%JNiO+?=P_NVQ_^Z)ta7|1D$EU~3NuFQwAcG)Wx8=ErU7YZW0IF-cHm5Fg(QB4e;QO-=hQS;O5meVBCtK# zxE*`bSU8l%Ch96{VGkGviAvhpn%q%jvHbSvCYpBDR^!yYsYuUtd(iqxWM4fNpYl zTeq#jnaI^8eRSLK4LZuXF6g$6cm6(T0LV$E=H1L9Aw}hI`bs@KHg7fzwr*DHq z&9e$~eo@gV>Ck%K^m=feS zR^zDmtZPRj*v%a8NesDzYn)n5;*4s^dfgzxL8i*tpMB$lz<}L&AaXD>6EjIp*_>sT z+z$;I8*}P@=`L$5>&+&B zsoe#&w>xjRmV1kSh7z!A+2bP(t+9HYOTZnV#x;%^oKbyD98+gPh~k5#Pi8E77x8tb zhWhM~_b%H9hbR4~rbd6^Tz5L&9AIaboEW%mSec@NA7@ zM!57Ae1p;4}U94d%@^NE)uVBM!E3@C*a0|%!eBv@7VkeF&A!pf@AZyig|G3 zlN_7B)y~vvm_o@hO&|2}SMxnEwtms%+QQ?78hkGqv-lZD$gf83pakzHY~3X^W3 znqi{jf<)1cM$OSWLr{Z_r*XWB3{ zCcoRty%^M8_Urz-;Ol{d^8Lb9x?i^=kHxIiE@`QFOk=Q{9<30gm^rFEoVKGqoz3Db zbbE<)D)4`doeqxz`?dhL3A@|=MNP+GO{ef?<-Sg%FK`Wz-(<@3p1^mGCaXcL7-=MeA++b$f#C?^S@IpothvUm%MzZ<-s{cI{ ztGqj`jil-S<|pAbBjh|~KSHU_-aW*ce=C-szrG@KvUuNGDw;g2mYO#zHdmQ`0&45E@iNuc z153hZMw|K^%#1%zUyYWkg(ad9$0SB`yEC7c zGoCZVcb>@^Tx?t{23I#-Cy_}I{3cR}OcD-imBgY$9$6=>L^ywBcq^Yj)~aX7ZTXON zZ!gleY-bQo#ll~aSzb3O#@fa^V<1EkKT-W_k_8O)#h-B!rT#^n#F_#ezXH~*7csY) z6ApHqUYQHuMLv|+PE-RhcT*yZTCCf8i1r!Sq&#`TH%xEoz-RbeG{8F#1hOO!qJ4I| z1cnIU+ufgs*HH&aHyuF|Yr0-uvjjl7JK6jI5cOt|0FetI!%mV^G_J#UlTfGk=FK4)#>i{Yq2O!X7o5 zUB8n~Rb(cDR<`rtURZ1H-V+43@$cikYxrA+yh2`yy&(t!MHTI+$h6u_2oRXWS>|Z4 zm(mROA}t|#NrU*s<&SM8J>`rPy@4M<8k0=sG8zH9h|bvVO$%5Uot$mH({w8bhSleo z=UJGoFEcjVl5}zZl7;{sZnwP`|DGmyYV?rZ_C8igxNMSoM77q zJNpauAkcrG`jdajtdRj8+q%P`oPfVhdFHyjo~&1sv$MB2*4f;UV%q# zd1u+p&^iMh??kOTw;&=tCff8DE2m8<1okhsV*thZix>AkIq!DmMzyf(7BC8=OE(0_ zcCs2E$U|0sVR zMy&6b{?=RHg&(`VXks?FGlNEZa9QLx*JE8XGZf2*8#9l%*Ht<1jJtqi*l{T&^-zLn z;Bhd!JhABVt7okqa$V?H|n8O^_@r+>5Un7Jt} z-X}cl0p-HR*LnVhP?%v{7O(+8gb=vqrtCk21~b!Bk%5e@D?q=nvr$LI zy_2cpGlx~tMr>$^v*#!4pG!yb*>>-jmbKWFqkjOrjf+QZ97U{I1IC6&6eJ_oIIJbD ze(5Nnr@WotWU0WBO_5ERLkK*<5;pk1#5qh&E-y)1AK%$&iG@s1G}9 zbLno;VS&-+(-_`nwAuyyB=+N*?d)e z3I`kUQ?r{bD^cwIFzD=bUdGa-vFL0rKGuyxgEs($0CL)G_~ z>icqGAvGZd;tii9ehWq)G5TlZ2&B07O^?SvkG0d1k+`L$LPWHBNC-n|SHd(2iMwrhQBg@{A zd`>Py$K3c(eBb2<<-^d*{fWt5eo!8k@LIq#cO^|p6krj;5N6I@3QxRv0=}l80hghp zXk3wC?nC;4@o44$) z_r`3s$ZOX8)j;p7mEK2PHJi-A?5?N0ETX_vLi|xLi`-iE;`e74R=K1eIcEEqt?NQy z2h)$-UUoUKUA`>fQ5#FJjTdXN^4!-)*__p$)4X&3C)b;3aDiIz+~>}1@?7^hcv@Y; z8IuTr>{Oj@Cb-cSCm81ZcfPm&PuJ>0&LFgedt3M}+7%b7ys)A|jECM=*r<_c$y|fh zv`z1&?#4}}PZ^Gi%9iL1_4e?xpI#cV?4@c}R(ztnwAFJ>+GqkwA0cTJk<5k2+;dZI z^CHDS^E@;hVdWN|0QCBSSCYgMNfaIl@1+|t2eHiZ(U(?W)~NT&7~&bi218x|Cn17B zsgakfx&_#2_s(66&%k%uy-{NH-cPDr~~G`Y)y z>3LVwPKzvgF=!R!ry}88Q(bz=oEf~6l+F+SMz>b!rF4S%3V-C>7M83z>0Vn8hmYX( z=V596#~>na(SD3bg;M1J+X{aF0n+x*7DGxQ?hgsus13T~AokjD1lAdiA} zC20%jS35<&+By2weyISD?(%+q=lyK=escUEX{ghmv-BsVtiSg@N@~HIwj@6fdOth) zq1M;=(eEjm38C9XN+6q7il5(lKU=+@$Go2&??=Li1PJ^te)UhqCzKyr^ibwkSA~11 zKUK(u-ZFg#ZA8s*(D8&TlInM|`kIVBZd)xas{^|mK z(%F}YC&^7YLYqGAYx}BSk=|wZ5A#zg9R1d->tcN#QXi}bZZn`~J@AMDJz~O7p(arM z3@iSE6@S0W`yTD`zFYBLhB|{OzneL>1ATUOkoY358qN-mhCcDc*IV_~?U)eg<2!Sh zuvW|Kp2>28m*qB-WiEoLn`BTQ*fjZv5(L63q^wo1GGoM&hMyy;`TmHQUe;-`pvbpRdMVTN1XsguS{tuth}c*;t+ zUH6*khLBkeeUBDHBnCF))FbLwXRZD*vSXk&M=pc;Yr??)4>Wx`(VtE$a?SSC3e^Vn z-e_Xl5@GKY>dhV?Sn6Xu(8Yg~{En?Qo@vj)nP~cF!;o-AdzL(vMMdZ6dEjZEyv+`e z^JyDbLWVv;*qk?|g9@=CD(|kRoae@Dg=`VUS4z*1il}jIn%%Xm_tnv3wy&#)lBuCg zgYB-kmj@di%zF9|typ?INpnc@bsw$xW~MD_h>^huR(=UmT!ZQ+uh0&&R^3QKin(bb z!&xlQZ+Mrp7PCWaAqr@V=MTJFi^;cE#8h=w?%$aLq)c`sUdwzip)@Y4%BITwg=MCh z`F6x~(ONy5W!0k9i*(J9sG7(FXhvjv=1+!0vU@+V%;lsV^0- zfel$`J1G%p^#H=x>mou8s}ota}by6l5Jj0Fn! zbBktI8KJIN94qIVS@~0yHw)b(4-cKfI*IeQx5$&^^_2G{qIaD^vLvEE=ONO)j=$FG z8~JP`qDoYsOzd;*!tv3rpBtPX!(qTKii#F(H@}Y<{46B02pqSLG}c;VLgk`7i+bo; z+>B_2p2zVldZFjDcoxmja~;nf$HlDkd@t#2V}U$#E7HMqr+D1yJtlb6a+6xiqX-6% ztvrf^2)wmFs7PdjFSv?CO_$Fi54_LjajW-O&EsRSszfRyBX`5WVSq#`!in-nYm4LBJ05z|EkjtLyL9Y?ncmy%qjVR2`tk%ErPji;HG9vg4$=z z>;s3)E}cVGBWLUBsOx;hqwQAyZ(+V@T$G+GYsqDx1S#GsN+)`J8M0;N?^c?X-$^ax z*V}OZguay&r4G75{u*F@2AR8*8O)6AKFW?5EGYz?fJR^#Vb#D%C&+ZLa59};$CPltBsIAh>yy>!) z`^Osg{v#fX!zSlV*WKI-U@_s^4N#ukViIk4gF&e}0J_O~6dP`b$%s6K{If6Gv?NR< z)#YT1JZY_oaI%xX>FM(ST9Q0l>*NiJvsCW8;2@?5rqaW-Ykm|mT`24?56o( zI)mcK>7hP0hSt@}eS!?Ce=*neZ^j_nMUu7bT1`JZc=7h}TtbQBn~z#^ea-b4<2MFa z1G2>I>Sg}lBHU>e`j}$p$#GnBLE#Rswzz)TT(W-e~AKaDw)|z zqwbelAh*j8n3Ga|yb7Zv&xZtx&5_`9`1RRXI-X=R-}^Yia&qkzx)>tCOTuSq6rt?a zQH84Y^aKu~-%#7&n5`Z`g)%={J|CLXp=heSvO<=c>jE!UHjkg&Jjq)9RWO2RQh=4x zBIywAuMubQ2UT|r)xpxm>cH5cxDR$^oWK!Su5X@?LNGgJ;_lK5MnY!Rv%G$%oHZ9u zF5!>?6rUs)zJ+jhn3m?}dapyIe(A}EUT1_S+SNCa?If8rA48;^IXQwCj7gPN39ekCvef#fw$g#u*KK@w%q2+u&<+Synp6kla@7 zXFT}q7p5Bt@;ceJC*11dNe;$`W#mShL3ILqp*oeYR{a}$Q#;c(H$|m$&E$0QiTP=; zau=J0K*&iet9ua{lW#n)k?kmm_LS}+ z1$Y857K~t2vpr+zN~^Wz0-Q{7<{rYk+x(hkoGsjR%SFlG6JP6Cd+DI;{gSxzM ztUj9;AVW-GzK0e!!G<++ab(wTvhsgEl8=#_1#)0QG*<7}6v;3Hw|k#YWFD}y=%kUz zeMYR=@eQA~_K`{#pLBg$S9HHKw*qQf!z%G=5Q;uV29`{M8wt?@F(8=TWuH+m=S*H} z&h0qb0!iGtu^zv&&e4XLYe zFr`X4j~FByv(i1KA2O4}=P95DO@%U8fM?q!-2po2tT~wiAP~JX;Td;Q5i{Af9A<-? zWI@a!&{Bl)q?ArolsJPDzw=9c!z&>O8VNnW@(SEKTwtqTK;gP+LJ&0)npSuPZX+3h z0@bd*fqPaOl5|g9yTdCdC@VwPMw|QX(wE3*_?6_m%fdp(Yn5g4Wg$+)4VSJCD*CvZWS=`c`auvd$qcB6Cj*0u`t6Msi{q8x^Ek1 z%-M^WwYrosFy6^JL3Hjj7y(w5=L-D{1@Qq8bu`Z9_cJG`+cIo{)MuvzLg4YS>7JYCptmjsw(azq}%3GjqtUdXb z`8?r4%K&t4M+OJE0c*_-^waQrXa?{&LJV2Tm`~n#(-=zOv)%b~@$^r75`h97+AzE_ zr8CTwmd+F$cf+g&>Gww@6Q!MmtfoDA1ZyfyM(5AR|2`sybuKLeUkvdfkUI~1`oyku z9a>oEFL_v@ql%qXjgUD1AZ!ZWCPGk+PTB=sczjIup%#Ge2;^#P$`q$Q5 ztHbm~7cidm5tv@e6k$cq9>-^h$CqPrWK`fYW9{s~*kwm2=j}~6YyWdE_1UP%E^n`= zh0g2_hKl|v_FqrN-8%*Qac8C33CDP64outSc?@7qQyQA}O=yGP1oO|b!U*p$59yKHSNB(B>>s=k` zvGmKLurb2lqf5Rw90g3s4K0)H8fLN4KWfkL(Mn!fGqCp4Q;h@vpA#++hVe3 zm>bZik8DeQbOQ?XI(-V1maw7Bsm8nAs%)++A8o4mQhEnaqV?v;GaVt!mU4fg5N$S> zj^jYHVTnL)d+B`oxZyhQ`RQFA*iE2Ehlu`5X}*mQHOD{wRG2 zmWJNM{9%FrI?gsdB zy+nZY1^Vgtp9}`cJ0$sY#B7!BQYH5p`4`-6%E|}nqG4052QuNa3RMQ=nwgM7jUa+U z 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νA# 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

      x$K|yKI`Vzv)3R$YG6*1ft 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 Otg-kRuwc^RM!8;2mQZTu3G~BFSz0$ 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≥M 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%0AL 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­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

      Zuv)Zb${9@p1O^3Tw4ASCaR15 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 z z6f(zCJ!R^va|J(yXHvn)v0i8w?BwyjjugUEf_ISVf{|mq@KDpsjX0cC9Nh_3yqcFZ zx9}+78fjMPg$J5;J0TUQU9l8j4uk2n)k8rtaKrz?`UbV0z$2aLA;>e@(-cXq-sl%_ z&u)$%@9TVzdE?a-NesF>E85*lM$D;r-6*hK3w1QEWxw1YH9HdHL7eDkw2TJ?ZavDK3?c5$w2n~5RHNn&kJ8@ zT0D+jzvjZhYJuq9Lj}$P)8d#xlmTFxBQFvDaT>mM7oxRX`=!`G5hp#j} zO~Z4WVB|==&mxXfyl^iA+>V7a7&#FWK>*%H+}G&c0|)BTdu@W=6AZ@ZgVFb=-|-lS zTgny-4BQV>8(N-$Op42)=5h(vCs1YPG8Csvpms&Fz@-*(jmt!HscRNiVJTs^k09|J!=uCyne$SpI{NfnInS zmIU;5yaXGTI@9ECvEZYF*Nling z`AJp1%{bn|&PvZ)_b^TFMH~eq82TBeuc@nugZ{+eB|5%;Kq4MCB96n(ClJ|5rr?8P z4B{9qR>hc*MwiGEUrH-xG4Sgp6&Yr=!N1Y&#F*|L)6sKyFwMCbUSgW8!(La4eCp#6 z0ZCKe)TO~(-hNEfN^_ZGD&H`d&9UhO!*1sCp&w6X5?zm@Phj_%OJSyB=8xu5fSC+z z3v>D0F#KXJtC38AEjE{7W_})LF7IQa1AD?;%1o1ixCA0Cv{h(+E)#x#rJ?&(^9*Zh zp1|4=h?txA1I=2tHSS%^`3WQrfXi^%v0aw~%;jMd^+wLrU;Z6YA#!EDw%tjOO?5tY%V!w>aEyJ zO{Q+5%UE-nf_nx?xyxL785@0ya7X3)FQ|uA=2F(m0M}`3Xa#pbHAAp92t)?Sa9?Vr zG{-M*sl126@zGbb8hVG(>SmXi1?ze>s}ZNs!xHXzqHpr=p|Xxu!WSFnZmf@ih`AZx z1u$NOSLQxjJ?|g}vwgkUtoavXWeP<8Ah?=)&DsOCuI;ay>rfMY@!^ju?<-Y%nBMZS z*TCRUTcyiU#<}a^epH_Qh%QCAL|=dyN%=L4wN{w(kRsC~{szZONL;vFy-=44=CX}R z6%W7n0soMbLl=JJfWWc@7c18w@Sr8!I{ zuF^1#wnMNfh;E6wLGU+Z;X>2@JZwCpZ%B`WZeGp73e^K->U@4?4Dt4yu&x@ zxcUH@dIfSdG=0%rE|@FqC|vv-yU>2p>oJAaeX?1;YA#kpKFXT#(I`X6V^|$x=bYC_ z4Q>j(n(Od)^j7bWDqkzb?l<96i?j{)*9(|>v8lgDObu#yjk>&C<>%B{jbX~dXrj+P zXUBsh)TFYGn8Mq=Bu_1Dmi*Q>U4An5FVHEWITKuki14bvP+T-gvq#N{e!OoCZn? zMY!F2?nQ+{NQOj`%20};9#S$?gpeYHn-7JI$?f-kzt`F4Jbj<@->=uJ=j^-Yz4qE` z@3YT2dzXc;CUOj?6@SXq0TU~ zr{a>zm-5mlfyK){0U@dUQMhqL?56T1J%6HEQFo7+zt!Na%A`M}Kc~JWA3h_spPSli zaaRFFBP@ScwaZCc1l(#X>#b26*U9#mrQvr=!W$-`3TEWVysgibl}lb0I&J7F^;Dq^ znD%LvqP6C={XIWx`0f}T+G%#Yi&2 zHzeuVNVeWodq}uRVt$5iP`^(x7Q01>6-ug~$;jr0=KI9%`RriTVT-u0F?1Jx#Zj`r zZk-;J8x$%2Wrn_7ZD2z~IdR*l{kI8UsJjNN

      8&XI|1B3|_uC0DrJQ`Q1&-!0+TM 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

      ikq$xZzb73o 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 z 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²(CzZA$5Wu*beKT~Ez%0`0?xO0Ax0?* zX{baD5l`EUA>ye*42jgq{rOkHlXw>@g03>+-?QJT3ElOdN8{<*>lIJuwFu+sg<*=P zmvCk#P-Ul$m{fP@MM~z-S&BLGq;b;q_xzzMTdiTnkZc^A5nDKu@KWjc z_-7Hg2vOYvk5K=e`XRrkAfMM_tzW6^Ax7viEpg=;gl$sX!rS7oa+hH_^03AV2xkL<8|L0XB?+!gv(RTb7zx= zFyD%e1~!RRBuiWJ=Gp~(8$Z3*$bA$q5RYrA#*M{+jVXAQpY|dQ(Dy9rdob@Q>C`&4 z__vSu;PYB+%=>@;3o`)lyu{CsCE}k`=(?Eq#@r{~n{z+NdnP`f^3PMhR5USeMm=QW z*WOUTKMyfp6FdH9bSYN2`4KOd;y%k8uy8r1(pt)Dq~E;S75wnG%u?Qsal z4)rqa!zT!tgpO}$|2#ln#Bp>HA!``&&xdK*ln~j93fv~;pT8WXKHnSr1&NjUMDydB z*H+v*?r{NL4gVbHyd%3}I`8;4W{_^$IPVzGKPR%kT1MB!yw2u6@mkLPV17#Q2`7#9 z^joe6Wxzjg{=ypy_~!-2s|d;>%*Oe|2E#woke8o6fgv-WpeW7joy+ulxi|kO8n1_s zRQhbxD2&&u&r!TykF!2@UQ_?3WW;%(q}N0ub6SG`;D2X}2Ci6S1Cy|`p?vTaDRv*M z@Fbeg!3)^@PJ+1UP`&-tCEaEIz^zk)*5^-?-e3K(TeAK%3uu67Yrd;~|DqDJs(g1j z_leIc?uYnO${%_oB&(Pn$alLN5C;6|-ksj7XvoWVcLawjpe4?CUp0mZU6Jr|{_qWQ z6*GU>B2>%hKK7YhCmmfHU;at&u<q}o*Kk!zlsmYW@@Kt*$FYSwT`fBb_hlc0R{%x8F zbpiBDT4A<9>@86jGjK+T|4Gyv5K74EJD;RO{pxcSWq6t%?56?CY>LAVY_D+&* zF;u>mx_`N=_+)&&a$IH42K9b|GC2>*1sIQ!yu=N+;!%W0LKmEW8@elVT*YNjjxxgW z7bd>WVt=juk$Jl$jVE%+zg3}E%`exPU#?sHlJhUd*Hiho&EcZiy7Bw#to++gADJe) zZZNK6`}^L9PSa@7MEp*-nh4Tb(M0Z+Gg?3LjgT4$|Y1H)A8a{~8Z~ z1nIqpC`cc=)+0lZ_B>L_Y!EWZ@^AA_RfBkHwfKNc3@a)SLX#Q2U&~g-$f^Vf?T=id z#s3fDK-N0_B=c{hcVb?vxeO{%MtDt}e>)vLB#Rev$-i}=adEuRiR;8`KG)s+8^I@n z2ISvPTVlv_&Kn$Okw=#pd)vjjilD3#P!g{tR{Tp%#@_CQCYx7bZe=9!86p7{AH0)} z*9Wk{!Mxt|orgu@^~)l~;&($lGQ{f$ZFr9r4=yJS3S#nazm^$``uVrwvoldvcoNNT z;{yIV&qCbB)8yX@cVs?$a2e#GjPRK_|8~s|N$qJa`L`bERoT;CTqiz@xE^CqDgXBT z2MUY~d-~*J)8yFG8?CFT$=K8WZd0v5m+a}WRuiGyAew|}4KGKiE727z_ZbWEKgsLv zdKh8RTj|hkI!Wnz-q#*13El3!(L(XS0atot2;KSG9N#HqlC97FrU!8(4I-0IV`}%) zvO$cj3UJBPw$kFOzH(TOAi|y@X zt`pC7Tz7dErdF-bR=#JTb?oiO@0%va-cGZwa_sG5E54c>h&GX5 zXxhf&m+Qvn&!Ri7;3+iCVaybrm(4c%l=UVxAW{ zNJq(G=Q-&}oQDh*>+Pw3dnh9kx8D~n6dB~>pp8G%_1ghTrk9XOwg}r_4`N3eL?&w{ zGT28{R~07=3TPHXPTO4#h)C6pDXr@?b_N-uh>S*&R3x<45r-Z8)D0 zGSPSTbSrOh=S+L`=+4>g$c3qt)!^mg!?R)957IoZN~EmkL2`XgvaucWI-kp+7G;Fj zpA+R@t^Cy%=;`;jkBxbT*STCLUgvY&@S15KkAcfn{$1=ESoy1iEhvdsV;|dFSCM}= z_Hpf84W(FQ+0WDMgv^v&ME&+kIw+?ixx{+B{a+s72+AJ{(L(mI8E0DjP=2P!&_?mxD-8sH(}#)JpYx; z^DfmiK6(C&>%?0P*S)-nMUgoFHCr)|k?&ssaukY=eVk-n<*bM1B0#nMu~-gC$ez%# zYk22N>3HjXgi_zGpLkdz-fr%uSQ?FUHGbYM*M@SkkV(3-iAgezM(Rr0z)L@l;wAiU zb6e)B)#g+N%kb}r9n0-`7t4P2K@Z97S1$RYRx~c=sV&!ur#!A(>l5Ol7%Eoz_fha} z3L3|L4Y#0i?AOWGRn%ncS1+rHP^-nKalYtGq85c z^I$}%?bubJwp)cq25W^jVVk{_%t1aGTBzKmWlj?^IfaM&s%IGfqz9Tu19iiOF8p5&7u)F*41i-k-y{CxbxB;n`2)-w*f;VUT9+nTjTs{_!(?{D7=Xk0uWx^kW7Lm}7Q`B03nr|kQbnTAovzTf|{X`=aH;?qIaRZe`` z*J^U?`!GbcG4_35{aNAB&!vO@8zhIAf%iY~08P;UrL%(mu(Lce1pV&2E15HWG6elJ zEpxSyNoL=V(gQ7|fx2MZ_I(E}`^)=cz*+43HwWtP578*m(!S^Y!aR52G6;Wmc(&|& zZu*0UcX^ifT_g*_B`+FiiDzTq7a(v@rr)veldP-U z_}8-U)Fc96j#r*Qlg)EIT4ZS4Pk&Z;Red_1cj=|{*?OUeRpR-gT@DFvjMMx5Wo!QfBh0&uiHSAPdB-Qz})sHRSi3)-z`zmq8=S2xqDD1yj*e zGJBazzMz7}$M&*6*NL}Eu6ubCMiabEdDf8Q?4RE6LS^FNLDp4{y&R8F+2&1{OKB8` z=_oqv_m6bEZLyzH^|uQ=ED>*~?4VdGKgAZ0g)5a3 zENC42)y2BXv0rViCMTZU3rQ!rY3b$*K6^$DBmA*09cmABSE$`I--8jM_GL$f+IJ^= zWXS(6(&n#SnMa0jJa;G6&mKZ1C-bNC1wSD7#pZ9>8{z|8^JmAC^R(gAGF6|VuzD|{{}sP-(vj5S`U>80eU`BG(?|Id|CKM z?C6t-*e@kv-Y>01o5**G@u_&SgzL;N*Nb?IbpH=#6pGI1F;>`PvHS^Ne^TKVe*IWF zaPHYt-Nl+YbQcAe^0kJ=6ff0(&-bx`%b*%%jG5!X$;B$kQM{pYKnczz=tZ{QebhA;;*yfN`oc;ln# zZuOo>rZKSF_0-+|KuMOv)`Ya|1ImafXkry8%M8;%=^9@e7ZF6v)KoiLM5EP&o;Lv@-T zYYuVehty|*zL2`$`JwdL^tI9F3a*nrL#})E*#qBL#J`V6^;t@{hh7A~K*uZLwAys~ zJOld)tk1*dd2~hk?3kx?HEf_qhV;3*gOZs7nf5P^>mw+qS2?Yr0q3UA`CqX<7jhZY zp^VH^OP`eg@#!@3zLtsTL0GTo{%0{MtI_*=Uqg6)(w>+5dtc>pewNX=*kAYMI_a~V z>t1~pvp$zh5k6GRTbiY`-7e?nOf<>r@`uyu^VUBpeO^ZX$N701(&y1zC|%Kc4EJeg z(r1_UN@mGLLg$%&tfD|AMcU}k{0Qb($hsk0MFH*aAfeB!-Na^E&uJa6<%O*O4qOJ| zmyZ4)GxIr%{;O!}^7~KF1N2`V)jtWuyq`+GzqpnVan1+TNc~sSxMcp1>!kl0t{eS} z04i#qm%z!fk~4lE{YfkYc#nn-q1nHWZQ`|X?t|&jxD+WgzWt}n7HaaLQP@_g{Z4Tz z!j&O3+HRv{W(t|;e#)M0&&6dgiJV3I?P$&)JEo*-sp?7YhP>Z}#Sl0M}%@j-FS z+zUw_^ode#UUBiZvHl=$mE?!ZAYAG2b3so0(A?*E>2&n)``eEWG%n_+6W58Ke6AaQ zEdMU;$Am`&BqE&8uph(GB<;tf`_n=4SL{FV{obe10|42NHk&B`243KiAxM^QrDP_M zOg8&52dOpw%=>1E{^D4;P0Jk#Ihz4(KjwcS{Rfvp9mp_W{%ca|e^;f8eO~qGmi6CC>2~0G9vRlZju|G9OpN~b z7k*(5Qe9I2udx1=xnM(reN^FV4iK`pYT3iG$zsp7P58;qs^33C*2_!H=gdnjm%&h! z5niq`_M(OO@iJU09Zjh;_N}HwV&SVt6FRcGm;{Xr>;NwO23Vo+Ia#bS>UiP+$ve{O_dJ$pC}f;mu0ose zNjNd)MK%oJf&ecc;U4O(%s#?`J$n61KN%Te#W59vQ-RbZfM*y%aJzJ@1L5c=T|aaG#ZW98cF1 za?j#xa$1G=uRmtqs<{j*QAT*{Y5ZXp-mLZ4>F7baMJwN!ZT;023dR*)e;BIxiN+=4 zC$4k+#C0!k!YLx3a-qclImO~Xrwk?J6_&WR&H2eL)bM94Fh0E?t$6FQBYix$*J?&wMc-vK*$$S3dks;pl zH!4&5w2(=fCKund5&xN2Q_^9$exuj#XR%=Ui1uFRwN{e0^E>a8pu+gd#4xjg3KZaDVOVuX0K>>r$Dgh$K% zSxwIS`TARcJMZUfXT^f_S;qbyZgohg3IoXR=eq#8C}|pn`L^HBm#+sO?sI!ORF@#r z#HjA_lm|mX^@?VN;g`KUGKA`7zbKhDIA?}1u|Fo4dOu%}t}Pz(6o<2#@Slk8}L(v zz4o&hUmW&x4+|8B*Pp6md0lQb(N?7K*K@5V>aZ3cB+su|O$4Rk_1yu zqlOXIj7bM&F>+iCv#JZwH}C9u0EOYxKKMeO7q%t?8ip201Z?YX8SQzz|fo{-}WY zbw7^`K{evPN@k}X5vayc!Zqqj<^JbF=A?nkpc-X_lfT1{`kue_+b1i&y9PZai|<}$ zUcB*Lt>mQ#jgNWh#dYGPi0fWnihvI6(k3!9P9%rrvsPjC|K-aelpm@FTFgm1g zOrkcQ6hzy=bH=OB3hQo8hgunOY>e8(M?Dx3YTtgZP&*$7uc9eh1Wklm_=A$ULC8qd zkTDs6Lk)-QdK#aSx&}&t&V>K;-wk3g2e#dT<%!p^R{s*xz0A z)~4`xJ9J^v@pqS-AnMerbWr`=MnQFCtp^x_>fUb^Fx%|qks+wYtx+<22^kYa#rwO)H<^?9 zTn4o$Bb+4jcUFAV2R$W=kL3IOyzx=9^mnajeC+Sqa-Dd|6lRN^+(iVlgFy{slD9zPsmnncNs$9LBeT$p!5I+W^>_hS3B z{-HQbF4gvFGn@w#2506KBIC9mn`J!mLm>`dIvb6YaTDjQ^WR`j3%CrL=Q*6Z@ALD=V-}xN(L*vm zbII>k(72e-{#++ME4gm$nFyPs@%y@w#%MWwe(W|GK4)1?bV}RsIT=loGy$dkeu)`( zsLu)?{(Cyo`XJ-Q`nvsrIMO!LMym$Lr*bt5h2`-7X8CrJZ z{bDd4*$M^P9a?q~WNpx_d|KUH=B=K~U^L2zT}V*@4R-e9hrAu|1rK9+L5yi#;r(aj`w@%XQ+joa@=_;mRA8_NARP{(6DiWcZxs zHW@z0qbbH7J~3K-R(R(%=}7DSlhW696XQtxVU;3nbeF{Ta0yam48$(<0Up-0J$ypT zuAb16J-lAa&Vj5Anq?1bW-)KITn0l?{%`iM8+!Qtd24#r*uxcEC*DG?8{T;RN@l7U zW(xU`tFKoK@UFb|ey8K$BbBM7MT6mOKex&7*2!%$_He^+)1hMzJKrKG6$7I+pPjE= zbe*~?46jN@X*E(}4AIhY9!hDc(Y;Ag`X~-L`PZ+7E0oNuLdGmLq9-AF;X(cwVV(Q%PzfR{m@z%g~ zFK;qmvbl>#nb0|{M?QwPi||${n#7tkoMkl;IaQ)b)WQ`boU3X?6Rk(axL4JSCfZ+p z8dur8%}0xLx)*3l!=YECRx0nB=SUO;5j|?qs8$MSuCkdI~X@B+R zwcFYIt8=QOC|dS!*-YlKiOZk?WrWAv_E)X-M>q74%>L!Ff6z3;@VJ8OZ2!1!c;tLa z#Qs@~kdZU~_Bi;&2#=QibDJ#t=Qh=99yeUAU9r1=(D^3ySz((&>7e@ul4}gzf9~`E zMbQ2A69v>OIJM+Aaz`&$G9L*UW8`!`MO!WP`(T3`n3JJg24yHCoFvPqSoW(odIB#A z>{l-P2Wwt5ysYIq@zTt7FE7%59pkFk*sq<3C>=^yYV6lWI4*^fW52pup&J2c?AM#P zDrW!Sdt^$ay;^i>I$r*cyczTI+U*_|h?gBdQY_pNcx1>(b<~FJ2_chW{~&{>iWiut zN-l$9lo6hi?H^e7XX^7w?N2W2(F*jc{9%8t6Hk>~x7MTD^r-yYI*SZyH1_9Xx5?O_ zS#FcDKa<@iV}Hh2O-}svFoLX@{M-l=e^p+b4z&)*y)kO1kB!6V?T-~|=i{Mtk)PZ7 zgB;hR&wQu4|L+*ly=RRe@*uPx9i?U8ijj@1M^D${4?-Lf+g>VS6YJ5T&oQS}Tn6PR zBb+8)k8Xh;lKID6)}xKj8b0T8o%o#3bz|>1Kc^wZ`rtH#K+1ACd>-sJ89uwXO@`05 zXo^{n?qnjb-!4i=+SG3p3g6xuN80(z6lu-kvBaESR-p59$LJ5ZjXuD`nqH6Yq-D>I zlhygT@4i+8?+IBOG%Fs>%&rL)RzdvtfG%lI{;5zYE&UKeJ%EJ{S zOagB!FE_l=-;F(7U^O}WTa(}e6{XZ%woR>*b3o3)=Rt*&z)s8 z(I&l#=ei(9SG>_CeHG~C_2^v7$r6etp4%``qe$_8JuZ?#TxTo|WVOu&=}`O!(rhyR zzc~)Yixw#qfBgewq7Td5|I_V&#(g-mQmqnbA{Mz^XTW`ATiO*F}xLj*KIr>D* zKH`a(ifzRcG0&}J`C=TC-10#`r(H?BkPG6RjkSKfV#}R9)rR z$Np%Fv5#Y}R9A(USEPe-2V~4xcV}0{LHWT#1!ZMB$mHaYwS9d43-tj%-{@zlLil5{ zj|XYlyY7pT)%I~4EqeiEqtI1h63}}?hCU(VKQ4oElo9SM`p@3>r{I__Wq1E%@(!7)oMf0i5u8iy4Q{``sqP=Z#jA^L#{!g|72_ z#8;O%=r#y+g^dn7pKqE7-G!n_gd5?}muYmx_KW>|L?N1_*Wc!E>Ck=tGsVl#!{gAs z;w^>lmg2caN+XM?#CFkg&w`9^6KCWjxCICjj)t|Fw?v4HqyP2vw@Mu>xXr48b% zHS-@Pivlr%IL@#GhNoV6b(R^R{mC%S){_)%!g0taiAyRFAACvMHJS6Jww6DG9+W&E z7x0v6;9Zs3Xrx^gm7lDZ^Pon~gTd}Rcp&EYT3U<`PJe7u*y|4HRmBILxK8#upX=G| z^_24zQW^WlW8Ee*9|l=X6grsoQ^~oeLo(&!*30u=R+D3|PeP_B#$NYClY~CMJRS6n zNMp0cw-_1+{dMyd^xNY|max|gX60zF&(qyMey!*}lRx!7);8fvq^)=;htO6}rfkGs zzo5mphPZ353m;*7-Gj>@4`rOa&MlsJp*AU>pNh#J^Sp+7-@st>s`wnjb>ed<*R#d1 zn_J8{_WJ973XF{Bd1sw%n&>LS=X6{Z6TiNxO?mkAY3WEi9SLw&?}Jyzk+%IjMOqyW zS>+bLiXXtB^Iq$ajFSA&2W0YN;@4qX_C4C+@w^G8LKxjgwA`0NqL9hor)+$fIh)UA zP>V9c*&&(d^IM1y?m!o**7q`g^`6gH=Un0>(&+7eYC06(TB=Cd?y5KxZ=Iu1 z+)X_17+v4b{5t3Ly?Vq^&~z$3SFP{wy;6U2h6`8g`$b51DVM(|?JQ+-N;Xk+z8=Di z|DovGwTI;oGN%<>21O_%oLcc~ZuW5M1DnDgR-jj95BqbS_^jl*;WKkRzwS&0Muxxs z*lKdt^V807t}^y;GOmiThck4L8a`Z>4#GZ*mA-BttWl6jBgA~PA-LIV3c?y3vPx(V zS0Y2jK>V3LAe%iLsAXr#y_}3U%aJ|2Tg!boC<>XhhxPX{XAN8i)hHvJdF)|sy!A#; zzyErEO^xAgE!T;+X099F_`DaHsbZKs@%)=hPPw*+7rRX+K0MiKq9D-l))k&LVh?LY zhi&n{a3||3CqCR4`J|Zmup^qJscb$m9i_GJD~MKI7DwsXuPRD^Sic>`hfhA=a(qaK z_K(!v-%8zk7!`RWTF<|Z??pCf4&EX#TLj?!z6#i%*wt>`x*9df!k#GoMtsS z>-ixTgwA??Co2G;Inp4|rS*J2t3zi!e-)BU5?yyaUyde;?qSELLw6<8Ow#^c5{K?1 zFDZ2Yf}>pjzt;1Fejf}^Irp&_>j7p210%au;a*a{f6hB*J-_2fafv4$sD-qM2UbCt zzkYZ0ZqEUc&zcY31z!uf4C-9|A4~fFgo)!eg?%nVuPPqs%XQ+voa@=_^UD8I2xao` zHd*{zP0sp#Y?rprduZ9e-xR}U6>flF^EfS9jc#o= zm3^+foB15fWl)MT5=U6}Ik)&>ef6f`vmU)FKBse?_-x>MjC~f?EkVCznAT$~Zn-h#z(X+6V)Z#}B#e2Q0MsTx{{VEGwTBKTNThA)jve9BVZ>e4cxp z;nRs9dRbIE@xw=0$*a(pIyCXawpNEu{Lm8tb4>h@uVd-(*Q3&*I|a!oX6u{t~xi!2czXYsBq^&>ivK|w`~f0-3q-bd)=1nWUuqMp3PoQIMy)g%!lDtlQSPq z{;Rpli6?qlO>~v9*E?BFj=eto6b-!_Pwb8+8BgRDr-Qy8X)o6Jdhrfeuf4vsUO~SZ z&TI*LJ@fG#?R9J2{Tajj{Hb4ZZG+!0S3~)8jBLbSPu1eTU?;<7RoLtNF>J33xD1*{ z$J^`N;)$u~Az3~mm-D3+G%jB6_2)YAS;=)1?|SlIeU$cPWMJ&|f)c06#1qrpCKFGL zN0T(KA_)!@ZrPKk=6&fEhg>ubK*$b>}f?>4UR_Tmj9CHOWTAK8r27Ub4?6u z#V~ZV@i|b-&We*2aRdbhhiTbykhMXx&X?BR!o1aU8H`35i4UyvEG@(b*W*%vCLY}Q z{m=XLpm8y8y|_-i6>;70mbo7=$|a`^knn!MS#Y_^ojdyh`&pLF*$-HZg}%Cq>|u@Q zP@osKLx&PY0sf47{7+iCeUaIc)sBaxL-8dfuo%VGe~Ux$+J7h%w-JvnM)w1r{2=H3 zfPM6Nzc%5IudoX*fIt2#_Lro&&2ZsrKVXiO7w7$UB>BvIS;QvZgA4eJh1lqbqRQv} zibpc1rCbIDC?lMvKJRzSh)rQ1i_xp{-z8ipUQ4-dc+IqrOO8~aWZ1_ik1$Qn{=i*U z6G3V0;}A5(*vI>H&>G%Qln%;nFDu<$TCUM>R`&m{Q&0}Y!Kj4x@oMD07>>8DXvsbv zt7Rv}$!hz!o0h!_vQg-&FmLI+-{_l|yJ{|jN|X`qEc=+7Ki&a7B=g6)ocCK;Wq4c6 zb>eLq*9~vHKVU!aaiK+y^SsA#Zjllh~}LZN9mzc6{R2G43mf#$3E0@yhusXKkDu;qV6;8ojE@; z1!*qk`RB`-=h*#$1zNNNx&@;8StPZt32$IN*KirkM;YNWasKHV^pK3tT+Wa5pm9n6 z&2{$QTsM5OJ+%3J{ZPY0aXnyWq3=SQAL8cOnWN)~%ai|>Q9>|K}oS*xJ^((|<3zK3A zTm}^=Bb=q)FWmw?CF3m@d)WAQV-M$Yop_tib!+{sQPbz2U2@F&%?av*R$Ef=PhO&dw9Rqent9-xjdCO ze=O%)g@}giV&%2W+h8t(Qj`(i632(@uSv>VF7~hTcIri{-M3ph|;UXPyh7EsCM`^`0rR=H4$5FcLgNo8; zaVCoPf5x?J4|)Fw2_j}`OWIzFv4_OnC@uR*e?QO49`gQ=7Jmxju05PTg!x>^Wl)DQ z!e?T8cshFc{q11~8W-EcPFyEG^SPeQ9!{~CAqb7X9uDsqF?z;dpX)XmK1*eo| zSz?BdhO7;ml}{|cl6kA(GAKeB;mx&&1u&$UzfWbo52hP>0B;H22P1#4*L%KL{a$a= z6~-Q};5zXZa^3JI(t0uvQ-mtc)9nFAsGy=uOBw#o`NXZPP;LR?=q%m1D zs!)|Abvj6O7;fm64ys3VS;m&h-Xm6R84kNw$xIS5Exg$U z42;CrkPqIFKdc$d`mg0O7>Y8Y|Hqu)=P5u3nfkY$k6bk!klWu6y-gjG+qscUS7l$j@!%HW_=f8jgwOiGmrz+(`W|Mw6^==$cah zNU-tT+_5B9|92_f9xcv{yIW?g{|QQF63KXMhp-3mX|2QE^k z^H9cRP>3?Z!?>JyuI@HMf)v;#(EJ0kO=H6kC7cQJF-fy*Eq=x}vv zPWH$0N2jBQWbtn<{-^_uOUA!kC!X@TZg{fdkz(8c_@fDXI6Rf(@A7#ktI1iPor|Uz ze^jEc3I}#h2hDbmDrjy!EDoA~jaJY+hb<&OG+*7RWZGkkFxzvPt;0Kzu40?l2A^po zVa2Bn7cmcwTn05LBX%aSKe`1yB=bkP*q34&7xPfUb>g9v>xPF+`!Z^GhX>=2E_R!Y zKRVfJBGXePC=yO9>{=*L5k`kLacukYrnXAq;k%|oWz{65wzCh3L*?096b7Sb#-Z}+ z?Mh~akcrxt_n*tOFVW}QWl&R!(Wpn!Up`oj=a_u+8#GpgQ^N60-G$6kJ(s~~lo6g1 z+n4qIH-&wvN3Y6XP3JoC)WCJaQ>J}6@Q)5p#=h+AHko*LBis#Velp_S6=;(Fsol=$ zpn2vY1P`Tv+g~~6z<4`%}W`#kaIOFX_rJr_JBS|I`mD(zd zUagKc-mgCPYJ9BijiSF_bsqE5gUcWfWrUZja*9u^cz1n8Qh$`o`*Z8jtKwxk*V%q> z-OG!Nch|u&D9wYuRx^x0`dX`3E}e`&nq^%@ODA!2nU@s^YHePucz2AxDttOf$II!+ zy>S@vcFa%9wh8}KrFdx;2dllj?5llNUu=dYeUrCzM>A?7vF_d&k%N--Lj~tDM}=Gl ztx!fd`dgy)lVyJf^xG8nrvSYwp1N|Kcq-(&m#1P70Q)lqJ|n`D@kjS-^-G?NKN@6R z$>ymRpCkR#LHeq&U&nMjZGn^;^K{(-arWnf>lIIR*r4+B^w|g{(-u2wzEC(~ ze{P(pK6c&y8PJTxHTeC+-Wz{AuYv)0pjybGY}9-l!W87&wqXo z|0SvFxLrDwUK+1-x_^&2ly3dI!sHxmY57qacaxHtA!MSV^3=KyWbpPL+?BFwL~j-DCi}bTRuiFUcpF2eiMzP;*9`oe!Afn?=Z}&B+uFog z>;1fP=B)#lL3lITT+Re>m16 zhoCb4@LcOECmt_BlU%yB#jUmD@xAm_;YnMkgK9mtA=n>YDt-~xjh*m5kv8G%YZNdw z*x1UDp{Nv4H(e31Uwm3wEgPc^48FST3-Ls3TTQ*Qpy;-wpUNXE;z><_6A zcmHZ3+Qj}z)^DBA z#HNn(L$&x6>FL@TUOI1;j+c4ZreIzU-7Aildxj_$DzPc$=jGwyN@lK4hK^~B)iO;a zlgX5N?5lOSuO8RrLNPASD-Nn~Bg9Tw8!b8vqESm#!f{x^smxs=mq9C(5$^t+D1Nur zgR4$S>K}9YJ*Zmrs^a&_TqpkOxbE^-ggc@5TM2Iz;m`QT1y+-@U$%ND=PGe?**}iQ zRW^UZJxcz@bWm4?4{w={zdqR8VE$h27RTTAS1Ptb>~;D1>pWD+l!$ZYuH7U4w$d^c zLMHKc8=Xa;fSi^}VYZ_oXF;F6O@ zyw(*~3Rig72YF}{_OJtuOZrc)v;X9J43A>55S|7{7Q^GgR+FhbS$NOJyjf8b)>>guGYjG2WF?|8@{3W|X)HbGq z*Zh;1*8(ns<`W%We{|j#Q-E$W_m3_AJpeuY{{Fjw#>KpLfw;?r1GK1EMx^?Yl_- zU2!~fSIK2ij51;;Q~U33=qZ`K%q5@Fbe!?uE4a?_BiFs_4dKK^{vVDs#$ImaHko|x z>MhJwPCmEO_EG*U|NUm3x+?r^PZ!>?_3Ic>t7BhVvH1yYF3cY@ zf5hiSuZ3Hb-Zp(sp$MTDeJ_-E3-V^n-!Glx_&eod#b2Q~iSGJlGK&2ME18i#8RG9a zEmJFG68?Il{DJr-*o?5&xqUEd8@cHDhQec+yB=Hyc_<^?S^1QP0^BXv)|uaHd8Jf? zmhAcM?pgeE2kD;&qjME64&gfSHk9kGy%VUx-jRQP9^Np9xBJ~D!`qEklas#__D*%^ z(Y#T6&SH%3_Y@6_nixg%LVdKh=;-brx%m$wfp*Ty+ z1mf6w)IZN2pXs07?Qn`EkHv^pEcwbV+qaTWDq6?CBALLQNnB?FZ^IQfx>jCha3AJ& zD3?JQ$_TgL#Jr!~$8hBLTV6P3Q~2w_=vDK}b>^4rF2BXhFRi!NwKlks=QaNNW4Fny zw`W;R&VI#YG{yMq``W0_3ZMQd9i*qq9k^Q_Hj#HUC^w!Gyz3+=H$Ouit-x1bT)MVnt zu5ME;dgb*^J2ct$vjHvq+2L=kG@2co)1mni_BI%S{bPR1woQ2J`3k#pumhHX9l7#x zl}cuYPlnLEQOhhLnM^cmtHhU+PP;%4ZQ>3w(PS;eML@C+Nhbalmq0X1r|6Q-!*)25 z`ON1sSX1oq`G>Umprz<3Sv;A``n#IO$LpE#TqizjxbE_4`}ZZkIDA_9px;arL1_H@ zB(cSL3-&@-vv+rjGo4?atJr%*oUL}v zBJug7Hm^HjYb`^D_*|}K4iqx!Ld}bjZ?ZzoPdc`M?!l1fFIW%JD7wYOZO!4#Z7r9< zP?Qn7nt1)a>aa~=PixVu^5>JePQ2D}-Q~3yoTzwo4>;Bsd%Cj)rDIQ5Z!lLm{(Q03 zL|4_~)0o#8XtH^=?CH}#s}93CKcwUJ5^S@uIzQhoj@Q4Oqj=p$9N_lydh`WKW}r`o zc->FSj3Sv9?CCXlNd9FYc1Cr&F}(E)b1ESp^y5vhfh+az2+qEy@U&sqN`4 z=qZ^!JpoF_72bSi544GVW-*PA?P&?uiO*85yL?J}O7CkO^*~{#+-% zE4iMH?|kfzz? zyQ3aPSomE!z84~sB<cS1-}T85-{ZB+*Fq-B_v0gdeAnUT zsSlJ9aA%CziY4yCug&_i1+};quZeFRev7RLaYZBkfOA9V;0l{=+J7qT&0Lpp85E+7 zaJ?vLK7ZnYnvYiWa=C)`?sjp|e%V(+`wDie6hr)$ zb}Xhi{?&$ir!gKGj(@exfh5yHJW+*o7|*Bmc`^1@+$DkKXmYx zzw`5DJG)JW&yC*;(u6!gX+Q700!`BWw+qve_6!n7tj;~Rj3e#(Qxs{Zilf*b^VlXF zR<2|QkxV8t`iR-*S$Q5AXDuBz@;fCOFWd}@ACZzR+DpnV?V@vHV;*}NJ6mq zTh(E>VP!fV9vP^3*m3hX9xf|Wx;|Pw8RX?*;OR={Tp^SA00x257K2eq^Pz2BRCt{{ zct2@BxD3irMmS0Ryz}~flk$?w`!ed$tF|9pXZykRY`m<4H;LipW4Fn~YqQWqmLv0h z87q*Uk?6enMLJ%tz%C2hk1sciLH43@ALd{% zmq97Y2nUJZm+?aPr2b=V7XPsfZDKt-7`-a}58*oLe<;_j_=ZeEF=n?qudog_KB9l) zKR$MwjQ^PBHktTlGMbKT5U--5pvFF*dY=X=eERcrXq=A38l&-ct2i|Nbb>;oSsZQl zqS0BqpHA2n%aDPkXcO+NWd@T>jQiPFxSv=1t8w+Bab?Oz64G~R@y#J_d#lLvXLWls zfAw4jqftiq+dZkjx&}QY^H*~J!IEz%zCq^S+}U7n7=rP#n={!aMK!wsF6dGuJt-%xCI zWw3=Hx=r}-$x3FtPlourU(2i!GKt+Cfw>0;tlZswzl!0sfacos)Hl2s;trZ697mNE zGMD9C20c(lxJ(vbTjyby?wOR&T+Y)}qgQ1g$8(+dtl_%xj{->mVA?g_#A~D7b`Kb{wIgIecN{#38gT1%l2UInz#%aP)4}3&eLRh z|BSVs>xLd+4=eDq2&H3wZa=QE-E91`n0_UpvGk@5Jw$E0zvdOUpZG?*=8?18kIdzH zk*2POw-sC`-a@W>c`L?uMErgs9HZjRd7tB17F6WNjX&Pcx{8{NKkkGk8QP20qwSA3 zG^x)DJAa&xw|VC%-VWX1VTpLVr$q5qi5)6GZ+9N2WJZ!qypf_H{s{fC&o?{3*t}Hk zF5@>YgHn_cUam^&KYOExWd1Xk=eO7V$?&q4>%>bl*S)+*`*a{2S%ep3pZ0d4F!pKV zXXYx$K6OQqX7gg%r#JOg;rAb=<7MLC6fax<*TVwwa{f_@g(7T$`FZJAs$}{KnZz5c zM9~IhsVv)b@%jvuq`#~9BXd;AWl)SV!cpqyx2F~)wLiI>N2x%s%HQ?pI`LG=bvGUp zrbp#FSHkf`cq&ID=MO&C>X$Ck*q>?ERgV1`?>5zn4uvTShoMP^YIL5j0e_VK?{fWF z;fN*aQ2Xpv z=`Cnz9&vG()bW+`wD^ZVMiG_2mtEDF`5etxH&l zCqDDI?(!*2o#OKtII0Mr#@-$5l4k5(d+RF4-u2Q!m!w)4Jm&MGkD`3m3!RMlzI4p; z@ZC?;Fv2fBNXO@G$YwDFt$*;aM|_@fm|}0AD?Bo^lsNThC3CD#hWI>L%S;h6iOnTZ z`|)WJb9wxK#E4ozcPg&oFS#qk?bU>M9wcv9=C%WuLAZ;B(SK0|O_H;O!SeQ1AW(adC@j6#u z6^>k(4zKP=e({~34Wr>VZFSmg-C6CCA#~;*ik2~}u?6^~PX=VP3G21YRG$o?+`U-! z^C)CM!gPFHO3)+aA^mK_PRv6imq886h#hnD^L`$z_2ez+A({P>@qMlSp|omIo7k9# z*k8S$shGwk&wp^8cqrw%mj_|Qz{4nbvj`8yeqD?vB0(lqh53>^++`y5A@8Q+VOM0c zn1^R+;yy=DVc1)HZNeIDCT{SZw;&#-AFT9vzfXpEsMRtPeKN$uu7|6B?h!I7IV8IB;-+(cVQ9cSRdE@Vqm1x$s{-_GQs`!2+*NLamTsJ&r z`lHR?cX%@X=xcZyx$@J;86-6Cp-EQPzL^f12TxSc9Pph72nuELbvXVT9UE|L6hYIg zw^H`bcse=*K7yt|%k1EjA!r^vNcFQlWE>=!ABn{T8;<%;7K zDqDWzQ8A(Noent`;gRDE3<#BWy_AYq`(y}}bv>2LH$E9c<%+*3nJliZWu4F38D0S@H1z^pGsx`IPzb#ygFQ9~zhBhwID_*S-A6c;~_e4nM{oou$<+ zO_f>S?`K^_{8RxI-Vf}ACR)zRsJaF%(moxeWAU)_oOJxm>!bKNdzFU`GF3L|@!8Rn=mW*@)?N*x;?1v!PrD zWhf(@9RkkGqt0|4?YH>jA&a;5e@M#PFIjkNlDyTUSMC3}&i;?P$5i-%J{QEPksJyxkYB6t$)3Lec zv8f&N7;+gjqKxpkOClbv_`Dl>`u+W9Q=Z{*1=oqkkn4uWO#gWy9GQX+bld*(EQ>6H zZZO)}f9_{pMNMLAOZ$f=dq1ZZEz_5Aqhh+XU7kk#U zg~boonIEnjelqRZ9<4evCca*@eW|v(>ZBRgOJdY&Fp;KsZp&kIz6;j6FL^`|5Dc zOX<+M1dBmNtMzgZHe}Df)HdcFaRk8)-w3TXg$jwUd@_XA>OGarN}mj&b;+NV%;!Qz zxmGcSn`lnit~J)8(YeA7n=^;`Tn1~}IvmE?vmNk3+4JA%DVaT6!TyzOqWeC>`O?33 zpz+E471xQ!e6CyjH3UyFMv46zu|5hXz?&%^snO&chNDSF_S7QGnY2vj>Z`($Gt%MH z9a|@i&t^-ZE*A}YOrf%?Qt7K@9vP^;OE`BgC3Eoq37O0dkBS1dQCEjWDSzhWOIX(Z z@$iZQaawS&mb+$gOrOQ*lYXqXua@0e_8I*yC)`0lpn8DlH($$kM!&Fr|A$-3Id*zp zr+hPM|F{f_P)6)uPiOt$=go@ex}k?;_U|d?&AWc6mb^8!w(K9*+5U0e*gq@3CD#vo zz>!6GGxl#QH1Q&U_gjSdlf3PxL%p!mi|KfK8LLFr{XL6>PMzEp@z(rDw9sD4Nhf(^ zh_}Al6fF=kiBJ8}n_;?OFyho-0k&TU4}SZYsG9 zicvU@hBQ_UV-+8`n$A z9xVHnDScz>^tz$$*D-WHzMjiqG|C9K?*6i$S8Khn{uko40(*ivo)^r;zt*Ey#p`sg z6R!Hj$w0|0gB$G09}}uci7kx24aFW3Pjj+u0?e_e|tF@KMl*<^{m1}*#Q z+fif5?_+KLiFs@FGnK(I{5!&1ZvNHc?H2TqES~F>C7x>rIO2JcVj366b0u6S-b%Ud z^{)at^ogb&fx*e1f_dVJuQHQY6jWThjL#t5Q z&vnv%u9x-`|BmSIi=6al+0Q=c;rF+nt!P|Qe_Ut%aowvwX+K9jyT3C`L&r(KNL?jbX5A; z7y9w}z%F5@os`UzB;$#FbiSe)DJ}lY%U>7$#l=&NT5joFmWzJ29m`MFvOCK@y|NTf zRchHA&@Xs1F+Alf>i)yL)pHq)Mj5dOZan4Z&GOgRpoe7kJePb$4;mNq){E=JTM^g2 z_MnL4sjJ~rBfJ@ZeHNNx@)b9l_`Uzsbi8eiY&z@yo;e55Rz^{bhi1}=kY zlo4*?@)a%e(;Gb{<0qGV#hUNM_?VxyTqk~-x$fF4fsV>o9Qcn|es;E+oOo|FnKEy_ zVmy)*3}o1Dayqo0K?;j?^q1E>*brLZZHpFK8eV{;Wz<9<^+{+QtKHFZArsA4Tz5z= z`HCGd6b07UM)5&$V13$64f=;!EEgS=ZQ~lXY;W18SC(wtNG*H6>^DAN(floQ+v+yy$zA7B@ zNIEEY-9zd3(N{gd5tQXyqlKV+SDX&?<}0Ran|Pc!7v#$=X#ZM+gd0zUZRs=P*sIWT z*Sr$br_NWDXxW+BWQn~zE!!Egwz1@RyYy@3t&Gc{5M_k7-2AJ>+tRO+@|H`!q8hy_ z`#7HK#9Iy5z5Z1|hkQi<_ZY+5Pg7#!x#eh*MzHOqbi6%vSTs=ENmMkim<)GN1qMc$XJ-ws>` z;VMVJZoa~A?=AgKL=VaIn@hf;jK; z{Q9%(=foA8!hV*aS7kr@a-H?Zb+7)4aRXpKm()7?GyZxenqvI*Bz;vl_r7%cyA*o| ztiK;#h|^zDTcy9xkYdcVpOs&*eg<}F`Yinzy=3Tio^aHr;m=> zGquAM!lY=(&_`Jl>!X~@pa;tTK_8a?*#SKz^FO<0$(Og1`SOL!&HPx*b<)Q&u6y+% z7Re(1dk{`WXhI(U7U6|d!og;KbeWJ&A8%mSg7xvwf5hoygmyB+Fq^cK5o2ni!C2?U z$_l;uYWhshA1;GNlo5UX9CQA{KYuKJ4M0!H^p#7zP(b68^M~s^f4FY+l^HKwc)yw? zM>bHR=XaJrrmhP6j!UP?Uy#RQRsQ>lI8`>ZK?}v}Pm3&Tbd&0n zpU#0&Seb|x<`ox<2MzV)6X#F!|HXPN;4*0b)X}3GFZlIm#R~(_!zQqQG%l$>uCxBQ zZuFPwkEX!W$e=(FZu_ILXj1m??sQ5zBTz~@tS(MT9XC@-YKPfrt3dA)mVF}aAD2N7 zl#%(A+8-_bIH^8zTK}R~6(5Y}I_aZ^>qZ|upXkOHB2F#jGH6BL>-fU<+nt&ZE{ncOJzu7NxGD5efnL>o>Cbi2MEpXc;`A}+ zXQhuBNc}<|d&0g(*Eg;3J;eOT<1%Pk{6Fc#iqGbur)2S2F7b2~jgS5NNUoDUMswY( z4;fFt4tEd}Pk)U}jnv0`W76s4+HI6R&Z&*lN6(*>KK8M1%9$WfB()rUB1BZsG5BK?tJhTa}s?n>mXXCj}`l{i&t1o(Qq_k&yAkvb* zDIxBV9gl5=CaJG3qtof@jXx-T{qx~CeT`^V`Whzo{NgrDumRILyjJ&j4*J7fJ0F9l zxkl#!YTjqP)p8jOMH$iCkIwm^7USn`=pmWCllgG3zV!LMg+^a1xK8>Cxo-4j<-?`E zF1$l2<;aFDmBRS_d&gnwvA$#qXfWDoK@{$Xt7IrALO}cX96IR^!-H-~r{&MFO~Iku z8xMN449#sBzVf5ea!0X==G{6QwqD5$f(*3Vh_OmbDmdS!;XT%GBbPx9%7}j5e7Ik~ zmi@d1JtVWALwG*c`riLkF6U!0jf?GP3D-%#rCj&wSK7}}@Kj2Pq+heXy%<5BY7&8> z^}dahag{uuN&2lqvz)p^OsIb5$aMN`jSL>^_sjb|x+DGm>px0&J-716(0=`WYn9Ah zLPn+2#fY0|z;>pi(xd<8cUb?e-lZ~FhJQ!&|5#4*+txpNNT&bsS@b_t>7T|W_0M(I zKi7@^t>=4{{^1#wl3o2Hs8mg^{;jJhD^i8~$h29y=4p*u}4DSXoeNQd8? z4vkevUNIVP*Lc)UXv|)%)SfR=!QQEV!w*Vkh>(e9PTt?i+AgEF63nX-Ur^*v8c~vo z5cXl&Tg*ojmq7!{2p=PI;=}US-O$4(u>T7z`_FZ@|6DhGcY0uL$djwll`Z0$@$N9p8s5T^-JqZHUCE$B?|9l{r=;{2*T9-r%TN9*(c+w zIQy@og7C~6(&@J~GG@~LkN4<~?f*AQcRj_Xn|G4m_q~$2OUSfr|HUf^ZU5i=hP40l zrTxdhBl^$H{#*0A4|@3h=XWa_7wf+**Gd0*T=(j~7|KRIZqx{)WYT{*{?75;#R$(L z`Zx3YWLy<9zkBHp!!xf-seh#5r2g;m=$7^WmC|ibkze)e|63(<7i2KMUHvY5UD|Ih zg9ell{pL2mE&UEa56Sdf!v5VGzl-sT^;Q9mi}l-;>!ja8t{eRdV=LoysoyDx!IToo zNE`i*y-5e@+I+KUI0#L$I(~RMB_4`29xL%rcgHEH`D>-1??vV{%TjF1@KB_oxWC!Y zk}}`NccsZ{-q)Hpm-X3!%OITN=yOp{{@9AwmZFDb_WEqrr#D_Nminxwaj`zfbDi{A z!*#DdrM+H)z$v0n6R*#_QRq`3K#MR6*QFAdYgZl49hy#`m;R#e|0#FH>9bHz%FY|1 z*~DkBX=a~_{FXW*`(b@l)zU9l%w|1Tav2n(jLh4Ypy%B8?=5|=dM&BGM`qD?rPOyV zdR6(7$y_IW*KytGo8vEvv!uRPB1VeQ_k!z9lXD(z5-8!9I+2%-JpXOtuNl{*L*YDR zym%`9^^Q0ccKcFI?T#XU96c*twrvY%r3r-NHW(1zrQ;sQhFiAqLbX%^P*Q-pT%4T`6wg$Ol;4$ zKo7saJ#T!)=yNXDNuTq%?&_1`EIGe7w7GOX>3@OhW%6X~=RVb1`I~M|0*u@3+@CupS$@460E^^!Q0kywx6eD(m^x-smZr zK682AcFl`MpKG~J`fTQUw&#JahI>@{bk<8}p(#e6N9e1<{+FfG=hjGQ%lYJ+pA-=_ ze4=#qnb^egE_x?xo$oAcHhi%EonN;j`Ng02=q-YunCEioeK=)Wb^x*FkrmGa(K9~1 zwCr(l{R-KhVtcI_nOYvhw&)k^9Ryx@O-K7{MK4JI&t;I0GQwR?6VEmHSi9roQoI&N zETQj!>H%88;rQ_k+ScqKY7_bQ^{76s5x=k3O8hnQ`+AZ$YM=|(9HxJNW4^Q>#TIWR z7H_4RH@QPritopCspro&hx?X|6=vZDamZy6E4f?H1A_x>1Y; zK5rt&t5%Bt8qpHOw?Ue}@FO=zVbgYQ^z+PHHJ3pp$~fNWeJnoaZrWh2Cnr8f*i}d0 z&qM;m+hDP+7vU|J=X1-@tBODRa-Hm3IoDnLCPGd1eC`Cen}~fg@#b)=$yraHOr}rl z=VYuW*J=kC4y;Uv;&#Z>v1a}P&17Ikrtg)d3dJwP&aM~5CzdIhE@I~|y5{_J<88R? zCE@brsaQc(rKC#WG#n{qh0~okwS?25kmf<3QWYbsZDN6z?H$*zwuvi{6XSk=x{>>p zYhGg;HLvB*Fs~I{21O_%yt>cl`gyhDtEu&y!XHK&YoT6XF6EwMLQ%g($Zi!Ax$N-cW>`pxvmbx$*I^;`y{QAT*P z{BaihXz|t?JtT|&`a;*Zg8FdJCl#ShIQupKG`y|lI>&!p&&J!;aHkRbXm~pdO>yy` zzAEg0K|0>HM#7AFI{^3Ib$0E;U*1uy9VNE4T-L})4*gWg9PX3pB@V_6d0)xg@00n9 zSU1#anTb9b+B`jUk?QAJl5t}~uzHYSR#?`8RqDI-zAlDA!S=yIb_H@s(*6yPkrlS` z5FtBX%YH_$Np{B|-;r>rkiA{YK8k+9c3)T-Xa8XSKbY@@Tn2S0BYe;KHTpg_zdfxN zPJQBRLE=*M09qTP{(qqmApb8KqW-@V^W8)u`0?irB+S3})-2=AY8sc^Kj1p?UBh*k zZ{gyVJ)Llo!#8c}qTg2Ga5UNb2UYl^3`Hj)N|n`-73uiyzC!8s6x{zzzIS~~@pL}C zrJwH_9gp_&$q?V;-&Ot0^vMw4jaudfpA7MR_CnRq2SO(CUdBNJx;>FVQz6A6!(wpO z=zsNZb&ED$8%0#^d(=H4?Jt+XXp|8?+nDuG7W-@Q*&971<8yo#K8Gs%TW8r{uCx8+ zdJLap^CMi>Uy&wPMTXChttNBm2p`!hoHkIPYvR)ygKpo;Rfpl5=cGgT3Z%u@B;58rxIXQi72mwu*naSwEnISI~wU4i*1Jgve>|DGqsC(Crq@UTyY zCc)zQs-K^HGBgQVy{Tl@`($VmJh(u~Y>((8GrwiWCsoLqF=rF6is4rq=@Kn_)|D}` zn)O00dw5*Gn)PoHyYUz{L%;s`r0_B3y9bv+9?A&cxy2_I-!D9xl<)p*|EUi*{w|gF ze=vGgd=KF|@jaC5+4x@9FP86*(G(MZ&(c?gE6zyA_wC4I@%?}H3ZYludM{tc#h<}d zyK|sTSUFEI*H7%6xqT3qZ8hJ+Ne1h|7oOV>0hmlqsF?ZNkJWfKqw#oRTfrn*>v}Ca zZ%_=ALKgYiEyG?~cB{cLvVuv9#VfV!4cTNV7VoZQkBS?E==VS|hI+(te6MeTELgu1 z7LH@_h&?Z=W!{Uq4DwM%cz@2=^A_^I?>xew>-=w-mH#cKzcwP+?vauI?In5F7m_f? zJDs--RAIWv%eKgly-iz3tQ@peJ*$(d}ANTd&OcR}=HRmten^2uvs?ej1&({u6 zSA`$-O*a*8LLQCP^Z4a)Q(+q&LN9`o&YTM8%u!R}R5*P9RM;?A$qW)QSwiggFOCrB z5ed7`1QJ}GpY^+otM4+_}AOFyVF)v*fgS(g-y+zP75Yqg;Z@e^%EKQ^D z5YMsf9LU-TTkm}wI*IwM;xZ^l8R7SfocX=uAswjm{sjl|ynnGU%X%`Gc)b{%D}GD3 zPW+Z~-Q`!VCyC!<&Q!Q%#Or%oO-{VN5s`RIygvDS)nT~PDe3rqZHdy&mzTuxd!mlD zJHkn4^7~MuVsjkY6;?W&AyaI$VB7p>%Q{F+0xhx+_u6n)#9)-4K$mLe;c_* z2JYVjeQ*l<&c0*IuuRK#yVxfy^CD#9M{3#ov&oW;FV(XBXbj{d?H8+J+8sHsq-({t z!pbi|v?sn_F@E&rVaVH)gx~kK?0%jfOIC?oSDalF3jzD*I&)S_24KPGdX=0_dZ z-T6@rqom^XJx*6RXTj%W}tK*seTK3?JVq|qZQ=?^{&L&H& zpRHxDj2nZFXPS^J;_uVGwjV65r0r6W2~)J=SpJRfr5|0&H#eVX|6I5gSk6GV6_ zl{iR8wPD}m(&BCI_zeh; zzSoRneK&I%EJPX6cij0z|NekAe|w`R=({4S?_wR#^$@kl`G8#J@0xqe{9Vg+(swi0 zz4|W3&49kIhPz=UX3XES&=ljZj?h%S>FeoAE)nS&njJZ7MUdP{9VzY zWX?jg;@4->-K@`$%b*cuM4zeW?^N`ZZ2so*d|w5PkLPcHu9H41xo-3+LUO4$Ie({| z=;+hT-?3JcbKc`z*kk#8A3eldg?{DKZj1bitPbmwPSt-zYK~R?*NQk*e^;;6*b|P} zuj&ojoDV{9p{6!YvJJq_+qeI^4LVh?KdY39V?DX)d|7@qb5Ou#(0rG}f%|-4i}QH^ zdiee4a{-M@+HbD2{pPySKR+*E`{OCcD|Kbe=dozwKl1ZJgN>30>8rx=CFzuWC}K-i z^7;MZl$GXLia+|Erd(Mv2XVE{E zu5J)pP+t37@|=>HDN;x+`(uy3D{g0fS8^E?qm0<^Wd7KSzgFFrRNuMS?^^V#;_1m; zCwjFOoqb~U3fVd%chXTLQJWWUSDG6xl021O_%93-~iQ^#xy`(1%vmHzv4 zo&7i0js7$3_sU}&{g=c1@$=aW&=eDoP19F}iw{qy$;^}d!KId_z>c`%QQ}sY?{+Gk~+p3o5S1NB|JrCwGC`B33v-`ZgKi;zJ zb#L^L%s=O1uh)z+`d!O)(r+`@z512@`9Qc=r9{%NvDbTBswe%L{hWStDuB9cmIA14nE$w+fPrXlR%?L~XTxb1r-RM8_eM$$y zr^e~uLc`Vn5#}nhRU&R|xER#LyiaMEjs?T-i_)Pn5!o)D`Y)dnhsODjDKzTDrk>Zz zU#>mD3bCmdb>%lLv|PFKJ|&F^?CLh7Z)QHKxeO{%M)(+!)A=^r{@=7o>_2+d_Mhu) z|G94X@YsL2;|L$dpKoQMg3IAS?UX^~QbDi|t z!1W>y#rOY!9s=c?kNqBD?!yD&gQYsoIxw9&Hk+Z;QF)qQ9bLj#wYlz!?RVVjnfP#8 z6}Rs)5>@&h+ce+6_q!FwjqepK!@ncKQBfnKKX zaeaAl`l!2}^-<4dFdAh%n`!huNBj>{c?f=3f4oIh}FOdvlOLbz5yTb3kJgQXHPCO0~bw%A4Sgxq7 za9(kNc&VQ?dBi-~rWL-YumgEq22Fo=^z?Jg^UnVHWBH>#=n49&K+Iw7?-Wxo(kRX! ziCQGzpNqX}MdRc7)0XR`uRN~9UWrH3z4mI=H+Bxv^KJ!}-3KaTye%jLZ+$UhO0J>w8-1n02QP7}F=O^p0!u#Z9Cqbou!U^nm+a zjK5g-yG#hsewt{A-tWl*SZIhuM0`lX93P5hm*AqB#wGK2T&Me8!*w%1Am1uHWxsUy z^(X9h@O>S8GVLnAir%D+FD6d&@p)oA1zZNr!<_qdm19r-j2<%Ym&NDQp-K6azeh}c zxaUEuVQa+rD$uL)r~SE3_p6fY=6cGdOvv`Vj8v|8Tso4y__bqUY>>~`Ic!n zUYe{s3}@_;&?4VfGo2sW@Q{*OO){P%5#ope{UWj0 z58=-|nm*I>7-5AtRP?%*+XZr%XwMpGs!%0vnyz7PLN0?wl#zKB_j|;CeysRlDtb!h zj~>k8kE#?uG(Mhh{khKkaNWy~^heLTkeK!OSU4et7Exl>)Myki0cUX~y7xg}d9yC7Y zr5D$Umm;nkUU>a3^gKiIGRlI27GZ{$v)~^UFHXLFKZN?KNpF}EI^p7jv?&tSZAK0L z$D-j*`m@4)_ezJ-(x((k-H(k!>BaO1jrOUOs>Q7s#blg^)>=Rq5k2HFZ zGOC`Wg*qNXQOErzmFh=CtmA>|XkhEG3(3CRwF)-_+zp0!)KoEdL$74+s<;fwQAW6P zpEvd~2MQH@s!~x4?pmcq_*(;e7Dda8C*G~-u3MV6C`WLE19oJCR-2`BEiJUKOCQFE1%C3=UvWv@4#gcUgqfiIVXSUw-;7C zvlKlfi)V7$|EF=u^#j*Q-!)wK>RbA!m0EKd`@u8eL*n-TP0%v;PwDi1=~Q*^XCD=( z@4UN|EeF-7vlE+Th#Ze zOOon)a+Y{xw4C3y=vDcL$y_IW*KytG+wu=m-|L`M6#tL6GY{};`v3o=ZSs)`T}GCM zM#@q{iwS9vOt$hVUnAR4`V1e^N2$p=G-$F7l96o?CR;(&XJ@>xfug7aSuXFEx`;!$Euedgm35wOXDVdcdlPn&r zKvjv)*$wARj0c>!TT`u zd{<*WDC{*{IF+>MexAaStgpe`dR@>4^tB;f`&@p(w$N84W>xk%h5H=8xt~m5`yt(u znLCsp{QWZwNh9pIM?8JK@u1SzUPnafYvRpHUlYVuZBl)W*Ymw|xINVf=wjxjlv{5w+5j((`XfC* z=g#-7c>cn<>H3>g*7Kt=tBMa}xlg>5a^LX6`J3%;T3S$q{LM-Pg^2v^RSYRU+Q)<9 zmMR6ss-96$bh%C`{4eojs1u4@?RYxiwlimV(VH6C`kbS1PFwT5p3gsr^-j8`+HKr9 zp1$v&s`UNyp;7wIzgFpc$Csk?-BUY?1B6V|>vkx-h zDPNzcjd%j?`*Ip+4t5#>y@Gn=q;SDcR?IWy8ql6 zGo+XQZNwGf2-10Y|9J(*M18gK45P2r+~@esee3ys(n$fX68Ce7%_0BtY^9Wh{pS-9 zewFFcQrpV^!b9TD0p1U4k0H4Lp#7j~j7Y7w(dY8_&WZ=XqB|7;-*KSOtL@ck=aGeUky`bu#P4Iv0CpKk^40Dg#4$`;qefK-F{$Pw0MP^?smg zx-MSdPv<`ISHt}jl+3+CCRjDxb$Vje zusl~-pJGk!Rz84IwJIFWKTupx6t-g^$=7`^$vIwna>&t(%5%$b61?}MnSTsT{Zei< z{(z)*IF1U^D*VazT1!- zDE;S(e=>iK+S3Gd2E3VutkMcPjOp9J(&{pSj#8{kfH$(MN{)E=?AlnBOI9BBG`$s|c@)!lsn3++K%^j~~ZYP;! zkUfLaJD>A|&dI#p4O;Fg$VK?A>cPxS4Yyty+5k6E^&7YUvesuKF_R3#*8Q3!5OF`y z_niMZiJ+5C;5LiEvT^GQYbu6pFts;PvFz zoS@adA83XNvU|6Tht{G=O3mNrMxk~7e-t*^&qSeh&gDv`r;rH-+2`(0G05iQYE+Ot zi>@cix9zB}yQh>hKe?Wm_Z6SQ{FQL)6`&39cOddU*YAJ2`LouGkDt6P{8uq%Rq=BK z_lds}?i>CR{nw^{gdj8Vb1`CEfIs8EW@1Q|io*VDiayGpyInlU&bv`TcGJF5ko`GI z0W=GD_5=eJGJM|uy-dk0A(>?U>j#vT*njOp=Zperp_cn@pGg1Jcp~%TbL-Wk4e%4& ze?5+w((_-dllU)nKVvanAN#Kn+-H8cZ}>^{Uvsp&6a3d?gs%WU#(!OE4G} zKLtsaoqvhtgG{;x>T~($WW+30K{-)qJ#w+arU>^SxzT!Xw2~PsWayQljkr?l zZbWsb3HvtsF(5UUTq8_CX-m1U2Rgc=W_1~66$sqA;GFEsvYBln57&D=M?-vgd+Kh7eD@-4Go?SPmT z!Q0jr0xH25L1zD6ajs6_{5F5h+IsV`?M@ngK~5p>WXYcu8#sS;%afX4kX_L*@yq=A zeyhTpXUpFf`%$RoIaIt@H6QI21=YzHDPWr8MkfVAaKCJz_Gul3OgyM^aWM+2LR^kb zN>)eS?__icGG)bZ3&khe&iy;B3e=mll>!SKb9sVd?*KGh$b|3vc z9%Uz@WX6>JXOAe#zW$e@?14w4DEsQ)N@gy}B#Vk4U8BzVX9u@`DyFAGW@@<)rCgBk z(9*F?i$5MEF1}U7ar()}Q?>Ybhy!SS>y>=&e{_H5xs+RPFxmjmpWr>np?s~0dR<>k zAst_O^}4H=XXkpMSn|C7Si|#1?z8{newb(B`cUs^jmAGNjGyKI5EBDDn|Ql*>nuGK zS}!cqWG2+>Cg^x8V|y*GV4gtRe-;x;)PjBm+d~1q4OPGHWswc*3cT;;PXj#-8UMcS4>J_5|5-zHR5fO0|2`K( z5&r#Iqz;n**Ehw3{@)W6Ja>3e(6>Hc0sXRgw$E7_Y(7%Sd`vRQ{QIw{hcmEy(K(}5 zJxjFQruJ+A!E=ZFd$kr{6eTXcRYmlFwD>&`4-!pv?8>8<=PGW!(P#raJN$cUJnxE` z;O2`{f8HXM{lKMt4bRKCPdu;Segx0tST6|UXY!T9e^ZP}cWij>7#=eDN(&6JJV88{ zzW55dRr{MQYC?a<4e_9T0kvud=+m8}p#A5$3dqd+qM$uxxRS{wnPku&qt97F=Zu23 zgO)3ha!H~64kao6C_6zsNTKwrnMX2*?YQ;)BSIWn_3S3{i_dUqto$OC{lH4PE?&=1 z;Xd(K#r-gUGQXgFd5vZwVLd&@p37n% z8hjx>o>rq=dN?GR!wQmXGKn~prq)Ts5F8bxw+!Da`O!&znBPiny%MwmKbrP_;PU)! z;Xf-etI7waaG&|*ewg0^d_1)uxSs|`LTdcyZyQ7W8vpr)H5AGR7GOw1Di(RR|D2(Z z^56X-9;D+?D`#cj-!=-;orfs^8^n{g&Y-{JIZ9?V$t3fi+v#(5p>sz0&y}cg@wH`0 zx!}1&LH{W&{@xB@0;T_K=*|2s<<_e~8{p6KpGo4kRiB!Q8KfIcaX;rEBy~8#xjt)$ zF;Q<9pRTYw_^v24$DFBT1`3&YRjpHSG0J^jw!PbZ zR+r(c7WKG&^pzhkMH9fShA7fcx)JE-OVkI=hIr6*7LeZ@+>^O2;?~PU8{qc4wAND= zzsq~1%Wo?6{7THK{U`U?e{$c{S4G%mg4Fv7*8CKL)bKlRU1-Sg`;avh;&(wP{}lMj zAb+7g%D>Hz2WfBA>KW3rGNT}Uf2aa*5^fO+qM#}T?-nVU=|UzRq%%-iQ;@#Xx(P_H zf-qnCBM`NzGxhuxhcI`I+z&!Wf8?ysR>}SE#yrE@YVH$n zKKBi8B7#cZ3eXk52ca2|e>d@ZSa`_9>wXxrpI;Em9SK#gKFaU2HXc-8UZ_;lx|IVe z+FN|!{}eD|ZWB;B0&WiAqPtx0(DS|6lBoznDBn}iP57=0wCv4Mvc;H}-f7TB%bp8a zAoLo(26+b~`K_Yv%ug}5UOw6YKf_bn53=}K+ihF$Q;k`bznac{;-`lD$@uAo#EUhb zz)y$pkl|bLlS~9sNX}%Pp01!E=Y!3s-9KhanF7#FG)h`>(4GVE(GP^-9qO{8wu01c<6roBGO@AE}G$i76CnHAo8s{t&)1aF<%XZmkbr z*e_k)Qn~+TG-g%#)>!TnZ>8Kfym7v6^S00;hk~NvZ5m>lf{KO=Z`Wcd;{KcICf}-9 z84s#MQ2b)moc@~w7=r4Z0Sc;#*E?hgsy9ziG7kxvcu-A0+d$Q@B}j_8|0W}sImzVK zYwQ%_B=-F`129v1@hz46Z!+lmIKOJaec~mP`w{sS?I+wFhQh?Rix8dyyqNrIPrx33V9Z6Zkvo%kVp`h)3C5sADl@KmF<;h$#D4e?`z1)?11;;P+zh&yK@P>G7P(dLfUlk9qFNed0Nv`w=_~ru>DUhoCh) zPeV+M;Q89{kl}d*hGZ%iUM~#PNBN^Zj0f$mXDHPjxyb<}LHqpC3doYH9Wn&%v&Si! za*{~~?IWnAF)j@o#e7lFUZLfxrCd^IPt@Z7fjBZhi^Be#_m%9;9FFGJD?}UMFtzo9 z6@PnUhV=5iRQ4Cv?`7ieM(z`To4Ft6FCXBk`(2LHOeExc9S}YP{F(T>^%J*`0 zQYR;@!r9oLzKNr3e_AVi0^d6D$|q_<|AY7Ap?M`LXpG6jKRd7^G5@a9~~ z?sBY>`9{dZi`qY)W}^1abUBIC>Qrz(g!#(9{z+U_qA^rgi?2%VFWjlc>mVKkm-iRe z?;-ssx872;0d8aOFO0)X>G7M&dL@spPx?>pv;XA2$sZHfD>qmqhVsW@A1S6JiH6^P z)=-Gw5vzj!Q{XEhZKIF!yDg0e>GB~;)qkvW07#HtcBBHZOQ}PK{O70wCDUKX#DjDo zE=H|aE}_dw0_mRm%8!AlO`TbU+N}H@wjj$K;=1U`TqtaD8}zKFa_2op?}PhvFOi zk0*YJ0;ca#3YcAR8kX}&~%R9paAst>o+vIj=V7DJW_e;*H4 z*SYn3LP)=zL*{*(cV&JucB9r?f&UNiW9={0b%R2}@8&S?M>rXW!cn!;uQ|vNy{Y`Z zcIs1oW&IK1-_vNp`%^jkK$?PoPs7J4#eRMUU6)+HaG&_eV1^8 zm{r;HZ0?gj>bP(0S=@jt@1rO{SJb=S6P79dp71`(4j7W2zu)3`s`?sbC05nd-?~+W z-~TyWsp`V9LdIcj+A{Ca^Bs)&ptc3La8et+-==OC)>l2ZUKQGazBYvR=iK_T^3@wL zLwfOkPu5qpwx3Eiyv*0K%GK{R70`9D{q*NP>8p_YPJM}_75chi$t?AIP2@=jFXUoN?#kaY0VYSgQ^!u3F~g8i?L0si>;%qj{VuL2Jg&zD&p45 zLmSZ3?-9=fH>t1XJEg0y5lQqVT$b>6m6%o8*A(uPzN)xy^d(dx?Mv$GL&P-JkNn*& zp)lSLdlHGhe6n2F-&~QNNmUNgQPy9uD4r@WM)8eJZ@aIfRN3V)j8v?{OHY2p&1Run zF;DDvHmvc#Irt8;b|RgIevX7#q_v~6m=7qw%(7jx_7 zqYdbNR!a6szHlo2KE&f$+rpm~V^*c_5!@$zmvGcMNGlscrBQtIxPvOa<#5_d;ve|o&0@3Ykoe_FC5>uWT(ULo3mzEbn2 zmcD*zyDjupi&>SvW^-PEa^mQ1@a;&d+zKqh>hC`IT=HiyK6yl%Ok@kaw{~_Zaw_YCF zfS#h_UnZbU%r7l{E#E#}eQm^)(6BRKS%EQ%f0$L-*A(t^{NsLDU$j{u_4U}>k^1`0 zbpE8U3A1JGWOEYhV`(NTdxLfKo6ZlzsHy7{QfQfwku}9w^@vw z&$@rQfRe#_=kG-hg$3gXnj@Uw=VMHK|4TE?_rHw$^!=~kzWM%Ji0h+lo_^{U{_V7d z$|&UDiy*@J$Km0j(PBu1G`}N;j~^1HqgPiya?K+akl|GC4;kXK~+KOCs6 z?5+}r3>ASc?51R9LI&P&5w2Y>;%NO=)0*{L%dIyFZ9u=Thw=@#el7bNhZ)lIhhtg4 zPWvj7`pu*3lJ!6ClYaBL@6@lfugejcRDMZWq;QC=-(l7eY0=dGu6-9)X(g*=I7o)N zTz!;3@TGYA{RvfO*6%%^I&??+ZF_*y-K>!g8PadXK}u$ckWniQ@i80eg6)+?p+o%XLDrGG@aDE(VQ^bncR ze|Ib@)KTHzzeCnT+ZEDZR2ekd=n4I9^Wvegystvzs+A746BO!Xd-;UyaXf zAtTYi+Jk=o?o|6ngG&|_6pQ7Eb`GXq+t6J4e{Q`Rv;jUQro@Ns|1rZh@c-Lc{-68o z|G97YaQJ^jR;6j;#`6Ex5T(SH|Hn|2|JO(PUF+gO@ZJ#$g7GUH3TFSmpMu~n+@Tg+ z!JwYX{=bWonF$$N#j>7S(@gq*ZoNrp1Nu$h|6_*q>^~*{PuC^wpZje8+;{3%+5gKS z{aXG%JY?*@ABLp=r^rxdjC=$VY#9m$z7S8pKlM@iy+>qa;ax`d|G7$c^gL)-hW&qM zC9?##xhW&pdp+ufP@-a3F}TE`e}C&F%AeMA>ouSa=s$h`j~UX_e@gzJu1o5l`>cQN z8~r={|9_Rbq`$WGA0D#wZw-Z>FK%D2{l9*^Sn@CzRSVheHai{~%TaOS)ZnURQE2?U zk5YRTZbVDKhyB0CXSR?D`v3VSTK>Os64*8`C)7~@d3D={KbeoE+ta5Zai9G^_YEHo|36phO!8s*|L~CI|1l)1A_@7wKFaUKWlg5a*R95U?x_f;}8A>*+Bn%`N!wcL7>&<6CIn*X=rdvDC}_v?54Z$`fxxlj7t z%>A%_?fTW_FB<*Q-;I8Ug@=rO`(Y?Tzq$G-e_(Aq{r-fCmdyW`I&=s9HurDcL+S3W zVGbGg|2ax#31pz(1CcM=>$`?6(tf%1YS6~eueH9LiW$=L@2SN1!E{}0zeBlC`YqzV zQ@=94-#sU!U*q4eu!chGyN84m=k*;yVa50U`Y8XxXXEL2r$d!~Uwqf0JJRnnyDQzz zDssq>erN2hWY!6prq_32{bz1w{kP-R^M4KLKOEl&Ar>U9pH0OK>FK|JlJ#8|xxO1r z*CqAOebztsjs8W3F8#F9|14+{)8NmfW1)T-gXf|ABD)Vg9Z!?T=P6Bo7HO%?+bb>Y zPW!X2$Dh8~Q^_1BWRxbwbvM!l+beakCpZ^>B}>L)tQ>vb7tH^K^;y8JmyI@H&mWle zSe;9k*8LBgNRjRIHf#oO!?wXsKKw=fi2EO;K6CVeGzH)Pp!Au6$yGdV!F|$aCik8C z%)@6yJ#OK1L46kD&r*rsqTC|8OP-9U&+({;vFB~O1bPT()nu7Hc2>F?DE4o|GGv)q z+B;tk8GZYN(C2!(;MDZ#Z(x0{=hkaL8>LTrKZQ%Df%_+3zzpfdU+JGIhKK8`s{S^b zu8Zw+EcZ#DrQCPwvjE=%^toxKUMY)j$KLN-i6N=atu^uV`2;Fptk1shICMq&9Ntdp zbHZqc4C%9<_QsEqOvF7FbeB>mea;zgi}@1oi7U<#cS(JR3N2sTsgSd6TJLjo`I+^f z$E}x%HlY8s{qrwBrR$$(LoFbtTHA9aI|6Y(Mis_HeZ3a5Dtn&IebRp&_l^EJq}uhj zP0uJLC+zPpMtU5vzkjJovQ|GH4~<(;0pqWK-?toUCo~FoRA`(t${|B&zIz;v59*Ch?t+cntK2)Uo1`(#mtM4tY zTemIzM;>NX{Pg5L@srPe!;cl;rT>`ol+MJ%{$m=3r2lwzdOS$}g$fye-+wkZ03b*@ z?VteYbFo8)Ala&OfD1?_ng93-=p+7M{{_J3-FrKl~qL{NUDWKpW71YW{>Mr8b$h9RZ@M`G$96*Q^;MGoDv z{|a5h&NlYl9wort&WG%p8D&5et`oMLTN>7h0>4z za>x)$vvs=Cp#(C)c=J)~CgKedc3meEZ(7pDBxCGYNHaGxUe_08|E>V;&OUlk|J;Hd z1!Z@mrljs?tAM=IFI9fSoKb>xWN3ipY(D()xq zPu^pZ@#!}NB?(o>2jfBY21>oGo3mfjx-qZTAgCs`#0cG_c<%)c8G`Cuo#-qinFt<; zo@4bn-<&Vzi;yM%)LP44l1!HT)0wDN@n<;|vQBQYzh-W7xb-%#4RK@nC*tK~n0#Wr zqLy3{-T&AbGr>*O<1g0zCQF3?`6n@uwbSvL1zA(yXtTK-Id6No6dch=BI5TCNtoBS zo27qhr0Zh;w3_?Gi_iVAe-bqb<)79dQZW>=U_qM>m^Z`U9_1$a`?%!R%J4_Y&rE%k zzwEwvC|!kuF@OEXyz0QDr?{zPMGJ+}=Xk0-Vd;B>kSW(b>^I0{y)di0aOiv=?8LRL z{jq`ZnEu(rPqKinOU6&`bNu9f1fODa#6J$MmFFCLzbobg$anuP9o4e6{Q{&waGKuKU4U9L5?yy$s zl%vITFV5;_P#4He*5kFVOCof~X_=>8GKB6bZBdi3jib>OKBAGnXS>)WZu7CwEg)_S zRx!7Q+w zgY;4U*s1X#-Lr#&bk$r3fQJbpO1EaoP<@T7=uiGNSA#qaGEGAGVRHrHcMwm6u%%}D zz%v||MG*d^=h)vR1N&<2pRHH8kGfFL(Rb3pL(fK&DA_J2b;Yl(^>M(fmYoPtfC|F`jTr zLbtb;x!5H`=svQOI*;#?A#|_NR+oD^q!qd;`B<|*v*J_cw~wV{SJ>a{; zxvSZqc?O39+>E{=Qx$3GdXbRI=Tmd&ul4wAJJAc|uR}!;!h@~)K$?Q{*L;kLdTudY z7v~2fxKI3+a3B22O*XM9!*Lw>tN1ef{i;ABrcwKC*8a>1k1DkN?svo^@gsN{Ch?i) z94d#Zn)|~wWoO`K$-+8uG4=Sb@aC(tWy^4cFG&QU!M69>$4rVp1(Y#PkX=IrAyhG_N2KJEAL&1CxFvEw;vx)5NN&F&9wdjM(#qd=-zOaa5F{JE zR{%^n*&#!aEZL-F9wV7#{$p0AI_HcT$ym5j%bf~2r~jyXm-S!ItyhIMp#RkThZR2t zV21ScpUQrD23?obKlfSx+)t|i$&vBnA`B`0PmHO5lp>}6YaF^|{eP=;JK;o!4C`O# z43Cjag#KwiY8FbQe9jq9u>ONNhJ0TG?MIE*vL`2#rTwV4P_5#54}q+cmq~9kFO}SS zC1?Y@So=|Ru2^I8$Fp&$3^eKezHch~=UCkt5BW zB!*~%Xat5>KH>Li2kN8zQCGzSaMui_;Hw^T!`0khr2*XBhZK7jz9v~_a?sCi|!%&L#sEb*@)wCoQg=n!>%Hn$RV5#3qx<1zL6z-FL ztGMsfudGLXi0~26uW)Jneul+b9a6uv6-`y>hpeN_Rtf2M0kYhP=kqVrNBOs15l_Fp z|H_gEeE$Pc`rU4gaxmHXkWs}eadnOOFY&S51pN;Lt1^*<$v z{!5kqF{_FPQ@GFi=f2T@D|~*bOr`&8qxG-Vm8gH~sL=DdW6RBi`T<>jzx3{?n#{9Y zOf6}Hewz9eJ)u9QG#(mzV26x-`*rt4q4D)9g~p$~3>pY8;K*(UwN3-icQN z8~rExhdEb9>p!ey6CbX%jtcAF8Y0&r0AT;nr%d|?@*I|b_*{Dxf5_N)X#9@C7^89C zJyB@9@wr0dvqKCT(m!t`)%aJuyv5B&<}1ucJ8nJyls}wn9Yq_V!pzt| z^v4kU6N1A2{q3&$DF2kp;z95W3SSJtS$9W4@Y<&ef)(A}`QiHivR*fH>n%kau>17# zLrcHoFw@_!-#ofLng4U2^qbH9Wcr;mK2pC=YIR8eZ}fYubrh-I=ywE$gT!|Gz6rzpGX%{cb+kt>1R@Sijladh4-%NlCvQ@QISH@1|m=^z?f_ zzCRq{T;G*pOsww))Ag}_hjO3vTg3fv{iy&~iTV@W5B1^YM!%#fW54slLq@+3VTjj* zWVASq-o>6`lsIElJSCp`vr^*Mw>Xs8Tig%#@^Yob;cXl;SiyJnKVG3^E_KOJHKNzY zO6K1#8Qj3s+}}sb{L3XnWw5Jt_QWVz z@veW|y4cKbqh)VTCVQlieP_M8h7FS=u0i}RKwlv{U(243c@gb~LEZL!IgKx{z4+XE z^=Je3a%IHtrMvB=)~uJ;VkXdEkH1*!<)yS3uE%0n37y^%4FO$8LU{J<8Ysf5$g^)iJsgi9kR?<5H>5QzpP55^_ zd)WuoGUn;U3WqI_z1;eN;=G5rYxMav)e$w+C=8_?M zIr$THt}#M}-U-@>ugWguR&XNDCFRh|y~&WWf6UUw-TNm+U@TrHO{TQ+2lX{&M9B)| z$&}vJvLhfHMBdzQSTdWrAI+^-h&I6eEO4LIu?(Lpqt3;;*`N4xmIj^oC)f!1_b`(2 zzAOpv;#(EG*J5&&|Ig+=@m|OM2;N1q=g+xR;b|}O#7fYgW(}Dl0P%jQhMG4p=2DVR z^`Z8Z--!u0zpF)0@_)vE)VcgoCGkvQS8RT=DLj3n19LKk>z69@x`-REou=^M`%0## zONLD0H!YLrk|9%At7Q&y$&e`=qr+5*kO}Uf+^}^rE-}1gU!tyh{*Pn`S>G8$xa)?d z4B=9A(3R#LN6SV9@G%vl0#WrZf6Y(TtF`i^>=KmYg18;pP zw+sN_<@|r(5ZlhcZQIP}*uL6v>-n`I`#RRx7uDBYHWsL_?}{1z{`_m{Ok-cmxKH-A zg8O0nD!?aJ`PXR|E9Rwrnf&W;Yls#}CjaV)Av>N}`B!@+UDBSqUJ%cS-ov&Z^YO2V z4g(=0>ido|kgvr3z)mANV~LVk=aL~KnxkdDbIFhqJ*;KEcFB+t{kcq?s}r^WB6BLT zmM_27pYQr4vJ^BP)3R?}7a^-{r9#VQMa`>iy%SBNZ9u3UiT`unyrwcH5sH&nRBPt^ymyKg%3OK?zjJ+X}+J#N!%aqaffH zXqn$!G6a0BmifgcL%{E#Bg>)UX5FYo1dO$rzkap4_HoxnK%4{E@SsUEf3}ugc@4`3 zAJoI`9tA?~el53e)SLo#GPq(bdn4ww0X7ez3x8krBy(KNtyhXRz_IoGMiPHtX80Y6 z8Q||L@fU0TKmrl>e{V!;f+MQ+`av9<#rth5FedV;9J(%EKjdxUCC#1G9ezhY$}p}o{(Mnlhy$L}B5`e1(VygG{Cnl}}{M~NFuo&2^~ ztYi*%$q>Km^*p^@GQ{sm+NobAWYS&$5ZJrnL#ewv?z^ffv_Jk*eFa;u3}Pt#Xi*LG zSIn)Kk2b(xr_g?mJKv}^{B_0*>8)QcPLj_Lmic_+6UKk8=05S~b3e?VKuqNuYlesT zGwavI)=(&)e+d3l-ikykTWkH={}MH!KliM7Xr6}+8JUk>5rt;kHxzb{iW^*=XkMsg z9&*VLnx|=*`&=@F=5yNpek5dq3HiniO(f(5<~3g!Ft?)*6;b3NpIZQF{sKl$Nal09 zXt`&lT=0t!zFGO)?@^HAId_(_@;&pzKm!$T%zNgmA7k!oxb@1=2DpDJt@;hce);=X z)3-(bP>fks{xE|3#D59*!~7R8|Kxwy6f0a4@`uG3l9g$(h_&;FnffSy*%|R5zv?rs zkJ2c}yDU(Uzak#eaYA0MW#+kL2=dWd<^`7wLH@S((La++1fN86Ep|khrQYM4aC`S0V86Tj{77b|}t z0e;@7AY6a^p8a=@n1k|PajeWAmP-F!j9E3m+-H8dALdsq36=le@0<|7v?!!{%=Y0S zu`1;KwsmI41hl^LoBG0~gmi0~* zard)Ghp*ORkB&)VB1nf@`^~iMO-432XF=h6KZe}H7#2NSy-{jmMX z{E6zJj}24iBIAe2pC(&FWMyUep4k3oq7uVKCf|x75-8s9o`NB1nzSEUixFv$1CdY3 z?m0u^nP#hx6chLVC(1N0`>!$uQBQZ9=7U1$4ndYId zt9goqOp=vB){7IxxK<}SkPv73eDQGY#epFcuTIEtIR5oIRLMzqI(D5VuW>elNJ;0k*59+=?~F$*WT-dIbaZr?h^Zv#r)ZhJaK%glDkkUe#n zr{<}3$&fwWsAb-E$&fv*(qT0d+XSKI%zj@tv7G7WKaWb2vXtE<@QX zg~Av0^e1Eb1bZ#2lKCgMUOw7@y>9qJ?*}HSUs?HQ=li!s{@G~R>uSqheYd^Z`R8K@ zL@JUYn(``1?tfcD=B6$oVax{f((^r=W3abE*Ub)8(vWJ?BS9jqx?zB9OjZCqdfT~HP0B5iOfHHqE5yiZr+7S zZ12x^l~^Y!7W|ANPvz1;YyUbe+uFzmphp>j^UoKw=#kN)()O;2 z){hIQI4ttdJkbl}pYncOs)2;}Kh*vD)tFVq%jw*wcv-`Jb3dL)BiU}$@1^$or!p7$ zcVV1te;qI+jZ9mnOdq$Ns*dv84~%DIFQF*L8oP72!^mJjt^F>~DX33DViN=q@Dcb! z=PH?b;#Lx@r-E;uQVXh+^!fIs^EnKp0CUnKU^!a$m-C5`H}Iu!jjLPW_dD)nP71j7 zve5=O3Ez*~Bp-|J*cN=0VOGUQIroW=N!$mDACF@OWY1~%kFl^_9O3jIMHmy;S4`K%`%fdd&+Aw2 zTlu!gg9#1Pk7)h6>13tp1pl$p8qy9#u3t|yN6`?KmV|fmr(j5W9m=<>@kfbLg`UuV zuzx(N1~e$D_7ty;4HJWhI$QhCKdp#aA@1x6%fK^r^#6KB$+SQUmmovr&C}sON9?V- zc2tGO=_M9!55A$UYXrUWHiAB?o}RB|8}P?oN-sW3E{6A`~H(kEb+|PE&Z3KRf zF2l65>NnJ<`e}yvYao6~{%L^X=X&ubJ+9v<{&O(7@{hUPC;q!|AN)(W3-Q4iM$P{T z3fH;C7^KK4aa~D6gmV5@eWv9ldkJ-Yk9GdVCtXgNyIQ{GVU! z7pTVYZEeb=PQ<2#T8w3#8DS{G0LiG@LYj#lGt4ck41nzFFVvJ+d>O=T1F-Xh6*n{g zjof;5Xao5{>ii!(nfR}#Oi|p1Tq}CAez{cVk2D_O|7ls%i-)`XO~)%HrHPpOs$&hJ0 z^sJI;iBvOGLOEu6VhN=@car$9(iUaVxDfjiitvN+w&282Am|oldg0;^gft_2hj=Bb zD;(*tk)>rnl(O!y@lm~+voFax$|HS_UR0i2hKr}0G#B9jag$~>{(vIMJvb_8Jhc8Q zzKQLogj=rwZNP5+oml@*ZT&U!#%+;5Y|hrV&}26Ih);o%4#iu3WmVWcky+T6WUVrVOE#mVH~wx((r7 z>_hPP(lcUC6+S3`dR2?x4RPB70?&i5m?+~1w_Y9EfE`%zBSro(Lwf6n@8NHw)(=ZD zM(Z28E_weN_nCk0NAOR$&Osuh_$SEC`f_qVL9+NGL2utbaVdtR=bw@vkK`j!Fk_AF zJj6jVQJVdTB5-fyO$j6urORrR%;91S*yUDp;D+gSF?HDW;&Wc}&j|8_Y!BhCuhO!s zqF%`;=tqIDnP04BJ4el{EhSgWPR6_;^!jt&UVNSOzubBSXan3GnE1Ymx^_@hxb|i8 z_h+t;nZK`Q{+#)HgXFImlPmu_g8Rf@3HKxNcjB*?hAbg}-@Y$0ae<%A)I}06q3e$P zU3S~|j>q3is9P}$cMgu?uj(Pi)`Lh+-24sIDakys&q?-Dk1PGVv+Tlz(-YEbu<@ie zb7l-`3hE~y%^$igWNr9pf3l{GxvS;Yn}jyNU60WHk}l=~?*o0|8p5s;39@y+O_|P@ zM~hw{U(SWb;qR(RB=mlqOpFPCHyX1l-o|pDcq`?8*x%(t9fKKESjkL7E|)w$XX|r*enJFKIVwJXI!j&OF;TLby?QNsV=`H)1eR;rZwCflq`AMg zegbpXz^zw}Ho%=DKBvat0L+wLemI5wz)-f2MiL3V zKOkS)M=@QO+<)Od=dauk+lNRQRQ=%co`!T}!x?iaX%Ibsm^DQ9QHH;A{h<4y<|yIj zt>>wSBI~v7qZY%`mABCo`g40jpV4)j&J&R2kKb0x z1wY-bLwsLh4Tbm~)ZH8vsxRkih!g6|Z=#eS(GS;`chu+d zJ9UYN{#z(#vF;x}CJOz-Diw}ri_JqP`a|wiGH<$M2>n;J%o>*rp}&U?AJ@&njKOUE zl~)t9^>7WE*k6NYrE zcm+qG27L@&vaUhzf-~5rCEu?BZriRH&GyyEtyhOOU|+`?`${dpT6^iX$gip~tFo`@ z+$a00;eOb@3gF;W{OE;5huwQZe$~MmBKtD=)jGI;byTSSybMEj{HVssWc+yZV0D!L zd2T!-x)IejhUlz*TG{e>1g?g)_J6)b8A!I+fpi+tj<+kBa+eGl(G^;z+9g9qw0w%1 z=g8;9xsv5q^RO|**Iss1GDEpu%lUm-F8CR2Lm8=M50Y~_Wyw$u(6W^g^Qz!O`PCj; z{3nP9Ekx#5`IpG}!>yN%HeesAeEXwB%$B9Pdw7^e@xMG*^v&?X_Zi@NqB;|z#iy+QbuvStdiAU18pTU@`F)OM=t=ZOm?Yri zJ>#KwUA5B9>4!z3ckoRLt4GD{OitH$uaZ60xy$UtEV;j3(I<0b8g9KZ zv;nT)Lf&g!ZB|F*11aXeBeq3+ug0t@zE9^q=fB(!^IZTMReigc1#u|8Z;!|wQQuyd zqtN%;cZdh^OW06hJ>S_g3gVJ-1@Y%%m(L0DGA;9)ONJoM(>``8lDg#ay}iD!l|3T( z)A4=9{pvFu6(y@#eM!q+pG=lmEz`1V4-GnB1D)`{b>}mu_1t<@Xak(47T>Msqgufu z!vCi6eEtpyusFi`eExdne@7ZV7jU2bFZaWIiWF0=&+gWw$@Lj6!bBy+zrq?Kbg9TK zdj6oj6`wLIsK#Gq{ToB}`m7Ek(lvM06Z%K(7LV$+*pXqXUlK1o4--p|PW|&*MRlpz zFbvCZ{rfs4v)UyCzl!>|mdQXqm@p4zzst4Eo-P@(j-7QFC?%PQHC#V`%f0Huy_(0S z5q@-^>f^6zu`W_9cx~c_Ja}bP_*(k|wCoN>HvHTYKRR`#7CkyzR6aV@Ps={mJ;I2K zaS8P3{_Cg%vC1lpY~T{qvXCBGY@w%K32`JwV*!x5^;@nB8;7%9`rLZ;XajcnkHq-V zM1AsyVlvD!egF4p>;7+gB%kj8rtv`jy&47~@^5`03G@C`gS5|TOs?Yx_c?xWKWv{O z1%iF@{jbPjRDL9^(yG6&w1&t&%P`LM_n8P9>L`(*TlM#4`-O&T#Zi=t&Bc&3-Ee(! zls=a~ahG_ed*D5agJ#{LO!uBEm07-wbRvi~cp}rCb+wY|iaaerhD^8PHA?0@?#0N?aINkM@@o)`_okJ^sUQ_XHm850^OU>Hh7oU#Ci( ziw=q~Ct=a_bpHbEIcdh&f^{@HAI>$&wB z&<5|H|7zt zw~MTykiGRoI8*i(+7D>2Ehk|=U@qceguVThttRw$X&2Al{)=rc2IY$|QpNYl zNQn|`iR|szE0oM!mkin4OfB=FONQ+2DJ}DpONQ+2YaO~zMw%E}4NZO`aWxb+D7^m$ zwI*dvrCr&YoMH4z2=e#yWtSvIM~1ZZ4kf$L$Od8<_7*sd_SDn<7A-2n=w?0bIV9`2 zy&X^gm*_qHDqF}*Tril#5 zAB3L&Z-)yB--CJG7AwE)eAc$eZyPOpUTxX4@3v<9c4EDa9`|~#4uOgro;-RSn&Go{C1?4 zJ;=zq4f8%NdS0}sG|Y3g?84j#-=Oo`uWnVBJHyBZE+LTL=IW_`gSc&xraqE!2HRyO zw_an|E*<%8YW0ytL&!dh5q7QnOA06o*E`=2Fde3W{MNbuF$rTL-j-oj6>rPAPw{pV z_rvkF0LFy;mU2#SXJcs;Z-w!4{qMJ(%n;e{~)a01c(>pngkfP$jV-)m{B5Mi)ihPO;>|QPNs!N6p>~1adiA#nI>^&W&4@0Wx zEU$?4kdnzcH>+#Ea^DDYbt*YQ%YLy>5?NYQ|A`V0eKFN>`qVH$JG#E|Iu4cotd@Etk%D+Wjs^rjU5`sW`~?8Q(ASYGNmH1PZ*A8WJ;%uRx)E$AnyP?-NV z=BUv6Y%HusKKc;me|Mb)`nPQtlm8o)a(CD(lK+bplSN`5(#`)RN@lD}hWXbrl`a|P z|1vet_d+IkQ&!h$O)s!0$PB*00N#GjB!E-JVrNJ*;H7&cktM*VVz+^1&x(@OVP>(G ztxP7{&%Z+p{@Ot+!7kyTSQ=PnwZj2wnY9du*oJ05f1iCK+glE|-sTfR@y4o$q?Vs` z#teuae{+7;IMCSJYVMQ0`P>iNTLD6V%FixG4y7VTC_fu!4UxT>{H%K`VN~?!28A0d zKWmR68DIKreSYiB$F@6Z_ysxg7OPu#Scr3H44l8Zy51<8xMYkiuVv?xEj^+E-DbFstfG^#CHrlU)SjB1mXIl?7FMs>)g>Rk7b zOvD0+OvlsL{z-NcV<5x%7@G@h4E>VHlHr`KWjjU5YQwoh%buQ0wx3_51z*`M;$p?5 zl%IWCrY`mo$l4ZT)-@%^v%QSw)+ps_{o@ zKOeVHNBKYg9?z7fqTt4eUA(Kql)8zc({>{i-d&K`B$yIRpt*n4NF_7dC3C>UwORgR zEz=HJp=%kV7RvOJwBJ#m=SzFfBcSfbCl5YzubD8`-gZMlJ5O6YcT`pNaOx1 z`TTITE@WHx$EfFrtLeJ<{;TQSC!T7!@8l^TpB6lAvdAF+D;5Ks@2|9m2pU=nh@L+) zLy;k$EiMyB5l_pICD}YxVMOv&p(peo+!Bwc0oa^jrR~{1il^t#Q>?5&X5i-O$Kgt5 z1Tv@u8RF>*&1JoiNs`OUJSXrnANeZ2yHUKde${Q{EG9SA3dRvm-hAo5^60vlx1QW5-txI`c;nwsC$1!KH(2C^c)Q3N3h~zOujjS@ zqWs$M*1owxk$xpz04MhwTWb`BBej>Fe<3xHRPOR?JQV+n{RT$yj-8@V-2YsK*~wz3 zFPtTiYa6a{{n#Z#D6Z2oy^uPF((3DPYdWny#L7RL`5Cx$>n%3#wF^Q?_d_90wJj=O z9*ep4^3eu(+$AOdN3}iq`zQUjMLaFWtSX+4;6CwK!hOSIVm#gSrvgF7*&>0DAk$xI z4H1tf|D1_%sN!kp`GF}Ivi)B*rc(Y-Pv}3mF&=aSP^y#uFDnYV=g(5mtw7G?hVI96 zl*|a^Uc-$mSdd1wQ6``@_wUfw5NeUD9|?;@%1O3bR_ z!4&S3zN@%z^erlK(tf4B*FdStvy=Ure0bg_GZeaC{Py2~0y_iBLCOpYJx!)DDo3#{a0T1P24|8%9~XD37{d4ZPM9$B8-o(p=j9t*kka?l3!n4bT( z;_;$h>FP6;dPx~(Rr)OFKKpO(8+~$q7kK|S5-nxV;rD-QrLk7&1#NQw_a}2yD8HMH zA^FyDs^?c5Q=g$H^k4Zl9t9&uDGH8k>7an>CGY=JQLtIuJrOo_iu604rew;ImLAE-{7|VU)sg(Opo@9JjXpuoYnfUOeHAK*uddaox3{S%6@Ybp5`O^_PY@VtNPiN=} z{ZW2Ao_4)hDee31qIkM~uwtb~-1+0==@rdfPqD)pmLZ-_7^3E>6f*JZB^UfVP%r6? ztA-ELsF|cvtWWC>VczPw^{UVYcuTEbV)?IDnBnhVPt@lb|FwYo#9IUR4R0KeZ2xtd zMGiq#1U`6udcY5n@hA&JG9L9@8;_h%u`$8s{(Odm9P%AkC^B<|KC-Ug}Wc`c#q|bcrJM}63#|>IDGUyop zG3>j@^~ANmXnl@Y9Z#P-lqh|!`pcm!(&vg(l&((sk3)v6e8eCn^Q4ezdOcxmSL-{Y z8|yohTd(opkiOGfPgwRl05hd$zde!5;Rt6vARA+%9*{xT$NFx;ebRR(_apW<`TZ|Y zs>(kQFYWiwU11IBgp%`*LEo68Xvpl>^t6U(!fN3VL@MHU#e}l-MD@-({84&=9rd~V zPOIVp^wtFmpojl(z(J|WVJ9d!&PF1W;1ICy(%j#0qLP{6k|7WWoup(Ix?~8%PqfTF zVt+K@p?_=~_Be^(M5A129uqvfv_VTSblRVvRMkY zTRyDOFSiH)LcfYe{Ek0farXf7kOUdxx5q#w^NmY}_`O}rv_t}yFc0y&hqjgTgiPA$ z61_pR_xXWzsWp8vMzDkMqb~uK=h!vZ|Xcq{7*S5F|b6vu%SAaIab$ZWFTYRtG zKV81n{f@5vPj$azHD*=o!|B{7zH7K2!FOwXC;p~2Ash|gE3Kgr-!s25M}_vI$~CF- zc^t!cS1a}t`U3EI!d3gDa4w0y2pe-7@Q*})h`tQJkO}h;`Z?OnMhcnWU1GDwG`*eGBe0!y2sSFL?X2zS zGdhf*UVN$22>!$d2pho%o5Ds=205~WqW#zoin;aj(FW|my5BL0f4B0J$8)zueo~BC z75^i+PyCl~Kg@ptKA!ULn~)6z+;I^G<^Gp76v|I#HkzYC^^qyoP$)mCz=XDcufwS% ziTt`6vnqb4bD#Y;_sx3Bs@DsMvESCq!i^v`{BHlbfi%SLy3aI;l%9z6 zT9UXL>4ofWSsstXhleRuj{nI)5J+t9|4^VPdlY#|0*OS~KuznbE*YZiLoKrhGFE|2 z!p}$252Ur#*Ywr;NM5?+FfV!BdYNbgyo^byzHi0*Upl56?_XkGs$KEETJlnhSrsp{ zxlg>*ao@>HKJ(Ht422c%KT(>uHuQKswiWrT^jtcfm5|H^O0xUrvUt4wr%3T~{5l5< z#LLS^DPG2$=a3;@cJHTTZgJ3A_f35{mONkooFI3@VlCOdKT>d%l$3v~v|0&cy{oa8Q zq4v)s6-JpztlX~YSuK<6k|ER%@2lo16EeXp@0kk|v%LPfB@#6CljP0()38Zl-9OhE zS8WHoU_H2I59Y3xTW=ED0C#EEgMaC;E#h4*W>vh+=05u`?i=0`L|a>(s)okH$*{o)3**_2&zB(C>UlTb8$m;#^Fk4iA#o{ zTBBt|z84+u_R`n1;hP{bR{bV_cjl#lTQ3`JfS1(bos}Og%1)P;RO*jqm{svo&VAx# z68EkAUT+?4=0$>LTLzn-7GSH2l^Ye&5BAMER@5@%X*@6a~O}YaHAWzrP-;nA!_zRsx&E@2s9m z=0cYYWrA7S4sLMC5Wn|nnJLKH?efR9>=gH6hS zb;uBf6}4*VYh>Mxv9~?0_T6-m7ZsbTS>yZFT~3kc}ix9ONR45Eps3;ycp}( z7PwfoeqHfJ7$x>U#aYZz3AbJW+5kuCtzRww^Z1VG`k(d)Xi@bu^?vwb%&PLk5!@%9 zO1N*uS6aFjK>LWVwDGX%ZKZx*A6UPSwlX|q{Lic5A(J0Y$B?~#tv0At=%f4xUyp~{ z0PGwvYI}a}zzC1#w)S5;P+{Z`%E}0q!^HUWfpHg#9sO6dTgpY+=?ZD|4oupEdmcL; zd`*)+i;xvhvC_8kjav4s2-)f~@rB73(4Vfw4~96r-WwRCd+zx6`*x7|AGcl++5o4i zy+79CvlV7YFFvNiXZ=46p9{E8d^T`D8K0*i+fq)A;5G5_@bHk~vtxM3@Yw=G(iMuN zZ*H~tx_OiNn>W?D{J-ks@%cE4{>;KvpG5JwZ&$@tXZd&|@kBHBM;6sf6%x}$n7I5ojqfN?ZPdJOj_Y+$Fb5W~w`8+bo`a(UA zR)$$sd@tud@i~e6CSMeb0r{L#0lLT+TO!aZ{~4+me*2mrP5hA-&2;;_^n^<=B)c2` z8;`X6`zftn|EYsCBy-LEhFnF-QIYo(^w+c<02#QL)wp0%p?Mx{bW7G_DYxEWv;jRv z-9PHqr=9;}ru6dvRPG;L-@@o~Blk(4o4N1Qr_BF*%~zU9cpj|-hDejv_LWp(Ka+Xo z&WoqdxBDu6K2MP$d<$6bJlkQw_Y{cfWD*d zA8k_K129v1`cCC}v<$jFS^wfb={uAAM&B*Kw$!Uy@4XtS?*pu%(Eid^SbfCvXwy*? zkW}nm7Y~K`M<^7Ya0L-U;fEZB!tfDMC|sy<86;$a&!gQk$n`v$hJo_mx@OElJ-1#J z+5iXP=h58yxBPc2%#dDwk&6GW&oK7BfcvEX2JRdEC;IQ>URLUoT$ud#01QPukCvs6 z@_W7zPsyKR!-k{sYs(!9Bqe8dR7$?)e1{C#d$|VTBFMP?ckR}j=su7-ZoNvh0X?SY zzb$?C#!P>|KG**xu8-|`Blp>Vb3d$4Doz)`v_-uS;groUq24zPLlOGyr;qYS%#Nqe z9rBeve_rO$73nj7FQw0Ciybng&)It`nQ4%LK6|T_%EaTwKUtqXw_ZKk|3RNtJboNA zrRSehiO0oseXP$B+$VjOaNns<>7O5)8`7t#$4$miL_D6kKpo{zc|M*#kL<1Vx$g%K zU6DRZ_E5U|9Jf2VGWF*E>OGarVj8k1#>D+*d6-q%Z%^)%zVo?n^limsX}@z`RGLfh z$J4??)_M;^EKgB+u2}BLAUr}JDA35BzFS8DEbwnOG1Q5gHC zgObT|$#fSfdoPU?@4tuAKynd3X&13S=7Eb?i;pXx6s0fm^Q{ZGe|6Bkm7! z^J4jj8!=OQ{^2F&r8?RDW(9P8>>v7bpLi+czLOW}A8wcv;>Gxfi^4-C_?meCau9}O z{-(DtB`;%9nUdWzo{h&#GwjPSFTcL)V1al!csIquhG7mF;$?2OlKH|VL%g)q-2Lv7 zAztQd7xb%;Q7%Y)@<#j@d__fxgQwbGW&XgeSBW;j)0uI3>W!KHexBC)=+|LLISc|yo2p2R0_qz@i`nmm zO1Sk3(EdFT^u*{>)0e;T~T_F-3MpHLv6sp3bi8_J1`>DF56kDKmY$6GKAV+yC|7lmkgnH zf=0H$B}1sS%2x9nDP)36*l!A~C2XaL`HRZR@b8X67gmlx@&2{{Gjq3|Tdx6afV=Sh zi%rJEahM@J|Mh8-cv!FUC%P_=n4I9PsHPG`2mWzx8HEEM7(X+PBG9Rwxq)~b>i)|os`UMmkjZ?Qp+rL z$q;W-JvGnULMF)D8An;X=~wt@=VsPtW$T%2Ky`FkK(}r=i>@UW&M%jF%4)m?C(YXAOn!mwgCB z5$n5heUv}rk$AkEiY*Y%ua1A+!2>^9%Q0`YQk8>PctPIkzUfBATOCA0M;hYazu zpXP24*F40_mpiI?c7qIfIShG(T@R@JhIy&u)~iJOKk#DJ1IA&d^zxrn>H&FleKP;y zKIcE&ck&|h?aLnv@nY6*!@@%*-|mN@hb~WR|#Oh?h-T<~x@R@$%dbYM!r!j9R}%*8{>lRe#Mq)o|;Tp$+g9yB^RP zGyVNMHLexc$2_g(KJnypKN(N^JsQc=_SR6S9?%_`vE+%IR+-6fmLW*VRA_<3i0$#3#H?`3LP@!f6i#7WUh6|5KoV3nfqKa#M61(t9kAbGK#0@dO(<` z!E2bOB5u7rv?=j)BEHw8_3f#v(~W1dd3{DXRQP`MD!D!zj9C>=L%GlS5BCjE;$0K+ zzRv=5u|Ks&t6$awOgx*1aHK*VEwxNMdni045@rI-FAon@iy@Jy`xjzJW=*0nVLvZ) ziayF8b8kEf_rPWrQ#e18!h3XN+RIg)BnpqsRP^lbk|DzS>1gUf1`%!zK99Od#jNie zRxw9Qx%Fz$1~?jyb(eg;hu$aQ=EsU}Q!zt&{%9HVQ|+pE*C~GJx@7*$eddSzPJU#3 zdrT`Xp`LUF!c%}B6W`7a50&BjV}AOFhpNO7@zWJU^rV@*;iVQM(si9;vhE)D#N+1^ zR1uk<>*j%g@Uot~*y%b_edc=3hWKf&J=Di88RBQFmibV~C=Vs9qLDt7Rk5tB!Cyj% z_2>FgO(XMF%dIyFZGf+1)8(r-W=M~(jY;@gA^BSWh4D`txlep;=Dy*pH9o5JPm-_W z!Z?`xsl)w|d~HP}3!qnqiJ7m};UUA&xb-s82Keig5`R{GVBBZhB0lC}Ruvz6a-aCi=f2@DF+MJ| zn4ln7gs+3^Nz)Lh0+5;bcx`xSk~m5vW&VipP_-B$|27aqa+Mg4kKOc9{*XK4LH0XJ zi457pbD|&{ue1I?T~Fi?WSyER$hNp-2(pgbDVa@>3Bgm24=nxHC(?g$>rFx%;3w_) zI1V%X{r)SDu1l`}xX=7>-|&;@zi!ZqONfud5U2wDln4?8WPZQ!P?;DaesaS@#(%Z3 zhA7Q9{_Dr7k^XCH4n)96z1; zeT|HtqcN-UUt_sX{FQRw@R#VnT3Sqm{MSlEs{nt-f4yoA(Nfa*uhkEQj;hAD&i<(!wR@H8Z)cxdJOk7I`P{8=jbelcAa`?C?;C!R{U@8l^T zA0O+*Ia-kk{%kS=Q-CMq&n~rwh^I0E4f(Sv4}^{~{;Us>yD z4RpwmE35idVKvGnL+DM}tYj_{GC}m-$eEn+#zgU>FCuchF|iu|HsU{nV*~!rwFaR3 z@w>dwJmzuhWugu6xJyd@&d&ee+ZORN53{QH*^~R6zj5F2m>547T8xC^=QIQ|g%1sx z_<5~06pEkIt3pRr;~SRwKaPsZ|Mi6akQ?Jc_d6Dl4Bf*s96*u38?XJ;p935+od0i9 zKy7i!5Of`XQ8Jr^Oses-Y6tg?w%YEXh3-=9A ziT>?!t;mG)4ifG6YMx?4jb|27nvec&kL-?mIPL!tG+=NO9cZ)0?X_x*|SP^-i; zl2PmZgaac&ZHFxikvsc4WC*popOwsQE*U~?_68+0S;z$a+v(rgp*6~v>E9_RdWZQd z=GMzc8{p4c57fD8wYLr`#A{~6E$5fKP2jcDW!DVRn_A!IHQ-47yXtZ4`}!mB*PV{f zEXbPrMw`v$uVt0X{4GZxNK;I$&%~Ij*XCey<PQU1j1;z4#G z7L*Lxd(#~N5oAwjKXmXh4jF=M$a)1(SC0;)qj9ae=ZGf-T^0$J1`u7tDfKUK67=N+fZzKeWuRPHU@Fo3QF^K@i zE#g>!Dfm+L+6>}e=5O5R{Ehogz6$WE!PnhdvC_X4;qT1XMF?C0zD&Fv6dn@aA@kMK z8X~@`#Srmz#vPh38mYsGt&-2 z@MrnAB>PeIM9gc#%?-c|;BP7ZV)55Va0&k=27>(M!WG~MnuGQ;YiTy(FB4;8)(pBX z$shNbKkgg;toT}h&j|iJ3m0-ahQDtS%_8_)5*{-A&9;U@{C#|znUK~G0zlp`7zH!1 z<11;A-#W63&H(&LSH(j!56e(bCiB{kThDI@ z@w&nM-bxek__GDuFdkQ8autuKaG!Xs;=bWEF&l9269PW@IC|~!L%)Krdg7VdGl+4|bi5-vq*O;&M+5iSBJ}Rper(@-hYX=txK?4cw@Zf5>;JWq z=>QprKNL33J};aUO1~$aVKVpEpW}5V{D;tgJ8nJy^$?%UO?{;)|M%*)^naLK`#XnEfEq`U0G_x9^M6V)YHG;*k;jiWu z=C77pZxY%7e`&8rUce0Ltw-eh*q!lL{T}3Kx-MRijO9M_$9=TXb!l`fgPc_=Ng67BY6%P zLbKs>CG((5hR|H_g_4;jWOQj+MdF0@2vup8(jsIcEs+Jr74&#!p}jz1VDFkPjJD|o z3azJ0USfVnbL$nN4e)EdkG+Zb+_!EU#^?1f8vnVG`=-|(9lpBIiZxP{{LGz7{3 zzs30KcztrMHAIk__&gou73L#DnyA)cF|FhbtWb5~Sm` z-~01mhYUg5=~D&Z7MBb`+VL|bvk5Yx_`GUa*lR|`=fW45ufg1UUC;*jN_%}Wb#A); zF_rbnV9cuG^HA;+Uq#$Ed?otF3$$YYA8pqjVAb^fCzU4DMBPkz6g^B{4Z@I^R7{kH z!h|&RFnMI?VdT+JG9xj*J&ZgW3?|R=ocYQu0=EB_%vwp;zA!0o-UG#kG*)2q54|t#R9=gtk=`gC|XBX-tKQpMW`6&n^ zd6)@Zs2}G+O7xL12mVg$Gc&x&=t_xXQ+;Py|U_|j)!ecuvBfN#6R?;iwUeV-rY zpDyH|GGV~=UU96v-;gTTH&(x{{j-kx=${SLclsxT{1X{z`6rwG^E)I8^i1^gG23ue z<~6u3oPS=1sT}#|zxN0EXTwLzKPQT3OQ^kyBAC^}f4&vd>@3Ivmj9MllK)my8>xWS z=f7|D{6B`i4F6pQBP8a(0WtiSA^q13uZ!yA7Su=orBYw}uK|2&sW0ijOK%MH-IBb<=Xz@@gx4*&NY7) zgP-J%E`BfrJD2Y_d#{pzw^JKg4z16>i{tWdHYy7Bc^ZrW{>_EI{Dbjx`zuKpILmAx8#~|{<#t6gXEuE?+x-#=?dkat*}{BiL45ujw61iMaR#gm&ku5)JF24 z_310V_-W|tlNbLDeU-qdsy>-UeexgmZU15Inh9TmxZersOZgA~uIrQEhX?9w6PTnc z8{~%b-^;K}Df3@pkpDI;SN=P(3F=EE45L1&m`(nvq&89ntuW5G@XzZj9j}Y@ z)rI=#pA70d{Uh}?26B+kKU!Z`fGMCp8K19?@`hd=&OZmiR942n@j?E{cu)D~p#u$l z1=lB*|I#YRf9cdllA-naFFt)4^~oDA{2Ttuhf$TjMpGaCS3vz({+kEsNBPf+j~k)% zl>S5I8S!yEALW%_70!QsYL)*kxhu$j1xuCxR>9`ZIO3z_zr5$kfBDo#vY?IWztbV; z#GJpq@m!+u@hqw@F~-`zZ*ME>%X}D>{YQQBAN6hjVYZU-aTlZ~}3;i&LBEU^(4-n-4=W~9QG3l$Z5G;m;G$*++& zg6Yy(VEl8)JGZ*#kW2<#->E1g9#m2rDT3C=gJ-Szqg(GreY<{@3xlHJAeCkNd7vM|tfp4d>(!Hz+56GsfXSbn>3Jm6NZA&7y9- zPh=uo02p`tE_;gnSV3*15L%xf6N}%5KRd!mpyveE1LDcYwNGk)Zl*rPZ|d9rH0LYB zAe}0ITJx0)z!c!m&U}e47KXa(>^ry_n({n6;>U=y7 zOab|LmadN{UL4M!$FEoZJoi?Iuh5@4^OZl}5x*>V`g8LFg?Uk6>dwawf46;{{GCQ^ zBneudzk~8|e`h^y`1|>piTYdYtObTR>#r=Ck8@#E6_1BfAN`$2eeG{iG5gnRpSuj4 z3d6vkc{)UT_EzYk`L%xGoO=0M<k^cNfo zZma30Zj)4sp8UPgYW!;r-2Xzm@BWwccP$@?VER3W@^>X(7wLO0^(p^S-|6ox__X5w z*8so2bMdReC&_OdtfcQP>>JMC*TD@es-)f?*L8C0rN9AUyOV(14c?L|F0vyIP-xZzu-$Y zUZ2eW)TjJUedB$oxP&57KfDiB#D8ykwjxFMDx8Gr{C_=E-rd1b@}^yN9`q!CQgl5x zv3EEs9S=9)h)Va~?4Su!$*WW}c}Lu&v-3YvY4jTkv%-ZzDwS0$%=dV+Z$eM_;`&S; zhTClyS6&H2FA!^0@}6Js;-2lZ)Y&A%Zh~7);x*)L;o&x~j}#XZi({PuO&{)3iCvbN zDIUVbT%-Ble~4$5)JBS+_3^BS&OhF7+w@P(M~YI`tx+6u=kk zi$|@&B>8mC`Qb?P1KePu@44Ge4uT+wo_$q0|8}@ZsN6~phxmac>O5Cr?sH*~L|1a% z@-$)s{EzYI9KNpmZmf$d^%>giPRT4Go@7xQX$!57CyB))V}7~p;Y9he1l$;u zztr=N3Sm^mmx?TkhE0%=@pJIZ^8{N;!Beo99%%Y zjCxsdp|`kc=?psiURRh)T^Qucaa{M@f|vll;4A4<__{8=J_cX#mC9@3rVo9Fy(3~^ zfrs_IV;K7-U`=je{PCs`ueMVgSq`m_SH|-i>ZpI;hC^jyqisTz^yv5U*bmrW6wmW$ z^6|PTzm29o@~MFOHlNJ=HV@JhktQm?J%FLfncq6YB88+{`MKe!)@PY=(=&Mv8X?t^ zUsN>uO5DG5Qf=C63bVz9L8{gKS7G*tC(~pN@#VK~XV;P6kbzU+HigP>Yp#pIE9785 zKobYYAQqpiBoeAjq@phCzN}~a%%*~cPcPA9UkZ4WhrZtvlujl-mQfoifY!%H`*}3( zddrA!-#_qg#J4gSRmHb*>LVX3sBiPpjBgzv)5%3LJ0BhZCP})^nc+zHDcqbOznn1K zK`12M)E5+4Mu?k^PSUk`MPbIcFi5%!xj1_SF|p!XXTGj6!|LMJukWhQ&?*)dV8@_UYD%j zsgHchp}wxKjQcBsR50IL-&2uBuJh>i_4&3b9}d9JJO~SykfN zYvDgLX%y264y7+^5(Z^@J#WuDlt^-6681%op9+EpIrk9{a;c4EKwMllo0d+LmE)Hn|o?T8x3iwC9K$p%Bgeq04*tOIKJtCv&P6vJWm>^x76 z1oJmhXXHYiQP2AfR*id4d8>UPd<0;~e0akjlo}i?^mBaDClF6EsEss(*2j~e`IMV4 zM!hli-hU%Mq{FC+FI}jQe954`=1X*bn0L1JJjM&1A7&aRyp^Z(!+0>6@uEnRVl=bN zD?U9ODNcfwJtD=Smj;pIXRcD(eOy<5_!?G^X}tFa_+6gT2J=JGJ>>6XY9qCUmcJ9r z4~D-d!ASpnJ&=jlNA*BY>Z8B2sBin*yg$42EbVXW{_KmkN&EX@Fm&-$p&~35+DCx&L52P=eP-{+>pC^mi%so&J{f!1^;Sf9rZ+zG1TJflZJPOn-}r zDTDqrW{EfZlyLsO7*@*2Kc`iu|#y1*D`{of31xPA|#s`x&D`sn{0>IcjxMX>kQXK4Rh z@qNB+(t4i-rhxc9jalQ(J}IRCVdYEu-}O#HTydT9gz|rVSSwfQoL6PBF!=Flg=vGB zfEgytYU_C`VFj1Y`Rql4bG=ei-kftH#06PA^qG>|R^X;H?gokTpBr$Q>aNo5jO`Z- zi+7c}F}8USR?KH`t>q-f9tv0}QAAEQ<5%`L;%yGKk#uN%y!{EDo8{UM>aI_W_|+0d zN-Tcu6yIUMeuNER6Z~C$yXNmY>LY(QP~YaS2wkw=i~Nn8X7N|YuiqivsG`-1Uv0Yk z`CAAh%J{VoiW1rV@x*ZaeFT=%h)cKial|j=@5;v%H+#Gv#NSS{6lSo%Bs}LqV()~d zX0=KEKqPCzQ-k^AuvC{zSr{F~RGSRP1k_(83&8Urdw^=-Fr|(Zy zxwxnIM?49KO5!E9K0K7-r*l3fZW&!Z0RG3& z`VfcTB?9B0b1hn2$D9j^c_mzmB4%g2n4p+@6kqgjSwvv}MVT?TA!9#}g~gcrKCB_p zmoW>mj#cPW^z3i}ppDt#6L5&hdr>c>jv>Ccr8cr>w8i&1`gw)%trrf55rFo&@vj%g zQ!li|>mt6lr#|vMjrumZ4$_ znf%!3{2)>fnx;s-R&2m`E+kZQOx}i=SoOk_upUL{93`G`9#}67V_a8>^Pk(~Zg0l6 ziG@Y(Heu|yy#h4B^+G+y{s35$v~qsi_EzF;8nuxmXyd9EE(K;puXh{u!uPju*p73) zBeqrq)eC8|UMPc6RlQqIedKQi_4Ry5L}Y9I>jeLPHW996x<3HcsAP9r$8b!16qcfh z6)XD&F|q$ciiy2{31VVr4#8stCV{<)zWZTC`Q+CUY9o2j`uw`q$iFUM8u|BTbYwGL zmP``8IG$%N{n?fe#35*ZqVi`p46gh+fclhwsqge>Iyg@J{uL6TxgS+*Ta->bQ&)0r zI)wA*dlkx`e_=^vz5fL(xd{&{f8M?=$e)9!E6j6%No4P#&z~71$)B0jMpB^-@+amO zmrs5B5BG-=63Z|0{)BTrs($ZNbCdSx66&Krms8*A&rI@XuVY1~5V}RLn)?rr1(S4b zzjopL`P=i#pC`E9MveZQ^MLZz?4N`D`S4VQS&x`lnPL>5^Rbv!PFKct2OLD{YWNcT z`;7~3B>xvu8_9vz=YM-W!tH+}KA#68$g(=l_&hg8d@hyoISH?e>Wc={NB<{NU;AH7 z%lz@VSDJEi)P9TB5V`~Q6E1|621$)BM}?!t7qFm2q5BYB49dwrRJ}-z(jw*dhs2Y! zokhgxM-*nh!1ycUM~mv%OM#VfceoT)84tsXCa5xQ#24K};_Q8bzW7maz2pzIksN4! z{28M2L45IJ*@%B5eiXu}Dj!UwKJurC`kFsRe$NCdK|W{*nLA*A#1=>bk|Zf@!ja_7 zXB0_(#;VJe4@ON=1Q;QnQtc#3zlRlOI$~nQk5l-Z17)S>UYYs>R=bG6^{C2=jvpC$ zGJjATNrl$u|M=nu#(sJp)UxXm^?y0V4`==;lJTPuMrHp~pZrh#nEr1cm_N2a(op_C zBBcMz)OY-IkD&T))I{am5kCa_e~Q9PM@)eKajE4LKIcF@X8;yw1;4?H5pm$Ja|31t zZ6TOJl&SAs$k?v|>&!RF!-+4=sEv5TEWV7=@uJF=YjpkiB^)XfO=9aeU&P2aHIgqS zcwO@T2lbIJrPR0QvvU1VBp+`*qzfWNRK9r;Ly2>LU%%tjQQnf);iz=uQ_5A(bPu9Z z+P#V@mbTR!utVy?fum zLXpa4w*%hEv)UoVGmqLx4Yas>Qg#H<~!2=o3oL8N+(3!Pnv35Yq!o~e(k zb5@^S7k4ga?4Vd!j88AkRO5CBtdlo+*AQ>=sf}bo>*I|PpRk@0%8y>JsKlu(?$;U% zBLH7&;4el!yc#F3HRAVoqUZbl-4cpVwFnXKQ$jG!Z`FSGbi6K#PhF^we954`=8I7e zi-ifOXHJDorQ(ymi2>(K@~(hVS^mBjSDp*ukCH$84p&Ec?OTSU(uc4ZMpW8ynj=2J z^GH*?G^Wz4u0=JtS(W0gyGPM&3t;@Ei+Bja5}(~wE~R*tjQQSmp3_A->oY-}=jbKS zt9!}h7x=nxdZqXElny37l~EfhfY!$+d%tI$eCh}zB*rJ1@0@&6`L6bABmPjI;t%!h zd?%=+)^ERqbfx%&i?q1O5BaphFd@|hq2&HQD4pf=G>~egV3Aat#z%S8&BIac8d&Wj zs@>luh-z=&sodLR5%lb;8mTsd={O!R(Nr7gvqy~qH#SndUW~cJbsnVJ*M;g@-V_)` zHSx{V;umB7l2km_lc^@xThj*-&oZcuG=tX1v!HxeC*R(l@nhEuIK>Rv~kMf2d9F9~6!IB%1>g1DyNR>BEIdUuP47CZ9;-%iD z>?baSo=rL=ObfiQ6Kq~M*Udvs{^Dn#V0F%9blNO_|+Mz{DAni zE}{nX_BIViwWt51sP~5;fX3QoR2C3GIh3u!;Nol`yJ`UvsICe5;~< z0N(_Mym^q*6yL1)weiTn_%)u7^2!eiN2)$0id47aD+J8VNFq_aJVp`f%4Tv40mC=iWv9d?dn|5xG)$iOYcyat6>W-6E8T%{RA$c z8V!Gsv*%LcUD9RPMmE5|eY`tGuSdjJ?@xje5{qy0_lC~;%#(b}#OtE?)|2|kw=C)h z@D2Af^@4P#_-4hoV-1rP-}*tl9}wSmHd6z7tqurB#YGS=D3$(jtax&UO~s=|DYw4x zCiLtyiBw$4bp6(aK`K@=W|IqpRD6yxpSv(f#qPJM>p2v5`bJ$3Qn3lsb*;eE9Rrz) zDQyaYl_IV*$?H#i%%?Vz1+9;d%@gJ0?n@HoV_fkMM&h|S>g zzK@7&J4dVYtZjZRD84JpJB4&-=V?r??5%6 z*Q#MSDlUT6Fd6?kxTtv4NaflW#1E-$_ahZoGF`uQVUUXNGiD!PqNzCIR&}0p<~YuS zR6LcJK^}KukctO0r9TxIMaAIy&xm~(_wp|y9u`m=$%fX)!@~mBYu)qLLa}y6_mke} zi+n7BzZmOp2nhK7|DD9gGG2cZ$IADMB6$jix^Gv4Hx{`K!28Sbv+>SkcFL z;2FLDWn&9}{1YoFL|tz@ALW(r7mjp&;5MR+f9+hPd-(=MhLbBDWI#d{Ffm_sVUP?B zm{coZPcM@JzPW&T=l{TBt(&#&Lwrc1Hj)Ibj}MQB<-_wACd!9tG5Am*`H%~vDn1OQ zKJp=t`kD_SB>DFzJO}B_7oWu98u8%)!=zKCP?h)EA^!MO2!E7R8Nf$*wP z{_W$*gt+P@BVJ5`5g;2S5HGHZ!H-PIk4(HSnZKw{`HT9RAHvOke%uE+M)3nlp!xA4 zRO04(mk}@e@loFBzhB=sxks};Lx#1LRmhZsmcnV0dN11CuuuJAsm04De4Vk#+dpga z+{J0)!>rvZewcDN+$$s!oZBX75hCw;<-n(4OK21k(8)V*QkeO#7*2*01;m4`V6oys zvn=v+Dz%aA=UaYW5H=pnfRPgOcX zMUw*Gm$^+ctfe~g6@fFCvf`NwLUT-1cW|Bu&2{OCe`|GNAW8Nx=0q0; z^UFk@jBasZkVv`1)VVr7Cx{eZ%u%FVv=vq$8+i+05t}~H({Pu@8Fxz0AwHE+8!3R+ z$EW^rb64XoFaXYOy|qS_;amHS_KI*4jh7_-=gL8`UlsqXk^9OEF>c3rE^ zwLoCvj9C`dvSF={KG11!@5ZE>-oz%>kJGvl-_og#Btz@to3Wl(bscEl-n*ptSKdW| ztE@XLe$Z=HMNj@drx5=t;#a=t`SvfZgV-T5A|Hrg+P@?|y|{mtUPt^o>0?DHq0H)B z_#f;y5w9Ee?qhn$c~SxVmFCM=KzdTgVE`);CeicGu}u}iBuMGCH%!RV8ezh$*08S{z@bE;Uh zUOP~Y^FCqH;Y*cM!K^hf*GusVuTqd@0GT|&Kuqa!AAD-SPY`p%3Ewx!TI8MGc$qhd z51A7^>Y}X;#Zq_UtJSctxvuUE@znfXtg{bX<1`YH_G`wx=Nbo7!%D_1c40t^^}TAw zECh`D)fD{HQoO+W@Er36)`B0PvmMYF_X~?49t!@JP#ej^_-MSJx`*|9T$je~*_(t? z!u^3WK%t~R2qDPg|d*}*v<}R+QL+OoU31_>;LFo-=jCg)* z)Hi|ByM!@WE(}WVY{v8ijL_R#1FlSZZ-RI=ym0V)6UyNKd*DC$%yUzGJdZ0nQ|gb} zNFKDl{MIf}{k4P<64T!kG4xj`^|$&AT~Do}KI(4+^#k;W#D5NI9$ymE`Wpv{#%I#{ z8*H1zw@Lcz2_{);3DH#x`AH>p;-kEawuDpCZdl!;BzAanR}$O*62-$m-*xZ@m9*nx zh4EY%R8rIa3e$jg>_#hT0SmGoK;lwTDIc=Out3xHFvxxVPzPd$Q zQAvk0W`;LM82F_5ThSQzm-fUhe6nlRRo8nb7)la!0`Pdg{zq z-=CJKUY5krONG=+8H}ptALZ0Xy;M*?KrdJij@fRBLhI#%t(HmarL%3)dTC*pa6+T= z)m}(9GARkIR*Q5crF7(8buO>|58aY?B!AM$MUs8ULMS;VtkSBFyijwQLkH4aK?4P)MPje}Bp zn=x}-7?jd%#=IslRl=#Y=u_Nq?b8-Lzqt$Psu{Hr?-WZ{{dNASV}3O#ohI`9nx%N( z&m`wp&i6B^`BgI*TZ88)P~X;94)9vdua^F(h%MJIbiSGi ziNmKaov+5*rZO0k^flBlS@Wyn9eO}CiG)S-tC3&|m|ykhqr8mTaMG(CqNKNf;~?q% zdA{QAjw+Y*-pVrVQ5r$%?P1JT7$Yv}O=rb_4u?byi_*J?F`p8~A-xm&s>{Ruo_2IW z>9t~+Z*z@<(rd_=pIq02())!&!4EDBO7Ba?dMvdDFWJ^# z!t<*)j!(2+jAwq852LF5Hk$gVzXIw9=nv;ty}s9)5UHzL>#y}@%cS+U4|0%Cnp%IG z!4xpRdY_N-wtf*#Ni%YllHO_ zL!yR7C7sTgDTHw->D%7w@`_#KpprgfMLy>m2bHvdF;Bb3K_$Jwm?vErRMJ$&JO&uE z2;_B$q+=;hB~u%z?PTSt(DSQFFj8Xc5%J8gGV%IoJ+LSBQ7>8456}zFuOiIhsC=~r zvV%_)S}z~jCassbhRK>=JqD(L`PDl=sdIVHeilwj7YUuT;-p+)JHv4QQy{67F;RRf0%!kZc;>+dddYO&97#DX_@r=YP?~> zN>0zO$~~AwiRlz6r@8{Va^_SFCfObNNjTB8gmq+^L|yfpgPFK~ck!H9H3n{p-^iFU7{d}CoLAn#+7BjS=fEAT8+xeA zdW0^^6qHy8Y2@XxF1Na_9Ca{&F$di5_;jd)OvZEsj5RM>+s&L8i5Lnw=T~UdCdi4< zr{4!5~P5e$DWzCO9fGHr~T*OCtr>qSpozLOs z4@u{!oepB4bbdQiad6NCmvjz2OWFH^J&N{_7*f2&EWZ(Aj40{M@!6xsK`~JE-P9(CvX;=pV}2>6zMWsBesE1~ z7*t0A`Z@Dc%cS+w2264i!}5`tqX8e~by^)x32R{8my~emFAf%?5`I2iQK~;|M7DQB zqITVDPgwH9yJCkVLD^3gfZ$=LdS0Elzr&3qLt8&)8A~@ zm7@|;7_-!cK_&db8WqnAF>?gZOY)A8>u1zPvY_?lhsBBJhuw!K%I}FW_?;*DT?wNq ze$S;o)lbw9;5XJ!_dy{O!0#*8StiZza|{zsI?5nmP=06+CYc0;fXw@&y}4HNPFxv| z`k%lGEm8mQtq$7K{m(9nLpiXOIhy*1oTltqV2`3LQvaO{g&8Wwh@$?hK6}&{Nd1|N z$%QfMr2cW7yDp~7il%-Vr>|FCSB}(g!I%{;3{pRdG2aVJm2lK@_%Dmz&}VAF_k7Zv z)})7AY9krY`t&eW>!HdO>-B!PS6YUgPYfkJIOh}UeG$1ZxYEN=>Z2a=sBh~b3qHD< zPmF=;#HWW`Fw%VDf;E;&&nG$?CTl)101B{x`NSDqn|VjB2&ac-uxv_tIOrz_mroQ0 z&C#bQF6WGMVDKj9s#6tavw)JBq__3_<)UxbVE zzWKp!qJ0AQPvVOI2H)oze6Moz-JBoX2Q`R~?|Oc4#VX5W#DBxY1&+LbViZi){Gd0O z0_F!N@=;#%_rghG!39bR^*jg7Q3{8qE1LJc&4Ho&`6nyP2p0yW@ET)=xiBb&D>)6_ zv)vHF^u`rg+VDaXUtx}h>CyFiE&r_{{7H7QV+RO4;i)| zjQAhleEIw4iPl5yW7I>*vK}gfQC0jer#{C23hLYO->mn?Kw%P~hYLQiOj-|}!4y#M zx8S3^GnRy7_SbN0kAnO$-#J)|%Go!tuRE!aeBDF+0KU@tCln3=e4V-6GHJe!H%wOjJ`_v= z^?NbbM&8Ip;i%jaR_=((SAFAfD^mH^V->wBZgF6c%11KYm$)!UkAjAtJi_`@HqgYs62xc%Hg*Lb5Psc-Nb0yzIZ1=nBJFSSUFMYq^y@69(%y66@oc$=WA!E%I{Y%bz2;eyAT z{Z2R%Ukqz#MB>Y9-A=FX-PBPLYl4edI6*8vMqzG_=2nV#ChMTYHAFYB69XP5fKg1t zQ{>^+Q+;p!aq1kC0TVqLZg{-1za;F|M7NFi9E<2D*E#kVMf)R+`GGKwt+;nFrhcFZ zMlhxgV63A3!%K^S+w|nt;_N(#_PfB-xTeqRH5mty9x|zoq(bY{gI%AvG~uh)&pR;D zcwZi)J}Hv*NfL~z>XQc4M?EA{-`0byPbl8MYw1DP>n|E6)Ps)q9~o7RRj55&j%-ns1*1#?C^FesI)+bc{@z*u28#YIFtYmsl1q`&XEh4XsK*ud!evLNo5?%vBq@{l*(|%yhRv?R4!r61{VhN#o3J6 z2^dk-AJk42^&)Q4GX8St>1F(Ay%Z&rUP`EqxWP3E(}t?H)Hk* zOqFn5B?c|^`w9;6^7$M4kq#=UjTAxa)4{VkzE^dFk%H$3fBij45Wgnj-&aWfJJ;(K z|0`i|RS(UjKJvec`ZoWw;7Vb=p7>v_=o-EM$1owwaq1vKy|)lnV$AtL34V)Pvx+x) z)C@FrC&*2j1;hQ-ZBUSpp< zY7EraF4o~4Fh-p>sV22imvtjumMJOPOvaoC7*YKUz!X&f^HJW!m%}mrcv#URrk}gY;cKe@TPVtmyvD`!yoj=24fZIOBGX&2 z8peq+qL|*mXO9{KnZBJBHx|aIlj--gQkQidT~;*H@8xWS$KP*teG^}NzYIo5jK4!;@K^0eXolBC>z^&CkNi!g zegJ=I{j)NVzw-@~Ro~A7Q$T&c1XglneKUJ@IBH)E>vTlz>ppNe7pZ;I!HOeOuXa&; z$|1@=0qjwarfB%ZjG-qiHsbqj z%N-uan^te9DB{ey(t*L7RwJ16AGt7i)9O;jeBi?1O{;pGHhyqnx_bEx_#Ob(#2KFd z#G1JOD#x{gep9@ajCt0DK?YYdW+7m#3jM~WF)H+)RG%;3F5@?~kqT&id|s>h9AEsN zL9|YwK947UXTzv!ema2q$mbmD+k7_b^T!oPZy@E zcOL`(06-Mgce9+H80ffGr203Esd8bE>Z=&D4lttPe&WCcDsIX5)L)42ZK;jyvH5Pq z@A&xsJdBW7y>d{DdSyGzu*LJ(a`C#TUKvV# z>ef42QTNaq2Q87hgBmG1^zZM$Aaxrvy>E75kh;4Xt8s2{VUW5{AE+?*yD(k7X3YOd z0EnXQJx$c{#|&^>D^m9+#`JJukh%jIGgx3^Rmim7UG)?3xQ5zDDYQNw+w;N8U`4=Q z^S)=V@&1Zs-y?q$cz;Dtu}TRWY4DNM;(gQNSou6jvFWPWeNB$O3Uq5de zVzu@Dilxs$r3=HTpQmO+SLXaJTpxQMJsysUx54r*Rk}wkc6bioPku^$<=w}IJ22q6 zHeL!7WU0W^{lbB2_!!Z@&&>Od{FzT}Bnw)fKiBH#Jy*GWsef;9*JcVt?3N^Q3+`{i zK0P0_tNnaX>Cd)&V6$j{ro-UMpIxYr{>-4h)1T?^iQ)O-yUP6j6mucz&(^T=B)j__ z3+K-lV0EAT*>{n{SLn|n^^`x~r*%vJ-6{0vIUHGb0Y+8&_?++Uc){iymBq_%-TqAd zR@Oh%M)rIY>`$zJTt2;LZ#H@WpZEGbi~wrOg})fjd(A{=)qwcYMbGy<<190T{O zA(-~7&tQc9_LQj!t|Q}J&R*Uk5b z%z~8(NsSgW!cpTbSd=BHU;B0tH46Sx)c7jbfkCMc*dHuNp993=?vM#00E(A~h)K_F ze_a7=SxJsvrUpe)J8I(_3>v&T>LTO$MawP8}TC-MpgM>DD{y)dDPeZG4gvRPy+J7cQXY^ zMEQxNG2_PyFiDbZn;MQJkHSJfk)+!K2LUi2^#4PVq?(pM9r>Vh14WYW5ECnYH0N{9 zo*#<~pSM)kb}`^g4siTP{Zi%+Y9o8Tu>2oi{4o6wBP5nT$|-(0^GA`4AGvs4a{f$x z@;~)s`X4fboFv0wzWlKQOv?X{g!DhG*h&9a2l{_6`#)giuZ`DvKlVRj0{nlH$P3N+ zoU*R~Kk@&Km+Q@QfeeuG0UsWCTZV21-ITv_Bq`iKsX7MbB4nd_jD1=9?PHmwdb~;>&32BVP)rZ_j5%s)7A4xZW}k z(gl$sD&IT+lYoGH(;2ExNu~0K!%?YEbLFZXZv;^(`8P$Skykh{m~S?7xiV8={Q0KQ zZ*}AwWZ3JlIH&SWFT9ulJ|f3P0h&1W<2=47^X*uW#kw!+**>$WVA)bwUsPki4|pff zYBmthmQx!kgVx8ht^w;Ob=J50!$|*pe5(0W=cgsqN4_nmeysS^Yg%A_Iu=ZlRQ;xe zBh_!PSVg{haxVKuy<20^R?JUxb}CY}%5h+jR1b5Z(+e>Hd_eY$;&V2}a|U3MJEt@D zl{w7Wm9pW0dky-dzubV{`{taadtHLaHVSvf?z1tbH(1ihIH1ayIdKS1a$BA>*+pW&!ydHR4SAFko#>{bzgX@U1 z8S|P8gZKD{{jSdS6JTIvVYtYb@*Of+JFWmd$lv^wEC(NDRS8e+5xru3*#+n-36Ajp z4k&*;>8gO*NH(-SU0n$G6= zGQcD=#u4|2)7Mg1nIe7tRN>GL>g$%Ries0b?ZBYE{@SK6LtGftSF7y`GuVYeeJy3o zl`ahG>**b89Ow0*zO>%^yT(C%^=7^Ib74?l4Y>rH3>YzoufL5&Wr|1ar>gphbW=lZ zq!e18Zj9dpRk^gH^U=z6D3n_MJ?U!W_oUdTd?fzr%SR1>K2Y)0@PUf3q|l7M;{^U-vuOrn#HNL$|ZlPwd9LWs)iXPe64ue4vbi)}(tU_NSP zn6xNRFJ~KNJDNN(Am*cXU^4SjvIvO9xHmnSkMe$=5Kb@C;XV@SWx;a}Eg;Xk|D^bN zOjid6?=`LbpTeBt!hojgdp|O!vkL?Fff{+!e^%oh=fXh6m*U;R+H_tIYT*RdT|3t} zpoRLL)^8gZ2J~Cso5#8MFu+**#g>ATAUVkgUnawYFT25mFP~u*Zr%1W;Eq_=~Y#-c|rm zkHX;B;};+RI0DDO`f$6}V~x~fI$jsmhh3;o`HT9o^w<#UssKH1gp}YjX+18qO=Utp zLP%b@ZPI!yHcXhmun0swjxtdU<-dY(ZJO9C|lhU@Ow{~C(%71*6 z_w$|M^fo<7>21MN4lPms+pIKjOcw_RdAX7?&0QGOBqlec`Y z#%bijpeFlz3RB;OK}|Mh{qH-)@wrfwyLg;G027zqo?#iM!Kv;1x0$6EBLA(B`H$L2 z5wt#C8u_mdJ$8dbA&n(okG2PT2Gyg5K7EVoTskHv<`(&MXksjBPIsbC7wV*wxK4Z1y?9vi|+oy>oaJ2;6N zdA(L~`_Xg<1~gLN>-M$6OmJafPL<-d`bJ^KyD*^H`rfIGxx!17f$>$g0{r!M?6)Q}vSC=iNdKLa+)T>DXfc0wh`+Uo( zUTupIaeu!Vj#eY)kLvj=g)l1TPwG?tq<(;2advj;cuSPHsDksyWACy|TCXX#N$Yhd zBr>1MwO&61lUz9wMXLFJ#J{;-^}ZbwPI;5zJ|8LX^+z45!c2Jjmr5~5z;AxkZGL{q zCbDlaV;Z|Kmimf@zW~Nkm3t;w%3{UmlR4hc!E2TD{=>zjmuA#Pymu|V80#(Z>176tAm(@R>t#s{ zy;R8gT{d19&F=vxe0gR$ar&g5?c#?n-Drpn?(yGjgMr=F@7 zlAda)jg&&`%Rl`ST`xJWhV&HwdWl@Wbgq}E^~)p}Rpp-s)JHufQ$IjYjUfkk>kBN= zXg$3+)-q{5J#3q_o<`dyt*3#8$*LFczDJ)6O}btjVw=Q*2^NrE7MP?!lSM*ntCu!U z;G?`lZVo5V`LL``0rFxCauT!4U?tEtww=q>2a-X z(t4}{Q-B_yRzXd;niP9q`%xl*wOoa=B3G?iA z3RCXFV8XnDF=Z|cCd~cUt8t!iVK8BS!||cig+Z-7#oC|d!eGLDfH5U549234pQ-D4 z5HOZzqZ8(#Eb%7+E(F?ZtxvD#(LV$9T2M`TEu=P*1FcW5#{8}79MF95ew3B-P^kaT zew0EOT*Ww9vZ^|MVVWg#@Li)|_s z1JeCJ!-S$lDdYWyv&ZRkX(`kFKQNi=Eh4khWqHYbl=t&>;Y2wd*6vA^9~3(Thxg07 zf22tFn|MH>oh0%8^pw>KQ~xLj29j-xH=8m0T;l-2;r`zmHO?O{4BjvA&SjwUdQjX) zu(*G9je|+D6=Sx!Fd*C%Z#|3hIQU%F;z-p;EGFM#<{osB+K;jyR5kwnD7F73U3t_- zYM}M$Dri57OJlzMDBr(^GRyV<{vnh1qozmgN0sX%G54dC!Kg}K<ua5DDuYo;U)6@m+K=*-VY2kK7^+&C^z8j86T=e!=&*W0Y+sjhKQU)79x*o8rTjbROb02q;>Mt#Vlf)bL&gZ1MpvVNpCk_@d+ zH^%x%9r>smNG{a+e?0q9w!g0RvXlC#mp#c`SsLxbpc{)3dF#f{2X}uL2 zCOiKbwW+1IsbC7qe|(fT=!$T9YY4TM%zt+}_)Yn5ksd7CauT4kfW5qEj=DN!ZPW4v_6;u^yqPc>#e*joF2!(V!O#|7cKwd zx!D{S#)=QGxiGkBxt`<0OD+t?qFa`z>v;h%mS*AmlKZFCew1rj;#B~*^g8UF|A$`l z%1N*J)JC$P_2p4xJrnOgxN@lf`QOh{y&C`h^?3H9Y=6ecpVX)PN&Nu5;%ed2tF%z8 z{5ca+l9HE|KgZi9t=FNpN$a&Ym;&yvkK`)X>)$_|^8SEjbyD6*V;ri&O!&fl#jHUG zIWWk+Qx+&pZx;rc{t;t(xiFXse_~8`7X~xor*Elqb#q}b6Hegr?+h0PGvQ!X`Kc}p zMvE&Ma}r=IRk>$^$(*RK7Q;I3pYucy_oEb)kzNX^jpRV<(~Gg*5}#i7hY`g5E`Ghl zvmd2qme$J>>Z4wkQ$LnorVq44q4V4Ims=*C-}>1mt(PvgN$aH*m;&^2_O*sdsy;lYh93CR%7sDh&0d)m{V;2VX+nIIO(1pQFbsS^rxiAFkbew2XxW8D9S5fWQ3iDy4bK3*5qi=(NJdMcoPfSzzaN-wCh zd`U*@sr3NMr1i89a)j?Ft*6blN$cr-!(`QqTa7Byn!l~JO~(CiFa_QJ=A*oO`-Btd zu~2f6K*jsyqRK=}XrIhc1bnce1A`>JcCNw{xG*S)zZo;yg~5c@dY&35--W@1w*MOn zbE6A`3GKgJujRQgn9v^LU@+8$!JzU0V{!pwiO-$TPG?O|fkVVn%CNayABuktr+>=( z+nn9x`+!Slk{-*bjTAuZ)1xteiHM~t`lv^b`myvl?-EN{ zT8|GvqVb7N>+xpWr1dz!HfcScVVEpEUVWuLm!-!Zwn^(T4NL)gY{Ex*JF>#*aps3g zkE^eDXbltQd6kO)f7WwgFkybo7|(@4ZjXFjjkDQ>!G!q$V`^O(OqgT;tH$}lg~5b* zG*@{WTo@}ptaD*7VgAlBWVH)}v1kUzhYtZ`X*N1x-p>;M65v9h^D2FMeS`iPpjU4O z>2*7`k>$|(^lHrCsxp&e?MLZ06@{AkeiS)>b3PwM{hna^f3#kAQlI8;)VK92u9WZp z_0vMZNm>pV>3;b}$U8p0qLc;5TWFh5%0g&fxos*F1JeCJ!-S$lDbxKwql(p1#u?^R zFq!Ku9*jqqdyf61gND4PWKmrMkL zLPm7%FUbR&xPO=lqpJNSJ*kg+$)bKNy{x~`5{1^wi@hzA*2}}TN$X{_Z7PHBg!D4d zFj@Oc&NfVzUWP!~E0dVLza)z*V()}=!|7!`+SZNko^@eRFK2Kv+yv(m+2r&W zStM{Hjm4nem*YJk^9Qw&<c}5|Js2{7$n^|o{!qWKsf59m9_CUX^-x9q zSbA6r#gH#aXg$n4&oXH}jJHi%4?}H})M7wdCbdgu?Pfc%lcM|nq_6HX6H zVLh7kaNsqL+<=AFQ58xLKZs{r+IqmkuNz~&bzxxQ)5!agF`HZ%EVSmaWh~s)8|Iv-^P;#Gzdhe#Mb=}^{G#fy+DTeZo2gIpC+f%2(-^2@0`zo256h(W z)Y&#^J+-h+T2Ff+2dHyd`Q#GLzR(1`ir!la^MS5B=C`eCh$`yYf z-5sQ-pBXdNg+V<%_M95$VHXDVG>kPj*@Zzp)q7EmbH59NdeZr>-ES^E`R#5!RkOAS z!+AvhdGlEokt_e?O{DyjPi-U%T3`M#>ajZV&s{)WD60~mzr>S&(ha?IG4zsAw_bV~ zM78EGtuqxH%}0&k{AC|Rd&PV_O6z5_ZPI#q-!NJEXX^!eKua%c!4!~xs`x1H$&7G% z>GhV<%j7E@dVxBszV~#Q;^*b!QBijO!5nqh(+bnWg~1&47-PAj;bzx9b z2ea-@cVVz*JA!rhD`2AYkKZ2knK1tp^BA3R4BxXIZ!BZ!#GQXiCy<`XsErgr>(i5w zf9lZF2~tnu;Q;i!RMAtkBmYpJ@(=ax{3A*>wH~nRY)xcT z1|}KE{Yl=6vn&&e2KDrsZ9>rqA$ZelQx*J`<~O$+CM_CV4|wW)eJ(V4;wW4Xm;feI zPsaYkJU+_ndulj6?Sd5}%0FE%cjyT?Uf;X;NyYI-+Z}p>c}a?Q!cz+K>ox}lG*{p2 z&6sU23@olS@^&%iCl>}6`xdb-e{f+iM-6&bUC*~J4CbiWoHNI}J{P{f={d&S0T^om z&b?^9AIrT0PHmNe4WD$&(7zv;XIB3Gz{ygN&7>Z^do4XS*Yhh}PtODv#jFQg-j!%Q zI2r^HwBC>dHnHBY`cAFKb<{^aZlJ!cM{$*)M`ZgjsH1$DO3$y(Ji{{Sda#Xc()q1{ zZ7PGaksg199Aw@v7D}aadrf<)b9uj>6i!)>!)g;L>+AjwWnrfJ?J>pDSHwe|oSACv zOoe&Og~3dQ9df6Hj)ReFCRS{7yt2bHnbo9le>}s3GA1U^P!l} zyD5QD)%wCT>LdS4sc-XN<|E=iaMH(rosZ5u%`)kH)W$ZI!8b%G={Kw4l+YH6YSH!c@Z2n_rS^KEMJm$h+X4%G==`IXr zmd8ugIFGn6m|3o4jZAT2FtgO>Y*_5VU}ovZI_j{+@wqUwT*#QC025bcso+B{5~p_T zhv3A4>(i+aZ}Imd)JFE)Vd=$~55>qACFk(-06K!=Ao`cVUySEN6$$`8A1Yt;eD&Kp z$`?2W7Jdk(_kUH%d{KM5*2`wBPF12f{(A>eajJC5G=)iZVK4!WWK0Ve1`|;0>1v#2E(|81?^(zP zxiFZ3c5t#=4w&evlHVQ`R4@Tu%|dSgV~C}N3sBJXUnAX z(ZjY0MI?mbjkZlX9}P52T12R?yU*0;LKBJz^)HQ5^U^4Y(KL3V~@(xK0r?2_2 zJVgmE=>mtoFu}DfQJnwq8;8Cy!R=s7l?#IjuIVFcoVhLxCb;>GsdQm5!A)YFzU;za zf;*a%a)k?n32r3owCA^u&xHx@dd6e|Cawhc9v^ZOoLcB`*TX(p?xug*vXuLc(#Db= z)2WRlL+jI{JwFmuik=^(cjJ7wJ0JC!34by2UA6#Vz7qz2zAJ|zLBY8Q5zj+JFy%WT z5Rs27VN_Kg&ZR!)yDIAI_W=Pu$-A{fIDWRCt@v38&q;@xIu%Bf4@$@s*U=;c&L^%X zliElsp8vwMl!N=H!u4hRIBFk1Ke8$hj<&xm{d>2*x8N6*_(u@0Bp6(M zUk#{_-&ZpA1L}ih@#RHM(18QaWIi8Z%dwV8*9RZjCgC}%r{~(HGGW5~9*-F&3{tv2 zc*iJHbZEo)^(>go^&Jn!lT~;TALZTDE*uFWFDMdR*e57REqXu&m-}7!f^pMR-v4zyw<>7kO^ND;KY_%YSW=Pph7_H(>(1Ii+S{TxF{56=5-S+ZWvhf$RtMpGa4 zP(b}ydT3~H)Y8MoV*>TC&^Bp3l-nk)hhoEI-ESLdm@GX^g(_PnZF@gQ0T_X>-Ch35i!0w<{t)&WyJi8djv86y?YeXrtE~CU9lkZ``@cD zx4SUN{LT{;W{eAi%s-4(c8d#x%)gFRc9RQ(%wNnZ8{xtr^T%`M8744}^>t@HNE<@@ zPNz1K46Tpfi*-K0^+GqljrGFa#P0;w3+EEQo$H0AlHZjEzvmkKu8PTTT+e7|(^2z# zo>MSKk5`y17X}6MH)DFbFesQUg=(Bk7X}4$8jJHR7X}6M z9~NhZ3xk5Wh|^LRz=-nc@Vhxbh<{EQkN=bl53C;ldSIRU8KU)5brZNXcs|{2FeZj( z_+&w`jF2RHa=!%j>3s}c?e&MN#JCfOa?A{?h%!c8Aa0%yVN7@-6>PkcR9;>_FeMD(&#@nYfP?7XZh zaUo@7m(ZKMoZUz}VJ@cwC+&+pl5tT#;p4}kX)SZ_Lu z{Ow$C66>9~zGL{ir{V9c82(O!&kFut+DiGLdlmXS6aFsi0mG^2Zw#gA?}v?}(1fJ| z`g=5(WDFBucD0D4(#g7h_U=9;oWDE5+9mnB&sh+|(4VDv26bcE<6ef4UTqf6pO;Nj{`_BtBPT(gsP8?) zIVt&vpq!-hO#{GytgnO*FV{l#d^qh2S^rQQNru*^>t}%n=KFN6fe#z)|3VDa_&%N8 z1JVB_@E2qK7y)#@R6u?AOQ*qwK?Eq{_$`iwz%SmXQvf!h=Smn=`F}3;(f?J{cltjA zE>-wHV);KC{!V({!tRpwPo6N5|Ba(CeisT8>UlFP#K`!K%pkSl>r;#QDDTy#A^ra! z_Wx;t{=ZYz3CZ6D`u{G4X&^8|ruGzHGv_$csZ&<8~$^FRwLrnRkvn4;)HxJ~;3U+4{KV}(6HGwg! z3*mpnkI|`mz^1|^2tw=St)O7Q*ICQ)D#0Q{$3;A#H|n5p)Hw`R#3&WK?s`KXhK}pT zDO#*_-Ri>m-{LzI=6!*Y)RAvY-@m*FzG)&)afyhE%L)tO|4scA>PdA&@@2%IX4FQ! zOD+BkNt8b`U<8O3|8RWC#_N*rAEG|;Cx`l)KU5#0?j?VwAFSOCY)q=w@#O*bX%v43 z8%N=2;yWb%^aPVx9~$vx#Np~(-bDw5Bgt-9A|jGJcydsDIk!L&phCP($2sSD>UM=G z7Z?>^M1@le|M}tz(!|LRuRrl)JGGJJ(Ek78%UBp8F@D4oU()fqh#y_3kNn7>zUD`C zd>NCXeAd0n;>Yzi33UEB$2iL3M|;DBp-0D;y+Ak_Uoi3*@#QIwN?!BiaMW1{^a`WmrN{9YG78HE_%NDC7$}V5=K?|X)g7texbhRj}c!o;ZsBX za%vNcKRNJss$Y&Zn1Ce77bem3_CXF&RWHs*M5LDW3z#S#Mb)qG^HJW`hT%vu1D2_Y zB*&i^M3QetDFS4D5k!)+$0$rs!1#lQu3z)|k^l3ljbuUV^M8ExtLguX{uTejsO*30 zlmDq7)Bgu*Ph$Kq{BKah_CKTt<$p98{s$8+aYXx{kMg$G59xncSCaleKG6TSDBosn z4D>&9q$gkk{ohympV~+kv@!kP2V@XEe=+^vCsF^GgI6Hq;25~y6N81^{{l9gzrd*M zf9jL}sjvMn@~12oGNCK<-&lLn_PZ@$>!WPJEc@0%47Qd}6UM%Oc04nzzrT=@!;K2vftvleZI`+D`fR(xF_ zwZ{!WL*N^elU`iM%D9mDl1XhO6-{xCvf^~Mt7OBtpVvCvt9 zqv3qFLh_~N0?n5t)JMK7r@oUf8N`={jg)(%>W$yo^U{FAvnJ17oF+c!+O5Jb z_rQWQ@#XY(L45gZwBo|IH9>r7b(6wua$%4!&oQSy7Z{%L_L)2kn6rR(MAH0a$OJJd z?p@roeV*c!B+_bFW$!)Z&i0wb%e;y3qAQ3$29$xdEth=Chf!7h8BKlUQvvlgpN#rL@@Za!Kt8>=zh%;Vde|^o^Wy;!(7IQN`jqld zDfA@O_Hsh=M*bC!YAxXgCsFOgwn0?;&#j6^1@8n=?bYiQX0!`~R6CRDm@hCyC&4pu z|K!VQMNlIn-{gF`ck#sb7>8y2l3W{FsJWJk*W4>r Sqct5`CJmOmowUJV2eSAA5 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%0AO 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

      s0CK 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 uPnKP^6cMS$XwXJ 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%0AU!qo7I=n!&(bBC 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
      aW?gTZ@A1|il`Gyl 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
        D}fGKIMqT%0r40^qiW^Y``u(FdIXUWHTAv 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�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
      1. -hW0F+h-)iducAf0M3{+_s`M6k=c0-1<8VIti|_haP$;xv)6kERWQxtzQ0<1 zG%66dWcoTX4%;x7jP~SjFosLpL9-v8~jjWChu|#TGq}X}=Kxh(bh5 z-*;T+1e(#lu1ys$E~l~)>mebrkJ^+>{E0XRlx-3b;T$f5u*H8g>j~Xpmt?-WKf4lD z5jz(=r6j^7f7Lyc6li1O909Knk=#ws>}J%GpRd!FMIzx|OpoVKb`@ zNlfxeb$yiW>_Pd`;5-}5Tgq*$6Bl22m$9a>-?oblOa(ldL}Uv;0*Rsp8`aa$qFIw{ zym$_%$WX=rt72>oIi0QiG*v8~UTfcV^DoTb0Ydjk(?lOBG2ceW>I$3fWZ$KR`1`1R z)OtwvdMPRisiYPi(xU(%`o?w^x{}UGRqcn9mx>g&$a_cy97OH)4&Ex9sA!Wtq=$UQ z%6nQSbYtnBlPa}j$)1ypF%7>}`cT>#PTDUFBe7n)QT}h+e#KU3sOtOC;E}=Kdu_^r zo|`@XxFF-~;}>?Be6t(L+811Qze>W{$HtZx)QsIoVp>y?WUZPGC2Q@8ypeE;=}#$2 zFRpxnWtW^WQ;C+!wl`R*B&t4EYi|m(ngsmS}kJ)i?$Ym{R39%g5?=q`e5zLIC z8kiNKjN+{BO7EOS3J$82n{#F*f3If7K0QERlN%Gx@&4(hzOs`E_xwc?t(Ju$mN0BMuFmgI+XPpU3-wcE;39IcZM{Ap<-_vE%Q#No%|PzOy)4-{PE1}t$>Q_!ztB$9q~!bP=j38)0;h*{ zvx~qu88T?AlYx#^j8<^L{7&{|OL69~32oEouxH@+4bSTR_$KYx7PLFf0Fes1;c&Ms z_2Ke=Y)2us=;^@AyorE>?egSSg_Z;GWY8Gk?i6=Q+PY~p?r(wE| zp1;A6j`gy3uS*q=)UT$c;L|^iRWpDUfIcuDq9JU(MstAVy}J^9sMmG6^n)@waC&^A zfY5PZi-8ZK9!Q@dot0o>+^=MtYg`5%A}k^~k%UDs^u(-qn81z8=#>F{f`XOaOP&NU z4P~ozK7?wT)on%oCOoH*UW>C%Hi7Km`wl5jdnaSMVGAsWC-?A28YhWegL7FdY(jX@o6HTzz zo617D$Xr!C_5qq`X-GWU;Orud071iWnf|f58=x>!F9Kuhgo;?9@#=F8hzr&#<*YG) z6x8&o0M3(+5$&v|U#QG1!n=&cdE9DviX8<`A{XNvyubyo2T)RCOLiTpy#_JT{eL=} z)Lzt{OD;xzn`Ii`H2DQG*8qmAqjCHLSeUsLVIB+SW`O;{AXv^JDHQE$-}ifB__*m!`>l z>4h{oJINF1Jj8mnuGtqI%mN)CyNksmbPz>OsBil!LOJ079`b&*okf=M;*^*`TcfiP zorn?Eq^#7tLKGZNII&fPR8dRjX-FpzK-nY{701T9IIV`GI1U)dYd}#lnJ@afP9?S? z&dZI?9~#I!Culjd!Mc@RZ%O9*%2T7+-_zn*Ef7FsZn}8yTFFd37mh{;TY5(5lV{C_ zaczLio8Gp!(X+RHIqsg>(#Wobnjk2Y^QUxf%@HJS*)NrNXHFZMp~}YACmWre3P4GG z!bw=JuSO3v=iEtdYV&lERo_6^V(5g%$l+sLw>zbttfjLa4$jSfnQ}~`W*rzKnEBk5 zPM1I%!iOI3fgf_T&m`1e)biY)YtPhr9ft#p=dBf_D#7-_xea#A7k_9(nz<7#P zAK<=VR~j4-uac)kWE)F!*!$2y3DUjQF z6IkSr7C%d()-M_A60!T4R(>2iE$!?{%f|+jsJ8~=!5m>HHWMFHJ2CN8+qQJ#PbfE3 zTZV#r^l5DnIK&qew(AD7z-$__2)ts7w|SkW3{11yWMr1S$D{`B;^IxK>f{>SWBHv@ zAJJ$$LDL%OE9^r2^Xsw=gIo{u& zdS+bLb^Bwv4(L2Y3FbPlp3wf|G;6Xd8+fU4*zWgmnp3dp&s&90QJEVGKOf@e4!xIl z&Y})=hmOcUGyIO8`IERAB!x};`>ubTS%35#!TSGo-}RU5BV2zd@?mEEUk_By(fXr+ z**awXgKe>O-}N_Kn^MExOaI;PRlBEFr`$6z+&Q%>u_0;wv@5ZpZFocC!K8J47yiHD zx@hSo{|=Y_QZ4;A(xiC|)?RI;CsaeaY8U)VYd#lG%%P- zRNiO7&o_;;AFAX2sj5EUdTiQ{=qHFLf?aDd-6=D$WD`$6l`)pN&G5HXg{MVjGzZDE za_`1OG1Z{|l6s@cTCzXKX2-noF$@>2!rQd6V_u4zdg3^nCV$wg=|UlpFX9n--zW?T zIhlPE=Di~u`?gO29>+fLv9c;o+cn+g4>(VZe$;M#)L_@*$cGZ&o)~y!63~yFu2^}> zt#UG+%onrBKh-hpS+IqF_2;bacxA)9cSMf2Er0)Z;X5C4zdbPl@@~7u{dPSU)7pLp zNceVfl99R+eI&bPdU4X;5^Vx*ugf47)=Uo*>Ocq7@(o;D?SJXVJK)R3K(vQEqh6s_ zd+9Z1`C?1Zu}@FAmrb*2-RKnE;n0diNnn26Q<}T|19Q(0+qtRYlor|j7DqnP!n^L& z17pa=70c+>)w0uDG7dK)H?Tr-R?E^VHt#|H9kwHN;O+`5wVKvn;@+T2c~Y5A6&IPF zK%^VzGVg0oR0K5w?V0ne*LiY$$%b1wP`fep887FwVfHz5`j=mcK8yH($sQ2<1Y-x?`4}n`-TwL z{M%<{ob}sXR{QlzN}Yuv_YSu z&*~qt`o6<1=nQsJc67A$B)tx|p4n-+cg{ytihobIl{XMjCDh*a*sVQa-)0DbHHr3# zZTHfVxtAAe!PV~ zrrcSF#@x)IyOX)C!@Hly=C7x``)wk#+`0=dCGIMCu-jUkVOqpKkooIklikYwEJ4O> z{)O4*_%di`81Ye-(`GsGT(X}{;zo=_C>b~sORGBdehrn*9MJL7h7)z7to-M2Eq~K$ zUQh4wrNK$#_ndRIH`}eeL|Y>M#y&=n|0%_h*syk(opoZZvFyLk82bks36!|%~hpmLAD>xb79&E(=6SMesANY zfo?l`QEF_8f-wJTQ`cR(;7`{=Yx?tkGjfI5%)#k%|LL!)Vs!MdF`}uGuX<{lKYeL? zaA~f0h1cFhzAC+EFsYoMmFx%T=#DFD%d%4(?^xyrm^5dy1Pyla%&LpZ^gp|(oVdlo zsF!u@F7LTtEdu_otwkxJ`?BnQ#7}ODfj>E#ZMO{hP7~iT;hF;cr|)6$LZN#_wfN-^ zV?O|mE14(U@W&$gDe;FKFPZC#b-z7Kx}D9v$q{Sa$<;VE&B>5pn*FhoFQ>|Jd1YZb z)Qg9toz;~(Y?dg5UEZo|kt(oXg$c^CKcgKrOnpC&g_TBFi7jfI;c<@DxyD+JW@3m8yx2Vv|BZ_{cr_tHpgcSlkWJvQA=lo`%R8~5DK87e2>iD^D+QIZVPMZjeTt1Ujni1+6$jHV%s&8 z2AAC)V%x5-Xz#oubR&+PktxQy)2@u}2_w889Si7T0|c!6TdY-T z!iC6hfw8fM#GGnti6rAuu)UN4E=Km5iBBE-*ebbv&f~JIo~a;aoA>6K73RViyZ|y< zMqv{v+NUA1Gtpw(uf<`*(l?3aECs600zpOFof!ANc|2H~!=ppw zeN{J*DQ4rcACDN=hpe}Dt?gb)=jxPGF`^h&P|Rsr&X4{g0>S&bt+u4EaqDL|Ge#=9 z9X%~!t0TR(fhAVqVez_y$iONz8pgPEEBa&1whm!p;J|0)6|c^A4>sqfhigH3PO!O3 zITuzs7mjq!A>AYArI&}cQ=Xo{`O{fXB5gznP!XgDNjik8%^U4MrV6i7H%B5X(Pkdk zb3Ulq*rgVh$<%Ap8+Ky*cRrN69|26X|9VmE`&SrV-%KxV5{LuPfP1gtnxUW`y`>vm z4Q^M1MI!0ZXQuo%2@YUh*SC#Sy1o<-v0MI8@U-nOeVv_JwpAkXysKz4I*I;lK5go! z9UHa-+-)Yn{}8(*JU8uFzd`1N=m@DkTsHR-<34DJ#SU79FRAoj;#OOB8e0^W;meFj zN~l6LUb@9o$>B0he!`iDrYlkS-b0JuEr;u$pC9L zJb*$G-aoy&x3YUzW%(9ob?$}TutGC_*!}9irEo-M30Kl)GWT*ta`fZsb_L(SO>Q6R zXPP+!#063ZBs~yrVD@JikN!=hS4_@(Q=qKj!p8)ll4Dmp>%;2+k_|1X;kMzzHv?FP zG0mGpmYT@(8TV*xycIAHa0!yk^I^_DatLGkofiPYX|CuwIDEQscGymC060y8rDK`gZD*nZG&hDzOx*UL2bjFuFOKZA+7 z#65GGm2UxPnPkWtxL7y8jE|S+-ofKE1FmF(bj>mQQEOX4VV zGD~L)J1;z!zS!=PfbpUO9b15P_K9T$GBXyw$}0d!XC3_B24u5WOgqRb{3ma)K_(Zg z<7|(e8!ILUw0UMT`coORFWUi!IQ)#e1=p=>y1+ji>LxTCh<}qWSCo;qi!?RP%eYIq zm(_y;7dLZaiq*fQei?Ey1eo53{wyKt>`J^AZ1*~CF2Zd1|1~E3LB6=6H`KDfjfU+kHv+`eNC%BhZ6{nO}1g=lcqybzL6bRR> zWAG8K3F#nk%}#sMHaoHFJAmt>{pU>&=}d9lO9NG9-Yu%7Y?|6hrq7Mxrvf@1gf zGDKz_O8b9P3{~XRgC1X^@qbDTrCvl_!+;p-={5U`p+<}kO9mxS{tI|aA*4v=dWYM^ zQ>Nn!56GR76!1+p$p=rMLST4?clUG9;jNSF&pij-S}2_U zwracek(7J=BGn*+hP6b7JHj(<7yN(Xm>K?c>Vt;KJpMrdr|BXx!GnE_E0^ESV`1)E z|7d#feidi*q2P^3zMsO_*;s7ptou!z0DL%W!Tz=WG6_JOuc0(KIs#0-Yfe@>XL@Qp z6Oese)l0C|RLS9(k#^R~)qYm zyI-;#=4^JQe<51X{|hPY^plDpk7gJviD?lUJP`NV5*nbc)i=f@--C(2-Y=XCwhE?@1 zmzA)2{xU8)?|r_3Qt3y}PJSs(;ucIUjLN_k4OOH=kWMTn!p^1fkBN*zK~QI6M@XVU zL5E!&^vM9^#3|Dsm!rZ4Q6OSPcdP|JcqC-f=88M;3+sLD_1mSfnC3;uAxF* zVTb?Dzp1)iIS@69vR8t#A$I+b1!Y6*`d0;IL+tv05tI$F>%W$=NH&UHKkF9CQklp) zdaqSdq=#sMRMx@Fj^o#Kbm&@1v15v(1?oOlZ3GKc&qFPc+6WhDVpRX{EYO+Hl`hcN zzj1shZ!!KC|6qOoQnEhV-@86_?8$#&eN6Red{*w{kGyw%jt|O)tk2Ow*^u@5Ku|Vh zecn0Jv^QjZUZL!L*T;oU(H5)Ju4h3cZZR{@^-QkCiOXndB`4RAs`V6V_S^LfsanUc z(Ib5RHPcfM9OA{q`b(cp-e)c$O!ba3R)+QQv#m-Ozg6Y+?zjU7@m3Z<|DO6fQwR~B?wK+}*Nx6MXOdk< z*jRs!&aXsU6VH61`I*uJ_@eUs6?)1a6>j4v?fgW15cQVxW4q_6P8XN@8<40Il>JCB zF>%h1VnpfUwStn0u}-CA;0qQ_iDc`EM|rlMXZ#4m(d0&c^hZ2(fmTYk1O>Y64KERo z^OYb7KgGMk;*2$^3zIBL%6L_Oawy|g)|~oFuA482-eK?Df=rjsTUQ#zwW#;Dqp6Ph zV6tbvI<3F#Cn*?4K?vm4DFJm-8WvXxtn*0s`Xjt}%yx*JHM+|{!i?gAjRX*Gdnp2l zFFwtAD^_1=cl#kw{PTs!mvsUipE7_jx0;xDU)yc~qj7fHa_NgSV;%Bt5dN-Pz;G8W zEFsM+pA;~R4%zn0t{4IUw_kQK_fgYhne>b&kJa9`6i z$(Zlz{#fph?3q*(JwJl`+MY=qo1p%I+{b$+)#{#Q9|ga|vVY2~{MJ!% z%r^@lN3;&+ua4hv!HnDA;F8>{x>}OQYPkrOL=Eb1U`h14{%C0&mu5+zO0^`q*WW*} zBu!84yCmn&i15@uUKfy*!V;Qw5t4eJby;`$&~;gN`Tym*1WTY?SjC^LH=>DpU`z>2 zgGv$T83N1F#rZPp;@H&jW56A(RtuzKkY^*womg4HJxsHXG~G~x~eEF(j_msX7j;IsBiPucv-HWWKg&zV_etFU^-CvM^uu{6zEB z{x8ngRC=NF_&?iUpPv0cny=4b7xNGI*DvlEoGrUwy)B^wurj&`U;+HK)Se_YN8FKKsXco{0=y+g6|r$$Fu z9P-!OJeTj#mdZ<;r-kKVRi3Wkl9v}oCG7pd%VptZ_$2}Cp7~915Mig9!%LcM87x)4 znXp1-c&XV4FG&p>z$8Tz534D2QFvK5_{R9?a^3tim*u3?spU6aT+ktex^BLS^hA%k z23zu?9y70=Vk? z2KBmBR=hYUdnqXEHD%jAXzImacWAGSAFFs-P!?BNVnMCS7ViY=f~b z8vLg>^P5Kt|7)Tmr&|}O!N>$Z*)ePQLA>^g0G_)*pR{p$Rb+>T577}qrPlR*RQy6R z_j|pFn8Bz4+;7Y@wNBJG+y&}&q9HYBYyRo%0XrJTQtdyOH$oJJuYoMSVXt!_!M*?}obL24j*Is>S}elj@xA zd4E>%yyx{VasMUOKS}TWu0gq?|{KkU{`F26I*8Y^_U2jC!Vzy zAIFF6)`v31xG`-!rFhB5V*6xzd_0MJYhZ+#EY5i{*I#itTCR!l29w+7w7PWb-bQyK zjuSoewn}qXc&x!ayIw-cDr@17!C&+GH5_XxDil-*_;2R=Kc(1)l?1V9s9cL|GKCKwv90L!dfsS%JbSjdGlTy~=B!$$eXI?+eyvn;lg5^;eSb43y zj4WT%a^V&JYRY-h+mEn%*g>&Z|19aWcu0lW5tB|0^RARk9dy*Y@ViLn&efbI&r3Y3 zNmQ=c`f_WDB5a0s4W@?~rok$Vz(g;K!q|qYsKG?cAytKqKF`V@z)NZOcO9&ElzK76 z-aHv?>KX0MyX0Yg(PU^HapZjJx4jbWkixS_t%?5`ZqHGF1JqncyO6O$HRO*n7>B6G z_%vVj$xgnzcm)q^_jK%R=*t}0F3AFE!s(T58+DkYciJ8f?V5|L^oDoGG!oSoR|(B| zD|AgdHnoJx%s%=cx>Idf=f{MZTuLC z5T=o6&Q~qx-pKB&lJ2$FbAy|Zs&{fp^=15&R$o|BeM%Nq;|P){&Peu5nHkkOAnnd+ z30jm=K`$sYQ}LEScx48XTjf>P}gA~U;jV`blJC9TWZqrE8mVCjr z!AkeWN3j+PF-Sipo8zQoax`4duKi6d7_ZGF9r7`1ru6N(t9eCr5|7NeDcslL*$Dha zwTaBuZK^TnVn-!SPnZOecEMn_CT&O2eSX4J&>1YiL&s|9?0+@E)5T2BwHpFHsQvK(>4MT$-yzpSbzg0GZ|+I5q*^HCQxX0AU7?iWl+-l<4n4y>&rnuKx(Da4u5n=ta)B zxl9$$E4LP(2pQ})#6AYPHORREH#`xN7hKauP&d%ec5kr#3TI`+9x zFQI_JSCK036bjt@LV)b5=L^C5?KBd~dBAga>y#48X-Ysj6&^5Jw!@%?u-g2- zpg#s42=z#grNDmztfXk?xnOou(@P zJG2=23)3ppuLy#$RgCo@lbVnPLG>z;u8i@OKo@^xK?49@6XacsYSm*oEh^HmPjtYB zOcbED@+sW`v;@5~#XI85Xh3+SC6E9~+O_(ErYlWu)-&`0_| zf2yb*yQn&gH1eQ*W~x@fDl&=_W)->(lYp1Ku%A{X;|BAtG=f?O@1uXdsNcVttHJa0 zcPRL8i+Ex=YC2ZhVxrql!EGPp<}D-zSZ;gy!hoajKZK3K!1{4i{HrO5_yxm2g<28+ zl)-(7HJoz0xJ~1nrnkL& z`HI(zWW-`;dc3*s;7%l?a*Fzlw`pqxe&L4>dV;?p0 zNuwd?B3!F^=hBBm%cuMNTPPDh<7VP`_P_#2)vCk9+IU~NPeBOa9XJ=M#BJgqtVMf3 zzlJH=(XfAqmA@H?CQt-OG^D=&GA$17hvbfvJ{!x{>L_>6eTBFk70L)I0vSPJ3k{aS zT6uu+(Po`deWUH5iJvHmA?J6ZR~*5il`Ut_}o|b^t01Q)gn*{0HzaG;rlR|f1g|Qp1MZnpeNOdPZSS{ka0Ud+PtW) zsuj#iY-8jmGJ+P-T9Hdb3+k*7tFww_cLSR-U;SvReEp_fUC&tGbcWMjV^^f zei=NK+cnzCU&}=lP8N=}iUs~DlPFG@Y~f~2A~qOsZiA=90mBh{(=Y1p$9Pt|%nf{9 z{D(;v0)KTfT4}Rqu#mwrCnAXbgSfe%^L@|ZlZ4~)|A_US@`o;X9~qQ?GuC)!KS~R< z@`3@Wvwxp4gQ=%aTfOBaDm1Pf__d*%VXG2QlHnCgk5zTeA5$NFTO83e;cmm+tw0Fmq^(-%Zz*S9v6?l0P zEw5Xp74NvaDZ@zC5|4z53161P;tgng(N9nXZu8@<}D$j7TF zzN^i# z$9Kl;`yG#`gWq|ZJ;8V6>KuG$OYohJ_kKq&4*5r9Bcz8Pjep8N|<|G5TAKf%}gc11O~$aR(6k zM3u<6O_k18}XkP+$w~9mG@; zDxq*J#eO6IkSxmo>T`qR(fz7tWO`ge7CdR-D8!2iljUu>U3g%cIIHS2lxDLyakI19 zn+N3;pv$ptL+mCt?fwwCpr2CY`8Vi?fLeGu%)KHMYHSDZ2>1?3bDifKS@7aQfgf+j zR3OUF8F9Mxq!i!~(GxP>?grS4K)AczpdTaT9kDv;Onqd!U&QP>^l1)ppn#!Cm>l{z zM<|f9|Nq!~_xPx)bKyUe1PF-kpj2av5^b!Y)FxG1QlQSj1ZHreD5CV#YTkw_t=LkX z5o{F(_l&UJ4yN@+Pj9?!J#tQMYio;$iV2ql@D{)eURopGW;==~8X_wBeV=FTxdidN z=l$pX>z9u*d+&9B*0Y}5de*auB9G2#m^nQO!F=e1FrfJ$T1ijl(GzPmEF3l-^g@22 zyu}IgKE`wU=?2GxV;6hJ>U4ympm_csPHggddh(=GbyY&(AQ+r-iQHSv?G=CJBe*l$ zk6<8?5zK{F=Cq%csuwo8A1lz2XwSlXrFf2T0=;FmR{APF7K+>Z&$m*imSo#Vw&eIS zYuVY_%BcB)rQalkp0X(IN8GyM)x(5zicoYR!{Pa>Sofc)Gj*B zea17U+t<~uWHz?*9&)d5;k1ZIyN&y-<&W^`+)Vf+g5OuO0pR?FcW2MJnb=80Wd4Jm zLT;A014OKH{z)jevFmfAWozgoE3-gr8xgfTs;HrQo)mAD;?H#K9%aAI$-qG3DHFmf z)Ob-<0wEMIIa_0L5Ae-87cm6fZhFFNJ3ldoxrX2D*Kd;uir2UJLkh^XKQebQPE1OE z8DhJ>n*!eVjY%{t4_JsefEJl!W6MbYx)4JT8R zdy5>C74oqBN*J&)RA(<<3*r6_@4}kU3E^a~$`?IrP@vFXBe3NmDD+FSWn9xFj%u|x znnq-T#e3Ro*K)JY{m!qVl`!V!RK9`~Up z_ZoTtA@O*FNJvHNl+0kPzeN9*1X{F_W z5{t~38?NCJ8F+am%IO(!H}8D@(ZFnSYHgJ^1=)}tc#taW)MrA^5}x3i69j_Ni-=+n zcQg?lO%0wB0fug&y3at5ZVc zw3E{8Jl#AN5RI#IIER{(ExE9)zrhm0?cB_~!`XDQoHxnotS3~wM8x5$-}E*<5I!@n zpMs;4g&b6hMPV=0n>Y!RK`|kx3LLI~BkOQ3JR0oE`V?|R2zpVZXJj|r!lzcDz;wM*Wiv1+0^t{LI%IA$`{o|t>K8~$e{ zQL&FBEHk&V6uml$lf)Q;G)icsx%`-|djI8r@FTDYW?wxjBcVWoLe;P+*y`2d5F9^$ z!%fBEW$_XA{)#mai83pUZ33`rXN1TJU7LY4JxWfjx08c~*2j-ju59`YfGoT6!tS!i z{92|5e3rG|m6ZI@5cU>X(kpmSiP>M?c?uMGA7* z7O;rNmGR^A7^Vj=@;sX){KdEco5d`hEmBB@e(;K9jmfKSLGxB+tHxV5KI| z5Z`20@n{_`FmX0ud>yX)_0DsGp3-x<4QF3=!Lm>KD~zb2QpcN;L;^Jk@)3%47CCs6 zlR2~@7|oj;1M&Wf7l5H@a%S#oP`9$PaUlUg7Lixt`x91kvdA#^W@r6lMQq<8?j*MQZ0!$`V zDV>i9b%@9k^CltcnpjNxx`}N>++6UPqx{)Hb`OR)D}5GHp7%T~D$rgsUjjg+)I2c2I@hEONWZ7$x|spF7CMd}QA;_952pRc$kgR*C( zr-+hESYg!zyrBSr@{&mpwkx>YJ7$AcKGcd-AULu;%c;D8hUm>#JLf!6LxvL|4rN*7 za#>2IM`JskJ#rIH9{QD1_If~iP=|ZNo94pxC(;$~E_5gXQB9y-&(d=M&tP};y^Dt5MOTcTnM5i$I`7VGG5BN-FKvwzL1Cf@X!1=z0xN&nQvYeacz<)B=Mfb-<%|8KH|?V z8Z$`_rNp0@BmqRM^s!{jbxc|UO2pSLZm|2VveJX(+n*+h1D=)cL#oKFoK!D`ezEwA zUmnYYhyzPsl7yvSmR&J@mrLWkI3t@R7ynu5N90{bYWO4P_2jS~vHB!F@&`h#!y5AJ z=ujp|nAM;3Ih`H5M+Z8$9f-7YfAlMaWe*g>)IAWO#ZsOAC4*TUm zd=4=@BCukvzzsESiPwpJQ#|{y%hyKiEb&CT;^z*?ljsQv}a=2D-wH z@5SddHSS{*AY`2*n}x+K&>!2fU-%xy7H@&ovB%Uiz?&sW2k@cN?!=GLSfueixf_k# z!!WcTP0oQ_3i=vrZRWr}vG6khBlBa->5mefJiv94NQ3Wg`!Le_E*FdJ;cShikuaNE zw{hkeA*}7=_;umTxB7EOYkmGaj)BoKkDc++%wvqLR-Nldi}RSbhsC(UvydD=FG^JT z$O#tBB*x<=5C`u%xns9^Y^Q(fd z*wh&Rv!whvcQ;pW%dr0{^Tr_JH%b4!tH2JV_bB>Nm(PmZrdCk(MtuksRdFOoPzp^DqZOGNHd2)SvIV?vI8K_P0yNT#2x<>K%Y zb#GUGxWAj*7KTHqspA}`cL zY`kyjPIk@nclTrJ#1BIpt%)G{w8`@?&O8!Zg4^JT9hezep>(gyRN!wliglSomYScN z(O-_bzh23UhV|ObL)0}8li+9nB?-<;1gTSe5#+H_GKwZwJC+Oc-TqN^pkccks__vm z$}JNy(W7yiB=i!u_{As2+#_QS5vhhre5vVyP@r4mBua(iAO^&S`0<${jptSoN3YA= zmy!FO_$TILH|08-9Bo(W0A?0E*19;a@ve2lrObm5JcV2VTw}qU?g||uU|ETkn1{!pyw&>b;n08UHYTT>o5(hMD?3e+?S(C6@nt2I>O63%Q)S}z?ColTpVH!e zMVCadEPFL&RL;&lP;5O<|MnS{?_Y@^kr!Jp47yXp_I?~5MHNADvQjH~AWF^ChRKM(#;#K?B0)_{N@v_%WLZ z__LWytdKzz=S{WK-O3ZGk~_v(6meRbvXFZ^@Zo227E1exUxidV%DpJ_%snCX0r28o z&aIA=Xb>MFl1&2$OI|N4OTtDD1niyt-kA!PFxtx5!{wx2SyQSvept-;2KR$#twp%% z&7Xzw9Lz6#5ed()pnGB1?gL&A&?$|;crOo}G}u%N6DQJCEHkk?>W*d@i648iZj~M= ze6Ec8Xpk9V;B%K2HSl?WZwen1I_911cz<7{K1>I2~50Qh}Tcn zt1L>hguJVLxxfe9ZR7?>xu^1alY0f~kXcVJWsfG6rO7R;a%nF;J(JR5KZ~vk>A{{s znoF~E=Gt_88t>ZNj}m3+oPL|&krxB&k*16fb?{y^eKy35-UG&1LXEH<_q?ZG<3W~8kvXBm|{NgXw?CeTiH0gRUO)QsC5`Pp&FbZAkh4m}e zv!=kS!s3ftEa@odAlrmV^_mFTFLG6O9=|TEr>kP#!Bt{B@N>@(ckHS@Obm6nVg_l` ztm6SU1sB>IFz}`IR4UFdhpJI(t0BF(R;1p-Z2CI9RGR5j=d4O3f zAwy#8HbQ^=^#O1)N$lx z^$kotd?ioC9ts%T6nbBzWI+CEj7=roZZC8jMl0UB%1RC>+U2`F62QwbHbgKL@@MB4A#q^+<^OH|cRyACO9T5;9&vVh&rpZb zvFE*`bYf6q-t_w5m!-=cyfN}csXQjkCK3@94n`@o`ojY^>yGwVthQ=}Mj330O3){4 zRdVz?CQ4r(kKI46G!up%hOjg=Bt#+ZAbh}#?u4?$NfXmeYo~YaO60fvP2|6j~bc#x8fjux3x%k!rZFF zdt$PKr!TCI+6!wL%oOg3kd3w08m{`q-U_Ht8+DtJ4XubXtpy<e2%{lmUdNgfAV$ONRf9aO+Ax*B-* zR-+G3t#)nUJ&wMsHtgsJYq<&Ie5-1;rOL3bp3HUU_lMTjQc@Ms7)#MtL?<*}HOl)j zEwz>CpA#A_`%3A)S+cMBLyNgz6D4YVmz~!>MgL_0VXpF06?ATO_RPoRfPPaMYUnjc zVtO&8+?sYlU9Bpiy+ZX-w`$^FmhGt8NPugrl}`OP`sn(^%Q4qoN&lOL=zPFK%+;~V zW$>wA%e(Ug2Q^h6Jwiz0Pu&Nlm)gVJRMAI&SkOlmF`^m5<%f_Bz4W5K&&o~$w- zHw1dpBf|E^7+Xc9-3km#=Il5j1%|*J0 zgn{GUH(22c2YJVrMizWyHt~*kf{>5GB`Tk3mpIP*0^Fw*AJiT(Tv)F`h*x9ogM#ZI zL=hLF_F1g6A5|yj$qk93vvM4-8Iq$@z;Onw54j_X?VG4fM@Jk&xx2?ix@704jDfN> z!vg9}yu?sBjG$oULQU2j`~{4z`Dk!W&N2r-g=ZM0H&F|Exj{4J$oQ0)`;C~>ct|We z{nJ>6-NVPS-<80xX#ZGi(9W!*0mygJA&{?Dkgs&rVmMm7`EIOZd^VON2I&JBBvowl zQO#=+X2z?eh8F8)v8D2~5h`N<*Xq|4vH%K|> z52vXbZMLptnh&>Qw+Xzg=MB zon)X09WI&A0q~4E>#bWZ5T!xl4r5^Vl5CV|dxd%Tz6D6}H}WoFmgTp%l-~>gj&bgo zWh<(#?m^6&$wg>fm!v+m?o`~SZma8|*O83b%8am8D7FIm?dDg`_p|WKjQr4Lbe5C&T=7f0eRPnU)$E?2vjNw{ z3E5kxm-C@N`{;u|=$GgaLl7h)nS39hg7VT%r9waJ*k`-XijVL_F?OdA zVZb7`JJ0^T9&g$EPq$KMGXU-!;38E{e8@!y=@B|UISzN5p0!0^FKj{z6s3P4tXZ$I zMv;-ySL#Y-Yg?;Nv42Q2=@+78uR=76huAq@p=r0(iMKI)FnxhQCLiV5F2@{cj%P*O zA5>@W*(j_;)`;BH$a0ocDVhDbr0~)sAOc+S+w;RO2C|I}f1(Hh9J0T?TMDz$o4sA0 zmTVM^DUo)dqYTQ|Ia8FEk)Lj*-v@I_ zv!n41&_Hbd5(ve;xk8*Puua?jgX2dL`yqY=R_cIvGV`wTPhd-qt_9^pRSo#hdAK*S zRlmt#M`&(gUDS!-^Bm*LT-(oKO^W*Gr8Bb`2V-ID@v{=_JlAivH5NHRW2BbkhSbK zAkVjI*@71qnwb)4?66X=@VJ&)?~kk)`+Q(40%CPQ@1rc~*G>PUex-jvE%>z6lo1%A zbyiS&M^D(=zNVUOhxCg8P+~fOS6-(mEDASD)Ro1*F9@ytT1+mz+2h|53(SSMYR1nD zxo4&OuRYrLAG!d{!AG7GYw0MD#d5vbYk#Fa=P9`_RlshBm_Ckv5ddCJL8@H!cfX;1 z*}iv;0+bSAd0+>=%vQSh6P;YMKAdgI*PdMRq1d{D)@_|jKGbWeZfg%#bq1H=J&&?Y z1LE1l{aLaZJD<=bW4rC_Ai2@%j7=>RY|ezw#CNH>cqjHCEA=zg6N2LHWI>rKyLy8s z1+CQI;lo503F^ALhZi=W&#WWNwCMxhyrQ+Oh-R*w6Xnw7d5{VT%U_=#2N#xC`Bdu+ ze81kz=5V&-pmgGy{2WY%{S@hGq~ntc1zI9NfXGbX2vDS{Jaa9Z^S$84JA@?|+evWY z@qy+{?1M7dwM{Z4LQD(#MjH`Tf5t1PB|GLg2a2AtFQxkzz7WMDs-CDQctJoD4osL; zonSNRJN3<&uwn>_Xc!&uj8yIXjS5lF`vW2Cwl4H^VBHlO-=A2)Md`t4>k|s_c}R*FMMu{b@LLMt)F9MYG=mQ8RYb*k zn9pP#l@>)N_ql@o#@L{5 zho;Prf?*DKg*x6I+|>Aib<1LwE+>rTA{P-EG<=JknI@9`ipY*PB10#x&n*{@-0(u) z{bg)NCInFlx$`#7v0ocP9E#kRg+69?tS~TNB77GQYr6Ql2tutF)|QYA@eg8#^3cs6 z8Hl$hU$0I)m|d=w#2?A0tC-oFJqF*R+<%GdotzvJJ(75z!=s|bWGWw3eBhX#IE+}S zmnDZ=FLzwZ=4nLac>=g}1w{;ju?AHL^7m9@jqQm|!fXZj^5;zftP(8=zKnyH7(v5z z5s`cLKK29nTEA{3sQ{J@J@ErMnH*w|F|~-Y5g4Vo7gmQflP~uJTbZJ0E7$jpyur|R zs3&(7pmBWFJ!g1h^ZZ4}O8kIXEn#OL(E|YdiuA-Atn?L34`Fty^3ceNzfdT%0Co4J z?1snlttWmd{&Nsq?gdI;Kp8nx9f`;wvcLZO4>;L!B_fu0iW(G|X$9eS*(yVNlNUMq z3~UvXu-^LcL@yF8zJmEwcwXznli)jSul`Trd6%|oXtO97`?CM_7UF+#bphk-owz~E z@&998$O-yN96M!V#WE|Vpp(QCQas9C{=nN3)K5E^tz;ep$GTh$?CnFL~-X= zYW%Esr3m{1qlVt>0_K*P#1eImeqxPeTg|ul#HbG%WDj$sT&S^o##XsU7VrA_RS}kQbjhDzc(EbN!rVYM?&L*4nD=7Mgj-x?o}ua#V39_sA~;Mv|r_2K|8)xU|4)i(B4>~G-fCXd5oV{skZ zU%{=$vGpLb;8ExiX)e75rMP8blZg3>ORd`w$agenX7%!J8X~syv4&foA1Ks!` z%LR3aPnBKB$3kHdvl>KeGH}B;a49zd_gN{i6{4xnvAsZ!>)fh^BBe8e`ReYa1s!>H z)4GT-j*bcPe}*GC?|$J|3{(>nl5ci$j@cz}YIeu~l$m zdo(k=o2$2@jhiFR@H(_pAQEL7nZoAG#cdzQob~aqg)_7Ib4QvzoWyCUK{PY6E`A!@ zO9h{}t%;XH?qRuq7E*BpW3q9?<4)@IUl1DTLY;IW(#rhiXE(hCW#Z8)YuS6`Xl{Io z!yY_DZDAQ( zu5<<>l$f2^#OB7laOV0zc*1ppmsc{#2n$*U(%jnFl$<8Iel^zEk2M_o zDX56GAq{6mKf^R_rLPq(3mU{4`x0;GDx%J_T5x*ig08A)cM^4zpjz(faG{Zgfa%=fDq+#lneU8M5e67w|(qE9(o!ciL2~m&w+?B|A;)}=A z-iY`#JLTE2RZ2%qq&Aa@&Qf6B4ISZm6hTg$`B>C~ZmvnUbC5P-8$ka`bu zAP(nx8(LZ{u(@H1QlxTGsND#j#@u1eCp;G+7!F&IBHwW3r?a(r?1pH^M-^dw5V^1V z;<~ypH^v2J>Y4Dm_;+=G;bd8yGO;md_`5o(jZ7-0biT8rHP3qmW)yRWO6K&B=u5tB zwsCojf`(%|qBx$08^NN)(_&d&*yIk)u|>h<*T|22hZ4zYRp~?=U(m#*xx=&?ZnmrO z$M8{PD>g|&llz6-)+n%L6~^nL_D`zH;v>D6Nip&n(6rLqd6f#ulX$z?{d|6< zvTVIqVP283eQIG8k7INTe4g$=dTMyvdl;wg*x2Vm+-OICg*OplC_iK?HHt1raYZ%b z(tcs@lc`2-NYZ3j0pRTi@N6s2FSAl7DXrXA3ScW;trLdFQP>^k$v$gIrOb5Ddq!li z0&$b6_NI!?;B1MVdb5%U#>7~3(ny}@Su!ZMy5VgdmXE@33R?(!dWmGS2pEvd=fuNU zi%5;l&VKJ}{7$${HLyhxS?p=fGtS7m>?vR5I24>8av6qF8<8u_5fNc%8k}kD)<}h+ zc3d)_9d;pZ);_-zew~*H@)CmZabbSK`hb^kTpnAzkI*c_6CN@hP-(9|OhmCio@mZ( zg$uEtoO}GHiR=aUCP;M2wdYzxhGa$qq z-WPlS0pLVW^Zi9;vS~a&;!eZIdsP+W+=S%qTw2DGEbCk<7f_WIFD{cU%{^8|t}{$N za-O6`iD}h}Ki)^|_w&`U<5Z$P?{0Fl5a3BYDY^A<5Sd+D4x(~7)_3*JyW~z8&7^iY z5}Hmc1-4BfVPV+uNo*<3rc}(egZxBVxh&W{e?F3LWh}6n91(XuUr>q`!DJTlTiFom zs!aZ#S`!@SW19-?Xx862F>4ye(z1xqN!+%VtP-LysrnUZd9PINYRg^PLCW(%`@rEt z?Ssg@CGAJ-d4Vdd(c2SVzMZ!@z9i3UTctD&kHgV4+4Zq$GB?)~%+HrvSOCgD*0nArY zKKtMuvLdEbx%VY`jkF^8ERz{^{{FKh*;Md#m(2&xkVU74PXNz;U?<(-IJ-gwr`y!_ z2d4aSMqq7_e4`B?# z4ei+r2VY93xC)pf4sNnrKrNwCW;{W_8;V#=akTiGkM9N)9|&CJ)p2Ixr1 zTch6L)j75wgV?8E#Sp!$=kL(djq~$1^$l&MxG|+la&7ni1S!kgW3oSO@-aZ>L@?kc zJi`ie>+SN_UBh;<9lxU|v{G;K(O)cz`IGkOV%bR*#rC{<*jXD$TnYGMnX@?@>v8R$ zy^6_IbTh{2D{eraQ~Ruy7B3PsNU>3m9K~m6led9SGCoDfU`u4uy^4+BP&}Bz@@K2& zntH&xrDl^gv?loL;{y-edmNiJqQo=BzyATTcA$yZ@zOT|sAH|2>WSEzrl^(3Ax0(fiq%8Pv`1XeBzK0f9z6&JfAlgR| zxala{5&n0A^uvvYo#|nv2du(Ji@-7yBfdGl{SsemGYDrllhWTUu#iiJ^(EDArKj@Z zeFP0P{nzi_kBjeuY^5m1kh>o#FZ0&O0Hj7LNj(52tf60Je-C&YNkHBbS|zH)sX~Uo z%|AYT?h^{B7~m+m@p5W_SR-rIER%LwCX=dfgl?u>DrQ?m`i;}{6c!Sh=GUuNYtgt1 zeKP()zT3LG&3?d6VxK^eZF%?4rusHn_v}wB*0NAFCvzY%EIxmr zPJi}W^CVa*3wH+b$M@GNot{Mj{2?NdNlC?@Gev(f0pPhDb+81##%B9*g*&@C)VWky zghVwt2I-781m1E?E!w(K)~^_nh{4x0DE$Ik5JM_M&i#UJi;mV-lREvA=4-pn+76Bc zG97+C2%Ko(QQ}H92M&as)v|>{Q28t$BTGKKSJ%=RR2Ztbv4tcwPq^2)>+Q};`}L1$ z(^)EWL2W{eY13N%A5zq9Q?M=Bzek&XlSGJ@@NWVZn>Ln9efYLVCUq+qj?g?0n+RDz zOaK%-_G-xeQ_9$;MXc4y`6oboUkF;i?Zh5?E{^0@>PwVs=*<(&&^jUexr=0-+7GwW zmqAv#8w`+39Dgr;JP2+IHNED#&FLPyS$W9Pw40P{C*|2rj?XL`4Zim02ac-bU#u6A%9}Y+H4-ntPv)F z1)sY4B(3o%Ms9hu(m!O<<@&KUzJOq14VIjhpr~x5uYS>fFOYg6wCqmVO109Wto5d& z04@+8A8{Y<6W~I{$3fkWDT|+!!W#LEf;BBz?Iu@HyR%fTt|~4GH!bk9vz2m|@y2hG zJ(PT;jQYzGah_DLN&KKUJ%^O4_*5S@B2u;sF*=dc3O*eoPTI?5)TM5O-JpUl>;$J# zZa0f6#*MA1oAf}?l8u5o*6Iy;#)0cu-u|l`kW@%7cok2v#QMAaJ*Z%Q5&440>bBm= z^|gt^?Vkjz;zPP7hXsuJmS4@?DfFe-dROWuVeyj3J6}m3^`ZAQyr4Ff+?CJ=!)A2B z5MQ;hJj4$jgphU6xZcYASza5Tv6kP(gL<4axl4ubh$bkL$7#drrK`y8JdcZT7{`DO zf$SdcibrXwwwB90i|I}2$5@Q`U~Vcx`NGGM(?l-nbkiz{5LlsAN7htkukl5Z^Ua59 z0+&d)l*czYdz|OiEfeWO_&Oa?QNzd$P!iBY$O&onn&yt&B=QQh`l(MY0dVZIyK9X2 zfp@!@myP&Afk?ix8Tp5W`G=s9JyLZ^`NCiJYcV4{jES&5l6;Zg1xwjOcE`mcfjneV zsozur`W~6ho-L(KQub7Rk+6osbHBqX7g>aXaI0yx*UY=}Lk@BRW#Jdwit}`{oP05O zrEpKLgozQELD#62{<-isf5KR5*=qP9F!z4K_q@C!Lev=3arFfg=?QRsum;xlJ!XJL zC8mTnt5n%r4WBBmFI1`;=YqQGb;qzY`nw?|HEd5-tHL4lE1#~N2hk;i%)8{-PEGmm z-a6D4@Y8?a4jJ}-$tT|Xw|gx-`Fz<;3v~sc)y$qx(S*<@*CbEigOxfCp6xDM#*3OX ztGW2(gic(4n~v?}T8AW*HDvD&c)c`Edji&%4WjmU1DoG!H-ZEDF<7&vs9o6ujBuec zd10R{;l%eswM&I$dH7U{Mz2?|Vzh0p##Mxb~>#WyW_6W`i zvhA|tklARL{wOrNmbUOk{z6?#=lYKZFsdq) zRx#giq-&{+MgFL1VX=5JUwmN8j}(e6D;8@j7F%)XVpkN3tt=K>RV;Szp^F_;D7L0p zti4!Fe23-lAne7k~d~7N=v_}zSaz~nV&lVg~qBtPLPjF*h+`uj7bUzAD;$;)2!uH16A68tmBh*N2 z*GuQblYnTky0esB7|<=osH*hm0wP&M zNikCs^Rs7v4tp!)G6>|GoeP8UdCCt$?&PY>jAuD#dCg3W!mZ~A<7adF za`9B`ALq-qU^MghAwgz4M#NQjS%jyE`^}isrcVNNdx(4r&5t^h=f|A$=w0RcAv@JI zgRCHeY=9(w5$e71V&1urX)lYJ+3lfY_&&|&`3{kBkO-IYLruXdH#kQD9m5|?BNd__ zL2KB?B=UQKE*^lJWD^(4F&AfpmHHuhU|CuTUM}pL$ZFx(79#08e(lQb4LgQr&e!d+ zJm<}BU37Q9crjpJw{AJS3K_$&WPEgL1FYueUU!89U5y`z{R_!MZXAikT4$r(SFy(;Mw3`w zB!u5olk?Az{Tg?owTI|eD9|3-)<+x*HvT$fxA0rh)(tr7HKpHXw`d6=Ej|yC2xaE> zOJ7nl?X-!_r9JT_u{wvqwGN<7a-F1g~*HzBj9-($w9GJXvH zvLQTM{CpwtEt;bGU1c4u%c*h(L}bUIP$&`nzohm_0c2rD@k!6mrSAA!WQ~p85^)|E zII__rz`5lWNKTBs9=-Rf7W~8SJX=1CvtukBXOopCaI(lviiFM10de>kW2Jwmof!hz zl&A;t$KwiGkUt3cO8J@8;x0s4`G@q8Ch&Kk!^s)0H`Zt|ZEjO#V^bLcknM?e&{LJO zo!`zSce8W1SUvLoRhX&e=9ugR!bSs7y7*4^+#!FGz-jn+)kf`&HTFkC5`SrS|56Wp zb$#7W2cqtkRd5cu9hN;EWt~<^M06y5oK|M_$S1gQlX^I^Cq1YK1dV?;mTBpUIj=;< z?uhK$5wTzCi3B#}PDY=YU)>d~QJRin3^#X7sw#_evmz4~9~-sbs&!|KN^ie*2VNi5 zw8YuWQRYX>nT&~NW%lSn0{SDeti0kUzT3P(SkwXpNfDU>nRXdJa4Z>|{P8Gbl0T>I zX0RJ!Wj>24PGpLWp(U^Kz1B)anIbHS%Veubtpy^J%+MLxP3eOKoRz>^ykse>0$ho9 zmd9uMHJ(;5Q_TWt{N52Ux+~RI(5=2tNw1Gv>T0wY&M3iFmh&)EirZW3kyAl3;lJj-%Szb7YRM3(daPf$$k2qv) zU8k=Z6?7P7BoIjQg!H37(ziEGSn93Jt?L56E%O8c~qTi zzA8n^)=0V6Psxrt%VP6k(GEBXF9k!HPS#Xzvn4Q>^hH-+ft419{{VP`vL<|30Fj%u?gcevzXM4A z`VJ~0S2iKM2uczw1LPvy(`5JNyJhaNe*aUg-`RW-_O-J=r4-wRx=cU9o%lC2P(&LE z?e~zuocIf=Es3^ump4m@5os?($=vdob9A(8@_gyDcWs}HN(=--i9lpAJf)_CGf)PM z1VOw# z3JZP*_W$2vK`8=!VbVbepi5zZYP_cTGg092i6tmdtuJ{LI8LE#mC<*q}4YvpvfHGdqXEw z-pheQ&P7pMW9QL64DJv1<-a9D^^z$r8Eo z{CZ+4=zMY$#nY;K(cL$HXPhw~4mG|Nwqmb&Lzzl3Tg_gpJAUrMTEko3>z`5MJqCX? zy}`zR^J!%D#2-mKTR5e&(Zi*&pABQVVF)l~uWwsEZ~?J$6pOqV8MT!6Ap|8)(Z%Zz zfH1(YvvMO(*l@_9a`y3HY zu=FmhZ5Gt3p`GnSIhsev21Q~|u0aEjU_)?)YFVz6f?`lfT}Ji-IYNNdV3qoPFmWyp}Xfs6(G*;^7@NapGPe=piL|6jnPp?$yvl)2~3cAhjB z%P#5vD>G>#_AKd_b13nU-Cu2`vwW5{YQj%eOeOHBdqL-%j{S!dlsGf_W7h38+~!iQ zGH(3*hIR>}a(jEGGPt3wp&bLxS$v3p$=+X;s6S*qM;7W?um(eLS($8Jr1(W{79IqW z1k={AzIRMiB31r(RZYhmO=5mgudL~&ZX4SGhYwF;KV>p z?iINQ+m`h2q``RAlKwaNO-9QxntBzU@tW*Jx}t@xx>?D!C1q1-h3pb8o}21y?wG`s+4r{?m-WWy}v>!@hp9 z;j%VokN<9_p=}LxhUqArk6a_tMCrT89Hs9F^`-BG!zoGSKE&M>bm>6lf+23@Klc1> z2E8g)uKf!r2E?l*TRA;1&7kGi$c!yH&_+WGs;oy+Uu*xXR-@w(L-g7&la!C3W+FJL zqfrfgkF-vk*zA6&@V~2L*h*6RKQuh6RH?6JO8>{Sg%kJ3&;SB6F8e$1Zl8+6~-CKlE+y8^{ zJ@C={av*osneJivVfsTegGoMK*|F<$L$?lH?;NEEcV(RIoC)j+boAs$7=GiwA7Oqy z6VVcDz*|-J;@Y8!ui76Cz3MymN5ihc_HbBYrrGrXLf`&Qe!WVNEkzLh6a>B>M7aDJ zz@uhlk0*o>M-$`s+quE^M~5#sufOh}wSNZB3-~ML8`_KY>B`UjvOr%n{C3VQz6-v4 z3t5JIVx15PxUk+N0<#8S?t?N`2z9wls0%@yy=fHC{34UN$t0@;^=ePHEHPM?VX&;f z$JA%i7ixO&5a}}Cg32G|1G%|Nb+E2FZm{|}!esYdXr&GVHDj6Y%?mv&E0+^l*>|mB zWzLjZ*Ip&i$t32uvo0p~S{-iy>m_GOeRdu988}nM6L$@dvn1c0DHB7u?TP);NMsPX zU+`VR)K(IOXg&s4J;1`%1a+&b6!T3 zb0}T!4)!hMmFw+=L86(cFTMK4i4=)<$LlYaC0b>Y{FSh(D*k6GmNs&CK_6BH;? zRO&t1A_l^Qm#noYt@qg2`!9~4?M|IjjLBaaub{DrduNh7{_uX@$20oKdN--ebJ`d) z&pH#6T3%z2Uov>$o+F@Y*iK~Uu^sk@gA#+?3*#^k=c2mY3dTpj3b-qHBloO!CtrWE zfP~78!<}=T4%`I*%aZ-V#p5SKk!E(_h9JCY*a8k6^w&Mz#!~S4hT{3&4cOm~Npn}* z&&Pv-iBn7g_8F6Vvltl{Qsgm<3H>VY7sEF` z%});E7e4zhjM?ez-&KSF_um!e6_HI+AJau6xWunBLW`9O3K$G$6}+)h{hCP``*6e9 zt+d3=8o*gARC3+aA|)QVVDMmPoBi?-`$Ld)wqy+t9-im(_mTzfv}=&zs|t@#$tB^= zIdZFP)xJ)d6)SzK7V6!EilZp8xufrMDwtH5AgLX@@eZ==16*q$5v)|8ct;-g69(YV z`lXUHA^PBpF*JOzTt?43FO$B>WfAdV_WmJ8w5d`N3i>5d5<(E-0Ht}S-}!zdTmyXl zj?@s}Lmk)T4jP%uzzRj;kJG*Q7wN2Ob5_%OYE9BdWA8+s$hWKGS-^sVJR35Z36}*n zv}yNB@MZ4?=UqJq%K6V=Z`YS1&WBt;K)K}0xW>QE`t@W@7wEJ1%cI^eaSs5WOX;I` zyUisZ_3^rldn~wlx1@1D-PPodEE7I@Kq~NxxRhU=T+0x_VMkW7332U25-vwjN%=fbd|Ihm0+jqTph zmRvNq0(dhmDcX_wAJBr1$Jqu%WJExOs|2haeXw%he@OTb(LrEAt}g*uFLSz_P1(ERMCE8tMBURfP5Ywm!%1rMLkyrCeBS=#sQBlKRNcFbyAll@ z&VJ$ea&dXBBHUrEPxF<|oj#zJ>=~4hY}WlS@6g4e@8tWZ@v)zfZpK=738(ykPU5a0 zMrfj75?=DP7CIx5fU2^K8nnL~IAL>AWp>Zi(rL?tl6DDoUfS)CSoqIU(EjKs?)l^) z``0g&;66sk$+iR_5}eH#=Ut$gRIJ`x2#o3rUN2=&B3z%)&)9}J z?uZiUf$%8taqdqG;(*gI4d^$5@5$GbYlTG`5*jR1{w(@fx88DlQW*o6G`6l{bk-Z8$ zrp+$-0Kc6&TS@!CK`9R~L#ohv3IH+cmeOGN8jd~W{fqnC#64Ds|LyI%j#mp!3esLJ zkt7#fi*U7gd>JyzTtGuV^p*^%+UF;02^`@A2T0(7UUkqrZbk#riMli39fy|z@A%E= zyRYEp=_AOZhJmA#h_;G%)Z@35CB|8+@B9Fn zBeh*|I5C0_|8!hMe5m}MQNaX!ySUzPLR+7Ey4c50^@pjpR%7BozbTJ@AAE}+R?u_; z?F{+Dat&i$9=`-%nD}CjKR;0=QLV$Bl33{{o+pVvki=S($X(=^jN*jwu898|x0Y>5 zB5hdV4j)gQZDs-HYftK3mhv4v`LsfKbDB!w*Dd zt#CHSha0$nThKnLKzoHIwP-EXQcFSqI9Q)G?akMm^@nKBq|ep#+Rsd1rs*w*N*7p* z2BtR`OsjRL#tpQxY&X@gK1Zf|?!~=Z`izpEl=XxU={soXmC)|CL-)5$+nax=_SD|9 zO4C<R&|Drv;UCoNtr45eU(85}=4;x5^##me3VpeN+{(XI-g)VxH76`CPQ zz44d&dxXCl_}#1D?>%ID1LYMqqflJMmgfMh@@?oiJTaSM#uA}~^Mq1Oo*y0zpF^!* zQ<%>@h8sPyd?TQVeIEfaN(+S`?U)rnM>wGG8fL{m}yhP+nj?jClPg= z8qY4`aG=&1^gccZ|6=zS9e}Hh-p?+`e+ii{Z)LwHUodppeUr)YG42#qco^I3X=dTy zn^K>|zb+Rpe6y>m7QPA)oA^K3qkXRy@JCo!HAWE`c>jVF8$vNkac9HZ`YhPjl~eM|_XOOtS%VNZr>PbZyJRuO zj}RGFh|~oe%wlXRb7skE%xdpzrT3hQ_id_1^-|b<`#a1f`l?LyX3g7k2z)W=do;aX z>N=!7vrp55pP60;#l#-^ndw!U-g1a^cd$DQ+AC5P8^#!DU{C zhXfMGu>%xu$;>zaLs<|pnFU#BH7t@YhMw=EGigIhdZeNFT?6`->i^IAUf$DZ?z! zh!Whvl7}^D#Et0b)yoqpPu|w`fjrg zh#^b2cv=q1z)=V-pHB}Sl-+l$RR(1O^Xmzps0%2QIG6l4jFJ3u!>XVE zjVn3&78-d_{&|xBa`NA_3L9yipLci%bvIp*pNCLtbNp(*&iK7ToXz^Bdnt-(KQ-7W zdCF_4=ZAhha*gqz0D^{@PszVBpWh$XDZeBCIez|$8_EB<^NRW76X{?4>wfac5JQlE zd^qLpZ=dy>+7cfWO!X()*NnM=LT$W%m-qPW)b{w`HA%Fr4SvnyCNL<-a-gHZvV1u! zoLV0r&D$5&{O%OeQri>9_ys;e?iqAJ6Cc-{_c{4@)lK{>z#O(l=%Ci)=dEVa2FX7q z$gAs!yEVBA&&LK(;nGE47G$U)Y-Qr?V6vZSuDg8DV?fNnZ~WFZ6M0#?fqz7OBxH0Q zeQHT|Y})W&F41{a|?ec23q$g+BW0r~V-HXMdE_WA=e6T|8w6r3yVW>1J_t zqbrxLPLrPdloYjB?6yVxhW>n%y}NfW z0mdp?*2+0Ky9^wGe)WGFz?5nFQj@-d^nuADpIlVsPOIs?VJfA{IlUhr?cOgNqs~&P zCv%}?@7fc%Xq0nNFf*gv+3aj{&aH8lR+8r3d(sDZpwx&jt7djCs_}lsw^I6N?3cy6 zA|>VoZAN;N+MpkPBI2%)&0(|G6=~Jl9%yDdb(=WQZFYz+b0W3>=Uw85b(1*$F98NO!u z&EZW^!r;ij_4vjce%IEXO;x&!JrhD7sqYHb@c~!Y;28NOL&Twar;^%82F1us+JYw6PQY-Qr$74fS<_-+)UKaAj1<`7}>%KM+z5>q& zV$z`7CLoLv<$@m{hGBR5sNzn0q}H9zZE^$q7j`1`0QSTt{M)4YsL`();Ah(&oXhgZ0NX0`C$c0%Oh!9QfmLk9jKL2LqQ6b~pMkpgi{b-e6>@DBCJ$ z@-8QqFuAgM5ZK_a>jK9;xIf@p%^Fz^$+gvoQ+0f(yL1J=*cqK^aoHabeAI{;?h?VA zjy}}Z%7VQ~E)nh!Z~1NCYhAK=uQg)1fYir}&L z4q2)Py|L(Y$wKla9eb_WWF2v%2uSYaQDi%P$pg};@JOj$>atROBvbV8d$i~!o2@ZY zlK)5CxKT^iQgW2ZUw!!Q!P)?2O&>OE7W^)YSspzo%VU~lTxph72W62n-0tLh%pJ{a zj=1LsosPgZvjHRxo6*U@PuaTH`qrSswX3rkvGlY0@Na2#rbDk%6?2#3CqK&S!@I8^ z*z297K6q>gx zkeIltGEr|m5}JD%1O2+3?j9X+|9USKat40kQN5ubRwjtUbN=|`TKQPE@Kp9=-Dz_a z&)jJ(=2v(45$97&d*GS5HGV&=)i+2X_OI-|A@Q+dOscy~_8O_uTKoE#s|Jg*2GgyS ze@iH$<{6@SuHJRyb43heb~ z*}Kk4?jK^^vHpZ^VG57|!DpobY?B3Oz1=L7JpAN*T)KUm&}_lh%v5#+kFZuRy+>NO zW4*5Q%!RKm(+?O2ulXEZ7-9Exm@l-EBqw}n^qSH9E*S3gTI+61K8m|+&*;oZdTC1b zbU?cFv2^s<)3J_9TlUMNS-*iT&i&F2dsq9=^+UHV)1;CD>ThGLLpsy$+(^{%LKrop zV$l3nZ&KWp1M&J$ATlZx&||B31Dwgn`Tr^Z#E0Aj2O(eb% z?A=rw4^zju+_OgR=h@%G$QzRk{_?%Hq^dUF>vF#@&M){G;i3(0a>d~{JotlYAE!ZUJrT4e<7Rfx)&KGAJNMyg!H}=CN9YPX2yo$Y%KN8%a%39~NfE8UgJVZ8n z!;_E$LDNXr4N5-E^r8&x(=BSybrHfrRNZ;hCWNua76TMn+cAeB(xDiiCOk^#?Uo8JeoVFyX4cohd zRs7P=V72`EEY=zkgsY7+U*wLre!k4GMkEE0~JQh>yZDSy#OqEWkNQ0 z1>Z7n9F!CAzi;09$U{|ETLzf8t(SMtHnF))Nl-32~-zT)(bp7fNu#E-h{ zDoNu{g@RmDq;<3TCdkS79+$Mp*sbo_9FQG(>$003=Dq6%ftdWc_f=9p;{LIQpUgR| zhRuAHL&KTtYqDQq7alv=AMFRFl|X!mp%fdqCvCoMOG)yLOh$<5lNmXq0NBd5&fu5; zu)wjxgcI7)GjvL=U${tHgl?%fn$URJf6~xx*|Agqh%Idj%V=ixx+lw}du!y7ceeUV zx9a|Skg;{zOW45+SgX^06_SIj57Kk>i3lvSz2N}Nq_vCF5})4Wld0C!w*Dlkjl*~Z z2c<$en~-nxdfvm!et!ck3&C#(QcTkFZVNBlG&b3Hpjl8 zH1l;N9R+P zpva%t1M~c@P^=Wd7PX6^={5zf_gm(#kgv2CZ&1CXJ;){Vd^iug(xE+~`D8GjoMbTa z?jhiHr{)s~dC$@2fP69+`O*JK^9k6!)WP{=_Vf9skxva~5@OR}3J4=O!H?iUnJ2Lv z2eeZPz9HIq5CRu-e>gsS!`Xi%a2df%=pKF@O{3yp zlu(L0X-+cAxlsgtamw(05ydD=#YIyb!vj6syV%FQIn zj)*o_E4l_A)zbcC6!v}&XY}Eyv)RqeCFvLY4nRH6+3ae& zzu4DLAn0>9bAH|W%aeW=PeF_pg<*s(o$@g;jG2uK;kkHnd~(gb($j^OwR(#;ZOX8+ zyj-@Zx+0!aYf4fwNOXdAixbBOB1^g!LTtTLkN!=Gg0B2$hd(XZN2mt`E>vD(r?#)J z4lF>lkz+(miZgrRA;=T`1Mp)ygFg;*CS_g&UhLX?N}9W@ExCAX8Da02E+kbT(d{FZGnzs3FHCy}L-q+&n8!U3^e_gh|w z1XHb;19M)-%6xxpEw+-;sl;oAgYiQgn_HgK83lS|%QO;&r?CkZ?w zTF`wCcBt_84a7ab3y4F-9im_Z0u{k~*MBoUs#{Mn$VPhQg3;o9gOH!^x2xI%yN#Jh zwRjCEJ7xUIMT0o99kCw~IG4o-<5ym_Xjsu+1-NyZtPz9dQD(^+F|}HrWtMoZm1il< zbGG zf%x%i2g4KW{CZ#1B3OhQp&Oe5QNYj<_@}0(Ch}RyUVH@IM-eGoAnE zR@+l*i3;HF86~B$ynT}u$!ffU1B^x{&OKG6z5);M_Y$fi`e~4p^3~tGx-49$gT796_!yHSYp z`o4Kzd(iuq!n-gA0{L@fb9HZC7sv}XE%)Ek-(|lALl9LO@kFi~l2(yU_VCsJVvas6 zv)|1SC(qmb(Wa9?A9817S+5Z!ie*d)I4P@qb1H}dJo?^ z?HrZz^Pc`pxvK0vD6&wbPFwjFVD;rR;ZA0q4(xzHjfj9m%%E|CrU0BXc_W-pw5abgv57Dbx|d44Uy%%uY~#Yt?5cTko6^^p?iMIs(>x7+!&;XV*13x{s9 zVb_r!aFc!2zJ1}wts#eae%~X@{Mw+S|jq zcx-oQ-@CZ~;DBi@-$ZiAeuwBGn{l?amajwF0S#hqt;AB@*{Ms|O20ui>3`VS&w0+6 z^B-&Y&~@WZ{*^xh6!f==D}(^HiBsA1Uvdy1kNOap)jqS3<#-HznSq;sS&dhgxGs73 zJ>+WdQj#hIB;KT%tg^tvwA_7da!R>s-3S`($90qE+zpDyQTO_)D94yXHbBVeyy(B{teTuSIA zwFn(Sdz7pH2GnF_{>^+U)@EhoppjoAf#3rw1v$7an86MF{L7;Z1S z!YnJSL)@+7uHFf)VRvWo2@=!jIhrp{>p}a7k<1zqd(q%6l{+oV1S)Toeg;Xa- z6N36FL)qStb;>4evzz5RGVUg8%r@l7Slw_W%WiAT`fT;*f78G29gz*4uIy3N zr8Pi7sY0?*!A7yeVt>vzyO-Ql!VY$J*J1g_$J01P_$U>vJ(g$>VCA~NHCnR~(!Kl0 z4m|Qw9vxaQ4PY_;)}V{trMrlGxfLS6<8U!E=6)$Q;c^(`RHy(~Qkom>ggMFiR zz@{I=^(HGPj!pO;rxOG*BzQo?z7lpx@cv=B8RkyNc!bG@P!Zx*u3c2lKB@Xd7T=Gu zTgMNh6tN_Ik^0)l?4Kg*b{bal1@dBreIe$wEKIDutjz=`fCdP4ePq4i?VqD|c>CFgAfVwe3Y z-XZeWX=mkWY#+L!JfJJePiEOT)))52F1wCW^2eim^B>RfAF&dWFtL~r_8+_KSm9|- zF{gNfm#duX#}nkXe|R-IbqUOI}~KcK#%Eg%cEpFqF9m_7Q;VP&YT zG#S`Q*p1kFCoM0A_-cQULjEQFN-jPYf2E>6srvQ%$hl90mD%5{{G%v9!@k|nZfqss zufQ+JXd;tV9z$c7=-QH%J1*iTbVK8d*6KDvWA-jG)6cSBJ}dd*kOk~PEZ2`OpEZ74 z{Lf}^fy7>ni7)^;x0K{U74sl|66u7Mm*`qcTU zy#0YwwQB2tRKe_TC;`Zo#PL@!)Ny!M>#|m_){(Q9^!i!B@tuibcDwBHOdN8}7@AaF zL88vQ!L15{S7$R%)dCLhh}RSqjT}&|-BnXT5o3_bpvun+bP&phC!USsb(j0kBK-WS z6r|K6-hWZ&gZwa19<0@_+_3FlF{;~RuB_CLSsd;oy0!@S-pX6U_J;P{NafcoCXB|F zjeQou?=q#PbZz_rO8?C?{yL3!CRQ;vg_m=m zG#4^vcsb%Oa4iDy<_A@_0{>iFDs-+GCEHrH@o$E$)%Qt_a>us0m$tu6)`m#s0_>3e z`j9{t6nh3+^UvI22!^o^hbXREk5p2gIMVRu&?UwFR6!4G^)F?lpzU}nY|oY3uMB~W zdM7p%e&^ zhX#$>Lgi_-XkuH)NhUCX36y(9)cUkwm7)bEP;TvnnQ3!4OdAChZ-|1*BVJIjat%po zla`D2f`A}eF2WoFSW(jp(*E9`bhpbm-#>n@Utf?pXPT$ zWqjo_mLnn=%g`;Q^;zhr44>2eH+C_#~LQc zFl~ZbtCo4a3#!~%VdcA&XD*5o{U%wa> zsL`_>c6-8O=Na+T16w{!MNW1)-(qM+F^T?}b0lEfDGx19W>^*K5aqYdmGd#gS4()4 zPvmOn5T5X!+AROoF)}I=&{UoqdDIPxT)x)lyLSP~kA(O>!v&P9QT{vLkM++-8~Wn_ zXXd`0RW1iNt3UrKvXdC&W-fsnaUedmbDg((+a|)zp*}Ylt{bEpA{Zy-=3ltW_7W$f z5DaK5n;m_j`wx*PG+7V%=Lk|*c7K&G;+kO`CWRZ1lRZ^~_0I%fTBKp|{yTB@rBlB1 zNQ<#H6R197ZL+o;M-w0^*0g0QqK}a^$uVZBCMTQWUA3LdZ_Ih*zZP8BmVKqOrchtZ zzr!kI{%6O$Ek(l7<6l-VF2r~@ipq=;B+XU(xR_eBsHDS>da>OIx`mj`(+335+Walg zR#pJeS~P~=h1>$^(SbsyYu{(RojJ!P4lEUxW<9$fpCidGyKC=Kup{4fh)IJxlr;!A zYpZPX|j`!9Aj9;h6!>a+5Wh0`Qob%nu&5M#|yV8H@X;K)u?k zomHnBYq?OYfn!y5&JPsIrAP9qc5iEV?3e#>nGE0~U>#_XTeJ)H#mmR#7QG|Y z#pT~)ZrPAdI!sEo@>P+(s+mbSjHeD1JIuxDfxJxXD=lfF4-+li$!hg<_#M@*|HZlK zH!Gd)kC70c_awna*ApZC5ZzeUljPyLwqZRH5VpOb5b8rmMf-upOx7j2>z`G3emp%? ztrBmMfR!A|?5LIh(H)K*iDLOv?fz-inkVj){r0JtDQu*pRhmprp;#~K>KVY9p$JjY|#j#~Qa zWGnegTya8*Z`z92R$>M4y-RXb`V~<{*{VIu3+TPcstWvx>M9Y zYvcS8Hqm(X9dfdApjMb)#hw+Qv$qSms2A1V!fGODMSA#6kmO|9WZok48o6n8*N(#lo}2orH{i)n)$8aL@=NPne{o^S4@Tz9Z1#Qg zOFBPJc0gsm3Vw>5Cltk*T}pGtnw7{hfAIVELkz4rvki=UYBIZiv#6IjoGZXfh^>v% zwhKE{Nv!|p{F+~xU=?jyqj>4 zlg1+m^VV42%qtOHak6)+KL5<>-XoOh{bXX{WIstN^+euK#)sb2+cK{tGb&%qU$}P~ zIxsAjw#wQF%k=pwLZ3jl!HTlZxAL0s=RsVqMF8<9V=Mgyv)L+y?x>X6G=t?uFvW1 zG5x!jCIWv{mr1U~p$!UnZg=<^TmX89{RBU~0nU=2PI!5{J}f zWerB?YG~SRH3)jGjlrolX%(|JTFb&WXN5SnS+7~bxAb>~_<>m=ALr@uL&}z&#$T}w z`{R>f+lJAtV4{!11aGx`5$uFEA3)uA!XoV(BBr`rO_zfmHaRJ3Vn}CSi+6x2&dT}J zmfn7hbHnL8L<8K;V1mcV-81WHGKY3gv!2ysHavQD)Xe%NuQC7o71ZoxZzVGvW<>IF zqp**->T4dIpFjFX(ob+Q*I14@Sf(N2ELfz;7|n7fjVG#LEz^tE+=PZqU(9KHDLB!( z++1O;C6_xZ9;MY;I#Vad%@T9i`Jv)GFwB3c~A^UhXd^FCS%C2FDo2LTm zTf?FPwE)sq`AXoE)RW%+q0UV3Svrv3{z)gR7`TD_0L~Js;^hTDP)mI&BEG*VKFF`44%XU25AozUqoueqB~N4^c}) zH!;74Lqm^%6e0fGS$X${^mYf0UugrWPr(cX>WX-rO5Qlg?A;r{vGgTQ+ZYTENKqvQRXC29BD>d?mRN6dBFA0!G9 zUn6ANhw1I~QxBVCL281jkO_K_hGTVtB<#Um6YSBp#4j}te;CScpPIfDu zxwEp(|DmlJNf2tdZq=$8M7CFsU0+vCWvk{-oOALDhPfw>v2ez@xmW{BXE*!DmiDe) zAy?Qy4GL4pTt)T;XzHn5<%TwkHMEWuYz$nQgEzD^t<7bZ3UpaO_eCDyUdpC9%I0LX z^RQeem7Q1$=R3RD+r2>@2%ckgMCnEP)LP;vLoO?vn}}u1uh}=8RYeoDI*8&*9l|Xz zG@8J|68Z6%GJY}G7H%dHJqYIL^EyePVu==?A2?dG_6PM61#^p0bljOs=9pVAGAyCLr)iNmLUvdL~0 z>XYO7c71p+@Zy*@=k|4%elEIiI8YSb6^_X8}Q2M&F>Kqo>t)yA4W51gPSBLyq$W6SQQBZ^{X z@~8=-YkmitNxZs!u#IUHeHc}EZ1XOtZuc(6joW9Wz2{^WR*@e=()bMSpswHrb3m+W z2}S!5)uPVlt#&A$2VdOH16s6j3y`jUDD$C$LG%YFYW%V8d}^x z)*ZAS*jUmt80@?n=_g*s!g@^>XUCMU?|tK*bn3>$2XzXqu*g0HS@*B5A#3NK4P*YK z)ZAGY11jA{y%x{a{oZPa`zIVi_Dy`_CqKX~02lsBMsW2 zQ&C&aQNP1qAy{-MP~03H{k=aCpvvg-0Zgou`6!95-z(q_okDv0%QcnLHu-LCynqB% zYZ87fmm!D;;>;*~`->5iOlat>*Ju!uP(N2^M3)L)fbJCeqet}JrYnv!y=c19P5WN)AAwM- ze7;C^mW@-};e@>sO;}>1IbRtP3-i@lK3~N}Th%vmzLGN&{=b_m=@gXDQxo&_ zv*JA6u6gnZ4@<{DkABxPJTW@hF3YC$Ky3#B%&z+!tES z!tN=y-VTWa&bX&_RtERDiEzp1vmPV3$8lPG2CJDd1X6)4wMPHu4Is|N2+R8$`w&w5 z_BUKscL?rwhH2}QaaKC%m)P(P# zqp^7le_+q^@p-E?)~5JH_lWG5|B$^L)9!cKfyfjBxTm0(3DiVPDZm|0tIkoK@K$c|)^HA4*x6gT zGIX-7yy&9Ox5P(Ub#EBz0o%GHCgHYzs;D1m8CN;jVqi=zp+n-5a5?0x+8WQzT!qfa zlJ?y6U&WffT;2IOq6<1JTBuMSnOf@n)=6GV?ND5BkNMZ06@zCSH_*cTwM?#XcYk$~ z(f0^$(pn6MpQwC^*8P@hckEiPg{#L&F&3BCGNCUR<6l;9)6sqM(Zs*Tm~bHZ!C2E( z^-E8PHMKOvxL$9Fc`axjjzD(scI?)ecU8T<;R^mepXnc8haN0psP$FMt#vQzSqxTp zoMtX~!A>PH*ou?p1_}{x`E{Z9@5}tR82$qN+C%p&xWOuHroQ<>if8|FILGkHDEK+= zC2wHw#0ST$LmCqIbY{1ZSqXA$@9XIUqVVA+;YoP+bTe0R&(v=@6LP2%5~36#Ow~Uv zw?uA=gjf~M%1`ZM8bogd<-^LfM z4R39(nGt?vpRZi~1{wubW8>^5o`2yK0t25KrotEXTla=XkRC+L-;$=Sni)@#T{^io>XXCg?qZbw_ z%V0V~{&JWOmoh_sE%Q8~oYR{6+=alR(#&3 zX~XHYl`@MaW@lA?=<#!q-B5VO&s5l1`FBM4xYTjJ$ zoJr}`6NyAt+rM)kcg8vO$sh5zf%N(%-$BhyA|OI$5vr7)CmZeum^{_XkE(fdlvS+`xTLl{Loh)6ib%BtqP}S+G z>HsF^Jyo^vrKec+h()lhSYsS?^bB8vFEh}da(FZsbIq|_DLNb+VSwYF_{}L$yURZs z@p-0tKiE=FmWn~PD*mBIImJ1!<(0t}vwY|ADN0=N`@Ll4TTQfCItPvldSSkzda+3{ zb-8VJK)FX0IPR?#SM{;@JfqM^w50-VBwAMKAaZ{A$#Y;!9yB`chlO;+sVNq@OBF$! zzhnI@l&+f1AuwAJe6-YlFQLxf3)%w!Z78?sy?$??|E_pR!`t3FisgfSG*#cD#rI6r zM7YH$e;JN`&UnZX`1TiC3sJv-Z%2^gw=T-XcL(2KYRczN1ha^jR0a8T*)AN_KwAU zCHU+Wes>r9Q4XIZsb%m9-YQToE1zPwXrK3wc>k-TK)81Q*MdfbaL2UI3jraDH6bfvn$JNkqbdrS4bj>?gJYZb zL%|k8Y!LKMsSb1_4_~$SB|C?Y5gzPyT>JCAtfbdpT;7KU-xLm+J@mW1Q(Nh^X?w`@ zjgtkP;*YF8OKl?$dRHs!LG>WQ}AQdfpB;gS$6zef7J9pBC(bBdr_Frlk6=U6}pfD5)O%do(NC z!~Njj>ZxXL11@{fQ@wc|>2{4JJ=K?=+Pj`A^WSLGAJK&}|G9Qt>v|)kqKbg_<;F-v zZoJU-w@^QqIUD9^Cw$z9&ADit_5kRL zHr1(kN`rGqRl^`!rj(Vo=~Upio8Lygo0@6&Sq;scf2E?DKO`JXxe96WBTepHEb&l1 z{aC1adgU=vJ>94C38|Rks&0~ZRytm=t0?K4B8{Wb;kHk4OMeKxMB~$9Ou&__olE0f z#2!~w9+ZMZ;9H~*yJL8IMLE!RiS+Fl2qS7mbCyy0r%eS#H*$2eD8FGZNOXc+^{-6BFGpg#chT?8zry_90g&g(*oVJH_>Nal;3aj z4FXiH3ZtugB%Tx)4?|Cyg6$lQey)?5H@cz%{ZrZFleZ?E-kZ`7^BkLT<{}P>UqgZ+*>}pxd{{VD z%85$$8uB$^8G1Hf$e(mFI=`3YL4hkRT9d&zcRL-EPO0}-9smv2d*Dylu$hG-s89!T z+kbc2Ycoz+)RCK6k(}ZBzw9HU+w_U0 zzflye=?zZzxoVk7cC#l{M@F3KcLS*}grtuby+rLq2>BrnCt$W5kofxrcEw-ym~Y2f>*eH5yI)1j;cY97$wFg2cZo z>XePEfIGm=zvjkx(?jV#N;$c6$Phel4M~dNZhOk@e`8{Bv-k`3iSEeSA-Io(Soi#f ziNWQx64Kiki@G+Lz~}HiY&$cHtke1e-NJL=x|?Q(*Fc|isXM%;*~xx{2V-CaH?I|A zn)4fuY_1=2GG|jVyl}^D#H^lKnC?4nDyJiDmG?sMaXxe8@?Jn)`)Hoy7Y)>DR#)9L zS|GS`oOO_M+S8~l+HiWm$u8Whe?*cv>5}lFDOh^w>k>ZayPFX?mwY(-%#`y zkt^Lovk^^uGjzKCzcSJ|_O~}gZ~=}DM$ZUNEfSb{oTduK22MtO*BsS}nqkEHTK?}( zLd(|oph0c~DF#KFKzhu-rhk6^X+Cz$8)hLJk|ri^#oRpsc0sER;jgR)8L}&>wJZ-P zllHF@B6Fnf{u1MlJH1~M>5>VUZo6du6-mBw6Mn@N+6^&sr5?0%eR3=dpBo=i{FVkY zAPMBGBjhg%_79k9sABEP<&?HSpNwv?{v$f|Syfh~Q&Jogoytv5fvby*M(JuL1{s4+ zwQza8`PFStAN97|ZKEusPzS3cy>C0W|MoIi|M19EInZ>HQpQ zyA?kzmi;o+Nh`xYF&c{CA^$0mr6-4OF7y|DAsl3YChwvals|QpTzx%kK9UHZzB~Co zY$Nk`vKov}DQGbjr4#6Lf^8<2qav7eDnfb(&JB*4`^67{5KC%$E5z7^(loj$!QGwu zLG0rhWWtlm8ev@FKRudU`we$69xVl0A=1#jsO3xK{4n?6KS&#FmAAaz1Feg∾#D;I-{KP*2{OyMEm`N#8Ev z|4S<=6N;{snI_(dn&7dIZ2E_ZG2+AxyxED|x=iM!BuZIzpcNm3t)2XTIei>G=?Qbr zyd^4(?X;dodfAHHjf6f=)Wm@KIpN2A5=3rD5LzN$(LX%b6`!PaseeqLxlZ%aa#J7% zgDw{=u6Zn2R`a-s3|3??y*PR-*i`!qY6gpb&<4_SlTta5K1^*4npw5V4W#RpfC>nY zN7*A7@$am@_hRQw-h!Q6(WYB&>Zne-i84aZ@JqH^qW*!V#V2W`>0juI1<%$p&Jr>j z!a^(ycg#4@p$c8F>mQH0#)=+w>!yDR|0gmG0D5*uK3KsfP0i2hbGRL(`m|1F&3+T3 z@a#g+L4GBaO4Y)Ob%PyAR{(zEM*Y z4PdS^&f4<$N(S&I&k*ZuMV0P-Mss|OBi3WPwh+3|7zr=n(L4kA9Y!BSe4ZjsWVbHSn%E_-yT#=c0vyO}B^s6!eIw6y#R686Bpm}I;8 z@UZ#wiNVKTZrGBk9ue^YPn+mA2$KeHZp?97jz!8}n7408ZQxWtug zc~cKGt1>Sw^=mJ!rGDQe5^#ibU7RnT(E(BHGPL*^GlG|5*)QUe$9vt$&Lc%2h;12n}<(xi%$!RU-L|y=BsefdOVhS zKu&}X=6#@z40cA zT)HNWF0UzUR5i`9nuPl0HSMFCegw3_nxbkXryLfWTXuc$L;4zuMdMbJR$O^aE6Csb z!@bqCbdQ?cVomFg*657bmyPaF)pW<+YO3C&rWb@U;gtpiDZJ9qP7-{@WWZ90F*}?+ zX5w4LVvTgbimeXTA(xGJt=&$$@ut@=I}UZ668}EPyn+GE%nP5>eP|-*FMVAaJKHwI zEAw2FkA}5b&E_Kvs0b#bFy~)4hnLLyaD{tmS$}x8@SV($_~KvR$Y0ObwjR`IWVr|X zDD3@#17UcJsk(U7jgmd)?&(waU|#m{@a%1Kdas{L?*{D{uTBi6pWv@LtjY>CP?bvZ#(&6{ zL?{@C4w1Pa5O*aGUqX$+1(fU6Q;2=R$$G!t-h*Ry*pW+L&a4h{+xha-V$L!=9VDOm zzkLq|f4WdZa41iEcW`=&X1yTHe%jr*%dJEY5@GgmB+QP7!tD0&_5>c-WYTv1774Ta z?iCMg^6)4#6-dt~6lTY~UrU%>kYzKLzi|>MTfN1xoEr~bEdzjT6Zbx_gY;#u!1%?# zT{@@e%U+k~Yie_^B!GiIp7?~H+LMBXK+!g)z@-DF#R1)or zD^Ev_&|7QViiGN?|D73-E5lH0CfsLqFiv$#siZb#$KzDID;^g%D{@nEYAXI^*7j-D z{&?By7OZwBY#eTxT9X|Az*Gv#c{f7n43But)(&AQ(LRQv&9qJGr4CqOAD2?&XB*L! zNcg`HQ+T0w<^pdu_xy3yU{>IVgYC}pLAEe&Bk^RX_7~#Gy4Ha5)~lfyMN__x^{JF^ zqbSIm9yZ?D$vn!pP-~_>IVQ~0Yz}Y!ny;Uu)1IAw@Lh9|e4ZT;=73qVWL5-{qLVr9 z67X|b4^_p{rSBY*&Rzq=D>HppR;5n4xEY(`hELTbDJU5GSyCU3#<`~kQjywlmm>Ph6T zqM354I5m)!?Fw2Ma`~|CKzZrk+$njI6 z$L2NrD&-ylvmixRLr>K7;lcg(eW!f2Dxq^M;ds04F})7{13ZIDh6(qDRIhbGG)`+L z9gRAq32;vJYD1&+;+61TVPcVq~v45uS{rD)>W&(di6VTl^5ER2hK zQv~7iuYmx5R$uAxV(YN2&lIx|0XSMT2IuP{IFF^$k?R40=-Rmy@)L(tdFzTHZJo@E zv>+&#J2lAs3J67WeZP)17kZ~GAk1=c%EO1??=(}kCI5S}7}b?t*BF&tz_uRsUjweE zXXWFF)@2cwf=2Qe@qQAVfu#M<)3Xp}P=QfK_-a&dv>&{OzKx2yQHH+JN*5M;yTZO< zQ;_e!O6prx;pI})PxnDVBHne15q-AXPe;q6-j?u~2=psp8pHj*S4d@+^%r`VEePJW zuCX3Xwd%F}n~P*G*o;34N)%ub)ozm+Z7ETwOR$?leser`zwjh-a2HR< z+ikY<{@Dw0I}+b02BcU;Z8Y9!7GC1S@Sc_-#L-xa#p=WSL%mV)l&?FA%HRi-52vki zXego;LoXFGiB!}MZ5r`jJ+!(oKdw0((DZ8;2B4=b2xhBC(fogaY+x~nDRkJmtDX*qNh541`W2;`G}e$~C;>V6 z4BsK#Q1txk9QK9Sf1>y5*QlVGj|IYq_EfYTkv$@RXRVo^kNuO@54DW33IFQfjwZEZ ziV+Z*Qx)1_s__+ zM7v!}{4=}>tKrCm1gIGTh#O6LkaV&egb~>6$p_=d+EMH0X?Jom4*A5c$cyBq<~cF7 zYs?h~IjeqSsq&=wbm#^Uso11~2P@si%DZ~#!OAhaYN?}thxCFME2rR9jtlcGbfhEu zN^)M@zh3ob)-Rqj+(P8AGtA;S3LSPOGQjJsS$sGW4=l+YYVs??Yb!g);Y#wwNk$Ma zn`ptnhHAwx$SsNww0o*5h^wuP5ig zcx~J>ePco|N#>y3Ez0e6OOz4!?q0(W`6luBM;^lfN~%g(KTOs^3#6px2Afqzxf=(Y z&$pD6Sl~kLv6j1v6g57Wx{W90(p}EaI#iRO!+$)@rBKvGLN7hRTUg&K(G!uM78Cht zYt)fmD}ECt!s55^qyo-?-5DMk-5oG7{A|(B;Og*OYNoiv15;1%qv3Q@3*+1X@50Z$ z_OW}r73@xNC>Turlo$T9++VUb^HIuRs+MBcJ4yGRBuf{N#>f=dGs*zSJmMngg z!duv#?w|5Fn0hu!7)&MTfq+Mi^GQ_cgRS&zKBx?BL{DT{M-MM_E+?3MkHR{8JvG+l zZvKY7_+wNZP~eFY&ssM5_GP$t@B=IwkaO~LFF%@>UndMCKZPd+C*q{Wd)1||$0?m{ zoSaTL{dhgsA@RJnT59&S&k)b`e^ zqufAQ^*EE}Ai{SO?)z1>imM(^zf(&q)LxSuV_%2*O7#-NJ^rw!g@2fMKB`}}mGCXN zlvS%HCs~uOpSy*XbZTzqR5hAAy%G&{^2D)D>VLHgacSH+>F>L1+PyJcZz=1vVZy_z zIUE&kI@zaO|4UWv>4EC}>hGZXnch_!c52eltzoAs7!mq@MWst`t(u=Yw13FIwfhSj zriR0>d_lwOZ5RQ8u6I;{03knaK(Fj7jyj`WA%iTttb6YjojX{iYHgAlOG1h;)O_)F zU36T!9PJ+d?lH~cem%s1Ld1>w_^i88AaSx^r!IDUF=%153Uqi5R=q~|!+U~)zU64P ztD*yxTv+g@>I>?pI6?WW|Lr?@yR$NPCLT!%l=RnphKTaa;+mb?wB_JlIjlsC@1q2m2~8;Ii{wq z>1`LCTPO2h3^3M&3etbE{;9gr|GJc#nkIa6>5-If_bS`G)2owCyIg>ZmGb@B%;DvB^@`|VzbC24y7d717m0&PAdH%>A{Ho9c?e<(RHTtV;{L{a+ z^aHd~OX-n4I7>Y^Lp@-(A62-lLMu^t-PZJU=L1**Cx7jxt{n>sOBiqCifaAl(kF4X z|1S*RD~4_>;Rn2ulld2{DHS+b*}k}_WT^t3nnwV}St-YaVI_49!PCaiTKVIx{M%0U zxU%xszqfoVpNr*d3+3@p5;mDRSkvTxSo~WtO)eMr=!RTdwl$q@h?PB!7wd#PW0_+q zldp}aSi^6gQq_ex%@UODJAzlTx1Z{knFK%99WT~p{2G^_VZEe2+p zcc=#ru87LFI4jR8c6KsI<7AJr{=VsCH2&a={IPls7o~${ZA#g%Fb|7KOux7bzl`zz z7pqVf-9J7^Gb|n!1S?~IlqE{~uK{c{|G`ASpxX}z}G{XU|8Xl{yG%_@6JUp89+* z^SQ|lHMpJ3E4+nT+>ZAw&oQ>mI#b`9-!LJ6D7CohclYhQKVDFdM9kbzJ`w2beLRG> zGB}&XfOGWC!e@L+botYo-gXk)i(Q7T^p+~`K>wh)e>`8tuzV6e6kZ-Zvdfj-Ujn!d z@&f#xS)Ndq(r5qFnt0{9CfOuR?c7I(+)JXl0x1IrI7DzS>YY2;I#Sur8l&wq+`pVh z&R!5mX)wy~h70M-q{O@zO9;ijo1+-Eo`Vx@5UR}2_lKPx;KHPZY{iB9sW7B?eo@ly($kh@p*Fnenz}52WB%-_&=EfgPm%!EPo;a5lc-x7wt|u z_*ckJ!m%)7;AZEhfp-7Isi9*F?rj(e%oJR3uBs zP}eT;XvuM1yTn~NS!om-B(e%V&K^Iv|F8R}UmG=9zIFwK>^mZhJ@n%tGVBhnu8pjscclMu10s^&AEch;)%uz&{fg+?S;9!9G;dbKf;Q zKA>|}@K3V!sO$KODB~tdxMTcs(LN^OUrIQxVJ9;KRKsgi0=tc^LldKQ3nA+K04!v6 zdwLKZ3qCoS@j`d*gBgFsQ6`^dE1#OE+<_aA7(66Smq5>MgY3EWF{#~*_i>QnA0GG5 z!*}EvwQf`1$;w@~d4joIO)D0}&s25xdH3OZ%7)J4@q=t%PeDrA2V}_CiI1h{xxeBq z=3}1@yEYLtWRa{TYoZc8kWrZWSA$~Q(3;*8y{bv%<{|@C&sLQ8?2KwU1i_c$Lp@AH=RQFRX$G}#x>tTn0r zX%XM7@r^#K0ryDn4|_O4JtUq?98ZZ0YOQxUL!St4X9!$^T!M&1h0cAPsts@-Q5)*q z`Idqso-=tU2cJvNk~47JliVlP^eBFk<6$F{Xe5N$FDU`chUyJ3n%b)pxl3z0pXtCh z6|3gA(~E0?nCc&a25}D$3<7aI( zS*+=7G*rL0nhH0yBQ!`xlfkJ)}x|Q(9w>9nO+%SuAxC1Rz`UNU&^FM|yhTCfu zJMAB{1@%d?<1;EY<73!vtuE9=*FwkAg__Q^?x`l3x)^xi4U%7J&4QQ!lJ_PWP z{D60Ex=QvHJ$Zfd-qL;5QMxej-fH&-&FRf+`3f#t+ZAF1FBh3-nNex{35eP^?ymcg z1RqUz*YdmMYKb_erUxoLOF!A4ezdddv(a_+Fl7SxGQE7wyqb_$A>_S(8F=w@-*vusn#fw`Bmaf$DCI;*DMie?b-s{bv8UTG zNN1p{tEa7pX;A~`Sp#PSKXh4@zXO8%nl|z?FhJ^7VXsHk0_1TqI8HCqFivn`lnRgeqU?KAv|qgGGu2^boezQpwPi@4eUEsro66(; z#BvMR9^c)k&3o(eBVt6*h{5fT(+rAE2eS%zf=tv>fnY_Tu77Wz?oB}p_&Ji_ z;=nnFRZ)X@?KY|3OKn|t9ezp?cB!w5uWb1DZJ~w^Mb`Q*4{_YLHlrLDCqp%Ks+~w% zTsW1>D8ElOgqxC4-g$g-Ntp!ES$;c{5%Z^;2U0{}$@1JQgrl3C-sLzekB701&k8-< zUZ>}I1Ce*z&`2tGBG<_WILki5w+ICC62B`u+2d9avJCty3s5%4&Qr*2cOE(GNqX@CIw*bvaovPhoiLVrcU8_BvUxP3xOB9P6InaAd4|VZ+1@?;i4fMTa@i&g%~LgG=S_6hu(vfp+8j!e>}>$K;tEX4P?Q9Kg`1G9e)z`|@?fU5tq~8{f-{PU=TELPjXZgug8TC7mD46vh-dD)W zPne$z9j*8DtChLM+=mPXM}+HJ^SM6U>~-kMPet&8Qs-?w?-#D;;3Akh`juK~18VbzaZ0r;a-kgjXL0|Jfk?G6ZvDBv z$9Zv#W@}?Cyqe%k46Jnin6{o9xu!%zm2-n^p5?xWSc;hoc;-%QdN74H@TkW(S_zx5%EQ`hVuCk;P|VvJ=0TBf@7d_a znlNM7-~SqWI(zvOZcm{fJ{boPU9Ptx{h~Pe$Iis)ar%b z21|UCr+Ph!=1*CBun^$_tp;oD~0t0TIX|K>KdWH_REsKA`g zie?(?*!?tHJefmd|B^ZJu3cg9!waE;BMHb;6!P94u^R8LB55^oe?&)cdN$JtN{z&B zl}Sitd4(5f+lw-UCWX!~7-J>l!%J$Tw=uPT3m_IRfP9bmn&X{SE9LIGFBpZh>;4z_ z8N1PYEcM$l`dXiKV6b!+A#`W|OVwi^1Mfw=#A=+-zh(ci8-`C>2&cQ&$?6`CugYxp zhhzG;92gs$mx+Ex7J2M8$PLcX=vJeP*#FYO9BjruHF{yggow3Bo^5f^<$P33LKJx* zdn4$=`+Qs<-p2HWYI6S9x6@F>Ku=%I4rn9?1Jt*jDSc6eK)kl|E>#MlVFt|)P=<2w z&kD1yt+)Ap02UoGeydLr|NLx;D_~>jf4R8P+m_z-G71+$ngm6}5H!b#kkj=FYZ=A) zTDR*7lIQZ>cmgXD^X50q9{VV09M9L^CAM6seSSl|cZ=cs`3();oplV*yJai$9XTx- z!DOY>m<`89;@KM!&=`&lC8WAG3jfM#8`%FR!#VvYqbf9ywxYCqPh#YCEQg9<{~{e` zdnCrI?HR~R`N+26?ezMIB(}XK#8i;9-rFi)r4#u+tq+@hjA9Gu8_ZN)MI8VFMg@CSF+m72qBTVncorJ z_%QVaO;%}&Z-6Jg!{AngPo4Tzgpaoxy8M0CPINvI!soA;Y6R0+@jTRD#8Iwpn)7%6 zks;dCvbShOUhI0x=Bslia}`LM$9{_@iuV2BYTw3FX@^(;6Fa6e%C+AqmO zHxB2gOrGPtOMoj2LIU5KT1S!ithtv5FzufJ^Ar9TYK$S;X&hoz!?a;TY&amf0z11p zgObX1p&b5czgycx%)i^V2vqx=Y%3&&u86Fs_^qQOOWjBGhN<}$e(l0@A0`_5KkfOU zQ$u_S0}o*rNRC+3{D#`4@6!(>D zD$2=GnYNz#Sg05BQj~y`=s2G%@*h4a44h?0`sf_q*7O>4)99@D7C97Gw-6Qy`xE+J z(A#!Lx8c4EgQB(bQ%>eQzHmOM8Aw?)qdiUlGBDgbhcYVSP~=uK9Jf?{+G@Nx@qv^M zr;?YHUxAQG6jSy6MwCDOYFBf&J(YF!4CL^@vuo#6{)Pce)4$y}$`|)nYPT6)Tb(?L zy+#{E%66Rk^o!fm>npo0Daw`lOHC3@Qv04>&yMtRclf;XSSOno8u=ab*^|_j`)I6U z^AsiZov#VJ4_!W@xrap)Wb~=Kby9sQWm>c z2(#2%7WWZVh>IkaNz_U>e?>o`e~xO6`S(qth}%Vh-Aj{4c5%a`PB@vLkV9S5o4Tg& z=z;}@QD-=>d!WR{6nHO6tgGa#7okMtAJgkkAY>|sRfq4*QHLUs5oLp2uH7Gp->3FD ziFxfcZE~)1FwiEU`qbQ6>$zUq*m*=SN)u4PpLn{zx*ebInKwj?{jqN9%EKy>L9m(E zNFK8x_y!~_qF0iMgyxGyjWkvl;S7uz$R_4n(3pgGK~3-sCxIThrsVl?I~BwvkGLEhF1tbdF|0L5xznh&^!@=^MMR=O`Bk%VyFaLno-QDe;we9t@&*ZJ$ z8&)tVJom=^ub@Bpua;ch(f#j?p8TlyESd(BpLHj%{&pke{n))@YC)epKm-N zq;vDgV232M!?CWHG@__Trwf!wN@s!sx!&+iCQ&9RsOe-kJS36?k4NR!T2fmk`Vf9( zpI?Fiv6*)9F2Cm?^LHGjBiZj?69qY^?81f%vd%(;v*H2sA)0{DXumBx#jUSQzu4bx zsnW6g@z}d|r-v##uQx~MKe1u&rTN)q&By&)1RjVgy(a{pM6Hrx?y(+ozl$z#{c@bsN<3M)jc`7?4+wUiP~`i({90mQP;C+C7V95*rG z{Euk;x=n8;Kh5R3Npi_?d^;9vETKQ=N6j*PY6)2X9(}!4A zGb8$~;YYuX`qgo-nGACyjydjaDV+e$nEe3$A}aFFqW9ho&(6g?)x`Zf!M8YAi5wTQ67GQ!b)(Lmj6KoOnN=UC#%a6IvYlJ z?%MGrC7sOoNeo3~=^e9CnX%V<`J3Kxh?5a(=d9dK&h!qfOow?Wg?c`RtzYq)pPt|U z`Zy?1aXrb0-s5C#pLc34uF$sgh!4!ixc(^ocWGlF3J}c)d>PraF=DE+ZG$`dM6qWw zbS%5pfeg-@O&IOPp9I7(+ldX_;H^{el$z94hp`8V+l=GPVu+CGaHC+ za)z;Cm$Y>4IEuIA!(BT*pw#Tvf77FludBA*?5j};KP-{l)U{*0m0b02O7_3LkBUk) zv1>=j`1)jZR%ZE|yI+ct>D};^m-A3STyd~Vzpn9R>gjaX4guWBo<$vdAM3tq;`4mY z-LF`$RCxJ4K?Ak)q#ik>mBPufP3JChGQXv(D28d1N8>MLR2uz8;*Z3U_VkcZVMzSk zO+2;uvHB{6bcDBB@igxV|D;+sb>EP^-~hw;@bkI|+!O~s_c58Ld#O`4uuSs9UYz2D~_ zf)$GU4+<1$6Mi_gc(O1)C(KW!79VXds{OyCjr)ZFwl+HuK!a&E#WP&AqlQ;?bq zq98SXb3;>G-L<2=wz^o;MT?Rj9I?OsJ=(WZIe{Tn@|TpB2UPtlW@j!rpPEHoun$;b z@^rW9$w8DV_?KLnx{AOzp1XNV%-e4OANTII4T{Jz&~kJ|?5F`c>|a_Z2dVQYoR~Lo z8W?n1t}1?VZszis|2cYnUTtz*5kSJf5R$R9R*tfgFy1K1ab}+CvdPwQ-5Bi=o>1R`9az}GMVCCerJ^I(y`)4o0-i8ml z8vPAvh4T)|Z7Yqs&wDI1?FDCFz)hX!de8842~Iabj1qj>ymd^Fo88`dLCkMUwt3GH zuW&IEo_4rzyEG4A!T8T)6ZImy^eA8$uRM z017}VuHgZ`&Rl2?Olj(0l8t#g(c2#f)_;X>ZSZMlHLZS-X@;0-*Cy6d%s)Gck~B6` zjDUxO#5ft<<)y~BDzYzi@zS1~c}cwgwNdCPsrQ+v_fHVhvAY@u%k<8F!RFp{_TuCx zt@qQETA&GghXUDAeUtl_eEz0DeHX{sW8Y4iHs z%`dvy9Zu$(z$WH*Bsu@SXQFPVQMU>8ycmPiM194EdMn9=DIFecCW5zpUbu92X|S1J z0-c0^vr+BJw^P?%Q;{6+dVjdk?GFxc(=S%GHJ&`FbD}0Q`*rFAu}+?JVgJwp>6a^G zjgLE-E)si+^Xsf=XKG^JbHNwcM~eIoAuPEq@uWK{gv#nzF234(d}zFW4Oh;kci!Vt z;_@~Yfx77?z=V`2bb9K3#*DLitiHwlWz8Ns=_9ikiVr&^}IdoS@rwS8~ z_j{F;z_7Rw^JGg&2E=pg?z5{%nIvmE`ID*pxDEy^f368 z@E5%XGR_XB(2bCP3Kx>6cutz1>{C1hEBF)5Zwc_$W8GhC22d!V)i(d+`Zg{J&%$n* zBHrWR*|haxHy*r^ie4c#Y=`Mq?&JpLpN->6%O5D7q>Y;pn_M@0$I&q@iL81Uo@;(> z0I1yMtU7fP;l=7R>pQ1muPBX!?pVY4p%bkGDp$Z%z70`Zft8BxTe}! z)o~3@|JKM4_f7r#ap}pOHps!69nXPptABYzY;vCqM)&WS7@M{(HhCT8oE0fUY?eve zwDm47hS486QVUf3W4)6NsKPxa*-+Q!1#Z*Um~+|yw5r*;b)fl^$%X@Qnx6bTVTwEV zXI+kmrH~&NZ*ytEHg}UN)}3fLD8^cxz(Wnc)#%kBD+#2o$h=X%HIFO89|$hdynPTb z1%D>X3`%tF6XRzB>V<G8SKhGSH@3~R$Q;|o$qW7eNlsdBj3>R(fFgz8Ce$NwBj

        z5*$2d?x55q%F zsrR!0dyE_{2N0zNWFQGfh3k-w(lQqI#}d5G5D5QRsBaIroQ>m%U_CkF^By$~d!q~@ z3n77oIuJ}9o4e))Z}6C_>b#vC|EnesHtlqBTPa&cCm#EU+9A#Q?LB8SBibl-tz@=8 zvnWsq#Blxk#Ch9-e~mE2Tkv}x_YC3IuQbB9-Oq1f!h6w4$P;{>(kbo;Zb;? zwtJ6b#hQjkZ|@g6O_yX1`Ozy)XRkJY^tPYSeJSEyO|-#C*1(}V5;S!99WXr?6Yvii zOG*1@iZ;{K_wBUp4w}G|B>=r_W3T$5_-}GAKn8leWT4tt!%MkXGZQMVlHg$h^`p6zaRj#)@?B>-W_b#trZ^d8@CnQkgsLsF59aY51 zOM?n!em=p|f5LeBYB#mA#MJAp$kiwHCR9%0=^p+)_JMiz7*v(9_1X2}>Ak51Za(JC zt6z)(HOzd~*I;T}WS_zFp>6&gW9FUAbb4H3=-nA7)h(%Vy_4z~dFOukiEgDm{)Ip- z0d2+OAUs~=YF*#0Yig+@kRf^kZe1Zj-pE@R=pnN8*%o+LJ6GJllDRj38y9XH(2;DA zRG#ca_Mq0%s^4g&=~u^~WBT<o%EX znOeXq0j|04tx;A<@`Pdq{}okGDDAAAZ7IEXQ^3mCC+|a7WSM&45<4>1w6^odOm`rg z$%sxhJ?Tb(cQOx=j2)LaP~8~1-qe`)w5zGu{3<`hj#Ti^ZBM&L{loPa)oE6AT+u;0 zG4D^ODeU|h7{CcNL-r``kU zY~kZ?A-|_7NS@rELHs=Nll`1YtUKP?+f>zI6Ewu zA#yZ7u@SkXx><@rKmdZ|``m}=^=`ru#5^L*gke)G4gt5cHD;)gK%bx%CS3R@{(BNX z2-Q#tgnn~?B6bR!YJL8Wi)FaTdcB6Mak^G36L8M$FH>-aI~Ub_iN0RpElwPQDT+gI zkS>F3@?WIr&|oxQ+4k^ah61nLoM^OoMh)z_#J!90h`(b&LB#s0{3RFf(Fqemu)WHNa z`Yn){uL-mFMq&zxUmNzCg9k2!kJoYT$; z>eO7-2_-sH1pv$GOpDQ(mO2}IR`S6Tu?ZZ*`4mG$-C^6N{?{ieDnuQrFz)e!-~fyB z()qJUUv!D^Ui$JFsRjDdtJ;h7#cleVlfBCdMFd8w`)Ev*5tt3vwnV-l3-pCc-g5dv zC1nI=epEq3U^X~6oM9>D1m-v81g5R2zw<{TFtXkW_wW0`2CaJzB*O0$%e@qD;!@uB zj5jekET?!AuJ=|U+=QX99csdWIE^A3dkr^nY@7eRJ^&tTI&$d)x)FV!nyhNbo><-a z{(;uU&=qHqpR;%qPn6aeP2}pdqn!so^$q{332xKkTF6d;Xnu`M5Wq-)ls5s=OZ2X6 zi5#;`vuw1_R)?(ZSm*_Fs=B0bs4WQS>jUFc*!gCf^9cXQ;NFHs3b3_;|JVs34BaBvN8)re| z9RHlpaP0HXZ0K%9>o55U{~nVC4KMx>;bI=4t3`QG%-gPujqCiP>C=1L_+)`_Y|E*tZ8?8CTi4dX_qUm9(yzF4cwBvb0@Mx0d_Se4HA#r!ktk>5Dk zlNe_)j8C=Ph;V}Zfz~3b?@X74^U@?pp?x~1MS#MA9cA`-?xu#>l+Gs~xobBlJoB@k zV@<4(z62Aid9T6X!pY>7&~@!up`5LCKe&;=Sy|7#CFcE8^QFgWQ(X^kqa<m_$c3_+oV2N|& zbdS-@JH2O3nF^b-^laym%tDRQS#?U|=**3`QB2;2CamRwAYlr@eq*fr0kIWq#NMyg z@Q}K?sj{=0Q*h>6s;rcGAY-w#xQ=@hi|~J*`uiamrp$ zQTl2{RJ>md152p;Df(CH@()T~hDmg#8&nbXoaNNo=x%;FeoM^zL!n>WHZlz2yxoX$ z`~BjkvOBz;aBFle=HDnTSFcqs^~v zduC*qw}C0H?oL)vAz|JWEJYQq(@Z5crkPG40+7& zhoVtPPnnICo2Uai8{EsU=t9iDI_9Q%&U{pT2LljeORtWbh^Z;tK25`iR8w9a#XWm^ z%gbXofW+d~f_rIoT1mdbO3xeuUXNJ%OC_49&^qbSnwjsPxmf-u7k-cmYy`V2s1Sh9 z_qLAkZ@c_h)^_M?A%E$K@{(|Zv*L>;kHBv41d8V`BH4v;U&IRxDY7VhOUB6((wBkj zo*=!_Z=D$-q<7s068zR?@4BaWaI$k5KxzFZFeKpuKMJ|l+<5>O{m>fO-TV#tOswf@ z#Ko`iR1CBC9524bVQ+`=uT5M2N1SNM9|y+O-AxLtG7V@$}gPNquhS-KCe z?l!*-Oxlgef52ZEW^FKR(fDmXf=flqtv(Ts_wM40M>F@7oWou!7C=7kU$@=-rFT0U z^kpt=#S!5yzOg^3Lq|WoV_zrpI^D2(3mk{j-Ob72H9`eeZV`8d~*odX5LS@MvI-_b3v8OgiDvQb4t4>DfhH*J%$9EILH z_*?C*W(UdM3xrv5gznQat50v)Zfj1-<{~+wBj(NjJ`yowSR343#QTK*pztrf>x753 zOq^5S^6nBMV|$o93Zvad|GL{qk3=Stpp0%^FarTf?%NR4P-;~f5u5I$2p~9QCc0T8(eyB#eV86ShfInB{%#2|}djbMomqdJn7!fml`e!7Pj$kF2 z2{-JsTCgz8G{l8w);&fwmlBDnM9jO_7^^s$&Qc~BA!ZupN1x-lOv79y)4pN1*&)J{ z-C(5>{OWUpY;*X{-;8%KZR9wMQ)`h%M{WMv!=?!oK_hH~~UUEHqx z1wLQcSTAdG)5Ddq{Vr>CvX`@3gKvY+H_8IM5 z2T*&sp54^Ln(+$9dy7rNze|WU;}=3IC-+6>Eaop);4>~p2=Yh{)Qx4W`I|lxomKtL zs^1^C_PcdmU+lZFvZ8X@2Jf-(ssDAXn>Lld*G|K8~a=oW|qLluJ_eG+6y`X z>$KtgoD=r4B_2mLoL7)mrgswDT3$nfG3u=M*Wd!ftB?(S{7~Zbg0W!H)wSM&IzMe| zJ<^M~ScJI9>>7Sujur0;&7rq0{i5{8F(5vna?{wyx=n4WOg198n*7fDo#go)-WpSa zTp%B#&Zl@zo& zWCAlf!6>p=wWbY4Y*C}mAXb*dnE_4@18H4*?`>;ad$rY8>w>sp5`>^uWvNT+b>q66 zF)pBOSVZ!DzCP#7WI*k=_xHX3{CGUboaJ*q>-+QG-|x@HD_)iMj?`YTJ3I)=^i3$& zt@38VqArU1nZ06eUBo@3q;I(1^)=~lQH%^?sUNWC>p=Sislj^G=(#)}D|NxIsS7SF zs^GSZ$42`mM)bx6IK0dS0AirNVZ(dLH@_7=st?5qk2ODak9}Z0^fan+Sl2W0eZd>- zGs?+OAK?3#`)wfaUV|f!yIVh@6YP2p4qpB~*S0gJrrDv>XGW4u98Z$olz7UZuc$xV zXfWK(TkK%O+c()qZOBX?JnFebs=z@|;A^G6#s=)%>1!7h$Y!GI=kt&OTz4lASm|-l zYkx+WDPrz&BULb>5gc*D1ITrxgpzDYCU~ox{Uh~T!*#NtSqa$A>!iB zNDe87glS4wFoHg?6(Uh*VI=0vjU*?Ohs@%!TBRFI(ts3|n|WLCRFG z@X$pO-+1UOEMaPELgWVK9p(jqe(zmimu@8|R&Fn3voM4PhfA{}GIttaoa-REif_-6I4?UjW7*%YH6Ueg{ug~#?)5bPAd&0-vr9I(W z#=@cZLxi_EDP> zo%u;uppxnTw}TO-PXgYuG42Gx%F{pQ>Fnw}|69K*)* zoy@evoUi9zWVfpssDRAwX6|FoDG{bWJD-B!-+u+4R{x9m^z{D^`1JA1{vYwF5JhUZ z@abd1r(*z_TCKz<OGy?C^g9ht8qpJPth&m=O*g zvlk9M@}J_+_~rit{F&bo{(0B`gIzIhuU*0RCLK}zGx21wt>f8`Z|V3m0Ui6a{cNSK zV!%TzhR#j+)O~F&KbgXxu(uz}euEc2A6GyhWY5Wt=TE-l28Rxz#KpY(mr&xjKLsV$ z?u8Qf2IPHEqKW1lqEpqMK&N8RsXFKV0y^~zpxr&=lju}~=oHEu(x7-tI8;V-YPjeW zD4Q3eQw>&nA?O4Wb$U^J))0x3LmQ+17f94kwJ|@HL}ja~NEF>*!R=YuBLVlgt?B+W z+Eg3RrhkCogy=p?9eW|V|Mb_y@Ef0mGW#DW#Fyq2@;rm;=SOJv`Ayq-a_SVAPDDMJ zTS!+IqY>Y^RHG8Nsmu-Y#ASAvC-ZBn;WF831zhI;mBIX15h98$&E=IOR;b&H!Hm}L ziAXs)0AUhNoKtf=IB}FIo};Jy8eS7q0eM{n=gru_b40`VoWrWf>Bwa0$&*x6lnQr; zZhX@IJ4B4;NjZ9Y8GPm{5!2&V8#Z&CT|XW+^E87N$3sm|D&V~mPygTX#>N~qO$OWV zN)i-In}G%+`PONqMZKa8$UG8$Lvpb_&|w&;_+$;@9=c(&vLe)pF&6t|l471}*e8?H zaV5w#=AIpCcD@7q1m6SugukWfmpG`6hChP`XLjS2z`Hro$md{5AkK_0rWGIW?(t2r z$~t`fUU;{FcRe`AyPjIWyY8V1BPGf$Kww<$^RG;m7}&8x4D8^RK%Z5BpOy$e-7R?c zM-P*x!`|uZQcZ@RTLPrIksO8S@S^-*A4%3TWgBTO=Gs6o>ZE38He9O`&Cf02eiUi? zLYMlS8WUoewY|Z~F5L#y<$%gc-@zWtig};aWn`9bn!y-JEYDw>*$eo~QDzU9XB7_@ z#bqqDlM98jrW7v{b;+$H2KP?JK<`ahvAw~=r3EezC+r(}p7Uq(;c|VR&l>}uccS>b zlXGw>de9#}?%xXeyubN;p0#`dRr&Pb&;rgY;b+o`_F?5hN76Sj&+APr*Awx2KxYfQ z9(Khmnese=U=+>3rK`1agFv>p$RjZA}Lc zybr!|AdvV12yBs9sTn*giXW^TNYXW?C!?2wR?J|_Ei$~8p;f2`+mGdu$^$S=_V6LRnW#y1q@GW$)So`1BB(5BV4fO4gQmsQKOPDHFXA_D?o%~dF>^^m zkKk3ixlh$}`ET@9OYmw=@M_u6D7eaa$8nkq2`>4mCDN2N$&L-%{blW*?teXzZ@h;}OJQiY)T1j_l7qHGe~s_Ep~DOVO*>BmYmUGNar%7%;B zvu?`IjmU>;w_{Zk+&c=qZQ3DBD?p%yp+2?|m34Ipk~(*F8%y&qu}w4Ve2~c_3_Ga3 zWzIk^)`ws5B)NrHli3ut9%(SKCh42Z^ax^KdzzCFQ%hclZ*BAI*};weeM&tt zi5N;w*#wTjt9t2tz zMWkB~kbKJ1M4Uqe}J%bb)jZ?^@|`3{-qYBw&gUc26x(jKxumorz-X zMBgHe9xKOOY_w8KMo>>qG1ib*j1e4kJ1qgq&|#So<6q)B=3ZNKvmW1Lbf@(jt;rih z_tXfRvhC-gLXb>;R8Wk@WEMp@R0vOH$S-#goJ1z z&If04{>ou4grNR;Ych#nZZ_0`{Wp*NO~BDZH60X&eL0>PGL*>oCK2v~(D<}P^E5+y zl!V61)vNmOA)jX>9-K*?+gN;{z z@bna-U=9JddoMNp95P6rR@R5W;*)PWWg-agCuQ0--yges^&dDKRRK^dRgQjC%dq1f z>|R#s4UhhOaP__BeV=!|d4C9R^~#I~soP4mnI)Qpj59G3ajw`~O}sgK4HZQ)s|EI}Z_>o=n(#?$ul#ss?X}m$ z5&|1;`^>=C;!6`5_5A9i&8Y9Eg4H(%>vsDm)~0w$Y{+>ajW}EfyJ@SYDtX%2>Re0i zog#f+FYum+q^VRZVwb%aw*^j_fP8N^^apkoDXPT#OQX-QmSo>%fB~-9#$~ka2A^SF zVi;Dm-L-rI+X~C7Gyy#vjzF>OTK<6NjkOX2UXg9UJn1jyShJX0kJ1Kxh>;lJT9o)g z9;ENHwf)8S!ir^|<3j^w?O-E=#iKG?d{4Lu`dArt&{9qt+l)t1>fabC)ah#3$MPc2 z^H%C=?v4Dnue?)+yi+H6=Oo)Tmf(mJ(5Gq8Cr{$VamMM|=?(3&Lx156gVX zXs{xCSP`XsU&k+TJz~DHyD=RqwkJ2Qv$Jo>n5ZnBav&*z2lEpW=df#Pt0bG;dry+4 zA0(Ah|Ab}qW$=xaUa8VPB&Ggs=*#^3>s3J~e}es#uenBrO)}Jc%ZgRVzc1E@yHGm$ zd<6kWW<1B!dyQq2I9YrH#L2?NW}{fTefAi^@}~x+gQ3Cc@%>a5Z$d~fL~4A12CdW^ zd}-j@oA)hH3j8y4bMD8`N4iHqtO`J0)*a{8R6xkwpNfvjP`lzas!4BJI7LSy@*nfy zm)G#0);_S#9`RyLUC{^DcY3lWa{_uGLmk0H$|wRTO)JTcGCdblUx2jIr_rkD_Zp1{6nxPp<)#Kw$Ia$XcqM()pAjX%nto+1oP+yJh0 z@#Q`Z9tlWg6*P%Nq z+2{RMTGh&>v?9L9N2;BDA_3m+@$@$ONxj{|o7L4pZ=d0Y-o{nW=)&GU#EXyjR$erp z(p#~Arnhm^+c~Ee^!5_Jm9x~!8a9PNw1rfBG6k|L*qP={A@Lr=o7MXVy*<{ir(N}2 zMLqes9m$K2_jV4m`YF8?cWZjvZhE^~OkHknd&ZeLX;CYm{iNRBM1ibM0{>WV7xQNI zy8+3((ywQZ>Uk2t&iA&J7a#AfGQfUHZ^gWu-p(<-EidftA$}_{wQ>Qid~9yt|0caX z!t{0@WRTh^0$C4Po7Lq#L9vgs#E)v@izS8|UVWd~ir=UlAX80)5%+WAd$$6N+2O_| z=)J*BDRx~G6!ml-h;HUM+SFI~DUtd-4-A@8B2Ys%YI)-4^~`hSsY8R$R3LSLKGB~% zJ|C-_z43i@!TZ!9`a*wD=*(jt|9_;b%9ehhfd+GPfo_asF*G-m3ksxcZnFAgK0#M< zds_4=`{Udr5#}+5FiSoes>K}L6*Q9?Nr9~X``l+-m(G_pnV%;qu2FYN&H(_fHbEDzSi?$Umw^v3vv-sCu&Xb-aHSg}xe8?-we{ z&V)Ya`mxUdH;2stkx1j?g00xjalodn=fDO$qpenw;fJy>0VVsO*gO9)4W)_DW1X$C^hSN^UW%I?dL6MHaL(Ha_#v4<=YYKY zNcPZl;eb5->^j^icLXq$j5;j@dI#RTZa)jB6X4Pi8`B_!(ukGoc*gjB`dAzOMDXj!lw=Tg?VMqmoDq5>9S>H&VaV zTC619_}!ct@uO*J7_~anso4nz4`)l*%3THPd6MqK&RfBwzQK*zpYzCv zpP_Q3G0%pFp3Bb3aLh=&Ju$l5E>U0lHNVbhHsVFNG{?Kr`IKK_G`~Fj$CkDG(fPQ?iD>zN=!4v)FBTLTAfLqmP|DYN>`C5oqp~sxtZsjQ_I)qDKDeYNmz5?3>ndjDY(ICxvBZM+_*y))q z`GbEp@?oTH0}1g>>db3Y5t3nY*GOxnfBMVyJ)8wo`gkVtntvQja_8{5CnCjsJ-MaF ze^Ss?fJZPwNu8inuUuu{G7H*3MnD@#Fit2(S$bnXQh}EW(um5 zUY4<7zW9rYNQpU~k3a`s$;%UJirm=-lawH&*53D zg_2j=iW8ag56rpI_Oz*-gg!-PN(B-`oDUTUk$Q)&yDLm22(fXN7W@W%jbwI^_dL+f z2PX2sy{6neCX_?do4I>EKcs&#Su*;|f_y?%^&1zo`#~eenRt-NxxgPikTYR+iYZnBmyk~_XevVGp8$>-LtUrV+m&&H25BQ*<)w5T+>%d(bFqx(W&E7qFF z(Aj_IB3LJowppsI!r%kE-|?W%5Tjl-6LWqO;iu2s@RZ=JG2F)wtIsY}(vy36G_3wf zE0!Jolw+nLfPuuX{iX7Lj(`FEJ0nm3!0&}nl6{UhTEFDl^6YV3Kl}yiG^zfP5o2-Kln0+>u!^yNgKsGfns5kLATtB-iY&FlWY8w46 zXOt}LmJ88?0}U4!C+>~8Kf>`_dEWC`thHERb8|MGNn@=UwSC(vDLOL|jzH?sfmf+G z+l7zGaieDJ`sr1+)y$vK&kT{QrqDkC0YZr0N_rukV|INvN6#I|nVaF!rlY03)UAEu zB!vU$Nh_Q%$#fGxpcm%op(f{!fPgBz$~=m?V`_~3R+0MNIch#wdc)}Ybgm!|^cBbF zazOis)^+d&pfrfav`(9zI27EtI8u`*{l8AGAIyHq-~v-l_>lv$eFRBDN9RdMj!zKIc6@0bV$CD$CL!Jb?TH{qBkw(lBX zrPslY1p_yyVu)LOl~y9|-2!~~Hthn_&^Vu?O3H&i>#%}TN88MQoOQ>+1)+0ly48g zdW`~TY`Fd=&ApZR2Y<DEMn==njCk+C^92_P80NNCPIcs zYvlx!0rcxkg))Htm|yF@3C1hq5f3*g?sbTT@0W2qX`I1VB`V~PqqCb9Tmy$WkCG~; zrP=-dSTX?c90OnevWlWJeA+@L!)4yRl$D$NXZtpW|Mm-JlG=#YORxndN!-R4$m|CUu&g zf3zMf-SE_dnlt}My&W8>*GCrYs`?Ei-{x^Zr<9+H6QZuaS##nhpO+o^8bJp63RyVP zS;h&by-k$AW7R0w$fEc+IGJXwI}fIBxfXd~ZA1KMlWlld{BRs5hCB-EpH7q}dxtw+ z;%FfNqYBVJ_(kh+lWKr`-lU%Z(tpLsqn*2bNPko}0Olt{x-?EiNczt2cZ+0!!_wo8 zP%_*c*r3Bx*(9)lm4jU~C@SRUtVLF=LXN1U8!f$YzKenAS ziv6;~;x*RFM>Ju0PYuI+DwZjJggjZ3Vtx#FG&6pcGrd>~T-x!V$-$N=4fb>5qReHX zad!(etYr$h$y_$fF}K-C-046JKiod%es8RI(CXjIYbz~BFW1%jl90a29=FWkP?!+M zzp`<_t6DHZ@$STu0^%SJKcC!!@?r7c2agild>9D;Mj%OyYC( zUVwGr2eZ9KdI-Zw>byf~HH5|N!HxaT`*b$I>b=uA^bPE!CJW?JC&+(@;UOd9?kIU@h5!n znd~Kn_x9jlvJt-VXL}FhLT~Xd%aUD+m4N99l0Fg{ul0icK>O)asHd4VZ|>=(@a!WW zFj^Lq$^D;x^J{%Gfp47N>&q(1i?1G&k&aPG zuf)h=EMnHrq!$!_F8e$cm@*pqz2-(>)XczwN*S8`1tV(4*Ityd=Qo&&DET$E33`U! z?EQQ)G`r+8c;r@4ZjsJwncjkRp8gVWy;9JGGvT;D>0;r2j`@v@TOzI`Ldy2|*W5n| zl{@!|Lb#48@2qoHXv^QP#H#{B?m@oy>bnnyYg`$lu8;=1!q@J&XzM}^JYs9R_Z%0w=V?~0OnifHJx zkmL>vNGO9H4j5tgP#vQo89O*iBXR!T=frIB2?$EG(ha5SgL9nL0S*2>tEa_0e?VRj zbzJ`lRw+2=%2AdGAmvO-JL`batb#R-{1xQ@TB88*6SiY|kTTJG^)JG(-@nDW!a!?Tv`Erbr=sIFp*Y52bjtSqe+deS-liiN~Zy+Q-R6lX{qE|sLdDXw6*L@SE1}Z`Y zn9?u(Q{TSCK2;K#5}wp``~1SRmPlVQdrs)2TaH$V{two4{l9*nLXg>>DAgHZug<=3 zunWxgtn-AIxZpw@1kYL1Rq+1c?+(5H{`tXsB?bM5j}4)|geW21fu{}-C2J`+w{4{9 zaNg6g0rFyYhATHuW0@2m=bX1@ihDTgfjwyrnX>mzE%CQ~QcL9T_ew1>*BF^F$MpE- znE2<%%_vEf_n+d!-?+0&;xNhUBQ8PTk0rK7oE?!q*+_68_s@dhw>-G7)UV7E4e&iZ zBn5INRYr)r;u~i=T|XV0#Xjq2pXF?YB78I@;(lx64(Ef=R#ajE$-Ryx^Qu)=)5#5u1bpcgs&sma_xiAfDo zG@c#kw~y^3wE z^bSk(^7a1lb$*G&OB%OC)6{cJgF9UwNX!4sCBuukm$W}9;IkjnZtnkF4qlz-Bgr)( z2~R#g3ct9+ZKwo<-^jENcY4Fln;bY}J6r7@Z$$EyBjX3&UrjBedp5tf{kiSWHaTzN z1nz9JH@`;)ebf1R@`jD+v{KR|vZ~kd!*2!K;j-e=Z$|3}&{`yW;Y$dbpC2lYjDA-3 z`1d*g_cBtQOG4WSR#h&Pq@s4!I5NNh;6k>kFc@9bcWEl?P zm(lxx1Z6k3U8sI=5~RVF!>+g;Yf;3U0<}c7+SYYz3u=zIOZba06BXUy;6EiS}^`U*>oH#)vznht8K9 z6};d#mU%==TS$`$qgqNQ2bN4=wb)shu9n7Xjt&z(^+l!FKUOhR4U{mkQW0J7pe6U9 zHFq&v7rbfLZ+wDl6p9@3R-S1ICA+J8c8o~w5Y1?@QupG0?GT=8t@sYE=sasjrklf) z*$W7_BF@6AMLv#ZnntN@gAy=_)P(r+CBU8?#zqL&RQh;D*0xGijNT8YUx?!LJhCP= z>wtn|iu%vjK1%K&W%Vr#&RQ<};>oM{+)7={gOm5?9{2{V%&HQnhvp}@pL7t&(fBQVVsqo!9F^Gg~HR~P%JuMDvD+njzVy z^14dz>DCK@K^99=TV`IXxBM(Byk8qKH=lIm7_CbUOmu`718Died&{qwr-%CW31G6I+xsWqLq5rTySRHH)ty6o-ovR z+nqZj=zMW+a!<8&ZExouox~!T(t*e&z43{lNq1puur@v3f#~)|_i@s+H*DWC+5n3- zbKE3{?Vybg7OA+`TG=v=foQZ}XA(R22yY}%4$p0spXqWfsZ`_Jm!4HK%KO@%ja|-K z$ql~$ytF$P8Y84SL};e(f@CHbKZ*8MZvhi*W-~hl!3_KpaUb>(%09?sI@HsLF;mA*{piCs zL_~lBh|}um4epegeq0Y7*eHle?g%Zc6mNB-fIg3p$;C=NB z`fG4Qv91&k@t(JnLur*z9|leNkMKliD>La|#2aND2d?;c$Fc-(Qfq|J8yFCRg<{SJ z@>j1#4HmEYQvXSY|ML#~&V`B>OlzY^6E$9n*US|-n3&M7HN{@`JenRy6dOUY)E#NV zt-u^GNX}ssW=iuM(bIjT0eNSR|;b!?RL&`1#=Lug8 zK`MYB0P1*lSzo2UN!Y;3MP;^=l~yW!?@#nxun=O49FuJ{7422eKD*UsH8p>~yT^sS z4_V81fSBBLx6qSU%#$n7I5feMUuPHrjJBL`D>N4=bJlNu6I>p-v2^^^Zn_o7ma$+1 zkP~+AJ(t@FnQ$%HZr52W9^|1i+%fG?vi>k&@i;3wifSk5F$b0t7o8}hz$Do zWNZ(bEo{uLe>d^xi1VU}BFvs|V7`M7K@YnEa5w<9kcPGCZhu%S>M0d*PhcmRBOTMD zxzFPxcN&=y7q+?+XToa)`H=RDx5UiAA65^HIMH7f$UAQM*_mP%9nOIcvM9!nHtW;m zY(eeSZDz;byv0mUxU^zP{j}CaoN;_&(0)9Vy_Fr5g9oAAv6C+ZtH%9R=CItz@N_v1 z`)nWxT8b!l-VS)Fhc(nZoVV(Q<`p=PI8PY(jkbLbXbiA3Cu!@+i6IoCfQfB!r1@!tjT@!tV_RDA+`%qwVLr0$E^qv^HZPcvC$-{t|tJKd;( z`o#M(4X+vXq?zyBy5elXT!ZR-EGOzVs{i!D{YO}q_qnt8MtY~S%|UwY2J0eF6nnzA z(aiL6o;LUxc*41$k9q(hK4~u$n8$uM8)WDm&P0>tQ1}#e*1GsDd2H(a5)M|in`#pG ze=3Y{z^V2y+O7t$p@6FiZae!E9(oVbb@2q*!;JrS^5MUONHDHEY!tNx#IQ@a`s598 z)>i64UK+AxrLW^Mdz-%X;nbZwl!RA#&d+0plWz=9?!jDk2G{)ui&f3eL^~)vZFoRI zns%#OnSGDvVpSf64b7fKwG27?5U4&sY94t1skb`OD4Lnp?hnbVjCaxZh9*k@Jc|6h z*nWdmpDHtOW^RMB{V@sM0^xIvnlfSNQ-k+#lo@sXyH@WG?y|S=ky%IYmG|J@u9E^u zMKTkrg~u2Spa|o!FnyzTe? zzo=vK)eq4Ztj9&=V&_27$Y`B$}CjB07Z)bptWOK=gQU zlEfj0fm;r_uSmnuLHo7;WDD`WGB6cBAEYGD*lLAi;jm$LCvU??9jr-vfKNIiecfQ$ zK{J7?c+hY8``?U6eKyIgqnYAu&HCOgaT|)$o31Pc37t8-Ia9o0v~skFu~9mn8#%7B zA(|msi*?6`rXGAKbtKsZ|qlMqu2TROlMo9XXkM0e*%8U=Puy4huNhS`*EsftM$m{aQ&tQ zheWJL)}R2g-QqsUjQ0v}?v-~ZI1e^LyUs4`ABHz0-6PK7qx-TA%!$E+_gB-$(LJlQ zaGSlX!XpzCxGf8Ens1G%gxxs#}N zoiP^F{eI{5G==XFBM2V-^4HtVqc$EPtgoUl$6Aw?vva380y?b(D>~&ulHT?W!y7q^ z8^L5YPzQ5?9XNX&1cwAu7Rg+HrG#b9Y1=}*yOI3_z{aP zN$&bwyuw<315cB?>f*Qqp6WLnjQux#uEw5HtU^}uLgy}xIsVF`Xy-0jIpWVQoZq=i z&J^)KckU9p@Q=~zUv1=(DKkME&S-u8@8;`Hwg2lyXD4@EW~G<%sQ)_usQ7qh(b1i6 zNy|b~D{G0wlB)L9!#wa0%05{S6pP#WmOKtj9j4h6 zcqVt6Rr0=FU_Ma*%x`Rv(b`>>Y8x+{S07RDZzps6f?~(*X|WkIv8gd!hK_z zNro2viZ`~i(e8Yei(#Ex_*)#GP2Q()W-`=8A4Yp#9bUIdG=kJUkH;@_!-vihb|y2@ zEN5NMyHyXo}KP>)O zR#-uBtwBP58DPK3d#(C@T2SBOe^Q^ur}~Pi&v$8TFiKT}6Wxn-c+PU6ddNIy-}aZQ zJ)4M_sH{)kf(tmsaPv&gI<|ZIt8_rQo%}GAc**JY>1*cH=M-=7R1`{9i|RW~w8!xq z=bbWPAiVhp9f_4B4K9ni*Vafz)uGRMiQ?*98~C2od-H#Wwb(b43SV;~9(Gz!bV1nQ zBBtS!Dzdk4<^YkSs;;Jvz$e>>Ke05?oWJHC!_3$fyaMdwQKoL( zck+6HfEMFUc;ohsN0lwsaQz{yI9YqW%O03CsyKc`rs)~blx9gxkZ(Vp%r0uWt;N`sOLW=&0oFww{Y;&es zC|;l3F(T?NZ0EdaJ{?L$DgM9GYyYb(C$QpGe3(e=RTaI9ACqb1Bm$U+`bn*eu2-b~ z-o9`Kep!^+>|_wnMozMcPmf}8_1QvZSo2~sB1f>H_|@6Cx=3E zXSuaRsy+MRUlfIkqMP5bldp#iVet1qJ@k|R32Q*uzf0NvYi4zIe)JnnQ0iv>c77xp zXr&&2Vsw7wnQPgJutl+Gh97)!rO|2v5@gT$sVVn+Q%+%0ogWE9TB#qIYcU%v!K2BK z&er^wKAN4a=R--2@8hM?v{B{PO;K`(G*cEL+VV z3j6yj4Bp3}j=4P5t^6rvR_b#0Dr@y3yF8~MMJ6~;PY1#;?$5Q{?T6MubDx~oFv3bp z^Hm7<9kUIL-(+OqDqfn_3Yt>Ln-8F=Vf%htD_!-;wLg~p{JMDOd=Jwbxy|a&tS-28 z)BTOP?x$^v4s{~?Q;LCyNb&b7SH?dik}-DDKuUt0?0h?d#y^aboJFh=dync6;*5vA zwfx^$CwC$lbv}w@7S1HewvuvT;k2Bw+O@_oWIOB0wB_^wX(SU2JFn#D*Lghbyp&V) z0asOggMl%Aph<&1jk@c)n=)60nsE8f+{f(%H}=AusIbsu^Lhzb1J!oy4v{iMCm`QK zfoR)vvCN#!(9?Twq_TdpX@zCVkX@rVaebnM6Djwuk=;*dgSfPD-2jsgcZ-*>#TzKDM)n;OzZ0k%?o` zQtalaWxG>axpuqrHT}fPZJ+Z9b3AwI5GKe3&-IqnZ%cG{%CB*&@8&SUng7Df?6YRS zPv{H3FmvctR#LSOkH$9hBFXsFLy7o;`)oN~)q6(_uMck7W#(CmB7*Y*mEEXfp`1Gx zi%MU^OBRg%Zv2LG__F7%3RX6`#qusAh(O@#(gUEa7NI=9b$Sg*?X!Qf-=!qju7*ZY z?lsX1;^#0EFQX~*L10n1m8b)XWRIbQPAOHcD&NIPaxJEJ0hE$`HtD!T< z9auBZr!Au$#3$Z3+!fRZS05R@F4D7Scy1vT_2Z;GoLC#$6zTCQlCKOGA97^o z)Q~TmKehRlo;@R+9&?B2W2ejROdRTLFg%8{k?Gp}2Bz5bm<~89qmS_U(_Nw^x${-V zYP?bpm77C(t<*fIAnC!2$tAa){0G+Jljx(nzbK5mGtUfZiG|+rsf*=w@vMNxCpHtp67W_r0O)wUQsHax3Ro}iPwbZi-sizppo~%2 zu*OGS*`RR1N#j0+-&p3HnRV~@BUQA$y<^DtMPaY=5w@b>skj*ZVTN z5c|<6v}~8wZ8Ga<)W1>?R>oWoHCsgmIe5b+>?19FP}yI5pfLj|>h27uM_TFkC>U*9 z(4fS5$0L+Ag{mG3myV3KeLb^~z41*oV>_|CitBgHUn#X>CG(U$OcRu=-}hbXGhm~2 zUbkdMH9vhz&eae90D!XK7otdL&~NDf(EKV)tTJ4`b-`z0ZsO%;IM|h$x+a`(Dueq! z@}bV#F0t!}Ej$HZ8YP88;kyadC|-UBvovRluh#j3v94n0L*x?4gPZ{A%Oz<07$09R zdWi%K_YESQl!;nHohoJg6q@=1v9(#S#CxaQE{ z9U^OKQFUgYU@vqTH6zrw(%Xc4ajKimK_1mvl>a1HdWkp+AC|1;I#k{OlA>ub7_@Jq7AX~w} zbMW*}+Dp{g9Sb6%xh3|xs|94CeAAx_w^B6hntxliAwOT{iM31&d{#Rtxc@9&$R5tU zJ&hjOQ=`sD_E|nJZT#z{HF%wrg32N)r~tNZKRbgTLH)TIMET?;NRF`nRXy+ zQ&YMO&DW$_cRHro9-($JwhO!WgfioyVZ*I3UeUd_K~bTyr0n%~oqC}n-Q!a+Vq`=l zqVB^ASj@DC2*ax#=qXQJ4NY$=ULx-&BK2zBGaGVL)IZg z>tEr+$vI(XD<1!HGc0f!WxtROC+h6MJ`;8RG9{o+My36vm3oi$^<$=t3tPBonA2FE z>^_p6HLei__qfI~r;*V4=O`z3V;s5Dut{(ii0$6bU!2NemaH?QAauif5{n$pm_N*n zfuk7L+jKESS+amGEGaQytu7 z;vh6D*y8cPh~6Mbz)5o7%MrT=lBVYWz5EF)bo zeO78B>sByvXEAY8%9Fhs=C~=ExG81M6eeym<(LN`hMB{K$A>uYg8%YoEo@d_z;Ru~ z%-f~8d3&{R-d-)7x3d4iyuGpSys4=#o2E2x;%hj+!`Fe@?*58BKy_8jZ!y1M(I!rC zm;}me!lP?aIltxnR`6TFZzaE#{8sTx81STOeyjPd;kQPXk=W2`3<*owAF(xu=tHm` z*M0RubJSH@a-7ea_$vxiLZ`Hl{kQvk_sianjjY#{lI*Wp(J&4SO7XG$Zl+p`7t2gD z_Qu<>ZBZk_yk$lltmNbzJI&+5r+x^Ut>=;VCY#4bcdc7%k{y)1W5UPLcbN_Td>p-pa72DTG zWNK;FF`8VKC&)PhvIn*zGwTwSqOn>3p z!=Fy9^+iU_9QIh0dmtBifEZ?NkGB93L?qbfPmO+1{Atxc=T8@b*$jVb^2Heb^fdTW z)3cB9r&pO#$B(k^Bl=_(-3eLuO)8u9#iBi>8)i9^;2Iv~O#7vi4uZ9~1h+DB5OKQd z>tbQUp^GX9%fq8Dssu5b&>7)IZ@px$y;Yxieh)qVO+&LatIM6Fn==qj0G0rTg4&&)?{@|?z32kxJd8_zk9MtbdYG5waWDS#(F z2rvQxB%6f}yk8tEwDVdVRQ0C!6K-$_B>B_=RPCdh>(PHaPFKu+2qNIWBL7yVJMkHl zv0t98-jy39hAseeOvTsETJBKf_jC3N_IlgE>cljBahw%1GOpILL5Pj$5?>NxOdo5$$Su0M=%vhsIrR z_BgseD>WA>*}Y%)oOf(~>IbR5%32|14o5ym+g={MYhPEMFXiAfGnGwc*8gX)m2$|L zhBwU)K8@nm!|4FGvH@Akay)v-Ab9)++g+@M^aBMVndVw?SxsY|sSWYF#x;$1n#L~t zeLj)eXP*$Wj#j__`f$BEWsXX)Imi>X@;KugGT!iEnvrTrNtxm_+Zr_>GJMS0%9(0W zQtEbv>*IW#QH-UI+ODo6$*|}?2f+9pyg^+)wXN(Zq}0cw?$4KU%egX)CUa3`KU&Nq zbQg)breLJ)G}d9v01BfN!KN-7sRK50-K2P-I@rx!W zHf|;^=;jCVok+s(LF09|A2-if$323;Tt3e~9B_yf(stq%ick+BweZ`9_&ZpT`Fk^%0dj30HI!XT&$ zlMgW%=Rc8?@$;wO;=z|JD=yxVK%Wkhl(}0Bj07@P^lL%?rIj$>njhbqExBvIE zx=`W9Pqi~sQQzKEGlt?gs2lrBCRL-aZKH~eWy-GaFERW!F4k@dfogl<{UuQy;j%UH zs+2knHa-S&UPT*xw_n#@+Tfrb>4Epwt^`Wp*MKptQ~`_?><>x!*0Og18;!EUWQGj8 zO|99l^Jpl3-tfKeiSMoOR=t?xdn>HeffW0srC5{AEycn+W9}y`gHJ#I$vVVO$gcsq zk(`cgf)l%^7KOzFXi4nM++YnBd@a2%>M6py2>IKOI%@Vq%> zA&+nkxzs({S{BFV8uc%Q3kxS`}1V2#{Ani8ZEI-);j_7BK>f2Utf zgbZr|I57>)U|>TZz>Gq^A`w0UUig#{uqyoNajFn*gxa12=R!w4zUYK+a9_BLe1R!mHRg?g6#E=rxjpiPEBcEpN_TT$>Ng zv&T&wYdg~#;v=~l&$(J-trglD(ac182!kxMx*QXk#cHn?;Z69dnzSP(`&&=M>GR(H z8p!t@+z95>loXGHDp~2D0b!U~Dw#Y?{YB2-pwAVNwl(-n=1KIZeMmI1+dg~|XTy4~ zr@JC_TDxi(&IUSf)-4$Iscps8@DS*x{tzrkd|@Qhgtcfuoh|AAe6Bw4xG(3YIeudB zd9+QzzGJqH`-LXRC)y^M2SzCIq&Fj289cYOIFIuxek3ERhTtryjEJ^p60H$uXQJMV zK|!JM)rOAO&qVo{mKbVE2gw`ucE`-onY)qj3qGpiqke?n2C?4s%@42}`FTjhE8?e6 zR2TlI9&ohwzd7lOL^dQai=16859VALbd0b~mP^&f*6Q{hSb%Ae9M49TA#!K*_AjQkn#ZM6TY z{Mi&*2R|kI$VTiV|4jb$wbdGQyfP@}jkj@DPz#7`EF7|eHC(awy+h<>QL2~h7+bZNwCtnFw$2(hnkR%dHj(Vpxa3i|Zv z(HRAVql@`A-j@0K&f`xbW+dN^MBHC`>;kblwfq)o!AVK|f`JB3ZZT_ji=kuAM_tLQ zW}Lvup*+m>G4%&-J^>sK;Bf#B@~bES2O;3S!C`csAO3%U2hyX!*X#`s?`$#fP$GRq z0X&rb3;Kv5c#ys9e-j?Cy9eqB@Fnm-w^5Rzicl^OLBlBT8*EcwR^$E2H2z7g$u0XM@Kt1fG@^dT z!XqPXyPDg&W0|TCNmjNd>`ouwRDaDf!E{QF4-hn1Pw)PR@e#u<0(sC%r;vJs=XF1G zaSM5d6or}C=9yMnmTdo(VVJ#6-s_|ufXqt21`Hcr@qvgEg{2ORtQcg>NpFNHi9F+M zwU)dk;rgna?|Pq|{MKij9hvDLTB&{+r@i66Dza@C4(LdnbE*=tNiq*^8?>8U;k*)$JXuO(sNTln71+*i5 zINh(?lzz<22ykMD-aa)G>z^6g%8L}<~7V0D7K6#g_>EJmjd?G#XRZH1a)8s6EG$`7zy^kv_ z8mq;cnbKXsD^fc&152ITRls>RC^F;$IM~&YLj#MuDZ{eomOER)hfHQv&n6ctQ)nm&0BLgLrXh7`|CuIg~UN%^x{V|!l7Tu}O-tX93 zBEeCAc$gHcf5-Fcg4xSWQtDM)e}bWWLuE9+#hLUj1g28U<<&rg_)_~&$!)yRnIFWJv&OYHELSCa1J}%2sf#Io>f!pY|!*kw>)ty zo!?8{cIh)=XHHG6+;>@*fh9Wo2qVMgY)e!UKEyk{+cyn|!xZK|>)DwD6GjY!@1=y) z+e*e`Ocdo|7fs(tcN$(uuc3xtA&9no7YCkcW7Y}sO1yf6CHyc-FcK}KK;TGt!h{u=tA|^uAMmVz{+>1m&ISilg@RA_4=?_UGwbD{TKeZ`ztZaYs-of6K>LO6bV6n>lTk|Nd$g+)2|s$wY^NdBRgmHws1 z>8^Oi{1~-?^FeY=bx%JmM6|?>&h#~K==2}2Kf5}9IbIXK$vx8MaVAJ+%sYHZaP8Vi z&+Ee#cEY#<{X;bQZpo=`)z>BaM>1DMyk!R|U5>e_^%f1?w0f5f-Bfzt=O$MFkHji; z2kNzHax<;K{ggZ1;iYqGMvByx@Tl&cX6K`1Pj$p0OZ5{yAL4SgMxlzr)g)Om$q7i! zTaK7Eit2=eqnSmO%^AXzx~f=zACjSA~%D&0k8NWRD8*` z6b=3G)#ZgjFQ1RPe_T%VEbp9`Bt~P z%lx?wy8S0^?fUcPndxrZ+~oYWgQ3R{<=K4OId9$qI=i6V`=;saREjNV_dBb8dQ%>x z!{g|zvALoC7)!^@JgGj66U5;zK%bKsl}JY0rdBpN->+siK4*_R4+n(vumWvfSn9p_ zC(XoEmSI78FcZ5Tn5u5o=DYR%v3ym3-Wa~BU4S$HcJCJdD~c=_6@2xm|5fYISF_DX zu-~26YDO}{Yxh5+%z_yOBXRiDj3j-cb`zQfRnp|#(#2vjgZ8*zF6Am-!G#WkvmJA9 zt=Os+=~(g2Vx_1`?vfV1eL)c2JhF<&z~*m zp%CA-Yv||C;j7vH&~Nv@qR67w;H$^@$_KyH10V{(ZEOI34T&#P4($jc2{3jO1+zE! z^tG^*m6G2JPtdWQkA21m(^{{=Z;RTf!w1vz{I;|iCJQO~?$hk&Cii?8lu4t2AY$lV zh<~=ponFI(YX1SMb_EhOxu?(OVY~nEvG~DF?xZ<9nC(C4o;S~S7q#$Uh90B`aRGNv zKa2YobN|@92m`g)XA17H-RWkaylybBNgj2-c|K`8&&HZ(gkk)aXKcG#ul){sd;@pj zbF&Z6=RyA;%>EEqwQ#GME3{vD<8luhghRWcey%dFMs*FEx$ICwFgAE%RfAGWOitRu zc^|ckd4I#_zl>woZtUxat|Pr5hMxxMau3VHOQf^4cJMt3#8Rauwz_v|!`HooQJZwp8!qA&dw%LdEA?Am4sU>H< zb8-tf_R`u!H{aW6MoUaBKQOgi`G73W{%A5ykesz44%k}$4JH-;I?5Un>gx*w`Q3K@ zf&A_#f@@eBuW9tozo86k&0>?33w`qpHY2e=jLR(-SF`+YT#`h9zzMO4m61%9N%kje zGK1yJFn6UU&A0GYJsWAeMtoj+)4b2ZL;Len@tnzHmcEK|z*-{>9EH5oF|V>H{#EjJ zFV$qSVn@5z6jLP9rp)-`_tf98l^50urT-6>?lpy;WUgwLxy+qC6O{@f8{U8ICmifs zKie>#9`E5vfm{Ii=mdaoWPh?B^&IJEfs22`bRm*CuhvRSz>)IE8Sth*?)rz_5wiDP z%F7GF*Ul@C+oO@T>u#nn&1kgN%5!TPfs+kTlT}hP*vai7yM*A6@ip;33hpBWS8IRA zGRK$4>b>}nQ!hyOkUE*Fu`H1U;k?>d=AzbU+o3_7s!rwy&hpB%(0lA? zXfhh%d%~DuD>-8?b1sq>Oz=Fy@nTl^L-NS5-Wa2!&db))@CYr)t3+6B4n#UP0ooqsy1_ZCFLMRO+|y{L`WT^E2e}J z$_R=xv@#@z>t0|i<&5x+(Y<;5L?&F$&YF+6MUIP+#9591j0sB{D}I>=tt3$iTg!}$ zz=R9NINI&+R5*c_#`|$$8nbV38efweGeB3)L>42+9^dPxD*>X!fry~hYz6^+j5rp? z0MdAQ&@r!@Wmb$~e5mX0KPceu{Q0w1u8+1&#AvXGkxAue#+mGG9V~BlPvpA<3N0&r zFVzk~vFyrn+_6#z@!VQ2(LKnJxLcRXLy%Y?BUOf78_SIEiq-Fk&oP@NidBJ*SgB1E zBE6^ck>8)Tks6+lGsiq0X}dny`lMi4Ruk;~joSN(&r8gjhZ&5lv+Id*P|hi@;&*Ul z_1hEoIljCTNfy@>bGSJ;&MmHqFx6OA?f_Kj#00XtyrFf2P{nzadV$==?7|C_nWgFZ zrCj-tN4BEbq=y6EBguYzPz**hV49VOxYm&kZKXZ~>gdk|^NO47$|o@Lw8~*&tl*{G z44jS`zEMh(>eLIi+t6yIB|*Z(E^nrWs2iCPb?22EDGS-Nl^i4F+mIW6kCpy6O1fkv z#+UIYyKQHaaui>`J6yV68H(-tmexgoQMv2ZWJA=Ir&qW_7a=78c-rfOXM%^W^Km59 z*yw0iG9kk7qoVFTW=qN7fsHxEN;2@aQ~BgG$PQ0+I)XHTS$JHhHi^}|LpewOt6?cs zWM5=PW_86t>@CgC>r7?Tc~|`L1Z@R;4@fKJJl_>2586wY-;WErV8Il?H6q)g_^{ z(n>EbNGok-{SA{=%J_<*0X1#k7y%i8uOp%7BB5s^p^eg)R4n21ip8ZBoft$FN~I;s znsh$d(`gbIxd6C)x7m3!{snsgOb6RKEPlvP1|l%2^o4+DVoHL9e3tIe-_5ubze`--$$U@4Jd zleYPgTqP0C9i}@!TAD_!;J}uc5`%;IoC>5H}3RWS_T>KQ8_@74onCWq0*@orF8NmM1ay z%*uhDhQtWFenaAj?VG~&z3~c#r!~NdPp{(c*va_CeUK%h~&=w7u|sqq`Pc|(ji;F*>>4Oe*NymR#b}C z()sj0(zYIU;>lJn2{jv8Oa$}n$(iuT-A=bsbv8Ra(a~hp?&shXd?44y!?s%zO?oAi zn?S5CX+6m4@doilIei0;m*5Te(u&Zt19nTuxwInQ2PG=5e>U+5TYx$erW?p7btW7S z_{iHA0gc)2cUoia+>&HJJ(TMxPUyf5`7ucGuWmFzK}`3hF9S!12zy7Oe7-P->_vj! ze;7(UEB~Tg$0p$cH-0_27HW@9JdBHdNzxmQHfHXhxNf;M6#pH95X#i}aA{b?+WX}yc1!%lnFeE~2j+2@z>7+DP&6!2ryn$cSOkhXXTCTa zr1POU{vfv>laFE**;=rNgHj)5M^l#0EIP>UJiUcI(2+fqC+vy`_+cl$YuXmurQITP zQp8=A&sEV;3*O*x5fcQvj@Es0BJ}^JHaRBRQRnKw9ydFlx-xCGB;+F^^_2Ze zF1NsmSNtt%{bt?e!<8AcEkP(dGO7i?TJevY$&!o;<4KGJ7CHQ=Jb_`QNZki;$HbHXzjlul*dDKQ+W^$}0zU41Qki&eC;)a3Mce(jIhl3WV>NeHs ztK=(RUxwKhD}4O_Fn2ECQB~LCpO66(iJYjZMoUZ7SV^@tQBZ7&S_SV|oYPD5-VJ1Kl@D-rGZAE;|Au5P91W@w-t-a5g znIPKU|Goe3`}2Kd&SRhbSbOcY*IIi${tW8N&i=?Rm4Hi5av~#0LAuTGJ2I!@b`K|0 z=8KMpCX^P$#u7lHf~3+{O7NHe5Ig%R5{<7HFo-L5@#yP&ZWR2lA*zxZwIh?5!%(TY zT->{Ru!EIBgz$ z)TzU}_`ncQuT{l^?qltkO)!9eb-5b2pzryje}Zk3V1rn+8HvBCG6$+hc9|*=d%MSO zWi~Pb5CNfZn%YB6LSZF%ENA|lgnwcrF65n@f!imDFm(u+5PQc3?m3-z0PYw&or3kQ zqvhaeP;3pwF(Z*fDSenwmA1OXOkf{JQ_;z}V<~@!Z36Ml8#h~B#2pg&1AKh0O0GAO z63=&-SoUn*Z-N`o0IBr4#@S*_9ShkS;gX6(( z_)NURuRn%6SG^AVv}Cj>A#@y=n%A*a=8Sf5#pGF_EGwiZ$mD8xo2d!@nqH#{8L$e+ zQU_&8S;|lSnd5&m6|!)Jzfxjnpj9hssC}T0c`%l}!e3Wm9!4-{I~jdv#P*j*3UL1? zQ2iOBf-Ni5esRq`vMY2B1*l^q)=SY5+z#rT;Fo(dHMb}_jK3wF6N=P>Dl%%EC2=Dc*R(aN zM8Sh{Fcwh)8L`x;8n=x&oO94Wq50YLS%iQPsnLs~XPc?<{>~w)BI0CD;I^o9yl#p6 zlesVH9IqSV{%Gz?JI71Hp0N^F^APUKI>(oK_d`3!i;?=+u&2Hh)!c1bZu7T`>e5L5 zk);t%)EVpXJR zyR`wk-@gjtg{xi)lk3Lg(^Ti-E6}%~uqi`7{^gDAZF`am!;|Ph$6L~5Av*{JFH|;qyQ>SCgwAP-o?jr0=r2%c70P3x8 z1ZkcOH?;~kriJBY8tAUDd`}qd8*XK{BfN!EkG9Y%5RRyg#qw9`is=4LDk(Bt{yMfJ z#=~?d)nKM_6)YyO8U_0>I(ST@Uuy)LT9p=6t;;Dd`s{K3s;*!l=;sjF_E$FJx*GP= zt$~Fim1C%($evSF^?WdJWswxSvS=U0PN7(dJ*Pw!D^bNt_ED^kVx{(+QdO)}6)W9G zu@J?|>^WtsSeYtDXq+$f&7@d4sozzxa#gH+AH^aR8)45Gp^A-A#YXI-*d&To*mEjW zu?khJVjsn(P^{8EtFmfcFmPt2vGhY2J@RED>ngPP79sToEs~C62jTaKye_i8LRL{e zITF=N_Bjm1hl_p|w&)`iNlxpc{#00cK}warv9Otg1K4a{FoOx`Xjtk&=SW|OhMyMXCSSEjHSXIS{v=N zr{h*iXaKUDy!V2)Y3Zn>Ru?f!DJ2#iXTM_v(uO3$lxt0JvV!e$L)88JlXNEEd@LWB~Oyer~`hsVYuQwk} zlz^WTb}|nRAVF@M)Zef{Fs6m zdI&OfAy37woUKej&~MsP(tVxd%B8SYjMYw^*X)>0$|^^8`k#~cM`xMnRL`WO&NpE!s#EWD zK8ffh_T7?7B9ywkkWgbi3ph(iE`f?hFrhw0ZSs&q6q_wlgK0md@<_a<^GK{J$ZR%Q zgR}KDoJ|u3M_;G&M1_nMt8jDQV4QA> zux+u8xSL4zvHK(TZ&%O-yj6`vH$_Adfu;BpU}`_-E=8Y2j3>8&5+Nh>iN<5%%%GLU z{yzQI5W=$%3mX%JZVgzxhf|XV)!uR!O&iO;EmLNv-ssrQlJSwfvMpvfZ%TtM zKEO7~c8q-YPtz{ttFX0NKHSbDhJj?~jG=0ByvVhc3#9xh!T&7zqGEfR ztBH(N$GHMkOW>rTcmQ!JzHC#`I^a<_M)v994R!-ze8zDOa<{NZ@fYfpk#N{*u2%SB zrk)ZsQaDrI>!F}B3C7U|%}s2kBjN2p1}PV`UJkDBCtW015pLSyCF`^QDqsw=TQmJ9 zx{E4ey&!u&r*%3UdZzDgks?(+$UN!{S#2!B0&pazrXplLCDWrpuUgjgDt`X2vo$fb zSo^X?F?ZrLI$k0yCe!jpuR=X4QDY#Kox)tfsw;W6G&APYy~jsj31t$-a-^Fq9|aum z!^}`V2*y9+Xou=z#5e^QXS@5OwBV(XVjmTLr(7U@Y^3&w5W4Q@Va^EPmX!}`C*eA~ zpFk4wV~?Y3TWpISrn{)D=1|NF~R-@>sb%u8;sD$UVDu!zp2^f2mdyLZL+??Y`Usa6w=Af3=%9k zFK|_n_Kr52I%F>u%3hQ0j~Q4M9cIr{7~dvfX{xKBK&e|Y_NKd@R)8!l$NCC>d>yFQ zXIb?VWiiVlc9(5~@84XuV;L3al4{i+;JihRx&G{9-LCQ0EyMq(N}G|RcalZxFsd`H zR~%G){oE&(P@x*N1YeF2X0j2iPMpD8&a*HKLZ>*V1kfBAZW_m6jl^iF0ANzKowBjl zoFjOm&xsVR$|Gm5t2*y?$yt_^StW6gjEyVl`OoZl!tCER`zQ>JLffMvwU;WiJ;?b6 zZM2#SU**6tA79zX*@00xyaX~3ShNm?38C1YOw_z1>0l6XJvHg&_^!gMIn#w`i{Jy= z66X_!ty|j`}NjWR~U)Qcw~0U`a_23=^3uZrM{ZSS7Gb#5$o-q-*|L0OMk@M zwiF^H3-C(`(JEQ7;&aMe_DUic1+It~D6me2DoHFYwoI2aUGR%9BTW=ndx#)ASXp<2eQt@^Q(c^zToBl9BqDrBT#EfK&s*2uV=biW2ZgM+u!XH6 z#9G0}aza>;CR@dezMeybKewlJ61%#sARB5nIu!ZaS`~Yb?x>su&c|3NwQ8iv;@1MQ z;C?l3DdISTv1vMx+b?7fDA)4^&_#3pWxEH5q`cP9<{O#0GxKLIQaMWMQV1|``hI!a zmrWnvP$BX6Kn01Ex9>Up7X7w1I&+yyJ#Z^2LW3~pc?wu~n9o!odlc<=a@hOsQfK-7Oc!kC+J}e#?GyG|gph z`^ej%V80w2N7j&?lI>7XXz4Xvp!QSyrf6eQlX0;jMpf^BrO&ktVm!Sp-TeqnaI=hbO@K5_&?WgG9;Q>KnU(O-pfQ(FLY;5X29I zql?u?(~F!7F0!v2DcqqRbUEw!&Fw9+j;Bt>9sx0Qw|jE(>~>K1;V6Vt^yc4(4%rV2J3)v7 zJkHSx4)17&Vjh;3g+o~43#dxbbv0}Bol=?t1u z(@TsV3=W(Nmx)eO?6>i@1(Lq#L0XhnQXiSn_2;-H`f<*%=r4y|=+P zbr4|cnqZ#b5*r{K)69*%xpBf4kAA75=i2%gQ?w6W! zU&Yo*ISK_nZhpu~4ZvYJe;?ov-mf$c$kLZr9w%I{n?E-kf4WY{7iLt)!7XrB%Z<7i zBNsfVlV2k-0TEq}vFd+P0#oxV`KaaEVqRPWk0Qu}OE*a4;>+jH%Orf=j>~F@*iEGz znpro?3P?@LtqCJ>FtzSuMHtJ*@BuTy5lKFcqpK`rc}cixx|N<}bu{R}HU?1f81-tWHe9un|>S zMX}l<|C+n5*<+Top+5@ z&3wY@tnB{Y7MXa~2Yvu<^6IkgshRte5>14xYfn-K+$M7ywAS=I?5>ZN&yku=;~~e0 zcx)u^6aRYAP8FW23|hchD!7AcVN-w^5c2fc~E- ztU?K{Cgkp~6zr4A)j^@iwATbh7RxSx&S*5CrIYT-0a)?vkbP$>twZ#TXOX7O7VG9i&Mbb*hrV#t-@@s42KAJ9=NqCj_NFALCCG&b0TF?fhVZ&Y8lj_MeH!DO_ni>c{;!1Le6JG^zhg^wjlrys_#d z&SmsIWM#bmN$B-es0y<1bR=CLeB?FmtmhI|$arA?~_3 zTRw5u{C%*)A`kMxaeS~96cwVke`u^ z;as>2kF{hhU4nGx{Fy)5aUV-?1E{wwO##l`WB}(@P}1F)=tYazSPK9iUjN^93!Pdmc?^9Q@9W&T_xDnT@+kV3ZFXi4?b_$TlZNZ(1sq|SL z65tbyIHuey$vIOL#j+S2VbNX8V|fz$NJT$S}%$5~$4uE(k{(sD#4`L(xa3L$3R8h)K&`niDhUptWVE*}9_&0QwuY}{@C##(b zpoAjp<#5x|-|!}T#9Owm_xi67sQ;@^&syRSEPIGY(rVoidgVcfY4&h9wa!!l+*_hxp;$@KVp=tt#!!@93pT`jo^b zE;wY0cN9r+WznC_id`W22+r_K>`Kyhur8h%O03W5NIP5-tX16kf)!R5QF6=O43)uT zSxfY{?i4yEoT)cwvq@~wz(UnCW>xb{UV)N@5D zWZAF^WidL}Dny?)o7}LOGSONYWL9OyfM3}<3kzX`L^`5qlt80y0`g=TRzcT_yukb> zCDl};U5T;xw{Y}P+a{=L9}Iq)9PhIrGRGve5I_o1weVEJCbb^k&n%mVOfQRD91Rq= zY+@sJ=ugz1G#Y|=AkVSns>YIQD3{JSn#jpo!oTJDLpN9*5|Qwq963(ss9A|0!V6TO zd>SRGI*yIle^enF_!0bGQc@XOg1+&q#FG`s1B?ct{lm;XGqWO!Yg!}%PpKAHDnK43 zt^}=2R$Mu~opIU6*jg)vYhsRfPb%U47A3qNSesPByLx6U+bojL?PxAqm?ciA-4O7Z zdluwND&MC;w(e2TwU@YTu$KuFB^swCVs26Mdd-Is>mpIR=|KmrH^SD3#v>ytdrry0 z(4`z-lovjtPH)3(sMQSGvR?uBdo^qc8&#(Hg-cNU?8scrZ_h%RU%8tX zlchQrUsAR8D}G09Yxt_2&pXhyvS)=WcM#PLt)V+)ExVQC`ORp=iRD1!GxWE~&iWBNF2i(xhLLgwK2zCzZ?(6EwqI*RbPmd-U> zO4bomk<4Y!WmzuvwkrBt^I=ZZIo`HK(h+)lyi_CEUpk5cYntCyR$+j+W`mYfl+Ysk z;QevMi6|go4sfgnf*^loWe-Rv^2YmaMVY%nte|Jd_c_aJ05*@v!ow9en)1Yrzq;ba ze~AI}yK}HBz1Miej~AYRN^Q6IL7hBxfle;A*Jc9ejdf>#=H-7#m$OWz`Hq@K%~T?X ziH&rB=D?L|Tw3KYH%B>wwTp#xxE!XiR*N-5sU924MZ|u2{rG7e>;=M|0e(DBJj7Ri!Q`o1m0QDCQ5bZzW^F|B&CfZ z;SK%c?i6Lg2KJAU1LE@e2qQ0Ks;(50L6{6>yOi1QS-g-|vbl>W!BN^r{oPI>4RneF zApg|rbDrgi#;L5louh&|yis}~Gj*D*qd@&U>*f|}h#nTGzs{!RW>W0MS=(x5JHKQj z_v9+%91q#6`9z61N6WWbzYthsEKO0|kwjopjSRX`5iO8TFRhxjnW-)GZy+b6dRS7K z*>Z(+y`<9V0VJ;YluPnYYeh;V@i}`-k|BP6+Ng=L;K^Qu|xx4xZa;=W~X7 zLJ*2+(y)n*m#dgY+{yAb`Ldz+{0qFz3~AwC@qw`>voCJxj%JcTqC@VAjMCgmL|kk zzu4FETaSPBJj-OCYgr&+O~l^rD{6fd=Gm?FoC}4SMT;#>wEV2d7rnqyZ{|I-QTV-4JkjedbMO1ykICL+XOqY4C)nafdECBfC8hI5;xAIgVEF{Azyv+_ z`C6w=wmw!Wd*+!5D91Lf!rb_7dgl<+o-I~#Mnd9@n)cby3Qm?f$EzbVI6Kq&ZuSm~ zXQ_?*a{0ARuV4nT<`p>W{?2b!9v>;}*pcN%z^>3xs?4{3S72Q;rexDN!=9kbi7@MD z88_1t%tcrrRf(?Q8`B;=+1+jWF^M{LX z=#STzgRiU6gS>Ly1+IT{U{4e){K*yAtf*>dnHC{{YsVEuBWCe&`K4QA2vk?pvmARn z>jVc{%j9T)nRvQFI!jiLl0stkBL}@D@aawl@KSzGQO}=p0G4|XOg*=9zD~fd)D_i} zRT_!i)E~dLnyI-()mA@-(>pO^FjW3sddH9^>xZ@p+x8FDGx0FSj1@Rm;cv+(Cju;! z2Ww-)dJfd^HpO)T#h$XyvQDFp(Jfi1^CF}G!$+~(T1FpSOV3sGU-yJ=R!5sm*D#UBs--uBdlLEmaIR8-Y@q_+OM~vQ zsIvpedGy+v2$@l%<19pa=8n+$9yhetSzo8VcRf;_BYDiOxLT|Q?5oO8Tyyt`g~lT< z{MCT+*`Oe9~ADp-$vW#aoCieQE3fLf9$yzWA>54VBLg zgH~hdubDy&O~ezWH>l`mIx~_FN*Hw~zoUANcJU$JH#9aZxk2qAA;a9}>ZL-G<55Hc z@v;nBf6qVJd^SnmL&8C5qZPy{73Yers)U7BDU2HKQNOuPXe`O$jl@nK$p`W{r5+o} zuW7CsvTzBB&GKv~u*xQ7Nqp0ws*d=c!Lj{%8=^yX*fOt*iEhmu4(>(Q!#uw0 za3djFCTI>U5^=$wmu>H5#A;Dy^;5|XTxx;tkmxxQYJUn^l4HeDsNoWlJ9N}+kkAt? zzSv-8U~HS85#?1L&0hGv{Ee2|*ZtiMf2O0q26h^WOK1?wJ5E5!vb-hsBwa4jUUN#J zCmyZaEPO@t=H|wW)RM0AHHbKS2o-4fCx6Ft;(Hs3Uvd$)M+5b(ncIFY9$bX~Ccp!a z8Pekb3!?N<=0=8wPG2@l$#H|>7Q`>ldv}zd`E*m*8i2czorIJNVun_s<>i-@3P-?H zM_rAqx?sU7-pAf)2>jhxs!dvu2PM~Q39Y;IGdoX6)7|2yY)_mdKFS5rW34XbA8L)8 z)R4fkW$H{L@gt#+4dvFjh;uHNIr^`>n~mg&f~v9UI*Ms9{&@kj(YbI>3l+wSB_>`H zhdQ6~fsXAL-?JcgCl8~y(h}oqp(XJbD;0mS8+HHoM-S5yw1ShIj|a3zkKld;)5ZT5 zX7*TcFDW5v>7IJCqnpnn&cnP`c5~X#SG;>g?=?bOYpG~^Y!+qf7&i8v%!Z=Ut=_~4 zJh!z;6o_UfM1xNZD70CE9$9DLkm`40x+%;ilG-?ii+ zTsXJNxLSdLAWt3y96^yRy;3Mdz%|oeBnoQbvNA>2qec@4Blc$33HDqgd6m@8x9)4?4|Y2r?$gdMxct|L&}``V>iKFy4VRhA=e zBl&fygR$CE%T}IC7j&>q&mX)!a|8Cw`A~cO>48wohg0V6cVrB>wll^ri5JaptbA2DyTb*WY&78xX zTbOru{a_uuo>(F!FZ0HTCwXCFddhLcyPBaMDbOwoB2|_EG+v_5H{(8V?vm2Xcrj~8 zl@Zc}6ER{$rH)lTjvT+hZ(+EJUrn?!oSHHimQ%jw2i3Ox#@os}>jV=}xVOjNY9w4q zsWRMrn@3?~g&;hwBz)ym4M=!=hi$;I==h-xOh8G`1jUcXuP803*2I%1Y}uAMeNz7nGw&)t05{h)ecd; z6HkUe=W_@sLYbG66XRFrO86KdtI4}BuUQlN@pDotVs%Bx&gXJ&k(56j zwn2`yv4eWf%+d$bF6L3RuJ+2J*e9XDk4vK82w6WaQT&A9x(A`)3@;ASYJxruc-kUU zCDKU5##=-rQ}F{2+Z-hlf=wqVR%wRa>jvuzQdVA3it`J)f6Z=*r)1a~8m{$4=VPWN zMr(zWaq}ZVSbeEAxh&pR5NPLIw>hF@6wW)=o9i9CtFNx*+~X{?z7Y#u!%tboFb%|1 zVDR3^`9kq{k}!w!^u8zrSz3*KqDHCGxMbncXpM2M1)V&8ZYBGOQYs%r)iOugS0T&) zH(HF@8siSlsZ*bZ1RnFyBeG^ytQqN?7KX$pQapmBm(F`2RgToF^(2fV1~1AN$~ApM zC#M9@v3aEEuQv(_7niJYbqpnXsMp`8>28Z@%>zzqj9Za=MJh>vQW)a= z-;tpxRqjtYctA1M!8{{+A@&G8xXZfyF!tVATDZUL0>ibrfw*{yegVwIlsh^Z8*VQy z!-cVR?%NlDS+ICb&*Qm4ez88vdR1=CJcT7E^-){wMYg{EebGbXKbc;D*(HN@MBZ`N zKfUBV%9Z_b{_@2i6GuV+0##V__QP|y>*6iPg)-+x&l?KP8a&Y#>`9Y)+Y6%G?Ac|> z-exDhc?fyFqKHZhHvtditPJ|T$3O+@>d`&46&1GYq<&(Lt3LWfvS%J< zXXn8YZH35#_)W0jCh`$jSrWz)yi3i8DQh!27Jq#3bBqw`h@A9VP)AsZ&N`Vcq2t@+ z*QMcjXvfx=oefI6p!`r=dhZ#`QcF0Hj{UmlH5YE|Q`UBrR_Mw^pE1*fPg(H@ocG}_ z9YaM>{&i*15j_md<96qHC8(>T$nfuHE`aGEmcXkLHa>(8y1I?F@MQ);QY|KQIkHI0SP4Ts8gYs|$$jW0eT19^)(NUgLqt@RjH6mqT5aDxrW3T8k zFR4Y$)^$1ihgg}5`|Pm{xs<6-&XgX-Yn7cLXOY~gO-Y5yQ5C8WUXSA2ikoGl*NKzG z$I{!^q(z!VyOh@_&i62lLFm`rj=iSa&U#wPtN7}fLY2Yx7AfuO2t?i_GRXI(XIbTg z_{_5n7|tKmrl!m1=|h~G^Pfv3EX_PPcMg2+*!lN)dWq>g_omc2jho#1mm$C@${F@i zdOsb4y$&PZ+n-bh2jJh7H<;^8Ds?2<9`hvvG)zS!{Lfk9kt{wB`Sl9}v>|%2L`fBJ zu>wr%cnrY4Yz>)#zSvrsHaXT+3rXxmjl@}Ck5j8gDD<3{bqcUtjFAgx4r>8@i(IoF z)t9QZ0BJlpW$f>{A1T#zt`|N%yI%-1u!5H=f`$3`AMV%xwC}6Z@s1G&rh@Ekg6^ee zRi8Ai)P`oduh29eXcsc`0rbvzsxA1`;j|v#HZoYXCfxKXetIZUp%^a+A1E9IUWW?S z67hvfI~9ME-t5mzo+U=>;t!{oKGD<>AD@=hA+W?#tqhV(Js9|O{-MH(>M(+t5$B*6 zQN`roG|0XjUg-_Oe9XPtFWiL5CUu3MmZ9=*Bmuwt;eyp+>)1-+zKX=zwOaSEsT;dm zzge)|w9kcy_%>R}NL7Xq7Uc`VLHwgBsw%q%F|)Fg@4lhF11c3#wG3~VI}#ZLD`CtR z`IAVhKGVQX0hcG01Ie)QKnLB2J-;2s6<^lt)?kj72}$1;(Qnl+FrS=k;Osgqu@i(X0jwi%xioi$k^{pDwLeLUv;jd8>v}erl=8kWCdc zN-2CnsWmiWol!(3(@F#N8DnV=#3@3IDamt{q1d!iQe%_r_Es$Mu=Us;+RFlr6>s>BhtR&R{V7Pxp*h@_p(I*#V416YbE3 z&%T0vWk!Xxgwy_naxP}dm@Xb=jZ&VR)1`9)M%g;rqTdbKIF_E5x$dLb!x4M(wuo&O zHQ48rHU!Qso&RgMRE+HS8?F&XA@icuh@~QB50_8&!Ruk@zkk z3)w?M_8BbIzJ@^8{KI;V^XOPSLpRn$M}}-4Z>~F}f$eNd1nDAzf*iwp-H}&F@Msiy zXQ3>Ybbn!^@xb#S%bsvx=Yr;Nd>5U(w8&WcJ=S$Fb;%%-%vFY)x{YNg$TlP5Llc4T zH~BSEZXt^Pw=HUqnjrLv#M zqKH^W7)zfL&MGy15b5c3mD@VT~_Oyyd)*(2cL2umn7&Ow|8tT}QJ00=T z_3*(++#r);bvZB58_GjKF{(>g6iVCA-DUu2I zI}-UBNq)q~GsS5c z!Yp{ z3&Td}LzE3mg>RBj0@zj##}LGLdKC)>JppxaO|+zR&^|a{gZ*0A9_ogmvFo5Qehg0M zjqwFL>!!=-V#FSoGf5Pm)uedD7K|PS?IG-&OKw!1{V@6?Ech9{I_rXPDDYJ4!zdXp zoZH+nd+SaJ`pH*yVQWGin~stAwbUiYL^k{do7wTQ75UYxmD~Zzc~cZerS60o zNy$8-CoL(=8(~~$(sbBfYRXUQR{gV59wMq{e$oAle&+}&*fg~o8|_hzR*!Xlx1Zi% z4VdS{6|qKCW-hx^mj4KX_STPSDEW zV@E4PSAzbE8cS)|QMcf0IBzDq5pzf#riCI%l$kSG4ojbeFspAG;bW8`>is;yh(Tov zX(W{RNMeO#J!Oev#_Og~ z*+0Xr3jeLLv%;wn8?0Sb?P_BnB%S{(_G$8Xwl$j(E8Tz)QEIN=Ny#vZjE!=R9Fm>& zTh8@N6!H{4o}wol&C%QFPedYY2uz1wMtLi;5q$g`k*bZk_OZPE5c1DX!sZd|4OO1Q z#G=8C*e68~60cTHH--gU7EEVJiqNDYZw`qf$QX(9xlc86zObb+6?*n^H(oTh#NGJK z@XkJ-=&$4zBB{{Mf*5&RBOm&-3QKFn10Tm;usW<=L8Z@4e>6C~WpI4c$moHO$*fkT zLss|33;`yCJ2vciIcROOc0MiZHB4CZjawN^`mI4sTxsB?9WOVgMhxegcovTX^3zgf zLk=g@+BkohcmY!)5<;ZC=(N;zL;NV}YA}+DNOW{!|8P+kLg+zRtzEvwfw(#XQjE&9 zo;?-Rlal6QxsA<=Y%wzI{>&4#HX z%tM)sf7SvF@j`Wl5sO1S8#ygCx>Hm+GcrH@L@&l5C&N&*C5_Zf?g@?^-)Xe|P9F5u zMmshNt_5U<<*g2<%3iV#>m28oX$t~Wq2}f4Tx(4^M0?pzc4BLl#8yCyLx{6clFx*- z9DSW6#1Mz6qf%G(ThVoX8s%AZW~9I+^yUm<0*jNWL)Mm1RTM@!}UY+UPcm^G%bBVy^m(A|kP z_7A|qV2j$lXB9T4$~HJ30)kxm z;yw?lLPv^gdZDkOxYYSX_HOkZA#=;s*r$y!mbHLHjrJKN7Qy-%pACy(rLJ(|Pg`(g zmlVyirk6Uk^p5>`6vf$}N6U}%%|7)^iJ_enMyO|fSpTqF?Y)sXGx>gB&mWcHTSPWq zfEFEq1lMD*?yn3MycBLC%Kqp&5ysQ+>B*Rj8l8m4F6?Ahh~hT^_Eedy(OITl={-|Z z>TpKiT$tH3O(tmp6G^@&C2$JZOJ(^%o=Pektusi&GZ&Yg3FVFonyHi^C6zi}w|v1~ zi{A8k8S9t4tLI$~{8|2p$g?72e=6o$P%;8^eeepuk<=3s+aePyDB=1qm2JFI(aSjh z`98}llKM@hPs&-n9f`^Z1*)cXSLF(RjjBXtx4KVMif)egUHr)JCiyix6RNsyjKeZ( ziftx*D+kS?%CXwTf^yqbIV({)iYBC9+0mrlQto+Q#E<+|$gk8VU0EUZeU18zM|2Iw zBg<6@s+A_(dJFiy#QSch``wa6dmJE59dvb?fI-7Z%>kd|l5eQJdO#iV1?<wcnib{_&Psnso;Nfb$kmMaiQ#{^UW&FzrfNrwbLWY$Pj-ovK?7k}gu-p=?Q#Wh>EG>gPyf33%~TB2{ZkL=pETn2FGT-Zp41RG63@bb zaVOpK#YT9|nJxl&-^^yb%Kfwkk9g69j*UqJw(viqtDP0GAC_KAHVk6kw{VFlf3NVv zq7x^4Ssi|M#F1sIUCw^pC@K@)#I`gNgj{lAV1uMP|i3@m8mH{z6)8 zbz5wT;JWBG=gKGcy|?eHy(xROr&4ch@T#&OzE3x&Do#Bicf!hD*!U?sWK-!1q3<5T z$*=_0MFLLduAE=_r&lE}D&z&&E9fkocf|UQLND}ua#_l2R_?+liRsOi6m}Jg5{qAI z9K|#FC)d^PHJ4+&$FxzWKJ&>F@W_;3W9gj;B2-(+om6WqJ)8$-N>4L9ZRQ`_Ii3EC z>bY!hAIocSOWIS6Cwn~{v1%C_#4qFEXfSMT_2fSjF_#?EgiJaRR?n`V8A{D0R@7(x z(F?*&pV^V!7m2`iFg%JdMv`H1Kdy;F*kHW_?Pj~G>Woyqhqu%2o{{jG#AP{O7{_<$ z0vsnYXF*&NH2zJx6zCu*a*P9tIv+_&1m1+gugspSV4=vYDsIjjB&y>~F-HC_+mahq zvR-D;8!NQ9LT&`OrhS)&rl=85Q4m3+Zb6ZykmzFnjTu3KZ6q$BH}-M`eqxAz%LLMb z8+$H`(?mFGq+U^>n*7l@a zsp(wGYM!Zn6*bGu8O-8cxcU_y<*5fXzJjN{lAuPfPa`>AI4r$Jjbs%!&SbUG!&fQ% z-n;xFRbJMZk-Suj->iy<=!Nxnz0ZR(MnX=7!cD8uH?El}158B+BQN3%rexE5=E6scl?kRBVki02=hkx_x|XW!W!D4!Ji4k_ya~JQG$pMpP0(EIJoY? z${1Hr5HT$wf{0@$>T;80rk=f9U>i6G>ksrj+?>R94mUZ#mcA!LJQaDQ$C;_rG@AaH zAb?DI@F_KYn9|wRcAX!Dt20x2e@a3-LzU({PU?`#G7}%gxZGL;w$;fohKaRLKkrAe z$lDkjKdtgZ8YZDBo47U-!>C+_8p1*8*f6@4cxI+lTG|>SfZ3?|2ZWfqW1V*pLR~r> zZd&7>yo#Yj9WIfuz5Z^Nb5Y26dM1KAE`M^EP-+%Vog~3nRPRDUk(4+eOvTWn56ay6 z$R&i!mLA7$?zz2{*rZOiYQ`JCaQF2WnfA{GWpm=FI(LAmI6nXt1WH03RY8E@W@2+o zd-3J>VA4$C%zby_VeoDBnLeh%miQGn&yuX-I^b=pj4}rcLuRpjzYvR)z-V@@_-NNkg*sRYM-1xS~ z+q~licE3}u7{%q9?r|#g^&I$a)VqKfam(=#r?2cA3bOy2{AC{boXQJe^yOGFuRNDy zq+k3q5^n(lX9It7>?rF;j`Fc9GBQ6DqmTFiYa;ds(dVI7)ApmiQzvU?)q1fp^?>5Z zG~1e4(>n})^*3t8czh-NDy|N9x%}#TY?BX4M^U zpG$}K=2txiS^)P2epLYTzsj%9_I)|Ox}5&y_|?z;Eq=9)@n-o|(G4uS)JEW1=JBf+ zHQK-1#K?p>t@Y@n{i}WGZ*Nt6hO57oZ4qwu9r3?bb%pImg+C3aZj+kv*YUX3Wl#P> z+RJjQjrPTGtM5cl&8+}J_6Wbam%jMyf$iZSOmpP*P*u^K@TW8<71Nx@tv)#JQ<|Ic zf5EK^?g}!SHrh`ucER7vWhuC_Z)TM};(x@fKEF4!igg}n>2?HWwI(xwS*;W>fxWWU zTxNBY_HdBgXBBxW(j7{V>+z`*JwBCfmaSFz)XzOW^_!4pk54_2YxvZVwZ-F8&8nBa zz^8sd>p5P)NW3Av5k7UzSMjMIsQFZOqu%&l%lzOpA=K>j+V)2F?@@SxtF7G~raY1{ ze}PYp4&+lu{kQnkTji#L*BUdR#$XR}MI@dWI6@HaICnG#Xe`#%XrVrp(Z`Azi zN?yYn`qTf4U%lgx!moA+zp9kS1e_Iqwd{-hYQ(y+audTe5(i1$j4>qY>_*WWYksvH zel=QICj2TdoDcH(RaBDVsR*lz4_L~-O^esY)0dzin~Ba$5{DX3e~QdpWX*<2jiP-n zylRqZf8Vsmm=-3kTcwcttRMb1isce)t!UV&_9JC+tBML2PWfQ!>VnKue{i{5Tnm0c zr=2GLD7}UCg5#rmB9ByjC4Vd8(Z9{#eg@B!>1u_)-7egdYlii|$KQTUbw)F(``~X0 zpe~BaEPpFR-{Wt`)qfd(EBnIU{B8YL^S5q8S^icv=wNrM*7nBq< zAED*)4!q#9_ROnVY04knqS}bvB|qh{H$rw{$m&dQ9T9(jXuQ8b<;L|PWN+d%6C1Ri zMY|j(PxB18Tr4H`i_a%%MdH`Imf)`_4m;EfyUIgOyD;bkLG26<(dk3P}OhxNsyB_SfK;`)1;>4#ftoluMRHU z#FcNN?Qg?8)oVw5X(6UseqBMmKIb#)(ezdK&ACL8fe`y<1FD+X?=h3ycWsMy^J&jx z+4>lIA$cSn2@xrD8<$Ph<9#O~INa3Pxt18e3lv`^p^$F+h#pc>7LwS`hv zr)!sAv(~vR0zn<=d#aRrdLC(gN`k-QK|4q%uWcT52dA=SbILVAZp<0R^Yua%gT8cIX)O6r^xvJd#_Pjjj5`ka5|4?J` zT-vkx`zt>;nSR}#nzv6@wazlW+oi6r+FsMfP1?Al4I5DMU&i~?p_OT3z zHcy~X+$juU!?;W$Mk_p2Z8|l&CP=+_WTwXNpjTHH$M+m$BzME?%1m2ZH4->KJKgSI zAym&2&q{J$Wp*jKmJD>rZZ!rJRl|l#E4U zQ%Eg^(PA1flFx9ff%=AiQ6Ll8&2{SR9db0Y=udpCK>Gv_9mzna*A@Hk((K2-k`L6N zhzAOiyAzkZJX>PEDj~xq`npu-A-nO6f5Kq1J{`Tj(_1!Fs zJ9y4K{fr-C&+2KilKSC~_z|#UiChd$kfc|=R}lW8`hdx}63BTZCXSOmD43M6J{oaq zxzY%O%Q~lZ&?E)TBe{;#ezG5CR2P+qKN9|S$p<_F(u5EOFt@ZJzzQjJw((d^|FiOb zPl=IuML@d;;`J&QLJ;=X1fkejO_AV^Hfrq0Uw>Tn`aWp5S{+9*lK5`c?q|9OLg)q? z$$9bt1gJU(HbsE0)s4DS@)IeQ!{!UQ1$N)pPgw^KaiwX5$Qr@;&LJRX;$*I$#?1cP zA**c%p(onXeIwWJs#>2473`@`5kCF)pgnrE)wN@*>x|oNtxNA3neH1@)s0~|Y*$rU z0e<5iYdcv2Na0~5HX~x#{#)jKIH|ySiR<{=yRB^sq9S}SkWpW;umkRh-apm!EsWU%UWP=pt#(c@CcW90^mZI+M7G{Y>gq<&B08C&DWktJ?7s-{%ehh?$QnpFEH&UAKfK^47ws zVp`giwxJ)2D8~CI8HsQ5aAE%l;WiRQT*vz-8j06w&)Vj^hX^SvA@M%Ib5~b#I3v(? zck){L&0+%mmaGtglj^6m_o@9iy{in;5#I&A-p#AHa zd5Civuhb%)z=b`o^hC*!celCWY#TAKOGakfMcki4Mf=Uhm% z1bX}~SpG-mBCyIxPT^NFo+VD>!nu_{Lh@Ku>?n)p5I-qor4?hdaT6R(WyQumL9tuf zV3*@FF_*G@+T@?-+ih5xwS5(hm>T51YU4VWX_F^e#UnO~^;e;62z# zs+6RIPpKZrF0Mc#Ya2OH`_j7(if_he2fDMF=gxn)AXi0=o?VmnK==;U8{ zfie27;n36_-TAD>ol?ztRFmuN5*|UJK3A102rP=p_Zep@KlDXtRl2W8ZFV5vsXW!} zoUy1zzQs^q)&j4N;8qXg1pUHD7+egXRi}q+`NT->(oouleW%AkgKz^`Xsg}YCXSTv zP>86R*U!78-)dK@EkQ_(=jCa}`4c~?--$a}NUA4^IdXFF_HIR(WS2<%hc0_PKWaV8 zkp)E|fHEGvBR6{$CC}kX59CtyL0j~D6sDTB)C&(4c!hMJx|sj^05BX(4=X|cTk#5g^D-`VW`OLu2O{ISP?*&n+j(Wj6;1Y z(z5@Gk)WtM1xJo6-Pq?`>Ncw}`+V-CkHWh4hSu$Z_Y3QuROvSwSB8l0i1Z76e%agh z#M_2DNASL;jRYP=?z%i6_kmzmra<7kcoRugG&nxyYT@P<8Zr|10~+U34Ie52AH7e0rr#lsJG4!QVf&soy{LLzzTPO)x6h3`4(5=jByt1@CsNo zaM%&nD&4m~6Jxa}HxR5p;ge1{g^vrBfF^|6osYIj8NVvi^BR(azUtQeKsRr7{T*^8 z6XZOZefCiH>OQWBm!j%rm%!Lv>b{Am?j}so{KP0kkoy>0E3@L%@<*c-+Y4>V=AzI? zqZORiB)!8NKPtDw%m_|*ZWm_9dMjx4xm(d&*r&XoxlgxD@gv6sGu<-T>Kby*2ZDi^L0{Xod(1hdUkM-)WIYAxs0LzUvDjuX_y zm(V9MG;p<{T&@jUYporhj5E&lw`A`4KqjQXRjAo#!NKU{U$KwfFQ87}j=huK@(lz^ z;T4v*jcMl(TebUHp3ZK7{RSy*!|Oi?7f6U{Ag}ZdE00m*I-?o2gu-sD!7N%f9cxRs5;`*ksrH3_(0|v z7r_rIL}8LR8OR!oBwq*earE-|o{{KQcxE%{w+Yx43u-*-zn%j#@qsA+eaiwY`SzE~ zqkJvO%&QzWs$9Igh62!2#gD>BT+L1(QNdw<*nuaaXyyLJAXqYk`?;j~yb%&*kRh`Wf*V4%bDu8>R9*zyA21 zA+h>_BY;m5 z9q86JWB}frDj=7_-&BRgsxJAue%%lGq%!yYo*t>JhiBGnHEYvb_KR;G87umIKfAJV zOS-pn5S4tb_{tM}F+ZPg=`&c@0_+d3_ zkl`0k;P=~I+l>Rjq0B=^PVMItF4H~6cH^9OiF#7R5N8?F2ETY{jn zHzdHpaB4cCV4e$GFA+#kJ|x@r9yfIBo1jz)C&!s#58TktCnaHPWUzAxlZ~5WgBZRM zlOuKj=#?L$N9;3SbK@n734pvN!Xts=IE7L*=S*LnKmX~5{?^{bXZo>qGLlz-3_TCF zNSPb_G? zC&XbAQdHF3_3+7ca;!x^0YA!f}3^$Q&T6}Z{>He{i$VM?>&pk)= zkNr7+&jm|l(}nd&qCe2P?#z*#Q(MP`tfmsCpeHW$A3Sb)O)wQ~uANabe`Mf-qWOiE zL>+AKStYk?gcRbZ;c2~wBT-4_MUn8i=;_X%z7WjVw9r$SCQ8 z^<2<+00h~lb}|irHNKG&^VaG#9>5f~X+vf%OFb+ch&MuPVELReS|3&IG9KtN9_Tik z`XdEfrSvu56hxC@=Hh{6`|tTz2Q9_psBxIjXE z;c537VOfQ3!o#6{g!;8ktK^y!PxemS>)dFqA?va_Wr5$uYV4OZ#~3=5S@j`~pRBmx zbTHMhhtgqDZ}EGks;smA992=DRP+P)(U0BVE8X8~^lyBj{PNH2j9dE3*BSr0d({!Y zO|FbZms3CHV?<@CuP*0+DmJvUp6L>XD>kMfHEU3)_D81}%VtP7Y&`p#I`EAwXl#0C zVyf&d)?eBTY@d5pFf|?~6<7GJR>PP~%X4CLc}u|0w$|O9fz_o2zr^X={CRO#L0fV6 zlBB%U>wN%S%aSBB^|L-Ru*ZnE(U(Z-^rA>=0w&Pg&GeQ+;$Xm`HCpXqZo=`tqm4z4 z(mxS$<^0^VzS#)(BH>3Qk!e-;Cq^@TMPq6@hpLyiVF{9!tfsGo*JrZxFQbwm2}aep zZIM9RoUIY-HL{x$3}RzAmq0aHEQ0 zIW@gvVk-I)-+j}0m7N4SD_|8^i%oVGyi0%0OCnd}$oM{)bsGxa2k~_}cJaX@R8+MX z_Orl`HJiXX?RtkXh3gf01tdm3R|OUGC+0jf+ek3p`KQP?PJ?b=?8#SZLoP9lw^lhP z%D&ecwmx>`49r{4#HDeH!OiTw$i;gOTfwvugB|^iBtY?D0)aFw`oHLKGPFFZx1u8A zAtS{tKA*w`N{}1O%R9W6iZ9BoH<)KuzV+ftSvW#&gn^cYUy2(fcKUvp=a7AGITMQw zM@L;jK`?cB<)GR>C_U#g;Y0Dy5_`^Y)8CZaX48jE*+=122@yHE=6*x`BMPjzRG_I= z@ciHfE;Ec_=4|lnVion8Se+rj*?15iz;U6 z5vxi?Qn_6445y1ujb~u0!ZUHAt!axO0j=MPJ$Mekh(sj#CE0VquWmZKLE~4%8f6Av z()cA#pmL+|iyQFkC5>O)fL||N?dJmgimb)`vdTGFO%{vvi6Xidw6=msK?vVKMAC55 z&b6etRY1x2uRRJH=~iKCpehoKRH42MSx*Sm&8C|LnvSH(cK6q?wa(c(0DroisyzHj zZ184$>g3p*kUgt}Fv%4m`}DGqJ${6JdL?>Z;u2j=z>H?UJ;a_?5*QjHevLh&%)VlT zJ+~4(3I!JUgT#vs9nP8A+#)VJLWge)1+FNqCL?$}8=?#GiOyw>n|b{iy< z?tmtHmWD`zAgw$@Er)kE1UB+3rz=B!;`Tn&cX)T;dG)I2S6P2kw(kqeh`>(QM=&ae zfn&ct-VgEl%s$w@u++Y~Brvx`!sFNr%3${TlmHsCuc(x~b&<+#j1n}zuJWHmwDD7D zgl!l%{swGRB8{=^7hDGP;ka?*jk)Iwxg_q5s_weEs_=r@bXq@{r60@){9WIlt?$nW zE__#p5?uI>{HS*gfp_PetX|J0n$8Yg{#&~INIZ8w3!Gp1PyMvi_+>jxY9FrN+l;%~ z4)4wbbpD24=K}YTtK3UZvn zuE6$X)6>Nr*4#=DA7DI)%`ln4K(BWb<-|I~I>Ya>mm%v6_~0^Lj_RBMp$6lLu_C{n z6DsA$notq_Nzk56Fx)i_*1F8;V0zH58&k946XVHl=tD!heTX$-L|l}6zvcs#{!A8T zYTPc-(Jgv|he2BGC_ zdV%OGlKvXUyzbgtH}PnG7yH6l#-mei^Y^w_L=7r!rqcZ-MI6;?bzt<~k```y?(*Ot z#)qe9FcqfYu%Pvk)M+Ke((;FhlBCSJ&LYfqf2$A4aN$$S>HJKpn|^NeV*9j8`yjXD z&bh!r%e_FO+#T4$iz{VR&Uf@ncfJRV9Y{!>ZprUdNLME)F3lUiT`$d~k6N&qOqTDy z-SVuz+@ja#1$<{PK6UF%)pPzvd{{&HW$=oSk%$>W~5HwAcM4c4Elps@@ z-ckZ4aeP<|&rNucVK5i&CHMwnsi(sgT5%anX9TfO2W!j<7E{lJ$^qh3olkX!0AMuk zGKBl=Ocwv`2_=OS{5gKwo`B}}lgO!?+C=9FUq&NXXf6Cl7)JZ3EZ0#;+>fvBWmkDZ?Rr+CGNjRMSN6 zZN&b$BqM}-x=9A=9LQVnTc9plFGmy@l0SsB3#PU=6$bLt%>929qg-nh2{PlSR2~@J zzvgvGd!j;R)~UEatb{9~J-J125S2#1u3@x%RnL0C!z}jCY43TLRC_`bGjIMus*XJ< z#~*$%m(%(PxA{z)dL2a-9j`qwI#_gD*x} z&h)X&Hi~o<-*pmmSKOU%6N+;{JX06%D;CpEsc(Wm($ub@dL;ceQ%fsEOSim@jvW}X z!$mc{0rLb}D$5)NYYw6gk^->`Myj8TS zU{?q7M4jKqt<=xGZp^*c?a4D0IH{jrs_(r0(!OoBER+q+M@RI@L$G$XKYGn$La}=G z7yr*R+0>&;K8v0jSZ{STZ$;BIu7JRwN~Ka%yEw|{)?%q-{*k7gx`YdqKGukzYb}un zN00uSsi&m~LIWOTSHP6oN%^*CwF_^>pXJftknUg*YSLWWkeay1?WR%=5>$Oq&u~|7 zoh}Fmpi#lV=p|NHY-=zuWr;tQ@!AzVS&*JjB~#DeRQDsP2UKT~)a+%sQ4rVYnAD_# zz&h&|HK>qj-=YWAWsSH2hwdBvIq7Rvs|LA+{jQDaksF;eeRw`nK!fVS(ih=uETSYeesXdTp9 zFFTEhmzrr2{p>pHd6X3unK{rtbw1)2k~AUJ7V@N5R`mn9gis^)GJ##txMg*4#~aDD z%>+z-RN4#$X3_U{zSMm;T2VC6?~88zEczYO>L!oQN2xOh^m%^FY+`KEZ9NaNx+-r_ zJ&`U{y4}g^iKZJ*sX>Y+85KgtkDOpDASjiBo1zH*rad1B&Q1pD!qfXcv-WMM^<1d6 z)GJoq70w2V38q%|EX=VA`a8Xf%%)!3{~-E?Wi=eKH{XuV`z?#K+2QQj?I+ex)9bKhUrrq<<-%=?JN zJrBF{rw#&T{z4D=?Xrj5BRY?c$+^wc$=i){yF|K}Wi)p|0n%FzY1xI_;aFP1N@Z2L zr&M9pf`xBG?0pM&LGwAL8N=&^9Q7|a!&sC6b!*zl+5=ZMxPQLSSG+2VD&NVX%5+fW zEWXmH0#I4!;7QE93xLmckDswTIfXu+cb@Lj=JV!4WlH)t_UGMGL_1 zpw*4}NIG+fs0kKGu0A6nf;vVe%B?@h^Re76-0705L^cf^2n_NbNT`@OXM1phhD z`!kPJ&H={V@iNb@@hay^o*(6#$rSaTDnE6oXq*EWiZ+F(zwx*Cs7T>1=Iixt zJlbuo$BNH-KK|a=_@1#wVhvrHb*isfPUnIz$RXt)^pidEWUP83ijm&**w~cci|t<& zl`lt_n}#3dYg^!JEofr{{=Gmo`cF=mnZ*T~duWk!P^`Irz}Hn>=}m_ew{!ITnL2v@ zEGJ*h(&wqsY4oB++T8g3k9^Up^e*ElWoh`<*!1R+v=&d#EbdOfb%?69i=E1?$=g3w z-{ku^-(w;IEJW$y<9$}wE%fm#*N2?%e#QDQd9CJm!CvcQ0qF3h>*HL$`tPofj{w@g zy*>mN)%vj3V+ccvnY43=vb0c3Bw8wv)fpj-MK4pa8UlVY%o-91k~T|R_ShEgkWxY@ zRjSy-+EZq!EE2WMDrA{tS4+w?1V4Q{HUv5G$Knzj{6&(lKo-iU;ARfy`Rhfr@6Jp7 zVO|zKBbEzJm%0lLSPwhj$gT$oTBp|o%f2-I)=<__@vGxfBZ^&}sM4%eI1c5oe<&d6 z)>=kez}CJz?Hr^Q#E*FAE{Jobx;%7{c60k-*@FYDCZgc(xeCYfYjR3hv#In*7C=XKC^)b>mu^Or*xFrAdRjaV<^i)QxLtQmbxUOOun-jcaLA!;NQY zlIrj*O`hpu1qHIEBT;yjX@h^cgA^#jutT~Ni~)~jv5^rd{(F6HynX+GS3ErId3qp!+tZc3&(SCBq2Sns-<=gU{tsp60vJVgHU3Qq zu)*l8f*6%bu!{yoO%#dezjj~ zYg-?PirIh(pdt@Ns;z=r+%d{aO#*20|D8Ltj|A)2Kdsq2ckbNBx#ygF?z!ijyZ99( zUin>v$g4IpBL1QP$Xk3#AQ9@mA)qZrUAoKtJS+J6TsRye_f|#_d+q-q_HxeP%DtC! z{(OkgdrGd*Tb%($j?l|y(wWbU+&lPfM*kn=-j`gtclTDYp~>ag@au1uf5k+t3l!jQ z&Wg|eW-@`M7exlwon&;CM5fnGHo68!!baCI(X%=y1(U9xLem^#_X*s83 z(!jjv%gzVrk&2viDdWzn!ss6;gFXo>7a|v&tXG_;dKT%gk zh8*T=A&Cy6Y&zAUy@d7P zumz2WTyG+^x5edS`A1SdQ%SLQ;nrYls0@=(9|X6TX8>@l#CLQ}NY!pdj=I5tDs*)Z zq*OKH6@}jDA8C3s}pNzU{Q{Trt%9CGb|puj($r2ewN`($kUG{Ky}W% z-K%Pl2YW%U8jQuY*ND#fP1H_bf)}sKZ3@JvuGqr`3+A3CZj3W^`c_30_2%f_)Td8c z#NG*F8K5SWY|Kijh&@)Ry@C6>PW@3J*44rehLwY}8fBdq@r1kU$SFU5~4l}zr z*qQr2u>qQlp5n;yOO7;lA4Q~!x+BuWE^!1RgJB2d%@tcYq0P|0dVZwO^RN3na{!y> zhpIf(*z5UM+2?G3%C`U4{rO4udsYAaeV*~U@73P_)gPrAclfv5uiQo?kT(#jdlqOh ziPXCIiiV!|ft?nU^BHaVqof;pWaF&GPE$EU`P#tch+Q4-M)H zIRevyYwf4_b@->zGhB;_4V8AE#PcwEZq{O-$>Z{S)Z_QH*ySoQE4o-}60-?vir&Vt zHYd5;aVhFIX{P>QN3eBve{5}yWI_8Svj6Bgj*^ZY(~?sfdbUfQDxPRVPcd(zWm4M) za;0Ad@;11({rIMap6~KDQrgfnN=gmls%W><=30PCy{}U?x-Si1sioPiMNaRig@Rd% zY3Pv+cXTbSIOC*3B%X9R@UMULab7+zA4ebhhEd_=CZn zm$M}ozg0cLh05YBz;MwnyBlKn*z_VyH*-kIr*|C@%IiSJ6be*xI zzme>3KdC+dJ2G8*h@2*U7B-bLT4!^R7PJO&r%lFHAv&gGB5UL6tbkZ!trHzl5A2Q` zg)goWhsu~(=V2cZnL!^S7rOAU7S~$en`s{4^ufox76t|wGx8uikAg^u@AuEnsDQDyOHT4tWjD_4? zcU2+LzfP_V&uX?keqp7H)dsTKT-qqc-V@ z%VuL2{qBpZ{fSn%ZMLcu|Kv}Gi4*B3`AmM@k?B6r1*ZqODiMJvOTGf>bc}BWgj%eT zE+gil&sU}jEY7T(O7fmqOki}iErw=F6-&kSo}tux2emL+8RJ^(980Fv+ z>92m25a8fjyxF?rDvTclkTvFZ2asqT1ePg{u^3&0qU*0zE;Dkb*msi8_>a@8^bcTH zOauaD2hv31o9Fk<%>3FjK@;#BFHCcLe6#eFp2m;G1!JtiowdR{jG{KcdFUphXX=25pdF zJblJJHjUS3C{1Z}GUHfvocboO?mWR$g}~V{>}mHa{_vmhJ~eA4s>xQdVS_Vpaq>W} z>Xkr5J=@iHD!5Af_9oRx`!)s}qczYf2j2w6%+E7eCpNQbl=}vJJF{8g+w9)>c7}^@ zC$AElhDd+)qdVuxS6)rG0$1g9tcp$bx8UFM=NvHQt!yV~8bQ_)6s5U=u@iZzSQQC^RZ?u@uhw4$Dwp{Sb1^l06a;D$>4L#Eug=-wzySvis#q@}KitOy? zdOJ!P3uhKYh!|eAvWi-?$(WvI-0K{8cT_LRi@axSpV0o%A>$1we&3rVe)VjxArlJ- z6tSx5ggR|hrzX-W&Qy`(+2XD&Iiz9Lj%xRP{3-35gg0d*cI$}p=FEz5ATKgdc8jbx z=6a_yAK-0^#uz_HcE!$`THaiF;n*bv#GcHib)9Y%thJ`G!ipcCa3Ha;$m;hooI@AO ziwWAVn*-kF$Pvyc9h)5Jar0uw=5fn*+-eC?8SjdINCXzv8mu<9n|qBN_z2)|yT6eA zcK6}jE`f#iCL52#(1`t9AsG3K-nmIH+^>`TofJQ4>>ngWi@5i91UAQAk%Vlr4w{|j zTVQZ;a2c1+rwS_PU~0k*&OAi?&$ISBMw+8+)sY7~H`138+jN374RCtQRO0(XXuBNg z?FQt*dOoeIGJ2NWaVD})-3dm|9e0!(J(ZE~8a?A9Jo+QY=I9N2?!0|3lJmU&M$e+? z$7-C8+_*;SDQW0g&F>u_H}nW2kG$W|la$}LRSnEbLl5>8o=Ds6e`?q*stMVZ{HA?H zhTbdonO%1cF!!2U&GqCR6qkyr?OEHxvB}878`3 zq5b%;1SzixTUwwpFm}l^Q!N6eJ_r{`8uP2ffO&QMZyLJQrlV0#J{!7)18BxH0bBQ= z+x_A^y>y~_vz#~4!GVq{ttwj7mS4o9L$3|p$50^RYv}$fd09I_r6+lFItxtLTy4Hi zh(jwvw+c7nQKlJ%@Nm1)Nl%;eZWfWCAUgNA4kfzM)&~g<}I$4RX0` zL$^?f7XN@IP~W5%#Dv}rO3yo4KpB&`-Bz_PQ+f3F9o5I=MSqi}N2|IBjg^o4#mwnk zW{VFSYB?@rPKzX2Bpgf2)^z9Y3&*w!YwhY{TY#6Xuc7-$8FK6z`I~r8+P_%c#CHnC ztZME&)0Pb<>5S+3GKR21=Z~({B#9;5dlXuu_-%-a#@&`B=6A!Oh@?h{gZT0CPI|ns z#GGD&I;+&2Qi^f3RSi$)c4~8au~|J@&->i!m$sQ{8M#}QpAYB&Y{*#W>u4#UVF*i} z2u|YTi8Ch8OtYUopJ{KR_kH@b^dGdVpj)h*StLTx!%Z6QY_$YCK8g=sQFI4xdJkGe^6Zn*o zp93GEj@u|@7n9$_qN2r*kS|w~hkmsCyIQ;(qapi$)pNrxS!7lHDarjQxg8VXVdIG3 z7*Nt_;3XJl4nX4K&(tvy)Q&wPpKO=M>N9xUAnp8yyj)1y&AIrU^>%`A5`o4oTy(!vjn9AE4_Sd^b8CEG$W#b-ThT84FR)XxDvHnmU#@LCA#oA9=(0OWi zzsKhs#cA=kBw@CQDnQ!7`ZwFFA8vNdfQ2by)JkuqR{;X_w@p%*qdEt=GIcJ#zAN>C zujFJA_GvO#$_FexoUC_&u{guGD2$y5Py8ORH8X8Xih0@P)RdiDSyx3qcJK21ny48tJjF*Z@^NGI zFj=_L3!NJWXn5sCUXh0p8HLejd8w<{hJ)#e0H>-Gg3Jwmdj57~NV>LKcLr z0>4<{;YiIM>-6LTEqb^UHG>dKPg17@_0aBFO^S)*M!z(-R`P#39!Sc#`5vxTEMRse z48ot&>$!DNkrf)EdT4Gf-=IXdC61;oX%A0+GJNbNEj9@-z~i-NekWa-u zMohj4+2d85T}Arfu8#tL>a8C*t%b~D`vz6cm9M0*bdwi3Jz8@g?^_OGO-pnvog zm)mzi@6zS=*VE&d^)O^^kZC3O_2<-79I)nyP5HEd`DsAhQF}a{uXx6>l^aZtiyhw` z*HK&i(|gRf9XjWtTJx>cyQAi?_6ekgrXy!ob-a=nZRKx%w3)vJ(Utu5MxW-dFZyTx zmPDW6Z&mcS4gapE=h0uX@k{S$MERGmAG;Zk>^)eZl=37yMg3T8rgrXut?EWAQJ#s% zCL#RmhVZf%gOc;OP-1i$g1NgCy0QMxWLQ%ZkU9O#rIX{x4_Om{C2p0-T52*M1QkKD z{`!_Ok9JR|u;#c}+R7k9(jAr-e#eHGd8pbrP`G%wI*@?QIbLq=lF69Syq$My8^3;u zZG6&ig^2nAbLdL>CDw23S5zqw#>kp&Q=#&aO2awBUqgvGT;n_;ko?L^C+Q)9HsMO2 zsE+Q2VS^=k(lNR6{#?0S$i$_cGi{>qfR~@$A*%>>FWeFePIx2NyB!{;I{YoYm2IE& zR(|cNfXR`AavCY{(*|{>#wzhgIuZSiGO@u{>-7FdZ5HS~FYGV=cm8q%U`M^s6YB8C zcBj&yRy@KVK%R|g=E?Aj>2vPsX@9Xv70JGb}y?>)=2;JN5C%1#2=WrZkC+W!b}VkD?NF~#dNV@~bel=~ijAeLyKZY=Y-OoS%g*D2#aZ^@RQ-ImY7A1`s@orP=&duL)OqL;qlKLcwq23I#)=ell(%@$ib|SL z>z>&CO*O^p58D{jj*gzke4PU{>m0szm5yEgmK?1!|~MUXkBAi?bAX%ga)0 z>bJiVsX}tOjVa(L+|%!t%Dalz=+oljnZNib?w>bXh*_xu!sZpWL?6-_>MUiT5&`Q^;PP0TTxz6Ys@7RY( z=pDkn166IQDV)#vn%Mqt@NB*TmkTQa*PGgP;v7{A6igN&!nN4vl!>t}xAO}={TbnLc5NuWZ#f`rrpgC<@!s#-q$2mKs*)Qe-& zmApeGAI=-SPuE6M=k9mq^{m&VjY~F>dCInZTFdGIw6=!0ZU}6bwlpaowQ?{W7iXkh z-xrfJ#AUElCO18?VK!@h#~$Oo7(~l(w0mZ-$t0E%7bo=B8fDjn1=Submhf^iTc}!1 z(i_(id(E9BTkdS&e32n(@yAH_nuzO1^qz>p5igSvTSz$oATV<}F0zqy{A@aIPZVZ? zWGV9^Jb2r~*E4jka4}9`cS-8-8(xJgQ)-E3JOIKr?qERJ4sr2u7WCe@6KAQDQiKIy9B7s(!>HVrP}>||9Te2yI(s(>aRWgtPz+bGa>8J<(V0- zQn@F}do6w|e>;-Q^9>|$Ow{gsQ4)ro$I+U-7ff~OSH6~pG~*pIrJMU6l5Wb)>zQs| z#cC^8CjX4SOWV(th&i;c|H~9rtr}Osy;X0dtz|7d_374PX)->aznD9-;U}O0|845A zuUCCh#hreLAAOn8mX3l`OKo8IrJw z;aYq;+r#qBihtb?>Kpq9M=pgIY4P*qMThL6e;_-{Q~BepLwZ{hxYV~dxcJtK%F^uN z4LW51Q@+UvFgNJ97{Zd}cb%S0jTuR}8|ek?_EA#xFW&$ZJ=(HY!O8LRPK%wy%;~FS zGWfRyJPWA>R7Dj{rpojY8%BESp=-IJ;~qW>AqLC8-IFD&u`VZT`MHv{bQMj6*cR~* zhm?@HC#2>Y(bN+fu|7n%LL=BsVHp~FfubHU#|RT{$LkzL))j}G7^cYS;Srm{6`Lg3 z13R$Idb*ymIx&eFAD5m#uWFzQ-Pq6*DqQ#cp8>IQ7~H9MZVivv5ZYot|D@ykd;ja6~7(>L>>4 zvPdzPu@E_+7HoI|DOp+0?&!U;{Oji+bmIu#X81{Ik_yJZ`HWgU{^2Y^r5{jD*Su2& z%^k$me5Z|QRV&C2GEZq{1=%Jm$iKjGta>i}C%kwE|FN2s+T>F~={_p?YTnuDN zSO&gh!LfqItL0CM1FqHLR3KpHudGwD^u}LB_Qt)oS%T8`UW5L61=O*M*Xq2&MVy`` z_Nj0Vj;nU$*&5482L8KcV@gf?aY*TMoOB(s>CZZnA)AloL3FHlv($;oE4eG}ySr0} zB<;KVAmx-}-x96yUMIZ-T3agT%gQg%Q43~W1H~(_?nnr&x6_=e15{~}b%p(Cv+MOI zT0_vVo=nk9;3U`_7$xuVHu2#qyCp?J}mUzOyE3xnEUW&W=a(~)}fxm1FMC9KPWYdP@=-}3u=J?BcJ?RA0g}9 zTofDG-I60@@y$U{Y(FSg+6I~-Y+VJZ2#H+U0uJ>Sxfa%fHOpu;!-s{7*&TFM&HG0M z-#YL2GQVohCToqLgG!74-ov0;fFMfBWg4X>~>mYFBw0Hi+P8e}_kg{EEE> zI|#&|l7d-#(`KDoo4(08~c zxx=054wv7|aLcsDe$H^kPyCyQdkb%z;T}hOif==}>$K8MIA?w5wnb-o5KOfhTX-7z z_EDH_oc@8fbPMa{=MFn1YMF23hGx+0l7D=zokG0KmX-k^$md#Zi+1U1`w5EXR9Moh z!lh1y^UlbvtRY*OR(gQ?_74E*RFzk4)JmmRFz!%Z)&Ekk?kMhdaF=8;fY9A#R+i)q z`UpZZ?kWpmY?WD@F=MP}b>%9Nm>hWMD+NN`iM-4 zJbyfxqZ34IR8l4n9MwBF>mynS{qy{ByduA_wJ&4RE7og`Hvx6~YW}464NXmH1kIy! z3PH_v_H1bMaD~Xz;2bX8L`DAJiZWrA`-~_PP@+slPS&mCl_>K$?9YW6Ecm|=WfFUx_jm((^+^nIZ>L`j#9~<}k@CTx*xnGv&^`$_amP3p8twfq6pnun2pU z;-jVe(+DH}{8x1e_}vxiuHbjJ!kjY0zq(71E|2 z-;4i^IBOG7floF4*!j04{qDpPEeG;waR{f|{E%$0=QBe&? zkAu|*z*qY^UeeFQ7YshjW1k0!d~>J4h>Lj%llxBt9z)aLG=SIO9d^zx`OC2)n*Sm@MvA-MvQ8;=4cXY7?mmz6lx zpQ@@abgDmBswWhKaDOdhA&Oa`cs6ut@=n(N~#XxjrlCh{U zj%P9PMEY5mc(|cMRoyl~f$$Oc`zyV^L?# zC%Wofk>$lql6xFJrWrZa#@b+mb&gfYxdS?86sy=nI7@^az_7VW-DOhqv#-Y9+6kbeCuRpUIAl)Rz99-|?H|q1Z7n9luo`4jbRjPxJ^` zXFydBIXAF`jjtzDYy1U&jV=^Zr@(HFu1frsKn$%>tmcfaleE|Zm4BWVI~LAubd7+f zNR&5=qed0OQF^wX)DJIYWtTfY9eHx9S>cSxSTi=Q6XtpnUdCupDx$_)DQi3`OQoi{n<^Q@_aXB`Nj5nLChb z_OQ?CNR9qm8k=fZp;UkfPpK(4umt_ZVRNi#90es*r)@c?b;jZJApQn;p$ves{ht`Q zgT6<<2SocXey+?jZ$|3mmuJAQuIayf+4V?rI4ziaLuQH=O2g&{)8zcWlv(z6S z>FK##wRVmDHnpem6Mb&{*V$*MKVsVI^aq0f&c>aJ!EBTb!oB~aHVEwIXKbM-AIv*n zRyWypY?jymdRA=^w#mZ8-Or_;ut7-427%4%jMw0;n@F>UUHYoqzI0pIhudko&mgj0 zPkjO2)v8WiVV9_GI`hdlYiY3m!(1kk(wb-VIKD?&enJFfZ))pHGho!8Lcdb&A%M~G zmo85Im?o}OO>kS%i!55MeDs}d|IUv4r;qm@H~7w+^&0z*XL82QxYx_xn=#j_@j7uQ zGyNNH2nxl-j#QD8?9jCMP+AA7N$sB3c%j8x`Ria<>~oT`Vb92^o_e805Ozg3;< z^Hjk@@EHeB16SCmQ-ytS606vfxxITprbrh*JEke|z7)AUO-hd2MdjB|Bq@*3$6n)1@*f|;nehQQU-LMpJn zI0R$6P@#Gdz6C4?!d03h7r|GW<#UvP^<2rrU);d>yCn7UlZQ@u2~%!+sYc;Xbd;({ ziGYzeR)M-p+SjIjzG#?4#j1}Sy-IeoQhEE|z@x4nTTZ%H$$dd8^AU#MY*$m8f?g?q zXK-iTWiJZ<0e)m~K~70dT(7jfBI}KuZHk5ARC5heUu<2JvB-7JACBi-&#@=ctz~lZ zi$#&B`yQ1f7RnoY+d$k#w)86fi3;aujcLO0Fko&rxqVC7QP-GTYs|L;$?p6>vZo+m z?8Gzm<9;=mui>GZUvq3Trfnqwqj|VI%9VH}Ml;VJ;M{f@Ed)m-%?)T$i$pX_UHzvt zgq?dhl%}#K-h=6>7T?ZXVD{)^CX3|QCunXA5PwXJ=XT^}tUR>FV%6~|wybtk}pO#jMr117g&AoW5mOKo_D>`~!~dmT>0k654xZ|+bK}>zs5=pCPIeEsC#hEI z>5$BA^lAHhQitjn;3?%HwT4Zft6u!Z(TFdL9i*i6V-?ylBq)@R9a2%IGp;>?$dYM# zb?oDeZcckgfKf*G6bH|ZgU30+2eLdrRz`tD^_L7pTRKDvA3R)(Spd^Gc!U-g)j{%; zp#gOtM*!3}KK9)}jL6PZSHT>N8ep7S?B5g$<+%Cy+T^6Dj`2*uE32QYUNP>IKRqi_kPYG)}O9w^Xi8o8yeu4tR z|Bd}bejUyr%s1q?ewf%G`9w3D`ei@WTasddgc%EOwb-WsQoie~L1y%HYjIiE4>_*l zeGB;*{)x_7$|tHjYsyjOy(ds>+(j+GA>_pERr49NW;YaA1r4F(MeqnIb-k<<@bds$Gg54e7qFW}PRAIi`!DG)Vw z7H+Pz5EC>^RPR+V_=I##d53XOLkHig#tYYOJq)99;m&)EX6&rgqlqNXA`dKFA0h}Vq%&%axSxzU}ZFYEvMA5}oFQuCd#xr_V4 zcB|z)V^Cw?6_8uqgkR(!d3cupZd*h?rT6B{j1)se#wwzw=E`FtUnrZk%m%nL zNYrt$<`tE}p>79~YXu50sljX~sH73@&{H#Oei=^O=7Z1+#11ctu}x}fLIAfL0q^vd z1;<2>#^_IbR$2YAo{JgYn^f1y7oHyHjP9d9l!;&lasRZ1kCNI$T-wo!PURddqs|Or zMFi8pdKO!szGvC>@|n5MjgxzS7500vCXp9c%s$JhvsZ;bqQaX3)+OFRgA(xTLy42zdR-;OwVGSwX8mjd=B%pvnb)6ENxlbmnv zH!ZkZfyg@ntH!bWjlO}JE4m(=Ju&w!$69Zd2>sf#?@l#$VAO>aPp6dF@0j`?v0Qaa zOnv{QP*zNR4_Ti=pl;fVQu#QFNLhmpU!=-FF>_z^13=kJT3q^fa*)kds5dzQL$t=b zc~cYX5UX*q(bi%jpJ9ZFacXL+rREx}^KD*kbL|MuTwR0(JKoZ2Ye zzuznjD|tTXJ|Db}(~^5$p|lo%nZKCdSBUS3B`X>|2CT(d4vraHj1Q$_VqZ=Gs0op< z7>2%hkJF)yHThxDLf4u+S}l{L-Lr$wq(-Cb2U@I9NU(3!(6_=f-E2#pdOmpeB$Mv6 z7ckDi{$)+EqN#7_57?=Ua@$h-#W-zCM*5G(Lh!+wnZ9&ssC1p}`QNSzEApGMk=~LA@9x9&9zEiGo$l94> zCF1H<4@l1x;yD&^B7p8BPY@8>$yR5x2_Dj7*xWDpH!OAEy*)kGTx+jVqpGJ5Ea9u= z;#n@T80NQYv-vW`W#4CtuZdoTq+TiV|Jl5@rWaLCAEw1ekp=-9TBxI5MlDJnc!oK> zD81V`bktHNwE#^yBh9yW%6g@y)OwesKqxcn^<-p6Ey@Z5sSB;jF>a* z4n~QtPz^Xka>G&&f#D2r7$kS6s=eEd*jW8?mBux(kMu-QR%^UQ zNN&a;xo#G-9r3im0!gjra)lpIPF88Zbk56gMeNXO_SjxNA>ILtjYrJlj*I?~uH2aI zN`CZYD8&uTpQazT{NYl*(iu$jEX)BBdr~v^OOHhYa@Gy*2*$caI@V7_z0YL_;x+rV z{{enmxnS&)-w;arZ$sqzjNPF09uo$sZtdnB{ND4>YiFZpw#{5$Ig z6BAOyl!ovxm&%wJb=9(xXVt_w>U@1xK?6K3!gbE&1txcfI+riUn^{2XU!H#*(Pikf zJWP-nX7$pl%pWT>QkYn&Fl}m6lSMj=y_%)N_60x`IKt<|V-~SxVujqDyql<#qItOj z4bI}Nsl>yF4yrU~P)(W6r!OXO`u~9R1@%Pa3@cpDQN#`qY7-XNF?3r~XgPO2?X6Hr z8b8oyJkXL8AE;xJR;9(BmD(ot@)Xb-e?z7d?!Q}^L4P@2$LF!a{cOXp%j2jMT1(E0)^QNSuC(}M9V%Z_(ELPHV#SSITnWts*1wZ_dfM{4bY zAyMw3?_9+wP?8Ub+=^5lnIo89PB0M1G(4+MPsiy9XwO|TzzyLO|20+V<^fq=iekbT zPN$91wF_2C7edxhg$NyYyEg~_h=$sK?aps`N60!q)$vPrTDYq?tERvO(%Va4-que^ zvJKZO<3Kj2^Ut#l$?9MkiYv9zExT_Wut{{FAaJSxb27XQF!0lU8G6EP+&Y!UdcNB6tVu2b~q z*!y=nTkNm6-`#vmyg)d&30QJ;Ggle=D~oZ^93Oyu>#Ei+$8pfywyBHE(KtcuNe%we zVSf^y57k~VenJ=exUt;}x{Gh3)Kj9xV!Rf)A$B)x-gy&BT;^kJ)SkM9T&1!rmiZAa zrfjy?G9#F;$D7%JaXnn1b6dc=tR$m;6W`mTfrGP-X^ofDL`|G|8|Rm3rD!w;!oRD$ ztx>Op>$rfTp|;5-OwC;CDNY_NG(OZawYd&WqototY;tD*P5g__=t-$f=>9Tb0Vs&CB^8LU5_SAg5}pd2}D6oFi!kZ!U_ z!(Q8zQM@GQr!Ng}1$YfNrj2pOUa8JYGW*-r_=}A5+hQ%__EWmT-4M?7#ODL!AZ%*r zw{=Bm+MY{E+0O>cTkYdjb&h=63rD~Z3lG7D4?6jTh)mJ%i_EhecAGm-_R<{w8#cRB zU7Qn(6=J0bGP_RNXMDDM>>Ck<$t8ujVgU*s7e9@#K#FR^U8}N*xDd`=p%u z9r}L5p>K8NGyWhrdWq~)YURrz%gjVmm$ZB!Z(h04wSYL3U4)Q)m$o~qOArkTnG10q z>0|2bjDNg{G|(SQu(nk0Zy3KuWz1F?--AR{1ZVakk}RZv7TeCd@l2d2`UIOCIG3^& z+^n0B#KH{a3(xU70$Hl{CgJ^gGMQOYO3i%0MIhx-+{ca)!NVUi^FSq$Vg+3UrR)iG zL*{X6fSQaLy9d%5i>NL=W|7v}4B;NPm*8E#)Z0shP1gc3Im2X95DNr6>|A6IE!!9K zlhh_kT^p#C6EdIulETTVv_7HD0qpr@_t1#LeI$yA3)qv%cEG71t17jBONVY~8vh8L zC0f70Yqccf->2sP5{;H{mM#nWIDeXvr-t4C|Aj-s3xxm70c=c%2Q1EY1?ao<;EVTuP@7A=NY< z_3&0}+)ojOM^Au%vMGYe#+xMUSNM~bFEhj~K&!_jGbV9^X$-MMqH& z0yW)*X}~pVWPOH|m2c$Ro``=Ahs1&DN~2_RK|4;0sT0|)r%&i7^y+t9!d5ZXjdcw& zV(p$fdG39N&5hd8<3)0k?T5&ro0R6P1wQS5UfN<$;JfTT0GV?4=Jwya;38w-COG~B(j~5=s`RS5OZG}9og(i4 zMSg_~A@kS_S64)6&!iG}JT8CujIKKTA-0FPx5udx;2W*BXpOQ0J5#?%rLxoPC`e_R zW5-g5V8y1a#UxmPw}()|SNxH6LXtz1JHaC1Q`)A_0qI)EQ@Xf8W zk=~m*D3fUZkX4Wag?e?L@YxNenvT;v)(w(e zwu%y-sGb|nw(=Xp*^YGTk$AR;#!n@9>ix6i@YU7fXLR?3Ub524TYtd#s^1bHqsk4K zc@og#V0yc=6-2CAw6qtsioR8#1w_pxY=A5j+Mb|3D!~nTRqF;1Hx@lMC zzm|16)~tega9Xon>djV~STXm_* zYOBVRKt8G-E5B{kRr155?*2}b-?r*n_i?8CJ4b%os^>aC^POCyUVizfw;9Wvlq8$7 z$p_O((|DAmZr=Zd{InTQrC+oeE8Jw8(VWd(n@w)ayx*41+@4OFMv7#cvB%A5HNKEk ztMR4$v>C;MhCcLg_jjphuRQZFXg%&B*=mSojPyvJ+@#M<)+BEB=LajFEZ|vNF8kN8 z^^8;#nzcsaOH7^h*_6bPU7Z(~)Lt~`C`tv=rEBzeA=jqdx*VyJHaXlg8M;t zsA3~`9dC}D3#lTI6zdgR=bcI#+k;vzme@M)1Rmf_wLW<`l7|u=RIvgQB^M;Z>-g^2 z^gVopc$T@SF?RcxQ?q4 zztEP~B0S=v__6>@C@IwTiu?dM_TIksVZzttT3cgHUa)dD$LtBI0=CF^eaTen0Iyu) zG*^es`A}n3v722Yzim~e?qiwzJJ!jravyc~cbb!3>psqOf9E*abDf|0PHug@{PIt4 zt6%1%B-xZrKIkUH=88v2hRr9Q;D<6#xi3hraFcEI&DqSg+2qE|`)%3G?QW8aQzYB! z_qZ9Y^$u0mJ5*VprploCM3*XE?T6qF2*J&F2(DWQ4(w0_*DVA$-zB(iA-MT2!FA7b32w$ae0Q9E zyGSV6_R@5>fnD8@z$Q+=*e2KHZBPV=io7=gHj6okm;Z(cC01uBu`Od20gzmpJn|Rc zOq0r@M5>U@m^W;yX$YFnZ>*&zR_m;r@iQRqy0|KbDDlp zQn>bcN|v$i7F@z@`*7nvN#!{iA{zM`tTdikaaAgxQYtUs&G1GBIvI$WFZ#u+PA#(B zC{Cc8bhH{3j1Ya1Q(&s~C;x*|(A=d=CX{28;!$w7eqvvnvTA2LdeA`S)x~$6Fx4X9 z^{jV8=IHnORI2n1DEp9|eZj=;k&eB~d32WGqf3Qk;*Qf*9U%IrvY?RZPS)0RoovAy1GNWgz z8THnf*B9HfDdNg;lMA?^D!IKN`GL1^qjg!)VFQyN6cKXTm7lp^2H8~Z%sPzATk3bd z!CkFu(X8qZT9MY-P9#?2KuN^ga6rzz2&8N^jurBm)!~AuV2|EkP=gx52N6WMRG_Q? zrvKELs32I5EJ{P1Kz?xHyYdkxo(v7YF$`Yc&R98@A6buayXmKfMyb862W zM`pKf0kQW}r^DmKo6)u4HeJH+WIwo}Ns#JGqLGUn&R7X(nQ_KB=JKtzH@K?qfIl_?@(r|a+&2=m_T$ZCJg0IZ(sOp~=eaG^2 ztjUXPK^vl4sI3+q2?C!IG~~W9x}^WdE~&uL+2I2(+5b`5g=pP4TFH+T@-Ue?uSrUH z@+#m7Y#Kfljvi~46Uk|!xUUs;%}m+o&54ZHMsX~ljk?!gPa$p8PyJ2m_hJ8|>i2j4 zr_}GC{LSk3Y5zv``=Wn4zj`9(7j7@-+pwNRez+csE+h6=aV+iiQAUoZ%cLxc5`G~< zxCy&NR@R`uROOJ6BI?!H)D3~F5GOFchBjAz@y2v+?806Nj;aOs^&r-$S1>>>^IGH| z>yVJ%ux1YxEGy&;fAOjksT_=>t4N0QolN$(N*!(=14DE8OJdPHLT*aoRokuO z0qI(OQx`|=t$Jm}?ZfS78I$0(@SRNu$lpr7W;{-|&c*1M0R1~`eK%~Klh&vaa0!6k z?Ds`4QTNzEV8Wx$cKM@j4G>y@RV#Q7)Z0X@>_K!@rPWP$YMqps;%t}j^c3W_I}vVW z4%kY}6RRDSFO?HxRX6b&o8k8{Oym(RWKku#@sct7^t=|})pr|+)nQweth64zVqO|Em*jPX>fW7P%bh^c!q=|3B)=^=TYwreG(|m~w^77s`bqYCkF5$i46}Q&4LE=1A ze$N|yTyLA?m8bTH7{|*cq|{95W>wa3=<<;!Tmw%qDR1;{+ui5GaozrqV{UyHQ%b> zJPA0vRA0~>wqQvD=ee}q6B!q_&I_B|cX+12_;#WKZ#L%wWL43r3{W@IgVQVOywN}D zZIc}U|5nz6GI!wZ#G#&E6yoY--DoSGTJfrOxA>U>#E>DN10JZJilfsM{OIEuicYMd zf|<}H_gGrTq=9%b=(6A#K%<=NBF>`72q2ifc& z@SVA^$dPlLako0-9w>@8EGG~x9R5Nt9b1qzfoA*aE#Iuz@+=>e5H{g>LJd~Y8ptLx zB3zM-4$1Z33|BNqDv7h<@YCoXc%WbsC(Jc!PWbh?&spARe+U@lLW!yjADjxiB$S)t zgL(F92Ta1uj25C4rQt(30B!lPqR^ZyW4GpV8)ipjtndeS-ejo+lZ0R9OrGNY&dkX- z!egNY0t2fVqF?14qZO@hxW|6xAY!#_zKt>Z#u%YGHsxRCq_OF%DeC z)qs#e{o|A1t}p9}m#W~6Xya4QVbdq@mj&k`A!xbBls<;7Swd}*i8Zm$B-m&4@}`b> zh>!Ck*onT>CGs}}ag-I8czi}mLs6$K{j1bqtkGSKpVLoj=yUaEs@XzlFnGS zd1d!0CXv=cA96&SdEjhEjM#cpvl1gVng^Uz@)N{}&E+}I#pN5zH#;x&&fB0mqIM>R zTpUgmY@BKVR+#)>n8rZmonFW6B5ba2FG8}=Vvaowg1Fo*8vQi)JV0OuEW_sG+Z7fU z_yv2JJeeOY{tPv`W`{9(!DSOO9np1EQm);K_dseL)e%fG=++*pXAI-D8l~VvvY5R?OXrobp1c{It@?}_HbOZLH(k5@Ja*Qod!Hk1I|;X zfsizi*0<@#%ZjeFm>iTjW(JB|94y})5WBE1g;}rz6q-wI_+1XUEzqqO97@DDA@z6X z73YJ}wn!d*$xT%FmOd@MZvJTwxnWeH=q+-AZs~deK{ZWmM^aAEDp0X@@xQQ;W4C2l z8Ip@G=!J##)ayy#?<}>XzkIBHO_OZ0839x9_ism=)r3+Iv}tcrc%3uviQ^4`lEK`e=V4WGViOB-Y$spZ!?T(xMTRJS~ zWeD^3WM|5QA`?#Zx;_i_G{hjJb@(og&t=M9Ot&um%(Q-Hx^a;T`?g+BNqRhya2MaD z9X0MrR3&N!={P_Mo1RF4+UCg(&>}sudz8^w^Srh=b!G4oSyJ7WnVz4Jg}9}`Yq> zRMYKe^?#YoH^On_ql_(V%@_Gti%o-nhY)XI&7rn|yzxNy{oEv`eM;~OXh%*i=0Qnc zyst*xcI4zzvjp4=o;&qF*VktaRF;_X|Q5@z?xSQu)a4eU|m|QEnmpg2drzy2CQ3$p+P2e`n99^ zMMrS$7=9^r?KpnX++AB5F#koelw=9NMf?_P_nt@v6B_7F=`4zUdyp+_UTPh>| zB5k?ctGwvCV8w22xkLg zJOXeO*QL$Q_XIC>Xu162+Bud;m9=st;MO4*Ne$rWZ+cuC3(r&Z<8w1BW3C+ z(^j0y%a)Osp~Oq|{IJ^zC2lEBNr+Dthxq{`F5A7l#I*cC*~3(kj%p2 zx@Nv^j@}Y5C*kz`Y!N!aoeCF= zl&!^fGfXLblotO;lGY@yxx6(pGOJD3ZQGOmy)}L^yXmp)J$X+(>5;7xD zpOAJ7>_70}$U_WVM&lZaRxu6peXDeG;Bumk=4NBL)1oPCF7PVzPj|nDZ}1$PCjy(k z3go>>+0d*n+%pH1({pvstAX>0SXnaa_cKQe&(^D;2Fy8Sqyd=9)pJozFA@;io9LEX zzqIF4vV9QgP3a?zPs>2Hs%e3XxKIe@Z*F3$*@+;p`BKL*O?o22rWF0}OR_C8)>KK% zbs3-MlIeV+OK_RB651ZS<{yZ=om;~+r;4}HkGoauPAyPXEUfihad{Lsps912Mco>L zv*q+!2OV=1%1u%ueVc~*rXVPG2}LG`Eapz*10InvMS&$-GU>l)FV!ZHj3H#muA@X* zX!y{z6FN=4Ka9z9lRo1Ebo46s2(DUFNo*?$lb>jK@K+fhloW2{0vb8W@u$?55o*cl zoZ_$a&xCC05|Lem8A>le21H;{F7Y5vvMN{1O-1?Ym*3RwvIp&3q3H9+5`R*LoZR7) zD(D{#uu|+~kK(rB4BZ_zqxjDw=aeCj;8o_jr0p|yeXBa9tRS-d?9lQxs}L6xzigty!P2zXP+^zN^NF@iyKLcvP;7<|jzY$YI=8n7BK zk(<7yieAH!=G9PB_ou7K^8PfwaHLYgia9_VRp8(#U6Tw^f$tRUzb|!3`fI_5L(2Cm z%f~}fBXi3Kth__}E2!zIf2|~gD(M+W>XS(uqUx+Vw9Y2`R5G(5R{cE$Uec>xFiU+Y;pqgUgVv=5 zfwWutUsx5b0j?iuSO3W2#AN_#$j1-Jda16S>2UU7T(?my~egoBcCLA%fkYT}SAnTW0&YapXFV7H_%PKa3OpBq_Q;-fQBGGKNQ( z0gtc9OUVkRu0}Z^FjJt)i;NQZ@98OQQ9dI31Lma#%-Wos1CPwU(mDcGBxTnI%mM9h zq~%@Xvnj^cL|UkqW!m_fAOT|Rg1*s@KF8Qz!mi?h=8k|?01Jxr<4!h!GTOc&vyO`~ zo0^0-l$DIS|H0g&OaiAvn{$k=n_zz9^jYQB!~Q1#6i;E1L$#QkVqsq=?0|3*2#+7h zHLYpqbByiAhs^HQ0)JlQOdh6?@jidjToB8nn@R)0BFg8tg$uV|b7BCHI!6^qGN(TLq6)WpH%1F$ z>ms+xw265y6ISa^%qYC4zVexSv{;aj#F=oM{4y(JoLW_5v156FU~9#d5j{TgQljW> ztK8h@P8PS4t2kkqK8ZaK56;(Oj~+v&ow)1D_j#cL<{xn<{(RaY5?>5NY~i=Gi`qnn~%D?h#oX1@6Y$JD96$ zSuJ#{O0QorQ`U{hF;>&fBr2Nb@OSZ0RPUzBFkTk@^I_V3w}6WRranZ@zJ@8c2hnGF zD?oG*dsM5rXC-ZWGJ4IG(vZC+L%$G`u~KT+wB>RWR{HxxCPANtiH~@Wt_>%`8<-I> zAWhF^>@?>=O>(Tnd2psb$^(Iz;y>aS-F~e-kVJMtQm_k%llvxcRX9VLY)wJh{IMWh z8|=3RN*XS0*Tmijj1bt%Pt6eh9Pa%d1hC70l}SM zFS32d#DSzfCdJ)L1?C>dx@05(S}rVIww6ph!Dy0ZSD;}nS$S+TdsJNi!d4RvZ-F&Y zVShoSh#J7%O2PVU!Q#kCy7{)8 z(w4}fbZM%(P|h?+VY6etk@~56l(%i*h-a=X#@^tC;Ax4Txa!O{7I&-&SC0LIjn{(E|Guw*TjbsD<%zR&$2RBj0ib2;r&Y6!y>z?xyq z$sm;f%YHEk>6Kd(S;=eZ1jL^-x^9LAVA6uc^Q`C$ebx+rSU!_8Xk6ls!m)NjC=oeo zk99;JMq3J=rtPLxj4x}*J@L)aBc1cXxmkQNx;O>ea0JaYKEUaZ(KSko9mS*3b)^;KNs~t|FE*D76B>d(RaDV(&>p<#_s4Bup)!HTw|l|5nAkG%BTy+JHA6mEv_*+ z`~+~XtwzS>S#ckK?3)zM2}Q`o-@+x(A3}QCy$c*>BZh_A@*nXRJ!0~}a3ZQ1Ed#7t zUj=5a2~=bWokPJ!KCx;`Drz|rn9IcJrCRK1@{9v?^)GAaffx%NFgWZ|Loz^f+lhO^C{O(J@|Kmpj2{XhJo&)_;HF8zX{WFaoazp5m4 z@`U0-x63ws}M!=e;#ha-S3?H|M##Gy(#0B__ zUd#!~T3rir(oCPl?xo>6A%y>4Bs*RL!)inq8sA-gF1 zE(EanV>|?5dgJ7V=@J%-Q=#M_Zbou$!tqg93^h0+$ohPEq+WA1jgJc$2N%(^Dd6MG zBS9{T$JZ^MRnEm_vt{@Ee!%>vPUYVAV)%u;4j60lVAbP-6+5*1?kJR=UE<;LFmrqA zM_jbXMsgVs1A%k@ML z*H?^IcKGl-69ejl5KRmCK?)JT3m8e=ti^r^YoG&vq)%G>q<}-Om_YQpd^I)_aM4mI z4Od_U&|#U@;GU*!%ox-ZZ=`xPWSq_g#`gmZ5!H0-YU=(24tq3IFAX)$pg!6s#_#JT zD)n70R_5o;(oSI~#=)=_JC6R7`a$#*v3_dlC2bxfmyNOOA0`1p?0k_mmwq(SogRd2 z2}fPDL{>9F6)GWw$nnzfubqbRtTB1!4R>~*sxVGO({pqzgj0|0H`T`MpQ9XBo<`~n z!Wu0&Rw86g#To`e^jc-+=j!}ttbo<(6J97prc7XSsTx{f zPo7^go0Wt<8wFQ~YN3aWA{ka+n<*Bp*3fyMY0f)}wLku

      z3KhUUG+_iJ zfjK3FVQQA{Gn#(z!2Pf)Rs&WraRK)gMFpX2aR1~C-f7R8`v?EIl4tVxM`EXPagjFL zJ&(#ebbRpX*>*4&57##uKB%$y=KuomRI%HN0F&BuYx-B~#;|3jGWFUBWmXAc+PI-i zy|({sFQ^>1Yri@Co4=)(4mWm}jFd?YSWgG7_YKp&F=AZP1!^^=`kB}(6_SKK6puJd zao_l)Wo`6iw_d-8a%zECt+VUb&sMOiiO?T^C99*-Cg@|S zWG(CDd2)DH#QC-84y@dkO=2+3ToVYay3lMnwuf;TiFHCx`bT(ns^wQ=5Z%fG()i*R zxlt4r4 z?AK!>W#9D()|WZq8Pi$5fPL!`doH=Uw?Gvj2}^)DD3tzEiJ}Nw1fL?vGT6m$rKyPX zs0>VqUw+bdqxBT}qyq6PUXy{;1Z>y(2b3V?uNTvLJt#T+jubC1ndX%KS5yBrSh}yD z->6f)SB4~86B=$Y*;PIt3SbH&eQR+vl-wB`;pK_$J-s8` zKAU8N14X7pd81m??nIsv(Y3CctMSh1f@_kocZj$W%kLEw2-|b!O6BCh+i4!!8E%_X z5nosl7Mut(NmIre6t|B%wdkg!8alc-vByq zDMIMex2_X3wu{E>IZa+qk%Xfnm&$Q9@O>!UF*MkG3g_`%K`L2wt{f;O`mz(g^4;}N z+TZYW2Tnv5o?T1V8?QW~Tw1BaBm5lixwc~1#^WWlm5oa=omxN9^Tm)I-<|*s9LKE? zIn;k*jY$kWk_TCOEB5ap%aD8(vI<(dU!iB&_Z(liScob1N{LX*t5=-z1@+3N>kbtv zcm^#9{Z2lFlqe&nrvdj7Zg@Y!X#F8qEY9`dv_}thlVRL=U`W8dD0`oGu7F#{Q=y0X z{gc`i<-LJAfv4QdI(BE|?nPI0FVEex(gN*+4|nkmju%<9Iogk{%{3~UL1sA zO@s4@tlkEvVQD@BXF{OxdI(R?ydR`vAE^}sTdd-Ok>e!z4S;g>? z2r^d@IN^3MaM9;fB|CZ_5qjX;6GV>n&zyn2I?I|o5y_KjG;y8K-99~&qp3vKw$D99 zh3X7d+tKRh6Hb#6u}!Q+Le!@uWkuU7=Q`n2j;KtdM%bxTDJeaJXJ1@VkFdRPu|v)) zEp16&>y@kzgKk7TfLsgNMaO)43VtT%^Xdqut+I1S0tw0C==CMnouk0d9Y z!y;l8>9act)kqJOou93uUV}%0UZIT%W)%y@``AOphqwBCUOF@9ljZ6U@V zR@KNU<}9(x8enVofL4(kozmycK?fTe35kp0sZfa8_VSM^KcxQlpMN*g`!3~O*`H}R9?5je)h z8GH~2`d&fb-7C5F`0s4*;07ZhwuRJN<8YHo7SiNB+~N~f0$&@~GG93T+&I@ACYElU zh{Z@q96{c9Vlnr>8=Lo?tn@6t4)z;4Bty+f$U~##eYs=2^z>f7g8sx`2}NHo4AM$U z;A`)04G&Wp1w1ecGB@zV z6Kt52PZTx`3ek(xrE^a+3x|K^1k4z`-?W)GG zU~6>D>kZyH7zLDWCX_ClbH9UR)0o@oQzr6QwqCoF= z{r6d+J*yh49I-l|93~cHLy_;miO>P;D_Y>&T zMK+lpI#UBB*8X#+wnzgDpEkP_quvEAg2tM^@+167&Q$qy6O$z)txLY3PsDC)pV@4z zDHABvHN&dyAzU_+9oyS)t5g7lWu%gFsz!zFoN51w5CqA*{l?4*&-7m5!Pz>7nk;m* z0qxb7J4LUyYfDX5-pt^>x=Z&M3E5|55+`eQk%s@4uc9?&kJ^1)eP)UyM=HUF*&W-2 z^J8diBUXoU(MUhT_#5p%BAU{(afGRiO+U7l#mxl*;5acWTB)FtJEhTGdo4bcw$0&N zXg-$gpr%s0wnoetcI_;FN<6h~!e-OzP#=?! zfxpW$jvAlrnSCS4Otd7u@w|<)VTLHCp4$10oDw5-FwUV1-B@!LpH3wKHV>|6 zY{r^@@OSEfdT^0kX5=z?zqE?ew?$5T)UfqJ794V6r;e3c2aJZ6{#gg*u;Ige=V{<0 zlm@;|QiaR@N#XaIZ#<-F%H*6P;_rWAn%xJWuaSjY1>4K%V$eNJQTI6g0LL2iX$uVc z0p?BYc**;@5W5Mw1PR1M3f7@)VemhD&dfFnux_g?C%4oFhBauR z&Ayj~rWaY6EI9Wr%CP@=5};?xxQh9x!M{C;aR=Pq+&yzlY>jvC17iL0fKdF;f4}Zu zykBvW_Y(IwEt@~Mm<5}s@=3nsg1E<*c;NF<-S25$KYhx_WQg5vi;9>4K2r}e8YB5T zKJ>e~_V}*k_=8`l?f62>hmScLy;$??Xx5jCiBM|KWgk>*D*lMar5f4^QsR6QX3w#OK`AlF*X$ge zNty{^esF#x0hBY_KMyY{XPk&h>LisCt{X_35XN*=T4x`^MpFF-0Bx|}pE=>B-myyl z-U504>!t4@Z=4aadP+DqWkH@pHuj?J?%Hb(@2rzOFcQ~v!Z4Na3CQ0aLR+@5%)4|8 zF}Bdx1cd&F?UnGQr=kBUj8uiJYsC_?#g^uiQ2b64E>7|jtN#=+RfUoPXqAKuJ}X-! zrkE{T%w9d=jx>u?C39?W7sXc^EvLHy(heM>c3YA(!L@Xl8-5-A?#(UxCxo9!ZB{7`*C{kc(m znI`=rrqrr^jtWl9ZP*np&XcErZTz3WR$$-p&)+{L^~wfFcltP4lFa8^8NIh$b3Q@$ z1_g=)#W5P!PXapw?tVq^6x~qteRJ-fnGbj&WI1~OYwx{>*V68__2UA)tG)5~G(Zsm zcbOw=byFIy}aE zjPoO;o)Z!1Df>9d4GHGMD?~g*|1foyPp5o3gVSy*kt!#WueQp*d5T1Ql!@23wt~Xe z-ebeJwz1tGKl;(s;c^}Yw|P%ehfAr^o>AkB&_`0(Gs1GIpGM+eTU<=8Dr@hd)V^Z< ziDZL4mjk^-Z$n~-thzI@Jg3dHS>=V+zeU$G^{h+h6c5Axj|;UpXNV{S>B*F-QK%DNeJpo^@1_e2{G~s50yWCbu6T7s(aj z(_YTUEbtQ)5CPxSN^eGms`~^h4VhN)1&l(yoRo|U_L4rWsJc%n#mB#!DDNcPLOzo7 z)+Qx4iUZ+h4lqmgvm{VYCy6hCz1W_cAw;RtWRqGLYAK95*;2si`p=ibiSXY~XiTii ze|QN0seFY0%WMA+2tUkd75Nf`->48?C1UPfmxu3lD}%8Ph3{V%e3$v=z$l?d%sGq^ zd_^ic!O2~@XbPej^XFX5P5Jnr#jmk>FMNKQ|Dkd*TYm7f#y{Q{;BQ4i9mnJM_~YLX zUVoGGipcuR_OB}MMPB~~ukXU|Rew){&k^@!B)%N5;j{ls{2r~y)+vfKS9r+nAt&T) z1kX#8dj)^V7|sEF`G{Sr5qk!R4c*D%_Qx2qGSlG8kHDhQZH_0MleRQ5?NH=PLJ~1$ zh!76(->-e=-w($3rFlgP`nNdmMPB=Z@xAc-{|kIa@bZrARn7=| ziV+$4*vlK+GVo2Ni+BV6a{iYmVfz~bvypQoRaWL?h&XYj$P@&2d577O2m7>Ah&Oqc z`ioRp2oW3J_8fK-$3Cn!Ui*1HA1VMsz$>Ta`?~SbU96q-PgbZ6H$4R(cIJJUTjF%a z3x=()RF(85b1zx{5@^(5AJt?4+YiDjBEeRvYwGr6Vl(Yx;9?XkNq5d;b2Mij&hw$r zC5OYVIZT1aM2V}bez~{G)4!aCFe;$)wWid*A~C2u)m|HnSet{sx32w~WA?zMsa3bC zs_nn0FSu?k&Z~Rl)Z;||hITZ&%KnFMuHdYKYYPqzkA2^n`?tk3qJ5Q|>zy_0w`m_G z$!e?}0e3kTIaybk?ZiF~>ilcLI{Wh#g8pomwcm2W&o!&yG8O$;Y}9s{NW+q_nlLjB z+_Bm)oOk5CjCn&2q8+~fCx5?!r_HhRIO6Cu@6*}8yG5gtsW&jl5fw%D*68hFXIZp* zo977fwmD$SGE>J+HB*^WOzXh8Yfql6ya7u%&lc8k! zANyU{&d5gI^dtLYYHzW>FJiLf)AGDivUfl-zmQs`BcgVv=zZxU`#EQu1NBxi={W*ON6p)GnOqV zRRV?96eWqGm*Z{4P}5$wg^qfyNrrtDA0@pFOK=h$PScyn+Aub9kR_Dt95PFUGb!P} zQ(Gf)?!hIFIPxC&T&r^+8Angq?J!4-i zy8~siJ3^tm$hE{<%6C7`*>?`g{e9Vck}gpPV-rZ_#^*+^Eo6_~N`%V%5ltK|y1pbYOLEi7 zF@XkqOGE073OPmKMy7velKn7MTtG_fZjwG>jJ1vtm6+gJ%duavETH`@$Ig%yc28Hy z4)*;^>6t<@p)_pDCD+6RKh1#enr&>qZAgft--eV%#9yknG?!oqv%8O%g~U$20sT1= zLR$`Yx)AKz60@&f4h~*X1+j?;V%LO?#EV>*&KZOi;$SkhH3>u2RnC;%kjJodeVFau zw{uWe;xS4#+LTHbQ`XxPS7XN23XA42A$>xYJi zKRx{Eu>A>}u*%_GZP$kuG2TEtJbe2iyPmVapR%^b+vkP0r9Jxi-jD?p{Lm9fJCe_;92~ z>S3`I7L5=Zpa87D3Gz+;3ddf)M9%IC#y;v?7j1N|FY#=ssr{jb;=9BXQkUp#bVfu^ zpPAei4Uy!cKiDeULn8K8fj92(@5`nabE7bpNb-f~;s)mqF_=8sJM05vB2FOetlbLm z!}gv-B#mRY#JNQ7P9Q*c&lh)ocEWb7g=#a)T7@&vtI@p|30^yah^z|HA|nfDl{DDf zksWu1FFz~xvU6)FnTh>PI&@=$b4!0Rv+8>1y4%{9bC~g6{d~~K5wq>l4MV)Kv`_g} zYJZW&t4;HGZ;uY!X2~M^tD(rkD)Kp$TV0`u)k#>?7X({p5{>Y_=V>=k-4Ggme zLbgp0G1lJuS`LExyvFC|G}uSPKxw^RC247HFQK>2HAs@JQ2@$Jb@HA9Hf1XhPD$EANbW)$K4I(RJ@ zy-B3NgPGx7NGSQu&16y>&q{&J28w*ej`8LN6GAY@@92s-VJ!gd0~i}urbkSfadZNFR;pK z6`4pZv8C4G(Cwcv64!Fy-ljMfM{ckFAp@C;_Y2~(o6G7K7*v_PM~ym%5aLgouQI5% z9M-!Ae#RQQy~a9xo00emmo0~d={3q1T80KE%V^_iC%kostI1>c1^E4wXkFA*7N_hdw<(L>(jf zI`gDOmGpI7iU_cqU)cZ=aG&K$*3t3s`8M_5UZLRgBqcrgoX;hqE?@PYC*S$we?}Ei z3I>W`&|c2%ZAm z9+S1_zQrff&m3?blOYs9C^47f?v?@)td*KW+s$IObVk+!o~N4C_Dsy1!82d5UOHxN z{KD6o@nG2b&!LAR7Q-qX@p_pAE zu~Yh57lU-f0QFLq=%0;O@Ectut~J?L*B%Z`RdhJ|nHD$5BBY41+Ms=@|0gG^pE$&g z!ugaTi$;RcvB=gNhfBSqxIMEI+PrzAC~X{M?5`iGP7+EU*IlXZqJrwSNp&BT>Yntf zyKpn-b&oI-Jv^l61Esp>m*N{aQ(+cZ( zf-hxU-b9%U480jReBXOfig;*sj+f`T@sCyG*Za4QiCLx2eoFL<=QJaoY>$wznx1KD zkCYH<(|*>}+kZ(}fI9(u7?X|yN)s4Fd=W_yl{h03OlMAl=~NO-gL7X_f>HV= zl1uE=-iewXXgTH{s9@v5`6Z3^U#@N+_hQ|p#j%&`E}apI{oSLx48)#SVkF)h#>`{0 z`q4FOGvp64l3x(%N)5Pz6@nHFsa+(?uXcWevrJ@gtAB-&_?~>{tX2y%E(_Dkt9|E{ z*oe(17)@Z~c>YK{q`Qjux?SG~P7I*H%R2=D8;Ozl2MtS4&h&bc5HF{kZ?>|@R3WC) zJWJnx7La2RT$=n$7-p>b4nwfF8XNBWEWpT{YHNQB=u&OrfwHGzhOPYGD_RDoi4`h{gT->RkPrnwLZgvtyP!UifWRW>^1J$259 z>YQoiAPKAQv#P`26O3qtVOO9SgsG_v`LKcf>Gq3_?Ak2Rs*IY-I<)B*(;q_m=&K2$ z*z-1wI8oLJkEn=-tk0Jo$ys@o#-8{9Bh@mXkr>UjB;8DWP(2hqOyh~RPw8<-?7y&g zt+I(S^cLO zt&*n!WxfUvPTy+5NQl%Hy|t@-R*yCC5u>%5rQIA{Uv?O~UZ z%)#Q4o;u;T0r$eZ`tp{VtTUApa5G2LNCMbk9YW;uAYyvMzq5Hm(G>DDx_b(~SJQa> zf z`ntsDpz|whqzoTrW|cJ(yGPvNT*m931yFo=DR{bJd%uA6$#*=EO0sW_&k+AK6NXQu z&bbN$szd-gzm5Y2&C*$TV0mL@1&JIXkma1Rxm#9aNqY7dPoej`mgNQU5=^ZSO!X_M zbFlkt5`EUR-X8&5B2n%PSya~hBb|rRJda*%$4cFw(%lo_=C=V5xEaULsWYI2nNV%19Tx3fqyg|f&;)NDR6i);6%15&X}!E@%0 zqh|0qH3jb#OuDOgK~%_lx3O-!c=^NIO#dAYj0RxYd5A~!3mj+@g7~2X*v6@wPb6QXa0Pk zCGvvVaPLseDbClzeFqbR2{Z%1_X@z@RM;72vYxn58ast|StvH~#89Vax$n^lmQ5b3 zbIYWQ?CVa?A}YdY-NmgtjXxUSw7k@(<)tn2Fg!e?qmVf^b~;A6G9-MuZ?z}4zoZ_(X%0o4UkcAj@0;#PFcN7cIVJ4pwE?*0*x5WW5*1Wt;^px} z9qngDU;v#;`dSq+&&h&Cuetmi+SRgRf zQ?3o?DmE)O=R?b)vzcNev4ZcUzh3Kt2Lz1F7G*?BYR=N~WZ$X_9~Jb3IRpCi>-A{l zr|0Y)%1HN7Dw27zWMg_dZ!-w?R{A1%f?2zLc~FUp4Wyk#Mx4-d=^--9-gy~|O47+| z{==e!DZEx^?^Sc~VuQ7%JiQyb>+wgaPhiyhOT8ZYl46WRTAe^Oh{;T%Y^?6R(<^Uf zZji~==a(oUg8f7N=}V@FiN#2~BXq{A(w#5E#5bUMD#TDGaJwrV%<|9prkg^7Wp=l4 z&QW}>`vJP74}NZp@yGTtzCi2@sUf>i{x|`%v74p~OeFgc)w(Q_b-BW;zkMlNZwN(?_BC4vimhXa z#j-zM<~@0dTyUCE3;Ni`tEoNmn9T54X7SN$xLstz#zJtSQt8t81`!iY-^j?zxs_w( zwvwU&(+*Wi@p5HdY~X5~D_QIP`NZBvK$vnHS+A39ud2~$uB>Ued{U*6*el;#moj-G zD-xMp!B2xdsWP(A617)$KYb8MxCWm%Kdp8I5%C{#a>$i|NXk9kUK(0tm;4|0&ILZI z>RR|SWRO83Cn(a`(rdJ_Ur^g7mRcg%X2=B2=tKgd($)tWq_k?A>O`VNm^d>e=WYk$ z1Esg^cj@hmR$J)<3@Df&CSa}dP)lp8ky@N1YE!i_P_Oy^Ywt6UfZE5szwh?@T3R#v z?Dt-K?X}ikd+)WB&MQ*64q%%W%?a;j6Whv+Zcgh>1PScMdc^4E9>d$N8J;iEGH*un zZl*74&h^HZXDX%(;qo^>z(EVQJ4dit!G`1yxgakcj529K&^|Vf6As-?{LC**L_2T< z+3Sbo_zolr)`w^qP32s|N0`pFvNfbzk?QEx_;RUM+u~#dR%!|pBIGLd5dwfM2hU!* z07H2!i$@oRE~s~Uv|95CxPiRUk2*gW<)*rDd}!)8D=BKekdkw6D=GdQoC|>U?J^X* z@h1k(yJMdLz}E|q1lGKhkKP>2luZ_Q=4Oma=>l@67Cf7T_#NGlOw3qOn`TMGLmg6Gr164+dD&SoFMGt-`d4bqbo7K;Z<_ZQgO5ER zrygcje&o%{J59(@dP2lmo1rhlA*qyED9+TFie(YfODlB=pw6~oC1+)4K#b;dKYzT& zqfjrqI??X9^27-GR^UHY+xcpJsh#wwn#Huo%0)NdBn2X>RhVK(IafnJc)Ar*8@uS6 z?CmO$jQh$6%uCOFQx0VB?BXCrPTs@ivDhW*>%w)3Sdpe8yD>G7Pg|`TlppY(jp#_b zsLr;2Lts}x$gFWU>6sF7s45L<4m=`GTUN@Prdg@hXjulB+=_7boO z69o<>u`vKfULrF z=J5+`v&~3PTQ8ZNU0m)@9JJ71%FKB^wo+fB zYDyfMLDv{p;?T#q2ZC-Uap>ZW~HNqV(Wk{r&Li@4^fpjjrf-{ z*5*b{%#ncMcJ!PM$orNA;b z%)Ex3-5Qdg!Id556Nm6X@G-8Mv>w__p5`&gV-uf;fGdHg481w+FnvnN#A0eI$Z070u1rI-Y{9&KcS@cE@jAMdYN6MHF|n~>=MSnD z?q{XG38Vx!Q}RlR2M`f;t1wb6D`rO)Rpl(F2g)-fSgBnCBoDVm%#771Zk+eg*h~*; ztJJyNT1&OlC!>DttqJNuCAv^i+5I7Pi>}DAIa<}(5~&t4`xB{{{7|*5BW7c*+!s<# zi>xJOT2F^SE}QD;sqP|jHr=W2wpNVbH=>+UfyHW7+?v{9JA14Z^^kLLRBSv6-ARfm zHhAJzC+M^UT(N-e$q}p{5Vlf;lT+-(=D3*%LycK;4V->-Vb!!N(^_{L&~8QrwV-@n zUF!Mf(F4n+$2GC>i7i6=N5--^HvnSUt=nV@veTJmk)g}9o?I}pB${4?wxCSKlVlv& z#?Zem1@$^^u6Fx~<-SmmS7a@bMzkTFLRmA_C*#i9Gcj7PCYFm(S3>D}=hs&9CCaSz zXGvaj*V+-ydvYW|BUzRXXdf@ELm_V<7i9ijk?XZ<3y@1Mifkk97h$M*etblKos-_N zzpe7BMy=aUm?gS0%9n`JWtyOa zknFtnWqvs4cw*~=Z2vC}sa8QUhRAg!BUM1*E)yFc)EkSP85&4pe1X0;zdzELEZ-|N zceR|z!q%c58i069HD_g6B)5`3H7i<>m;t^A9fzPL_$VgFAQH&{QB>Z<5Ty>pf*4&u zW?5zA%&yp#Ml@Vf-bBa3&XNx9KTZ-c)8tTT-8R=}se_ePAZTvY+0s&xW)|tm5nEnc zdnJm0M1>0zkr93;6hP1C=nCCyfw}CrbVp@k!>4I@0@j`M%)QV{H_Rb@^Eo2*am8tt zs-2IFZ$qRC-Uc^M;dN9xB$D~!59Jt~yhCI+Ku-w3;96BmqBMh(fVA)J;FB*w>uI$ zV$vJVTj^y?^w2=~PYXEcT1{_s?VX^quk}G0f*4%1R;&?vZj1&phF|mLrun1kFN}~I zq5 zJIR{m^_kCKbHz}8;-Hd`c~Vg75aS!Dy_!v??5b3)cXy9-tw>R;DEMqO1vY2wrE;HX zP@TWTkSkj(g^R%;Z(GBy?x=HhIky*M<%?`+>->6WKdZa^YVOL1oG0v&>!dp8XA!6O zK+vqm=HR)F(e<=(r^pet>B*D1P#Iyb$Y%Hvbz6qW%nwVUXVtH94-4UDzEFfH2JxnZ zSu~5nVCK~_u!!>qvwGc03@AIFM@n#5eqAw>91Il5%J`~w7*!V|hTe{nJ!Fxx2hGB^ zQgN88Kb-+D6RGF<>vw|`H*zNHD63U1s`U;|c}T0D`*8O5tccp0FULO5*#Osy^!*+q z=$IEX)^b7ohzj9H0B6d@=p)Sh#@90R>QJ~7YU|s`e?BYRU7cD-z-~;7`5~)be>o;j zrMifN?zAUTlInL)rS&WvjF6vw{b=6hZ$NlRoS0GJJW#U(#?N;oGe2r(Q9G6Z*x%o?HMQXD>2to`35dG2Wjix)U}H|-5Oo&dUFGM0$l?vMrn^t8 zGm~VLC1xZ?5jhXhEztlq2!w4dWo9N;oaS?%E9kFjNA^RF#svviDASW$H4zlhW`V8& z9FvJlK)Z7NF@#GpdK%)b+@NeqPydr#KaD-KpwK=uC(P%u1oGDw1HA(^r!cwy3&cH) z@hqLH#`3cI>&nrNr;cSRk7>MQ}lo#W8Yf_KhiQRnf@rSp!-F-4X>WQZ(~SGQhsk+9*n z*UcBxogTb3tI(Hy1=@v{?J&LtyUs&A_1k9{1ssE=-p4=$gOjT zj7;j0ZcmOLsKxz2@=*~B=@39s-a)^5t z4~m5PNiBUmGq{mIppx_)e?;Lzrc=6d|kPF_+$8lfvQRgjf?SeEgdId zl+mo);$2~6kcEEj%4|0T&grJHnFsz9Ua;lcM@}LJhVzZOhC)4lX^BGZBZ9`DW+b1-09C=;bpbWl3CN7 z7qKr$nOKRf)|U`)#xGYoM$fJ!D4kh(mzk`4c zChnlj;X_&xpd2jXN`_n3oGio^5o3+`t_Nr(PhfnmcmbDnB|=P(C&X|7GsND+-+Z#r zmS*e|&mQIrX$)^ZI3v{SL}<>G^N-P6HlbgM!RZ)Sr4xz4sFjq(kSChUUlPV3bluyL zgQp%ka9kB~9%W@Z=Wrz@#_g%;a?HvxrQE_ocB_}|=XorNh-w+sLTiYRdi52-DJ`2; zb!q7ofwbO{OLs{USO<;M;t@6NE%l%vlCy-R4#1<;ndaZ+MNRjQK;Dd}^`I8OQhzW^ zY`6@lX#h0oZW7(c`Lj^g!>~M%p({a985+?nK-W3M5f zyjl{GaTA>#$pYwaE*3L4TlgGfg`XPJ5O$L+@$3m^V3+%2Havm_Wg<`5tW(u4`h={o zsr3$-o{yiVXGoUu`&hUWj5qMve;fpPC!t&tJd^ zE^zg^XM!U=sV5;Vetid8gou>5qIjpJrI!3@LCrufTPCqFE?^qv!MDO}!VTg0Hxik7 zcE85JP>*S@R~E46Tp{qddoQ~Q8P}bxF?Wq-s;matpBM5|VVVW<*>JwOgHaUnO~cj) zYCg#NUj-e{;n-frtC@Nq0mIZKO5>OW+|QCbi#9yEXr((;){}ZdfCCsss`*_8*aA^* zY{fpzGq=Gad5|dw3eRR5bp!{md4bP8r?3a}y&kMuWO@LWOO)<`1P=6Mn+IzrGu7Fp zCQjb}%zUupJ{H&tFq;IJV!x{O(2D?vod}&aV6c+UfE;#XZK=m=>Z+dh*v~MoBaEf4 zfa%mZ^U(Rm+o_H%V)JaN_Cs4Ls}1+cXtEvDD)aN&<}~^(PGI!T;Gqe zvB{@kPqTD%T=YR(Dx{YVH(JrAaIB5xx!RyPEReI?by_2Q(Nw_DTjyKLQ(oJ-TdN8Z zVz=X=j@CndtwxgO@vCAwaT(#2x0$eLXjbkw;ZOQ}4|dU>wesssVCy0MI%efT5;Ms! zHFIS|w=OMhmzMDTXDe+S5pgOm{ZzMU9sQiJvudr>v*FeO3Og4x0Y(D8ja2LFN!`O= zetuwnerSH~H9xW~_VwzGuY|0+U9{ICL1}kQ%WS`M0cyOKlHQa|pj5aeD5;_~q91D{ z?A$Hz;$&K2p!wF8KH>qOoOV0C9snQCoLvp%fM~Xa(m+>nVG54!M6MFUUmg@%n7O_Q zXy~dQ_Nwa5?EW}a9oBG-PqU%SjJL_Z^~|@;zgOy?@HY8>{IOhq_g`2PhJQWSC;9h( z@yPzXn$Mpb1O3@9`8T{x{^_hyumA2AID)A^qa^G9{KT&wf4)q-JA#pm{E~U?3x5~= zYG|0F`}KJsCjAO=e}l^#Jfmd!b9F;5$gD9$K(3|QjaNaeuIFg{VSo4UMiyN)G1~aD zT#ESVvg^R8b15Undv4Wl;yHW=qp_#a;I!JBj?~)D_x2LvMpYG8jCwQaxpFE)k&WkF z*xV>f%;pBo`K1e;29AyH&~JS`s&nN=L6zPb&dn^Y0^4Kr>46#+TC!Cb_j0kv1<{x< zF)Jx>{Y|ZhiiCtDXG?n9-I_88QHfpGdT0c{%~x%aRk+Y;I`+U-5DlW1mTuZf6pf9= zt}>k&d*D`2-a0g-sZUr}WAwunR2rG);$cB& zI96YEyRmr8;xTGYF;}wN--zAv8{7wFPggM!- z!~RN1y@9a%tYpdhGd*n3E%w=!CtL?4zwh--#e;MVk}X3)+g*LLjK)e|0N5QJcIEKI ztB+pPNIT=CiRJQ0kDlt7vnU0MNH}#V@u5z5o6Jznu?6q-wtO7$4eb;Fx_9Vq8hW}V zPVu3g?$bK11_V4u*XNg6PkxhC#c1bC-LmqzX+p(K$9mpW!r;x8E?NW8j`1BMjW&&S z%MI}|^|u}x*(5c6i(J$c2W>aG_vyt-7>>k2gsg@VS48239ooy~LZ_v~6+iR~JGP)O z6Vxuz4tTg9q~D;)=t|tLkR!AaRfsf94UT+of@#ZlLy3EXeBTdr<$GR<`#Jf3AYi`d zm$;wedn33n?H}ukn}&rQn{;-k;aKShw3`2?M|T*O>BSd}DMs$GXoWdF9H7HqJNcqkN+z z-5%?1D@>0z{=3Z(LKk*clP^pAF0;ext}f#1oxKsRGe!J+F(@p%{W8_oAo-n|$!cZ; zKU477P+_fDz^sR4Gp|<4b~VhivGjPZv~&kh{&tkR`pgviD)+r?wP6a`Iak1bg55OsZ%L&|?6?cI{L(8-+>v(AN>*640{`l_wqe9N>)`q6{B=#>0 zkKSL?-t->z<33$}qWbak1k`Ol`sOs1ISs7%u5tzxj8u2W&a@lHB@W@{^mOX2+N~XX zqZ6ToP)nY&Hyth6duuWh<&|oFq&6Mc&52N?`?n*fJ6FH268M#8iHDJMxB_K7t7L0~ zlm>xB)6wn{n!^8Q)yoGS%*(rS-)+-LwBb!%;-x8eW1CDV2Sm2by*lZ)zLUoBw4Xbd zdj4!VQ_vUH{M&5|KsXI$5>+N_Ppy_yf+%NADpZm9txgE4HbDnYk^*uTFae-MoVTi8 zu6jC4uhM~+WvCIgOkXxDi70)Zq9$jA`ttmv@lSRU2XD5s6`LemPM-Qce^pmz^JlgX zu^A48oQdU#^2bEfjNm|A+OLUSP8EZCAf2lPh+ObE&#M(po!8oib%HzNgU&BA<0hR( z^Saf7bRmkQdv!U#3le7$Y5P~;zxT{-}*Y125#S8v-(UL48&x#ZG(MP>P*tXTO+RyhLlf{VOhZ(CC? zBwH2v*W1>T&nRp{{!zR=m)?<&T%8ZD$)&H&N6IvNw29_G2AIq7 zk{6=c!CYji$Qb++@DkbECT}U^AGyl%X%z&?Qe%GRnV%+p$To!^uS7#WC_8B{R-_I2 z$8d8Yv7ln&I`SD;=Ywl<>1*?m>+-=aFSyY9;xWngPe?!d@~MMf&>A;uJ}IKylz#+8 zK9he8W+$2W$(SD>34E2BpGy5Rvw@hn$=zXo)|ek5Dx}RbKa0#ykeZ}FvCHbDsTyMC zA9L@8=uT5_+mc*-JQrH)g(%jZ4|e3zSLY+wj~doQd&c_a-{MVr<3lAvlm)2#py*!gepAH_?^N(yMptl#_ykUM$L*&Nxv*kQnDnuA$3%DUn$>G=sd5`1R7MU ziY0xwwL)Guq1Y^u-VIbC;0h(+E@2gR(=kKvAx<7RgRt%^UgbN!0dJPP5!#MxwC+sN zDQ}+07{+52N|)AU8UlYyA@2YD)h*Q&qqL3HbB%#M@kocGx%7*=0Yp-BJ4)F4vmS&*yKi)3pC?A^Uj#bwV;ZnH z_y`S$3cwQvKB0kxMuONB?E8&~oqDwAD5fxPh!NeBvvgGo$@An#a}ehSvn*_X`**L$XFb%*7x(4 zHWna(M%-jSd#Jw@2U4;f)s-i_NuCe1`N+oWmOZid?LCN}{If8htW?)H1ev?(?$e z>wuo6=1GnBn{-JolKhMK!#Rvl!M(rHq%-v}Mm;fg_#*OrFr704oJ7cH_)x5k%n<^S))KEt>{)mvB?tX{vA<%6VC|-R~Tw z?pjA2B690KVbKuz3940u!m~%#umrT9t;HWd+s{XAzSZ^!t)1;Jla!z9U?uVP**;>p zY&8O}UR65|)MWR=XKT&XB&+Ry$?Kah#qQL_bWmu-*`j-Be#F3&Dgsb2U;Hr`gxozE z{fKiM#;soG42uVr9mG9qU{CulyXv^E28fbhOXC9yBohI$Lyd*PnE@ zXg5eZmSKE~M9v}RNS@qz25ES2`9!XqZ1eO43HR0yoV>G&s9KwyCGL;C%Op)mJmP0Y z+Vmv#jXXuq(N5>6ygJcL(-q9v;weUN6kBAq9b%+eU6!9T!ZK6mp_M7iPE~}ds?&H* zDkFggW7oAr0X;>CLH#V$QtCNp-qS#!VOzK5*0)^lw+ zdWt{BJ)LJpBQX44uemta=FDO`Vg^ut71kZvMdsM#OzIhd!DMns3YonpMGf;d{*2wg_ioyHTOlOdji4B1ROo zS?S@p-Gt(4o@Oh@B_0{U7DQ7llvFI`9MvjPtArx3%4&qBoQX1b@ieFkU$HB!w#U(! z@>M2jPnobFH`-U332+7Wf(6e5q1=3sn-Ru7XtjwV*wbAn|IL)0FZHZ8;Rfi|!y4Q5 zx{Y$1qa^<5_^RDPv7T|T=QEU9$vu&XYSTL_I$mmRh|6JVcb_$;2)>fm8U~RZfZcp$Gbo5Sg%Pp@G71xq=Vq3*w1l-%Xc=TH9GFVySqoBw=z^1^Ak0_m_ zl(>ua_lU)*gnr-3mczK@s zcJa6BijK_xpC&(qX>zKoRBI5@Tlv)*1U;u*vE9>G@4U`dEYkfFngmXFa;k*sqXQps zFVS_!0jVem{`Pu)_1{#_Y(1v`dVjjuqM4)G*zwSP5k!;RpdyGMdZP)k%V;9x$)6R& zqDON>|HJes0btD` ztndHY`EYO1UZFzf7}&_=rVDR>4qSWKIq+PzT)bmF@*Mcow>t;^Ai25k=AHjO={QIIe&rkb@q&Fq_bo(d0SqFN{zkl9;`~Ua;+vR^> z^d>gtAClhK|D-nv6aS<)S$g~bExj3k$=?^f2~7Tnq&M-uH+qvj-{u~z82^9WoNgaw zE1oE0a5T9Db(F0>$_**5{d0uKRkINhY-W{sUk-0qmETUi+*?~Jsk|TLUGZ3Q)?-ww z6x;h%yKAfsSY~e>c=+oRTk!NH*x(<|xzJBTr#K^lrZh6{@G3;o5De4r} zPxU+3m0HP{rId=4V9zsDBzBseP>Ecl!q6#S-07?C7VG1|rQ@Pl9$Ibha_#EvR@--| zFhax5l{_1{AQ6o=?2eVn$OlAZE%9}L49w)R!2pg8PX@)ShD7kspQZF zQUlG;l7cyUd3wsZA_f@eUc;D1@dAa1h)>zreh~v^)(q-k_0Hz!B4P*^m}=YDyh7A?$D1MCYg)+&Up&e8`Z*R{u#)A(h3HA~ zfqEUE_(F-lYPSlN+Hd?(a4eDz^hCvT37x_|yhgRXXtSbfMAYHV^3kfHBz=zG{|g@6 z*~-+}OS&uq=P27)Q@5+n3pRh-?wz6geBi6hdC{g7$WAUj zFZg$5Ud~OAzdj<9G<4XcU^keD*D;)E3)1v`szoln=eBZRnLNrBt8k|FVmP0kRxXO#>(}&oDgv?0>1Cb;{6=( zeld7Yb_3t{K)HtIXuRhS4}W8V>#T36XFY}uOWkMmJyx#k59a4z`jP%p(8df~s*5Mq z)=F(7#g{wx{&H!=`4s+ZPw*(PdwSvhUfa1WOQ_xNkU&0nj6T}V;@4$CH?1S$fF9h+ z!oxk8Q(g}wH7xpvJb3)fy7@s4Sj9xXotWYgB(4ZpNqN3lFfg&0J17GyVJ*oh@vp^# zQji`z>;8*f{WE;=hCF!N)eps{@^VizkFMr^NUC(l$FE*A{FZp%c~a}%0l=zu2>r@a z%u9f1y{4GhTrmKJ=;hYaFnC5tSm~0vfUp){n<)Qs^Nr@!^J zEMt6HGscIU{?F-<#~2H~ORF9Vf9_8?#`q_XXw|0!T@hnAw6Igu>{-eU1C{yui})z=+vUUfXw}>B(c*XDqZRfWue}o= z?fNr(^xpppAAP?&mg3O&oLr;%XF%#Sf(`t0;xNI+PE3Whe7U4~n%GkD*ysNOmBO+l zjzW|b+{n^*kzg?1LjFAed`9FN5otUInx6QihO$F~5o)^NpXu>MdHj5rc{q%JG7qQ! z75vlOThGcf%tKb5={k&kPJ0*j39~<3j`=~3eSTBuWR71PKvI4e{;7eT1@No_0ONW_ z!*_yNe2&g`G{B@i$ zD{s9kU)-LjPkO&8{IQIt-jP2Zjf8C0)j#=T@~`2K>@)w#A9-N#Kg}Nt_WS>s{PFJp z8h@Nxz#l*I|15v}`JdsBKlnT0kJ>-$7TJNxv&lc%tuK{|UPx@b^(M>L5HJ61&lsXw z#70KEb*XkS&&cyNtwB`nVwWcITp4NeRJ%yy)+!vkq-W!;wY`E1$~gPM;5Gi@5S#Ek zWNp~(+)@5DYG$>HHYlrvbEJV}xf~lw`<>D_|0LX{LngdE7xvLx_JsGMPYf$1zQyWL z#;y3G2w;cWO?LgzcI8v5RUknUnQES7xoa*yP?T`Or;jH9=wKY*y_4+%8rx zw9k=<6vBa=S|Nj%Ek3Fw?M7~(yGA~3K3CH_30G*RUE+jfq?ISe`TdWt? z6&HK%;7Y|AO%o|TJi=WfA5?Duda+mst-$!?lJbki-`pVHb1t*f$#QvXC(X=9j;8KF z;<*v^>Ccvgy{Aifa1UFl>zFZBHxGNZ`|;BDVT?;rF}L7>pq2a+!%7U!sB`X(OJm8U zWKIm?5l+0cBnCffMrkGY1DwQje!Sr&mX$D^4<0SaID)%`faf`T55agO@dr7N=sVpHQ3j-k?>h-vHD+I=+~G-KnSQ z*1a-dtXuNvyZtyl5$$DEgW;@Q@f)kj_ZDBg*t)26VdBuq;Kx`rp@~CNtki3gpk`fM zuVz-HXJgHOx7aL-q^EIIFsl?J8|IAS+vRF7J(@`lRR1%n{6Hv5wGl87_L!CT3av4at3$ru#*50uMdieiOg(n0?t_N2!!M&ayw&Hi?n%|33yc(LEd zY=+{4V-}yWiL5-8>9+Umdt>W>#lwUXQMNRNs{zp_ask>f3eV&Z31|1cIO7;-9Zx}j z^K^B=JmX~{7Bmirnm+=RjHMM+fVShJ39EPd)NQhaGAk3O>iO0<;nmluu^_d(<#>op z;p{gbtMw-IC)-}^3SBU)oQX6Kg^118kCDVJlY^u4=Q3}7|5Pl@G~>rycH$^Eh}2m! zbMKK9F(0gr-g+cTgBlE20qHuL)84k!OERnYnsXND5(}8ZV zBVh2aUVYM5*Fcal-?kpsE2JcxE>F=%7CmksWs?xaX*T_=7Zo3;1elAt$Ixq@+ecI# zQ}@c}eeyp$Eh-FyRhcjF;M3*>x#;aV(~?|JRW^)u6%;Can-bH8mjM1cdu6@4MjCHk zDKilUlR-`V7hVDt@VwSpDS7!WU`%#M2j9lBkd?X#`vl&t()bzLLgr`nl$_oB%)u#hqVjOM8%) z5t&&dCGFYFdnAv#r@Tw|>uUyZsh4A)3uDr>lSo-+snMgTUTZk6Drv4Z825Y8C!6zu zzf^w&VBrd{V9QOENh;gg)3G^r;xvCVuj#;bYCRK2C3Or!Q-@PrCzzUfJoNntIb0fDX5mua%*L7Jd9iop0&y%;VS^ zm+rWqk#|;_p2Cf+WSd?ou;e=D#qenzk4jm1U?~lC?Bv5rP8a%`xIa$gOwwe&2I7Xs z;G8+Wmsk|Y?Gq)Jy3pO{Ly)KJI@Dt+_5})`a_le(F}^^E@FM)187` zDY4<1CGA2TKLB|ZWf5o*#fBhffu)(Fx=;1FN0ZP2H=0$tu=U_q>9iPJ;=wR3kHzaR zw2)Wi`-dLq9qC(T=;nxPeM|dMPwofnV11YPnmfbb!1t!u>2=Lg!h@UlU5VYX9BxzV*(og{|((lJ6$DIA zBue*00`54ncI2E5)M=+w595V}_xU){!6{WY(lK?#zM$%^MlX7}vlt%o)8pme*T^vw z>-qyQ{(g@@tGHlT^>pKvinR=0gtt~Fv`pD}yV%LJ>h+gn;#8uGIQrRj;wJl9{wkAs@FHFIK#cx4wXv6Axk&~Ci51+d#{c_{-lnB#ee`mQ9a`x}Jt ziJW(re5c3%LcBwLKH#?VsqtOI?)Fk|7JpJ^X7Ns?qtG!rI&c`Sq@Dl=Naq_k#~%tWYAP zR01YQRhN}|21ZB4R_aqs2Do3DNQi-7zaP81R5pR-oYfO)8;`HR(?w#{RKR(*ft7-v zIbQlkAr1FXYbJKHfP9|7_S2sd(K7XItYZj&%}xUZU3MROHpHD*r18l*=N|2XHKguq zmr8#B17kMa%!Hmw?RG)WQhGW|!lrvvsVj*EtG8M!uhVkWoqd$I)tsQ3vp~%J5Bacm znc9a@ob2S5;A!T3@_OSka;uf9r#pUS8}Hwww-7Q6$t?W!`8{c$ zluJ1v4FE&BIKy@@Ii9sL+gsBwAj#eD7;N5AxV>~&%JiD^lir#V$*OCq9&G-`fv3EA z*7)a1sCoRuo;0})Zpzdhj+DZ&Jfsu{Yr)L=dz%6MPxX*kH!J^0A#smt`VP;i5%;Jo ze={BcT_^5QFHy_&0zJYtYEo~Yt>hkQBI_YF>mL<269^H4S3=S})+dWatT)L9>FYXr zNqGZ;rm%1=%4#VYtZD-9LE2k|kq&J2H;=+!31VUs7C7Jr&2zGqoB&CPz>jOF@EF3v z^Kuog$+jRq^rQ_d`4Mn@s6!}mvMaQaHSB9XDzp*)0lYmHo_tk=ABLV?x=^nLEEz%P zpz0{5N5X4o>!|yMp@*EEs0T!u06HO37_|i)QF<@7ai@TwHIeSj1TH1DIXju6Px_ot zz;3)*p$u3w=Y9Un8*f}b z)H5>qB@rQ=hunU>){}G#n)LLG#TfOo+%IXGNLeF!IL~@=$JB@38gl;t^)>Pj_dTE` z7X{gpj*=~DSj|HIzr(n!-f&S#xIJ0kN4;U^mh$KMZNH;jklfmE(Kv#CAgC@HPyW|+ z=r25>@I}_bXyyq)HEVT zARal4K;*s)2!#E{_4>L7lhA8?kTjRNI|}%MzFuG@|ATcu)rL-}nlbkyf z3akd12AD-<*r{;rfb+O;qADC>hszgXWSpR8M~^co;X)w(ihma(!v>F1i^S(C-q8Ty z*UE)Kh`EH4FuSRktjd-MM!6H+*krn=JT9ru!x86EZ@%#(M#Qu1r~;To4rI3dI}4a* z-;7qj+`LcME)ucS8fJ$Tlf~R3GQQNLZU}gNr}<7A(Bp9TKyPyLw&1IS_UNm`!rc3b{E3ji1$oFZHP@8D0;;1fRMSlPe_bp8la8&ZoW zLic-|SC63kuO2q7x$lB$J&f*;J1{=GKFoEIk#b$+HC0oLZS>jz#x)&H`&~ybi7=Zc zkq)tsf3rrj8lS44-~Hkk&i9%U`$kOK;L@b$PzWUNqt zg={gClW}ZjwiB7oXINq;T!hs|=z*5H-AycCEv2+GexOjPp-_+IwEX=V%`Y{f>TD6h zAvAFc4MC|ya<`Jpsl@HzkF7c9Tv4H%^y7;V|3Z>rJ6PfgY6QNzdRw z3JppqesIj<6T;38vm?ZiO8T6#H+n>GV&exUl8%;?*=n||b-AO(T8|X0_1W*d)@SF| z`t1B#pIr(8Fl&9^h{PeZSfjv#fvsqZ2m?rdVwWC_EW@9cIg6`k;=6MfH{ z?kuX*^Mi`Z*%5N4s@T{!Lr!eWo38kFDBy(de`>A|TM=w{8)0hfi&_#D#5B&ax}EKb zjP{5*_hE$5+MqgG@HOvt8{B*kNT;S}aWl{(9a_5WYR)-9|5yNk|@n@ zB;bzLiy|%^t5Y*4V#BNpOSgwFRHBBj)PjhDrJAF_>Oywlfvp}Dp5X3g?@>TcL|%(s z8J=1bY<|^NcB%HrmUVSC`6+i5Qe$rMjA9{pOPD(k8kPm0FKTqC4JJB8b{T1FcRGkmWvWt6b^;$~L@+Y>IIA1OcB@PCh^Cvpzmd36Pr!N}eoO^oMIiDMf zE5sPpu7lz9r~HZTlEicU{zu5mhWIm;i&BeQz(5dmZ?88jaJgLEM1p#ZVlC_PT4Ejs$(8yQ$y<1ma8$41RFds-Rw`+iS&r( z;3+vWh}EheZD+ixfu(rI-6zVr?{AcyTWv6u*oG~w-e7p@8eOB)v+QK570P&yDn853 zDxz<=C#&B6>4BehfHD&it5Q$M!H99(V5NHbP_?DrK?#kBKSXiFlVP#fwv+O`Ov@PIkZO}^nkk3S4C8rq4odjv4 zxAtOP_af@9aIOM~cm7lWv3u!B>4p)`RrB;rESEUvNnCF@wHN1F3B|X3Le{F4`VoJ7 zYZu9WfLVA+D%jC7Gm^gZb%Of+L0tTl{GM?+wTrwg&@mg0MfLWj`&8{B43SSr)J`l( z*ZG~R=J(c0m&sh}JltCw^C}kQ6&25*;_=KWw#Yhkz4z*RW7I1-hSeMM>MhgtUfo;U zG(KBzB(bGT8bN^$j>Jv7iJ$9uuphcW0_Nr-}o@Xp-;atq{*5X&;zyNYTY(px_tK&(gDdJIEs6e z)j&&F;}|>9GRT^^5lURA{&zo_IeJ+7K|Paur9&D~B;I*49e5b&PJoq#Q+&&tvZlQ0 zS_@|A2H;u50`!w*5#HU$2XKFhA1CoVe+6g{`%OI>&mg=+LxA?ukZ489u!}j=fi*uF zZZEr5vB&I39kaXnMgM<>{EvpzgF^5bunY^YpzNu)Njtjda(JwikIIBNM;hD8*x9nU zF0EH9OJ$QQ%MRzYk@R?fq8QUHgO~xKt7-&mza-IB zqB}u>=9j0Z!~f!UbQ4ZO%ISQ1f1c=u+I}-g9F#lpFf8D9+2V)&&q;678Te7t|B}mab=oRFFyCUddlrg3R0dJ-qSBO-*!Ee{^)J z$0xh@1*mzlWdC`{|Ace9T#fZ=4#cidT2n}lsN}f2hQAu0!vu2poUR+e9BG`nd!FR0 z$}S)d9fU4;abZCzBFC!}IrnKknwhD=m8G8D{6zy{5pvN$hH|=s%Y6x0 zHc^W@cOp;ERLyutwMe6hSgvaSc4!$yX`*Q0t_?~B`f7sIF)3R|dqEv6sSZAwW+!nA z0bPNJJ@gFSz!2yosP?h!od#Xc`K3Hqa&BKE^=LM)YJ$$~YqRxyOX|UF<3vuwGS|e# z^tyQaiXAg>v!G+#N_Fs4r=G0J2 zg|N899VAx(A6=@04@JgvOP$1O!ila*8js)q1m#$^UnMGjzjlOUrB+B@t*U0_eT=y& z(hBP=XnrkCor?+d5l*6yFf$FP!DvUl#HWT11gu{#Xe--oarq)Rm)MjM-Bv7@AmR=Q z@lEp?Fz3BKepDhxA9Ag?NQbhMtHY-CC4>uFkMpTp52+17S*HUrfrK9aHhN~DCMg=( zwwu1oQWQvNpD$K&A+btzQ5Ak!=JO-}dJ~Isp(nf$Q@>&&btGXZ+ z2aY!DcmWZ(^kM}#2?=W|g#d{bM0=N+t|pfuMxs5@FY=t;OxeE6ht%!Tp8AP&BOM;$ zuYSeRJy`Zbb-&aC_|q3zj*1da>_b8{*Lx7`QahG@I9==@cRIIUO)7Ua93{gLVv?Te zhmtt=&*R(wNLWZLqM+KzrwCG%t)y(25jnTZ5tuG4Hl8Z^(sBghyuoJUbUuBr*>`U|p5I>CR5&DEEL!1y2i;As|LoBR8Ja%RnnZ&0N+$APRwba5)H)H`{I6tMIRy2xlk1_a z^2J&2YiuF&`j;#g3s(b+-Alc5*G%nIS{im=COi5_&9i<@pTR)x1Pr3OgFtvp)?L8n z(#Q#&)Wh**-`WXQG6e{Q!zZ?tICr-b-|k7st+p&D91=&(9g{2S}W5Y`|4J)<8E2VCcQahHO zDznxE{b}br9f+_Z(}9!-VCp*5hW-A2=O-Q6GT%C^%$j#Dv(_u4&qxd5_W%h6W9sBH zKc;QjQvC!9OT9F_RAyMI*R!RBVicAN@LkZBkI#Ht#e8YJC_Ajw#Nnk%hm|VNmYSkV zSu4JPszKu+ke@ufWaY4u(@aVCY^}i$)0KY}>R8n!^fA>Z>tmE&A4Zt*vmW!Zhn0$> z2XVi}pN=d+m>J7-Umz4gOFT;RfTHP5LRNLym8-I>OF1mVH|UVN)_fbihUeo0JNd>B zL|sX|^K$y*i@jgXEKSUuSkl`T;9HiuaIZFDz0O5w*PqS&3MEzirb>@b3u_BXB4h zx7;NiO>76eE zwb3Y$*#A2HiM}$nYsGjg$hp?E{X63idSb^8I;9?5AQ(4ftq?agc4Jzk3A=H#aCy6N zy)aQuV*IwhmxHR2w!a76)X})eTqUellnQcN(=NKeww-G^K3{(^(U{U-dJyxC#^j=+Py@&#);eOq)6P8xF&8F%ZG0g#QGi2=` z!@rY0%icKe&%HM#`#AY$_oiZ0r-O{c+1y2t{IaK$fjOJ|O+;K8)e-Hw7n@g`h?)UB zC_9_i@D+O>1xsN?y(u|}lz*l~8DEM00W@_0k8oIhJFK(W`D{3OrJ4pJtd$>nujIM7 zyqGO(^XP$AnZ26W1-4p0D2*nTwunZ$adQi~O$%`eCAJ8=G)b~SFiERT(&}u|dJz%y zWUXH(p~m$hB?E`&`H_F5#W&6uthAl=gG5@+WjbSeBBO6Hy|e z#0WaURP4X;{Xq$@y8}|xMnx@gq>d{o}0L5-{|oPuaIO*v;_RI6AN=d zVvfudJR;MGBQq7_cTm@aqvXA`6%v|+yS7AkQ3#*T;AX^&u2g`h>cY$R-6R?c@1+bLyEUgBXQu3W( z*>M;grI5Aq0|LjoDFs-m>T8e}Inj{2vEue@NS1>jYlFViZX&bzs@)%5FxOiz6yoxu zh!R8MBUd%xKmJGY75E0N>$#7!Rq+_F?W}eK6+%Gyj72W2XJ4!)7Crc(63>9Fp{AHh0T&|2C8u z9BTe8)gRV;oobVV1$|3p*Lwt45ShFa0vp{|v1$n>hBzijf+&#SD49ihCocT###9GC zDlLZtp)H@3C?Tl+or!}&NpZq%ms?4FD_zsm`}ApoMk%QWlv+9)q>@-cs_LrUd3=hf zmGg+_@N*nyShiNQM~jAXxFsc){l+w`2ULh+18wGD;)C>0M1jx)bERh}QFQN+-{@QU z(Y@gjm6~8)wOrn2T=MQ=FDcBF|Kte@fxh(9%y(+ggGfOZgL4>2>^M*R*4o zsq{S(!4y!q(rKB@v=lB%mD&j)go=-(chSZlJjy4xSw&pOw>=YI@4Vz8q+SQshM5&$ zW~{s{(eLLD0C#D^<+*+S{I#w@E!YZO1XqQEur=w2Kfl=%u zjjgKMU{sZbT9=g18%0O0jGtxZGb?^quX*ai=io1j;jO9=&|1zLCwrL+P5M1mPY$nbc6{W&AxiJ@*t};-TXc zzwKY>+z6Zce1)C9X(Zx>!wFO4)4g@R%Vy1qus-Snw*NO`nkrMmobY&vheOTn0yU0W zFJy;yAnN>)74rnOqR+Te@Ndfp_^{KQlwykwsik*%`CM59i5CV%dWoo+Ws&q^T1Dn; zyINA5glunYXRkeJFx{>*PwJ5?H$_f2SF03aPoC|H)R_|Hpe(X)@*8ow;h?KoZX0LI zC%}#Pcd>FJoSMnwmw>h5yg}(%I}nDBOIEGZd=v(yW^#k+Qx&3LbV5+aWrM!hC+V16 zKeyB8%LT+lSJ3cB)in63Rl-Qvy>j{mDJ^-`8aKV)xi(`@oi%vvv)OwYikc4V@m}5I zrPoV8qUrJxoimBh%exF#(9ifo+yq8K&|$s!QSWOKL2ohwA86_+JUPnqCq);!gU)Pm z8;zcn(3@mx&WKUMBRa4aL}Q9hlMaNo%%F9c3sc-w)>~7~7kjyy3i%DGm4lE<$eUW9 z;TsWWGNinZph`V288-7!5~3)Z_gw%DdB_HY=-{aCb7jt#cAq@O+v1%OU(JBRX@iKWE7J>dr z&-5cP?mE>6)vdDG zkMwcqK+83@YBk59Y|gv)2ki8;O1pXxLzW;)G~E=8rWaHO^YF)3;a~*YU-EQfKDRoc zE|Ek}N#>3nm-9|wM!!K49OwEUs;}PPywhkJ*dpoPs`Wm)8Wj^Xq5G?Jcc+zyoaS=1 zUIe;G_x_R7o!G}&kn4;2R+~jTK(|C?qEaRD;apk)$S*B(mR3453O8m0TY0|8rY2;%C~9~v_sGyO2*PxM%c{m8OC zfG4ppU?uCM#m1Ddim1BA4sHCX?ycxN)GE<==(Xd|q=x9UU8W`WmU5?|(pvF-a)y=D z!pi2Bk>6S&c0KFTm%kNNs~RY&<$kbl#DQYr4+yf6>L+50Ly2j-hnoANs#P!*(`MS} z*0=-DnDtIXzkuLzSzHo;`I*4xM9aL7#qP5kn@YpgkMX)e_FcYZkJbD4gc4JSV(`A! zQsBq~p^y{U9a6QBm+o3*wLa&4t<;MKEAn97SJkNCRjlGPozugRzX*_{tj}6Hb#hws&9*O%~o87Y+Ti$gN0o` zM?==R7CL!rANkdsaEMDLyn+y#i|8SDdkXa?i+N3Ygx*B*mZ(qV;u;r$qW*9X<9J|aS$ z@>V?yf979P-cNg!cY2v~t)aZ^qvhCIPV=vWatG-LB9Z;zc{FHaQ_qm@Kge=g=uA6G zO%Jw*Dy>Uh`-p;+{bHQ6V;!tHq_LE_g~HFm;~ET=?}RUP$A=49Q5WGH9@siv3}pZpD?K)yXqrsUP-2RM_W%{3HKtG>nG z(3Z2_rfESEPuXKyjg5v!092+)hS#Q>mhuHnyFHvpb%<03WoWL@jDA~L=BquIb7!(n zKUnv2!|FMDNKKMMuq*hZ>HVsPC0osxI2z3TzY3rS<-XI6g(%Kt6H=OFU zR04hXd3{jr%N!S__Rq>;j?ovr6CbWn*EbnH3}c56^I`a~dmV>%9r~$)bI{(iKe3-9 z^v}sP{KoY%fyy3loW{aGGlHLco)gKVZuGy(PK8HSXKa~6V4?FRa7E797dkg^VYY=G z!KW&mFO|dFZRdtcWd~sK&KNEZJLd*4=!w10bAwJT=SRZz-8VQdlk@m2{9UnBo0l&N z;j{5D_!OU2HRL`+cH!rF$yKx&NUq4RS}S5tcBe2ZPtHUv?9}jXwnLjQkbx*i4(B|r zpxz_cexW0akTX|iNWvC$3>kF8xb}vV!|L*Rkil1Zx?zVBulU1iHaEsUbuo`7qTDC$ zsrf)WWZnBzUHWq;hW)!yZP!^5m&|iP_wqXH-q%9i|2fjSZ@1L{!8+@{m+SnGp)BIF zsiH33bRyaNyZ4QvjweIiZ;6(q=~SoTbo6wI2c<8**wNwBW?voVp-kT>+c_kRzzI*N z9G)S>KztdgwJAowR*H-5>$&E}~P3sP;#U+{Fe!rN=<{(FXY^=GWY1tU()k+VZ zd<#3AB6EP+STNrjga|rmPb_W3trjept#OHHd(1L+ow;p8D$7 ztyBvaGlt96?l+0j{gl2lHjJ>Z_{ITN%p?4f^;i%;TH?>};$`17-|KfGGs0d?#5SXF zaC$O7y!5W2FqWh>@x5Fa9Q{HIP(Dx8A=t^}ZBta;DS}AUjGb3bwll38-W$Nor3zvs& zRa{=@_>l~GFv2a^jcyFi5F^pWxjZYE`GWce_-^x6u+XNxScOvql<^7`29z} zOYu(^6rZ0jK2I0FSc-2N^Df2b6ciVn_r~6&i^rt+#KsQ|?)PLRGm+VibjFI)Vi|j5bpP9-q*_3CuAQvb%b_OyK#Ewk##Hp+vBT>bF5#i6 z$qIOCeOJD4C&A9~1-)NLn=17H(YhnoR+@U~gV`Od-&9!!>oHki_`dl*JNF&x4VBY1G-98sa2M-K zAaVW8`Jfiak&>zyN4;t*;Tyi8DkJFzZcq=zCb~k2OuZ0IZbhKf5~~mQ5v{oZPv!T! zuR>c3p=Wr2))iHb?CYaucX;3!JMoZM!@>Lt zqrm;QbDZ6HVX>{wgeLD&w~9*1ZgjrI4-vd>9E~Ndpo%PzS6xFAx8pREiHFPQ2b$M; zV6hUv#wG)A%4^876J@}Y)F4XMQXsn{HsQcWvhs(9>p8%6NAvriN_jZZ?-My4Q z9{ioh+y=fh z)Oor@=^gy}2y53C(kXST&j-2X%6F%lT8(+};X#*SB!E0(TF^Z#an^ySd$>J7B9X z+FL?&qF!BIqIBbR>U*a%ehq3=Ip*{}igl2XdZ1jk#M!$La(r)M-*K@yBVm#PJp!%|0h zsmSI3hqJSRkFvV*|4bNQMuRgd)wIQ$ZsRVr*ak}#6lw-1ID-?7FIZaLHf^l6*0!-u z#8%OyGZCL1M_I+z-P-E*WtaX}TiaTTRMQLu0u~|oN^2`G0zN}T@hu=K`G0@+KF?$V z=(?MaGSBnew{y=q_uO;OJ@;HHr6lTKqw%YdkHZsN8zbWv87mD(Jo-ZM=?@r)iJt-~ zJx0p^tGeeeky61PpPEKlT)A|XVF{d5q7QazQ{|?)p9YJ13f$CqlD?j#uZ>gmIK@2H zxBnv%kSCHO(AQX}ANYkm9e-h4O8>>m$9QpjRjTkC?P;coE=KIbIs(MRvn!)%r!St} zzT2&O2n(#!lWJWFWCKgR@kh+O(j28e06qmSyQ7CKu=q_k%4+A{`31$0xjsC& zu!-bg<{N_x&*vf5&hp}iZKlNI*IbHIxf=6(ZUSvJ1iUibl+rr8In{dM1-{5jjhc=E|hAXd*uYzxDg8LmD-R8MQyKko!#XXL1#jXQ0x9!Mz@g4MhJFJ9CmKKk%#;b1F&j3-x|XfanoFM)G50tI9_DqH>Oda>}_254Ci(>)=vFg&!YdrtRV(OF?^n-fME{NgKaS4y=ymD{ya!2`w zM}7>bRD!N{4W{!QvYKbUp2~N1@KMy2{rB_f{A~iHF<&q}Xl=$EF#hqx^ncOo^;o~= zK!Yjyv*&eeU!N^~A-mVbAKs5 z)Gz3~&RYzFg2Fp2a|yu`WBTr+on))7(9%Uqh0w0BJ`~1}Nlt${n)@X$DaECG%B+7< z`BT)h{4IXR)*#PJ$F3yOQHL^n9s9D^F`^ZzC;og@?%(%K|30n$rSl(*=g+F_AXgbB z@?XD%uXK<#;&2BaD|hgLDUa)XZG31$dip!juCI_wXZ?*P`gqiNhengx8Fe`7>clfh z)HPBj>Kywc6V0UUa#}!%;zq*Jl{WHj`N}(VqqRL=hqv;*w19sW`J{gRXNECycZ0`a z#>l@Q#!p*ZC+lwX)_1D&QFwG z@15m09%9G#=<4K~f*?+jke`tu!`7n8MbshS`pF4EFw(La= zdfmYnwcW7v_4Vg-;%+b*P3(5>DlQ?*!#0&_Z6(+Ok8*!wO4}s&^lJU9_%q{I zYAm>8f2YcARpmk+E0HfnEFIO;=sau)>(jb4QRr0vY?qv8yk1S|aesc?xIpPFSeC7R zap#78SmdB>vUN8wdH{;LDGtyBT%96$#&o}g57c*lE98w}?6fnZuCxu(8ya@+hk`U! zYAMsOln_Lo2raFHp*^vb?=qsTCv!PgP*K7k#a}3oVk4dwCClUYz2p;$_4|=eFdp)$ zbRlr~^GPy)bqoID#0|P|a(?#YqI(1p1~wnxzq6s|Wh}~@CuO&eZHPXoyTPVlj{0OW zvNw5nJe-X5Q{u$z*3(Its<%H}_{mF)J4a`?M%xb~=~F#Bt9T~$R8o^pJiNllGdmx@ zGGaa^NKkDWLoPO@W^M1nDBrDNN@&WTn!mC(ddp=ng@?oV!;lc~(!nXuHaTyVHh?)R zKM1!P@7PB;nOTgE=#5=s!j63eDfFJkMUC@QBW@N|iPJ)LO|%!i^+8S6i~)=<{aknz z&-RXLYQ^j3h0s|}=(7pOO+7*j0kwISllW{n{V~M0KkASWNsYV)Wg%?qrzWN%D-);H z)kSYzr)k#Nm0YSMKtYGxUQ6m(&J~}HH9EcL@LNOQ8uRhmwC)3=@x=5M(ZXZO+d4q@ z(M(~58J}v5K6osCF8~mIa7FaNXVUqvPaGND>8~S$i#X-?5wS(s&^Nc+C01JhL_2A5 zz!(OdK96`#!d@bOS#`9ln@@5_sRB)@{I@~Vd|{J)f7>5$7I0poH>uWM;D$*;>EQ09 zQ=jGz74?XYsWUf!8mQ$!7j9x%P4P6Aw^VD7Ssw)Zx&{;ZFA?l!8TAo7Yep~=nh|L~ zES`Pq_-Jk=2xRf+tV=V9kqwN*>beBB`(_61Ja@OIKC493&tKLZkBhzp5d62izBe`y?9;xnQ~kw`aEYrX#zC$&`dl9`BWM zX1WAUCLB{&GWxTPSN+P?bEmi%?0IzO4UeNBgr{<%e(Y_+;B44lhqK{(#>_Er_AzkG zIEX5qKdUcsObz824ZSe`F)_d4!%f2tc93?Bfm3olOXV_|h&Jvm4T3K_uASv+FwTU9 zA$7yPv=$Q=*VQ1qLrCb|sr)EJcgTjPM{+A`wmL z`yaVe9xo-#R5jdRj}hpv?IOKBWG{OT_F|`tvv*N=c?6uupwcBnKt; z7B@%or*^(DL}wy>&Z&fu9b8$J`9SA-t^1u*;~h>7ayrQO{He}rG7ddY$er*Bfxv`7 zWUo_20@3@9A1ao{F$3nS3!AC7xa9+#TLOX2fynAkj{S55+DBzq*P6_Giqdv6AMczK zlGZb2hzg3Oqq18@WlKRKM@4V^G1xg_=!X46UiGRe7Rb!We=ihYs_g{l&5p-{&YX}b z`2ihWP|48M=X7k_`%t|Eaiqt=jyW5g9iQDh?&@P2I$ns{9!1tW-wVBF>5ym8oY)*3 zPAqN-ne>6@j2@cEhYA6D6Q{oeKN~h6=4TXY)X5j3r3;vp76C^gB(01P1fvA)*uV+& zo#PexsuPBe-#Zl94Kb={G^b3Wm`BX=`<{Nw9UX^EzYrQ`w~os03}*LL%^#Z&-Qj+! zIjCOv`91cs{F1#sJcG!F;mk({XCD=8uNhn@Yi(6~G^tyN18s1e>EHR?Ku>_lC)^MH zpqkiFWCG|>Q+h5M!I6QA^P|}plh!(mVd6HK!7vptJ)BpMtvj0gT~MZ?uh-%l!QB_o}|m zL#nXQRIaOMrB!1USdo^;DDrFID2u;j{=?>8^Iq~R6cl$ogh#iR;@LmRJQ8f*gs1LJ zCT*hJTl>?eQI9&@H2o#1ZQZ1&Mv z+ecIVg)2uD_f>($)GH6swLo!yl{;(Bchy-2Z;xKbU+)*A5PqKN!`)vL)Q#ZINO`7&^Z?wGr1(#w@{(5JF_l=RB?F#V(&hO zj{|FsKZ_`^Z0cDPg55KHGPp0_+o#Zh<6Ux>I>@WbC~D#lff%+OIwmv+ADYhr4c&Ml z0!)K=`T6zk#HE>`lI+T~hv6NXpD#vA=kJlN*buM7^3y!bK+m>EOFAy&)8iuMSMCDe zG!(-KyPKVa+GKt~xI0Fc{J(0I%nrL~Z(MwD&Sq$jg_-!-_TS3=uU>B^8^;NB(%Sv`&Ww!4hbtJ&x!bZ^-)fKK z&lq2Hk7KM?4l#QX@Kfe^cFK8MK@;7Zx?z#4Vou+Nmz>wK&yQ{Y(3D;7`BbPq68{!? zZ+>u3<9qfkqun>uuFU++c}|yuv{MC>LcFih3~c-w11)i`-W^ec=&bSGuS$) zb~Y=xNv(V1o^gRMeu*WOz^q_z=|`jD`Ol%4?9j#nw^&heJg?PRond|EtD%5F2i4Y= zs~viv?oO)melTHzsM>*_T#9{hF6M@IT*GNM-nm)DRK@y}k*?o9w(+Rh zS$|rz#^PWley&B!w+F`szVP|dHZ!zyHV<};DLtO`^qNS;yb+$Mwlj&VC(qR0Ugos< zXUzPm9!`qhcq6|vm+0k$nfL1FBU5@*v;m29edfsd)3bZOIX{!#d&O0wvwK_Hw|cW0 z<7?(`0dD@+Xa0tttK6CERd~zHAMuvKPk3P2Oi8oM`m2vUvA_dyl&@aF=btgyExa?c zO8+(AZZ-4NOo@Wb-305u4%8E`W$)FQf9364Mw~PRW^SbFXzp5G`8rQ|%A0+H7h7pz z*6V8LgzUb?pJ63(O?b8#fQ==$Bz7@>xg#9~AMcy38 zeLmsUth3LKZ74}+d9x}L%f2}(bF@WH2apCV ztDG_UXvel&izQBanrco~H8Y&P;?`cWEA{iN$N&dw)01)Vxd}B=dhz zcij0u;bXS9!AM|l-eB^5ygb+!m5wF5=yE<1HfGfryTNCi!0%CeGk14B7ij+^98h$n zfg`>n)Ec`846Ax1(Wa#H^hKr1mW{_q=8Z4LV0frsS3`sc9s~as@mk-oqEykU6S~qp z`_6=D?r^%=SorE2@$B1?=)wqZm=5wx@@RF^nfAcX$->Qbm+4mlTQRWAgA}Imo9lGa zLCHq1pzVev@FvauC?8QLFnzaBr?T9H7?y}gN)pXeIesrwBAMEh2u2(9@fwqp%f{Fy zkm|y3%RJ7|9+F*Y$?)1bt&J5AG z%q+X63g7jrcr>w^@Z*n$mNY~gAI;CLcAhEjj1*rU)46po#XDaJ>>d?}Jd<58c})8l zMqMC;(q4S&@a&Fgc0YSDA7-C2yPqA!<9KlPbv_yh)bn9XG_h|9@mYTdMA)G5c7*Mh z)Y@#?I_=ua2X-WI+LPyLTRaBhnC^4#u zJ-Ac@A|0K*H4&ZdmY&DpWcizxyH2GW`KDODy*lo!jyr3Z#tjB~va5Xz^f=4Gz+e#+ zEXTp%rATq-n9d!h|65J}U-kM=@96(JzyBD@mvh=F?mQ9i{Iix|+5Nc4CZ2FsW!Hsu z-$3IkJ;nx$VIBvIAfzf{5z_S=9u#F+EO&Nc#!5PXr_9t-Q`29K<~GxxRAEl&tU~70 z5aX(oOo0xaaZ65rrTvxsf*28pYMnQ^Nq}m2hT6-*sGA#jC4as>CQ?e862^OVh#)KU zZ8iR~(AM>6i`r0qg6Uqrvs{D=1v+;GI;bGATtccvBF_hLRj95ECZjm1$o~!L!c^no zlXUu@kX&H(({i4fh zL-x*0-3+i=%g%}+KX(izoefQxvV(7@ihD;Tr|*s~JeSr|)B7_u=}F5|Oq8g{hTLww zAcm6K)4=LQyl0$qc{kH#3LV=0)s58wHK>rB>9~XKiv3kw?QLV3gCJ z!(P3|9#HRPs@K-3Uf@!rs`(P`J^>tpjySpq8Ux`3L+Y@5W4C7It60+gN)s~YC0aO# zI-BF3mvlY;-Onmo_pw%Posqv_`xPlRd-(p3hGuMkn;V*LaNF9dS*&ksALS5Pf+?S{ z7>zAAJeEY5ijB1G`r%|DXD2pXNRBWY(Ms|5ejl*H*3W0=NI##M%gXu8H0tLwQ>~xR z%za+IjEKYPBuOHBEQ7=jhG5NJbDh1K*(+8bM&I<VG=gi8PEogNU6Ti z(_pEs)H=L>U@GS5y_Q<34KJl|q|1+;Q<(aONXh<%c(frUjtSKXl9LR1*^3q45F+NDo>`z)+I(@+^5r<(R(Oa-c$@&^jmk?87 zrNNrPsF=w|9rPoMW`SDS!R7Umk?x3&W=T1D1fU1z294ZpT7gCr)xcCnwW>!{@re97 zts8WH*%+&Hf(SxVniYb97ebrefK>2x%Wa0%!_e9d0Ryc7om&ZL_Fp}Wrtp~1ATf4* zn-?%AdDzj;2q^MUW5$*8OjK@A;6ZIDe@>z9Bw-Mhw7<07zzm)bf|nxi2Jebtd>sVu z6N}35uJGXXDWTy#0$%M>XqUurm)-nR&4y$K%RaoHRyG6g-Fq!x3>HxZUjWfY6`X*$ z%s=d@f>t`E3!(k#>8ql-KPi(UnVd~b?lyFx4nB;~ht{>f;wveQxizRp{v;di`T(Na ztoxidi=`v&($bm;Wk&B>MNK#+`rZsl@z3vmA$ zaDlu1tEdxJeJ#Vh&cJ*N89enhf!gY<$2HX|dKGXCL#YeMJTPiUfKkej!mfZ{+Aoq_ z-B9{CNyBS+X=kO`eDeL(EI+I@GHUH1xptLk|M5y*edd-CqaSit3UcL?k3d6N{#-D; zKbfB^{o2{!>zjkijk>v8sx<1RQKhY_x!YOQxlXF);Hqn)3Dje~g?Xzo%Cg>KycyMb zowVpx!Du75Gao7IK9{QJ?gF{k_*nu%J@wnij#XLFX&KOAA62Dhy!91;T++0&jT3FIuULv1I0|DjGUqrD8ZzixqVB=SWT#W)UL+w{LH~+sQZS>pke} z%SZBOW0^lQqq1wlW?RD8QF1!Jt#w=1fAFBCR)^&VS%+E>oYivbDct~!bk#C!X$T{h zj{v`OXBEb?ieQl}{!RfI4)|I{B&d}y6>zbXT2h;-T>>^g4D%dVQFcwNbnzj+m(Jv) zVYwC_1gQs&g1rG-t%1AL3T#TO4U}Ht1cM%9fzl2h>G!~GMh3JpQAh^l-e%{p^f5?s zAP}Wzs7Ca7oL`f*jfaw29_D{pa@@ZELW%7g6|Qd%_MI^;NKa*x=unrf;r21vkKe(7 z%Z3gHj>`sTUDOuMwUKjh)>UoV526)B1_9`?OTtC3MPsAK-F{`jtzIZg%>u$+$Xljx z#=M7UKCq1CLZG{ge>8)Y?Kh|Y+qi&lwjqJ=pf579SzFFT1I=I<*3XwS#AfvJ0TBID#8)EM)~abi8I6%XdaEfSWED=#4e4 z-mL*rifbDs5A(T2*qt0~iGZZA=)lU140e=t_C2TU1s zKmT2WOwnJ6fg=}$OCR?1+U{zM2kyx>OBr{iKbg`A_NoTm4<4%g?@fjVvp<55opDG^ zIgB&HZKWKXhISH8xAVmsq276iNzkk)d=BE**fuRVCgQN!uJ6#1`r_W|cy=%5l*N77 zy`1i49TmO1r}3kG?x&C$45w;cVHKXjaSi-72AxfqfueUWk7L_$?;HFOM@0}Tx4cGg z+51iwIAm40?k0j589A72<=8}KC6`MF_lQbunF$EUJ^J$MzS8Z_K2oHReP38%w>*j%6Dz# z6}5bAE!MW4Aj`MYcXKYLpwUNDk$s%Nfe4XTo#!`k2+=q@v!=uii9>VGPdj)Fy0x;kBKdT^ z707dn63T(9&NciS%I*&WtrTOV1#``KvS5luFmXe7fqyf}?7mv9bu$-7|B$FV!rK7I z{e(2MRU;j_+n6e>WQ+iX_3(E;u^3RzFlUH21UmaD($QJeztrhBrn=jIZcNxR=;A+^ zVM9CmOhwroMVQr`9$BqVw_8o8Gv@?m*&U_?z~i_GXO+$&M_C^NDA=u5g*En>z~f70 zO{|c;dhI?<-zfgxviEP>kPU>k(W)1iskw!6QdHl&*2}=bw0D!}`tE+8n#t54e5&fW z<6^Tt2%q1$y#gn8{MkLyx7nP0gCVz+dCXEx7j_2B@;_G><`6A8kO06Ub3*bZZ(8Xp}MHrW{#+sofItQ z_w(JB38@TU#F(lb!;kfNZ;>UP(G$QvWm-Wrb!$kfu7*T@V!k0n{u<6x@Nvkk`m(VN z%|pSx*lb+HBhWz>dIE{FBr=x9Mo6jkQ!~SkA3PD!oTz19su0>>YPUD5`jy_-Vk{Iwe1(d8F!32t5AJP3WHQ`2wQB* zStldE5Co#-KOh7*sB_%)iQqZy%&zCS3mc#vAWVNsxu0LM-(08BoOB*Ae!bj^8cNf~Ze`+E z#iNrr6~H@LZste&cp#*Y%@#actuEi_vANdjXH~i|J7~bUhgZygJTEpmlyfuRqLUWa zHJJMC#z}PH65i;e4#Uv4L7>-jQ;{+!C+%*Uz9&_XyY-QR-|u@vW#1c+NsA5eoTaU2 zT}es0tQu4KV=EA$kc~GVh>FD?DzyE4b6ve!9*~M{#vYa>T-9pS0YVyTYAX&e`0_)0niZC9nqw?24T<;VA7`-ot_D zF2kYDUxx|c>@HmaaGE`Q$Tqlh3KI-aK79WN;J(rEe*_MTQfUU5KJj^5wM22Lv z%7R!gfiO{H@$5oqN_u)Rn$y|sv}Zx~24ae!zRB)CeDm1{^sjsRm#m6@HMr1NQJicA(lPg#WbC!OVUJmxi98k2To@?IHm6E|QZ zwyY>Yd%w`lq*0ULjt=|T_9K};T1T>RL{Wvv(v{Ov&Rj&##`bN6W=`=SzgFeU0D>*c z%>rIuevG!)PD3c0Ex^ZVBD;4?bm1>~7^+*j8FwT3dmvVuaPR=~7q~m#9l)f4>Y!Po zLUjNbJHHBnn$_l!ZXA^mgb4(Go-->v;2&2yk_B5iKfxephmF2&`{UnVJSN&T2RLM& zn#M`Px%Z5h!F_y|<@~;Abm0d`b2jA17dmh<%ug;f=;tmg3p7%dyvlU`{Bz~I3IId~ zaewus@oV8AU@enVvzgmGKKCXgb`ddxGd_;-*%qjoPmdisFD6vTPTWj7Rs=Ly=^B@r zjmMJS0Jddh_R_<~0o=xj;nNTeSu6ymCxmm-&D}u-GVR<&b7-S$F3_nFd*0 zbvor@#&T(_>p>v^3UHCh zg?a0P1`@S60ut&_aRZ62O*f!~0A<+TkV41uM#C-eC@aak?K{jYxG#}!~X zm~{SJ?)-*_!?G`b*m)UZ^V7nAf>vz zjLBbQgz-e7s+lPpZN4wtLpGtmFDu1Nf6+;-PDD`jb?ZrI^40^UT@fOXo!fi8oNd44 zq1MT2DQogINNwrht^Ft_jC*)6Od!)*0|5O|y8dVQTFd4p;@T7x11@TSZ5#v70D9N8 z;m#eRv0Jd%c@B0#^OeQ3@0C;CYqGFY{(^h!Pj(FjSJ)hdJEZ(3 zTUU^*sj^Vr>wbGgx_}s&eh%qocy!YnYDyHY3c5SL#*(64j{ifiC0m~mZqT(~=u13_ zCIMnXPi9wCZFniWW32n~?Ou7EKX6tyM&9w=(VLrE2j}#Kq8znm_E!T&hrV9jA`5~75uHUF)cECjpa&P&sVXcFt{>|TO%~;cU(x6-HaWGJK8U>`zhJ& zweHxT3!@adGgVkzw}fs|xHskxq#<|qk1WaNhn1mnAfaNB(>-BChDw@w8A2ulAxd>m zEQe?xpb?(%&Bf{OjvhsKIf8Hk*>{2;+?CzFIlB`6x*;4{X_z_@c`8x(1~FT&s&c<^ zi3oi|cm$mxvhlEV5>LiFD%;JLrq*3^`Vue3Xsr#>_`__}oI>Jt%>6QG$xhte%sVEX!cMVN>oJ&ix?{HF>UbfFs0IV2+ z3Qr(VK_DJk9*;a;(pk=7CICP?Zf|cj{PLpd$1De!)l0J>BY8Y4KmNXr&>8zA;S~q| z)7R(4Kllh({=t9UXP()y{PmM{!^z5G31_(Nqi_Y>IySp66uotdOhr#;w~WqD{rx?v zat9GC+v1TozlN z|IQIP#KZ^WXc^9tEZi<8J|M&C%HX4h<5!aeKBNh zEPNN2OqN{k?=WvE(c@cK-^?5yx2Bv8l{{QHkIljjRKjU{`1ftYzXUMy=81SAH41(A zDf;hP1L7Qjt&mxRY*Z1Q9sPaLQd08Ym*`f@Hz-D1TYi>__;>@GAf+QfH}l6xj0>e8 z-F@k9ALBk!4cdLdu*W^|hgL9HtP7|947$hUbgM^Xs1yudhJhcb1|NOVuET*xc(Mb( zaBa~2E;hUh%-I=t1h&qvDi8X*0O8O`E1dP-I9slrGGXW7K@WbQaeZOVexlt(yWT(r z)DY?VI}c8=xMd6n-)i9HHKBOqu`+{1yVjCU!Ek8>4|Y8WY^G<3->`f4m&}-d+aL39 z!}HgNB^FC^FEDzTuD|`&GA@&EfE(NUOU2LB$QdRBySqi8kb{$My;io2IS*sU<_I ziq>9N-^=TdivCx-cYpCv{WtANewGe1n^+x?)WGTC!7!1Av>n|BP_SI>-m};P7Envy zpjpuk`IwZ39gur?Sxg!Zev5Np$jgcJ9sl&0)zmq#ZEUz;nr#X>mqRLM%&leyMv!WK zTkAgXGwWAbF)r%tgt^Jx3(w27PibaIs4COqCiia@XLv$w`CIE9H638zh;t zY`q^j1+3SFZ2pHZ!`0u z^G4=_#0%k+uHnqhA+CjvM^+`AH?rIJ8@}@Qoc;{-LunQ|-9M&znO9jjpMo$bw2IS8#gRP9@ql%;^xaYO9u3o7n01*D3;)eI5YR z%072bP)Uoz4RQhXwF8-}YTWT=A6KrzOw?M^IM>wLwK~E?{8gbrSUDgA zMQzGipW5(pD!87!7#7|E1mETX+m)>@HNMp)`VDLEFo}L^#_Cclo<-bi?W$gcMHhXG zC7gW;cHt(-yejwk^1hjAf1UBQTxZ)in-iYR<&f>)dincrAI9?9hrP6L{y9d zAUuvQ{Y#~f^2Hw~o-$P)3lA`s8|g$0rFT@kb4L%TDJeXb2R~D8=~I-Kbp0oOeSS1} zO~cOEZHz4md%-Tsz9(M)@b&lKFCVX%kJwq}1|aZigLQPMng0`APx)W8Ka5vH)c(@E z5%N_M&N##9y4%hdC1Q|axLR}5P`vn}21q=+&5W&_aL&1tVB-h3@vX;!gf7lgjjo+y@SH-cDYc^s&%Ew^s-xXtK?sMI1zM7w-T^2 zeeW%m=~fC>rf(#jvcQv>XRnhYX7&PtYi?$pmTKYzIbulm^cxv_3d@| z%*-c+AE?tpHT%MI&zCd(TZ&27X^xHNXX7~eZT8G14rpc?d2u$u1nNH|_23YS=E2$Z zL|eb_V)}CvyW6}^L07NhnWz}EPvUn1zn>;96_3=~b&n)-pZTESt_;v$dPu zEa8s6{uMJxnfg7=1owM$PRl*EVB1elSz`|Ln8VOj$yr_WEH&TgFWWZp@Iceu~1SB?IAH9 zc}ljmq|v#9Ei$hz;z;gzbkQ^0)Why22GL8FDm}kc(Iv69xGVnU z$2wqrh(o}Z-}7f4+*7*VK`s2X72W6wJv>Myw3DGasE+wTdUHIh#WN6bJ3Syw>+Zb# zkB4SNgzZi~ngJ2R#KxmbNfmdFgw}Dh_V&IoSQ#LULR;ykB@=qn+uM7xz%A^em%x zSpR$v;Ho@d#`OWqMK%-=SM{vWJY) zh;0u)bEA5=fV%*II%&I!Bw(ia;Imw#-ub+EpmW7Xf$UIS|E@;TaM#(6RzG|Un4TLP z_!ux;;CFkNYqcHWkKOZ3*DV&@tCtS1-6ZU!Zdtic|IHO3WfUy%P;j~7LAySvl;=H~ zJzv8X2M%iJlokez-)7$ycR~mCTlW%zW9(>vo@k;csQ)~U&(G$Z$9#2lvKza}>hrm; z!3vV3wPCNme`K&3wDk4N#1fU+kz&>Oj}g=&#B zIb#nb%Vu8TJnLi1yUVlw&NGY{KTqZ=F*bXIMR)syusT6yIbklREcQ4~@lNesDvUH~~L!-U);STulI z;xrx7$Y|>p%2gbLL`H2HY`E<=`HF~ms6zW!75H5K;vD0%nNSIMrJ;18(P0~q0_B#^ zrR6D)8)z&ns0y3i)A$M~ioYM}Wi%@IRo8_y!ZB)9o?XrD9fO)4`H)>5+q04;VtOa@ zWFl8nn38h33WFF8r~LUbogY26=#D2OCB|k}X&o{QZjPLQ6C`s)Z+2gJX#nI$Z;^e* z;DfKCK%2B9p~N^mcOP#cx#U26Y`6F*4VZ4yZF`m;m&i5>x0Q%^gbMF{Hv?{Dy;j(L z#8%!5vU?4(-GW!|?S6TGC^d_A=UmH<8yCeH#_MAEK(O|&Y9wBxR?U#C;VG`5@J1Ys zw!ag_Hl?qkSwEzdGD*6r5c~y&!BU?@yEc|xQ_sZ6klT_t{F1sblOsb- zX0dqToGJ|d(JmQX(;m9K@niQPK0(54=jR3=v%t$@VAY>nm-DB15xqj7cHs|Nf7&PKAOZSD=5)=KaE2%`fcT>Pr7JVoD!ub15F3{ z12Emh!x;zB+_$BL7Vhw;);7!6>Qs&U$qw1aulM47xa(8Z3>D5K#+^O}(KN=#3{|F8 z00DamN%c*-rUL20UDi31S-)Y*8s;nf-DN~#&WsW3Om|fkE_kvnL5Sb;LM%C^Qm|X| zwwX!KF5GKa1b;>?*cD8t!JwImbGKUL&rX`mzk7M%yUbAfGZSnA2a$R{oR@Ys#Lu^L z)|6kPMD;aF^s)G848-TfKd&Kb)-a{ZtUXmHwqxuQ@*Sk8>I!_Mf_-xeH(NR%eS@WQ zjf}B}$wp!2JBV%3e0?WHAxZoZOP-wh;QqMXZa6#?BiYCoC71rgio}GK2F5a zj0McsjG&kafMhh8Zra^#PIyX@X^6}3&S*_SjYdKn7#4jL!>CMxRuXw{@kqkso!+DR zBEqQXG?kH%;ZJdo`u#jSZ{&F*)2{Mg#-Kul=DiD)Yj`I268{s=_uFT6U~|Q1 zm*-|WaGuA0(iW$gq2X+B|MOnpM~^dOYmFFi^6-IK6DQoa_X)!!XGV~xbngg$Ya5ZM zc*^F8jZ|P!gc%7=ytuB`qo9CPUwjH)0|m({sx*+qqmPX4d+d9QirB|Hy+@xe6(k() zs-e;H|7N(EA%^_m)&iD0rjMq#rJZoG_J7R$Z^GMX?O;t#Rt3<3kIomD@YSFHW7?`n zrrA4XzO+GVu>C30UxPG@X7>iv7cHo@)*$mH_mki8Kgdks5CLbC`-Sp1>oJ3lSIZbz z(&^>$$g|<$PZ9=3_oL-hW24;U_Fp+%JH}vB``dhjW@$~#&hqFje*=D`AAvy-VadYv z7<*pPebnE79I~sff=tNqeg0t8hd04U@ALNG+ysq5RQ=;*NUknn)^72vW4w#(DV(_ zh1zo$#uRbE+X@1T&?^b&r9|0&s*Q|fer}DMTp(!y{^jQ4?_`*u50%G+F{+B$MyMVQ z43xdNZ4xeqb03_nXBWflBAA^BtZ`K8`LmBWkUaZ5YjB4YQttdclV-btq23s-O*pTb z2m}dja=lXe2c~Dgy~*YFq|O0;MUa7m4?sVC?*H7LnL>BUEtH!sUA1R!E>N#H>+x>; zB#f-`K26f!r}LCU>q?zcvqqCapjI=`SsE8Wf9_fu!qx$Y_dmKnm(ubq); z3OBC<=<$xV9iDng%jx(dnkq`S8!d=>e7gMa`2Os3{%5)%Zw}!5f&o4!K8Mj2{etr@ z8(yk(*&b$pc!5O}B`Wdt^w|fr8_l(l#a3oE4a@WC0>wj8>`oR{a3aWZm++3ttO(0y zsXOL`9&n*0@JQRLKVM-y^S7bcgId)uusvhijWf_;^W7KoZ_=4sS0u)lB7I>{Ig`AK_Ar;*z83y|9P$f zFmrDjFP57!sG`vasly4?HRd=!e>W|8MFgEuVN0s*pUG;CE%9KlJM?vFqc?FRKIH!=_74YnWrY}S8Vrt>ir6c71RtwZ^OCec+PI=vyazhn1w<+&_ z*%XQ99Gfwo-CxZDW&&>k38$L*A43jv@TBHA4xae@GI++gaON=b)to>+;#1D33ueBe zc}uPexNSTMI?bYyo?s)ZQ+3$OYTch+W|1pf8V;B)=xry>J+j zUAl<=#K_;VuEX?sIKQ++_mk!PA0mHgKL7ap>E()jmcRUaqW2JFmE{ zNW6tThwj~{RjCtp9$U35M4|(x(A=;|G~oI zqXG>?J{VMFlqxpFqKT)Sr#W@lLDm2zG+TAwm_fxoN$ z_-wQCnHe#UD6`0;_ZpjPh4=Xre3p?)5nSZpnR}du36cY?`k>Q#{vRsb95J*Sa-J@} zRE3{rG_k(8a}+k1_8and+^+)rVwvjfz9XW!Kk97_!S%7L7N0+?xH*b_3liaAHj0KO zo7QC-k99vq)_C!SQ9iBWoiB)@iO5@#jgi%C?v{x+`%0g9Lc32q+-(=(V1C_cxUF6v z&F&j>!xU$Ic72E$u5o>F>rs&nrFJs{nU5b5U3Kw5pmYk~%JQjmO(-xvP-^n?nTVLG z;L*}_Lx07Kl`s5j&`RzNBgf{ht1IYUc6BgW4cSlp7Gu+=x^;CJraC7K#*Ij~W3$W^ zr0@DB%c1jQLDyKRVAdU@vinD6xJ%&o)0p_2r{hbt?lV*|DbORfNPxkkNbLi=D!Q@%0E67`cAvKt?6Hn2F^$vi}N=l3tU;dWNvcWw6OX z9nkUIh;%zdD$~132VLAMBYqA>AAFN}z36PfHK6Y>U54=H==s%LQE)%F3l1f?)L}#1 zICvCGA;bTpGD2WMxCMbBXG3>~5Lg=Hr5=`_Y7&b(#!wo(M2NSxAnd%ttqUe#(JO?F zz|DUDSmxX6wUJl5la#l}bdCgteen<<0$|v^@>>VvaZ%@f#e)7$P3QhC{9b){;YQtk zl-+yc{L#7$V^QhZ#$6Ta|00}tPrQem*}YS_b!pk@fk{210DZC;FIbihRGB_ql``R%?ZpMUH8MJIif1>}y)T)M6T&$>IP1uU%uCttg{#_K z!r@P!lW5Z`g!9{G36l!`rAIyFOXh!IJ0HR-fQ2x7O?WaF zGawPnPBnG&`g!x(vBc!R&Hm^}`gyhH3Yt@utdPZ1c%TA&V*W`_-wP9%_c)$_NwU-I zw)^^sw#h*r<{!s0X;a_+I<}jyMOrXID7uoyZ1$UNX!|f&c@B1&>YyGzUsOkaq)qf$$Ud- zFBp3nc-@l$Y!tao25V}SGm!H#j`)1$veZHXm2c=P#@Jb{L0`=l6vr+{|7iA=An|2r z%N`Fme?J)`f>E}I_&-pDoU+Way{*yG;%Y0{Y+b$VUUiW)kp*Fhf%=Df#d_%lb>^_k zu-cnPl7&C#quE=K<&jlmE%=zAb7ep12UyXXdET5b z7;<-CVz4+tOHwk3C&<7$(JzBWu$DaW{I{yX_JrcD@!9QBC1&5j$6J0ccI8iDLEFR; zJ`>xRD%|Xs4elqz^JiC283f(Bd?^qzqEKTY+Vv3c(qOlbPPXnt;2;(wZy?|ze~)Lc zubJQ^-mc~7O&z%c1W133@r^RI#yZPomsdGgtR;P|Nf&`9s8&J~n*&Kh?x%^NXx@h0 zrJon+ZV>4v;PD6H{!X3lxtER$C`#Igv3KI4Fr$v1`Ae@iK2JOa$@@bDf$9)M))w%p zkj3b98#%Sn?u!f&HEJ6Cq>(YEf54=hqVfH4R+b9G^@yJ-TAm-l_OP#(FF9)6&wK;# z1$GA}J6y*2&iMADKxVBh6hq^v3j+kZJzSh_7_WRtqgVSJ;+@X{l(c$#&d&@4Y4!Nd zYFyVUOWl{mmzWv~b2*pTI9i}Gpz*HojT~liBTGl2QGP~@=~~)vDKsk7*YI1Y;?2x7 z-t?X)vzgwbxegw6{-Ju$DxR3)b>FBrYNtHQt>qPS{Ax*%+Tu&GBr#92J7T~#HW_>r z2CbgxRGG=sqmDP}>p0Ii#AxKN3FprY2X7$!HS(&j)eeLux9MxlDVmkDKfN!j1)Ss) zJBUHgB+tL`WphzT0q}N4Vd|&N+o$yw4{~qhDQP>?r~H{-_T3RP zeJLJX6?rsX+;Ma~vcXwy=)f$Gy2NxJdBU6RU(-x~;qXj<*2tMYn)@O3YPRQ+baQCM zOs>PTzBk=7&6|0ZI8x*n<1qcFT6^rIAD73w;WC7LEf)H2dObY<;vS{lO1DzUT4m*80-bW<({>o6rM(Wb^esMyaSqNMQ+)nNGx^7}TW&BMYs8P}HpX<+ z^t*JS8O}MnCAhHmaL)B@189TU@2s#N>x8-t?Wh^b zBn?akq(PJ7SCOv~i(<$?eOdqg&R5+H#QCemZ&RFy_Kd?K^no7PtB>_v;GuCO=GH!r!ZecTd%jO)HT zcA)cPpe`zWJhCwnDRwM1%VV){aThRv_>*LN_ zap%prKf1SwS=dh|iNg>aRpC;T;AYnOUuAr63(hJ`t%dq}|Foy2=yRM9-k!4ZZ-R^t z8%_RsqsjjTql3oxHpX{*3I4)rLH}fge9#(5@*sv(?SW3FJ@8uh=Fz0%i(W>1)oolp)YP1FonnTKm z&BzD5wmtc9sxKeBd7dE>m&;4Qy`8YI#)OZWIF%1({EAl=r3y{b4-_e{zVsWjA;!3+ z)08X4jC#?aQDNtAjlxnpxvZT+LSr&AXCkOT{?uvdp$Sz>lL>;b&^B1 zT8~U9P4(flgO(d*-Sb{9OPzrlX0hjwl+@|ms>O#!k(D}~j{;ST26w3sAj5$8w7 zUb#?A3qi&Lp`qyM#pR76!)}Q%eryr9@i}ijZ#^SBd)0`4bzS_6NNi6pviVIex2>N&h$k$bv}qrda4 zYglvlKk;z62Oa=|uGHw;BP!v$zn4u7dw|O8r-gedaF=SVUdh!LF}bU> z=p?50^|)}A5EZc#n>~}G4;wyh0$2SsU;>}t6&|nidUakivU{{H0CyDvH#9>h>;MlrRmJ%- zs&7FjCA3P9TWFEJ6ptKMNdC1_y{gYlQJdVyKF2+V?~IS;)~66d+yg>V{^q(2KaX5N z3q;b9EZCjQTk0F{K;5y|Oe^^KU7()_%vD6z#S3n@m~Wt1OrgK-kMSUPr91Tt=Xl(* z+Dq46@%=ngM2BhhC!$%0vu5?bh0pG5Hx475IZIIG$4@kf_pUej*TX&Ze<6NRspQEG zRVAK@KKKV=jxaP^M>!kNC95*yvO7ZUVIqnz31O}$iiXD`i~#{7?t$lqoRz$E@S;B+ zbzDk+n3kxJbE1*Qvimp*d|%RbPbf5KvMV`<7>RtL-~(R4DQgVZ8K=nZkE(CSR`ktT z?yf$Jj?f9S-wi*Njy0X>P^;?C0sQn2R8jhd(Rq-Q^wsoPi{v(@IWu`hAAAv=bzA33 zKxlzQNNXW>dshu{9fldhP~R{Hy2~c_H*?{Qy+PA|pP0A%1B=V|Fdg_yQ z%9;esaR6~?fGnE9^e5_vdG3~(m+#fycaQw;+xR74^v{OOr4L}OU`)h3j)be>DxsTG z^Jc}qIL-4r(BfO>fz7D9c}N!?Ho2@+vI9xZO&u+1=S}w;|Ll#B*40T2p{P3^LejxE zy+N|%0%f^29JJA5+~h~JQ04UAwc$b&;h@Jq!<9YVljwj`RcH))+K-{H#$BkdVlIC8 z!f^rbKyioqpRyW&>XLu5dSkX~tf<&d4&PLg$21Irlmo78$#*Owkq^EoGn1)Rwk-3y z&1&n9hB3-~VFrM?1>vr<6k6pGDrw1}%FK8KzHb>v?Jd~*q6xQK%dil`&qv!x0U)Od`mBnh_`3m5v>fRB1?VuYEkpm)4gs?q#GVS{5hZupZnk!4uFa*z2XcDSqg8-*HHS* zR+!E|RxCRNxR=>oKO)awK(kAe$~^yV^Z0TFhYRCS;Zvb6_oPqq?vGIc+O)@mPYNCm zl0JGqg#Qdf*V|{2d#I&{H_$B1?kpOz)FLD=MF9c?zj&rmiU`f1!4~wJ#kkU~8xI%} zrr*M4~A!2>h%B4|kdrBMaVJZ`{m02zVl){(QX= zG_{mg=uVZ2`rUCws-9-5&e`k+S%(<^mb%AT9XZA>srucQTkCV5&l%k^Y%$4u)}_U3 z1qe0|BaYpf=X%_+#$4E<`EtQzpQi5JSK?a*04)BH6mNRMB885macu^YD2P|fN&#CQ zZ1R4NokR5Qw1bge_R{vVEp^W-q)+k3pUqCzTK7UP8J5tfQ!bDCBu{itA-NG^Dh4Nq zdd}1R*3qu}@q*AWgv{9SA251UJl{0=Pr@{Q62+}yHs4N{t3-gCH~YC4n=t)r*m?jT ztfY^QCb$yuO*1^x`G4=BR2*Yom8Y6Pv%BC7{poZ_ez6(AI*zW%-)JHU8-=OLACRO6n$M$dRv11z3*SlzbO6D+*lrlZmU1c#+?$!l{vwA!K@>F zvU-zKDj%vFS~RVqfIoBMUtz!Ajydm1_WPTQk}<=4;qc+ zUDbLc|IZQ!qWl)BIZ0~ABgVdga(gHF?R9gnPT9U!IqqW*Oa75+=AjB5Kx|?al<5L- zc(i*m_?afJE3LL_NYzyMg&jIp7n`z6XfhpQm|^hS{-kot8;(xqG`&7b;NXP2Au{tvxyCU8hGwtOrJ6?FKqdqyS++XpEVV#+ysXDtmh*)Wazl)n=h4Cj7 zcZMyKHmSgUjN2$<_~o$??kat?^M&1%&%R3j$BSE|k$$!!OQGV{BO|-XNT4Zw!651o z-l&HYwV1%Hw3Dx^B6u(Pq_G;*PHtwxv4KUbl-=wo?hI1)b(q~04pi$|m%jGv6s znZ)9SsUfF7!G)=D=SkV>iZ71CHc!v%=^{dF3nxgojm5$U0uqr|fIsf6i!O90n=Z_w z3wFMEw|+=Jd5?a)n0)VktR0bla6j%63t&nif7y(E>3~;b6cKnDuBY^cQbl;M~6zqLJ`r19>vdv@7 zgy7^nea#A^56tmKFkufF{tfRUhdwD)#aR{4cP*u^c)oDI`ME>dg~xFWwlfQLCo`|L zd21ae$jf{bVX3=9J4!80t=lwcr{>G1B@gQ({JtPEv^ShOy-2ChI?SSUz6hhlc2zc$s+^*R+ zSi&t=yvVk!$E$1x4Agjbo_My`Tv*XKeMdBRCYf~h#;nw(obBwsi`vdEgr+q)#q=lC zqwI;p_73LM2lgGVW6SM-(5)A^P6y58ntNw}C9yH64*crf$4MMPuHE7{-34eCLYUa2 zDgXN(T19$4$&dbwySxc-wzvmbH5xhJ0xHCeY*~j-%q&P3er}Fr3!%e%?ndNpaXWCo z!cG*Un0Ebq=ZV7xb9J(82Q#0F=YJroXkKEY+Bi*EkBP41xPmHIH(oOfe>AFEn(`0! z@Mc!Fm@;%PFQWVFd+p37o$PaM$^2CA$K+C@{Omen6VSPf-7_-^PibyI!dvRZ%-P9S zypH3Y+rR>W@ZXk7n7{dLDGay_ZwUl?hKwqrTdV_tTg|0LL34pg46A<;G zjdwgEuGFb0wvS)WoWvfYxxp#fx-L<;G+3dP7PpQMF8Auz(y!UE3Mo}QrYdY%bTl}6 zt$5`9mDSxUURl-pzbd=ll-0iH9e;k;vi)UiLbH=IDm2o_65U&__^V*|U(TqMup@+$ znJF(PU6^8%1;5x^&MM);<_7V!5ig0gpd&+>ykk>^#8{5gn9XyTROgo1XJ(l5Y2v`K z#vX?MjD|pBI#qIn#MMYb%eesV<{Bh+FcMrCu~V9JefRm)u0iEKebR`*^tC-2OoLze zeEa>Xi<9?ZZ#>;ceQ~o1J+Q=#C-vDER>SiAWM5Y~(5yNv&##(Qi5B(qV0nIy&GUX_ zwMcc)+SJepU*L)2qR65w09(7N(+U3-J|8Q(-&i{w~g@ zQ7iG+sVBHYl=K!WR=yJK81d#7$b~TU&g31S_^M_@P4`l=u>i3hz3nFYvV_pzcl6RD zMK8+AJ#P8Qh=?9-(6Fp4izH$^B_f;66xE2UmK8?PTSn8>CgO;CEJVb2Nm}&Gc(xDz zSOtGT)M)PSgpLELcI18YuAT8+%*Uma5TRs9G)IsFas$vLwj^o2-2#KG=9?PqCXt_UN9`2c(X&INqq*JWCdC~iwkhsB`~(GbX9cj+ z&emLq4O)Od=HC4ZY`YKZ-LMO&UB9|teP#&H&ZzSU<8;cd(zD8A^&_+8>OS?9P5-e? z|KmaFf4AuiZ2FJN>8Zl+g>mU2SKejk9)I*XJK0Ell|(C+AIAw)o4kD;J$w@jlrEqe zUms-XR*1RbYAZ&nMv2gBexbY&?!NV-16wr_oVq1~ZNr~GxZ!8F`282%;dU=@V)utZ ztS$91N|{;Y*UDS=?=`qSXgzas!VZe^;?ZAzRLp;;y^r~CL>>+GgXhRkkViltV8=M4 z+}+D(dVmjNu3f~qiQy?|j7KUK&Fz~A7KeMF(^vA%+2n3uq?qn$5;r&=VMLdC|5ql9 zc7A*!V}r(?V{JFbfIN&JWdpRkX$Ge5IcS-~_-n*Q(3t;f*~X{_!9R8!U!LwDeE!>Z zw{{cyfPtvh^+q;Rs2qX;mviG`_anfA*ipxfkc{S5p8yOM0&n3V1m0zgTxR;Cyl$HM zgaPJojFx*mqh-wPnQl>SB5j%a2N!zsZq7eS-aQ_@CC)>FuWjD3AKg90y-m^FT&DK?F~ci@zbvgI+rTEz-uDQ}C^rNa$I$o4R9=>ToPXGZ z5;8nYj3D7Acf5i1{PNU?w@1-1ax#CLOW~ArM+ZN`l(qbxaT>IFf}JK$4!oN^;Uc4| zcylKJ~JSJB2$Gs-y3t~(l@W^d7)EGGR2N{{!rqvMD=H!Xuc z5hs4iShDuwk0W|*eJ^+fH8r~5@Ay!lbQFp2p_l&zg&^I!+t9%q^1gQJv5}>u&feCR zjR&hw-Zg}Fak9^19@mNZHoK=VTVq4ay_5V>y(;9liGYucH+W`*mKD{D|2C|XSFCvk zKIG2>73-PWXzoO^Tg!kKHP$R_un&l*E9?U`?x+(+XmE>n`b(Poyd_Pox1{;&v*jht zFJzyRUr9R}Q->WUT^-b{E29X}HkK=2q6^Rcu(4-t_Uu{8--Q3T$&YOg2gsvveT}9Z zQxxXhgF(I_`oon{i0^%%(Wa&7JE#~0Z)aJC8$PdC=zWFM-M8~-&v9(ncbFC39q(ZGCXd;JC!^d?$XMQL zSVcPTH}hG4}*+A*v1g+R5!G zTkj&<@?x(g_wCP&V7ud7G_ZMQQ04>)l#)xERVjAg!Tv$ZU(EhN<@cmE{gMZNZ&=Lt zdiy<@1U~?F5y|p z#H L_|Sl@|`3X-x;H=kWrQ2@8P>I?WAOnkaF(JQzWS7#tKOe+zc-hyZ=9N?*boH zdF}mYLWD%3J1AOeQKOADDD@;Qt)}Q{1}0>JflyJwdVvID<-U<&~hQG06eI-7Vwso^H%{r;Y3@5uy1FX#V$K7ag}*?T|t z^{lm?wbrwq^*jV*Icma<9(m@b5AT^4KQ^3<*^)7K$}vASdP~KW zaLsE&&FxJ(@w5L0u;K)=9+~e8OS1pRNCd&cZAKV~a|m*ljpLtNn0>KIXD{+tJmOry z<%9g#2|r-cvcJyHxz~W~u$;}ewUqL8=7F29%3h9=lSK+p*-8o`2W1(g4T zjmik%=WH`VilwJ;a)q~aGu;0Rq>vBE-*zNO;o05)!rbd9bWY*^ux!1_<_Y`%w|qNB zFoHhSB=qfgyBeYDGAMSy{ln(FMgM48hxuDPB)$;0-_>@=+SS+G7!i+QQK4nJuW6$V zWq)^WASs6ixIju{92riW*kYX? z3ksSGc(fe3*>F^MrxkUU?+zz1y9YCors^>DE{XqU0Pg_*47)KZfRW*|SJ5vsqXVcM zw(DXw*>lN8pM`TwA*T(P8N-_Ce1J1~*pue4sPN3(}D2K;F?{6-#Xi_0Dr?@=9_egrEp+> znPcdvVM^cKEWp+d>@O$#^2f)3+N^jvg-sT{oDEQ>y)V%hE;YmSlw(N&yPDNuP6&&J zvt!9+P6P+pL{1$erjc&@D7D z(Tlxr;_VejpJdVze>fedV2@?i9hwfRGX3K*^ow17E$>?O<%)HoSG0$;f`CeRJTG_@ z5-L}x&Gnw1i$xN7HlbSHsex!2wwueS8OvMRx?~e|CXNbPi)}KV{q<%2knYQWK^Fbu zq)bora>a!-223oQA7hWqlyRe6-p0${(U;Hu)L|^GKPR3uDt{T$WagG3GnI|~(#siX z|MbzM3llIHH23EHv zBM`#tr9jcncB2y8wF=Lq3yT}QTKM9(geDCwd#AKY@4uUl=6Q$Fn|i0Ya=D1J9OCSL)bL|#&#qf(?bUzUWbEDDPlt3X+L3~!^)4q{Wp6^jXq>e-2lRpc zHgvC-!ky(qKCBBqXB{{GnHgZT2N_=IHc_0Ne1>M>o-V${B75my)CTQh{*BuPhsa-| zB|30VmOQ9n*J?m)(9pQ`cvg57FyNkDN?%gZ%nxsWwQrK4ndPd}mQ?7`?6PH_uTZ1? z%r~KUiQ*DWFL526#s9T|TbbJ%TkW|RHW?Lo!OnHKEnPmqz9U5O6-vsEQy$*_BRdY( zGII=$=^Y&Sd5p-8J-#1T{^NGD<;d1Fb{wQD#_4PHf ztqjcnkSZEyb>;Y<*|ZN9ok{K+F?TkCA0-a(yrRO;ANc%P*$GwI|VXcOzUbvdTRjp%cL&n7> zRA{2t(g~=`x=-%IS8a~u`THD0Y4KG^3E3DMIjRR-^#q3B7}+a-j!C1s;H~`4?qC5m z({GMwW^dSPEaW(I{NgaDpJkjo4V->{G%&tQIMd)uIDyI(qKQyM6WZVMmORDIu5ywh zfx*tFTx!C(m_jBdA;=?|u{Td6FN9e>sd@s)4WpZX4{}7$=?Aa>K`s~oUYey3!Ryzh z{oplji-DI8vnGFb7{nG*Z2++ctbULWH)|^hOjSb>wEp=mna`a3&uz&ZMg9-1>7W0Q zPPlQ!z`HRcbNX~X{4n?aCj~704%?4GFz&w}bK}r{&@0+}r2UwQR2jhTL2f(OjtcuL zfgiby%wE znPVbG+sV^};N8%kE^M;KhAx~qjj>=32L8=E5v-#Gm@L_-Xt(}HP$g3@*OqK(-oTi* z`9pZGB|*D@eSMNV9bsuG*)IYQoF$DX=FI#K-6vLG=svniVy!XIEia`T?8S$M8QY`D zVUJ#Dhj!dGo8KmoWvpbQ8t%^UA@zD~@ao@4hk`64!*4VArh$yi8_48CLJ3ac_GCZ* z>QL>ys1w?QH*QDtGq<55JzO0+{QLx;>^)w~(KZ6${b(en)KAmRpzc>*IjnBRH&ET( z4+aH(b9e!&9;kr-9}FrebNk_CijGj`f}l+5^Y!wa#wJ77b_6mr+;5ZlO-74n`h za<`o!zyFdoee`C}Pk{HhNhC|Nw~pbEXA<~cMp#zD=nR7Zgy>zwg?PQ7 z;8-^3+ClY>uHoQ(fbzKRehB3??9i5Kq=h3P_0d2(TlTSI?Bp1v{tlaQjK)vx7|Gp} zB^wAxv!fK6n+pbRE7|D22Vy@o#HoAFuVmaE{!m8TReFZfkyh4}HWTf{soP}&WT_rq zV7X(EyQbsyQpTWM?{zP=356C)z>LiTK(|f!>Td?|__CvxlKqOA=#CQVd*6Mt*IncP zk;oN#-DO`V;}@gX9rpFi_o-%^pQ1L*WyV|0SuEw2H{;PbuC?fQycR^ACT>YRgi<_} z^%d{GS)H4Gopx6InI&(IBg${Y8C7`GO+@>3MvW^=d@Z$a5D(>v*{OX+JX9qvCtxZM zwTX*T`v&tcCDD-DH-v|oiQ3e@Vjkuu&Q0wraYo(IOpA%LQ~QqQxlPZfruGfx`F=eg zpW0W-^CNnu_#N#$C_40^n*E8gNGDQDpBoPMf$t;!Nb2PeQY%V>1DZs0UC&AVnzfoXC0T7NGXC4U!p9r2%RY=!mW8N0yh+J=s<@>t+5*HF?KcVXY( zG{^DuJB6Y$EaD6OaybX;t<`YMdy;>YEPZ|AOBfq z3;g3hkJtkL_|HSOz(4rICV&8*{S-$EP1I08=u8mGNZ4GgRzu6crNW$5P?3K2!*Wjw*B(-a$R7LzWV6Cdf0yRi2oe zI%FyFn$#gniC5vgX(;iM)FDfWjj2PH6363o0dX}`5mbrqLO_XUrw-*P@l>Mrhm?4H z>d-L(F&e7uq#*IHp~?*dQ6*8s+EZPJQtgACrQb2fre7Z1jFm0DiB(6oxIh8ZzC0!_ z0x8Mi>|=kxqP1Qwa^qWvALra-O>*&62ca}S7!Ivf5-9mk)L>4nN_KM6*WrmHCp8(X zG?(#F&rWI`^PIK+6aU>B=(vd1oH?qJSl>prhCGwMXiUn;dEFz8{jveWu?#YeV`swx z(wSv;4K)lk1jhs>L$sWWGeAzvK7l zzsmtdL3Z#u`IA^npmy|fHtaT|mB^Azwhr zEC0&JB{aQ}dc(=S_u$xqL3MMD;AIxft7$(rXtqKuv0ow~mxBb6^=Le)9k+wVt#fsk zpb;wR<6L2YJ;IC+A;)e~w~Zd09K^00LaODoX7whhFmk6kgzOH>MZ+!(%mLXe=#^v#SD+uplUl`dCI}mOND@kn@Pn0`gcShMUUV5eN?S zWM=kM(`(4YS`2E{>tLJTpmpE`7kIw;nMc{&u%2Ny>_g_?`C>d`If>?vIv^eqs0U1- z+1dt3>u5{=!q_-mPtEQ^@R7%GC(w{)|FB76v>bBf0_B*E8|4dqMf6I4=Wn6C zpl$C7L(*ow!9$&vclo2C4mT@fwus*N?5DaupxQ@+8LVD!LMze-6QT&rc!ZST7Ql;J zUi*N-wfu=sGqab`Xt+=^*GI3gzH6pZ_m>szWTN6`eoz$jD8z+9!Pa?c<3;~?Toydi zC~vERw~I^%q8D2)nKyB<4jT)?4Scr)AGBu}Q1e~7I#x4$__)UyhbIK7_sR zT!OI($iW~V3LZtl0xAC#GN~*0Y;7kw4-DWger+8rerX&c$Q*i9Toj#V&PbRgB)b_8 z=MXdu@{V?ky(Svjv%dxxgViwKJoBWGEql#yOHTfe*{(~iEA)?gjmW&3qNw|3_OfT~ zgtE=*Z-P9rFiV|yZvtz~t(@jFEA6Of!|K`hw=3-=_h6%Vd~4BL8YQc%4zM6WhXAyI zWAW`Rj;9(1~2xO5F}h>b8D(rS+fKWyuh;g9YZqjx5~25UzF{^ zMr=WKq?I=I6obyZ^~KAa%)bE#v$Pr>(2!cC&Y5L)CMo{cAL(abH^AxL;#aR1q+aSp z_4CKFdc$}zRtj>xovil7MzioA*xi@wC-|;}CGOySo6Q~V?exD*c@vn>6yNM0AT>Aa z`kBVsy5%|aT1pB{)6P|LE7DbkXi{c#mtNrMW@c2hq zNx1AGPGGxs>eihFZStaOwc$BrNRzH=H<10ObJ_zhx2&!^B*noB3|&&(xKD4r3y%u7iKZmlc;6 z%#=_U{{!$S65u44#rJ2Swl?DsjVk;lcK;7aOH25DYo9LuoD;3YqZF*PqT3!Xs|f6p&^dyUJy zzY)hI*=TmXFpgckrV)Wui^OYi{v~J#Y;lI!wI#d$C~h@w-yC3E_PR|+@-6qj4PBe- zOhQIxE;I38{hyFo!KpSar6mI6xE3uSZ z@bUw_#JpOfEcLBTWmBSiwr7ud;ND(^W(;co85yyU zHPRlnZ89v0iB!Y>&OJh^d*xmi&S!vI*=2Y)W75p5PZnuz1rm%QLnmo7 z-v}y}6G$-&R+)UUKWA&TeX??L(5K-PPSJkE|2j;R+7pM>zWev8orO;;M5eW`+q%Jl zkG)QMBRDufzy3f;TXmAEwGzi!ef|61wzA5@SUb7e%^&urDLp5Th!;@O0Ebmxr-NtP z1`hAq^nMM{1M28ExO2&{mR^dVb^nH2SeI)l>Lp0lEyaF(AMG*&{#T&=>=kDua`8V@ zOW&acIY}Nm`mKOQFGbR--s0C1zk{Dmj0LK!1#Pb1$m5TV3>jjS|6kCZ!Pe?6IehlU zbYvf%!QE?1OkT6?(~F_mil4$<(VG#m{K*)X!t+MvzK%ooeuF<=()x`l*ny{3zsS9G zb?$1YB%azgY~Dv67YQtz&!70#S6W^f)jWvnlj^o(BYmhmd3ih+w)z6aCD6IO(ZP+- zPUb%-8k~J?RpZsxMjj|3mjiy|%mDDT9$_l^71aLc~? zjT4$LYMxZwvhNW}JL!q~duIiITlPIlJ|}&idH#_}9nD`HbsD{Kh?ze)`5{$gdyBi9 zy-@1c)YmfKTwKLH2^CsG(WePGtp_LlMUv$xRHjQeM#SAU++ve`_JudWJVMsXii*QJ zL8q0BM7JmFJ}T*X{D`2=JcizKrXm+&7I_efxL=hv4{3n^SU_JqRIeF9;&ERIMX7=>H z+3PPM)75P)`?Tsgcj$VZmVL7C-&ESNPuixFd4_Kt*v(Nbr_Srwsjr`Y zc&7>|ZEk4!GW2M!R0kgCMKRPl=Hm0fG;lLx%>KYH)omDNh`?BMQ=p+%1hsOm*9`Th zQDH^qF8KnMJ=7kiq9A)2RZw({ic(coE+Z{+Sc+zQ^IJTN?8>s70OKZqST@^+6^s`q z$0S(aEV^!L%&SJ;1XCKB-YQLWZ8rW^X~7q(w_N6b9S8+*4?9t5%k}m47uiyPqaZt# zv}MK%XQQBrF%EnmX{Y+Q*Cun2Zm=oSiaNr7$j~TXeNDA6K-Qel*MN2s?`5 z6kfBg`k?QltJ`eexHn0$2#fV?B=@f2B6^=x3Ab&#X*v=fJbel+Alh-&p{JlW*a>I!ih*X?~59*7dmh|^{M7}y37`EK6 z{s%s?KjOOvY<*;bLnZdBO33R065tjib%^lkAQP92yez5RxhGa}u9I1FtPbX#z!o^= zJ`3rUW!i5)o$xpf#EZwUJ$yCF4j$2Xr6*R-&R+lQOf0H6Wdf`xNpS9bR`s?Vd_pfN zsa(8RrkEwgS$G?h%O}ZT&cgd_`r~@Z%q2y{j(ZAL*V{|C zM%lrYF!9VIw(ob*f=md;EDzrJ>E4AiEtZVxV0$vlWi(!FSRF1?@m z>+qq3zi_n>`=~f2W6vC&{lQ%l5eVzuwSWZaYcokg(wt4h`bQsTYIIW{CM*#pGV5Ev za42~kb2h3VG4z<;&jTFv*y{BxxTp3GHJFP8#Dg@WD}q``e1|(JRs);Ts5SG%kZq@v z9CZnp@!F}ep>rxm^xPStpJmCDV(!~`F*FzG!iBRrsaW^6w#Cb-fxF=8CCa0ahJ>uJ zQjQ4+S`Ixxb%`Mt=qd~%4LZM{aGcpuuA-5W)h*{&>|#7lS~>tPZ|fz~$crY7+iiOh zjM#HOLrP+Dk{9p%k-1+U(A#K z8NdR{DZK0O@JMrbn8@27fOfh?0$Tq|_FtkW5%1*9;yO%??vCg*t)05l(-o4fi+1cC zp8cRf^L3lD8*L$r=)lsyN&b=!kpZq3Nb%;)S@el71;0|IS^a+lWyUw^@~?bvvy_SycBK{Dc`skSZd=8`Hp;%xjsmyMN$eE};#p`%D z%gJn_BIdjbyg8PYv`%;fDMx`~3|b$-jYIm}dVK^EHna&l%8_yx01*v0dRG>^8{CZ@ z{_u{SrCbf=c9!faS%*bmd_Qp-As#zkFXAj1&Jt9|g}`e{IwG4PS1w802`8WnXVZoE zNQ5DY1vVKL_(a7bn$T&QaxNqeSmA2J3LD-1*)Mg98_waf9?llrZ*uPE#$(GWV_~As zwv_*EE=4!lG`yjN&68PgF-al!VWi!&d8q;;*sm2sW6sOXphI5PeXYemCO$SeF!COKvpORxH$ z`7yJjjl3#x2M2iIw^HZ)zNfC_eg6TIyP15T;%(s_bHijp<(1PpC-O))<)fv4P?K1S zzcs&HxDCr+5;EpDgkXv@vT(n-*$ zk;x470t_z%*$2Sz?~9mP>xJRV3qXO1-o*!IbLj=ceX0P{9p%nH=|iO8+qnU zDiSt{nF~2YO1KUgO6tfCcb_ZSQ?ix~R`l?Z3632E#B@eLOFbpKBAtfNMhC$D*^_9! zs>nh)5AGJjYKiC9p_pl=H|oZAzKUFKoGEM#7WOqs2Pl~!2LT)Y+8 zWr_8#A*|L=8#&U>L2Y)ye#s?{XzAm&tuC9deeQUr~!{npvfG;LV_I-A9R{ zuvQ5C(VmvqAEI-qH8EXwzt zU#iJUJbA}i6`z(S<@GW2-T$BeiCVBte&Nl_4F$^TLlaCT5L-Q$ea@?r$ z?_}@YC3ApD>ZFX6vME8*EhgzUG%T`9f1F}9L|93|a&f)vWzV6{e)v4usmmmp3qWCZCXKFd9G7FKD*$VU0OlQ^$laX3i z_pt$CQ?BB3!iw*whvszaK(%jPHxs)H2i-(oIV=>1dDd1Pkdc7U(RHFhMlmiYeI*uM z3WdtpuNbhi@Miv6EiC;5Jz6d7TY5AYkU5i5!G)h(lvgpG)ew(|KQQN##$7&nDiqqzpc4YfJxzfzNtUU5HKCWQsJwncqEam}l? zSq}UD7&_fypO!cFeagP@2@L$HRkiS10U1mv;z$1sy#47&4t@G8b6cK0_cJGHYb?HoRD%U3NGfezxbH|Po43k05D!ZLY*kn0X?aygsV~ug-|Q%AS+-)CGVd_ongv6l5sT_OJnE{O z11LeGtdskebI8>65S1jTnx09BbWI9DI zEztf@1Cm2I`lVP%{}_LgO~WDX~E3Sfi*3oQ9Cj z^GCt~LpyIDIh`t2zc50+fSiuyLqJZ0^k~WHZSW@`C$aIWfoN)R*3y&=`BnZClra4X zDadTHfC!MGrI3g?;g~OF&_N`JheQEqJ&x6t~k$s z2G$@!zNq35S z+^KmeMakp>@xH~Uq4isxGPyZ_`Kx?ZuBdXiA1976U>peDKgWuY9Mz8^~qM>!kU;#u%tNC`tHORVlTm^Gw z`kvhflCocPUZKU(A<#{fD;D<22)0bpwo_MBVMz`2L04Ny;|6cSkG?CVIanovrPrZsgHf0HmN|Gy;3A#`?Nk~9nOeawLA?e*u_-k!q;^>&=5rjJo|Xl@qX z$KQZaJ)%du?mwtU%c!iQ;hw~cpRUtvBa`}rOHG@OcX;!sC zuy|``Ix}Dr_tH;)8P(a(BZJTL#5*S1-k6d}@`bg?1viHm|4%r{1E&O>B#X3b`P>dP zV{kiI!u%&$Ra56z#0cELW+)cB(q^QrbFEp?8U*>+{KqoBem3{@C6l%JkL7$VH(&iu zwk54yWB1BFSw!pc-+PaHLwfITW>v|_1-#$i|9$3^zB&)D&y<%ulV5%p{5t=AJ`6v2 z$0%By${u_51y`YX-^sjQGS&HgyEZ()W{_T&rxIo;C;z3_C(ep{6WGUlYP+z&n_HP3 z@fCbbWtQY*{5#o`HVxzRRMzTo>{>l3hKg}g{hFc+j*1Oqy8KFAiH-cCFPyL=Qu5_j z`k${jCD$+W&Hp4{`UZ=g@bK|gxAy}u-c^75{qXXKzdK7ORJALXV}u)E>EGe?9iIR2 z^ndor)w&7?0aed(F?wP>E=#~ezlqO6TNYLyHw-M zF4c!Nu$?tVP z7{-6{E}h=8-+*sPd&~Ye1ji*E7+?1v7yQmc<}K-@`7~(;p5Bz{&9852+3!F_iD|cg zvSt4;p3FohK5E?dZauDL|8RYic9S@289D-p8{kvR{=q8vPRssdl|}QNcsaHIeB<|= z+#2Lt2FZg5=;LOHwQ+*;94|Zh+S+nbm{;5@+mpKvhkx@^;{OGSS|;9`Qs&*+#v9Ue zN7vw*6*oe7lPE2f#BfM<(xkI$5`%}Sub4z{U>{!j3!~_(K#PoR0y2R;qUM!LTHxO3Q z*6cMYgAd+G!evGi#`&sS(`Yfy2t;^Z)f(cE2iG~+WJ~1v|w$$bmW5WrTMjk|7QQX!QF+2 zO3Ryj$q~S{!7FA4?bNY59W`{{0o`+zspGCqoZVWBACBEWjn7)y*jl=(x?T9^T^yO+ z;0}+7HXCYIB;Sr4nB>)tm;_jU(deBL^=IabugN z+;$9T1z#xL6dyY*@j~1?_Q)8(ed`^wtJ}SE-FG|uk(|86hMD|nPrZo5n>f?nZJ$|x zdu_^x$&Z^&{ta`whr+K6%U+u})5GEI=67KQA!j&RB|CW1u zduk)a3C9~h=Q99*E;i|cxrw26lA3ub=ox=mS@InP%y=n#9=@urQ{KPanlN+&+>-W^ z&eSeI-R4cmtAX$RpbvgFFPK}9ELu}P7klZQV!i41=@Ul5^YCQG1g2cPtca|vkmiZr9YdE(Ug2AhBobk1HsuKNMd#Cd1 zU-y<=d-?b%jtCytWXkmvZ(UZ4wh?zTVhsFL@|A3=x@-KDNcI4jT5|iYN`af`mVEm2V@1~HA$YV}gHBM^%$`#!o=_BDu-c9gM5?>@S+I)L?LGsN8 zj~I{m$CQ2jC59t^x(07TrF@3-I8PS>f^3?fremB9oC);j|0X_bv%5atI_BA#)MoGE zzIDv~4Xqb{rYJsYQ};)&ZX=TRh?@Vn*om!-r*?vQ&pGLv>Am-SyXJgED6^bL;Iv*)Sr&gQQ z1}iUTa1vEfgn&69Grmwaf85+hH64ks(((zV@mU=-d<~sDG-^*g zvNo@Od(}VYwXc7vztKPEPB|TRuM7DTSS5eCPX9)u6tD5elk9FZf(io1XLy4M%rv>b zyB0Y5zcLeOX3n3eXPfM|@_cn$&R-7QktMToAe0rG#OX;GyTD*<)OeNW<1OpSr$4}p z^wS1!^WqtKHwt|*33mken>fEe?q=}>85nn0fx84z4ZqBXk`-vSvV1ZCFWyfE%vQW^6u z9MRZ1es-gGQB_zkxI$~-N>Mu)U=V`c{4@R9%{IK|k-p*Y2OTVuVJ3i#yRrLq@IY8$h;}2!|`}Gkp5W?Esco03xOx!j(Ssy&Yo5@|0~Y&c@bo% zWChVKlBXgm>^s$6SKT>k9Uqqo2Fas1kH27&G$Mp7B<)}EQDHAKKjxudf#O_&K?_Fa z%Rfcxv|nu?Pz@=#jSRGQqvLs?BzS#muO!)uy`C);@#QPVUc`FkEl z)-;Vw{x=WhHBIHo2YINdX{t#6fQQPOrpn~qJdCbs8lC(G4^=fyRmm1s-7U@!+u;=} zS+)C6%fJuqDSD}tD5F8up+O-f$J`fj5|!!{^}cAO9dw+I*-=z;_jxkl>V>RG9Q`gQ zUz}bsJK9|OXdQ`nVM8mJbYcCrax*4`69Za6M#=NP4cV=|diaKHekg4H@LU9bBj#x);HXJdp4i8v9TuGIx&*CJn-8s%x~zXIyN3wUhJ+w%bw&mw(s(8 zU3qcitaUZill(O=(|MYn{3&%r*T&kll+V?}2Rsx|Yx3s-{nMXdc!|@45hu@{G;0fX z@~yKcy0Jf&HO^X}>WFloD19jIr6i^1eZR1^Xq}BnMeLzo{6*cWm^-%!g$~s*`{yn4 zK9A`@aI*eAGot{1Rt?TCg3y5 zR!;te9x9#1rOJPInuhup`D>Aim;@s4D05ZZyGQx-e4ev-9vQs5HMIT(XV`*DfKw@R zEd}+e=eV=@XQtqfKUDBrwxALS;-kz{D5zIGPj?o#k-@wB(GL}zZwo4cC_l?6t4+aGA1XN67F0rN-?7R(mx6lL^L%IV`DF0!e&$03D{Mg}r1s&Ex}>6+N6PAp zUZtS`TT}d1p8JEy_yu@(DL$@^{(d`l8pYDQ-^uq+%*=J&Uu0bsA>jX4AS!cuZ#;!aW>x8D$Q)%9jyzKh$61 zvo^%nLeqSi+d8ojTiD9khCzWNtIGTdY|2``;BM;Ol5U5qVi9!G^;8$N7Qui=B#vod z53AV!h1p{-@Gh}NR9OiVM@JvmZ}%Na+k|a{Di+O>XPSc;?|x zM271A{MBvayo+~VJB}#w*Sg!>4h1tSm~U2z`COcqQEZ@&ou_tWPd#r%;uvC19ZGc_ zbTU8UGf`g@rab%jf_r;oHMx0BNkJr|F zNoa1_L1z}Y7tVJLNExSp8DEeOjEUNWn(&9IGWcP^V@0a0P_MYx6_{ht{%#i8ntRNI zWUeR4k1HKd&4S0|n&odLeVLqR?RoZ9dc_B{!0hk)ztgKChCC)r@_(Y&&Nt}$bbG-dOcaM^8EFics)$sl0FjdWqF^? zx!PxSp6;gO_Keq1KS)#~&RR_%?tR`a=GkxGJ(T|JcAmguZEW-0RS{$YZgKBiVb8&t z_j3J7vc@|edtTthA4&eYXFQg!UtoQ(hf&FGHz`u_#zJR#ZA16BLU~1b`g9}~z4=e4;Q>!`ib&E~DHE&G2BL~5NSt6TOl6OxEC8-+GlEW(pSK0Z2Q%3(Nf}G4!kA4 zg;#8*=k{-~cE?*ef&`V^!VpmxJ|4mY85YfXu>?i$;-^uqI?%Ws_hR1jA-ugOwh0h( z%&Vxv>RA@V!#llkjZv4N$6b-+Z`nMkD9!Z5oXKmVY|auCC#?uOF=zS2hG@;ZQD^eI zsAbMwck^*`mdDtlaSg;yrkkg6Z>xVjt>)w{u7H|?5b*8ufXbS24e0I5Bp_mXNMNpE zcXJ9CrT!A4=mS;6x$8Bm*1VA>a%{tM>Ftq3fs~_jMz)bXx~Hxx@CU`&*%A8o^^A?_jrwZ^BSWyYhq3lm+aQ|tcfHqh{EklxnyLH2|XFB z+2c%pt~QNv>>@SiEU#~<+3Pf|ty$sR)hzJ8U9%#(Xj(%pC!S7wKb);AA!rV*<5fGA zCttUH<>tfj2uAn?YdUG<68mV+giis}JIRB&>^x&t`noB9JD$Rs>v=>;t(iN*$;{$8 z?)^cU0N~Z+8ACpv0KzA;Tis{kFQ&hlcEb}BgDpdVG26Wjc235dos*Tbb%3Wm5_2Bj zYnTQ8q}n^!9d(}27{6)UwVmacvSs45z9NtT@>D)GN&R?-4tAn51+mDk!u zH<;(FvL7~;>zJeknIkcLG4$+!J1QKv2Z!_pHp3-^f(0OYTROswO1%DU4=ws@% zXZ!mvroZd*`VUhxHjALQ;tlv$w+@qUdd;&=>pW_TwI+_j1T?SFQWI8Fp}-L+Dx>4f0+_#A zxz^M-h})d5SxD_|bkbiY*|{rY(c=WV%E(En;I?n_`)@L2n^D-|-1Ss0<8IY!GDgTq zof`#%mc1#19Yam-*DSM`<794Ow0W%0o?_g**PLDlKmxQ@%*#*Jis`O)GQPe9JmnHR z2m@G)r%W)fMhFC_a1<-fewt6QL9AzayvCxJ&e|B*5aQPInUHGaNq^3cm)L19Gs^xW;IsyNYOkG|x@Atm&74>_OfUNoZc6G!&1z@T>TrgBL;vz- zsAjD*d96Y4mxY4P@@Wk<`<!vyYq+ zqSAZR7VyzCa!m{inn*lA%g6IM1WZ<8SS;cR*`DV$52?Zlo!=h@Ipi{v+6tWgI(jaY zUNkc7$BFbg#F9HqDXa;*G6oPvt5*VD&@ zt`0jh(6W9D!0;Pws>B_70Xpr4qtq+m6 zvsEhaEh+?Es^3bzTsR7G)a(qeoc*(QElC*#XFj6TI09h8)iqmsWna>=q>NtH`eF5Vi>diFM3 zP6z*rX_isY?fxwn2IZrXZNb$0g_biKDjrJ>dB{4N*Br7o2GW+3d77CuVM@a3E$UzF zeVjD?OUcBJc&Miwl{mU*{Ee{Y57cZdvZVRATEtOm8tQ2v?wrOjhlNUophNM61J%ew$}vn*76zj-0Z~o zKi8nNsQkC`)w~TAzwiI6h=oNNvilC7y{Yr%-%$`r{>7Lw4vEf^>~~JfZT_v`iW|h% z^@%5{x5Nol%)yi5>+<^R8<;Z+W}-@A5E2RlTPW)#-(T| zDUr4HdCYoB0fpl7>J8fiaQ4?EkwFT5)m?3wC(%06H&`LzVQYi(`^3AOuZ7QORE82GsqQpZ*iIE*I6W;Xz9x3aJRaiP^ zZa<4Gsjl7Ruobr{Ew`D8ox-c1LN6D;BQY)58sWT?^#x^lO3eJ$ayIpwIQ;d-jlQ-z*t!N^*#b_`n^c*;AACc-d4*|Mipsj(w z(LI~d$z^woowfm`@t*edibOFkWSMhml1U&ZVKroOjGL{K)+sRk=|zOBz8m*3wi0Hs zn{W}ER_o&4@C{P_O{j#ecwI&ooH(h55E$E?bRp#%QY(wPpB7&9Fs6tOK-9`! z2ghpG;ThRF<{oP1;HW8npkHOh$>N$=MPshTj@P+IiTgkHlpx}EE@#{YYSl?U!Fofp zPWr3nVV#rSzyr$X(PJs^q(?IwCOFs$;Hg5*5E!LAdnvRks0Cxs6p?80(ab-?8^h4g zGiOpkpGAWar7~NX=OSm3;<(fiCLcbpiRrKtvmU`V^A1UAVxP^UQM;$_c0^4mEPPEx zq`Yo@*+gSstn;H=XIE52Yc?l~comA|KQpV}jUhUg^x%>K;MIQ!hdsbjwkikXsC!|hKGRU_aJiu7cMvAc5$t>h4^)h!h-o}Fo zsqX)nPQstyU!35xRaBak=u;}~pUF4UgLaD89aSdjf>_*yBu=`DF9ypqpWuo5qZm3f zbyRGzd@d5au-rev)YVM2P==WqCoLOx)Bwky#$(9uwf9)d6fskknio4M{&tfkCMs|i zokt6xKbvH9>q1_%5CAbli3a6}o}jnZ%W#ft{AN+ig_Sf`@Vh>0Sb;(2fDjxyC)j1) zgD8EUKZ0*{ugM6i`Hv$F=Jbjk2qzdW!1rYp@<0)pveTXFPprUV&lJ|ym6 zLqb63v)T=#y)`XHTjj5yk&y2(PwSa=xJ7E?Q3m9V0=Nb0$B=7GiFUGF-Imtn9mRl{pr*zgPRXvSXjYu+K^AC;UdsP!q(I)duV&n3{W=-j+^$i%bC}Ho2jX0o0GXo z{91*hhRUwdt2bi=tPyE@GNrs3MVS|!%<()r591#+V|XC*L{_>piWmgghABNG*Bw7i zU(9}!k(Z)99nA4t0EsF`+A7C0G=v+V!+rrn{kUmxS|yU4&^EQ>V5d(bBVvd+sU3xD z>$Q=imZK%>B}^f6A^1d%mqOGWA~%2hpVNxqq@mzZXy{$m0O#RpL{gKeguM&7_#*;v z`Y7Nkkt=z*DecXxz$0I-bmx4rHEX`p~$tyid?Tt{XZr0 z%|Y=`lr)&4{ZzM!J^~r%VXmW@F@oDj;80vZbTHbUEflaotyoD%07_tJ0ux&L1nla; zTl7F8YJUMW5Qrrk`&Teeg0G!AVgb+}E3_JuxdPXS4$Qpg$;nRUzexcvqpd|{dBXDg zC7`MuhX4Y*G|`d{ zx-Jaz1xhizt4*JUvY;gNC7Q70)O=0VfjnyQx8(R)tY%udlhH!b?V9n9oiW@=8$)~Q z<%6+B)2jRmG8_8Juc6Jbo?0PtNIpaSr_9G@(?0k|#MMN}*e2>fjh-RphqKCT)UJYVnT{B?v6=)xEG7nM-r%ifUb&NA$OB)eJcRx1+hE{BkwlCd zi@l~IgHR#Hx6>$^R(+*gKhj{l7EO3lKYfeWP}vg72lFAskM^vDf6US-7L0@)eV)=x z%^rUWpX@k#>Z@4T=kiYbMO2;mTFtcKiEGJrDA;>$rnACJQy)MYovUxHt?z&tGzf7V zDZ#!E`9qedqvrw12vF_lSxRMPbtNT<>Zhc3Y^>rXBga_kFoNdN*Hr=G6RALr6(p$HiQ6rqH_oveLbG3zB6pseU)(zq;r zL2-0K>tf>c7)~bX?~-ImakP_Gh%U`#<~`Qa-7B^J8~iRzY!y|@K0tpdr$ISs(Vh5w zlHalOMn}!H7fyO`-(sBjH(^S07E7W3U2+9<&_`b|Tz48hWc!7nCYoabq`ugfp(@ut zXg^&L6s#(tgZeTj(?#Ao_7%Ytx}02W7w3Aip;NP}QnQnOolL<}dDtqXG9R+fFej7` zR!W`6tgoVyoy-$W*SRa)X``d54M(X>`T*E62AI=OA2v9xNy^ecAt6&Z+TGml4+7N? z0-dzv>y90T#3U)%klIiz)RP}{01sGFQSytK_7H;0)gtR2KxK$d`c;OZMvRuM|mvB9ZB<}AMkLOVptwEpEhJnG!T)-E(&S#{T zf#>M0XYq7(TWpZXr@~mO+@=xXdLfRZ9bzlLTNs-7bY{IX-fbYF$QV3yGUw;;#NxY_ zGH>2Uc`l@1V0>B}Mdl;D3Z-Ub{FiGI{)(vvH=)Gr<%>Tje<-pC$8*A11Hkw z{xqOkvlJC@Wkx-WM!`skcK|BYA`()m@CHec_5KeZrU4z52H&-A!%V*v;tS1jRGD~5 zO(W^6#GWyNK^vd~whPDx?2+^&4c1oxS#dsA6TXzQu=wwU`0B1SRa8b(Pvb(4&)%Dq zWro1|mw9qwl-vE^@?_~SJb&gk4W~x`SEd@#V}HDUjRF?0S=mwVI6F~acFEKz+Y;%0 zfXgBVv?{$quygo-mTVk>e=*2Z>CG5j^B4F#Sz>ya%L7>TJT}?$Vl^+`_GvRkGb$18 z`?IP$LDl}#lv}SKD#TZ6S}79cF&3>~q*B&@B()Z)r+?EVKF|!)?*XRwQ%uI?!Tbh; zvh)~|6~ftGV8qa!v>Z4j$Z5>j4*`!i14H$w+pUca(hKk11%B(dgt=abPHM7-B zA-0^}_2mf_(ziftST?kTiRXaW{`?Q6gDhV(>3fvkl$Rc@+3KXPrQ?SBrMuKXTA7dW z05d6#Hghp*M$17cU&0U8){9Q9pQY`3A6qE%J3zTUAwe*U)m$?YxFlvlBnN%P((6kH zc+dfUXN-;K1#EX%WzwC-o&hScNJ8?~w2DxJJ<_W1JQbrqynsUhmBnhFPu^AYLefjU zR$AM9urzsx{|(0dP+_uybGtJ}`%(3y?J&BK{Vkx2Yeq1UQ8RMrN8+wd{Nb( z#ynq|j!`|)bf$6iIMj4Lq}%J1;9)c)#V4ofT#2e<;355 ze<>>r+)Pdh0oG;#Z_(a+&AUuFHj67r4DA6hMc3FZf*D7RbT_7Ud;stxwViL*McR?F zF$}O%Qu3}8<5MXd;AhV6@Cs11{VIXm(60jqbj;~`QgZwzCx1HWm8JySS?TZCksS1; zmRLHr@}#i|%qz(|nB_&%GHxr227hWz@YC@}Er$h#4T8X%3LJ}u5kOaHdOF5}4vyS}U9IsL&j`%?j4 zdekJ+yz48*UXLCXS2)nAs{>i6(`Hg6`#BFVU{l$Rnf#YFDIPk?|#Q9E=$|li8dz@_?gEYZBV=LFB3NZ9Illz$Q!nU#GY%WIF>&-CHJQw?eMvHE z-`#G_I=-l$u3;4|$GIqT1^q*|#B}-tYWEv>RaOPs>3+0t`r5qu(ORshRazz?L+k?# zQp_T1wkxR;^JsdNMh+dHDdI)$cQVos%mQxa6&y;v0)!qVpZW#gL9YBuvNIGI3lpow zigkffl#sy~HP;o^IS+TnWQhbRcAJ7St0W%~aU{NvmPH<8mKT;r9A9REaNX#$i^vF~ zsyEXisXM0I#wk>z@Gl^_Z@@Wv);_Y@l|0~GKN3eo#3(u^gw9;WgE%J(Y?)T1>oLO$ z@Lebc(MY>lu0cL`CC3}uy9-mV6qanKAiKrD1q9Sg!$oJ5*J(LiYQDUh_^dfez$D4- zK7f#q7%gV zf{Kxb6W{dajYh|=*?8L>2oBN&+yy5;N~pCyUewrelzE&}R5VB{#El))>eMzd(9X9`m#K&2M|ow3)C zNPO9FTb<^7We?ko#?pTy=q}`gG3zV?vnPR8i?gYZq`;zVFr3s^8r|~F?+!uG)}~& zax+M7Yu6z2Sn>d)e42fskiUXHsU5pP9J{iXo9@%DpI) zz;^R7-YmQT2Xf9UA*YfON9*)DxQ|~c%#w`W+SXx5B$2ga#Pa8HtkwEP-;*?RS zjX3ptQpAfgI%VZgQn~zZ zDzuMsE7Pv;(@e!%dE@xI_74L7Rg~Chr3&pU2@ireS|%O&5Sb|PQ=6m3=Gf!zqP^~K zTeuij`6IJwl9cmx&A^Og{gzcat%GhJc)tr{QzKD=YB@}To)5Pv{h-3XAk?O;! zh{GdUy3L}OJYCC3B8<;~HO<(+$f4|JgQ18GhRs>g zO;3;>c|n$y|D1aC?-aZIN&+za_61Wuunvqf9mVK4n$7#gQnj&AnGG@p#LDTXW-{C)s+#;f>$Vx_ZRF|R6nr=PDyR2>CHW&? zR{J()kK_J`mR;0Q!zN_rIUcNi{%Gv;7_`^$AqNlddb40-|G-EOAx2#v2D2^}dAiPh zo^G-i=oh*(*bCfISXc5i)T&h@^Phmy$T_knD{RULex=tH`4Gf(uBo^=S{*5dX*E zFF^<7&`-2v+Z)YE<}Lf;q)+56m$af^Eq(A~{f4NVbOrFO*)^4O3UuFWvB?g?QZEcP zdvV|9U5kASzaU!j){vAUiU08CmDW{n(d{56iR^ zoza;y=EYc>t#@Lu11)3VO(YH^FZHRZ@a$$fBEB8&hs}Tv4L?nbe;P!W3DfdrQQAWg z{aJj`sBkDmIt<2^kzJ(wQLW=99~8b1Sf{%700|>R?iOu4Zu!}+#C2om!HSFsnD_(} ze-!*I@fAQBFtfYpm?rf$e*641O+Skgn?$hioE0Qe#4?>r1<^0CT1FBV8fMcS&8;WJ ziMEi}bT7<}H_-;|QyxT4j8N(0P3dC-xR40l!$-gRtigX!bu* z5_Y~aJyCae;wPG?Y6#$wk^Rv(XIo6^3&q#kRDN28sAo52 zsbza)JN0xw72-R%i$yIrIN(jmX9fasFrt9zI?Gg%g&%)|~C zs)DrTiE7JPo}q2~^iz$-)Tnb&el=`EL}K>k{HZizv;Brd&0zv*_b>jdyw$l|qs>B> zW7HFyU%qouce8zSH~7bs)W>?PKG8GPylRwT!`T;zLdn)evrD z>V$NCpf@pIqp999$?fPqJ*1DZ(<>9>$4(!eXc#-aD$$f$5osWP4G48&gGacy+RCxh zD}alJ`3#<^=i&N@owT3xW3xI-j>6<$s3`e+9*dG&sg85swPT7Czo0f8Tn=2vov;n= zL8MF;UFXi@#0pXez}2jMnn9?#B7NIG$cEGx|E=EAeYSq-C&Kz*mYV6TPS2YMOz{PG4`4u$>k{e9FS5@~2bV@c z=$Y_Up1!~n;UI{sDi(X!6kbj6f;OTSSW9m_P`BmX{$O z@6x&E6vZK{dU-d^2~YGB7%kOHh>M4TlsU`%5za1y<4)%1lru*zc>bZDUpL*Te${=y zySmN5`6wpH!1>GO0XT2tA&N6O*s&^7)8Q;$MfWCob+s3IMO`79tTf<$GTu7B$haN4 zJ2_PM^h?mZH)%?DyPCb{o&kGF9&clXBJZF%R%HwmgQ13reflIN&5Dr#xD&VA0^X;1yN-f&2V z%@+0q%+q=2|k`l}o%CoY~COm$B*^~c`snm(pw;I)QH zG4T2VC~_W6{lM!M4y*Ko*G|Y= zr)T93n?s1@)bG`qIG)VCL~buRe~;8EUf1dMk~z3gM*$8eci?VZbeIE5$FLZ%z){-5KR9@2{Tz#q?-`UabCdWt`70%9bjePF~tA| zcswe!&BvcKUHu#QXiS1e3^Z2knK0LmZYPTfQAk6w!Vek`q)?!#|B8;;{U=7DjT!@#+5th=rK z@G-14liFb?)gJh;Bl*!^51ZHhSYuByV+p6ROmCOkb5TrVgx5U_n;A9#cz+j{WbgJl z?x7IlnbNtMowu2YXGjcYbUlwTFPUh0L-^a+dfTmdDpcdH3W)tfuX9n#Kcu)hl_GFOtVflEUg-QH~EWOFp@qy~bFHgd8eFF2=y zctqV*R0w);hQBmfwTeJQ=t zJTMQJh#_)KO#|17X;uFW#b{S2b@s-+`IXrDldF2_S+$_A>x;sP*x|llt~ks-`xe8) zQ9A}R`AhbVF3rs)Q@Vf2?6DwKfz|$O{@7Om-q%%!S}SyV3xxz%`kDh;1Wr5T|Bx4( za|mq1Kc7GLwOz08>a||g)-WIb*Z9LLs>i4GdX-*TFmbL`EA9LVTH(`2skr+-oBSZ{ z`gzF|w&ADlb2(~|<6ITEG*_TpjgRLKT_dwh zjlTBBY<1(**jM-?Z1?|-nm9yu3ha1J9{&X!*D*ctNdI~&Lcn!DPfq2s+&Y)nZz3Jy z3`p3-o^cj_Qhh##5)H($wu=(M6Gl$r*sajR1w9s=={M4gKpsfM;4z7M$t@FG>j=QT z+Mt3C@e38=UQsq=wVN47B=NMUGUmR_jKAL*%=j8o3KL7aU*)$b@!Re{^IM#Fr2CnW znVfx6K2{U?wJ#Dzh}Dx4+^-k}meQeN=gzwsi&r3h<<=B%K1$XA=W}aHC*6-EHiQH98S3}wfI)68&xH)} zWqykoqNKXw#IL%yG`1$`s)%?`_WY0j-Qltbhp~O^)cs%L-aS65@>=+xK!D+*JKCse zOWU-awn^pKU^y*Qpw5N~?7@k~3ra0&Y*Nax^c<=)iU^o=Cc^G^FsId1J*OAWX?yBv z?d`Nxyv2k|0^Yb-1+^+#t9u9tY6}4^`F+=V_FRI{zVGj!myc%l<=M|=J?r+YXFY4J z`VsRfV|AZ~?<@}D1%2t<@u7|t^F@InkO<6Fq)#x)oB05SGwXn1O`AiHjH+HvY1Co~e!gt$B{ShZ+C6O4cRu<_UY-SIarKK@(^ zmKrAZ6X;E?>^tbWUC{Zu?gFAu|^wQ%Isb3Ggs3Z8r zz)l^(&jz*%@C#8j_9V*SzR@Vn1-PGVI#xGKe<{bWvi`lSr1&@BdnE3@1bp{kP#A_^ z?}D$Q#_IuEoJ;pmsN7Ad5r>{H^y@m>LW3Ciu;`yDN8oj?!0Wt{&alnOH3vO{$rp9b zt$?5+MT}>m>?5uq{Fax44z1_ih}8cE2>;6f;qM;Uk?`h)Ay3Dfy9B6N9QM9n4|}%? z3X%txnDB2n?(1>ys)@{~9{+Aff^n#K9?Yd2T~0b((8cPMSbL(K9zz%&M{(Xo7zu|c zC-as=6rzumK0yL6r2N6o43%;71#XO5#*xyetTh*KuTnf98P2${({QjzHQR)0%J~K? zV^XR~;MiQ`8>sGMwNol9kIy$=YIFxxcmE|z1EY&7B!3kk-p>QX`>7zF$ok`P#k?G+ zk+H{JGG+=7^qc3v%L%cdT7c%M$jv><0Y>ZQ4#c@CncrvVs*7KM8eD`#Ty^4k%?8Cc z37?clf-!|Stb#X?*re3?GTsYIcmt!Xp=`h?kHs5Kp^@+m1$<8<85&;j|GFo@oo*fR zF9u%Vw=(s!fv5Qmr|uefqM+@(r@EX`{QuN;R{q6kJ9R~S68cW+3Ur;+Rnx9)NDBIPm-9=s0h@Qm*67Dln0|MHxwbci>UcLQ;1QY!H#3`nQ1x%9+TI z8;#g?71%q`T}3JT@WL+X-=)&O%cOsom-p}2lsZBGlDV(2#u4R94&m3mSl+RpZVy2I z8|~N+2X<)3)($+P9sAw@cz#$_^e1;iGx>GOH$_@)O=?I0_f(k)Nh23deaIl>6UT~a zeTxoZdlgD_$J0VNk2`jwuJs-R3&jfc;#)HAgPF&NhS3$QX;SJu!LtjBbj2F)*OU&% ze*(I)UEeGQE-5T)9#%B_Wq@XP2Wa*`15dzYQU#fO*D2+wc06K3nfiM&={@ugne?$T zy#m%SDb+0FxTwJQ;j(+)G{ZQd{&b|IO~2sZQed_Z=}3M)@EpIDshzdsaD)T}!iqV;?hi$-jYT5)b452+w-{P>yFK3Uca%cvcScDOLZ! zVLmok=M3X;zc7qVSD>9Y5oe>w+^*q985>-FleOln+#Umm%Z1)rgx*?<^adZdDS1LT zTpz4?3RHK<{|HRjEO|s~r?v;I{pU(`-y3*LsqWtgWYrW-eP`goa(3`_v`A>`C=cO+A)+@n!&?kgoRkR^BOhcF;s8gslUXG;PZdBI}n zA6fh-y??INR2FsIG`U9y&Iss;+!Um8Fz>|ikeD#@aL}zt<)y|j)r=r)`^zIz&m`SF zl3Ad63AXkv`m+7JhOph<)DYI-g0ktKbQecz67HXq?!JV(U)DKt<~re>;Vp|tm&UE! zNF9ou?sk%pxAWfEJwlC}nBN&lO?NQB$eXEgFe^s@NMedIkNp0{#zlq~IF3+9@z zhPn3U$K?|NE0sJ#ZB=q{%D^1M7Yg+;U|GILm&I4?Jx+y;I6YP?jC)JVYurq*Ytmz| zttC6jj{8*pT;NiIN5Z>OV9QZS)EDx94V-S;HIO6!xoS1l5e4=hx{13O@W$RzfOPuz z`PW!iH@SzL%;HEDAQW7Sf@9cQc|pv)bFl9o5DSLM4tMV4=TK!#JA!{0Q*6wvjyH*j z$gdAIPsJ%PSIt&rV*~zdxJ@=PKXX9SN^&=B2)DO19BPbyMX>&+9<_^7!BE#~P+e40 z36+PH%PBK(31Zg>u7#W2y;$Y*x6&_nL1dBxYOxni%G)^T&;TEDD8;mYHSBcmOOGG; z9I0Li@wqQG88|BVSMC!CG!gb1*$#T^R7##10lbtJ6ye*gR03r8fwePaKW2D6Uy83d zrXHC=U?=so98=F1nLti@FJ$6?EuE%|@#xXG)pV5msdny4wtD_d)S*}7(LY)_akV5( z7uk}9BDIrCg&=I6ua3+2ae>AmLz68HM;*73m~f+qy4nGutmp4ZM%W;MZck~fcqi`u zv3G#*NPpmB``hwyxZPqmAK$M|M$XB<$Rb@vptc%JBUgbxc5Xpr zXke4EhZp1X|5f+781fw8P2#42`W`^|EA=%7)OVTStrzkZ#mPIv`~5%J6;Wy>8Fc+AqQu2YnAASdRClCBCJnH#vbaRs_4@z z^HlREg3au7rg45r+WJG0f3g&Fsug?oJMK3m+BiZZ16b1Dkf4&T~Pi1dWdL}p5jLOB>_!2C~nn^9vMk)VlS{sl0e{mg@56TU&-TO@|IOcZ>UZ` zPZFN!4K?Yfyk!%kH%v@F?k%g0-cXy~UTE&RaGqdc&mj&%I?0 z(Hk1lKlbd(GiO#>-BGLi?4{%ImD03cvCyGiMEdz|&jxZoAs@)TMi73|>pn@c%hv!= zdXCdND@I76PfcrVUO`&Jd9a7-^@hn#dtdqkUz9vV?tVs}mlM`78?nH1{uLB4Zo&mV zCpp7*a&T7AE}XtgQ)esySf>22O<5pA28pvl^fM%`7#t)_N*1@*gcft3ZU58O`t>}m zAxA{VVR5P=V_3)GYP}$_FH@;R;RZ5N{(Or1T#WNvw18(DTGiZ>SQ)cUsk ze{v=Gop}elxomX6N6!dpFb{R~x3Utb8EQ=@Nda7`w(zvwMiA|J|-@Wp81=o!N`= z`Soxjv!7G$@8C0WA)nf%klMMWN7#V7Zl~>?6UBHR2k15@0qp2`m8tbQitOijrboJE zw>y*Kc;7qfIp!GNzuds(8$I0O5|^nU-%vqVQb$L*6byMv|u zk*r7p!njo?yc-Jkj_Lh~fQf!L-@p_ny8ZQsGD9O$7u5HWVupPQx)NpHtn3f?77lp0N7dPk+L4p!GN8pc=N8nG#$s>^dPBDkTIAO9!(Mr-8c7`>9z%l~b#-qD$ddQol2?TP| zp7~(%Hj~1D&}BTB{K({Os(nd+qnZ=I>ij3bp+_eJ`9KOKEBgsXCsV3Es_)~*y9ECY z%l#0SjkycT^OF%zI!+Ft)F<)rC?ul#ATB3vPhnn}4`Wpe5|lkope=KLBGKC8CGiZ| zV!6Mg&txUaUD2i~P;>u;f#)&=@OReoB2MzA0zU*DHt`7hs@$NfIJB}2@oCKqh-x;i z`Qp?ycFw7YN4KOd_bxs?NKm!V-5;;-m#k%{OMa^V`~GfDS<+YaVzE}=0La88L+2e7 z30V3Dj!_NhiGT5CEA+R(zZ357B^AKi3HLAJT_dB!3fhd76LTkMcL!r~W^9{(Ev`1c zTzhkz_H_-DxlFy^TRokN=<2EbwbnetGs4ol`mlXnt(37k#m~mN=c`L3JZ$F^+_XO+ zb@HZyS#!LZRec$GP=SHP=~twb*N&TM=SS&*YZd>f11OV3W|R1gId&lMRDg2 z{b1l!ecUb1-a=pLbBO+#*;q3yC4lM;-bKs3S8`zw@uMpC z<&VPeNV5Z6zhU4SbMnvg%zUpyi<7G^KauGv^1DRqW0I#ZKJAARY{$Cw7XBt$kBYbf zPWbx7-5&~2ochDb3KXVC{AZ`PkZe(bke8V@^gB({3^}dalDW#KC{I&XWVu$}rNPQ_NglS;i(7bTyesn_uyXs5Ww-6p(Nh2ej3g5eCL3GK2)HvfAC48Jrpi!qKO^Qk(tN;PHa+R<; z4jamPRYw?uvRdBHW$FxX^PLSLD);h{xdqxx6T)93qH;jcZBg93CH>bt6|Z zq`#CL<#FTEkI}~pRIK-s%xy&e6drb=%xZ0EvKQ+8GCZztn zw@zkRO(^|*(mN~ZosD8dzO}{$>Bns&2Q!1D6T3>y7OU1$8t#V#6%86nJ&9eYnrY1_ zJ7ctjBup+7z;(hCXY5`j8PFzEfYOU-VA0fVL;;pw-}AI}&qkaO6uMx%e;0d*tS2#6 z``_czp4xA9igL%!k|Zsqgv7;W>1j##FbTF02c(a1$S6Tu@uMV=^Y%=BM8{F1F|Y49 zD%z;Tz8w3eqzot6p#&DS);wamLu$H}{NL0j$T%KRX-Xi(TkC_tWuC;4G&WZFf=^jYd`zT(uEuWsb=zqW(20D@#tV62(4{}IF zY&x>yw=?}Cl2NQQcvo?o$jweUXT~FS&d3GKSOp<8;crDZDMqq}Qi6i@dr z%HWE0{*ypFFTP-b-epg_ghLejc_7mzVU*eC1EU3d7jdUZ{Z(G)ALUPJ{Xg8&lz)g# zdMX&&CZDpDIRRy*@hOdyG^+ExQln&0Dd;P-I<#%zk7mNx00-S2d=smR?vBg!gLZ6w z?5WATS%H80R8H5((ZT!^lyUHCkofBh2X7a+Wj8Ap7Q4~$a0-|VosV=}^8<<(fS;^| zeIz3bNQS_BgpRE|P6Il!tcGe{80u_jTvFJk_bR3H#Y%WzUv=eTIjV zx8&snlbYL-SlVg@H8sz7#}Qq5W`9KO9Y>S_WF?bH#~zEW2)W(-Q!d0LWhLF0>50t9 zLQL(%`avzq?gZlCT0$hT_v!RliSp~Ro83ne-#YK&-ZshNH8Jzrn9R`V)CUNs+Sf+x zP7_%#v%ezMf~WKdx?6SAj?9YX07lZ6lv;X_O-LE_wLHy#l|M?*u#f$I2m3NChpenP zx2lg%+1NYp5imKtA(mzDBKuG;#9NX6mN0?9_t314NKT2KUAhr7vRnkos7r zad}0)2HY;cX;smgJwT^1Z%Th~)#hof4Ydn{o zEtITy(_40N^oEOxf=_Yp!uin)=3AW)bFJ9{j?;zl$LqrQLKiyuvUkr(z5Yp%7p7?G z$k(MK*E5^8w?>pEJDO8{wR1i%cqUp7&*TT&hg9(Qz)*d>K2#U_P(c;eJx^Ho{Fxw9 zop0g6AnEOTUq7ukf0`a)HPCvN7rjTSdIzgAFIyys6{+0Ev;1SqQm``=H;P#DU_wU( zN*LWd>|k#rM8ANXJ_dr*^rSn)@?Ry&FQSdwAD1|&1LXmoQhjFS|geJX_57n96a zKiEwH%JG0g&!x^S>hmnA8##hy-L`S^KGAO=SUk`icEM+UTNuC>!(%t`Mfx=x_chi^ zDfD5)vZ+yCbj$j~SUW_oTvtOAWl40UH^aK}u<9!Wygo^k<(7iKYavchLBGO?sOvv$ zeb^IZ3Fu$&_U*tJ5%FsOtcjH}5_i9eNU(ZVh5zX~^1OHUpyXTG>rsikkUMK4Tx*6b zD^hhcBt~fJ!+1jX&#HusWXmDwc3^BZ`g8#glo~`uZ{c&Y51dwst7#~PC6kTE2P5K+ z(>IdTuggz+g>f*#C8~xsOCGq+PjO8%e5rOVF=JGuPLrRbh+zbF&J(!^4W@&BdNjNiQGrM>lji{UDq+Bko)J%P!;)LL;*2aUaUF@C{b0C&%ORA zNLbiZj3&`J=~>8{PDJfu~8K%>2hHvymTokn0M|(j4A!I>Z*W;(?3goNWOWh zwMy3YDkq&McmL1XBr-H{`+zk=z`Q;|r1W@g%zXrlu;vj?#@1jL|H+%+D%;2kIyc?@CeHD7xYVc0?+S)@$ zi7X{U@n(@i0HagI`t3*9kdQ|hB3LK)1Yh6$&$+AsH+CS#3J7LMyaj}JW>m>a zD=TM}6*^*uQP5bOdJxfTtOEIjsNGpr`5z#Hj6EfO+TMTUq59GyvySJvPA+r1Qs2wy}TclnecI_AoSD@153zkl(ESLOQguyOnoLJp?hvP{}6ZDPjY_;1;i9oFh#o;O(;M%{}@F}^y&^~b`Rz|7^Z1I zU=lz6i(wMkWhh6m>yv3T|IeZ*X+RxW>uZQZQMj~SN5Yb;Ca!xdxZ&mRr+Am`ozc4o zDzoypGoFQALH&(d{{$;5X^cut$Y7;#xTA){_4<{tllJz=&OkegT z8c2BANWmD^zHWB|-L};7E8o??*7ZA)T*3ZzF!ev?Tc%G)cw*+|F?#mkU*#G55YWK2 zT$-Mnc0Y6XohUn_^kX5#RpPu}=o)+K+JGc7)DrHjYUnOMhcaDWmrtj}Kj3U`^IwJ< z#EqcA=%_3=wt2B;z?=ORL(XR@Q<|%H*)PyBu8fhhK00fD>U7k|;oQUE?aT$ySqsu= z1WzU0g9%As`eMR;+@GR0gu;sJ<6=gL_NO0Uoxm0nc_-4p;*ukS@Qn12xg^|Nyo8nE__*>9_?acDX#8XqBF*@*eD<=w&eBS8It4(BjYHTltGsaTihFufW zb?1u5D+Z$nR`%yZ)FN)8?tV4T#Zk2?G12*JetM@o*LCHKemi%J5{U|Fh}f9dQnI+M zC)d1WS~Z(G7~=w5?9F|h;7m|qGFSbV7VybS&8S2Yz^?uhn(3w91KFRumz#pNGf{8cHdNj zwL;POQ;W`L0f1$U?33Ak%3Hrpg@ zsIzXBkW`G=z-Tz{N4x`{-oaDllxpwLY2;c)tMEU1#=i|ET9c86MC(p(%I&qYn=7JI za`LlcR3mnv2Ai$8DJw?V7Z3=xenW?O%c~=wlgatBi6AC#Z<4T<$NlqUP$}0B{$`F!pUSkBqeOCvB&;sWA&4R zZm((qcx#T&M%Gd!iYd%orBCTbSqeS*>R4>}<`IWCwYUv~nv{R$7=kLZ2QIX(>v1~v zits18+9az!9$A8nL(U2sPTrEasdT7(RTsZc4mx-A$Fq|19EY&4#PFQKSSAx$ zSi6g6XJyxks+zkc(oQ*(KUl12I8MFD3!yMsx?!4FB8ptEyIGL#4%TiP+q_dsqJ0!` z>3}*80SGPG8lBRoo6&ya6bxmzY3*KSEp23uj84siC8nA)gBGWT_zDx<%Omw5?FK2Z zdxEWd%$Y%0`fqtsT%W*|IyMSS%QjS1k1;h%eOu^t=Eg}Q(?8XrO8UJP>3u+e{fMX& z4d4l2|Ly^-u3`Y$NIR|arQy%g#sh14LgrtIm(2=`eceg{^}r|%u`Q;uD%t_fU3yTbhCTsXuEF1q@V ztsS&FsAal!>nHh+Tns2eDBDENh|fiBzX{XyldK= z)(uSJRLA}8#&$l`_7l0v_0gpO^9V4HyBn~7RodAc)IZl`p? zo7Dg|rKZ~6$`+Oyy}M6iwehh~Xm`l%tKaFg?!?ymv^R4B1T}JK>;doEDZQ_rDo0r- zhQ=OnXD;wA0w&^-7#GkpH8uWn+^@u5V|&-NNGAFg`dK4+Ru(xNC|09JeV=H zWFRIS{7qXz{Amk0AkKV$w0}F19xypkZTb@a&Ud_~CBtaFm8oPX(l;gcUP*elUpwO8 zdlv+AafCn^2%%V0yW-g%Rji1@d%S`xz0_+vhbe@M0|tt%dS! z{#7UyX1F+5`G0)NsA|%~50pW{|JxEQ zjTCupGNZ%wMps{&$SogTXySt|1Cra!3w%D*N0FnJ$~>?7tlGh*+R9q^kOw(t(? zp7vT!%ZmEHL6q$x>(5W%R_!|l_HzbaV~*2t#8fa(E4b8YzrR*QuGJ~$Yb70f!HOq1 zBog67ob=Cv-sPeomyNXZjIA_5G4cVAFEQ0YmV47^Ko35jUFc}O16yLiS4DE?xAP|M zEvn7;q00t#|7lC{n>%lWwdOF-*ri{b*)U?Ro82gF<^57Q(T5dJpUy9&+M+yx=}iq& zmfz{xNI#9hzs=@f6*wykIxCyyqx|jqPO1jF%dvXR!4YtIB$ofMr~%3+%i0+WzhS*% zXi?~=M1BF-QhjaS>BFc>{H04?Qd2mW4Za$p8Zi!l#RYo>oi8!OW#o~2z*_Z3Iwe?6 zBf++u5!SiHQ8sOy+=RzlDADL8Pp-6kUkck;Fzn1ZrRvDRI|L&qVGwdqmv*Xvr#U+a{1F&#-}$tt&bkXzA+vsahF`QaIsD~dc5@D{eUnkz)6lK3j*ix1M&MOM4H0+S4FuW>1ua8iNZ|1us zo~kxWWE+Qxa@nC8@$&U;BHpXK&nCV3!~Gv0WDvMCsy)=N=6I2R z7VPt4oL2{h40lYNUGY_rh6BZzAxudBu(Cre&-I#p^rxq^2 z)ACad#-1V|upea5p>jYN2v`p%A6Yjq`;ek)l&r?F_v$c=&0Y=d8G?%yw z0|#X^jd(S#{wsa7+gDVObLLQrv%rlLQST;6TGiY8GKlcodt%wX)Tqo6j6DJ`fzv)V zdc&QXLqtfmQm@?|2TxcW5H7$&a8F<9PCaX5#t({#xHj~A7}TAh*( z!C+hVTO~eIEO)JzgX^Y+6Wy&P;t)x&FRSAf$~S{Wa}>V75@t*&A6C^PE6qxv7;MLu zdyr@OY0CK9<#_=?lMpf|gA9&hvV-E?#;~>KZptKDpO9^zT%{YYf77Yp)N*A9iqyB5 z2|vt1RctEipGnt#Td@@{T@#M4zr8EzeM(wSMaXm z@Gj|Z=lLL&+YkTk-9J9_+KBoinLT1bvL3$p$%SgKW>aP#C57Dxx8BP&r33z)UydSd z^pj-n%ZRAg{7MN>QwB!@I|>-r@*OZty1Pq&E5NLscmHqUwmID%5ORJR_+i*^{$6mc z)j?y_up6@bR2%3PtsS5Q0q5fmDqvxhvV+n z%zmIdWIeq6?S-<#x_>0>-0J)R=oqkmvoMFN|Fx|4k{rwbW3d6NQ_P1nGVn;|Fllc( zXjGaUCPzyGl(t{9*!_}?y^+_2GyCzQ8Fl^K-ovt#%^X&$d6zU5Yn+vvi%Z+c>n3FO z==Q~`wLqwMkQlS2VgCS)T72-kI}U%GPNlEWj_~B&qD+Lj_646E&Y4_)Qt#oDhV?*6 zw`PSpXCnj!sGsFTmH$7R zZf6f>LIh(igBn|5{QyY|BcH%me18GTrg$Ciz_*9J)*tk6s;GDOh(OO;Ju}fiGf6>8 zo=PF{->|VJaEiXnf8);G6gYwZ#y*5Kyl_*Q{{~)>ule8j`Z4|+eFgsw@x0O+)qg{r z(39R>(t@5K7XR~yDyn0lflJ_XnZYZp>`!=<8T>SQ4;L7_GX5tsgQs8r0mu5`rfbiz z)jTnI%j6x(lY~1wjjI*9BYxBS{eOQ(1i*y!JX%Y*&!=XfNz6}pmvgFkc6zO}?s(0p zq~8)e@0%&^D(eb9B98%nHU;@?sJU5sy8&raRnYy#--Nf);Fnq941Aw^k)UCE85-zP zeM=UcXnrfdL4?c*Y9CH6?eg06?vQx3Bs%(pllzl>StVs7qP;YdOgntjvw7zjj9?|U zS0c5EV-7&>Go?fRQ(zT_YI#-W{389)^WR4WX*kM&*4(joHH~2<5K&L}hFyf;03sVf=w7?*JOQb$9^O zlTE<2{GzfhV4wNAFvw|%-9wU{aUQIZCLHgIs_q)jkxkVD2;=uiuUiS-E@Z zmK+>Qv~ERnQbR@HczJGa@y9^`9BR5+L=Epa($y&*HK)mq*WNBaGkWyV4jM(D5a-=9 zsEJzz5Leh|=w#`ZQDh^2id|1Y2Zf zZ{@j>cd~e5b+d%6QitQg9QOGpv*Ape4OlR#vVxLZ_dL`?dA}v~2`%h?oe!4C2kG#D z1s=$O1P<|0BK>Fm(&2a?cjVmB3Y@SrP4Z4j2vJ+ux%NpZ%j&!y*oy__pT=@rZ2J46 zcsc_`&9{)7%hG8*>`rE>mIlFP_z%<0XtML(-eli^ZxImbX?yMf{xcOGqOY!z@9)3uXPezCYGX1&p=7BEM6$ zy>_`*e_AoXeHdZMoN8mmU3Iq72N<1BJI=}8ed31|czDX5yx_gNfzQfaE$*b_nYY=8 z>yiUC#BgPoFMiM~VR>WOC(^s*HhU!% z7-$oSGLc){*H(=0BP-BOfxN-F-*IKj8Trg6Ho^a}0^ed(*@-I6#-s`GRP^yxWN)8J z$2rb)b2^lIOhGW6UCTetoV`UvJbh3m~pjFfhEsSwo4i@##Rwgpk%v1d!y-QX}lv@V* zJWVlq)v<9k15s2jaCSZY+%DrY9Uc!dAW0h}3ade)>Nic7lMGY3tSFIa?blhcI$syP zSmLt@{^Xx5;TJ?ciLOqMM~6}$tsp+@k$7}4{Q*q&F*$1dDG@F59Dz&oWujRNG02_I?L-+&* z-MIl{*;3>a+Ziap-64E}FZF~L<(nOslT6bt3a1vZPFH9Rd;@z&C)+R=N1E}F7ZmEB zDcn3XFup+FoWSB_PJ!>}#tsuh?Z0x|S=JEY@N&+Ups;$gTN3U)YiU2{pll7Ln%Gt|rvR7Ebhn7URKIoLg9dKVehOLH zOX#(D{4Q`;F5A>XYwS~;Mh-M<^`Ft{U{R-W zl6Xl2OjH>TU%+qr@B^uFm*6tLRSR8w+B?)hgTE+t?7fP|+OO0d<$dzX`t+h0l!sX3 z)XVPmDv6dk@TkanoI%86MI4V&VH3H=w#m<7n|o^UL$HF-KqSyRvd^U^xYsNw(lZPu z?BG+9oyvzEq+6uf^eYMUBHP_!8#3+OGS{nqijNIv5EkGnxdjSXXojmB0C;1z>3i^v^WBygNSy@Lu5m|_M%TMD5 z{4+dQC?17XP*AxTXRPQ>2HQsk6j$v&1I<;5B*{%0gD|=EH`)UIkGn%q6sC~Pn&%Fkq`iu1?*1SFk`G`m}ShX^EcFg-DUKLrZ(wDR+`B60h;0 zUh$9U>EZkvD8hyx14grzbsen9?w_sVHa|)G7SrAT7Wt|)F7X)a3N)(!q*%V69t@XM z`K3IP{1`{9Ti=o*FJTxECI5Gii;^D`HIwWN^dXQy1}_eXb}%Ev8F7*h@KV%NjH@y1 zSLnd(x5P{(GR(F*i~fm;00649RYTaERPCZc=d zu9TMZ$4>N_1P6@?ek(WL1rqot1rpAzlEo=o8xkq5UlB%sxQVX&aVpcWETAFrD=DMNgL|)iyn-*`W#HX&mcoo zY6lIb|Kp2}%Tb<7!-ZPfwXnni(6;2)#`E|bbdgKLoS1Q~fn1S39GAdMGpq6+WHt<5 zQr4XrR+l@~i>>^{`YtQg7X7J;{{MRTdrbdqT_X)O*JgV-MwC`h=ivt}1Adshv8sD2 z75U%l{~i2oQ-Qtl8vrn-ERy?LX%JTeF6-pdx`(Y1jJfWYLnIU$o`0g@q$~=f)DPeWFJ;wZ1Yp zSN#%3?_MYR=JlsZY`)B_<_dR~lm7<=f$;O(vO$M{9GMP@G2&&a0w zU7T=fa@QxgNn{2;Vcq-zX+pd~E9JsHtBHd)`0|9EifxJdZEsmCS^YL~!hfN)xCe2G z>sgb#IkDX@%?};pJYbboKl4B`+H(yKkdHW-myaf*+gUC=nfk1gL+xmjH2RbUE+UmN47w4m}Ng2Xr+`4ox98YDQF{ZAw1eDsY|wV+WMS*20=xv{u=V^Y4+ z+_gsEbKlYvQU(6&xCiplWAKaZRHocs7c;qOs_1ZrAtP zIh*wZdd4P<(eJ^*J|Ujx-lxmA;50sq215BN6T|L@tPfU=;yU523?jZfM7M_g=iVGA z%7Zom{}KzmEU%RWnaN6XB*Cs{>nT5)gR};_n_9Qb@)kVaW^y!CZ18`y@plNN{iKFm z=vGO6?amYnFv<69rdHx;bZ7_r52L(k(`9$HTHF=+jo2gSp|v6IFbAXbaNgm_d$0zQ zr|n35^;AUe1o2U?gJii5yO&kMAC!>Xt83i35qIVUr@u!=(mr>J1!YfkXHs~QJF@{( zP5B8ML!WX`GWAIv`mv)WFDm2BS5sF>z8QVLyeKdX!I3Mq4ze`9f_N*H7fud+`qdAM zR}eAb!l_g+v2rE~Ev0Lzkti*CR7dw|-&2_50^s@8LqZ(DSwsyN;%J3LMg+| zgAoNf@XZwA82=zx`d zKjnv=s7}8kYs*@9d!PoRw#g3mq|Lugbzjr8&!x{& zij#54-hGunqxW~X1aOsfTf%`vNpRrPaoOaX$;<+b%uRI|8_r}xk{$_Z2(XZ7oh|i` zjm~VgZhef71Pz|SgO#V^@ko1-zNYB(2#PNzm_jwUISF{5UZ)J_$sF)Mw^=$Fy*F6KKk zNNcrNa_nido2}d#T$ReLz^*q+o(NMD5c@AajL61NR0doCOSrpm{tw`~(I1$(xYt}K zd1=;&AB<|tC3z+@E71)sp=I2}|aw{+hzaqAFaJXvV zDpUVF3Y{O9g3-A|v>c$M(|S#;^Wf6cqJ1k)kqyfv9`}i9@3FFpN*U($^73?E0tEB2 zDLT!>bLdj%g3LyYKz%E~ta-$`oAi-nbVW#(BGS7f>dQzUIju(qHn2vTF8gdb1Q-J) z5P9w{HOATK7Q!V3i|YuG3E?co-K9b@ zqH883?2M4iEWEKAoAW2}ooOFZCe8(AisWo%x6JWTUKY)@$3A-->h@~G5v&!|0tjf`bpHWbR%XDxNcqBcCRIQHnr(`Pxk8_a}?URLEtAN-wAG0P0@f=Lyj?6^2h&xT8B z>z@%APA=8+`80myK|TJ#2c(Ki3WRRH1|4SWqzDdlipfvb2a3@6V^T)&9hH-aZLox; zc}bYwB~UM6+fr@$L#p#^7C1WLRtdm3jl_X1O_T8ofD) zjUH>Y94I%Uqq$Dl&sVrdeB>qW!*M%uG9A%AXm5(he=R&sv})ir3uO%g_%ET|;|=Ap z`-2+Fs7EVHcv4HLhIElOuCK$|u;yp1R|ER6a_`67QcfeC^Q{Pz02tA%5~1 z8BYNS{@A}&^ps&mUsxw&JVC7~iWcY0{|!ZPY8eJpw*kVa3Yss_+Bdb%cxKls-PU$bU+(zQ9&Ycm7>VpSU|O46A$biR-?pyr8N3^M9xAv-qU677@A4Q7}{$ zG>%!QeXWiN6lJ=4c;pvkILm+t}YHX@mS;^5feT4`O%>XwV}IpMp9zaO*2j zvnRpDW!0Y&mxH21f#GBC_9xKep}N0YbSMZs3B*gsZ2U{at|px>t@p z0^2JpO5A$L0N2Q6FAB<@SWnmzv)84yG1+4 z9H4`70LA~vUeMHhl777KT6btAa){|a9l6@TxzKNE>HoaHXQ})>L4S$UE|5w8sL*)A z3;LS7P5YVvpaMSn?574WCZCHIWUaZ1N_CUL=!we*23ckfH8=3u^)>5M?@hk#Js6Q~ z`pzM1^2g}ZPeZxWWsud#cu&&vK6Pi^maUHphO``hxnMKpzx z_@XA=MGZvN^JaxJhrw8GKEh2E4n=x%8aFkW!O1{#`}7F7ARQy#scbno z{0)ae$|`$WR)=k^k)Q>%6j4Z(XcVDq;8hjCYF6D%18By>9n53spAs02gAHFr*3(aE zGsQZxF_c+4f3{>Jy}6wZ2)>PTGE-Rs$?@&U`#QHI+!t;-E$@S=GCv9L^WuB%oiTJF z2kF=x&@E8nw!F$%#Tg~j7mns{dPOGow|o;!ELdKc*ScZzD&=mWoYM~^r2}3iTTS%W zo4x@xpOe#bnspui874nihfjJ+OV+Q)!SN}C3PuDJD-*JPN?p>suC|GNjQ8bziZyX3 zZ+OB9&pIpnBoB$?uCd~VOtygMWSS80)dbGAvdd81G?&1uVu$(ee#KLHlWXBkQ|r-z zB=Ga*CDEW(%kZ4m#zp;&YQRVToQNZSOTqR>2T2>ypBgjyp#QBsR|>|<2EIWEYmFor zXFc_HW<_(wO61LcKlgnZ&3?b}hr+6$|Nh1X87$mIe#C^qnW?Y8$owqRfitB8|0DCc zu;H&xW*??a)Jp=3QL}(jz{qG5{d2S$)PiH`NngimF^Ns#I`rN}yf2O;;oWrHaXga0 zQmbYxxn@um`>R_SiEc-8C3Z-hhDnT>|24llj|IHbYP41MGc3j{Zy>67AwCL18qI=Z*vERcK!%PMwY{yChV zPAw&3lzF)6y`j`NNkVS=OSml-8e@jm{t9;`Y0o>y@mB4ocE@WDp?hRk= zI4TDaQf!-JltDz!^5)KWpTLSJk!_Bu@8BPL^Ao&lS_s`_-P2pqBgZ54eAdDE`ma`` zDzjVCSIO79#V*x91k8*3ZG4EcW70c+35OW!pK#yE{ox+CrQ?Q5**CH}uVRJ>gB$cWIA<~8je!@$zYvSGssk`dY?bS3bP>qazW{|; zjWc8I^xagEfoud)R`x4GKsnBZ=5CBR>!?38#Q&T(y;zxoT4tThYp_&;aLt-Z*hHe% zHXt!NdPDr}&5wM``I*;QLut`c9_8c7L+AiN*2~pO9l6TMnW+`2kICK#lGkgO%n;VS z@u}hdI4`8NvXV+J_YlpQvc;UA0cAV6)2`Y3pu9U-dB^A*}TTIun=A;?s06 z)-BVOzPCBKZ_BpyANLle@ z;zfLCm%zqboSEw1@a#CIY#Ka&V%&WlVy)#B`_HLJgqu3K@#j&7n<;Wb!G?pKyAWr! zR%cRCA|8nl`brXSOuG*-gzlGZi|$VTG|ADn9^q*IRfh=pPU1u_)64*hMaN4~YC(4r&pEKZyLZ@xO-gp%rboVQTNw3GO) zz&a4YHz3kR@jClbHe#=a+n@>Duk8v0@WYjy?Gwm)0$Cys={p^WcC3F@4^?5o4Eg_H z`ZxbFK|VwrJ41!gt3zEP(+e;M*zu@ut&x2=Do&aa2hof|_k%H^ZrKm?pF0Rt4#p#2 zsFFx!V)zo%LkqxG3B&j~HY3Mn?m%(h$WeH9Wm3Oyli_1arlcMsX)yaD8e~Gu0ZSd% zgsafEF-PL<`L$vViCFd7NIT8T_H?bjZk9(~+}du}M*V5utUtf%k)Qtd$M}(dc>I9g zfp@96)S+u|9S*}K%xAHpN>LoGzL&_oWBtUBcH*iayguuHnr#_H}+mDnABDgAa= z3H|t=-#Ly=gfT%67xAct4wR9A$UWNxinKcfs8#+q-{F9_p@F~wavI;1P|ohyBIOkG z{D=MwcFecG;O^lR3pi)IjXEBY5=`cV{CB}2qvubv@o0W;#}gsJsvkf7u8y$;uaSn7 zG>_A-H{X_i!32Qy{qnxMo3b%1v~TL2%_=lOu;TXGsV4KutyNB zzq5xcA;A950`e%nxt#)pE3Qn{6Zb+`mts-3lr*o3NaSi2)E-a|q=O=7KwG398<$G| z&bL4(_}3;PUY7X8j_v}Nh!`&6|La#y#33e1Fk(hjtJnvRC^3g-*af&Y$^YY!fJZq5 zjTH&G$i4hi>4ur4e#Ly@7ngk@;19z#k%#e!-PWx!h>AK{QW*MJeJKOVY+O2=II`4d z@Hyc=AvOc@j~MNsWA7cj5lsl5UBx2N=Qi$EM#N<$?BDr&5E&W*>EwtzElDI~MO2wq zGu91!;_pAKkYr=MK>$7EZZe=tdW!Uhv!cuUeU@@eEyVJLcnqW(5W4X1HgA+Y*&2Y> zoTOjC%Yb$e)*M8H#VHN(93kQ3MF^`Fw$~<4{A#EKMO(lE54gC=&6}wgctiKy^Z9k$ zRnlgu9^o4;wTw;TiCoN$lnVL&0fX6im5tU~N({M-5nuR5fJU}AI-x<_si`DyWb>j$ z{#1b|N$PHvx&zeu%$HAuS{H*&d@$dhN3XB0C?S?OA1&~6f7Pk36;4jHl!*}r+_A2i z`Dv$i>(+f-VG)rDWzDTCJ4!N@zm4qTS={?kWE;QIuNvhhK>~CeJ^+ibJ6;h6Ddbfp z0)2wrA>>#EZeZ9EzM*VJc9;BXb|}AtMKrp*OTg~l$_M^GDhTDE2+XRd?CpDn+nm8$ z-Y`iFvh1Z!l7Q+X%n4A4bL~(a`ow-SB@=?F(2uC1G#?bN^1HQ|z?@M1m=;);78L;M zib-8&3gSRudLa7wwAue*YcM6CRh*Ai8(=c%A@3b~o=(Np72To&$Ydn_5I9H4?sjVR zTepu>b|{)ek*AlaJwnffqw3opGp){XVAlz15q9cd^fzkx1hv>-urG^84R4_tt8+cf zLo7GlmubTxuer@gCx7)$0Riz7bct{ZjyVne?SiiI&vCof$xp||JNOyS;^KnQS%n8S z(v|3v;wg1JSZWs&-K#{u$x=f*_sf;#Y zF(T9AhQ;`eSC+WTbh=jHE(#UO#q3L!v0Pmt9Zm{=iPKU4d#oP{N|t?JJ9U=^V&L?} zy(eHS|Mi^tR2kB7KdqHdPry#v_?mtSDb;C16g)ul24}R}eXAr^O9eFG%Y0mMr3xh@ zjYO%m*6b9+kAy?eG1TO@9b>J5eq~Fe`zEOv4W*!-%oi4mdXl>vW2{`RlJ#v;4n$!G zMjt4Na6P0XGf5Tgfq?fivSJsg`j0=VSR^W0EK#l#=$KgZNc|j>m!S0W&)@3{)G)kA zpS7MM8Wfp14y69Yc`28Xa)N`$gRkvw^dADHc;AiHJ>+U>|EKqAm&_w%vwvsV1N;Sj zx9pxl)cH$?KdAM;5Q%!biYDfEf%`-&0U<%Aj8ocyS}^D!BW-!m9nH26wQzp7+Q&skfFA!&$&6 z(;qa)8i6mL8g=k{qeM}BkK@j2kZJyguygqrWKOibn?={j4Axp}_DqnA*vfyH(M|zt z&70iMFnD)JF58(>yrsCj`hx@G3iiOOM?toAFs!)CDc2X9g@~K&ONE&re#owA^sG&P zRux+`TQuw1VSPNz@}DD$pdx)l-OMVB8;)J`rO)Mf8lYy}y<1B=;GCddt?-|0HaPXfn0Q5SV@ruQO}P|HOMg4;5k; z3)oWJHHsni6b-b zo9@<>=+-uBm~HsuFgZH~Hfw(o3oIuPI=TzGt)iQC>m-&*{-OTAAsg=hlRxCc~H00a?Y<@2=ZmErT`8@4=ro*GO~7>-WW{q0mz z%m0(N1Z&OPbQUJ>D4V%p$^y0AKj{m>1O;kJVSeJS>AtKMf+;G>kK1%&5-hTFx9Qwq zyH&#V&o@gJqp<#OpHWz+Q0H-U&1)GUMDcEgb?#FNUsK7~sKk8V=msz-vPr+eRPk== z9}`po3WoeomQ``ACgSgdKWY8P@U2b1H=R&D)!$U=M0pLWi2UpXHDstkbX01WT)>m! zc+b?WgB5j&+-~j`u7q5Xb*LCI+T=ID{kXeZh@^{h^Vtj;hP*BQWu`YGa+>dhbp{J& zk%D}%h`JVY8S-D2rJVA`;VgO2lk!}73v4Q|0;yRg2r?&Kg14{&_Ph6L*;?wEd@%0) z%&gbT#iREVv6=)V=yz{4vZtLY=!~p?lU#=4EP9r3lad?%4oV#dB@d!qGYX8jpMVIH zxi&e73IDq#vX-w50l;kwcHG^vXm|YocuAO*SaAbcX$qFGWZcW+L-*D2osp0C%Vqbe z{1Hcn$64TY+!DEsTOl3kqHKbwjll7Y6;dkfq9@oUlZ4DQ`z}~AobE71lWyLsH(g{* z!u15}gah{QYn^gSq=pB4n~k*dKwikE1Z87Vkbh$B{FVHkl8w~y>_Wp0{eP`jqlQ}l zL~d{Yr2(!iaYa+Sz!(G@T~3L@i-uX!^c1Sua&7VNGBOlJN-ZEQ!JMlRtz=pAU)rq* zgG{QGA+ycb7qE$>r-qGyN09YS%&fJ3^HKdk3kLzqAZH_JrzBATI47K^)&M9H0LcFiT8;)AV;111O~dQ~A_^1Uh*Bj5d7#>r@LQ=aVgzB9 z!t#$n#HK%$-R3Ida1Q(8ta52P!%-Kc(StW%;*1OQO; zLm*rIC?;CV_n|X;-G~}2sZ4Y*FW2+de{8GHDIUsZT7&8QvX~+|Hj3h0wnS#X z(|@$*_{>q)QEOfh@FpWCu+#htuNf$#68YyK^5u7!yezGz3~`CvWJ-$)&39$3SGJ#V zTtPX8b_!DRL<)^k3_V#ZJt@vvK`in@6`JQSC@M5X`CgbG#TW{zLQ|BM!_^pBbJgoI zkj*QGeq6=ge~tbgS2mvYgaXWbbsUNK3-h7y>*4zFUmn*QMWHNPVJUjs?&HBqYq-ut z_5KyqccqQ01PPe$O3Sa6qs`KbDu?$(#bSgnc|(kJ7BfHT21m@U2}O@FQmBOj_T^U~ z&Y9Z1Oo03Yl453b2-PjW$-r81o1vGI#lkkm{SlPm@-cqopIY~c0=Aj!FIJ5#vfHZL8RvV%kmp= zu%W%HN9Jd}g`B&(EQ@@_SidE2k)5U$3JHb%eN<9 z5!UVJf+B8@*$gNvB@D~W#H7?$%mTA}r9RSA<1p_f+_m`6J)rzfSNuxxP3{|7i&5pV z15h+h(U2cv5$fG83k--cbA&ae$nwmQ7z1B9yW>bZg{(C%^Q_}YNQ8je{DiIqL67O0 zzvEdFsBdz0&t!nKR9VUtz9}m!pZfnzSyLM=n@?!dlu{K+_^jVvR-@8t(r9!3A+#bM zs0xmx4>Kb9DufnS#dWn@`#UI97%GKgc1eHx4ig}FSVbkW7aA*Txsz{^WP+<<{{<|w ze^YsD+ErBEWRrfl@>cb0l(!^K0JSPytIISucB`e$qS{tfQrp5MwT+%Jf+c_+y^O6I z>l8xk>J~IIG#j~t=P;zT{K!8ICL~JQYHlvHFVWfe2R<}hOFQ$w6?Uq$cZ;g#Zc=5Q zip-2DXKSa5xci`1#hY8Wm4E(<`}AuX@8Y%z^RLj7{A)3~zRsRZfOPOSe);;l@}7VG zezX3vSt`j+TA=5tif8ssbqm!Wd|DZ8p;0Q55ecI;zXh{!ZHdYLoek7?nT2J@$1vF9 z2CC<&zlFQsh%p6YAc;2nd(~FYl1ZI1jw>EZ%+l|sbfCV0YKrSp_p#(Kh5_^5HFd5N zb6{DKLxDCc;2JAuTvI?Ga zEl*)E^kos4(PF!KHzPhCMio~ExIubz@DI|Pi-dkkt3Rm5aE5MCBMHam&8<<5nr_w7 z#RyMB{#VgM(bPolm1$~4elBBCMy3R4h|~xR6%h6%Mp~%k&?Tn->`40XiL|3W|ljSTVjXnIRf^Y=@h$+oDN|3u_XA7ehBm3i!-0KCdA5U8v=qv|vae&QI_{-^ zbkH7yucjn4P1X6|eqOqujitZMsz6-Gkn@Fjk?L9hv zV(P~x?`U5aI*pepa&=q+=CmJx16%i0R&D6=R{6XreSd8I{j=5UkGf3#6+7HZ2-aEb zvUf>*a?io_73ufj3_8x;wtdj_Q!GV8Z*AxT`ZeCkHpVv2>1tv{4nULmhMO^l<2yW9HZtuhKZ zOA)T1l5fabXRcQn?!#%DQyrC|Go7&Ck-c5BQYu_943ZG{?yi#m=)gB*ekS)2Cjk(h zAG7Z1SPPhlN_~nrx=tX)ly}Rof5aoV%zt)R{K3bB`kx|jcXzFHC$o1xo*rsn3cPIb z_Fu^{JW@7{><+KN4I@%HbIS*cm_ucL4{K|2@bNCqBw;b5xVDJtZ zDqaTcMEBU;yb^A6Kt|=3;a9?XxW~y=#z_2?X}_r=l$zJ%onIrlQHWO0d|CHiUuoSt zhZK@e9WKj7AVg)MDt>E%Dyv0*HuV(DUg`lOpRQ#!$hjv9^^l_@psIi^^swzypKO1)vE){i}X4 z4$uM(Sw6UV(~_uHGz$c)3+?#39z_)aoZZ6cdC8074EgV;mO@GSD*qpdo)SOCpA~XB zy`2*>o#K{e@MB2ugZzRj4X5^nP(uRMq!RROUoD+5=hiuvFi{v&Yb;E%q|xo4qn^Kj z6MZ8{DgGU!&QzkAlz#)-NU+dh-~8KVIV<~1Ek3I>{BOOhIN^MyIETqnOB1ccSv8PKe`$EFNpGzw_Daf; z1JA{BlZTh%WS?n$U+N5v&cNxuA^&VuDa;Y9e3KW6aBMrhu5gHLwd1`XJ)Nh~Dr9C-Rg-&6%8G(MCh?u|wa1r%h&kdwEJ^f;^6brSso$o@L~!uv zYm0leWG1RaA7EVS5$^xj1rl*4y)a3rOLmwzuu1};i3LqU{lZO4RAy$!> zZV8;63kO?JbT<*Tb@aRRTr1m26D3`j41S`b_^bYNoWxk2fVJ*g5cDkR6VHhdDyQfY zCb+2o>t-1+Ev7F!UYmqR3ZRtFGgkrM0Ww7x1c92`=|fR(p7L~lDQ%SWMI8;mY><-^ zg%L^YC0)1)C^-nkuK&!%aqmlu2W~B~8l7+9FNV3iBg)TP8kj;Pj~=N(699h@hGgU6 zI1zE?ew9kWQNCZvIU01FO$l}t!-@XJu=FwEeyxgY)ox)>B79jc)xntvc)}N6l^3gw zuBXz7m3yqQZ+umFBpZ~O!S`C7AL7d#sYxukn%xXPV%BCwmREgH1`(-fQvcirtW_Fpx6Zv1*h?K}HKcOf`YjI=csklR# zcy(3M84obeBM2p5atE4Kq0yO}AULVSpeC>*bvhHR?4#6`beFJXV)4mPPZ#BvkYh8$ z33oIu2NQAa$Q&g|=>JkloJeY&^?acxSbxP6olv47vpi%)C{e&2@2kk?@t{}Io4ur% z?~*uyxb*D%oLt6mp*Oh zOg+txobE{&z1VNUT$#dF53(Reun1Uqe)S5EFm^3xsl zt3d;}SIgw*IO&-Ju1F0RHxRHife9dy`5GzgKPkF|yQ@r_pns!@0HbBlUYve$lnN2m zSK@3E(k=a>yp_YVEE<}t2D%NJ&1%c{n(?bbo|jXPhObF+#UNc-C>rUf25l69@=xoh zS!oFy+)Mne5O-h@gfq*`H-O{FYJ+XgVFV*&xz&^O9FEzOlh*&3EyGO$FMM41N{}8= za|NF^K_}V2&>{Pv9S7&<^33+^`I6*O*rk>IIWu6bxdtQb3{j7)?00!EqlT$YT{Gh$ zdD8hi`QEb^yM2a?%yAu|q0T|Do~p0qQoOwr-lYvrE8a+z>op})=Pn+4v3PzjzYDv- zmk2eAN>wYr`QNH7hm>k?r~KvI(9H5c&;()Trkci=ipnYYueV=Mxo;L@%UYe)Je2qJ zVl0;l@BH9M5gp-_JscHW%f1ez$vh=PH{*Ixu!cXvABb9Ugey(M-1@Y0F^kP#9=4oXs^y`?8Rwk2E zz!>D{Ps)zQQdXzr2j^}ncT26#C(Ye*?v`7foAj=uotEuryZl(4zm{i*;#Cq!j#~-w zVtZZMxori_0Q}lDO8nr)SlLxvG@1g9p6YwH_x0rfumn4UM*dI!3%5KtuVSsi-`sS< zD?US>`~26Alf@;891!v^E;M$IS< zA;1Am=nk@*(Zq90EAszwxWqpt;zj32b?PrzqNzrYrcblI#A3DGsI~=6KP5EAR0S09 z2_=&YQiSs>A;qaY3@Bg>mr4QuA8YRdA7ypze`g@TpphrqRHLOeZDR|q#}isqQnAj! z1fGG3MnL7%TTVkMwX{;5D5nAjW(IhC97!uG{%b2e+V^;lo>Nb46)%N^OM=!amwKtT ziuY$4FQ_dyFL}Sey`Py}z}ENwdFKOpZu_$K-fOSD_F8MNWqdm`1GblD!0YtpfEn=@SiB-*=o@N-rRj zCQlT~T+;xBQ4clv$pwX0WTSK2aXKwhZ6fw$_FcmIZ)%CB2asLbBlMa(Mf_ScB2xGoI$?#X6*b&q=)-v>-}vSDPj{h)EDHa{ zr*I*#)bM8W;*d>+z89&XrR&*K8QIcszVfqyxNw%CJz!`bWk`R`s3`~G!L`4!crc66 z?vDrQ5Dyj>zK6%+BJRTmDP)Tsq9O15UCggTohZS5WP&-Nawnn z)Ur%hblk%|{~YcsvOAo6m+ViEAW)*0n%tD@ZJlO(E_7AQP1JX$=N0!u&V9r4?bQrw ze&K6#75MAMjdO_?7ISXw9(f?Ya95`H>MQTb?$|)D;uj<=jZEWq^o+3b_2G!s5u&fD zf6CN!^&9=_XCTi(GsdrL@)%55Gk;*9 z7@qFTpSaO%V8Ut$y-bvZeOepWzg{nRU#ZK-R?l2-l7F-s=K;Y|)a6XZMbsz!HW@xD zR2(X^TPKfMa#-f7>LE_{e;Ko+|A4}kue^Sj1skeY3R?a>z9T?W(DF6}2btY?DZg~s zmv4)geU=4hW^`r7W?E*ZW2~CS|C&;?i8?Z~nLB57X00ySOU(!`vw_iLZri%HV*#=i z)#?CApqpdmYe4AddLJV3F=1)Y{^C3Zp)@lrKmG1pNZdpB!%NzJ2|$)&0pp;8t*?J z9+`9|y`8Mz?JWCG5ftsZ?$8Z$0mZ75)wy0ChICCu)}EhAzdmH&4DFgaL~n@P_+R!- zdDqmTdQ9DS;BlUDxI>yuCT~o26$xl5z{S}@nx~9VV=ciVrYk4}NYbq8y`Kd>w zkLGDq*VH5QG>T9L`KeCV)KOU7Y!`|r$8JXq7C9h?^qoO@Q63?>lPUV6?<)GE-;G22 zRQ)6A3U+$NWm0|Tm48h|o}!BiUu2;z$qO~W1W+==3n{-xivv3!d6)m9+j6}~zstx% zF@hsS6a5FxDiS6%LJGIVtRpNi%AD}-d|#RJi-tuCce6rUdVvyGXo;E@)jJwOuK7EK zo_^D4e?iS9WtWr%&0o-t=o4nA$u`NTE~Pa>sy7E-0ny$B$;!ly!Bik3xn>t%Sry=T zqW#ZKU8C(WGg;*uz671|1SyUumIc%2-q5S<8O5Bo{ua{R4@s~NS?Jl|Pyc&(8Picg zQ7^jKx$bQe7?)y74gApWx8%kz_yclDFMFrd$NqHGvmB;y{jVD55!&L_ut+tJEr?FF zJRGd}@(sPdO{^0+1Y>wTN}^iIE9q!$R%+SAOVb5vy3Slw$7c!P3F?3`I<8d{eBpl6 zQ*O((1_IMH$$a_^+Zni$_sh5DEB;&MyP4*?y{>QiqOTjU*6LC3$lYBq;ai9_>#wT* z#=lrU$D^J70|&@us9_Nw5F-#|>m?xaHl|0>Q$g3v z8_<9f5NxAzX*-GCLtz0dnXX^vTBHvNe@b)L5SS2_#akh8{q&zn?@5WEKQN4UD*ycp z;txT$0QvPXJ(m{q;|%8cX0z)`6HB61Jtu|1xeHvsYNJ1iNY|I9ugb48YJ%QMXZeYc z87rH~is$wTG(cGIJ=~gD#UF5E)-CHgI#J)@H5M&c zrl`tow#wFg5kA)+iJ1>(r>WY}8YU3;K=8%22&esXjDQ+EJj^J>{r@$BY{F1G_r)Zv z9-Y~Dob?-+*@qx^2#uHcI{R5}+7^$YgvBTuuA)JC_qEJ^cz~O_P7eSU*Z9O>OaCCV z@0j%b{K_Td#XKO^teTx?looeKyvqfiM_VJ+fqU*DO&=WhkyDw~W zj4oI{cVrVXVuahowxo>`R3AxS49`ql_5nU^ob0I-jC0}U!bJd4q$>m-S82wWcfDEC zWM1H36PCPGwNgs?&V89(HQq)vMbX>~LVd)q{Z`j!4bWzF-91WXB7|?Ey=}i$TGo}* zc+g_=RdqsFseXTz7IW{h&JQax9}aU?-Nl!s`-j9Blm)LjtNw|PgywQqtmb{;HU5PC z8eD#gI!0JPh%MejAZ60jwy=g5>v>^EMl`4JuYLJS9iIC?yzI*TQKQfgh{6@XXU6AA zeJPx8vc{l>8{=lzr@$!jox7I4`2O+q!O(Nqqj6a2u!dZxlUqyT#K?y|5VDFcTv4M@ z$XB(yEkpbn<+T2~C8Qu+7r}~StS|;|^NX&Nal!IR%kSNL1Hv^(RB)NUC^$- zm>+?AylXfck~YikR6#*i zDoj$@3$^{WWLq_<#`SN|qSjSDBvL3q#s->mC5rSa)W^$(5}s+Tmeat6Tnv2|XtNr^ zf}xAt3~uKZ1G+laSSR}^5BYz?za7qbSXbH;e(kcvmur_JJxGsC)W3j>dm$#~ED7%g zwk)mBC5;($Ss9uW>(JB5e#_wQh4KWM^iNHC7s9_bn0*sw?JoKVqJ7RTZlywHr-{`( z%)~_BGEi?rye7sSLPh}21tC2x@9fjxEFWX4TWThle;9rn4S74!u1`8e49qJCQ%L&F2dwT^UgZ0h|Pqb0wgx_)wX`oehkiheY*Kl2KH zLm9iA%#}(Ajzo#BVa8 zdYS=qliSk3HL<14UoflwvRMQ+r4E0=?E1@QJGl$Z{RQ=exy#{j7@I~8j*`HFI9rQ8Jq)k@hk&VuAhqS9w-RxdTKuZzd!J#7w(i2oRL{%c0a*&)uK1UwO97Qaz1Gbn-aBbtZ|_jlKiBeLWrXqYj^Q4{N*Vad*Yl4`}<9l14z&9XyGQoNw+HnADgF-y@zd&`b5u>Q?f5%YA9qmI*^gbd;Z#din@}A2 zS+y}N@w8Qo&Hm@lMS@vLY3{ym%>06zs;YPxuCH~}OFymIrHk+)DpK{^HXgMEw?oFd zCtGq9iYkp2edYjR;Qwc&PEyHk%E@gedAw~2BB|UaUb7yu^dF}{%AF~i+D3RD;F^YV8Ld>`t_EE%K+ zrHrd_7&VZh$fTJb1p7d*kHI4CjDjE^&9D88&nf@sC4Oy*;n$2j;Y1DonjhK0KXJg| zPXKT;bJEx{u@U_hrG#yv1HVoKjWLy!O#bAmM*j{ z-e6O+v9vzr94xJuZoY#&1Gcm=uz!@>ayh$2&kk+H+y3RvzNf*=Jsfjx*rHf4UxXNajz0uR5DVMN>&4hlpG`R1w+_#|He~FF^=~3ifHrwum`(O$ zuxd!CEn@a&N*(tG<7FADtPqFs4ms^53y2~>5XHsinckC~4n8J4eqNPFOR|fxm zwJ7@)mC5{#vze6UeGshwWLd#RKrao1f*%eXiWRLO9PIr2&ayOjOW)G*&WvPA`>28V zft;j8loX}65b-*>|0WS`O=~!wuwFY#A|7ZfiH+A;gl4hO&smv4 z5aZlCf$y!yo1=6+pOEM^;oO_3>}^oMvmOKj@%rtHgV@Rm#gg5YC*8@~g3#xxCr*zEAC`hN;zvDx)caWbE!X3#re7z(4gH+&`JFtah* z861P21PqTdjq?qN%C|&_#J1{m3M#yZbeauv69hgGZ&g+JR;hfoD>s`*_5&=JW&ZaC zfKt6ui1WJG{`k63KDN(Uri1WBJjm?>koaN$Bk6*PRu#%E%w)7S$Um=@1jxz$96SQ^ zElUvc1AV*z84h8G`~&7$A4_2EkS7GaX=8^xu`Jz$Vd#Wmtw~!hR-bkifkUqoyFvUG zQ-hz_)Xy#$rU==^JXASv26O&`B&ESlZ|U(MdVG|D&ECM}Tim}_n_{SC?n*`!1g)K5 z;!+=D!*koITsWC7c_3016C3h~V-7i;K7w(=u8c1V=;1vV-0?TIAZUYeMgbQ|fZVOF z_xtp3lPy^3o>_x2euQHStzT{QKV$6dub)5xjM+xlU%66qJoj+=X#Z@2qdk`56v`uy zY0%hAL?y(; z@{M+_=S^96OmPHz3wtm+U@ers4U`UKg7DD{o$O+V^x4-9OAm$iht$5r%zfH2b4TY_ z8fNZ=_tJ+OX3ojU-oY?*qnza*P~X8Tc^@11nD-HE9J1u0&WbZAD(T<22C!Y9=$oux z*=I~=qOzV=G%8N|*R?6d!B)lOm3=|dTds?-@o7_b1!qHw?U}!f2Ij?aN*of;EN>@a zq|ilt@p$)gVT=)ICNR=~9o2$Vn9n!Mq|RmpXq}nIGr1qMXaAC38E$qzgsqtHucF1+ zp-Jjr{*+~nu|33}UEy#1`G>5Dc56=VTa;b6gznLH#JtL`rmxXxx;oQVS11R{Vl~*@ zUu&>;O4Ob{9TMa8>DR*DRA$1ED^CJBB$*|$q@6f;oq+M#8~k*ej-s|M3K=Por$=35 zIjyqRbl6Ff#}~HqCE<1VBlLx%m}&-|BA-~8Pa7GJLkw6!vRc7)gcmc{8rJ@Kb1`=1bd#5Xm28(KUwy9+X~AM+6$Y=Z(CR2sr{~wEwz#wr~H+M+i*6lSgA+Jlk??mNoKj?rd3Zx3V39+VeC_U$x$9572h%k zv`BTQQbZ?ZCRRpL&W4+=A^%zV(Ld${taES2nfdWQ;b{g1EV?-wfAG`fZ5aDrW6QIX zGZTLnNe@L*O0HWKffbiOw<&Ptj6B~&`@?TmN6cYM6F z=hI}#yf`90c4s_)e$>0zr5xl=@yN4C)H#G0kL-+RHnlmcW|M8`#i{s%YpI;%iTY=q z{A6At7-G`yNFUYc&t`{G-NNK1;)7AfUzig(8<^~xKb^ghIFATl)- zL0pcwq0!HpK}zONyd$${7*>2)%PY-pAfBxpf1lNn%(Cq|~QbJyJX$i%qvM&t?_^y&E%XWXyxP5KWRc-_ud zhUh5A*yz~K>G|>>yDi&6mlc_b?UD2npy-2sIoVym&h;)U5;c^w2ScyI`=Cb}|Dp03 z=)d9;9MJ!Y^x#mlDWYbA{?IUwEk_ozTqvgyWWxXZg==p9M1%E$8$g!>`z&DJ4%~-; z`G6tB{}5(VaH+?E`7b33{C@$n(Efhmcz;-na3+168>vU~<;#jNFB;I#&zTPVhcKH8 z`onzg$AQ@$dWUF85jRFQlq+Z$R11ooZYb%2I7{v86_(SaE;I3I`YSRmzgRra*0sXW zv+k)bY0;|;(s`Eo7rTXTL)?q}od~GT=2*i%Lqr?>lh|WL3rE5Uv=1V%d~5XQMhlOd zBE&ZxGQZN8GQMTl)qkAs?NU1Af&&-kLNzqK#E)|leeidwB>&!b1ttA^-^;1H^u6e` zIP-dqi$cd=Zke$g?JkVw5-<#Ixt~Xj;$f;ZM`&WquI^yW^_WAnYq!R%Bw$pJ%{8WH zq|WbfLXx?P(~8J9jOzFeLW^Ki;PwwJ;$qQQjl`q}bG+01=_!tJr%-WBmeC(X!P#)_ zOk-l`ZA<#?W+BRtPohcrm2=-^(XqR6ChOcgDKfD>FqhlX;TlTu%+t{z&?G8=X zM%kH;DD%T3GLm;@_fUu|7D)dukbhz%D|E;hoy@7>KMRf7!tH!7^U{#uk4NK&f(301 zhdcQuo8}trdFxc7$AtE%2y_I6)`6;{bkD1wbwX+=m2PmB5nfFIKw{*lKTkykj zwMtqD=WDt1JP0Ry2@jcVIPKZlH6O&BlWAVUYpzt+&qJc9Y#jP?wZWR8zqwwmW1PPA zhG*nr%Cx!l$PDK@_7A;cWLM6RMfUI5lO>masNr&QirEE9FKCcbw@1#68Rid?-cz{_ z>OtQqV>=?6a>PshP11Ri&n+|?3)_bn!_pPa#zvFvev)5pZTlHfA=qIoB2VYT9aTO&MSw z!&c`c<1~%UJzH#}X|R+1rZ$c`$8Fn}|D~Z&`3HJqJg>eAP-+_SixaI#_-^)*Uc+(@J|v!B^89t>Ez-%f@x+=ITcLYrAd z+5i}PZZqJ8skGYg`45_BC-+_8@G`TsIq2nE{Gqj^j*s1(sBcL*`P2Doy68=AQXoV# zhvrjEalnd$1N4_%=wE=HpAdOMdxL*YrNK2gq#Y@Qk1ZRgIU757zZ>~iPEy^1F8WvYwskBTPg^sc)X z5MA#Po3+8&(1|ob*|Bvw*;MZ2{seF;-i>q!+-gmf%7)L6CM2n``;F`P5ZewTbwiIQ zO)$`Q?i%T$2&s%azkDnadBKhBPDDBza?j2Mmz@m{^FP&So6?n76)ERAYSr5*|4tbO zBfP`Ty1|=8DrWFc5AWf!WA8#HN6xh<@CH;a#Jr<=)i&UoY2$nA;eoKKvXVumi zhRD)F?JQMKjmTf&d=mF*OfeIDoULSuf3R}~j4dlXO2T$6dd*t&W@{UILBhkb`1xS@ z+lKI5P`J!sEb~AukJ{d(`&?(044Vq;_+#g{IRmC~JG(apd)*mft2vTUdome$ClPru z5!qP3ALOZ;#4zmO|17NUFaU{nC2oq8FM7CeIVCZF5)o+dC~i`b!VEUsnl|H}ElkzE z+lSe(lDpR`t>o@K^)g2!fGwr-ED4>rjgd;0Tx_}g^HTW*$LBio(~ftNyZy=4_^^Rh z(H`*;|GX3NJk!y+f0*-2=52oUj0~O95P3TDVq3g(*NCC#aRB+MC~3M9k*&P&H?&cz z^UKaeq$9GezT3&m5+UI|%{L{&2JKaD9*bLE)in7Xk{*U&;2Lquo9h7=k?c|eihX!JIpGc)D=-kzU{HaPcs5_JZ54f_;R z@w;@wcZ-K%hBiwJ$Z9H^@&3HT-Oweh@i{irFLj7{-ej=Qp8eq3L<`V17@i^IB}`$I z*}uTE{$7EZHp-x^c`A#mVO6>(FSL(Vl_vlPmDvNXek72YwWh3$mK^;!7^0oDe%+Zh z_J)@qS@?2OcuKxUi&IX$(Ve-wlsB`k@3tenZSe1|)`IJ0?%+*WzB%fX@^0H^US*yR z(~@Wxw+;F4M>y%@tn#5KjV*6raQ4QT`H99vI2HN8B^KkdCdwpup^!J>-J@JU5^&K^ z3$PzsNHpN;%V7;QKo%&O5Y zJqYoN*73G1{@`xb#P~zH|7|6I!u7fh&MAEs?0Y3&65jLc9loXf3Ziu;qmuZ(>pb+Z zwJtnR>7<_Up2}a=yZ8A?`Kps#-&gBDd%&w&8XtOgdE9#e{KEJ}@r$h;M_(-2zE*$ckgYyM2_WvX*D(}LF zy~WBj#Jc0&`%G%=`tSh$-DEtVL)1GX317{Ak=4e-ljoyc5J-J6?7#>CV zGWIOH%p<2xs&WD&SeCvR;`^XMci$$q9AGi&ohl&V-T5*XGsW_WTzSDUgbp)My(&yD zt}m=ptq{z1u9aL%6BPp&f) z{zc^}vn87vi)Y?DIq4sF#U*VEWzPMec4n#k8p{~25o4IX5<8;CmJT*CGvJ9vCL>QH z09zricr6dZQdPMGm(&$Qd4yrIXqV0UBSioNF z-M^ai80G`YV2a_`Ae&;2TOUkVL2Keg4+{c3RS0Ou6-+++_ zESIn!&_NTnA=NCKrz1YGHfEovE`64`U`)|VM4t~izz|qKAY{}ph%ct+Hx>I_B1CIL zku|+cN}XoXuMhDkMMLZQ*V-!w>%41C`{Gl3c_;^gh%UNcGek8;&d_9-DkH+ z_I`-r)!8TOwFyaE{HCq9iEJ!n(8~^z2tbB*+2RU(*n4Nc9Wuy2!+OX){k| zmM_xK_M(pnBUoI*Vgbu*##KYwWY(r@%}fXu=k4gqin1?^EkcKzJaPGpFQ*MtB-ACkcDaDA_J?{i^N$jA#+%8T7TJ({DhRtu_;C zrkQCr)Ok2@KL=qOIB|1R;RG}~ee~IoT02-&P$CZ87ioFl7y^mVZl*}de1sM{!Us0g z1W_7ICto1ks4&}JzMUvyz}sen4((b*g17GM?Y)>OKf54nWGlzwv_Rayuvz_`1UKxs zn0^LNLtDX3-qU6*s9=EKx53@7&G(|f<214Kw(9`)ph0-8I0)DOg+Z9fAV7CZZPX}O z0_eRqcoftjntDb0HE0yB*xH)GBqHq(9_Bz!cghuymm;C9!G$a=h zQ+=~O7_wm~O1Ox~UoLjN{(p&=D$$ojuFNb;2NRfEz%4j0(X~iWq$Z|)ijmxZ!4}pv zF+k}cD6y`W|fHv?-&qr=IMzvg~v-ktl-E&tM)(VYjd zs!Sizl`)3_S$YyACz~wfv5_(}K@xVU%-JHO{N)lhV?gnv=mX;F;j-Gs9$<*rYoM6^ zPbH z*dQxrPCNc|%mq+tz>WXsO9=a{{ouo>+9Sbo#wz0k$-CcZwmF9TO9-Tve$cAyUyF&l2&=~oa+B;MNzFxoL+vqbg z0Q!U4n>md}wqV98`vGlBv4n%F8pj94Y|o~@A$e=-tfJBa4a?I#9DWp{Q3hq2^8JN0 zgZMHdr1R+W^H)?|Jmo@hZ9+MtC~7arZRjQ+*QzvGXgw^@m8%(fz6rr#l^(&&Y z?s=`LrJn(GW)aZS1*lV!K!p~l1#S8wAX6nE70I~>VaT^gCAxr= z()TUY)c^)MTeZ(b0X8bcTY8{PDLxKdHsOH&!^fwTG0g_3=S5;o&&|RSXdh5670_p- z)eYC#=7ok8p{)gKoPZkMuAN8oKLW<+p-9yqlBJtP0F1^~bh~$3;aHZlb`ak3|C6y< z^B*)el)bI;?7&R;XT7_}+Eupx)))~89PzMV^a(0QDzQVV!&JHaM;eTK4wNmNh8zO; zSJ!p`h|GqjY4+=QV}8*S82PsGn)29P@r`zaU^G3`fo=p#67a1%7MLX6F*OC_$9?9p zeqZauLb$v2#ILZ~Fef4YTj5T3tWuv$X&hR;x#zKBeYt1*BW^!rb+Z2t02f^TAjjum zga&AyN-1IuuB>4~3pyQK;;+MWW<-kviI+2_JCQ#ne^1s@&Gm29N{>5)Ko@hy){j-< zeL&7P2HAqNsqU12+ioRg`;D_8EZ1;IfTsl_@a?!2LgO#CZf8WtEA^Drs?g_EMl2ds zjWzq@dX!O)G5^rrKZ&Zr%+d85omG>ec#TNxtKF7IaA6eL%3d1-_r%m8$^7`U3_IVq zLUH^S1bQbm_Q2e@QKc`Zk#JIw-$u4c zuoE*AB3CrT{UzlM{z*m&W9M-`-is0j1L)6mB|xpPIt4>=xYeO>x`6U&QRjKyHw`fD(u*Y80$&~=XiES=qE=x|I9ZNh~9 zn-w_8Pk)`wnsS?&Ik$a}iFZ?zF1UWq3^WW)Or|MiLFY9v7yT03b(KIs27}}_r(LU{ zlZzSJ$Fc=}@Mn>%1)dZ3*6`WTnM%c5&`4AVSKXsUjWoe_Y)+we<4sfkTb1WJx*94X zUIQ|N3n-IayFTh9$|v=>y7ojphHG98_e`HLTM$^sE{$#r?{LBMQ>5YW-YmF!cZT^;5{MU*RY- zbRWHb?$i3|;)E0Hu-0lVMMw>>RS3?ynE{=~;7Qr;OVXbMAf4+r9MNEk7N-)VX)_cb>gIQWhDv$=hx3I)h3quKPb%kK2^^ z&U;Fg(jk)f+`WHeWth>JFYieDWNr`;db-;Uo}&$@TwgqU^@dZU}G<+Z@ zuD9bYt>Q`EJDJ~@p4bM3Z+)fFA76_iCJq@g`nY7~>#XoH+rT$}>*>;Xh@JdGNXIb` z$JmU0ND6;gPGNY>~N6hD{UtVOVo)pEGlJP?peIZMt@GB}`W_9eh{uQhg^HFV_iI3x{VcfGJe4~tAc?Iv{Oo57?M)N-N z{mRI=9e%vp-TSUkkiBSE3KSGO3nm#{?|@RId=4D2^d3gcrTnx=XzMTB?kQ0{_56f(Y^dSRjD*W6?QkSA^~10HbYT?P+tKS4$APyTdQ_R7 z8HksY{%8i`q|!jx{pD4atrP8vX4dR4TDtl1*EOd8_ZZI+QeNaoKOsnAH_Rx!!3nA~ zr+BM|QfO9R{_Z$zJZK!`9jk8~B>%_CbHF&LR67n>U?))Y^o@fd1&l*S%7>dQj>EI* zi7EfMly~f*#sFXs>i_>P_5W?cBX(_eaC(@&jDNU~NE-chS9N1O$I32d_L$B#ECU^U zR=*Ce3*kT7PCo6%{bP#AJ_BT6)5GS;%tK-P6MPPnKG!?LzBk>?JXN0ybD0h%eIxUk z>5d^+;Z7t_LI!W2txxdfe-L%y$Q6mF+gT+mzCvJVeGD=)4}TEs3M|DdObX?Dyephy z?!)mbwZHH+vW8ti{>&!y_iF#|oMlh3P#L0{nE*nw-qKM78 zOcL!0O9>OlhqPc%@fo+i(0XJ~ytq%R57MxEof;pA%5KH+(61ERBP7TJNM+#n$566$_?+l%m%<94c7@ooFqw&{d{ADZz<5T{XAX&Ed*QSMr|5exN$6IZ4!7n;^ zx!F510Z+(AODTG${8(gl)j>XqGqmD&rrkNJ5On(`L_qI|rN zJm%!KLv1|%6}2x#L4Ptos|zPia6sf*93yVS z0xh?vmNe=L)!}5%B6soZA@c>%dO4_hL2Xk%=T28iYwq7{g@%+U=T6twb{Kfg40tD) zceYL$hOJ|B$i{F^#`NG;!Okx+^mda)y}Hf5qG{GQfF4tXlJDTkPStJ1aco6l4(2_= z8%$tv#uLUM9OZ43sJnOjJ|u~WPIpbpduX%r;ceR$TH2|C#i5azc%AVw2Trb9!JnOF-_S*V@t?{P_oZ|_<(WNzN}U3}^L zfhqGDwhJ)e9YOPRnltCbx|TgnL68R=Z_xY`Yn@yU+L0o}2v+(1@tDXrD^-S#6*e1h zgXOAcQLS6V*OcE}8SH({VjzMtC-=i)>a0|45eJLmLGg~b*?2B#WIB})4{ig*ld02S zQw|3HWqb;#!f>WEdar2uXg>31t!W%Gx|FxO(R(%NZ7!@~vWE1j5e!ma#<{9%A5>q! z@x-`*oSRI%24_PyE@PUMzrvW-AVefK<1WK>8t}!&4^>huQpE>K%KY*LIYIJgA^k48) z2S3FjksvT;(eQym#m2+RW+MRyJDuzql-S70&lJc`L9QgPE^68sHY!BMC?^`@l!QOC z{0{cD(;>s!+DrcMk%I@8_7=V_f?dSFVw2Q>YBeBin|1?X+XgiW?=v(>RHt8)s-@sJ zO)89`j(+Pws4ugH7>%l`nxJlFY(9?KY;|a3fp!&-C*cTnSokzT@Iq-ot1k-Eu zaFJ#Y(#4qx2j+sVVt)*dEC>qU4wZ0?4Bz&B#Thy7S+A=&(3w|1&;giRH^F_xmTuBq zEu06_GPhmC!lkU)VU#o$#1b{iDGsxE8E|T9%qVaTZ9+d~42EETnI6O4&X@2pVUKx5 zo^kG*6dk+892)crJ9q8fHutlW%7c?%TFnA}WmFzFIa6ZJK&3}LPy-;OdU5W^Su)l+ zFLuB5VXh6>Mm0Y+Dl|#W@q%f}#Hm%O&|NQTlBY4@Q&c;)OjBb5O$INdkGa+};r-^k zNWQ$?)b=Ges_Jlbx^%O6j{#fC1Q{P}0|Mho$+>NlllcKB2B`l%Auc$$9Lhm`s4eV$}ZKgTul^-H`%)eXK$MCyYmZoAf<%=5+;}<_H6oK zfK0Rot=FY^T!xEjf}_}4_#cxcYubS?F@y-6&b?2ZEGffxI*f>6oA-#l>--B}cZ}=z zTs>~vxE=PRyZ1L86yn0ABFh!>al5g&UlN`W-VFWgX>PRjE$>>(ZJ}qEGijZzlOP@O zPP@tYQ0*?R!Jpn#e`afU>m{OpLj+~^Vfck9O#6ht7%rmMxo#mv7gu0wpKSQh#Zj|J z1UtTPSlJ{maohU}UYOZzmi-qBlgXrh@h_~#wbONG_?TF0sm}0*V7lh|8dXn6;#3?; zn&5nuaprpx!o5j;_O846%rumZgnlJXg|%O85_e6>S}OG$(5AJ#ux$dpXZJP8_5K)K zbN8S&B`I({{0;FUCiH6)y5oc4AJo9$gL9x&fYspbvsM^CqGp20n{>gYG*&HDo0Q6| zdbB<``oY7>6zS~^@lehUn_#qIvMtHB}j={3IaJZ6| z@&KEQk-Cf=yM`p{TdSQ_(Kw~!Ad1w_bWE($TFM9>IbTcS&qN;jtd~@StjNOcRPe->a78@x5XLDa z9=sq5S=EIqRlh+Cp*lnyML#RDg+(LF;E&CS<9D!ziw+3PK{HLejo{Y_Gp`D_8Qp1& zo;?Su!x0IczDU91uO$@}Lsm$0Kt1pE6l>?~kX*cYrhnJV9i*^i<0()K?*wz$=@6Xo zZLto@Ze~=GG)(?)4G_eOv}M6BPVP5z8ojp%&69&CQm|>p;RMKinc1LHTE7@_gl}5P z82t6V!*q5ivSeDqd#`Ygcq}6aVQ$645NLf9E*L)3PQy|m%&}ilLL9MnBq?HgPW9FI z3ZGK`_ly;3O*!cDPyp;^E~P-k4jz)Y-AZws!kP<*#>28pkq>oFEt)B&Gu@hFcXw%y z8OwBzcK4fPh87)Sj#-m0YmyPX^NgKh^0%NVMl_#(Q*74wLryV9-;jEc-Zo!WUv|;~ zvo$qcNLi&>HoAqLVP+M+{*IYPNkrq=biqxp5-!@UX~D59a-z(TV0DD+yI6|b1p!{f zM5gPXFvV6!~it_dB@ptH$tI1fxjPXEGO8a=@`! z`fa+(M2zs33Dm-Bx~H`Nkl2OYOtZ)q$W}Cied{AO1_v`yhay?WoF|g?Q-R(`vO=rZ zw~8d|bDbf{YCI&#dh3uR3w+Zc_9tE7*~g$>!RIds5pT;|{rSa#(i3w^OSGrh>wVIb z2BatFlr`oX`ot%lp(HLU8*%*!cG`R(|0mz;Z*H-!P7C0i0CfIW`D=yshx6 zcs>!~9_p#3M$8k8cwMwl!FTR9B0RZPup*DBla&}Bhs{N~r!V%%=qw?3rW))K6f(S^ zzXiFztl~3TYn~ZL|R9A8@C_Gb(qtDPGVbp&(wcGRy`R()YPg*Z=D7%?zIWg3Hu0{ z=6!SC?KMXUl76Cl4hM_ke){n_g0xQE%+?bdC}IuK0P8_oC)yWiL%Ogyug%w(bbOpA za8bC`O6}Z6E#?q``P>xuR&M4E)o6X7OyNlY52xBB|nds-adX z!lxT;JrizflsQz+NpfL-aODomddTCb)mNE~Lb7E`V?MokPF!}TXD%4vGrEe6A8VIA zJ(uz)b~4ZL8a={Uy)m<|4u{CmN1W`%(5}-v1Xgx6w>Xt{vT`_Eazco=dnM^MNtBwf zZ@KSqW$u?Jy?`Ya(|nmO-u}7cgwF$`Bfy^&{VpM98yxgLfrLKyPYkBC^k&wGIl}Lu z>8RW%_<|>zm?S)5KU})q^h0(ZxN(RA70e>FWeyqqBheiV?2y~&kUkN#^_V#(`2A;% z$IKJ^cPlnGln*@^Gt9}Y;Z{oOXz*<_mUUmoKsn$^`-*~?2sgOUU;XFzFgXdx$ z0<6}8QI+yu3|=@@4u8)BOD>Nw9+>~}A#(t)zpoiQ0V(iFc$3lO$b=97H=N`gQf|z} zo$Q(F#B*l1z54jl1E$BbyU7;%E6=`cijdzGi-LcB+@fH$a?Pr(lFtLezF-xpsv)sL zg5$SnFwZSFF(&X#vR4JZSXQ>Xcch}OK%}RX6HnlUDlH0pSHMW zW>Vhu%}}vI4$H*E?S;Rv^=iijNn#ksX|1o6bPdi^(x1xgKi0{8NK385cDb1BTK)`+ zN2DFJD37GS10jbXA%sbJ-;$fAgYZ7?k5Y>jbA#4zHLdJ?v1;VDxHsJ3dr^=lDI5Vl zHpQ3D**uF@^cH?2!Dx{`w_}rDfSZywzLxy+od!k>CU?{49YpTrT4Ck_EQS{tD~dN% z#7BAO%S{t`Z`J|Dd1k_@F&|vhWT1VbCmN9-3*Ub4>*Ks?)rqYkL7#?qCg7M6EgjFGlkV zuNYPAZ%L#C^CW{?qcEY!=*>n>MS_EvvTb zA{l06D_-_iWEPLXgH@HrPcQR{Xk}(mrh<3dNSJx(daZvviRUb)7@e7z=}mKz%x0)1 zLwRrda1al-1@>IGe^rffC=h(@C|Jan>uu$}ty}`^Sx44-iRF)-wi$xSRY__t?+$$Kb+Grc+#7wuu zm%dE-Wx;6P<23@J1%0`y#+-9z(LU8+k?gcYQ5*ATNz>|WF*-feK}>za{8V#4TKB;$ zq!lI)Z))|%L~!;tngW{|vU@12COsCv1sVtvooEu3^ViR2G{h#iDxmoiR9{siVn?j` zzpOu(x52NpA+y=(2#sTdx63qXsU9lLb^(ltfkHz@8*P$bkqLhCmBHEKSp2Ie4w0?) z0kzCeWy*sV<;!fIUF1fM8;lsI7rpnarYiF~wB*Vf5#wm^#BW#QAIY>W1Wv#+y}>5Q zw+@DD)40KK4az|uMZZM5idp-?wnBL`n=8-X)Gq#8HsC4$i^OUkLsez|MJ)MNjb^2# z$YP-firMfqpRt!d*0|-=jB9xWE&5|^|AxU}ZmC{iF_S)GPn)JA4EOi-%3nEJ7w3T& zYMjgk+}h9RFwf$F;xHi0*4CJ$<=fg8)>D@8H%E@oI?KMq2PN1=-SVKhkE?cuMW2W$ zOE)%RrI3xN1n&bY0_mx>^UHY0PJcmySMSweNgUU5#18hloa_!$o=o-XkV)WJzm--l zE(^kl-=5xbT6OxEKAMD&5B!fjlK!95j%|Hc;R-1^_@XVg^%Ffe>6Lsk zR@qnS<;HT$Kgypr+k^!83$@D6T9mR|KT()trgj3rvAfC|Gkwxd68A>5!PbI#eFlkS z(&J4wk%>3#1`c(^3EJO?4`xIH~%!uoN47e{DxrZ=l%LVZ`dF5#cWnV9aV z-1B=^lc%xe_bLCF#_v2_4Ir^SU6IyD$)ogj^|I=tT55ZP6rXilQbvti-!Qpuzc%K7}?so%$9Pu<&AjfD^W#rk9wOLTR0=Q zXYB8io`P|Ef0W{?X~wCyW0WT{+8p=FAEgx-{w5wRhrmaJOO2e(oGyo9t25du*>Xq^v1if|L(=7K z?h*L)-Jl~KDes;2SJD$fVdhU@^jp6dC;qqQ^3u&3>O?(FP1mreYKFySp^>FOwbT^8 z1}c~MHQKAa@R(4t{c1la0nD<;)-qR@ZWdM#qO&0oCY${4Z%+P%IYbRJ7Pw0f-2J0g zh|F3r1xn&}wJkUXUbJvN6^9Nm#DGgCGEYgohPt-qBR-hBw7H_}!-6C5O6L!RX>3fR zsg}QiZK;+`jowC!OdBmSl{cklas)`o^fXAHze>2hxvupJx1~3;2_OCY@Iw<#M)pn1 zPsF42^Em5%zpk%*a8JgLS)FJC<;$B$VLtcV z7vin=Ue8_PtIRBwoTlZ;xVI<1K~oI>)qeo@%6k^|)i08uIq0@vi12QFPvZS=H51mQ z8&mh*_}KRvaLawIaGzO_9zV@be=sYa`5-dQOTS;2uH|;fH1F5%yNq}GXr6}Zskw%y zsO|_Ahqpc`1o1GEL~D%KcP(Dxu0e)t;DNSmMr`&TVbq#Q=x_)VLjHyXUC6?Pdyr0r*LJNc$_s4X>|;7dPdz~B|KUxz_74vj$6&91j8<<<za&C6#>w2ONey|!*VS{*@;gUJ z-xh-uz2oK=jx^>`sj(aJkA;Q%cDJ*DqLV1j^_+^Hv^7Npw@w1r?0uTynEU?PtsB7Pl?#UH;Am~x09Cb~u>Yfae36LfTsD!LzJKuGd z=*D|ocJ&iD$+N>bnimL9PxwXhYb^4!u(HHG*tiZ}efn2VonAJ#ox81?XTXauuNk}N zI)B(qm{2aiyYeN9a*ir+faZNXiOqGLB>~Fkbx!ssDs~C$R`l<++sS0@t3DrJU00+@ z(&yu=>k1aHNqs)Px~`bTbDxi|t}7BeR~P+!)puPnp6Aisld9EB$ifvkIh<6}J<0IT zdamNRwtG^IzL)5y-A!UjQ)3Pj>YR(znvArOLl`1g$>cX4Xeay|>SUI*GD%i-Jf?Jx z`XGla#r+7zY&CAn6XHGRSvNAKp7m1z!Z?v>j@#F+zarpW_ll|e0D-!rF1f^7JVS)}A$O(+OWk>M2aZW7p11GRI7|7p&T&oLi+gFBBgippzw zt)FMr)2aOG+BO~&-d*NOMqz}0q9O>-jUH3&Y4o<44T0RAm6>SeIHxL_3(Tr*3hF1~ zyc#bdrmHDvErl>*&4Ol)N-Qf|K(zvlH>=GHWRBzWx`TnZAQ*8-7)`B*0MGz}{n*tt z>o-$E5!R;CO-l4NKBELBjZx*n+S9E|2dG*NNowS-;4ZO+D#~=$lB1l-!q9g` zc`!mn_~o^xns1QMZz_iEdT6v6?3(&(4QY0+`yW0VCv2JpsC*uyxiukHj@_Eb&+AR* z8!WE~apyz=3a*sL$(1c;eMtI?YhY&7t&-rWcY=kQBC@4k@7G>jhP{LZ$@$Pmm`t|d6ONdP7`xd)HR5f{**Y}*=;Me1&*|>sxL1q zYl~;D)9M{jw->R}Qr3GZl4kcQF+)ma8*drj5dTQo96T^x$Tqd6ZSB`6_=7?noJAjh z#|m6{dVimMi7_o!c%P?4t)bC=4SzJ%peBj#Qd8mcubB)zu;Z{=EXR9y#8zKv~`ZK+q2C+jig^{RS zU1Kb{np6IN2-#T!_HjuPIUAkbcpN#t7%Xf&yezX)-OErcu5p!4zviU3OCt0#yRg)7 z=ZyxdtcS!39?OFHW?;!==Tca_+cHh1Z#B>a)qUm1_cZ)VW$R@eKdHg2W%-hhqHBX1xPL9Cn=SfJ*40sR#STq%>y*Imp|cQGWfnRW|*?Q8m(>(BZ1pdum3* zsX-X2`EE5aJTqYz{*<>??=XdFHogVnwIu=`VVPO$eNMJUd{-Z>zktN~CN@Pw**{_% z)0j^@F~{_ijawb;oFI(9P#ZcZ$vvh*<21K06w*`TM~X^1$r=A9lY-3a^U#_|5{4~c zncp}+4wq<;2E{4*aTxZ@{&St|CiRoQcuwx&RDSV%v80vG%AfJldt8TciV=y2rOVNE zn2oW6E&YjG=_?U<{Tlpl^Ko%)yz}*{c;@AyY|s!7&Z$L5@@WdP3BigoGtv0Uhd=S$ zozdE$4{^iJ3ZVEyX`anCrS&*}@%*IserNCT$!Zl6e+X#) zIgBMSn(sB;YL+&Ldf>c&B#q)gn&h&b#@4TIUdEU1qT^w+1bk(1`ALk=05Nu)qpN)f zO{cA`s1@$67RaEP<&_QD_YHH`jI3G?oF-v#d%K7k(!R{*dHqBM?58?1uOX=%gD~8VGu_QN>u=!` zybSlv;~v&_-pML{wnY@BFw~;3gLg&xg`AEktc%mK*{Jjz)1a(D*6PA6Qq678J-qNw zLgNw=7bfa`NuI!bqho3)+cJuDS-#0yldwuKMVWo+C+4sXg)G&v*PLDaAI{uCo38!Dx$`um zQr?>hf9e=Y559uA8-Ri(m-C-03&ZJ|BD_{&KLCxY4cLRxC=_!iGE&v|no~ql2-F1M zJdSp)H$z3c;(OvFkU%T$oD^R+Bswk+4`hBA8}6)Tz7`hn4gX`zY={+Sb|6^6>5r}^ zcwl77;qkVIYS&3-mTo|WZN#pK{}3fr@x%? zzXko*%nAO=Dtvy*+ocFJRvz;*Pr^(dfe*<7L6QuAVT`AY!v{`bX(+;tFxN_hC*4EW zoZW;$9($?DbX}~{zh)PG%f#@eS7$np$0xpYhBD2DzKrYjrdKLFB>uuaV^p3TLFn#1 z8x7k`N+6c~hIn7mVdsXbbB>%mhW``z@A7{(|L5_4p>t$LED)D9 z_HqXo*rs7)n@`tUk**|%zSJ9qcZ&Emu6Nvy{uUp_^}+T!=0M1-X^X4|y)AUJw~_s1 z8SP#-pYk#X&TVzvmMO(fXXifOjXbTTv<4A7ZjZf3iWHVe!EcF_#;gs8>z8-=^Jq-!dd*)b2ygTeS(EF+r$-PpE+?mHG%jpzUvoXs$eti8_M}>bZrSv z{%Ocu7`e4v4GCm2LcV^zSuZeU3avCZ;uUZSB7(^{?aMx@Z{B_kk;JF!0iMOG+|IzJ z)O4LXvAfa#jk?&$?c%S36ISSCm<(&0MNzn~<^$vdouJH`^3$P`)6bmEv12S#Q|8kmA*tbeuV#?viJ6@z zZw3;`#l0Iek}~jP=sLKiO3e1mC~{{l{fYyfRl)s%HT$E#2XWzMa{1vCHJ846SWic1uv*IWajZ_FY6AEi+ad zdp=p@|D_HyU;dRZMZK6m3G=)w>nI^CyS%I3O|)(|{23at$tSXuL_-2wib9akU|w0B z%&c!mrdXCHa^RWp?PiCdlfeGW8sm{*{8lXNzOuZ+Xu1Ab0Qu+FG@kZlCu@|E`RUR8 z!pH*}uAZYq{=oIeWlRKsXsZ6r^oaVWh|SabmqdLBAUfB5i#|rK%x+Gx!%jozlN`G{ zWy9j8{Ilv1)oVN5>o18htH$D!uJ!PqpSLR=?&;Q~{2$`$;5{d+FiqTC zhM;#wwC5$+#;2_4>;ADCU-81tma9Zb66&~E^B^e$_{+@aVAC2Cg&$I$u9tDO>~dib zw?+P_pS(Kh?O|cfyza_>gjh5G0a@p{UOCdq8ORH!68q~v)@tz-w=Xh@KtgQQl=*hl z*$WWB!pW{8O;X{1uq?0qzjedYW8LrsDX%AV!viCOzlJYiAKd!M!c`2n^d<7PEra3j z@_brrwDrvt5t-ske>i&$z2jt`qq_|E;%3$vB;!aOuad+#Y%pk?`x}qzE>dE<&R-NI z27KngSDoD96xry1lSZDw7SYKb4~>cY)0jz9>%2$oaAV`~1bIm}dYjR6khAsJ9-MMy z^_ur{(7q1 z{t3-Cr`psjE%KAMVIOdFu90&A=Qgv8?v^X6!)3>{QSk=Ps}aL>Y`9BBaalYIKOEDx zk?QT`Z4|)#HQP2RC78u*_Z3|ZrUnThWg7iraM7{~=CV#+&~~tkq^iJOLlBe%{jqVM z)xDo?2lHx(Ur15nxv6NrE6nJEpP9{Wzg+})QEFlQw6obx$dE~>5)OLylRSsCE9lv& z^fQaYVbTvX>CZ2sLiTS^*s%9(ddY!^C5}BjxOb@mW1x>G792dKHP91uNq2wmPOd-1 z=uzTkCN&_g8-l$%5B{{0b0=>ShC0lzkKx3aW?43BZ4-)^81fuVqPp1{2FBuo+DdXHyC<2&#-PV)Xcnc1IiCw&UZyM| zrw#ff27KQWZ038v&y7qaYkIBHa<1uK^&rk^>YsL<1X|VdS_`SMC??7nl^1J-l?X1Q zL~}66%+sRZshZI5laV7`uVD=mQs+SX#XbV z7=xQAxge6PErQo7*4x46jG2%2TLpuCBg{b~=z!m0Uz<;T;7~b%Et?LYp;UzS#OoeP2! zb+YrIEq&v!oloERpGsq$tX4Ux_A7d(m~qKmYW$Y5j#$@uj6Z8Ob5s7ZaAL%^d!p+f z=X#&P3$J{ZT^5N)wh>=d(RS&*FB?Z;MQ3ep{gu(yyD)?^gsA7=k(YRNp>M06&IZuG zB5arSm(>jq^^9ZuWofWV1LWkSJo<=1l4yvjWJap||I7H8-Qs{j3X8(2HX~%@#41{2 zDM7930ZHtLA#Sc2kRr+F(AU-$oy><2dHdQ;9IJtTw&eG?uz)|7UR^@ReyO<96xJEt zK@6PzQsFM{`}~U)+9f|Rz!)!EeICZ>v47&5S<=i@4LxkNURCr^)g&)U69hO7z}kRq zaL>qa9{vORhJ0Oh(hFpg1C*Cm0LNgSU?@2#*DwQyEhuav6*iOk`0X%&ap%U4rTf>Z2UmB*qaCdk znZlg^CMW6?&vQG7s6dhb=v9HVKg9XfTU^oR4c9XqwvTC6rE z5QP4m0E*6N6|Fzc6;#wVMhfJ4f7U+d-kT5{pXd90U$5^U&wWA8Is5Fhf2_UsT5GSp z*4ijvMtt;-^ecJFtm-tOBb|T~9KnbA>q)1cLz}b?TyRZ#>KfOi8#L2=$umf|UPblp zpGWdnv>vyWRkM)VzYHF|-n{+>vemZyj^}<3AQy_gFUUL;E>pfoQgZoHC`Y>la-gY0 zzO+XpqYMxWsrp5QEShq)7RCv0QyMmO1gc*hFCc`gM0iemld4&*w;i+l(r~_p>-Y2* zLizV)|BRKA@TX>Wjb~un{y1>@mE~=ZCH?DWxUHn5Kk+{@*VLA`Z9*vDu`4m5clZ58 zeu+snGqFVYcJm9_ul}err+XWbnq}$~%j|=nBtcJ3m#z2Dtcl-zFTFAaYNB&7o=_Lh zSm@uVzPn>?*(6i9QEF8sJ6B=rH0d#;cldrMTD*;s7Ev=V;g+A!uZItrYe+z>$otX& zt7rGo7k6FtF&iUuRy?(7@|A3{i$Ju!zTgy2h!{+NK*q4Uzg6g;e+D+ak6W)@j<%Hk?+<4cmoGGD&(W!2IZ%h5+B7elv{?22LD%<_9{=yW?GJ*)t2B?KtH)BwH z77xXlxG}lB<8hj$-I@$dAbS`8;0AJNCjy5wJ|(!n=?BaLI$WQ<*`GLZOYrZvkk4faUgsXO({6CI-g`^O$#UrN zoazZ$6ov>3*Q%(_KjDNnw|;i|3G;{07NzzlVIZGgu>4#m#tjZbrZXEF_}0df;e;Dh z1#cXK8d8#z8X8U>H2p9NJO!DErrY3L>KaM-{?`Q+x5}01Q$zE|&QEC_ipQ{#7lBL) zDHRb5?znQI&VY-r{f=;Sc|Tisq5PG^wyv|{QK&4u7hX}|L)r>BmMJT#0SYjuMnI!2 zu6XA3MloR4+_h*;>W7*p6ME?sDX3VA!);Jje1c{D=L+R53KP?F!il^G7UU@5*0x=o z%gM@WWp!m+PU?@ztdL86xC;2K;F&b+)CA_*PJv{IkZ`+{>>Y<;4!Ykb6U zfb3LTS0HZQFH{NcK@Y6L7?xAzCtUc_eWXUz477*j?jVJUgCAVj*)1h|@X1s4^|Ag} z?>6jQRLM!EnVu@P4HKuD2~onkxrdDDNjyKu4IaXpZt+__!3PUEf38x{6)x<&ZgQ~V ztSdnD(F>bbmGI80LAP@1JWzXHRs5D8@#O;IPV;r}F}@5fJutBOY{JiV@zxf2RH%E# zYdG&+Rj@jp=4|xPgM+$y|T%T?Xs?AMC?g z2E78#f z{(S;jSQPU3$f69qqn37qK1}%Gu-IsrmeKm9NlJXsH<+iBg#+5B^N({lz+x>7abXzy z;q)GmJ0N3As#a$gZggv^ zNUh&h(zRgl6_>@?x=6Qx;Y;`52yvh_Yp98L7!^e^dL~71dN_+uEaTX&W6d62`u@h3M0@ zu&Z52QEG78SJ~ATJTmNTOJpmRe{hfp9bRnzu!fEe%v00`!ws-xfoFzr35O=}+?QxF zTN8`8RA`9fS>bXb^N>7UV)0vsSd=$*emVUsje3-P-KGBGbkRo~+ki4iJ1!OoHSrs& zxrg4c-J;b?EU0)uL#_2hES`N2F9+&YvmLOMr?YwT&rFxdMDc7FX$!o^c26i)`=BZ> z?7@K^b)d(aY&0qzmYVuDx6szO54;83S8$4Ykh`Y*HHJ&i9qkP?xQ zd8W^xRk6TF)N+Q#WKrT5ATQTX8*KDH ziUe67|J<&Dy7Ma8C2sV7EC%4^9_Md77YE!8M77JUgFqx87WY?vTsQkGua2FueBvFo z+L1>RVa55130A>&Lsq*q=em0qUxYv){z}=y2aq;+gOeNXPZRbWLtk#+MV9488oeYjS`=~Ov?%Rl&5w6Q4o`@iZ?!xuS8%l8fRPfI5{JyVhe&M2} z02(++k~15m{sgag6{KFbH5;IFGa0q z^N3m6KFC zO~Fl+!w2>HK)4G*s@ee1*k9kTOT0eFzlO3SqEG(36xnN)T`Y#VSV9XoIrE;K&ah4c z-UPK<75y*J!a|DP1m3l`+Ht@}3qNU&EVYtNyu6d>r&3pN>zkOV7aeaai4+~nKWdrV z)fgL;+^1+VwxTn_y(W2gR&33zsvVn-XZEphKaTfqy=8O>8vg((Y$n zxgwt5Ph^Imuf24SyUP2oyjnB&Vn%~`8oU4FJZ`vxKWqnV&3}$$orvmy92Li+>owM* zW7}@n?OBI#xEoSs5nwooTdnvc$$s6ip=CNBI0@A@hyfC2*UJ|g7;|vsU zBUnte*Txc^_2bGKrtQJgwmyE=v%%~CYNk|dpT@2`x?#eLiOh@RB*y*5U91+KH>g?cZKFX)aJf)A20nz>}DNpu_(J}BOuSh@*p@$8Q& zexdh_n-~hw34;!1k2Svq7HNEEq**kY!kWks+5++<6IhYiwYu`_Ucn#H*DhVn7^bnh z_I@7rme6I()H5^TXhxr&pP9&+o$7`hc{1j`?vxvvx|lD;vs-y*7O7`ITnWyUKay!5 z(qm<6y9eXs$k=cBPNqV?(TH)GgVWmnG0`o!NA%8kAa#fIdnNQcf1PAE_Ad@czwZ>{ z3uB<*uO*ha!CDW@O6d2bBLy5+$l>UB>g~!2>G$stF&Nun^xH5`4N!emGKet_GMN_O zR~t-VIa-Qo`LD6kiu&v5yCIIF@1qcb68fIP4MF%c{1OuS(O!iagIlk@6&)6_95V>O zwZ>rDDF-@!9xIiPBCss*ezbvvglAFs;<>*AO|WK*XHVez`CEhD)*w}gxW8vQbQkbg}y)A1q0+Wg;=V9z3lJMPWNZsv8$=6Jm1fQV*(}P|JdP~!2j;xYe160*V`O>5J+SB4^a04 z@6oRNHTm*W3jI=SHP^K>dBgd9625Z(rQDjsMDM|1w}j6>WPJXYyx)DV*6oH96<3Mx zyvCsLSlL~1IVe(bB54hKO?#$72?GX3T_ZktW~qKR{V|%A?~E!m3t?-N)$CX773tu- zSX!L#<&QNhO9|giJ@iJS z_dQJsGzM-``1fV?SoC_B&4kblVqwH?iN2FnqbZr%Vxc1=0Uw+LODZ_we~3^?q_^Ez zdG8mb$0X=i6Cu~L!O2X4uaLh|lWPXZRvcvwLbc#+43!IbG^p7u>r>6=Sq!{baa|56HyyW}3SJrm6~F3eNJLY#IKm&~ zT6PSciKbu@RY$P(n6b#hV$-EL-Mko>Cw%!8&?i(!eM^?0%{$J4@(FqxF02p zEQh;Ps~<@{NzbGnf(4cZOIH_W7PS%A#ad)jehzMEyab&5$Q7|>sKPs znT3(Hwfhv6&A_T_soyQ}C7TiOw^Aka?@THvY{m9s7ii z1Tm|P{YP6Y^V0i>ZPxY;NLg5JC|iXF#lk3banNAYF;pz$-zF*I&~mv&o~2jGd;p_T zsp=|}C#8M#DtkA>*_;-Qhg+TPaM9>Ao~>k(nK^9Ih4yusnIz6B$l1io+AfxVeiZnZ z$e(X8(VWuceb$H;9%C<`VyIg722TA1)G>%47<5UrE#^}w7eZdqfzU{k)A0a6T zW^EDS2%o0(KrF_IveVAl!Q}9r2oIsxr)(DFdO1Oja zK!)HO-=dt3mg+{v`81`c*dgM%MM1bsd?4@*$up24hDAw^=dPzH4y=slZl+jaVp18K z@Dln6T2(HJ`1zX(th;$PiBo{%Yb9qYCp-GsdjZ#}W8>MApsWUf?C;%OMLaA06lvw% zt+vR~Op65H;KgMqdN_-zbaK%^?W~zw3;Z1DV%2t>q*_LT00HnTgqqAC)oryK^b0>> zoiAV7kIX6edZ!F@ys($k3pyTdM*^z{RVvpuR?i9k>pv$z_FHN03ZS`?o>KR13Ks2NWyQG2)a&^Wd5FX&c3==U3GXU8(i}7o6=PksMCD6M zD@T=7;{3$tt+MqeuLz6;z1-H9O7HHLMCA#v-Saa zi3X&+EgX>S1iH@=0BTw+*#EdKldN0nqL4%+ia|?B?p+a4>13z#E_br8xD@NACN<0= zCa$RWwgulgU}3J;@iL#GX^ca6CBqkdlUkyMksv@NkyEH(c?f_SJ8!C9Pbq@W3UR*H z;2Q^7-YE0=`9GJ+*L5j%WR99isj6DPx8W(yCt*}~--4X21=*-Mg6S(AuZd7#PX4b5 z+eM}$@@uB@!?a@qjEs%7`jWEl2G2e(B)&G5|Bw@Iv(|8%8|uCW!LUcfTn`-un6-mH zrnYKzfCJKHoM&4^B3qfNY(pYL9?iCVXK`I%C^2OKJgS6UU&ZX|c%ke;oi5k$@W&ru z{M0R*M+YWyvMuk82F7oAA5?+c>Z6FbIUAbU7E{d9air=AJ6^Dhln%T(?f_TKQ&VC|I2A+39AMv0dhmh$t`fwUs(c5Ms9Ohwpl@;|02en( zLEUo%zGGk}*+vVL!UkdZ04T`S+VlCw#(f9^-UZa3a!{}Q7EsSc_003Df4r4N#5{lc zk2h#BG2M-a(bjnOQRb%&$W>BcPgi7xUH~pWWAG-Hn#Q3go}C|!Lt`f)G&By)!T3iH zKMtDs!^a`dBG+cU8wwi&&Gw(Zg$eG3@LQXf_=es6h%E`3u#VA0yAm~@muDR&Y5hp&EWnN9?UM;_6ygw#xh&sIR_|>V_CstIjR3{7L=z6|&5Ek#vwI zRdh=u^L7&X?n~Tm;Wn~@v8B%u8^(Y?ti|(p@#^BPa2^XDJr4*T_h|BdmdX!-SO4$y z{(I~<=Z`PEr}F7w<*ggD8`DR*d7ZryYK2G@PFzA51v|GN9${z>oFa^7U=#N>H;m#D ziF1c>2o+fstU~uJ7{P>?tdoOPle2AykoM8vaC^gB}AaRnsQwuZZ}fV*m=7Vio{~sZdE0g0-5Gvlp(k~tVk4r zwnKfwC17yhHdTp0V5VMSJOdG-kn}{%ZlU)UjVj0y^+c^0F)`Gn#Nx!#{Bx!AJ$DYQ zpP~L}dHQT5&(oP~byP`zqLM=!A1_hRg(!dSx}fcJ<>$iJXC z1u7{(P<3KA*o27zh_9Ib3J$ke$G7J`QdM zOGZ`)AcW|GcYd*%d|pd1HVCu2>m>K}&*QQilsodAyBPE`BAvze`8=cSYpR!7?%;+G zUqRKDk(l+s#7YV-qyQG3lTW$=^EgT+@?ka3>$Y@~+Jt3HKF%3TMez^+@JQcqKPbyl z2cgmdQve+5HmK*PWzPEU)`59?@KXqj%pDJI(9R^K3C2hWdthx!Jm zkF2B-qsqwY(`5B9)G0WL`2VBdJlAX>ba4cfX^ z`@C*t^ZC1P4)p=^4+#UX*(vL`G{lrUa`uu*ejyG3;bMlx0a#cP2LJ&oj03PRj014} z7hy0zd-MWmAD;f^S+0^X;lb0t0Z;!1JpBpO|Lz7n{TuM~&xwn15ozLbCl{FromM4J z|J(*17r+e7(_djHkc)-~8aM}K8i58HVjgy_1RBV%0X3|@iU*Lt%%0jQ#{7$kjv8%g zN~@>h@!G&^(sX;CbLFa=0{9;*p_i}OApN((w?h0LA6D8 zm6eCcoyZHWNiPP^rC2vYVy8xGnHju=zSgZtERB{rh?EwyCA3XgSzVntCph)hXkC|S z=M(*$YJd|y>Y5YHiStldiaJf?pc<6OV?t{kb%-_S;JBz8H=jtq=@84kN0@)=$kot+ z>#QSJW2{ork*N7<`9}`Za#K1>-A=QeK(?N?(HHAOka?xhZXt($uHE(>O}{|xEio{< z5X<4P&EsivJlpZ#f!k`OscL2R!qMTI(TYQ@bkT4$CN$9?OuK_WzFcT!mzu~gY^At{jAQ{Fdzz`c}Gqa1h>>BHTC{3|Rj8j$$S zKewkb_m3Eq{6CZK_0RmZ8&pilKT||FaptKJa>lc#GRsCm(EJA@Ix5r-o~sYm?qvgabuSjdnr7)Y^ITW-ouL?0u8>t3DpQ&aM2_dkt8ry4o?7 z4%?texgn_nmk08J#{6&-4 zlMI7K8=Jv?j~5H%)Wgw~?R4j1XJ~-R7!Fk$U{K!_0 ziwEtbo19zkz0RObr&P9sT@Zdl*)GaPi;5lxvIQ&U5BX*(AK@61VT?Vc&#)EoHA*s? ze_K!dzMgR(fTR)k_qdLm!gWb|8MjXF(#}lKUayYc>U4u=W>zK&hASo)gQQYsUFe5z zHQdlwRjh9ArV+?|_o^}c^jg#Hm&fuactN@v7W+xXGp*%J1uE)vaMLE-jD%UtX^wFC zDTi-Iy^ne)$~>Eip9)s)hK}%kRrG!Msh4l`_629@t>A+tKIZZC;tsQeBVJNDAj48qtR&85c2wDtR4Yz4{G`@T1ahd*3nqqs5?E5DLjtRV-=5t>(iYcYtuT*s?k#NUXLZkFB?((G8M0Vfw1_A+{*XRZ*OHXBqA`3NFh>n|1#{eYwt_oHMIC_I30w-&;m_Sy|aHjdl zbb;KjvHK-xk&oUuL3N*u z+0O^UyUE?6H?;Q=67)-UCR>8XpOWPd9=Ft-KC);KD|ZNIEwli2NG!O!j#<*try}r* zjJAO7Ad0fgfn(#@b0LB=pV<9`wotL0>&zK?|bF_&j<*$<>D&l8$ zXb4WGL;WIy3VZNN?KtJ%&z<>CF}JIN8!p0Hgw9FYG*hWietfa^tb+qs<@Ye)^SC zs}koW&S$f`vGc5z>^jrY9?DC0&P!+ZU8CSNDXO@YB>m#`+j#184`e#4B_#g-(q)Fs ziF3eY2diL^suG`1d?7C=hvP{5Qtaf8S6e&J7{d0z&KX#;Jv{&LH!YMePOhJbc?r}F z+lG%oVQ1#BqY`|5ku0FFgo#E$JA30@sL+CYYk_~4#1qr{L9QVP1OC!UjsB?fa3>%C%9GmoWYDuEwfSn;oxX(s^>ehH}A+KG?5S$*<`1ELh*E9ja zF{sOJdB4Ehl<>3FX&8JX++l{;9jgZ9H-{_lq2PtywuP7;c&|FHBJRTsc7(y3gaM(G zxuj~sWh+~qq%hKI_*B;_U5C-mslm_wOD?#Rs!c_yU|y+2#-B`kV-zxj+M;sY!qh|U zzpdCH3Y}FbG^)wk6IB;AMg1C4^{1)Yt*H+U$@RX|^lsiLGP22EK+q{t5U%>szZ$TB zpg~R}#~KRAJZmQzhJIQ8YPu@=o03raXf^iXll*KPQ<7V}n^nY?UBZpyB zV<++RIQgdDUpPHLkJsRKXRzOP%s}0j%kjiUg&NO( zk6JJ8;!GNoy>{%XpRmMk**B1Brhvpnvw)?XNhq;<( zsEpLbo5%Ba?n@-3Q+A$DJiA#b&y&(dbccu3k>K=)WdYYG4NozWB5=4mePtNVr~^0+&PDZxx>kh^zJ~NjK44KMc#hOLPIOgeqlSXlU)dF(RkigQv?7<_ay6+Djg|`-~MaH#?2t53RWIE zT}=)?iqN4J5?3VFe16+W^08vHoCJ8;Da_Ce=7ZRmqe+#;Q)tIl6kB%xUUHu8kUkw; z`#qU0nS0l@u_=UVCVnF-&&)Fw-YXrwDE!NU-|R3?6v@|;*JFZN{&+fP@D851>)qPN z&i#my;Q%BmFR^Xkg#GH5Sz-T>mr{Zjw|@Hl+S<(Exb*Lgz)7bu^X1*W(4#tmq|!iw zXaXn>WfMD!{xKXCEegTqFlTWyZ%OLR%p^B^g?B6h!{_17H$w!-hA=hBo)BK?_dZGve=&R$oCS{V5 z*1<4(Y3TY)c-f1-qj9i&7=64jHuLb9;PUTc*mUL!Lx1mK7yeWG(3P6f3P8P!N@i}y zN$%MDp$1UjbEzQW`49-k3&l1@WZvQx-j&8%*}G`wkUrubE<_oRfJO@o=pL1n+Crm+sr5Oi+GOcu@H2> z)@bErG?H=dz*^kO&H`WI)3EvS|9Z0QnI~sGZLesyoK>K!{^~U@=5l6ed^#pa%5T`a zuZ;VL{AFc^e>1mlsaqxmF42Wo=F_}pU8IcwPNEClzIQN*CL@3Q|AQ6JRjp3DJZ+0N zXs4Qj85>*tcNYmVA%OR&kBJH&@$4=>#A=Ii^pojfwj+P1w8bsXX2i*8r)-Po&LnyF zKWSae-njL2Xa3!!bb;3JSsDuN`v;`34e?VPSR zw~bBG|6lu!TiKn_fqo|>GJ{97brHhaMXGGe5x68>@AVelMsr^g49RQE@m_(wECPG{=0*IS`+EwHXUAhxI#<=lbJg4m0Ufp`#uBk}`F5g>N2;5ekRCJ($CRazLaPSCZVWcnd&Z~fV=q) zoueQt)I5*>g?f5;&~H)qulO56!T3tD^QP){(t)~EMZhz}cT_xdHIzbIq(NXSHbgf`v6Po5*(;r2OF^y5~uBSZ*IjuTvJ z6}S44VdOj^RkNx+%ppLpb@v#>pvRQtqWC?MTSX6~aV*0nrAGe+gKz}c`U>uOcL;vh z<3InS01qDwH)#r{WKZzIiDYg`00cC+)KGsk*RIk!vF-_IQ-mw_p63WtxQ%dx+dr#u z{J2$@1qcU55^6{|-o2X+eVwUHz^-KMOnwi>et+ID9cS|Czte{y_`H+P#N~{PV-6LEn)QZ zFmk#e@k9QTY}N}UQPk5X4~v?voNp5~J!XrF-;=459dG*fcC*SR&0UP+gmk$ebRp5l_wv^ z8s|*UjNfu9C1nPi(jSiB(qp&BrQa97`Dm~qGdMGir^*@e-0v_uEa=gfrrepO(|%(t z*Un~0ACnn82CHHfun$FycGA3^)BccL{s&H!`$LOufVXx$15jGy*=s4zz6Cz(NzyN5 z#H2)n6&0-V=BZ%SFqfNYzlmg(2-CqPlTi$E;1>?e!e)o-#__a|vWuih%5co!Clik< zyAbK3IsX!|4Q*XxwLFb{a2P=Ddl!Jr-$Qn{&YJrnS`^R9)9m`s&z))ykMj_}`B|!) zd!i+5Az|(Zb(`zp%lt2t;e>WF97a~@eQBJkX|z^ZzPX}7@ zR4i|92ZhG7vd_K#6Pdv)hy&IRmGp8ri18*_ry)QX`2UG^4 zq?L(sjt}14;LoXU$PKk6(Vp%inE;3GkQCMr?ks_lV?Q^{CWmzVF5-#_WWl2kvZdrz zpj}|!N=Fl(Lp1M64c==F?8hpv9d{8%^Kxnqlcs{(H)+zc6>Nb#ps$lCJtd|&W18B> zhT?=D$Yz%lH+1HRJOQhDTSGRH<0@Tk`!=yiGdjoPB1qtoeyiY zB3r?jq<{gCu-!hV3faVm!OynJ0j1uVSTuO~5|CcP`+9GdVktIuUfL4eNY;*vP%K|R zq-thi5v2w+MiF9~$!}c&SGC1dXmfCB50%gzy=^2H4QI!#(O-^^5T3lGdR79)+@}{} z%8-{H?v2TE|2yvW3t4m4gzNLqOaJWx|G{cSBsE2uZNy3wx|OU2yB#I;kf6HI+DS-k z4?g=nXX&C|R2Q1RhIggI8eDz18zY&u(IpO@?cpyAld|CUYF=gfR+SKUqf2JCCB65V zOfnXW?3n6YgCMWy$E*u`gGq^BX{6EFC(0krPq5_LGOxEdVa)5KICZUD&Ci9)_qz3@ zO;NmJDV_3P>l^u*DsIcu3OK5Ep-W5 z^OuCwoW=!%N9drJY9?bwO*`)bJ3X<{pYGaqy0gK(AWd{h7mQIKeUQy=;$I32QByz5 zE2SQ7Ti}?=Jx)RTB|Uc#6x$>I*(JLR6~t9NJB-CU^VcCyc{*75@z7qv7|uhGy)I6= zlgU^uJxZxWCo?J}#Y#PbcI$NIr#P@!+jBUa<5Ut2)|1YDL~2p@h1{LvmShYF!dFu; zgjKcqbQNn;RZT!?vMYjGTKP_tLs(a4rKk$II7;NxPXo-O#B=~1u3yh_0?6%VxV_Nu zRkG~c0U_qf3X(JbPXJ-!I|RZ$LJkNBQx63~_2@vLzlVTewEm}YHD(_|fDdk^mPALV zv^pAe;$-gjd9-+m|RLU&8Ds4(QUB0Mp7X@po*$k1nrQ~BsOER$m zPNMqyRS7?CpLBO)Y!dJs(_ruu@=8|c*J@OU=h~8Y;j+1vap%pd@C_X>4grWY8QnT( zk)eH4aK{*sigv8x?Ide6Su}&H>alm!OtC&u+`X!npZxGzT&rykCOdSx`h|RE6HsYb zD6TEJY zRBY3^lo&Ss)v}}9g1e({1MMr}nFW20n+i#P?&^>HVi;l`ij!b-O*Ehn77)`R(I{AH z93jT7?#H6Y`hVCV+5#r0){tJq6oj|InyU6_4$JoRSK5%!a;c}aqp?dZy zQS9-&${aYAQ?N79xk+f{+o_#ByEI$R=sVIA5~mP!=XTQCAG)}L%c^Yyb(f57`>kqv zDtO~A%3v$tLCYPL9z1EuC$!yR$%IDkuH;kO6}1?zZmkfEL*eLh*r|eboYz|t1kS6_ zl0bEq1*?A^+AbBU`1|)_mUlV~#OxV~^Qgqm~6iLpND1K%q9QV+z{(BpvyXYFc4`GbxKYkrW_SJ529zt8{R;l0*y$Z_{ zmZZG8wAGUD8D+c*3q$Xvg8R(Xm@~sCgFS1B!iR`c!KNrv+zxByj3nMocGy8D1W|}R zy$Md9d8=GWm$A~`M=G}$uo}LaFWVpZPjQ&|+DmxQF~C}3SfJvcs312E@f;?lh`p?u zGJ~9L{4YEeK9rx1>@m7jRh8AEGB~(2{H9S(1q4E9>E+;tS=CVl4vwYPdisX9s3yaK z0uvMXhjO@UR2 zh1D^dQA78qlZ^!=v7Pe2<<70^Y2Fvg(lY_w68iD4^jU=qRbL5`4@{BaPUr;^8W*wC zC;X9-;srRpj_1qfp|;;7Ihed&cAK;P#+@tlgipi??5C{ged&bR+uDApq}t3rHb}n+ z7-Sjo9Sw1$Pshq-_cyiAXMwe>l|k$_w@SjAHre|^Rj}2bN9mLXg4HJj%V?y>ao3CH zP~-rsbyQQNao5`t@6Kp&wIXf>AZY;vOz9mwf!)1vtm9IEs#RasCzfC^lU$Cdhm8rP zb*5iyS=zml467z-OE}i0`6U@ZfPutSj06&!ms`5X!zv@;I;^__w!K+ymCjYkp28|@kbXBAa2`Z|ps~(F2&W?Frf0frc^C1{|CF~G zKN{$?vI!RP+j@HkE7&FWHi3bVocS0^Uq31H*D*=Y&b%jbu(#oHawhx>QyVJbj){0f zAHkxYS2S_ZK_Im{r?mfU!8ZQx| z3RObp0OmD{Z|(N|rVJSGH?2?Rh5d|X86Acz8WtvD@uom@)Y?@VzvL}~65e6>s zYbywk*UBt2n}ChDVa%&;|6M!H?c&QMow2Kn05v)I_W_t;=ftP|vy(Ds+B-C%-#@!v zlk`O|VM%4TxOGTk!lSvD>%G6%DMQ$7NHJwiO_;*6L^q`tHg^8NWd7i(pWw{F-kDnI zZPL0!P=n5;g2i3p*w+z|5?4jq*TZ+b@8hCh@Cn{4ZjLb*w`r>8hfsge<&xU_Zf>C{ zI@hV00wU?nn$)BkoFH6HHWjc{R{^>yxZ6Yl;t!juJmEcF(haTiLa0&btvu-$98HIK zzRNu-htO2p>(&=Zl0klTxZ?+5kbr6HEwxfVZ<7h)_^Q-buSy?9S$fmXe;p%|@UKp( zpb>Tz$e>$Vq)Tg+rmZ#oKIoF7ybsy=0_j-hChPVXeVSNuNjW(0I{j0!yDdC*U7*A? z@GiT-^M*03Ndn?^qzB6(boySa4oGFSInG6AFu(AJ=w*>A(9)cysX^H-WIZi5^wqh%iFs)J~1d&i$BqIBANk6R;Yg)l2PS=pfoS5eOO zE0J_vZk-FNU%mGOTRGb{?If2tMv0TTw}NPsHZk~BP^MNjLH>NR#?4($0}^k}Z{^() zc%owVnYHz(t~F$Alb_vm_wg8R!$s;C&H`rRxk!rchc=XTA3;VzK>Hf}qMcf1o?sIE zV6y{n!pjdw>=>UJLPujNmYfl4OBo7xrJkdT_l^_MaC zFh{0aB+k~1=i0)h($t(@_7OKtABl)#_j+Dp*hMc49fXa7O|sku6|97@)*3?X{lMEn=?FX`P? z`5|qTlT!_INQ6)`JD!~@QPRIRq>lIYsr}-Ib2K9tdU-**hd%IYRWH0-Ez6c{U(`iS z-)Pz7UK|AleeFy zu%ki!q+~XY32Ocyedi{XdZx*X1VTiXA^K%u8rb|GKZ20CQ0MF|8&#Ly9PHg{u`@qIA zh(T%y`<9@BfUGBih| zs`2dab6^v)lFJH$iq9o1ZDI?t-fCr*9dZDcvCxr8xdq?u$wFI(ts>0J63 zio5zUBT2*>anaYoXEJ)ML z?Jl@Xu=jVWDz`!StBDrY1=4_{Iu28c!jia7!K+`10y6l^Q)miXoJh#j`|}kRK>}wA!Kn6Vx}9>f8#Wtkw*^WAM;+24 zx9l`d>?8*r*4Qox__c@WCyVc57ssiKLOX)Zyc#^#vj;pId;es)dn*^3t!<2tk^BigwVBQoS9vl2% zt;SGsDy&Jis&4dN57tn_FEtMobAqPM`TCJ%_G~KZSA*%%vkPGvOyxQ8@c8ol0^_`e z`5AnIf;5%$Go;5UP>|qEEOUm>n_xCcOcg`(0^*N??q!$$e~9ioZW)2@^xiN&`1OY2 z=+29g82>itJ`4>GA_*F(i$i);_nx8rKS?)OuG{o^yZ)+0GRI;k(E)Y*UtPFxfT2@(yc z>w2teo*^)d!R(w%j>fMlYtj@NfSb%Rx{-t?$_ko+f|ygi_hxYW&dYHfO`oVxN%f$d zzd?39X0@Zh?L^Pp_t@nqr3lJCZy)w7HK^p@6~A#D?}n;356){UcW_ffB!{R)v(+N5 zwc%AVom+`t|4Zf3f};x`3HBg3*gIi;C;N&pdsw%w^Fn4mL-qa$_k$GJ` zmeOH%Fop01TJl?1SA%t>WOOnQ3z8A?DeUGLKRo+iO>PU4VP(GG$xVW*FeCz}!B_Ci|C^f8rT3Cl3-A4LGq3*)O<@@FYsnJs z%PF74>O;myHcI7o@`B;N@)_^r=8$njadle$6RNjBPk>C#A!V|!Cr%T;aXfiJlh*l7 z#^EdT`-TxC$*b5?HOvhCb4;Z9EeC31{m6=8RnqSkHX=|I5Hd3;7e!o=2*)p`Kfg2m zsUxFxc<0jn-rml$4&a<5^0<7vS5eIgHY*!BP&cK{`^SQD6(RXUia4vYaqPsiI@gS? zkR=IYhfjMj?H3`1)Si!chUy89B~@lzg6w3Y3d4kmP=xs7mt-?YDaLbw;dH9yWJcq@ zJQ_b1Y)s4A^>A)GugepDIjB=3PFGo6+QzeAVxU6;^lI=`ieBh{AvBGMWDGlw3%A^r zu0U=6U`4~UpupMi7CHb%CWgL&i9YSe3{$cUtFeTC8oG`O+GLEp(f{f?a!5>fVJa}i zSb>4ZO1`GOO-38w=gKfq^R_u;<%sn{cIslQ3lVyS{-5oLEYf8vG1SlZC{Ze^9TTTU zo8h8B#?aN~riiN-S@t5fgYZo)!Xu5FIIwqzOw!HJodrRlL^4BI3Wwr!IILruZUKMA zeyxu|2nBS@jIbDFy+b2}$W0nBO6is^m4R(ku2igej>?E+0CYsiL@~EUoQ)e zpsS`OL4~QL>9aqfantEYnp7I8noC#!y;_`5 zO~H=ux(Q`H$&WG4RgaWZa{i2F673W_QM=fmDjiVR!-Y&R`E#Lq?I8o5W>{qq&3QE zZs&98!Lj@OcXzzbeXF!1xNPKp%!Or;HkF&{dU9QZ_omT~ip?orCC<5|{A{%|v~pxV zS1=A^_Zxr`9ls+_<=LV%wZSjhWW=-)DnX4>GdUf&EWv6?0Y-EI?A<^gy9{x(=!Ccq zqbIaqORtDZOo-q3en`Sl^`m#fo28#|_PzhSMtc|Oahb;IWn&zpEi%`GAsAo-c668Y zM6w~Mu}OI*Y!<*-j5S12dKV0RO=u?q7q!J34CN8XQ-imU_8Wstu1gqYs1&R^9gGxu zwMKxFdhI<>1Hj>+^k>QzaK`RGn~H*OIpkKCiv%P+#foz1T@|5saPn8RmXNi(LYz3p zaNYpQr%WH4#k+9w1`b&i8$bF77HRl-m9FFXaPoo)fC~zPyn`O76-E!2cy{j2oJ6)cH+%j zu(;YGM%i^}KF&LZBs`PWWMNO8+%1E~DBG|-W~)1mmF zofA5v`SnmIc=PRHO9q*Q474{e5>@Flr2##liIDW~-lflS18pZTh%q~)zMT{p{I#)Q z%US3Zb5Aho)6ZC>xC>(D8-GSye)m&uUHC>Aw_vzqhYC;PX9c5Ny)vj}#2}6ksS-zr z@-&Vs&xYEWfB&~VVazJzk&v3Wcm)<&i=$N=M#T7#F?m~eJ;8s%;1d|FyED^R>9pP9 z!pdLEng=s>k*)7+pi|EHF5T?crM6U5TQ>p1Xt6zHz{a8iNy6+Abq$S=N>Y>>96MI# zPAKUzeYM@+pv>UAmq{tFb12SiS>Wx$dc}OZyb|Ner`AY>DjsPY9Q~TUX(%<!fZYZt-{j`=Rmk(&I9vo47 zFO8j4t#jp2yuo(-uPaw(BU!c+fqZOm&#DW^GKVabR-mx%0L71A_}@fO^Dr__oK zVB@-7d<(|KvyHUM_EV&u&_my{A~RHTs_j zzPM~?Xkl(3P5kmV!hr0xkV_YVE)yIv_gE^w`Z}p`Oa^G@>oVCeDaJ<>g&e6=QO$x1 z0?=HIN1b|iXaui#?la8DFp5_#&0(5+Xt?;m9ytQkCjazhnO%D`TgP~(FB4qQgQP#& z==~{-l%rnf-vu#>=!2VBL;dI{^M6Zv#Gxbjt3}=Y>bJiNJ0T zHdKb!D4hNRZ$vo#gjbBGpT0J^eA`SkUWH)#YY3))(N!*(K91;HRT@8(bMWAD_xF(7s{=8Ge~S6a4dfQMw+W#hG4Ayu1$bEO~$6XT|r=Lx=NghQIGz zQ+&T!@3p)w`To*O@%V=6()QEOvdXHslr@IyeYwJeo9OGGey@rJI zLpzG)F4QN_@u#HTh94B)pRD(N;rkKz%1UVyuCTp>e`7IRuzdVB83#@uXGbr#9X)Wv zBC(EmE=w|KLYuW0HPqEE^$5znm0`I9Ia$c!r2lymMpQDuq^QL%PDMDdf0L!7zWx|V zk)BZkX7I;*itTQLk>w|b3?)M}zur1SQO$&Wnq?Mu5ge1S$akc&n!^Rsg#!OC89A*SEXY?V~XBT^#DqZ{}XZ zv0Zl2&**_6%3o4K5Aq-V)t(aZI@Gs3=GZoF3>-!5{1}@3>y`x<^f*jg4y8-@ac?s; zDdGL0L-Dq-iZUDP%v(hBlb<{kPPD!fa)Eu>2O0j%ASc+rS2w{Wy1(&#Wc%gM1*G`* zH^wtE6Eib?+cgPxEjC9s>c|X!C7%5?VqRwO@_4q#ZdN9=+((=N`+T>1?FPnlNU@IwcI9!WzlIJmrEfTv_|3zhOCxuT{ zyWel?7r-Mrt|;qZ3v4rZ{h2*Okm5{Vvlm2E+jf!LRfu25(LDp?L!1a+{No-7f_skJ z#0#FYqotyBe2m|f~V_>848+Gc4 zt;Y{?L=^W@{$Y!YIFkmP3$&v`iI6KsLiqMs@^Hp1PQz>em0}}3%xrGb0$#0aV24|C zw+D%^)vw2M%I`#9ws6--La#9yI7J0OyIMV#ST03QRj|Q6v~n|FsHNfQ(yT#hCM;o6|{ry+!&gE)&nhmg8Qoi75+ z4$W}@`|W=TU~MPOd^x|DZ-S5VOe9PNa;SRn@*$>wekx2M;!hDw1u8IfVg%53l^?Et z43fl*gWUbMkX%V0>kU|k0b^_aUWerBK`GAK;2k=u!x}MiI7c6hQHPbGd%K}Mq_zJ` z!?`s7aXM8pJ|apEn zXZF`ziUIBqnEKnzwRBH6a?T8y3oI>A4!p`PpG~F7qFEiuZ zxQB!8$WJ``M|wpR*#nnF!*799JAOklfu)&*v#&W)Dx&K}M5`FhS(lyKG zx;w-jjnGQ***7SJFU(eYuQ5oTAiPesCdGpzMv0|Lt2LrjYZy^0UD)j40LHa>+4x29 z?G{mIyDhJH!|1hLeASD27#UyH!7`pZgLnQ}Yf7LQ&wYxtfg3Uu#R@8_WzYds_Q8AaiIum2Xx{7c2Ii&1~Q3coYqCtcA+ewn66E zBiw*nE59M`mfL>K#Nk8=abpJWXN~9pLoRe+$U%p=cQlYIqD%guICa6A0R1mC0wbHs zZtxgHWmUAoZooo`reiaEG6%~sB^~}jnQ59uPv8+oPr7QP@bFhx&K&qW^aVmVgM^`7;l3nW z3aI>tadw3=TFQwU7gmO>7@aUDVxbf9S5yvl$xzy;lJ~SlzADwVA9DXFmT97%Y*2)H zBHAW0x4s9R3-DljqM(4C7oII)F0p7L?&L#lc}R6`L{b_HpOZ}g;cherM+!m0@}KIGdgJV0rqenFADD8^878@`0i4*wrDJ}gf-bd>za)4H(F1vogClk6k)C< z6;VsjlQU?pfGQObZP5?YRgX7Q^RZWt_h;p5S2dNZb)Wyj(6izAigvmpRxobL(dlE$I;ur3$4Ux?VmZ&J9vZ|FLU=|8-}oZF19_;$D_18?6*E0 zV@;WHRcZ5`{HXSaKxmgS6r(KvP_jd45Upxn0lo z#pktpo>hEar|0V8bE}>w6`vp1b4Bray`KM!WE0kRx1OIXK5x+TBlc|QsLAi(Ihli-rzT0fzuUAk$nj6<)`B+G3rF zgPC0i+NOw7csqloD->+ySn_MI5TwdF6PwAPrAYqF%v%({G1i~{xIaJD`^r(77sgE6 z3lgTQ{d3d3`;Nh`tn>6YT_ZC4C}rb>{%HT@jZHWl?cP=BPsx6m^spU!+CkEhQ$;=w zDLUZSA6F5@kFU6TBDgmBd|9K^qk-|i#5}zoPx6ZDM(Av#e|JA$1p7Zd9zEa-@%#F9 zBBN$NVrZv&$>OGaDmmmZrg`y>FNvW?nT^=~0GisQe<^FF2dir-!jZfrCcqYL(|bi` zrT!NyQ5mtx053R=YQDCMI#qwS;x9{geQ)(DSN}V_B!;kcrRI)4fvRM|*iM0mg~Oje zH4F~m*C=oxRd9G`mtk-q_J)H4-#R$RI9hN3_y&i+58;q`_Ozj|X=tKBct7_7f~)l% zUc$;(7Y3mSd`QbQPJpljI4N`3AoLRK_P*`KK>+?X4%DwH_s%be83fiN*!lZQj@z&5 zMa{G!L9H~3iW~hD0zlOHlFA2Nt+C@H#?gU%MnsnDRkjycc0jYg-Jni-1sSa5z4Lk(@nz36SUI*ij~bQ9>}eN?Dd?j_V>u9R<;?9tImd^pV0ogAR`jUjY~w$?=+YhzlO@!H zfg6@p;KhNNj>J;QUPZx#21-;zgs2rI4c4Dx_BM|W&)Ov+z;9UQWVWl`6@Dd=4R|8; zNrH5!?EG zJCvd#C>DO&bZ#$=k$2;}T|Fh|zW9sRxcIHug1*29t?BqF+u9!Y{dOKsIdfIp@1qt3 zy(x=;7SC!yAT_3cP8i^ov&^LL`=J7b=up1Z73qa&*Jdd2E)ii9s?~O49JdfZr(SE| za5K~|AQy0gnw%)0+rep{c{gIfnDj$d0Nf^IHziA|4U7(lmhzp0XJmgHozdg%fTv4b zk^_|a-1r;T@o1xXJuVD)SMd~Fbn^JJ1sw<5H_FIm7d2&jtlzBD2IiF4;=5s936IHf zizq1ULb+Kvt=HSC&6#z)=wnUtZd(bA;hY~zjo{H=4fSRu%eA+NXW4D{=OY< zOP|nDrG&YZHIwa~GpFJdR*xgr%qC_L#T!+>e{BumbAim?zzA{@ZUVL>jX08IqL3XAl8sW{ z;RV`hfTbb~t!#uQGjV zX5XT=tC+A!|C`OEI&-o4rbyV*;><;L9Aj;z(P*t*3jD@Rb5`uij?v2&GkVeT+p={H zd#^A^MN^(zQ5|)4?0XTQw4LaGZWzUI7BsG~!3vf&n>zOWQ5laJnQ`~p%)Yj^Pajf` zIl$|rFPys06>R##(SM`GT$2g=O9Sxbh5e{yWM3 z-Et7slk`#v0_)Y6wWV}zC~HG!MBQDY{Mcrs)c$(EU7!1F`}Mc$N&Y(4uWm%0*sOxB zmtj{jeU%(m`6?nye%n{?kb?vEP;0{Wgymneo=H+^Vog`l|7oR4CfiS=X4g*4SHjSo ze6ZFcR;tTDxa)Ut#^6rM%b#jF?8DjDy7Kc=EUle3m9eo=G1SkFbOjUq+YqRNKI!hN zu)ec9C?-1BkNgS{jZZBezV_inxdl?GtOc;%;7IC+)#Us>J}Y8~`0WDkpc$1)71@l1 zY`uToM2bOwHm?d3EbRkLj%V)$VYEJJuB!J}0NvD7WQN&h=8U0FJo|m#&wP32ujME* zQI1JiM(&Yur1!_9_uJhcbNs#0OX1}@i=FftcEMh>BI(V;Te$*Hxl1kXW$xuP=bz!s zJQ+ZU$Tr3Nwo28sMWDggr#7am*IL>36MdA#9T(rp+{F}tXO+DQ*Zh+;)h{- zUo?N*(Hfjoi+@~bvA%43I7yhLDgxfo5*?BP^j9iklttv>w#wRA(06b|&Fp#>%iUE1 zgwHlKTUPYnL1s&>Mf7+W_-NOyyOm5t0>SfOHK$j6nUf`!Pxb01@@}G62V7*n>KKH% zBf}~@tXxQLYIXrcu+=a>2UGTT$5khLcS)|P;JeqbF)rw13Y=>Jbp?Bxua3Z0v*V03 zuxr}r?QQU0F*{i@gmQCprN3g*DZAsh{0oKQUk;K@M6P7qXAkQefgEVn=0o~teN!jB zFHFsBDzEo0qLD5#;58GBd9`F6uNe;g>gN6*B)MVWZ9|9Xi#ot)Gu85 z!nuI?-e)Zpmkasx;bibiVSJK4qz`5N(>PWG7^M9+)ca}dUcj8=llUZnTJY7;^D)st z)EE`DP1rrftxNiGlf+ZM4Gk%;^Q+Co(K4!r?dcPer<@*3SMI*Zm3vB4tnE?kR5*B% z*F9~oF!h^DL`gS67{n^zPBTVKjokB;pT9!=^B&L7h45&=E0s5YDRM?q$9AY4Z(zc} zcxCpDO)tLc6u4J<5=RTQ#W>=Wyy*+Qz3|}LvdqEpZGUdRzKWXWGZ>ZW%aZ;g>^!ze zLk=7`2)gYNW%`dulbl-RzB?`bE>~9Dz4|`=?}ZF2sJFC8>{`G_slezOp>g%$|lDkLVn^jt6ff7im z=B)%|Zs`;n>UQXQ0&iy$Cdx#0sL`%0S}Hoe7TQwbhJ?ONdGF z>=6{wu}?0K+QM)W6rxFO4CCxac$e9?DxS?$=%y`xYp;_n$PnwLbLoouwX#=yE-}zR z@Z;Q{_yFEo2?STGkMUeDDML*uZ=>y+B-&4EPqcrjVi%$B#wWJSHx#+}L)Q;pobblS z@9WF#+LBm1A6N779~wIC;E>l#a&Nwp<<_oUycna1d1EgA&udDC%sDG6ZhRts-~3o+S36yKPZS$-q3I1}@$5-ZD(frrolZ9TT@o{4sfw=9=uN7o+Y+dCiViOnjBL_Ucym?4 z>-RS5s1gbHay_a{3~hfS{*`)(`goyZg+JaNn^YN3^DFH!)qK7ls_HrcdHlXFv8}e6 zy7sZY$UOH@KF+)w0nZBzUy}^G!*}@Ii7pY1cQ<`N!hfc_3zH5L7zHZYmze+XtP}2$!m^o0E|BU*R^cNGF0ACpf(O(TcU*vQmjVveUAXSpKto z&}9Jfwl#QrWtVNu0GDRaFo0#aGDDb@DqvFWa7=14Jj&l=;DDYYrVDq~mqza?p>Wc} z;`!$v`zs@SnlLn;eU^&mib}_`zvr(o8?pp)8(sqm2F+?kB@bR>CqIqi9p4s4>lfI#*Vdl*n-%O)5^aCBK~>hjOf)O~PU{HjG-nLWz2_a#-pNI+TFo%G3(AR2Zce z!u0_tF(VJIUsVclEeDViYfnTzH>{n zgx<}CeN4-!zw!G(xsp!b){}W159Q~o`ZYtcpQ8+$q(%htwZ;00VUNpJu1_5NkUG-q zEu2d!4@ysxn8I9oF=9SnYn*_Js{(UYrXSN#^}w9olh0w-7|F*)echvCrnpM~HHk|E z3yFb**vPFAn@|S<5e<#t@t5Bce7ssA^~KD9I^3*6=40rF@ivw9U?ZXvvpva>4FxxR z1oY(;vAVXH(!d92RtCpS`pMQJwr~vH71ZcAz$+|9^_f%nnr-d1WARW)z;vw^fbF&8>{>1U*5RpN!*~={vM*gr(I+)P{?=0Hwbus3 zT{K-g&6zod%+*T0DdUHDC)ZT-QdxJ-AQG^}R$Mb?ah8l1`~bW1K{)g4xg3VV*~}Jv zCtL|1LdaQ%kCk85tQ^OzE9o|E{ugjx&H1csNNik4m-kd=hM`U)4N|Jjhk}_S)#9j| zr}|QkM&WSFX1ehJ^_Rgiq=~5;14j!qR?VjR@AB{w@gx4kx-)?OA}{$2eIDz}o*-d-7YQd9RrGVVxks!Q*2s@~&j_sZ}@?lf5aV{{6~r;^WS zd_GT^#+>NqZgp+NER!gQl8Vt(8~z;W5=K$!{}u*Q;{ApmQXQlUmkPNrzv%A>z8~jq z%zdw9+XKRB$%hnUSmXUh=20F?4yzBUJ5^t(cFFDNY5Lh4ucsP6Q%(r|HlEPGXQe1D zsP^^HbqEMH+U;?^B*Rp$!?ON)p8cb~>5^|+M)+o2{}fOEKNG%5<(FIwH5x!PZD0nJ zn=+E!s`od;s9@{tk@_UDZ=C-@>^n>6A+i2i!Z_9=Mr;3CX$K-eH$ndEe}P;F=6$+H z95CkhGW?ziWKq8p`^H^#mJB7?(~&(D85**uAg{wysUiIYxy89bRu1hbOIfK9c%e9O}~7Pb9i z*0JZ)&{o$a20uarC^2|7E}IdcwtME%%BWyNd1*;?^qJRjcxy*H#Vn%ub|1EMQfKK! z7|%0KqOY`W;&T)Chs&R{k~|w$`ckg?lA6jvL$Rvk@q`1;Nk>d5Np~}kNm)po8{oG2 z>Fl6}!X2PKpi>}2U54X&9|J%lhMo}iXVvKX2c`ZSUqQc=6qv0mF{ycM!9)jzgXt71}T9<&X*JiMu-5cVN&R51g$4Zr$6Hcx`Xp z#I1?_SR=a^Zlk}nP7Eh;Ak8HxCS!kNRbVcYZ=pA6(LD>V6S3iAO^zXhOX zIJdpV2b~i*TlJ31gWELy!s?j5T1uxL!CUZm`i-sR-S{D<$h#;DW7kUU=M7g#DZdl@ zPQd;~xxu#5KTA880PHtZ#@EWBPXHRW)1iPIegOrGD^TuQ6jc3vtb)H|V7KbGbaTh6 zs^8R!iEM(ag7xlqgfWLP?>E4|g!42oFiZ>Z2mxQH7327tjG7~`l9#e;=yfuQ8|yae zv(Q^Aur=Z?Jjko0l9il@O5o2RJQVa&U(+Rt1ExKqjr&*hMJDBQDfTyZgGU&O9#T7n z%g52ELflWNaz}XO+^38jka55L3MM!4{@B+Qp`QhmD5FN(Qm1mG^h#LNjUrC&#SYI`EwMlKOYtHKqm24T-VwUeZV zcnf|aQ12d*&m9$&(Q~$_3=>QhoBnP86@s5_`@V-(tYjHjzjfP%__S?bDS%)le@
      8KX!r!)iPoZQhe6BZ?!+ODyC5PcRR0?PQ&bvK)YJlM}`<(aG3V*|ur?>5kOAX&Z z%`5M0+eiDwO0MJI+eoi%`*_T?m8_E%&ftCOKHRevq>pUkAUF}>Wzm__j=ceIpFkNn zKLMYbGsT^;mSKbJNAKHrXWg5@ia}?b2Yi@q3KyEFFsA&>)|0(L(+U-eqgu*}%IV$S z9A~^wqP#;!5KOOl#F03Ci}b9v-2H^`Ao)JA4|Doa3@EYhG%LmZ!an?%DTn>8V!zib zzSXubP1q!Ki!cc_^bnyiSfEZXyGS+vxtgEJoKz(g%&ueQH|8Xs3o zOwsS~{ra|`HRs*=s2Ur^AZvNyP1IuY)DMd{Kk&Y<(s*;6{{B9GUyEJ{-Wcpggu2vz z6W^X9Z|gWG#7--vc&otRYdc1U!IP+nladDm(j|NUnb%Q2jSiv5;m3cN*Z+2W2?|`x z&=46vp_q^w&=C8Nt-D&&e`E#%+|Ftp_9y!9iVJPtWjg5BG1U`?pL*ra$|He|x%r`*HvFH2?Nv z{_Uy$?NtA^#=rfjfBO;t_7wj%{M%#v+oS#4qx{<={o5n_+sXcIiGORE+fG|e`eEilwDUAGWu3S3U1wUAIK(e8 z(Z4PCZ)^SAS^jOrzdh8yt?+Lr`L`4NTR1lq0(2&&6IaULE9CE&?rt8QI%ElNlwQN;5{JE^+}PO&6|8rCveWN69GI#u(>O!>~RdN9d6h;|<0 z-%j*z%l+F4=C<=w{J8Uz@|TWP^rYS&XPvq21k>faQ@szTs|Q@F)1+{^x$XS8dN8hbOY;vF35KbBupmYHm9r%~*`9db&MkLD#os{_R-*c8q^pYHmAE zltxdGzhuGdJE?%I@1!_c-$`G_`c67b)^}FP-(%$O(en2w`O8?}^_^s|>pLgQ-^1lE zU7qVZ85OX;^Xu|AE`L|b-{tc6Ci%Ne{@y5mWBeQKJkfM8+WBGs_Bj9cSpW7I|Mn>V z_6Yy>aC1vsnu;H5Pr#p{xWv~re0}_|uc`d3{m`(lKf>2l!@fR+ua6$~b%?Kz9QO6e zd_8&C*Hidf!i|QIlZ5B4??eH@wggv=C?4S|JH`0x;hBO@%APepvAfK=r!F+fdT2pt zQhGBI#KN7@mZkJ=El(n&+!eTMywZ)PpT{n(3p>tzvl(q5YhX0}3<4i6>{$5eGH20Q zCa{?cZ_el5xQq7T(aNfa>HZu(Nem*k`M0>i?iU^6Cyh*kM{^Q1$SG)t$MSZv_FX~tFT_T5}JZbZxzO2R(8kMVqF)B z!T5d?-yf&!2o+ELTk00do;Ud={wnt6>1Y5GA2zWRusOIhl{P`98{LXxWmSSg>wSr=DV z4t!k_r>X5&HCFN)>^KdpcH*|)sBjceB{p;IKl2?C@+G>7cUTYalz3uzx8<2Er2_71 z_a?_%>UXgsGJ|F<+fNA3IP<2SsOTv?J> zpFWg|%#(m0Mrk1MiKi()dwFEO%Pg42f2`vzxFzE$Mst-r(L*KJBKFS`WD#4y>R@@+ z;i%Mks6r~^iYCG_k;wO@Z13kU(>X}Ppf|rCCXNEdBJ=RIe5iZ>?EEjdFM`X*S0FU* zyMl)F>n!fS)5jh12_x?th&*b2UY6$<`#AGIwj6aZi&0nhATV#^!iasezsL`T;xWt> zT+LA&q}v+9YHZn$Fv|$HWAdP=ePN3zGO{3BvDI9}Un`7_lVD|sKj_JS9X*BmS6Tp!vx zQGyoc)GGZ)^59?`Ljo556`ykme#F8thpC8#TQC{~Coy7SJ_^wppBTK{N`6xs1gZ_h zC1$}&rSJr$=CIWCZPOp0-rc`K`DeIp&oqfxx_AxwhqKw?mhagGe+i$f>av4e(??)^ z`%;DcN`A6Y^s>bLu+l$3U~|~Ktha+2=1bs!teJG9Sbv+LH}ZT*D(nt|_?&$9L?;rDQEo5*JKRV~0BDR^qOl z5=8R|Xu{+cEhhe%k#kJm2da z%mY{mHu8}7JlX5<9=xm;*1T=JV*9YYgGhnEPPmWxbSt@lutSLerAv`oRREwW$;I@?4IFY{+Ko6< z15=6>?kC2z_=~s!E-AO`mk4Y+9u39Wh4gmSoPxQD_=XT)hY7&Owy<*^TNcj76aU6>V1gpI=0>7-Xf};qStJuSr1uzi5BChA_hQ{R1_eBTh{v%hGOgp zF|qhdfHEXA#G`Vux<_Ou2I`-p>R+bnFY*$oUt=8LOHXMb@{8=!8O7$F?h7K zx(+>ww7s$quaJTw4zEFW8*ue3P7UE@r5LlI@tkuZyk!TVO6P}j)qp=!MR+=7!Z8#B zH0%l(!T~1-svJEB)U;V>9v*>M%3*_}r8hkf;EjZHCm`o}U)N7Z$~gnGM!Q7_5_4^( zZs1fi?A3U@6bTCB#4F$FbEH0b3;Q$x7Vei`&)f6$VOK@bUVh8eVo3&nkApeV_txQj_@aAkl#xId>y4w6;; z2q{rc<-8!JK1vB>&=EmC4>ry>-}PZ4s8=)tB-l_N@+cValTI{K(A2|`2f5tTKx=vi ziev}`4Qd-<22%8M1MLjbu`6MIB3KJ!&g1_aD&hlM*vKh8J$F8~P9amtbLpp% zoC*LyzTDF8shbno(v=@d40E z1Sx1bX8i!ug1Gq2ZF@S=E!j%FxwRtk`f)PSN9LWqs`d!SLpagGZP@>m&yJN5$p_OIQ*eXLNHbISXHLHNr|w!yTt<1(yn2u~evVlo%UF3x#J(}LiW1nxUm#6Qk}9ncpq*}1K_vm_S-oYt=(O}}#!VeTDfFW?mqelGYKzW^o2da- zV;#^?_1IbvwK|jv6Q=U=juUCqBq}=Xb3iA+?X-OkymOy~hNB?(5Fr39ARmI*oLNu- zAn>%#J!3fZC;%s|#^(U(g4YAmjX)aNks(Z?Ulh1FI*nd0cI$)uL7%7Gklsf$d#~#m z6#CT?`~jl908n^{W+L6^wOY|DFU84&d;cl%=kjP`{Ss`_FOQb?iwy2$ZaHV3TUlZs zL7#tvJv*?47~4M+h{nWT$*BF=7Fkefv_sg)T^9;52S|Do7G>|Rloe&Gey7OVDq+kh z5P1~cDY?I_wE|4;{&E~@zM;PK6@FHieocy2qv&j=qM_yz&_UtlZ{Vi2WtC2aYgEx) zW=0C?E!1a_ON_PIbHzP@8d5MtmQ{Z3@buOm_jp;b!jcxx1B(zXu;gT={u6x!ZGonU z97sun&IAQPqkXh--bb=`#tCP-DmXHHUp)WUB_-Y2hA=muqK4A+I&YS+yBtz

      !dWioY^rdUyZO!@y3(>k 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

    0v?mn$GIqX-Zk#MS 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 (_*Q>k(Rq_g%q-S%XDYL%sm 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 Fsdq

  • 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 z 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