[Mlir-commits] [mlir] [MLIR][XeGPU] Enhance XeGPU lane layout to support "wrap-around" distribution (PR #186958)
Charitha Saumya
llvmlistbot at llvm.org
Thu Mar 19 10:48:23 PDT 2026
================
@@ -834,10 +921,93 @@ SliceAttr::computeDistributedCoords(OpBuilder &builder, Location loc,
// The effective sgIds for offsets computing correspond
// to the dims that are not sliced.
ArrayRef<int64_t> dims = flatten().getDims().asArrayRef();
- SmallVector<Value> sgIds =
+ SmallVector<Value> canonicalIds =
XeGPUDialect::slice(ArrayRef<Value>(*maybeIds), dims);
- return genCoordinates(builder, loc, sgIds, layout, subShape, shape);
+ return genCoordinates(builder, loc, canonicalIds, layout, subShape, shape);
+}
+
+/// Implements DistributeLayoutAttr::computeStaticDistributedCoords to
+/// compute multi-dimensional offsets for a given linear ID when distributed by
+/// SliceAttr. Delegates delinearization to the parent LayoutAttr, then uses
+/// only the non-sliced dimensions for coordinate computation.
+SmallVector<SmallVector<int64_t>>
+SliceAttr::computeStaticDistributedCoords(int64_t linearId,
+ ArrayRef<int64_t> shape) {
+ assert(getRank() == static_cast<int64_t>(shape.size()) && "invalid shape.");
+
+ SmallVector<int64_t> layout;
+ SmallVector<int64_t> subShape;
+ SmallVector<int64_t> instData;
+ if (isForWorkgroup()) {
+ layout = getEffectiveSgLayoutAsInt();
+ subShape = getEffectiveSgDataAsInt();
+ } else if (isForSubgroup()) {
+ instData = getEffectiveInstDataAsInt();
+ layout = getEffectiveLaneLayoutAsInt();
+ subShape = getEffectiveLaneDataAsInt();
+ }
+ if (!instData.empty()) {
+ linearId = 0;
+ subShape = instData;
+ }
+
+ assert(!subShape.empty() && "sgdata or lanedata cannot be empty");
+
+ // Delinearize the ID using the parent layout (same as the IR version).
+ SliceAttr flattened = flatten();
+ auto parent = dyn_cast<LayoutAttr>(flattened.getParent());
+ SmallVector<int64_t> parentLayoutVec;
+ if (parent.isForWorkgroup())
+ parentLayoutVec = parent.getEffectiveSgLayoutAsInt();
+ else
+ parentLayoutVec = parent.getEffectiveLaneLayoutAsInt();
+
+ DenseI32ArrayAttr orderAttr = parent.getOrder();
+ SmallVector<int64_t> order;
+ if (orderAttr && !orderAttr.empty()) {
----------------
charithaintc wrote:
+1 or use/modify exiting functionality in `getEffectiveOrder`
https://github.com/llvm/llvm-project/pull/186958
More information about the Mlir-commits
mailing list