//===- ParallelLoopMapper.cpp - Utilities for mapping parallel loops to GPU =// // // 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 // //===----------------------------------------------------------------------===// // // This file implements utilities to generate mappings for parallel loops to // GPU devices. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/GPU/Transforms/Passes.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/Dialect/GPU/Transforms/ParallelLoopMapper.h" #include "mlir/Dialect/SCF/IR/SCF.h" #include "mlir/IR/AffineMap.h" namespace mlir { #define GEN_PASS_DEF_GPUMAPPARALLELLOOPSPASS #include "mlir/Dialect/GPU/Transforms/Passes.h.inc" } // namespace mlir namespace mlir { ParallelOp; StringRef gpu::getMappingAttrName() { … } LogicalResult gpu::setMappingAttr(ParallelOp ploopOp, ArrayRef<ParallelLoopDimMappingAttr> mapping) { … } namespace gpu { namespace { enum MappingLevel { … }; } // namespace static constexpr int kNumHardwareIds = …; /// Bounded increment on MappingLevel. Increments to the next /// level unless Sequential was already reached. static MappingLevel &operator++(MappingLevel &mappingLevel) { … } /// Computed the hardware id to use for a given mapping level. Will /// assign x,y and z hardware ids for the first 3 dimensions and use /// sequential after. /// TODO: Make this use x for the inner-most loop that is /// distributed to map to x, the next innermost to y and the next innermost to /// z. static Processor getHardwareIdForMapping(MappingLevel level, int dimension) { … } /// Add mapping information to the given parallel loop. Do not add /// mapping information if the loop already has it. Also, don't /// start a mapping at a nested loop. static void mapParallelOp(ParallelOp parallelOp, MappingLevel mappingLevel = MapGrid) { … } namespace { struct GpuMapParallelLoopsPass : public impl::GpuMapParallelLoopsPassBase<GpuMapParallelLoopsPass> { … }; } // namespace } // namespace gpu } // namespace mlir std::unique_ptr<mlir::OperationPass<mlir::func::FuncOp>> mlir::createGpuMapParallelLoopsPass() { … }