//===- CRunnerUtils.h - Utils for debugging MLIR execution ----------------===// // // 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 declares basic classes and functions to manipulate structured MLIR // types at runtime. Entities in this file must be compliant with C++11 and be // retargetable, including on targets without a C++ runtime. // //===----------------------------------------------------------------------===// #ifndef MLIR_EXECUTIONENGINE_CRUNNERUTILS_H #define MLIR_EXECUTIONENGINE_CRUNNERUTILS_H #ifdef _WIN32 #ifndef MLIR_CRUNNERUTILS_EXPORT #ifdef mlir_c_runner_utils_EXPORTS // We are building this library #define MLIR_CRUNNERUTILS_EXPORT … #define MLIR_CRUNNERUTILS_DEFINE_FUNCTIONS #else // We are using this library #define MLIR_CRUNNERUTILS_EXPORT … #endif // mlir_c_runner_utils_EXPORTS #endif // MLIR_CRUNNERUTILS_EXPORT #else // _WIN32 // Non-windows: use visibility attributes. #define MLIR_CRUNNERUTILS_EXPORT … #define MLIR_CRUNNERUTILS_DEFINE_FUNCTIONS #endif // _WIN32 #include <array> #include <cassert> #include <cstdint> #include <initializer_list> #include <vector> //===----------------------------------------------------------------------===// // Codegen-compatible structures for Vector type. //===----------------------------------------------------------------------===// namespace mlir { namespace detail { constexpr bool isPowerOf2(int n) { … } constexpr unsigned nextPowerOf2(int n) { … } template <typename T, int Dim, bool IsPowerOf2> struct Vector1D; Vector1D<T, Dim, true>; // 1-D vector, padded to the next power of 2 allocation. // Specialization occurs to avoid zero size arrays (which fail in -Werror). Vector1D<T, Dim, false>; } // namespace detail } // namespace mlir // N-D vectors recurse down to 1-D. template <typename T, int Dim, int... Dims> struct Vector { … }; // 1-D vectors in LLVM are automatically padded to the next power of 2. // We insert explicit padding in to account for this. Vector<T, Dim>; Vector1D; Vector2D; Vector3D; Vector4D; template <int N> void dropFront(int64_t arr[N], int64_t *res) { … } //===----------------------------------------------------------------------===// // Codegen-compatible structures for StridedMemRef type. //===----------------------------------------------------------------------===// template <typename T, int Rank> class StridedMemrefIterator; /// StridedMemRef descriptor type with static rank. template <typename T, int N> struct StridedMemRefType { … }; /// StridedMemRef descriptor type specialized for rank 1. StridedMemRefType<T, 1>; /// StridedMemRef descriptor type specialized for rank 0. StridedMemRefType<T, 0>; /// Iterate over all elements in a strided memref. template <typename T, int Rank> class StridedMemrefIterator { … }; /// Iterate over all elements in a 0-ranked strided memref. StridedMemrefIterator<T, 0>; //===----------------------------------------------------------------------===// // Codegen-compatible structure for UnrankedMemRef type. //===----------------------------------------------------------------------===// // Unranked MemRef template <typename T> struct UnrankedMemRefType { … }; //===----------------------------------------------------------------------===// // DynamicMemRefType type. //===----------------------------------------------------------------------===// template <typename T> class DynamicMemRefIterator; // A reference to one of the StridedMemRef types. template <typename T> class DynamicMemRefType { … }; /// Iterate over all elements in a dynamic memref. template <typename T> class DynamicMemRefIterator { … }; //===----------------------------------------------------------------------===// // Small runtime support library for memref.copy lowering during codegen. //===----------------------------------------------------------------------===// extern "C" MLIR_CRUNNERUTILS_EXPORT void memrefCopy(int64_t elemSize, ::UnrankedMemRefType<char> *src, ::UnrankedMemRefType<char> *dst); //===----------------------------------------------------------------------===// // Small runtime support library for vector.print lowering during codegen. //===----------------------------------------------------------------------===// extern "C" MLIR_CRUNNERUTILS_EXPORT void printI64(int64_t i); extern "C" MLIR_CRUNNERUTILS_EXPORT void printU64(uint64_t u); extern "C" MLIR_CRUNNERUTILS_EXPORT void printF32(float f); extern "C" MLIR_CRUNNERUTILS_EXPORT void printF64(double d); extern "C" MLIR_CRUNNERUTILS_EXPORT void printString(char const *s); extern "C" MLIR_CRUNNERUTILS_EXPORT void printOpen(); extern "C" MLIR_CRUNNERUTILS_EXPORT void printClose(); extern "C" MLIR_CRUNNERUTILS_EXPORT void printComma(); extern "C" MLIR_CRUNNERUTILS_EXPORT void printNewline(); //===----------------------------------------------------------------------===// // Small runtime support library for timing execution and printing GFLOPS //===----------------------------------------------------------------------===// extern "C" MLIR_CRUNNERUTILS_EXPORT void printFlops(double flops); extern "C" MLIR_CRUNNERUTILS_EXPORT double rtclock(); //===----------------------------------------------------------------------===// // Runtime support library for random number generation. //===----------------------------------------------------------------------===// // Uses a seed to initialize a random generator and returns the generator. extern "C" MLIR_CRUNNERUTILS_EXPORT void *rtsrand(uint64_t s); // Uses a random number generator g and returns a random number // in the range of [0, m). extern "C" MLIR_CRUNNERUTILS_EXPORT uint64_t rtrand(void *g, uint64_t m); // Deletes the random number generator. extern "C" MLIR_CRUNNERUTILS_EXPORT void rtdrand(void *g); // Uses a random number generator g and std::shuffle to modify mref // in place. Memref mref will be a permutation of all numbers // in the range of [0, size of mref). extern "C" MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_shuffle(StridedMemRefType<uint64_t, 1> *mref, void *g); //===----------------------------------------------------------------------===// // Runtime support library to allow the use of std::sort in MLIR program. //===----------------------------------------------------------------------===// extern "C" MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_stdSortI64(uint64_t n, StridedMemRefType<int64_t, 1> *vref); extern "C" MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_stdSortF64(uint64_t n, StridedMemRefType<double, 1> *vref); extern "C" MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_stdSortF32(uint64_t n, StridedMemRefType<float, 1> *vref); #endif // MLIR_EXECUTIONENGINE_CRUNNERUTILS_H