Skip to content

Commit 4b17a8b

Browse files
authored
[flang][cuda] Add operation to sync global descriptor (#121520)
Introduce cuf.sync_descriptor to be used to sync device global descriptor after pointer association. Also move CUFCommon so it can be used in FIRBuilder lib as well.
1 parent 4010e0c commit 4b17a8b

File tree

11 files changed

+53
-6
lines changed

11 files changed

+53
-6
lines changed

flang/include/flang/Optimizer/Dialect/CUF/CUFOps.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@ def cuf_DeallocateOp : cuf_Op<"deallocate",
140140
let hasVerifier = 1;
141141
}
142142

143+
def cuf_SyncDescriptorOp : cuf_Op<"sync_descriptor", []> {
144+
let summary =
145+
"Synchronize the host and device descriptor of a Fortran pointer";
146+
147+
let arguments = (ins SymbolRefAttr:$globalName);
148+
149+
let assemblyFormat = [{
150+
$globalName attr-dict
151+
}];
152+
}
153+
143154
def cuf_DataTransferOp : cuf_Op<"data_transfer", []> {
144155
let summary = "Represent a data transfer between host and device memory";
145156

flang/lib/Lower/Allocatable.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
#include "flang/Lower/PFTBuilder.h"
2323
#include "flang/Lower/Runtime.h"
2424
#include "flang/Lower/StatementContext.h"
25+
#include "flang/Optimizer/Builder/CUFCommon.h"
2526
#include "flang/Optimizer/Builder/FIRBuilder.h"
2627
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
2728
#include "flang/Optimizer/Builder/Todo.h"
2829
#include "flang/Optimizer/Dialect/CUF/CUFOps.h"
2930
#include "flang/Optimizer/Dialect/FIROps.h"
3031
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
32+
#include "flang/Optimizer/HLFIR/HLFIROps.h"
3133
#include "flang/Optimizer/Support/FatalError.h"
3234
#include "flang/Optimizer/Support/InternalNames.h"
3335
#include "flang/Parser/parse-tree.h"
@@ -1086,6 +1088,22 @@ bool Fortran::lower::isArraySectionWithoutVectorSubscript(
10861088
!Fortran::evaluate::HasVectorSubscript(expr);
10871089
}
10881090

1091+
static void genCUFPointerSync(const mlir::Value box,
1092+
fir::FirOpBuilder &builder) {
1093+
if (auto declareOp = box.getDefiningOp<hlfir::DeclareOp>()) {
1094+
if (auto addrOfOp = declareOp.getMemref().getDefiningOp<fir::AddrOfOp>()) {
1095+
auto mod = addrOfOp->getParentOfType<mlir::ModuleOp>();
1096+
if (auto globalOp =
1097+
mod.lookupSymbol<fir::GlobalOp>(addrOfOp.getSymbol())) {
1098+
if (cuf::isRegisteredDeviceGlobal(globalOp)) {
1099+
builder.create<cuf::SyncDescriptorOp>(box.getLoc(),
1100+
addrOfOp.getSymbol());
1101+
}
1102+
}
1103+
}
1104+
}
1105+
}
1106+
10891107
void Fortran::lower::associateMutableBox(
10901108
Fortran::lower::AbstractConverter &converter, mlir::Location loc,
10911109
const fir::MutableBoxValue &box, const Fortran::lower::SomeExpr &source,
@@ -1098,6 +1116,7 @@ void Fortran::lower::associateMutableBox(
10981116
if (converter.getLoweringOptions().getLowerToHighLevelFIR()) {
10991117
fir::ExtendedValue rhs = converter.genExprAddr(loc, source, stmtCtx);
11001118
fir::factory::associateMutableBox(builder, loc, box, rhs, lbounds);
1119+
genCUFPointerSync(box.getAddr(), builder);
11011120
return;
11021121
}
11031122
// The right hand side is not be evaluated into a temp. Array sections can

flang/lib/Optimizer/Builder/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ add_flang_library(FIRBuilder
55
BoxValue.cpp
66
Character.cpp
77
Complex.cpp
8+
CUFCommon.cpp
89
DoLoopHelper.cpp
910
FIRBuilder.cpp
1011
HLFIRTools.cpp

flang/lib/Optimizer/Transforms/CUFCommon.cpp renamed to flang/lib/Optimizer/Builder/CUFCommon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#include "flang/Optimizer/Transforms/CUFCommon.h"
9+
#include "flang/Optimizer/Builder/CUFCommon.h"
1010
#include "flang/Optimizer/Dialect/CUF/CUFOps.h"
1111
#include "mlir/Dialect/Func/IR/FuncOps.h"
1212
#include "mlir/Dialect/LLVMIR/NVVMDialect.h"

flang/lib/Optimizer/Transforms/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ add_flang_library(FIRTransforms
99
CompilerGeneratedNames.cpp
1010
ConstantArgumentGlobalisation.cpp
1111
ControlFlowConverter.cpp
12-
CUFCommon.cpp
1312
CUFAddConstructor.cpp
1413
CUFDeviceGlobal.cpp
1514
CUFOpConversion.cpp

flang/lib/Optimizer/Transforms/CUFAddConstructor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "flang/Optimizer/Builder/BoxValue.h"
10+
#include "flang/Optimizer/Builder/CUFCommon.h"
1011
#include "flang/Optimizer/Builder/FIRBuilder.h"
1112
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
1213
#include "flang/Optimizer/Builder/Todo.h"
@@ -19,7 +20,6 @@
1920
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
2021
#include "flang/Optimizer/Dialect/FIRType.h"
2122
#include "flang/Optimizer/Support/DataLayout.h"
22-
#include "flang/Optimizer/Transforms/CUFCommon.h"
2323
#include "flang/Runtime/CUDA/registration.h"
2424
#include "flang/Runtime/entry-names.h"
2525
#include "mlir/Dialect/GPU/IR/GPUDialect.h"

flang/lib/Optimizer/Transforms/CUFDeviceGlobal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "flang/Common/Fortran.h"
10+
#include "flang/Optimizer/Builder/CUFCommon.h"
1011
#include "flang/Optimizer/Dialect/CUF/CUFOps.h"
1112
#include "flang/Optimizer/Dialect/FIRDialect.h"
1213
#include "flang/Optimizer/Dialect/FIROps.h"
1314
#include "flang/Optimizer/HLFIR/HLFIROps.h"
1415
#include "flang/Optimizer/Support/InternalNames.h"
15-
#include "flang/Optimizer/Transforms/CUFCommon.h"
1616
#include "flang/Runtime/CUDA/common.h"
1717
#include "flang/Runtime/allocatable.h"
1818
#include "mlir/Dialect/LLVMIR/NVVMDialect.h"

flang/lib/Optimizer/Transforms/CUFOpConversion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
#include "flang/Optimizer/Transforms/CUFOpConversion.h"
1010
#include "flang/Common/Fortran.h"
11+
#include "flang/Optimizer/Builder/CUFCommon.h"
1112
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
1213
#include "flang/Optimizer/CodeGen/TypeConverter.h"
1314
#include "flang/Optimizer/Dialect/CUF/CUFOps.h"
1415
#include "flang/Optimizer/Dialect/FIRDialect.h"
1516
#include "flang/Optimizer/Dialect/FIROps.h"
1617
#include "flang/Optimizer/HLFIR/HLFIROps.h"
1718
#include "flang/Optimizer/Support/DataLayout.h"
18-
#include "flang/Optimizer/Transforms/CUFCommon.h"
1919
#include "flang/Runtime/CUDA/allocatable.h"
2020
#include "flang/Runtime/CUDA/common.h"
2121
#include "flang/Runtime/CUDA/descriptor.h"

flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424

2525
#include "flang/Common/Fortran.h"
2626
#include "flang/Optimizer/Builder/BoxValue.h"
27+
#include "flang/Optimizer/Builder/CUFCommon.h"
2728
#include "flang/Optimizer/Builder/FIRBuilder.h"
2829
#include "flang/Optimizer/Builder/LowLevelIntrinsics.h"
2930
#include "flang/Optimizer/Builder/Todo.h"
3031
#include "flang/Optimizer/Dialect/FIROps.h"
3132
#include "flang/Optimizer/Dialect/FIRType.h"
3233
#include "flang/Optimizer/Dialect/Support/FIRContext.h"
3334
#include "flang/Optimizer/HLFIR/HLFIRDialect.h"
34-
#include "flang/Optimizer/Transforms/CUFCommon.h"
3535
#include "flang/Optimizer/Transforms/Passes.h"
3636
#include "flang/Optimizer/Transforms/Utils.h"
3737
#include "flang/Runtime/entry-names.h"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s
2+
3+
module devptr
4+
real, device, pointer, dimension(:) :: dev_ptr
5+
end module
6+
7+
use devptr
8+
real, device, target, dimension(4) :: a_dev
9+
a_dev = 42.0
10+
dev_ptr => a_dev
11+
end
12+
13+
! CHECK: fir.global @_QMdevptrEdev_ptr {data_attr = #cuf.cuda<device>} : !fir.box<!fir.ptr<!fir.array<?xf32>>>
14+
! CHECK-LABEL: func.func @_QQmain()
15+
! CHECK: fir.embox
16+
! CHECK: fir.store
17+
! CHECK: cuf.sync_descriptor @_QMdevptrEdev_ptr

0 commit comments

Comments
 (0)