blob: ae85e32830b8fac94ccf223e13733540a5caebef [file] [edit]
// Copyright 2022 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
#ifndef IREE_COMPILER_PIPELINES_OPTIONS_H_
#define IREE_COMPILER_PIPELINES_OPTIONS_H_
#include "iree/compiler/Utils/OptionUtils.h"
namespace mlir::iree_compiler {
struct GlobalPipelineOptions {
llvm::OptimizationLevel optLevel = llvm::OptimizationLevel::O0;
// Maximum byte size increase allowed for constant expr hoisting policy to
// allow hoisting. The threshold is 1MB by default.
int64_t constExprMaxSizeIncreaseThreshold = 1024 * 1024;
// Enables const-expr hoisting into globals.
bool constExprHoisting = true;
// Enables data tiling.
// There are two data-tiling paths. One starts from GlobalOptimization phase
// and the other starts from DispatchCreation phase. They are mutually
// exclusive. Only one of them can be enabled at a time. The default is using
// the DispatchCreation data-tiling path, which enables more fusion
// opportunities.
// Note that any feature built on top of GlobalOptimization path will be
// deprecated eventually.
bool dataTiling = false;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<GlobalPipelineOptions>;
};
struct BindingOptions {
// Whether to include runtime support functions for the IREE native ABI.
bool native = true;
// Whether to include runtime support functions required for the IREE TFLite
// API compatibility bindings.
bool tflite = false;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<BindingOptions>;
};
// The transformation to apply to the input prior to main compiler execution.
// These input pipelines are purposefully primitive and mainly focused on
// test case/reproducers as opposed to anything that should be coming from
// a user. For user/framework level interfacing, a dedicated importer likely
// needs to be created in order to represent whole-module level framework
// quirks. These are just about the ops in the functions.
struct InputDialectOptions {
// Built-in input types, represented by an enum.
enum class Type {
// Applies no input transformation. Only supported core and extension ops
// are supported.
none,
// Analyses the input to determine what input dialect pipeline to use.
auto_detect,
// A named input pipeline from a plugin. If set, then 'pluginInputPipeline'
// must be set.
plugin,
};
// The flag value is captured into spec by the CL system and it must be
// interpreted by parseInputTypeSpec.
std::string inputTypeMnemonic{"auto"};
// Parses the user-provided inputTypeMnemonic, returning a recognized Type
// enumeration as appropriate. If the returned type is `plugin`, then it is
// a custom input type and the raw inputTypeMnemonic should be passed to the
// plugin system for resolution.
Type parseInputTypeMnemonic();
// Gate various type based demotion passes that run before anything else.
bool demoteI64ToI32 = false;
bool demoteF32ToF16 = false;
bool demoteF64ToF32 = true;
bool promoteF16ToF32 = false;
bool promoteBF16ToF32 = false;
// Performs early optimizations geared towards optimizing/simplifying the
// types of integer arithmetic inefficiencies that frontends typically
// include and which are implicated in blocking downstream optimizations.
bool optimizeIndexArithmetic = true;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<InputDialectOptions>;
};
// Allows specifying one of several ways of doing custom transformations at the
// pre-processing phase, multiple ways may be used and they are run in order:
// 1. Through a preprocessing pass pipeline.
// 2. Through a Transform dialect spec file.
// 3. Through a PDL spec file.
struct PreprocessingOptions {
llvm::OptimizationLevel optLevel = llvm::OptimizationLevel::O0;
std::string preprocessingPassPipeline;
std::string preprocessingTransformSpecFilename;
std::string preprocessingPDLSpecFilename;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<PreprocessingOptions>;
};
// Defines the mode for parameter encoding.
enum class ParameterEncoderMode {
// Merge all encoded and original parameters into a single consolidated scope.
Consolidate = 0,
// Only produce encoded parameters and leave original parameters untouched.
Overlay = 1,
};
// Options controlling parameter management (import/export and encoding).
struct ParameterOptions {
//===--------------------------------------------------------------------===//
// Parameter Import/Export
//===--------------------------------------------------------------------===//
// File paths to archives to import parameters from with an optional
// `scope=` prefix.
std::vector<std::string> importPaths;
// List of parameter keys to import. Any matching keys from any scope will be
// imported.
std::vector<std::string> importKeys;
// Maximum size of parameters to import or 0 to disable automatic import.
int64_t importMaximumSize = 0;
// File path to an archive to export parameters to with an optional
// `scope=` prefix.
std::string exportPath;
// Minimum size of constants to export as parameters.
int64_t exportMinimumSize = 0;
// File path to create a splat parameter archive out of all parameters in the
// module.
std::string splatPath = "";
//===--------------------------------------------------------------------===//
// Parameter Encoder
//===--------------------------------------------------------------------===//
// Controls how the encoder manages parameters.
ParameterEncoderMode encoderMode = ParameterEncoderMode::Consolidate;
// .mlir/.mlirbc file path to write the split parameter encoder module to
// (empty = disabled).
std::string encoderOutputFile;
// Parameter scope for the encoder output parameters.
std::string encoderOutputScope = "encoded";
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<ParameterOptions>;
};
// Options controlling high level optimizations.
struct GlobalOptimizationOptions {
llvm::OptimizationLevel optLevel = llvm::OptimizationLevel::O0;
// Enables aggressive propagation of transposes to the inputs of named ops,
// rewriting named ops as fused generics.
bool aggressiveTransposePropagation = false;
// Enables propagation of transpose ops through convolutions.
bool propagateTransposesThroughConv = false;
// Enables sinking transpose through pad operations.
bool sinkTransposeThroughPad = false;
// Enables transposing all concatenations to the outer most dimension.
bool outerDimConcat = false;
// Enables data tiling in global optimization phase.
bool dataTiling = false;
// Enables recursive evaluation of immutable globals using the compiler
// and runtime.
bool constEval = true;
// Optimizations to reduce numeric precision where it is safe to do so.
bool numericPrecisionReduction = false;
// Strips debug assertions after any useful information has been extracted.
bool stripAssertions = false;
// Converts linalg named matmul ops to linalg generic ops.
bool generalizeMatmul = false;
// Enables converting convolution operations to im2col + matmul form.
bool useIm2colForConvs = false;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<GlobalOptimizationOptions>;
};
// Options controlling scheduling across host/device.
struct SchedulingOptions {
// Defines the execution model used for scheduling work.
enum class ExecutionModel {
// Host-local code only that does not need execution scheduling.
// Disables flow/stream/hal pipelines.
HostOnly = 0,
// Full HAL using asynchronous host/device execution internally but
// exporting functions as if synchronous.
AsyncInternal = 1,
// Full HAL using asynchronous host/device execution both internally and
// externally.
AsyncExternal = 2,
// Inline host-local in-process execution with executable code statically
// linked into the host program.
// (Currently) only supports the `vmvx-inline` HAL target backend.
InlineStatic = 3,
// Inline host-local in-process execution using dynamic executables.
// Only supports CPU HAL target backends that produce executable libraries.
InlineDynamic = 4,
};
// Program execution model specifying scheduling behavior.
ExecutionModel executionModel = ExecutionModel::AsyncInternal;
// Defines the behavior of initialization.
enum class InitializationMode {
// Synchronously initialize all parameters and globals prior to returning
// from the module initializer.
Synchronous = 0,
// Asynchronously initialize all parameters and globals and return
// immediately from the module initializer without waiting for them to
// complete. Subsequent invocations will queue waiting for any dependencies
// they have on the initialized values.
Asynchronous = 1,
};
// Initialization mode for parameters and globals.
InitializationMode initializationMode = InitializationMode::Synchronous;
// TODO(benvanik): favor size/speed/etc for partitioning.
// TODO(benvanik): execution model to optimize for (unified/discrete memory,
// single/multiple processors, etc).
// Enables fusing bindings with the same underlying storage.
bool optimizeBindings = true;
// TODO(benvanik): find a way to share this with
// Stream/Transforms/Passes.h w/o circular deps.
// Defines the output format of a dump pass.
enum class DumpOutputFormat {
// Dumping disabled.
None = 0,
// Human-readable pretty printing.
Pretty = 1,
// Pretty printing with additional information that can result in large
// dumps.
Verbose = 2,
// Comma separated values for throwing into Sheets.
CSV = 3,
// JSON format for better structure and data exchange.
JSON = 4,
};
// Enables and specifies the the format for a stream statistics dump.
DumpOutputFormat dumpStatisticsFormat = DumpOutputFormat::None;
// File path to write statistics to; or `` for stderr or `-` for stdout.
std::string dumpStatisticsFile = "";
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<SchedulingOptions>;
};
struct DispatchCreationOptions {
llvm::OptimizationLevel optLevel = llvm::OptimizationLevel::O2;
bool enableAggressiveFusion = false;
bool enableFuseMultiUse = true;
bool enableSplitReduction = false;
bool splitReductionLowParallelism = false;
// Enables data tiling in dispatch creation phase.
bool dataTiling = false;
// Enables aggressive reshape movement (bubbling expand/collapse shapes
// across reduction ops).
bool enableAggressiveReshapeMovement = false;
// Enables native handling of tensor.pad operations.
bool enablePadHandling = false;
// Enables fusing tensor.pad ops into Linalg consumer ops.
bool enableFusePaddingIntoLinalgConsumerOps = false;
void bindOptions(OptionsBinder &binder);
using FromFlags = OptionsFromFlags<DispatchCreationOptions>;
};
} // namespace mlir::iree_compiler
#endif // IREE_COMPILER_PIPELINES_OPTIONS_H_