enhance(compiler): Lower linalg to parallel loops and instantiare parallel loops with openmp

This commit is contained in:
Quentin Bourgerie
2022-01-28 07:21:53 +01:00
committed by Antoniu Pop
parent 260768e9af
commit f52965e22f
4 changed files with 21 additions and 4 deletions

View File

@@ -16,6 +16,7 @@ add_mlir_dialect_library(MLIRLowerableDialectsToLLVM
MLIRTransforms
MLIRLLVMIR
MLIRLLVMToLLVMIRTranslation
MLIROpenMPToLLVMIRTranslation
MLIRMath)
target_link_libraries(MLIRLowerableDialectsToLLVM PUBLIC MLIRIR)

View File

@@ -12,10 +12,12 @@
#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
#include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
#include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h"
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
#include "mlir/Dialect/SCF/SCF.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Pass/Pass.h"
@@ -67,6 +69,15 @@ void MLIRLowerableDialectsToLLVMPass::runOnOperation() {
mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter,
patterns);
mlir::populateMemRefToLLVMConversionPatterns(typeConverter, patterns);
mlir::populateOpenMPToLLVMConversionPatterns(typeConverter, patterns);
target.addDynamicallyLegalOp<mlir::omp::MasterOp, mlir::omp::ParallelOp,
mlir::omp::WsLoopOp>([&](mlir::Operation *op) {
return typeConverter.isLegal(&op->getRegion(0));
});
target.addLegalOp<mlir::omp::TerminatorOp, mlir::omp::TaskyieldOp,
mlir::omp::FlushOp, mlir::omp::BarrierOp,
mlir::omp::TaskwaitOp, mlir::omp::YieldOp>();
// Apply a `FullConversion` to `llvm`.
auto module = getOperation();

View File

@@ -13,6 +13,7 @@
#include <mlir/Dialect/LLVMIR/LLVMDialect.h>
#include <mlir/Dialect/Linalg/IR/LinalgOps.h>
#include <mlir/Dialect/MemRef/IR/MemRef.h>
#include <mlir/Dialect/OpenMP/OpenMPDialect.h>
#include <mlir/Dialect/SCF/SCF.h>
#include <mlir/Dialect/StandardOps/IR/Ops.h>
#include <mlir/ExecutionEngine/OptUtils.h>
@@ -65,6 +66,7 @@ mlir::MLIRContext *CompilationContext::getMLIRContext() {
this->mlirContext->getOrLoadDialect<mlir::linalg::LinalgDialect>();
this->mlirContext->getOrLoadDialect<mlir::LLVM::LLVMDialect>();
this->mlirContext->getOrLoadDialect<mlir::scf::SCFDialect>();
this->mlirContext->getOrLoadDialect<mlir::omp::OpenMPDialect>();
}
return this->mlirContext;

View File

@@ -6,7 +6,8 @@
#include <llvm/Support/TargetSelect.h>
#include <llvm/Support/Error.h>
#include <mlir/Conversion/SCFToStandard/SCFToStandard.h>
#include <mlir/Conversion/Passes.h>
#include <mlir/Dialect/Linalg/Passes.h>
#include <mlir/Dialect/SCF/Passes.h>
#include <mlir/Dialect/StandardOps/Transforms/Passes.h>
@@ -14,6 +15,7 @@
#include <mlir/ExecutionEngine/OptUtils.h>
#include <mlir/Pass/PassManager.h>
#include <mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h>
#include <mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h>
#include <mlir/Target/LLVMIR/Export.h>
#include <mlir/Transforms/Passes.h>
@@ -206,7 +208,7 @@ lowerStdToLLVMDialect(mlir::MLIRContext &context, mlir::ModuleOp &module,
addPotentiallyNestedPass(pm, mlir::createStdBufferizePass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createTensorBufferizePass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createLinalgBufferizePass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createConvertLinalgToLoopsPass(),
addPotentiallyNestedPass(pm, mlir::createConvertLinalgToParallelLoopsPass(),
enablePass);
addPotentiallyNestedPass(pm, mlir::createSCFBufferizePass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createFuncBufferizePass(), enablePass);
@@ -214,14 +216,14 @@ lowerStdToLLVMDialect(mlir::MLIRContext &context, mlir::ModuleOp &module,
pm, mlir::concretelang::createBufferizeDataflowTaskOpsPass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createFinalizingBufferizePass(),
enablePass);
addPotentiallyNestedPass(pm, mlir::createConvertSCFToOpenMPPass(),
enablePass);
// Lower Dataflow tasks to DRF
addPotentiallyNestedPass(
pm, mlir::concretelang::createFixupDataflowTaskOpsPass(), enablePass);
addPotentiallyNestedPass(
pm, mlir::concretelang::createLowerDataflowTasksPass(), enablePass);
addPotentiallyNestedPass(pm, mlir::createConvertLinalgToLoopsPass(),
enablePass);
addPotentiallyNestedPass(pm, mlir::createLowerToCFGPass(), enablePass);
// Convert to MLIR LLVM Dialect
@@ -239,6 +241,7 @@ lowerLLVMDialectToLLVMIR(mlir::MLIRContext &context,
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
mlir::registerLLVMDialectTranslation(*module->getContext());
mlir::registerOpenMPDialectTranslation(*module->getContext());
return mlir::translateModuleToLLVMIR(module, llvmContext);
}