| # 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 | |
| from library import * | |
| ################################################################################ | |
| class Dispatch: | |
| """ | |
| 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. | |
| """ | |
| def __init__(self, operation, configuration): | |
| self.operation = operation | |
| self.configuration = configuration | |
| self.is_fused_dispatch = False | |
| def name(self): | |
| return f"{self.operation.name()}_{self.configuration.name()}" | |
| ################################################################################ | |
| class DispatchCollection: | |
| """ | |
| DispatchCollection: A collection of dispatches that only vary in their | |
| configurations but not in their operations. For example, a collection | |
| of matmul dispatches with different tile sizes. | |
| We can emit a single MLIR file for all the dispatches in a collection | |
| and compile with single run of iree-compile and them into a single executable | |
| """ | |
| def __init__(self, operation, configuration_list): | |
| self.operation = operation | |
| self.configuration_list = configuration_list | |
| def get_dispatches(self): | |
| """Returns a list of dispatches in the collection.""" | |
| dispatches = [] | |
| for configuration in self.configuration_list: | |
| dispatches.append(Dispatch(self.operation, configuration)) | |
| return dispatches | |
| def append(self, dispatch): | |
| """Appends a dispatch to the collection.""" | |
| if dispatch.operation != self.operation: | |
| raise ValueError( | |
| f"operation {self.operation.name()} does not match the dispatch " | |
| f"collection operation name {dispatch.operation.name()}." | |
| ) | |
| self.configuration_list.append(dispatch.configuration) | |
| def num_of_dispatches(self): | |
| """Returns number of dispatches in the collection.""" | |
| return len(self.configuration_list) |