MLIR
19.0.0git
|
#include "mlir/Dialect/Linalg/Passes.h"
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Affine/LoopUtils.h"
#include "mlir/Dialect/Arith/Utils/Utils.h"
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/Linalg/IR/Linalg.h"
#include "mlir/Dialect/Linalg/Transforms/Transforms.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/Transforms/Transforms.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Utils/IndexingUtils.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/AffineMap.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/ValueRange.h"
#include "mlir/Transforms/FoldUtils.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/CommandLine.h"
#include <utility>
#include "mlir/Dialect/Linalg/Passes.h.inc"
#include "mlir/Dialect/Linalg/IR/LinalgStructuredOps.cpp.inc"
Go to the source code of this file.
Namespaces | |
mlir | |
Include the generated interface declarations. | |
Macros | |
#define | GEN_PASS_DEF_LINALGTILINGPASS |
#define | DEBUG_TYPE "linalg-tiling" |
#define | GET_OP_LIST |
Functions | |
static void | emitIsPositiveIndexAssertion (ImplicitLocOpBuilder &b, OpFoldResult value) |
Asserts that the given index-typed value is strictly positive. More... | |
static bool | canOmitTileOffsetInBoundsCheck (OpFoldResult tileSize, OpFoldResult numThreads, OpFoldResult iterationSize) |
Returns true if the maximum tile offset tileSize * numThreads-1 is less than iterationSize . More... | |
static OpFoldResult | buildMax (OpBuilder &b, Location loc, ArrayRef< OpFoldResult > vals) |
Build an affine_max of all the vals . More... | |
static OpFoldResult | buildMin (OpBuilder &b, Location loc, ArrayRef< OpFoldResult > vals) |
Build an affine_min of all the vals . More... | |
static void | calculateTileOffsetsAndSizes (RewriterBase &b, Location loc, scf::ForallOp forallOp, ArrayRef< OpFoldResult > numThreads, SmallVector< Range > loopRanges, bool omitTileOffsetBoundsCheck, std::optional< ArrayRef< OpFoldResult >> nominalTileSizes, SmallVector< OpFoldResult > &tiledOffsets, SmallVector< OpFoldResult > &tiledSizes) |
Fill out the tiledOffsets and tiledSizes to be used to tile to a given number of threads. More... | |
SmallVector< bool > | safeToTileToForall (mlir::MLIRContext *ctx, LinalgOp linalgOp, ArrayRef< OpFoldResult > numThreads) |
Returns a vector of bools representing if, for each axis, op can be tiled without incurring in a race condition and thus it is thread-safe to do the tiling. More... | |
static FailureOr< ForallTilingResult > | tileToForallOpImpl (RewriterBase &b, TilingInterface op, ArrayRef< OpFoldResult > numThreads, std::optional< ArrayRef< OpFoldResult >> nominalTileSizes, std::optional< ArrayAttr > mapping, bool omitTileOffsetBoundsCheck) |
Rewrite a TilingInterface op to a tiled scf.forall . More... | |
template<typename LoopTy > | |
static FailureOr< TiledLinalgOp > | tileLinalgOpImpl (RewriterBase &b, LinalgOp op, ArrayRef< OpFoldResult > tileSizes, const LinalgTilingOptions &options) |
template<typename LoopTy > | |
static FailureOr< TiledLinalgOp > | tileLinalgOpImpl (RewriterBase &b, LinalgOp op, const LinalgTilingOptions &options) |
#define DEBUG_TYPE "linalg-tiling" |
Definition at line 46 of file Tiling.cpp.
#define GEN_PASS_DEF_LINALGTILINGPASS |
Definition at line 37 of file Tiling.cpp.
#define GET_OP_LIST |
|
static |
Build an affine_max
of all the vals
.
Definition at line 219 of file Tiling.cpp.
References mlir::Location::getContext(), mlir::AffineMap::getMultiDimIdentityMap(), and mlir::affine::makeComposedFoldedAffineMax().
Referenced by calculateTileOffsetsAndSizes().
|
static |
Build an affine_min
of all the vals
.
Definition at line 227 of file Tiling.cpp.
References mlir::Location::getContext(), mlir::AffineMap::getMultiDimIdentityMap(), and mlir::affine::makeComposedFoldedAffineMin().
Referenced by calculateTileOffsetsAndSizes().
|
static |
Fill out the tiledOffsets
and tiledSizes
to be used to tile to a given number of threads.
Definition at line 236 of file Tiling.cpp.
References mlir::bindDims(), mlir::bindSymbols(), buildMax(), buildMin(), canOmitTileOffsetInBoundsCheck(), mlir::AffineExpr::ceilDiv(), mlir::Builder::getContext(), mlir::Builder::getIndexAttr(), mlir::isConstantIntValue(), mlir::affine::makeComposedFoldedAffineApply(), and mlir::OpBuilder::setInsertionPointToStart().
|
static |
Returns true if the maximum tile offset tileSize * numThreads-1
is less than iterationSize
.
Definition at line 207 of file Tiling.cpp.
References mlir::getConstantIntValue().
Referenced by calculateTileOffsetsAndSizes().
|
static |
Asserts that the given index-typed value is strictly positive.
If the value is an attribute, asserts at compile time, otherwise emits an assertion checked at runtime.
Definition at line 94 of file Tiling.cpp.
References mlir::ImplicitLocOpBuilder::create(), and mlir::Builder::getStringAttr().
SmallVector<bool> safeToTileToForall | ( | mlir::MLIRContext * | ctx, |
LinalgOp | linalgOp, | ||
ArrayRef< OpFoldResult > | numThreads | ||
) |
Returns a vector of bools representing if, for each axis, op
can be tiled without incurring in a race condition and thus it is thread-safe to do the tiling.
This is checked by iterating over numThreads and ensuring that the corresponding iterator type is "parallel". If it is not, then we know that such dimension is unsafe to tile.
Definition at line 312 of file Tiling.cpp.
|
static |
Definition at line 491 of file Tiling.cpp.
|
static |
Definition at line 849 of file Tiling.cpp.
|
static |
Rewrite a TilingInterface op
to a tiled scf.forall
.
The tiling is specified by the number of tiles/threads numThreads
and the optional nominal tile size nominalTileSizes
. If nominalTilSizes
is not specified, then it is derived from numThreads
as ceilDiv(dimSize[i], numThreads[i])
. If non-empty, the mapping
is added as an attribute to the resulting scf.forall
. A zero tile sizes indicate that the dimension is not tiled, and can be thought of as tiling by the full size of data. It is the user's responsibility to ensure that numThreads
is a valid tiling specification (i.e. that only tiles parallel dimensions, e.g. in the Linalg case). If the dimension is not parallelizable, a warning is issued to notify the user that the generated code is not safe to parallelize. If omitTileOffsetBoundsCheck
is true, then the function will assume that tileSize[i] * (numThread[i] -1) <= dimSize[i]
holds.
Definition at line 343 of file Tiling.cpp.