//===- Threading.h - MLIR Threading Utilities -------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines various utilies for multithreaded processing within MLIR. // These utilities automatically handle many of the necessary threading // conditions, such as properly ordering diagnostics, observing if threading is // disabled, etc. These utilities should be used over other threading utilities // whenever feasible. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_THREADING_H #define MLIR_IR_THREADING_H #include "mlir/IR/Diagnostics.h" #include "llvm/ADT/Sequence.h" #include "llvm/Support/ThreadPool.h" #include <atomic> namespace mlir { /// Invoke the given function on the elements between [begin, end) /// asynchronously. If the given function returns a failure when processing any /// of the elements, execution is stopped and a failure is returned from this /// function. This means that in the case of failure, not all elements of the /// range will be processed. Diagnostics emitted during processing are ordered /// relative to the element's position within [begin, end). If the provided /// context does not have multi-threading enabled, this function always /// processes elements sequentially. template <typename IteratorT, typename FuncT> LogicalResult failableParallelForEach(MLIRContext *context, IteratorT begin, IteratorT end, FuncT &&func) { … } /// Invoke the given function on the elements in the provided range /// asynchronously. If the given function returns a failure when processing any /// of the elements, execution is stopped and a failure is returned from this /// function. This means that in the case of failure, not all elements of the /// range will be processed. Diagnostics emitted during processing are ordered /// relative to the element's position within the range. If the provided context /// does not have multi-threading enabled, this function always processes /// elements sequentially. template <typename RangeT, typename FuncT> LogicalResult failableParallelForEach(MLIRContext *context, RangeT &&range, FuncT &&func) { … } /// Invoke the given function on the elements between [begin, end) /// asynchronously. If the given function returns a failure when processing any /// of the elements, execution is stopped and a failure is returned from this /// function. This means that in the case of failure, not all elements of the /// range will be processed. Diagnostics emitted during processing are ordered /// relative to the element's position within [begin, end). If the provided /// context does not have multi-threading enabled, this function always /// processes elements sequentially. template <typename FuncT> LogicalResult failableParallelForEachN(MLIRContext *context, size_t begin, size_t end, FuncT &&func) { … } /// Invoke the given function on the elements between [begin, end) /// asynchronously. Diagnostics emitted during processing are ordered relative /// to the element's position within [begin, end). If the provided context does /// not have multi-threading enabled, this function always processes elements /// sequentially. template <typename IteratorT, typename FuncT> void parallelForEach(MLIRContext *context, IteratorT begin, IteratorT end, FuncT &&func) { … } /// Invoke the given function on the elements in the provided range /// asynchronously. Diagnostics emitted during processing are ordered relative /// to the element's position within the range. If the provided context does not /// have multi-threading enabled, this function always processes elements /// sequentially. template <typename RangeT, typename FuncT> void parallelForEach(MLIRContext *context, RangeT &&range, FuncT &&func) { … } /// Invoke the given function on the elements between [begin, end) /// asynchronously. Diagnostics emitted during processing are ordered relative /// to the element's position within [begin, end). If the provided context does /// not have multi-threading enabled, this function always processes elements /// sequentially. template <typename FuncT> void parallelFor(MLIRContext *context, size_t begin, size_t end, FuncT &&func) { … } } // namespace mlir #endif // MLIR_IR_THREADING_H