blob: d7ee9234da76965a1ade3899755248bff52662e3 [file]
// Copyright 2021 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
#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/IR/HALTypes.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "mlir/Pass/Pass.h"
namespace mlir::iree_compiler::IREE::HAL {
#define GEN_PASS_DEF_REPEATDISPATCHESPASS
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
namespace {
//===----------------------------------------------------------------------===//
// --iree-hal-repeat-dispatches
//===----------------------------------------------------------------------===//
struct RepeatDispatchesPass
: public IREE::HAL::impl::RepeatDispatchesPassBase<RepeatDispatchesPass> {
using IREE::HAL::impl::RepeatDispatchesPassBase<
RepeatDispatchesPass>::RepeatDispatchesPassBase;
void runOnOperation() override {
// Collect all (nested) command buffer dispatch ops.
SmallVector<IREE::HAL::CommandBufferDispatchOp> ops;
getOperation()->walk(
[&ops](IREE::HAL::CommandBufferDispatchOp op) { ops.push_back(op); });
for (auto op : ops) {
OpBuilder builder(op);
for (unsigned i = 1; i < repeatCount; ++i) {
// Clone the op at its original location in the IR.
builder.clone(*op.getOperation());
// Add a barrier after each clone. If the original dispatch has a small
// problem size, simply duplicating without barrier will increase the
// number of subgroups and thus "help" filling the GPU. In the end we
// will have an over optimistic result. Inserting barriers avoids that,
// but it assumes that the command buffer has a linear dispatch
// structure.
builder.create<IREE::HAL::CommandBufferExecutionBarrierOp>(
op.getLoc(), op.getCommandBuffer(),
IREE::HAL::ExecutionStageBitfield::CommandRetire |
IREE::HAL::ExecutionStageBitfield::Dispatch,
IREE::HAL::ExecutionStageBitfield::CommandIssue |
IREE::HAL::ExecutionStageBitfield::Dispatch,
IREE::HAL::ExecutionBarrierFlagBitfield::None);
}
}
}
};
} // namespace
} // namespace mlir::iree_compiler::IREE::HAL