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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements basic functions to debug structured MLIR types at
10 // runtime. Entities in this file may not be compatible with targets without a
11 // C++ runtime. These may be progressively migrated to CRunnerUtils.cpp over
12 // time.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "mlir/ExecutionEngine/RunnerUtils.h"
17 #include <chrono>
18 
19 extern "C" void
20 _mlir_ciface_print_memref_shape_i8(UnrankedMemRefType<int8_t> *M) {
21   std::cout << "Unranked Memref ";
22   printMemRefMetaData(std::cout, DynamicMemRefType<int8_t>(*M));
23   std::cout << "\n";
24 }
25 
26 extern "C" void
27 _mlir_ciface_print_memref_shape_i32(UnrankedMemRefType<int32_t> *M) {
28   std::cout << "Unranked Memref ";
29   printMemRefMetaData(std::cout, DynamicMemRefType<int32_t>(*M));
30   std::cout << "\n";
31 }
32 
33 extern "C" void
34 _mlir_ciface_print_memref_shape_i64(UnrankedMemRefType<int64_t> *M) {
35   std::cout << "Unranked Memref ";
36   printMemRefMetaData(std::cout, DynamicMemRefType<int64_t>(*M));
37   std::cout << "\n";
38 }
39 
40 extern "C" void
41 _mlir_ciface_print_memref_shape_f32(UnrankedMemRefType<float> *M) {
42   std::cout << "Unranked Memref ";
43   printMemRefMetaData(std::cout, DynamicMemRefType<float>(*M));
44   std::cout << "\n";
45 }
46 
47 extern "C" void
48 _mlir_ciface_print_memref_shape_f64(UnrankedMemRefType<double> *M) {
49   std::cout << "Unranked Memref ";
50   printMemRefMetaData(std::cout, DynamicMemRefType<double>(*M));
51   std::cout << "\n";
52 }
53 
54 extern "C" void _mlir_ciface_print_memref_vector_4x4xf32(
55     StridedMemRefType<Vector2D<4, 4, float>, 2> *M) {
56   impl::printMemRef(*M);
57 }
58 
59 extern "C" void _mlir_ciface_print_memref_i8(UnrankedMemRefType<int8_t> *M) {
60   impl::printMemRef(*M);
61 }
62 
63 extern "C" void _mlir_ciface_print_memref_i32(UnrankedMemRefType<int32_t> *M) {
64   impl::printMemRef(*M);
65 }
66 
67 extern "C" void _mlir_ciface_print_memref_i64(UnrankedMemRefType<int64_t> *M) {
68   impl::printMemRef(*M);
69 }
70 
71 extern "C" void _mlir_ciface_print_memref_f32(UnrankedMemRefType<float> *M) {
72   impl::printMemRef(*M);
73 }
74 
75 extern "C" void _mlir_ciface_print_memref_f64(UnrankedMemRefType<double> *M) {
76   impl::printMemRef(*M);
77 }
78 
79 extern "C" int64_t _mlir_ciface_nano_time() {
80   auto now = std::chrono::high_resolution_clock::now();
81   auto duration = now.time_since_epoch();
82   auto nanoseconds =
83       std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
84   return nanoseconds.count();
85 }
86 
87 extern "C" void print_memref_i32(int64_t rank, void *ptr) {
88   UnrankedMemRefType<int32_t> descriptor = {rank, ptr};
89   _mlir_ciface_print_memref_i32(&descriptor);
90 }
91 
92 extern "C" void print_memref_i64(int64_t rank, void *ptr) {
93   UnrankedMemRefType<int64_t> descriptor = {rank, ptr};
94   _mlir_ciface_print_memref_i64(&descriptor);
95 }
96 
97 extern "C" void print_memref_f32(int64_t rank, void *ptr) {
98   UnrankedMemRefType<float> descriptor = {rank, ptr};
99   _mlir_ciface_print_memref_f32(&descriptor);
100 }
101 
102 extern "C" void print_memref_f64(int64_t rank, void *ptr) {
103   UnrankedMemRefType<double> descriptor = {rank, ptr};
104   _mlir_ciface_print_memref_f64(&descriptor);
105 }
106 
107 extern "C" void
108 _mlir_ciface_print_memref_0d_f32(StridedMemRefType<float, 0> *M) {
109   impl::printMemRef(*M);
110 }
111 extern "C" void
112 _mlir_ciface_print_memref_1d_f32(StridedMemRefType<float, 1> *M) {
113   impl::printMemRef(*M);
114 }
115 extern "C" void
116 _mlir_ciface_print_memref_2d_f32(StridedMemRefType<float, 2> *M) {
117   impl::printMemRef(*M);
118 }
119 extern "C" void
120 _mlir_ciface_print_memref_3d_f32(StridedMemRefType<float, 3> *M) {
121   impl::printMemRef(*M);
122 }
123 extern "C" void
124 _mlir_ciface_print_memref_4d_f32(StridedMemRefType<float, 4> *M) {
125   impl::printMemRef(*M);
126 }
127 
128 extern "C" int64_t
129 _mlir_ciface_verifyMemRefI32(UnrankedMemRefType<int32_t> *actual,
130                              UnrankedMemRefType<int32_t> *expected) {
131   return impl::verifyMemRef(*actual, *expected);
132 }
133 
134 extern "C" int64_t
135 _mlir_ciface_verifyMemRefF32(UnrankedMemRefType<float> *actual,
136                              UnrankedMemRefType<float> *expected) {
137   return impl::verifyMemRef(*actual, *expected);
138 }
139 
140 extern "C" int64_t
141 _mlir_ciface_verifyMemRefF64(UnrankedMemRefType<double> *actual,
142                              UnrankedMemRefType<double> *expected) {
143   return impl::verifyMemRef(*actual, *expected);
144 }
145 
146 extern "C" int64_t verifyMemRefI32(int64_t rank, void *actualPtr,
147                                    void *expectedPtr) {
148   UnrankedMemRefType<int32_t> actualDesc = {rank, actualPtr};
149   UnrankedMemRefType<int32_t> expectedDesc = {rank, expectedPtr};
150   return _mlir_ciface_verifyMemRefI32(&actualDesc, &expectedDesc);
151 }
152 
153 extern "C" int64_t verifyMemRefF32(int64_t rank, void *actualPtr,
154                                    void *expectedPtr) {
155   UnrankedMemRefType<float> actualDesc = {rank, actualPtr};
156   UnrankedMemRefType<float> expectedDesc = {rank, expectedPtr};
157   return _mlir_ciface_verifyMemRefF32(&actualDesc, &expectedDesc);
158 }
159 
160 extern "C" int64_t verifyMemRefF64(int64_t rank, void *actualPtr,
161                                    void *expectedPtr) {
162   UnrankedMemRefType<double> actualDesc = {rank, actualPtr};
163   UnrankedMemRefType<double> expectedDesc = {rank, expectedPtr};
164   return _mlir_ciface_verifyMemRefF64(&actualDesc, &expectedDesc);
165 }
166