Add function for lite driver handle (#209)
Signed-off-by: Zongwu Yang <zongwu.yang@verisilicon.com>
This commit is contained in:
parent
4b5fcf3c64
commit
d019a76db5
|
|
@ -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_CODE_COVERAGE "Run code coverage with gconv(gcc only" OFF)
|
||||||
option(TIM_VX_USE_EXTERNAL_OVXLIB "Use external OVXLIB" 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_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_CXX_STANDARD 14)
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|
|
||||||
|
|
@ -38,3 +38,22 @@ list(APPEND OVXDRV_LIBRARIES
|
||||||
${PROJECT_BINARY_DIR}/aarch64_A311D_6.4.8/lib/libNNArchPerf.so)
|
${PROJECT_BINARY_DIR}/aarch64_A311D_6.4.8/lib/libNNArchPerf.so)
|
||||||
|
|
||||||
mark_as_advanced(${OVXDRV_INCLUDE_DIRS} ${OVXDRV_LIBRARIES})
|
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()
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ class HandleImpl;
|
||||||
class Handle {
|
class Handle {
|
||||||
public:
|
public:
|
||||||
std::unique_ptr<HandleImpl>& impl() { return impl_; }
|
std::unique_ptr<HandleImpl>& impl() { return impl_; }
|
||||||
|
bool Flush();
|
||||||
|
bool Invalidate();
|
||||||
protected:
|
protected:
|
||||||
std::unique_ptr<HandleImpl> impl_;
|
std::unique_ptr<HandleImpl> impl_;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
add_subdirectory("benchmark_test")
|
add_subdirectory("benchmark_test")
|
||||||
add_subdirectory("lenet")
|
add_subdirectory("lenet")
|
||||||
|
if(${TIM_VX_ENABLE_VIPLITE})
|
||||||
|
add_subdirectory("lenet_lite")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT ANDROID_TOOLCHAIN)
|
if(NOT ANDROID_TOOLCHAIN)
|
||||||
add_subdirectory("multi_thread_test")
|
add_subdirectory("multi_thread_test")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
)
|
||||||
|
|
@ -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))
|
#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());
|
auto exec = tim::lite::Execution::Create(lenet_executable.data(), lenet_executable.size());
|
||||||
if (exec) {
|
if (exec) {
|
||||||
const size_t lenet_output_size = 10;
|
const size_t lenet_output_size = 10;
|
||||||
|
|
|
||||||
|
|
@ -48,10 +48,9 @@ foreach(src_file ${${TARGET_NAME}_SRCS})
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS})
|
set(EXTERNAL_LIBS)
|
||||||
target_link_libraries(${TARGET_NAME} PRIVATE
|
set(INC_DIRS)
|
||||||
-Wl,--whole-archive tim_internal -Wl,--no-whole-archive)
|
list(APPEND INC_DIRS
|
||||||
target_include_directories(${TARGET_NAME} PRIVATE
|
|
||||||
${PROJECT_SOURCE_DIR}/include
|
${PROJECT_SOURCE_DIR}/include
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/vx
|
${CMAKE_CURRENT_SOURCE_DIR}/vx
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/transform
|
${CMAKE_CURRENT_SOURCE_DIR}/transform
|
||||||
|
|
@ -59,12 +58,31 @@ target_include_directories(${TARGET_NAME} PRIVATE
|
||||||
${OVXDRV_INCLUDE_DIRS}
|
${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}
|
install(TARGETS ${TARGET_NAME} ${TARGET_NAME}
|
||||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx
|
||||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim)
|
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)
|
if(TIM_VX_ENABLE_LAYOUT_INFER)
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/transform
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/transform
|
||||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim)
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim)
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ Execution& ExecutionImpl::BindInputs(const std::vector<std::shared_ptr<Handle>>&
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
vip_status_e status = VIP_SUCCESS;
|
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 ++) {
|
for (uint32_t i = 0; i < handles.size(); i ++) {
|
||||||
auto handle = handles[i];
|
auto handle = handles[i];
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
|
|
@ -175,7 +175,7 @@ Execution& ExecutionImpl::BindOutputs(const std::vector<std::shared_ptr<Handle>>
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
vip_status_e status = VIP_SUCCESS;
|
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 ++) {
|
for (uint32_t i = 0; i < handles.size(); i ++) {
|
||||||
auto handle = handles[i];
|
auto handle = handles[i];
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <iostream>
|
||||||
#include "execution_private.h"
|
#include "execution_private.h"
|
||||||
#include "vip_lite.h"
|
#include "vip_lite.h"
|
||||||
|
|
||||||
|
|
@ -35,6 +36,16 @@
|
||||||
namespace tim {
|
namespace tim {
|
||||||
namespace lite {
|
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) {
|
UserHandle::UserHandle(void* buffer, size_t size) {
|
||||||
assert((reinterpret_cast<uintptr_t>(buffer) % _64_BYTES_ALIGN) == 0);
|
assert((reinterpret_cast<uintptr_t>(buffer) % _64_BYTES_ALIGN) == 0);
|
||||||
impl_ = std::make_unique<UserHandleImpl>(buffer, size);
|
impl_ = std::make_unique<UserHandleImpl>(buffer, size);
|
||||||
|
|
@ -44,12 +55,12 @@ UserHandle::~UserHandle() {}
|
||||||
|
|
||||||
std::shared_ptr<InternalHandle> UserHandleImpl::Register(
|
std::shared_ptr<InternalHandle> UserHandleImpl::Register(
|
||||||
vip_buffer_create_params_t& params) {
|
vip_buffer_create_params_t& params) {
|
||||||
auto internal_handle = std::make_shared<InternalUserHandle>(
|
internal_handle_ = std::make_shared<InternalUserHandle>(
|
||||||
user_buffer_, user_buffer_size_, params);
|
user_buffer_, user_buffer_size_, params);
|
||||||
if (!internal_handle->handle()) {
|
if (!internal_handle_->handle()) {
|
||||||
internal_handle.reset();
|
internal_handle_.reset();
|
||||||
}
|
}
|
||||||
return internal_handle;
|
return internal_handle_;
|
||||||
}
|
}
|
||||||
|
|
||||||
InternalHandle::~InternalHandle() {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,12 +32,18 @@
|
||||||
namespace tim {
|
namespace tim {
|
||||||
namespace lite {
|
namespace lite {
|
||||||
|
|
||||||
|
enum class HandleFlushType {
|
||||||
|
HandleFlush = 0,
|
||||||
|
HandleInvalidate = 1
|
||||||
|
};
|
||||||
|
|
||||||
class InternalHandle;
|
class InternalHandle;
|
||||||
|
|
||||||
class HandleImpl {
|
class HandleImpl {
|
||||||
public:
|
public:
|
||||||
virtual std::shared_ptr<InternalHandle> Register(
|
virtual std::shared_ptr<InternalHandle> Register(
|
||||||
vip_buffer_create_params_t& params) = 0;
|
vip_buffer_create_params_t& params) = 0;
|
||||||
|
virtual std::shared_ptr<InternalHandle>& internal_handle() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserHandleImpl : public HandleImpl {
|
class UserHandleImpl : public HandleImpl {
|
||||||
|
|
@ -46,16 +52,21 @@ class UserHandleImpl : public HandleImpl {
|
||||||
: user_buffer_(buffer), user_buffer_size_(size) {}
|
: user_buffer_(buffer), user_buffer_size_(size) {}
|
||||||
std::shared_ptr<InternalHandle> Register(
|
std::shared_ptr<InternalHandle> Register(
|
||||||
vip_buffer_create_params_t& params) override;
|
vip_buffer_create_params_t& params) override;
|
||||||
|
std::shared_ptr<InternalHandle>& internal_handle() override {
|
||||||
|
return internal_handle_;
|
||||||
|
}
|
||||||
size_t user_buffer_size() const { return user_buffer_size_; }
|
size_t user_buffer_size() const { return user_buffer_size_; }
|
||||||
void* user_buffer() { return user_buffer_; }
|
void* user_buffer() { return user_buffer_; }
|
||||||
private:
|
private:
|
||||||
void* user_buffer_;
|
void* user_buffer_;
|
||||||
size_t user_buffer_size_;
|
size_t user_buffer_size_;
|
||||||
|
std::shared_ptr<InternalHandle> internal_handle_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
class InternalHandle {
|
class InternalHandle {
|
||||||
public:
|
public:
|
||||||
~InternalHandle();
|
~InternalHandle();
|
||||||
|
virtual bool Flush(HandleFlushType type) = 0;
|
||||||
vip_buffer handle() { return handle_; };
|
vip_buffer handle() { return handle_; };
|
||||||
protected:
|
protected:
|
||||||
vip_buffer handle_;
|
vip_buffer handle_;
|
||||||
|
|
@ -65,6 +76,7 @@ class InternalUserHandle : public InternalHandle {
|
||||||
public:
|
public:
|
||||||
InternalUserHandle(void* user_buffer, size_t user_buffer_size,
|
InternalUserHandle(void* user_buffer, size_t user_buffer_size,
|
||||||
vip_buffer_create_params_t& params);
|
vip_buffer_create_params_t& params);
|
||||||
|
bool Flush(HandleFlushType type) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue