[Orc] update function for operator add/mul
authorJaeyun <jy1210.jung@samsung.com>
Mon, 3 Dec 2018 08:31:35 +0000 (17:31 +0900)
committerMyungJoo Ham <myungjoo.ham@gmail.com>
Mon, 3 Dec 2018 13:06:26 +0000 (13:06 +0000)
1. add functions for operator add/mul
2. add functional testcases for orc

TODO :
1. support int64
2. add typecast functions

Signed-off-by: Jaeyun Jung <jy1210.jung@samsung.com>
gst/tensor_transform/transform-orc.orc
tests/nnstreamer_plugins/unittest_plugins.cpp

index e362589..a1d3e72 100644 (file)
-.function nns_orc_add_s8
-.dest 1 d1 gint8
-.source 1 s1 gint8
+.function nns_orc_add_c_s8
+.dest 1 d1 int8_t
+.param 1 p1 int8_t
 
-addssb d1, d1, s1
+addssb d1, d1, p1
 
 
-.function nns_orc_add_u8
-.dest 1 d1 guint8
-.source 1 s1 guint8
+.function nns_orc_mul_c_s8
+.dest 1 d1 int8_t
+.param 1 p1 int8_t
+.temp 2 t1
 
-addusb d1, d1, s1
+mulsbw t1, d1, p1
+convssswb d1, t1
 
 
-.function nns_orc_add_s16
-.dest 2 d1 gint16
-.source 2 s1 gint16
+.function nns_orc_add_c_u8
+.dest 1 d1 uint8_t
+.param 1 p1 uint8_t
 
-addssw d1, d1, s1
+addusb d1, d1, p1
 
 
-.function nns_orc_add_u16
-.dest 2 d1 guint16
-.source 2 s1 guint16
+.function nns_orc_mul_c_u8
+.dest 1 d1 uint8_t
+.param 1 p1 uint8_t
+.temp 2 t1
 
-addusw d1, d1, s1
+mulubw t1, d1, p1
+convuuswb d1, t1
 
 
-.function nns_orc_add_s32
-.dest 4 d1 gint32
-.source 4 s1 gint32
+.function nns_orc_add_c_s16
+.dest 2 d1 int16_t
+.param 2 p1 int16_t
 
-addssl d1, d1, s1
+addssw d1, d1, p1
 
 
-.function nns_orc_add_u32
-.dest 4 d1 guint32
-.source 4 s1 guint32
+.function nns_orc_mul_c_s16
+.dest 2 d1 int16_t
+.param 2 p1 int16_t
+.temp 4 t1
 
-addusl d1, d1, s1
+mulswl t1, d1, p1
+convssslw d1, t1
 
 
-.function nns_orc_add_f32
+.function nns_orc_add_c_u16
+.dest 2 d1 uint16_t
+.param 2 p1 uint16_t
+
+addusw d1, d1, p1
+
+
+.function nns_orc_mul_c_u16
+.dest 2 d1 uint16_t
+.param 2 p1 uint16_t
+.temp 4 t1
+
+muluwl t1, d1, p1
+convuuslw d1, t1
+
+
+.function nns_orc_add_c_s32
+.dest 4 d1 int32_t
+.param 4 p1 int32_t
+
+addssl d1, d1, p1
+
+
+.function nns_orc_mul_c_s32
+.dest 4 d1 int32_t
+.param 4 p1 int32_t
+.temp 8 t1
+
+mulslq t1, d1, p1
+convsssql d1, t1
+
+
+.function nns_orc_add_c_u32
+.dest 4 d1 uint32_t
+.param 4 p1 uint32_t
+
+addusl d1, d1, p1
+
+
+.function nns_orc_mul_c_u32
+.dest 4 d1 uint32_t
+.param 4 p1 uint32_t
+.temp 8 t1
+
+mululq t1, d1, p1
+convuusql d1, t1
+
+
+.function nns_orc_add_c_f32
 .dest 4 d1 float
-.source 4 s1 float
+.floatparam 4 p1 float
+
+addf d1, d1, p1
+
+
+.function nns_orc_mul_c_f32
+.dest 4 d1 float
+.floatparam 4 p1 float
+
+mulf d1, d1, p1
+
+
+.function nns_orc_add_c_f64
+.dest 8 d1 double
+.doubleparam 8 p1 double
 
-addf d1, d1, s1
+addd d1, d1, p1
 
 
-.function nns_orc_add_f64
+.function nns_orc_mul_c_f64
 .dest 8 d1 double
-.source 8 s1 double
+.doubleparam 8 p1 double
 
-addd d1, d1, s1
+muld d1, d1, p1
index 7c5a36f..2943bfb 100644 (file)
@@ -528,6 +528,336 @@ TEST (test_tensor_transform, arithmetic_5)
   gst_harness_teardown (h);
 }
 
