| # Copyright 2023 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| import argparse | |
| from library import * | |
| from matmul import * | |
| from batch_matmul import * | |
| from manifest import * | |
| from performance_report import * | |
| from launchers import * | |
| from options import parse_profiler_arguments | |
| ############################################################################### | |
| # Profiler main : The main entry point for the profiler tool. | |
| ############################################################################### | |
| # This tool compiles, verifies, and profiles IREE-compiled MLIR operations for | |
| # a given backend device, compiler flags, and tuning configuration. | |
| # | |
| # The dispatch profiler tool is organized based on below defintions: | |
| # Operation: A MLIR operation that is generated or consumed by the | |
| # dispatch_profiler. For example, linalg.matmul, linalg.conv2d, etc. | |
| # Configuration: A set of compile parameters that are used by iree-compile the | |
| # to choose a compilation pipeline (e.g. LLVMGPUTensorCore, | |
| # LLVMGPUTensorCoreMmaSync, LLVGPUCPU, etc.), performance tuning parameters | |
| # (e.g. workgroup size, tile size etc.). | |
| # Dispatch: A combination of an operation and a configuration is launched by the | |
| # dispatch profiler for verification and performance profiling. Note that | |
| # a dispatch is not a MLIR operation it is binary executable that is launched | |
| # by the profiler. Additionaly, the goal of the tool is to also profile the | |
| # performance of the fusions and a dispatch for fusion is a combination of | |
| # multiple operations glued together and compiled into a single dispatch. | |
| ############################################################################### | |
| if __name__ == "__main__": | |
| ############################################################################### | |
| # Parse command line arguments | |
| ############################################################################### | |
| parser = argparse.ArgumentParser( | |
| description="IREE Python profiler tool for " | |
| "verifcation and performance profiling tool for IREE-compiled " | |
| "MLIR operations." | |
| ) | |
| args = parse_profiler_arguments(parser) | |
| ############################################################################### | |
| # Create manifest object and load dispatches. | |
| manifest = Manifest(args) | |
| manifest.load() | |
| # Performance report | |
| perf_report = PerformanceReport(args) | |
| # For all the operations in the manifest compile (if needed), verify, and profile. | |
| for _, dispatch_collection_list in manifest.dispatch_collection_map.items(): | |
| for dispatch_collection in dispatch_collection_list: | |
| operation = dispatch_collection.operation | |
| # Select and create an instance of operation_launcher for the operation. | |
| operation_launcher = IreeToolsLauncher(args, operation) | |
| for configuration in dispatch_collection.configuration_list: | |
| # Create a dispatch object. | |
| dispatch = Dispatch(operation, configuration) | |
| # Skip the dispatch if filter returns false. | |
| if not manifest.is_enabled(dispatch): | |
| continue | |
| # If dry run is enabled, skip the dispatch. | |
| if args.dry_run: | |
| print(f"[Dry run] : {dispatch.name()}") | |
| continue | |
| # Initialize verification and profiling results. | |
| verification_result = ( | |
| "Not verified" if not args.verification_enabled else "Failed" | |
| ) | |
| runtime = -1.0 | |
| # Launch the operation dispatches for verification and profiling. | |
| if args.verification_enabled: | |
| verification_result = operation_launcher.verify(configuration) | |
| if args.profiling_enabled: | |
| runtime = operation_launcher.profile(configuration) | |
| # Create performance result. | |
| result = PerformanceResult( | |
| operation, configuration, verification_result, runtime | |
| ) | |
| # Print the performance result. | |
| result.print() | |
| # Append the performance result to the performance report. | |
| perf_report.append_perf_result(result) |