#include <ne-data.h>
#include <ne-model.h>
-#include "ne_unittest_utils.h"
+#include <ne_test_utils_gtest.h>
#include <npubinfmt.h>
#include <cstdlib>
/* some layouts are not supported */
converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
- converter->setDataLayout (DATA_LAYOUT_NCHW, DATA_LAYOUT_TRIV2);
+ converter->setDataLayout (DATA_LAYOUT_TRIV, DATA_LAYOUT_TRIV2);
EXPECT_FALSE (converter->checkCapability ());
}
for (int i = 0; i < 4096; i += granularity) {
EXPECT_EQ (
- memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity),
- granularity / 2),
+ memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity), granularity / 2),
0);
EXPECT_EQ (memcmp (src_data + i + (granularity / 2),
- dst_data + (granularity / 2) * (i / granularity) + 2048,
- granularity / 2),
+ dst_data + (granularity / 2) * (i / granularity) + 2048, granularity / 2),
0);
}
/* check values */
for (int i = 0; i < 4096; i += granularity) {
EXPECT_EQ (
- memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity),
- granularity / 2),
+ memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity), granularity / 2),
0);
EXPECT_EQ (memcmp (src_data + i + (granularity / 2),
- dst_data + (granularity / 2) * (i / granularity) + 2048,
- granularity / 2),
+ dst_data + (granularity / 2) * (i / granularity) + 2048, granularity / 2),
0);
}
for (int i = 0; i < 4096; i += granularity) {
EXPECT_EQ (
- memcmp (src_data + i, dst_data + (granularity / 4) * (i / granularity),
- granularity / 4),
+ memcmp (src_data + i, dst_data + (granularity / 4) * (i / granularity), granularity / 4),
0);
EXPECT_EQ (memcmp (src_data + i + (granularity / 4),
- dst_data + (granularity / 4) * (i / granularity) + 1024,
- granularity / 4),
+ dst_data + (granularity / 4) * (i / granularity) + 1024, granularity / 4),
0);
EXPECT_EQ (memcmp (src_data + i + 2 * (granularity / 4),
- dst_data + (granularity / 4) * (i / granularity) + 2048,
- granularity / 4),
+ dst_data + (granularity / 4) * (i / granularity) + 2048, granularity / 4),
0);
EXPECT_EQ (memcmp (src_data + i + 3 * (granularity / 4),
- dst_data + (granularity / 4) * (i / granularity) + 3072,
- granularity / 4),
+ dst_data + (granularity / 4) * (i / granularity) + 3072, granularity / 4),
0);
}
* @brief Test quantize() with various types (dummy)
*/
TEST (ne_core_data_test, dummy_quantize) {
- data_type npu_types[] = {DATA_TYPE_SRNPU, DATA_TYPE_QASYMM8,
- DATA_TYPE_QSYMM16};
- data_type std_types[] = {
- DATA_TYPE_INT8, DATA_TYPE_UINT8, DATA_TYPE_INT16, DATA_TYPE_UINT16,
- DATA_TYPE_INT32, DATA_TYPE_UINT32, DATA_TYPE_INT64, DATA_TYPE_UINT64,
- DATA_TYPE_FLOAT32, DATA_TYPE_FLOAT64};
+ data_type npu_types[] = {DATA_TYPE_SRNPU, DATA_TYPE_QASYMM8, DATA_TYPE_QSYMM16};
+ data_type std_types[] = {DATA_TYPE_INT8, DATA_TYPE_UINT8, DATA_TYPE_INT16, DATA_TYPE_UINT16,
+ DATA_TYPE_INT32, DATA_TYPE_UINT32, DATA_TYPE_INT64, DATA_TYPE_UINT64,
+ DATA_TYPE_FLOAT32, DATA_TYPE_FLOAT64};
uint32_t data_dims[] = {1, 1, 1, 1024};
- void *src_data = malloc (4096);
- void *dst_data = malloc (4096);
-
+ void *src_data = calloc (1, 4096);
ASSERT_NE (src_data, nullptr);
- ASSERT_NE (dst_data, nullptr);
+ void *dst_data = calloc (1, 4096);
+ if (dst_data == nullptr) {
+ free (src_data);
+ ASSERT_NE (dst_data, nullptr);
+ }
/* std to npu */
std::unique_ptr<DataConverter> converter (new DataConverter (true));
}
/**
+ * @brief Data conversion from NHWC to TRIV2
+ */
+TEST (ne_core_data_test, layout_conversion_from_nhwc) {
+ std::unique_ptr<DataConverter> converter (new DataConverter (true));
+
+ uint32_t N = 1, H = 10, W = 10;
+ uint32_t channels[] = {1, 3, 16, 32, 64};
+
+ for (auto C : channels) {
+ uint32_t data_dims[] = {N, H, W, C};
+ uint32_t MPA_L = 32;
+ if (C == 1 || C == 3)
+ MPA_L = C;
+
+ uint32_t src_size = N * H * W * C;
+ uint8_t *src_data = new uint8_t[src_size];
+
+ uint32_t dst_size = N * H * W * (((C + MPA_L - 1) / MPA_L) * MPA_L);
+ uint8_t *dst_data = new uint8_t[dst_size];
+
+ converter->setTops (2);
+ converter->setData (src_data, dst_data, src_size);
+ converter->setDataDims (data_dims);
+ converter->setDataLayout (DATA_LAYOUT_NHWC, DATA_LAYOUT_TRIV2);
+ converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
+
+ EXPECT_TRUE (converter->checkCapability ());
+
+ /* fill any data */
+ for (int i = 0; i < src_size; i++) src_data[i] = i;
+ for (int i = 0; i < dst_size; i++) dst_data[i] = 0;
+
+ EXPECT_EQ (converter->perform (), src_size);
+
+ uint32_t std_offset;
+ uint32_t npu_offset;
+ for (int n = 0; n < N; n++) {
+ for (int h = 0; h < H; h++) {
+ for (int w = 0; w < W; w++) {
+ for (int c = 0; c < C; c++) {
+ std_offset = c + C * (w + W * (h + n * H));
+ npu_offset = c % MPA_L + MPA_L * (w + W * (h + (n + c / MPA_L) * H));
+ EXPECT_EQ (src_data[std_offset], dst_data[npu_offset]);
+ }
+ }
+ }
+ }
+
+ delete[] src_data;
+ delete[] dst_data;
+ }
+}
+
+/**
+ * @brief Data conversion from TRIV2 to NHWC
+ */
+TEST (ne_core_data_test, layout_conversion_to_nhwc) {
+ std::unique_ptr<DataConverter> converter (new DataConverter (false));
+
+ uint32_t N = 1, H = 10, W = 100;
+ uint32_t channels[] = {1, 3, 16, 32, 64};
+
+ for (auto C : channels) {
+ uint32_t data_dims[] = {N, H, W, C};
+ uint32_t MPA_L = 32;
+
+ uint32_t src_size = N * H * W * (((C + MPA_L - 1) / MPA_L) * MPA_L);
+ uint8_t *src_data = new uint8_t[src_size];
+
+ uint32_t dst_size = N * H * W * C;
+ uint8_t *dst_data = new uint8_t[dst_size];
+
+ converter->setTops (2);
+ converter->setData (src_data, dst_data, src_size);
+ converter->setDataDims (data_dims);
+ converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_NHWC);
+ converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
+
+ EXPECT_TRUE (converter->checkCapability ());
+
+ /* fill any data */
+ for (int i = 0; i < src_size; i++) src_data[i] = i;
+ for (int i = 0; i < dst_size; i++) dst_data[i] = 0;
+
+ EXPECT_EQ (converter->perform (), src_size);
+
+ uint32_t std_offset;
+ uint32_t npu_offset;
+ for (int n = 0; n < N; n++) {
+ for (int h = 0; h < H; h++) {
+ for (int w = 0; w < W; w++) {
+ for (int c = 0; c < C; c++) {
+ std_offset = c + C * (w + W * (h + n * H));
+ npu_offset = (c % MPA_L) + MPA_L * (w + W * (h + (n + c / MPA_L) * H));
+ EXPECT_EQ (src_data[npu_offset], dst_data[std_offset]);
+ }
+ }
+ }
+ }
+
+ delete[] src_data;
+ delete[] dst_data;
+ }
+}
+
+/**
+ * @brief Data conversion from NCHW to TRIV2
+ */
+TEST (ne_core_data_test, layout_conversion_from_nchw) {
+ std::unique_ptr<DataConverter> converter (new DataConverter (true));
+
+ uint32_t N = 1, H = 10, W = 10;
+ uint32_t channels[] = {1, 3, 16, 32, 64};
+
+ for (auto C : channels) {
+ uint32_t data_dims[] = {N, H, W, C};
+ uint32_t MPA_L = 32;
+ if (C == 1 || C == 3)
+ MPA_L = C;
+
+ uint32_t src_size = N * H * W * C;
+ uint8_t *src_data = new uint8_t[src_size];
+
+ uint32_t dst_size = N * H * W * (((C + MPA_L - 1) / MPA_L) * MPA_L);
+ uint8_t *dst_data = new uint8_t[dst_size];
+
+ converter->setTops (2);
+ converter->setData (src_data, dst_data, src_size);
+ converter->setDataDims (data_dims);
+ converter->setDataLayout (DATA_LAYOUT_NCHW, DATA_LAYOUT_TRIV2);
+ converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
+
+ EXPECT_TRUE (converter->checkCapability ());
+
+ /* fill any data */
+ for (int i = 0; i < src_size; i++) src_data[i] = i;
+ for (int i = 0; i < dst_size; i++) dst_data[i] = 0;
+
+ EXPECT_EQ (converter->perform (), src_size);
+
+ uint32_t std_offset;
+ uint32_t npu_offset;
+ for (int n = 0; n < N; n++) {
+ for (int c = 0; c < C; c++) {
+ for (int h = 0; h < H; h++) {
+ for (int w = 0; w < W; w++) {
+ std_offset = w + W * (h + H * (c + n * C));
+ npu_offset = (c % MPA_L) + MPA_L * (w + W * (h + (n + c / MPA_L) * H));
+ EXPECT_EQ (src_data[std_offset], dst_data[npu_offset]);
+ }
+ }
+ }
+ }
+
+ delete[] src_data;
+ delete[] dst_data;
+ }
+}
+
+/**
+ * @brief Data conversion from TRIV2 to NCHW
+ */
+TEST (ne_core_data_test, layout_conversion_to_nchw) {
+ std::unique_ptr<DataConverter> converter (new DataConverter (false));
+
+ uint32_t N = 1, H = 10, W = 10;
+ uint32_t channels[] = {1, 3, 16, 32, 64};
+
+ for (auto C : channels) {
+ uint32_t data_dims[] = {N, H, W, C};
+ uint32_t MPA_L = 32;
+
+ uint32_t src_size = N * H * W * (((C + MPA_L - 1) / MPA_L) * MPA_L);
+ uint8_t *src_data = new uint8_t[src_size];
+
+ uint32_t dst_size = N * H * W * C;
+ uint8_t *dst_data = new uint8_t[dst_size];
+
+ converter->setTops (2);
+ converter->setData (src_data, dst_data, src_size);
+ converter->setDataDims (data_dims);
+ converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_NCHW);
+ converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
+
+ EXPECT_TRUE (converter->checkCapability ());
+
+ /* fill any data */
+ for (int i = 0; i < src_size; i++) src_data[i] = i;
+ for (int i = 0; i < dst_size; i++) dst_data[i] = 0;
+
+ EXPECT_EQ (converter->perform (), src_size);
+
+ uint32_t std_offset;
+ uint32_t npu_offset;
+ for (int n = 0; n < N; n++) {
+ for (int c = 0; c < C; c++) {
+ for (int h = 0; h < H; h++) {
+ for (int w = 0; w < W; w++) {
+ std_offset = w + W * (h + H * (c + n * C));
+ npu_offset = (c % MPA_L) + MPA_L * (w + W * (h + (n + c / MPA_L) * H));
+ EXPECT_EQ (src_data[npu_offset], dst_data[std_offset]);
+ }
+ }
+ }
+ }
+
+ delete[] src_data;
+ delete[] dst_data;
+ }
+}
+
+/**
* @brief main function for unit test
*/
int