From 04db046629e40bf716bd8dc7af8e53c03d5f8248 Mon Sep 17 00:00:00 2001 From: Jaeyun Date: Mon, 3 Dec 2018 17:31:35 +0900 Subject: [PATCH] [Orc] update function for operator add/mul 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 --- gst/tensor_transform/transform-orc.orc | 128 +++++++--- tests/nnstreamer_plugins/unittest_plugins.cpp | 330 ++++++++++++++++++++++++++ 2 files changed, 428 insertions(+), 30 deletions(-) diff --git a/gst/tensor_transform/transform-orc.orc b/gst/tensor_transform/transform-orc.orc index e362589..a1d3e72 100644 --- a/gst/tensor_transform/transform-orc.orc +++ b/gst/tensor_transform/transform-orc.orc @@ -1,54 +1,122 @@ -.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 diff --git a/tests/nnstreamer_plugins/unittest_plugins.cpp b/tests/nnstreamer_plugins/unittest_plugins.cpp index 7c5a36f7..2943bfb 100644 --- a/tests/nnstreamer_plugins/unittest_plugins.cpp +++ b/tests/nnstreamer_plugins/unittest_plugins.cpp @@ -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. */ -- 2.7.4