| @@ -28,11 +28,13 @@ if(MGE_WITH_MINIMUM_SIZE) | |||
| set(LITE_ENABLE_EXCEPTION OFF) | |||
| 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 | |||
| 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) | |||
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h | |||
| DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include) | |||
| # begin config lite | |||
| if(LITE_BUILD_WITH_MGE | |||
| @@ -47,7 +49,6 @@ include_directories($<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/genfiles>) | |||
| if(LITE_BUILD_WITH_MGE) | |||
| 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.") | |||
| else() | |||
| 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}) | |||
| 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( | |||
| TARGETS lite_static | |||
| LIBRARY DESTINATION lite/lib/${MGE_ARCH} | |||
| @@ -176,9 +180,6 @@ if(NOT WIN32) | |||
| ARCHIVE DESTINATION lite/lib/${MGE_ARCH}) | |||
| endif() | |||
| install(FILES ${PROJECT_SOURCE_DIR}/lite/include/lite/common_enum_c.h | |||
| DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include/lite-c) | |||
| install( | |||
| DIRECTORY ${PROJECT_SOURCE_DIR}/lite/include | |||
| DESTINATION ${CMAKE_INSTALL_PREFIX}/lite | |||
| @@ -187,7 +188,7 @@ install( | |||
| install( | |||
| DIRECTORY ${PROJECT_SOURCE_DIR}/lite/lite-c/include | |||
| DESTINATION ${CMAKE_INSTALL_PREFIX}/lite | |||
| DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/lite-c | |||
| FILES_MATCHING | |||
| 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 | |||
| #define _HEADER_LITE_BUILD_CONFIG | |||
| @@ -28,4 +22,12 @@ | |||
| #ifndef LITE_ASSERT_LOC | |||
| #define LITE_ASSERT_LOC 1 | |||
| #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 | |||
| @@ -1,8 +1,11 @@ | |||
| //! this file always for cmake | |||
| #ifndef _HEADER_LITE_BUILD_CONFIG | |||
| #define _HEADER_LITE_BUILD_CONFIG | |||
| #cmakedefine01 LITE_ENABLE_LOGGING | |||
| #cmakedefine01 LITE_ENABLE_EXCEPTION | |||
| #cmakedefine01 LITE_BUILD_WITH_MGE | |||
| #cmakedefine01 LITE_WITH_CUDA | |||
| #cmakedefine01 LITE_ASSERT_LOC | |||
| @@ -26,4 +29,8 @@ | |||
| #ifndef LITE_ASSERT_LOC | |||
| #define LITE_ASSERT_LOC 0 | |||
| #endif | |||
| #ifndef LITE_BUILD_WITH_MGE | |||
| #define LITE_BUILD_WITH_MGE 0 | |||
| #endif | |||
| #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 | |||
| #include <cstdio> | |||
| #include "misc.h" | |||
| #include "helper.h" | |||
| using namespace lite; | |||
| using namespace example; | |||
| @@ -96,12 +96,12 @@ bool basic_load_from_path(const Args& args) { | |||
| //! forward | |||
| { | |||
| lite::Timer ltimer("warmup"); | |||
| lite_example_helper::Timer ltimer("warmup"); | |||
| network->forward(); | |||
| network->wait(); | |||
| ltimer.print_used_time(0); | |||
| } | |||
| lite::Timer ltimer("forward_iter"); | |||
| lite_example_helper::Timer ltimer("forward_iter"); | |||
| for (int i = 0; i < 10; i++) { | |||
| network->forward(); | |||
| network->wait(); | |||
| @@ -110,7 +110,7 @@ bool basic_load_from_path(const Args& args) { | |||
| //! forward | |||
| { | |||
| lite::Timer ltimer("warmup"); | |||
| lite_example_helper::Timer ltimer("warmup"); | |||
| network->forward(); | |||
| network->wait(); | |||
| ltimer.print_used_time(0); | |||
| @@ -167,12 +167,12 @@ bool basic_load_from_path_with_loader(const Args& args) { | |||
| //! forward | |||
| { | |||
| lite::Timer ltimer("warmup"); | |||
| lite_example_helper::Timer ltimer("warmup"); | |||
| network->forward(); | |||
| network->wait(); | |||
| ltimer.print_used_time(0); | |||
| } | |||
| lite::Timer ltimer("forward_iter"); | |||
| lite_example_helper::Timer ltimer("forward_iter"); | |||
| for (int i = 0; i < 10; i++) { | |||
| ltimer.reset_start(); | |||
| network->forward(); | |||
| @@ -481,12 +481,12 @@ bool load_from_path_run_cuda(const Args& args) { | |||
| //! forward | |||
| { | |||
| lite::Timer ltimer("warmup"); | |||
| lite_example_helper::Timer ltimer("warmup"); | |||
| network->forward(); | |||
| network->wait(); | |||
| ltimer.print_used_time(0); | |||
| } | |||
| lite::Timer ltimer("forward_iter"); | |||
| lite_example_helper::Timer ltimer("forward_iter"); | |||
| for (int i = 0; i < 10; i++) { | |||
| ltimer.reset_start(); | |||
| network->forward(); | |||
| @@ -3,8 +3,6 @@ | |||
| #if LITE_BUILD_WITH_MGE | |||
| #include <cstdio> | |||
| #include "misc.h" | |||
| #define STB_IMAGE_STATIC | |||
| #define STB_IMAGE_IMPLEMENTATION | |||
| #include "stb_image.h" | |||
| @@ -3,8 +3,6 @@ | |||
| #if LITE_BUILD_WITH_MGE | |||
| #include <cstdio> | |||
| #include "misc.h" | |||
| #define STB_IMAGE_STATIC | |||
| #define STB_IMAGE_IMPLEMENTATION | |||
| #include "stb_image.h" | |||
| @@ -1,7 +1,6 @@ | |||
| #include <thread> | |||
| #include "example.h" | |||
| #if LITE_BUILD_WITH_MGE | |||
| #include "misc.h" | |||
| using namespace lite; | |||
| using namespace example; | |||
| @@ -1,5 +1,5 @@ | |||
| #include "example.h" | |||
| #include "misc.h" | |||
| #include "helper.h" | |||
| #if LITE_BUILD_WITH_MGE | |||
| #include "lite-c/global_c.h" | |||
| #include "lite-c/network_c.h" | |||
| @@ -7,12 +7,12 @@ | |||
| #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) | |||
| 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_get_tensor_total_size_in_byte(c_input_tensor, &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 " | |||
| "size,\n"); | |||
| } | |||