MLIR  21.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 
16 namespace mlir {
17 #define GEN_PASS_DEF_CONVERTAFFINEFORTOGPUPASS
18 #define GEN_PASS_DEF_CONVERTPARALLELLOOPTOGPUPASS
19 #include "mlir/Conversion/Passes.h.inc"
20 } // namespace mlir
21 
22 using namespace mlir;
23 using namespace mlir::scf;
24 
25 namespace {
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.
29 struct 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 
45 struct ParallelLoopToGpuPass
46  : public impl::ConvertParallelLoopToGpuPassBase<ParallelLoopToGpuPass> {
47  void runOnOperation() override {
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
static MLIRContext * getContext(OpFoldResult val)
This class describes a specific conversion target.
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
Include the generated interface declarations.
void finalizeParallelLoopToGPUConversion(Operation *op)
Clean up after applyPartialConversion/applyFullConversion call.
Definition: SCFToGPU.cpp:718
void populateParallelLoopToGPUPatterns(RewritePatternSet &patterns)
Adds the conversion pattern from scf.parallel to gpu.launch to the provided pattern list.
Definition: SCFToGPU.cpp:706
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
LogicalResult applyPartialConversion(ArrayRef< Operation * > ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config=ConversionConfig())
Below we define several entry points for operation conversion.
void configureParallelLoopToGPULegality(ConversionTarget &target)
Configures the rewrite target such that only scf.parallel operations that are not rewritten by the pr...
Definition: SCFToGPU.cpp:710