From 74b42bbca895b6015f35b628c14ab6a0769b6faa Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Fri, 14 Mar 2025 14:47:31 -0700 Subject: [PATCH 1/2] [flang][cuda] Lower CUDA shared variable with cuf.shared_memory operation --- flang/lib/Lower/ConvertVariable.cpp | 14 ++++++++++---- flang/test/Lower/CUDA/cuda-shared.cuf | 11 +++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 flang/test/Lower/CUDA/cuda-shared.cuf diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp index ab5e6346f8d54..05256fec67241 100644 --- a/flang/lib/Lower/ConvertVariable.cpp +++ b/flang/lib/Lower/ConvertVariable.cpp @@ -738,9 +738,11 @@ static mlir::Value createNewLocal(Fortran::lower::AbstractConverter &converter, auto idxTy = builder.getIndexType(); for (mlir::Value sh : elidedShape) indices.push_back(builder.createConvert(loc, idxTy, sh)); - mlir::Value alloc = builder.create( - loc, ty, nm, symNm, dataAttr, lenParams, indices); - return alloc; + if (dataAttr.getValue() == cuf::DataAttribute::Shared) + return builder.create(loc, ty, nm, symNm, lenParams, + indices); + return builder.create(loc, ty, nm, symNm, dataAttr, lenParams, + indices); } // Let the builder do all the heavy lifting. @@ -1032,12 +1034,16 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter, symMap); if (Fortran::semantics::NeedCUDAAlloc(var.getSymbol())) { auto *builder = &converter.getFirOpBuilder(); + cuf::DataAttributeAttr dataAttr = + Fortran::lower::translateSymbolCUFDataAttribute(builder->getContext(), + var.getSymbol()); mlir::Location loc = converter.getCurrentLocation(); fir::ExtendedValue exv = converter.getSymbolExtendedValue(var.getSymbol(), &symMap); auto *sym = &var.getSymbol(); const Fortran::semantics::Scope &owner = sym->owner(); - if (owner.kind() != Fortran::semantics::Scope::Kind::MainProgram) { + if (owner.kind() != Fortran::semantics::Scope::Kind::MainProgram && + dataAttr.getValue() != cuf::DataAttribute::Shared) { converter.getFctCtx().attachCleanup([builder, loc, exv, sym]() { cuf::DataAttributeAttr dataAttr = Fortran::lower::translateSymbolCUFDataAttribute( diff --git a/flang/test/Lower/CUDA/cuda-shared.cuf b/flang/test/Lower/CUDA/cuda-shared.cuf new file mode 100644 index 0000000000000..0bacc4ec0b71e --- /dev/null +++ b/flang/test/Lower/CUDA/cuda-shared.cuf @@ -0,0 +1,11 @@ +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s + +attributes(global) subroutine sharedmem() + real, shared :: s(32) + integer :: t + t = threadIdx%x + s(t) = t +end subroutine + +! CHECK-LABEL: func.func @_QPsharedmem() attributes {cuf.proc_attr = #cuf.cuda_proc} +! CHECK: %{{.*}} = cuf.shared_memory !fir.array<32xf32> {bindc_name = "s", uniq_name = "_QFsharedmemEs"} -> !fir.ref> From 2fa44f03fc931df9a58a696a0019ab45d289bb8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Sun, 16 Mar 2025 09:27:45 -0700 Subject: [PATCH 2/2] Add check-not for cuf.free --- flang/test/Lower/CUDA/cuda-shared.cuf | 1 + 1 file changed, 1 insertion(+) diff --git a/flang/test/Lower/CUDA/cuda-shared.cuf b/flang/test/Lower/CUDA/cuda-shared.cuf index 0bacc4ec0b71e..f41011df06ae7 100644 --- a/flang/test/Lower/CUDA/cuda-shared.cuf +++ b/flang/test/Lower/CUDA/cuda-shared.cuf @@ -9,3 +9,4 @@ end subroutine ! CHECK-LABEL: func.func @_QPsharedmem() attributes {cuf.proc_attr = #cuf.cuda_proc} ! CHECK: %{{.*}} = cuf.shared_memory !fir.array<32xf32> {bindc_name = "s", uniq_name = "_QFsharedmemEs"} -> !fir.ref> +! CHECK-NOT: cuf.free