// Copyright 2022 Google LLC // SPDX-License-Identifier: Apache-2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "hwy/aligned_allocator.h" #include "hwy/base.h" #include "hwy/nanobenchmark.h" // clang-format off #undef HWY_TARGET_INCLUDE #define HWY_TARGET_INCLUDE "hwy/contrib/bit_pack/bit_pack_test.cc" // NOLINT #include "hwy/foreach_target.h" // IWYU pragma: keep #include "hwy/contrib/bit_pack/bit_pack-inl.h" #include "hwy/tests/test_util-inl.h" // clang-format on #ifndef HWY_BIT_PACK_BENCHMARK #define HWY_BIT_PACK_BENCHMARK 0 #endif HWY_BEFORE_NAMESPACE(); namespace hwy { // Used to prevent running benchmark (slow) for partial vectors and targets // except the best available. Global, not per-target, hence must be outside // HWY_NAMESPACE. Declare first because HWY_ONCE is only true after some code // has been re-included. extern size_t last_bits; extern uint64_t best_target; #if HWY_ONCE size_t last_bits = 0; uint64_t best_target = ~0ull; #endif namespace HWY_NAMESPACE { template T Random(RandomState& rng) { return static_cast(Random32(&rng) & kBits); } template class Checker { public: explicit Checker(size_t num) { raw_.reserve(num); } void NotifyRaw(T raw) { raw_.push_back(raw); } void NotifyRawOutput(size_t bits, T raw) { if (raw_[num_verified_] != raw) { HWY_ABORT("%zu bits: pos %zu of %zu, expected %.0f actual %.0f\n", bits, num_verified_, raw_.size(), static_cast(raw_[num_verified_]), static_cast(raw)); } ++num_verified_; } private: std::vector raw_; size_t num_verified_ = 0; }; template