print.h (2100B)
1 // Copyright 2022 Google LLC 2 // SPDX-License-Identifier: Apache-2.0 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 #ifndef HWY_PRINT_H_ 17 #define HWY_PRINT_H_ 18 19 // Helpers for printing vector lanes. 20 21 #include <stddef.h> 22 #include <stdio.h> 23 24 #include "hwy/base.h" 25 #include "hwy/highway_export.h" 26 27 namespace hwy { 28 29 namespace detail { 30 31 // For implementing value comparisons etc. as type-erased functions to reduce 32 // template bloat. 33 struct TypeInfo { 34 size_t sizeof_t; 35 bool is_float; 36 bool is_signed; 37 bool is_bf16; 38 }; 39 40 template <typename T> 41 HWY_INLINE TypeInfo MakeTypeInfo() { 42 TypeInfo info; 43 info.sizeof_t = sizeof(T); 44 info.is_float = IsFloat<T>(); 45 info.is_signed = IsSigned<T>(); 46 info.is_bf16 = IsSame<T, bfloat16_t>(); 47 return info; 48 } 49 50 HWY_DLLEXPORT void TypeName(const TypeInfo& info, size_t N, char* string100); 51 HWY_DLLEXPORT void ToString(const TypeInfo& info, const void* ptr, 52 char* string100); 53 54 HWY_DLLEXPORT void PrintArray(const TypeInfo& info, const char* caption, 55 const void* array_void, size_t N, 56 size_t lane_u = 0, size_t max_lanes = 7); 57 58 } // namespace detail 59 60 template <typename T> 61 HWY_NOINLINE void PrintValue(T value) { 62 char str[100]; 63 detail::ToString(hwy::detail::MakeTypeInfo<T>(), &value, str); 64 fprintf(stderr, "%s,", str); 65 } 66 67 template <typename T> 68 HWY_NOINLINE void PrintArray(const T* value, size_t count) { 69 detail::PrintArray(hwy::detail::MakeTypeInfo<T>(), "", value, count, 0, 70 count); 71 } 72 73 } // namespace hwy 74 75 #endif // HWY_PRINT_H_