60 lines
2.2 KiB
C++
60 lines
2.2 KiB
C++
//===- SCFToGPU.h - Convert loop nests to GPU kernels -----------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, 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 MLIR_CONVERSION_SCFTOGPU_SCFTOGPU_H_
|
|
#define MLIR_CONVERSION_SCFTOGPU_SCFTOGPU_H_
|
|
|
|
#include "mlir/Support/LLVM.h"
|
|
|
|
namespace mlir {
|
|
class ConversionTarget;
|
|
class MLIRContext;
|
|
class Value;
|
|
class Operation;
|
|
class RewritePatternSet;
|
|
|
|
namespace affine {
|
|
class AffineForOp;
|
|
} // namespace affine
|
|
|
|
namespace scf {
|
|
class ForOp;
|
|
} // namespace scf
|
|
|
|
/// Convert a perfect affine loop nest with the outermost loop identified by
|
|
/// `forOp` into a gpu::Launch operation. Map `numBlockDims` outer loops to
|
|
/// GPU blocks and `numThreadDims` to GPU threads. The bounds of the loops that
|
|
/// are mapped should be independent of the induction variables of the other
|
|
/// mapped loops.
|
|
///
|
|
/// No check on the size of the block or grid, or on the validity of
|
|
/// parallelization is performed, it is under the responsibility of the caller
|
|
/// to strip-mine the loops and to perform the dependence analysis before
|
|
/// calling the conversion.
|
|
|
|
// TODO: Consider removing this in favor of affine.for -> affine.parallel
|
|
// detection followed by an affine.parallel -> scf.parallel -> gpu.launch
|
|
// conversion
|
|
LogicalResult convertAffineLoopNestToGPULaunch(affine::AffineForOp forOp,
|
|
unsigned numBlockDims,
|
|
unsigned numThreadDims);
|
|
|
|
/// Adds the conversion pattern from `scf.parallel` to `gpu.launch` to the
|
|
/// provided pattern list.
|
|
void populateParallelLoopToGPUPatterns(RewritePatternSet &patterns);
|
|
|
|
/// Configures the rewrite target such that only `scf.parallel` operations that
|
|
/// are not rewritten by the provided patterns are legal.
|
|
void configureParallelLoopToGPULegality(ConversionTarget &target);
|
|
|
|
/// Clean up after applyPartialConversion/applyFullConversion call.
|
|
void finalizeParallelLoopToGPUConversion(Operation *op);
|
|
|
|
} // namespace mlir
|
|
|
|
#endif // MLIR_CONVERSION_SCFTOGPU_SCFTOGPU_H_
|