1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include "caffe2/utils/fixed_divisor.h"
#include <gtest/gtest.h>
#include <random>
namespace caffe2 {
namespace {
void CompareDivMod(int32_t v, int32_t divisor) {
auto fixed = FixedDivisor<int32_t>(divisor);
int native_q = v / divisor;
int native_r = v % divisor;
int fixed_q = fixed.Div(v);
int fixed_r = fixed.Mod(v);
#if !defined(USE_ROCM)
EXPECT_EQ(native_q, fixed_q)
<< v << " / " << divisor << " magic " << fixed.magic() << " shift "
<< fixed.shift() << " quot " << fixed_q << " " << native_q;
EXPECT_EQ(native_r, fixed_r)
<< v << " / " << divisor << " magic " << fixed.magic() << " shift "
<< fixed.shift() << " rem " << fixed_r << " " << native_r;
#endif
}
} // namespace
TEST(FixedDivisorTest, FixedDivisorInt32Test) {
constexpr int32_t kMax = std::numeric_limits<int32_t>::max();
// divide by 1
CompareDivMod(kMax, 1);
CompareDivMod(0, 1);
CompareDivMod(1, 1);
// divide by max
CompareDivMod(kMax, kMax);
CompareDivMod(0, kMax);
CompareDivMod(1, kMax);
// divide by random positive values
std::random_device rd;
std::uniform_int_distribution<int32_t> v_dist(0, kMax);
std::uniform_int_distribution<int32_t> q_dist(1, kMax);
std::uniform_int_distribution<int32_t> v_small_dist(0, 1000);
std::uniform_int_distribution<int32_t> q_small_dist(1, 1000);
for (int i = 0; i < 10000; ++i) {
auto q = q_dist(rd);
auto v = v_dist(rd);
auto q_small = q_small_dist(rd);
auto v_small = v_small_dist(rd);
// random value
CompareDivMod(v_small, q_small);
CompareDivMod(v_small, q);
CompareDivMod(v, q_small);
CompareDivMod(v, q);
// special values
CompareDivMod(kMax, q_small);
CompareDivMod(0, q_small);
CompareDivMod(1, q_small);
CompareDivMod(kMax, q);
CompareDivMod(0, q);
CompareDivMod(1, q);
CompareDivMod(v_small, 1);
CompareDivMod(v_small, kMax);
CompareDivMod(v, 1);
CompareDivMod(v, kMax);
}
}
} // namespace caffe2
|