Skip to content

Commit 4fde8c3

Browse files
authored
[flang][cuda] Lower CUDA shared variable with cuf.shared_memory op (#131399)
Use `cuf.shared_memory` operation instead of `cuf.alloc` for CUDA shared variable. These variables do not need free operations.
1 parent 4b86a7f commit 4fde8c3

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

flang/lib/Lower/ConvertVariable.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -738,9 +738,11 @@ static mlir::Value createNewLocal(Fortran::lower::AbstractConverter &converter,
738738
auto idxTy = builder.getIndexType();
739739
for (mlir::Value sh : elidedShape)
740740
indices.push_back(builder.createConvert(loc, idxTy, sh));
741-
mlir::Value alloc = builder.create<cuf::AllocOp>(
742-
loc, ty, nm, symNm, dataAttr, lenParams, indices);
743-
return alloc;
741+
if (dataAttr.getValue() == cuf::DataAttribute::Shared)
742+
return builder.create<cuf::SharedMemoryOp>(loc, ty, nm, symNm, lenParams,
743+
indices);
744+
return builder.create<cuf::AllocOp>(loc, ty, nm, symNm, dataAttr, lenParams,
745+
indices);
744746
}
745747

746748
// Let the builder do all the heavy lifting.
@@ -1032,12 +1034,16 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
10321034
symMap);
10331035
if (Fortran::semantics::NeedCUDAAlloc(var.getSymbol())) {
10341036
auto *builder = &converter.getFirOpBuilder();
1037+
cuf::DataAttributeAttr dataAttr =
1038+
Fortran::lower::translateSymbolCUFDataAttribute(builder->getContext(),
1039+
var.getSymbol());
10351040
mlir::Location loc = converter.getCurrentLocation();
10361041
fir::ExtendedValue exv =
10371042
converter.getSymbolExtendedValue(var.getSymbol(), &symMap);
10381043
auto *sym = &var.getSymbol();
10391044
const Fortran::semantics::Scope &owner = sym->owner();
1040-
if (owner.kind() != Fortran::semantics::Scope::Kind::MainProgram) {
1045+
if (owner.kind() != Fortran::semantics::Scope::Kind::MainProgram &&
1046+
dataAttr.getValue() != cuf::DataAttribute::Shared) {
10411047
converter.getFctCtx().attachCleanup([builder, loc, exv, sym]() {
10421048
cuf::DataAttributeAttr dataAttr =
10431049
Fortran::lower::translateSymbolCUFDataAttribute(

flang/test/Lower/CUDA/cuda-shared.cuf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s
2+
3+
attributes(global) subroutine sharedmem()
4+
real, shared :: s(32)
5+
integer :: t
6+
t = threadIdx%x
7+
s(t) = t
8+
end subroutine
9+
10+
! CHECK-LABEL: func.func @_QPsharedmem() attributes {cuf.proc_attr = #cuf.cuda_proc<global>}
11+
! CHECK: %{{.*}} = cuf.shared_memory !fir.array<32xf32> {bindc_name = "s", uniq_name = "_QFsharedmemEs"} -> !fir.ref<!fir.array<32xf32>>
12+
! CHECK-NOT: cuf.free

0 commit comments

Comments
 (0)