utils.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #pragma once
  15. #include <cstdio>
  16. #include <stdlib.h>
  17. #include <fstream>
  18. #include <iostream>
  19. #include <numeric>
  20. #include <sstream>
  21. #include <string>
  22. #include <type_traits>
  23. #include <vector>
  24. #if defined(_WIN32)
  25. #ifdef ULTRAINFER_LIB
  26. #define ULTRAINFER_DECL __declspec(dllexport)
  27. #else
  28. #define ULTRAINFER_DECL __declspec(dllimport)
  29. #endif // ULTRAINFER_LIB
  30. #else
  31. #define ULTRAINFER_DECL __attribute__((visibility("default")))
  32. #endif // _WIN32
  33. namespace ultra_infer {
  34. class ULTRAINFER_DECL FDLogger {
  35. public:
  36. static bool enable_info;
  37. static bool enable_warning;
  38. FDLogger() {
  39. line_ = "";
  40. prefix_ = "[UltraInfer]";
  41. verbose_ = true;
  42. }
  43. explicit FDLogger(bool verbose, const std::string &prefix = "[UltraInfer]");
  44. template <typename T> FDLogger &operator<<(const T &val) {
  45. if (!verbose_) {
  46. return *this;
  47. }
  48. std::stringstream ss;
  49. ss << val;
  50. line_ += ss.str();
  51. return *this;
  52. }
  53. FDLogger &operator<<(std::ostream &(*os)(std::ostream &));
  54. ~FDLogger() {
  55. if (verbose_ && line_ != "") {
  56. std::cout << line_ << std::endl;
  57. }
  58. }
  59. private:
  60. std::string line_;
  61. std::string prefix_;
  62. bool verbose_ = true;
  63. };
  64. ULTRAINFER_DECL bool ReadBinaryFromFile(const std::string &file,
  65. std::string *contents);
  66. #ifndef __REL_FILE__
  67. #define __REL_FILE__ __FILE__
  68. #endif
  69. #define FDERROR \
  70. FDLogger(true, "[ERROR]") \
  71. << __REL_FILE__ << "(" << __LINE__ << ")::" << __FUNCTION__ << "\t"
  72. #define FDWARNING \
  73. FDLogger(ultra_infer::FDLogger::enable_warning, "[WARNING]") \
  74. << __REL_FILE__ << "(" << __LINE__ << ")::" << __FUNCTION__ << "\t"
  75. #define FDINFO \
  76. FDLogger(ultra_infer::FDLogger::enable_info, "[INFO]") \
  77. << __REL_FILE__ << "(" << __LINE__ << ")::" << __FUNCTION__ << "\t"
  78. #define FDASSERT(condition, format, ...) \
  79. if (!(condition)) { \
  80. int n = std::snprintf(nullptr, 0, format, ##__VA_ARGS__); \
  81. std::vector<char> buffer(n + 1); \
  82. std::snprintf(buffer.data(), n + 1, format, ##__VA_ARGS__); \
  83. FDERROR << buffer.data() << std::endl; \
  84. std::abort(); \
  85. }
  86. ///////// Basic Marco ///////////
  87. #define FD_PRIVATE_CASE_TYPE_USING_HINT(NAME, enum_type, type, HINT, ...) \
  88. case enum_type: { \
  89. using HINT = type; \
  90. __VA_ARGS__(); \
  91. break; \
  92. }
  93. #define FD_PRIVATE_CASE_TYPE(NAME, enum_type, type, ...) \
  94. FD_PRIVATE_CASE_TYPE_USING_HINT(NAME, enum_type, type, data_t, __VA_ARGS__)
  95. // Visit different data type to match the corresponding function of FDTensor
  96. #define FD_VISIT_ALL_TYPES(TYPE, NAME, ...) \
  97. [&] { \
  98. const auto &__dtype__ = TYPE; \
  99. switch (__dtype__) { \
  100. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::UINT8, uint8_t, \
  101. __VA_ARGS__) \
  102. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::BOOL, bool, \
  103. __VA_ARGS__) \
  104. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT32, int32_t, \
  105. __VA_ARGS__) \
  106. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT64, int64_t, \
  107. __VA_ARGS__) \
  108. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP32, float, \
  109. __VA_ARGS__) \
  110. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP64, double, \
  111. __VA_ARGS__) \
  112. default: \
  113. FDASSERT(false, \
  114. "Invalid enum data type. Expect to accept data " \
  115. "type BOOL, INT32, " \
  116. "INT64, FP32, FP64, but receive type %s.", \
  117. Str(__dtype__).c_str()); \
  118. } \
  119. }()
  120. #define FD_VISIT_INT_FLOAT_TYPES(TYPE, NAME, ...) \
  121. [&] { \
  122. const auto &__dtype__ = TYPE; \
  123. switch (__dtype__) { \
  124. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT32, int32_t, \
  125. __VA_ARGS__) \
  126. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT64, int64_t, \
  127. __VA_ARGS__) \
  128. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP32, float, \
  129. __VA_ARGS__) \
  130. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP64, double, \
  131. __VA_ARGS__) \
  132. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::UINT8, uint8_t, \
  133. __VA_ARGS__) \
  134. default: \
  135. FDASSERT(false, \
  136. "Invalid enum data type. Expect to accept data type INT32, " \
  137. "INT64, FP32, FP64, UINT8 but receive type %s.", \
  138. Str(__dtype__).c_str()); \
  139. } \
  140. }()
  141. #define FD_VISIT_FLOAT_TYPES(TYPE, NAME, ...) \
  142. [&] { \
  143. const auto &__dtype__ = TYPE; \
  144. switch (__dtype__) { \
  145. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP32, float, \
  146. __VA_ARGS__) \
  147. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::FP64, double, \
  148. __VA_ARGS__) \
  149. default: \
  150. FDASSERT(false, \
  151. "Invalid enum data type. Expect to accept data type FP32, " \
  152. "FP64, but receive type %s.", \
  153. Str(__dtype__).c_str()); \
  154. } \
  155. }()
  156. #define FD_VISIT_INT_TYPES(TYPE, NAME, ...) \
  157. [&] { \
  158. const auto &__dtype__ = TYPE; \
  159. switch (__dtype__) { \
  160. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT32, int32_t, \
  161. __VA_ARGS__) \
  162. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::INT64, int64_t, \
  163. __VA_ARGS__) \
  164. FD_PRIVATE_CASE_TYPE(NAME, ::ultra_infer::FDDataType::UINT8, uint8_t, \
  165. __VA_ARGS__) \
  166. default: \
  167. FDASSERT(false, \
  168. "Invalid enum data type. Expect to accept data type INT32, " \
  169. "INT64, UINT8 but receive type %s.", \
  170. Str(__dtype__).c_str()); \
  171. } \
  172. }()
  173. ULTRAINFER_DECL std::vector<int64_t>
  174. GetStride(const std::vector<int64_t> &dims);
  175. template <typename T> std::string Str(const std::vector<T> &shape) {
  176. std::ostringstream oss;
  177. oss << "[ " << shape[0];
  178. for (size_t i = 1; i < shape.size(); ++i) {
  179. oss << " ," << shape[i];
  180. }
  181. oss << " ]";
  182. return oss.str();
  183. }
  184. /// Set behaviour of logging while using UltraInfer
  185. ULTRAINFER_DECL void SetLogger(bool enable_info = true,
  186. bool enable_warning = true);
  187. template <typename T>
  188. void CalculateStatisInfo(const void *src_ptr, int size, double *mean,
  189. double *max, double *min) {
  190. const T *ptr = static_cast<const T *>(src_ptr);
  191. *mean = static_cast<double>(0);
  192. *max = static_cast<double>(-99999999);
  193. *min = static_cast<double>(99999999);
  194. for (int i = 0; i < size; ++i) {
  195. if (*(ptr + i) > *max) {
  196. *max = *(ptr + i);
  197. }
  198. if (*(ptr + i) < *min) {
  199. *min = *(ptr + i);
  200. }
  201. *mean += *(ptr + i);
  202. }
  203. *mean = *mean / size;
  204. }
  205. } // namespace ultra_infer