@@ -28,11 +28,13 @@ if(MGE_WITH_MINIMUM_SIZE) | |||||
set(LITE_ENABLE_EXCEPTION OFF) | set(LITE_ENABLE_EXCEPTION OFF) | ||||
endif() | endif() | ||||
if(LITE_BUILD_WITH_MGE) | |||||
set(LITE_BUILD_WITH_MGE ON) | |||||
endif() | |||||
# Write out lite_build_config.h It defines macros needed by lite | # Write out lite_build_config.h It defines macros needed by lite | ||||
configure_file(src/lite_build_config.h.in | |||||
configure_file(build_config/lite_build_config.h.in | |||||
${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h) | ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h) | ||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h | |||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include) | |||||
# begin config lite | # begin config lite | ||||
if(LITE_BUILD_WITH_MGE | if(LITE_BUILD_WITH_MGE | ||||
@@ -47,7 +49,6 @@ include_directories($<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/genfiles>) | |||||
if(LITE_BUILD_WITH_MGE) | if(LITE_BUILD_WITH_MGE) | ||||
target_link_libraries(lite_static PRIVATE megbrain megdnn ${MGE_CUDA_LIBS}) | target_link_libraries(lite_static PRIVATE megbrain megdnn ${MGE_CUDA_LIBS}) | ||||
add_compile_definitions(LITE_BUILD_WITH_MGE=1) | |||||
message(STATUS "build lite with MegEngine.") | message(STATUS "build lite with MegEngine.") | ||||
else() | else() | ||||
target_link_libraries(lite_static PUBLIC flatbuffers) | target_link_libraries(lite_static PUBLIC flatbuffers) | ||||
@@ -154,7 +155,10 @@ if(UNIX AND NOT APPLE) | |||||
set_target_properties(lite_shared_whl PROPERTIES LINK_DEPENDS ${LITE_VERSION_SCRIPT}) | set_target_properties(lite_shared_whl PROPERTIES LINK_DEPENDS ${LITE_VERSION_SCRIPT}) | ||||
endif() | endif() | ||||
# config install | |||||
# config install, please keep all install file with lite/BUILD:hdrs_public | |||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h | |||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/build_config) | |||||
install( | install( | ||||
TARGETS lite_static | TARGETS lite_static | ||||
LIBRARY DESTINATION lite/lib/${MGE_ARCH} | LIBRARY DESTINATION lite/lib/${MGE_ARCH} | ||||
@@ -176,9 +180,6 @@ if(NOT WIN32) | |||||
ARCHIVE DESTINATION lite/lib/${MGE_ARCH}) | ARCHIVE DESTINATION lite/lib/${MGE_ARCH}) | ||||
endif() | endif() | ||||
install(FILES ${PROJECT_SOURCE_DIR}/lite/include/lite/common_enum_c.h | |||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include/lite-c) | |||||
install( | install( | ||||
DIRECTORY ${PROJECT_SOURCE_DIR}/lite/include | DIRECTORY ${PROJECT_SOURCE_DIR}/lite/include | ||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite | DESTINATION ${CMAKE_INSTALL_PREFIX}/lite | ||||
@@ -187,7 +188,7 @@ install( | |||||
install( | install( | ||||
DIRECTORY ${PROJECT_SOURCE_DIR}/lite/lite-c/include | DIRECTORY ${PROJECT_SOURCE_DIR}/lite/lite-c/include | ||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite | |||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/lite-c | |||||
FILES_MATCHING | FILES_MATCHING | ||||
PATTERN "*.h") | PATTERN "*.h") | ||||
@@ -1,11 +1,5 @@ | |||||
/** | |||||
* \file lite/build_config/lite_build_config.h | |||||
* | |||||
* This file is part of MegEngine, a deep learning framework developed by | |||||
* Megvii. | |||||
* | |||||
* \copyright Copyright (c) 2020-2021 Megvii Inc. All rights reserved. | |||||
*/ | |||||
//! this file always for bazel | |||||
#ifndef _HEADER_LITE_BUILD_CONFIG | #ifndef _HEADER_LITE_BUILD_CONFIG | ||||
#define _HEADER_LITE_BUILD_CONFIG | #define _HEADER_LITE_BUILD_CONFIG | ||||
@@ -28,4 +22,12 @@ | |||||
#ifndef LITE_ASSERT_LOC | #ifndef LITE_ASSERT_LOC | ||||
#define LITE_ASSERT_LOC 1 | #define LITE_ASSERT_LOC 1 | ||||
#endif | #endif | ||||
#ifndef LITE_BUILD_WITH_MGE | |||||
#define LITE_BUILD_WITH_MGE 1 | |||||
#endif | |||||
#ifndef LITE_BUILD_WITH_RKNPU | |||||
#define LITE_BUILD_WITH_RKNPU 0 | |||||
#endif | |||||
#endif // _HEADER_LITE_BUILD_CONFIG | #endif // _HEADER_LITE_BUILD_CONFIG |
@@ -1,8 +1,11 @@ | |||||
//! this file always for cmake | |||||
#ifndef _HEADER_LITE_BUILD_CONFIG | #ifndef _HEADER_LITE_BUILD_CONFIG | ||||
#define _HEADER_LITE_BUILD_CONFIG | #define _HEADER_LITE_BUILD_CONFIG | ||||
#cmakedefine01 LITE_ENABLE_LOGGING | #cmakedefine01 LITE_ENABLE_LOGGING | ||||
#cmakedefine01 LITE_ENABLE_EXCEPTION | #cmakedefine01 LITE_ENABLE_EXCEPTION | ||||
#cmakedefine01 LITE_BUILD_WITH_MGE | |||||
#cmakedefine01 LITE_WITH_CUDA | #cmakedefine01 LITE_WITH_CUDA | ||||
#cmakedefine01 LITE_ASSERT_LOC | #cmakedefine01 LITE_ASSERT_LOC | ||||
@@ -26,4 +29,8 @@ | |||||
#ifndef LITE_ASSERT_LOC | #ifndef LITE_ASSERT_LOC | ||||
#define LITE_ASSERT_LOC 0 | #define LITE_ASSERT_LOC 0 | ||||
#endif | #endif | ||||
#ifndef LITE_BUILD_WITH_MGE | |||||
#define LITE_BUILD_WITH_MGE 0 | |||||
#endif | |||||
#endif // _HEADER_LITE_BUILD_CONFIG | #endif // _HEADER_LITE_BUILD_CONFIG |
@@ -0,0 +1,150 @@ | |||||
#pragma once | |||||
//! helper function like define: lite/src/misc.h, but we need example code just | |||||
//! depends on install header, not depends any lite src file | |||||
#include <chrono> | |||||
#include <cstdio> | |||||
#include <stdexcept> | |||||
#include <string> | |||||
std::string exampe_ssprintf(const char* fmt = 0, ...) | |||||
__attribute__((format(printf, 1, 2))); | |||||
#define LITE_EXAMPLE_THROW(msg) \ | |||||
do { \ | |||||
std::string msg_str(msg); \ | |||||
printf("%s\n", msg_str.c_str()); \ | |||||
__builtin_trap(); \ | |||||
} while (0) | |||||
//! branch prediction hint: likely to take | |||||
#define lite_example_likely(v) __builtin_expect(static_cast<bool>(v), 1) | |||||
//! branch prediction hint: unlikely to take | |||||
#define lite_example_unlikely(v) __builtin_expect(static_cast<bool>(v), 0) | |||||
#define LITE_EXAMPLE_ASSERT(expr, msg...) \ | |||||
do { \ | |||||
if (lite_example_unlikely(!(expr))) { \ | |||||
auto info = exampe_ssprintf(msg); \ | |||||
LITE_EXAMPLE_THROW(exampe_ssprintf( \ | |||||
"Assert \' %s \' failed at file : %s \n" \ | |||||
"line %d : %s,\nextra " \ | |||||
"message: %s", \ | |||||
#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__, info.c_str())); \ | |||||
} \ | |||||
} while (0) | |||||
#define LITE_EXAMPLE_MARK_USED_VAR(var) ((void)var) | |||||
namespace lite_example_helper { | |||||
class ScopedTimer { | |||||
public: | |||||
typedef std::chrono::system_clock Clock; | |||||
typedef std::chrono::nanoseconds Nsec; | |||||
ScopedTimer(std::string name) : m_name(name) { m_start = Clock::now(); } | |||||
~ScopedTimer() { | |||||
m_stop = Clock::now(); | |||||
std::chrono::duration<double> elapsed = m_stop - m_start; | |||||
Nsec u = std::chrono::duration_cast<Nsec>(elapsed); | |||||
auto msg = exampe_ssprintf( | |||||
"%s used time %fms.", m_name.c_str(), | |||||
static_cast<double>(u.count()) / 1000000.f); | |||||
printf("%s", msg.c_str()); | |||||
} | |||||
private: | |||||
std::chrono::time_point<std::chrono::system_clock> m_start, m_stop; | |||||
const std::string m_name; | |||||
}; | |||||
class Timer { | |||||
public: | |||||
typedef std::chrono::system_clock Clock; | |||||
typedef std::chrono::nanoseconds Nsec; | |||||
Timer(std::string name) : m_name(name) { m_start = Clock::now(); } | |||||
double get_used_time() { | |||||
m_stop = Clock::now(); | |||||
std::chrono::duration<double> elapsed = m_stop - m_start; | |||||
Nsec u = std::chrono::duration_cast<Nsec>(elapsed); | |||||
return static_cast<double>(u.count()) / 1000000.0; | |||||
} | |||||
void print_used_time(int iter) { | |||||
m_stop = Clock::now(); | |||||
std::chrono::duration<double> elapsed = m_stop - m_start; | |||||
Nsec u = std::chrono::duration_cast<Nsec>(elapsed); | |||||
printf("%s used time %f ms\n", (m_name + std::to_string(iter)).c_str(), | |||||
static_cast<double>(u.count()) / 1000000.0); | |||||
} | |||||
void reset_start() { m_start = Clock::now(); } | |||||
private: | |||||
std::chrono::time_point<std::chrono::system_clock> m_start, m_stop; | |||||
const std::string m_name; | |||||
}; | |||||
inline void mark_used_variable() {} | |||||
template <typename T, typename... Arg> | |||||
inline void mark_used_variable(T firstArg, Arg... args) { | |||||
LITE_EXAMPLE_MARK_USED_VAR(firstArg); | |||||
mark_used_variable(args...); | |||||
} | |||||
} // namespace lite_example_helper | |||||
#if defined(_WIN32) | |||||
#include <io.h> | |||||
#include <windows.h> | |||||
#undef CONST | |||||
#define F_OK 0 | |||||
#define RTLD_LAZY 0 | |||||
// On the windows platform we use a lib_filename without a full path so | |||||
// the win-api "LoadLibrary" would uses a standard search strategy to | |||||
// find the lib module. As we cannot access to the lib_filename without a | |||||
// full path, we should not use "access(a, b)" to verify it. | |||||
#define access(a, b) false | |||||
static inline void* dlopen(const char* file, int) { | |||||
return static_cast<void*>(LoadLibrary(file)); | |||||
} | |||||
static inline char* dlerror() { | |||||
const char* errmsg = "dlerror not aviable in windows"; | |||||
return const_cast<char*>(errmsg); | |||||
} | |||||
static inline void* dlsym(void* handle, const char* name) { | |||||
FARPROC symbol = GetProcAddress((HMODULE)handle, name); | |||||
return reinterpret_cast<void*>(symbol); | |||||
} | |||||
#elif __linux__ || __unix__ || __APPLE__ | |||||
#include <dlfcn.h> | |||||
#include <unistd.h> | |||||
#endif | |||||
#if __DEPLOY_ON_XP_SP2__ | |||||
//! refer to | |||||
//! https://docs.microsoft.com/en-us/cpp/build/configuring-programs-for-windows-xp?view=msvc-160 | |||||
//! xp sp2 do not support vc runtime fully, casused by KERNEL32.dll do not | |||||
//! implement some base apis for c++ std function, for example, | |||||
//! std::mutex/std::thread/std::condition_variable as a workround, we will | |||||
//! disable some MegEngine feature on xp sp2 env, for exampe, multi-thread etc! | |||||
#define LITE_MUTEX size_t | |||||
#define LITE_RECURSIVE_MUTEX size_t | |||||
#define LITE_LOCK_GUARD(mtx) LITE_EXAMPLE_MARK_USED_VAR(mtx) | |||||
#define LITE_LOCK_GUARD_UNIQUE(mtx) LITE_EXAMPLE_MARK_USED_VAR(mtx) | |||||
#define LITE_LOCK_GUARD_SHARED(mtx) \ | |||||
LITE_EXAMPLE_MARK_USED_VAR(LITE_EXAMPLE_MARK_USED_VAR) | |||||
#else | |||||
#define LITE_MUTEX std::mutex | |||||
#define LITE_RECURSIVE_MUTEX std::recursive_mutex | |||||
#define LITE_LOCK_GUARD(mtx) std::lock_guard<decltype(mtx)> LITE_LOCK_GUARD_CTOR(mtx) | |||||
#define LITE_LOCK_GUARD_UNIQUE(mtx) \ | |||||
std::unique_lock<decltype(mtx)> LITE_LOCK_GUARD_CTOR(mtx) | |||||
#define LITE_LOCK_GUARD_SHARED(mtx) \ | |||||
std::shared_lock<decltype(mtx)> LITE_LOCK_GUARD_CTOR(mtx) | |||||
#endif | |||||
// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} |
@@ -3,7 +3,7 @@ | |||||
#if LITE_BUILD_WITH_MGE | #if LITE_BUILD_WITH_MGE | ||||
#include <cstdio> | #include <cstdio> | ||||
#include "misc.h" | |||||
#include "helper.h" | |||||
using namespace lite; | using namespace lite; | ||||
using namespace example; | using namespace example; | ||||
@@ -96,12 +96,12 @@ bool basic_load_from_path(const Args& args) { | |||||
//! forward | //! forward | ||||
{ | { | ||||
lite::Timer ltimer("warmup"); | |||||
lite_example_helper::Timer ltimer("warmup"); | |||||
network->forward(); | network->forward(); | ||||
network->wait(); | network->wait(); | ||||
ltimer.print_used_time(0); | ltimer.print_used_time(0); | ||||
} | } | ||||
lite::Timer ltimer("forward_iter"); | |||||
lite_example_helper::Timer ltimer("forward_iter"); | |||||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||||
network->forward(); | network->forward(); | ||||
network->wait(); | network->wait(); | ||||
@@ -110,7 +110,7 @@ bool basic_load_from_path(const Args& args) { | |||||
//! forward | //! forward | ||||
{ | { | ||||
lite::Timer ltimer("warmup"); | |||||
lite_example_helper::Timer ltimer("warmup"); | |||||
network->forward(); | network->forward(); | ||||
network->wait(); | network->wait(); | ||||
ltimer.print_used_time(0); | ltimer.print_used_time(0); | ||||
@@ -167,12 +167,12 @@ bool basic_load_from_path_with_loader(const Args& args) { | |||||
//! forward | //! forward | ||||
{ | { | ||||
lite::Timer ltimer("warmup"); | |||||
lite_example_helper::Timer ltimer("warmup"); | |||||
network->forward(); | network->forward(); | ||||
network->wait(); | network->wait(); | ||||
ltimer.print_used_time(0); | ltimer.print_used_time(0); | ||||
} | } | ||||
lite::Timer ltimer("forward_iter"); | |||||
lite_example_helper::Timer ltimer("forward_iter"); | |||||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||||
ltimer.reset_start(); | ltimer.reset_start(); | ||||
network->forward(); | network->forward(); | ||||
@@ -481,12 +481,12 @@ bool load_from_path_run_cuda(const Args& args) { | |||||
//! forward | //! forward | ||||
{ | { | ||||
lite::Timer ltimer("warmup"); | |||||
lite_example_helper::Timer ltimer("warmup"); | |||||
network->forward(); | network->forward(); | ||||
network->wait(); | network->wait(); | ||||
ltimer.print_used_time(0); | ltimer.print_used_time(0); | ||||
} | } | ||||
lite::Timer ltimer("forward_iter"); | |||||
lite_example_helper::Timer ltimer("forward_iter"); | |||||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||||
ltimer.reset_start(); | ltimer.reset_start(); | ||||
network->forward(); | network->forward(); | ||||
@@ -3,8 +3,6 @@ | |||||
#if LITE_BUILD_WITH_MGE | #if LITE_BUILD_WITH_MGE | ||||
#include <cstdio> | #include <cstdio> | ||||
#include "misc.h" | |||||
#define STB_IMAGE_STATIC | #define STB_IMAGE_STATIC | ||||
#define STB_IMAGE_IMPLEMENTATION | #define STB_IMAGE_IMPLEMENTATION | ||||
#include "stb_image.h" | #include "stb_image.h" | ||||
@@ -3,8 +3,6 @@ | |||||
#if LITE_BUILD_WITH_MGE | #if LITE_BUILD_WITH_MGE | ||||
#include <cstdio> | #include <cstdio> | ||||
#include "misc.h" | |||||
#define STB_IMAGE_STATIC | #define STB_IMAGE_STATIC | ||||
#define STB_IMAGE_IMPLEMENTATION | #define STB_IMAGE_IMPLEMENTATION | ||||
#include "stb_image.h" | #include "stb_image.h" | ||||
@@ -1,7 +1,6 @@ | |||||
#include <thread> | #include <thread> | ||||
#include "example.h" | #include "example.h" | ||||
#if LITE_BUILD_WITH_MGE | #if LITE_BUILD_WITH_MGE | ||||
#include "misc.h" | |||||
using namespace lite; | using namespace lite; | ||||
using namespace example; | using namespace example; | ||||
@@ -1,5 +1,5 @@ | |||||
#include "example.h" | #include "example.h" | ||||
#include "misc.h" | |||||
#include "helper.h" | |||||
#if LITE_BUILD_WITH_MGE | #if LITE_BUILD_WITH_MGE | ||||
#include "lite-c/global_c.h" | #include "lite-c/global_c.h" | ||||
#include "lite-c/network_c.h" | #include "lite-c/network_c.h" | ||||
@@ -7,12 +7,12 @@ | |||||
#include <thread> | #include <thread> | ||||
#define LITE_CAPI_CHECK(_expr) \ | |||||
do { \ | |||||
int _ret = (_expr); \ | |||||
if (_ret) { \ | |||||
LITE_THROW(LITE_get_last_error()); \ | |||||
} \ | |||||
#define LITE_CAPI_CHECK(_expr) \ | |||||
do { \ | |||||
int _ret = (_expr); \ | |||||
if (_ret) { \ | |||||
LITE_EXAMPLE_THROW(LITE_get_last_error()); \ | |||||
} \ | |||||
} while (0) | } while (0) | ||||
bool basic_c_interface(const lite::example::Args& args) { | bool basic_c_interface(const lite::example::Args& args) { | ||||
@@ -95,7 +95,7 @@ bool device_io_c_interface(const lite::example::Args& args) { | |||||
LITE_CAPI_CHECK( | LITE_CAPI_CHECK( | ||||
LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_tensor_in)); | LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_tensor_in)); | ||||
if (length_read_in != length_tensor_in) { | if (length_read_in != length_tensor_in) { | ||||
LITE_THROW( | |||||
LITE_EXAMPLE_THROW( | |||||
"The input data size is not match the network input tensro " | "The input data size is not match the network input tensro " | ||||
"size,\n"); | "size,\n"); | ||||
} | } | ||||