Initial open-source release
PiperOrigin-RevId: 271685289
diff --git a/test/rmax-microkernel-tester.h b/test/rmax-microkernel-tester.h
new file mode 100644
index 0000000..729f2eb
--- /dev/null
+++ b/test/rmax-microkernel-tester.h
@@ -0,0 +1,96 @@
+// Copyright (c) Facebook, Inc. and its affiliates.
+// All rights reserved.
+//
+// Copyright 2019 Google LLC
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree.
+
+#pragma once
+
+#include <gtest/gtest.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <cstdlib>
+#include <functional>
+#include <random>
+#include <vector>
+
+#include <xnnpack/params.h>
+
+
+class RMaxMicrokernelTester {
+ public:
+ inline RMaxMicrokernelTester& n(size_t n) {
+ assert(n != 0);
+ this->n_ = n;
+ return *this;
+ }
+
+ inline size_t n() const {
+ return this->n_;
+ }
+
+ inline RMaxMicrokernelTester& iterations(size_t iterations) {
+ this->iterations_ = iterations;
+ return *this;
+ }
+
+ inline size_t iterations() const {
+ return this->iterations_;
+ }
+
+ void Test(xnn_u8_rmax_ukernel_function rmax) const {
+ std::random_device random_device;
+ auto rng = std::mt19937(random_device());
+ auto u8rng = std::bind(std::uniform_int_distribution<uint8_t>(), rng);
+
+ std::vector<uint8_t> x(n());
+ for (size_t iteration = 0; iteration < iterations(); iteration++) {
+ std::generate(x.begin(), x.end(), std::ref(u8rng));
+
+ // Compute reference results.
+ uint8_t y_ref = 0;
+ for (size_t i = 0; i < n(); i++) {
+ y_ref = std::max(y_ref, x[i]);
+ }
+
+ // Call optimized micro-kernel.
+ uint8_t y = u8rng();
+ rmax(n() * sizeof(uint8_t), x.data(), &y);
+
+ // Verify results.
+ ASSERT_EQ(y_ref, y) << "n = " << n();
+ }
+ }
+
+ void Test(xnn_f32_rmax_ukernel_function rmax) const {
+ std::random_device random_device;
+ auto rng = std::mt19937(random_device());
+ auto f32rng = std::bind(std::uniform_real_distribution<float>(), rng);
+
+ std::vector<float> x(n());
+ for (size_t iteration = 0; iteration < iterations(); iteration++) {
+ std::generate(x.begin(), x.end(), std::ref(f32rng));
+
+ // Compute reference results.
+ float y_ref = 0;
+ for (size_t i = 0; i < n(); i++) {
+ y_ref = std::max(y_ref, x[i]);
+ }
+
+ // Call optimized micro-kernel.
+ float y = std::nanf("");
+ rmax(n() * sizeof(float), x.data(), &y);
+
+ // Verify results.
+ ASSERT_EQ(y_ref, y) << "n = " << n();
+ }
+ }
+
+ private:
+ size_t n_{1};
+ size_t iterations_{15};
+};