MLIR 22.0.0git
SCFToGPUPass.cpp
Go to the documentation of this file.
1//===- SCFToGPUPass.cpp - Convert a loop nest to a GPU kernel -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
15
16namespace mlir {
17#define GEN_PASS_DEF_CONVERTAFFINEFORTOGPUPASS
18#define GEN_PASS_DEF_CONVERTPARALLELLOOPTOGPUPASS
19#include "mlir/Conversion/Passes.h.inc"
20} // namespace mlir
21
22using namespace mlir;
23using namespace mlir::scf;
24
25namespace {
26// A pass that traverses top-level loops in the function and converts them to
27// GPU launch operations. Nested launches are not allowed, so this does not
28// walk the function recursively to avoid considering nested loops.
29struct ForLoopMapper
30 : public impl::ConvertAffineForToGPUPassBase<ForLoopMapper> {
31 using Base::Base;
32
33 void runOnOperation() override {
34 for (Operation &op : llvm::make_early_inc_range(
35 getOperation().getFunctionBody().getOps())) {
36 if (auto forOp = dyn_cast<affine::AffineForOp>(&op)) {
37 if (failed(convertAffineLoopNestToGPULaunch(forOp, numBlockDims,
38 numThreadDims)))
39 signalPassFailure();
40 }
41 }
42 }
43};
44
45struct ParallelLoopToGpuPass
46 : public impl::ConvertParallelLoopToGpuPassBase<ParallelLoopToGpuPass> {
47 void runOnOperation() override {
48 RewritePatternSet patterns(&getContext());
50 ConversionTarget target(getContext());
51 target.markUnknownOpDynamicallyLegal([](Operation *) { return true; });
53 if (failed(applyPartialConversion(getOperation(), target,
54 std::move(patterns))))
55 signalPassFailure();
57 }
58};
59
60} // namespace
b getContext())
detail::InFlightRemark failed(Location loc, RemarkOpts opts)
Report an optimization remark that failed.
Definition Remarks.h:561
Include the generated interface declarations.
void finalizeParallelLoopToGPUConversion(Operation *op)
Clean up after applyPartialConversion/applyFullConversion call.
Definition SCFToGPU.cpp:782
void populateParallelLoopToGPUPatterns(RewritePatternSet &patterns)
Adds the conversion pattern from scf.parallel to gpu.launch to the provided pattern list.
Definition SCFToGPU.cpp:770
LogicalResult convertAffineLoopNestToGPULaunch(affine::AffineForOp forOp, unsigned numBlockDims, unsigned numThreadDims)
Convert a perfect affine loop nest with the outermost loop identified by forOp into a gpu::Launch ope...
const FrozenRewritePatternSet & patterns
void configureParallelLoopToGPULegality(ConversionTarget &target)
Configures the rewrite target such that only scf.parallel operations that are not rewritten by the pr...
Definition SCFToGPU.cpp:774