-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[flang][cuda] Lower launch_bounds values #81537
Conversation
@llvm/pr-subscribers-flang-fir-hlfir Author: Valentin Clement (バレンタイン クレメン) (clementval) ChangesThis PR adds a new attribute to carry over the information from Full diff: https://github.com/llvm/llvm-project/pull/81537.diff 5 Files Affected:
diff --git a/flang/include/flang/Optimizer/Dialect/FIRAttr.td b/flang/include/flang/Optimizer/Dialect/FIRAttr.td
index 00e293e2f04278..d55e93ba666e71 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRAttr.td
+++ b/flang/include/flang/Optimizer/Dialect/FIRAttr.td
@@ -113,4 +113,16 @@ def fir_CUDAProcAttributeAttr :
let assemblyFormat = [{ ```<` $value `>` }];
}
+def fir_CUDALaunchBoundsAttr : fir_Attr<"CUDALaunchBounds"> {
+ let mnemonic = "launch_bounds";
+
+ let parameters = (ins
+ "mlir::IntegerAttr":$maxTBP,
+ "mlir::IntegerAttr":$minBPM,
+ OptionalParameter<"mlir::IntegerAttr">:$upperBoundClusterSize
+ );
+
+ 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 6ac6a3116d40b0..29fa57cd7a0d8a 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h
+++ b/flang/include/flang/Optimizer/Dialect/FIROpsSupport.h
@@ -75,6 +75,11 @@ static constexpr llvm::StringRef getTargetAttrName() { return "fir.target"; }
/// Attribute to mark Fortran entities with the CUDA attribute.
static constexpr llvm::StringRef getCUDAAttrName() { return "fir.cuda_attr"; }
+/// Attribute to carry CUDA launch_bounds values.
+static constexpr llvm::StringRef getCUDALaunchBoundsAttrName() {
+ return "fir.cuda_launch_bounds";
+}
+
/// 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 41597c1b15386e..968fba7a66044a 100644
--- a/flang/lib/Lower/CallInterface.cpp
+++ b/flang/lib/Lower/CallInterface.cpp
@@ -524,6 +524,43 @@ static void addSymbolAttribute(mlir::func::FuncOp func,
mlir::StringAttr::get(&mlirContext, name));
}
+static void
+setCUDAAttributes(mlir::func::FuncOp func,
+ const Fortran::semantics::Symbol *sym,
+ std::optional<Fortran::evaluate::characteristics::Procedure>
+ characteristic) {
+ if (characteristic && characteristic->cudaSubprogramAttrs) {
+ func.getOperation()->setAttr(
+ fir::getCUDAAttrName(),
+ fir::getCUDAProcAttribute(func.getContext(),
+ *characteristic->cudaSubprogramAttrs));
+ }
+
+ if (sym) {
+ if (auto details =
+ sym->GetUltimate()
+ .detailsIf<Fortran::semantics::SubprogramDetails>()) {
+ if (!details->cudaLaunchBounds().empty()) {
+ assert(details->cudaLaunchBounds().size() >= 2 &&
+ "expect at least 2 values");
+ mlir::Type i64Ty = mlir::IntegerType::get(func.getContext(), 64);
+ auto maxTBPAttr =
+ mlir::IntegerAttr::get(i64Ty, details->cudaLaunchBounds()[0]);
+ auto minBPMAttr =
+ mlir::IntegerAttr::get(i64Ty, details->cudaLaunchBounds()[1]);
+ mlir::IntegerAttr ubAttr;
+ if (details->cudaLaunchBounds().size() > 2)
+ ubAttr =
+ mlir::IntegerAttr::get(i64Ty, details->cudaLaunchBounds()[2]);
+ func.getOperation()->setAttr(
+ fir::getCUDALaunchBoundsAttrName(),
+ fir::CUDALaunchBoundsAttr::get(func.getContext(), maxTBPAttr,
+ minBPMAttr, ubAttr));
+ }
+ }
+ }
+}
+
/// Declare drives the different actions to be performed while analyzing the
/// signature and building/finding the mlir::func::FuncOp.
template <typename T>
@@ -559,12 +596,8 @@ void Fortran::lower::CallInterface<T>::declare() {
if (!placeHolder.value().attributes.empty())
func.setArgAttrs(placeHolder.index(), placeHolder.value().attributes);
side().setFuncAttrs(func);
- }
- if (characteristic && characteristic->cudaSubprogramAttrs) {
- func.getOperation()->setAttr(
- fir::getCUDAAttrName(),
- fir::getCUDAProcAttribute(func.getContext(),
- *characteristic->cudaSubprogramAttrs));
+
+ setCUDAAttributes(func, side().getProcedureSymbol(), characteristic);
}
}
}
diff --git a/flang/lib/Optimizer/Dialect/FIRAttr.cpp b/flang/lib/Optimizer/Dialect/FIRAttr.cpp
index 8df7a6c5cfc5d5..8d780e03dcbe73 100644
--- a/flang/lib/Optimizer/Dialect/FIRAttr.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRAttr.cpp
@@ -298,5 +298,6 @@ void fir::printFirAttribute(FIROpsDialect *dialect, mlir::Attribute attr,
void FIROpsDialect::registerAttributes() {
addAttributes<ClosedIntervalAttr, ExactTypeAttr, FortranVariableFlagsAttr,
LowerBoundAttr, PointIntervalAttr, RealAttr, SubclassAttr,
- UpperBoundAttr, CUDADataAttributeAttr, CUDAProcAttributeAttr>();
+ UpperBoundAttr, CUDADataAttributeAttr, CUDAProcAttributeAttr,
+ CUDALaunchBoundsAttr>();
}
diff --git a/flang/test/Lower/CUDA/cuda-proc-attribute.cuf b/flang/test/Lower/CUDA/cuda-proc-attribute.cuf
index 050731086d8525..ade38d4b7f0917 100644
--- a/flang/test/Lower/CUDA/cuda-proc-attribute.cuf
+++ b/flang/test/Lower/CUDA/cuda-proc-attribute.cuf
@@ -32,3 +32,9 @@ attributes(host) attributes(device) integer function fct_host_device; end
attributes(device) attributes(host) integer function fct_device_host; end
! CHECK: func.func @_QPfct_device_host() -> i32 attributes {fir.cuda_attr = #fir.cuda_proc<host_device>}
+
+attributes(global) launch_bounds(1, 2) subroutine sub_lbounds1(); end
+! CHECK: func.func @_QPsub_lbounds1() attributes {fir.cuda_attr = #fir.cuda_proc<global>, fir.cuda_launch_bounds = #fir.launch_bounds<maxTBP = 1 : i64, minBPM = 2 : i64>}
+
+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<maxTBP = 1 : i64, minBPM = 2 : i64, upperBoundClusterSize = 3 : i64>}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This PR adds a new attribute to carry over the information from
launch_bounds
. The new attributeCUDALaunchBoundsAttr
holds 2 to 3 integer attrinbutes and is added tofunc.func
operation.