• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2020 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <vector>
18 #include "common/common_test.h"
19 #include "common/trans.h"
20 #include "utils/utils.h"
21 
22 using namespace std;
23 namespace mindspore {
24 namespace trans {
25 class FormatTransTest : public UT::Common {
26  public:
27   FormatTransTest() = default;
SetUp()28   void SetUp() override {}
TearDown()29   void TearDown() override {}
30 };
31 
TEST_F(FormatTransTest,nchw_to_hwcn)32 TEST_F(FormatTransTest, nchw_to_hwcn) {
33   uint16_t data[2 * 2 * 2 * 2] = {12581, 14220, 14937, 14302, 15004, 14951, 14694, 14564,
34                                   14069, 14554, 10507, 14787, 13016, 15263, 14872, 10838};
35   uint16_t res[2 * 2 * 2 * 2] = {12581, 14069, 15004, 13016, 14220, 14554, 14951, 15263,
36                                  14937, 10507, 14694, 14872, 14302, 14787, 14564, 10838};
37   size_t device_size = 32;
38   auto trans_tmp = std::vector<uint8_t>(device_size);
39   FormatArgs format_args{data,         device_size,  kOpFormat_NCHW,    kOpFormat_HWCN,
40                          {2, 2, 2, 2}, {2, 2, 2, 2}, kNumberTypeFloat16};
41   EXPECT_EQ(trans::TransFormat(format_args, trans_tmp.data()), true);
42   for (size_t i = 0; i < sizeof(res) / sizeof(res[0]); i++) {
43     EXPECT_EQ((reinterpret_cast<uint16_t *>(trans_tmp.data()))[i], res[i]);
44   }
45 }
46 
TEST_F(FormatTransTest,hwcn_to_nchw)47 TEST_F(FormatTransTest, hwcn_to_nchw) {
48   uint16_t data[2 * 2 * 2 * 2] = {12581, 14069, 15004, 13016, 14220, 14554, 14951, 15263,
49                                   14937, 10507, 14694, 14872, 14302, 14787, 14564, 10838};
50 
51   uint16_t res[2 * 2 * 2 * 2] = {12581, 14220, 14937, 14302, 15004, 14951, 14694, 14564,
52                                  14069, 14554, 10507, 14787, 13016, 15263, 14872, 10838};
53 
54   size_t device_size = 32;
55   auto trans_tmp = std::vector<uint8_t>(device_size);
56   FormatArgs format_args{data,         device_size,  kOpFormat_NCHW,    kOpFormat_HWCN,
57                          {2, 2, 2, 2}, {2, 2, 2, 2}, kNumberTypeFloat16};
58   EXPECT_EQ(trans::TransFormatFromDeviceToHost(format_args, trans_tmp.data()), true);
59   for (size_t i = 0; i < sizeof(res) / sizeof(res[0]); i++) {
60     EXPECT_EQ((reinterpret_cast<uint16_t *>(trans_tmp.data()))[i], res[i]);
61   }
62 }
63 
TEST_F(FormatTransTest,nchw_to_nhwc)64 TEST_F(FormatTransTest, nchw_to_nhwc) {
65   uint16_t data[2 * 2 * 2 * 2] = {11750, 13778, 15007, 15321, 15163, 13446, 15063, 14467,
66                                   15056, 13284, 15219, 14797, 12684, 14288, 14855, 14799};
67   uint16_t res[2 * 2 * 2 * 2] = {11750, 15163, 13778, 13446, 15007, 15063, 15321, 14467,
68                                  15056, 12684, 13284, 14288, 15219, 14855, 14797, 14799};
69   size_t device_size = 32;
70   auto trans_tmp = std::vector<uint8_t>(device_size);
71   FormatArgs format_args{data,         device_size,  kOpFormat_NCHW,    kOpFormat_NHWC,
72                          {2, 2, 2, 2}, {2, 2, 2, 2}, kNumberTypeFloat16};
73   EXPECT_EQ(trans::TransFormat(format_args, trans_tmp.data()), true);
74   for (size_t i = 0; i < sizeof(res) / sizeof(res[0]); i++) {
75     EXPECT_EQ((reinterpret_cast<uint16_t *>(trans_tmp.data()))[i], res[i]);
76   }
77 }
78 
TEST_F(FormatTransTest,nhwc_to_nchw)79 TEST_F(FormatTransTest, nhwc_to_nchw) {
80   uint16_t data[2 * 2 * 2 * 2] = {11750, 15163, 13778, 13446, 15007, 15063, 15321, 14467,
81                                   15056, 12684, 13284, 14288, 15219, 14855, 14797, 14799};
82   uint16_t res[2 * 2 * 2 * 2] = {11750, 13778, 15007, 15321, 15163, 13446, 15063, 14467,
83                                  15056, 13284, 15219, 14797, 12684, 14288, 14855, 14799};
84 
85   size_t device_size = 32;
86   auto trans_tmp = std::vector<uint8_t>(device_size);
87   FormatArgs format_args{data,         device_size,  kOpFormat_NCHW,    kOpFormat_NHWC,
88                          {2, 2, 2, 2}, {2, 2, 2, 2}, kNumberTypeFloat16};
89   EXPECT_EQ(trans::TransFormatFromDeviceToHost(format_args, trans_tmp.data()), true);
90   for (size_t i = 0; i < sizeof(res) / sizeof(res[0]); i++) {
91     EXPECT_EQ((reinterpret_cast<uint16_t *>(trans_tmp.data()))[i], res[i]);
92   }
93 }
94 
95 class ShapeTransTest : public UT::Common {
96  public:
97   ShapeTransTest() = default;
SetUp()98   void SetUp() override {}
TearDown()99   void TearDown() override {}
100 };
101 
TEST_F(ShapeTransTest,fraczn_rnn_device_shape)102 TEST_F(ShapeTransTest, fraczn_rnn_device_shape) {
103   std::vector<size_t> host_shape = {43, 120};
104   std::string format = kOpFormat_FRACTAL_ZN_RNN;
105   std::vector<int64_t> input_hidden_size = {13, 30};
106   auto trans_shape = trans::TransShapeToDevice(host_shape, format, 1, input_hidden_size);
107   const std::vector<size_t> expect_shape = {3, 8, 16, 16};
108   EXPECT_EQ(trans_shape.size(), expect_shape.size());
109   for (size_t i = 0; i < expect_shape.size(); i++) {
110     EXPECT_EQ(trans_shape[i], expect_shape[i]);
111   }
112 }
113 
TEST_F(ShapeTransTest,nd_rnn_bias_device_shape)114 TEST_F(ShapeTransTest, nd_rnn_bias_device_shape) {
115   std::vector<size_t> host_shape = {120};
116   std::string format = kOpFormat_ND_RNN_BIAS;
117   std::vector<int64_t> input_hidden_size = {13, 30};
118   auto trans_shape = trans::TransShapeToDevice(host_shape, format, 1, input_hidden_size);
119   std::vector<size_t> expect_shape = {128};
120   EXPECT_EQ(trans_shape.size(), expect_shape.size());
121   for (size_t i = 0; i < expect_shape.size(); i++) {
122     EXPECT_EQ(trans_shape[i], expect_shape[i]);
123   }
124 }
125 
TEST_F(ShapeTransTest,fraczn_rnn_dynamic_device_shape)126 TEST_F(ShapeTransTest, fraczn_rnn_dynamic_device_shape) {
127   std::vector<int64_t> host_shape = {-1, -1};
128   std::string format = kOpFormat_FRACTAL_ZN_RNN;
129   std::vector<int64_t> input_hidden_size = {13, 30};
130   auto trans_shape = trans::TransShapeToDevice(host_shape, format, 1, input_hidden_size);
131   const std::vector<int64_t> expect_shape = {-1, -1, 16, 16};
132   EXPECT_EQ(trans_shape.size(), expect_shape.size());
133   for (size_t i = 0; i < expect_shape.size(); i++) {
134     EXPECT_EQ(trans_shape[i], expect_shape[i]);
135   }
136 }
137 
TEST_F(ShapeTransTest,nd_rnn_bias_dynamic_device_shape)138 TEST_F(ShapeTransTest, nd_rnn_bias_dynamic_device_shape) {
139   std::vector<int64_t> host_shape = {-1};
140   std::string format = kOpFormat_ND_RNN_BIAS;
141   std::vector<int64_t> input_hidden_size = {13, 30};
142   auto trans_shape = trans::TransShapeToDevice(host_shape, format, 1, input_hidden_size);
143   std::vector<int64_t> expect_shape = {-1};
144   EXPECT_EQ(trans_shape.size(), expect_shape.size());
145   for (size_t i = 0; i < expect_shape.size(); i++) {
146     EXPECT_EQ(trans_shape[i], expect_shape[i]);
147   }
148 }
149 }  // namespace trans
150 }  // namespace mindspore
151