[Mlir-commits] [mlir] [mlir][acc] Add utilities for acc to gpu lowering (PR #209313)
Slava Zakharin
llvmlistbot at llvm.org
Mon Jul 13 14:51:12 PDT 2026
================
@@ -206,5 +213,215 @@ void copyParDimsAttr(Operation *from, Operation *to) {
setParDimsAttr(to, getParDimsAttr(from));
}
+int64_t SharedMemoryBudget::alignOffset(int64_t offset) {
+ return (offset + 15) & ~static_cast<int64_t>(15);
+}
+
+bool SharedMemoryBudget::tryAllocate(int64_t bytes) {
+ int64_t aligned = alignOffset(bytesUsed_);
+ if (aligned + bytes > maxTotalBytes_) {
+ return false;
+ }
+ bytesUsed_ = aligned + bytes;
+ return true;
+}
+
+int64_t sumExistingSharedMemoryBytes(Region ®ion) {
+ int64_t total = 0;
+ region.walk([&](GPUSharedMemoryOp op) {
+ int64_t upperBound = op.getStaticUpperBoundBytes();
+ total = SharedMemoryBudget::alignOffset(total) + upperBound;
+ });
+ return total;
+}
+
+PrivatizeOp getPrivatizeOp(PrivateLocalOp privateLocal,
+ ComputeRegionOp computeRegion) {
+ Value value = privateLocal.getPrivatized();
+ if (BlockArgument blockArg = dyn_cast<BlockArgument>(value)) {
+ auto owner = dyn_cast<ComputeRegionOp>(blockArg.getOwner()->getParentOp());
+ value = (owner ? owner : computeRegion).getOperand(blockArg);
+ }
+ PrivatizeOp privatizeOp = value.getDefiningOp<PrivatizeOp>();
+ assert(privatizeOp && "expected privatize op to be the defining op");
+ return privatizeOp;
+}
+
+static bool isThreadXPrivatize(PrivatizeOp privatize) {
+ if (GPUParallelDimsAttr parDimsAttr = privatize.getParDimsAttr())
+ return llvm::any_of(parDimsAttr.getArray(),
+ [](GPUParallelDimAttr d) { return d.isThreadX(); });
+ return false;
+}
+
+MemRefType getPrivateBaseMemRefType(Type baseTy, ModuleOp module) {
+ auto memrefTy = cast<PointerLikeType>(baseTy).getAsMemRefType(module);
+ assert(memrefTy && "private base type must be convertible to memref");
+ return memrefTy;
+}
+
+SmallVector<GPUParallelDimAttr>
+collectPrivateLocalParDims(PrivateLocalOp privateLocal,
+ ComputeRegionOp computeRegion) {
+ SmallVector<GPUParallelDimAttr> parDims;
+ auto parentLoop = privateLocal->getParentOfType<scf::ParallelOp>();
+ while (parentLoop) {
+ if (GPUParallelDimsAttr parDimsAttr = getParDimsAttr(parentLoop))
+ for (GPUParallelDimAttr parDim : parDimsAttr.getArray())
+ insertParDim(parDims, parDim);
+ parentLoop = parentLoop->getParentOfType<scf::ParallelOp>();
----------------
vzakhari wrote:
I wonder if we can pass `acc.compute_region` here and start processing its parent `scf.parallel` operations.
It should not be a big deal, as long as the parent loops won't have any par-dims, but we may as well stop at the compute boundary.
https://github.com/llvm/llvm-project/pull/209313
More information about the Mlir-commits
mailing list