diff options
author | Valentin Clement (バレンタイン クレメン) <clementval@gmail.com> | 2024-02-13 10:02:52 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-13 10:02:52 -0800 |
commit | 5e3c7e3aa48356a62a4b70d5d9d3e4ddd055a390 (patch) | |
tree | 128d62fb17e39bdcd9fee5c7369a958fabc82a23 | |
parent | 7d40ea85d5ea5cc837536f61e3b4f80ea69f14d0 (diff) | |
download | llvm-5e3c7e3aa48356a62a4b70d5d9d3e4ddd055a390.zip llvm-5e3c7e3aa48356a62a4b70d5d9d3e4ddd055a390.tar.gz llvm-5e3c7e3aa48356a62a4b70d5d9d3e4ddd055a390.tar.bz2 |
[flang][cuda] Lower cluster_dims values (#81636)
This PR adds a new attribute to carry over the information from
`cluster_dims`. The new attribute `CUDAClusterDimsAttr` holds 3 integer
attributes and is added to `func.func` operation.
-rw-r--r-- | flang/include/flang/Optimizer/Dialect/FIRAttr.td | 12 | ||||
-rw-r--r-- | flang/include/flang/Optimizer/Dialect/FIROpsSupport.h | 5 | ||||
-rw-r--r-- | flang/lib/Lower/CallInterface.cpp | 16 | ||||
-rw-r--r-- | flang/lib/Optimizer/Dialect/FIRAttr.cpp | 2 | ||||
-rw-r--r-- | flang/test/Lower/CUDA/cuda-proc-attribute.cuf | 3 |
5 files changed, 36 insertions, 2 deletions
diff --git a/flang/include/flang/Optimizer/Dialect/FIRAttr.td b/flang/include/flang/Optimizer/Dialect/FIRAttr.td index 3602c67..66d6cd4 100644 --- a/flang/include/flang/Optimizer/Dialect/FIRAttr.td +++ b/flang/include/flang/Optimizer/Dialect/FIRAttr.td @@ -125,4 +125,16 @@ def fir_CUDALaunchBoundsAttr : fir_Attr<"CUDALaunchBounds"> { let assemblyFormat = "`<` struct(params) `>`"; } +def fir_CUDAClusterDimsAttr : fir_Attr<"CUDAClusterDims"> { + let mnemonic = "cluster_dims"; + + let parameters = (ins + "mlir::IntegerAttr":$x, + "mlir::IntegerAttr":$y, + "mlir::IntegerAttr":$z + ); + + let assemblyFormat = "`<` struct(params) `>`"; +} + #endif // FIR_DIALECT_FIR_ATTRS diff --git a/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h b/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h index 29fa57c..e8226b6 100644 --- a/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h +++ b/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h @@ -80,6 +80,11 @@ static constexpr llvm::StringRef getCUDALaunchBoundsAttrName() { return "fir.cuda_launch_bounds"; } +/// Attribute to carry CUDA cluster_dims values. +static constexpr llvm::StringRef getCUDAClusterDimsAttrName() { + return "fir.cuda_cluster_dims"; +} + /// Attribute to mark that a function argument is a character dummy procedure. /// Character dummy procedure have special ABI constraints. static constexpr llvm::StringRef getCharacterProcedureDummyAttrName() { diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp index f990e0b..6b71aab 100644 --- a/flang/lib/Lower/CallInterface.cpp +++ b/flang/lib/Lower/CallInterface.cpp @@ -540,10 +540,10 @@ setCUDAAttributes(mlir::func::FuncOp func, if (auto details = sym->GetUltimate() .detailsIf<Fortran::semantics::SubprogramDetails>()) { + mlir::Type i64Ty = mlir::IntegerType::get(func.getContext(), 64); if (!details->cudaLaunchBounds().empty()) { assert(details->cudaLaunchBounds().size() >= 2 && "expect at least 2 values"); - mlir::Type i64Ty = mlir::IntegerType::get(func.getContext(), 64); auto maxTPBAttr = mlir::IntegerAttr::get(i64Ty, details->cudaLaunchBounds()[0]); auto minBPMAttr = @@ -557,6 +557,20 @@ setCUDAAttributes(mlir::func::FuncOp func, fir::CUDALaunchBoundsAttr::get(func.getContext(), maxTPBAttr, minBPMAttr, ubAttr)); } + + if (!details->cudaClusterDims().empty()) { + assert(details->cudaClusterDims().size() == 3 && "expect 3 values"); + auto xAttr = + mlir::IntegerAttr::get(i64Ty, details->cudaClusterDims()[0]); + auto yAttr = + mlir::IntegerAttr::get(i64Ty, details->cudaClusterDims()[1]); + auto zAttr = + mlir::IntegerAttr::get(i64Ty, details->cudaClusterDims()[2]); + func.getOperation()->setAttr( + fir::getCUDAClusterDimsAttrName(), + fir::CUDAClusterDimsAttr::get(func.getContext(), xAttr, yAttr, + zAttr)); + } } } } diff --git a/flang/lib/Optimizer/Dialect/FIRAttr.cpp b/flang/lib/Optimizer/Dialect/FIRAttr.cpp index 8d780e0..0cf8dfb 100644 --- a/flang/lib/Optimizer/Dialect/FIRAttr.cpp +++ b/flang/lib/Optimizer/Dialect/FIRAttr.cpp @@ -299,5 +299,5 @@ void FIROpsDialect::registerAttributes() { addAttributes<ClosedIntervalAttr, ExactTypeAttr, FortranVariableFlagsAttr, LowerBoundAttr, PointIntervalAttr, RealAttr, SubclassAttr, UpperBoundAttr, CUDADataAttributeAttr, CUDAProcAttributeAttr, - CUDALaunchBoundsAttr>(); + CUDALaunchBoundsAttr, CUDAClusterDimsAttr>(); } diff --git a/flang/test/Lower/CUDA/cuda-proc-attribute.cuf b/flang/test/Lower/CUDA/cuda-proc-attribute.cuf index 9eb2b85..d9765f6 100644 --- a/flang/test/Lower/CUDA/cuda-proc-attribute.cuf +++ b/flang/test/Lower/CUDA/cuda-proc-attribute.cuf @@ -38,3 +38,6 @@ attributes(global) launch_bounds(1, 2) subroutine sub_lbounds1(); end attributes(global) launch_bounds(1, 2, 3) subroutine sub_lbounds2(); end ! CHECK: func.func @_QPsub_lbounds2() attributes {fir.cuda_attr = #fir.cuda_proc<global>, fir.cuda_launch_bounds = #fir.launch_bounds<maxTPB = 1 : i64, minBPM = 2 : i64, upperBoundClusterSize = 3 : i64>} + +attributes(global) cluster_dims(1, 2, 3) subroutine sub_clusterdims1(); end +! CHECK: func.func @_QPsub_clusterdims1() attributes {fir.cuda_attr = #fir.cuda_proc<global>, fir.cuda_cluster_dims = #fir.cluster_dims<x = 1 : i64, y = 2 : i64, z = 3 : i64>} |