Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/marian-nmt/FBGEMM.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJongsoo Park <jongsoo@fb.com>2019-02-20 19:50:37 +0300
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>2019-02-20 19:59:51 +0300
commit9ebc998c2bf0da81ab7afa1478df395d79429cf8 (patch)
treec664731e03c05f239f28bc3eb6a8010b65696f93 /test
parenta5f1f5308130f21b376f5368e87eb74b071493fa (diff)
optimize PackAWithIm2Col for symmetric b quant
Summary: Add additional option b_symmetric and skip row offset computation if it's true Reviewed By: jianyuh Differential Revision: D14119128 fbshipit-source-id: fa079347562b7f75727b3a1414e9bdda3f9c65dd
Diffstat (limited to 'test')
-rw-r--r--test/Im2ColFusedRequantizeTest.cc67
1 files changed, 44 insertions, 23 deletions
diff --git a/test/Im2ColFusedRequantizeTest.cc b/test/Im2ColFusedRequantizeTest.cc
index feae002..1dfc756 100644
--- a/test/Im2ColFusedRequantizeTest.cc
+++ b/test/Im2ColFusedRequantizeTest.cc
@@ -30,13 +30,15 @@ vector<QuantizationGranularity> qGranularityVals{
namespace {
class fbgemmIm2colTest
- : public testing::TestWithParam<QuantizationGranularity> {};
+ : public testing::TestWithParam<tuple<QuantizationGranularity, bool>> {};
}; // namespace
INSTANTIATE_TEST_CASE_P(
InstantiationName,
fbgemmIm2colTest,
- ::testing::ValuesIn(qGranularityVals));
+ ::testing::Combine(
+ ::testing::ValuesIn(qGranularityVals),
+ ::testing::Bool()));
// From Faster-RCNN with ShuffleNet
static vector<conv_param_t<>> shapes = {
@@ -52,7 +54,7 @@ static vector<conv_param_t<>> shapes = {
};
template <typename ACC_T, QuantizationGranularity Q_GRAN>
-static void Im2colTest() {
+static void Im2colTest(bool b_symmetric) {
for (auto conv_p : shapes) {
for (int groups : {1, 4}) {
if (conv_p.IC % groups != 0 || conv_p.OC % groups != 0) {
@@ -89,6 +91,9 @@ static void Im2colTest() {
randFill<int8_t>(Bint8, -4, 4);
randFill(Bint8_zero_point, -3, -1);
}
+ if (b_symmetric) {
+ randFill(Bint8_zero_point, 0, 0);
+ }
aligned_vector<float> C_multiplier(Bint8_zero_point.size());
randFill(C_multiplier, 0.001234f / 2, 0.001234f * 3 / 2);
@@ -169,7 +174,8 @@ static void Im2colTest() {
Aint8.data(),
nullptr,
Aint8_zero_point,
- row_offset_buf.data());
+ row_offset_buf.data(),
+ b_symmetric);
DoNothing<> doNothingObj{};
ReQuantizeOutput<false, Q_GRAN> outputProcObj(
@@ -223,24 +229,28 @@ static void Im2colTest() {
}
TEST_P(fbgemmIm2colTest, Acc32Test) {
- QuantizationGranularity q_granularity = GetParam();
+ QuantizationGranularity q_granularity;
+ bool b_symmetric;
+ tie(q_granularity, b_symmetric) = GetParam();
if (q_granularity == QuantizationGranularity::TENSOR) {
- Im2colTest<int32_t, QuantizationGranularity::TENSOR>();
+ Im2colTest<int32_t, QuantizationGranularity::TENSOR>(b_symmetric);
} else if (q_granularity == QuantizationGranularity::GROUP) {
- Im2colTest<int32_t, QuantizationGranularity::GROUP>();
+ Im2colTest<int32_t, QuantizationGranularity::GROUP>(b_symmetric);
} else {
- Im2colTest<int32_t, QuantizationGranularity::OUT_CHANNEL>();
+ Im2colTest<int32_t, QuantizationGranularity::OUT_CHANNEL>(b_symmetric);
}
}
TEST_P(fbgemmIm2colTest, Acc16Test) {
- QuantizationGranularity q_granularity = GetParam();
+ QuantizationGranularity q_granularity;
+ bool b_symmetric;
+ tie(q_granularity, b_symmetric) = GetParam();
if (q_granularity == QuantizationGranularity::TENSOR) {
- Im2colTest<int16_t, QuantizationGranularity::TENSOR>();
+ Im2colTest<int16_t, QuantizationGranularity::TENSOR>(b_symmetric);
} else if (q_granularity == QuantizationGranularity::GROUP) {
- Im2colTest<int16_t, QuantizationGranularity::GROUP>();
+ Im2colTest<int16_t, QuantizationGranularity::GROUP>(b_symmetric);
} else {
- Im2colTest<int16_t, QuantizationGranularity::OUT_CHANNEL>();
+ Im2colTest<int16_t, QuantizationGranularity::OUT_CHANNEL>(b_symmetric);
}
}
@@ -453,7 +463,10 @@ void SConvTest() {
}
TEST_P(fbgemmIm2colTest, SConvTest) {
- QuantizationGranularity q_granularity = GetParam();
+ QuantizationGranularity q_granularity;
+ bool b_symmetric;
+ tie(q_granularity, b_symmetric) = GetParam();
+ // b_symmetric ignored for now
if (q_granularity == QuantizationGranularity::TENSOR) {
SConvTest<QuantizationGranularity::TENSOR>();
} else if (q_granularity == QuantizationGranularity::GROUP) {
@@ -539,7 +552,7 @@ static vector<conv_param_t<3>> shapes_3d = {
};
template <typename ACC_T, QuantizationGranularity Q_GRAN>
-static void Im2col3DTest() {
+static void Im2col3DTest(bool b_symmetric) {
for (auto conv_p : shapes_3d) {
for (int groups : {1, 4}) {
if (conv_p.IC % groups != 0 || conv_p.OC % groups != 0) {
@@ -578,6 +591,9 @@ static void Im2col3DTest() {
randFill<int8_t>(Bint8, -4, 4);
randFill(Bint8_zero_point, -3, -1);
}
+ if (b_symmetric) {
+ randFill(Bint8_zero_point, 0, 0);
+ }
aligned_vector<float> C_multiplier(Bint8_zero_point.size());
randFill(C_multiplier, 0.001234f / 2, 0.001234f * 3 / 2);
@@ -659,7 +675,8 @@ static void Im2col3DTest() {
Aint8.data(),
nullptr,
Aint8_zero_point,
- row_offset_buf.data());
+ row_offset_buf.data(),
+ b_symmetric);
DoNothing<> doNothingObj{};
ReQuantizeOutput<false, Q_GRAN> outputProcObj(
@@ -719,23 +736,27 @@ static void Im2col3DTest() {
}
TEST_P(fbgemmIm2colTest, 3DAcc32Test) {
- QuantizationGranularity q_granularity = GetParam();
+ QuantizationGranularity q_granularity;
+ bool b_symmetric;
+ tie(q_granularity, b_symmetric) = GetParam();
if (q_granularity == QuantizationGranularity::TENSOR) {
- Im2col3DTest<int32_t, QuantizationGranularity::TENSOR>();
+ Im2col3DTest<int32_t, QuantizationGranularity::TENSOR>(b_symmetric);
} else if (q_granularity == QuantizationGranularity::GROUP) {
- Im2col3DTest<int32_t, QuantizationGranularity::GROUP>();
+ Im2col3DTest<int32_t, QuantizationGranularity::GROUP>(b_symmetric);
} else {
- Im2col3DTest<int32_t, QuantizationGranularity::OUT_CHANNEL>();
+ Im2col3DTest<int32_t, QuantizationGranularity::OUT_CHANNEL>(b_symmetric);
}
}
TEST_P(fbgemmIm2colTest, 3DAcc16Test) {
- QuantizationGranularity q_granularity = GetParam();
+ QuantizationGranularity q_granularity;
+ bool b_symmetric;
+ tie(q_granularity, b_symmetric) = GetParam();
if (q_granularity == QuantizationGranularity::TENSOR) {
- Im2col3DTest<int16_t, QuantizationGranularity::TENSOR>();
+ Im2col3DTest<int16_t, QuantizationGranularity::TENSOR>(b_symmetric);
} else if (q_granularity == QuantizationGranularity::GROUP) {
- Im2col3DTest<int16_t, QuantizationGranularity::GROUP>();
+ Im2col3DTest<int16_t, QuantizationGranularity::GROUP>(b_symmetric);
} else {
- Im2col3DTest<int16_t, QuantizationGranularity::OUT_CHANNEL>();
+ Im2col3DTest<int16_t, QuantizationGranularity::OUT_CHANNEL>(b_symmetric);
}
}