From d59a21b8d643ca047608db52412e72cdb4d23133 Mon Sep 17 00:00:00 2001 From: Dongju Chae Date: Tue, 11 Feb 2020 12:34:47 +0900 Subject: [PATCH] [Test/Model] Change the test directory from ./src/test to ./tests This commit changes the test directory from ./src/test to ./tests. Also, this new directory now includes pre-built model binaries. (e.g., NPU models from NPU_Compiler) Signed-off-by: Dongju Chae --- debian/rules | 26 ++++++++--------- doc/how_to_use.md | 2 +- doc/usage_examples.md | 4 +-- meson.build | 1 + packaging/npu-engine.spec | 30 ++++++++++---------- src/meson.build | 3 -- {src/test => tests}/README.md | 0 {src/test => tests}/apptests/async_callbacks.c | 5 ++-- {src/test => tests}/apptests/dmabuf_buffers.c | 4 +-- {src/test => tests}/apptests/dmabuf_model.c | 4 +-- {src/test => tests}/apptests/dummy_inference.c | 3 +- {src/test => tests}/apptests/dummy_inference_asr.c | 3 +- {src/test => tests}/apptests/example_visa.c | 3 +- {src/test => tests}/apptests/meson.build | 0 tests/meson.build | 3 ++ tests/models/README.md | 31 +++++++++++++++++++++ tests/models/tvn_models.tar.gz | Bin 0 -> 25491 bytes {src/test => tests}/unittests/meson.build | 0 .../unittests/ne_core_comm_ip_test.cpp | 2 +- {src/test => tests}/unittests/ne_core_gem_test.cpp | 0 .../unittests/ne_core_handler_test.cpp | 0 {src/test => tests}/unittests/ne_core_inf_test.cpp | 0 {src/test => tests}/unittests/ne_core_mem_test.cpp | 0 {src/test => tests}/unittests/ne_core_npu_test.cpp | 0 {src/test => tests}/unittests/ne_core_tlb_test.cpp | 0 .../unittests/ne_core_utils_test.cpp | 0 {src/test => tests/utils}/meson.build | 5 ++-- {src/test => tests/utils}/ne_test_utils.c | 0 {src/test => tests/utils}/ne_test_utils.h | 0 {src/test => tools}/unittestcoverage.py | 0 30 files changed, 78 insertions(+), 51 deletions(-) rename {src/test => tests}/README.md (100%) rename {src/test => tests}/apptests/async_callbacks.c (98%) rename {src/test => tests}/apptests/dmabuf_buffers.c (98%) rename {src/test => tests}/apptests/dmabuf_model.c (98%) rename {src/test => tests}/apptests/dummy_inference.c (99%) rename {src/test => tests}/apptests/dummy_inference_asr.c (98%) rename {src/test => tests}/apptests/example_visa.c (99%) rename {src/test => tests}/apptests/meson.build (100%) create mode 100644 tests/meson.build create mode 100644 tests/models/README.md create mode 100644 tests/models/tvn_models.tar.gz rename {src/test => tests}/unittests/meson.build (100%) rename {src/test => tests}/unittests/ne_core_comm_ip_test.cpp (99%) rename {src/test => tests}/unittests/ne_core_gem_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_handler_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_inf_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_mem_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_npu_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_tlb_test.cpp (100%) rename {src/test => tests}/unittests/ne_core_utils_test.cpp (100%) rename {src/test => tests/utils}/meson.build (59%) rename {src/test => tests/utils}/ne_test_utils.c (100%) rename {src/test => tests/utils}/ne_test_utils.h (100%) rename {src/test => tools}/unittestcoverage.py (100%) diff --git a/debian/rules b/debian/rules index e70227f..0364cef 100755 --- a/debian/rules +++ b/debian/rules @@ -32,18 +32,18 @@ override_dh_auto_build: override_dh_auto_test: # unit tests - ./build/src/test/unittests/unittest_ne_core_mem - ./build/src/test/unittests/unittest_ne_core_npu - ./build/src/test/unittests/unittest_ne_core_gem - ./build/src/test/unittests/unittest_ne_core_comm_ip - ./build/src/test/unittests/unittest_ne_core_handler - ./build/src/test/unittests/unittest_ne_core_inf - ./build/src/test/unittests/unittest_ne_core_utils + ./build/tests/unittests/unittest_ne_core_mem + ./build/tests/unittests/unittest_ne_core_npu + ./build/tests/unittests/unittest_ne_core_gem + ./build/tests/unittests/unittest_ne_core_comm_ip + ./build/tests/unittests/unittest_ne_core_handler + ./build/tests/unittests/unittest_ne_core_inf + ./build/tests/unittests/unittest_ne_core_utils # app tests - ./build/src/test/apptests/apptest_dummy_inference - ./build/src/test/apptests/apptest_dmabuf_model - ./build/src/test/apptests/apptest_dmabuf_buffers - ./build/src/test/apptests/apptest_async_callbacks + ./build/tests/apptests/apptest_dummy_inference + ./build/tests/apptests/apptest_dmabuf_model + ./build/tests/apptests/apptest_dmabuf_buffers + ./build/tests/apptests/apptest_async_callbacks # Gen model binaries # Single-layer test data @@ -67,8 +67,8 @@ override_dh_auto_test: find $(CURDIR)/multi -type f -name 'program.*' -delete # single/multi-layer model test - ./build/src/test/apptests/apptest_example_visa single > /dev/null - ./build/src/test/apptests/apptest_example_visa multi > /dev/null + ./build/tests/apptests/apptest_example_visa single > /dev/null + ./build/tests/apptests/apptest_example_visa multi > /dev/null override_dh_auto_install: DESTDIR=$(CURDIR)/debian/tmp ninja -C build install diff --git a/doc/how_to_use.md b/doc/how_to_use.md index 1ea25a2..3341195 100644 --- a/doc/how_to_use.md +++ b/doc/how_to_use.md @@ -87,4 +87,4 @@ unregisterNPUmodel(): Unregister the finished model and remove it. runNPU_sync(): Execute inference with the registered model in sync mode. runNPU_async(): Execute inference with the registered model in async mode. Need an output callback. ``` -For complete sample codes, please refer to [here](/src/test/apptests). +For complete sample codes, please refer to [here](/tests/apptests). diff --git a/doc/usage_examples.md b/doc/usage_examples.md index 98d379a..184b343 100644 --- a/doc/usage_examples.md +++ b/doc/usage_examples.md @@ -2,7 +2,7 @@ We provide example applications which use the NPU Engline library and its APIs. They are good reference codes when you develop your applications using the NPU Engine library. -Please visit [here](/src/test/apptests) to get full source codes. +Please visit [here](/tests/apptests) to get full source codes. NPU Engine's two optional packages, `npu-engine-example` and `npu-engine-testdata`, contain test binaries and data, respectively. You may use them to verify the functionality of NPU Engine and obtain some guides for its usage. @@ -23,7 +23,7 @@ The `npu-engine-testdata` package contains testdata used in some example test pr **Ubuntu**: `/opt/trinity/share/npu-engine/testdata` ## Example: apptest_example_visa -This application ([example_visa.c](/src/test/apptests/example_visa.c)) executes NPU models (with single or multi layers) and compares outputs with their golden data. +This application ([example_visa.c](/tests/apptests/example_visa.c)) executes NPU models (with single or multi layers) and compares outputs with their golden data. Note that the testdata used here follows the NPU binary format ([npubinfmt.h](/include/common/npubinfmt.h)) agreed with several parts. Let's assume you are testing the application in Ubuntu 16.04. diff --git a/meson.build b/meson.build index ccd782b..5e63ddb 100644 --- a/meson.build +++ b/meson.build @@ -61,6 +61,7 @@ if get_option('enable_data_manip') endif subdir('src') +subdir('tests') subdir('tools') # Set configuration to install .ini diff --git a/packaging/npu-engine.spec b/packaging/npu-engine.spec index b7081ea..efc67ae 100644 --- a/packaging/npu-engine.spec +++ b/packaging/npu-engine.spec @@ -116,9 +116,10 @@ find %{buildroot} -name multi.tar.gz -delete # Perform unit tests %check %if 0%{?unit_test} - pushd build/src + pushd build/tests + # Run unittests - find test/unittests -maxdepth 1 -type f -perm 0755 -print0 | while IFS= read -r -d $'\0' unittest_exec; do + find unittests -maxdepth 1 -type f -perm 0755 -print0 | while IFS= read -r -d $'\0' unittest_exec; do %if 0%{?use_valgrind} valgrind ./${unittest_exec} %else @@ -126,20 +127,21 @@ find %{buildroot} -name multi.tar.gz -delete %endif done # Run apptests - find test/apptests -maxdepth 1 -type f -perm 0755 -print0 | while IFS= read -r -d $'\0' apptest_exec; do + find apptests -maxdepth 1 -type f -perm 0755 -print0 | while IFS= read -r -d $'\0' apptest_exec; do %if 0%{?use_valgrind} valgrind ./${apptest_exec} %else ./${apptest_exec} %endif done - popd # Run example_visa %ifarch aarch64 x86_64 - ./build/src/test/apptests/apptest_example_visa %{buildroot}%{testdatadir_out}/single > /dev/null - ./build/src/test/apptests/apptest_example_visa %{buildroot}%{testdatadir_out}/multi > /dev/null + ./apptests/apptest_example_visa %{buildroot}%{testdatadir_out}/single > /dev/null + ./apptests/apptest_example_visa %{buildroot}%{testdatadir_out}/multi > /dev/null %endif + + popd %endif # Analyze test coverage @@ -147,28 +149,24 @@ find %{buildroot} -name multi.tar.gz -delete # 'lcov' generates the date format with UTC time zone by default. Let's replace UTC with KST TZ='Asia/Seoul'; export TZ - pushd src - - ./test/unittestcoverage.py module $(pwd) + $(pwd)/tools/unittestcoverage.py module $(pwd)/src # Get commit info VCS=`cat ${RPM_SOURCE_DIR}/npu-engine.spec | grep "^VCS:" | sed "s|VCS:\\W*\\(.*\\)|\\1|"` # Create human readable unit test coverate report web page - # Create null gcda files if gcov didn't create it - find .. -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \; + find . -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \; # Generate report - lcov -t 'NPU SystemService Unit Test Coverage' -o unittest.info -c -d .. -b $(pwd) --no-external - # Exclude generated files (Orc) - lcov -r unittest.info "*/*-orc.*" "*/test/*" -o unittest-filtered.info + lcov -t 'NPU SystemService Unit Test Coverage' -o unittest.info -c -d . -b $(pwd)/src --no-external + # Exclude generated files + lcov -r unittest.info "*/tools/*" "*/tests/*" "*/meson*/*" -o unittest-filtered.info # Visualize the report genhtml -o result unittest-filtered.info -t "NPU SystemService %{version}-%{release} ${VCS}" --ignore-errors source -p ${RPM_BUILD_DIR} + # Copy unittest results mkdir -p %{buildroot}%{_datadir}/unittest/ cp -r result %{buildroot}%{_datadir}/unittest/ - - popd %endif %files diff --git a/src/meson.build b/src/meson.build index dc9ed8d..2616470 100644 --- a/src/meson.build +++ b/src/meson.build @@ -18,6 +18,3 @@ ne_library_shared = shared_library('npu-engine', dependencies: ne_dependencies, install : true, install_dir : ne_libdir) - -# Build tests -subdir('test') diff --git a/src/test/README.md b/tests/README.md similarity index 100% rename from src/test/README.md rename to tests/README.md diff --git a/src/test/apptests/async_callbacks.c b/tests/apptests/async_callbacks.c similarity index 98% rename from src/test/apptests/async_callbacks.c rename to tests/apptests/async_callbacks.c index d789fbf..74f0825 100644 --- a/src/test/apptests/async_callbacks.c +++ b/tests/apptests/async_callbacks.c @@ -19,8 +19,9 @@ #include #include -#include "../ne_test_utils.h" -#include "../../core/ne-conf.h" +#include + +#include "../../src/core/ne-conf.h" /** @brief lock for private data */ #define TEST_LOCK() pthread_mutex_lock(&priv.mutex) diff --git a/src/test/apptests/dmabuf_buffers.c b/tests/apptests/dmabuf_buffers.c similarity index 98% rename from src/test/apptests/dmabuf_buffers.c rename to tests/apptests/dmabuf_buffers.c index 5a56c35..e507e17 100644 --- a/src/test/apptests/dmabuf_buffers.c +++ b/tests/apptests/dmabuf_buffers.c @@ -20,9 +20,9 @@ #include #include +#include -#include "../ne_test_utils.h" -#include "../../core/ne-conf.h" +#include "../../src/core/ne-conf.h" /** @brief compare output result with the golden data */ static int diff --git a/src/test/apptests/dmabuf_model.c b/tests/apptests/dmabuf_model.c similarity index 98% rename from src/test/apptests/dmabuf_model.c rename to tests/apptests/dmabuf_model.c index df0dcd1..752a9c3 100644 --- a/src/test/apptests/dmabuf_model.c +++ b/tests/apptests/dmabuf_model.c @@ -20,9 +20,9 @@ #include #include +#include -#include "../ne_test_utils.h" -#include "../../core/ne-conf.h" +#include "../../src/core/ne-conf.h" /** @brief compare output result with the golden data */ static int diff --git a/src/test/apptests/dummy_inference.c b/tests/apptests/dummy_inference.c similarity index 99% rename from src/test/apptests/dummy_inference.c rename to tests/apptests/dummy_inference.c index 31574bb..e40005a 100644 --- a/src/test/apptests/dummy_inference.c +++ b/tests/apptests/dummy_inference.c @@ -22,8 +22,7 @@ #include #include - -#include "../ne_test_utils.h" +#include /** @brief compare output result with the golden data */ static int diff --git a/src/test/apptests/dummy_inference_asr.c b/tests/apptests/dummy_inference_asr.c similarity index 98% rename from src/test/apptests/dummy_inference_asr.c rename to tests/apptests/dummy_inference_asr.c index 3613ce8..af3cd35 100644 --- a/src/test/apptests/dummy_inference_asr.c +++ b/tests/apptests/dummy_inference_asr.c @@ -20,8 +20,7 @@ #include #include - -#include "../ne_test_utils.h" +#include /** @brief compare output result with the golden data */ static int diff --git a/src/test/apptests/example_visa.c b/tests/apptests/example_visa.c similarity index 99% rename from src/test/apptests/example_visa.c rename to tests/apptests/example_visa.c index f0b4d2f..4166854 100644 --- a/src/test/apptests/example_visa.c +++ b/tests/apptests/example_visa.c @@ -22,8 +22,7 @@ #include #include - -#include "../ne_test_utils.h" +#include #define MAX_FILE_LEN 256 diff --git a/src/test/apptests/meson.build b/tests/apptests/meson.build similarity index 100% rename from src/test/apptests/meson.build rename to tests/apptests/meson.build diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000..8619eb3 --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,3 @@ +subdir('utils') +subdir('unittests') +subdir('apptests') diff --git a/tests/models/README.md b/tests/models/README.md new file mode 100644 index 0000000..ea8e2cd --- /dev/null +++ b/tests/models/README.md @@ -0,0 +1,31 @@ +## tvn models from [NPU_Compiler](https://github.sec.samsung.net/AIP/NPU_Compiler) + +``` +Generated by ./NPU_Compiler/tools/vcc/tests/explain.sh + +NAME SUMMARY +000 Identity +001 MaxPool +NET_0000 MaxPool-MaxPool +NET_0001 Placeholder-MaxPool-Conv2D-FakeQuant +NET_0002 Placeholder-MaxPool--Conv2D------------Add-FakeQuant +NET_0003 Convolution with excessive memory requirement (over 1MB) +NET_0004 Padded Conv-BiasAdd-Relu with excessive memory requirement (over 1MB) +NET_0005 First residual block of RefineDet from Pad-MaxPool split to merge of Add-Relu +NET_0006 First two residual blocks of RefineDet +NET_0008 MaxPool-MaxPool network with large(1x40x20x512) input +NET_0009 MaxPool network with large(1x320x320x64) input +NET_0011 First Conv2DBackpropInput with constant network for input_sizes +UNI_CONV_000 Conv-FakeQuantWithMinMaxVars +UNI_CONV_001 Conv2D-BiasAdd +UNI_CONV_002 Conv2D-BiasAdd-Relu +UNI_CONV_003 Conv2D-FakeQuantWithMinMaxVars with non-zero weight +UNI_CONV_004 Pad-Conv2D-BiasAdd-Relu-FakeQuantiWithMinMaxVars with non-zero weight +UNI_CONV_005 Conv OFM is not a multiple of 64 +UNI_CONVE_000 Conv2D-BiasAdd-Add-Relu +UNI_MAXP_000 MaxPool +UNI_MAXP_001 Pad-MaxPool +UNI_MAXP_002 Small MaxPool (input 2x2x64, filter 2x2, output 1x1x64) +UNI_TCNV_000 Conv2DBackpropInput +UNI_TCNV_001 Conv2DBackpropInput + BiasAdd +``` diff --git a/tests/models/tvn_models.tar.gz b/tests/models/tvn_models.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..056c9ddabab5bcf5dec81ff5b2d2af097d411a75 GIT binary patch literal 25491 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 U>Ax%}^J`w);Dr=W5f1480K7jr+5i9m literal 0 HcmV?d00001 diff --git a/src/test/unittests/meson.build b/tests/unittests/meson.build similarity index 100% rename from src/test/unittests/meson.build rename to tests/unittests/meson.build diff --git a/src/test/unittests/ne_core_comm_ip_test.cpp b/tests/unittests/ne_core_comm_ip_test.cpp similarity index 99% rename from src/test/unittests/ne_core_comm_ip_test.cpp rename to tests/unittests/ne_core_comm_ip_test.cpp index 7dbecbc..f8e01e1 100644 --- a/src/test/unittests/ne_core_comm_ip_test.cpp +++ b/tests/unittests/ne_core_comm_ip_test.cpp @@ -17,7 +17,7 @@ extern "C" { #include #include - #include "../ne_test_utils.h" + #include } enum LOCAL_CONSTANTS { diff --git a/src/test/unittests/ne_core_gem_test.cpp b/tests/unittests/ne_core_gem_test.cpp similarity index 100% rename from src/test/unittests/ne_core_gem_test.cpp rename to tests/unittests/ne_core_gem_test.cpp diff --git a/src/test/unittests/ne_core_handler_test.cpp b/tests/unittests/ne_core_handler_test.cpp similarity index 100% rename from src/test/unittests/ne_core_handler_test.cpp rename to tests/unittests/ne_core_handler_test.cpp diff --git a/src/test/unittests/ne_core_inf_test.cpp b/tests/unittests/ne_core_inf_test.cpp similarity index 100% rename from src/test/unittests/ne_core_inf_test.cpp rename to tests/unittests/ne_core_inf_test.cpp diff --git a/src/test/unittests/ne_core_mem_test.cpp b/tests/unittests/ne_core_mem_test.cpp similarity index 100% rename from src/test/unittests/ne_core_mem_test.cpp rename to tests/unittests/ne_core_mem_test.cpp diff --git a/src/test/unittests/ne_core_npu_test.cpp b/tests/unittests/ne_core_npu_test.cpp similarity index 100% rename from src/test/unittests/ne_core_npu_test.cpp rename to tests/unittests/ne_core_npu_test.cpp diff --git a/src/test/unittests/ne_core_tlb_test.cpp b/tests/unittests/ne_core_tlb_test.cpp similarity index 100% rename from src/test/unittests/ne_core_tlb_test.cpp rename to tests/unittests/ne_core_tlb_test.cpp diff --git a/src/test/unittests/ne_core_utils_test.cpp b/tests/unittests/ne_core_utils_test.cpp similarity index 100% rename from src/test/unittests/ne_core_utils_test.cpp rename to tests/unittests/ne_core_utils_test.cpp diff --git a/src/test/meson.build b/tests/utils/meson.build similarity index 59% rename from src/test/meson.build rename to tests/utils/meson.build index 39630e7..5637f43 100644 --- a/src/test/meson.build +++ b/tests/utils/meson.build @@ -1,9 +1,8 @@ # Build library +ne_test_utils_inc = include_directories('.') ne_test_utils_src = ['ne_test_utils.c'] ne_test_utils_dep = declare_dependency( sources : ne_test_utils_src, + include_directories : ne_test_utils_inc, ) - -subdir('unittests') -subdir('apptests') diff --git a/src/test/ne_test_utils.c b/tests/utils/ne_test_utils.c similarity index 100% rename from src/test/ne_test_utils.c rename to tests/utils/ne_test_utils.c diff --git a/src/test/ne_test_utils.h b/tests/utils/ne_test_utils.h similarity index 100% rename from src/test/ne_test_utils.h rename to tests/utils/ne_test_utils.h diff --git a/src/test/unittestcoverage.py b/tools/unittestcoverage.py similarity index 100% rename from src/test/unittestcoverage.py rename to tools/unittestcoverage.py -- 2.7.4