[Mlir-commits] [mlir] [mlir][linalg] Emit a warning when tile_using_forall generates non thread-safe code (PR #80813)
Pablo Antonio Martinez
llvmlistbot at llvm.org
Tue Mar 19 02:42:35 PDT 2024
================
@@ -304,6 +304,50 @@ static void calculateTileOffsetsAndSizes(
}
}
+/// Returns a vector of bools representing if, for the given axis, `op` can be
+/// tiled by `numThreads` without incurring in a race condition and thus it is
+/// thread-safe to do the tiling. This is checked by iterating over the affine
+/// maps of the outputs in `op` and ensuring that all the results in the map are
+/// present in the affine map represented by the tiling sizes, which is derived
+/// from `numThreads` or `nominalTileSizes`.
+SmallVector<bool>
+safeToTileToForall(mlir::MLIRContext *ctx, TilingInterface op,
+ ArrayRef<OpFoldResult> numThreads,
+ std::optional<ArrayRef<OpFoldResult>> nominalTileSizes,
+ int numDims) {
+ ArrayRef<OpFoldResult> tilingValues =
+ nominalTileSizes.has_value() ? *nominalTileSizes : numThreads;
+
+ SmallVector<bool> safeToTile(tilingValues.size(), true);
+ LinalgOp linalgOp = dyn_cast<LinalgOp>(op.getOperation());
+ if (!linalgOp)
+ return safeToTile;
+
+ SmallVector<AffineExpr> dimExprs;
+ dimExprs.reserve(numDims);
+ for (unsigned i = 0; i < tilingValues.size(); i++) {
+ if (auto attr = llvm::dyn_cast_if_present<Attribute>(tilingValues[i])) {
+ if (cast<IntegerAttr>(attr).getValue().getSExtValue() > 1)
----------------
pabloantoniom wrote:
It is correct if `num_threads` is used, since tiling with 1 thread means that only 1 thread runs, so there is no race condition. But it is incorrect in the case `tile_sizes` are used, good catch. Fixed!
https://github.com/llvm/llvm-project/pull/80813
More information about the Mlir-commits
mailing list