diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f77f3b..ea5af47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ option(TIM_VX_ENABLE_NBG_PARSER "Enable NBG parser" option(TIM_VX_CODE_COVERAGE "Run code coverage with gconv(gcc only" OFF) option(TIM_VX_USE_EXTERNAL_OVXLIB "Use external OVXLIB" OFF) option(TIM_VX_BUILD_EXAMPLES "Build demos show general usage" OFF) +option(TIM_VX_ENABLE_VIPLITE "Enable lite driver api support" OFF) set(CMAKE_CXX_STANDARD 14) set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/cmake/A311D.cmake b/cmake/A311D.cmake index 285830a..fd8bd11 100644 --- a/cmake/A311D.cmake +++ b/cmake/A311D.cmake @@ -38,3 +38,22 @@ list(APPEND OVXDRV_LIBRARIES ${PROJECT_BINARY_DIR}/aarch64_A311D_6.4.8/lib/libNNArchPerf.so) mark_as_advanced(${OVXDRV_INCLUDE_DIRS} ${OVXDRV_LIBRARIES}) + +if(${TIM_VX_ENABLE_VIPLITE}) + message("Downloading A311D VIPLite SDK ...") + file(DOWNLOAD "https://github.com/VeriSilicon/TIM-VX/releases/download/v1.1.28/VIPLite_aarch64_A311D_1.3.5.tgz" + ${PROJECT_BINARY_DIR}/VIPLite_aarch64_A311D_1.3.5.tgz + EXPECTED_MD5 "a52839d1f5d37cac8219b0ddec301ddf" + SHOW_PROGRESS) + execute_process(COMMAND + tar xf ${PROJECT_BINARY_DIR}/VIPLite_aarch64_A311D_1.3.5.tgz) + + set(VIPLITE_DRV_INCLUDE_DIR ${PROJECT_BINARY_DIR}/viplite/include) + + set(VIPLITE_DRV_LIBRARIES) + list(APPEND VIPLITE_DRV_LIBRARIES + ${PROJECT_BINARY_DIR}/viplite/drivers/libVIPlite.so + ${PROJECT_BINARY_DIR}/viplite/drivers/libVIPuser.so + ) + mark_as_advanced(${VIPLITE_DRV_INCLUDE_DIR} ${VIPLITE_DRV_LIBRARIES}) +endif() diff --git a/include/tim/lite/handle.h b/include/tim/lite/handle.h index 67d309b..3dcc136 100644 --- a/include/tim/lite/handle.h +++ b/include/tim/lite/handle.h @@ -35,6 +35,8 @@ class HandleImpl; class Handle { public: std::unique_ptr& impl() { return impl_; } + bool Flush(); + bool Invalidate(); protected: std::unique_ptr impl_; }; diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 87dfffa..9df246b 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -1,5 +1,8 @@ add_subdirectory("benchmark_test") add_subdirectory("lenet") +if(${TIM_VX_ENABLE_VIPLITE}) + add_subdirectory("lenet_lite") +endif() if(NOT ANDROID_TOOLCHAIN) add_subdirectory("multi_thread_test") diff --git a/samples/lenet_lite/CMakeLists.txt b/samples/lenet_lite/CMakeLists.txt new file mode 100644 index 0000000..673c6f6 --- /dev/null +++ b/samples/lenet_lite/CMakeLists.txt @@ -0,0 +1,12 @@ +message("samples/lenet_lite") + +set(TARGET_NAME "lenet_lite") + +aux_source_directory(. ${TARGET_NAME}_SRCS) +add_executable(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) + +target_link_libraries(${TARGET_NAME} PRIVATE tim-vx) +target_include_directories(${TARGET_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/include +) \ No newline at end of file diff --git a/samples/lenet_lite/lenet_lite_asymu8.cc b/samples/lenet_lite/lenet_lite_asymu8.cc index 56054a1..e19db77 100644 --- a/samples/lenet_lite/lenet_lite_asymu8.cc +++ b/samples/lenet_lite/lenet_lite_asymu8.cc @@ -110,7 +110,7 @@ static void printTopN(const T* prob, size_t outputCount, size_t topNum) { #define MEM_ALIGN(x, align) (((x) + ((align)-1)) & ~((align)-1)) -int main(int argc, char** argv) { +int main() { auto exec = tim::lite::Execution::Create(lenet_executable.data(), lenet_executable.size()); if (exec) { const size_t lenet_output_size = 10; diff --git a/src/tim/CMakeLists.txt b/src/tim/CMakeLists.txt index c8f9f7d..cf850cc 100644 --- a/src/tim/CMakeLists.txt +++ b/src/tim/CMakeLists.txt @@ -48,10 +48,9 @@ foreach(src_file ${${TARGET_NAME}_SRCS}) endif() endforeach() -add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) -target_link_libraries(${TARGET_NAME} PRIVATE - -Wl,--whole-archive tim_internal -Wl,--no-whole-archive) -target_include_directories(${TARGET_NAME} PRIVATE +set(EXTERNAL_LIBS) +set(INC_DIRS) +list(APPEND INC_DIRS ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/vx ${CMAKE_CURRENT_SOURCE_DIR}/transform @@ -59,12 +58,31 @@ target_include_directories(${TARGET_NAME} PRIVATE ${OVXDRV_INCLUDE_DIRS} ) +if(${TIM_VX_ENABLE_VIPLITE}) + aux_source_directory(./lite LITE_SRC) + list(APPEND ${TARGET_NAME}_SRCS + ${LITE_SRC}) + list(APPEND EXTERNAL_LIBS ${VIPLITE_DRV_LIBRARIES}) + list(APPEND INC_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/lite + ${VIPLITE_DRV_INCLUDE_DIR} + ) +endif() + +add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) +target_include_directories(${TARGET_NAME} PRIVATE ${INC_DIRS}) +target_link_libraries(${TARGET_NAME} PUBLIC + -Wl,--whole-archive tim_internal -Wl,--no-whole-archive ${EXTERNAL_LIBS}) + install(TARGETS ${TARGET_NAME} ${TARGET_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/lite + DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim) + if(TIM_VX_ENABLE_LAYOUT_INFER) install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/transform DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim) diff --git a/src/tim/lite/execution.cc b/src/tim/lite/execution.cc index 788ad41..a436140 100644 --- a/src/tim/lite/execution.cc +++ b/src/tim/lite/execution.cc @@ -140,7 +140,7 @@ Execution& ExecutionImpl::BindInputs(const std::vector>& return *this; } vip_status_e status = VIP_SUCCESS; - vip_buffer_create_params_t param = { 0 }; + vip_buffer_create_params_t param; for (uint32_t i = 0; i < handles.size(); i ++) { auto handle = handles[i]; if (!handle) { @@ -175,7 +175,7 @@ Execution& ExecutionImpl::BindOutputs(const std::vector> return *this; } vip_status_e status = VIP_SUCCESS; - vip_buffer_create_params_t param = { 0 }; + vip_buffer_create_params_t param; for (uint32_t i = 0; i < handles.size(); i ++) { auto handle = handles[i]; if (!handle) { diff --git a/src/tim/lite/handle.cc b/src/tim/lite/handle.cc index a7f2656..31c7ede 100644 --- a/src/tim/lite/handle.cc +++ b/src/tim/lite/handle.cc @@ -27,6 +27,7 @@ #include #include #include +#include #include "execution_private.h" #include "vip_lite.h" @@ -35,6 +36,16 @@ namespace tim { namespace lite { +bool Handle::Flush() { + auto internal_handle = impl_->internal_handle(); + return internal_handle->Flush(HandleFlushType::HandleFlush); +} + +bool Handle::Invalidate() { + auto internal_handle = impl_->internal_handle(); + return internal_handle->Flush(HandleFlushType::HandleInvalidate); +} + UserHandle::UserHandle(void* buffer, size_t size) { assert((reinterpret_cast(buffer) % _64_BYTES_ALIGN) == 0); impl_ = std::make_unique(buffer, size); @@ -44,12 +55,12 @@ UserHandle::~UserHandle() {} std::shared_ptr UserHandleImpl::Register( vip_buffer_create_params_t& params) { - auto internal_handle = std::make_shared( + internal_handle_ = std::make_shared( user_buffer_, user_buffer_size_, params); - if (!internal_handle->handle()) { - internal_handle.reset(); + if (!internal_handle_->handle()) { + internal_handle_.reset(); } - return internal_handle; + return internal_handle_; } InternalHandle::~InternalHandle() { @@ -72,5 +83,24 @@ InternalUserHandle::InternalUserHandle(void* user_buffer, size_t user_buffer_siz } } +bool InternalUserHandle::Flush(HandleFlushType type) { + vip_status_e status = VIP_SUCCESS; + switch (type) { + case HandleFlushType::HandleFlush: { + status = vip_flush_buffer(handle_, VIP_BUFFER_OPER_TYPE_FLUSH); + break; + } + case HandleFlushType::HandleInvalidate: { + status = vip_flush_buffer(handle_, VIP_BUFFER_OPER_TYPE_INVALIDATE); + break; + } + default: + std::cout << __FUNCTION__ << ":" << __LINE__ << " Unkown HandleFlushType." + << std::endl; + assert(false); + } + return status == VIP_SUCCESS ? true : false; +} + } } diff --git a/src/tim/lite/handle_private.h b/src/tim/lite/handle_private.h index 18998de..a9e883a 100644 --- a/src/tim/lite/handle_private.h +++ b/src/tim/lite/handle_private.h @@ -32,12 +32,18 @@ namespace tim { namespace lite { +enum class HandleFlushType { + HandleFlush = 0, + HandleInvalidate = 1 +}; + class InternalHandle; class HandleImpl { public: virtual std::shared_ptr Register( vip_buffer_create_params_t& params) = 0; + virtual std::shared_ptr& internal_handle() = 0; }; class UserHandleImpl : public HandleImpl { @@ -46,16 +52,21 @@ class UserHandleImpl : public HandleImpl { : user_buffer_(buffer), user_buffer_size_(size) {} std::shared_ptr Register( vip_buffer_create_params_t& params) override; + std::shared_ptr& internal_handle() override { + return internal_handle_; + } size_t user_buffer_size() const { return user_buffer_size_; } void* user_buffer() { return user_buffer_; } private: void* user_buffer_; size_t user_buffer_size_; + std::shared_ptr internal_handle_ = nullptr; }; class InternalHandle { public: ~InternalHandle(); + virtual bool Flush(HandleFlushType type) = 0; vip_buffer handle() { return handle_; }; protected: vip_buffer handle_; @@ -65,6 +76,7 @@ class InternalUserHandle : public InternalHandle { public: InternalUserHandle(void* user_buffer, size_t user_buffer_size, vip_buffer_create_params_t& params); + bool Flush(HandleFlushType type) override; }; }