331 lines · cpp
1//===- RunnerUtils.cpp - Utils for MLIR exec on targets with a C++ runtime ===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements basic functions to debug structured MLIR types at10// runtime. Entities in this file may not be compatible with targets without a11// C++ runtime. These may be progressively migrated to CRunnerUtils.cpp over12// time.13//14//===----------------------------------------------------------------------===//15 16#include "mlir/ExecutionEngine/RunnerUtils.h"17#include <chrono>18 19// NOLINTBEGIN(*-identifier-naming)20 21extern "C" void _mlir_ciface_printMemrefShapeI8(UnrankedMemRefType<int8_t> *M) {22 std::cout << "Unranked Memref ";23 printMemRefMetaData(std::cout, DynamicMemRefType<int8_t>(*M));24 std::cout << "\n";25}26 27extern "C" void28_mlir_ciface_printMemrefShapeI32(UnrankedMemRefType<int32_t> *M) {29 std::cout << "Unranked Memref ";30 printMemRefMetaData(std::cout, DynamicMemRefType<int32_t>(*M));31 std::cout << "\n";32}33 34extern "C" void35_mlir_ciface_printMemrefShapeI64(UnrankedMemRefType<int64_t> *M) {36 std::cout << "Unranked Memref ";37 printMemRefMetaData(std::cout, DynamicMemRefType<int64_t>(*M));38 std::cout << "\n";39}40 41extern "C" void _mlir_ciface_printMemrefShapeF32(UnrankedMemRefType<float> *M) {42 std::cout << "Unranked Memref ";43 printMemRefMetaData(std::cout, DynamicMemRefType<float>(*M));44 std::cout << "\n";45}46 47extern "C" void48_mlir_ciface_printMemrefShapeF64(UnrankedMemRefType<double> *M) {49 std::cout << "Unranked Memref ";50 printMemRefMetaData(std::cout, DynamicMemRefType<double>(*M));51 std::cout << "\n";52}53 54extern "C" void55_mlir_ciface_printMemrefShapeInd(UnrankedMemRefType<impl::index_type> *M) {56 std::cout << "Unranked Memref ";57 printMemRefMetaData(std::cout, DynamicMemRefType<impl::index_type>(*M));58 std::cout << "\n";59}60 61extern "C" void62_mlir_ciface_printMemrefShapeC32(UnrankedMemRefType<impl::complex32> *M) {63 std::cout << "Unranked Memref ";64 printMemRefMetaData(std::cout, DynamicMemRefType<impl::complex32>(*M));65 std::cout << "\n";66}67 68extern "C" void69_mlir_ciface_printMemrefShapeC64(UnrankedMemRefType<impl::complex64> *M) {70 std::cout << "Unranked Memref ";71 printMemRefMetaData(std::cout, DynamicMemRefType<impl::complex64>(*M));72 std::cout << "\n";73}74 75extern "C" void _mlir_ciface_printMemrefVector4x4xf32(76 StridedMemRefType<Vector2D<4, 4, float>, 2> *M) {77 impl::printMemRef(*M);78}79 80extern "C" void _mlir_ciface_printMemrefI8(UnrankedMemRefType<int8_t> *M) {81 impl::printMemRef(*M);82}83 84extern "C" void _mlir_ciface_printMemrefI16(UnrankedMemRefType<int16_t> *M) {85 impl::printMemRef(*M);86}87 88extern "C" void _mlir_ciface_printMemrefI32(UnrankedMemRefType<int32_t> *M) {89 impl::printMemRef(*M);90}91 92extern "C" void _mlir_ciface_printMemrefI64(UnrankedMemRefType<int64_t> *M) {93 impl::printMemRef(*M);94}95 96extern "C" void _mlir_ciface_printMemrefF16(UnrankedMemRefType<f16> *M) {97 impl::printMemRef(*M);98}99 100extern "C" void _mlir_ciface_printMemrefBF16(UnrankedMemRefType<bf16> *M) {101 impl::printMemRef(*M);102}103 104extern "C" void _mlir_ciface_printMemrefF32(UnrankedMemRefType<float> *M) {105 impl::printMemRef(*M);106}107 108extern "C" void _mlir_ciface_printMemrefF64(UnrankedMemRefType<double> *M) {109 impl::printMemRef(*M);110}111 112extern "C" void113_mlir_ciface_printMemrefInd(UnrankedMemRefType<impl::index_type> *M) {114 impl::printMemRef(*M);115}116 117extern "C" void118_mlir_ciface_printMemrefC32(UnrankedMemRefType<impl::complex32> *M) {119 impl::printMemRef(*M);120}121 122extern "C" void123_mlir_ciface_printMemrefC64(UnrankedMemRefType<impl::complex64> *M) {124 impl::printMemRef(*M);125}126 127extern "C" int64_t _mlir_ciface_nanoTime() {128 auto now = std::chrono::high_resolution_clock::now();129 auto duration = now.time_since_epoch();130 auto nanoseconds =131 std::chrono::duration_cast<std::chrono::nanoseconds>(duration);132 return nanoseconds.count();133}134 135extern "C" void printMemrefI32(int64_t rank, void *ptr) {136 UnrankedMemRefType<int32_t> descriptor = {rank, ptr};137 _mlir_ciface_printMemrefI32(&descriptor);138}139 140extern "C" void printMemrefI64(int64_t rank, void *ptr) {141 UnrankedMemRefType<int64_t> descriptor = {rank, ptr};142 _mlir_ciface_printMemrefI64(&descriptor);143}144 145extern "C" void printMemrefF32(int64_t rank, void *ptr) {146 UnrankedMemRefType<float> descriptor = {rank, ptr};147 _mlir_ciface_printMemrefF32(&descriptor);148}149 150extern "C" void printMemrefF64(int64_t rank, void *ptr) {151 UnrankedMemRefType<double> descriptor = {rank, ptr};152 _mlir_ciface_printMemrefF64(&descriptor);153}154 155// Assume index_type is in fact uint64_t.156static_assert(std::is_same<impl::index_type, uint64_t>::value,157 "Expected index_type == uint64_t");158extern "C" void printMemrefInd(int64_t rank, void *ptr) {159 UnrankedMemRefType<impl::index_type> descriptor = {rank, ptr};160 _mlir_ciface_printMemrefInd(&descriptor);161}162 163extern "C" void printMemrefC32(int64_t rank, void *ptr) {164 UnrankedMemRefType<impl::complex32> descriptor = {rank, ptr};165 _mlir_ciface_printMemrefC32(&descriptor);166}167 168extern "C" void printMemrefC64(int64_t rank, void *ptr) {169 UnrankedMemRefType<impl::complex64> descriptor = {rank, ptr};170 _mlir_ciface_printMemrefC64(&descriptor);171}172 173extern "C" void _mlir_ciface_printMemref0dF32(StridedMemRefType<float, 0> *M) {174 impl::printMemRef(*M);175}176extern "C" void _mlir_ciface_printMemref1dF32(StridedMemRefType<float, 1> *M) {177 impl::printMemRef(*M);178}179extern "C" void _mlir_ciface_printMemref2dF32(StridedMemRefType<float, 2> *M) {180 impl::printMemRef(*M);181}182extern "C" void _mlir_ciface_printMemref3dF32(StridedMemRefType<float, 3> *M) {183 impl::printMemRef(*M);184}185extern "C" void _mlir_ciface_printMemref4dF32(StridedMemRefType<float, 4> *M) {186 impl::printMemRef(*M);187}188 189extern "C" void _mlir_ciface_printMemref1dI8(StridedMemRefType<int8_t, 1> *M) {190 impl::printMemRef(*M);191}192 193extern "C" void194_mlir_ciface_printMemref1dI32(StridedMemRefType<int32_t, 1> *M) {195 impl::printMemRef(*M);196}197 198extern "C" void199_mlir_ciface_printMemref1dI64(StridedMemRefType<int64_t, 1> *M) {200 impl::printMemRef(*M);201}202 203extern "C" void _mlir_ciface_printMemref1dF64(StridedMemRefType<double, 1> *M) {204 impl::printMemRef(*M);205}206 207extern "C" void208_mlir_ciface_printMemref1dInd(StridedMemRefType<impl::index_type, 1> *M) {209 impl::printMemRef(*M);210}211 212extern "C" void213_mlir_ciface_printMemref1dC32(StridedMemRefType<impl::complex32, 1> *M) {214 impl::printMemRef(*M);215}216 217extern "C" void218_mlir_ciface_printMemref1dC64(StridedMemRefType<impl::complex64, 1> *M) {219 impl::printMemRef(*M);220}221 222extern "C" int64_t223_mlir_ciface_verifyMemRefI8(UnrankedMemRefType<int8_t> *actual,224 UnrankedMemRefType<int8_t> *expected) {225 return impl::verifyMemRef(*actual, *expected);226}227 228extern "C" int64_t229_mlir_ciface_verifyMemRefI16(UnrankedMemRefType<int16_t> *actual,230 UnrankedMemRefType<int16_t> *expected) {231 return impl::verifyMemRef(*actual, *expected);232}233 234extern "C" int64_t235_mlir_ciface_verifyMemRefI32(UnrankedMemRefType<int32_t> *actual,236 UnrankedMemRefType<int32_t> *expected) {237 return impl::verifyMemRef(*actual, *expected);238}239 240extern "C" int64_t241_mlir_ciface_verifyMemRefI64(UnrankedMemRefType<int64_t> *actual,242 UnrankedMemRefType<int64_t> *expected) {243 return impl::verifyMemRef(*actual, *expected);244}245 246extern "C" int64_t247_mlir_ciface_verifyMemRefF16(UnrankedMemRefType<f16> *actual,248 UnrankedMemRefType<f16> *expected) {249 return impl::verifyMemRef(*actual, *expected);250}251 252extern "C" int64_t253_mlir_ciface_verifyMemRefBF16(UnrankedMemRefType<bf16> *actual,254 UnrankedMemRefType<bf16> *expected) {255 return impl::verifyMemRef(*actual, *expected);256}257 258extern "C" int64_t259_mlir_ciface_verifyMemRefF32(UnrankedMemRefType<float> *actual,260 UnrankedMemRefType<float> *expected) {261 return impl::verifyMemRef(*actual, *expected);262}263 264extern "C" int64_t265_mlir_ciface_verifyMemRefF64(UnrankedMemRefType<double> *actual,266 UnrankedMemRefType<double> *expected) {267 return impl::verifyMemRef(*actual, *expected);268}269 270extern "C" int64_t271_mlir_ciface_verifyMemRefInd(UnrankedMemRefType<impl::index_type> *actual,272 UnrankedMemRefType<impl::index_type> *expected) {273 return impl::verifyMemRef(*actual, *expected);274}275 276extern "C" int64_t277_mlir_ciface_verifyMemRefC32(UnrankedMemRefType<impl::complex32> *actual,278 UnrankedMemRefType<impl::complex32> *expected) {279 return impl::verifyMemRef(*actual, *expected);280}281 282extern "C" int64_t283_mlir_ciface_verifyMemRefC64(UnrankedMemRefType<impl::complex64> *actual,284 UnrankedMemRefType<impl::complex64> *expected) {285 return impl::verifyMemRef(*actual, *expected);286}287 288extern "C" int64_t verifyMemRefI32(int64_t rank, void *actualPtr,289 void *expectedPtr) {290 UnrankedMemRefType<int32_t> actualDesc = {rank, actualPtr};291 UnrankedMemRefType<int32_t> expectedDesc = {rank, expectedPtr};292 return _mlir_ciface_verifyMemRefI32(&actualDesc, &expectedDesc);293}294 295extern "C" int64_t verifyMemRefF32(int64_t rank, void *actualPtr,296 void *expectedPtr) {297 UnrankedMemRefType<float> actualDesc = {rank, actualPtr};298 UnrankedMemRefType<float> expectedDesc = {rank, expectedPtr};299 return _mlir_ciface_verifyMemRefF32(&actualDesc, &expectedDesc);300}301 302extern "C" int64_t verifyMemRefF64(int64_t rank, void *actualPtr,303 void *expectedPtr) {304 UnrankedMemRefType<double> actualDesc = {rank, actualPtr};305 UnrankedMemRefType<double> expectedDesc = {rank, expectedPtr};306 return _mlir_ciface_verifyMemRefF64(&actualDesc, &expectedDesc);307}308 309extern "C" int64_t verifyMemRefInd(int64_t rank, void *actualPtr,310 void *expectedPtr) {311 UnrankedMemRefType<impl::index_type> actualDesc = {rank, actualPtr};312 UnrankedMemRefType<impl::index_type> expectedDesc = {rank, expectedPtr};313 return _mlir_ciface_verifyMemRefInd(&actualDesc, &expectedDesc);314}315 316extern "C" int64_t verifyMemRefC32(int64_t rank, void *actualPtr,317 void *expectedPtr) {318 UnrankedMemRefType<impl::complex32> actualDesc = {rank, actualPtr};319 UnrankedMemRefType<impl::complex32> expectedDesc = {rank, expectedPtr};320 return _mlir_ciface_verifyMemRefC32(&actualDesc, &expectedDesc);321}322 323extern "C" int64_t verifyMemRefC64(int64_t rank, void *actualPtr,324 void *expectedPtr) {325 UnrankedMemRefType<impl::complex64> actualDesc = {rank, actualPtr};326 UnrankedMemRefType<impl::complex64> expectedDesc = {rank, expectedPtr};327 return _mlir_ciface_verifyMemRefC64(&actualDesc, &expectedDesc);328}329 330// NOLINTEND(*-identifier-naming)331