[Valgrind] Remove valgrind warnings.
[platform/adaptation/npu/trix-engine.git] / tests / unittests / ne_core_data_test.cc
index 116695f..02e442b 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <ne-data.h>
 #include <ne-model.h>
-#include "ne_unittest_utils.h"
+#include <ne_test_utils_gtest.h>
 
 #include <npubinfmt.h>
 #include <cstdlib>
@@ -49,7 +49,7 @@ TEST (ne_core_data_test, check_capability_n) {
 
   /* 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 ());
 }
 
@@ -280,12 +280,10 @@ TEST (ne_core_data_test, perform_layer_conversion_asymm8) {
 
   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);
   }
 
@@ -319,12 +317,10 @@ TEST (ne_core_data_test, perform_layer_conversion_symm16) {
   /* 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);
   }
 
@@ -334,20 +330,16 @@ TEST (ne_core_data_test, perform_layer_conversion_symm16) {
 
   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);
   }
 
@@ -391,19 +383,19 @@ TEST (ne_core_data_test, perform_n) {
  * @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));
@@ -444,6 +436,218 @@ TEST (ne_core_data_test, dummy_quantize) {
 }
 
 /**
+ * @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