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