blob: f9e460f53fae4a3fa0e8a286aceb7af2ebf79a7c [file] [log] [blame]
# 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)