File: fixed_divisor_test.cc

package info (click to toggle)
pytorch 1.13.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 139,252 kB
  • sloc: cpp: 1,100,274; python: 706,454; ansic: 83,052; asm: 7,618; java: 3,273; sh: 2,841; javascript: 612; makefile: 323; xml: 269; ruby: 185; yacc: 144; objc: 68; lex: 44
file content (80 lines) | stat: -rw-r--r-- 1,991 bytes parent folder | download
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