+#ifdef HAVE_ORC
+#include "../../gst/tensor_transform/transform-orc.h"
+
+/**
+ * @brief Test for tensor_transform orc functions (add constant value)
+ */
+TEST (test_tensor_transform, orc_add)
+{
+  const guint array_size = 10;
+  guint i;
+
+  /* add constant s8 */
+  int8_t data_s8[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s8[i] = i - 1;
+  }
+
+  nns_orc_add_c_s8 (data_s8, -20, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s8[i], i - 1 - 20);
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s8[i] = i + 1;
+  }
+
+  nns_orc_add_c_s8 (data_s8, 20, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s8[i], i + 1 + 20);
+  }
+
+  /* add constant u8 */
+  uint8_t data_u8[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u8[i] = i + 1;
+  }
+
+  nns_orc_add_c_u8 (data_u8, 3, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u8[i], i + 1 + 3);
+  }
+
+  /* add constant s16 */
+  int16_t data_s16[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s16[i] = i - 1;
+  }
+
+  nns_orc_add_c_s16 (data_s16, -16, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s16[i], i - 1 - 16);
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s16[i] = i + 1;
+  }
+
+  nns_orc_add_c_s16 (data_s16, 16, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s16[i], i + 1 + 16);
+  }
+
+  /* add constant u16 */
+  uint16_t data_u16[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u16[i] = i + 1;
+  }
+
+  nns_orc_add_c_u16 (data_u16, 17, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u16[i], i + 1 + 17);
+  }
+
+  /* add constant s32 */
+  int32_t data_s32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s32[i] = i + 1;
+  }
+
+  nns_orc_add_c_s32 (data_s32, -32, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s32[i], i + 1 - 32);
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s32[i] = i + 1;
+  }
+
+  nns_orc_add_c_s32 (data_s32, 32, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s32[i], i + 1 + 32);
+  }
+
+  /* add constant u32 */
+  uint32_t data_u32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u32[i] = i + 1;
+  }
+
+  nns_orc_add_c_u32 (data_u32, 33, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u32[i], i + 1 + 33);
+  }
+
+  /* add constant f32 */
+  float data_f32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_f32[i] = i - .1;
+  }
+
+  nns_orc_add_c_f32 (data_f32, -10.2, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_FLOAT_EQ (data_f32[i], i - .1 - 10.2);
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_f32[i] = i + .1;
+  }
+
+  nns_orc_add_c_f32 (data_f32, 10.2, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_FLOAT_EQ (data_f32[i], i + .1 + 10.2);
+  }
+
+  /* add constant f64 */
+  double data_f64[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_f64[i] = i - .1;
+  }
+
+  nns_orc_add_c_f64 (data_f64, -20.5, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_DOUBLE_EQ (data_f64[i], i - .1 - 20.5);
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_f64[i] = i + .2;
+  }
+
+  nns_orc_add_c_f64 (data_f64, 20.5, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_DOUBLE_EQ (data_f64[i], i + .2 + 20.5);
+  }
+}
+
+/**
+ * @brief Test for tensor_transform orc functions (mul constant value)
+ */
+TEST (test_tensor_transform, orc_mul)
+{
+  const guint array_size = 10;
+  guint i;
+
+  /* mul constant s8 */
+  int8_t data_s8[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s8[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s8 (data_s8, -3, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s8[i], (i + 1) * (-3));
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s8[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s8 (data_s8, 5, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s8[i], (i + 1) * 5);
+  }
+
+  /* mul constant u8 */
+  uint8_t data_u8[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u8[i] = i + 1;
+  }
+
+  nns_orc_mul_c_u8 (data_u8, 3, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u8[i], (i + 1) * 3);
+  }
+
+  /* mul constant s16 */
+  int16_t data_s16[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s16[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s16 (data_s16, -16, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s16[i], (i + 1) * (-16));
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s16[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s16 (data_s16, 16, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s16[i], (i + 1) * 16);
+  }
+
+  /* mul constant u16 */
+  uint16_t data_u16[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u16[i] = i + 1;
+  }
+
+  nns_orc_mul_c_u16 (data_u16, 17, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u16[i], (i + 1) * 17);
+  }
+
+  /* mul constant s32 */
+  int32_t data_s32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_s32[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s32 (data_s32, -32, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s32[i], (i + 1) * (-32));
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_s32[i] = i + 1;
+  }
+
+  nns_orc_mul_c_s32 (data_s32, 32, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_s32[i], (i + 1) * 32);
+  }
+
+  /* mul constant u32 */
+  uint32_t data_u32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_u32[i] = i + 1;
+  }
+
+  nns_orc_mul_c_u32 (data_u32, 33, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_EQ (data_u32[i], (i + 1) * 33);
+  }
+
+  /* mul constant f32 */
+  float data_f32[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_f32[i] = i + 1 - .1;
+  }
+
+  nns_orc_mul_c_f32 (data_f32, -10.2, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_FLOAT_EQ (data_f32[i], (i + 1 - .1) * (-10.2));
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_f32[i] = i + .1;
+  }
+
+  nns_orc_mul_c_f32 (data_f32, 10.2, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_FLOAT_EQ (data_f32[i], (i + .1) * 10.2);
+  }
+
+  /* mul constant f64 */
+  double data_f64[array_size] = { 0, };
+
+  for (i = 0; i < array_size; i++) {
+    data_f64[i] = i + 1 - .1;
+  }
+
+  nns_orc_mul_c_f64 (data_f64, -20.5, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_DOUBLE_EQ (data_f64[i], (i + 1 - .1) * (-20.5));
+  }
+
+  for (i = 0; i < array_size; i++) {
+    data_f64[i] = i + .2;
+  }
+
+  nns_orc_mul_c_f64 (data_f64, 20.5, array_size);
+
+  for (i = 0; i < array_size; i++) {
+    EXPECT_DOUBLE_EQ (data_f64[i], (i + .2) * 20.5);
+  }
+}
+#endif /* HAVE_ORC */
+
 /**
  * @brief Main function for unit test.
  */